]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use 2*regSize for saved frame pointer check
authorAustin Clements <austin@google.com>
Tue, 3 Feb 2015 14:09:56 +0000 (09:09 -0500)
committerAustin Clements <austin@google.com>
Tue, 3 Feb 2015 14:37:16 +0000 (14:37 +0000)
Previously, we checked for a saved frame pointer by looking for a
2*ptrSize gap between the argument pointer and the locals pointer.
The intent of this check was to look for a two stack slot gap (caller
IP and saved frame pointer), but stack slots are regSize, not ptrSize.

Correct this by checking instead for a 2*regSize gap.

On most platforms, this made no difference because ptrSize==regSize.
However, on amd64p32 (nacl), the saved frame pointer check incorrectly
fired when there was no saved frame pointer because the one stack slot
for the caller IP left an 8 byte gap, which is 2*ptrSize (but not
2*regSize) on amd64p32.

Fixes #9760.

Change-Id: I6eedcf681fe5bf2bf924dde8a8f2d9860a4d758e
Reviewed-on: https://go-review.googlesource.com/3781
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/runtime/stack1.go
src/runtime/traceback.go

index 6a1f6aee92652b8039d4502c9544d701e761736d..3f89bb173901522788c8642c48eabbca085a9f30 100644 (file)
@@ -466,9 +466,10 @@ func adjustframe(frame *stkframe, arg unsafe.Pointer) bool {
        }
 
        // Adjust saved base pointer if there is one.
-       if thechar == '6' && frame.argp-frame.varp == 2*ptrSize {
+       if thechar == '6' && frame.argp-frame.varp == 2*regSize {
                if !framepointer_enabled {
                        print("runtime: found space for saved base pointer, but no framepointer experiment\n")
+                       print("argp=", hex(frame.argp), " varp=", hex(frame.varp), "\n")
                        throw("bad frame layout")
                }
                if stackDebug >= 3 {
index c8134533991394f5de117938f9c086abd640bf2b..4f63502e85cbb3894c026743fbcd2beb6deda912 100644 (file)
@@ -235,7 +235,7 @@ func gentraceback(pc0 uintptr, sp0 uintptr, lr0 uintptr, gp *g, skip int, pcbuf
                // If framepointer_enabled and there's a frame, then
                // there's a saved bp here.
                if GOARCH == "amd64" && frame.varp > frame.sp && framepointer_enabled {
-                       frame.varp -= ptrSize
+                       frame.varp -= regSize
                }
 
                // Derive size of arguments.