]> Cypherpunks repositories - gostls13.git/commitdiff
misc/cgo/test: make tests run on windows
authorAlex Brainman <alex.brainman@gmail.com>
Fri, 20 Jan 2012 01:59:44 +0000 (12:59 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Fri, 20 Jan 2012 01:59:44 +0000 (12:59 +1100)
- 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

misc/cgo/test/Makefile
misc/cgo/test/basic.go
misc/cgo/test/env.go
misc/cgo/test/issue1560.go
misc/cgo/test/sleep_windows.go [new file with mode: 0644]
src/pkg/runtime/asm_amd64.s
src/run.bash

index c05482e4a22a9a348b369988c15eee7109c1dda0..4c1680d94c8efadb75b7cbeb2a9925088afc842e 100644 (file)
@@ -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
index bdcee5ca0a60b49e063676cf52fe91b38a58961b..7aaae1522213b0cdf60f2c2d574ab84798cf378b 100644 (file)
@@ -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)
        }
 }
 
index 1fb4e684cb73be5834c997d187870e65d7996225..8d3ba5877b87df3c19c009f24d6febb97a63fac8 100644 (file)
@@ -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)
index 7168f1cf7bed0b4514322811896d10e17c21c315..833b14ae62dcd00c4a7e7a41792d8e169ad72446 100644 (file)
@@ -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 (file)
index 0000000..007a1bb
--- /dev/null
@@ -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"
index 9053334993a1b09b64a2bce5bcaa204e6590f13a..308a66036e9320f0eea66de81ba1d345b10ca5a6 100644 (file)
@@ -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
 
index 2741637a80ccffa1095794e0f8accc0d1f8bed9f..8cc04a71fc498483f10d289dd275ab994a198a93 100755 (executable)
@@ -97,7 +97,6 @@ gomake clean
 ) || exit $?
 
 [ "$CGO_ENABLED" != 1 ] ||
-[ "$GOHOSTOS" == windows ] ||
 (xcd ../misc/cgo/test
 gomake clean
 gotest