summaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorGordon Henriksen <gordonhenriksen@mac.com>2008-01-24 05:16:36 +0000
committerGordon Henriksen <gordonhenriksen@mac.com>2008-01-24 05:16:36 +0000
commitbcb265e2af6052895c400fe0d5729a23a82a5542 (patch)
tree5ad351da28d40cea303b2886e5e15cbe87f3239a /runtime
parent58ea52a6a5b46fad7f00729c9bf59e8588061be3 (diff)
downloadllvm-bcb265e2af6052895c400fe0d5729a23a82a5542.tar.gz
llvm-bcb265e2af6052895c400fe0d5729a23a82a5542.tar.bz2
llvm-bcb265e2af6052895c400fe0d5729a23a82a5542.tar.xz
Fixing the stack walker.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46302 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'runtime')
-rw-r--r--runtime/GC/SemiSpace/semispace.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/runtime/GC/SemiSpace/semispace.c b/runtime/GC/SemiSpace/semispace.c
index 40af1cb2e3..0ae6e11bd2 100644
--- a/runtime/GC/SemiSpace/semispace.c
+++ b/runtime/GC/SemiSpace/semispace.c
@@ -97,25 +97,28 @@ void llvm_gc_write(void *V, void *ObjPtr, void **FieldPtr) { *FieldPtr = V; }
* FIXME: This should be in a code-generator specific library, but for now this
* will work for all code generators.
*/
+typedef struct FrameMap FrameMap;
struct FrameMap {
int32_t NumRoots; // Number of roots in stack frame.
int32_t NumMeta; // Number of metadata descriptors. May be < NumRoots.
void *Meta[]; // May be absent for roots without metadata.
};
+typedef struct StackEntry StackEntry;
struct StackEntry {
- ShadowStackEntry *Next; // Caller's stack entry.
+ StackEntry *Next; // Caller's stack entry.
const FrameMap *Map; // Pointer to constant FrameMap.
void *Roots[]; // Stack roots (in-place array).
};
StackEntry *llvm_gc_root_chain;
void llvm_cg_walk_gcroots(void (*FP)(void **Root, void *Meta)) {
- for (StackEntry *R; R; R = R->Next) {
+ StackEntry *R;
+ for (R = llvm_gc_root_chain; R; R = R->Next) {
unsigned i, e;
- for (i = 0, e = R->NumMeta; i != e; ++i)
+ for (i = 0, e = R->Map->NumMeta; i != e; ++i)
FP(&R->Roots[i], R->Map->Meta[i]);
- for (e = R->NumRoots; i != e; ++i)
+ for (e = R->Map->NumRoots; i != e; ++i)
FP(&R->Roots[i], NULL);
}
}