Commit b5b35be2 authored by Austin Clements's avatar Austin Clements

cmd/compile: don't inline functions that call recover

recover determines whether it's being called by a deferred frame by
matching its caller's argument frame pointer with the one recorded in
the panic object. That means its caller needs a valid and unique
argument frame pointer, so it must not be inlined.

With this fix, test/recover.go passes with -l=4.

Fixes #23557.

Change-Id: I1f32a624c49e387cfc67893a0829bb248d69c3d4
Reviewed-on: https://go-review.googlesource.com/90035
Run-TryBot: Austin Clements <austin@google.com>
Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 651ddbdb
...@@ -314,12 +314,18 @@ func (v *hairyVisitor) visit(n *Node) bool { ...@@ -314,12 +314,18 @@ func (v *hairyVisitor) visit(n *Node) bool {
} }
// Things that are too hairy, irrespective of the budget // Things that are too hairy, irrespective of the budget
case OCALL, OCALLINTER, OPANIC, ORECOVER: case OCALL, OCALLINTER, OPANIC:
if Debug['l'] < 4 { if Debug['l'] < 4 {
v.reason = "non-leaf op " + n.Op.String() v.reason = "non-leaf op " + n.Op.String()
return true return true
} }
case ORECOVER:
// recover matches the argument frame pointer to find
// the right panic value, so it needs an argument frame.
v.reason = "call to recover"
return true
case OCLOSURE, case OCLOSURE,
OCALLPART, OCALLPART,
ORANGE, ORANGE,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment