aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/amd64/traceback.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-06-17 15:12:16 -0700
committerRuss Cox <rsc@golang.org>2009-06-17 15:12:16 -0700
commit7343e03c433ebb0c302ed97bf832ad3bd3170de6 (patch)
tree26899cbde2c38fd1275b590dcdd6bf92ab0f80c9 /src/pkg/runtime/amd64/traceback.c
parent3b576a770413e799d487e861e3a75027f59ee81c (diff)
downloadgo-7343e03c433ebb0c302ed97bf832ad3bd3170de6.tar.xz
runtime: stack growth adjustments, cleanup
* keep coherent SP/PC in gobuf (i.e., SP that would be in use at that PC) * gogocall replaces setspgoto, should work better in presence of link registers * delete unused system calls only amd64; 386 is now broken R=r DELTA=548 (183 added, 183 deleted, 182 changed) OCL=30381 CL=30442
Diffstat (limited to 'src/pkg/runtime/amd64/traceback.c')
-rw-r--r--src/pkg/runtime/amd64/traceback.c32
1 files changed, 15 insertions, 17 deletions
diff --git a/src/pkg/runtime/amd64/traceback.c b/src/pkg/runtime/amd64/traceback.c
index 16d7bed72e..80e79b0e8b 100644
--- a/src/pkg/runtime/amd64/traceback.c
+++ b/src/pkg/runtime/amd64/traceback.c
@@ -24,12 +24,11 @@ traceback(byte *pc0, byte *sp, G *g)
stk = (Stktop*)g->stackbase;
for(n=0; n<100; n++) {
- while(pc == (uint64)retfromnewstack) {
+ if(pc == (uint64)sys·lessstack) {
// pop to earlier stack block
- sp = stk->oldsp;
- stk = (Stktop*)stk->oldbase;
- pc = *(uint64*)(sp+8);
- sp += 16; // two irrelevant calls on stack: morestack plus its call
+ pc = (uintptr)stk->gobuf.pc;
+ sp = stk->gobuf.sp;
+ stk = (Stktop*)stk->stackbase;
}
f = findfunc(pc);
if(f == nil) {
@@ -46,8 +45,8 @@ traceback(byte *pc0, byte *sp, G *g)
printf("%p unknown pc\n", pc);
return;
}
- if(f->frame < 8) // assembly funcs say 0 but lie
- sp += 8;
+ if(f->frame < sizeof(uintptr)) // assembly funcs say 0 but lie
+ sp += sizeof(uintptr);
else
sp += f->frame;
@@ -56,7 +55,7 @@ traceback(byte *pc0, byte *sp, G *g)
// main(0x1, 0x2, 0x3)
printf("%S", f->name);
if(pc > f->entry)
- printf("+%X", pc - f->entry);
+ printf("+%p", (uintptr)(pc - f->entry));
printf(" %S:%d\n", f->src, funcline(f, pc-1)); // -1 to get to CALL instr.
printf("\t%S(", f->name);
for(i = 0; i < f->args; i++) {
@@ -70,7 +69,7 @@ traceback(byte *pc0, byte *sp, G *g)
}
prints(")\n");
- pc = *(uint64*)(sp-8);
+ pc = *(uintptr*)(sp-sizeof(uintptr));
if(pc <= 0x1000)
return;
}
@@ -106,20 +105,19 @@ runtime·Caller(int32 n, uint64 retpc, String retfile, int32 retline, bool retbo
// now unwind n levels
stk = (Stktop*)g->stackbase;
while(n-- > 0) {
- while(pc == (uint64)retfromnewstack) {
- sp = stk->oldsp;
- stk = (Stktop*)stk->oldbase;
- pc = *(uint64*)(sp+8);
- sp += 16;
+ while(pc == (uintptr)sys·lessstack) {
+ pc = (uintptr)stk->gobuf.pc;
+ sp = stk->gobuf.sp;
+ stk = (Stktop*)stk->stackbase;
}
- if(f->frame < 8) // assembly functions lie
- sp += 8;
+ if(f->frame < sizeof(uintptr)) // assembly functions lie
+ sp += sizeof(uintptr);
else
sp += f->frame;
loop:
- pc = *(uint64*)(sp-8);
+ pc = *((uintptr*)sp - 1);
if(pc <= 0x1000 || (f = findfunc(pc)) == nil) {
// dangerous, but let's try this.
// see if it is a closure.