Skip to content

Commit 95fba51

Browse files
committed
wip
1 parent 4a85567 commit 95fba51

File tree

3 files changed

+57
-17
lines changed

3 files changed

+57
-17
lines changed

compiler/rustc_codegen_llvm/src/builder/gpu_offload.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::builder::SBuilder;
99
use crate::common::AsCCharPtr;
1010
use crate::llvm::AttributePlace::Function;
1111
use crate::llvm::{self, Linkage, Visibility};
12-
use crate::{LlvmCodegenBackend, SimpleCx, attributes};
12+
use crate::{LlvmCodegenBackend, ModuleLlvm, SimpleCx, attributes};
1313

1414
fn create_struct_ty<'ll>(
1515
cx: &'ll SimpleCx<'_>,
@@ -31,18 +31,19 @@ pub(crate) fn gen_image_wrapper_module<'ll>(
3131
old_cx: &SimpleCx<'ll>,
3232
) {
3333
unsafe {
34-
let llcx = llvm::LLVMRustContextCreate(false);
35-
let module_name = CString::new("offload.wrapper.module").unwrap();
36-
let llmod = llvm::LLVMModuleCreateWithNameInContext(module_name.as_ptr(), llcx);
37-
let cx = SimpleCx::new(llmod, llcx, cgcx.pointer_size);
34+
let dl_cstr = llvm::LLVMGetDataLayoutStr(old_cx.llmod);
35+
let target_cstr = llvm::LLVMGetTarget(old_cx.llmod);
36+
let name = "offload.wrapper.module";
37+
let tm_factory_config =
38+
rustc_codegen_ssa::back::write::TargetMachineFactoryConfig::new(cgcx, name);
39+
let dcx = cgcx.create_dcx();
40+
let tm = (cgcx.tm_factory)(tm_factory_config).unwrap();
41+
let m: crate::ModuleLlvm = ModuleLlvm::new_simple(name, dl_cstr, target_cstr, tm);
42+
let cx = SimpleCx::new(m.llmod(), m.llcx, cgcx.pointer_size);
3843
let tptr = cx.type_ptr();
3944
let ti64 = cx.type_i64();
4045
let ti32 = cx.type_i32();
4146
let ti16 = cx.type_i16();
42-
let dl_cstr = llvm::LLVMGetDataLayoutStr(old_cx.llmod);
43-
llvm::LLVMSetDataLayout(llmod, dl_cstr);
44-
let target_cstr = llvm::LLVMGetTarget(old_cx.llmod);
45-
llvm::LLVMSetTarget(llmod, target_cstr);
4647

4748
let entry_fields = [ti64, ti16, ti16, ti32, tptr, tptr, ti64, ti64, tptr];
4849
create_struct_ty(&cx, "__tgt_offload_entry", &entry_fields);

compiler/rustc_codegen_llvm/src/context.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,22 @@ fn to_llvm_tls_model(tls_model: TlsModel) -> llvm::ThreadLocalMode {
160160
}
161161
}
162162

163+
pub(crate) unsafe fn create_simple_module<'ll>(
164+
llcx: &'ll llvm::Context,
165+
target_data_layout: *const i8,
166+
target_triple: *const i8,
167+
mod_name: &str,
168+
) -> &'ll llvm::Module {
169+
let mod_name = SmallCStr::new(mod_name);
170+
let llmod = unsafe { llvm::LLVMModuleCreateWithNameInContext(mod_name.as_ptr(), llcx) };
171+
unsafe {
172+
llvm::LLVMSetDataLayout(llmod, target_data_layout);
173+
llvm::LLVMSetTarget(llmod, target_triple);
174+
}
175+
let llvm_version = llvm_util::get_version();
176+
llmod
177+
}
178+
163179
pub(crate) unsafe fn create_module<'ll>(
164180
tcx: TyCtxt<'_>,
165181
llcx: &'ll llvm::Context,
@@ -210,7 +226,7 @@ pub(crate) unsafe fn create_module<'ll>(
210226

211227
// Ensure the data-layout values hardcoded remain the defaults.
212228
{
213-
let tm = crate::back::write::create_informational_target_machine(tcx.sess, false);
229+
let tm = crate::back::write::create_informational_target_machine(sess, false);
214230
unsafe {
215231
llvm::LLVMRustSetDataLayoutFromTargetMachine(llmod, tm.raw());
216232
}

compiler/rustc_codegen_llvm/src/lib.rs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,21 @@ unsafe impl Send for ModuleLlvm {}
399399
unsafe impl Sync for ModuleLlvm {}
400400

401401
impl ModuleLlvm {
402+
fn new_simple(
403+
name: &str,
404+
dl_cstr: *const i8,
405+
target_cstr: *const i8,
406+
cgcx: &CodegenContext<LlvmCodegenBackend>,
407+
dcx: DiagCtxtHandle<'_>,
408+
) -> Self {
409+
unsafe {
410+
let llcx = llvm::LLVMRustContextCreate(false);
411+
let llmod_raw = context::create_simple_module(llcx, dl_cstr, target_cstr, name);
412+
let tm = ModuleLlvm::tm_from_cgcx(cgcx, name, dcx)?;
413+
ModuleLlvm { llmod_raw, llcx, tm: ManuallyDrop::new(tm) }
414+
}
415+
}
416+
402417
fn new(tcx: TyCtxt<'_>, mod_name: &str) -> Self {
403418
unsafe {
404419
let llcx = llvm::LLVMRustContextCreate(tcx.sess.fewer_names());
@@ -423,6 +438,20 @@ impl ModuleLlvm {
423438
}
424439
}
425440

441+
fn tm_from_cgcx(
442+
cgcx: &CodegenContext<LlvmCodegenBackend>,
443+
name: &str,
444+
dcx: DiagCtxtHandle<'_>,
445+
) -> Result<OwnedTargetMachine, FatalError> {
446+
let tm_factory_config = TargetMachineFactoryConfig::new(cgcx, name);
447+
match (cgcx.tm_factory)(tm_factory_config) {
448+
Ok(m) => Ok(m),
449+
Err(e) => {
450+
return Err(dcx.emit_almost_fatal(ParseTargetMachineConfig(e)));
451+
}
452+
}
453+
}
454+
426455
fn parse(
427456
cgcx: &CodegenContext<LlvmCodegenBackend>,
428457
name: &CStr,
@@ -432,13 +461,7 @@ impl ModuleLlvm {
432461
unsafe {
433462
let llcx = llvm::LLVMRustContextCreate(cgcx.fewer_names);
434463
let llmod_raw = back::lto::parse_module(llcx, name, buffer, dcx)?;
435-
let tm_factory_config = TargetMachineFactoryConfig::new(cgcx, name.to_str().unwrap());
436-
let tm = match (cgcx.tm_factory)(tm_factory_config) {
437-
Ok(m) => m,
438-
Err(e) => {
439-
return Err(dcx.emit_almost_fatal(ParseTargetMachineConfig(e)));
440-
}
441-
};
464+
let tm = ModuleLlvm::tm_from_cgcx(cgcx, name, dcx)?;
442465

443466
Ok(ModuleLlvm { llmod_raw, llcx, tm: ManuallyDrop::new(tm) })
444467
}

0 commit comments

Comments
 (0)