about summary refs log tree commit diff
path: root/src/rt
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-11-30 17:54:11 -0800
committerBrian Anderson <banderson@mozilla.com>2011-11-30 20:31:33 -0800
commitf2de42c39ac5e2ff3bc916b4bbff1db91181d9fa (patch)
tree249765cf6b484ce6d3575fac9160b07d0632ba15 /src/rt
parentdd48a1af58260eb68d87a08cc6dd1b0a589a0eae (diff)
downloadrust-f2de42c39ac5e2ff3bc916b4bbff1db91181d9fa.tar.gz
rust-f2de42c39ac5e2ff3bc916b4bbff1db91181d9fa.zip
rt: Reorganize stack growth code
Diffstat (limited to 'src/rt')
-rw-r--r--src/rt/arch/i386/morestack.S18
-rw-r--r--src/rt/arch/x86_64/morestack.S24
-rw-r--r--src/rt/rust_builtin.cpp5
-rw-r--r--src/rt/rust_task.cpp73
-rw-r--r--src/rt/rust_task.h3
-rw-r--r--src/rt/rust_upcall.cpp20
-rw-r--r--src/rt/rustrt.def.in4
7 files changed, 75 insertions, 72 deletions
diff --git a/src/rt/arch/i386/morestack.S b/src/rt/arch/i386/morestack.S
index 2805fc2b10e..7162f859a72 100644
--- a/src/rt/arch/i386/morestack.S
+++ b/src/rt/arch/i386/morestack.S
@@ -6,14 +6,14 @@
 // prolog when we run out.
 
 #if defined(__APPLE__) || defined(_WIN32)
-#define RUST_NEW_STACK2         _rust_new_stack2
-#define RUST_DEL_STACK          _rust_del_stack
+#define UPCALL_NEW_STACK        _upcall_new_stack
+#define UPCALL_DEL_STACK        _upcall_del_stack
 #define RUST_GET_TASK           _rust_get_task
 #define UPCALL_CALL_C           _upcall_call_shim_on_c_stack
 #define MORESTACK               ___morestack
 #else
-#define RUST_NEW_STACK2         rust_new_stack2
-#define RUST_DEL_STACK          rust_del_stack
+#define UPCALL_NEW_STACK        upcall_new_stack
+#define UPCALL_DEL_STACK        upcall_del_stack
 #define RUST_GET_TASK           rust_get_task
 #define UPCALL_CALL_C           upcall_call_shim_on_c_stack
 #define MORESTACK               __morestack
@@ -22,11 +22,9 @@
 #define ALIGNMENT 8
 #define RETURN_OFFSET   7
 
-.globl RUST_NEW_STACK
-.globl RUST_DEL_STACK
-.globl RUST_GET_PREV_STACK
+.globl UPCALL_NEW_STACK
+.globl UPCALL_DEL_STACK
 .globl RUST_GET_TASK
-.globl UPCALL_ALLOC_C_STACK
 .globl UPCALL_CALL_C_STACK
 .globl MORESTACK
 
@@ -64,7 +62,7 @@ MORESTACK:
 	movl 32(%esp),%eax // The amount of stack needed
 	movl %eax,8(%esp)
 
-	movl $RUST_NEW_STACK2,4(%esp)
+	movl $UPCALL_NEW_STACK,4(%esp)
 	leal 8(%esp), %eax
 	movl %eax,(%esp)
 	call UPCALL_CALL_C
@@ -81,7 +79,7 @@ MORESTACK:
 	// Switch back to the rust stack
 	movl %ebp, %esp
 
-	pushl $RUST_DEL_STACK
+	pushl $UPCALL_DEL_STACK
 	pushl $0
 	call UPCALL_CALL_C
 
diff --git a/src/rt/arch/x86_64/morestack.S b/src/rt/arch/x86_64/morestack.S
index ea35992a3f5..556a12b4ecb 100644
--- a/src/rt/arch/x86_64/morestack.S
+++ b/src/rt/arch/x86_64/morestack.S
@@ -6,15 +6,15 @@
 // prolog when we run out.
 
 #if defined(__APPLE__) || defined(_WIN32)
-#define RUST_NEW_STACK2     _rust_new_stack2
-#define RUST_DEL_STACK      _rust_del_stack
-#define UPCALL_CALL_C       _upcall_call_shim_on_c_stack
-#define MORESTACK           ___morestack
+#define UPCALL_NEW_STACK        _upcall_new_stack
+#define UPCALL_DEL_STACK        _upcall_del_stack
+#define UPCALL_CALL_C           _upcall_call_shim_on_c_stack
+#define MORESTACK               ___morestack
 #else
