diff options
| author | Russ Cox <rsc@golang.org> | 2009-06-17 15:12:16 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2009-06-17 15:12:16 -0700 |
| commit | 7343e03c433ebb0c302ed97bf832ad3bd3170de6 (patch) | |
| tree | 26899cbde2c38fd1275b590dcdd6bf92ab0f80c9 /src/pkg/runtime/amd64/traceback.c | |
| parent | 3b576a770413e799d487e861e3a75027f59ee81c (diff) | |
| download | go-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.c | 32 |
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. |
