about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-02-08 15:28:25 -0800
committerBrian Anderson <banderson@mozilla.com>2012-02-09 19:00:15 -0800
commite0d5b92b84424b5b1dbd2dec7d32e92e1550832b (patch)
tree82e9a9ba272b53b0c87871503ec8fb649cca12ee
parent2983e77383edd852bb30a022e4599e7c42670ac5 (diff)
downloadrust-e0d5b92b84424b5b1dbd2dec7d32e92e1550832b.tar.gz
rust-e0d5b92b84424b5b1dbd2dec7d32e92e1550832b.zip
rt: Begin moving stack-building functions to rust_stack.cpp
-rw-r--r--mk/rt.mk2
-rw-r--r--src/rt/rust_stack.cpp42
-rw-r--r--src/rt/rust_stack.h23
-rw-r--r--src/rt/rust_task.cpp41
-rw-r--r--src/rt/rust_task.h13
5 files changed, 68 insertions, 53 deletions
diff --git a/mk/rt.mk b/mk/rt.mk
index bdfda14a7fe..e07bec1487f 100644
--- a/mk/rt.mk
+++ b/mk/rt.mk
@@ -45,6 +45,7 @@ RUNTIME_CS_$(1) := \
               rt/rust_task_thread.cpp \
               rt/rust_scheduler.cpp \
               rt/rust_task.cpp \
+              rt/rust_stack.cpp \
               rt/rust_task_list.cpp \
               rt/rust_port.cpp \
               rt/rust_upcall.cpp \
@@ -84,6 +85,7 @@ RUNTIME_HDR_$(1) := rt/globals.h \
                rt/rust_scheduler.h \
                rt/rust_shape.h \
                rt/rust_task.h \
+               rt/rust_stack.h \
                rt/rust_task_list.h \
                rt/rust_log.h \
                rt/circular_buffer.h \
diff --git a/src/rt/rust_stack.cpp b/src/rt/rust_stack.cpp
new file mode 100644
index 00000000000..c3cde81925f
--- /dev/null
+++ b/src/rt/rust_stack.cpp
@@ -0,0 +1,42 @@
+#include "rust_internal.h"
+
+#include "vg/valgrind.h"
+#include "vg/memcheck.h"
+
+// A value that goes at the end of the stack and must not be touched
+const uint8_t stack_canary[] = {0xAB, 0xCD, 0xAB, 0xCD,
+                                0xAB, 0xCD, 0xAB, 0xCD,
+                                0xAB, 0xCD, 0xAB, 0xCD,
+                                0xAB, 0xCD, 0xAB, 0xCD};
+
+void
+config_valgrind_stack(stk_seg *stk) {
+    stk->valgrind_id =
+        VALGRIND_STACK_REGISTER(&stk->data[0],
+                                stk->end);
+#ifndef NVALGRIND
+    // Establish that the stack is accessible.  This must be done when reusing
+    // old stack segments, since the act of popping the stack previously
+    // caused valgrind to consider the whole thing inaccessible.
+    size_t sz = stk->end - (uintptr_t)&stk->data[0];
+    VALGRIND_MAKE_MEM_UNDEFINED(stk->data + sizeof(stack_canary),
+                                sz - sizeof(stack_canary));
+#endif
+}
+
+void
+unconfig_valgrind_stack(stk_seg *stk) {
+    VALGRIND_STACK_DEREGISTER(stk->valgrind_id);
+}
+
+void
+add_stack_canary(stk_seg *stk) {
+    memcpy(stk->data, stack_canary, sizeof(stack_canary));
+    assert(sizeof(stack_canary) == 16 && "Stack canary was not the expected size");
+}
+
+void
+check_stack_canary(stk_seg *stk) {
+    assert(!memcmp(stk->data, stack_canary, sizeof(stack_canary))
+      && "Somebody killed the canary");
+}
diff --git a/src/rt/rust_stack.h b/src/rt/rust_stack.h
new file mode 100644
index 00000000000..d665b4fa2c1
--- /dev/null
+++ b/src/rt/rust_stack.h
@@ -0,0 +1,23 @@
+struct stk_seg {
+    stk_seg *prev;
+    stk_seg *next;
+    uintptr_t end;
+    unsigned int valgrind_id;
+#ifndef _LP64
+    uint32_t pad;
+#endif
+
+    uint8_t data[];
+};
+
+void
+config_valgrind_stack(stk_seg *stk);
+
+void
+unconfig_valgrind_stack(stk_seg *stk);
+
+void
+add_stack_canary(stk_seg *stk);
+
+void
+check_stack_canary(stk_seg *stk);
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index 9443d4f3706..79b3d873e88 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -2,9 +2,6 @@
 #include "rust_internal.h"
 #include "rust_cc.h"
 
