aboutsummaryrefslogtreecommitdiff
path: root/openmp/tools
diff options
context:
space:
mode:
authorJoachim Protze <protze@itc.rwth-aachen.de>2023-01-24 15:12:06 +0100
committerJoachim Protze <protze@itc.rwth-aachen.de>2023-01-24 15:14:51 +0100
commit7fbf12210007a66f7b62beadc0e5a52561cc0ab3 (patch)
treed6e3cf0b003c388b19dd6c60a4872e731b85248c /openmp/tools
parentfeea695653df9879027e63c3565434fcb2020fba (diff)
downloadllvm-7fbf12210007a66f7b62beadc0e5a52561cc0ab3.zip
llvm-7fbf12210007a66f7b62beadc0e5a52561cc0ab3.tar.gz
llvm-7fbf12210007a66f7b62beadc0e5a52561cc0ab3.tar.bz2
[OpenMP][Archer] Use dlsym rather than weak symbols for TSan annotations
This patch fix issues reported for Ubuntu and possibly other platforms: https://github.com/llvm/llvm-project/issues/45290 The latest comment on this issue points out that using dlsym rather than the weak symbol approach to call TSan annotation functions fixes the issue for Ubuntu. Differential Revision: https://reviews.llvm.org/D142378
Diffstat (limited to 'openmp/tools')
-rw-r--r--openmp/tools/archer/ompt-tsan.cpp60
1 files changed, 12 insertions, 48 deletions
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 <unistd.h>
#include <unordered_map>
#include <vector>
-
-#if (defined __APPLE__ && defined __MACH__)
#include <dlfcn.h>
-#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 "