mirror of
https://github.com/golang/go.git
synced 2025-10-19 19:13:18 +00:00
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:
parent
e8a4f508d1
commit
fdea7da3e6
3 changed files with 23 additions and 53 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue