| //===- Transforms/Instrumentation.h - Instrumentation passes ----*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines constructor functions for instrumentation passes. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_TRANSFORMS_INSTRUMENTATION_H |
| #define LLVM_TRANSFORMS_INSTRUMENTATION_H |
| |
| #include "llvm/ADT/StringRef.h" |
| |
| #if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID) |
| inline void *getDFSanArgTLSPtrForJIT() { |
| extern __thread __attribute__((tls_model("initial-exec"))) |
| void *__dfsan_arg_tls; |
| return (void *)&__dfsan_arg_tls; |
| } |
| |
| inline void *getDFSanRetValTLSPtrForJIT() { |
| extern __thread __attribute__((tls_model("initial-exec"))) |
| void *__dfsan_retval_tls; |
| return (void *)&__dfsan_retval_tls; |
| } |
| #endif |
| |
| namespace llvm { |
| |
| class ModulePass; |
| class FunctionPass; |
| |
| // Insert GCOV profiling instrumentation |
| struct GCOVOptions { |
| static GCOVOptions getDefault(); |
| |
| // Specify whether to emit .gcno files. |
| bool EmitNotes; |
| |
| // Specify whether to modify the program to emit .gcda files when run. |
| bool EmitData; |
| |
| // A four-byte version string. The meaning of a version string is described in |
| // gcc's gcov-io.h |
| char Version[4]; |
| |
| // Emit a "cfg checksum" that follows the "line number checksum" of a |
| // function. This affects both .gcno and .gcda files. |
| bool UseCfgChecksum; |
| |
| // Add the 'noredzone' attribute to added runtime library calls. |
| bool NoRedZone; |
| |
| // Emit the name of the function in the .gcda files. This is redundant, as |
| // the function identifier can be used to find the name from the .gcno file. |
| bool FunctionNamesInData; |
| }; |
| ModulePass *createGCOVProfilerPass(const GCOVOptions &Options = |
| GCOVOptions::getDefault()); |
| |
| // Insert AddressSanitizer (address sanity checking) instrumentation |
| FunctionPass *createAddressSanitizerFunctionPass(); |
| ModulePass *createAddressSanitizerModulePass(); |
| |
| // Insert MemorySanitizer instrumentation (detection of uninitialized reads) |
| FunctionPass *createMemorySanitizerPass(int TrackOrigins = 0); |
| |
| // Insert ThreadSanitizer (race detection) instrumentation |
| FunctionPass *createThreadSanitizerPass(); |
| |
| // Insert DataFlowSanitizer (dynamic data flow analysis) instrumentation |
| ModulePass *createDataFlowSanitizerPass(StringRef ABIListFile = StringRef(), |
| void *(*getArgTLS)() = nullptr, |
| void *(*getRetValTLS)() = nullptr); |
| |
| #if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID) |
| inline ModulePass *createDataFlowSanitizerPassForJIT(StringRef ABIListFile = |
| StringRef()) { |
| return createDataFlowSanitizerPass(ABIListFile, getDFSanArgTLSPtrForJIT, |
| getDFSanRetValTLSPtrForJIT); |
| } |
| #endif |
| |
| // BoundsChecking - This pass instruments the code to perform run-time bounds |
| // checking on loads, stores, and other memory intrinsics. |
| FunctionPass *createBoundsCheckingPass(); |
| |
| /// createDebugIRPass - Enable interactive stepping through LLVM IR in LLDB (or |
| /// GDB) and generate a file with the LLVM IR to be |
| /// displayed in the debugger. |
| /// |
| /// Existing debug metadata is preserved (but may be modified) in order to allow |
| /// accessing variables in the original source. The line table and file |
| /// information is modified to correspond to the lines in the LLVM IR. If |
| /// Filename and Directory are empty, a file name is generated based on existing |
| /// debug information. If no debug information is available, a temporary file |
| /// name is generated. |
| /// |
| /// @param HideDebugIntrinsics Omit debug intrinsics in emitted IR source file. |
| /// @param HideDebugMetadata Omit debug metadata in emitted IR source file. |
| /// @param Directory Embed this directory in the debug information. |
| /// @param Filename Embed this file name in the debug information. |
| ModulePass *createDebugIRPass(bool HideDebugIntrinsics, |
| bool HideDebugMetadata, |
| StringRef Directory = StringRef(), |
| StringRef Filename = StringRef()); |
| |
| /// createDebugIRPass - Enable interactive stepping through LLVM IR in LLDB |
| /// (or GDB) with an existing IR file on disk. When creating |
| /// a DebugIR pass with this function, no source file is |
| /// output to disk and the existing one is unmodified. Debug |
| /// metadata in the Module is created/updated to point to |
| /// the existing textual IR file on disk. |
| /// NOTE: If the IR file to be debugged is not on disk, use the version of this |
| /// function with parameters in order to generate the file that will be |
| /// seen by the debugger. |
| ModulePass *createDebugIRPass(); |
| |
| } // End llvm namespace |
| |
| #endif |