Skip to content

Commit 997ad1d

Browse files
committed
wip
1 parent 3e3dcb3 commit 997ad1d

File tree

1 file changed

+49
-19
lines changed

1 file changed

+49
-19
lines changed

compiler/rustc_codegen_llvm/src/builder/gpu_offload.rs

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,27 @@ use std::ffi::{CStr, CString};
33
use crate::builder::{SBuilder, UNNAMED};
44
use crate::common::AsCCharPtr;
55
use crate::llvm::AttributePlace::Function;
6-
use crate::llvm::{self, Linkage, build_string};
6+
use crate::llvm::{self, Linkage, Visibility, build_string};
77
use crate::{LlvmCodegenBackend, ModuleLlvm, SimpleCx, attributes};
88
use rustc_codegen_ssa::back::write::{CodegenContext, FatLtoInput};
99

1010
use llvm::Linkage::*;
1111
use rustc_abi::Align;
1212
use 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.
1629
pub(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 }
6384
pub(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+
88122
fn 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

Comments
 (0)