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