aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorqmuntal <quimmuntal@gmail.com>2025-09-23 18:19:47 +0200
committerQuim Muntal <quimmuntal@gmail.com>2025-09-25 23:48:32 -0700
commitfdea7da3e68b66514c7466696ecb6b034224ded0 (patch)
treead3565f1139cc25d3c241671d1fc18c25b485fbd /src/runtime
parente8a4f508d1140eef70463c6c085c352418e03d9c (diff)
downloadgo-fdea7da3e68b66514c7466696ecb6b034224ded0.tar.xz
runtime: use common library entry point on windows amd64/386
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>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/asm_amd64.s18
-rw-r--r--src/runtime/rt0_windows_386.s29
-rw-r--r--src/runtime/rt0_windows_amd64.s29
3 files changed, 23 insertions, 53 deletions
diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s
index cf1d49a4ad..525df96f00 100644
--- a/src/runtime/asm_amd64.s
+++ b/src/runtime/asm_amd64.s
@@ -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
diff --git a/src/runtime/rt0_windows_386.s b/src/runtime/rt0_windows_386.s
index fa39edd787..bb92a99f6b 100644
--- a/src/runtime/rt0_windows_386.s
+++ b/src/runtime/rt0_windows_386.s
@@ -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.
diff --git a/src/runtime/rt0_windows_amd64.s b/src/runtime/rt0_windows_amd64.s
index bd18bdd311..09869c534c 100644
--- a/src/runtime/rt0_windows_amd64.s
+++ b/src/runtime/rt0_windows_amd64.s
@@ -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)