From b5b35be2b8a73b404290f7d0d4c14912a707f9a0 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 25 Jan 2018 17:22:41 -0500 Subject: [PATCH] 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 Reviewed-by: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/inl.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index 2f96b46f2b..c8296971cd 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -314,12 +314,18 @@ func (v *hairyVisitor) visit(n *Node) bool { } // Things that are too hairy, irrespective of the budget - case OCALL, OCALLINTER, OPANIC, ORECOVER: + case OCALL, OCALLINTER, OPANIC: if Debug['l'] < 4 { v.reason = "non-leaf op " + n.Op.String() 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, OCALLPART, ORANGE,