In https://golang.org/cl/111097 the gc version of cmd/go, which is part of libgo, was updated to include some gccgo-specific changes. The libgo code already has different versions of those changes; this patch makes the libgo match the upstream code. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 259900) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -85ca682349af2cb1aa6b1eecac794aeb73d24f15 +bf6f714559bd7b27b7686811aaf0f6e8e7f1c0d5 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: libgo/go/cmd/go/alldocs.go =================================================================== --- libgo/go/cmd/go/alldocs.go (revision 259805) +++ libgo/go/cmd/go/alldocs.go (working copy) @@ -1266,6 +1266,9 @@ // // Special-purpose environment variables: // +// GCCGOTOOLDIR +// If set, where to find gccgo tools, such as cgo. +// The default is based on how gccgo was configured. // GOROOT_FINAL // The root of the installed Go tree, when it is // installed in a location other than where it is built. @@ -1279,9 +1282,6 @@ // Defined by Git. A colon-separated list of schemes that are allowed to be used // with git fetch/clone. If set, any scheme not explicitly mentioned will be // considered insecure by 'go get'. -// GCCGOTOOLDIR -// If set, where to find gccgo tools, such as cgo. -// The default is based on how gccgo was configured. // // // Import path syntax Index: libgo/go/cmd/go/internal/cfg/cfg.go =================================================================== --- libgo/go/cmd/go/internal/cfg/cfg.go (revision 259805) +++ libgo/go/cmd/go/internal/cfg/cfg.go (working copy) @@ -92,11 +92,12 @@ var ( // Update build context to use our computed GOROOT. func init() { BuildContext.GOROOT = GOROOT - // Note that we must use runtime.GOOS and runtime.GOARCH here, - // as the tool directory does not move based on environment variables. - // This matches the initialization of ToolDir in go/build, - // except for using GOROOT rather than runtime.GOROOT(). if runtime.Compiler != "gccgo" { + // Note that we must use runtime.GOOS and runtime.GOARCH here, + // as the tool directory does not move based on environment + // variables. This matches the initialization of ToolDir in + // go/build, except for using GOROOT rather than + // runtime.GOROOT. build.ToolDir = filepath.Join(GOROOT, "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH) } } @@ -107,6 +108,8 @@ func findGOROOT() string { } def := filepath.Clean(runtime.GOROOT()) if runtime.Compiler == "gccgo" { + // gccgo has no real GOROOT, and it certainly doesn't + // depend on the executable's location. return def } exe, err := os.Executable() Index: libgo/go/cmd/go/internal/help/helpdoc.go =================================================================== --- libgo/go/cmd/go/internal/help/helpdoc.go (revision 259805) +++ libgo/go/cmd/go/internal/help/helpdoc.go (working copy) @@ -526,6 +526,9 @@ Architecture-specific environment variab Special-purpose environment variables: + GCCGOTOOLDIR + If set, where to find gccgo tools, such as cgo. + The default is based on how gccgo was configured. GOROOT_FINAL The root of the installed Go tree, when it is installed in a location other than where it is built. @@ -539,9 +542,6 @@ Special-purpose environment variables: Defined by Git. A colon-separated list of schemes that are allowed to be used with git fetch/clone. If set, any scheme not explicitly mentioned will be considered insecure by 'go get'. - GCCGOTOOLDIR - If set, where to find gccgo tools, such as cgo. - The default is based on how gccgo was configured. `, } Index: libgo/go/cmd/go/internal/load/pkg.go =================================================================== --- libgo/go/cmd/go/internal/load/pkg.go (revision 259805) +++ libgo/go/cmd/go/internal/load/pkg.go (working copy) @@ -13,7 +13,6 @@ import ( "os" pathpkg "path" "path/filepath" - "runtime" "sort" "strings" "unicode" @@ -976,7 +975,7 @@ func (p *Package) load(stk *ImportStack, // This is for 'go tool'. // Override all the usual logic and force it into the tool directory. if cfg.BuildToolchainName == "gccgo" { - p.Target = filepath.Join(runtime.GCCGOTOOLDIR, elem) + p.Target = filepath.Join(base.ToolDir, elem) } else { p.Target = filepath.Join(cfg.GOROOTpkg, "tool", full) } Index: libgo/go/go/build/build.go =================================================================== --- libgo/go/go/build/build.go (revision 259805) +++ libgo/go/go/build/build.go (working copy) @@ -1595,14 +1595,7 @@ func init() { } } -func getToolDir() string { - if runtime.Compiler == "gccgo" { - return envOr("GCCGOTOOLDIR", runtime.GCCGOTOOLDIR) - } else { - return filepath.Join(runtime.GOROOT(), "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH) - } -} - +// ToolDir is the directory containing build tools. var ToolDir = getToolDir() // IsLocalImport reports whether the import path is Index: libgo/go/go/build/gc.go =================================================================== --- libgo/go/go/build/gc.go (nonexistent) +++ libgo/go/go/build/gc.go (working copy) @@ -0,0 +1,17 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gc + +package build + +import ( + "path/filepath" + "runtime" +) + +// getToolDir returns the default value of ToolDir. +func getToolDir() string { + return filepath.Join(runtime.GOROOT(), "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH) +} Index: libgo/go/go/build/gccgo.go =================================================================== --- libgo/go/go/build/gccgo.go (nonexistent) +++ libgo/go/go/build/gccgo.go (working copy) @@ -0,0 +1,14 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo + +package build + +import "runtime" + +// getToolDir returns the default value of ToolDir. +func getToolDir() string { + return envOr("GCCGOTOOLDIR", runtime.GCCGOTOOLDIR) +}