Skip to content

Commit 6323a01

Browse files
committed
Remove taskptr argument from upcalls
Issue #466
1 parent e927df1 commit 6323a01

File tree

5 files changed

+54
-63
lines changed

5 files changed

+54
-63
lines changed

src/comp/back/upcall.rs

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,8 @@ fn declare_upcalls(_tn: type_names, tydesc_type: TypeRef,
3939
let fn_ty = T_fn(arg_tys, rv);
4040
ret trans::decl_cdecl_fn(llmod, "upcall_" + name, fn_ty);
4141
}
42-
fn decl_with_taskptr(taskptr_type: TypeRef, llmod: ModuleRef, name: str,
43-
tys: [TypeRef], rv: TypeRef) -> ValueRef {
44-
ret decl(llmod, name, [taskptr_type] + tys, rv);
45-
}
46-
let dv = bind decl_with_taskptr(taskptr_type, llmod, _, _, T_void());
47-
let d = bind decl_with_taskptr(taskptr_type, llmod, _, _, _);
48-
let dr = bind decl(llmod, _, _, _);
42+
let d = bind decl(llmod, _, _, _);
43+
let dv = bind decl(llmod, _, _, T_void());
4944

5045
ret @{_fail: dv("fail", [T_ptr(T_i8()), T_ptr(T_i8()), T_size_t()]),
5146
malloc:
@@ -61,31 +56,28 @@ fn declare_upcalls(_tn: type_names, tydesc_type: TypeRef,
6156
[T_ptr(T_nil()), T_size_t(), T_size_t(), T_size_t(),
6257
T_ptr(T_ptr(tydesc_type)), T_int()], T_ptr(tydesc_type)),
6358
vec_grow:
64-
d("vec_grow", [T_ptr(T_ptr(T_opaque_vec())), T_int()],
65-
T_void()),
59+
dv("vec_grow", [T_ptr(T_ptr(T_opaque_vec())), T_int()]),
6660
vec_push:
67-
d("vec_push",
68-
[T_ptr(T_ptr(T_opaque_vec())), T_ptr(tydesc_type),
69-
T_ptr(T_i8())], T_void()),
61+
dv("vec_push",
62+
[T_ptr(T_ptr(T_opaque_vec())), T_ptr(tydesc_type),
63+
T_ptr(T_i8())]),
7064
cmp_type:
71-
dr("cmp_type",
65+
dv("cmp_type",
7266
[T_ptr(T_i1()), taskptr_type, T_ptr(tydesc_type),
7367
T_ptr(T_ptr(tydesc_type)), T_ptr(T_i8()), T_ptr(T_i8()),
74-
T_i8()], T_void()),
68+
T_i8()]),
7569
log_type:
76-
dr("log_type",
77-
[taskptr_type, T_ptr(tydesc_type), T_ptr(T_i8()), T_i32()],
78-
T_void()),
70+
dv("log_type", [T_ptr(tydesc_type), T_ptr(T_i8()), T_i32()]),
7971
dynastack_mark: d("dynastack_mark", [], T_ptr(T_i8())),
8072
dynastack_alloc:
8173
d("dynastack_alloc_2", [T_size_t(), T_ptr(tydesc_type)],
8274
T_ptr(T_i8())),
83-
dynastack_free: d("dynastack_free", [T_ptr(T_i8())], T_void()),
84-
alloc_c_stack: dr("alloc_c_stack", [T_size_t()], T_ptr(T_i8())),
85-
call_c_stack: dr("call_c_stack",
86-
[T_ptr(T_fn([], T_int())), T_ptr(T_i8())],
87-
T_int()),
88-
rust_personality: dr("rust_personality", [], T_i32())
75+
dynastack_free: dv("dynastack_free", [T_ptr(T_i8())]),
76+
alloc_c_stack: d("alloc_c_stack", [T_size_t()], T_ptr(T_i8())),
77+
call_c_stack: d("call_c_stack",
78+
[T_ptr(T_fn([], T_int())), T_ptr(T_i8())],
79+
T_int()),
80+
rust_personality: d("rust_personality", [], T_i32())
8981
};
9082
}
9183
//

