@@ -861,11 +861,8 @@ fn decl_upcall_glue(ModuleRef llmod, type_names tn,
861
861
let int n = _n as int ;
862
862
let str s = abi. upcall_glue_name ( n, pass_task) ;
863
863
let vec[ TypeRef ] args = vec ( T_int ( ) ) ; // callee
864
-
865
- args += vec ( T_taskptr ( tn) ) ;
866
-
867
- if ( pass_task) {
868
- n -= 1 ; // taskptr is included in n
864
+ if ( !pass_task) {
865
+ args += vec ( T_int ( ) ) ; // taskptr, will not be passed
869
866
}
870
867
args += _vec. init_elt [ TypeRef ] ( T_int ( ) , n as uint ) ;
871
868
@@ -886,8 +883,10 @@ fn get_upcall(&hashmap[str, ValueRef] upcalls,
886
883
887
884
fn trans_upcall ( @block_ctxt cx , str name , vec[ ValueRef ] args ) -> result {
888
885
auto cxx = cx. fcx . ccx ;
889
- auto t = trans_upcall2 ( cx. build , cxx. glues , cx. fcx . lltaskptr ,
890
- cxx. upcalls , cxx. tn , cxx. llmod , name, true , args) ;
886
+ auto lltaskptr = cx. build . PtrToInt ( cx. fcx . lltaskptr , T_int ( ) ) ;
887
+ auto args2 = vec ( lltaskptr) + args;
888
+ auto t = trans_upcall2 ( cx. build , cxx. glues , lltaskptr,
889
+ cxx. upcalls , cxx. tn , cxx. llmod , name, true , args2) ;
891
890
ret res( cx, t) ;
892
891
}
893
892
@@ -896,9 +895,6 @@ fn trans_upcall2(builder b, @glue_fns glues, ValueRef lltaskptr,
896
895
type_names tn, ModuleRef llmod, str name ,
897
896
bool pass_task , vec[ ValueRef ] args ) -> ValueRef {
898
897
let int n = ( _vec. len [ ValueRef ] ( args) as int ) ;
899
- if ( pass_task) {
900
- n += 1 ;
901
- }
902
898
let ValueRef llupcall = get_upcall ( upcalls, llmod, name, n) ;
903
899
llupcall = llvm. LLVMConstPointerCast ( llupcall, T_int ( ) ) ;
904
900
@@ -910,7 +906,9 @@ fn trans_upcall2(builder b, @glue_fns glues, ValueRef lltaskptr,
910
906
}
911
907
let vec[ ValueRef ] call_args = vec ( llupcall) ;
912
908
913
- call_args += vec ( lltaskptr) ;
909
+ if ( !pass_task) {
910
+ call_args += vec ( lltaskptr) ;
911
+ }
914
912
915
913
for ( ValueRef a in args) {
916
914
call_args += vec ( b. ZExtOrBitCast ( a, T_int ( ) ) ) ;
@@ -5733,9 +5731,11 @@ fn decl_native_fn_and_pair(@crate_ctxt cx,
5733
5731
auto arg_n = 3 u;
5734
5732
auto pass_task;
5735
5733
5734
+ auto lltaskptr = bcx. build . PtrToInt ( fcx. lltaskptr , T_int ( ) ) ;
5736
5735
alt ( abi) {
5737
5736
case ( ast. native_abi_rust ) {
5738
5737
pass_task = true ;
5738
+ call_args += vec ( lltaskptr) ;
5739
5739
for each ( uint i in _uint. range( 0 u, num_ty_param) ) {
5740
5740
auto llarg = llvm. LLVMGetParam ( fcx. llfn, arg_n) ;
5741
5741
check ( llarg as int != 0 ) ;
@@ -5755,8 +5755,8 @@ fn decl_native_fn_and_pair(@crate_ctxt cx,
5755
5755
arg_n += 1 u;
5756
5756
}
5757
5757
5758
- auto r = trans_upcall2( bcx. build, cx. glues, fcx . lltaskptr, cx. upcalls,
5759
- cx. tn , cx . llmod, name, pass_task, call_args) ;
5758
+ auto r = trans_upcall2( bcx. build, cx. glues, lltaskptr, cx. upcalls, cx . tn ,
5759
+ cx. llmod, name, pass_task, call_args) ;
5760
5760
auto rptr = bcx. build. BitCast ( fcx. llretptr, T_ptr ( T_i32 ( ) ) ) ;
5761
5761
bcx. build. Store ( r, rptr) ;
5762
5762
bcx. build. RetVoid ( ) ;
0 commit comments