Skip to content

Commit e30f77b

Browse files
committed
fix device code
1 parent ae22d37 commit e30f77b

File tree

2 files changed

+33
-42
lines changed

2 files changed

+33
-42
lines changed

compiler/rustc_codegen_llvm/src/builder/gpu_offload.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ fn gen_define_handling<'ll>(
248248
o_types
249249
}
250250

251-
fn declare_offload_fn<'ll>(
251+
pub(crate) fn declare_offload_fn<'ll>(
252252
cx: &'ll SimpleCx<'_>,
253253
name: &str,
254254
ty: &'ll llvm::Type,

compiler/rustc_codegen_llvm/src/builder/gpu_wrapper.rs

Lines changed: 32 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use std::ffi::CString;
22

33
use llvm::Linkage::*;
4-
use rustc_abi::Align;
4+
use rustc_abi::{AddressSpace, Align};
55
use rustc_codegen_ssa::back::write::CodegenContext;
66
use rustc_codegen_ssa::traits::BaseTypeCodegenMethods;
77

88
use crate::builder::gpu_offload::*;
9-
use crate::llvm::{self, Visibility};
9+
use crate::llvm::{self, Linkage, Type, Value, Visibility};
1010
use crate::{LlvmCodegenBackend, ModuleLlvm, SimpleCx};
1111

1212
pub(crate) fn create_struct_ty<'ll>(
@@ -22,6 +22,23 @@ pub(crate) fn create_struct_ty<'ll>(
2222
}
2323
}
2424

25+
pub(crate) fn add_global_decl<'ll>(
26+
cx: &SimpleCx<'ll>,
27+
ty: &'ll Type,
28+
name: &str,
29+
l: Linkage,
30+
hidden: bool,
31+
) -> &'ll llvm::Value {
32+
let c_name = CString::new(name).unwrap();
33+
let llglobal: &'ll llvm::Value = llvm::add_global(cx.llmod, ty, &c_name);
34+
llvm::set_global_constant(llglobal, true);
35+
llvm::set_linkage(llglobal, l);
36+
if hidden {
37+
llvm::set_visibility(llglobal, Visibility::Hidden);
38+
}
39+
llglobal
40+
}
41+
2542
// We don't copy types from other functions because we generate a new module and context.
2643
// Bringing in types from other contexts would likely cause issues.
2744
pub(crate) fn gen_image_wrapper_module(cgcx: &CodegenContext<LlvmCodegenBackend>) {
@@ -32,6 +49,7 @@ pub(crate) fn gen_image_wrapper_module(cgcx: &CodegenContext<LlvmCodegenBackend>
3249
ModuleLlvm::new_simple(name, dl_cstr.into_raw(), target_cstr.into_raw(), &cgcx).unwrap();
3350
let cx = SimpleCx::new(m.llmod(), m.llcx, cgcx.pointer_size);
3451
let tptr = cx.type_ptr();
52+
let tptr1 = cx.type_ptr_ext(AddressSpace(1));
3553
let ti64 = cx.type_i64();
3654
let ti32 = cx.type_i32();
3755
let ti16 = cx.type_i16();
@@ -44,28 +62,22 @@ pub(crate) fn gen_image_wrapper_module(cgcx: &CodegenContext<LlvmCodegenBackend>
4462
let offload_entry_ty = add_tgt_offload_entry(&cx);
4563
let offload_entry_arr = cx.type_array(offload_entry_ty, 0);
4664

47-
let c_name = CString::new("__start_omp_offloading_entries").unwrap();
48-
let llglobal = llvm::add_global(cx.llmod, offload_entry_arr, &c_name);
49-
llvm::set_global_constant(llglobal, true);
50-
llvm::set_linkage(llglobal, ExternalLinkage);
51-
llvm::set_visibility(llglobal, Visibility::Hidden);
52-
let c_name = CString::new("__stop_omp_offloading_entries").unwrap();
53-
let llglobal = llvm::add_global(cx.llmod, offload_entry_arr, &c_name);
54-
llvm::set_global_constant(llglobal, true);
55-
llvm::set_linkage(llglobal, ExternalLinkage);
56-
llvm::set_visibility(llglobal, Visibility::Hidden);
65+
let name = "__start_omp_offloading_entries";
66+
add_global_decl(&cx, offload_entry_arr, name, ExternalLinkage, true);
67+
68+
let name = "__stop_omp_offloading_entries";
69+
add_global_decl(&cx, offload_entry_arr, name, ExternalLinkage, true);
70+
71+
let name = "__dummy.omp_offloading_entries";
72+
let llglobal = add_global_decl(&cx, offload_entry_arr, name, InternalLinkage, false);
5773

58-
let c_name = CString::new("__dummy.omp_offloading_entries").unwrap();
59-
let llglobal = llvm::add_global(cx.llmod, offload_entry_arr, &c_name);
60-
llvm::set_global_constant(llglobal, true);
61-
llvm::set_linkage(llglobal, InternalLinkage);
6274
let c_section_name = CString::new("omp_offloading_entries").unwrap();
6375
llvm::set_section(llglobal, &c_section_name);
6476
let zeroinit = cx.const_null(offload_entry_arr);
6577
llvm::set_initializer(llglobal, zeroinit);
6678

6779
CString::new("llvm.compiler.used").unwrap();
68-
let arr_val = cx.const_array(tptr, &[llglobal]);
80+
let arr_val = cx.const_array(tptr1, &[llglobal]);
6981
let c_section_name = CString::new("llvm.metadata").unwrap();
7082
let llglobal = add_global(&cx, "llvm.compiler.used", arr_val, AppendingLinkage);
7183
llvm::set_section(llglobal, &c_section_name);
@@ -74,30 +86,9 @@ pub(crate) fn gen_image_wrapper_module(cgcx: &CodegenContext<LlvmCodegenBackend>
7486
//@llvm.compiler.used = appending global [1 x ptr] [ptr @__dummy.omp_offloading_entries], section "llvm.metadata"
7587

7688
let mapper_fn_ty = cx.type_func(&[tptr], cx.type_void());
77-
crate::declare::declare_simple_fn(
78-
&cx,
79-
&"__tgt_unregister_lib",
80-
llvm::CallConv::CCallConv,
81-
llvm::UnnamedAddr::No,
82-
llvm::Visibility::Default,
83-
mapper_fn_ty,
84-
);
85-
crate::declare::declare_simple_fn(
86-
&cx,
87-
&"__tgt_register_lib",
88-
llvm::CallConv::CCallConv,
89-
llvm::UnnamedAddr::No,
90-
llvm::Visibility::Default,
91-
mapper_fn_ty,
92-
);
93-
crate::declare::declare_simple_fn(
94-
&cx,
95-
&"atexit",
96-
llvm::CallConv::CCallConv,
97-
llvm::UnnamedAddr::No,
98-
llvm::Visibility::Default,
99-
cx.type_func(&[tptr], ti32),
100-
);
89+
declare_offload_fn(&cx, &"__tgt_register_lib", mapper_fn_ty);
90+
declare_offload_fn(&cx, &"__tgt_unregister_lib", mapper_fn_ty);
91+
declare_offload_fn(&cx, &"atexit", cx.type_func(&[tptr], ti32));
10192

10293
let unknown_txt = "11111111111111";
10394
let c_entry_name = CString::new(unknown_txt).unwrap();

0 commit comments

Comments
 (0)