diff options
Diffstat (limited to 'src/runtime/stack1.go')
| -rw-r--r-- | src/runtime/stack1.go | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/runtime/stack1.go b/src/runtime/stack1.go index 8ad331777c..1e9ccfebb5 100644 --- a/src/runtime/stack1.go +++ b/src/runtime/stack1.go @@ -46,6 +46,9 @@ var stackpoolmu mutex var stackfreequeue stack +// Cached value of haveexperiment("framepointer") +var framepointer_enabled bool + func stackinit() { if _StackCacheSize&_PageMask != 0 { throw("cache size must be a multiple of page size") @@ -308,6 +311,8 @@ var mapnames = []string{ // | args from caller | // +------------------+ <- frame->argp // | return address | +// +------------------+ +// | caller's BP (*) | (*) if framepointer_enabled && varp < sp // +------------------+ <- frame->varp // | locals | // +------------------+ @@ -460,6 +465,18 @@ func adjustframe(frame *stkframe, arg unsafe.Pointer) bool { adjustpointers(unsafe.Pointer(frame.varp-size), &bv, adjinfo, f) } + // Adjust saved base pointer if there is one. + if thechar == '6' && frame.argp-frame.varp == 2*ptrSize { + if !framepointer_enabled { + print("runtime: found space for saved base pointer, but no framepointer experiment") + throw("bad frame layout") + } + if stackDebug >= 3 { + print(" saved bp\n") + } + adjustpointer(adjinfo, unsafe.Pointer(frame.varp)) + } + // Adjust arguments. if frame.arglen > 0 { var bv bitvector |
