• Cherry Zhang's avatar
    cmd/internal/obj/arm64: make function epilogue async-signal safe · 47232f0d
    Cherry Zhang authored
    When the frame size is large, we generate
    
    MOVD.P	0xf0(SP), LR
    ADD	$(framesize-0xf0), SP
    
    This is problematic: after the first instruction, we have a
    partial frame of size (framesize-0xf0). If we try to unwind the
    stack at this point, we'll try to read the LR from the stack at
    0(SP) (the new SP) as the frame size is not 0. But this slot does
    not contain a valid LR.
    
    Fix this by not changing SP in two instructions. Instead,
    generate
    
    MOVD	(SP), LR
    ADD	$framesize, SP
    
    This affects not only async preemption but also profiling. So we
    change the generated instructions, instead of marking unsafe
    point.
    
    Change-Id: I4e78c62d50ffc4acff70ccfbfec16a5ccae17f24
    Reviewed-on: https://go-review.googlesource.com/c/go/+/206057
    Run-TryBot: Cherry Zhang <cherryyz@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
    47232f0d
obj7.go 24.6 KB