diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index df86ae7223..577a20bf42 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -1103,6 +1103,13 @@ func (t *tester) runPending(nextTest *distTest) { } else { timelog("start", w.dt.name) w.out, w.err = w.cmd.CombinedOutput() + if w.err != nil { + if isUnsupportedVMASize(w) { + timelog("skip", w.dt.name) + w.out = []byte(fmt.Sprintf("skipped due to unsupported VMA\n")) + w.err = nil + } + } } timelog("end", w.dt.name) w.end <- true @@ -1383,6 +1390,11 @@ func (t *tester) packageHasBenchmarks(pkg string) bool { // raceDetectorSupported is a copy of the function // cmd/internal/sys.RaceDetectorSupported, which can't be used here // because cmd/dist has to be buildable by Go 1.4. +// The race detector only supports 48-bit VMA on arm64. But we don't have +// a good solution to check VMA size(See https://golang.org/issue/29948) +// raceDetectorSupported will always return true for arm64. But race +// detector tests may abort on non 48-bit VMA configuration, the tests +// will be marked as "skipped" in this case. func raceDetectorSupported(goos, goarch string) bool { switch goos { case "linux": @@ -1404,3 +1416,11 @@ func mSanSupported(goos, goarch string) bool { return false } } + +// isUnsupportedVMASize reports whether the failure is caused by an unsupported +// VMA for the race detector (for example, running the race detector on an +// arm64 machine configured with 39-bit VMA) +func isUnsupportedVMASize(w *work) bool { + unsupportedVMA := []byte("unsupported VMA range") + return w.dt.name == "race" && bytes.Contains(w.out, unsupportedVMA) +} diff --git a/src/cmd/internal/sys/supported.go b/src/cmd/internal/sys/supported.go index c963971f59..df26f971f8 100644 --- a/src/cmd/internal/sys/supported.go +++ b/src/cmd/internal/sys/supported.go @@ -6,6 +6,9 @@ package sys // RaceDetectorSupported reports whether goos/goarch supports the race // detector. There is a copy of this function in cmd/dist/test.go. +// Race detector only supports 48-bit VMA on arm64. But it will always +// return true for arm64, because we don't have VMA size information during +// the compile time. func RaceDetectorSupported(goos, goarch string) bool { switch goos { case "linux":