@@ -7,6 +7,7 @@ use std::sync::Arc;
77use std:: { io, iter, slice} ;
88
99use object:: read:: archive:: ArchiveFile ;
10+ use rustc_abi:: { Align , Size } ;
1011use rustc_codegen_ssa:: back:: lto:: { LtoModuleCodegen , SerializedModule , ThinModule , ThinShared } ;
1112use rustc_codegen_ssa:: back:: symbol_export;
1213use rustc_codegen_ssa:: back:: write:: { CodegenContext , FatLtoInput } ;
@@ -648,7 +649,7 @@ fn gen_globals<'ll>(cx: &'ll SimpleCx<'_>) -> (&'ll llvm::Type, &'ll llvm::Value
648649 let c_val = c_entry_name. as_bytes_with_nul ( ) ;
649650 let initializer = crate :: common:: bytes_in_context ( cx. llcx , c_val) ;
650651 let at_zero = add_unnamed_global ( & cx, & "" , initializer, PrivateLinkage ) ;
651- llvm:: set_alignment ( at_zero, rustc_abi :: Align :: ONE ) ;
652+ llvm:: set_alignment ( at_zero, Align :: ONE ) ;
652653
653654 // @1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 22, ptr @0 }, align 8
654655 let struct_ident_ty = cx. type_named_struct ( "struct.ident_t" ) ;
@@ -657,7 +658,7 @@ fn gen_globals<'ll>(cx: &'ll SimpleCx<'_>) -> (&'ll llvm::Type, &'ll llvm::Value
657658 let initializer = crate :: common:: named_struct ( struct_ident_ty, & struct_elems) ;
658659 cx. set_struct_body ( struct_ident_ty, & struct_elems_ty, false ) ;
659660 let at_one = add_unnamed_global ( & cx, & "" , initializer, PrivateLinkage ) ;
660- llvm:: set_alignment ( at_one, rustc_abi :: Align :: EIGHT ) ;
661+ llvm:: set_alignment ( at_one, Align :: EIGHT ) ;
661662
662663 // coppied from LLVM
663664 // typedef struct {
@@ -711,7 +712,7 @@ fn gen_globals<'ll>(cx: &'ll SimpleCx<'_>) -> (&'ll llvm::Type, &'ll llvm::Value
711712 ( offload_entry_ty, at_one, foo, bar, baz, mapper_fn_ty)
712713}
713714
714- fn add_priv_unnamed_arr < ' ll > ( cx : & SimpleCx < ' ll > , name : & str , vals : & [ u64 ] ) -> & ' ll llvm:: Value {
715+ fn add_priv_unnamed_arr < ' ll > ( cx : & SimpleCx < ' ll > , name : & str , vals : & [ u64 ] ) -> & ' ll llvm:: Value {
715716 let ti64 = cx. type_i64 ( ) ;
716717 let size_ty = cx. type_array ( ti64, vals. len ( ) as u64 ) ;
717718 let mut size_val = Vec :: with_capacity ( vals. len ( ) ) ;
@@ -739,7 +740,7 @@ fn add_global<'ll>(cx: &SimpleCx<'ll>, name: &str, initializer: &'ll llvm::Value
739740
740741
741742
742- fn gen_define_handling < ' ll > ( cx : & ' ll SimpleCx < ' _ > , offload_entry_ty : & ' ll llvm:: Type , num : i64 ) {
743+ fn gen_define_handling < ' ll > ( cx : & ' ll SimpleCx < ' _ > , offload_entry_ty : & ' ll llvm:: Type , num : i64 ) -> & ' ll llvm :: Value {
743744 // We add a pair of sizes and maptypes per offloadable function.
744745 // @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 800, i64 544, i64 547, i64 544]
745746 let o_sizes = add_priv_unnamed_arr ( & cx, & format ! ( ".offload_sizes.{num}" ) , & vec ! [ 8u64 , 0 , 16 , 0 ] ) ;
@@ -763,7 +764,7 @@ fn gen_define_handling<'ll>(cx: &'ll SimpleCx<'_>, offload_entry_ty: &'ll llvm::
763764
764765 let initializer = crate :: common:: bytes_in_context ( cx. llcx , c_val) ;
765766 let llglobal = add_unnamed_global ( & cx, & foo, initializer, InternalLinkage ) ;
766- llvm:: set_alignment ( llglobal, rustc_abi :: Align :: ONE ) ;
767+ llvm:: set_alignment ( llglobal, Align :: ONE ) ;
767768 let c_section_name = CString :: new ( ".llvm.rodata.offloading" ) . unwrap ( ) ;
768769 llvm:: set_section ( llglobal, & c_section_name) ;
769770
@@ -780,7 +781,7 @@ fn gen_define_handling<'ll>(cx: &'ll SimpleCx<'_>, offload_entry_ty: &'ll llvm::
780781 llvm:: set_global_constant ( llglobal, true ) ;
781782 llvm:: set_linkage ( llglobal, WeakAnyLinkage ) ;
782783 llvm:: set_initializer ( llglobal, initializer) ;
783- llvm:: set_alignment ( llglobal, rustc_abi :: Align :: ONE ) ;
784+ llvm:: set_alignment ( llglobal, Align :: ONE ) ;
784785 let c_section_name = CString :: new ( ".omp_offloading_entries" ) . unwrap ( ) ;
785786 llvm:: set_section ( llglobal, & c_section_name) ;
786787 // rustc
@@ -795,9 +796,10 @@ fn gen_define_handling<'ll>(cx: &'ll SimpleCx<'_>, offload_entry_ty: &'ll llvm::
795796 // 3. @.__omp_offloading_<hash>_fnc_name_<hash> = weak constant i8 0
796797 // 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
797798 // 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
799+ o_types
798800}
799801
800- fn gen_call_handling < ' ll > ( cx : & ' ll SimpleCx < ' _ > , s_ident_t : & ' ll llvm:: Value , begin : & ' ll llvm:: Value , update : & ' ll llvm:: Value , end : & ' ll llvm:: Value , fn_ty : & ' ll llvm:: Type ) {
802+ fn gen_call_handling < ' ll > ( cx : & ' ll SimpleCx < ' _ > , s_ident_t : & ' ll llvm:: Value , begin : & ' ll llvm:: Value , update : & ' ll llvm:: Value , end : & ' ll llvm:: Value , fn_ty : & ' ll llvm:: Type , o_types : & [ & ' ll llvm :: Value ] ) {
801803
802804 let main_fn = cx. get_function ( "main" ) ;
803805 if let Some ( main_fn) = main_fn {
@@ -811,20 +813,33 @@ fn gen_call_handling<'ll>(cx: &'ll SimpleCx<'_>, s_ident_t: &'ll llvm::Value, be
811813 } ;
812814 let kernel_call_bb = unsafe { llvm:: LLVMGetInstructionParent ( kernel_call) } ;
813815 let mut builder = SBuilder :: build ( cx, kernel_call_bb) ;
816+
817+ // First we generate a few variables used for the data mappers below.
818+ // %.offload_baseptrs = alloca [3 x ptr], align 8
819+ // %.offload_ptrs = alloca [3 x ptr], align 8
820+ // %.offload_mappers = alloca [3 x ptr], align 8
821+ // %.offload_sizes = alloca [3 x i64], align 8
822+ unsafe { llvm:: LLVMRustPositionBuilderPastAllocas ( builder. llbuilder , main_fn) } ;
823+ let ty = cx. type_array ( cx. type_ptr ( ) , 3 ) ;
824+ builder. my_alloca2 ( ty, Align :: EIGHT , ".offload_baseptrs" ) ;
825+ builder. my_alloca2 ( ty, Align :: EIGHT , ".offload_ptrs" ) ;
826+ builder. my_alloca2 ( ty, Align :: EIGHT , ".offload_mappers" ) ;
827+ let ty = cx. type_array ( cx. type_i64 ( ) , 3 ) ;
828+ builder. my_alloca2 ( ty, Align :: EIGHT , ".offload_sizes" ) ;
829+
830+
831+ // Now we generate the __tgt_target_data calls
814832 unsafe { llvm:: LLVMRustPositionBefore ( builder. llbuilder , kernel_call) } ;
815833 dbg ! ( "positioned builder, ready" ) ;
816834
817835 let nullptr = cx. const_null ( cx. type_ptr ( ) ) ;
818- let args = vec ! [ s_ident_t, cx. get_const_i64( u64 :: MAX ) , cx. get_const_i32( 3 ) , nullptr, nullptr, nullptr, nullptr, nullptr, nullptr] ;
836+ let o_type = o_types[ 0 ] ;
837+ let args = vec ! [ s_ident_t, cx. get_const_i64( u64 :: MAX ) , cx. get_const_i32( 3 ) , nullptr, nullptr, nullptr, o_type, nullptr, nullptr] ;
819838 dbg ! ( & fn_ty) ;
820839 dbg ! ( & begin) ;
821840 dbg ! ( & args) ;
822841 builder. call ( fn_ty, begin, & args, None ) ;
823842 dbg ! ( "called begin" ) ;
824- //llty: &'ll Type,
825- //llfn: &'ll Value,
826- //args: &[&'ll Value],
827- //funclet: Option<&Funclet<'ll>>,
828843
829844 // 1. set insert point before kernel call.
830845 // 2. generate all the GEPS and stores.
@@ -895,14 +910,15 @@ pub(crate) fn run_pass_manager(
895910 let ( offload_entry_ty, at_one, foo, bar, baz, fn_ty) = gen_globals ( & cx) ;
896911
897912 dbg ! ( "created struct" ) ;
913+ let mut o_types = vec ! [ ] ;
898914 for num in 0 ..9 {
899915 if !cx. get_function ( & format ! ( "kernel_{num}" ) ) . is_some ( ) {
900916 continue ;
901917 }
902918 // TODO: replace num by proper fn name
903- gen_define_handling ( & cx, offload_entry_ty, num) ;
919+ o_types . push ( gen_define_handling ( & cx, offload_entry_ty, num) ) ;
904920 }
905- gen_call_handling ( & cx, at_one, foo, bar, baz, fn_ty) ;
921+ gen_call_handling ( & cx, at_one, foo, bar, baz, fn_ty, & o_types ) ;
906922 } else {
907923 dbg ! ( "no marker found" ) ;
908924 }
0 commit comments