StripSymbols.cpp revision aca50a94b8d4863adf07eec980b83599c541ed99
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" 25dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner#include "llvm/DerivedTypes.h" 26dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner#include "llvm/Instructions.h" 27e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner#include "llvm/Module.h" 28e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner#include "llvm/Pass.h" 2913e16b65ddd679d6edb5f182d683701fdea37b85Devang Patel#include "llvm/Analysis/DebugInfo.h" 30ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer#include "llvm/ValueSymbolTable.h" 319adb01cbc3ef70e7fa8b4d6b1a1229c63082a496Devang Patel#include "llvm/Transforms/Utils/Local.h" 321afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner#include "llvm/ADT/DenseMap.h" 338c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel#include "llvm/ADT/SmallPtrSet.h" 34e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattnerusing namespace llvm; 35e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 36e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattnernamespace { 378aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky class StripSymbols : public ModulePass { 38e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner bool OnlyDebugInfo; 39e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner public: 40ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky static char ID; // Pass identification, replacement for typeid 41c2bbfc18e9adbbdcf5b3375d8d25e2452f7df7f1Dan Gohman explicit StripSymbols(bool ODI = false) 42081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson : ModulePass(ID), OnlyDebugInfo(ODI) { 43081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeStripSymbolsPass(*PassRegistry::getPassRegistry()); 44081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson } 45e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 46f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel virtual bool runOnModule(Module &M); 47f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 48f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel virtual void getAnalysisUsage(AnalysisUsage &AU) const { 49f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel AU.setPreservesAll(); 50f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel } 51f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel }; 52229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 538aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky class StripNonDebugSymbols : public ModulePass { 54f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel public: 55f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel static char ID; // Pass identification, replacement for typeid 56f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel explicit StripNonDebugSymbols() 57081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson : ModulePass(ID) { 58081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeStripNonDebugSymbolsPass(*PassRegistry::getPassRegistry()); 59081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson } 60229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 61e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner virtual bool runOnModule(Module &M); 62e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 63e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner virtual void getAnalysisUsage(AnalysisUsage &AU) const { 64e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner AU.setPreservesAll(); 65e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner } 66e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner }; 6723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 688aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky class StripDebugDeclare : public ModulePass { 6923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel public: 7023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel static char ID; // Pass identification, replacement for typeid 7123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel explicit StripDebugDeclare() 72081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson : ModulePass(ID) { 73081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeStripDebugDeclarePass(*PassRegistry::getPassRegistry()); 74081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson } 7523e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 7623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel virtual bool runOnModule(Module &M); 7723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 7823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel virtual void getAnalysisUsage(AnalysisUsage &AU) const { 7923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel AU.setPreservesAll(); 8023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel } 8123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel }; 8226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 8326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel class StripDeadDebugInfo : public ModulePass { 8426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel public: 8526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel static char ID; // Pass identification, replacement for typeid 8626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel explicit StripDeadDebugInfo() 87081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson : ModulePass(ID) { 88081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeStripDeadDebugInfoPass(*PassRegistry::getPassRegistry()); 89081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson } 9026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 9126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel virtual bool runOnModule(Module &M); 9226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 9326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel virtual void getAnalysisUsage(AnalysisUsage &AU) const { 9426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel AU.setPreservesAll(); 9526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel } 9626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel }; 97e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner} 98e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 99844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar StripSymbols::ID = 0; 100d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(StripSymbols, "strip", 101ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson "Strip all symbols from a module", false, false) 102844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 103e3ad43c828280cf11e8631f1a814a51a0b168016Chris LattnerModulePass *llvm::createStripSymbolsPass(bool OnlyDebugInfo) { 104e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner return new StripSymbols(OnlyDebugInfo); 105e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner} 106e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 107f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelchar StripNonDebugSymbols::ID = 0; 108d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(StripNonDebugSymbols, "strip-nondebug", 109d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson "Strip all symbols, except dbg symbols, from a module", 110ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson false, false) 111f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 112f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang PatelModulePass *llvm::createStripNonDebugSymbolsPass() { 113f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel return new StripNonDebugSymbols(); 114f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel} 115f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 11623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patelchar StripDebugDeclare::ID = 0; 117d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(StripDebugDeclare, "strip-debug-declare", 118ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson "Strip all llvm.dbg.declare intrinsics", false, false) 11923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 12023e528be8069ead5f598e4043481fa2ef122a0e6Devang PatelModulePass *llvm::createStripDebugDeclarePass() { 12123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel return new StripDebugDeclare(); 12223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel} 12323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 12426d14294de179ada3ba472d206bd25e9785f05a3Devang Patelchar StripDeadDebugInfo::ID = 0; 125d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(StripDeadDebugInfo, "strip-dead-debug-info", 126ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson "Strip debug info for unused symbols", false, false) 12726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 12826d14294de179ada3ba472d206bd25e9785f05a3Devang PatelModulePass *llvm::createStripDeadDebugInfoPass() { 12926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel return new StripDeadDebugInfo(); 13026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel} 13126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 132bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel/// OnlyUsedBy - Return true if V is only used by Usr. 133bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patelstatic bool OnlyUsedBy(Value *V, Value *Usr) { 134bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel for(Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { 135bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel User *U = *I; 136bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel if (U != Usr) 137bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel return false; 138bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel } 139bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel return true; 140bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel} 141bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel 142dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattnerstatic void RemoveDeadConstant(Constant *C) { 143dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner assert(C->use_empty() && "Constant is not dead!"); 1440eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner SmallPtrSet<Constant*, 4> Operands; 145dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) 146aca50a94b8d4863adf07eec980b83599c541ed99Chris Lattner if (OnlyUsedBy(C->getOperand(i), C)) 1470eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner Operands.insert(cast<Constant>(C->getOperand(i))); 148dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { 149bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (!GV->hasLocalLinkage()) return; // Don't delete non static globals. 150dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner GV->eraseFromParent(); 151dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner } 152dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner else if (!isa<Function>(C)) 153f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel if (isa<CompositeType>(C->getType())) 154f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel C->destroyConstant(); 155fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 156dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner // If the constant referenced anything, see if we can delete it as well. 1570eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner for (SmallPtrSet<Constant*, 4>::iterator OI = Operands.begin(), 158bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel OE = Operands.end(); OI != OE; ++OI) 159bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel RemoveDeadConstant(*OI); 160dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner} 161e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 1627f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner// Strip the symbol table of its names. 1637f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner// 164f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelstatic void StripSymtab(ValueSymbolTable &ST, bool PreserveDbgInfo) { 1657f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner for (ValueSymbolTable::iterator VI = ST.begin(), VE = ST.end(); VI != VE; ) { 166dec628eead87b20773c98a00830580df211acc98Chris Lattner Value *V = VI->getValue(); 1677f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner ++VI; 168bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (!isa<GlobalValue>(V) || cast<GlobalValue>(V)->hasLocalLinkage()) { 169460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar if (!PreserveDbgInfo || !V->getName().startswith("llvm.dbg")) 170f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel // Set name to "", removing from symbol table! 171f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel V->setName(""); 1727f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner } 1737f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner } 1747f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner} 1757f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner 1761afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner// Strip any named types of their names. 1771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattnerstatic void StripTypeNames(Module &M, bool PreserveDbgInfo) { 1781afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner std::vector<StructType*> StructTypes; 1791afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner M.findUsedStructTypes(StructTypes); 1801afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1811afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner for (unsigned i = 0, e = StructTypes.size(); i != e; ++i) { 1821afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner StructType *STy = StructTypes[i]; 1831afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (STy->isAnonymous() || STy->getName().empty()) continue; 1841afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1851afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner if (PreserveDbgInfo && STy->getName().startswith("llvm.dbg")) 1861afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner continue; 1871afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner 1881afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner STy->setName(""); 189f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel } 1907f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner} 1917f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner 1924460a7e90c318857a37be386a7ebccff3020a795Devang Patel/// Find values that are marked as llvm.used. 193401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattnerstatic void findUsedValues(GlobalVariable *LLVMUsed, 194401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner SmallPtrSet<const GlobalValue*, 8> &UsedValues) { 195401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner if (LLVMUsed == 0) return; 196401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner UsedValues.insert(LLVMUsed); 197401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner 198401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner ConstantArray *Inits = dyn_cast<ConstantArray>(LLVMUsed->getInitializer()); 199401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner if (Inits == 0) return; 200401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner 201401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner for (unsigned i = 0, e = Inits->getNumOperands(); i != e; ++i) 202401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner if (GlobalValue *GV = 203401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner dyn_cast<GlobalValue>(Inits->getOperand(i)->stripPointerCasts())) 204401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner UsedValues.insert(GV); 2054460a7e90c318857a37be386a7ebccff3020a795Devang Patel} 2064460a7e90c318857a37be386a7ebccff3020a795Devang Patel 2074460a7e90c318857a37be386a7ebccff3020a795Devang Patel/// StripSymbolNames - Strip symbol names. 2087db949df789383acce98ef072f08794fdd5bd04eDan Gohmanstatic bool StripSymbolNames(Module &M, bool PreserveDbgInfo) { 2094460a7e90c318857a37be386a7ebccff3020a795Devang Patel 2104460a7e90c318857a37be386a7ebccff3020a795Devang Patel SmallPtrSet<const GlobalValue*, 8> llvmUsedValues; 211401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner findUsedValues(M.getGlobalVariable("llvm.used"), llvmUsedValues); 212401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner findUsedValues(M.getGlobalVariable("llvm.compiler.used"), llvmUsedValues); 2134460a7e90c318857a37be386a7ebccff3020a795Devang Patel 214229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel for (Module::global_iterator I = M.global_begin(), E = M.global_end(); 215229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel I != E; ++I) { 216bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0) 217460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar if (!PreserveDbgInfo || !I->getName().startswith("llvm.dbg")) 218f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel I->setName(""); // Internal symbols can't participate in linkage 219229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel } 220229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 221229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 222bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0) 223460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar if (!PreserveDbgInfo || !I->getName().startswith("llvm.dbg")) 224f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel I->setName(""); // Internal symbols can't participate in linkage 225f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel StripSymtab(I->getValueSymbolTable(), PreserveDbgInfo); 226229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel } 227229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 228229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel // Remove all names from types. 2291afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner StripTypeNames(M, PreserveDbgInfo); 2308c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel 231229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel return true; 232229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel} 233e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 234229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// StripDebugInfo - Strip debug info in the module if it exists. 235229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// To do this, we remove llvm.dbg.func.start, llvm.dbg.stoppoint, and 236229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// llvm.dbg.region.end calls, and any globals they point to if now dead. 2377db949df789383acce98ef072f08794fdd5bd04eDan Gohmanstatic bool StripDebugInfo(Module &M) { 238e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 23976e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel bool Changed = false; 24076e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel 241e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel // Remove all of the calls to the debugger intrinsics, and remove them from 242e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel // the module. 24376e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel if (Function *Declare = M.getFunction("llvm.dbg.declare")) { 2444ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey while (!Declare->use_empty()) { 2454ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey CallInst *CI = cast<CallInst>(Declare->use_back()); 2464ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey CI->eraseFromParent(); 2474ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey } 2484ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey Declare->eraseFromParent(); 24976e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel Changed = true; 2504ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey } 251dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner 252df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel if (Function *DbgVal = M.getFunction("llvm.dbg.value")) { 253df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel while (!DbgVal->use_empty()) { 254df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel CallInst *CI = cast<CallInst>(DbgVal->use_back()); 255df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel CI->eraseFromParent(); 256df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel } 257df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel DbgVal->eraseFromParent(); 258df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel Changed = true; 259df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel } 260df9292cbddfa634318e35ed58e9b8b9a464ee70fDevang Patel 261444a08cd6f21c5ef7fbb64eccc7ac6beba33e891Devang Patel for (Module::named_metadata_iterator NMI = M.named_metadata_begin(), 262444a08cd6f21c5ef7fbb64eccc7ac6beba33e891Devang Patel NME = M.named_metadata_end(); NMI != NME;) { 263444a08cd6f21c5ef7fbb64eccc7ac6beba33e891Devang Patel NamedMDNode *NMD = NMI; 264444a08cd6f21c5ef7fbb64eccc7ac6beba33e891Devang Patel ++NMI; 265e62b203570e1a6b071a0ef4c64cb81093026d93aDevang Patel if (NMD->getName().startswith("llvm.dbg.")) { 266444a08cd6f21c5ef7fbb64eccc7ac6beba33e891Devang Patel NMD->eraseFromParent(); 267e62b203570e1a6b071a0ef4c64cb81093026d93aDevang Patel Changed = true; 268e62b203570e1a6b071a0ef4c64cb81093026d93aDevang Patel } 26969b4d1caff87585938641737ff39dcee5d104556Devang Patel } 270a7065b1fcc394c91a647759aa36feaa280391b12Duncan Sands 271a7065b1fcc394c91a647759aa36feaa280391b12Duncan Sands for (Module::iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI) 27276e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel for (Function::iterator FI = MI->begin(), FE = MI->end(); FI != FE; 27376e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel ++FI) 27476e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; 275a7065b1fcc394c91a647759aa36feaa280391b12Duncan Sands ++BI) { 276549979f5509ef6ff14e1e46c141990deb8d8274eDan Gohman if (!BI->getDebugLoc().isUnknown()) { 277549979f5509ef6ff14e1e46c141990deb8d8274eDan Gohman Changed = true; 278549979f5509ef6ff14e1e46c141990deb8d8274eDan Gohman BI->setDebugLoc(DebugLoc()); 279549979f5509ef6ff14e1e46c141990deb8d8274eDan Gohman } 280a7065b1fcc394c91a647759aa36feaa280391b12Duncan Sands } 281229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 282a7065b1fcc394c91a647759aa36feaa280391b12Duncan Sands return Changed; 283e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner} 284f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 285f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelbool StripSymbols::runOnModule(Module &M) { 286f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel bool Changed = false; 287f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel Changed |= StripDebugInfo(M); 288f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel if (!OnlyDebugInfo) 289f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel Changed |= StripSymbolNames(M, false); 290f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel return Changed; 291f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel} 292f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 293f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelbool StripNonDebugSymbols::runOnModule(Module &M) { 294f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel return StripSymbolNames(M, true); 295f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel} 29623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 29723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patelbool StripDebugDeclare::runOnModule(Module &M) { 29823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 29923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel Function *Declare = M.getFunction("llvm.dbg.declare"); 30023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel std::vector<Constant*> DeadConstants; 30123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 3024425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen if (Declare) { 3034425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen while (!Declare->use_empty()) { 3044425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen CallInst *CI = cast<CallInst>(Declare->use_back()); 305e9af352d74d1fa670afbaf50594f899c1b12a995Gabor Greif Value *Arg1 = CI->getArgOperand(0); 306e9af352d74d1fa670afbaf50594f899c1b12a995Gabor Greif Value *Arg2 = CI->getArgOperand(1); 3074425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen assert(CI->use_empty() && "llvm.dbg intrinsic should have void result"); 3084425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen CI->eraseFromParent(); 3094425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen if (Arg1->use_empty()) { 3104425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen if (Constant *C = dyn_cast<Constant>(Arg1)) 3114425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen DeadConstants.push_back(C); 3124425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen else 313e66f6f15e6afe3d437ccdca93f2209b3d4158486Dan Gohman RecursivelyDeleteTriviallyDeadInstructions(Arg1); 3144425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen } 3154425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen if (Arg2->use_empty()) 3164425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen if (Constant *C = dyn_cast<Constant>(Arg2)) 3174425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen DeadConstants.push_back(C); 31823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel } 3194425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen Declare->eraseFromParent(); 32023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel } 32123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 32223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel while (!DeadConstants.empty()) { 32323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel Constant *C = DeadConstants.back(); 32423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel DeadConstants.pop_back(); 32523e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { 32623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel if (GV->hasLocalLinkage()) 32723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel RemoveDeadConstant(GV); 3280eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner } else 32923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel RemoveDeadConstant(C); 33023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel } 33123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 33223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel return true; 33323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel} 33426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 33526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel/// getRealLinkageName - If special LLVM prefix that is used to inform the asm 33626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel/// printer to not emit usual symbol prefix before the symbol name is used then 33726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel/// return linkage name after skipping this special LLVM prefix. 33826d14294de179ada3ba472d206bd25e9785f05a3Devang Patelstatic StringRef getRealLinkageName(StringRef LinkageName) { 33926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel char One = '\1'; 34026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (LinkageName.startswith(StringRef(&One, 1))) 34126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel return LinkageName.substr(1); 34226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel return LinkageName; 34326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel} 34426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 34526d14294de179ada3ba472d206bd25e9785f05a3Devang Patelbool StripDeadDebugInfo::runOnModule(Module &M) { 34626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel bool Changed = false; 34726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 34826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel // Debugging infomration is encoded in llvm IR using metadata. This is designed 34926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel // such a way that debug info for symbols preserved even if symbols are 35026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel // optimized away by the optimizer. This special pass removes debug info for 35126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel // such symbols. 35226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 35326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel // llvm.dbg.gv keeps track of debug info for global variables. 35426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.gv")) { 35526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel SmallVector<MDNode *, 8> MDs; 35626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) 35726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (DIGlobalVariable(NMD->getOperand(i)).Verify()) 35826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel MDs.push_back(NMD->getOperand(i)); 35926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel else 36026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel Changed = true; 36126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel NMD->eraseFromParent(); 36226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel NMD = NULL; 36326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 36426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel for (SmallVector<MDNode *, 8>::iterator I = MDs.begin(), 36526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel E = MDs.end(); I != E; ++I) { 3661955cf195021b2fd3b509d9ad414a83291f3311aDevang Patel GlobalVariable *GV = DIGlobalVariable(*I).getGlobal(); 3671955cf195021b2fd3b509d9ad414a83291f3311aDevang Patel if (GV && M.getGlobalVariable(GV->getName(), true)) { 36826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (!NMD) 36926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel NMD = M.getOrInsertNamedMetadata("llvm.dbg.gv"); 37026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel NMD->addOperand(*I); 37126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel } 37226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel else 37326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel Changed = true; 37426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel } 37526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel } 37626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 37726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel // llvm.dbg.sp keeps track of debug info for subprograms. 37826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp")) { 37926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel SmallVector<MDNode *, 8> MDs; 38026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) 38126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (DISubprogram(NMD->getOperand(i)).Verify()) 38226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel MDs.push_back(NMD->getOperand(i)); 38326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel else 38426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel Changed = true; 38526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel NMD->eraseFromParent(); 38626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel NMD = NULL; 38726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 38826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel for (SmallVector<MDNode *, 8>::iterator I = MDs.begin(), 38926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel E = MDs.end(); I != E; ++I) { 39026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel bool FnIsLive = false; 39126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (Function *F = DISubprogram(*I).getFunction()) 39226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (M.getFunction(F->getName())) 39326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel FnIsLive = true; 39426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (FnIsLive) { 39526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (!NMD) 39626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel NMD = M.getOrInsertNamedMetadata("llvm.dbg.sp"); 39726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel NMD->addOperand(*I); 39826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel } else { 39926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel // Remove llvm.dbg.lv.fnname named mdnode which may have been used 40026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel // to hold debug info for dead function's local variables. 40126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel StringRef FName = DISubprogram(*I).getLinkageName(); 40226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (FName.empty()) 40326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel FName = DISubprogram(*I).getName(); 40426d14294de179ada3ba472d206bd25e9785f05a3Devang Patel if (NamedMDNode *LVNMD = 40526d14294de179ada3ba472d206bd25e9785f05a3Devang Patel M.getNamedMetadata(Twine("llvm.dbg.lv.", 40626d14294de179ada3ba472d206bd25e9785f05a3Devang Patel getRealLinkageName(FName)))) 40726d14294de179ada3ba472d206bd25e9785f05a3Devang Patel LVNMD->eraseFromParent(); 40826d14294de179ada3ba472d206bd25e9785f05a3Devang Patel } 40926d14294de179ada3ba472d206bd25e9785f05a3Devang Patel } 41026d14294de179ada3ba472d206bd25e9785f05a3Devang Patel } 41126d14294de179ada3ba472d206bd25e9785f05a3Devang Patel 41226d14294de179ada3ba472d206bd25e9785f05a3Devang Patel return Changed; 41326d14294de179ada3ba472d206bd25e9785f05a3Devang Patel} 414