mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/dist: support for NetBSD/ARM
1. when executing a unsupported VFP instruction, the NetBSD kernel somehow doesn't report SIGILL, and instead just spin and spin, we add a alarm(2) to detect this case (albeit this is a kernel bug). 2. NetBSD/ARM's VFP11 support is not complete, so temporarily disable it. 3. The default gcc shipped with NetBSD-current mis-optimizes our code at -O2, so lower the optimization level to -O1 on NetBSD/ARM. R=dave, rsc CC=golang-dev https://golang.org/cl/7286044
This commit is contained in:
parent
a17b7b9491
commit
3d50aaf483
3 changed files with 25 additions and 0 deletions
12
src/cmd/dist/arm.c
vendored
12
src/cmd/dist/arm.c
vendored
|
|
@ -17,6 +17,18 @@ static void useVFPv1(void);
|
||||||
char *
|
char *
|
||||||
xgetgoarm(void)
|
xgetgoarm(void)
|
||||||
{
|
{
|
||||||
|
#if defined(__NetBSD__) || defined(__FreeBSD__)
|
||||||
|
// NetBSD has buggy support for VFPv2 (incorrect inexact,
|
||||||
|
// denormial, and NaN handling). When GOARM=6, some of our
|
||||||
|
// math tests fails on Raspberry Pi.
|
||||||
|
// Thus we return "5" here for safety, the user is free
|
||||||
|
// to override.
|
||||||
|
// Note: using GOARM=6 with cgo can trigger a kernel assertion
|
||||||
|
// failure and crash NetBSD/evbarm kernel.
|
||||||
|
// FreeBSD also have broken VFP support, so disable VFP also
|
||||||
|
// on FreeBSD.
|
||||||
|
return "5";
|
||||||
|
#endif
|
||||||
if(xtryexecfunc(useVFPv3))
|
if(xtryexecfunc(useVFPv3))
|
||||||
return "7";
|
return "7";
|
||||||
else if(xtryexecfunc(useVFPv1))
|
else if(xtryexecfunc(useVFPv1))
|
||||||
|
|
|
||||||
6
src/cmd/dist/build.c
vendored
6
src/cmd/dist/build.c
vendored
|
|
@ -411,7 +411,13 @@ static char *proto_gccargs[] = {
|
||||||
"-fno-common",
|
"-fno-common",
|
||||||
"-ggdb",
|
"-ggdb",
|
||||||
"-pipe",
|
"-pipe",
|
||||||
|
#if defined(__NetBSD__) && defined(__arm__)
|
||||||
|
// GCC 4.5.4 (NetBSD nb1 20120916) on ARM is known to mis-optimize gc/mparith3.c
|
||||||
|
// Fix available at http://patchwork.ozlabs.org/patch/64562/.
|
||||||
|
"-O1",
|
||||||
|
#else
|
||||||
"-O2",
|
"-O2",
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static Vec gccargs;
|
static Vec gccargs;
|
||||||
|
|
|
||||||
7
src/cmd/dist/unix.c
vendored
7
src/cmd/dist/unix.c
vendored
|
|
@ -745,17 +745,24 @@ static void sigillhand(int);
|
||||||
// xtryexecfunc tries to execute function f, if any illegal instruction
|
// xtryexecfunc tries to execute function f, if any illegal instruction
|
||||||
// signal received in the course of executing that function, it will
|
// signal received in the course of executing that function, it will
|
||||||
// return 0, otherwise it will return 1.
|
// return 0, otherwise it will return 1.
|
||||||
|
// Some systems (notably NetBSD) will spin and spin when executing VFPv3
|
||||||
|
// instructions on VFPv2 system (e.g. Raspberry Pi) without ever triggering
|
||||||
|
// SIGILL, so we set a 1-second alarm to catch that case.
|
||||||
int
|
int
|
||||||
xtryexecfunc(void (*f)(void))
|
xtryexecfunc(void (*f)(void))
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
r = 0;
|
r = 0;
|
||||||
signal(SIGILL, sigillhand);
|
signal(SIGILL, sigillhand);
|
||||||
|
signal(SIGALRM, sigillhand);
|
||||||
|
alarm(1);
|
||||||
if(sigsetjmp(sigill_jmpbuf, 1) == 0) {
|
if(sigsetjmp(sigill_jmpbuf, 1) == 0) {
|
||||||
f();
|
f();
|
||||||
r = 1;
|
r = 1;
|
||||||
}
|
}
|
||||||
signal(SIGILL, SIG_DFL);
|
signal(SIGILL, SIG_DFL);
|
||||||
|
alarm(0);
|
||||||
|
signal(SIGALRM, SIG_DFL);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue