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