mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 21:00:29 +00:00
Support: Clean up TSan annotations.
Remove support for Valgrind-based TSan, which hasn't been maintained for a few years. We now use the TSan annotations only if LLVM is compiled with -fsanitize=thread. We no longer need the weak function definitions as we are guaranteed that our program is linked directly with the TSan runtime. Differential Revision: http://reviews.llvm.org/D12121 llvm-svn: 245374
This commit is contained in:
parent
bd6d51f973
commit
3ec59b51d4
@ -26,7 +26,7 @@
|
|||||||
#include "llvm/PassInfo.h"
|
#include "llvm/PassInfo.h"
|
||||||
#include "llvm/PassRegistry.h"
|
#include "llvm/PassRegistry.h"
|
||||||
#include "llvm/Support/Atomic.h"
|
#include "llvm/Support/Atomic.h"
|
||||||
#include "llvm/Support/Valgrind.h"
|
#include "llvm/Support/Compiler.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
@ -337,6 +337,45 @@
|
|||||||
# define LLVM_ADDRESS_SANITIZER_BUILD 0
|
# define LLVM_ADDRESS_SANITIZER_BUILD 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// \macro LLVM_THREAD_SANITIZER_BUILD
|
||||||
|
/// \brief Whether LLVM itself is built with ThreadSanitizer instrumentation.
|
||||||
|
#if __has_feature(thread_sanitizer) || defined(__SANITIZE_THREAD__)
|
||||||
|
# define LLVM_THREAD_SANITIZER_BUILD 1
|
||||||
|
#else
|
||||||
|
# define LLVM_THREAD_SANITIZER_BUILD 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LLVM_THREAD_SANITIZER_BUILD
|
||||||
|
// Thread Sanitizer is a tool that finds races in code.
|
||||||
|
// See http://code.google.com/p/data-race-test/wiki/DynamicAnnotations .
|
||||||
|
// tsan detects these exact functions by name.
|
||||||
|
extern "C" {
|
||||||
|
void AnnotateHappensAfter(const char *file, int line, const volatile void *cv);
|
||||||
|
void AnnotateHappensBefore(const char *file, int line, const volatile void *cv);
|
||||||
|
void AnnotateIgnoreWritesBegin(const char *file, int line);
|
||||||
|
void AnnotateIgnoreWritesEnd(const char *file, int line);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This marker is used to define a happens-before arc. The race detector will
|
||||||
|
// infer an arc from the begin to the end when they share the same pointer
|
||||||
|
// argument.
|
||||||
|
# define TsanHappensBefore(cv) AnnotateHappensBefore(__FILE__, __LINE__, cv)
|
||||||
|
|
||||||
|
// This marker defines the destination of a happens-before arc.
|
||||||
|
# define TsanHappensAfter(cv) AnnotateHappensAfter(__FILE__, __LINE__, cv)
|
||||||
|
|
||||||
|
// Ignore any races on writes between here and the next TsanIgnoreWritesEnd.
|
||||||
|
# define TsanIgnoreWritesBegin() AnnotateIgnoreWritesBegin(__FILE__, __LINE__)
|
||||||
|
|
||||||
|
// Resume checking for racy writes.
|
||||||
|
# define TsanIgnoreWritesEnd() AnnotateIgnoreWritesEnd(__FILE__, __LINE__)
|
||||||
|
#else
|
||||||
|
# define TsanHappensBefore(cv)
|
||||||
|
# define TsanHappensAfter(cv)
|
||||||
|
# define TsanIgnoreWritesBegin()
|
||||||
|
# define TsanIgnoreWritesEnd()
|
||||||
|
#endif
|
||||||
|
|
||||||
/// \brief Mark debug helper function definitions like dump() that should not be
|
/// \brief Mark debug helper function definitions like dump() that should not be
|
||||||
/// stripped from debug builds.
|
/// stripped from debug builds.
|
||||||
// FIXME: Move this to a private config.h as it's not usable in public headers.
|
// FIXME: Move this to a private config.h as it's not usable in public headers.
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
#define LLVM_SUPPORT_MANAGEDSTATIC_H
|
#define LLVM_SUPPORT_MANAGEDSTATIC_H
|
||||||
|
|
||||||
#include "llvm/Support/Atomic.h"
|
#include "llvm/Support/Atomic.h"
|
||||||
|
#include "llvm/Support/Compiler.h"
|
||||||
#include "llvm/Support/Threading.h"
|
#include "llvm/Support/Threading.h"
|
||||||
#include "llvm/Support/Valgrind.h"
|
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
|
@ -20,17 +20,6 @@
|
|||||||
#include "llvm/Support/Compiler.h"
|
#include "llvm/Support/Compiler.h"
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#if LLVM_ENABLE_THREADS != 0 && !defined(NDEBUG)
|
|
||||||
// tsan (Thread Sanitizer) is a valgrind-based tool that detects these exact
|
|
||||||
// functions by name.
|
|
||||||
extern "C" {
|
|
||||||
void AnnotateHappensAfter(const char *file, int line, const volatile void *cv);
|
|
||||||
void AnnotateHappensBefore(const char *file, int line, const volatile void *cv);
|
|
||||||
void AnnotateIgnoreWritesBegin(const char *file, int line);
|
|
||||||
void AnnotateIgnoreWritesEnd(const char *file, int line);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
namespace sys {
|
namespace sys {
|
||||||
// True if Valgrind is controlling this process.
|
// True if Valgrind is controlling this process.
|
||||||
@ -39,34 +28,6 @@ namespace sys {
|
|||||||
// Discard valgrind's translation of code in the range [Addr .. Addr + Len).
|
// Discard valgrind's translation of code in the range [Addr .. Addr + Len).
|
||||||
// Otherwise valgrind may continue to execute the old version of the code.
|
// Otherwise valgrind may continue to execute the old version of the code.
|
||||||
void ValgrindDiscardTranslations(const void *Addr, size_t Len);
|
void ValgrindDiscardTranslations(const void *Addr, size_t Len);
|
||||||
|
|
||||||
#if LLVM_ENABLE_THREADS != 0 && !defined(NDEBUG)
|
|
||||||
// Thread Sanitizer is a valgrind tool that finds races in code.
|
|
||||||
// See http://code.google.com/p/data-race-test/wiki/DynamicAnnotations .
|
|
||||||
|
|
||||||
// This marker is used to define a happens-before arc. The race detector will
|
|
||||||
// infer an arc from the begin to the end when they share the same pointer
|
|
||||||
// argument.
|
|
||||||
#define TsanHappensBefore(cv) \
|
|
||||||
AnnotateHappensBefore(__FILE__, __LINE__, cv)
|
|
||||||
|
|
||||||
// This marker defines the destination of a happens-before arc.
|
|
||||||
#define TsanHappensAfter(cv) \
|
|
||||||
AnnotateHappensAfter(__FILE__, __LINE__, cv)
|
|
||||||
|
|
||||||
// Ignore any races on writes between here and the next TsanIgnoreWritesEnd.
|
|
||||||
#define TsanIgnoreWritesBegin() \
|
|
||||||
AnnotateIgnoreWritesBegin(__FILE__, __LINE__)
|
|
||||||
|
|
||||||
// Resume checking for racy writes.
|
|
||||||
#define TsanIgnoreWritesEnd() \
|
|
||||||
AnnotateIgnoreWritesEnd(__FILE__, __LINE__)
|
|
||||||
#else
|
|
||||||
#define TsanHappensBefore(cv)
|
|
||||||
#define TsanHappensAfter(cv)
|
|
||||||
#define TsanIgnoreWritesBegin()
|
|
||||||
#define TsanIgnoreWritesEnd()
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "llvm/Support/ManagedStatic.h"
|
#include "llvm/Support/ManagedStatic.h"
|
||||||
#include "llvm/Config/config.h"
|
#include "llvm/Config/config.h"
|
||||||
#include "llvm/Support/Atomic.h"
|
#include "llvm/Support/Atomic.h"
|
||||||
|
#include "llvm/Support/Compiler.h"
|
||||||
#include "llvm/Support/Mutex.h"
|
#include "llvm/Support/Mutex.h"
|
||||||
#include "llvm/Support/MutexGuard.h"
|
#include "llvm/Support/MutexGuard.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
#include "llvm/ADT/StringExtras.h"
|
#include "llvm/ADT/StringExtras.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
|
#include "llvm/Support/Compiler.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/Format.h"
|
#include "llvm/Support/Format.h"
|
||||||
#include "llvm/Support/ManagedStatic.h"
|
#include "llvm/Support/ManagedStatic.h"
|
||||||
|
@ -52,23 +52,3 @@ void llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif // !HAVE_VALGRIND_VALGRIND_H
|
#endif // !HAVE_VALGRIND_VALGRIND_H
|
||||||
|
|
||||||
// These functions require no implementation, tsan just looks at the arguments
|
|
||||||
// they're called with. However, they are required to be weak as some other
|
|
||||||
// application or library may already be providing these definitions for the
|
|
||||||
// same reason we are.
|
|
||||||
extern "C" {
|
|
||||||
LLVM_ATTRIBUTE_WEAK void AnnotateHappensAfter(const char *file, int line,
|
|
||||||
const volatile void *cv);
|
|
||||||
void AnnotateHappensAfter(const char *file, int line, const volatile void *cv) {
|
|
||||||
}
|
|
||||||
LLVM_ATTRIBUTE_WEAK void AnnotateHappensBefore(const char *file, int line,
|
|
||||||
const volatile void *cv);
|
|
||||||
void AnnotateHappensBefore(const char *file, int line,
|
|
||||||
const volatile void *cv) {}
|
|
||||||
LLVM_ATTRIBUTE_WEAK void AnnotateIgnoreWritesBegin(const char *file, int line);
|
|
||||||
void AnnotateIgnoreWritesBegin(const char *file, int line) {}
|
|
||||||
LLVM_ATTRIBUTE_WEAK void AnnotateIgnoreWritesEnd(const char *file, int line);
|
|
||||||
void AnnotateIgnoreWritesEnd(const char *file, int line) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user