1//===-- Instrumentation.cpp - TransformUtils Infrastructure ---------------===//
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 the common initialization infrastructure for the
11// Instrumentation library.
12//
13//===----------------------------------------------------------------------===//
14
15#include "llvm/Transforms/Instrumentation.h"
16#include "llvm-c/Initialization.h"
17#include "llvm/IR/IntrinsicInst.h"
18#include "llvm/InitializePasses.h"
19#include "llvm/PassRegistry.h"
20
21using namespace llvm;
22
23/// Moves I before IP. Returns new insert point.
24static BasicBlock::iterator moveBeforeInsertPoint(BasicBlock::iterator I, BasicBlock::iterator IP) {
25  // If I is IP, move the insert point down.
26  if (I == IP)
27    return ++IP;
28  // Otherwise, move I before IP and return IP.
29  I->moveBefore(&*IP);
30  return IP;
31}
32
33/// Instrumentation passes often insert conditional checks into entry blocks.
34/// Call this function before splitting the entry block to move instructions
35/// that must remain in the entry block up before the split point. Static
36/// allocas and llvm.localescape calls, for example, must remain in the entry
37/// block.
38BasicBlock::iterator llvm::PrepareToSplitEntryBlock(BasicBlock &BB,
39                                                    BasicBlock::iterator IP) {
40  assert(&BB.getParent()->getEntryBlock() == &BB);
41  for (auto I = IP, E = BB.end(); I != E; ++I) {
42    bool KeepInEntry = false;
43    if (auto *AI = dyn_cast<AllocaInst>(I)) {
44      if (AI->isStaticAlloca())
45        KeepInEntry = true;
46    } else if (auto *II = dyn_cast<IntrinsicInst>(I)) {
47      if (II->getIntrinsicID() == llvm::Intrinsic::localescape)
48        KeepInEntry = true;
49    }
50    if (KeepInEntry)
51      IP = moveBeforeInsertPoint(I, IP);
52  }
53  return IP;
54}
55
56/// initializeInstrumentation - Initialize all passes in the TransformUtils
57/// library.
58void llvm::initializeInstrumentation(PassRegistry &Registry) {
59  initializeAddressSanitizerPass(Registry);
60  initializeAddressSanitizerModulePass(Registry);
61  initializeBoundsCheckingPass(Registry);
62  initializeGCOVProfilerLegacyPassPass(Registry);
63  initializePGOInstrumentationGenLegacyPassPass(Registry);
64  initializePGOInstrumentationUseLegacyPassPass(Registry);
65  initializePGOIndirectCallPromotionLegacyPassPass(Registry);
66  initializeInstrProfilingLegacyPassPass(Registry);
67  initializeMemorySanitizerPass(Registry);
68  initializeThreadSanitizerPass(Registry);
69  initializeSanitizerCoverageModulePass(Registry);
70  initializeDataFlowSanitizerPass(Registry);
71  initializeEfficiencySanitizerPass(Registry);
72}
73
74/// LLVMInitializeInstrumentation - C binding for
75/// initializeInstrumentation.
76void LLVMInitializeInstrumentation(LLVMPassRegistryRef R) {
77  initializeInstrumentation(*unwrap(R));
78}
79