LCOV - code coverage report
Current view: top level - lib/IR - Pass.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 91 112 81.2 %
Date: 2018-09-23 13:06:45 Functions: 31 39 79.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- Pass.cpp - LLVM Pass Infrastructure Implementation -----------------===//
       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 implements the LLVM Pass infrastructure.  It is primarily
      11             : // responsible with ensuring that passes are executed and batched together
      12             : // optimally.
      13             : //
      14             : //===----------------------------------------------------------------------===//
      15             : 
      16             : #include "llvm/Pass.h"
      17             : #include "llvm/Config/llvm-config.h"
      18             : #include "llvm/IR/Attributes.h"
      19             : #include "llvm/IR/BasicBlock.h"
      20             : #include "llvm/IR/Function.h"
      21             : #include "llvm/IR/IRPrintingPasses.h"
      22             : #include "llvm/IR/LLVMContext.h"
      23             : #include "llvm/IR/LegacyPassNameParser.h"
      24             : #include "llvm/IR/Module.h"
      25             : #include "llvm/IR/OptBisect.h"
      26             : #include "llvm/PassInfo.h"
      27             : #include "llvm/PassRegistry.h"
      28             : #include "llvm/PassSupport.h"
      29             : #include "llvm/Support/Compiler.h"
      30             : #include "llvm/Support/Debug.h"
      31             : #include "llvm/Support/raw_ostream.h"
      32             : #include <cassert>
      33             : 
      34             : using namespace llvm;
      35             : 
      36             : #define DEBUG_TYPE "ir"
      37             : 
      38             : //===----------------------------------------------------------------------===//
      39             : // Pass Implementation
      40             : //
      41             : 
      42             : // Force out-of-line virtual method.
      43    10507050 : Pass::~Pass() {
      44     9930396 :   delete Resolver;
      45     5253531 : }
      46           0 : 
      47             : // Force out-of-line virtual method.
      48           0 : ModulePass::~ModulePass() = default;
      49    10507050 : 
      50     9930396 : Pass *ModulePass::createPrinterPass(raw_ostream &OS,
      51     5253531 :                                     const std::string &Banner) const {
      52             :   return createPrintModulePass(OS, Banner);
      53             : }
      54             : 
      55             : PassManagerType ModulePass::getPotentialPassManagerType() const {
      56          23 :   return PMT_ModulePassManager;
      57             : }
      58          23 : 
      59             : bool ModulePass::skipModule(Module &M) const {
      60             :   return !M.getContext().getOptPassGate().shouldRunPass(this, M);
      61      387858 : }
      62      387858 : 
      63             : bool Pass::mustPreserveAnalysisID(char &AID) const {
      64             :   return Resolver->getAnalysisIfAvailable(&AID, true) != nullptr;
      65       23436 : }
      66       23436 : 
      67             : // dumpPassStructure - Implement the -debug-pass=Structure option
      68             : void Pass::dumpPassStructure(unsigned Offset) {
      69      439029 :   dbgs().indent(Offset*2) << getPassName() << "\n";
      70      439029 : }
      71             : 
      72             : /// getPassName - Return a nice clean name for a pass.  This usually
      73             : /// implemented in terms of the name that is registered by one of the
      74        4459 : /// Registration templates, but can be overloaded directly.
      75        4459 : StringRef Pass::getPassName() const {
      76        4459 :   AnalysisID AID =  getPassID();
      77             :   const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(AID);
      78             :   if (PI)
      79             :     return PI->getPassName();
      80             :   return "Unnamed pass: implement Pass::getPassName()";
      81      894908 : }
      82      894908 : 
      83      894908 : void Pass::preparePassManager(PMStack &) {
      84      894908 :   // By default, don't do anything.
      85      894629 : }
      86         279 : 
      87             : PassManagerType Pass::getPotentialPassManagerType() const {
      88             :   // Default implementation.
      89     4537401 :   return PMT_Unknown;
      90             : }
      91     4537401 : 
      92             : void Pass::getAnalysisUsage(AnalysisUsage &) const {
      93           0 :   // By default, no analysis results are used, all are invalidated.
      94             : }
      95           0 : 
      96             : void Pass::releaseMemory() {
      97             :   // By default, don't do anything.
      98     2940270 : }
      99             : 
     100     2940270 : void Pass::verifyAnalysis() const {
     101             :   // By default, don't do anything.
     102    36972565 : }
     103             : 
     104    36972565 : void *Pass::getAdjustedAnalysisPointer(AnalysisID AID) {
     105             :   return this;
     106           0 : }
     107             : 
     108           0 : ImmutablePass *Pass::getAsImmutablePass() {
     109             :   return nullptr;
     110    97393494 : }
     111    97393494 : 
     112             : PMDataManager *Pass::getAsPMDataManager() {
     113             :   return nullptr;
     114    82600721 : }
     115    82600721 : 
     116             : void Pass::setResolver(AnalysisResolver *AR) {
     117             :   assert(!Resolver && "Resolver is already set");
     118     5361293 :   Resolver = AR;
     119     5361293 : }
     120             : 
     121             : // print - Print out the internal state of the pass.  This is called by Analyze
     122     4700968 : // to print out the contents of an analysis.  Otherwise it is not necessary to
     123             : // implement this method.
     124     4700968 : void Pass::print(raw_ostream &OS, const Module *) const {
     125     4700968 :   OS << "Pass::print not implemented for pass: '" << getPassName() << "'!\n";
     126             : }
     127             : 
     128             : #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
     129             : // dump - call print(cerr);
     130         735 : LLVM_DUMP_METHOD void Pass::dump() const {
     131         735 :   print(dbgs(), nullptr);
     132         735 : }
     133             : #endif
     134             : 
     135             : //===----------------------------------------------------------------------===//
     136             : // ImmutablePass Implementation
     137             : //
     138             : // Force out-of-line virtual method.
     139             : ImmutablePass::~ImmutablePass() = default;
     140             : 
     141             : void ImmutablePass::initializePass() {
     142             :   // By default, don't do anything.
     143             : }
     144             : 
     145             : //===----------------------------------------------------------------------===//
     146             : // FunctionPass Implementation
     147      436121 : //
     148             : 
     149      436121 : Pass *FunctionPass::createPrinterPass(raw_ostream &OS,
     150             :                                       const std::string &Banner) const {
     151             :   return createPrintFunctionPass(OS, Banner);
     152             : }
     153             : 
     154             : PassManagerType FunctionPass::getPotentialPassManagerType() const {
     155         157 :   return PMT_FunctionPassManager;
     156             : }
     157         157 : 
     158             : bool FunctionPass::skipFunction(const Function &F) const {
     159             :   if (!F.getContext().getOptPassGate().shouldRunPass(this, F))
     160     3278041 :     return true;
     161     3278041 : 
     162             :   if (F.hasFnAttribute(Attribute::OptimizeNone)) {
     163             :     LLVM_DEBUG(dbgs() << "Skipping pass '" << getPassName() << "' on function "
     164     9282504 :                       << F.getName() << "\n");
     165     9282504 :     return true;
     166             :   }
     167             :   return false;
     168     9280976 : }
     169             : 
     170             : //===----------------------------------------------------------------------===//
     171      226299 : // BasicBlockPass Implementation
     172             : //
     173             : 
     174             : Pass *BasicBlockPass::createPrinterPass(raw_ostream &OS,
     175             :                                         const std::string &Banner) const {
     176             :   return createPrintBasicBlockPass(OS, Banner);
     177             : }
     178             : 
     179             : bool BasicBlockPass::doInitialization(Function &) {
     180           0 :   // By default, don't do anything.
     181             :   return false;
     182           0 : }
     183             : 
     184             : bool BasicBlockPass::doFinalization(Function &) {
     185        1169 :   // By default, don't do anything.
     186             :   return false;
     187        1169 : }
     188             : 
     189             : bool BasicBlockPass::skipBasicBlock(const BasicBlock &BB) const {
     190        1169 :   const Function *F = BB.getParent();
     191             :   if (!F)
     192        1169 :     return false;
     193             :   if (!F->getContext().getOptPassGate().shouldRunPass(this, BB))
     194             :     return true;
     195        1331 :   if (F->hasFnAttribute(Attribute::OptimizeNone)) {
     196        1331 :     // Report this only once per function.
     197        1331 :     if (&BB == &F->getEntryBlock())
     198             :       LLVM_DEBUG(dbgs() << "Skipping pass '" << getPassName()
     199        1331 :                         << "' on function " << F->getName() << "\n");
     200             :     return true;
     201        1331 :   }
     202             :   return false;
     203             : }
     204             : 
     205             : PassManagerType BasicBlockPass::getPotentialPassManagerType() const {
     206           0 :   return PMT_BasicBlockPassManager;
     207             : }
     208             : 
     209             : const PassInfo *Pass::lookupPassInfo(const void *TI) {
     210             :   return PassRegistry::getPassRegistry()->getPassInfo(TI);
     211           0 : }
     212           0 : 
     213             : const PassInfo *Pass::lookupPassInfo(StringRef Arg) {
     214             :   return PassRegistry::getPassRegistry()->getPassInfo(Arg);
     215        1057 : }
     216        1057 : 
     217             : Pass *Pass::createPass(AnalysisID ID) {
     218             :   const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(ID);
     219           0 :   if (!PI)
     220           0 :     return nullptr;
     221             :   return PI->createPass();
     222             : }
     223      945327 : 
     224      945327 : //===----------------------------------------------------------------------===//
     225      945327 : //                  Analysis Group Implementation Code
     226             : //===----------------------------------------------------------------------===//
     227      945327 : 
     228             : // RegisterAGBase implementation
     229             : 
     230             : RegisterAGBase::RegisterAGBase(StringRef Name, const void *InterfaceID,
     231             :                                const void *PassID, bool isDefault)
     232             :     : PassInfo(Name, InterfaceID) {
     233             :   PassRegistry::getPassRegistry()->registerAnalysisGroup(InterfaceID, PassID,
     234             :                                                          *this, isDefault);
     235             : }
     236           0 : 
     237             : //===----------------------------------------------------------------------===//
     238           0 : // PassRegistrationListener implementation
     239           0 : //
     240             : 
     241           0 : // enumeratePasses - Iterate over the registered passes, calling the
     242             : // passEnumerate callback on each PassInfo object.
     243             : void PassRegistrationListener::enumeratePasses() {
     244             :   PassRegistry::getPassRegistry()->enumerateWith(this);
     245             : }
     246             : 
     247             : PassNameParser::PassNameParser(cl::Option &O)
     248             :     : cl::parser<const PassInfo *>(O) {
     249     1124647 :   PassRegistry::getPassRegistry()->addRegistrationListener(this);
     250     1124647 : }
     251     1124647 : 
     252             : // This only gets called during static destruction, in which case the
     253      254711 : // PassRegistry will have already been destroyed by llvm_shutdown().  So
     254      254711 : // attempting to remove the registration listener is an error.
     255      254711 : PassNameParser::~PassNameParser() = default;
     256      254711 : 
     257             : //===----------------------------------------------------------------------===//
     258             : //   AnalysisUsage Class Implementation
     259             : //
     260             : 
     261             : namespace {
     262             : 
     263             : struct GetCFGOnlyPasses : public PassRegistrationListener {
     264             :   using VectorType = AnalysisUsage::VectorType;
     265             : 
     266             :   VectorType &CFGOnlyList;
     267             : 
     268             :   GetCFGOnlyPasses(VectorType &L) : CFGOnlyList(L) {}
     269             : 
     270             :   void passEnumerate(const PassInfo *P) override {
     271             :     if (P->isCFGOnlyPass())
     272             :       CFGOnlyList.push_back(P->getTypeInfo());
     273             :   }
     274      869936 : };
     275             : 
     276   302261569 : } // end anonymous namespace
     277   302261569 : 
     278    17686619 : // setPreservesCFG - This function should be called to by the pass, iff they do
     279   302261552 : // not:
     280             : //
     281             : //  1. Add or remove basic blocks from the function
     282             : //  2. Modify terminator instructions in any way.
     283             : //
     284             : // This function annotates the AnalysisUsage info object to say that analyses
     285             : // that only depend on the CFG are preserved by this pass.
     286             : void AnalysisUsage::setPreservesCFG() {
     287             :   // Since this transformation doesn't modify the CFG, it preserves all analyses
     288             :   // that only depend on the CFG (like dominators, loop info, etc...)
     289             :   GetCFGOnlyPasses(Preserved).enumeratePasses();
     290             : }
     291             : 
     292      869936 : AnalysisUsage &AnalysisUsage::addPreserved(StringRef Arg) {
     293             :   const PassInfo *PI = Pass::lookupPassInfo(Arg);
     294             :   // If the pass exists, preserve it. Otherwise silently do nothing.
     295      869936 :   if (PI) Preserved.push_back(PI->getTypeInfo());
     296      869936 :   return *this;
     297             : }
     298           0 : 
     299           0 : AnalysisUsage &AnalysisUsage::addRequiredID(const void *ID) {
     300             :   Required.push_back(ID);
     301           0 :   return *this;
     302           0 : }
     303             : 
     304             : AnalysisUsage &AnalysisUsage::addRequiredID(char &ID) {
     305        3262 :   Required.push_back(&ID);
     306        3262 :   return *this;
     307        3262 : }
     308             : 
     309             : AnalysisUsage &AnalysisUsage::addRequiredTransitiveID(char &ID) {
     310     7836892 :   Required.push_back(&ID);
     311     7836892 :   RequiredTransitive.push_back(&ID);
     312     7836900 :   return *this;
     313             : }

Generated by: LCOV version 1.13