mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: add framework for logging optimizer (non)actions to LSP
This is intended to allow IDEs to note where the optimizer
was not able to improve users' code. There may be other
applications for this, for example in studying effectiveness
of optimizer changes more quickly than running benchmarks,
or in verifying that code changes did not accidentally disable
optimizations in performance-critical code.
Logging of nilcheck (bad) for amd64 is implemented as
proof-of-concept. In general, the intent is that optimizations
that didn't happen are what will be logged, because that is
believed to be what IDE users want.
Added flag -json=version,dest
Check that version=0. (Future compilers will support a
few recent versions, I hope that version is always <=3.)
Dest is expected to be one of:
/path (or \path in Windows)
will create directory /path and fill it w/ json files
file://path
will create directory path, intended either for
I:\dont\know\enough\about\windows\paths
trustme_I_know_what_I_am_doing_probably_testing
Not passing an absolute path name usually leads to
json splattered all over source directories,
or failure when those directories are not writeable.
If you want a foot-gun, you have to ask for it.
The JSON output is directed to subdirectories of dest,
where each subdirectory is net/url.PathEscape of the
package name, and each for each foo.go in the package,
net/url.PathEscape(foo).json is created. The first line
of foo.json contains version and context information,
and subsequent lines contains LSP-conforming JSON
describing the missing optimizations.
Change-Id: Ib83176a53a8c177ee9081aefc5ae05604ccad8a0
Reviewed-on: https://go-review.googlesource.com/c/go/+/204338
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
4d4ddd862d
commit
cd53fddabb
9 changed files with 621 additions and 2 deletions
|
|
@ -9,6 +9,7 @@ package gc
|
|||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"cmd/compile/internal/logopt"
|
||||
"cmd/compile/internal/ssa"
|
||||
"cmd/compile/internal/types"
|
||||
"cmd/internal/bio"
|
||||
|
|
@ -203,6 +204,7 @@ func Main(archInit func(*Arch)) {
|
|||
// Whether the limit for stack-allocated objects is much smaller than normal.
|
||||
// This can be helpful for diagnosing certain causes of GC latency. See #27732.
|
||||
smallFrames := false
|
||||
jsonLogOpt := ""
|
||||
|
||||
flag.BoolVar(&compiling_runtime, "+", false, "compiling runtime")
|
||||
flag.BoolVar(&compiling_std, "std", false, "compiling standard library")
|
||||
|
|
@ -276,6 +278,7 @@ func Main(archInit func(*Arch)) {
|
|||
flag.BoolVar(&smallFrames, "smallframes", false, "reduce the size limit for stack allocated objects")
|
||||
flag.BoolVar(&Ctxt.UseBASEntries, "dwarfbasentries", Ctxt.UseBASEntries, "use base address selection entries in DWARF")
|
||||
flag.BoolVar(&Ctxt.Flag_newobj, "newobj", false, "use new object file format")
|
||||
flag.StringVar(&jsonLogOpt, "json", "", "version,destination for JSON compiler/optimizer logging")
|
||||
|
||||
objabi.Flagparse(usage)
|
||||
|
||||
|
|
@ -478,6 +481,10 @@ func Main(archInit func(*Arch)) {
|
|||
Debug['l'] = 1 - Debug['l']
|
||||
}
|
||||
|
||||
if jsonLogOpt != "" { // parse version,destination from json logging optimization.
|
||||
logopt.LogJsonOption(jsonLogOpt)
|
||||
}
|
||||
|
||||
ssaDump = os.Getenv("GOSSAFUNC")
|
||||
if ssaDump != "" {
|
||||
if strings.HasSuffix(ssaDump, "+") {
|
||||
|
|
@ -772,6 +779,8 @@ func Main(archInit func(*Arch)) {
|
|||
Fatalf("%d uncompiled functions", len(compilequeue))
|
||||
}
|
||||
|
||||
logopt.FlushLoggedOpts(Ctxt, myimportpath)
|
||||
|
||||
if nerrors+nsavederrors != 0 {
|
||||
errorexit()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue