Skip to content

Commit

Permalink
cmd/go: preprocess PGO profiles
Browse files Browse the repository at this point in the history
Following the previous CL, now actually run the preprofile tool to create the
preprocessed output.

There is still no build cache integration, so the tool will run on every
build even if nothing has changed.

For #58102.

Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest
Change-Id: I0414377a956889f457e50898737fcaa8a698658d
Reviewed-on: https://go-review.googlesource.com/c/go/+/569424
Auto-Submit: Michael Pratt <mpratt@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
  • Loading branch information
prattmic authored and gopherbot committed Apr 18, 2024
1 parent 4084bc1 commit 081dc9f
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 12 deletions.
2 changes: 1 addition & 1 deletion src/cmd/dist/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -1354,7 +1354,7 @@ func toolenv() []string {
return env
}

var toolchain = []string{"cmd/asm", "cmd/cgo", "cmd/compile", "cmd/link"}
var toolchain = []string{"cmd/asm", "cmd/cgo", "cmd/compile", "cmd/link", "cmd/preprofile"}

// The bootstrap command runs a build from scratch,
// stopping at having installed the go_bootstrap command.
Expand Down
7 changes: 1 addition & 6 deletions src/cmd/go/internal/work/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -476,12 +476,7 @@ func (p *pgoActor) Act(b *Builder, ctx context.Context, a *Action) error {
return err
}

// TODO(prattmic): This should use go tool preprofile to actually
// preprocess the profile. For now, this is a dummy implementation that
// simply copies the input to the output. This is technically a valid
// implementation because go tool compile -pgofile accepts either a
// pprof file or preprocessed file.
if err := sh.CopyFile(a.Target, p.input, 0644, false); err != nil {
if err := sh.run(".", p.input, nil, cfg.BuildToolexec, base.Tool("preprofile"), "-o", a.Target, "-i", p.input); err != nil {
return err
}

Expand Down
9 changes: 7 additions & 2 deletions src/cmd/go/testdata/script/build_pgo.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ go build triv.go
# build with PGO, should trigger rebuild
# starting with an empty profile (the compiler accepts it)
go build -x -pgo=prof -o triv.exe triv.go
stderr 'cp.*prof' # preprocess PGO profile
stderr 'preprofile.*-i.*prof'
stderr 'compile.*-pgoprofile=.*triv.go'

# check that PGO appears in build info
Expand All @@ -36,7 +36,7 @@ go run overwrite.go

# build again, profile content changed, should trigger rebuild, including std
go build -n -pgo=prof triv.go
stderr 'cp.*prof' # preprocess PGO profile
stderr 'preprofile.*-i.*prof'
stderr 'compile.*-pgoprofile=.*triv.go'
stderr 'compile.*-p runtime.*-pgoprofile=.*'

Expand All @@ -61,6 +61,7 @@ package main
import (
"os"
"runtime/pprof"
"time"
)

func main() {
Expand All @@ -72,6 +73,10 @@ func main() {
if err != nil {
panic(err)
}
// Spin to ensure we get some samples. If we get no samples, the result
// is equivalent to an empty profile.
start := time.Now()
for time.Since(start) < 100*time.Millisecond {}
pprof.StopCPUProfile()
f.Close()
}
2 changes: 1 addition & 1 deletion src/cmd/go/testdata/script/build_pgo_auto.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# use default.pgo for a single main package
go build -n -pgo=auto -o a1.exe ./a/a1
stderr 'cp.*default\.pgo' # preprocess PGO profile
stderr 'preprofile.*-i.*default\.pgo'
stderr 'compile.*-pgoprofile=.*a1.go'

# check that pgo applied to dependencies
Expand Down
4 changes: 2 additions & 2 deletions src/cmd/go/testdata/script/build_pgo_auto_multi.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
go install -a -n -pgo=auto ./a ./b ./nopgo

# a/default.pgo and b/default.pgo are both preprocessed
stderr 'cp.*a(/|\\)default\.pgo'
stderr 'cp.*b(/|\\)default\.pgo'
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
Expand Down

0 comments on commit 081dc9f

Please sign in to comment.