@@ -840,13 +840,13 @@ fn gen_call_handling<'ll>(cx: &'ll SimpleCx<'_>, kernels: &[&'ll llvm::Value], s
840
840
return ;
841
841
} ;
842
842
let kernel_call_bb = unsafe { llvm:: LLVMGetInstructionParent ( kernel_call) } ;
843
- let called = unsafe { llvm:: LLVMGetCalledValue ( kernel_call) } ;
843
+ let called = unsafe { llvm:: LLVMGetCalledValue ( kernel_call) . unwrap ( ) } ;
844
844
let mut builder = SBuilder :: build ( cx, kernel_call_bb) ;
845
845
846
846
let types = cx. func_params_types ( cx. get_type_of_global ( called) ) ;
847
847
dbg ! ( & types) ;
848
848
let num_args = types. len ( ) as u64 ;
849
- let mut names: Vec < & llvm:: Value > = Vec :: with_capacity ( num_args) ;
849
+ let mut names: Vec < & llvm:: Value > = Vec :: with_capacity ( num_args as usize ) ;
850
850
851
851
// Step 0)
852
852
unsafe { llvm:: LLVMRustPositionBuilderPastAllocas ( builder. llbuilder , main_fn) } ;
@@ -859,21 +859,37 @@ fn gen_call_handling<'ll>(cx: &'ll SimpleCx<'_>, kernels: &[&'ll llvm::Value], s
859
859
let ty2 = cx. type_array ( cx. type_i64 ( ) , num_args) ;
860
860
let a4 = builder. my_alloca2 ( ty2, Align :: EIGHT , ".offload_sizes" ) ;
861
861
// Now we allocate once per function param, a copy to be passed to one of our maps.
862
+ let mut vals = vec ! [ ] ;
863
+ let mut geps = vec ! [ ] ;
864
+ let i32_0 = cx. get_const_i32 ( 0 ) ;
862
865
for ( index, in_ty) in types. iter ( ) . enumerate ( ) {
863
- // Todo:
866
+ // get function arg, store it into the alloca, and read it.
864
867
let p = llvm:: get_param ( called, index as u32 ) ;
865
868
let name = llvm:: get_value_name ( p) ;
866
- let arg_name = format ! ( "{name}.addr" ) ;
867
- let alloca = unsafe { llvm:: LLVMBuildAlloca ( builder. llbuilder , in_ty, arg_name) } ;
868
- // get function arg, store it into the alloca, and read it.
869
+ let name = str:: from_utf8 ( name) . unwrap ( ) ;
870
+ let arg_name = CString :: new ( format ! ( "{name}.addr" ) ) . unwrap ( ) ;
871
+ let alloca = unsafe { llvm:: LLVMBuildAlloca ( builder. llbuilder , in_ty, arg_name. as_ptr ( ) ) } ;
872
+ builder. store ( p, alloca, Align :: EIGHT ) ;
873
+ let val = builder. load ( in_ty, alloca, Align :: EIGHT ) ;
874
+ let gep = builder. inbounds_gep ( cx. type_f32 ( ) , val, & [ i32_0] ) ;
875
+ vals. push ( val) ;
876
+ geps. push ( gep) ;
869
877
}
870
878
871
879
872
880
// Step 1)
873
881
unsafe { llvm:: LLVMRustPositionBefore ( builder. llbuilder , kernel_call) } ;
882
+ for i in 0 ..num_args {
883
+ let idx = cx. get_const_i32 ( i) ;
884
+ let gep1 = builder. inbounds_gep ( ty, a1, & [ i32_0, idx] ) ;
885
+ builder. store ( vals[ i as usize ] , gep1, Align :: EIGHT ) ;
886
+ let gep2 = builder. inbounds_gep ( ty, a2, & [ i32_0, idx] ) ;
887
+ builder. store ( geps[ i as usize ] , gep2, Align :: EIGHT ) ;
888
+ let gep3 = builder. inbounds_gep ( ty2, a4, & [ i32_0, idx] ) ;
889
+ builder. store ( cx. get_const_i64 ( 1024 ) , gep3, Align :: EIGHT ) ;
890
+ }
874
891
875
892
// Step 2)
876
- let i32_0 = cx. get_const_i32 ( 0 ) ;
877
893
let gep1 = builder. inbounds_gep ( ty, a1, & [ i32_0, i32_0] ) ;
878
894
let gep2 = builder. inbounds_gep ( ty, a2, & [ i32_0, i32_0] ) ;
879
895
let gep3 = builder. inbounds_gep ( ty2, a4, & [ i32_0, i32_0] ) ;
0 commit comments