1894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===- StripSymbols.cpp - Strip symbols and debug info from a module ------===//
2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
3894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                     The LLVM Compiler Infrastructure
4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file is distributed under the University of Illinois Open Source
6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// License. See LICENSE.TXT for details.
7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===//
9894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
10894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The StripSymbols transformation implements code stripping. Specifically, it
11894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// can delete:
12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   * names for virtual registers
14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   * symbols for internal globals and functions
15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//   * debug information
16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Note that this transformation makes code much less readable, so it should
18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// only be used in situations where the 'strip' utility would be used, such as
19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// reducing code size or making it harder to reverse engineer code.
20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===//
22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Transforms/IPO.h"
24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Constants.h"
25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/DerivedTypes.h"
26894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Instructions.h"
27894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Module.h"
28894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Pass.h"
29894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Analysis/DebugInfo.h"
30894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/ValueSymbolTable.h"
31894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Transforms/Utils/Local.h"
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/DenseMap.h"
33894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/ADT/SmallPtrSet.h"
34894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanusing namespace llvm;
35894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
36894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace {
37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class StripSymbols : public ModulePass {
38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    bool OnlyDebugInfo;
39894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  public:
40894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    static char ID; // Pass identification, replacement for typeid
41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    explicit StripSymbols(bool ODI = false)
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      : ModulePass(ID), OnlyDebugInfo(ODI) {
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        initializeStripSymbolsPass(*PassRegistry::getPassRegistry());
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
45894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
46894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool runOnModule(Module &M);
47894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
49894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      AU.setPreservesAll();
50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };
52894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
53894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class StripNonDebugSymbols : public ModulePass {
54894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  public:
55894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    static char ID; // Pass identification, replacement for typeid
56894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    explicit StripNonDebugSymbols()
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      : ModulePass(ID) {
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        initializeStripNonDebugSymbolsPass(*PassRegistry::getPassRegistry());
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool runOnModule(Module &M);
62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      AU.setPreservesAll();
65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };
67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class StripDebugDeclare : public ModulePass {
69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  public:
70894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    static char ID; // Pass identification, replacement for typeid
71894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    explicit StripDebugDeclare()
7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      : ModulePass(ID) {
7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        initializeStripDebugDeclarePass(*PassRegistry::getPassRegistry());
7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
76894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool runOnModule(Module &M);
77894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
78894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
79894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      AU.setPreservesAll();
80894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
81894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };
82894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
83894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  class StripDeadDebugInfo : public ModulePass {
84894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  public:
85894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    static char ID; // Pass identification, replacement for typeid
86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    explicit StripDeadDebugInfo()
8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      : ModulePass(ID) {
8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        initializeStripDeadDebugInfoPass(*PassRegistry::getPassRegistry());
8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual bool runOnModule(Module &M);
92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
94894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      AU.setPreservesAll();
95894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
96894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  };
97894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
98894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
99894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar StripSymbols::ID = 0;
100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanINITIALIZE_PASS(StripSymbols, "strip",
10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "Strip all symbols from a module", false, false)
102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanModulePass *llvm::createStripSymbolsPass(bool OnlyDebugInfo) {
104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return new StripSymbols(OnlyDebugInfo);
105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar StripNonDebugSymbols::ID = 0;
108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanINITIALIZE_PASS(StripNonDebugSymbols, "strip-nondebug",
109894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                "Strip all symbols, except dbg symbols, from a module",
11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                false, false)
111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
112894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanModulePass *llvm::createStripNonDebugSymbolsPass() {
113894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return new StripNonDebugSymbols();
114894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
115894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
116894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar StripDebugDeclare::ID = 0;
117894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanINITIALIZE_PASS(StripDebugDeclare, "strip-debug-declare",
11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "Strip all llvm.dbg.declare intrinsics", false, false)
119894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanModulePass *llvm::createStripDebugDeclarePass() {
121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return new StripDebugDeclare();
122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar StripDeadDebugInfo::ID = 0;
125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanINITIALIZE_PASS(StripDeadDebugInfo, "strip-dead-debug-info",
12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "Strip debug info for unused symbols", false, false)
127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanModulePass *llvm::createStripDeadDebugInfoPass() {
129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return new StripDeadDebugInfo();
130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// OnlyUsedBy - Return true if V is only used by Usr.
133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic bool OnlyUsedBy(Value *V, Value *Usr) {
134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  for(Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) {
135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    User *U = *I;
136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    if (U != Usr)
137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      return false;
138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return true;
140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic void RemoveDeadConstant(Constant *C) {
143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  assert(C->use_empty() && "Constant is not dead!");
144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  SmallPtrSet<Constant*, 4> Operands;
145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i)
14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (OnlyUsedBy(C->getOperand(i), C))
147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Operands.insert(cast<Constant>(C->getOperand(i)));
148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    if (!GV->hasLocalLinkage()) return;   // Don't delete non static globals.
150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    GV->eraseFromParent();
151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  else if (!isa<Function>(C))
153894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    if (isa<CompositeType>(C->getType()))
154894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      C->destroyConstant();
155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // If the constant referenced anything, see if we can delete it as well.
157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  for (SmallPtrSet<Constant*, 4>::iterator OI = Operands.begin(),
158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         OE = Operands.end(); OI != OE; ++OI)
159894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    RemoveDeadConstant(*OI);
160894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
161894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
162894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Strip the symbol table of its names.
163894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
164894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic void StripSymtab(ValueSymbolTable &ST, bool PreserveDbgInfo) {
165894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  for (ValueSymbolTable::iterator VI = ST.begin(), VE = ST.end(); VI != VE; ) {
166894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Value *V = VI->getValue();
167894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ++VI;
168894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    if (!isa<GlobalValue>(V) || cast<GlobalValue>(V)->hasLocalLinkage()) {
169894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!PreserveDbgInfo || !V->getName().startswith("llvm.dbg"))
170894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        // Set name to "", removing from symbol table!
171894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        V->setName("");
172894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
173894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
174894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
175894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// Strip any named types of their names.
17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic void StripTypeNames(Module &M, bool PreserveDbgInfo) {
17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  std::vector<StructType*> StructTypes;
17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  M.findUsedStructTypes(StructTypes);
18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  for (unsigned i = 0, e = StructTypes.size(); i != e; ++i) {
18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    StructType *STy = StructTypes[i];
18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (STy->isLiteral() || STy->getName().empty()) continue;
18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (PreserveDbgInfo && STy->getName().startswith("llvm.dbg"))
18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      continue;
18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    STy->setName("");
189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// Find values that are marked as llvm.used.
193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic void findUsedValues(GlobalVariable *LLVMUsed,
194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                           SmallPtrSet<const GlobalValue*, 8> &UsedValues) {
195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  if (LLVMUsed == 0) return;
196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  UsedValues.insert(LLVMUsed);
197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstantArray *Inits = dyn_cast<ConstantArray>(LLVMUsed->getInitializer());
199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  if (Inits == 0) return;
200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  for (unsigned i = 0, e = Inits->getNumOperands(); i != e; ++i)
202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    if (GlobalValue *GV =
203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          dyn_cast<GlobalValue>(Inits->getOperand(i)->stripPointerCasts()))
204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      UsedValues.insert(GV);
205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// StripSymbolNames - Strip symbol names.
208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic bool StripSymbolNames(Module &M, bool PreserveDbgInfo) {
209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  SmallPtrSet<const GlobalValue*, 8> llvmUsedValues;
211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  findUsedValues(M.getGlobalVariable("llvm.used"), llvmUsedValues);
212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  findUsedValues(M.getGlobalVariable("llvm.compiler.used"), llvmUsedValues);
213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
214894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  for (Module::global_iterator I = M.global_begin(), E = M.global_end();
215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman       I != E; ++I) {
216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0)
217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!PreserveDbgInfo || !I->getName().startswith("llvm.dbg"))
218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        I->setName("");     // Internal symbols can't participate in linkage
219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0)
223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (!PreserveDbgInfo || !I->getName().startswith("llvm.dbg"))
224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        I->setName("");     // Internal symbols can't participate in linkage
225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    StripSymtab(I->getValueSymbolTable(), PreserveDbgInfo);
226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // Remove all names from types.
22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StripTypeNames(M, PreserveDbgInfo);
230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return true;
232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// StripDebugInfo - Strip debug info in the module if it exists.
235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// To do this, we remove llvm.dbg.func.start, llvm.dbg.stoppoint, and
236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// llvm.dbg.region.end calls, and any globals they point to if now dead.
237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic bool StripDebugInfo(Module &M) {
238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  bool Changed = false;
240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // Remove all of the calls to the debugger intrinsics, and remove them from
242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // the module.
243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  if (Function *Declare = M.getFunction("llvm.dbg.declare")) {
244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    while (!Declare->use_empty()) {
245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      CallInst *CI = cast<CallInst>(Declare->use_back());
246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      CI->eraseFromParent();
247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Declare->eraseFromParent();
249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Changed = true;
250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  if (Function *DbgVal = M.getFunction("llvm.dbg.value")) {
253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    while (!DbgVal->use_empty()) {
254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      CallInst *CI = cast<CallInst>(DbgVal->use_back());
255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      CI->eraseFromParent();
256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    DbgVal->eraseFromParent();
258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Changed = true;
259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  for (Module::named_metadata_iterator NMI = M.named_metadata_begin(),
262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         NME = M.named_metadata_end(); NMI != NME;) {
263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    NamedMDNode *NMD = NMI;
264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    ++NMI;
265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    if (NMD->getName().startswith("llvm.dbg.")) {
266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      NMD->eraseFromParent();
267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Changed = true;
268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  for (Module::iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI)
272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    for (Function::iterator FI = MI->begin(), FE = MI->end(); FI != FE;
273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman         ++FI)
274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE;
275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman           ++BI) {
276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        if (!BI->getDebugLoc().isUnknown()) {
277894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          Changed = true;
278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          BI->setDebugLoc(DebugLoc());
279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        }
280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return Changed;
283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool StripSymbols::runOnModule(Module &M) {
286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  bool Changed = false;
287894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Changed |= StripDebugInfo(M);
288894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  if (!OnlyDebugInfo)
289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Changed |= StripSymbolNames(M, false);
290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return Changed;
291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool StripNonDebugSymbols::runOnModule(Module &M) {
294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return StripSymbolNames(M, true);
295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool StripDebugDeclare::runOnModule(Module &M) {
298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Function *Declare = M.getFunction("llvm.dbg.declare");
300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  std::vector<Constant*> DeadConstants;
301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  if (Declare) {
303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    while (!Declare->use_empty()) {
304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      CallInst *CI = cast<CallInst>(Declare->use_back());
305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Value *Arg1 = CI->getArgOperand(0);
306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      Value *Arg2 = CI->getArgOperand(1);
307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      assert(CI->use_empty() && "llvm.dbg intrinsic should have void result");
308894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      CI->eraseFromParent();
309894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (Arg1->use_empty()) {
310894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        if (Constant *C = dyn_cast<Constant>(Arg1))
311894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          DeadConstants.push_back(C);
312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        else
313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          RecursivelyDeleteTriviallyDeadInstructions(Arg1);
314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (Arg2->use_empty())
316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        if (Constant *C = dyn_cast<Constant>(Arg2))
317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          DeadConstants.push_back(C);
318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Declare->eraseFromParent();
320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  while (!DeadConstants.empty()) {
323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    Constant *C = DeadConstants.back();
324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    DeadConstants.pop_back();
325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (GV->hasLocalLinkage())
327894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        RemoveDeadConstant(GV);
328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    } else
329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      RemoveDeadConstant(C);
330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return true;
333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// printer to not emit usual symbol prefix before the symbol name is used then
337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// return linkage name after skipping this special LLVM prefix.
338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic StringRef getRealLinkageName(StringRef LinkageName) {
339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  char One = '\1';
340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  if (LinkageName.startswith(StringRef(&One, 1)))
341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return LinkageName.substr(1);
342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return LinkageName;
343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool StripDeadDebugInfo::runOnModule(Module &M) {
346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  bool Changed = false;
347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // Debugging infomration is encoded in llvm IR using metadata. This is designed
349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // such a way that debug info for symbols preserved even if symbols are
350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // optimized away by the optimizer. This special pass removes debug info for
351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // such symbols.
352894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
353894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // llvm.dbg.gv keeps track of debug info for global variables.
354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.gv")) {
355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    SmallVector<MDNode *, 8> MDs;
356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (DIGlobalVariable(NMD->getOperand(i)).Verify())
358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        MDs.push_back(NMD->getOperand(i));
359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      else
360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        Changed = true;
361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    NMD->eraseFromParent();
362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    NMD = NULL;
363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    for (SmallVector<MDNode *, 8>::iterator I = MDs.begin(),
365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman           E = MDs.end(); I != E; ++I) {
36619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      GlobalVariable *GV = DIGlobalVariable(*I).getGlobal();
36719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (GV && M.getGlobalVariable(GV->getName(), true)) {
368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        if (!NMD)
369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          NMD = M.getOrInsertNamedMetadata("llvm.dbg.gv");
370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        NMD->addOperand(*I);
371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      else
373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        Changed = true;
374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  // llvm.dbg.sp keeps track of debug info for subprograms.
378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp")) {
379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    SmallVector<MDNode *, 8> MDs;
380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
381894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (DISubprogram(NMD->getOperand(i)).Verify())
382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        MDs.push_back(NMD->getOperand(i));
383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      else
384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        Changed = true;
385894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    NMD->eraseFromParent();
386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    NMD = NULL;
387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    for (SmallVector<MDNode *, 8>::iterator I = MDs.begin(),
389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman           E = MDs.end(); I != E; ++I) {
390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      bool FnIsLive = false;
391894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (Function *F = DISubprogram(*I).getFunction())
392894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        if (M.getFunction(F->getName()))
393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          FnIsLive = true;
394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      if (FnIsLive) {
395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          if (!NMD)
396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            NMD = M.getOrInsertNamedMetadata("llvm.dbg.sp");
397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          NMD->addOperand(*I);
398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      } else {
399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        // Remove llvm.dbg.lv.fnname named mdnode which may have been used
400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        // to hold debug info for dead function's local variables.
401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        StringRef FName = DISubprogram(*I).getLinkageName();
402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        if (FName.empty())
403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          FName = DISubprogram(*I).getName();
404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        if (NamedMDNode *LVNMD =
405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman            M.getNamedMetadata(Twine("llvm.dbg.lv.",
406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                                     getRealLinkageName(FName))))
407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman          LVNMD->eraseFromParent();
408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      }
409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    }
410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
411894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return Changed;
413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
414