]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/dist, cmd/link, runtime: fix stack size when cross-compiling aix/ppc64
authorClément Chigot <clement.chigot@atos.net>
Wed, 9 Jan 2019 13:05:17 +0000 (14:05 +0100)
committerIan Lance Taylor <iant@golang.org>
Wed, 9 Jan 2019 22:06:51 +0000 (22:06 +0000)
This commit allows to cross-compiling aix/ppc64. The nosplit limit must
twice as large as on others platforms because of AIX syscalls.
The stack limit, especially stackGuardMultiplier, was set by cmd/dist
during the bootstrap and doesn't depend on GOOS/GOARCH target.

Fixes #29572

Change-Id: Id51e38885e1978d981aa9e14972eaec17294322e
Reviewed-on: https://go-review.googlesource.com/c/157117
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/dist/buildruntime.go
src/cmd/internal/obj/arm/obj5.go
src/cmd/internal/obj/arm64/obj7.go
src/cmd/internal/obj/mips/obj0.go
src/cmd/internal/obj/ppc64/obj9.go
src/cmd/internal/obj/s390x/objz.go
src/cmd/internal/obj/x86/obj6.go
src/cmd/internal/objabi/stack.go
src/cmd/link/internal/ld/lib.go
src/runtime/internal/sys/stubs.go

index 10d1552c944d27bdf53473e2925c6f9574b74b95..5aadc8da674ff93c70467518e486c05332ea1132 100644 (file)
@@ -31,7 +31,7 @@ func mkzversion(dir, file string) {
        fmt.Fprintln(&buf)
        fmt.Fprintf(&buf, "const TheVersion = `%s`\n", findgoversion())
        fmt.Fprintf(&buf, "const Goexperiment = `%s`\n", os.Getenv("GOEXPERIMENT"))
-       fmt.Fprintf(&buf, "const StackGuardMultiplier = %d\n", stackGuardMultiplier())
+       fmt.Fprintf(&buf, "const StackGuardMultiplierDefault = %d\n", stackGuardMultiplierDefault())
 
        writefile(buf.String(), file, writeSkipSame)
 }
