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 /src/cmd/internal | |
| parent | a5318bf5d676b3dfc10a1843668e3593cbdc87c5 (diff) | |
| download | go-20ac64a2dd1f7993101d7e069eab3b84ab2c0bd2.tar.xz | |
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>
Diffstat (limited to 'src/cmd/internal')
| -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 |
7 files changed, 27 insertions, 14 deletions
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 +} |
