aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2012-01-20 12:59:44 +1100
committerAlex Brainman <alex.brainman@gmail.com>2012-01-20 12:59:44 +1100
commit8d6958fc041eee42e78ba3c20569c71c35795b8b (patch)
tree92e7c388f041d3dffd22de4bd30cb4aa4923283c
parent7fc4c07172b7b6feb2da345511ad439fedaf876b (diff)
downloadgo-8d6958fc041eee42e78ba3c20569c71c35795b8b.tar.gz
go-8d6958fc041eee42e78ba3c20569c71c35795b8b.zip
misc/cgo/test: make tests run on windows
- use proper Win64 gcc calling convention when calling initcgo on amd64 - increase g0 stack size to 64K on amd64 to make it the same as 386 - implement C.sleep - do not use C.stat, since it is renamed to C._stat by mingw - use fopen to implement TestErrno, since C.strtol always succeeds on windows - skip TestSetEnv on windows, because os.Setenv sets windows process environment, while C.getenv inspects internal C runtime variable instead R=golang-dev, vcc.163, rsc CC=golang-dev https://golang.org/cl/5500094
-rw-r--r--misc/cgo/test/Makefile17
-rw-r--r--misc/cgo/test/basic.go25
-rw-r--r--misc/cgo/test/env.go9
-rw-r--r--misc/cgo/test/issue1560.go2
-rw-r--r--misc/cgo/test/sleep_windows.go16
-rw-r--r--src/pkg/runtime/asm_amd64.s6
-rwxr-xr-xsrc/run.bash1
7 files changed, 59 insertions, 17 deletions
diff --git a/misc/cgo/test/Makefile b/misc/cgo/test/Makefile
index c05482e4a2..4c1680d94c 100644
--- a/misc/cgo/test/Makefile
+++ b/misc/cgo/test/Makefile
@@ -25,4 +25,21 @@ CGO_OFILES=\
OFILES=\
runtime.$O\
+ifeq ($(GOOS),windows)
+GCCVERSION=$(shell gcc -dumpversion)
+ifeq ($(GOARCH),386)
+GCCLIBDIR=/mingw/lib/gcc/mingw32/$(GCCVERSION)
+CHKSTK=_chkstk.o
+else
+GCCLIBDIR=/mingw/lib/gcc/x86_64-w64-mingw32/$(GCCVERSION)
+CHKSTK=_chkstk_ms.o
+endif
+
+CGOFILES+=sleep_windows.go
+CGO_OFILES+=$(CHKSTK)
+
+$(CHKSTK):
+ ar -x "$(GCCLIBDIR)/libgcc.a" $@
+endif
+
include ../../../src/Make.pkg
diff --git a/misc/cgo/test/basic.go b/misc/cgo/test/basic.go
index bdcee5ca0a..7aaae15222 100644
--- a/misc/cgo/test/basic.go
+++ b/misc/cgo/test/basic.go
@@ -69,17 +69,6 @@ func uuidgen() {
C.uuid_generate(&uuid[0])
}
-func Size(name string) (int64, error) {
- var st C.struct_stat
- p := C.CString(name)
- _, err := C.stat(p, &st)
- C.free(unsafe.Pointer(p))
- if err != nil {
- return 0, err
- }
- return int64(C.ulong(st.st_size)), nil
-}
-
func Strtol(s string, base int) (int, error) {
p := C.CString(s)
n, err := C.strtol(p, nil, C.int(base))
@@ -112,9 +101,17 @@ func testAtol(t *testing.T) {
}
func testErrno(t *testing.T) {
- n, err := Strtol("asdf", 123)
- if n != 0 || err != os.EINVAL {
- t.Error("Strtol: ", n, err)
+ p := C.CString("no-such-file")
+ m := C.CString("r")
+ f, err := C.fopen(p, m)
+ C.free(unsafe.Pointer(p))
+ C.free(unsafe.Pointer(m))
+ if err == nil {
+ C.fclose(f)
+ t.Fatalf("C.fopen: should fail")
+ }
+ if err != os.ENOENT {
+ t.Fatalf("C.fopen: unexpected error: ", err)
}
}
diff --git a/misc/cgo/test/env.go b/misc/cgo/test/env.go
index 1fb4e684cb..8d3ba5877b 100644
--- a/misc/cgo/test/env.go
+++ b/misc/cgo/test/env.go
@@ -10,12 +10,21 @@ package cgotest
import "C"
import (
"os"
+ "runtime"
"testing"
"unsafe"
)
// This is really an os package test but here for convenience.
func testSetEnv(t *testing.T) {
+ if runtime.GOOS == "windows" {
+ // Go uses SetEnvironmentVariable on windows. Howerver,
+ // C runtime takes a *copy* at process startup of thei
+ // OS environment, and stores it in environ/envp.
+ // It is this copy that getenv/putenv manipulate.
+ t.Logf("skipping test")
+ return
+ }
const key = "CGO_OS_TEST_KEY"
const val = "CGO_OS_TEST_VALUE"
os.Setenv(key, val)
diff --git a/misc/cgo/test/issue1560.go b/misc/cgo/test/issue1560.go
index 7168f1cf7b..833b14ae62 100644
--- a/misc/cgo/test/issue1560.go
+++ b/misc/cgo/test/issue1560.go
@@ -7,6 +7,8 @@ package cgotest
/*
#include <unistd.h>
+unsigned int sleep(unsigned int seconds);
+
extern void BackgroundSleep(int);
void twoSleep(int n) {
BackgroundSleep(n);
diff --git a/misc/cgo/test/sleep_windows.go b/misc/cgo/test/sleep_windows.go
new file mode 100644
index 0000000000..007a1bb4c8
--- /dev/null
+++ b/misc/cgo/test/sleep_windows.go
@@ -0,0 +1,16 @@
+// Copyright 2011 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
+
+/*
+#include <windows.h>
+
+unsigned int sleep(unsigned int seconds) {
+ Sleep(1000 * seconds);
+ return 0;
+}
+
+*/
+import "C"
diff --git a/src/pkg/runtime/asm_amd64.s b/src/pkg/runtime/asm_amd64.s
index 9053334993..308a66036e 100644
--- a/src/pkg/runtime/asm_amd64.s
+++ b/src/pkg/runtime/asm_amd64.s
@@ -16,7 +16,7 @@ TEXT _rt0_amd64(SB),7,$-8
// create istack out of the given (operating system) stack.
// initcgo may update stackguard.
MOVQ $runtime·g0(SB), DI
- LEAQ (-8192+104)(SP), BX
+ LEAQ (-64*1024+104)(SP), BX
MOVQ BX, g_stackguard(DI)
MOVQ SP, g_stackbase(DI)
@@ -24,7 +24,9 @@ TEXT _rt0_amd64(SB),7,$-8
MOVQ initcgo(SB), AX
TESTQ AX, AX
JZ needtls
- CALL AX // g0 already in DI
+ // g0 already in DI
+ MOVQ DI, CX // Win64 uses CX for first parameter
+ CALL AX
CMPL runtime·iswindows(SB), $0
JEQ ok
diff --git a/src/run.bash b/src/run.bash
index 2741637a80..8cc04a71fc 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -97,7 +97,6 @@ gomake clean
) || exit $?
[ "$CGO_ENABLED" != 1 ] ||
-[ "$GOHOSTOS" == windows ] ||
(xcd ../misc/cgo/test
gomake clean
gotest