]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use common library entry point on windows amd64/386
authorqmuntal <quimmuntal@gmail.com>
Tue, 23 Sep 2025 16:19:47 +0000 (18:19 +0200)
committerQuim Muntal <quimmuntal@gmail.com>
Fri, 26 Sep 2025 06:48:32 +0000 (23:48 -0700)
Windows can reuse the common library entry point instead of implementing
a its own version. Note that windows/arm64 already uses the common one.

Change-Id: I1a27bbec04bfd1d58a136638bafcdc0583bd106f
Reviewed-on: https://go-review.googlesource.com/c/go/+/706235
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/runtime/asm_amd64.s
src/runtime/rt0_windows_386.s
src/runtime/rt0_windows_amd64.s

index cf1d49a4ad82d4b4c1e491c8d7fd663e3b35f5a3..525df96f0028f6452e632a59edc7a8dca57dc62a 100644 (file)
@@ -37,7 +37,12 @@ TEXT _rt0_amd64_lib(SB),NOSPLIT|NOFRAME,$0
        MOVQ    SI, _rt0_amd64_lib_argv<>(SB)
 
        // Synchronous initialization.
+#ifndef GOOS_windows
+       // Avoid calling it on Windows because it is not used
+       // and it would crash the application due to the autogenerated
+       // ABI wrapper trying to access a non-existent TLS slot.
        CALL    runtime·libpreinit(SB)
+#endif
 
        // Create a new thread to finish Go runtime initialization.
        MOVQ    _cgo_sys_thread_create(SB), AX
@@ -45,12 +50,23 @@ TEXT _rt0_amd64_lib(SB),NOSPLIT|NOFRAME,$0
        JZ      nocgo
 
        // We're calling back to C.
-       // Align stack per ELF ABI requirements.
+       // Align stack per C ABI requirements.
        MOVQ    SP, BX  // Callee-save in C ABI
        ANDQ    $~15, SP
        MOVQ    $_rt0_amd64_lib_go(SB), DI
        MOVQ    $0, SI
+#ifdef GOOS_windows
+       // For Windows ABI
+       MOVQ    DI, CX
+       MOVQ    SI, DX
+       // Leave space for four words on the stack as required
+       // by the Windows amd64 calling convention.
+       ADJSP   $32
+#endif
        CALL    AX
+#ifdef GOOS_windows
+       ADJSP   $-32 // just to make the assembler not complain about unbalanced stack
+#endif
        MOVQ    BX, SP
        JMP     restore
 
index fa39edd787c3d5d71b2443e0ef0a49061f53cd54..bb92a99f6bac5bf6d3a4fa29a974c2acce646fcb 100644 (file)
@@ -12,33 +12,8 @@ TEXT _rt0_386_windows(SB),NOSPLIT,$0
 // library is loaded. For static libraries it is called when the
 // final executable starts, during the C runtime initialization
 // phase.
-TEXT _rt0_386_windows_lib(SB),NOSPLIT,$0x1C
-       MOVL    BP, 0x08(SP)
-       MOVL    BX, 0x0C(SP)
-       MOVL    AX, 0x10(SP)
-       MOVL  CX, 0x14(SP)
-       MOVL  DX, 0x18(SP)
-
-       // Create a new thread to do the runtime initialization and return.
-       MOVL    _cgo_sys_thread_create(SB), AX
-       MOVL    $_rt0_386_windows_lib_go(SB), 0x00(SP)
-       MOVL    $0, 0x04(SP)
-
-        // Top two items on the stack are passed to _cgo_sys_thread_create
-        // as parameters. This is the calling convention on 32-bit Windows.
-       CALL    AX
-
-       MOVL    0x08(SP), BP
-       MOVL    0x0C(SP), BX
-       MOVL    0x10(SP), AX
-       MOVL    0x14(SP), CX
-       MOVL    0x18(SP), DX
-       RET
-
-TEXT _rt0_386_windows_lib_go(SB),NOSPLIT,$0
-       PUSHL   $0
-       PUSHL   $0
-       JMP     runtime·rt0_go(SB)
+TEXT _rt0_386_windows_lib(SB),NOSPLIT,$0
+       JMP     _rt0_386_lib(SB)
 
 TEXT _main(SB),NOSPLIT,$0
        // Remove the return address from the stack.
index bd18bdd311e6dd4a92fa65c9db83fc6d285caacc..09869c534cb9c45a2989035f58ef9827832ce1ba 100644 (file)
@@ -6,31 +6,10 @@
 #include "go_tls.h"
 #include "textflag.h"
 
-TEXT _rt0_amd64_windows(SB),NOSPLIT|NOFRAME,$-8
+TEXT _rt0_amd64_windows(SB),NOSPLIT,$0
        JMP     _rt0_amd64(SB)
 
 // When building with -buildmode=(c-shared or c-archive), this
-// symbol is called. For dynamic libraries it is called when the
-// library is loaded. For static libraries it is called when the
-// final executable starts, during the C runtime initialization
-// phase.
-// Leave space for four pointers on the stack as required
-// by the Windows amd64 calling convention.
-TEXT _rt0_amd64_windows_lib(SB),NOSPLIT|NOFRAME,$40
-       // Create a new thread to do the runtime initialization and return.
-       MOVQ    BX, 32(SP) // callee-saved, preserved across the CALL
-       MOVQ    SP, BX
-       ANDQ    $~15, SP // alignment as per Windows requirement
-       MOVQ    _cgo_sys_thread_create(SB), AX
-       MOVQ    $_rt0_amd64_windows_lib_go(SB), CX
-       MOVQ    $0, DX
-       CALL    AX
-       MOVQ    BX, SP
-       MOVQ    32(SP), BX
-       RET
-
-TEXT _rt0_amd64_windows_lib_go(SB),NOSPLIT|NOFRAME,$0
-       MOVQ  $0, DI
-       MOVQ    $0, SI
-       MOVQ    $runtime·rt0_go(SB), AX
-       JMP     AX
+// symbol is called.
+TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0
+       JMP     _rt0_amd64_lib(SB)