@@ -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 }
0 commit comments