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