1894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===- StripSymbols.cpp - Strip symbols and debug info from a module ------===// 2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 3894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The LLVM Compiler Infrastructure 4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file is distributed under the University of Illinois Open Source 6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// License. See LICENSE.TXT for details. 7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===// 9894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 10894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The StripSymbols transformation implements code stripping. Specifically, it 11894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// can delete: 12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// * names for virtual registers 14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// * symbols for internal globals and functions 15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// * debug information 16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Note that this transformation makes code much less readable, so it should 18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// only be used in situations where the 'strip' utility would be used, such as 19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// reducing code size or making it harder to reverse engineer code. 20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===// 22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Transforms/IPO.h" 24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Constants.h" 25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/DerivedTypes.h" 26894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Instructions.h" 27894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Module.h" 28894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Pass.h" 29894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Analysis/DebugInfo.h" 30894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/ValueSymbolTable.h" 31894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Transforms/Utils/Local.h" 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/DenseMap.h" 33894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/ADT/SmallPtrSet.h" 34894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanusing namespace llvm; 35894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 36894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace { 37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman class StripSymbols : public ModulePass { 38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman bool OnlyDebugInfo; 39894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public: 40894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static char ID; // Pass identification, replacement for typeid 41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman explicit StripSymbols(bool ODI = false) 4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : ModulePass(ID), OnlyDebugInfo(ODI) { 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman initializeStripSymbolsPass(*PassRegistry::getPassRegistry()); 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 45894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 46894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman virtual bool runOnModule(Module &M); 47894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman virtual void getAnalysisUsage(AnalysisUsage &AU) const { 49894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman AU.setPreservesAll(); 50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 52894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 53894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman class StripNonDebugSymbols : public ModulePass { 54894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public: 55894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static char ID; // Pass identification, replacement for typeid 56894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman explicit StripNonDebugSymbols() 5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : ModulePass(ID) { 5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman initializeStripNonDebugSymbolsPass(*PassRegistry::getPassRegistry()); 5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman virtual bool runOnModule(Module &M); 62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman virtual void getAnalysisUsage(AnalysisUsage &AU) const { 64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman AU.setPreservesAll(); 65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman class StripDebugDeclare : public ModulePass { 69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public: 70894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static char ID; // Pass identification, replacement for typeid 71894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman explicit StripDebugDeclare() 7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : ModulePass(ID) { 7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman initializeStripDebugDeclarePass(*PassRegistry::getPassRegistry()); 7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 76894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman virtual bool runOnModule(Module &M); 77894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 78894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman virtual void getAnalysisUsage(AnalysisUsage &AU) const { 79894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman AU.setPreservesAll(); 80894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 81894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 82894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 83894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman class StripDeadDebugInfo : public ModulePass { 84894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public: 85894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static char ID; // Pass identification, replacement for typeid 86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman explicit StripDeadDebugInfo() 8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : ModulePass(ID) { 8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman initializeStripDeadDebugInfoPass(*PassRegistry::getPassRegistry()); 8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman virtual bool runOnModule(Module &M); 92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman virtual void getAnalysisUsage(AnalysisUsage &AU) const { 94894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman AU.setPreservesAll(); 95894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 96894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 97894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 98894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 99894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar StripSymbols::ID = 0; 100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanINITIALIZE_PASS(StripSymbols, "strip", 10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "Strip all symbols from a module", false, false) 102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanModulePass *llvm::createStripSymbolsPass(bool OnlyDebugInfo) { 104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return new StripSymbols(OnlyDebugInfo); 105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar StripNonDebugSymbols::ID = 0; 108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanINITIALIZE_PASS(StripNonDebugSymbols, "strip-nondebug", 109894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman "Strip all symbols, except dbg symbols, from a module", 11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman false, false) 111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 112894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanModulePass *llvm::createStripNonDebugSymbolsPass() { 113894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return new StripNonDebugSymbols(); 114894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 115894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 116894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar StripDebugDeclare::ID = 0; 117894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanINITIALIZE_PASS(StripDebugDeclare, "strip-debug-declare", 11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "Strip all llvm.dbg.declare intrinsics", false, false) 119894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanModulePass *llvm::createStripDebugDeclarePass() { 121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return new StripDebugDeclare(); 122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar StripDeadDebugInfo::ID = 0; 125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanINITIALIZE_PASS(StripDeadDebugInfo, "strip-dead-debug-info", 12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "Strip debug info for unused symbols", false, false) 127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanModulePass *llvm::createStripDeadDebugInfoPass() { 129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return new StripDeadDebugInfo(); 130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// OnlyUsedBy - Return true if V is only used by Usr. 133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic bool OnlyUsedBy(Value *V, Value *Usr) { 134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for(Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { 135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman User *U = *I; 136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (U != Usr) 137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; 140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic void RemoveDeadConstant(Constant *C) { 143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman assert(C->use_empty() && "Constant is not dead!"); 144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman SmallPtrSet<Constant*, 4> Operands; 145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) 14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OnlyUsedBy(C->getOperand(i), C)) 147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Operands.insert(cast<Constant>(C->getOperand(i))); 148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { 149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!GV->hasLocalLinkage()) return; // Don't delete non static globals. 150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman GV->eraseFromParent(); 151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else if (!isa<Function>(C)) 153894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (isa<CompositeType>(C->getType())) 154894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman C->destroyConstant(); 155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // If the constant referenced anything, see if we can delete it as well. 157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (SmallPtrSet<Constant*, 4>::iterator OI = Operands.begin(), 158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman OE = Operands.end(); OI != OE; ++OI) 159894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman RemoveDeadConstant(*OI); 160894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 161894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 162894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Strip the symbol table of its names. 163894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 164894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic void StripSymtab(ValueSymbolTable &ST, bool PreserveDbgInfo) { 165894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (ValueSymbolTable::iterator VI = ST.begin(), VE = ST.end(); VI != VE; ) { 166894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Value *V = VI->getValue(); 167894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ++VI; 168894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!isa<GlobalValue>(V) || cast<GlobalValue>(V)->hasLocalLinkage()) { 169894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!PreserveDbgInfo || !V->getName().startswith("llvm.dbg")) 170894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // Set name to "", removing from symbol table! 171894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman V->setName(""); 172894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 173894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 174894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 175894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// Strip any named types of their names. 17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic void StripTypeNames(Module &M, bool PreserveDbgInfo) { 17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman std::vector<StructType*> StructTypes; 17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman M.findUsedStructTypes(StructTypes); 18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman for (unsigned i = 0, e = StructTypes.size(); i != e; ++i) { 18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StructType *STy = StructTypes[i]; 18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (STy->isLiteral() || STy->getName().empty()) continue; 18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (PreserveDbgInfo && STy->getName().startswith("llvm.dbg")) 18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman continue; 18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman STy->setName(""); 189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// Find values that are marked as llvm.used. 193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic void findUsedValues(GlobalVariable *LLVMUsed, 194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman SmallPtrSet<const GlobalValue*, 8> &UsedValues) { 195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LLVMUsed == 0) return; 196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman UsedValues.insert(LLVMUsed); 197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ConstantArray *Inits = dyn_cast<ConstantArray>(LLVMUsed->getInitializer()); 199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (Inits == 0) return; 200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (unsigned i = 0, e = Inits->getNumOperands(); i != e; ++i) 202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (GlobalValue *GV = 203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman dyn_cast<GlobalValue>(Inits->getOperand(i)->stripPointerCasts())) 204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman UsedValues.insert(GV); 205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// StripSymbolNames - Strip symbol names. 208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic bool StripSymbolNames(Module &M, bool PreserveDbgInfo) { 209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman SmallPtrSet<const GlobalValue*, 8> llvmUsedValues; 211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman findUsedValues(M.getGlobalVariable("llvm.used"), llvmUsedValues); 212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman findUsedValues(M.getGlobalVariable("llvm.compiler.used"), llvmUsedValues); 213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 214894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (Module::global_iterator I = M.global_begin(), E = M.global_end(); 215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman I != E; ++I) { 216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0) 217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!PreserveDbgInfo || !I->getName().startswith("llvm.dbg")) 218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman I->setName(""); // Internal symbols can't participate in linkage 219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (I->hasLocalLinkage() && llvmUsedValues.count(I) == 0) 223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!PreserveDbgInfo || !I->getName().startswith("llvm.dbg")) 224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman I->setName(""); // Internal symbols can't participate in linkage 225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman StripSymtab(I->getValueSymbolTable(), PreserveDbgInfo); 226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // Remove all names from types. 22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StripTypeNames(M, PreserveDbgInfo); 230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; 232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// StripDebugInfo - Strip debug info in the module if it exists. 235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// To do this, we remove llvm.dbg.func.start, llvm.dbg.stoppoint, and 236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// llvm.dbg.region.end calls, and any globals they point to if now dead. 237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic bool StripDebugInfo(Module &M) { 238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman bool Changed = false; 240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // Remove all of the calls to the debugger intrinsics, and remove them from 242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // the module. 243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (Function *Declare = M.getFunction("llvm.dbg.declare")) { 244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman while (!Declare->use_empty()) { 245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman CallInst *CI = cast<CallInst>(Declare->use_back()); 246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman CI->eraseFromParent(); 247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Declare->eraseFromParent(); 249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed = true; 250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (Function *DbgVal = M.getFunction("llvm.dbg.value")) { 253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman while (!DbgVal->use_empty()) { 254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman CallInst *CI = cast<CallInst>(DbgVal->use_back()); 255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman CI->eraseFromParent(); 256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman DbgVal->eraseFromParent(); 258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed = true; 259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (Module::named_metadata_iterator NMI = M.named_metadata_begin(), 262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NME = M.named_metadata_end(); NMI != NME;) { 263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NamedMDNode *NMD = NMI; 264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ++NMI; 265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (NMD->getName().startswith("llvm.dbg.")) { 266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NMD->eraseFromParent(); 267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed = true; 268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (Module::iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI) 272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (Function::iterator FI = MI->begin(), FE = MI->end(); FI != FE; 273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ++FI) 274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; 275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ++BI) { 276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!BI->getDebugLoc().isUnknown()) { 277894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed = true; 278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman BI->setDebugLoc(DebugLoc()); 279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return Changed; 283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool StripSymbols::runOnModule(Module &M) { 286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman bool Changed = false; 287894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed |= StripDebugInfo(M); 288894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!OnlyDebugInfo) 289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed |= StripSymbolNames(M, false); 290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return Changed; 291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool StripNonDebugSymbols::runOnModule(Module &M) { 294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return StripSymbolNames(M, true); 295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool StripDebugDeclare::runOnModule(Module &M) { 298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Function *Declare = M.getFunction("llvm.dbg.declare"); 300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman std::vector<Constant*> DeadConstants; 301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (Declare) { 303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman while (!Declare->use_empty()) { 304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman CallInst *CI = cast<CallInst>(Declare->use_back()); 305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Value *Arg1 = CI->getArgOperand(0); 306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Value *Arg2 = CI->getArgOperand(1); 307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman assert(CI->use_empty() && "llvm.dbg intrinsic should have void result"); 308894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman CI->eraseFromParent(); 309894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (Arg1->use_empty()) { 310894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (Constant *C = dyn_cast<Constant>(Arg1)) 311894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman DeadConstants.push_back(C); 312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman RecursivelyDeleteTriviallyDeadInstructions(Arg1); 314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (Arg2->use_empty()) 316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (Constant *C = dyn_cast<Constant>(Arg2)) 317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman DeadConstants.push_back(C); 318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Declare->eraseFromParent(); 320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman while (!DeadConstants.empty()) { 323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Constant *C = DeadConstants.back(); 324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman DeadConstants.pop_back(); 325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { 326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (GV->hasLocalLinkage()) 327894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman RemoveDeadConstant(GV); 328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } else 329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman RemoveDeadConstant(C); 330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; 333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// getRealLinkageName - If special LLVM prefix that is used to inform the asm 336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// printer to not emit usual symbol prefix before the symbol name is used then 337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// return linkage name after skipping this special LLVM prefix. 338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstatic StringRef getRealLinkageName(StringRef LinkageName) { 339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman char One = '\1'; 340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LinkageName.startswith(StringRef(&One, 1))) 341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return LinkageName.substr(1); 342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return LinkageName; 343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool StripDeadDebugInfo::runOnModule(Module &M) { 346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman bool Changed = false; 347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // Debugging infomration is encoded in llvm IR using metadata. This is designed 349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // such a way that debug info for symbols preserved even if symbols are 350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // optimized away by the optimizer. This special pass removes debug info for 351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // such symbols. 352894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 353894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // llvm.dbg.gv keeps track of debug info for global variables. 354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.gv")) { 355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman SmallVector<MDNode *, 8> MDs; 356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) 357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (DIGlobalVariable(NMD->getOperand(i)).Verify()) 358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman MDs.push_back(NMD->getOperand(i)); 359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed = true; 361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NMD->eraseFromParent(); 362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NMD = NULL; 363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (SmallVector<MDNode *, 8>::iterator I = MDs.begin(), 365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman E = MDs.end(); I != E; ++I) { 36619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman GlobalVariable *GV = DIGlobalVariable(*I).getGlobal(); 36719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (GV && M.getGlobalVariable(GV->getName(), true)) { 368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!NMD) 369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NMD = M.getOrInsertNamedMetadata("llvm.dbg.gv"); 370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NMD->addOperand(*I); 371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed = true; 374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // llvm.dbg.sp keeps track of debug info for subprograms. 378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp")) { 379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman SmallVector<MDNode *, 8> MDs; 380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) 381894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (DISubprogram(NMD->getOperand(i)).Verify()) 382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman MDs.push_back(NMD->getOperand(i)); 383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed = true; 385894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NMD->eraseFromParent(); 386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NMD = NULL; 387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (SmallVector<MDNode *, 8>::iterator I = MDs.begin(), 389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman E = MDs.end(); I != E; ++I) { 390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman bool FnIsLive = false; 391894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (Function *F = DISubprogram(*I).getFunction()) 392894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (M.getFunction(F->getName())) 393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman FnIsLive = true; 394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (FnIsLive) { 395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!NMD) 396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NMD = M.getOrInsertNamedMetadata("llvm.dbg.sp"); 397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman NMD->addOperand(*I); 398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } else { 399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // Remove llvm.dbg.lv.fnname named mdnode which may have been used 400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman // to hold debug info for dead function's local variables. 401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman StringRef FName = DISubprogram(*I).getLinkageName(); 402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (FName.empty()) 403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman FName = DISubprogram(*I).getName(); 404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (NamedMDNode *LVNMD = 405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman M.getNamedMetadata(Twine("llvm.dbg.lv.", 406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman getRealLinkageName(FName)))) 407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LVNMD->eraseFromParent(); 408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 411894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return Changed; 413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 414