[Openmp-commits] [openmp] 7fbf122 - [OpenMP][Archer] Use dlsym rather than weak symbols for TSan annotations

Joachim Protze via Openmp-commits openmp-commits at lists.llvm.org
Tue Jan 24 06:15:07 PST 2023


Author: Joachim Protze
Date: 2023-01-24T15:14:51+01:00
New Revision: 7fbf12210007a66f7b62beadc0e5a52561cc0ab3

URL: https://github.com/llvm/llvm-project/commit/7fbf12210007a66f7b62beadc0e5a52561cc0ab3
DIFF: https://github.com/llvm/llvm-project/commit/7fbf12210007a66f7b62beadc0e5a52561cc0ab3.diff

LOG: [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

Added: 
    

Modified: 
    openmp/tools/archer/ompt-tsan.cpp

Removed: 
    


################################################################################
diff  --git a/openmp/tools/archer/ompt-tsan.cpp b/openmp/tools/archer/ompt-tsan.cpp
index a6fdb17ca9bf4..1bc5e57c72f34 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 
diff erent tool the
-                  // chance to be loaded
+  findTsanFunctionSilent(RunningOnValgrind, (int (*)(void)));
+  if (!RunningOnValgrind) // if we are not running on TSAN, give a 
diff erent
+                          // tool the chance to be loaded
   {
     if (archer_flags->verbose)
       std::cout << "Archer detected OpenMP application without TSan "


        


More information about the Openmp-commits mailing list