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)
|
MOVQ SI, _rt0_amd64_lib_argv<>(SB)
|
||||||
|
|
||||||
// Synchronous initialization.
|
// 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)
|
CALL runtime·libpreinit(SB)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Create a new thread to finish Go runtime initialization.
|
// Create a new thread to finish Go runtime initialization.
|
||||||
MOVQ _cgo_sys_thread_create(SB), AX
|
MOVQ _cgo_sys_thread_create(SB), AX
|
||||||
|
@ -45,12 +50,23 @@ TEXT _rt0_amd64_lib(SB),NOSPLIT|NOFRAME,$0
|
||||||
JZ nocgo
|
JZ nocgo
|
||||||
|
|
||||||
// We're calling back to C.
|
// 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
|
MOVQ SP, BX // Callee-save in C ABI
|
||||||
ANDQ $~15, SP
|
ANDQ $~15, SP
|
||||||
MOVQ $_rt0_amd64_lib_go(SB), DI
|
MOVQ $_rt0_amd64_lib_go(SB), DI
|
||||||
MOVQ $0, SI
|
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
|
CALL AX
|
||||||
|
#ifdef GOOS_windows
|
||||||
|
ADJSP $-32 // just to make the assembler not complain about unbalanced stack
|
||||||
|
#endif
|
||||||
MOVQ BX, SP
|
MOVQ BX, SP
|
||||||
JMP restore
|
JMP restore
|
||||||
|
|
||||||
|
|
|
@ -12,33 +12,8 @@ TEXT _rt0_386_windows(SB),NOSPLIT,$0
|
||||||
// library is loaded. For static 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
|
// final executable starts, during the C runtime initialization
|
||||||
// phase.
|
// phase.
|
||||||
TEXT _rt0_386_windows_lib(SB),NOSPLIT,$0x1C
|
TEXT _rt0_386_windows_lib(SB),NOSPLIT,$0
|
||||||
MOVL BP, 0x08(SP)
|
JMP _rt0_386_lib(SB)
|
||||||
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 _main(SB),NOSPLIT,$0
|
TEXT _main(SB),NOSPLIT,$0
|
||||||
// Remove the return address from the stack.
|
// Remove the return address from the stack.
|
||||||
|
|
|
@ -6,31 +6,10 @@
|
||||||
#include "go_tls.h"
|
#include "go_tls.h"
|
||||||
#include "textflag.h"
|
#include "textflag.h"
|
||||||
|
|
||||||
TEXT _rt0_amd64_windows(SB),NOSPLIT|NOFRAME,$-8
|
TEXT _rt0_amd64_windows(SB),NOSPLIT,$0
|
||||||
JMP _rt0_amd64(SB)
|
JMP _rt0_amd64(SB)
|
||||||
|
|
||||||
// When building with -buildmode=(c-shared or c-archive), this
|
// When building with -buildmode=(c-shared or c-archive), this
|
||||||
// symbol is called. For dynamic libraries it is called when the
|
// symbol is called.
|
||||||
// library is loaded. For static libraries it is called when the
|
TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0
|
||||||
// final executable starts, during the C runtime initialization
|
JMP _rt0_amd64_lib(SB)
|
||||||
// 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
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue