StripSymbols.cpp revision 9adb01cbc3ef70e7fa8b4d6b1a1229c63082a496
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" 29ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer#include "llvm/ValueSymbolTable.h" 3078d033e086e19e016273de014f9214aa6f3f844bReid Spencer#include "llvm/TypeSymbolTable.h" 319adb01cbc3ef70e7fa8b4d6b1a1229c63082a496Devang Patel#include "llvm/Transforms/Utils/Local.h" 329133fe28954d498fc4de13064c7d65bd811de02cReid Spencer#include "llvm/Support/Compiler.h" 338c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel#include "llvm/ADT/SmallPtrSet.h" 34e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattnerusing namespace llvm; 35e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 36e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattnernamespace { 379133fe28954d498fc4de13064c7d65bd811de02cReid Spencer class VISIBILITY_HIDDEN 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) 42ae73dc1448d25b02cabc7c64c86c64371453dda8Dan Gohman : ModulePass(&ID), OnlyDebugInfo(ODI) {} 43e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 44f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel virtual bool runOnModule(Module &M); 45f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 46f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel virtual void getAnalysisUsage(AnalysisUsage &AU) const { 47f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel AU.setPreservesAll(); 48f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel } 49f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel }; 50229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 51f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel class VISIBILITY_HIDDEN StripNonDebugSymbols : public ModulePass { 52f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel public: 53f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel static char ID; // Pass identification, replacement for typeid 54f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel explicit StripNonDebugSymbols() 55f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel : ModulePass(&ID) {} 56229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 57e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner virtual bool runOnModule(Module &M); 58e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 59e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner virtual void getAnalysisUsage(AnalysisUsage &AU) const { 60e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner AU.setPreservesAll(); 61e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner } 62e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner }; 63e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner} 64e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 65844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar StripSymbols::ID = 0; 66844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic RegisterPass<StripSymbols> 67844731a7f1909f55935e3514c9e713a62d67662eDan GohmanX("strip", "Strip all symbols from a module"); 68844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 69e3ad43c828280cf11e8631f1a814a51a0b168016Chris LattnerModulePass *llvm::createStripSymbolsPass(bool OnlyDebugInfo) { 70e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner return new StripSymbols(OnlyDebugInfo); 71e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner} 72e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 73f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelchar StripNonDebugSymbols::ID = 0; 74f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelstatic RegisterPass<StripNonDebugSymbols> 75f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang PatelY("strip-nondebug", "Strip all symbols, except dbg symbols, from a module"); 76f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 77f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang PatelModulePass *llvm::createStripNonDebugSymbolsPass() { 78f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel return new StripNonDebugSymbols(); 79f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel} 80f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 81bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel/// OnlyUsedBy - Return true if V is only used by Usr. 82bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patelstatic bool OnlyUsedBy(Value *V, Value *Usr) { 83bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel for(Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { 84bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel User *U = *I; 85bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel if (U != Usr) 86bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel return false; 87bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel } 88bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel return true; 89bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel} 90bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel 91dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattnerstatic void RemoveDeadConstant(Constant *C) { 92dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner assert(C->use_empty() && "Constant is not dead!"); 93bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel SmallPtrSet<Constant *, 4> Operands; 94dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) 95dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner if (isa<DerivedType>(C->getOperand(i)->getType()) && 96bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel OnlyUsedBy(C->getOperand(i), C)) 97bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel Operands.insert(C->getOperand(i)); 98dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { 99bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (!GV->hasLocalLinkage()) return; // Don't delete non static globals. 100dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner GV->eraseFromParent(); 101dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner } 102dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner else if (!isa<Function>(C)) 103f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel if (isa<CompositeType>(C->getType())) 104f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel C->destroyConstant(); 105fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 106dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner // If the constant referenced anything, see if we can delete it as well. 107bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel for (SmallPtrSet<Constant *, 4>::iterator OI = Operands.begin(), 108bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel OE = Operands.end(); OI != OE; ++OI) 109bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel RemoveDeadConstant(*OI); 110dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner} 111e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 1127f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner// Strip the symbol table of its names. 1137f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner// 114f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelstatic void StripSymtab(ValueSymbolTable &ST, bool PreserveDbgInfo) { 1157f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner for (ValueSymbolTable::iterator VI = ST.begin(), VE = ST.end(); VI != VE; ) { 116dec628eead87b20773c98a00830580df211acc98Chris Lattner Value *V = VI->getValue(); 1177f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner ++VI; 118bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (!isa<GlobalValue>(V) || cast<GlobalValue>(V)->hasLocalLinkage()) { 119f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel if (!PreserveDbgInfo || strncmp(V->getNameStart(), "llvm.dbg", 8)) 120f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel // Set name to "", removing from symbol table! 121f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel V->setName(""); 1227f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner } 1237f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner } 1247f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner} 1257f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner 1267f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner// Strip the symbol table of its names. 127f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelstatic void StripTypeSymtab(TypeSymbolTable &ST, bool PreserveDbgInfo) { 128f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel for (TypeSymbolTable::iterator TI = ST.begin(), E = ST.end(); TI != E; ) { 129f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel if (PreserveDbgInfo && strncmp(TI->first.c_str(), "llvm.dbg", 8) == 0) 130f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel ++TI; 131f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel else 132f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel ST.remove(TI++); 133f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel } 1347f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner} 1357f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner 1364460a7e90c318857a37be386a7ebccff3020a795Devang Patel/// Find values that are marked as llvm.used. 1374460a7e90c318857a37be386a7ebccff3020a795Devang Patelvoid findUsedValues(Module &M, 1384460a7e90c318857a37be386a7ebccff3020a795Devang Patel SmallPtrSet<const GlobalValue*, 8>& llvmUsedValues) { 139229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel if (GlobalVariable *LLVMUsed = M.getGlobalVariable("llvm.used")) { 140229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel llvmUsedValues.insert(LLVMUsed); 141229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel // Collect values that are preserved as per explicit request. 142229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel // llvm.used is used to list these values. 143229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel if (ConstantArray *Inits = 144229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel dyn_cast<ConstantArray>(LLVMUsed->getInitializer())) { 145229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel for (unsigned i = 0, e = Inits->getNumOperands(); i != e; ++i) { 146229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel if (GlobalValue *GV = dyn_cast<GlobalValue>(Inits->getOperand(i))) 147229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel llvmUsedValues.insert(GV); 148229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel else if (ConstantExpr *CE = 149229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel dyn_cast<ConstantExpr>(Inits->getOperand(i))) 150229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel if (CE->getOpcode() == Instruction::BitCast) 151229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel if (GlobalValue *GV = dyn_cast<GlobalValue>(CE->getOperand(0))) 152229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel llvmUsedValues.insert(GV); 1538c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel } 1548c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel } 155229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel } 1564460a7e90c318857a37be386a7ebccff3020a795Devang Patel} 1574460a7e90c318857a37be386a7ebccff3020a795Devang Patel 1584460a7e90c318857a37be386a7ebccff3020a795Devang Patel/// StripSymbolNames - Strip symbol names. 159f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelbool StripSymbolNames(Module &M, bool PreserveDbgInfo) { 1604460a7e90c318857a37be386a7ebccff3020a795Devang Patel 1614460a7e90c318857a37be386a7ebccff3020a795Devang Patel SmallPtrSet<const GlobalValue*, 8> llvmUsedValues; 1624460a7e90c318857a37be386a7ebccff3020a795Devang Patel findUsedValues(M, llvmUsedValues); 1634460a7e90c318857a37be386a7ebccff3020a795Devang Patel 164229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel for (Module::global_iterator I = M.global_begin(), E = M.global_end(); 165229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel I != E; ++I) { 166bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0) 167f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel if (!PreserveDbgInfo || strncmp(I->getNameStart(), "llvm.dbg", 8)) 168f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel I->setName(""); // Internal symbols can't participate in linkage 169229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel } 170229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 171229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 172bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0) 173f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel if (!PreserveDbgInfo || strncmp(I->getNameStart(), "llvm.dbg", 8)) 174f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel I->setName(""); // Internal symbols can't participate in linkage 175f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel StripSymtab(I->getValueSymbolTable(), PreserveDbgInfo); 176229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel } 177229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 178229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel // Remove all names from types. 179f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel StripTypeSymtab(M.getTypeSymbolTable(), PreserveDbgInfo); 1808c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel 181229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel return true; 182229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel} 183e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 184229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// StripDebugInfo - Strip debug info in the module if it exists. 185229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// To do this, we remove llvm.dbg.func.start, llvm.dbg.stoppoint, and 186229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel// llvm.dbg.region.end calls, and any globals they point to if now dead. 187f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelbool StripDebugInfo(Module &M) { 188e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner 18973df3c972157409e5b88a08682cdfbe9173f5927Devang Patel SmallPtrSet<const GlobalValue*, 8> llvmUsedValues; 19073df3c972157409e5b88a08682cdfbe9173f5927Devang Patel findUsedValues(M, llvmUsedValues); 19173df3c972157409e5b88a08682cdfbe9173f5927Devang Patel 19273df3c972157409e5b88a08682cdfbe9173f5927Devang Patel // Delete all dbg variables. 19373df3c972157409e5b88a08682cdfbe9173f5927Devang Patel for (Module::global_iterator I = M.global_begin(), E = M.global_end(); 19473df3c972157409e5b88a08682cdfbe9173f5927Devang Patel I != E; ++I) { 19573df3c972157409e5b88a08682cdfbe9173f5927Devang Patel GlobalVariable *GV = dyn_cast<GlobalVariable>(I); 19673df3c972157409e5b88a08682cdfbe9173f5927Devang Patel if (!GV) continue; 19773df3c972157409e5b88a08682cdfbe9173f5927Devang Patel if (!GV->use_empty() && llvmUsedValues.count(I) == 0) { 19873df3c972157409e5b88a08682cdfbe9173f5927Devang Patel if (strncmp(GV->getNameStart(), "llvm.dbg", 8) == 0) { 19973df3c972157409e5b88a08682cdfbe9173f5927Devang Patel GV->replaceAllUsesWith(UndefValue::get(GV->getType())); 20073df3c972157409e5b88a08682cdfbe9173f5927Devang Patel } 20173df3c972157409e5b88a08682cdfbe9173f5927Devang Patel } 20273df3c972157409e5b88a08682cdfbe9173f5927Devang Patel } 20373df3c972157409e5b88a08682cdfbe9173f5927Devang Patel 204688b0490e22eb67623f5aaa24406209be74efcb2Reid Spencer Function *FuncStart = M.getFunction("llvm.dbg.func.start"); 205688b0490e22eb67623f5aaa24406209be74efcb2Reid Spencer Function *StopPoint = M.getFunction("llvm.dbg.stoppoint"); 206688b0490e22eb67623f5aaa24406209be74efcb2Reid Spencer Function *RegionStart = M.getFunction("llvm.dbg.region.start"); 207688b0490e22eb67623f5aaa24406209be74efcb2Reid Spencer Function *RegionEnd = M.getFunction("llvm.dbg.region.end"); 208688b0490e22eb67623f5aaa24406209be74efcb2Reid Spencer Function *Declare = M.getFunction("llvm.dbg.declare"); 209dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner 2104460a7e90c318857a37be386a7ebccff3020a795Devang Patel std::vector<Constant*> DeadConstants; 211dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner 212dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner // Remove all of the calls to the debugger intrinsics, and remove them from 213dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner // the module. 214dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner if (FuncStart) { 215dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner while (!FuncStart->use_empty()) { 216dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner CallInst *CI = cast<CallInst>(FuncStart->use_back()); 217dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner Value *Arg = CI->getOperand(1); 2184ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey assert(CI->use_empty() && "llvm.dbg intrinsic should have void result"); 219dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner CI->eraseFromParent(); 220dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner if (Arg->use_empty()) 2214460a7e90c318857a37be386a7ebccff3020a795Devang Patel if (Constant *C = dyn_cast<Constant>(Arg)) 2224460a7e90c318857a37be386a7ebccff3020a795Devang Patel DeadConstants.push_back(C); 223dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner } 224dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner FuncStart->eraseFromParent(); 225dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner } 226dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner if (StopPoint) { 227dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner while (!StopPoint->use_empty()) { 228dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner CallInst *CI = cast<CallInst>(StopPoint->use_back()); 229f4321a3a438833dade457e24da6e1e6907cabcd5Jim Laskey Value *Arg = CI->getOperand(3); 2304ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey assert(CI->use_empty() && "llvm.dbg intrinsic should have void result"); 231dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner CI->eraseFromParent(); 232dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner if (Arg->use_empty()) 2334460a7e90c318857a37be386a7ebccff3020a795Devang Patel if (Constant *C = dyn_cast<Constant>(Arg)) 2344460a7e90c318857a37be386a7ebccff3020a795Devang Patel DeadConstants.push_back(C); 235dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner } 236dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner StopPoint->eraseFromParent(); 237dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner } 2384ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey if (RegionStart) { 2394ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey while (!RegionStart->use_empty()) { 2404ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey CallInst *CI = cast<CallInst>(RegionStart->use_back()); 2414ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey Value *Arg = CI->getOperand(1); 2424ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey assert(CI->use_empty() && "llvm.dbg intrinsic should have void result"); 2434ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey CI->eraseFromParent(); 2444ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey if (Arg->use_empty()) 2454460a7e90c318857a37be386a7ebccff3020a795Devang Patel if (Constant *C = dyn_cast<Constant>(Arg)) 2464460a7e90c318857a37be386a7ebccff3020a795Devang Patel DeadConstants.push_back(C); 2474ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey } 2484ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey RegionStart->eraseFromParent(); 2494ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey } 250dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner if (RegionEnd) { 251dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner while (!RegionEnd->use_empty()) { 252dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner CallInst *CI = cast<CallInst>(RegionEnd->use_back()); 2534ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey Value *Arg = CI->getOperand(1); 2544ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey assert(CI->use_empty() && "llvm.dbg intrinsic should have void result"); 255dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner CI->eraseFromParent(); 2564ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey if (Arg->use_empty()) 2574460a7e90c318857a37be386a7ebccff3020a795Devang Patel if (Constant *C = dyn_cast<Constant>(Arg)) 2584460a7e90c318857a37be386a7ebccff3020a795Devang Patel DeadConstants.push_back(C); 259dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner } 260dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner RegionEnd->eraseFromParent(); 261dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner } 2624ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey if (Declare) { 2634ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey while (!Declare->use_empty()) { 2644ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey CallInst *CI = cast<CallInst>(Declare->use_back()); 265f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel Value *Arg1 = CI->getOperand(1); 266f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel Value *Arg2 = CI->getOperand(2); 2674ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey assert(CI->use_empty() && "llvm.dbg intrinsic should have void result"); 2684ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey CI->eraseFromParent(); 269f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel if (Arg1->use_empty()) { 270f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel if (Constant *C = dyn_cast<Constant>(Arg1)) 271f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel DeadConstants.push_back(C); 2729adb01cbc3ef70e7fa8b4d6b1a1229c63082a496Devang Patel else 2739adb01cbc3ef70e7fa8b4d6b1a1229c63082a496Devang Patel RecursivelyDeleteTriviallyDeadInstructions(Arg1, NULL); 274f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel } 275f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel if (Arg2->use_empty()) 276f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel if (Constant *C = dyn_cast<Constant>(Arg2)) 2774460a7e90c318857a37be386a7ebccff3020a795Devang Patel DeadConstants.push_back(C); 2784ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey } 2794ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey Declare->eraseFromParent(); 2804ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey } 281dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner 282bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel // llvm.dbg.compile_units and llvm.dbg.subprograms are marked as linkonce 283bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel // but since we are removing all debug information, make them internal now. 284bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola // FIXME: Use private linkage maybe? 285bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel if (Constant *C = M.getNamedGlobal("llvm.dbg.compile_units")) 286bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) 287bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel GV->setLinkage(GlobalValue::InternalLinkage); 288bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel 289bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel if (Constant *C = M.getNamedGlobal("llvm.dbg.subprograms")) 290bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) 291bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel GV->setLinkage(GlobalValue::InternalLinkage); 2924460a7e90c318857a37be386a7ebccff3020a795Devang Patel 2934460a7e90c318857a37be386a7ebccff3020a795Devang Patel if (Constant *C = M.getNamedGlobal("llvm.dbg.global_variables")) 2944460a7e90c318857a37be386a7ebccff3020a795Devang Patel if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) 2954460a7e90c318857a37be386a7ebccff3020a795Devang Patel GV->setLinkage(GlobalValue::InternalLinkage); 296bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel 297bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel // Delete all dbg variables. 298fb5fd5a0bb5f81acda6d04d69c20d49ef06a36f0Devang Patel for (Module::global_iterator I = M.global_begin(), E = M.global_end(); 299fb5fd5a0bb5f81acda6d04d69c20d49ef06a36f0Devang Patel I != E; ++I) { 300fb5fd5a0bb5f81acda6d04d69c20d49ef06a36f0Devang Patel GlobalVariable *GV = dyn_cast<GlobalVariable>(I); 301fb5fd5a0bb5f81acda6d04d69c20d49ef06a36f0Devang Patel if (!GV) continue; 302fb5fd5a0bb5f81acda6d04d69c20d49ef06a36f0Devang Patel if (GV->use_empty() && llvmUsedValues.count(I) == 0 303fb5fd5a0bb5f81acda6d04d69c20d49ef06a36f0Devang Patel && (!GV->hasSection() 304fb5fd5a0bb5f81acda6d04d69c20d49ef06a36f0Devang Patel || strcmp(GV->getSection().c_str(), "llvm.metadata") == 0)) 305fb5fd5a0bb5f81acda6d04d69c20d49ef06a36f0Devang Patel DeadConstants.push_back(GV); 306fb5fd5a0bb5f81acda6d04d69c20d49ef06a36f0Devang Patel } 307bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel 3084460a7e90c318857a37be386a7ebccff3020a795Devang Patel if (DeadConstants.empty()) 309229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel return false; 310229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 311bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel // Delete any internal globals that were only used by the debugger intrinsics. 3124460a7e90c318857a37be386a7ebccff3020a795Devang Patel while (!DeadConstants.empty()) { 3134460a7e90c318857a37be386a7ebccff3020a795Devang Patel Constant *C = DeadConstants.back(); 3144460a7e90c318857a37be386a7ebccff3020a795Devang Patel DeadConstants.pop_back(); 3154460a7e90c318857a37be386a7ebccff3020a795Devang Patel if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { 316bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (GV->hasLocalLinkage()) 3174460a7e90c318857a37be386a7ebccff3020a795Devang Patel RemoveDeadConstant(GV); 3184460a7e90c318857a37be386a7ebccff3020a795Devang Patel } 3194460a7e90c318857a37be386a7ebccff3020a795Devang Patel else 3204460a7e90c318857a37be386a7ebccff3020a795Devang Patel RemoveDeadConstant(C); 321dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner } 322dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner 323bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel // Remove all llvm.dbg types. 324bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel TypeSymbolTable &ST = M.getTypeSymbolTable(); 3253f914f0138415d64ce5eacfb464d7c1ad99c19d4Chris Lattner for (TypeSymbolTable::iterator TI = ST.begin(), TE = ST.end(); TI != TE; ) { 3263f914f0138415d64ce5eacfb464d7c1ad99c19d4Chris Lattner if (!strncmp(TI->first.c_str(), "llvm.dbg.", 9)) 327bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel ST.remove(TI++); 328bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel else 329bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel ++TI; 330bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel } 331bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel 332fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman return true; 333e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner} 334f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 335f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelbool StripSymbols::runOnModule(Module &M) { 336f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel bool Changed = false; 337f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel Changed |= StripDebugInfo(M); 338f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel if (!OnlyDebugInfo) 339f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel Changed |= StripSymbolNames(M, false); 340f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel return Changed; 341f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel} 342f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 343f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patelbool StripNonDebugSymbols::runOnModule(Module &M) { 344f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel return StripSymbolNames(M, true); 345f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel} 346