1085566990b5cc483b9bc5f7c9abd12e976062d65Gordon Henriksen//===-- StripDeadPrototypes.cpp - Remove unused function declarations ----===// 2f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// 3f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// The LLVM Compiler Infrastructure 4f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// 5081ce940e7351e90fff829320b7dc6738a6b3815Chris Lattner// This file is distributed under the University of Illinois Open Source 6081ce940e7351e90fff829320b7dc6738a6b3815Chris Lattner// License. See LICENSE.TXT for details. 7f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// 8f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman//===----------------------------------------------------------------------===// 9f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// 10f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// This pass loops over all of the functions in the input module, looking for 11085566990b5cc483b9bc5f7c9abd12e976062d65Gordon Henriksen// dead declarations and removes them. Dead declarations are declarations of 12085566990b5cc483b9bc5f7c9abd12e976062d65Gordon Henriksen// functions for which no implementation is available (i.e., declarations for 13085566990b5cc483b9bc5f7c9abd12e976062d65Gordon Henriksen// unused library functions). 14f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// 15f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman//===----------------------------------------------------------------------===// 16f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 17f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#define DEBUG_TYPE "strip-dead-prototypes" 18f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#include "llvm/Transforms/IPO.h" 19f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#include "llvm/Pass.h" 20f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#include "llvm/Module.h" 21f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#include "llvm/ADT/Statistic.h" 22f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohmanusing namespace llvm; 23f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 24f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan GohmanSTATISTIC(NumDeadPrototypes, "Number of dead prototypes removed"); 25f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 26f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohmannamespace { 27f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 28f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman/// @brief Pass to remove unused function declarations. 29492d06efde44a4e38a6ed321ada4af5a75494df6Nick Lewyckyclass StripDeadPrototypesPass : public ModulePass { 30f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohmanpublic: 31f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman static char ID; // Pass identification, replacement for typeid 32a65d6a686e6ad865c61aec70c5bdfb30bf6f5b22Owen Anderson StripDeadPrototypesPass() : ModulePass(ID) { 33a65d6a686e6ad865c61aec70c5bdfb30bf6f5b22Owen Anderson initializeStripDeadPrototypesPassPass(*PassRegistry::getPassRegistry()); 34a65d6a686e6ad865c61aec70c5bdfb30bf6f5b22Owen Anderson } 35f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman virtual bool runOnModule(Module &M); 36f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman}; 37f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 38f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman} // end anonymous namespace 39f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 40089efffd7d1ca0d10522ace38d36e0a67f4fac2dDan Gohmanchar StripDeadPrototypesPass::ID = 0; 416374c3d4d7b1fece8ed9acb590f809a0e6fb17eeOwen AndersonINITIALIZE_PASS(StripDeadPrototypesPass, "strip-dead-prototypes", 421434dfa8cead98bd1e63411fcb9424e1d37f61acOwen Anderson "Strip Unused Function Prototypes", false, false) 43089efffd7d1ca0d10522ace38d36e0a67f4fac2dDan Gohman 44f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohmanbool StripDeadPrototypesPass::runOnModule(Module &M) { 45f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman bool MadeChange = false; 46f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 47f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman // Erase dead function prototypes. 48f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman for (Module::iterator I = M.begin(), E = M.end(); I != E; ) { 49f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman Function *F = I++; 50f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman // Function must be a prototype and unused. 51f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman if (F->isDeclaration() && F->use_empty()) { 52f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman F->eraseFromParent(); 53f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman ++NumDeadPrototypes; 54f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman MadeChange = true; 55f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman } 56f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman } 57f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 58f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman // Erase dead global var prototypes. 59f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman for (Module::global_iterator I = M.global_begin(), E = M.global_end(); 60f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman I != E; ) { 61f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman GlobalVariable *GV = I++; 62f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman // Global must be a prototype and unused. 63f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman if (GV->isDeclaration() && GV->use_empty()) 64f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman GV->eraseFromParent(); 65f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman } 66f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 67f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman // Return an indication of whether we changed anything or not. 68f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman return MadeChange; 69f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman} 70f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 71f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan GohmanModulePass *llvm::createStripDeadPrototypesPass() { 72f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman return new StripDeadPrototypesPass(); 73f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman} 74