From 67a03fd6a2c6d13154d7f27c464023422b83c05d Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Tue, 3 Feb 2015 09:09:56 -0500 Subject: [PATCH] runtime: use 2*regSize for saved frame pointer check 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 --- src/runtime/stack1.go | 3 ++- src/runtime/traceback.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/runtime/stack1.go b/src/runtime/stack1.go index 6a1f6aee92..3f89bb1739 100644 --- a/src/runtime/stack1.go +++ b/src/runtime/stack1.go @@ -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 { diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index c813453399..4f63502e85 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -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. -- 2.50.0