@@ -855,8 +855,11 @@ fn decl_upcall_glue(ModuleRef llmod, type_names tn,
855
855
let int n = _n as int ;
856
856
let str s = abi. upcall_glue_name ( n, pass_task) ;
857
857
let vec[ TypeRef ] args = vec ( T_int ( ) ) ; // callee
858
- if ( !pass_task) {
859
- args += vec ( T_int ( ) ) ; // taskptr, will not be passed
858
+
859
+ args += vec ( T_taskptr ( tn) ) ;
860
+
861
+ if ( pass_task) {
862
+ n -= 1 ; // taskptr is included in n
860
863
}
861
864
args += _vec. init_elt [ TypeRef ] ( T_int ( ) , n as uint ) ;
862
865
@@ -877,10 +880,8 @@ fn get_upcall(&hashmap[str, ValueRef] upcalls,
877
880
878
881
fn trans_upcall ( @block_ctxt cx , str name , vec[ ValueRef ] args ) -> result {
879
882
auto cxx = cx. fcx . ccx ;
880
- auto lltaskptr = cx. build . PtrToInt ( cx. fcx . lltaskptr , T_int ( ) ) ;
881
- auto args2 = vec ( lltaskptr) + args;
882
- auto t = trans_upcall2 ( cx. build , cxx. glues , lltaskptr,
883
- cxx. upcalls , cxx. tn , cxx. llmod , name, true , args2) ;
883
+ auto t = trans_upcall2 ( cx. build , cxx. glues , cx. fcx . lltaskptr ,
884
+ cxx. upcalls , cxx. tn , cxx. llmod , name, true , args) ;
884
885
ret res( cx, t) ;
885
886
}
886
887
@@ -889,6 +890,9 @@ fn trans_upcall2(builder b, @glue_fns glues, ValueRef lltaskptr,
889
890
type_names tn, ModuleRef llmod, str name ,
890
891
bool pass_task , vec[ ValueRef ] args ) -> ValueRef {
891
892
let int n = ( _vec. len [ ValueRef ] ( args) as int ) ;
893
+ if ( pass_task) {
894
+ n += 1 ;
895
+ }
892
896
let ValueRef llupcall = get_upcall ( upcalls, llmod, name, n) ;
893
897
llupcall = llvm. LLVMConstPointerCast ( llupcall, T_int ( ) ) ;
894
898
@@ -900,9 +904,7 @@ fn trans_upcall2(builder b, @glue_fns glues, ValueRef lltaskptr,
900
904
}
901
905
let vec[ ValueRef ] call_args = vec ( llupcall) ;
902
906
903
- if ( !pass_task) {
904
- call_args += vec ( lltaskptr) ;
905
- }
907
+ call_args += vec ( lltaskptr) ;
906
908
907
909
for ( ValueRef a in args) {
908
910
call_args += vec ( b. ZExtOrBitCast ( a, T_int ( ) ) ) ;
@@ -5701,11 +5703,9 @@ fn decl_native_fn_and_pair(@crate_ctxt cx,
5701
5703
auto arg_n = 3 u;
5702
5704
auto pass_task;
5703
5705
5704
- auto lltaskptr = bcx. build . PtrToInt ( fcx. lltaskptr , T_int ( ) ) ;
5705
5706
alt ( abi) {
5706
5707
case ( ast. native_abi_rust ) {
5707
5708
pass_task = true ;
5708
- call_args += vec ( lltaskptr) ;
5709
5709
for each ( uint i in _uint. range( 0 u, num_ty_param) ) {
5710
5710
auto llarg = llvm. LLVMGetParam ( fcx. llfn, arg_n) ;
5711
5711
check ( llarg as int != 0 ) ;
@@ -5725,8 +5725,8 @@ fn decl_native_fn_and_pair(@crate_ctxt cx,
5725
5725
arg_n += 1 u;
5726
5726
}
5727
5727
5728
- auto r = trans_upcall2( bcx. build, cx. glues, lltaskptr, cx. upcalls, cx . tn ,
5729
- cx. llmod, name, pass_task, call_args) ;
5728
+ auto r = trans_upcall2( bcx. build, cx. glues, fcx . lltaskptr, cx. upcalls,
5729
+ cx. tn , cx . llmod, name, pass_task, call_args) ;
5730
5730
auto rptr = bcx. build. BitCast ( fcx. llretptr, T_ptr ( T_i32 ( ) ) ) ;
5731
5731
bcx. build. Store ( r, rptr) ;
5732
5732
bcx. build. RetVoid ( ) ;
0 commit comments