Remove taskptr argument from upcalls

Issue #466
This commit is contained in:
Marijn Haverbeke 2011-10-20 11:42:40 +02:00
parent e927df17f7
commit 6323a012bd
5 changed files with 54 additions and 63 deletions

View file

@ -39,13 +39,8 @@ fn declare_upcalls(_tn: type_names, tydesc_type: TypeRef,
let fn_ty = T_fn(arg_tys, rv);
ret trans::decl_cdecl_fn(llmod, "upcall_" + name, fn_ty);
}
fn decl_with_taskptr(taskptr_type: TypeRef, llmod: ModuleRef, name: str,
tys: [TypeRef], rv: TypeRef) -> ValueRef {
ret decl(llmod, name, [taskptr_type] + tys, rv);
}
let dv = bind decl_with_taskptr(taskptr_type, llmod, _, _, T_void());
let d = bind decl_with_taskptr(taskptr_type, llmod, _, _, _);
let dr = bind decl(llmod, _, _, _);
let d = bind decl(llmod, _, _, _);
let dv = bind decl(llmod, _, _, T_void());
ret @{_fail: dv("fail", [T_ptr(T_i8()), T_ptr(T_i8()), T_size_t()]),
malloc:
@ -61,31 +56,28 @@ fn declare_upcalls(_tn: type_names, tydesc_type: TypeRef,
[T_ptr(T_nil()), T_size_t(), T_size_t(), T_size_t(),
T_ptr(T_ptr(tydesc_type)), T_int()], T_ptr(tydesc_type)),
vec_grow:
d("vec_grow", [T_ptr(T_ptr(T_opaque_vec())), T_int()],
T_void()),
dv("vec_grow", [T_ptr(T_ptr(T_opaque_vec())), T_int()]),
vec_push:
d("vec_push",
[T_ptr(T_ptr(T_opaque_vec())), T_ptr(tydesc_type),
T_ptr(T_i8())], T_void()),
dv("vec_push",
[T_ptr(T_ptr(T_opaque_vec())), T_ptr(tydesc_type),
T_ptr(T_i8())]),
cmp_type:
dr("cmp_type",
dv("cmp_type",
[T_ptr(T_i1()), taskptr_type, T_ptr(tydesc_type),
T_ptr(T_ptr(tydesc_type)), T_ptr(T_i8()), T_ptr(T_i8()),
T_i8()], T_void()),
T_i8()]),
log_type:
dr("log_type",
[taskptr_type, T_ptr(tydesc_type), T_ptr(T_i8()), T_i32()],
T_void()),
dv("log_type", [T_ptr(tydesc_type), T_ptr(T_i8()), T_i32()]),
dynastack_mark: d("dynastack_mark", [], T_ptr(T_i8())),
dynastack_alloc:
d("dynastack_alloc_2", [T_size_t(), T_ptr(tydesc_type)],
T_ptr(T_i8())),
dynastack_free: d("dynastack_free", [T_ptr(T_i8())], T_void()),
alloc_c_stack: dr("alloc_c_stack", [T_size_t()], T_ptr(T_i8())),
call_c_stack: dr("call_c_stack",
[T_ptr(T_fn([], T_int())), T_ptr(T_i8())],
T_int()),
rust_personality: dr("rust_personality", [], T_i32())
dynastack_free: dv("dynastack_free", [T_ptr(T_i8())]),
alloc_c_stack: d("alloc_c_stack", [T_size_t()], T_ptr(T_i8())),
call_c_stack: d("call_c_stack",
[T_ptr(T_fn([], T_int())), T_ptr(T_i8())],
T_int()),
rust_personality: d("rust_personality", [], T_i32())
};
}
//

View file

