diff options
author | Clément Chigot <clement.chigot@atos.net> | 2019-01-09 14:05:17 +0100 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2019-01-09 22:06:51 +0000 |
commit | 20ac64a2dd1f7993101d7e069eab3b84ab2c0bd2 (patch) | |
tree | 44cabd19b42991b488294b861f53afb0302c6b37 | |
parent | a5318bf5d676b3dfc10a1843668e3593cbdc87c5 (diff) | |
download | go-20ac64a2dd1f7993101d7e069eab3b84ab2c0bd2.tar.gz go-20ac64a2dd1f7993101d7e069eab3b84ab2c0bd2.zip |
cmd/dist, cmd/link, runtime: fix stack size when cross-compiling aix/ppc64
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>
-rw-r--r-- | src/cmd/dist/buildruntime.go | 14 | ||||
-rw-r--r-- | src/cmd/internal/obj/arm/obj5.go | 4 | ||||
-rw-r--r-- | src/cmd/internal/obj/arm64/obj7.go | 4 | ||||
-rw-r--r-- | src/cmd/internal/obj/mips/obj0.go | 4 | ||||
-rw-r--r-- | src/cmd/internal/obj/ppc64/obj9.go | 4 | ||||
-rw-r--r-- | src/cmd/internal/obj/s390x/objz.go | 4 | ||||
-rw-r--r-- | src/cmd/internal/obj/x86/obj6.go | 4 | ||||
-rw-r--r-- | src/cmd/internal/objabi/stack.go | 17 | ||||
-rw-r--r-- | src/cmd/link/internal/ld/lib.go | 2 | ||||
-rw-r--r-- | src/runtime/internal/sys/stubs.go | 3 |
10 files changed, 36 insertions, 24 deletions
diff --git a/src/cmd/dist/buildruntime.go b/src/cmd/dist/buildruntime.go index 10d1552c94..5aadc8da67 100644 --- a/src/cmd/dist/buildruntime.go +++ b/src/cmd/dist/buildruntime.go @@ -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 diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go index c17bf2a8ac..34bd5d6baf 100644 --- a/src/cmd/internal/obj/arm/obj5.go +++ b/src/cmd/internal/obj/arm/obj5.go @@ -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 diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go index d0e354eabd..e47857ab5f 100644 --- a/src/cmd/internal/obj/arm64/obj7.go +++ b/src/cmd/internal/obj/arm64/obj7.go @@ -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 diff --git a/src/cmd/internal/obj/mips/obj0.go b/src/cmd/internal/obj/mips/obj0.go index 5a2546af9e..f096c7ff14 100644 --- a/src/cmd/internal/obj/mips/obj0.go +++ b/src/cmd/internal/obj/mips/obj0.go @@ -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 diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index 2286916098..30a8414d4a 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -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 diff --git a/src/cmd/internal/obj/s390x/objz.go b/src/cmd/internal/obj/s390x/objz.go index b7b8a2c7a6..b7a2873106 100644 --- a/src/cmd/internal/obj/s390x/objz.go +++ b/src/cmd/internal/obj/s390x/objz.go @@ -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 diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index 139f293b13..babfd38ad2 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -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 diff --git a/src/cmd/internal/objabi/stack.go b/src/cmd/internal/objabi/stack.go index 11433932e2..62ab0398a6 100644 --- a/src/cmd/internal/objabi/stack.go +++ b/src/cmd/internal/objabi/stack.go @@ -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 +} diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index b45397e727..2cb7ae72e4 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -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. diff --git a/src/runtime/internal/sys/stubs.go b/src/runtime/internal/sys/stubs.go index 5328023268..10b0173f60 100644 --- a/src/runtime/internal/sys/stubs.go +++ b/src/runtime/internal/sys/stubs.go @@ -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 |