diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-11-30 17:54:11 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-11-30 20:31:33 -0800 |
| commit | f2de42c39ac5e2ff3bc916b4bbff1db91181d9fa (patch) | |
| tree | 249765cf6b484ce6d3575fac9160b07d0632ba15 /src/rt/rust_task.cpp | |
| parent | dd48a1af58260eb68d87a08cc6dd1b0a589a0eae (diff) | |
| download | rust-f2de42c39ac5e2ff3bc916b4bbff1db91181d9fa.tar.gz rust-f2de42c39ac5e2ff3bc916b4bbff1db91181d9fa.zip | |
rt: Reorganize stack growth code
Diffstat (limited to 'src/rt/rust_task.cpp')
| -rw-r--r-- | src/rt/rust_task.cpp | 73 |
1 files changed, 25 insertions, 48 deletions
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index 7210fe3956c..d631a68f898 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -62,54 +62,6 @@ del_stk(rust_task *task, stk_seg *stk) task->free(stk); } -extern "C" CDECL void -record_sp(void *limit); - -// Entry points for `__morestack` (see arch/*/morestack.S). -extern "C" void * -rust_new_stack(size_t stk_sz, void *args_addr, size_t args_sz) { - rust_task *task = rust_scheduler::get_task(); - - stk_seg *stk_seg = new_stk(task->sched, task, stk_sz + args_sz); - - uint8_t *new_sp = (uint8_t*)stk_seg->limit; - size_t sizeof_retaddr = sizeof(void*); - // Make enough room on the new stack to hold the old stack pointer - // in addition to the function arguments - new_sp = align_down(new_sp - (args_sz + sizeof_retaddr)); - new_sp += sizeof_retaddr; - memcpy(new_sp, args_addr, args_sz); - record_sp(stk_seg->data + RED_ZONE_SIZE); - return new_sp; -} - -struct rust_new_stack2_args { - size_t stk_sz; - void *args_addr; - size_t args_sz; -}; - -// A new stack function suitable for calling through -// upcall_call_shim_on_c_stack -extern "C" void * -rust_new_stack2(struct rust_new_stack2_args *args) { - return rust_new_stack(args->stk_sz, args->args_addr, - args->args_sz); -} - -extern "C" void -rust_del_stack() { - rust_task *task = rust_scheduler::get_task(); - del_stk(task, task->stk); - record_sp(task->stk->data + RED_ZONE_SIZE); -} - -extern "C" rust_task * -rust_get_task() { - return rust_scheduler::get_task(); -} - - // Tasks rust_task::rust_task(rust_scheduler *sched, rust_task_list *state, rust_task *spawner, const char *name) : @@ -609,6 +561,31 @@ rust_task::notify(bool success) { } } +extern "C" CDECL void +record_sp(void *limit); + +void * +rust_task::new_stack(size_t stk_sz, void *args_addr, size_t args_sz) { + + stk_seg *stk_seg = new_stk(sched, this, stk_sz + args_sz); + + uint8_t *new_sp = (uint8_t*)stk_seg->limit; + size_t sizeof_retaddr = sizeof(void*); + // Make enough room on the new stack to hold the old stack pointer + // in addition to the function arguments + new_sp = align_down(new_sp - (args_sz + sizeof_retaddr)); + new_sp += sizeof_retaddr; + memcpy(new_sp, args_addr, args_sz); + record_sp(stk_seg->data + RED_ZONE_SIZE); + return new_sp; +} + +void +rust_task::del_stack() { + del_stk(this, stk); + record_sp(stk->data + RED_ZONE_SIZE); +} + // // Local Variables: // mode: C++ |
