llvm-6502/lib/Support/Valgrind.cpp
Nick Lewycky 4d0a9ff365 Add support for tsan annotations (thread sanitizer, a valgrind-based tool).
These annotations are disabled entirely when either ENABLE_THREADS is off, or
building a release build. When enabled, they add calls to functions with no
statements to ManagedStatic's getters.

Use these annotations to inform tsan that the race used inside ManagedStatic
initialization is actually benign. Thanks to Kostya Serebryany for helping
write this patch!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144567 91177308-0d34-0410-b5e6-96231b3b80d8
2011-11-14 20:50:16 +00:00

66 lines
2.0 KiB
C++

//===-- Valgrind.cpp - Implement Valgrind communication ---------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Defines Valgrind communication methods, if HAVE_VALGRIND_VALGRIND_H is
// defined. If we have valgrind.h but valgrind isn't running, its macros are
// no-ops.
//
//===----------------------------------------------------------------------===//
#include "llvm/Support/Valgrind.h"
#include "llvm/Config/config.h"
#if HAVE_VALGRIND_VALGRIND_H
#include <valgrind/valgrind.h>
static bool InitNotUnderValgrind() {
return !RUNNING_ON_VALGRIND;
}
// This bool is negated from what we'd expect because code may run before it
// gets initialized. If that happens, it will appear to be 0 (false), and we
// want that to cause the rest of the code in this file to run the
// Valgrind-provided macros.
static const bool NotUnderValgrind = InitNotUnderValgrind();
bool llvm::sys::RunningOnValgrind() {
if (NotUnderValgrind)
return false;
return RUNNING_ON_VALGRIND;
}
void llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) {
if (NotUnderValgrind)
return;
VALGRIND_DISCARD_TRANSLATIONS(Addr, Len);
}
#else // !HAVE_VALGRIND_VALGRIND_H
bool llvm::sys::RunningOnValgrind() {
return false;
}
void llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) {
}
#endif // !HAVE_VALGRIND_VALGRIND_H
// These functions require no implementation, tsan just looks at the arguments
// they're called with.
extern "C" {
void AnnotateHappensBefore(const char *file, int line,
const volatile void *cv) {}
void AnnotateHappensAfter(const char *file, int line,
const volatile void *cv) {}
void AnnotateIgnoreWritesBegin(const char *file, int line) {}
void AnnotateIgnoreWritesEnd(const char *file, int line) {}
}