]> Cypherpunks repositories - gostls13.git/commit
[release-branch.go1.24] cmd/compile, runtime: use deferreturn as target PC for recove...
authorDavid Chase <drchase@google.com>
Tue, 18 Feb 2025 22:34:24 +0000 (17:34 -0500)
committerMichael Knyszek <mknyszek@google.com>
Sat, 22 Feb 2025 02:58:02 +0000 (18:58 -0800)
commitaf236716b2308d018e021dc617ab6935459e2b42
tree88896e8b659c52fabf0a98b52174c324c8efc8c2
parent0f7b7600fbf2bda2da9fde3d538b17d9cd39f11d
[release-branch.go1.24] cmd/compile, runtime: use deferreturn as target PC for recover from deferrangefunc

The existing code for recover from deferrangefunc was broken in
several ways.

1. the code following a deferrangefunc call did not check the return
value for an out-of-band value indicating "return now" (i.e., recover
was called)

2. the returned value was delivered using a bespoke ABI that happened
to match on register-ABI platforms, but not on older stack-based
ABI.

3. the returned value was the wrong width (1 word versus 2) and
type/value(integer 1, not a pointer to anything) for deferrangefunc's
any-typed return value (in practice, the OOB value check could catch
this, but still, it's sketchy).

This -- using the deferreturn lookup method already in place for
open-coded defers -- turned out to be a much-less-ugly way of
obtaining the desired transfer of control for recover().

TODO: we also could do this for regular defer, and delete some code.

Fixes #71840

Change-Id: If7d7ea789ad4320821aab3b443759a7d71647ff0
Reviewed-on: https://go-review.googlesource.com/c/go/+/650476
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/651497
src/cmd/compile/internal/ssa/func.go
src/cmd/compile/internal/ssagen/ssa.go
src/runtime/panic.go
test/fixedbugs/issue71675.go [new file with mode: 0644]
test/fixedbugs/issue71675.out [new file with mode: 0644]