StripDeadPrototypes.cpp revision 7569322765651f19eea0609fb082e6b267d5d2b5
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" 22using namespace llvm; 23 24STATISTIC(NumDeadPrototypes, "Number of dead prototypes removed"); 25 26namespace { 27 28/// @brief Pass to remove unused function declarations. 29class StripDeadPrototypesPass : public ModulePass { 30public: 31 static char ID; // Pass identification, replacement for typeid 32 StripDeadPrototypesPass() : ModulePass(ID) { } 33 virtual bool runOnModule(Module &M); 34}; 35 36} // end anonymous namespace 37 38char StripDeadPrototypesPass::ID = 0; 39INITIALIZE_PASS(StripDeadPrototypesPass, "strip-dead-prototypes", 40 "Strip Unused Function Prototypes", false, false); 41 42bool StripDeadPrototypesPass::runOnModule(Module &M) { 43 bool MadeChange = false; 44 45 // Erase dead function prototypes. 46 for (Module::iterator I = M.begin(), E = M.end(); I != E; ) { 47 Function *F = I++; 48 // Function must be a prototype and unused. 49 if (F->isDeclaration() && F->use_empty()) { 50 F->eraseFromParent(); 51 ++NumDeadPrototypes; 52 MadeChange = true; 53 } 54 } 55 56 // Erase dead global var prototypes. 57 for (Module::global_iterator I = M.global_begin(), E = M.global_end(); 58 I != E; ) { 59 GlobalVariable *GV = I++; 60 // Global must be a prototype and unused. 61 if (GV->isDeclaration() && GV->use_empty()) 62 GV->eraseFromParent(); 63 } 64 65 // Return an indication of whether we changed anything or not. 66 return MadeChange; 67} 68 69ModulePass *llvm::createStripDeadPrototypesPass() { 70 return new StripDeadPrototypesPass(); 71} 72