Index: include/llvm/InitializePasses.h =================================================================== --- include/llvm/InitializePasses.h +++ include/llvm/InitializePasses.h @@ -118,6 +118,7 @@ void initializeEarlyIfConverterPass(PassRegistry&); void initializeEdgeBundlesPass(PassRegistry&); void initializeEfficiencySanitizerPass(PassRegistry&); +void initializeComprehensiveStaticInstrumentationPass(PassRegistry&); void initializeEliminateAvailableExternallyLegacyPassPass(PassRegistry &); void initializeExpandISelPseudosPass(PassRegistry&); void initializeExpandPostRAPass(PassRegistry&); Index: include/llvm/Transforms/Instrumentation.h =================================================================== --- include/llvm/Transforms/Instrumentation.h +++ include/llvm/Transforms/Instrumentation.h @@ -163,6 +163,9 @@ } #endif +// Insert ComprehensiveStaticInstrumentation instrumentation +ModulePass *createComprehensiveStaticInstrumentationPass(); + // BoundsChecking - This pass instruments the code to perform run-time bounds // checking on loads, stores, and other memory intrinsics. FunctionPass *createBoundsCheckingPass(); Index: lib/Transforms/Instrumentation/CMakeLists.txt =================================================================== --- lib/Transforms/Instrumentation/CMakeLists.txt +++ lib/Transforms/Instrumentation/CMakeLists.txt @@ -11,6 +11,7 @@ SanitizerCoverage.cpp ThreadSanitizer.cpp EfficiencySanitizer.cpp + ComprehensiveStaticInstrumentation.cpp ADDITIONAL_HEADER_DIRS ${LLVM_MAIN_INCLUDE_DIR}/llvm/Transforms Index: lib/Transforms/Instrumentation/ComprehensiveStaticInstrumentation.cpp =================================================================== --- /dev/null +++ lib/Transforms/Instrumentation/ComprehensiveStaticInstrumentation.cpp @@ -0,0 +1,37 @@ +#include "llvm/IR/Module.h" +#include "llvm/Transforms/Instrumentation.h" + +using namespace llvm; + +#define DEBUG_TYPE "csi" + +namespace { +/// The Comprehensive Static Instrumentation pass. +/// Inserts calls to user-defined hooks at predefined points in the IR. +struct ComprehensiveStaticInstrumentation : public ModulePass { + static char ID; + + ComprehensiveStaticInstrumentation() : ModulePass(ID) {} + const char *getPassName() const override; + bool runOnModule(Module &M) override; +}; +} // End anonymous namespace + +char ComprehensiveStaticInstrumentation::ID = 0; + +INITIALIZE_PASS(ComprehensiveStaticInstrumentation, "csi", + "ComprehensiveStaticInstrumentation: inserts calls to " + "user-defined hooks in the IR.", + false, false) + +const char *ComprehensiveStaticInstrumentation::getPassName() const { + return "ComprehensiveStaticInstrumentation"; +} + +ModulePass *llvm::createComprehensiveStaticInstrumentationPass() { + return new ComprehensiveStaticInstrumentation(); +} + +bool ComprehensiveStaticInstrumentation::runOnModule(Module &M) { + return false; +} Index: lib/Transforms/Instrumentation/Instrumentation.cpp =================================================================== --- lib/Transforms/Instrumentation/Instrumentation.cpp +++ lib/Transforms/Instrumentation/Instrumentation.cpp @@ -69,6 +69,7 @@ initializeSanitizerCoverageModulePass(Registry); initializeDataFlowSanitizerPass(Registry); initializeEfficiencySanitizerPass(Registry); + initializeComprehensiveStaticInstrumentationPass(Registry); } /// LLVMInitializeInstrumentation - C binding for