]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: call cgocallbackg indirectly
authorCherry Zhang <cherryyz@google.com>
Thu, 22 Apr 2021 15:12:21 +0000 (11:12 -0400)
committerCherry Zhang <cherryyz@google.com>
Thu, 22 Apr 2021 16:15:44 +0000 (16:15 +0000)
cgocallback calls cgocallbackg after switching the stack. Call it
indirectly to bypass the linker's nosplit check.

Apparently (at least on Windows) cgocallbackg can use quite a bit
stack space in a nosplit chain. We have been running over the
nosplit limit, or very close to the limit. Since it switches
stack in cgocallback, it is not meaningful to count frames above
cgocallback and below cgocallbackg together. Bypass the check.

For #45658.

Change-Id: Ie22017e3f82d2c1fcc37336696f2d02757856399
Reviewed-on: https://go-review.googlesource.com/c/go/+/312669
Trust: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>

src/runtime/asm_amd64.s

index d2848e5a451f6123373b634d92e4d1c121d8a5a1..789e159c765355465a6984e2eed02f052f4d3f93 100644 (file)
@@ -911,7 +911,8 @@ havem:
        MOVQ    BX, 0(SP)
        MOVQ    CX, 8(SP)
        MOVQ    DX, 16(SP)
-       CALL    runtime·cgocallbackg(SB)
+       MOVQ    $runtime·cgocallbackg(SB), AX
+       CALL    AX      // indirect call to bypass nosplit check. We're on a different stack now.
 
        // Compute the size of the frame again. FP and SP have
        // completely different values here than they did above,