@@ -686,19 +686,33 @@ pub(crate) fn run_pass_manager(
686
686
let ti8 = cx. type_i8 ( ) ;
687
687
let tarr = cx. type_array ( ti32, 3 ) ;
688
688
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;
689
701
let entry_elements = vec ! [ ti64, ti16, ti16, ti32, tptr, tptr, ti64, ti64, tptr] ;
690
702
let kernel_elements = vec ! [ ti32, ti32, tptr, tptr, tptr, tptr, tptr, tptr, ti64, ti64, tarr, tarr, ti32] ;
691
703
692
704
cx. set_struct_body ( offload_entry_ty, & entry_elements, false ) ;
693
705
cx. set_struct_body ( kernel_arguments_ty, & kernel_elements, false ) ;
694
706
let global = cx. declare_global ( "my_struct_global" , offload_entry_ty) ;
695
707
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
696
710
dbg ! ( & offload_entry_ty) ;
697
711
dbg ! ( & kernel_arguments_ty) ;
698
712
//LLVMTypeRef elements[9] = {i64Ty, i16Ty, i16Ty, i32Ty, ptrTy, ptrTy, i64Ty, i64Ty, ptrTy};
699
713
//LLVMStructSetBody(structTy, elements, 9, 0);
700
714
dbg ! ( "created struct" ) ;
701
- for num in 0 ..5 {
715
+ for num in 0 ..9 {
702
716
if !cx. get_function ( & format ! ( "kernel_{num}" ) ) . is_some ( ) {
703
717
continue ;
704
718
}
@@ -711,19 +725,24 @@ pub(crate) fn run_pass_manager(
711
725
size_val. push ( cx. get_const_i64 ( val) ) ;
712
726
}
713
727
let initializer = cx. const_array ( ti64, & size_val) ;
714
- add_global ( cx, name, initializer, PrivateLinkage )
728
+ add_unnamed_global ( cx, name, initializer, PrivateLinkage )
715
729
}
716
730
717
731
fn add_global < ' ll > ( cx : & SimpleCx < ' ll > , name : & str , initializer : & ' ll llvm:: Value , l : Linkage ) -> & ' ll llvm:: Value {
718
732
let c_name = CString :: new ( name) . unwrap ( ) ;
719
733
let llglobal: & ' ll llvm:: Value = llvm:: add_global ( cx. llmod , cx. val_ty ( initializer) , & c_name) ;
720
734
llvm:: set_global_constant ( llglobal, true ) ;
721
- unsafe { llvm:: LLVMSetUnnamedAddress ( llglobal, llvm:: UnnamedAddr :: Global ) } ;
722
735
llvm:: set_linkage ( llglobal, l) ;
723
736
llvm:: set_initializer ( llglobal, initializer) ;
724
737
llglobal
725
738
}
726
739
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
+
727
746
// We add a pair of sizes and maptypes per offloadable function.
728
747
// @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 800, i64 544, i64 547, i64 544]
729
748
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(
736
755
// the llvm.rodata entry name, and the omp_offloading_entries value
737
756
738
757
// @.__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
739
759
let name = format ! ( ".kernel_{num}.region_id" ) ;
740
760
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 ) ;
742
762
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 ( ) ;
745
764
let c_val = c_entry_name. as_bytes_with_nul ( ) ;
746
765
let foo = format ! ( ".offloading.entry_name.{num}" ) ;
747
766
748
767
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 ) ;
750
769
llvm:: set_alignment ( llglobal, rustc_abi:: Align :: ONE ) ;
751
770
let c_section_name = CString :: new ( ".llvm.rodata.offloading" ) . unwrap ( ) ;
752
771
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
754
792
// @.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
755
793
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;
767
794
//
768
795
// enum Flags {
769
796
// OMP_REGISTER_REQUIRES = 0x10,
@@ -788,29 +815,6 @@ pub(crate) fn run_pass_manager(
788
815
// 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
789
816
// 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
790
817
}
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 }]
814
818
} else {
815
819
dbg ! ( "no marker found" ) ;
816
820
}
0 commit comments