1e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner//===- StripSymbols.cpp - Strip symbols and debug info from a module ------===//
2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
3e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner//                     The LLVM Compiler Infrastructure
4e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
8e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner//===----------------------------------------------------------------------===//
9e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner//
10c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen// The StripSymbols transformation implements code stripping. Specifically, it
11c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen// can delete:
12c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen//
13c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen//   * names for virtual registers
14c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen//   * symbols for internal globals and functions
15c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen//   * debug information
16e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner//
17c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen// Note that this transformation makes code much less readable, so it should
18c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen// only be used in situations where the 'strip' utility would be used, such as
19c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen// reducing code size or making it harder to reverse engineer code.
20e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner//
21e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner//===----------------------------------------------------------------------===//
22e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner
23e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner#include "llvm/Transforms/IPO.h"
24dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner#include "llvm/Constants.h"
250bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/DebugInfo.h"
26dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner#include "llvm/DerivedTypes.h"
27dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner#include "llvm/Instructions.h"
28e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner#include "llvm/Module.h"
29e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner#include "llvm/Pass.h"
30573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling#include "llvm/TypeFinder.h"
31ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer#include "llvm/ValueSymbolTable.h"
329adb01cbc3ef70e7fa8b4d6b1a1229c63082a496Devang Patel#include "llvm/Transforms/Utils/Local.h"
331afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner#include "llvm/ADT/DenseMap.h"
348c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel#include "llvm/ADT/SmallPtrSet.h"
35e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattnerusing namespace llvm;
36e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner
37e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattnernamespace {
388aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky  class StripSymbols : public ModulePass {
39e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner    bool OnlyDebugInfo;
40e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner  public:
41ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky    static char ID; // Pass identification, replacement for typeid
42c2bbfc18e9adbbdcf5b3375d8d25e2452f7df7f1Dan Gohman    explicit StripSymbols(bool ODI = false)
43081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      : ModulePass(ID), OnlyDebugInfo(ODI) {
44081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson        initializeStripSymbolsPass(*PassRegistry::getPassRegistry());
45081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      }
46e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner
47f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel    virtual bool runOnModule(Module &M);
48f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel
49f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
50f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel      AU.setPreservesAll();
51f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel    }
52f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel  };
53229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel
548aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky  class StripNonDebugSymbols : public ModulePass {
55f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel  public:
56f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel    static char ID; // Pass identification, replacement for typeid
57f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel    explicit StripNonDebugSymbols()
58081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      : ModulePass(ID) {
59081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson        initializeStripNonDebugSymbolsPass(*PassRegistry::getPassRegistry());
60081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      }
61229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel
62e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner    virtual bool runOnModule(Module &M);
63e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner
64e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
65e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner      AU.setPreservesAll();
66e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner    }
67e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner  };
6823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel
698aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky  class StripDebugDeclare : public ModulePass {
7023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel  public:
7123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel    static char ID; // Pass identification, replacement for typeid
7223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel    explicit StripDebugDeclare()
73081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      : ModulePass(ID) {
74081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson        initializeStripDebugDeclarePass(*PassRegistry::getPassRegistry());
75081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      }
7623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel
7723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel    virtual bool runOnModule(Module &M);
7823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel
7923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
8023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel      AU.setPreservesAll();
8123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel    }
8223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel  };
8326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
8426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  class StripDeadDebugInfo : public ModulePass {
8526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  public:
8626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    static char ID; // Pass identification, replacement for typeid
8726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    explicit StripDeadDebugInfo()
88081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      : ModulePass(ID) {
89081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson        initializeStripDeadDebugInfoPass(*PassRegistry::getPassRegistry());
90081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      }
9126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
9226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    virtual bool runOnModule(Module &M);
9326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
9426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
9526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      AU.setPreservesAll();
9626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    }
9726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  };
98e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner}
99e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner
100844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar StripSymbols::ID = 0;
101d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(StripSymbols, "strip",
102ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "Strip all symbols from a module", false, false)
103844731a7f1909f55935e3514c9e713a62d67662eDan Gohman
104e3ad43c828280cf11e8631f1a814a51a0b168016Chris LattnerModulePass *llvm::createStripSymbolsPass(bool OnlyDebugInfo) {
105e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner  return new StripSymbols(OnlyDebugInfo);
106e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner}
107e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner
108f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelchar StripNonDebugSymbols::ID = 0;
109d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(StripNonDebugSymbols, "strip-nondebug",
110d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson                "Strip all symbols, except dbg symbols, from a module",
111ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                false, false)
112f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel
113f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang PatelModulePass *llvm::createStripNonDebugSymbolsPass() {
114f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel  return new StripNonDebugSymbols();
115f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel}
116f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel
11723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patelchar StripDebugDeclare::ID = 0;
118d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(StripDebugDeclare, "strip-debug-declare",
119ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "Strip all llvm.dbg.declare intrinsics", false, false)
12023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel
12123e528be8069ead5f598e4043481fa2ef122a0e6Devang PatelModulePass *llvm::createStripDebugDeclarePass() {
12223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel  return new StripDebugDeclare();
12323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel}
12423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel
12526d14294de179ada3ba472d206bd25e9785f05a3Devang Patelchar StripDeadDebugInfo::ID = 0;
126d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(StripDeadDebugInfo, "strip-dead-debug-info",
127ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "Strip debug info for unused symbols", false, false)
12826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
12926d14294de179ada3ba472d206bd25e9785f05a3Devang PatelModulePass *llvm::createStripDeadDebugInfoPass() {
13026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  return new StripDeadDebugInfo();
13126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel}
13226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
133bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel/// OnlyUsedBy - Return true if V is only used by Usr.
134bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patelstatic bool OnlyUsedBy(Value *V, Value *Usr) {
135bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel  for(Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) {
136bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel    User *U = *I;
137bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel    if (U != Usr)
138bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel      return false;
139bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel  }
140bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel  return true;
141bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel}
142bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel
143dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattnerstatic void RemoveDeadConstant(Constant *C) {
144dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner  assert(C->use_empty() && "Constant is not dead!");
1450eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner  SmallPtrSet<Constant*, 4> Operands;
146dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner  for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i)
147aca50a94b8d4863adf07eec980b83599c541ed99Chris Lattner    if (OnlyUsedBy(C->getOperand(i), C))
1480eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner      Operands.insert(cast<Constant>(C->getOperand(i)));
149dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
150bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola    if (!GV->hasLocalLinkage()) return;   // Don't delete non static globals.
151dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner    GV->eraseFromParent();
152dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner  }
153dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner  else if (!isa<Function>(C))
154f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel    if (isa<CompositeType>(C->getType()))
155f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel      C->destroyConstant();
156fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
157dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner  // If the constant referenced anything, see if we can delete it as well.
1580eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner  for (SmallPtrSet<Constant*, 4>::iterator OI = Operands.begin(),
159bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel         OE = Operands.end(); OI != OE; ++OI)
160bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel    RemoveDeadConstant(*OI);
161dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner}
162e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner
1637f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner// Strip the symbol table of its names.
1647f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner//
165f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelstatic void StripSymtab(ValueSymbolTable &ST, bool PreserveDbgInfo) {
1667f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner  for (ValueSymbolTable::iterator VI = ST.begin(), VE = ST.end(); VI != VE; ) {
167dec628eead87b20773c98a00830580df211acc98Chris Lattner    Value *V = VI->getValue();
1687f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner    ++VI;
169bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola    if (!isa<GlobalValue>(V) || cast<GlobalValue>(V)->hasLocalLinkage()) {
170460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar      if (!PreserveDbgInfo || !V->getName().startswith("llvm.dbg"))
171f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel        // Set name to "", removing from symbol table!
172f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel        V->setName("");
1737f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner    }
1747f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner  }
1757f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner}
1767f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner
1771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner// Strip any named types of their names.
1781afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerstatic void StripTypeNames(Module &M, bool PreserveDbgInfo) {
179573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  TypeFinder StructTypes;
180573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  StructTypes.run(M, false);
1811afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
1821afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  for (unsigned i = 0, e = StructTypes.size(); i != e; ++i) {
1831afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner    StructType *STy = StructTypes[i];
1843ebb64946bc8e7c8feba1b2044e7a47f80b3a83fChris Lattner    if (STy->isLiteral() || STy->getName().empty()) continue;
1851afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
1861afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner    if (PreserveDbgInfo && STy->getName().startswith("llvm.dbg"))
1871afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner      continue;
1881afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
1891afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner    STy->setName("");
190f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel  }
1917f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner}
1927f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner
1934460a7e90c318857a37be386a7ebccff3020a795Devang Patel/// Find values that are marked as llvm.used.
194401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattnerstatic void findUsedValues(GlobalVariable *LLVMUsed,
195401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner                           SmallPtrSet<const GlobalValue*, 8> &UsedValues) {
196401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner  if (LLVMUsed == 0) return;
197401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner  UsedValues.insert(LLVMUsed);
198401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner
199401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner  ConstantArray *Inits = dyn_cast<ConstantArray>(LLVMUsed->getInitializer());
200401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner  if (Inits == 0) return;
201401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner
202401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner  for (unsigned i = 0, e = Inits->getNumOperands(); i != e; ++i)
203401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner    if (GlobalValue *GV =
204401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner          dyn_cast<GlobalValue>(Inits->getOperand(i)->stripPointerCasts()))
205401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner      UsedValues.insert(GV);
2064460a7e90c318857a37be386a7ebccff3020a795Devang Patel}
2074460a7e90c318857a37be386a7ebccff3020a795Devang Patel
2084460a7e90c318857a37be386a7ebccff3020a795Devang Patel/// StripSymbolNames - Strip symbol names.
2097db949df789383acce98ef072f08794fdd5bd04eDan Gohmanstatic bool StripSymbolNames(Module &M, bool PreserveDbgInfo) {
2104460a7e90c318857a37be386a7ebccff3020a795Devang Patel
2114460a7e90c318857a37be386a7ebccff3020a795Devang Patel  SmallPtrSet<const GlobalValue*, 8> llvmUsedValues;
212401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner  findUsedValues(M.getGlobalVariable("llvm.used"), llvmUsedValues);
213401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner  findUsedValues(M.getGlobalVariable("llvm.compiler.used"), llvmUsedValues);
2144460a7e90c318857a37be386a7ebccff3020a795Devang Patel
215229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel  for (Module::global_iterator I = M.global_begin(), E = M.global_end();
216229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel       I != E; ++I) {
217bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola    if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0)
218460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar      if (!PreserveDbgInfo || !I->getName().startswith("llvm.dbg"))
219f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel        I->setName("");     // Internal symbols can't participate in linkage
220229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel  }
221229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel
222229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
223bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola    if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0)
224460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar      if (!PreserveDbgInfo || !I->getName().startswith("llvm.dbg"))
225f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel        I->setName("");     // Internal symbols can't participate in linkage
226f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel    StripSymtab(I->getValueSymbolTable(), PreserveDbgInfo);
227229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel  }
228229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel
229229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel  // Remove all names from types.
2301afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  StripTypeNames(M, PreserveDbgInfo);
2318c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel
232229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel  return true;
233229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel}
234e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner
235229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// StripDebugInfo - Strip debug info in the module if it exists.
236229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// To do this, we remove llvm.dbg.func.start, llvm.dbg.stoppoint, and
237229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// llvm.dbg.region.end calls, and any globals they point to if now dead.
2387db949df789383acce98ef072f08794fdd5bd04eDan Gohmanstatic bool StripDebugInfo(Module &M) {
239e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner
24076e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel  bool Changed = false;
24176e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel
242e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  // Remove all of the calls to the debugger intrinsics, and remove them from
243e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  // the module.
24476e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel  if (Function *Declare = M.getFunction("llvm.dbg.declare")) {
2454ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey    while (!Declare->use_empty()) {
2464ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey      CallInst *CI = cast<CallInst>(Declare->use_back());
2474ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey      CI->eraseFromParent();
2484ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey    }
2494ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey    Declare->eraseFromParent();
25076e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel    Changed = true;
2514ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey  }
252dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner
253df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel  if (Function *DbgVal = M.getFunction("llvm.dbg.value")) {
254df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel    while (!DbgVal->use_empty()) {
255df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel      CallInst *CI = cast<CallInst>(DbgVal->use_back());
256df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel      CI->eraseFromParent();
257df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel    }
258df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel    DbgVal->eraseFromParent();
259df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel    Changed = true;
260df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel  }
261df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel
262444a08cd6f21c5ef7fbb64eccc7ac6beba33e891Devang Patel  for (Module::named_metadata_iterator NMI = M.named_metadata_begin(),
263444a08cd6f21c5ef7fbb64eccc7ac6beba33e891Devang Patel         NME = M.named_metadata_end(); NMI != NME;) {
264444a08cd6f21c5ef7fbb64eccc7ac6beba33e891Devang Patel    NamedMDNode *NMD = NMI;
265444a08cd6f21c5ef7fbb64eccc7ac6beba33e891Devang Patel    ++NMI;
266e62b203570e1a6b071a0ef4c64cb81093026d93aDevang Patel    if (NMD->getName().startswith("llvm.dbg.")) {
267444a08cd6f21c5ef7fbb64eccc7ac6beba33e891Devang Patel      NMD->eraseFromParent();
268e62b203570e1a6b071a0ef4c64cb81093026d93aDevang Patel      Changed = true;
269e62b203570e1a6b071a0ef4c64cb81093026d93aDevang Patel    }
27069b4d1caff87585938641737ff39dcee5d104556Devang Patel  }
271a7065b1fcc394c91a647759aa36feaa280391b12Duncan Sands
272a7065b1fcc394c91a647759aa36feaa280391b12Duncan Sands  for (Module::iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI)
27376e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel    for (Function::iterator FI = MI->begin(), FE = MI->end(); FI != FE;
27476e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel         ++FI)
27576e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel      for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE;
276a7065b1fcc394c91a647759aa36feaa280391b12Duncan Sands           ++BI) {
277549979f5509ef6ff14e1e46c141990deb8d8274eDan Gohman        if (!BI->getDebugLoc().isUnknown()) {
278549979f5509ef6ff14e1e46c141990deb8d8274eDan Gohman          Changed = true;
279549979f5509ef6ff14e1e46c141990deb8d8274eDan Gohman          BI->setDebugLoc(DebugLoc());
280549979f5509ef6ff14e1e46c141990deb8d8274eDan Gohman        }
281a7065b1fcc394c91a647759aa36feaa280391b12Duncan Sands      }
282229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel
283a7065b1fcc394c91a647759aa36feaa280391b12Duncan Sands  return Changed;
284e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner}
285f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel
286f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelbool StripSymbols::runOnModule(Module &M) {
287f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel  bool Changed = false;
288f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel  Changed |= StripDebugInfo(M);
289f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel  if (!OnlyDebugInfo)
290f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel    Changed |= StripSymbolNames(M, false);
291f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel  return Changed;
292f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel}
293f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel
294f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelbool StripNonDebugSymbols::runOnModule(Module &M) {
295f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel  return StripSymbolNames(M, true);
296f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel}
29723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel
29823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patelbool StripDebugDeclare::runOnModule(Module &M) {
29923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel
30023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel  Function *Declare = M.getFunction("llvm.dbg.declare");
30123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel  std::vector<Constant*> DeadConstants;
30223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel
3034425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen  if (Declare) {
3044425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen    while (!Declare->use_empty()) {
3054425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen      CallInst *CI = cast<CallInst>(Declare->use_back());
306e9af352d74d1fa670afbaf50594f899c1b12a995Gabor Greif      Value *Arg1 = CI->getArgOperand(0);
307e9af352d74d1fa670afbaf50594f899c1b12a995Gabor Greif      Value *Arg2 = CI->getArgOperand(1);
3084425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen      assert(CI->use_empty() && "llvm.dbg intrinsic should have void result");
3094425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen      CI->eraseFromParent();
3104425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen      if (Arg1->use_empty()) {
3114425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen        if (Constant *C = dyn_cast<Constant>(Arg1))
3124425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen          DeadConstants.push_back(C);
3134425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen        else
314e66f6f15e6afe3d437ccdca93f2209b3d4158486Dan Gohman          RecursivelyDeleteTriviallyDeadInstructions(Arg1);
3154425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen      }
3164425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen      if (Arg2->use_empty())
3174425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen        if (Constant *C = dyn_cast<Constant>(Arg2))
3184425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen          DeadConstants.push_back(C);
31923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel    }
3204425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen    Declare->eraseFromParent();
32123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel  }
32223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel
32323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel  while (!DeadConstants.empty()) {
32423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel    Constant *C = DeadConstants.back();
32523e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel    DeadConstants.pop_back();
32623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
32723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel      if (GV->hasLocalLinkage())
32823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel        RemoveDeadConstant(GV);
3290eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner    } else
33023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel      RemoveDeadConstant(C);
33123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel  }
33223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel
33323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel  return true;
33423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel}
33526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
33626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
33726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel/// printer to not emit usual symbol prefix before the symbol name is used then
33826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel/// return linkage name after skipping this special LLVM prefix.
33926d14294de179ada3ba472d206bd25e9785f05a3Devang Patelstatic StringRef getRealLinkageName(StringRef LinkageName) {
34026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  char One = '\1';
34126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  if (LinkageName.startswith(StringRef(&One, 1)))
34226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    return LinkageName.substr(1);
34326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  return LinkageName;
34426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel}
34526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
34626d14294de179ada3ba472d206bd25e9785f05a3Devang Patelbool StripDeadDebugInfo::runOnModule(Module &M) {
34726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  bool Changed = false;
34826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
34926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  // Debugging infomration is encoded in llvm IR using metadata. This is designed
35026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  // such a way that debug info for symbols preserved even if symbols are
35126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  // optimized away by the optimizer. This special pass removes debug info for
35226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  // such symbols.
35326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
35426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  // llvm.dbg.gv keeps track of debug info for global variables.
35526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.gv")) {
35626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    SmallVector<MDNode *, 8> MDs;
35726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
35826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      if (DIGlobalVariable(NMD->getOperand(i)).Verify())
35926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        MDs.push_back(NMD->getOperand(i));
36026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      else
36126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        Changed = true;
36226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    NMD->eraseFromParent();
36326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    NMD = NULL;
36426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
36526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    for (SmallVector<MDNode *, 8>::iterator I = MDs.begin(),
36626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel           E = MDs.end(); I != E; ++I) {
3671955cf195021b2fd3b509d9ad414a83291f3311aDevang Patel      GlobalVariable *GV = DIGlobalVariable(*I).getGlobal();
3681955cf195021b2fd3b509d9ad414a83291f3311aDevang Patel      if (GV && M.getGlobalVariable(GV->getName(), true)) {
36926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        if (!NMD)
37026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel          NMD = M.getOrInsertNamedMetadata("llvm.dbg.gv");
37126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        NMD->addOperand(*I);
37226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      }
37326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      else
37426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        Changed = true;
37526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    }
37626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  }
37726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
37826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  // llvm.dbg.sp keeps track of debug info for subprograms.
37926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp")) {
38026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    SmallVector<MDNode *, 8> MDs;
38126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
38226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      if (DISubprogram(NMD->getOperand(i)).Verify())
38326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        MDs.push_back(NMD->getOperand(i));
38426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      else
38526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        Changed = true;
38626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    NMD->eraseFromParent();
38726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    NMD = NULL;
38826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
38926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    for (SmallVector<MDNode *, 8>::iterator I = MDs.begin(),
39026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel           E = MDs.end(); I != E; ++I) {
39126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      bool FnIsLive = false;
39226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      if (Function *F = DISubprogram(*I).getFunction())
39326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        if (M.getFunction(F->getName()))
39426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel          FnIsLive = true;
39526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      if (FnIsLive) {
39626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel          if (!NMD)
39726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel            NMD = M.getOrInsertNamedMetadata("llvm.dbg.sp");
39826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel          NMD->addOperand(*I);
39926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      } else {
40026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        // Remove llvm.dbg.lv.fnname named mdnode which may have been used
40126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        // to hold debug info for dead function's local variables.
40226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        StringRef FName = DISubprogram(*I).getLinkageName();
40326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        if (FName.empty())
40426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel          FName = DISubprogram(*I).getName();
40526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel        if (NamedMDNode *LVNMD =
40626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel            M.getNamedMetadata(Twine("llvm.dbg.lv.",
40726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel                                     getRealLinkageName(FName))))
40826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel          LVNMD->eraseFromParent();
40926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel      }
41026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel    }
41126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  }
41226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel
41326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel  return Changed;
41426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel}
415