@@ -3,14 +3,27 @@ use std::ffi::{CStr, CString};
3
3
use crate :: builder:: { SBuilder , UNNAMED } ;
4
4
use crate :: common:: AsCCharPtr ;
5
5
use crate :: llvm:: AttributePlace :: Function ;
6
- use crate :: llvm:: { self , Linkage , build_string} ;
6
+ use crate :: llvm:: { self , Linkage , Visibility , build_string} ;
7
7
use crate :: { LlvmCodegenBackend , ModuleLlvm , SimpleCx , attributes} ;
8
8
use rustc_codegen_ssa:: back:: write:: { CodegenContext , FatLtoInput } ;
9
9
10
10
use llvm:: Linkage :: * ;
11
11
use rustc_abi:: Align ;
12
12
use rustc_codegen_ssa:: traits:: BaseTypeCodegenMethods ;
13
13
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
+
14
27
// We don't copy types from other functions because we generate a new module and context.
15
28
// Bringing in types from other contexts would likely cause issues.
16
29
pub ( crate ) fn gen_image_wrapper_module < ' ll > (
@@ -32,18 +45,29 @@ pub(crate) fn gen_image_wrapper_module<'ll>(
32
45
let target_cstr = llvm:: LLVMGetTarget ( old_cx. llmod ) ;
33
46
let target = CStr :: from_ptr ( target_cstr) . to_string_lossy ( ) . into_owned ( ) ;
34
47
llvm:: LLVMSetTarget ( llmod, target_cstr) ;
35
- // target triple = "x86_64-unknown-linux-gnu"
36
48
37
49
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"
47
71
48
72
llvm:: LLVMPrintModuleToFile (
49
73
llmod,
@@ -57,9 +81,6 @@ pub(crate) fn gen_image_wrapper_module<'ll>(
57
81
}
58
82
}
59
83
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 }
63
84
pub ( crate ) fn handle_gpu_code < ' ll > (
64
85
cgcx : & CodegenContext < LlvmCodegenBackend > ,
65
86
cx : & ' ll SimpleCx < ' _ > ,
@@ -85,6 +106,19 @@ pub(crate) fn handle_gpu_code<'ll>(
85
106
}
86
107
}
87
108
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
+
88
122
fn gen_globals < ' ll > (
89
123
cx : & ' ll SimpleCx < ' _ > ,
90
124
) -> (
@@ -95,7 +129,7 @@ fn gen_globals<'ll>(
95
129
& ' ll llvm:: Value ,
96
130
& ' ll llvm:: Type ,
97
131
) {
98
- let offload_entry_ty = cx . type_named_struct ( "struct.__tgt_offload_entry" ) ;
132
+ let offload_entry_ty = add_tgt_offload_entry ( & cx ) ;
99
133
let kernel_arguments_ty = cx. type_named_struct ( "struct.__tgt_kernel_arguments" ) ;
100
134
let tptr = cx. type_ptr ( ) ;
101
135
let ti64 = cx. type_i64 ( ) ;
@@ -139,17 +173,13 @@ fn gen_globals<'ll>(
139
173
// uint64_t Data;
140
174
// void *AuxAddr;
141
175
// } __tgt_offload_entry;
142
- let entry_elements = vec ! [ ti64, ti16, ti16, ti32, tptr, tptr, ti64, ti64, tptr] ;
143
176
let kernel_elements =
144
177
vec ! [ ti32, ti32, tptr, tptr, tptr, tptr, tptr, tptr, ti64, ti64, tarr, tarr, ti32] ;
145
178
146
- cx. set_struct_body ( offload_entry_ty, & entry_elements, false ) ;
147
179
cx. set_struct_body ( kernel_arguments_ty, & kernel_elements, false ) ;
148
- let global = cx. declare_global ( "my_struct_global" , offload_entry_ty) ;
149
180
let global = cx. declare_global ( "my_struct_global2" , kernel_arguments_ty) ;
150
181
//@my_struct_global = external global %struct.__tgt_offload_entry
151
182
//@my_struct_global2 = external global %struct.__tgt_kernel_arguments
152
- dbg ! ( & offload_entry_ty) ;
153
183
dbg ! ( & kernel_arguments_ty) ;
154
184
//LLVMTypeRef elements[9] = {i64Ty, i16Ty, i16Ty, i32Ty, ptrTy, ptrTy, i64Ty, i64Ty, ptrTy};
155
185
//LLVMStructSetBody(structTy, elements, 9, 0);
0 commit comments