@@ -632,7 +632,7 @@ fn enable_autodiff_settings(ad: &[config::AutoDiff]) {
632
632
llvm:: set_rust_rules ( true ) ;
633
633
}
634
634
635
- fn gen_globals < ' ll > ( cx : & ' ll SimpleCx < ' _ > ) -> ( & ' ll llvm:: Type , & ' ll llvm:: Value ) {
635
+ fn gen_globals < ' ll > ( cx : & ' ll SimpleCx < ' _ > ) -> ( & ' ll llvm:: Type , & ' ll llvm:: Value , & ' ll llvm :: Value , & ' ll llvm :: Value , & ' ll llvm :: Value , & ' ll llvm :: Type ) {
636
636
let offload_entry_ty = cx. type_named_struct ( "struct.__tgt_offload_entry" ) ;
637
637
let kernel_arguments_ty = cx. type_named_struct ( "struct.__tgt_kernel_arguments" ) ;
638
638
let tptr = cx. type_ptr ( ) ;
@@ -708,7 +708,7 @@ fn gen_globals<'ll>(cx: &'ll SimpleCx<'_>) -> (&'ll llvm::Type, &'ll llvm::Value
708
708
attributes:: apply_to_llfn ( bar, Function , & [ nounwind] ) ;
709
709
attributes:: apply_to_llfn ( baz, Function , & [ nounwind] ) ;
710
710
711
- ( offload_entry_ty, at_one)
711
+ ( offload_entry_ty, at_one, foo , bar , baz , mapper_fn_ty )
712
712
}
713
713
714
714
fn add_priv_unnamed_arr < ' ll > ( cx : & SimpleCx < ' ll > , name : & str , vals : & [ u64 ] ) -> & ' ll llvm:: Value {
@@ -797,7 +797,7 @@ fn gen_define_handling<'ll>(cx: &'ll SimpleCx<'_>, offload_entry_ty: &'ll llvm::
797
797
// 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
798
798
}
799
799
800
- fn gen_call_handling < ' ll > ( cx : & ' ll SimpleCx < ' _ > , s_ident_t : & ' ll llvm:: Value ) {
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 ) {
801
801
802
802
let main_fn = cx. get_function ( "main" ) ;
803
803
if let Some ( main_fn) = main_fn {
@@ -810,10 +810,22 @@ fn gen_call_handling<'ll>(cx: &'ll SimpleCx<'_>, s_ident_t: &'ll llvm::Value) {
810
810
return ;
811
811
} ;
812
812
let kernel_call_bb = unsafe { llvm:: LLVMGetInstructionParent ( kernel_call) } ;
813
- let builder = SBuilder :: build ( cx, kernel_call_bb) ;
813
+ let mut builder = SBuilder :: build ( cx, kernel_call_bb) ;
814
814
unsafe { llvm:: LLVMRustPositionBefore ( builder. llbuilder , kernel_call) } ;
815
815
dbg ! ( "positioned builder, ready" ) ;
816
816
817
+ 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] ;
819
+ dbg ! ( & fn_ty) ;
820
+ dbg ! ( & begin) ;
821
+ dbg ! ( & args) ;
822
+ builder. call ( fn_ty, begin, & args, None ) ;
823
+ dbg ! ( "called begin" ) ;
824
+ //llty: &'ll Type,
825
+ //llfn: &'ll Value,
826
+ //args: &[&'ll Value],
827
+ //funclet: Option<&Funclet<'ll>>,
828
+
817
829
// 1. set insert point before kernel call.
818
830
// 2. generate all the GEPS and stores.
819
831
// 3. generate __tgt_target_data calls.
@@ -880,7 +892,7 @@ pub(crate) fn run_pass_manager(
880
892
SimpleCx :: new ( module. module_llvm . llmod ( ) , & module. module_llvm . llcx , cgcx. pointer_size ) ;
881
893
if cx. get_function ( "gen_tgt_offload" ) . is_some ( ) {
882
894
883
- let ( offload_entry_ty, at_one) = gen_globals ( & cx) ;
895
+ let ( offload_entry_ty, at_one, foo , bar , baz , fn_ty ) = gen_globals ( & cx) ;
884
896
885
897
dbg ! ( "created struct" ) ;
886
898
for num in 0 ..9 {
@@ -890,7 +902,7 @@ pub(crate) fn run_pass_manager(
890
902
// TODO: replace num by proper fn name
891
903
gen_define_handling ( & cx, offload_entry_ty, num) ;
892
904
}
893
- gen_call_handling ( & cx, at_one) ;
905
+ gen_call_handling ( & cx, at_one, foo , bar , baz , fn_ty ) ;
894
906
} else {
895
907
dbg ! ( "no marker found" ) ;
896
908
}
0 commit comments