]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: clean the output of GOSSAFUNC
authorYury Smolsky <yury@smolsky.by>
Tue, 24 Jul 2018 07:39:00 +0000 (10:39 +0300)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 23 Aug 2018 05:11:17 +0000 (05:11 +0000)
Since we print almost everything to ssa.html in the GOSSAFUNC mode,
there is a need to stop spamming stdout when user just wants to see
ssa.html.

This changes cleans output of the GOSSAFUNC debug mode.
To enable the dump of the debug data to stdout, one must
put suffix + after the function name like that:

GOSSAFUNC=Foo+

Otherwise gc will not print the IR and ASM to stdout after each phase.
AST IR is still sent to stdout because it is not included
into ssa.html. It will be fixed in a separate change.

The change adds printing out the full path to the ssa.html file.

Updates #25942

Change-Id: I711e145e05f0443c7df5459ca528dced273a62ee
Reviewed-on: https://go-review.googlesource.com/126603
Run-TryBot: Yury Smolsky <yury@smolsky.by>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/main.go
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/ssa/compile.go
src/cmd/compile/internal/ssa/html.go

index 5d074114ec0a5921b7997697ff0215118c2737ca..44cf75e7c989a35914404e2e98dd1f7543592be1 100644 (file)
@@ -428,6 +428,10 @@ func Main(archInit func(*Arch)) {
        }
 
        ssaDump = os.Getenv("GOSSAFUNC")
+       if strings.HasSuffix(ssaDump, "+") {
+               ssaDump = ssaDump[:len(ssaDump)-1]
+               ssaDumpStdout = true
+       }
 
        trackScopes = flagDWARF
 