-#include "vg/valgrind.h"
-#include "vg/memcheck.h"
-
 #ifndef __WIN32__
 #include <execinfo.h>
 #endif
@@ -60,12 +57,6 @@
 #endif
 #endif
 
-// A value that goes at the end of the stack and must not be touched
-const uint8_t stack_canary[] = {0xAB, 0xCD, 0xAB, 0xCD,
-                                0xAB, 0xCD, 0xAB, 0xCD,
-                                0xAB, 0xCD, 0xAB, 0xCD,
-                                0xAB, 0xCD, 0xAB, 0xCD};
-
 static size_t
 get_next_stk_size(rust_task_thread *thread, rust_task *task,
                   size_t min, size_t current, size_t requested) {
@@ -90,38 +81,6 @@ get_next_stk_size(rust_task_thread *thread, rust_task *task,
 
 // Task stack segments. Heap allocated and chained together.
 
-static void
-config_valgrind_stack(stk_seg *stk) {
-    stk->valgrind_id =
-        VALGRIND_STACK_REGISTER(&stk->data[0],
-                                stk->end);
-#ifndef NVALGRIND
-    // Establish that the stack is accessible.  This must be done when reusing
-    // old stack segments, since the act of popping the stack previously
-    // caused valgrind to consider the whole thing inaccessible.
-    size_t sz = stk->end - (uintptr_t)&stk->data[0];
-    VALGRIND_MAKE_MEM_UNDEFINED(stk->data + sizeof(stack_canary),
-                                sz - sizeof(stack_canary));
-#endif
-}
-
-static void
-unconfig_valgrind_stack(stk_seg *stk) {
-VALGRIND_STACK_DEREGISTER(stk->valgrind_id);
-}
-
-static void
-add_stack_canary(stk_seg *stk) {
-    memcpy(stk->data, stack_canary, sizeof(stack_canary));
-    assert(sizeof(stack_canary) == 16 && "Stack canary was not the expected size");
-}
-
-static void
-check_stack_canary(stk_seg *stk) {
-    assert(!memcmp(stk->data, stack_canary, sizeof(stack_canary))
-      && "Somebody killed the canary");
-}
-
 // The amount of stack in a segment available to Rust code
 static size_t
 user_stack_size(stk_seg *stk) {
diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h
index 33e0da5af33..1289358bf9c 100644
--- a/src/rt/rust_task.h
+++ b/src/rt/rust_task.h
@@ -15,6 +15,7 @@
 #include "rust_kernel.h"
 #include "rust_obstack.h"
 #include "boxed_region.h"
+#include "rust_stack.h"
 
 // Corresponds to the rust chan (currently _chan) type.
 struct chan_handle {
@@ -24,18 +25,6 @@ struct chan_handle {
 
 struct rust_box;
 
-struct stk_seg {
-    stk_seg *prev;
-    stk_seg *next;
-    uintptr_t end;
-    unsigned int valgrind_id;
-#ifndef _LP64
-    uint32_t pad;
-#endif
-
-    uint8_t data[];
-};
-
 struct frame_glue_fns {
     uintptr_t mark_glue_off;
     uintptr_t drop_glue_off;