src/comp/middle/trans.rs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -389,13 +389,13 @@ fn trans_native_call(cx: @block_ctxt, externs: hashmap<str, ValueRef>,
389389

390390
fn trans_non_gc_free(cx: @block_ctxt, v: ValueRef) -> @block_ctxt {
391391
Call(cx, bcx_ccx(cx).upcalls.free,
392-
[cx.fcx.lltaskptr, PointerCast(cx, v, T_ptr(T_i8())), C_int(0)]);
392+
[PointerCast(cx, v, T_ptr(T_i8())), C_int(0)]);
393393
ret cx;
394394
}
395395

396396
fn trans_shared_free(cx: @block_ctxt, v: ValueRef) -> @block_ctxt {
397397
Call(cx, bcx_ccx(cx).upcalls.shared_free,
398-
[cx.fcx.lltaskptr, PointerCast(cx, v, T_ptr(T_i8()))]);
398+
[PointerCast(cx, v, T_ptr(T_i8()))]);
399399
ret cx;
400400
}
401401

@@ -462,11 +462,10 @@ fn dynastack_alloca(cx: @block_ctxt, t: TypeRef, n: ValueRef, ty: ty::t) ->
462462
if cx.unreachable { ret llvm::LLVMGetUndef(t); }
463463
let bcx = cx;
464464
let dy_cx = new_raw_block_ctxt(cx.fcx, cx.fcx.lldynamicallocas);
465-
let lltaskptr = bcx_fcx(bcx).lltaskptr;
466465
alt bcx_fcx(cx).llobstacktoken {
467466
none. {
468467
bcx_fcx(cx).llobstacktoken =
469-
some(mk_obstack_token(bcx_ccx(cx), cx.fcx, lltaskptr));
468+
some(mk_obstack_token(bcx_ccx(cx), cx.fcx));
470469
}
471470
some(_) {/* no-op */ }
472471
}
@@ -477,14 +476,14 @@ fn dynastack_alloca(cx: @block_ctxt, t: TypeRef, n: ValueRef, ty: ty::t) ->
477476
let ti = none;
478477
let lltydesc = get_tydesc(cx, ty, false, tps_normal, ti).result.val;
479478

480-
let llresult = Call(dy_cx, dynastack_alloc, [lltaskptr, llsz, lltydesc]);
479+
let llresult = Call(dy_cx, dynastack_alloc, [llsz, lltydesc]);
481480
ret PointerCast(dy_cx, llresult, T_ptr(t));
482481
}
483482

484-
fn mk_obstack_token(ccx: @crate_ctxt, fcx: @fn_ctxt, lltaskptr: ValueRef) ->
483+
fn mk_obstack_token(ccx: @crate_ctxt, fcx: @fn_ctxt) ->
485484
ValueRef {
486485
let cx = new_raw_block_ctxt(fcx, fcx.lldynamicallocas);
487-
ret Call(cx, ccx.upcalls.dynastack_mark, [lltaskptr]);
486+
ret Call(cx, ccx.upcalls.dynastack_mark, []);
488487
}
489488

490489

@@ -836,7 +835,7 @@ fn trans_shared_malloc(cx: @block_ctxt, llptr_ty: TypeRef, llsize: ValueRef)
836835
let tydesc = C_null(T_ptr(bcx_ccx(cx).tydesc_type));
837836
let rval =
838837
Call(cx, bcx_ccx(cx).upcalls.shared_malloc,
839-
[cx.fcx.lltaskptr, llsize, tydesc]);
838+
[llsize, tydesc]);
840839
ret rslt(cx, PointerCast(cx, rval, llptr_ty));
841840
}
842841

