about summary refs log tree commit diff
path: root/src/rt/rust_gc.cpp
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-09-23 12:48:55 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-09-23 12:49:20 -0700
commitaabff480c92d7c72f8a8ff6652d328e6624585d5 (patch)
tree18fcb23d732ca89997de2901883efeddfc7137f7 /src/rt/rust_gc.cpp
parentd10d23f0ad4763642619d2d3e42f8150f7d91af3 (diff)
downloadrust-aabff480c92d7c72f8a8ff6652d328e6624585d5.tar.gz
rust-aabff480c92d7c72f8a8ff6652d328e6624585d5.zip
rt: Factor out stack walking into rust_abi.cpp
Diffstat (limited to 'src/rt/rust_gc.cpp')
-rw-r--r--src/rt/rust_gc.cpp32
1 files changed, 1 insertions, 31 deletions
diff --git a/src/rt/rust_gc.cpp b/src/rt/rust_gc.cpp
index 6e698de59db..ae3c5a01031 100644
--- a/src/rt/rust_gc.cpp
+++ b/src/rt/rust_gc.cpp
@@ -18,24 +18,12 @@
 #include <dlfcn.h>
 #endif
 
-#define END_OF_STACK_RA     (void (*)())0xdeadbeef
+using namespace stack_walk;
 
 namespace gc {
 
 weak_symbol<const uintptr_t> safe_point_data("rust_gc_safe_points");
 
-struct frame {
-    uint8_t *bp;    // The frame pointer.
-    void (*ra)();   // The return address.
-
-    frame(void *in_bp, void (*in_ra)()) : bp((uint8_t *)in_bp), ra(in_ra) {}
-
-    inline void next() {
-        ra = *(void (**)())(bp + sizeof(void *));
-        bp = *(uint8_t **)bp;
-    }
-};
-
 struct root_info {
     intptr_t frame_offset;
     uintptr_t dynamic;  // 0 = static, 1 = dynamic
@@ -98,9 +86,7 @@ private:
 
 public:
     gc(rust_task *in_task) : task(in_task) {}
-
     void run();
-    std::vector<frame> backtrace();
 };
 
 const safe_point *
@@ -135,22 +121,6 @@ gc::sweep() {
     // TODO
 }
 
-std::vector<frame>
-gc::backtrace() {
-    std::vector<frame> frames;
-
-    // Ideally we would use the current value of EIP here, but there's no
-    // portable way to get that and there are never any GC roots in our C++
-    // frames anyhow.
-    frame f(__builtin_frame_address(0), (void (*)())NULL);
-
-    while (f.ra != END_OF_STACK_RA) {
-        frames.push_back(f);
-        f.next();
-    }
-    return frames;
-}
-
 void
 gc::run() {
     safe_point_map map;