1 //===- Transforms/Instrumentation.h - Instrumentation passes ----*- 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 // This file defines constructor functions for instrumentation passes. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_TRANSFORMS_INSTRUMENTATION_H 15 #define LLVM_TRANSFORMS_INSTRUMENTATION_H 16 17 #include "llvm/ADT/StringRef.h" 18 #include <vector> 19 20 #if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID) getDFSanArgTLSPtrForJIT()21inline void *getDFSanArgTLSPtrForJIT() { 22 extern __thread __attribute__((tls_model("initial-exec"))) 23 void *__dfsan_arg_tls; 24 return (void *)&__dfsan_arg_tls; 25 } 26 getDFSanRetValTLSPtrForJIT()27inline void *getDFSanRetValTLSPtrForJIT() { 28 extern __thread __attribute__((tls_model("initial-exec"))) 29 void *__dfsan_retval_tls; 30 return (void *)&__dfsan_retval_tls; 31 } 32 #endif 33 34 namespace llvm { 35 36 class ModulePass; 37 class FunctionPass; 38 39 // Insert GCOV profiling instrumentation 40 struct GCOVOptions { 41 static GCOVOptions getDefault(); 42 43 // Specify whether to emit .gcno files. 44 bool EmitNotes; 45 46 // Specify whether to modify the program to emit .gcda files when run. 47 bool EmitData; 48 49 // A four-byte version string. The meaning of a version string is described in 50 // gcc's gcov-io.h 51 char Version[4]; 52 53 // Emit a "cfg checksum" that follows the "line number checksum" of a 54 // function. This affects both .gcno and .gcda files. 55 bool UseCfgChecksum; 56 57 // Add the 'noredzone' attribute to added runtime library calls. 58 bool NoRedZone; 59 60 // Emit the name of the function in the .gcda files. This is redundant, as 61 // the function identifier can be used to find the name from the .gcno file. 62 bool FunctionNamesInData; 63 64 // Emit the exit block immediately after the start block, rather than after 65 // all of the function body's blocks. 66 bool ExitBlockBeforeBody; 67 }; 68 ModulePass *createGCOVProfilerPass(const GCOVOptions &Options = 69 GCOVOptions::getDefault()); 70 71 /// Options for the frontend instrumentation based profiling pass. 72 struct InstrProfOptions { InstrProfOptionsInstrProfOptions73 InstrProfOptions() : NoRedZone(false) {} 74 75 // Add the 'noredzone' attribute to added runtime library calls. 76 bool NoRedZone; 77 }; 78 79 /// Insert frontend instrumentation based profiling. 80 ModulePass *createInstrProfilingPass( 81 const InstrProfOptions &Options = InstrProfOptions()); 82 83 // Insert AddressSanitizer (address sanity checking) instrumentation 84 FunctionPass *createAddressSanitizerFunctionPass(); 85 ModulePass *createAddressSanitizerModulePass(); 86 87 // Insert MemorySanitizer instrumentation (detection of uninitialized reads) 88 FunctionPass *createMemorySanitizerPass(int TrackOrigins = 0); 89 90 // Insert ThreadSanitizer (race detection) instrumentation 91 FunctionPass *createThreadSanitizerPass(); 92 93 // Insert DataFlowSanitizer (dynamic data flow analysis) instrumentation 94 ModulePass *createDataFlowSanitizerPass( 95 const std::vector<std::string> &ABIListFiles = std::vector<std::string>(), 96 void *(*getArgTLS)() = nullptr, void *(*getRetValTLS)() = nullptr); 97 98 // Insert SanitizerCoverage instrumentation. 99 ModulePass *createSanitizerCoverageModulePass(int CoverageLevel); 100 101 #if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID) 102 inline ModulePass *createDataFlowSanitizerPassForJIT( 103 const std::vector<std::string> &ABIListFiles = std::vector<std::string>()) { 104 return createDataFlowSanitizerPass(ABIListFiles, getDFSanArgTLSPtrForJIT, 105 getDFSanRetValTLSPtrForJIT); 106 } 107 #endif 108 109 // BoundsChecking - This pass instruments the code to perform run-time bounds 110 // checking on loads, stores, and other memory intrinsics. 111 FunctionPass *createBoundsCheckingPass(); 112 113 } // End llvm namespace 114 115 #endif 116