1218885Sdim//===-- Valgrind.cpp - Implement Valgrind communication ---------*- C++ -*-===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// Defines Valgrind communication methods, if HAVE_VALGRIND_VALGRIND_H is 11218885Sdim// defined. If we have valgrind.h but valgrind isn't running, its macros are 12218885Sdim// no-ops. 13218885Sdim// 14218885Sdim//===----------------------------------------------------------------------===// 15218885Sdim 16218885Sdim#include "llvm/Support/Valgrind.h" 17218885Sdim#include "llvm/Config/config.h" 18218885Sdim 19218885Sdim#if HAVE_VALGRIND_VALGRIND_H 20218885Sdim#include <valgrind/valgrind.h> 21218885Sdim 22218885Sdimstatic bool InitNotUnderValgrind() { 23218885Sdim return !RUNNING_ON_VALGRIND; 24218885Sdim} 25218885Sdim 26218885Sdim// This bool is negated from what we'd expect because code may run before it 27218885Sdim// gets initialized. If that happens, it will appear to be 0 (false), and we 28218885Sdim// want that to cause the rest of the code in this file to run the 29218885Sdim// Valgrind-provided macros. 30218885Sdimstatic const bool NotUnderValgrind = InitNotUnderValgrind(); 31218885Sdim 32218885Sdimbool llvm::sys::RunningOnValgrind() { 33218885Sdim if (NotUnderValgrind) 34218885Sdim return false; 35218885Sdim return RUNNING_ON_VALGRIND; 36218885Sdim} 37218885Sdim 38218885Sdimvoid llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) { 39218885Sdim if (NotUnderValgrind) 40218885Sdim return; 41218885Sdim 42218885Sdim VALGRIND_DISCARD_TRANSLATIONS(Addr, Len); 43218885Sdim} 44218885Sdim 45218885Sdim#else // !HAVE_VALGRIND_VALGRIND_H 46218885Sdim 47218885Sdimbool llvm::sys::RunningOnValgrind() { 48218885Sdim return false; 49218885Sdim} 50218885Sdim 51218885Sdimvoid llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) { 52218885Sdim} 53218885Sdim 54218885Sdim#endif // !HAVE_VALGRIND_VALGRIND_H 55234353Sdim 56234353Sdim#if LLVM_ENABLE_THREADS != 0 && !defined(NDEBUG) 57234353Sdim// These functions require no implementation, tsan just looks at the arguments 58234353Sdim// they're called with. 59234353Sdimextern "C" { 60234353Sdimvoid AnnotateHappensBefore(const char *file, int line, 61234353Sdim const volatile void *cv) {} 62234353Sdimvoid AnnotateHappensAfter(const char *file, int line, 63234353Sdim const volatile void *cv) {} 64234353Sdimvoid AnnotateIgnoreWritesBegin(const char *file, int line) {} 65234353Sdimvoid AnnotateIgnoreWritesEnd(const char *file, int line) {} 66234353Sdim} 67234353Sdim#endif 68