diff options
| author | David Chase <drchase@google.com> | 2025-02-19 16:47:31 -0500 |
|---|---|---|
| committer | David Chase <drchase@google.com> | 2025-02-25 08:35:38 -0800 |
| commit | c2ae5c7443fc8bda1d2b06390d4b439e81fb4b09 (patch) | |
| tree | ac228294c6dd1555af397d362b135aa6695e32f3 /src/runtime/asm_wasm.s | |
| parent | 6adf08f747aff60810e754ca74e1bef381cbae86 (diff) | |
| download | go-c2ae5c7443fc8bda1d2b06390d4b439e81fb4b09.tar.xz | |
cmd/compile, runtime: use PC of deferreturn for panic transfer
this removes the old conditional-on-register-value
handshake from the deferproc/deferprocstack logic.
The "line" for the recovery-exit frame itself (not the defers
that it runs) is the closing brace of the function.
Reduces code size slightly (e.g. go command is 0.2% smaller)
Sample output showing effect of this change, also what sort of
code it requires to observe the effect:
```
package main
import "os"
func main() {
g(len(os.Args) - 1) // stack[0]
}
var gi int
var pi *int = &gi
//go:noinline
func g(i int) {
switch i {
case 0:
defer func() {
println("g0", i)
q() // stack[2] if i == 0
}()
for j := *pi; j < 1; j++ {
defer func() {
println("recover0", recover().(string))
}()
}
default:
for j := *pi; j < 1; j++ {
defer func() {
println("g1", i)
q() // stack[2] if i == 1
}()
}
defer func() {
println("recover1", recover().(string))
}()
}
p()
} // stack[1] (deferreturn)
//go:noinline
func p() {
panic("p()")
}
//go:noinline
func q() {
panic("q()") // stack[3]
}
/* Sample output for "./foo foo":
recover1 p()
g1 1
panic: q()
goroutine 1 [running]:
main.q()
.../main.go:46 +0x2c
main.g.func3()
.../main.go:29 +0x48
main.g(0x1?)
.../main.go:37 +0x68
main.main()
.../main.go:6 +0x28
*/
```
Change-Id: Ie39ea62ecc244213500380ea06d44024cadc2317
Reviewed-on: https://go-review.googlesource.com/c/go/+/650795
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/runtime/asm_wasm.s')
| -rw-r--r-- | src/runtime/asm_wasm.s | 4 |
1 files changed, 0 insertions, 4 deletions
diff --git a/src/runtime/asm_wasm.s b/src/runtime/asm_wasm.s index 69da583a1d..247368d127 100644 --- a/src/runtime/asm_wasm.s +++ b/src/runtime/asm_wasm.s @@ -195,10 +195,6 @@ TEXT runtime·memhash32(SB),NOSPLIT|NOFRAME,$0-24 TEXT runtime·memhash64(SB),NOSPLIT|NOFRAME,$0-24 JMP runtime·memhash64Fallback(SB) -TEXT runtime·return0(SB), NOSPLIT, $0-0 - MOVD $0, RET0 - RET - TEXT runtime·asminit(SB), NOSPLIT, $0-0 // No per-thread init. RET |