-#define RUST_NEW_STACK2     rust_new_stack2
-#define RUST_DEL_STACK      rust_del_stack
-#define UPCALL_CALL_C       upcall_call_shim_on_c_stack
-#define MORESTACK           __morestack
+#define UPCALL_NEW_STACK        upcall_new_stack
+#define UPCALL_DEL_STACK        upcall_del_stack
+#define UPCALL_CALL_C           upcall_call_shim_on_c_stack
+#define MORESTACK               __morestack
 #endif
 
         // Naturally, nobody can agree as to
@@ -30,8 +30,8 @@
 #  define ARG2 %rdx
 #endif
 
-.globl RUST_NEW_STACK2
-.globl RUST_DEL_STACK
+.globl UPCALL_NEW_STACK
+.globl UPCALL_DEL_STACK
 .globl UPCALL_CALL_C
 .globl MORESTACK
 
@@ -79,7 +79,7 @@ MORESTACK:
 	pushq %rcx // Address of stack arguments
 	pushq %r10 // The amount of stack needed
 
-	leaq RUST_NEW_STACK2@PLT(%rip), %rsi
+	leaq UPCALL_NEW_STACK@PLT(%rip), %rsi
 	movq %rsp, %rdi
 	call UPCALL_CALL_C@PLT
 
@@ -106,7 +106,7 @@ MORESTACK:
 	// Align the stack again
 	pushq $0
 	
-	leaq RUST_DEL_STACK@PLT(%rip), %rsi
+	leaq UPCALL_DEL_STACK@PLT(%rip), %rsi
 	movq $0, %rdi
 	call UPCALL_CALL_C@PLT
 
diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp
index 922b4024bc0..41c8bc68d2b 100644
--- a/src/rt/rust_builtin.cpp
+++ b/src/rt/rust_builtin.cpp
@@ -399,6 +399,11 @@ get_task_pointer(rust_task_id id) {
     return task->kernel->get_task_by_id(id);
 }
 
+extern "C" rust_task *
+rust_get_task() {
+    return rust_scheduler::get_task();
+}
+
 struct fn_env_pair {
     intptr_t f;
     intptr_t env;
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++
diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h
index a6d68331fda..aa5cc7d75f8 100644
--- a/src/rt/rust_task.h
+++ b/src/rt/rust_task.h
@@ -196,6 +196,9 @@ rust_task : public kernel_owned<rust_task>, rust_cond
     void claim_alloc(void *alloc, const type_desc *tydesc);
 
     void notify(bool success);
+
+    void *new_stack(size_t stk_sz, void *args_addr, size_t args_sz);
+    void del_stack();
 };
 
 //
diff --git a/src/rt/rust_upcall.cpp b/src/rt/rust_upcall.cpp
index 839a9231f45..a8f39cf91da 100644
--- a/src/rt/rust_upcall.cpp
+++ b/src/rt/rust_upcall.cpp
@@ -219,6 +219,26 @@ upcall_call_shim_on_c_stack(void *args, void *fn_ptr) {
     sched->c_context.call_shim_on_c_stack(args, fn_ptr);
 }
 
+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" CDECL void *
+upcall_new_stack(struct rust_new_stack2_args *args) {
+    rust_task *task = rust_scheduler::get_task();
+    return task->new_stack(args->stk_sz, args->args_addr, args->args_sz);
+}
+
+extern "C" CDECL void
+upcall_del_stack() {
+    rust_task *task = rust_scheduler::get_task();
+    task->del_stack();
+}
+
 extern "C" _Unwind_Reason_Code
 __gxx_personality_v0(int version,
                      _Unwind_Action actions,
diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in
index 68d791f162d..07b23611c99 100644
--- a/src/rt/rustrt.def.in
+++ b/src/rt/rustrt.def.in
@@ -27,7 +27,6 @@ rand_free
 rand_new
 rand_next
 refcount
-rust_del_stack
 rust_file_is_dir
 rust_getcwd
 rust_get_stdin
@@ -37,7 +36,6 @@ rust_str_push
 rust_list_files
 rust_port_detach
 rust_port_size
-rust_new_stack
 rust_process_wait
 rust_ptr_eq
 rust_run_program
@@ -68,4 +66,6 @@ upcall_shared_free
 upcall_vec_grow
 upcall_vec_push
 upcall_call_shim_on_c_stack
+upcall_new_stack
+upcall_del_stack
 asm_call_on_stack
\ No newline at end of file