Skip to content

Commit fe5aaec

Browse files
committed
(almost) finish generating definitions for globals
1 parent 0e4e6bb commit fe5aaec

File tree

4 files changed

+73
-42
lines changed

4 files changed

+73
-42
lines changed

compiler/rustc_codegen_llvm/src/back/lto.rs

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -686,19 +686,33 @@ pub(crate) fn run_pass_manager(
686686
let ti8 = cx.type_i8();
687687
let tarr = cx.type_array(ti32, 3);
688688

689+
// coppied from LLVM
690+
// typedef struct {
691+
// uint64_t Reserved;
692+
// uint16_t Version;
693+
// uint16_t Kind;
694+
// uint32_t Flags;
695+
// void *Address;
696+
// char *SymbolName;
697+
// uint64_t Size;
698+
// uint64_t Data;
699+
// void *AuxAddr;
700+
// } __tgt_offload_entry;
689701
let entry_elements = vec![ti64, ti16, ti16, ti32, tptr, tptr, ti64, ti64, tptr];
690702
let kernel_elements = vec![ti32, ti32, tptr, tptr, tptr, tptr, tptr, tptr, ti64, ti64, tarr, tarr, ti32];
691703

692704
cx.set_struct_body(offload_entry_ty, &entry_elements, false);
693705
cx.set_struct_body(kernel_arguments_ty, &kernel_elements, false);
694706
let global = cx.declare_global("my_struct_global", offload_entry_ty);
695707
let global = cx.declare_global("my_struct_global2", kernel_arguments_ty);
708+
//@my_struct_global = external global %struct.__tgt_offload_entry
709+
//@my_struct_global2 = external global %struct.__tgt_kernel_arguments
696710
dbg!(&offload_entry_ty);
697711
dbg!(&kernel_arguments_ty);
698712
//LLVMTypeRef elements[9] = {i64Ty, i16Ty, i16Ty, i32Ty, ptrTy, ptrTy, i64Ty, i64Ty, ptrTy};
699713
//LLVMStructSetBody(structTy, elements, 9, 0);
700714
dbg!("created struct");
701-
for num in 0..5 {
715+
for num in 0..9 {
702716
if !cx.get_function(&format!("kernel_{num}")).is_some() {
703717
continue;
704718
}
@@ -711,19 +725,24 @@ pub(crate) fn run_pass_manager(
711725
size_val.push(cx.get_const_i64(val));
712726
}
713727
let initializer = cx.const_array(ti64, &size_val);
714-
add_global(cx, name, initializer, PrivateLinkage)
728+
add_unnamed_global(cx, name, initializer, PrivateLinkage)
715729
}
716730

717731
fn add_global<'ll>(cx: &SimpleCx<'ll>, name: &str, initializer: &'ll llvm::Value, l: Linkage) -> &'ll llvm::Value {
718732
let c_name = CString::new(name).unwrap();
719733
let llglobal: &'ll llvm::Value = llvm::add_global(cx.llmod, cx.val_ty(initializer), &c_name);
720734
llvm::set_global_constant(llglobal, true);
721-
unsafe {llvm::LLVMSetUnnamedAddress(llglobal, llvm::UnnamedAddr::Global)};
722735
llvm::set_linkage(llglobal, l);
723736
llvm::set_initializer(llglobal, initializer);
724737
llglobal
725738
}
726739

740+
fn add_unnamed_global<'ll>(cx: &SimpleCx<'ll>, name: &str, initializer: &'ll llvm::Value, l: Linkage) -> &'ll llvm::Value {
741+
let llglobal = add_global(cx, name, initializer, l);
742+
unsafe {llvm::LLVMSetUnnamedAddress(llglobal, llvm::UnnamedAddr::Global)};
743+
llglobal
744+
}
745+
727746
// We add a pair of sizes and maptypes per offloadable function.
728747
// @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 800, i64 544, i64 547, i64 544]
729748
let o_sizes = add_priv_unnamed_arr(&cx, &format!(".offload_sizes.{num}"), &vec![8u64,0,16,0]);
@@ -736,34 +755,42 @@ pub(crate) fn run_pass_manager(
736755
// the llvm.rodata entry name, and the omp_offloading_entries value
737756

738757
// @.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7.region_id = weak constant i8 0
758+
// @.offloading.entry_name = internal unnamed_addr constant [66 x i8] c"__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7\00", section ".llvm.rodata.offloading", align 1
739759
let name = format!(".kernel_{num}.region_id");
740760
let initializer = cx.get_const_i8(0);
741-
add_global(&cx, &name, initializer, WeakAnyLinkage);
761+
let region_id = add_unnamed_global(&cx, &name, initializer, WeakAnyLinkage);
742762

743-
let entry_name = format!("kernel_{num}");
744-
let c_entry_name = CString::new(entry_name).unwrap();
763+
let c_entry_name = CString::new(format!("kernel_{num}")).unwrap();
745764
let c_val = c_entry_name.as_bytes_with_nul();
746765
let foo = format!(".offloading.entry_name.{num}");
747766

748767
let initializer = crate::common::bytes_in_context(cx.llcx, c_val);
749-
let llglobal = add_global(&cx, &foo, initializer, InternalLinkage);
768+
let llglobal = add_unnamed_global(&cx, &foo, initializer, InternalLinkage);
750769
llvm::set_alignment(llglobal, rustc_abi::Align::ONE);
751770
let c_section_name = CString::new(".llvm.rodata.offloading").unwrap();
752771
llvm::set_section(llglobal, &c_section_name);
753-
// @.offloading.entry_name = internal unnamed_addr constant [66 x i8] c"__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7\00", section ".llvm.rodata.offloading", align 1
772+
773+
774+
// New, TODO: cleanup
775+
let name = format!(".offloading.entry.kernel_{num}");
776+
let ci64_0 = cx.get_const_i64(0);
777+
let ci16_1 = cx.get_const_i16(1);
778+
let elems: Vec<&llvm::Value> = vec![ci64_0, ci16_1, ci16_1, cx.get_const_i32(0), region_id, llglobal, ci64_0, ci64_0, cx.const_null(cx.type_ptr())];
779+
780+
let initializer = crate::common::named_struct(offload_entry_ty, &elems);
781+
let c_name = CString::new(name).unwrap();
782+
let llglobal = llvm::add_global(cx.llmod, offload_entry_ty, &c_name);
783+
llvm::set_global_constant(llglobal, true);
784+
llvm::set_linkage(llglobal, WeakAnyLinkage);
785+
llvm::set_initializer(llglobal, initializer);
786+
llvm::set_alignment(llglobal, rustc_abi::Align::ONE);
787+
let c_section_name = CString::new(".omp_offloading_entries").unwrap();
788+
llvm::set_section(llglobal, &c_section_name);
789+
// rustc
790+
// @.offloading.entry.kernel_3 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @.kernel_3.region_id, ptr @.offloading.entry_name.3, i64 0, i64 0, ptr null }, section ".omp_offloading_entries", align 1
791+
// clang
754792
// @.offloading.entry.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7.region_id, ptr @.offloading.entry_name, i64 0, i64 0, ptr null }, section "omp_offloading_entries", align 1
755793

756-
// typedef struct {
757-
// uint64_t Reserved;
758-
// uint16_t Version;
759-
// uint16_t Kind;
760-
// uint32_t Flags;
761-
// void *Address;
762-
// char *SymbolName;
763-
// uint64_t Size;
764-
// uint64_t Data;
765-
// void *AuxAddr;
766-
// } __tgt_offload_entry;
767794
//
768795
// enum Flags {
769796
// OMP_REGISTER_REQUIRES = 0x10,
@@ -788,29 +815,6 @@ pub(crate) fn run_pass_manager(
788815
// 4. @.offloading.entry_name = internal unnamed_addr constant [66 x i8] c"__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7\00", section ".llvm.rodata.offloading", align 1
789816
// 5. @.offloading.entry.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7.region_id, ptr @.offloading.entry_name, i64 0, i64 0, ptr null }, section "omp_offloading_entries", align 1
790817
}
791-
// @.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7.region_id = weak constant i8 0
792-
// @.offload_sizes = private unnamed_addr constant [4 x i64] [i64 8, i64 0, i64 16, i64 0]
793-
// @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 800, i64 544, i64 547, i64 544]
794-
// @.__omp_offloading_86fafab6_c40006a1__Z3barPSt7complexIdES1_S0_m_l13.region_id = weak constant i8 0
795-
// @.offload_sizes.1 = private unnamed_addr constant [4 x i64] [i64 8, i64 0, i64 16, i64 0]
796-
// @.offload_maptypes.2 = private unnamed_addr constant [4 x i64] [i64 800, i64 544, i64 547, i64 544]
797-
// @.__omp_offloading_86fafab6_c40006a1__Z5zaxpyPSt7complexIdES1_S0_m_l19.region_id = weak constant i8 0
798-
// @.offload_sizes.3 = private unnamed_addr constant [4 x i64] [i64 8, i64 0, i64 16, i64 0]
799-
// @.offload_maptypes.4 = private unnamed_addr constant [4 x i64] [i64 800, i64 544, i64 547, i64 544]
800-
// @.offload_sizes.5 = private unnamed_addr constant [2 x i64] [i64 16384, i64 16384]
801-
// @.offload_maptypes.6 = private unnamed_addr constant [2 x i64] [i64 1, i64 3]
802-
// @_ZSt4cout = external global %"class.std::basic_ostream", align 8
803-
// @.str = private unnamed_addr constant [3 x i8] c"hi\00", align 1
804-
// @.offload_sizes.7 = private unnamed_addr constant [2 x i64] [i64 16384, i64 16384]
805-
// @.offload_maptypes.8 = private unnamed_addr constant [2 x i64] [i64 1, i64 3]
806-
// @.str.9 = private unnamed_addr constant [3 x i8] c"ho\00", align 1
807-
// @.offloading.entry_name = internal unnamed_addr constant [66 x i8] c"__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7\00", section ".llvm.rodata.offloading", align 1
808-
// @.offloading.entry.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7.region_id, ptr @.offloading.entry_name, i64 0, i64 0, ptr null }, section "omp_offloading_entries", align 1
809-
// @.offloading.entry_name.10 = internal unnamed_addr constant [67 x i8] c"__omp_offloading_86fafab6_c40006a1__Z3barPSt7complexIdES1_S0_m_l13\00", section ".llvm.rodata.offloading", align 1
810-
// @.offloading.entry.__omp_offloading_86fafab6_c40006a1__Z3barPSt7complexIdES1_S0_m_l13 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @.__omp_offloading_86fafab6_c40006a1__Z3barPSt7complexIdES1_S0_m_l13.region_id, ptr @.offloading.entry_name.10, i64 0, i64 0, ptr null }, section "omp_offloading_entries", align 1
811-
// @.offloading.entry_name.11 = internal unnamed_addr constant [69 x i8] c"__omp_offloading_86fafab6_c40006a1__Z5zaxpyPSt7complexIdES1_S0_m_l19\00", section ".llvm.rodata.offloading", align 1
812-
// @.offloading.entry.__omp_offloading_86fafab6_c40006a1__Z5zaxpyPSt7complexIdES1_S0_m_l19 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @.__omp_offloading_86fafab6_c40006a1__Z5zaxpyPSt7complexIdES1_S0_m_l19.region_id, ptr @.offloading.entry_name.11, i64 0, i64 0, ptr null }, section "omp_offloading_entries", align 1
813-
// @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_zaxpy.cpp, ptr null }]
814818
} else {
815819
dbg!("no marker found");
816820
}

compiler/rustc_codegen_llvm/src/common.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ impl<'ll, CX: Borrow<SCx<'ll>>> GenericCx<'ll, CX> {
119119
r
120120
}
121121
}
122+
123+
pub(crate) fn const_null(&self, t: &'ll Type) -> &'ll Value {
124+
unsafe { llvm::LLVMConstNull(t) }
125+
}
122126
}
123127

