1
0
mirror of https://github.com/golang/go synced 2024-11-26 11:38:01 -07:00

cmd/go: pass -gcflags after other flags generated by the go command

Otherwise, any gc flags set by user using "-gcflags" won't have effect.

Fixes #47682

Change-Id: Icd365577cba1f64f6c7b8320d0c9019de9f062f6
Reviewed-on: https://go-review.googlesource.com/c/go/+/344909
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
This commit is contained in:
Cuong Manh Le 2021-08-25 14:56:01 +07:00
parent 4f2620285d
commit a6ff433d6a
4 changed files with 44 additions and 24 deletions

View File

@ -75,7 +75,7 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg, embedcfg
} }
pkgpath := pkgPath(a) pkgpath := pkgPath(a)
gcargs := []string{"-p", pkgpath} gcflags := []string{"-p", pkgpath}
if p.Module != nil { if p.Module != nil {
v := p.Module.GoVersion v := p.Module.GoVersion
if v == "" { if v == "" {
@ -94,11 +94,11 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg, embedcfg
v = "1.16" v = "1.16"
} }
if allowedVersion(v) { if allowedVersion(v) {
gcargs = append(gcargs, "-lang=go"+v) gcflags = append(gcflags, "-lang=go"+v)
} }
} }
if p.Standard { if p.Standard {
gcargs = append(gcargs, "-std") gcflags = append(gcflags, "-std")
} }
_, compilingRuntime := runtimePackages[p.ImportPath] _, compilingRuntime := runtimePackages[p.ImportPath]
compilingRuntime = compilingRuntime && p.Standard compilingRuntime = compilingRuntime && p.Standard
@ -106,7 +106,7 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg, embedcfg
// runtime compiles with a special gc flag to check for // runtime compiles with a special gc flag to check for
// memory allocations that are invalid in the runtime package, // memory allocations that are invalid in the runtime package,
// and to implement some special compiler pragmas. // and to implement some special compiler pragmas.
gcargs = append(gcargs, "-+") gcflags = append(gcflags, "-+")
} }
// If we're giving the compiler the entire package (no C etc files), tell it that, // If we're giving the compiler the entire package (no C etc files), tell it that,
@ -125,25 +125,25 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg, embedcfg
} }
} }
if extFiles == 0 { if extFiles == 0 {
gcargs = append(gcargs, "-complete") gcflags = append(gcflags, "-complete")
} }
if cfg.BuildContext.InstallSuffix != "" { if cfg.BuildContext.InstallSuffix != "" {
gcargs = append(gcargs, "-installsuffix", cfg.BuildContext.InstallSuffix) gcflags = append(gcflags, "-installsuffix", cfg.BuildContext.InstallSuffix)
} }
if a.buildID != "" { if a.buildID != "" {
gcargs = append(gcargs, "-buildid", a.buildID) gcflags = append(gcflags, "-buildid", a.buildID)
} }
if p.Internal.OmitDebug || cfg.Goos == "plan9" || cfg.Goarch == "wasm" { if p.Internal.OmitDebug || cfg.Goos == "plan9" || cfg.Goarch == "wasm" {
gcargs = append(gcargs, "-dwarf=false") gcflags = append(gcflags, "-dwarf=false")
} }
if strings.HasPrefix(runtimeVersion, "go1") && !strings.Contains(os.Args[0], "go_bootstrap") { if strings.HasPrefix(runtimeVersion, "go1") && !strings.Contains(os.Args[0], "go_bootstrap") {
gcargs = append(gcargs, "-goversion", runtimeVersion) gcflags = append(gcflags, "-goversion", runtimeVersion)
} }
if symabis != "" { if symabis != "" {
gcargs = append(gcargs, "-symabis", symabis) gcflags = append(gcflags, "-symabis", symabis)
} }
gcflags := str.StringList(forcedGcflags, p.Internal.Gcflags) gcflags = append(gcflags, str.StringList(forcedGcflags, p.Internal.Gcflags)...)
if compilingRuntime { if compilingRuntime {
// Remove -N, if present. // Remove -N, if present.
// It is not possible to build the runtime with no optimizations, // It is not possible to build the runtime with no optimizations,
@ -157,7 +157,7 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg, embedcfg
} }
} }
args := []interface{}{cfg.BuildToolexec, base.Tool("compile"), "-o", ofile, "-trimpath", a.trimpath(), gcflags, gcargs} args := []interface{}{cfg.BuildToolexec, base.Tool("compile"), "-o", ofile, "-trimpath", a.trimpath(), gcflags}
if p.Internal.LocalPrefix != "" { if p.Internal.LocalPrefix != "" {
// Workaround #43883. // Workaround #43883.
args = append(args, "-D", p.Internal.LocalPrefix) args = append(args, "-D", p.Internal.LocalPrefix)

View File

@ -0,0 +1,20 @@
# Tests golang.org/issue/47682
# Flags specified with -gcflags should appear after other flags generated by cmd/go.
cd m
go build -n -gcflags=-lang=go1.17
stderr ' -lang=go1.16.* -lang=go1.17'
-- m/go.mod --
module example.com
go 1.16
-- m/main.go --
package main
func main() {
var s = []int{1, 2, 3}
var pa = (*[2]int)(s[1:])
println(pa[1])
}

View File

@ -8,4 +8,4 @@ mkdir $GOCACHE
# Verify the standard library (specifically runtime/internal/atomic) can be # Verify the standard library (specifically runtime/internal/atomic) can be
# built with -gcflags when -n is given. See golang.org/issue/29346. # built with -gcflags when -n is given. See golang.org/issue/29346.
go build -n -gcflags=all='-l' std go build -n -gcflags=all='-l' std
stderr 'compile.* -l .* runtime/internal/atomic' stderr 'compile.* runtime/internal/atomic .* -l'

View File

@ -7,28 +7,28 @@ env GOCACHE=$WORK/gocache # Looking for compile commands, so need a clean cache
# -gcflags=-e applies to named packages, not dependencies # -gcflags=-e applies to named packages, not dependencies
go build -n -v -gcflags=-e z1 z2 go build -n -v -gcflags=-e z1 z2
stderr 'compile.* -e.* -p z1' stderr 'compile.* -p z1.* -e'
stderr 'compile.* -e.* -p z2' stderr 'compile.* -p z2.* -e'
stderr 'compile.* -p y' stderr 'compile.* -p y'
! stderr 'compile.* -e.* -p [^z]' ! stderr 'compile.* -p [^z].* -e'
# -gcflags can specify package=flags, and can be repeated; last match wins # -gcflags can specify package=flags, and can be repeated; last match wins
go build -n -v -gcflags=-e -gcflags=z1=-N z1 z2 go build -n -v -gcflags=-e -gcflags=z1=-N z1 z2
stderr 'compile.* -N.* -p z1' stderr 'compile.* -p z1.* -N'
! stderr 'compile.* -e.* -p z1' ! stderr 'compile.* -p z1.* -e'
! stderr 'compile.* -N.* -p z2' ! stderr 'compile.* -p z2.* -N'
stderr 'compile.* -e.* -p z2' stderr 'compile.* -p z2.* -e'
stderr 'compile.* -p y' stderr 'compile.* -p y'
! stderr 'compile.* -e.* -p [^z]' ! stderr 'compile.* -p [^z].* -e'
! stderr 'compile.* -N.* -p [^z]' ! stderr 'compile.* -p [^z].* -N'
# -gcflags can have arbitrary spaces around the flags # -gcflags can have arbitrary spaces around the flags
go build -n -v -gcflags=' z1 = -e ' z1 go build -n -v -gcflags=' z1 = -e ' z1
stderr 'compile.* -e.* -p z1' stderr 'compile.* -p z1.* -e'
# -gcflags='all=-e' should apply to all packages, even with go test # -gcflags='all=-e' should apply to all packages, even with go test
go test -c -n -gcflags='all=-e' z1 go test -c -n -gcflags='all=-e' z1
stderr 'compile.* -e.* -p z3 ' stderr 'compile.* -p z3.* -e '
# this particular -gcflags argument made the compiler crash # this particular -gcflags argument made the compiler crash
! go build -gcflags=-d=ssa/ z1 ! go build -gcflags=-d=ssa/ z1