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