diff --git a/openmp/cmake/DetectTestCompiler/CMakeLists.txt b/openmp/cmake/DetectTestCompiler/CMakeLists.txt --- a/openmp/cmake/DetectTestCompiler/CMakeLists.txt +++ b/openmp/cmake/DetectTestCompiler/CMakeLists.txt @@ -9,6 +9,7 @@ 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 @@ 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 --- a/openmp/cmake/OpenMPTesting.cmake +++ b/openmp/cmake/OpenMPTesting.cmake @@ -64,11 +64,13 @@ 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 @@ 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() 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 --- a/openmp/tools/archer/tests/CMakeLists.txt +++ b/openmp/tools/archer/tests/CMakeLists.txt @@ -16,6 +16,9 @@ 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 @@ 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 --- a/openmp/tools/archer/tests/lit.cfg +++ b/openmp/tools/archer/tests/lit.cfg @@ -46,7 +46,7 @@ " -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 @@ # 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 '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 --- a/openmp/tools/archer/tests/lit.site.cfg.in +++ b/openmp/tools/archer/tests/lit.site.cfg.in @@ -10,9 +10,10 @@ 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 --- 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 @@ // 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 --- 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 @@ // 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 --- 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 @@ // 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 --- 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 @@ // 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 --- 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 @@ // 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 --- 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 @@ // 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 --- 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 @@ // 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 --- 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 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 @@ // CHECK-NEXT: #0 {{.*}}task-two.c:30 // CHECK: DONE // CHECK: ThreadSanitizer: reported 1 warnings -