]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: preprocess PGO profiles
authorMichael Pratt <mpratt@google.com>
Thu, 29 Feb 2024 20:15:44 +0000 (15:15 -0500)
committerGopher Robot <gobot@golang.org>
Thu, 18 Apr 2024 15:38:19 +0000 (15:38 +0000)
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>
src/cmd/dist/build.go
src/cmd/go/internal/work/action.go
src/cmd/go/testdata/script/build_pgo.txt
src/cmd/go/testdata/script/build_pgo_auto.txt
src/cmd/go/testdata/script/build_pgo_auto_multi.txt

index 64f8f530543d788fd4134851edcae5ef7d878f91..99f517e7588c79b3569b3064788317c74608f703 100644 (file)
@@ -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.
index c4cee8947c252cc772dc41711d8a4a264e8ee1db..249c80226980b685181f9387929344a57852fcb1 100644 (file)
@@ -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
        }
 
index 48bba683c1b554373161ab2455fa25ae069d7be9..0ca2105f56ec8a05b11830d118706b6d8997a7f5 100644 (file)
@@ -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
@@ -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=.*'
 
@@ -61,6 +61,7 @@ package main
 import (
        "os"
        "runtime/pprof"
+       "time"
 )
 
 func main() {
@@ -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()
 }
index aebf83d224372b468af4af875af19a064aa1dab6..1ae86d4e57dd072d0a0cfc0507aa2b3935924da8 100644 (file)
@@ -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
index 88cc49d421d4220d93375346beb5878db9f899b2..509edb0230dc1aca4ef978efc994b59b5b8bb6ce 100644 (file)
@@ -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