From: Joachim Protze Date: Thu, 26 Jan 2023 14:31:24 +0000 (+0100) Subject: Re-apply "[OpenMP][Archer] Use dlsym rather than weak symbols for TSan annotations" X-Git-Tag: upstream/17.0.6~19506 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=488d17154bebcfa0d70e47313b4fb0ace3ffbc00;p=platform%2Fupstream%2Fllvm.git Re-apply "[OpenMP][Archer] Use dlsym rather than weak symbols for TSan annotations" Explicitly link libdl this time. Differential Revision: https://reviews.llvm.org/D142378 --- diff --git a/openmp/tools/archer/CMakeLists.txt b/openmp/tools/archer/CMakeLists.txt index 85405af..46f38e2 100644 --- a/openmp/tools/archer/CMakeLists.txt +++ b/openmp/tools/archer/CMakeLists.txt @@ -12,6 +12,7 @@ if(LIBOMP_OMPT_SUPPORT) include_directories(${LIBOMP_INCLUDE_DIR}) add_library(archer SHARED ompt-tsan.cpp) + target_link_libraries(archer ${CMAKE_DL_LIBS}) add_library(archer_static STATIC ompt-tsan.cpp) install(TARGETS archer archer_static diff --git a/openmp/tools/archer/ompt-tsan.cpp b/openmp/tools/archer/ompt-tsan.cpp index a6fdb17..1bc5e57 100644 --- a/openmp/tools/archer/ompt-tsan.cpp +++ b/openmp/tools/archer/ompt-tsan.cpp @@ -29,10 +29,7 @@ #include #include #include - -#if (defined __APPLE__ && defined __MACH__) #include -#endif #include "omp-tools.h" @@ -53,7 +50,6 @@ #define KMP_FALLTHROUGH() ((void)0) #endif -static int runOnTsan; static int hasReductionCallback; namespace { @@ -148,7 +144,6 @@ static ArcherFlags *archer_flags; // See http://code.google.com/p/data-race-test/wiki/DynamicAnnotations . // tsan detects these exact functions by name. extern "C" { -#if (defined __APPLE__ && defined __MACH__) static void (*AnnotateHappensAfter)(const char *, int, const volatile void *); static void (*AnnotateHappensBefore)(const char *, int, const volatile void *); static void (*AnnotateIgnoreWritesBegin)(const char *, int); @@ -157,37 +152,7 @@ static void (*AnnotateNewMemory)(const char *, int, const volatile void *, size_t); static void (*__tsan_func_entry)(const void *); static void (*__tsan_func_exit)(void); - -static int RunningOnValgrind() { - int (*fptr)(); - - fptr = (int (*)())dlsym(RTLD_DEFAULT, "RunningOnValgrind"); - // If we found RunningOnValgrind other than this function, we assume - // Annotation functions present in this execution and leave runOnTsan=1 - // otherwise we change to runOnTsan=0 - if (!fptr || fptr == RunningOnValgrind) - runOnTsan = 0; - return 0; -} -#else -void __attribute__((weak)) -AnnotateHappensAfter(const char *file, int line, const volatile void *cv) {} -void __attribute__((weak)) -AnnotateHappensBefore(const char *file, int line, const volatile void *cv) {} -void __attribute__((weak)) -AnnotateIgnoreWritesBegin(const char *file, int line) {} -void __attribute__((weak)) AnnotateIgnoreWritesEnd(const char *file, int line) { -} -void __attribute__((weak)) -AnnotateNewMemory(const char *file, int line, const volatile void *cv, - size_t size) {} -int __attribute__((weak)) RunningOnValgrind() { - runOnTsan = 0; - return 0; -} -void __attribute__((weak)) __tsan_func_entry(const void *call_pc) {} -void __attribute__((weak)) __tsan_func_exit(void) {} -#endif +static int (*RunningOnValgrind)(void); } // This marker is used to define a happens-before arc. The race detector will @@ -1078,6 +1043,14 @@ static void ompt_tsan_mutex_released(ompt_mutex_t kind, ompt_wait_id_t wait_id, #define SET_CALLBACK(event) SET_CALLBACK_T(event, event) +#define findTsanFunction(f, fSig) \ + do { \ + if (NULL == (f = fSig dlsym(RTLD_DEFAULT, #f))) \ + printf("Unable to find TSan function " #f ".\n"); \ + } while (0) + +#define findTsanFunctionSilent(f, fSig) f = fSig dlsym(RTLD_DEFAULT, #f) + static int ompt_tsan_initialize(ompt_function_lookup_t lookup, int device_num, ompt_data_t *tool_data) { const char *options = getenv("TSAN_OPTIONS"); @@ -1099,13 +1072,6 @@ static int ompt_tsan_initialize(ompt_function_lookup_t lookup, int device_num, exit(1); } -#if (defined __APPLE__ && defined __MACH__) -#define findTsanFunction(f, fSig) \ - do { \ - if (NULL == (f = fSig dlsym(RTLD_DEFAULT, #f))) \ - printf("Unable to find TSan function " #f ".\n"); \ - } while (0) - findTsanFunction(AnnotateHappensAfter, (void (*)(const char *, int, const volatile void *))); findTsanFunction(AnnotateHappensBefore, @@ -1117,7 +1083,6 @@ static int ompt_tsan_initialize(ompt_function_lookup_t lookup, int device_num, (void (*)(const char *, int, const volatile void *, size_t))); findTsanFunction(__tsan_func_entry, (void (*)(const void *))); findTsanFunction(__tsan_func_exit, (void (*)(void))); -#endif SET_CALLBACK(thread_begin); SET_CALLBACK(thread_end); @@ -1181,10 +1146,9 @@ ompt_start_tool(unsigned int omp_version, const char *runtime_version) { // an implementation of the Annotation interface is available in the // execution or disable the tool (by returning NULL). - runOnTsan = 1; - RunningOnValgrind(); - if (!runOnTsan) // if we are not running on TSAN, give a different tool the - // chance to be loaded + findTsanFunctionSilent(RunningOnValgrind, (int (*)(void))); + if (!RunningOnValgrind) // if we are not running on TSAN, give a different + // tool the chance to be loaded { if (archer_flags->verbose) std::cout << "Archer detected OpenMP application without TSan "