Home | History | Annotate | Download | only in Support
      1 //===- llvm/Support/Valgrind.h - Communication with Valgrind -----*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // Methods for communicating with a valgrind instance this program is running
     11 // under.  These are all no-ops unless LLVM was configured on a system with the
     12 // valgrind headers installed and valgrind is controlling this process.
     13 //
     14 //===----------------------------------------------------------------------===//
     15 
     16 #ifndef LLVM_SYSTEM_VALGRIND_H
     17 #define LLVM_SYSTEM_VALGRIND_H
     18 
     19 #include "llvm/Config/llvm-config.h"
     20 #include "llvm/Support/Compiler.h"
     21 #include <stddef.h>
     22 
     23 #if LLVM_ENABLE_THREADS != 0 && !defined(NDEBUG)
     24 // tsan (Thread Sanitizer) is a valgrind-based tool that detects these exact
     25 // functions by name.
     26 extern "C" {
     27 LLVM_ATTRIBUTE_WEAK void AnnotateHappensAfter(const char *file, int line,
     28                                               const volatile void *cv);
     29 LLVM_ATTRIBUTE_WEAK void AnnotateHappensBefore(const char *file, int line,
     30                                                const volatile void *cv);
     31 LLVM_ATTRIBUTE_WEAK void AnnotateIgnoreWritesBegin(const char *file, int line);
     32 LLVM_ATTRIBUTE_WEAK void AnnotateIgnoreWritesEnd(const char *file, int line);
     33 }
     34 #endif
     35 
     36 namespace llvm {
     37 namespace sys {
     38   // True if Valgrind is controlling this process.
     39   bool RunningOnValgrind();
     40 
     41   // Discard valgrind's translation of code in the range [Addr .. Addr + Len).
     42   // Otherwise valgrind may continue to execute the old version of the code.
     43   void ValgrindDiscardTranslations(const void *Addr, size_t Len);
     44 
     45 #if LLVM_ENABLE_THREADS != 0 && !defined(NDEBUG)
     46   // Thread Sanitizer is a valgrind tool that finds races in code.
     47   // See http://code.google.com/p/data-race-test/wiki/DynamicAnnotations .
     48 
     49   // This marker is used to define a happens-before arc. The race detector will
     50   // infer an arc from the begin to the end when they share the same pointer
     51   // argument.
     52   #define TsanHappensBefore(cv) \
     53     AnnotateHappensBefore(__FILE__, __LINE__, cv)
     54 
     55   // This marker defines the destination of a happens-before arc.
     56   #define TsanHappensAfter(cv) \
     57     AnnotateHappensAfter(__FILE__, __LINE__, cv)
     58 
     59   // Ignore any races on writes between here and the next TsanIgnoreWritesEnd.
     60   #define TsanIgnoreWritesBegin() \
     61     AnnotateIgnoreWritesBegin(__FILE__, __LINE__)
     62 
     63   // Resume checking for racy writes.
     64   #define TsanIgnoreWritesEnd() \
     65     AnnotateIgnoreWritesEnd(__FILE__, __LINE__)
     66 #else
     67   #define TsanHappensBefore(cv)
     68   #define TsanHappensAfter(cv)
     69   #define TsanIgnoreWritesBegin()
     70   #define TsanIgnoreWritesEnd()
     71 #endif
     72 }
     73 }
     74 
     75 #endif
     76