X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FTransforms%2FInstrumentation.h;h=a1477930ed62debdb1b137a82b44e30257c483d9;hb=320efb05a1e7516268e711901ca9454bb4d94172;hp=84e3e54c205dc895270c1bb63d5b527fc654592d;hpb=701f5ac73c782da45d5007f72f7d3dc514166acd;p=oota-llvm.git diff --git a/include/llvm/Transforms/Instrumentation.h b/include/llvm/Transforms/Instrumentation.h index 84e3e54c205..a1477930ed6 100644 --- a/include/llvm/Transforms/Instrumentation.h +++ b/include/llvm/Transforms/Instrumentation.h @@ -2,64 +2,113 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // -// This files defines constructor functions for instrumentation passes. +// This file defines constructor functions for instrumentation passes. // //===----------------------------------------------------------------------===// #ifndef LLVM_TRANSFORMS_INSTRUMENTATION_H #define LLVM_TRANSFORMS_INSTRUMENTATION_H +#include "llvm/ADT/StringRef.h" +#include + +#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; -// Reoptimizer support pass: add instrumentation calls to back-edges of loops -FunctionPass *createLoopInstrumentationPass (); +// Insert GCOV profiling instrumentation +struct GCOVOptions { + static GCOVOptions getDefault(); -// Reoptimizer support pass: combine multiple back-edges w/ same target into one -FunctionPass *createCombineBranchesPass(); + // Specify whether to emit .gcno files. + bool EmitNotes; -// Reoptimizer support pass: emit table of global functions -ModulePass *createEmitFunctionTablePass (); + // Specify whether to modify the program to emit .gcda files when run. + bool EmitData; -// Reoptimizer support pass: insert function profiling instrumentation -ModulePass *createFunctionProfilerPass(); + // A four-byte version string. The meaning of a version string is described in + // gcc's gcov-io.h + char Version[4]; -// Reoptimizer support pass: insert block profiling instrumentation -ModulePass *createBlockProfilerPass(); + // Emit a "cfg checksum" that follows the "line number checksum" of a + // function. This affects both .gcno and .gcda files. + bool UseCfgChecksum; -// Reoptimizer support pass: insert edge profiling instrumentation -ModulePass *createEdgeProfilerPass(); + // Add the 'noredzone' attribute to added runtime library calls. + bool NoRedZone; -// Reoptimizer support pass: insert basic block tracing instrumentation -ModulePass *createTraceBasicBlockPass(); + // 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; -// Reoptimizer support pass: insert counting of execute paths instrumentation -FunctionPass *createProfilePathsPass(); + // Emit the exit block immediately after the start block, rather than after + // all of the function body's blocks. + bool ExitBlockBeforeBody; +}; +ModulePass *createGCOVProfilerPass(const GCOVOptions &Options = + GCOVOptions::getDefault()); -// Random Sampling Profiling Framework -ModulePass* createBlockProfilerRSPass(); -ModulePass* createFunctionProfilerRSPass(); -ModulePass* createNullProfilerRSPass(); -FunctionPass* createRSProfilingPass(); +/// Options for the frontend instrumentation based profiling pass. +struct InstrProfOptions { + InstrProfOptions() : NoRedZone(false) {} + // Add the 'noredzone' attribute to added runtime library calls. + bool NoRedZone; +}; -//===----------------------------------------------------------------------===// -// Support for inserting LLVM code to print values at basic block and function -// exits. -// +/// Insert frontend instrumentation based profiling. +ModulePass *createInstrProfilingPass( + const InstrProfOptions &Options = InstrProfOptions()); + +// Insert AddressSanitizer (address sanity checking) instrumentation +FunctionPass *createAddressSanitizerFunctionPass(); +ModulePass *createAddressSanitizerModulePass(); -// Just trace function entry/exit -FunctionPass *createTraceValuesPassForBasicBlocks(); +// 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( + const std::vector &ABIListFiles = std::vector(), + void *(*getArgTLS)() = nullptr, void *(*getRetValTLS)() = nullptr); + +// Insert SanitizerCoverage instrumentation. +ModulePass *createSanitizerCoverageModulePass(int CoverageLevel); + +#if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID) +inline ModulePass *createDataFlowSanitizerPassForJIT( + const std::vector &ABIListFiles = std::vector()) { + return createDataFlowSanitizerPass(ABIListFiles, getDFSanArgTLSPtrForJIT, + getDFSanRetValTLSPtrForJIT); +} +#endif -// Trace BB's and methods -FunctionPass *createTraceValuesPassForFunction(); +// BoundsChecking - This pass instruments the code to perform run-time bounds +// checking on loads, stores, and other memory intrinsics. +FunctionPass *createBoundsCheckingPass(); } // End llvm namespace