mirror of https://github.com/golang/go.git
runtime: support nil libcall.args when calling stdcall on Windows
Having to pass a dummy pointer to the libcall.args field is a bit annoying. This change allows nil to be passed instead. windows/arm and windows/arm64 already support nil libcall.args. Change-Id: I07a2bdb7d1f76b13d125397ff5177337c43536a3 Reviewed-on: https://go-review.googlesource.com/c/go/+/526016 Reviewed-by: Ian Lance Taylor <iant@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Bryan Mills <bcmills@google.com>
This commit is contained in:
parent
3a124de515
commit
1d538f198d
|
|
@ -985,7 +985,7 @@ func stdcall(fn stdFunction) uintptr {
|
|||
func stdcall0(fn stdFunction) uintptr {
|
||||
mp := getg().m
|
||||
mp.libcall.n = 0
|
||||
mp.libcall.args = uintptr(noescape(unsafe.Pointer(&fn))) // it's unused but must be non-nil, otherwise crashes
|
||||
mp.libcall.args = 0
|
||||
return stdcall(fn)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,13 +14,18 @@
|
|||
// void runtime·asmstdcall(void *c);
|
||||
TEXT runtime·asmstdcall(SB),NOSPLIT,$0
|
||||
MOVL fn+0(FP), BX
|
||||
MOVL SP, BP // save stack pointer
|
||||
|
||||
// SetLastError(0).
|
||||
MOVL $0, 0x34(FS)
|
||||
|
||||
MOVL libcall_n(BX), CX
|
||||
|
||||
// Fast version, do not store args on the stack.
|
||||
CMPL CX, $0
|
||||
JE docall
|
||||
|
||||
// Copy args to the stack.
|
||||
MOVL SP, BP
|
||||
MOVL libcall_n(BX), CX // words
|
||||
MOVL CX, AX
|
||||
SALL $2, AX
|
||||
SUBL AX, SP // room for args
|
||||
|
|
@ -29,6 +34,7 @@ TEXT runtime·asmstdcall(SB),NOSPLIT,$0
|
|||
CLD
|
||||
REP; MOVSL
|
||||
|
||||
docall:
|
||||
// Call stdcall or cdecl function.
|
||||
// DI SI BP BX are preserved, SP is not
|
||||
CALL libcall_fn(BX)
|
||||
|
|
|
|||
|
|
@ -29,6 +29,11 @@ TEXT runtime·asmstdcall(SB),NOSPLIT,$16
|
|||
|
||||
SUBQ $(const_maxArgs*8), SP // room for args
|
||||
|
||||
// Fast version, do not store args on the stack nor
|
||||
// load them into registers.
|
||||
CMPL CX, $0
|
||||
JE docall
|
||||
|
||||
// Fast version, do not store args on the stack.
|
||||
CMPL CX, $4
|
||||
JLE loadregs
|
||||
|
|
@ -59,6 +64,7 @@ loadregs:
|
|||
MOVQ R8, X2
|
||||
MOVQ R9, X3
|
||||
|
||||
docall:
|
||||
// Call stdcall function.
|
||||
CALL AX
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue