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>
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
// allow stack checks here.
func haslinkregister() bool {
- return Thearch.Thechar == '5' || Thearch.Thechar == '9' || Thearch.Thechar == '7'
+ return Ctxt.FixedFrameSize() != 0
}
func callsize() int {
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.
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