# Test go build -pgo flag.
# Specifically, the build cache handles profile content correctly.

[short] skip 'compiles and links executables'

# build without PGO
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 'compile.*-pgoprofile=.*prof.*triv.go'

# check that PGO appears in build info
# N.B. we can't start the stdout check with -pgo because the script assumes that
# if the first arg starts with - it is a grep flag.
go version -m triv.exe
stdout 'build\s+-pgo=.*'${/}'prof'

# store the build ID
go list -export -json=BuildID -pgo=prof triv.go
stdout '"BuildID":' # check that output actually contains a build ID
cp stdout list.out

# build again with the same profile, should be cached
go build -x -pgo=prof -o triv.exe triv.go
! stderr 'compile.*triv.go'

# check that the build ID is the same
go list -export -json=BuildID -pgo=prof triv.go
cmp stdout list.out

# overwrite the prof
go run overwrite.go

# build again, profile content changed, should trigger rebuild
go build -n -pgo=prof triv.go
stderr 'compile.*-pgoprofile=.*prof.*p.go'

# check that the build ID is different
go list -export -json=BuildID -pgo=prof triv.go
! cmp stdout list.out

# build with trimpath, buildinfo path should be trimmed
go build -x -pgo=prof -trimpath -o triv.exe triv.go

# check that path is trimmed
go version -m triv.exe
stdout 'build\s+-pgo=prof'

-- prof --
-- triv.go --
package main
func main() {}
-- overwrite.go --
package main

import (
	"os"
	"runtime/pprof"
)

func main() {
	f, err := os.Create("prof")
	if err != nil {
		panic(err)
	}
	err = pprof.StartCPUProfile(f)
	if err != nil {
		panic(err)
	}
	pprof.StopCPUProfile()
	f.Close()
}