@@ -49,7 +49,7 @@ func mkzversion(dir, file string) {
 //     const defaultGOARCH = runtime.GOARCH
 //     const defaultGO_EXTLINK_ENABLED = <goextlinkenabled>
 //     const version = <version>
-//     const stackGuardMultiplier = <multiplier value>
+//     const stackGuardMultiplierDefault = <multiplier value>
 //     const goexperiment = <goexperiment>
 //
 // The use of runtime.GOOS and runtime.GOARCH makes sure that
@@ -77,20 +77,16 @@ func mkzbootstrap(file string) {
        fmt.Fprintf(&buf, "const defaultGOARCH = runtime.GOARCH\n")
        fmt.Fprintf(&buf, "const defaultGO_EXTLINK_ENABLED = `%s`\n", goextlinkenabled)
        fmt.Fprintf(&buf, "const version = `%s`\n", findgoversion())
-       fmt.Fprintf(&buf, "const stackGuardMultiplier = %d\n", stackGuardMultiplier())
+       fmt.Fprintf(&buf, "const stackGuardMultiplierDefault = %d\n", stackGuardMultiplierDefault())
        fmt.Fprintf(&buf, "const goexperiment = `%s`\n", os.Getenv("GOEXPERIMENT"))
 
        writefile(buf.String(), file, writeSkipSame)
 }
 
-// stackGuardMultiplier returns a multiplier to apply to the default
+// stackGuardMultiplierDefault returns a multiplier to apply to the default
 // stack guard size. Larger multipliers are used for non-optimized
 // builds that have larger stack frames.
-func stackGuardMultiplier() int {
-       // On AIX, a larger stack is needed for syscalls
-       if goos == "aix" {
-               return 2
-       }
+func stackGuardMultiplierDefault() int {
        for _, s := range strings.Split(os.Getenv("GO_GCFLAGS"), " ") {
                if s == "-N" {
                        return 2
index c17bf2a8ac1db9dce38da4a9732a2fc344d3dce8..34bd5d6baf1a4306c9bba581e17a266aa4d8a751 100644 (file)
@@ -723,7 +723,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
                p.As = AMOVW
                p.From.Type = obj.TYPE_ADDR
                p.From.Reg = REGSP
-               p.From.Offset = objabi.StackGuard
+               p.From.Offset = int64(objabi.StackGuard)
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REG_R2
                p.Scond = C_SCOND_NE
@@ -739,7 +739,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
                p = obj.Appendp(p, c.newprog)
                p.As = AMOVW
                p.From.Type = obj.TYPE_ADDR
-               p.From.Offset = int64(framesize) + (objabi.StackGuard - objabi.StackSmall)
+               p.From.Offset = int64(framesize) + (int64(objabi.StackGuard) - objabi.StackSmall)
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REG_R3
                p.Scond = C_SCOND_NE
index d0e354eabd19ed4e28797a6678130a512006243d..e47857ab5fede2c08c22c92fb7f176cc5f95e173 100644 (file)
@@ -125,7 +125,7 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
                p = obj.Appendp(p, c.newprog)
                p.As = AADD
                p.From.Type = obj.TYPE_CONST
-               p.From.Offset = objabi.StackGuard
+               p.From.Offset = int64(objabi.StackGuard)
                p.Reg = REGSP
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REG_R2
@@ -140,7 +140,7 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
                p = obj.Appendp(p, c.newprog)
                p.As = AMOVD
                p.From.Type = obj.TYPE_CONST
-               p.From.Offset = int64(framesize) + (objabi.StackGuard - objabi.StackSmall)
+               p.From.Offset = int64(framesize) + (int64(objabi.StackGuard) - objabi.StackSmall)
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REG_R3
 
index 5a2546af9ed428f94c5d49e98274142e5e1bbe1b..f096c7ff149400106f9476b66a79d5f2096671fd 100644 (file)
@@ -739,7 +739,7 @@ func (c *ctxt0) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
                p = obj.Appendp(p, c.newprog)
                p.As = add
                p.From.Type = obj.TYPE_CONST
-               p.From.Offset = objabi.StackGuard
+               p.From.Offset = int64(objabi.StackGuard)
                p.Reg = REGSP
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REG_R2
@@ -754,7 +754,7 @@ func (c *ctxt0) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
                p = obj.Appendp(p, c.newprog)
                p.As = mov
                p.From.Type = obj.TYPE_CONST
-               p.From.Offset = int64(framesize) + objabi.StackGuard - objabi.StackSmall
+               p.From.Offset = int64(framesize) + int64(objabi.StackGuard) - objabi.StackSmall
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REG_R1
 
index 22869160988208d3126ec8f031454de62e6052c4..30a8414d4ad401c60a8f686e7bb6931b99d4ee59 100644 (file)
@@ -1041,7 +1041,7 @@ func (c *ctxt9) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
                p = obj.Appendp(p, c.newprog)
                p.As = AADD
                p.From.Type = obj.TYPE_CONST
-               p.From.Offset = objabi.StackGuard
+               p.From.Offset = int64(objabi.StackGuard)
                p.Reg = REGSP
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REG_R4
@@ -1056,7 +1056,7 @@ func (c *ctxt9) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
                p = obj.Appendp(p, c.newprog)
                p.As = AMOVD
                p.From.Type = obj.TYPE_CONST
-               p.From.Offset = int64(framesize) + objabi.StackGuard - objabi.StackSmall
+               p.From.Offset = int64(framesize) + int64(objabi.StackGuard) - objabi.StackSmall
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REGTMP
 
index b7b8a2c7a6373b4627fe000e8a186be69ac976e0..b7a2873106f6e66c9b46315989cc7c75048a5d0c 100644 (file)
@@ -641,7 +641,7 @@ func (c *ctxtz) stacksplitPre(p *obj.Prog, framesize int32) (*obj.Prog, *obj.Pro
                p = obj.Appendp(p, c.newprog)
                p.As = AADD
                p.From.Type = obj.TYPE_CONST
-               p.From.Offset = objabi.StackGuard
+               p.From.Offset = int64(objabi.StackGuard)
                p.Reg = REGSP
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REG_R4
@@ -656,7 +656,7 @@ func (c *ctxtz) stacksplitPre(p *obj.Prog, framesize int32) (*obj.Prog, *obj.Pro
                p = obj.Appendp(p, c.newprog)
                p.As = AMOVD
                p.From.Type = obj.TYPE_CONST
-               p.From.Offset = int64(framesize) + objabi.StackGuard - objabi.StackSmall
+               p.From.Offset = int64(framesize) + int64(objabi.StackGuard) - objabi.StackSmall
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REGTMP
 
index 139f293b136f0427a0ebd3a2306664e95b6e3af3..babfd38ad235148522e5031b7cfed3203c03d779 100644 (file)
@@ -1115,7 +1115,7 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, newprog obj.ProgA
                p.As = lea
                p.From.Type = obj.TYPE_MEM
                p.From.Reg = REG_SP
-               p.From.Offset = objabi.StackGuard
+               p.From.Offset = int64(objabi.StackGuard)
                p.To.Type = obj.TYPE_REG
                p.To.Reg = REG_AX
 
@@ -1131,7 +1131,7 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, newprog obj.ProgA
                p.From.Type = obj.TYPE_REG
                p.From.Reg = REG_AX
                p.To.Type = obj.TYPE_CONST
-               p.To.Offset = int64(framesize) + (objabi.StackGuard - objabi.StackSmall)
+               p.To.Offset = int64(framesize) + (int64(objabi.StackGuard) - objabi.StackSmall)
        }
 
        // common
index 11433932e2dcfbdc8eeb4b26cc85bddaf7e237d2..62ab0398a6653407859428a2d750214dac6d127c 100644 (file)
@@ -10,11 +10,24 @@ const (
        STACKSYSTEM = 0
        StackSystem = STACKSYSTEM
        StackBig    = 4096
-       StackGuard  = 880*stackGuardMultiplier + StackSystem
        StackSmall  = 128
-       StackLimit  = StackGuard - StackSystem - StackSmall
 )
 
 const (
        StackPreempt = -1314 // 0xfff...fade
 )
+
+// Initialize StackGuard and StackLimit according to target system.
+var StackGuard = 880*stackGuardMultiplier() + StackSystem
+var StackLimit = StackGuard - StackSystem - StackSmall
+
+// stackGuardMultiplier returns a multiplier to apply to the default
+// stack guard size. Larger multipliers are used for non-optimized
+// builds that have larger stack frames or for specific targets.
+func stackGuardMultiplier() int {
+       // On AIX, a larger stack is needed for syscalls.
+       if GOOS == "aix" {
+               return 2
+       }
+       return stackGuardMultiplierDefault
+}
index b45397e7278a28a860a6a6e63f4f948125d42a66..2cb7ae72e4d2dc86da49a6f1c9c23c1ffb40032f 100644 (file)
@@ -2007,7 +2007,7 @@ func stkcheck(ctxt *Link, up *chain, depth int) int {
                if s.FuncInfo != nil {
                        locals = s.FuncInfo.Locals
                }
-               limit = int(objabi.StackLimit+locals) + int(ctxt.FixedFrameSize())
+               limit = objabi.StackLimit + int(locals) + int(ctxt.FixedFrameSize())
        }
 
        // Walk through sp adjustments in function, consuming relocs.
index 53280232682b8828f67ba15eed30ceb5bb7d1731..10b0173f601d5d803fca01c842185fbd3badc014 100644 (file)
@@ -11,3 +11,6 @@ const RegSize = 4 << (^Uintreg(0) >> 63)           // unsafe.Sizeof(uintreg(0))
 const SpAlign = 1*(1-GoarchArm64) + 16*GoarchArm64 // SP alignment: 1 normally, 16 for ARM64
 
 var DefaultGoroot string // set at link time
+
+// AIX requires a larger stack for syscalls.
+const StackGuardMultiplier = StackGuardMultiplierDefault*(1-GoosAix) + 2*GoosAix