StripSymbols.cpp revision 76e3e50b8a2c72598b7ee586dd383bb63a236682
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" 2714ce9ef2e9013ba56e1daafebd91fe3ee1e8647eOwen Anderson#include "llvm/LLVMContext.h" 28e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner#include "llvm/Module.h" 29e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner#include "llvm/Pass.h" 3013e16b65ddd679d6edb5f182d683701fdea37b85Devang Patel#include "llvm/Analysis/DebugInfo.h" 31ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer#include "llvm/ValueSymbolTable.h" 3278d033e086e19e016273de014f9214aa6f3f844bReid Spencer#include "llvm/TypeSymbolTable.h" 339adb01cbc3ef70e7fa8b4d6b1a1229c63082a496Devang Patel#include "llvm/Transforms/Utils/Local.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) 43ae73dc1448d25b02cabc7c64c86c64371453dda8Dan Gohman : ModulePass(&ID), OnlyDebugInfo(ODI) {} 44e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 45f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel virtual bool runOnModule(Module &M); 46f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 47f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel virtual void getAnalysisUsage(AnalysisUsage &AU) const { 48f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel AU.setPreservesAll(); 49f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel } 50f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel }; 51229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 528aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky class StripNonDebugSymbols : public ModulePass { 53f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel public: 54f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel static char ID; // Pass identification, replacement for typeid 55f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel explicit StripNonDebugSymbols() 56f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel : ModulePass(&ID) {} 57229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 58e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner virtual bool runOnModule(Module &M); 59e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 60e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner virtual void getAnalysisUsage(AnalysisUsage &AU) const { 61e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner AU.setPreservesAll(); 62e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner } 63e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner }; 6423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 658aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky class StripDebugDeclare : public ModulePass { 6623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel public: 6723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel static char ID; // Pass identification, replacement for typeid 6823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel explicit StripDebugDeclare() 6923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel : ModulePass(&ID) {} 7023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 7123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel virtual bool runOnModule(Module &M); 7223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 7323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel virtual void getAnalysisUsage(AnalysisUsage &AU) const { 7423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel AU.setPreservesAll(); 7523e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel } 7623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel }; 77e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner} 78e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 79844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar StripSymbols::ID = 0; 80844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic RegisterPass<StripSymbols> 81844731a7f1909f55935e3514c9e713a62d67662eDan GohmanX("strip", "Strip all symbols from a module"); 82844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 83e3ad43c828280cf11e8631f1a814a51a0b168016Chris LattnerModulePass *llvm::createStripSymbolsPass(bool OnlyDebugInfo) { 84e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner return new StripSymbols(OnlyDebugInfo); 85e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner} 86e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 87f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelchar StripNonDebugSymbols::ID = 0; 88f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelstatic RegisterPass<StripNonDebugSymbols> 89f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang PatelY("strip-nondebug", "Strip all symbols, except dbg symbols, from a module"); 90f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 91f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang PatelModulePass *llvm::createStripNonDebugSymbolsPass() { 92f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel return new StripNonDebugSymbols(); 93f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel} 94f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 9523e528be8069ead5f598e4043481fa2ef122a0e6Devang Patelchar StripDebugDeclare::ID = 0; 9623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patelstatic RegisterPass<StripDebugDeclare> 9723e528be8069ead5f598e4043481fa2ef122a0e6Devang PatelZ("strip-debug-declare", "Strip all llvm.dbg.declare intrinsics"); 9823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 9923e528be8069ead5f598e4043481fa2ef122a0e6Devang PatelModulePass *llvm::createStripDebugDeclarePass() { 10023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel return new StripDebugDeclare(); 10123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel} 10223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 103bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel/// OnlyUsedBy - Return true if V is only used by Usr. 104bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patelstatic bool OnlyUsedBy(Value *V, Value *Usr) { 105bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel for(Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { 106bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel User *U = *I; 107bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel if (U != Usr) 108bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel return false; 109bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel } 110bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel return true; 111bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel} 112bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel 113dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattnerstatic void RemoveDeadConstant(Constant *C) { 114dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner assert(C->use_empty() && "Constant is not dead!"); 1150eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner SmallPtrSet<Constant*, 4> Operands; 116dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) 117dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner if (isa<DerivedType>(C->getOperand(i)->getType()) && 118bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel OnlyUsedBy(C->getOperand(i), C)) 1190eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner Operands.insert(cast<Constant>(C->getOperand(i))); 120dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { 121bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (!GV->hasLocalLinkage()) return; // Don't delete non static globals. 122dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner GV->eraseFromParent(); 123dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner } 124dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner else if (!isa<Function>(C)) 125f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel if (isa<CompositeType>(C->getType())) 126f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel C->destroyConstant(); 127fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 128dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner // If the constant referenced anything, see if we can delete it as well. 1290eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner for (SmallPtrSet<Constant*, 4>::iterator OI = Operands.begin(), 130bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel OE = Operands.end(); OI != OE; ++OI) 131bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel RemoveDeadConstant(*OI); 132dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner} 133e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 1347f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner// Strip the symbol table of its names. 1357f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner// 136f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelstatic void StripSymtab(ValueSymbolTable &ST, bool PreserveDbgInfo) { 1377f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner for (ValueSymbolTable::iterator VI = ST.begin(), VE = ST.end(); VI != VE; ) { 138dec628eead87b20773c98a00830580df211acc98Chris Lattner Value *V = VI->getValue(); 1397f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner ++VI; 140bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (!isa<GlobalValue>(V) || cast<GlobalValue>(V)->hasLocalLinkage()) { 141460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar if (!PreserveDbgInfo || !V->getName().startswith("llvm.dbg")) 142f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel // Set name to "", removing from symbol table! 143f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel V->setName(""); 1447f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner } 1457f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner } 1467f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner} 1477f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner 1487f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner// Strip the symbol table of its names. 149f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelstatic void StripTypeSymtab(TypeSymbolTable &ST, bool PreserveDbgInfo) { 150f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel for (TypeSymbolTable::iterator TI = ST.begin(), E = ST.end(); TI != E; ) { 151f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel if (PreserveDbgInfo && strncmp(TI->first.c_str(), "llvm.dbg", 8) == 0) 152f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel ++TI; 153f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel else 154f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel ST.remove(TI++); 155f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel } 1567f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner} 1577f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner 1584460a7e90c318857a37be386a7ebccff3020a795Devang Patel/// Find values that are marked as llvm.used. 159401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattnerstatic void findUsedValues(GlobalVariable *LLVMUsed, 160401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner SmallPtrSet<const GlobalValue*, 8> &UsedValues) { 161401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner if (LLVMUsed == 0) return; 162401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner UsedValues.insert(LLVMUsed); 163401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner 164401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner ConstantArray *Inits = dyn_cast<ConstantArray>(LLVMUsed->getInitializer()); 165401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner if (Inits == 0) return; 166401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner 167401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner for (unsigned i = 0, e = Inits->getNumOperands(); i != e; ++i) 168401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner if (GlobalValue *GV = 169401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner dyn_cast<GlobalValue>(Inits->getOperand(i)->stripPointerCasts())) 170401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner UsedValues.insert(GV); 1714460a7e90c318857a37be386a7ebccff3020a795Devang Patel} 1724460a7e90c318857a37be386a7ebccff3020a795Devang Patel 1734460a7e90c318857a37be386a7ebccff3020a795Devang Patel/// StripSymbolNames - Strip symbol names. 1747db949df789383acce98ef072f08794fdd5bd04eDan Gohmanstatic bool StripSymbolNames(Module &M, bool PreserveDbgInfo) { 1754460a7e90c318857a37be386a7ebccff3020a795Devang Patel 1764460a7e90c318857a37be386a7ebccff3020a795Devang Patel SmallPtrSet<const GlobalValue*, 8> llvmUsedValues; 177401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner findUsedValues(M.getGlobalVariable("llvm.used"), llvmUsedValues); 178401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner findUsedValues(M.getGlobalVariable("llvm.compiler.used"), llvmUsedValues); 1794460a7e90c318857a37be386a7ebccff3020a795Devang Patel 180229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel for (Module::global_iterator I = M.global_begin(), E = M.global_end(); 181229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel I != E; ++I) { 182bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0) 183460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar if (!PreserveDbgInfo || !I->getName().startswith("llvm.dbg")) 184f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel I->setName(""); // Internal symbols can't participate in linkage 185229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel } 186229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 187229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 188bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0) 189460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar if (!PreserveDbgInfo || !I->getName().startswith("llvm.dbg")) 190f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel I->setName(""); // Internal symbols can't participate in linkage 191f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel StripSymtab(I->getValueSymbolTable(), PreserveDbgInfo); 192229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel } 193229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 194229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel // Remove all names from types. 195f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel StripTypeSymtab(M.getTypeSymbolTable(), PreserveDbgInfo); 1968c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel 197229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel return true; 198229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel} 199e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 200229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// StripDebugInfo - Strip debug info in the module if it exists. 201229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// To do this, we remove llvm.dbg.func.start, llvm.dbg.stoppoint, and 202229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// llvm.dbg.region.end calls, and any globals they point to if now dead. 2037db949df789383acce98ef072f08794fdd5bd04eDan Gohmanstatic bool StripDebugInfo(Module &M) { 204e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 20576e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel bool Changed = false; 20676e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel 207e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel // Remove all of the calls to the debugger intrinsics, and remove them from 208e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel // the module. 20976e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel if (Function *Declare = M.getFunction("llvm.dbg.declare")) { 2104ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey while (!Declare->use_empty()) { 2114ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey CallInst *CI = cast<CallInst>(Declare->use_back()); 2124ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey CI->eraseFromParent(); 2134ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey } 2144ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey Declare->eraseFromParent(); 21576e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel Changed = true; 2164ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey } 217dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner 218e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.gv"); 21976e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel if (NMD) { 22076e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel Changed = true; 221e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel NMD->eraseFromParent(); 22276e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel } 22376e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel MetadataContext &TheMetadata = M.getContext().getMetadata(); 22476e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel unsigned MDDbgKind = TheMetadata.getMDKind("dbg"); 22576e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel if (!MDDbgKind) 22676e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel return Changed; 22776e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel 22876e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel for (Module::iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI) 22976e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel for (Function::iterator FI = MI->begin(), FE = MI->end(); FI != FE; 23076e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel ++FI) 23176e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; 23276e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel ++BI) 23376e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel TheMetadata.removeMD(MDDbgKind, BI); 234229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 235fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman return true; 236e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner} 237f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 238f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelbool StripSymbols::runOnModule(Module &M) { 239f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel bool Changed = false; 240f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel Changed |= StripDebugInfo(M); 241f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel if (!OnlyDebugInfo) 242f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel Changed |= StripSymbolNames(M, false); 243f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel return Changed; 244f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel} 245f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 246f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelbool StripNonDebugSymbols::runOnModule(Module &M) { 247f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel return StripSymbolNames(M, true); 248f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel} 24923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 25023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patelbool StripDebugDeclare::runOnModule(Module &M) { 25123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 25223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel Function *Declare = M.getFunction("llvm.dbg.declare"); 25323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel std::vector<Constant*> DeadConstants; 25423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 2554425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen if (Declare) { 2564425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen while (!Declare->use_empty()) { 2574425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen CallInst *CI = cast<CallInst>(Declare->use_back()); 2584425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen Value *Arg1 = CI->getOperand(1); 2594425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen Value *Arg2 = CI->getOperand(2); 2604425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen assert(CI->use_empty() && "llvm.dbg intrinsic should have void result"); 2614425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen CI->eraseFromParent(); 2624425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen if (Arg1->use_empty()) { 2634425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen if (Constant *C = dyn_cast<Constant>(Arg1)) 2644425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen DeadConstants.push_back(C); 2654425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen else 266e66f6f15e6afe3d437ccdca93f2209b3d4158486Dan Gohman RecursivelyDeleteTriviallyDeadInstructions(Arg1); 2674425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen } 2684425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen if (Arg2->use_empty()) 2694425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen if (Constant *C = dyn_cast<Constant>(Arg2)) 2704425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen DeadConstants.push_back(C); 27123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel } 2724425240dbcb6e0da24f4a9f72cfb24f529f5b7afDale Johannesen Declare->eraseFromParent(); 27323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel } 27423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 27523e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel while (!DeadConstants.empty()) { 27623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel Constant *C = DeadConstants.back(); 27723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel DeadConstants.pop_back(); 27823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { 27923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel if (GV->hasLocalLinkage()) 28023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel RemoveDeadConstant(GV); 2810eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner } else 28223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel RemoveDeadConstant(C); 28323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel } 28423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel 28523e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel return true; 28623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel} 287