cmd/link: centralize knowledge of size of fixed part of stack
Shared libraries on ppc64le will require a larger minimum stack frame (because
the ABI mandates that the TOC pointer is available at 24(R1)). Part 2b of
preparing for that is to have all the code in the linker that needs to know
this size of this call a function to find out.
Change-Id: I246363840096db22e44beabbe38b61d60c1f31ad
Reviewed-on: https://go-review.googlesource.com/15675
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go
index 41d820d..dcfd6a8 100644
--- a/src/cmd/link/internal/ld/dwarf.go
+++ b/src/cmd/link/internal/ld/dwarf.go
@@ -1717,10 +1717,7 @@
case obj.A_PARAM:
dt = DW_ABRV_PARAM
- offs = int64(a.Aoffset)
- if haslinkregister() {
- offs += int64(Thearch.Ptrsize)
- }
+ offs = int64(a.Aoffset) + Ctxt.FixedFrameSize()
default:
continue
diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go
index 764f610..5977bee 100644
--- a/src/cmd/link/internal/ld/lib.go
+++ b/src/cmd/link/internal/ld/lib.go
@@ -1518,7 +1518,7 @@
// allow stack checks here.
func haslinkregister() bool {
- return Thearch.Thechar == '5' || Thearch.Thechar == '9' || Thearch.Thechar == '7'
+ return Ctxt.FixedFrameSize() != 0
}
func callsize() int {
@@ -1626,10 +1626,7 @@
return 0
}
// Raise limit to allow frame.
- limit = int(obj.StackLimit + s.Locals)
- if haslinkregister() {
- limit += Thearch.Regsize
- }
+ limit = int(obj.StackLimit+s.Locals) + int(Ctxt.FixedFrameSize())
}
// Walk through sp adjustments in function, consuming relocs.
diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go
index 7a2c1fa..a384b95 100644
--- a/src/cmd/link/internal/ld/link.go
+++ b/src/cmd/link/internal/ld/link.go
@@ -149,6 +149,19 @@
Moduledata *LSym
}
+// The smallest possible offset from the hardware stack pointer to a local
+// variable on the stack. Architectures that use a link register save its value
+// on the stack in the function prologue and so always have a pointer between
+// the hardware stack pointer and the local variable area.
+func (ctxt *Link) FixedFrameSize() int64 {
+ switch ctxt.Arch.Thechar {
+ case '6', '8':
+ return 0
+ default:
+ return int64(ctxt.Arch.Ptrsize)
+ }
+}
+
type LinkArch struct {
ByteOrder binary.ByteOrder
Name string