diff options
author | Joe Poirier <jdpoirier@gmail.com> | 2010-04-05 23:44:05 -0700 |
---|---|---|
committer | Joe Poirier <jdpoirier@gmail.com> | 2010-04-05 23:44:05 -0700 |
commit | 9325a8fa689e8c9e080508f872ea864f2ea30b25 (patch) | |
tree | 0a22b3ea9985264a7901b6bbafad0ee689542e81 | |
parent | 899d4dcd31b80421367e31223f782db2208caea1 (diff) | |
download | golang-9325a8fa689e8c9e080508f872ea864f2ea30b25.tar.gz |
libcgo: initial mingw port work - builds but untested
R=rsc
CC=golang-dev
http://codereview.appspot.com/812041
Committer: Russ Cox <rsc@golang.org>
-rwxr-xr-x[-rw-r--r--] | src/libcgo/386.S | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | src/libcgo/Makefile | 2 | ||||
-rw-r--r-- | src/libcgo/amd64.S | 2 | ||||
-rwxr-xr-x | src/libcgo/mingw_386.c | 45 | ||||
-rwxr-xr-x | src/libcgo/mingw_amd64.c | 45 |
5 files changed, 94 insertions, 2 deletions
diff --git a/src/libcgo/386.S b/src/libcgo/386.S index 3d7786d14..278c5293c 100644..100755 --- a/src/libcgo/386.S +++ b/src/libcgo/386.S @@ -5,7 +5,7 @@ /* * Apple still insists on underscore prefixes for C function names. */ -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__MINGW32__) #define EXT(s) _##s #else #define EXT(s) s diff --git a/src/libcgo/Makefile b/src/libcgo/Makefile index b5ac6e33f..deb6b48a3 100644..100755 --- a/src/libcgo/Makefile +++ b/src/libcgo/Makefile @@ -19,9 +19,11 @@ OFILES=\ CFLAGS_386=-m32 CFLAGS_amd64=-m64 + LDFLAGS_linux=-shared -lpthread -lm LDFLAGS_darwin=-dynamiclib -Wl,-undefined,dynamic_lookup /usr/lib/libpthread.dylib LDFLAGS_freebsd=-pthread -shared -lm +LDFLAGS_mingw=-shared -lm -mthreads %.o: %.c gcc $(CFLAGS_$(GOARCH)) -O2 -fPIC -o $@ -c $*.c diff --git a/src/libcgo/amd64.S b/src/libcgo/amd64.S index eaa346a14..a7adff9e9 100644 --- a/src/libcgo/amd64.S +++ b/src/libcgo/amd64.S @@ -5,7 +5,7 @@ /* * Apple still insists on underscore prefixes for C function names. */ -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__MINGW64__) #define EXT(s) _##s #else #define EXT(s) s diff --git a/src/libcgo/mingw_386.c b/src/libcgo/mingw_386.c new file mode 100755 index 000000000..62be9303e --- /dev/null +++ b/src/libcgo/mingw_386.c @@ -0,0 +1,45 @@ +// Copyright 2009 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. + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include "libcgo.h" + +static void *threadentry(void*); + +/* From what I've read 1MB is default for 32-bit Linux. + Allocation granularity on Windows is typically 64 KB. */ +#define STACKSIZE (1*1024*1024) + +void +initcgo(void) +{ +} + +void +libcgo_sys_thread_start(ThreadStart *ts) +{ + ts->g->stackguard = STACKSIZE; + _beginthread(threadentry, STACKSIZE, ts); +} + +static void* +threadentry(void *v) +{ + ThreadStart ts; + + ts = *(ThreadStart*)v; + free(v); + + ts.g->stackbase = (uintptr)&ts; + + /* + * libcgo_sys_thread_start set stackguard to stack size; + * change to actual guard pointer. + */ + ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096; + + crosscall_386(ts.fn); + return nil; +} diff --git a/src/libcgo/mingw_amd64.c b/src/libcgo/mingw_amd64.c new file mode 100755 index 000000000..56417e178 --- /dev/null +++ b/src/libcgo/mingw_amd64.c @@ -0,0 +1,45 @@ +// Copyright 2009 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. + +#define WIN64_LEAN_AND_MEAN +#include <windows.h> +#include "libcgo.h" + +static void *threadentry(void*); + +/* From what I've read 2MB is default for 64-bit Linux. + Allocation granularity on Windows is typically 64 KB. */ +#define STACKSIZE (2*1024*1024) + +void +initcgo(void) +{ +} + +void +libcgo_sys_thread_start(ThreadStart *ts) +{ + ts->g->stackguard = STACKSIZE; + _beginthread(threadentry, STACKSIZE, ts); +} + +static void* +threadentry(void *v) +{ + ThreadStart ts; + + ts = *(ThreadStart*)v; + free(v); + + ts.g->stackbase = (uintptr)&ts; + + /* + * libcgo_sys_thread_start set stackguard to stack size; + * change to actual guard pointer. + */ + ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096; + + crosscall_386(ts.fn); + return nil; +} |