From: Josh Bleecher Snyder Date: Mon, 3 Apr 2017 01:37:04 +0000 (-0700) Subject: cmd/compile: add block profiling support X-Git-Tag: go1.9beta1~853 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=96af8174975dcc18b6d13dad46c35bd1d7264d37;p=gostls13.git cmd/compile: add block profiling support Updates #15756 Change-Id: Ic635812b324af926333122c02908cebfb24d7bce Reviewed-on: https://go-review.googlesource.com/39208 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/compile/doc.go b/src/cmd/compile/doc.go index 2e77f702e3..0a364cabb7 100644 --- a/src/cmd/compile/doc.go +++ b/src/cmd/compile/doc.go @@ -44,6 +44,8 @@ Flags: Print compiler version and exit. -asmhdr file Write assembly header to file. + -blockprofile file + Write block profile for the compilation to file. -complete Assume package has no non-Go components. -cpuprofile file diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index a0d5170a46..b2efd7cbef 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -221,6 +221,7 @@ func Main(archInit func(*Arch)) { flag.StringVar(&memprofile, "memprofile", "", "write memory profile to `file`") flag.Int64Var(&memprofilerate, "memprofilerate", 0, "set runtime.MemProfileRate to `rate`") flag.StringVar(&traceprofile, "traceprofile", "", "write an execution trace to `file`") + flag.StringVar(&blockprofile, "blockprofile", "", "write block profile to `file`") flag.StringVar(&benchfile, "bench", "", "append benchmark times to `file`") obj.Flagparse(usage) diff --git a/src/cmd/compile/internal/gc/util.go b/src/cmd/compile/internal/gc/util.go index 947d8a8516..97fff063f8 100644 --- a/src/cmd/compile/internal/gc/util.go +++ b/src/cmd/compile/internal/gc/util.go @@ -32,6 +32,7 @@ func Exit(code int) { } var ( + blockprofile string cpuprofile string memprofile string memprofilerate int64 @@ -73,6 +74,17 @@ func startProfile() { // Not doing memory profiling; disable it entirely. runtime.MemProfileRate = 0 } + if blockprofile != "" { + f, err := os.Create(blockprofile) + if err != nil { + Fatalf("%v", err) + } + runtime.SetBlockProfileRate(1) + atExit(func() { + pprof.Lookup("block").WriteTo(f, 0) + f.Close() + }) + } if traceprofile != "" && traceHandler != nil { traceHandler(traceprofile) }