1
0
mirror of https://github.com/golang/go synced 2024-09-30 22:08:32 -06:00

cmd/dist: reactivate vfp detection on linux/arm

Fixes #9732
Fixes #9819

Rather than detecting vfp support via catching SIGILL signals,
parse the contents of /proc/cpuinfo.

As the GOARM values for NaCl and freebsd are hard coded, this parsing
logic only needs to support linux/arm.

This change also fixes the nacl/arm build which is broken because the
first stage of nacltest.bash is executed with GOARM=5, embedding that
into 5g.

The second stage of nacltest.bash correctly detects GOARM=7, but this is
ignored as we pass --no-clean at that point, and thus do not replace
the compiler.

Lastyly, include a fix to error message in nacltest.bash

Change-Id: I13f306ff07a99b44b493fade72ac00d0d5097e1c
Reviewed-on: https://go-review.googlesource.com/3981
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Dave Cheney 2015-02-06 11:44:09 +11:00
parent 0661143447
commit e6fbce3596
4 changed files with 32 additions and 47 deletions

46
src/cmd/dist/util.go vendored
View File

@ -471,24 +471,38 @@ func xgetgoarm() string {
// FreeBSD has broken VFP support. // FreeBSD has broken VFP support.
return "5" return "5"
} }
if xtryexecfunc(useVFPv3) { if goos != "linux" {
// All other arm platforms that we support
// require ARMv7.
return "7" return "7"
} }
if xtryexecfunc(useVFPv1) { cpuinfo := readfile("/proc/cpuinfo")
return "6" goarm := "5"
for _, line := range splitlines(cpuinfo) {
line := strings.SplitN(line, ":", 2)
if len(line) < 2 {
continue
} }
return "5" if strings.TrimSpace(line[0]) != "Features" {
} continue
}
features := splitfields(line[1])
sort.Strings(features) // so vfpv3 sorts after vfp
func xtryexecfunc(f func()) bool { // Infer GOARM value from the vfp features available
// TODO(rsc): Implement. // on this host. Values of GOARM detected are:
// The C cmd/dist used this to test whether certain assembly // 5: no vfp support was found
// sequences could be executed properly. It used signals and // 6: vfp (v1) support was detected, but no higher
// timers and sigsetjmp, which is basically not possible in Go. // 7: vfpv3 support was detected.
// We probably have to invoke ourselves as a subprocess instead, // This matches the assertions in runtime.checkarm.
// to contain the fault/timeout. for _, f := range features {
return false switch f {
case "vfp":
goarm = "6"
case "vfpv3":
goarm = "7"
}
}
}
return goarm
} }
func useVFPv1()
func useVFPv3()

View File

@ -1,15 +0,0 @@
// Copyright 2015 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 "textflag.h"
// try to run "vmov.f64 d0, d0" instruction
TEXT ·useVFPv1(SB),NOSPLIT,$0
WORD $0xeeb00b40 // vmov.f64 d0, d0
RET
// try to run VFPv3-only "vmov.f64 d0, #112" instruction
TEXT ·useVFPv3(SB),NOSPLIT,$0
WORD $0xeeb70b00 // vmov.f64 d0, #112
RET

View File

@ -1,14 +0,0 @@
// Copyright 2015 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.
// +build !arm
#include "textflag.h"
TEXT ·useVFPv1(SB),NOSPLIT,$0
RET
TEXT ·useVFPv3(SB),NOSPLIT,$0
RET

View File

@ -62,7 +62,7 @@ fi
# Run host build to get toolchain for running zip generator. # Run host build to get toolchain for running zip generator.
unset GOOS GOARCH unset GOOS GOARCH
if [ ! -f make.bash ]; then if [ ! -f make.bash ]; then
echo 'nacl.bash must be run from $GOROOT/src' 1>&2 echo 'nacltest.bash must be run from $GOROOT/src' 1>&2
exit 1 exit 1
fi fi
GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH ./make.bash GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH ./make.bash