]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1] runtime: increase stack frame during cgo call on windows/amd64
authorAndrew Gerrand <adg@golang.org>
Fri, 21 Sep 2012 19:54:59 +0000 (05:54 +1000)
committerAndrew Gerrand <adg@golang.org>
Fri, 21 Sep 2012 19:54:59 +0000 (05:54 +1000)
misc/cgo/test/cgo_test.go
misc/cgo/test/issue3945.go [new file with mode: 0644]
src/pkg/runtime/asm_amd64.s

index 72673bbd8020640364e55f1921d511299bc11335..67b54f04e5d5cd6776eb88fbdc84b5674e731873 100644 (file)
@@ -28,5 +28,6 @@ func TestParallelSleep(t *testing.T)       { testParallelSleep(t) }
 func TestSetEnv(t *testing.T)              { testSetEnv(t) }
 func TestHelpers(t *testing.T)             { testHelpers(t) }
 func Test1635(t *testing.T)                { test1635(t) }
+func TestPrintf(t *testing.T)              { testPrintf(t) }
 
 func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
diff --git a/misc/cgo/test/issue3945.go b/misc/cgo/test/issue3945.go
new file mode 100644 (file)
index 0000000..331cd0b
--- /dev/null
@@ -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()
+}
index d41ab96d022f60025a28f4cfc28ff355693f7745..2bf9f7eb9f8c728aac02db6d3d7293c0a881c8ed 100644 (file)
@@ -446,19 +446,21 @@ TEXT runtime·asmcgocall(SB),7,$0
        MOVQ    (g_sched+gobuf_sp)(SI), SP
 
        // 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
-       MOVQ    DI, 32(SP)      // save g
-       MOVQ    DX, 24(SP)      // save SP
+       MOVQ    DI, 48(SP)      // save g
+       MOVQ    DX, 40(SP)      // save SP
        MOVQ    BX, DI          // DI = first argument in AMD64 ABI
        MOVQ    BX, CX          // CX = first argument in Win64
        CALL    AX
 
        // Restore registers, g, stack pointer.
        get_tls(CX)
-       MOVQ    32(SP), DI
+       MOVQ    48(SP), DI
        MOVQ    DI, g(CX)
-       MOVQ    24(SP), SP
+       MOVQ    40(SP), SP
        RET
 
 // cgocallback(void (*fn)(void*), void *frame, uintptr framesize)