Commit 6fb9d50d authored by Russ Cox's avatar Russ Cox

runtime: print more detail in adjustframe crash

The logic here is copied from mgc0.c's scanframe.
Mostly it is messages although the minsize code is new
(and I believe necessary).

I am hoping to get more information about the current
arm build failures (or, if it's the minsize thing, fix them).

TBR=khr
R=khr
CC=golang-codereviews
https://golang.org/cl/143180043
parent 735289ff
...@@ -463,7 +463,7 @@ adjustframe(Stkframe *frame, void *arg) ...@@ -463,7 +463,7 @@ adjustframe(Stkframe *frame, void *arg)
StackMap *stackmap; StackMap *stackmap;
int32 pcdata; int32 pcdata;
BitVector bv; BitVector bv;
uintptr targetpc; uintptr targetpc, size, minsize;
adjinfo = arg; adjinfo = arg;
targetpc = frame->continpc; targetpc = frame->continpc;
...@@ -486,27 +486,47 @@ adjustframe(Stkframe *frame, void *arg) ...@@ -486,27 +486,47 @@ adjustframe(Stkframe *frame, void *arg)
if(pcdata == -1) if(pcdata == -1)
pcdata = 0; // in prologue pcdata = 0; // in prologue
// adjust local pointers // Adjust local variables if stack frame has been allocated.
if((byte*)frame->varp != (byte*)frame->sp) { size = frame->varp - frame->sp;
if(thechar != '6' && thechar != '8')
minsize = sizeof(uintptr);
else
minsize = 0;
if(size > minsize) {
stackmap = runtime·funcdata(f, FUNCDATA_LocalsPointerMaps); stackmap = runtime·funcdata(f, FUNCDATA_LocalsPointerMaps);
if(stackmap == nil) if(stackmap == nil || stackmap->n <= 0) {
runtime·throw("no locals info"); runtime·printf("runtime: frame %s untyped locals %p+%p\n", runtime·funcname(f), (byte*)(frame->varp-size), size);
if(stackmap->n <= 0) runtime·throw("missing stackmap");
runtime·throw("locals size info only"); }
// Locals bitmap information, scan just the pointers in locals.
if(pcdata < 0 || pcdata >= stackmap->n) {
// don't know where we are
runtime·printf("runtime: pcdata is %d and %d locals stack map entries for %s (targetpc=%p)\n",
pcdata, stackmap->n, runtime·funcname(f), targetpc);
runtime·throw("bad symbol table");
}
bv = runtime·stackmapdata(stackmap, pcdata); bv = runtime·stackmapdata(stackmap, pcdata);
size = (bv.n * PtrSize) / BitsPerPointer;
if(StackDebug >= 3) if(StackDebug >= 3)
runtime·printf(" locals\n"); runtime·printf(" locals\n");
adjustpointers((byte**)frame->varp - bv.n / BitsPerPointer, &bv, adjinfo, f); adjustpointers((byte**)(frame->varp - size), &bv, adjinfo, f);
} }
// adjust inargs and outargs
if(frame->arglen != 0) { // Adjust arguments.
if(frame->arglen > 0) {
if(frame->argmap != nil) { if(frame->argmap != nil) {
bv = *frame->argmap; bv = *frame->argmap;
} else { } else {
stackmap = runtime·funcdata(f, FUNCDATA_ArgsPointerMaps); stackmap = runtime·funcdata(f, FUNCDATA_ArgsPointerMaps);
if(stackmap == nil) { if(stackmap == nil || stackmap->n <= 0) {
runtime·printf("size %d\n", (int32)frame->arglen); runtime·printf("runtime: frame %s untyped args %p+%p\n", runtime·funcname(f), frame->argp, (uintptr)frame->arglen);
runtime·throw("no arg info"); runtime·throw("missing stackmap");
}
if(pcdata < 0 || pcdata >= stackmap->n) {
// don't know where we are
runtime·printf("runtime: pcdata is %d and %d args stack map entries for %s (targetpc=%p)\n",
pcdata, stackmap->n, runtime·funcname(f), targetpc);
runtime·throw("bad symbol table");
} }
bv = runtime·stackmapdata(stackmap, pcdata); bv = runtime·stackmapdata(stackmap, pcdata);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment