12754fe60SDimitry Andric //===-- Valgrind.cpp - Implement Valgrind communication ---------*- C++ -*-===//
22754fe60SDimitry Andric //
32754fe60SDimitry Andric //                     The LLVM Compiler Infrastructure
42754fe60SDimitry Andric //
52754fe60SDimitry Andric // This file is distributed under the University of Illinois Open Source
62754fe60SDimitry Andric // License. See LICENSE.TXT for details.
72754fe60SDimitry Andric //
82754fe60SDimitry Andric //===----------------------------------------------------------------------===//
92754fe60SDimitry Andric //
102754fe60SDimitry Andric //  Defines Valgrind communication methods, if HAVE_VALGRIND_VALGRIND_H is
112754fe60SDimitry Andric //  defined.  If we have valgrind.h but valgrind isn't running, its macros are
122754fe60SDimitry Andric //  no-ops.
132754fe60SDimitry Andric //
142754fe60SDimitry Andric //===----------------------------------------------------------------------===//
152754fe60SDimitry Andric 
162754fe60SDimitry Andric #include "llvm/Support/Valgrind.h"
172754fe60SDimitry Andric #include "llvm/Config/config.h"
18*7d523365SDimitry Andric #include <cstddef>
192754fe60SDimitry Andric 
202754fe60SDimitry Andric #if HAVE_VALGRIND_VALGRIND_H
212754fe60SDimitry Andric #include <valgrind/valgrind.h>
222754fe60SDimitry Andric 
InitNotUnderValgrind()232754fe60SDimitry Andric static bool InitNotUnderValgrind() {
242754fe60SDimitry Andric   return !RUNNING_ON_VALGRIND;
252754fe60SDimitry Andric }
262754fe60SDimitry Andric 
272754fe60SDimitry Andric // This bool is negated from what we'd expect because code may run before it
282754fe60SDimitry Andric // gets initialized.  If that happens, it will appear to be 0 (false), and we
292754fe60SDimitry Andric // want that to cause the rest of the code in this file to run the
302754fe60SDimitry Andric // Valgrind-provided macros.
312754fe60SDimitry Andric static const bool NotUnderValgrind = InitNotUnderValgrind();
322754fe60SDimitry Andric 
RunningOnValgrind()332754fe60SDimitry Andric bool llvm::sys::RunningOnValgrind() {
342754fe60SDimitry Andric   if (NotUnderValgrind)
352754fe60SDimitry Andric     return false;
362754fe60SDimitry Andric   return RUNNING_ON_VALGRIND;
372754fe60SDimitry Andric }
382754fe60SDimitry Andric 
ValgrindDiscardTranslations(const void * Addr,size_t Len)392754fe60SDimitry Andric void llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) {
402754fe60SDimitry Andric   if (NotUnderValgrind)
412754fe60SDimitry Andric     return;
422754fe60SDimitry Andric 
432754fe60SDimitry Andric   VALGRIND_DISCARD_TRANSLATIONS(Addr, Len);
442754fe60SDimitry Andric }
452754fe60SDimitry Andric 
462754fe60SDimitry Andric #else  // !HAVE_VALGRIND_VALGRIND_H
472754fe60SDimitry Andric 
RunningOnValgrind()482754fe60SDimitry Andric bool llvm::sys::RunningOnValgrind() {
492754fe60SDimitry Andric   return false;
502754fe60SDimitry Andric }
512754fe60SDimitry Andric 
ValgrindDiscardTranslations(const void * Addr,size_t Len)522754fe60SDimitry Andric void llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) {
532754fe60SDimitry Andric }
542754fe60SDimitry Andric 
552754fe60SDimitry Andric #endif  // !HAVE_VALGRIND_VALGRIND_H
56