diff options
author | Joachim Protze <protze@itc.rwth-aachen.de> | 2020-01-13 22:24:00 -1000 |
---|---|---|
committer | Joachim Protze <protze@itc.rwth-aachen.de> | 2020-01-14 09:58:05 -1000 |
commit | 2d4571bf3060f8f3d8417a0ec55e21a280158069 (patch) | |
tree | febe3adc2fe9bc329d78b5799c314d7799fbf230 /openmp/tools | |
parent | 410331869defbde0f6e5b7b3f8ee30c10b7f6be3 (diff) | |
download | bcm5719-llvm-2d4571bf3060f8f3d8417a0ec55e21a280158069.tar.gz bcm5719-llvm-2d4571bf3060f8f3d8417a0ec55e21a280158069.zip |
[OpenMP][Tool] Runtime warning for missing TSan-option
TSan spuriously reports for any OpenMP application a race on the initialization
of a runtime internal mutex:
```
Atomic read of size 1 at 0x7b6800005940 by thread T4:
#0 pthread_mutex_lock <null> (a.out+0x43f39e)
#1 __kmp_resume_64 <null> (libomp.so.5+0x84db4)
Previous write of size 1 at 0x7b6800005940 by thread T7:
#0 pthread_mutex_init <null> (a.out+0x424793)
#1 __kmp_suspend_initialize_thread <null> (libomp.so.5+0x8422e)
```
According to @AndreyChurbanov this is a false positive report, as the control
flow of the runtime guarantees the ordering of the mutex initialization and
the lock:
https://software.intel.com/en-us/forums/intel-open-source-openmp-runtime-library/topic/530363
To suppress this report, I suggest the use of
TSAN_OPTIONS='ignore_uninstrumented_modules=1'.
With this patch, a runtime warning is provided in case an OpenMP application
is built with Tsan and executed without this Tsan-option.
Reviewed By: jdoerfert
Differential Revision: https://reviews.llvm.org/D70412
Diffstat (limited to 'openmp/tools')
-rw-r--r-- | openmp/tools/archer/ompt-tsan.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/openmp/tools/archer/ompt-tsan.cpp b/openmp/tools/archer/ompt-tsan.cpp index 03a2f6c148f..50b98e2a485 100644 --- a/openmp/tools/archer/ompt-tsan.cpp +++ b/openmp/tools/archer/ompt-tsan.cpp @@ -82,6 +82,31 @@ public: } }; +class TsanFlags { +public: + int ignore_noninstrumented_modules; + + TsanFlags(const char *env) : ignore_noninstrumented_modules(0) { + if (env) { + std::vector<std::string> tokens; + std::string token; + std::string str(env); + std::istringstream iss(str); + while (std::getline(iss, token, ' ')) + tokens.push_back(token); + + for (std::vector<std::string>::iterator it = tokens.begin(); + it != tokens.end(); ++it) { + // we are interested in ignore_noninstrumented_modules to print a + // warning + if (sscanf(it->c_str(), "ignore_noninstrumented_modules=%d", + &ignore_noninstrumented_modules)) + continue; + } + } + } +}; + #if (LLVM_VERSION) >= 40 extern "C" { int __attribute__((weak)) __archer_get_omp_status(); @@ -89,6 +114,7 @@ void __attribute__((weak)) __tsan_flush_memory() {} } #endif ArcherFlags *archer_flags; +TsanFlags *tsan_flags; // The following definitions are pasted from "llvm/Support/Compiler.h" to allow // the code @@ -838,6 +864,8 @@ static int ompt_tsan_initialize(ompt_function_lookup_t lookup, ompt_data_t *tool_data) { const char *options = getenv("ARCHER_OPTIONS"); archer_flags = new ArcherFlags(options); + options = getenv("TSAN_OPTIONS"); + tsan_flags = new TsanFlags(options); ompt_set_callback_t ompt_set_callback = (ompt_set_callback_t)lookup("ompt_set_callback"); @@ -869,6 +897,12 @@ static int ompt_tsan_initialize(ompt_function_lookup_t lookup, SET_CALLBACK_T(mutex_acquired, mutex); SET_CALLBACK_T(mutex_released, mutex); SET_OPTIONAL_CALLBACK_T(reduction, sync_region, hasReductionCallback, ompt_set_never); + + if (!tsan_flags->ignore_noninstrumented_modules) + fprintf( + stderr, + "Warning: please export TSAN_OPTIONS='ignore_noninstrumented_modules=1' " + "to avoid false positive reports from the OpenMP runtime.!\n"); return 1; // success } |