Last active
August 12, 2016 19:25
-
-
Save tamird/4b5a9481bfa6432f9672c652b220d11e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
commit 2d9cd0a9ce5d3dcb815468b7150700d16f1d1057 | |
Author: Tamir Duberstein <[email protected]> | |
Date: Fri Aug 12 15:23:18 2016 -0400 | |
libgo/go/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. | |
diff --git a/libgo/go/cmd/go/build.go b/libgo/go/cmd/go/build.go | |
index 4382cf7..f175aaa 100644 | |
--- a/libgo/go/cmd/go/build.go | |
+++ b/libgo/go/cmd/go/build.go | |
@@ -2632,10 +2632,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 | |
@@ -2714,10 +2713,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) | |
@@ -2725,17 +2724,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") { | |
@@ -2755,7 +2744,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. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment