| //===-- Instrumentation.cpp - TransformUtils Infrastructure ---------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines the common initialization infrastructure for the |
| // Instrumentation library. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/Transforms/Instrumentation.h" |
| #include "llvm-c/Initialization.h" |
| #include "llvm/IR/IntrinsicInst.h" |
| #include "llvm/InitializePasses.h" |
| #include "llvm/PassRegistry.h" |
| |
| using namespace llvm; |
| |
| /// Moves I before IP. Returns new insert point. |
| static BasicBlock::iterator moveBeforeInsertPoint(BasicBlock::iterator I, BasicBlock::iterator IP) { |
| // If I is IP, move the insert point down. |
| if (I == IP) |
| return ++IP; |
| // Otherwise, move I before IP and return IP. |
| I->moveBefore(&*IP); |
| return IP; |
| } |
| |
| /// Instrumentation passes often insert conditional checks into entry blocks. |
| /// Call this function before splitting the entry block to move instructions |
| /// that must remain in the entry block up before the split point. Static |
| /// allocas and llvm.localescape calls, for example, must remain in the entry |
| /// block. |
| BasicBlock::iterator llvm::PrepareToSplitEntryBlock(BasicBlock &BB, |
| BasicBlock::iterator IP) { |
| assert(&BB.getParent()->getEntryBlock() == &BB); |
| for (auto I = IP, E = BB.end(); I != E; ++I) { |
| bool KeepInEntry = false; |
| if (auto *AI = dyn_cast<AllocaInst>(I)) { |
| if (AI->isStaticAlloca()) |
| KeepInEntry = true; |
| } else if (auto *II = dyn_cast<IntrinsicInst>(I)) { |
| if (II->getIntrinsicID() == llvm::Intrinsic::localescape) |
| KeepInEntry = true; |
| } |
| if (KeepInEntry) |
| IP = moveBeforeInsertPoint(I, IP); |
| } |
| return IP; |
| } |
| |
| /// initializeInstrumentation - Initialize all passes in the TransformUtils |
| /// library. |
| void llvm::initializeInstrumentation(PassRegistry &Registry) { |
| initializeAddressSanitizerPass(Registry); |
| initializeAddressSanitizerModulePass(Registry); |
| initializeBoundsCheckingLegacyPassPass(Registry); |
| initializeGCOVProfilerLegacyPassPass(Registry); |
| initializePGOInstrumentationGenLegacyPassPass(Registry); |
| initializePGOInstrumentationUseLegacyPassPass(Registry); |
| initializePGOIndirectCallPromotionLegacyPassPass(Registry); |
| initializePGOMemOPSizeOptLegacyPassPass(Registry); |
| initializeInstrProfilingLegacyPassPass(Registry); |
| initializeMemorySanitizerPass(Registry); |
| initializeHWAddressSanitizerPass(Registry); |
| initializeThreadSanitizerPass(Registry); |
| initializeSanitizerCoverageModulePass(Registry); |
| initializeDataFlowSanitizerPass(Registry); |
| initializeEfficiencySanitizerPass(Registry); |
| } |
| |
| /// LLVMInitializeInstrumentation - C binding for |
| /// initializeInstrumentation. |
| void LLVMInitializeInstrumentation(LLVMPassRegistryRef R) { |
| initializeInstrumentation(*unwrap(R)); |
| } |