Skip to content

Commit dcf122e

Browse files
committed
Change the type of the second argument of upcalls to be a %task*.
1 parent c7cd60a commit dcf122e

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

src/comp/middle/trans.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -855,8 +855,11 @@ fn decl_upcall_glue(ModuleRef llmod, type_names tn,
855855
let int n = _n as int;
856856
let str s = abi.upcall_glue_name(n, pass_task);
857857
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
860863
}
861864
args += _vec.init_elt[TypeRef](T_int(), n as uint);
862865

@@ -877,10 +880,8 @@ fn get_upcall(&hashmap[str, ValueRef] upcalls,
877880

878881
fn trans_upcall(@block_ctxt cx, str name, vec[ValueRef] args) -> result {
879882
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);
884885
ret res(cx, t);
885886
}
886887

@@ -889,6 +890,9 @@ fn trans_upcall2(builder b, @glue_fns glues, ValueRef lltaskptr,
889890
type_names tn, ModuleRef llmod, str name,
890891
bool pass_task, vec[ValueRef] args) -> ValueRef {
891892
let int n = (_vec.len[ValueRef](args) as int);
893+
if (pass_task) {
894+
n += 1;
895+
}
892896
let ValueRef llupcall = get_upcall(upcalls, llmod, name, n);
893897
llupcall = llvm.LLVMConstPointerCast(llupcall, T_int());
894898

@@ -900,9 +904,7 @@ fn trans_upcall2(builder b, @glue_fns glues, ValueRef lltaskptr,
900904
}
901905
let vec[ValueRef] call_args = vec(llupcall);
902906

903-
if (!pass_task) {
904-
call_args += vec(lltaskptr);
905-
}
907+
call_args += vec(lltaskptr);
906908

907909
for (ValueRef a in args) {
908910
call_args += vec(b.ZExtOrBitCast(a, T_int()));
@@ -5701,11 +5703,9 @@ fn decl_native_fn_and_pair(@crate_ctxt cx,
57015703
auto arg_n = 3u;
57025704
auto pass_task;
57035705

5704-
auto lltaskptr = bcx.build.PtrToInt(fcx.lltaskptr, T_int());
57055706
alt (abi) {
57065707
case (ast.native_abi_rust) {
57075708
pass_task = true;
5708-
call_args += vec(lltaskptr);
57095709
for each (uint i in _uint.range(0u, num_ty_param)) {
57105710
auto llarg = llvm.LLVMGetParam(fcx.llfn, arg_n);
57115711
check (llarg as int != 0);
@@ -5725,8 +5725,8 @@ fn decl_native_fn_and_pair(@crate_ctxt cx,
57255725
arg_n += 1u;
57265726
}
57275727

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);
57305730
auto rptr = bcx.build.BitCast(fcx.llretptr, T_ptr(T_i32()));
57315731
bcx.build.Store(r, rptr);
57325732
bcx.build.RetVoid();

0 commit comments

Comments
 (0)