]> Cypherpunks.ru repositories - gostls13.git/commitdiff
misc/cgo/testsanitizers: determine compiler version for tsan tests on ppc64le
authorLynn Boger <laboger@linux.vnet.ibm.com>
Wed, 24 Aug 2022 17:14:20 +0000 (12:14 -0500)
committerLynn Boger <laboger@linux.vnet.ibm.com>
Thu, 25 Aug 2022 11:40:57 +0000 (11:40 +0000)
Some tests in misc/cgo/testsanitizers had been disabled on ppc64le
until recently, due to an intermittent error in the tsan tests,
with the goal of trying to understand the failure.

After further investigation, I found that the code for tsan within
gcc does not work consistently when ASLR is enabled on ppc64le. A
fix for that problem was integrated in gcc 9.

This adds a check to testsanitizers to determine the gcc compiler
version on ppc64le and skip the test if the version is too old.

A similar check is needed for asan too.

Updates #54645

Change-Id: I70717d1aa9e967cf1e871566e72b3862b91fea3f
Reviewed-on: https://go-review.googlesource.com/c/go/+/425355
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Archana Ravindar <aravind5@in.ibm.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>

misc/cgo/testsanitizers/asan_test.go
misc/cgo/testsanitizers/cc_test.go
misc/cgo/testsanitizers/cshared_test.go
misc/cgo/testsanitizers/tsan_test.go

index dc1b5a1ecf7eb31d20c360948257d3c7b3e4f579..1c423add16c5fa0021c5c2d4ba06329e16ddf9d5 100644 (file)
@@ -27,8 +27,8 @@ func TestASAN(t *testing.T) {
        // -asan option must use a compatible version of ASan library, which requires that
        // the gcc version is not less than 7 and the clang version is not less than 9,
        // otherwise a segmentation fault will occur.
-       if !compilerRequiredAsanVersion() {
-               t.Skipf("skipping: too old version of compiler")
+       if !compilerRequiredAsanVersion(goos, goarch) {
+               t.Skipf("skipping on %s/%s: too old version of compiler", goos, goarch)
        }
 
        t.Parallel()
index f447b5c89f889151df8c4bf95b42ee99d78977ae..664083f570e7e40292ceff614c5d3429a1e7847d 100644 (file)
@@ -252,14 +252,30 @@ func compilerSupportsLocation() bool {
        }
 }
 
+// compilerRequiredTsanVersion reports whether the compiler is the version required by Tsan.
+// Only restrictions for ppc64le are known; otherwise return true.
+func compilerRequiredTsanVersion(goos, goarch string) bool {
+       compiler, err := compilerVersion()
+       if err != nil {
+               return false
+       }
+       if compiler.name == "gcc" && goarch == "ppc64le" {
+               return compiler.major >= 9
+       }
+       return true
+}
+
 // compilerRequiredAsanVersion reports whether the compiler is the version required by Asan.
-func compilerRequiredAsanVersion() bool {
+func compilerRequiredAsanVersion(goos, goarch string) bool {
        compiler, err := compilerVersion()
        if err != nil {
                return false
        }
        switch compiler.name {
        case "gcc":
+               if goarch == "ppc64le" {
+                       return compiler.major >= 9
+               }
                return compiler.major >= 7
        case "clang":
                return compiler.major >= 9
index 8fd03715a11bd8f9bc3076904049d88bad7a24eb..21b13ce4ed0dc53b4c3c23e793b19d33c4ee255c 100644 (file)
@@ -52,6 +52,11 @@ func TestShared(t *testing.T) {
                        t.Logf("skipping %s test on %s/%s; -msan option is not supported.", name, GOOS, GOARCH)
                        continue
                }
+               if tc.sanitizer == "thread" && !compilerRequiredTsanVersion(GOOS, GOARCH) {
+                       t.Logf("skipping %s test on %s/%s; compiler version too old for -tsan.", name, GOOS, GOARCH)
+                       continue
+               }
+
                t.Run(name, func(t *testing.T) {
                        t.Parallel()
                        config := configure(tc.sanitizer)
index ec4e0033fb43a4bef1c8f39782e9d8397739325e..00ad313b9cb6d20d2891e9a7606479f9442505d5 100644 (file)
@@ -10,6 +10,19 @@ import (
 )
 
 func TestTSAN(t *testing.T) {
+       goos, err := goEnv("GOOS")
+       if err != nil {
+               t.Fatal(err)
+       }
+       goarch, err := goEnv("GOARCH")
+       if err != nil {
+               t.Fatal(err)
+       }
+       // The msan tests require support for the -msan option.
+       if !compilerRequiredTsanVersion(goos, goarch) {
+               t.Skipf("skipping on %s/%s; compiler version for -tsan option is too old.", goos, goarch)
+       }
+
        t.Parallel()
        requireOvercommit(t)
        config := configure("thread")