From b345a306a0258085b65081cf2dadc238dc7e26ee Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 5 Apr 2021 20:41:56 -0400 Subject: [PATCH] cmd/compile: when GOSSAFUNC is set, dump the current pass on crash 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 Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Than McIntosh Reviewed-by: David Chase --- src/cmd/compile/internal/ssa/func.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/ssa/func.go b/src/cmd/compile/internal/ssa/func.go index ebbcea598b3..819d7573d6b 100644 --- a/src/cmd/compile/internal/ssa/func.go +++ b/src/cmd/compile/internal/ssa/func.go @@ -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 %s", 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 {