aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms/Utils/DbgInfoUtils.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2008-11-11 00:53:02 +0000
committerDevang Patel <dpatel@apple.com>2008-11-11 00:53:02 +0000
commit780c38d84f5dbe3bafecac5cdeb061c87618710a (patch)
treed409b178a75929d931ddab15b5c41fe2aa44ad88 /lib/Transforms/Utils/DbgInfoUtils.cpp
parent080098e3115e095c5e0e9c260e2e7a0ffb5fbe7f (diff)
Add utility routines to remove dead debug info.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59011 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/DbgInfoUtils.cpp')
-rw-r--r--lib/Transforms/Utils/DbgInfoUtils.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/DbgInfoUtils.cpp b/lib/Transforms/Utils/DbgInfoUtils.cpp
new file mode 100644
index 0000000000..4bd116a6e5
--- /dev/null
+++ b/lib/Transforms/Utils/DbgInfoUtils.cpp
@@ -0,0 +1,60 @@
+//===-- DbgInfoUtils.cpp - DbgInfo Utilities -------------------------------==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Utility functions to manipulate debugging information.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Transforms/Utils/DbgInfoUtils.h"
+#include "llvm/IntrinsicInst.h"
+
+using namespace llvm;
+
+/// RemoveDeadDbgIntrinsics - Remove dead dbg intrinsics from this
+/// basic block.
+void llvm::RemoveDeadDbgIntrinsics(BasicBlock &BB) {
+ BasicBlock::iterator BI = BB.begin(), BE = BB.end();
+ if (BI == BE) return;
+
+ Instruction *Prev = BI; ++BI;
+ while (BI != BE) {
+ Instruction *Next = BI; ++BI;
+ DbgInfoIntrinsic *DBI_Prev = dyn_cast<DbgInfoIntrinsic>(Prev);
+ if (!DBI_Prev) {
+ Prev = Next;
+ continue;
+ }
+
+ // If there are two consecutive llvm.dbg.stoppoint calls then
+ // it is likely that the optimizer deleted code in between these
+ // two intrinsics.
+ DbgInfoIntrinsic *DBI_Next = dyn_cast<DbgInfoIntrinsic>(Next);
+ if (DBI_Next
+ && DBI_Prev->getIntrinsicID() == llvm::Intrinsic::dbg_stoppoint
+ && DBI_Next->getIntrinsicID() == llvm::Intrinsic::dbg_stoppoint)
+ Prev->eraseFromParent();
+
+ // If a llvm.dbg.stoppoint is placed just before an unconditional
+ // branch then remove the llvm.dbg.stoppoint intrinsic.
+ else if (BranchInst *UC = dyn_cast<BranchInst>(Next)) {
+ if (UC->isUnconditional()
+ && DBI_Prev->getIntrinsicID() == llvm::Intrinsic::dbg_stoppoint)
+ Prev->eraseFromParent();
+ }
+
+ Prev = Next;
+ }
+}
+
+/// RemoveDeadDbgIntrinsics - Remove dead dbg intrinsics from this function.
+void llvm::RemoveDeadDbgIntrinsics(Function &F) {
+ for (Function::iterator FI = F.begin(), FE = F.end();
+ FI != FE; ++FI)
+ RemoveDeadDbgIntrinsics(*FI);
+}