@@ -3,14 +3,27 @@ use std::ffi::{CStr, CString};
33use crate :: builder:: { SBuilder , UNNAMED } ;
44use crate :: common:: AsCCharPtr ;
55use crate :: llvm:: AttributePlace :: Function ;
6- use crate :: llvm:: { self , Linkage , build_string} ;
6+ use crate :: llvm:: { self , Linkage , Visibility , build_string} ;
77use crate :: { LlvmCodegenBackend , ModuleLlvm , SimpleCx , attributes} ;
88use rustc_codegen_ssa:: back:: write:: { CodegenContext , FatLtoInput } ;
99
1010use llvm:: Linkage :: * ;
1111use rustc_abi:: Align ;
1212use rustc_codegen_ssa:: traits:: BaseTypeCodegenMethods ;
1313
14+ fn create_struct_ty < ' ll > (
15+ cx : & ' ll SimpleCx < ' _ > ,
16+ name : & str ,
17+ tys : & [ & ' ll llvm:: Type ] ,
18+ ) -> & ' ll llvm:: Type {
19+ let entry_struct_name = CString :: new ( name) . unwrap ( ) ;
20+ unsafe {
21+ let entry_struct = llvm:: LLVMStructCreateNamed ( cx. llcx , entry_struct_name. as_ptr ( ) ) ;
22+ llvm:: LLVMStructSetBody ( entry_struct, tys. as_ptr ( ) , tys. len ( ) as u32 , 0 ) ;
23+ entry_struct
24+ }
25+ }
26+
1427// We don't copy types from other functions because we generate a new module and context.
1528// Bringing in types from other contexts would likely cause issues.
1629pub ( crate ) fn gen_image_wrapper_module < ' ll > (
@@ -32,18 +45,29 @@ pub(crate) fn gen_image_wrapper_module<'ll>(
3245 let target_cstr = llvm:: LLVMGetTarget ( old_cx. llmod ) ;
3346 let target = CStr :: from_ptr ( target_cstr) . to_string_lossy ( ) . into_owned ( ) ;
3447 llvm:: LLVMSetTarget ( llmod, target_cstr) ;
35- // target triple = "x86_64-unknown-linux-gnu"
3648
3749 let mut entry_fields = [ ti64, ti16, ti16, ti32, tptr, tptr, ti64, ti64, tptr] ;
38-
39- let entry_struct_name = CString :: new ( "__tgt_offload_entry" ) . unwrap ( ) ;
40- let entry_struct = llvm:: LLVMStructCreateNamed ( llcx, entry_struct_name. as_ptr ( ) ) ;
41- llvm:: LLVMStructSetBody (
42- entry_struct,
43- entry_fields. as_mut_ptr ( ) ,
44- entry_fields. len ( ) as u32 ,
45- 0 ,
46- ) ;
50+ let tgt_entry = create_struct_ty ( & cx, "__tgt_offload_entry" , & entry_fields) ;
51+ let tgt_image = create_struct_ty ( & cx, "__tgt_device_image" , & [ tptr, tptr, tptr, tptr] ) ;
52+ let tgt_desc = create_struct_ty ( & cx, "__tgt_bin_desc" , & [ ti32, tptr, tptr, tptr] ) ;
53+
54+ let offload_entry_ty = add_tgt_offload_entry ( & cx) ;
55+ let offload_entry_arr = cx. type_array ( offload_entry_ty, 0 ) ;
56+
57+ let c_name = CString :: new ( "__start_omp_offloading_entries" ) . unwrap ( ) ;
58+ let llglobal = llvm:: add_global ( cx. llmod , offload_entry_arr, & c_name) ;
59+ llvm:: set_global_constant ( llglobal, true ) ;
60+ llvm:: set_linkage ( llglobal, ExternalLinkage ) ;
61+ llvm:: set_visibility ( llglobal, Visibility :: Hidden ) ;
62+ let c_name = CString :: new ( "__stop_omp_offloading_entries" ) . unwrap ( ) ;
63+ let llglobal = llvm:: add_global ( cx. llmod , offload_entry_arr, & c_name) ;
64+ llvm:: set_global_constant ( llglobal, true ) ;
65+ llvm:: set_linkage ( llglobal, ExternalLinkage ) ;
66+ llvm:: set_visibility ( llglobal, Visibility :: Hidden ) ;
67+
68+ // @__start_omp_offloading_entries = external hidden constant [0 x %struct.__tgt_offload_entry]
69+ // @__stop_omp_offloading_entries = external hidden constant [0 x %struct.__tgt_offload_entry]
70+ // @__dummy.omp_offloading_entries = internal constant [0 x %struct.__tgt_offload_entry] zeroinitializer, section "omp_offloading_entries"
4771
4872 llvm:: LLVMPrintModuleToFile (
4973 llmod,
@@ -57,9 +81,6 @@ pub(crate) fn gen_image_wrapper_module<'ll>(
5781 }
5882}
5983
60- // first we need to add all the fun to the host module
61- // %struct.__tgt_offload_entry = type { i64, i16, i16, i32, ptr, ptr, i64, i64, ptr }
62- // %struct.__tgt_kernel_arguments = type { i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, i64, i64, [3 x i32], [3 x i32], i32 }
6384pub ( crate ) fn handle_gpu_code < ' ll > (
6485 cgcx : & CodegenContext < LlvmCodegenBackend > ,
6586 cx : & ' ll SimpleCx < ' _ > ,
@@ -85,6 +106,19 @@ pub(crate) fn handle_gpu_code<'ll>(
85106 }
86107}
87108
109+ fn add_tgt_offload_entry < ' ll > ( cx : & ' ll SimpleCx < ' _ > ) -> & ' ll llvm:: Type {
110+ let offload_entry_ty = cx. type_named_struct ( "struct.__tgt_offload_entry" ) ;
111+ let tptr = cx. type_ptr ( ) ;
112+ let ti64 = cx. type_i64 ( ) ;
113+ let ti32 = cx. type_i32 ( ) ;
114+ let ti16 = cx. type_i16 ( ) ;
115+ let ti8 = cx. type_i8 ( ) ;
116+ let tarr = cx. type_array ( ti32, 3 ) ;
117+ let entry_elements = vec ! [ ti64, ti16, ti16, ti32, tptr, tptr, ti64, ti64, tptr] ;
118+ cx. set_struct_body ( offload_entry_ty, & entry_elements, false ) ;
119+ offload_entry_ty
120+ }
121+
88122fn gen_globals < ' ll > (
89123 cx : & ' ll SimpleCx < ' _ > ,
90124) -> (
@@ -95,7 +129,7 @@ fn gen_globals<'ll>(
95129 & ' ll llvm:: Value ,
96130 & ' ll llvm:: Type ,
97131) {
98- let offload_entry_ty = cx . type_named_struct ( "struct.__tgt_offload_entry" ) ;
132+ let offload_entry_ty = add_tgt_offload_entry ( & cx ) ;
99133 let kernel_arguments_ty = cx. type_named_struct ( "struct.__tgt_kernel_arguments" ) ;
100134 let tptr = cx. type_ptr ( ) ;
101135 let ti64 = cx. type_i64 ( ) ;
@@ -139,17 +173,13 @@ fn gen_globals<'ll>(
139173 // uint64_t Data;
140174 // void *AuxAddr;
141175 // } __tgt_offload_entry;
142- let entry_elements = vec ! [ ti64, ti16, ti16, ti32, tptr, tptr, ti64, ti64, tptr] ;
143176 let kernel_elements =
144177 vec ! [ ti32, ti32, tptr, tptr, tptr, tptr, tptr, tptr, ti64, ti64, tarr, tarr, ti32] ;
145178
146- cx. set_struct_body ( offload_entry_ty, & entry_elements, false ) ;
147179 cx. set_struct_body ( kernel_arguments_ty, & kernel_elements, false ) ;
148- let global = cx. declare_global ( "my_struct_global" , offload_entry_ty) ;
149180 let global = cx. declare_global ( "my_struct_global2" , kernel_arguments_ty) ;
150181 //@my_struct_global = external global %struct.__tgt_offload_entry
151182 //@my_struct_global2 = external global %struct.__tgt_kernel_arguments
152- dbg ! ( & offload_entry_ty) ;
153183 dbg ! ( & kernel_arguments_ty) ;
154184 //LLVMTypeRef elements[9] = {i64Ty, i16Ty, i16Ty, i32Ty, ptrTy, ptrTy, i64Ty, i64Ty, ptrTy};
155185 //LLVMStructSetBody(structTy, elements, 9, 0);
0 commit comments