aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Hudson-Doyle <michael.hudson@canonical.com>2016-04-08 15:06:04 +1200
committerMichael Hudson-Doyle <michael.hudson@canonical.com>2016-04-14 20:19:43 +0000
commit12e3b184f0fe15787be7f0837d2b168a4fbe60be (patch)
treecf46d191a456eb9e3bb508e98b99f490e3e0b472 /src
parente5463f5055d590046a451a115ceac7b58b3f825f (diff)
downloadgo-12e3b184f0fe15787be7f0837d2b168a4fbe60be.tar.xz
cmd/go: deduplicate gccgo afiles by package path, not *Package
This code was fixed a while ago to ensure that xtest and fake packages came first on the link line, but golang.org/cl/16775 added --whole-archive ... --no-whole-archive around all the .a files and rendered this fix useless. So, take a different approach and only put one .a file on the linker command line for each ImportPath we see while traversing the action graph, not for each *Package we see. The way we walk the graph ensures that we'll see the .a files that need to be first first. Change-Id: I137f00f129ccc9fc99f40eee885cc04cc358a62e Reviewed-on: https://go-review.googlesource.com/21692 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/go/build.go22
1 files changed, 5 insertions, 17 deletions
diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go
index 6b9da26ae8..c0de2e0695 100644
--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -2602,10 +2602,9 @@ func (gccgoToolchain) pack(b *builder, p *Package, objDir, afile string, ofiles
func (tools gccgoToolchain) ld(b *builder, root *action, out string, allactions []*action, mainpkg string, ofiles []string) error {
// gccgo needs explicit linking with all package dependencies,
// and all LDFLAGS from cgo dependencies.
- apackagesSeen := make(map[*Package]bool)
+ apackagePathsSeen := make(map[string]bool)
afiles := []string{}
shlibs := []string{}
- xfiles := []string{}
ldflags := b.gccArchArgs()
cgoldflags := []string{}
usesCgo := false
@@ -2694,10 +2693,10 @@ func (tools gccgoToolchain) ld(b *builder, root *action, out string, allactions
// rather than the 'build' location (which may not exist any
// more). We still need to traverse the dependencies of the
// build action though so saying
- // if apackagesSeen[a.p] { return }
+ // if apackagePathsSeen[a.p.ImportPath] { return }
// doesn't work.
- if !apackagesSeen[a.p] {
- apackagesSeen[a.p] = true
+ if !apackagePathsSeen[a.p.ImportPath] {
+ apackagePathsSeen[a.p.ImportPath] = true
target := a.target
if len(a.p.CgoFiles) > 0 {
target, err = readAndRemoveCgoFlags(target)
@@ -2705,17 +2704,7 @@ func (tools gccgoToolchain) ld(b *builder, root *action, out string, allactions
return
}
}
- if a.p.fake && a.p.external {
- // external _tests, if present must come before
- // internal _tests. Store these on a separate list
- // and place them at the head after this loop.
- xfiles = append(xfiles, target)
- } else if a.p.fake {
- // move _test files to the top of the link order
- afiles = append([]string{target}, afiles...)
- } else {
- afiles = append(afiles, target)
- }
+ afiles = append(afiles, target)
}
}
if strings.HasSuffix(a.target, ".so") {
@@ -2735,7 +2724,6 @@ func (tools gccgoToolchain) ld(b *builder, root *action, out string, allactions
return err
}
}
- afiles = append(xfiles, afiles...)
for _, a := range allactions {
// Gather CgoLDFLAGS, but not from standard packages.