From 84637408f2e63821014974dac08dee50bb197c1b Mon Sep 17 00:00:00 2001 From: Joachim Protze Date: Mon, 13 Jan 2020 21:44:06 -1000 Subject: [PATCH] [OpenMP][Tool] Make tests for archer dependent on TSan If the openmp project is built standalone, the test compiler is feature tested for an available -fsanitize=thread flag. If the openmp project is built as part of llvm, the target tsan is needed to test archer. An additional line (requires tsan) was introduced to the tests, this patch updates the line numbers for the race. Follow-up for 77ad98c Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D71914 --- openmp/cmake/DetectTestCompiler/CMakeLists.txt | 5 +++++ openmp/cmake/OpenMPTesting.cmake | 8 ++++++++ openmp/tools/archer/tests/CMakeLists.txt | 6 +++++- openmp/tools/archer/tests/lit.cfg | 6 +++++- openmp/tools/archer/tests/lit.site.cfg.in | 5 +++-- openmp/tools/archer/tests/races/critical-unrelated.c | 2 -- openmp/tools/archer/tests/races/lock-nested-unrelated.c | 2 -- openmp/tools/archer/tests/races/lock-unrelated.c | 2 -- openmp/tools/archer/tests/races/parallel-simple.c | 2 -- openmp/tools/archer/tests/races/task-dependency.c | 4 +--- .../tools/archer/tests/races/task-taskgroup-unrelated.c | 7 +++---- openmp/tools/archer/tests/races/task-taskwait-nested.c | 4 +--- openmp/tools/archer/tests/races/task-two.c | 6 ++---- 13 files changed, 33 insertions(+), 26 deletions(-) diff --git a/openmp/cmake/DetectTestCompiler/CMakeLists.txt b/openmp/cmake/DetectTestCompiler/CMakeLists.txt index 1fd7cc715f00..c230fc8d4cf1 100644 --- a/openmp/cmake/DetectTestCompiler/CMakeLists.txt +++ b/openmp/cmake/DetectTestCompiler/CMakeLists.txt @@ -9,6 +9,7 @@ function(write_compiler_information lang) set(information "${information}\\;${CMAKE_${lang}_COMPILER_ID}") set(information "${information}\\;${CMAKE_${lang}_COMPILER_VERSION}") set(information "${information}\\;${${lang}_FLAGS}") + set(information "${information}\\;${${lang}_HAS_TSAN_FLAG}") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${lang}CompilerInformation.txt ${information}) endfunction(write_compiler_information) @@ -39,5 +40,9 @@ if (CMAKE_C_COMPILER_ID STREQUAL "Clang") add_experimental_isel_flag(CXX) endif() +SET(CMAKE_REQUIRED_FLAGS "-fsanitize=thread") +check_c_compiler_flag("" C_HAS_TSAN_FLAG) +check_cxx_compiler_flag("" CXX_HAS_TSAN_FLAG) + write_compiler_information(C) write_compiler_information(CXX) diff --git a/openmp/cmake/OpenMPTesting.cmake b/openmp/cmake/OpenMPTesting.cmake index 52e68aa150f5..e3d2c6b2c07f 100644 --- a/openmp/cmake/OpenMPTesting.cmake +++ b/openmp/cmake/OpenMPTesting.cmake @@ -64,11 +64,13 @@ macro(extract_test_compiler_information lang file) list(GET information 1 id) list(GET information 2 version) list(GET information 3 openmp_flags) + list(GET information 4 has_tsan_flags) set(OPENMP_TEST_${lang}_COMPILER_PATH ${path}) set(OPENMP_TEST_${lang}_COMPILER_ID ${id}) set(OPENMP_TEST_${lang}_COMPILER_VERSION ${version}) set(OPENMP_TEST_${lang}_COMPILER_OPENMP_FLAGS ${openmp_flags}) + set(OPENMP_TEST_${lang}_COMPILER_HAS_TSAN_FLAGS ${has_tsan_flags}) endmacro() # Function to set variables with information about the test compiler. @@ -84,6 +86,7 @@ function(set_test_compiler_information dir) set(OPENMP_TEST_COMPILER_ID "${OPENMP_TEST_C_COMPILER_ID}" PARENT_SCOPE) set(OPENMP_TEST_COMPILER_VERSION "${OPENMP_TEST_C_COMPILER_VERSION}" PARENT_SCOPE) set(OPENMP_TEST_COMPILER_OPENMP_FLAGS "${OPENMP_TEST_C_COMPILER_OPENMP_FLAGS}" PARENT_SCOPE) + set(OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS "${OPENMP_TEST_C_COMPILER_HAS_TSAN_FLAGS}" PARENT_SCOPE) # Determine major version. string(REGEX MATCH "[0-9]+" major "${OPENMP_TEST_C_COMPILER_VERSION}") @@ -128,6 +131,11 @@ else() else() set(OPENMP_TEST_COMPILER_THREAD_FLAGS "${CMAKE_THREAD_LIBS_INIT}") endif() + if(TARGET tsan) + set(OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS 1) + else() + set(OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS 0) + endif() # TODO: Implement blockaddress in GlobalISel and remove this flag! set(OPENMP_TEST_COMPILER_OPENMP_FLAGS "-fopenmp ${OPENMP_TEST_COMPILER_THREAD_FLAGS} -fno-experimental-isel") endif() diff --git a/openmp/tools/archer/tests/CMakeLists.txt b/openmp/tools/archer/tests/CMakeLists.txt index 4f70b1a826d1..baf832a89562 100644 --- a/openmp/tools/archer/tests/CMakeLists.txt +++ b/openmp/tools/archer/tests/CMakeLists.txt @@ -16,6 +16,9 @@ endif() set(LIBARCHER_TEST_PATH ${CMAKE_CURRENT_SOURCE_DIR}) +set(LIBARCHER_TEST_FLAGS "" CACHE STRING + "Extra compiler flags to send to the test compiler.") + macro(pythonize_bool var) if (${var}) set(${var} True) @@ -25,8 +28,9 @@ macro(pythonize_bool var) endmacro() pythonize_bool(LIBARCHER_HAVE_LIBATOMIC) +pythonize_bool(OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS) -add_openmp_testsuite(check-libarcher "Running libarcher tests" ${CMAKE_CURRENT_BINARY_DIR} DEPENDS archer) +add_openmp_testsuite(check-libarcher "Running libarcher tests" ${CMAKE_CURRENT_BINARY_DIR} DEPENDS archer omp) # Configure the lit.site.cfg.in file set(AUTO_GEN_COMMENT "## Autogenerated by libarcher configuration.\n# Do not edit!") diff --git a/openmp/tools/archer/tests/lit.cfg b/openmp/tools/archer/tests/lit.cfg index 286e59322cd6..3014c020bb99 100644 --- a/openmp/tools/archer/tests/lit.cfg +++ b/openmp/tools/archer/tests/lit.cfg @@ -46,7 +46,7 @@ config.test_flags = " -I " + config.test_source_root + \ " -I " + config.omp_header_dir + \ " -L " + config.omp_library_dir + \ " -Wl,-rpath," + config.omp_library_dir + \ - " " + config.test_extra_flags + " " + config.test_archer_flags config.archer_flags = "-g -O1 -fsanitize=thread" @@ -63,6 +63,7 @@ for feature in config.test_compiler_features: # Setup environment to find dynamic library at runtime append_dynamic_library_path(config.omp_library_dir) +append_dynamic_library_path(config.libarcher_obj_root+"/..") # Rpath modifications for Darwin if config.operating_system == 'Darwin': @@ -81,6 +82,9 @@ if config.operating_system == 'Darwin': if 'Linux' in config.operating_system: config.available_features.add("linux") +if config.has_tsan == True: + config.available_features.add("tsan") + # to run with icc INTEL_LICENSE_FILE must be set if 'INTEL_LICENSE_FILE' in os.environ: config.environment['INTEL_LICENSE_FILE'] = os.environ['INTEL_LICENSE_FILE'] diff --git a/openmp/tools/archer/tests/lit.site.cfg.in b/openmp/tools/archer/tests/lit.site.cfg.in index 8ab8821e4f53..cde10b2dd8dd 100644 --- a/openmp/tools/archer/tests/lit.site.cfg.in +++ b/openmp/tools/archer/tests/lit.site.cfg.in @@ -10,9 +10,10 @@ config.libomp_obj_root = "@CMAKE_CURRENT_BINARY_DIR@" config.omp_library_dir = "@LIBOMP_LIBRARY_DIR@" config.omp_header_dir = "@LIBOMP_INCLUDE_DIR@" config.operating_system = "@CMAKE_SYSTEM_NAME@" -config.has_libatomic = "@LIBARCHER_HAVE_LIBATOMIC@" +config.has_libatomic = @LIBARCHER_HAVE_LIBATOMIC@ +config.has_tsan = @OPENMP_TEST_COMPILER_HAS_TSAN_FLAGS@ -config.test_archer_flags = "@OPENMP_TEST_ARCHER_FLAGS@" +config.test_archer_flags = "@LIBARCHER_TEST_FLAGS@" config.libarcher_obj_root = "@CMAKE_CURRENT_BINARY_DIR@" # Let the main config do the real work. diff --git a/openmp/tools/archer/tests/races/critical-unrelated.c b/openmp/tools/archer/tests/races/critical-unrelated.c index 736d6f1dd684..58678a4831b3 100644 --- a/openmp/tools/archer/tests/races/critical-unrelated.c +++ b/openmp/tools/archer/tests/races/critical-unrelated.c @@ -11,7 +11,6 @@ // //===----------------------------------------------------------------------===// - // RUN: %libarcher-compile-and-run-race | FileCheck %s // REQUIRES: tsan #include @@ -40,4 +39,3 @@ int main(int argc, char *argv[]) { // CHECK-NEXT: #0 {{.*}}critical-unrelated.c:29 // CHECK: DONE // CHECK: ThreadSanitizer: reported 1 warnings - diff --git a/openmp/tools/archer/tests/races/lock-nested-unrelated.c b/openmp/tools/archer/tests/races/lock-nested-unrelated.c index cd8f515f3426..cf6910dadc39 100644 --- a/openmp/tools/archer/tests/races/lock-nested-unrelated.c +++ b/openmp/tools/archer/tests/races/lock-nested-unrelated.c @@ -11,7 +11,6 @@ // //===----------------------------------------------------------------------===// - // RUN: %libarcher-compile-and-run-race | FileCheck %s // REQUIRES: tsan #include @@ -46,4 +45,3 @@ int main(int argc, char *argv[]) { // CHECK-NEXT: #0 {{.*}}lock-nested-unrelated.c:33 // CHECK: DONE // CHECK: ThreadSanitizer: reported 1 warnings - diff --git a/openmp/tools/archer/tests/races/lock-unrelated.c b/openmp/tools/archer/tests/races/lock-unrelated.c index 358c58488d44..d1ac27af21f1 100644 --- a/openmp/tools/archer/tests/races/lock-unrelated.c +++ b/openmp/tools/archer/tests/races/lock-unrelated.c @@ -11,7 +11,6 @@ // //===----------------------------------------------------------------------===// - // RUN: %libarcher-compile-and-run-race | FileCheck %s // REQUIRES: tsan #include @@ -46,4 +45,3 @@ int main(int argc, char *argv[]) { // CHECK-NEXT: #0 {{.*}}lock-unrelated.c:31 // CHECK: DONE // CHECK: ThreadSanitizer: reported 1 warnings - diff --git a/openmp/tools/archer/tests/races/parallel-simple.c b/openmp/tools/archer/tests/races/parallel-simple.c index c77d18557fe0..2dc87acfd16c 100644 --- a/openmp/tools/archer/tests/races/parallel-simple.c +++ b/openmp/tools/archer/tests/races/parallel-simple.c @@ -11,7 +11,6 @@ // //===----------------------------------------------------------------------===// - // RUN: %libarcher-compile-and-run-race | FileCheck %s // REQUIRES: tsan #include @@ -35,4 +34,3 @@ int main(int argc, char *argv[]) { // CHECK-NEXT: #0 {{.*}}parallel-simple.c:23 // CHECK: DONE // CHECK: ThreadSanitizer: reported 1 warnings - diff --git a/openmp/tools/archer/tests/races/task-dependency.c b/openmp/tools/archer/tests/races/task-dependency.c index ce418b8b5a6d..0cbd3cf8ef36 100644 --- a/openmp/tools/archer/tests/races/task-dependency.c +++ b/openmp/tools/archer/tests/races/task-dependency.c @@ -11,13 +11,12 @@ // //===----------------------------------------------------------------------===// - // RUN: %libarcher-compile-and-run-race | FileCheck %s // REQUIRES: tsan +#include "ompt/ompt-signal.h" #include #include #include -#include "ompt/ompt-signal.h" int main(int argc, char *argv[]) { int var = 0, a = 0; @@ -59,4 +58,3 @@ int main(int argc, char *argv[]) { // CHECK-NEXT: #0 {{.*}}task-dependency.c:30 // CHECK: DONE // CHECK: ThreadSanitizer: reported 1 warnings - diff --git a/openmp/tools/archer/tests/races/task-taskgroup-unrelated.c b/openmp/tools/archer/tests/races/task-taskgroup-unrelated.c index 2f1228b7be22..244fdd30ac14 100644 --- a/openmp/tools/archer/tests/races/task-taskgroup-unrelated.c +++ b/openmp/tools/archer/tests/races/task-taskgroup-unrelated.c @@ -13,10 +13,10 @@ // RUN: %libarcher-compile-and-run-race | FileCheck %s // REQUIRES: tsan +#include "ompt/ompt-signal.h" #include #include #include -#include "ompt/ompt-signal.h" int main(int argc, char *argv[]) { int var = 0, a = 0; @@ -54,9 +54,8 @@ int main(int argc, char *argv[]) { // CHECK: WARNING: ThreadSanitizer: data race // CHECK-NEXT: {{(Write|Read)}} of size 4 -// CHECK-NEXT: #0 {{.*}}task-taskgroup-unrelated.c:46 +// CHECK-NEXT: #0 {{.*}}task-taskgroup-unrelated.c:47 // CHECK: Previous write of size 4 -// CHECK-NEXT: #0 {{.*}}task-taskgroup-unrelated.c:28 +// CHECK-NEXT: #0 {{.*}}task-taskgroup-unrelated.c:29 // CHECK: DONE // CHECK: ThreadSanitizer: reported 1 warnings - diff --git a/openmp/tools/archer/tests/races/task-taskwait-nested.c b/openmp/tools/archer/tests/races/task-taskwait-nested.c index d49b1d2a8550..193ad417a623 100644 --- a/openmp/tools/archer/tests/races/task-taskwait-nested.c +++ b/openmp/tools/archer/tests/races/task-taskwait-nested.c @@ -11,13 +11,12 @@ // //===----------------------------------------------------------------------===// - // RUN: %libarcher-compile-and-run-race | FileCheck %s // REQUIRES: tsan +#include "ompt/ompt-signal.h" #include #include #include -#include "ompt/ompt-signal.h" int main(int argc, char *argv[]) { int var = 0, a = 0; @@ -57,4 +56,3 @@ int main(int argc, char *argv[]) { // CHECK-NEXT: #0 {{.*}}task-taskwait-nested.c:44 // CHECK: DONE // CHECK: ThreadSanitizer: reported 1 warnings - diff --git a/openmp/tools/archer/tests/races/task-two.c b/openmp/tools/archer/tests/races/task-two.c index ad7b705837a7..1af937e0341a 100644 --- a/openmp/tools/archer/tests/races/task-two.c +++ b/openmp/tools/archer/tests/races/task-two.c @@ -11,7 +11,6 @@ // //===----------------------------------------------------------------------===// - // RUN: %libarcher-compile-and-run-race | FileCheck %s // REQUIRES: tsan #include @@ -24,8 +23,8 @@ int main(int argc, char *argv[]) { int var = 0; int i; -#pragma omp parallel for num_threads(NUM_THREADS) shared(var) schedule(static, \ - 1) +#pragma omp parallel for num_threads(NUM_THREADS) shared(var) \ + schedule(static, 1) for (i = 0; i < NUM_THREADS; i++) { #pragma omp task shared(var) if (0) // the task is inlined an executed locally { var++; } @@ -43,4 +42,3 @@ int main(int argc, char *argv[]) { // CHECK-NEXT: #0 {{.*}}task-two.c:30 // CHECK: DONE // CHECK: ThreadSanitizer: reported 1 warnings - -- 2.34.1