mirror of
https://github.com/golang/go
synced 2024-11-23 08:10:03 -07:00
cmd/go: attach PGO profile for test dependencies
When running "go test" including a main package which has a PGO profile, we currently build the package being tested and its dependencies with PGO, but we failed to attach the profile to test-only dependencies. If a package is (transitively) imported by both the package being tested and the test, the PGO version and the non-PGO version of the package are both linked into the binary, causing link-time error. This CL fixes this by attaching the PGO profile to dependencies of the test. Fixes #61376. Change-Id: I2559db9843c4cdab596b31e2025d8475ffbf58ec Reviewed-on: https://go-review.googlesource.com/c/go/+/510835 Run-TryBot: Cherry Mui <cherryyz@google.com> Reviewed-by: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
5f9412911b
commit
af0609b080
@ -473,6 +473,7 @@ func recompileForTest(pmain, preal, ptest, pxtest *Package) *PackageError {
|
|||||||
p.Target = ""
|
p.Target = ""
|
||||||
p.Internal.BuildInfo = nil
|
p.Internal.BuildInfo = nil
|
||||||
p.Internal.ForceLibrary = true
|
p.Internal.ForceLibrary = true
|
||||||
|
p.Internal.PGOProfile = preal.Internal.PGOProfile
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update p.Internal.Imports to use test copies.
|
// Update p.Internal.Imports to use test copies.
|
||||||
@ -496,6 +497,11 @@ func recompileForTest(pmain, preal, ptest, pxtest *Package) *PackageError {
|
|||||||
if p.Name == "main" && p != pmain && p != ptest {
|
if p.Name == "main" && p != pmain && p != ptest {
|
||||||
split()
|
split()
|
||||||
}
|
}
|
||||||
|
// Split and attach PGO information to test dependencies if preal
|
||||||
|
// is built with PGO.
|
||||||
|
if preal.Internal.PGOProfile != "" && p.Internal.PGOProfile == "" {
|
||||||
|
split()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do search to find cycle.
|
// Do search to find cycle.
|
||||||
|
@ -45,6 +45,12 @@ stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*b(/|\\\\)b_test\.go'
|
|||||||
stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*dep(/|\\\\)dep\.go'
|
stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*dep(/|\\\\)dep\.go'
|
||||||
! stderr 'compile.*-pgoprofile=.*nopgo(/|\\\\)nopgo_test\.go'
|
! stderr 'compile.*-pgoprofile=.*nopgo(/|\\\\)nopgo_test\.go'
|
||||||
|
|
||||||
|
# test-only dependencies also have profiles attached
|
||||||
|
stderr 'compile.*-pgoprofile=.*a(/|\\\\)default\.pgo.*testdep(/|\\\\)testdep\.go'
|
||||||
|
stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*testdep(/|\\\\)testdep\.go'
|
||||||
|
stderr 'compile.*-pgoprofile=.*a(/|\\\\)default\.pgo.*testdep2(/|\\\\)testdep2\.go'
|
||||||
|
stderr 'compile.*-pgoprofile=.*b(/|\\\\)default\.pgo.*testdep2(/|\\\\)testdep2\.go'
|
||||||
|
|
||||||
# go list -deps prints packages built multiple times.
|
# go list -deps prints packages built multiple times.
|
||||||
go list -pgo=auto -deps ./a ./b ./nopgo
|
go list -pgo=auto -deps ./a ./b ./nopgo
|
||||||
stdout 'test/dep \[test/a\]'
|
stdout 'test/dep \[test/a\]'
|
||||||
@ -66,6 +72,7 @@ func main() {}
|
|||||||
-- a/a_test.go --
|
-- a/a_test.go --
|
||||||
package main
|
package main
|
||||||
import "testing"
|
import "testing"
|
||||||
|
import _ "test/testdep"
|
||||||
func TestA(*testing.T) {}
|
func TestA(*testing.T) {}
|
||||||
-- a/default.pgo --
|
-- a/default.pgo --
|
||||||
-- b/b.go --
|
-- b/b.go --
|
||||||
@ -76,6 +83,7 @@ func main() {}
|
|||||||
-- b/b_test.go --
|
-- b/b_test.go --
|
||||||
package main
|
package main
|
||||||
import "testing"
|
import "testing"
|
||||||
|
import _ "test/testdep"
|
||||||
func TestB(*testing.T) {}
|
func TestB(*testing.T) {}
|
||||||
-- b/default.pgo --
|
-- b/default.pgo --
|
||||||
-- nopgo/nopgo.go --
|
-- nopgo/nopgo.go --
|
||||||
@ -94,3 +102,8 @@ import _ "test/dep3"
|
|||||||
package dep2
|
package dep2
|
||||||
-- dep3/dep3.go --
|
-- dep3/dep3.go --
|
||||||
package dep3
|
package dep3
|
||||||
|
-- testdep/testdep.go --
|
||||||
|
package testdep
|
||||||
|
import _ "test/testdep2"
|
||||||
|
-- testdep2/testdep2.go --
|
||||||
|
package testdep2
|
||||||
|
Loading…
Reference in New Issue
Block a user