]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't inline functions that call recover
authorAustin Clements <austin@google.com>
Thu, 25 Jan 2018 22:22:41 +0000 (17:22 -0500)
committerAustin Clements <austin@google.com>
Thu, 25 Jan 2018 23:15:55 +0000 (23:15 +0000)
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: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/inl.go

index 2f96b46f2be35d084166bdd886f4309de63c59ae..c8296971cd3da008077fa2e46da2774a9948c67a 100644 (file)
@@ -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,