]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: centralize knowledge of size of fixed part of stack
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Sun, 11 Oct 2015 23:19:20 +0000 (12:19 +1300)
committerMichael Hudson-Doyle <michael.hudson@canonical.com>
Mon, 19 Oct 2015 20:28:16 +0000 (20:28 +0000)
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>
src/cmd/link/internal/ld/dwarf.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/link.go

index 41d820dc153fcd90365ce73355dc1e202b3ec7d6..dcfd6a8e347f4555ac57f14b89659dbaff38e554 100644 (file)
@@ -1717,10 +1717,7 @@ func writelines() {
 
                        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
index 764f610bcd33263f511538403c8749cb6ba3605c..5977bee7f108a687e43f6e374c8b3a2bc07b972b 100644 (file)
@@ -1518,7 +1518,7 @@ var morestack *LSym
 // 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 @@ func stkcheck(up *Chain, depth int) 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.
index 7a2c1fa296a28571cdaa4fa33f81932302d218b2..a384b9508da031451196324a53339fb339ffa60e 100644 (file)
@@ -149,6 +149,19 @@ type Link struct {
        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