124128
impl<'ll, 'tcx> ConstCodegenMethods for CodegenCx<'ll, 'tcx> {
@@ -373,6 +377,14 @@ pub(crate) fn bytes_in_context<'ll>(llcx: &'ll llvm::Context, bytes: &[u8]) -> &
373377
}
374378
}
375379

380+
pub(crate) fn named_struct<'ll>(
381+
ty: &'ll Type,
382+
elts: &[&'ll Value],
383+
) -> &'ll Value {
384+
let len = c_uint::try_from(elts.len()).expect("LLVMConstStructInContext elements len overflow");
385+
unsafe { llvm::LLVMConstNamedStruct(ty, elts.as_ptr(), len) }
386+
}
387+
376388
fn struct_in_context<'ll>(
377389
llcx: &'ll llvm::Context,
378390
elts: &[&'ll Value],

compiler/rustc_codegen_llvm/src/context.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,16 @@ impl<'ll, CX: Borrow<SCx<'ll>>> GenericCx<'ll, CX> {
685685
unsafe { llvm::LLVMConstInt(ty, n, llvm::False) }
686686
}
687687

688+
pub(crate) fn get_const_i32(&self, n: u64) -> &'ll Value {
689+
let ty = unsafe { llvm::LLVMInt32TypeInContext(self.llcx()) };
690+
unsafe { llvm::LLVMConstInt(ty, n, llvm::False) }
691+
}
692+
693+
pub(crate) fn get_const_i16(&self, n: u64) -> &'ll Value {
694+
let ty = unsafe { llvm::LLVMInt16TypeInContext(self.llcx()) };
695+
unsafe { llvm::LLVMConstInt(ty, n, llvm::False) }
696+
}
697+
688698
pub(crate) fn get_const_i8(&self, n: u64) -> &'ll Value {
689699
let ty = unsafe { llvm::LLVMInt8TypeInContext(self.llcx()) };
690700
unsafe { llvm::LLVMConstInt(ty, n, llvm::False) }

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,6 +1139,11 @@ unsafe extern "C" {
11391139
Count: c_uint,
11401140
Packed: Bool,
11411141
) -> &'a Value;
1142+
pub(crate) fn LLVMConstNamedStruct<'a>(
1143+
StructTy: &'a Type,
1144+
ConstantVals: *const &'a Value,
1145+
Count: c_uint,
1146+
) -> &'a Value;
11421147
pub(crate) fn LLVMConstVector(ScalarConstantVals: *const &Value, Size: c_uint) -> &Value;
11431148

11441149
// Constant expressions

0 commit comments

Comments
 (0)