aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/stack.c
diff options
context:
space:
mode:
authorDmitriy Vyukov <dvyukov@google.com>2014-08-19 11:46:19 +0400
committerDmitriy Vyukov <dvyukov@google.com>2014-08-19 11:46:19 +0400
commitb3d5a695a6ad56fa33455eedf8d502a1a90a51ac (patch)
tree07ef963a4dca0b6585f6652d0a5475d9b91d3762 /src/pkg/runtime/stack.c
parent30ef2c7debeeb9f5bcab8cd2c60a8587f35bc0ae (diff)
downloadgo-b3d5a695a6ad56fa33455eedf8d502a1a90a51ac.tar.xz
runtime: improve diagnostics of non-copyable frames
LGTM=khr R=golang-codereviews, khr CC=golang-codereviews, rlh, rsc https://golang.org/cl/124560043
Diffstat (limited to 'src/pkg/runtime/stack.c')
-rw-r--r--src/pkg/runtime/stack.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/pkg/runtime/stack.c b/src/pkg/runtime/stack.c
index b4e992e658..3bd96ff314 100644
--- a/src/pkg/runtime/stack.c
+++ b/src/pkg/runtime/stack.c
@@ -476,6 +476,9 @@ copyabletopsegment(G *gp)
if(StackDebug >= 1 && cinfo.frames != -1)
runtime·printf("copystack: %d copyable frames\n", cinfo.frames);
+ if(cinfo.frames == -1)
+ return -1;
+
// Check to make sure all Defers are copyable
for(d = gp->defer; d != nil; d = d->link) {
if(cinfo.stk <= (byte*)d && (byte*)d < cinfo.base) {
@@ -490,8 +493,11 @@ copyabletopsegment(G *gp)
if(fn == nil) // See issue 8047
continue;
f = runtime·findfunc((uintptr)fn->fn);
- if(f == nil)
+ if(f == nil) {
+ if(StackDebug >= 1)
+ runtime·printf("copystack: no func for deferred pc %p\n", fn->fn);
return -1;
+ }
// Check to make sure we have an args pointer map for the defer's args.
// We only need the args map, but we check
@@ -499,11 +505,17 @@ copyabletopsegment(G *gp)
// isn't provided it means the ptr map came from C and
// C (particularly, cgo) lies to us. See issue 7695.
stackmap = runtime·funcdata(f, FUNCDATA_ArgsPointerMaps);
- if(stackmap == nil || stackmap->n <= 0)
+ if(stackmap == nil || stackmap->n <= 0) {
+ if(StackDebug >= 1)
+ runtime·printf("copystack: no arg info for deferred %s\n", runtime·funcname(f));
return -1;
+ }
stackmap = runtime·funcdata(f, FUNCDATA_LocalsPointerMaps);
- if(stackmap == nil || stackmap->n <= 0)
+ if(stackmap == nil || stackmap->n <= 0) {
+ if(StackDebug >= 1)
+ runtime·printf("copystack: no local info for deferred %s\n", runtime·funcname(f));
return -1;
+ }
if(cinfo.stk <= (byte*)fn && (byte*)fn < cinfo.base) {
// FuncVal is on the stack. Again, its copyableness