@@ -875,7 +874,7 @@ fn trans_malloc_boxed_raw(cx: @block_ctxt, t: ty::t) -> result {
875874
let lltydesc = tydesc_result.result.val; bcx = tydesc_result.result.bcx;
876875

877876
let rval = Call(cx, ccx.upcalls.malloc,
878-
[cx.fcx.lltaskptr, llsz, lltydesc]);
877+
[llsz, lltydesc]);
879878
ret rslt(cx, PointerCast(cx, rval, llty));
880879
}
881880

@@ -1034,7 +1033,7 @@ fn get_derived_tydesc(cx: @block_ctxt, t: ty::t, escapes: bool,
10341033
if escapes {
10351034
let td_val =
10361035
Call(bcx, bcx_ccx(bcx).upcalls.get_type_desc,
1037-
[bcx.fcx.lltaskptr, C_null(T_ptr(T_nil())), sz.val,
1036+
[C_null(T_ptr(T_nil())), sz.val,
10381037
align.val, C_uint(1u + n_params), llfirstparam,
10391038
C_uint(obj_params)]);
10401039
v = td_val;
@@ -1938,10 +1937,8 @@ fn call_cmp_glue(cx: @block_ctxt, lhs: ValueRef, rhs: ValueRef, t: ty::t,
19381937
}
19391938

19401939
let llcmpresultptr = alloca(bcx, T_i1());
1941-
let llargs: [ValueRef] =
1942-
[llcmpresultptr, bcx.fcx.lltaskptr, lltydesc, lltydescs, llrawlhsptr,
1943-
llrawrhsptr, llop];
1944-
Call(bcx, llfn, llargs);
1940+
Call(bcx, llfn, [llcmpresultptr, bcx.fcx.lltaskptr, lltydesc, lltydescs,
1941+
llrawlhsptr, llrawrhsptr, llop]);
19451942
ret rslt(bcx, Load(bcx, llcmpresultptr));
19461943
}
19471944

@@ -4556,7 +4553,7 @@ fn trans_log(lvl: int, cx: @block_ctxt, e: @ast::expr) -> @block_ctxt {
45564553
let llval_i8 = PointerCast(log_bcx, llvalptr, T_ptr(T_i8()));
45574554

45584555
Call(log_bcx, bcx_ccx(log_bcx).upcalls.log_type,
4559-
[log_bcx.fcx.lltaskptr, lltydesc, llval_i8, C_int(lvl)]);
4556+
[lltydesc, llval_i8, C_int(lvl)]);
45604557

45614558
log_bcx = trans_block_cleanups(log_bcx, log_cx);
45624559
Br(log_bcx, after_cx.llbb);
@@ -4619,7 +4616,7 @@ fn trans_fail_value(bcx: @block_ctxt, sp_opt: option::t<span>,
46194616
}
46204617
let V_str = PointerCast(bcx, V_fail_str, T_ptr(T_i8()));
46214618
V_filename = PointerCast(bcx, V_filename, T_ptr(T_i8()));
4622-
let args = [bcx.fcx.lltaskptr, V_str, V_filename, C_int(V_line)];
4619+
let args = [V_str, V_filename, C_int(V_line)];
46234620
let bcx = invoke(bcx, bcx_ccx(bcx).upcalls._fail, args);
46244621
Unreachable(bcx);
46254622
ret bcx;
@@ -4932,8 +4929,7 @@ fn trans_fn_cleanups(fcx: @fn_ctxt, cx: @block_ctxt) {
49324929
alt fcx.llobstacktoken {
49334930
some(lltoken_) {
49344931
let lltoken = lltoken_; // satisfy alias checker
4935-
Call(cx, fcx_ccx(fcx).upcalls.dynastack_free,
4936-
[fcx.lltaskptr, lltoken]);
4932+
Call(cx, fcx_ccx(fcx).upcalls.dynastack_free, [lltoken]);
49374933
}
49384934
none. {/* nothing to do */ }
49394935
}

src/comp/middle/trans_vec.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ fn trans_append(cx: @block_ctxt, vec_ty: ty::t, lhsptr: ValueRef,
163163
if strings { new_fill = Sub(bcx, new_fill, C_int(1)); }
164164
let opaque_lhs = PointerCast(bcx, lhsptr, T_ptr(T_ptr(T_opaque_vec())));
165165
Call(bcx, bcx_ccx(cx).upcalls.vec_grow,
166-
[cx.fcx.lltaskptr, opaque_lhs, new_fill]);
166+
[opaque_lhs, new_fill]);
167167
// Was overwritten if we resized
168168
let lhs = Load(bcx, lhsptr);
169169
rhs = Select(bcx, self_append, lhs, rhs);
@@ -204,8 +204,7 @@ fn trans_append_literal(bcx: @block_ctxt, vptrptr: ValueRef, vec_ty: ty::t,
204204
let spilled = r.val;
205205
bcx = r.bcx;
206206
Call(bcx, bcx_ccx(bcx).upcalls.vec_push,
207-
[bcx.fcx.lltaskptr, opaque_v, td,
208-
PointerCast(bcx, spilled, T_ptr(T_i8()))]);
207+
[opaque_v, td, PointerCast(bcx, spilled, T_ptr(T_i8()))]);
209208
}
210209
ret bcx;
211210
}

src/rt/rust_shape.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,8 +552,8 @@ upcall_cmp_type(int8_t *result, rust_task *task, const type_desc *tydesc,
552552
}
553553

554554
extern "C" void
555-
upcall_log_type(rust_task *task, const type_desc *tydesc, uint8_t *data,
556-
uint32_t level) {
555+
upcall_log_type(const type_desc *tydesc, uint8_t *data, uint32_t level) {
556+
rust_task *task = rust_scheduler::get_task();
557557
if (task->sched->log_lvl < level)
558558
return; // TODO: Don't evaluate at all?
559559

src/rt/rust_upcall.cpp

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ upcall_fail(rust_task *task,
5555
}
5656

5757
extern "C" CDECL uintptr_t
58-
upcall_malloc(rust_task *unused_task, size_t nbytes, type_desc *td) {
58+
upcall_malloc(size_t nbytes, type_desc *td) {
5959
rust_task *task = rust_scheduler::get_task();
6060
LOG_UPCALL_ENTRY(task);
6161

@@ -85,7 +85,8 @@ upcall_malloc(rust_task *unused_task, size_t nbytes, type_desc *td) {
8585
* Called whenever an object's ref count drops to zero.
8686
*/
8787
extern "C" CDECL void
88-
upcall_free(rust_task *task, void* ptr, uintptr_t is_gc) {
88+
upcall_free(void* ptr, uintptr_t is_gc) {
89+
rust_task *task = rust_scheduler::get_task();
8990
LOG_UPCALL_ENTRY(task);
9091

9192
rust_scheduler *sched = task->sched;
@@ -100,7 +101,8 @@ upcall_free(rust_task *task, void* ptr, uintptr_t is_gc) {
100101
}
101102

102103
extern "C" CDECL uintptr_t
103-
upcall_shared_malloc(rust_task *task, size_t nbytes, type_desc *td) {
104+
upcall_shared_malloc(size_t nbytes, type_desc *td) {
105+
rust_task *task = rust_scheduler::get_task();
104106
LOG_UPCALL_ENTRY(task);
105107

106108
LOG(task, mem,
@@ -119,7 +121,8 @@ upcall_shared_malloc(rust_task *task, size_t nbytes, type_desc *td) {
119121
* Called whenever an object's ref count drops to zero.
120122
*/
121123
extern "C" CDECL void
122-
upcall_shared_free(rust_task *task, void* ptr) {
124+
upcall_shared_free(void* ptr) {
125+
rust_task *task = rust_scheduler::get_task();
123126
LOG_UPCALL_ENTRY(task);
124127

125128
rust_scheduler *sched = task->sched;
@@ -130,13 +133,13 @@ upcall_shared_free(rust_task *task, void* ptr) {
130133
}
131134

132135
extern "C" CDECL type_desc *
133-
upcall_get_type_desc(rust_task *task,
134-
void *curr_crate, // ignored, legacy compat.
136+
upcall_get_type_desc(void *curr_crate, // ignored, legacy compat.
135137
size_t size,
136138
size_t align,
137139
size_t n_descs,
138140
type_desc const **descs,
139141
uintptr_t n_obj_params) {
142+
rust_task *task = rust_scheduler::get_task();
140143
check_stack(task);
141144
LOG_UPCALL_ENTRY(task);
142145

@@ -151,15 +154,16 @@ upcall_get_type_desc(rust_task *task,
151154
}
152155

153156
extern "C" CDECL void
154-
upcall_vec_grow(rust_task* task, rust_vec** vp, size_t new_sz) {
157+
upcall_vec_grow(rust_vec** vp, size_t new_sz) {
158+
rust_task *task = rust_scheduler::get_task();
155159
LOG_UPCALL_ENTRY(task);
156160
reserve_vec(task, vp, new_sz);
157161
(*vp)->fill = new_sz;
158162
}
159163

160164
extern "C" CDECL void
161-
upcall_vec_push(rust_task* task, rust_vec** vp, type_desc* elt_ty,
162-
void* elt) {
165+
upcall_vec_push(rust_vec** vp, type_desc* elt_ty, void* elt) {
166+
rust_task *task = rust_scheduler::get_task();
163167
LOG_UPCALL_ENTRY(task);
164168
size_t new_sz = (*vp)->fill + elt_ty->size;
165169
reserve_vec(task, vp, new_sz);
@@ -173,8 +177,8 @@ upcall_vec_push(rust_task* task, rust_vec** vp, type_desc* elt_ty,
173177
* space in the dynamic stack.
174178
*/
175179
extern "C" CDECL void *
176-
upcall_dynastack_mark(rust_task *task) {
177-
return task->dynastack.mark();
180+
upcall_dynastack_mark() {
181+
return rust_scheduler::get_task()->dynastack.mark();
178182
}
179183

180184
/**
@@ -183,23 +187,23 @@ upcall_dynastack_mark(rust_task *task) {
183187
* FIXME: Deprecated since dynamic stacks need to be self-describing for GC.
184188
*/
185189
extern "C" CDECL void *
186-
upcall_dynastack_alloc(rust_task *task, size_t sz) {
187-
return sz ? task->dynastack.alloc(sz, NULL) : NULL;
190+
upcall_dynastack_alloc(size_t sz) {
191+
return sz ? rust_scheduler::get_task()->dynastack.alloc(sz, NULL) : NULL;
188192
}
189193

190194
/**
191195
* Allocates space associated with a type descriptor in the dynamic stack and
192196
* returns it.
193197
*/
194198
extern "C" CDECL void *
195-
upcall_dynastack_alloc_2(rust_task *task, size_t sz, type_desc *ty) {
196-
return sz ? task->dynastack.alloc(sz, ty) : NULL;
199+
upcall_dynastack_alloc_2(size_t sz, type_desc *ty) {
200+
return sz ? rust_scheduler::get_task()->dynastack.alloc(sz, ty) : NULL;
197201
}
198202

199203
/** Frees space in the dynamic stack. */
200204
extern "C" CDECL void
201-
upcall_dynastack_free(rust_task *task, void *ptr) {
202-
return task->dynastack.free(ptr);
205+
upcall_dynastack_free(void *ptr) {
206+
return rust_scheduler::get_task()->dynastack.free(ptr);
203207
}
204208

205209
/**

0 commit comments

Comments
 (0)