diff options
| author | Michael Hudson-Doyle <michael.hudson@canonical.com> | 2015-10-08 21:52:03 +1300 |
|---|---|---|
| committer | Michael Hudson-Doyle <michael.hudson@canonical.com> | 2015-10-18 22:14:00 +0000 |
| commit | a4855812e259f91914328659a37dc3a2582da7ba (patch) | |
| tree | 69e99faa7dca898b98258f8307e09e202cdb85d3 /src/runtime/traceback.go | |
| parent | 45c06b27a44a65c219a7445278b129c868332a6c (diff) | |
| download | go-a4855812e259f91914328659a37dc3a2582da7ba.tar.xz | |
runtime: add a constant for the smallest possible stack frame
Shared libraries on ppc64le will require a larger minimum stack frame (because
the ABI mandates that the TOC pointer is available at 24(R1)). So to prepare
for this, make a constant for the fixed part of a stack and use that where
necessary.
Change-Id: I447949f4d725003bb82e7d2cf7991c1bca5aa887
Reviewed-on: https://go-review.googlesource.com/15523
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/traceback.go')
| -rw-r--r-- | src/runtime/traceback.go | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index 544ce273ee..2d223ced62 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -26,9 +26,10 @@ import "unsafe" // stores an 8-byte return PC onto the stack. To accommodate this, we use regSize // as the size of the architecture-pushed return PC. // -// usesLR is defined below. ptrSize and regSize are defined in stubs.go. +// usesLR is defined below in terms of minFrameSize, which is defined in +// arch_$GOARCH.go. ptrSize and regSize are defined in stubs.go. -const usesLR = GOARCH != "amd64" && GOARCH != "amd64p32" && GOARCH != "386" +const usesLR = minFrameSize > 0 var ( // initialized in tracebackinit @@ -295,10 +296,7 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in // in package runtime and reflect, and for those we use call-specific // metadata recorded by f's caller. if callback != nil || printing { - frame.argp = frame.fp - if usesLR { - frame.argp += ptrSize - } + frame.argp = frame.fp + minFrameSize setArgInfo(&frame, f, callback != nil) } @@ -396,7 +394,7 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in // before faking a call to sigpanic. if usesLR && waspanic { x := *(*uintptr)(unsafe.Pointer(frame.sp)) - frame.sp += ptrSize + frame.sp += minFrameSize if GOARCH == "arm64" { // arm64 needs 16-byte aligned SP, always frame.sp += ptrSize @@ -496,10 +494,7 @@ func setArgInfo(frame *stkframe, f *_func, needArgMap bool) { // Extract argument bitmaps for reflect stubs from the calls they made to reflect. switch funcname(f) { case "reflect.makeFuncStub", "reflect.methodValueCall": - arg0 := frame.sp - if usesLR { - arg0 += ptrSize - } + arg0 := frame.sp + minFrameSize fn := *(**[2]uintptr)(unsafe.Pointer(arg0)) if fn[0] != f.entry { print("runtime: confused by ", funcname(f), "\n") |
