| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build amd64 || arm64 |
| |
| package main |
| |
| import "unsafe" |
| |
| func init() { |
| register("FramePointerAdjust", FramePointerAdjust) |
| } |
| |
| func FramePointerAdjust() { framePointerAdjust1(0) } |
| |
| //go:noinline |
| func framePointerAdjust1(x int) { |
| argp := uintptr(unsafe.Pointer(&x)) |
| fp := *getFP() |
| if !(argp-0x100 <= fp && fp <= argp+0x100) { |
| print("saved FP=", fp, " &x=", argp, "\n") |
| panic("FAIL") |
| } |
| |
| // grow the stack |
| grow(10000) |
| |
| // check again |
| argp = uintptr(unsafe.Pointer(&x)) |
| fp = *getFP() |
| if !(argp-0x100 <= fp && fp <= argp+0x100) { |
| print("saved FP=", fp, " &x=", argp, "\n") |
| panic("FAIL") |
| } |
| } |
| |
| func grow(n int) { |
| if n > 0 { |
| grow(n - 1) |
| } |
| } |
| |
| func getFP() *uintptr |