aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/traceback_x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/traceback_x86.c')
-rw-r--r--src/pkg/runtime/traceback_x86.c22
1 files changed, 2 insertions, 20 deletions
diff --git a/src/pkg/runtime/traceback_x86.c b/src/pkg/runtime/traceback_x86.c
index 3153103d34..b88797210e 100644
--- a/src/pkg/runtime/traceback_x86.c
+++ b/src/pkg/runtime/traceback_x86.c
@@ -111,6 +111,8 @@ runtime·gentraceback(uintptr pc0, uintptr sp0, uintptr lr0, G *gp, int32 skip,
runtime·throw("unknown caller pc");
}
}
+
+ frame.varp = (byte*)frame.fp - sizeof(uintptr);
// Derive size of arguments.
// Most functions have a fixed-size argument block,
@@ -137,26 +139,6 @@ runtime·gentraceback(uintptr pc0, uintptr sp0, uintptr lr0, G *gp, int32 skip,
}
}
- // Derive location and size of local variables.
- if(frame.fp == frame.sp + sizeof(uintptr)) {
- // Function has not created a frame for itself yet.
- frame.varp = nil;
- frame.varlen = 0;
- } else if(f->locals == 0) {
- // Assume no information, so use whole frame.
- // TODO: Distinguish local==0 from local==unknown.
- frame.varp = (byte*)frame.sp;
- frame.varlen = frame.fp - sizeof(uintptr) - frame.sp;
- } else {
- if(f->locals > frame.fp - sizeof(uintptr) - frame.sp) {
- runtime·printf("runtime: inconsistent locals=%p frame=%p fp=%p sp=%p for %s\n", (uintptr)f->locals, (uintptr)f->frame, frame.fp, frame.sp, runtime·funcname(f));
- if(callback != nil)
- runtime·throw("invalid stack");
- }
- frame.varp = (byte*)frame.fp - sizeof(uintptr) - f->locals;
- frame.varlen = f->locals;
- }
-
if(skip > 0) {
skip--;
goto skipped;