]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: when GOSSAFUNC is set, dump the current pass on crash
authorCherry Zhang <cherryyz@google.com>
Tue, 6 Apr 2021 00:41:56 +0000 (20:41 -0400)
committerCherry Zhang <cherryyz@google.com>
Tue, 6 Apr 2021 14:15:29 +0000 (14:15 +0000)
When an SSA pass ICEs, it calls f.Fatalf, which terminates the
compiler. When GOSSAFUNC is set, the current pass is not written
to ssa.html. This CL makes it write ssa.html when it calls Fatalf,
for the ease of debugging.

Change-Id: I5d55e4258f0693d89c48c0a84984f2f893b0811d
Reviewed-on: https://go-review.googlesource.com/c/go/+/307509
Trust: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/ssa/func.go

index ebbcea598b39ba0077c01733d993dba9e4bbf0c9..819d7573d6b495772200d939bad95f57319152c6 100644 (file)
@@ -653,7 +653,19 @@ func (f *Func) Frontend() Frontend                                  { return f.f
 func (f *Func) Warnl(pos src.XPos, msg string, args ...interface{}) { f.fe.Warnl(pos, msg, args...) }
 func (f *Func) Logf(msg string, args ...interface{})                { f.fe.Logf(msg, args...) }
 func (f *Func) Log() bool                                           { return f.fe.Log() }
-func (f *Func) Fatalf(msg string, args ...interface{})              { f.fe.Fatalf(f.Entry.Pos, msg, args...) }
+
+func (f *Func) Fatalf(msg string, args ...interface{}) {
+       stats := "crashed"
+       if f.Log() {
+               f.Logf("  pass %s end %s\n", f.pass.name, stats)
+               printFunc(f)
+       }
+       if f.HTMLWriter != nil {
+               f.HTMLWriter.WritePhase(f.pass.name, fmt.Sprintf("%s <span class=\"stats\">%s</span>", f.pass.name, stats))
+               f.HTMLWriter.flushPhases()
+       }
+       f.fe.Fatalf(f.Entry.Pos, msg, args...)
+}
 
 // postorder returns the reachable blocks in f in a postorder traversal.
 func (f *Func) postorder() []*Block {