mirror of
https://github.com/golang/go
synced 2024-11-22 04:34:39 -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
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// 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 <pthread.h>
|
||||||
#include "_cgo_export.h"
|
#include "_cgo_export.h"
|
||||||
|
@ -8,6 +8,7 @@ package cgosotest
|
|||||||
// intentionally write the same LDFLAGS differently
|
// intentionally write the same LDFLAGS differently
|
||||||
// to test correct handling of LDFLAGS.
|
// to test correct handling of LDFLAGS.
|
||||||
#cgo linux LDFLAGS: -L. -lcgosotest
|
#cgo linux LDFLAGS: -L. -lcgosotest
|
||||||
|
#cgo dragonfly LDFLAGS: -L. -l cgosotest
|
||||||
#cgo freebsd LDFLAGS: -L. -l cgosotest
|
#cgo freebsd LDFLAGS: -L. -l cgosotest
|
||||||
#cgo openbsd LDFLAGS: -L. -l cgosotest
|
#cgo openbsd LDFLAGS: -L. -l cgosotest
|
||||||
#cgo netbsd LDFLAGS: -L. libcgosotest.so
|
#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));
|
sysfatal("cannot use -linkmode=external with -H %s", headstr(HEADTYPE));
|
||||||
break;
|
break;
|
||||||
case Hdarwin:
|
case Hdarwin:
|
||||||
|
case Hdragonfly:
|
||||||
case Hfreebsd:
|
case Hfreebsd:
|
||||||
case Hlinux:
|
case Hlinux:
|
||||||
case Hnetbsd:
|
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)
|
if(!isinternal)
|
||||||
externalobj = 1;
|
externalobj = 1;
|
||||||
|
|
||||||
|
@ -258,21 +258,23 @@ func (ctxt *Context) SrcDirs() []string {
|
|||||||
var Default Context = defaultContext()
|
var Default Context = defaultContext()
|
||||||
|
|
||||||
var cgoEnabled = map[string]bool{
|
var cgoEnabled = map[string]bool{
|
||||||
"darwin/386": true,
|
"darwin/386": true,
|
||||||
"darwin/amd64": true,
|
"darwin/amd64": true,
|
||||||
"freebsd/386": true,
|
"dragonfly/386": true,
|
||||||
"freebsd/amd64": true,
|
"dragonfly/amd64": true,
|
||||||
"freebsd/arm": true,
|
"freebsd/386": true,
|
||||||
"linux/386": true,
|
"freebsd/amd64": true,
|
||||||
"linux/amd64": true,
|
"freebsd/arm": true,
|
||||||
"linux/arm": true,
|
"linux/386": true,
|
||||||
"netbsd/386": true,
|
"linux/amd64": true,
|
||||||
"netbsd/amd64": true,
|
"linux/arm": true,
|
||||||
"netbsd/arm": true,
|
"netbsd/386": true,
|
||||||
"openbsd/386": true,
|
"netbsd/amd64": true,
|
||||||
"openbsd/amd64": true,
|
"netbsd/arm": true,
|
||||||
"windows/386": true,
|
"openbsd/386": true,
|
||||||
"windows/amd64": true,
|
"openbsd/amd64": true,
|
||||||
|
"windows/386": true,
|
||||||
|
"windows/amd64": true,
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultContext() Context {
|
func defaultContext() Context {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build darwin freebsd linux netbsd openbsd
|
// +build darwin dragonfly freebsd linux netbsd openbsd
|
||||||
// +build cgo
|
// +build cgo
|
||||||
|
|
||||||
package user
|
package user
|
||||||
|
@ -12,6 +12,7 @@ package cgo
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
#cgo darwin LDFLAGS: -lpthread
|
#cgo darwin LDFLAGS: -lpthread
|
||||||
|
#cgo dragonfly LDFLAGS: -lpthread
|
||||||
#cgo freebsd LDFLAGS: -lpthread
|
#cgo freebsd LDFLAGS: -lpthread
|
||||||
#cgo linux LDFLAGS: -lpthread
|
#cgo linux LDFLAGS: -lpthread
|
||||||
#cgo netbsd 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
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// 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"
|
#include "libcgo.h"
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// 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
|
#pragma cgo_import_static x_cgo_setenv
|
||||||
|
|
||||||
|
@ -104,7 +104,8 @@ go run $GOROOT/test/run.go - . || exit 1
|
|||||||
[ "$CGO_ENABLED" != 1 ] ||
|
[ "$CGO_ENABLED" != 1 ] ||
|
||||||
(xcd ../misc/cgo/test
|
(xcd ../misc/cgo/test
|
||||||
go test -ldflags '-linkmode=auto' || exit 1
|
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
|
case "$GOHOSTOS-$GOARCH" in
|
||||||
openbsd-386 | openbsd-amd64)
|
openbsd-386 | openbsd-amd64)
|
||||||
# test linkmode=external, but __thread not supported, so skip testtls.
|
# 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;;
|
*) go test -ldflags '-linkmode=external' || exit 1;;
|
||||||
esac
|
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=external' || exit 1
|
||||||
go test -ldflags '-linkmode=auto' ../testtls || exit 1
|
go test -ldflags '-linkmode=auto' ../testtls || exit 1
|
||||||
go test -ldflags '-linkmode=external' ../testtls || exit 1
|
go test -ldflags '-linkmode=external' ../testtls || exit 1
|
||||||
|
Loading…
Reference in New Issue
Block a user