diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2011-09-23 12:48:55 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2011-09-23 12:49:20 -0700 |
| commit | aabff480c92d7c72f8a8ff6652d328e6624585d5 (patch) | |
| tree | 18fcb23d732ca89997de2901883efeddfc7137f7 /src/rt/rust_gc.cpp | |
| parent | d10d23f0ad4763642619d2d3e42f8150f7d91af3 (diff) | |
| download | rust-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.cpp | 32 |
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; |
