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>
This commit is contained in:
qmuntal 2025-09-23 18:19:47 +02:00 committed by Quim Muntal
parent e8a4f508d1
commit fdea7da3e6
3 changed files with 23 additions and 53 deletions

View 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

View 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.

View 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)