]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.3] runtime: turn off 'unexpected return pc' print on arm traceback
authorAndrew Gerrand <adg@golang.org>
Mon, 11 Aug 2014 23:46:42 +0000 (09:46 +1000)
committerAndrew Gerrand <adg@golang.org>
Mon, 11 Aug 2014 23:46:42 +0000 (09:46 +1000)
««« CL 118670043 / 671fa8a9eb80
runtime: turn off 'unexpected return pc' print on arm traceback

It can happen legitimately if a profiling signal arrives at just the wrong moment.
It's harmless.

Fixes #8153.

LGTM=minux
R=golang-codereviews, minux
CC=golang-codereviews, iant, r
https://golang.org/cl/118670043
»»»

TBR=rsc
CC=golang-codereviews
https://golang.org/cl/127950044

src/pkg/runtime/traceback_arm.c

index d15244c2a96d7c8638d969e5710dd5dcc126297e..30f43d54c2c1ab2062c08e4ab4ccfb3524be7c3d 100644 (file)
@@ -128,9 +128,14 @@ runtime·gentraceback(uintptr pc0, uintptr sp0, uintptr lr0, G *gp, int32 skip,
                                frame.lr = *(uintptr*)frame.sp;
                        flr = runtime·findfunc(frame.lr);
                        if(flr == nil) {
-                               runtime·printf("runtime: unexpected return pc for %s called from %p\n", runtime·funcname(f), frame.lr);
-                               if(callback != nil)
+                               // This happens if you get a profiling interrupt at just the wrong time.
+                               // In that context it is okay to stop early.
+                               // But if callback is set, we're doing a garbage collection and must
+                               // get everything, so crash loudly.
+                               if(callback != nil) {
+                                       runtime·printf("runtime: unexpected return pc for %s called from %p\n", runtime·funcname(f), frame.lr);
                                        runtime·throw("unknown caller pc");
+                               }
                        }
                }