mirror of
https://github.com/golang/go
synced 2024-11-25 22:28:02 -07:00
Account for CALL instructions before looking up the function
at PC, to deal with functions that end with a CALL instruction. Special case known call-by-return functions. R=rsc APPROVED=rsc DELTA=12 (6 added, 6 deleted, 0 changed) OCL=33255 CL=33279
This commit is contained in:
parent
00274a13cb
commit
63810f840f
@ -34,10 +34,12 @@ traceback(byte *pc0, byte *sp, G *g)
|
||||
sp = stk->gobuf.sp;
|
||||
stk = (Stktop*)stk->stackbase;
|
||||
}
|
||||
p = (byte*)pc;
|
||||
if(n > 0 && pc != (uint64)goexit)
|
||||
pc--; // get to CALL instruction
|
||||
f = findfunc(pc);
|
||||
if(f == nil) {
|
||||
// dangerous, but poke around to see if it is a closure
|
||||
p = (byte*)pc;
|
||||
// ADDL $xxx, SP; RET
|
||||
if(p != 0 && p[0] == 0x81 && p[1] == 0xc4 && p[6] == 0xc3) {
|
||||
sp += *(uint32*)(p+2) + 8;
|
||||
@ -60,8 +62,6 @@ traceback(byte *pc0, byte *sp, G *g)
|
||||
printf("%S", f->name);
|
||||
if(pc > f->entry)
|
||||
printf("+%p", (uintptr)(pc - f->entry));
|
||||
if(n > 0)
|
||||
pc--; // get to CALL instruction
|
||||
printf(" %S:%d\n", f->src, funcline(f, pc));
|
||||
printf("\t%S(", f->name);
|
||||
for(i = 0; i < f->args; i++) {
|
||||
|
@ -31,10 +31,12 @@ traceback(byte *pc0, byte *sp, G *g)
|
||||
sp = stk->gobuf.sp;
|
||||
stk = (Stktop*)stk->stackbase;
|
||||
}
|
||||
p = (byte*)pc;
|
||||
if(n > 0 && pc != (uint64)goexit)
|
||||
pc--; // get to CALL instruction
|
||||
f = findfunc(pc);
|
||||
if(f == nil) {
|
||||
// dangerous, but poke around to see if it is a closure
|
||||
p = (byte*)pc;
|
||||
// ADDQ $xxx, SP; RET
|
||||
if(p[0] == 0x48 && p[1] == 0x81 && p[2] == 0xc4 && p[7] == 0xc3) {
|
||||
sp += *(uint32*)(p+3) + 8;
|
||||
@ -57,8 +59,6 @@ traceback(byte *pc0, byte *sp, G *g)
|
||||
printf("%S", f->name);
|
||||
if(pc > f->entry)
|
||||
printf("+%p", (uintptr)(pc - f->entry));
|
||||
if(n > 0)
|
||||
pc--; // get to CALL instruction
|
||||
printf(" %S:%d\n", f->src, funcline(f, pc));
|
||||
printf("\t%S(", f->name);
|
||||
for(i = 0; i < f->args; i++) {
|
||||
|
Loading…
Reference in New Issue
Block a user