1
0
mirror of https://github.com/golang/go synced 2024-11-26 18:06:55 -07:00

[dev.regabi] cmd/compile: fix ICE during ir.Dump

fmt.go:dumpNodeHeader uses reflection to call all "func() bool"-typed
methods on Nodes during printing, but the OnStack method that I added
in CL 283233 isn't meant to be called on non-variables.

dumpNodeHeader does already guard against panics, as happen in some
other accessors, but not against Fatalf, as I was using in OnStack. So
simply change OnStack to use panic too.

Thanks to drchase@ for the report.

Change-Id: I0cfac84a96292193401a32fc5e7fd3c48773e008
Reviewed-on: https://go-review.googlesource.com/c/go/+/284074
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
Matthew Dempsky 2021-01-14 19:40:07 -08:00
parent 35b9c66601
commit 4be7af23f9

View File

@ -286,19 +286,18 @@ func (n *Name) SetLibfuzzerExtraCounter(b bool) { n.flags.set(nameLibfuzzerExtra
// OnStack reports whether variable n may reside on the stack. // OnStack reports whether variable n may reside on the stack.
func (n *Name) OnStack() bool { func (n *Name) OnStack() bool {
if n.Op() != ONAME || n.Class == PFUNC { if n.Op() == ONAME {
base.Fatalf("%v is not a variable", n)
}
switch n.Class { switch n.Class {
case PPARAM, PPARAMOUT, PAUTO: case PPARAM, PPARAMOUT, PAUTO:
return n.Esc() != EscHeap return n.Esc() != EscHeap
case PEXTERN, PAUTOHEAP: case PEXTERN, PAUTOHEAP:
return false return false
default:
base.FatalfAt(n.Pos(), "%v has unknown class %v", n, n.Class)
panic("unreachable")
} }
} }
// Note: fmt.go:dumpNodeHeader calls all "func() bool"-typed
// methods, but it can only recover from panics, not Fatalf.
panic(fmt.Sprintf("%v: not a variable: %v", base.FmtPos(n.Pos()), n))
}
// MarkReadonly indicates that n is an ONAME with readonly contents. // MarkReadonly indicates that n is an ONAME with readonly contents.
func (n *Name) MarkReadonly() { func (n *Name) MarkReadonly() {