]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.8] cmd/go: if we get a C compiler dwarf2 warning, try without -g
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 3 May 2017 17:50:19 +0000 (17:50 +0000)
committerChris Broadfoot <cbro@golang.org>
Tue, 23 May 2017 20:03:04 +0000 (20:03 +0000)
Backport of CL 38072

Fixes #14705

Reviewed-on: https://go-review.googlesource.com/42500
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Change-Id: Ia6ce2a41434aef2f8745a6a862ea66608b1e25f7
Reviewed-on: https://go-review.googlesource.com/43995
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/go/build.go

index 98a650918a30d7d6ae80ff78551b4ad93fa32d33..cad578daed454c3e6525be68aee4fa4f9d8fbc4a 100644 (file)
@@ -3073,6 +3073,26 @@ func (b *builder) ccompile(p *Package, outfile string, flags []string, file stri
        desc := p.ImportPath
        output, err := b.runOut(p.Dir, desc, nil, compiler, flags, "-o", outfile, "-c", file)
        if len(output) > 0 {
+               // On FreeBSD 11, when we pass -g to clang 3.8 it
+               // invokes its internal assembler with -dwarf-version=2.
+               // When it sees .section .note.GNU-stack, it warns
+               // "DWARF2 only supports one section per compilation unit".
+               // This warning makes no sense, since the section is empty,
+               // but it confuses people.
+               // We work around the problem by detecting the warning
+               // and dropping -g and trying again.
+               if bytes.Contains(output, []byte("DWARF2 only supports one section per compilation unit")) {
+                       newFlags := make([]string, 0, len(flags))
+                       for _, f := range flags {
+                               if !strings.HasPrefix(f, "-g") {
+                                       newFlags = append(newFlags, f)
+                               }
+                       }
+                       if len(newFlags) < len(flags) {
+                               return b.ccompile(p, outfile, newFlags, file, compiler)
+                       }
+               }
+
                b.showOutput(p.Dir, desc, b.processOutput(output))
                if err != nil {
                        err = errPrintedOutput