diff --git a/openmp/tools/archer/ompt-tsan.cpp b/openmp/tools/archer/ompt-tsan.cpp --- a/openmp/tools/archer/ompt-tsan.cpp +++ b/openmp/tools/archer/ompt-tsan.cpp @@ -15,18 +15,18 @@ #define __STDC_FORMAT_MACROS #endif +#include #include #include #include #include #include #include +#include #include #include #include -#include #include -#include #include #include @@ -89,17 +89,26 @@ TsanFlags(const char *env) : ignore_noninstrumented_modules(0) { if (env) { std::vector tokens; - std::string token; std::string str(env); - std::istringstream iss(str); - while (std::getline(iss, token, ' ')) - tokens.push_back(token); + auto end = str.end(); + auto it = str.begin(); + auto is_sep = [](char c) { + return c == ' ' || c == ',' || c == ':' || c == '\n' || c == '\t' || + c == '\r'; + }; + while (it != end) { + auto next_it = std::find_if(it, end, is_sep); + tokens.emplace_back(it, next_it); + it = next_it; + if (it != end) { + ++it; + } + } - for (std::vector::iterator it = tokens.begin(); - it != tokens.end(); ++it) { + for (const auto &token : tokens) { // we are interested in ignore_noninstrumented_modules to print a // warning - if (sscanf(it->c_str(), "ignore_noninstrumented_modules=%d", + if (sscanf(token.c_str(), "ignore_noninstrumented_modules=%d", &ignore_noninstrumented_modules)) continue; } diff --git a/openmp/tools/archer/tests/lit.cfg b/openmp/tools/archer/tests/lit.cfg --- a/openmp/tools/archer/tests/lit.cfg +++ b/openmp/tools/archer/tests/lit.cfg @@ -93,6 +93,8 @@ # Race Tests config.substitutions.append(("%libarcher-compile-and-run-race", \ "%libarcher-compile && %libarcher-run-race")) +config.substitutions.append(("%libarcher-compile-and-run-nosuppression", \ + "%libarcher-compile && %libarcher-run-nosuppression")) config.substitutions.append(("%libarcher-compile-and-run", \ "%libarcher-compile && %libarcher-run")) config.substitutions.append(("%libarcher-cxx-compile-and-run", \ @@ -102,13 +104,15 @@ config.substitutions.append(("%libarcher-compile", \ "%clang-archer %openmp_flags %archer_flags %flags %s -o %t" + libs)) config.substitutions.append(("%libarcher-run-race", "%suppression %deflake %t 2>&1 | tee %t.log")) +config.substitutions.append(("%libarcher-run-nosuppression", "%nosuppression %t 2>&1 | tee %t.log")) config.substitutions.append(("%libarcher-run", "%suppression %t 2>&1 | tee %t.log")) config.substitutions.append(("%clang-archerXX", config.test_cxx_compiler)) config.substitutions.append(("%clang-archer", config.test_c_compiler)) config.substitutions.append(("%openmp_flags", config.test_openmp_flags)) config.substitutions.append(("%archer_flags", config.archer_flags)) config.substitutions.append(("%flags", config.test_flags)) -config.substitutions.append(("%suppression", "env TSAN_OPTIONS='ignore_noninstrumented_modules=1'")) +config.substitutions.append(("%nosuppression", "env TSAN_OPTIONS='ignore_noninstrumented_modules=0'")) +config.substitutions.append(("%suppression", "env TSAN_OPTIONS='ignore_noninstrumented_modules=0:ignore_noninstrumented_modules=1'")) config.substitutions.append(("%deflake", os.path.join(os.path.dirname(__file__), "deflake.bash"))) config.substitutions.append(("FileCheck", config.test_filecheck)) diff --git a/openmp/tools/archer/tests/parallel/parallel-simple.c b/openmp/tools/archer/tests/parallel/parallel-nosuppression.c copy from openmp/tools/archer/tests/parallel/parallel-simple.c copy to openmp/tools/archer/tests/parallel/parallel-nosuppression.c --- a/openmp/tools/archer/tests/parallel/parallel-simple.c +++ b/openmp/tools/archer/tests/parallel/parallel-nosuppression.c @@ -1,5 +1,5 @@ /* - * parallel-simple.c -- Archer testcase + * parallel-nosuppression.c -- Archer testcase */ //===----------------------------------------------------------------------===// @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// -// RUN: %libarcher-compile-and-run | FileCheck %s +// RUN: %libarcher-compile-and-run-nosuppression | FileCheck %s // REQUIRES: tsan #include #include @@ -36,4 +36,5 @@ // CHECK-NOT: ThreadSanitizer: data race // CHECK-NOT: ThreadSanitizer: reported +// CHECK: Warning: please export TSAN_OPTIONS // CHECK: DONE diff --git a/openmp/tools/archer/tests/parallel/parallel-simple.c b/openmp/tools/archer/tests/parallel/parallel-simple.c --- a/openmp/tools/archer/tests/parallel/parallel-simple.c +++ b/openmp/tools/archer/tests/parallel/parallel-simple.c @@ -36,4 +36,5 @@ // CHECK-NOT: ThreadSanitizer: data race // CHECK-NOT: ThreadSanitizer: reported +// CHECK-NOT: Warning: please export TSAN_OPTIONS // CHECK: DONE