@ -389,13 +389,13 @@ fn trans_native_call(cx: @block_ctxt, externs: hashmap<str, ValueRef>,
fn trans_non_gc_free(cx: @block_ctxt, v: ValueRef) -> @block_ctxt {
Call(cx, bcx_ccx(cx).upcalls.free,
[cx.fcx.lltaskptr, PointerCast(cx, v, T_ptr(T_i8())), C_int(0)]);
[PointerCast(cx, v, T_ptr(T_i8())), C_int(0)]);
ret cx;
}
fn trans_shared_free(cx: @block_ctxt, v: ValueRef) -> @block_ctxt {
Call(cx, bcx_ccx(cx).upcalls.shared_free,
[cx.fcx.lltaskptr, PointerCast(cx, v, T_ptr(T_i8()))]);
[PointerCast(cx, v, T_ptr(T_i8()))]);
ret cx;
}
@ -462,11 +462,10 @@ fn dynastack_alloca(cx: @block_ctxt, t: TypeRef, n: ValueRef, ty: ty::t) ->
if cx.unreachable { ret llvm::LLVMGetUndef(t); }
let bcx = cx;
let dy_cx = new_raw_block_ctxt(cx.fcx, cx.fcx.lldynamicallocas);
let lltaskptr = bcx_fcx(bcx).lltaskptr;
alt bcx_fcx(cx).llobstacktoken {
none. {
bcx_fcx(cx).llobstacktoken =
some(mk_obstack_token(bcx_ccx(cx), cx.fcx, lltaskptr));
some(mk_obstack_token(bcx_ccx(cx), cx.fcx));
}
some(_) {/* no-op */ }
}
@ -477,14 +476,14 @@ fn dynastack_alloca(cx: @block_ctxt, t: TypeRef, n: ValueRef, ty: ty::t) ->
let ti = none;
let lltydesc = get_tydesc(cx, ty, false, tps_normal, ti).result.val;
let llresult = Call(dy_cx, dynastack_alloc, [lltaskptr, llsz, lltydesc]);
let llresult = Call(dy_cx, dynastack_alloc, [llsz, lltydesc]);
ret PointerCast(dy_cx, llresult, T_ptr(t));
}
fn mk_obstack_token(ccx: @crate_ctxt, fcx: @fn_ctxt, lltaskptr: ValueRef) ->
fn mk_obstack_token(ccx: @crate_ctxt, fcx: @fn_ctxt) ->
ValueRef {
let cx = new_raw_block_ctxt(fcx, fcx.lldynamicallocas);
ret Call(cx, ccx.upcalls.dynastack_mark, [lltaskptr]);
ret Call(cx, ccx.upcalls.dynastack_mark, []);
}
@ -836,7 +835,7 @@ fn trans_shared_malloc(cx: @block_ctxt, llptr_ty: TypeRef, llsize: ValueRef)
let tydesc = C_null(T_ptr(bcx_ccx(cx).tydesc_type));
let rval =
Call(cx, bcx_ccx(cx).upcalls.shared_malloc,
[cx.fcx.lltaskptr, llsize, tydesc]);
[llsize, tydesc]);
ret rslt(cx, PointerCast(cx, rval, llptr_ty));
}
@ -875,7 +874,7 @@ fn trans_malloc_boxed_raw(cx: @block_ctxt, t: ty::t) -> result {
let lltydesc = tydesc_result.result.val; bcx = tydesc_result.result.bcx;
let rval = Call(cx, ccx.upcalls.malloc,
[cx.fcx.lltaskptr, llsz, lltydesc]);
[llsz, lltydesc]);
ret rslt(cx, PointerCast(cx, rval, llty));
}
@ -1034,7 +1033,7 @@ fn get_derived_tydesc(cx: @block_ctxt, t: ty::t, escapes: bool,
if escapes {
let td_val =
Call(bcx, bcx_ccx(bcx).upcalls.get_type_desc,
[bcx.fcx.lltaskptr, C_null(T_ptr(T_nil())), sz.val,
[C_null(T_ptr(T_nil())), sz.val,
align.val, C_uint(1u + n_params), llfirstparam,
C_uint(obj_params)]);
v = td_val;
@ -1938,10 +1937,8 @@ fn call_cmp_glue(cx: @block_ctxt, lhs: ValueRef, rhs: ValueRef, t: ty::t,
}
let llcmpresultptr = alloca(bcx, T_i1());
let llargs: [ValueRef] =
[llcmpresultptr, bcx.fcx.lltaskptr, lltydesc, lltydescs, llrawlhsptr,
llrawrhsptr, llop];
Call(bcx, llfn, llargs);
Call(bcx, llfn, [llcmpresultptr, bcx.fcx.lltaskptr, lltydesc, lltydescs,
llrawlhsptr, llrawrhsptr, llop]);
ret rslt(bcx, Load(bcx, llcmpresultptr));
}
@ -4556,7 +4553,7 @@ fn trans_log(lvl: int, cx: @block_ctxt, e: @ast::expr) -> @block_ctxt {
let llval_i8 = PointerCast(log_bcx, llvalptr, T_ptr(T_i8()));
Call(log_bcx, bcx_ccx(log_bcx).upcalls.log_type,
[log_bcx.fcx.lltaskptr, lltydesc, llval_i8, C_int(lvl)]);
[lltydesc, llval_i8, C_int(lvl)]);
log_bcx = trans_block_cleanups(log_bcx, log_cx);
Br(log_bcx, after_cx.llbb);
@ -4619,7 +4616,7 @@ fn trans_fail_value(bcx: @block_ctxt, sp_opt: option::t<span>,
}
let V_str = PointerCast(bcx, V_fail_str, T_ptr(T_i8()));
V_filename = PointerCast(bcx, V_filename, T_ptr(T_i8()));
let args = [bcx.fcx.lltaskptr, V_str, V_filename, C_int(V_line)];
let args = [V_str, V_filename, C_int(V_line)];
let bcx = invoke(bcx, bcx_ccx(bcx).upcalls._fail, args);
Unreachable(bcx);
ret bcx;
@ -4932,8 +4929,7 @@ fn trans_fn_cleanups(fcx: @fn_ctxt, cx: @block_ctxt) {
alt fcx.llobstacktoken {
some(lltoken_) {
let lltoken = lltoken_; // satisfy alias checker
Call(cx, fcx_ccx(fcx).upcalls.dynastack_free,
[fcx.lltaskptr, lltoken]);
Call(cx, fcx_ccx(fcx).upcalls.dynastack_free, [lltoken]);
}
none. {/* nothing to do */ }
}

View file

@ -163,7 +163,7 @@ fn trans_append(cx: @block_ctxt, vec_ty: ty::t, lhsptr: ValueRef,
if strings { new_fill = Sub(bcx, new_fill, C_int(1)); }
let opaque_lhs = PointerCast(bcx, lhsptr, T_ptr(T_ptr(T_opaque_vec())));
Call(bcx, bcx_ccx(cx).upcalls.vec_grow,
[cx.fcx.lltaskptr, opaque_lhs, new_fill]);
[opaque_lhs, new_fill]);
// Was overwritten if we resized
let lhs = Load(bcx, lhsptr);
rhs = Select(bcx, self_append, lhs, rhs);
@ -204,8 +204,7 @@ fn trans_append_literal(bcx: @block_ctxt, vptrptr: ValueRef, vec_ty: ty::t,
let spilled = r.val;
bcx = r.bcx;
Call(bcx, bcx_ccx(bcx).upcalls.vec_push,
[bcx.fcx.lltaskptr, opaque_v, td,
PointerCast(bcx, spilled, T_ptr(T_i8()))]);
[opaque_v, td, PointerCast(bcx, spilled, T_ptr(T_i8()))]);
}
ret bcx;
}