From f0b46d438a54c2cb06ba26b45eb3f82c6c7fcf22 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Mon, 9 Mar 2009 20:49:37 +0000 Subject: [PATCH] Add helper pass to remove llvm.dbg.declare intrinsics. llvm-svn: 66454 --- include/llvm/Transforms/IPO.h | 9 ++++- lib/Transforms/IPO/StripSymbols.cpp | 62 +++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/include/llvm/Transforms/IPO.h b/include/llvm/Transforms/IPO.h index eeb2aa26e83..4372ea00d42 100644 --- a/include/llvm/Transforms/IPO.h +++ b/include/llvm/Transforms/IPO.h @@ -35,11 +35,16 @@ ModulePass *createStripSymbolsPass(bool OnlyDebugInfo = false); //===----------------------------------------------------------------------===// // -// These functions removes symbols from functions and modules. -// Only debugging information is not removed. +// These functions strips symbols from functions and modules. +// Only debugging information is not stripped. // ModulePass *createStripNonDebugSymbolsPass(); +//===----------------------------------------------------------------------===// +// +// These pass removes llvm.dbg.declare intrinsics. +ModulePass *createStripDebugDeclarePass(); + //===----------------------------------------------------------------------===// /// createLowerSetJmpPass - This function lowers the setjmp/longjmp intrinsics /// to invoke/unwind instructions. This should really be part of the C/C++ diff --git a/lib/Transforms/IPO/StripSymbols.cpp b/lib/Transforms/IPO/StripSymbols.cpp index fbb2075cb46..066487fe159 100644 --- a/lib/Transforms/IPO/StripSymbols.cpp +++ b/lib/Transforms/IPO/StripSymbols.cpp @@ -60,6 +60,19 @@ namespace { AU.setPreservesAll(); } }; + + class VISIBILITY_HIDDEN StripDebugDeclare : public ModulePass { + public: + static char ID; // Pass identification, replacement for typeid + explicit StripDebugDeclare() + : ModulePass(&ID) {} + + virtual bool runOnModule(Module &M); + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + } + }; } char StripSymbols::ID = 0; @@ -78,6 +91,14 @@ ModulePass *llvm::createStripNonDebugSymbolsPass() { return new StripNonDebugSymbols(); } +char StripDebugDeclare::ID = 0; +static RegisterPass +Z("strip-debug-declare", "Strip all llvm.dbg.declare intrinsics"); + +ModulePass *llvm::createStripDebugDeclarePass() { + return new StripDebugDeclare(); +} + /// OnlyUsedBy - Return true if V is only used by Usr. static bool OnlyUsedBy(Value *V, Value *Usr) { for(Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { @@ -343,3 +364,44 @@ bool StripSymbols::runOnModule(Module &M) { bool StripNonDebugSymbols::runOnModule(Module &M) { return StripSymbolNames(M, true); } + +bool StripDebugDeclare::runOnModule(Module &M) { + + Function *Declare = M.getFunction("llvm.dbg.declare"); + + if (!Declare) + return false; + + std::vector DeadConstants; + + while (!Declare->use_empty()) { + CallInst *CI = cast(Declare->use_back()); + Value *Arg1 = CI->getOperand(1); + Value *Arg2 = CI->getOperand(2); + assert(CI->use_empty() && "llvm.dbg intrinsic should have void result"); + CI->eraseFromParent(); + if (Arg1->use_empty()) { + if (Constant *C = dyn_cast(Arg1)) + DeadConstants.push_back(C); + else + RecursivelyDeleteTriviallyDeadInstructions(Arg1, NULL); + } + if (Arg2->use_empty()) + if (Constant *C = dyn_cast(Arg2)) + DeadConstants.push_back(C); + } + Declare->eraseFromParent(); + + while (!DeadConstants.empty()) { + Constant *C = DeadConstants.back(); + DeadConstants.pop_back(); + if (GlobalVariable *GV = dyn_cast(C)) { + if (GV->hasLocalLinkage()) + RemoveDeadConstant(GV); + } + else + RemoveDeadConstant(C); + } + + return true; +}