mirror of
https://github.com/golang/go
synced 2024-11-25 02:27:56 -07:00
runtime: increase stack frame during cgo call on windows/amd64
Fixes #3945. R=golang-dev, minux.ma CC=golang-dev, vcc.163 https://golang.org/cl/6490056
This commit is contained in:
parent
1a5cf867ce
commit
7f075ece42
@ -29,5 +29,6 @@ func TestSetEnv(t *testing.T) { testSetEnv(t) }
|
|||||||
func TestHelpers(t *testing.T) { testHelpers(t) }
|
func TestHelpers(t *testing.T) { testHelpers(t) }
|
||||||
func TestLibgcc(t *testing.T) { testLibgcc(t) }
|
func TestLibgcc(t *testing.T) { testLibgcc(t) }
|
||||||
func Test1635(t *testing.T) { test1635(t) }
|
func Test1635(t *testing.T) { test1635(t) }
|
||||||
|
func TestPrintf(t *testing.T) { testPrintf(t) }
|
||||||
|
|
||||||
func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
|
func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
|
||||||
|
22
misc/cgo/test/issue3945.go
Normal file
22
misc/cgo/test/issue3945.go
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// Copyright 2012 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package cgotest
|
||||||
|
|
||||||
|
// Test that cgo reserves enough stack space during cgo call.
|
||||||
|
// See http://golang.org/issue/3945 for details.
|
||||||
|
|
||||||
|
// #include <stdio.h>
|
||||||
|
//
|
||||||
|
// void say() {
|
||||||
|
// printf("%s from C\n", "hello");
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func testPrintf(t *testing.T) {
|
||||||
|
C.say()
|
||||||
|
}
|
@ -489,19 +489,21 @@ TEXT runtime·asmcgocall(SB),7,$0
|
|||||||
MOVQ (g_sched+gobuf_sp)(SI), SP
|
MOVQ (g_sched+gobuf_sp)(SI), SP
|
||||||
|
|
||||||
// Now on a scheduling stack (a pthread-created stack).
|
// Now on a scheduling stack (a pthread-created stack).
|
||||||
SUBQ $48, SP
|
// Make sure we have enough room for 4 stack-backed fast-call
|
||||||
|
// registers as per windows amd64 calling convention.
|
||||||
|
SUBQ $64, SP
|
||||||
ANDQ $~15, SP // alignment for gcc ABI
|
ANDQ $~15, SP // alignment for gcc ABI
|
||||||
MOVQ DI, 32(SP) // save g
|
MOVQ DI, 48(SP) // save g
|
||||||
MOVQ DX, 24(SP) // save SP
|
MOVQ DX, 40(SP) // save SP
|
||||||
MOVQ BX, DI // DI = first argument in AMD64 ABI
|
MOVQ BX, DI // DI = first argument in AMD64 ABI
|
||||||
MOVQ BX, CX // CX = first argument in Win64
|
MOVQ BX, CX // CX = first argument in Win64
|
||||||
CALL AX
|
CALL AX
|
||||||
|
|
||||||
// Restore registers, g, stack pointer.
|
// Restore registers, g, stack pointer.
|
||||||
get_tls(CX)
|
get_tls(CX)
|
||||||
MOVQ 32(SP), DI
|
MOVQ 48(SP), DI
|
||||||
MOVQ DI, g(CX)
|
MOVQ DI, g(CX)
|
||||||
MOVQ 24(SP), SP
|
MOVQ 40(SP), SP
|
||||||
RET
|
RET
|
||||||
|
|
||||||
// cgocallback(void (*fn)(void*), void *frame, uintptr framesize)
|
// cgocallback(void (*fn)(void*), void *frame, uintptr framesize)
|
||||||
|
Loading…
Reference in New Issue
Block a user