From a891f2e2ae60c1cc740751bcb3427f71c618b9d0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 16:42:11 +0100 Subject: [PATCH] cmd: always allow bigtoc generation with gcc on aix/ppc64 -mcmodel=large and -Wl,-bbigtoc must always be passed to gcc in order to prevent TOC overflow error. However, a warning is still issued by ld. It is removed as it doesn't give any useful information. Change-Id: I95a78e8993cc7b5c0f329654d507409785f7eea6 Reviewed-on: https://go-review.googlesource.com/c/go/+/164008 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/cgo/gcc.go | 1 + src/cmd/go/internal/work/exec.go | 5 +++++ src/cmd/link/internal/ld/lib.go | 17 +++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 915ad66111..9428ffd3bf 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -1587,6 +1587,7 @@ func (p *Package) gccCmd() []string { c = append(c, p.gccMachine()...) if goos == "aix" { c = append(c, "-maix64") + c = append(c, "-mcmodel=large") } c = append(c, "-") //read input from standard input return c diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 62ae01e555..e53ef6cdd3 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -2244,6 +2244,11 @@ func (b *Builder) compilerCmd(compiler []string, incdir, workdir string) []strin } } + if cfg.Goos == "aix" { + // mcmodel=large must always be enabled to allow large TOC. + a = append(a, "-mcmodel=large") + } + // disable ASCII art in clang errors, if possible if b.gccSupportsFlag(compiler, "-fno-caret-diagnostics") { a = append(a, "-fno-caret-diagnostics") diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index d5efcee34b..5e1b042073 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1153,6 +1153,10 @@ func (ctxt *Link) hostlink() { // prevent ld to reorder .text functions to keep the same // first/last functions for moduledata. argv = append(argv, "-Wl,-bnoobjreorder") + // mcmodel=large is needed for every gcc generated files, but + // ld still need -bbigtoc in order to allow larger TOC. + argv = append(argv, "-mcmodel=large") + argv = append(argv, "-Wl,-bbigtoc") } switch ctxt.BuildMode { @@ -1387,11 +1391,24 @@ func (ctxt *Link) hostlink() { // Filter out useless linker warnings caused by bugs outside Go. // See also cmd/go/internal/work/exec.go's gccld method. var save [][]byte + var skipLines int for _, line := range bytes.SplitAfter(out, []byte("\n")) { // golang.org/issue/26073 - Apple Xcode bug if bytes.Contains(line, []byte("ld: warning: text-based stub file")) { continue } + + if skipLines > 0 { + skipLines-- + continue + } + + // Remove TOC overflow warning on AIX. + if bytes.Contains(line, []byte("ld: 0711-783")) { + skipLines = 2 + continue + } + save = append(save, line) } out = bytes.Join(save, nil) -- 2.50.0