mirror of
https://github.com/golang/go
synced 2024-11-21 21:44:40 -07:00
cgo: enable cgo on dragonfly
Enable cgo for dragonfly/386 and dragonfly/amd64. R=golang-dev, jsing, iant, bradfitz CC=golang-dev https://golang.org/cl/13247046
This commit is contained in:
parent
dd3e522094
commit
2b44b36487
@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build darwin freebsd linux netbsd openbsd
|
||||
// +build darwin dragonfly freebsd linux netbsd openbsd
|
||||
|
||||
#include <pthread.h>
|
||||
#include "_cgo_export.h"
|
||||
|
@ -8,6 +8,7 @@ package cgosotest
|
||||
// intentionally write the same LDFLAGS differently
|
||||
// to test correct handling of LDFLAGS.
|
||||
#cgo linux LDFLAGS: -L. -lcgosotest
|
||||
#cgo dragonfly LDFLAGS: -L. -l cgosotest
|
||||
#cgo freebsd LDFLAGS: -L. -l cgosotest
|
||||
#cgo openbsd LDFLAGS: -L. -l cgosotest
|
||||
#cgo netbsd LDFLAGS: -L. libcgosotest.so
|
||||
|
@ -152,6 +152,7 @@ main(int argc, char *argv[])
|
||||
sysfatal("cannot use -linkmode=external with -H %s", headstr(HEADTYPE));
|
||||
break;
|
||||
case Hdarwin:
|
||||
case Hdragonfly:
|
||||
case Hfreebsd:
|
||||
case Hlinux:
|
||||
case Hnetbsd:
|
||||
|
@ -582,6 +582,16 @@ ldhostobj(void (*ld)(Biobuf*, char*, int64, char*), Biobuf *f, char *pkg, int64
|
||||
}
|
||||
}
|
||||
|
||||
// DragonFly declares errno with __thread, which results in a symbol
|
||||
// type of R_386_TLS_GD or R_X86_64_TLSGD. The Go linker does not
|
||||
// currently know how to handle TLS relocations, hence we have to
|
||||
// force external linking for any libraries that link in code that
|
||||
// uses errno. This can be removed if the Go linker ever supports
|
||||
// these relocation types.
|
||||
if(HEADTYPE == Hdragonfly)
|
||||
if(strcmp(pkg, "net") == 0 || strcmp(pkg, "os/user") == 0)
|
||||
isinternal = 0;
|
||||
|
||||
if(!isinternal)
|
||||
externalobj = 1;
|
||||
|
||||
|
@ -260,6 +260,8 @@ var Default Context = defaultContext()
|
||||
var cgoEnabled = map[string]bool{
|
||||
"darwin/386": true,
|
||||
"darwin/amd64": true,
|
||||
"dragonfly/386": true,
|
||||
"dragonfly/amd64": true,
|
||||
"freebsd/386": true,
|
||||
"freebsd/amd64": true,
|
||||
"freebsd/arm": true,
|
||||
|
@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build darwin freebsd linux netbsd openbsd
|
||||
// +build darwin dragonfly freebsd linux netbsd openbsd
|
||||
// +build cgo
|
||||
|
||||
package user
|
||||
|
@ -12,6 +12,7 @@ package cgo
|
||||
/*
|
||||
|
||||
#cgo darwin LDFLAGS: -lpthread
|
||||
#cgo dragonfly LDFLAGS: -lpthread
|
||||
#cgo freebsd LDFLAGS: -lpthread
|
||||
#cgo linux LDFLAGS: -lpthread
|
||||
#cgo netbsd LDFLAGS: -lpthread
|
||||
|
13
src/pkg/runtime/cgo/dragonfly.c
Normal file
13
src/pkg/runtime/cgo/dragonfly.c
Normal file
@ -0,0 +1,13 @@
|
||||
// Copyright 2010 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.
|
||||
|
||||
// Supply environ and __progname, because we don't
|
||||
// link against the standard DragonFly crt0.o and the
|
||||
// libc dynamic library needs them.
|
||||
|
||||
char *environ[1];
|
||||
char *__progname;
|
||||
|
||||
#pragma dynexport environ environ
|
||||
#pragma dynexport __progname __progname
|
77
src/pkg/runtime/cgo/gcc_dragonfly_386.c
Normal file
77
src/pkg/runtime/cgo/gcc_dragonfly_386.c
Normal file
@ -0,0 +1,77 @@
|
||||
// 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.
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include "libcgo.h"
|
||||
|
||||
static void* threadentry(void*);
|
||||
static void (*setmg_gcc)(void*, void*);
|
||||
|
||||
void
|
||||
x_cgo_init(G *g, void (*setmg)(void*, void*))
|
||||
{
|
||||
pthread_attr_t attr;
|
||||
size_t size;
|
||||
|
||||
setmg_gcc = setmg;
|
||||
pthread_attr_init(&attr);
|
||||
pthread_attr_getstacksize(&attr, &size);
|
||||
g->stackguard = (uintptr)&attr - size + 4096;
|
||||
pthread_attr_destroy(&attr);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_cgo_sys_thread_start(ThreadStart *ts)
|
||||
{
|
||||
pthread_attr_t attr;
|
||||
sigset_t ign, oset;
|
||||
pthread_t p;
|
||||
size_t size;
|
||||
int err;
|
||||
|
||||
SIGFILLSET(ign);
|
||||
sigprocmask(SIG_SETMASK, &ign, &oset);
|
||||
|
||||
pthread_attr_init(&attr);
|
||||
pthread_attr_getstacksize(&attr, &size);
|
||||
ts->g->stackguard = size;
|
||||
err = pthread_create(&p, &attr, threadentry, ts);
|
||||
|
||||
sigprocmask(SIG_SETMASK, &oset, nil);
|
||||
|
||||
if (err != 0) {
|
||||
fprintf(stderr, "runtime/cgo: pthread_create failed: %s\n", strerror(err));
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
static void*
|
||||
threadentry(void *v)
|
||||
{
|
||||
ThreadStart ts;
|
||||
|
||||
ts = *(ThreadStart*)v;
|
||||
free(v);
|
||||
|
||||
ts.g->stackbase = (uintptr)&ts;
|
||||
|
||||
/*
|
||||
* _cgo_sys_thread_start set stackguard to stack size;
|
||||
* change to actual guard pointer.
|
||||
*/
|
||||
ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096;
|
||||
|
||||
/*
|
||||
* Set specific keys.
|
||||
*/
|
||||
setmg_gcc((void*)ts.m, (void*)ts.g);
|
||||
|
||||
crosscall_386(ts.fn);
|
||||
return nil;
|
||||
}
|
77
src/pkg/runtime/cgo/gcc_dragonfly_amd64.c
Normal file
77
src/pkg/runtime/cgo/gcc_dragonfly_amd64.c
Normal file
@ -0,0 +1,77 @@
|
||||
// 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.
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include "libcgo.h"
|
||||
|
||||
static void* threadentry(void*);
|
||||
static void (*setmg_gcc)(void*, void*);
|
||||
|
||||
void
|
||||
x_cgo_init(G *g, void (*setmg)(void*, void*))
|
||||
{
|
||||
pthread_attr_t attr;
|
||||
size_t size;
|
||||
|
||||
setmg_gcc = setmg;
|
||||
pthread_attr_init(&attr);
|
||||
pthread_attr_getstacksize(&attr, &size);
|
||||
g->stackguard = (uintptr)&attr - size + 4096;
|
||||
pthread_attr_destroy(&attr);
|
||||
}
|
||||
|
||||
void
|
||||
_cgo_sys_thread_start(ThreadStart *ts)
|
||||
{
|
||||
pthread_attr_t attr;
|
||||
sigset_t ign, oset;
|
||||
pthread_t p;
|
||||
size_t size;
|
||||
int err;
|
||||
|
||||
SIGFILLSET(ign);
|
||||
sigprocmask(SIG_SETMASK, &ign, &oset);
|
||||
|
||||
pthread_attr_init(&attr);
|
||||
pthread_attr_getstacksize(&attr, &size);
|
||||
|
||||
ts->g->stackguard = size;
|
||||
err = pthread_create(&p, &attr, threadentry, ts);
|
||||
|
||||
sigprocmask(SIG_SETMASK, &oset, nil);
|
||||
|
||||
if (err != 0) {
|
||||
fprintf(stderr, "runtime/cgo: pthread_create failed: %s\n", strerror(err));
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
static void*
|
||||
threadentry(void *v)
|
||||
{
|
||||
ThreadStart ts;
|
||||
|
||||
ts = *(ThreadStart*)v;
|
||||
free(v);
|
||||
|
||||
ts.g->stackbase = (uintptr)&ts;
|
||||
|
||||
/*
|
||||
* _cgo_sys_thread_start set stackguard to stack size;
|
||||
* change to actual guard pointer.
|
||||
*/
|
||||
ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096;
|
||||
|
||||
/*
|
||||
* Set specific keys.
|
||||
*/
|
||||
setmg_gcc((void*)ts.m, (void*)ts.g);
|
||||
|
||||
crosscall_amd64(ts.fn);
|
||||
return nil;
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build darwin freebsd linux netbsd openbsd
|
||||
// +build darwin dragonfly freebsd linux netbsd openbsd
|
||||
|
||||
#include "libcgo.h"
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build darwin freebsd linux netbsd openbsd
|
||||
// +build darwin dragonfly freebsd linux netbsd openbsd
|
||||
|
||||
#pragma cgo_import_static x_cgo_setenv
|
||||
|
||||
|
@ -104,7 +104,8 @@ go run $GOROOT/test/run.go - . || exit 1
|
||||
[ "$CGO_ENABLED" != 1 ] ||
|
||||
(xcd ../misc/cgo/test
|
||||
go test -ldflags '-linkmode=auto' || exit 1
|
||||
go test -ldflags '-linkmode=internal' || exit 1
|
||||
# linkmode=internal fails on dragonfly since errno is a TLS relocation.
|
||||
[ "$GOHOSTOS" == dragonfly ] || go test -ldflags '-linkmode=internal' || exit 1
|
||||
case "$GOHOSTOS-$GOARCH" in
|
||||
openbsd-386 | openbsd-amd64)
|
||||
# test linkmode=external, but __thread not supported, so skip testtls.
|
||||
@ -118,7 +119,7 @@ darwin-386 | darwin-amd64)
|
||||
*) go test -ldflags '-linkmode=external' || exit 1;;
|
||||
esac
|
||||
;;
|
||||
freebsd-386 | freebsd-amd64 | linux-386 | linux-amd64 | linux-arm | netbsd-386 | netbsd-amd64)
|
||||
dragonfly-386 | dragonfly-amd64 | freebsd-386 | freebsd-amd64 | linux-386 | linux-amd64 | linux-arm | netbsd-386 | netbsd-amd64)
|
||||
go test -ldflags '-linkmode=external' || exit 1
|
||||
go test -ldflags '-linkmode=auto' ../testtls || exit 1
|
||||
go test -ldflags '-linkmode=external' ../testtls || exit 1
|
||||
|
Loading…
Reference in New Issue
Block a user