1f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//===-- Valgrind.cpp - Implement Valgrind communication ---------*- C++ -*-===//
2f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//
3f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//                     The LLVM Compiler Infrastructure
4f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//
5f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin// This file is distributed under the University of Illinois Open Source
6f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin// License. See LICENSE.TXT for details.
7f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//
8f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//===----------------------------------------------------------------------===//
9f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//
10f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//  Defines Valgrind communication methods, if HAVE_VALGRIND_VALGRIND_H is
11f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//  defined.  If we have valgrind.h but valgrind isn't running, its macros are
12f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//  no-ops.
13f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//
14f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin//===----------------------------------------------------------------------===//
15f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
161f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Valgrind.h"
17f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin#include "llvm/Config/config.h"
18f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
19f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin#if HAVE_VALGRIND_VALGRIND_H
20f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin#include <valgrind/valgrind.h>
21f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
22f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskinstatic bool InitNotUnderValgrind() {
23f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin  return !RUNNING_ON_VALGRIND;
24f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin}
25f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
26f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin// This bool is negated from what we'd expect because code may run before it
27f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin// gets initialized.  If that happens, it will appear to be 0 (false), and we
28f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin// want that to cause the rest of the code in this file to run the
29f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin// Valgrind-provided macros.
30f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskinstatic const bool NotUnderValgrind = InitNotUnderValgrind();
31f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
32f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskinbool llvm::sys::RunningOnValgrind() {
33f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin  if (NotUnderValgrind)
34f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin    return false;
35f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin  return RUNNING_ON_VALGRIND;
36f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin}
37f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
38f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskinvoid llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) {
39f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin  if (NotUnderValgrind)
40f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin    return;
41f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
42ba519f8fc9778a86080e89b62c20b4c420edc22bDuncan Sands  VALGRIND_DISCARD_TRANSLATIONS(Addr, Len);
43f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin}
44f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
45f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin#else  // !HAVE_VALGRIND_VALGRIND_H
46f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
47f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskinbool llvm::sys::RunningOnValgrind() {
48f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin  return false;
49f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin}
50f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
51f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskinvoid llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) {
52f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin}
53f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin
54f28411f732960981f8920195ad8f7e6792396961Jeffrey Yasskin#endif  // !HAVE_VALGRIND_VALGRIND_H
554d0a9ff36574da0c042e9bd3ae816301b392ac41Nick Lewycky
56a3980cccf7537e64ebc7c8d707d98b788991f549Nick Lewycky#if LLVM_ENABLE_THREADS != 0 && !defined(NDEBUG)
574d0a9ff36574da0c042e9bd3ae816301b392ac41Nick Lewycky// These functions require no implementation, tsan just looks at the arguments
584d0a9ff36574da0c042e9bd3ae816301b392ac41Nick Lewycky// they're called with.
594d0a9ff36574da0c042e9bd3ae816301b392ac41Nick Lewyckyextern "C" {
60e7c1aef2b824f29ea92b2b324975915fe2115fa4Nick Lewyckyvoid AnnotateHappensBefore(const char *file, int line,
61e7c1aef2b824f29ea92b2b324975915fe2115fa4Nick Lewycky                           const volatile void *cv) {}
62e7c1aef2b824f29ea92b2b324975915fe2115fa4Nick Lewyckyvoid AnnotateHappensAfter(const char *file, int line,
63e7c1aef2b824f29ea92b2b324975915fe2115fa4Nick Lewycky                          const volatile void *cv) {}
64e7c1aef2b824f29ea92b2b324975915fe2115fa4Nick Lewyckyvoid AnnotateIgnoreWritesBegin(const char *file, int line) {}
65e7c1aef2b824f29ea92b2b324975915fe2115fa4Nick Lewyckyvoid AnnotateIgnoreWritesEnd(const char *file, int line) {}
664d0a9ff36574da0c042e9bd3ae816301b392ac41Nick Lewycky}
67a3980cccf7537e64ebc7c8d707d98b788991f549Nick Lewycky#endif
68