# Test go build -pgo=auto flag with multiple main packages. go install -a -n -pgo=auto ./a ./b ./nopgo # a/default.pgo and b/default.pgo are both preprocessed stderr 'preprofile.*-i.*a(/|\\\\)default\.pgo' stderr 'preprofile.*-i.*b(/|\\\\)default\.pgo' # a and b built once each with PGO. # Ideally we would check that the passed profile is the expected profile (here # and for dependencies). Unfortunately there is no nice way to map the expected # paths after preprocessing. stderr -count=1 'compile.*-pgoprofile=.*a(/|\\\\)a\.go' stderr -count=1 'compile.*-pgoprofile=.*b(/|\\\\)b\.go' # nopgo should be built without PGO. ! stderr 'compile.*-pgoprofile=.*nopgo(/|\\\\)nopgo\.go' # Dependencies should also be built with and without PGO. # Here we want to match a compile action without -pgoprofile, # by matching 3 occurrences of "compile dep.go", among which # 2 of them have -pgoprofile (therefore one without). stderr -count=3 'compile.*dep(/|\\\\)dep.go' stderr -count=2 'compile.*-pgoprofile=.*dep(/|\\\\)dep\.go' stderr -count=3 'compile.*dep2(/|\\\\)dep2.go' stderr -count=2 'compile.*-pgoprofile=.*dep2(/|\\\\)dep2\.go' stderr -count=3 'compile.*dep3(/|\\\\)dep3.go' stderr -count=2 'compile.*-pgoprofile=.*dep3(/|\\\\)dep3\.go' # check that pgo appears or not in build info as expected stderr 'path\\ttest/a\\n.*build\\t-pgo=.*a(/|\\\\)default\.pgo' stderr 'path\\ttest/b\\n.*build\\t-pgo=.*b(/|\\\\)default\.pgo' ! stderr 'path\\ttest/nopgo\\n.*build\\t-pgo=' # go test works the same way go test -a -n -pgo=auto ./a ./b ./nopgo stderr -count=1 'compile.*-pgoprofile=.*a(/|\\\\)a_test\.go' stderr -count=1 'compile.*-pgoprofile=.*b(/|\\\\)b_test\.go' stderr -count=2 'compile.*-pgoprofile=.*dep(/|\\\\)dep\.go' ! stderr 'compile.*-pgoprofile=.*nopgo(/|\\\\)nopgo_test\.go' # test-only dependencies also have profiles attached stderr -count=2 'compile.*-pgoprofile=.*testdep(/|\\\\)testdep\.go' stderr -count=2 'compile.*-pgoprofile=.*testdep2(/|\\\\)testdep2\.go' # go list -deps prints packages built multiple times. go list -pgo=auto -deps ./a ./b ./nopgo stdout 'test/dep \[test/a\]' stdout 'test/dep \[test/b\]' stdout 'test/dep$' # Here we have 3 main packages, a, b, and nopgo, where a and b each has # its own default.pgo profile, and nopgo has none. # All 3 main packages import dep and dep2, both of which then import dep3 # (a diamond-shape import graph). -- go.mod -- module test go 1.20 -- a/a.go -- package main import _ "test/dep" import _ "test/dep2" func main() {} -- a/a_test.go -- package main import "testing" import _ "test/testdep" func TestA(*testing.T) {} -- a/default.pgo -- -- b/b.go -- package main import _ "test/dep" import _ "test/dep2" func main() {} -- b/b_test.go -- package main import "testing" import _ "test/testdep" func TestB(*testing.T) {} -- b/default.pgo -- -- nopgo/nopgo.go -- package main import _ "test/dep" import _ "test/dep2" func main() {} -- nopgo/nopgo_test.go -- package main import "testing" func TestNopgo(*testing.T) {} -- dep/dep.go -- package dep import _ "test/dep3" -- dep2/dep2.go -- package dep2 -- dep3/dep3.go -- package dep3 -- testdep/testdep.go -- package testdep import _ "test/testdep2" -- testdep2/testdep2.go -- package testdep2