Home | History | Annotate | Download | only in IPO
      1 //===-- StripDeadPrototypes.cpp - Remove unused function declarations ----===//
      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 pass loops over all of the functions in the input module, looking for
     11 // dead declarations and removes them. Dead declarations are declarations of
     12 // functions for which no implementation is available (i.e., declarations for
     13 // unused library functions).
     14 //
     15 //===----------------------------------------------------------------------===//
     16 
     17 #define DEBUG_TYPE "strip-dead-prototypes"
     18 #include "llvm/Transforms/IPO.h"
     19 #include "llvm/Pass.h"
     20 #include "llvm/Module.h"
     21 #include "llvm/ADT/Statistic.h"
     22 using namespace llvm;
     23 
     24 STATISTIC(NumDeadPrototypes, "Number of dead prototypes removed");
     25 
     26 namespace {
     27 
     28 /// @brief Pass to remove unused function declarations.
     29 class StripDeadPrototypesPass : public ModulePass {
     30 public:
     31   static char ID; // Pass identification, replacement for typeid
     32   StripDeadPrototypesPass() : ModulePass(ID) {
     33     initializeStripDeadPrototypesPassPass(*PassRegistry::getPassRegistry());
     34   }
     35   virtual bool runOnModule(Module &M);
     36 };
     37 
     38 } // end anonymous namespace
     39 
     40 char StripDeadPrototypesPass::ID = 0;
     41 INITIALIZE_PASS(StripDeadPrototypesPass, "strip-dead-prototypes",
     42                 "Strip Unused Function Prototypes", false, false)
     43 
     44 bool StripDeadPrototypesPass::runOnModule(Module &M) {
     45   bool MadeChange = false;
     46 
     47   // Erase dead function prototypes.
     48   for (Module::iterator I = M.begin(), E = M.end(); I != E; ) {
     49     Function *F = I++;
     50     // Function must be a prototype and unused.
     51     if (F->isDeclaration() && F->use_empty()) {
     52       F->eraseFromParent();
     53       ++NumDeadPrototypes;
     54       MadeChange = true;
     55     }
     56   }
     57 
     58   // Erase dead global var prototypes.
     59   for (Module::global_iterator I = M.global_begin(), E = M.global_end();
     60        I != E; ) {
     61     GlobalVariable *GV = I++;
     62     // Global must be a prototype and unused.
     63     if (GV->isDeclaration() && GV->use_empty())
     64       GV->eraseFromParent();
     65   }
     66 
     67   // Return an indication of whether we changed anything or not.
     68   return MadeChange;
     69 }
     70 
     71 ModulePass *llvm::createStripDeadPrototypesPass() {
     72   return new StripDeadPrototypesPass();
     73 }
     74