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) 21inline void *getDFSanArgTLSPtrForJIT() { 22 extern __thread __attribute__((tls_model("initial-exec"))) 23 void *__dfsan_arg_tls; 24 return (void *)&__dfsan_arg_tls; 25} 26 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 34namespace llvm { 35 36class ModulePass; 37class FunctionPass; 38 39// Insert GCOV profiling instrumentation 40struct 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}; 68ModulePass *createGCOVProfilerPass(const GCOVOptions &Options = 69 GCOVOptions::getDefault()); 70 71/// Options for the frontend instrumentation based profiling pass. 72struct InstrProfOptions { 73 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. 80ModulePass *createInstrProfilingPass( 81 const InstrProfOptions &Options = InstrProfOptions()); 82 83// Insert AddressSanitizer (address sanity checking) instrumentation 84FunctionPass *createAddressSanitizerFunctionPass(); 85ModulePass *createAddressSanitizerModulePass(); 86 87// Insert MemorySanitizer instrumentation (detection of uninitialized reads) 88FunctionPass *createMemorySanitizerPass(int TrackOrigins = 0); 89 90// Insert ThreadSanitizer (race detection) instrumentation 91FunctionPass *createThreadSanitizerPass(); 92 93// Insert DataFlowSanitizer (dynamic data flow analysis) instrumentation 94ModulePass *createDataFlowSanitizerPass( 95 const std::vector<std::string> &ABIListFiles = std::vector<std::string>(), 96 void *(*getArgTLS)() = nullptr, void *(*getRetValTLS)() = nullptr); 97 98// Insert SanitizerCoverage instrumentation. 99ModulePass *createSanitizerCoverageModulePass(int CoverageLevel); 100 101#if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID) 102inline 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. 111FunctionPass *createBoundsCheckingPass(); 112 113} // End llvm namespace 114 115#endif 116