@@ -7,6 +7,7 @@ use std::sync::Arc;
7
7
use std:: { io, iter, slice} ;
8
8
9
9
use object:: read:: archive:: ArchiveFile ;
10
+ use rustc_abi:: { Align , Size } ;
10
11
use rustc_codegen_ssa:: back:: lto:: { LtoModuleCodegen , SerializedModule , ThinModule , ThinShared } ;
11
12
use rustc_codegen_ssa:: back:: symbol_export;
12
13
use rustc_codegen_ssa:: back:: write:: { CodegenContext , FatLtoInput } ;
@@ -648,7 +649,7 @@ fn gen_globals<'ll>(cx: &'ll SimpleCx<'_>) -> (&'ll llvm::Type, &'ll llvm::Value
648
649
let c_val = c_entry_name. as_bytes_with_nul ( ) ;
649
650
let initializer = crate :: common:: bytes_in_context ( cx. llcx , c_val) ;
650
651
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 ) ;
652
653
653
654
// @1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 22, ptr @0 }, align 8
654
655
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
657
658
let initializer = crate :: common:: named_struct ( struct_ident_ty, & struct_elems) ;
658
659
cx. set_struct_body ( struct_ident_ty, & struct_elems_ty, false ) ;
659
660
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 ) ;
661
662
662
663
// coppied from LLVM
663
664
// typedef struct {
@@ -711,7 +712,7 @@ fn gen_globals<'ll>(cx: &'ll SimpleCx<'_>) -> (&'ll llvm::Type, &'ll llvm::Value
711
712
( offload_entry_ty, at_one, foo, bar, baz, mapper_fn_ty)
712
713
}
713
714
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 {
715
716
let ti64 = cx. type_i64 ( ) ;
716
717
let size_ty = cx. type_array ( ti64, vals. len ( ) as u64 ) ;
717
718
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
739
740
740
741
741
742
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 {
743
744
// We add a pair of sizes and maptypes per offloadable function.
744
745
// @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 800, i64 544, i64 547, i64 544]
745
746
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::
763
764
764
765
let initializer = crate :: common:: bytes_in_context ( cx. llcx , c_val) ;
765
766
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 ) ;
767
768
let c_section_name = CString :: new ( ".llvm.rodata.offloading" ) . unwrap ( ) ;
768
769
llvm:: set_section ( llglobal, & c_section_name) ;
769
770
@@ -780,7 +781,7 @@ fn gen_define_handling<'ll>(cx: &'ll SimpleCx<'_>, offload_entry_ty: &'ll llvm::
780
781
llvm:: set_global_constant ( llglobal, true ) ;
781
782
llvm:: set_linkage ( llglobal, WeakAnyLinkage ) ;
782
783
llvm:: set_initializer ( llglobal, initializer) ;
783
- llvm:: set_alignment ( llglobal, rustc_abi :: Align :: ONE ) ;
784
+ llvm:: set_alignment ( llglobal, Align :: ONE ) ;
784
785
let c_section_name = CString :: new ( ".omp_offloading_entries" ) . unwrap ( ) ;
785
786
llvm:: set_section ( llglobal, & c_section_name) ;
786
787
// rustc
@@ -795,9 +796,10 @@ fn gen_define_handling<'ll>(cx: &'ll SimpleCx<'_>, offload_entry_ty: &'ll llvm::
795
796
// 3. @.__omp_offloading_<hash>_fnc_name_<hash> = weak constant i8 0
796
797
// 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
797
798
// 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
798
800
}
799
801
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 ] ) {
801
803
802
804
let main_fn = cx. get_function ( "main" ) ;
803
805
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
811
813
} ;
812
814
let kernel_call_bb = unsafe { llvm:: LLVMGetInstructionParent ( kernel_call) } ;
813
815
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
814
832
unsafe { llvm:: LLVMRustPositionBefore ( builder. llbuilder , kernel_call) } ;
815
833
dbg ! ( "positioned builder, ready" ) ;
816
834
817
835
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] ;
819
838
dbg ! ( & fn_ty) ;
820
839
dbg ! ( & begin) ;
821
840
dbg ! ( & args) ;
822
841
builder. call ( fn_ty, begin, & args, None ) ;
823
842
dbg ! ( "called begin" ) ;
824
- //llty: &'ll Type,
825
- //llfn: &'ll Value,
826
- //args: &[&'ll Value],
827
- //funclet: Option<&Funclet<'ll>>,
828
843
829
844
// 1. set insert point before kernel call.
830
845
// 2. generate all the GEPS and stores.
@@ -895,14 +910,15 @@ pub(crate) fn run_pass_manager(
895
910
let ( offload_entry_ty, at_one, foo, bar, baz, fn_ty) = gen_globals ( & cx) ;
896
911
897
912
dbg ! ( "created struct" ) ;
913
+ let mut o_types = vec ! [ ] ;
898
914
for num in 0 ..9 {
899
915
if !cx. get_function ( & format ! ( "kernel_{num}" ) ) . is_some ( ) {
900
916
continue ;
901
917
}
902
918
// 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) ) ;
904
920
}
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 ) ;
906
922
} else {
907
923
dbg ! ( "no marker found" ) ;
908
924
}
0 commit comments