index cabcf17ed1cdc3e6acdc788320bcfa2ead424156..2abd9448d4ee20997303144bc791ab09bd4b0937 100644 (file)
@@ -23,7 +23,8 @@ import (
 var ssaConfig *ssa.Config
 var ssaCaches []ssa.Cache
 
-var ssaDump string // early copy of $GOSSAFUNC; the func name to dump output for
+var ssaDump string     // early copy of $GOSSAFUNC; the func name to dump output for
+var ssaDumpStdout bool // whether to dump to stdout
 const ssaDumpFile = "ssa.html"
 
 func initssaconfig() {
@@ -125,7 +126,7 @@ func buildssa(fn *Node, worker int) *ssa.Func {
 
        fe := ssafn{
                curfn: fn,
-               log:   printssa,
+               log:   printssa && ssaDumpStdout,
        }
        s.curfn = fn
 
@@ -4873,7 +4874,8 @@ func genssa(f *ssa.Func, pp *Progs) {
        var progToBlock map[*obj.Prog]*ssa.Block
        var valueToProgAfter []*obj.Prog // The first Prog following computation of a value v; v is visible at this point.
        var logProgs = e.log
-       if logProgs {
+       if f.HTMLWriter != nil {
+               // logProgs can be false, meaning that we do not dump to the Stdout.
                progToValue = make(map[*obj.Prog]*ssa.Value, f.NumValues())
                progToBlock = make(map[*obj.Prog]*ssa.Block, f.NumBlocks())
                f.Logf("genssa %s\n", f.Name)
@@ -5042,42 +5044,36 @@ func genssa(f *ssa.Func, pp *Progs) {
                        }
                        f.Logf(" %-6s\t%.5d (%s)\t%s\n", s, p.Pc, p.InnermostLineNumber(), p.InstructionString())
                }
-               if f.HTMLWriter != nil {
-                       // LineHist is defunct now - this code won't do
-                       // anything.
-                       // TODO: fix this (ideally without a global variable)
-                       // saved := pp.Text.Ctxt.LineHist.PrintFilenameOnly
-                       // pp.Text.Ctxt.LineHist.PrintFilenameOnly = true
-                       var buf bytes.Buffer
-                       buf.WriteString("<code>")
-                       buf.WriteString("<dl class=\"ssa-gen\">")
-                       filename := ""
-                       for p := pp.Text; p != nil; p = p.Link {
-                               // Don't spam every line with the file name, which is often huge.
-                               // Only print changes, and "unknown" is not a change.
-                               if p.Pos.IsKnown() && p.InnermostFilename() != filename {
-                                       filename = p.InnermostFilename()
-                                       buf.WriteString("<dt class=\"ssa-prog-src\"></dt><dd class=\"ssa-prog\">")
-                                       buf.WriteString(html.EscapeString("# " + filename))
-                                       buf.WriteString("</dd>")
-                               }
-
-                               buf.WriteString("<dt class=\"ssa-prog-src\">")
-                               if v, ok := progToValue[p]; ok {
-                                       buf.WriteString(v.HTML())
-                               } else if b, ok := progToBlock[p]; ok {
-                                       buf.WriteString("<b>" + b.HTML() + "</b>")
-                               }
-                               buf.WriteString("</dt>")
-                               buf.WriteString("<dd class=\"ssa-prog\">")
-                               buf.WriteString(fmt.Sprintf("%.5d <span class=\"l%v line-number\">(%s)</span> %s", p.Pc, p.InnermostLineNumber(), p.InnermostLineNumberHTML(), html.EscapeString(p.InstructionString())))
+       }
+       if f.HTMLWriter != nil {
+               var buf bytes.Buffer
+               buf.WriteString("<code>")
+               buf.WriteString("<dl class=\"ssa-gen\">")
+               filename := ""
+               for p := pp.Text; p != nil; p = p.Link {
+                       // Don't spam every line with the file name, which is often huge.
+                       // Only print changes, and "unknown" is not a change.
+                       if p.Pos.IsKnown() && p.InnermostFilename() != filename {
+                               filename = p.InnermostFilename()
+                               buf.WriteString("<dt class=\"ssa-prog-src\"></dt><dd class=\"ssa-prog\">")
+                               buf.WriteString(html.EscapeString("# " + filename))
                                buf.WriteString("</dd>")
                        }
-                       buf.WriteString("</dl>")
-                       buf.WriteString("</code>")
-                       f.HTMLWriter.WriteColumn("genssa", "genssa", "ssa-prog", buf.String())
-                       // pp.Text.Ctxt.LineHist.PrintFilenameOnly = saved
+
+                       buf.WriteString("<dt class=\"ssa-prog-src\">")
+                       if v, ok := progToValue[p]; ok {
+                               buf.WriteString(v.HTML())
+                       } else if b, ok := progToBlock[p]; ok {
+                               buf.WriteString("<b>" + b.HTML() + "</b>")
+                       }
+                       buf.WriteString("</dt>")
+                       buf.WriteString("<dd class=\"ssa-prog\">")
+                       buf.WriteString(fmt.Sprintf("%.5d <span class=\"l%v line-number\">(%s)</span> %s", p.Pc, p.InnermostLineNumber(), p.InnermostLineNumberHTML(), html.EscapeString(p.InstructionString())))
+                       buf.WriteString("</dd>")
                }
+               buf.WriteString("</dl>")
+               buf.WriteString("</code>")
+               f.HTMLWriter.WriteColumn("genssa", "genssa", "ssa-prog", buf.String())
        }
 
        defframe(&s, e)
@@ -5435,7 +5431,7 @@ type ssafn struct {
        scratchFpMem *Node                  // temp for floating point register / memory moves on some architectures
        stksize      int64                  // stack size for current frame
        stkptrsize   int64                  // prefix of stack containing pointers
-       log          bool
+       log          bool                   // print ssa debug to the stdout
 }
 
 // StringData returns a symbol (a *types.Sym wrapped in an interface) which
index 7f75dc4a03d5dad2e2475d9e43a5352ca96c82da..8b5d6d94e8d4610bcbc3f103f2fd130ac8ba4d48 100644 (file)
@@ -42,7 +42,9 @@ func Compile(f *Func) {
        }()
 
        // Run all the passes
-       printFunc(f)
+       if f.Log() {
+               printFunc(f)
+       }
        f.HTMLWriter.WriteFunc("start", "start", f)
        if BuildDump != "" && BuildDump == f.Name {
                f.dumpFile("build")
@@ -84,8 +86,10 @@ func Compile(f *Func) {
                                stats = fmt.Sprintf("[%d ns]", time)
                        }
 
-                       f.Logf("  pass %s end %s\n", p.name, stats)
-                       printFunc(f)
+                       if f.Log() {
+                               f.Logf("  pass %s end %s\n", p.name, stats)
+                               printFunc(f)
+                       }
                        f.HTMLWriter.WriteFunc(phaseName, fmt.Sprintf("%s <span class=\"stats\">%s</span>", phaseName, stats), f)
                }
                if p.time || p.mem {
index 812590934920bb7026c5526844350a2c66fdc631..2e48e8105b14627f394bf8bd007d707dfe927a07 100644 (file)
@@ -11,12 +11,14 @@ import (
        "html"
        "io"
        "os"
+       "path/filepath"
        "strings"
 )
 
 type HTMLWriter struct {
        Logger
-       w io.WriteCloser
+       w    io.WriteCloser
+       path string
 }
 
 func NewHTMLWriter(path string, logger Logger, funcname string) *HTMLWriter {
@@ -24,7 +26,11 @@ func NewHTMLWriter(path string, logger Logger, funcname string) *HTMLWriter {
        if err != nil {
                logger.Fatalf(src.NoXPos, "%v", err)
        }
-       html := HTMLWriter{w: out, Logger: logger}
+       pwd, err := os.Getwd()
+       if err != nil {
+               logger.Fatalf(src.NoXPos, "%v", err)
+       }
+       html := HTMLWriter{w: out, Logger: logger, path: filepath.Join(pwd, path)}
        html.start(funcname)
        return &html
 }
@@ -439,6 +445,7 @@ func (w *HTMLWriter) Close() {
        io.WriteString(w.w, "</body>")
        io.WriteString(w.w, "</html>")
        w.w.Close()
+       fmt.Printf("dumped SSA to %v\n", w.path)
 }
 
 // WriteFunc writes f in a column headed by title.