diff --git a/llvm/include/llvm/Transforms/Utils/DbgInfoUtils.h b/llvm/include/llvm/Transforms/Utils/DbgInfoUtils.h new file mode 100644 index 000000000000..13f8fa3ef216 --- /dev/null +++ b/llvm/include/llvm/Transforms/Utils/DbgInfoUtils.h @@ -0,0 +1,28 @@ +//===-- Transform/Utils/DbgInfoUtils.h - DbgInfo Utils ----------*- C++ -*-===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TRANSFORMS_UTILS_DBGINFO_H +#define LLVM_TRANSFORMS_UTILS_DBGINFO_H +namespace llvm { +class BasicBlock; +class Function; + +/// RemoveDeadDbgIntrinsics - Remove dead dbg intrinsics from this +/// basic block. +void RemoveDeadDbgIntrinsics(BasicBlock &BB); + +/// RemoveDeadDbgIntrinsics - Remove dead dbg intrinsics from this function. +void RemoveDeadDbgIntrinsics(Function &F); + +} // End llvm namespace +#endif diff --git a/llvm/lib/Transforms/Utils/DbgInfoUtils.cpp b/llvm/lib/Transforms/Utils/DbgInfoUtils.cpp new file mode 100644 index 000000000000..4bd116a6e561 --- /dev/null +++ b/llvm/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(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(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(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); +}