diff options
author | Devang Patel <dpatel@apple.com> | 2009-03-06 00:19:37 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2009-03-06 00:19:37 +0000 |
commit | c79e1182470ed12f1f3d0d35c1725366519a9af7 (patch) | |
tree | 2e302fe67dd40882c7132603db116e1f14f73c9f /lib/Transforms/Utils/Local.cpp | |
parent | 46c95bbe0616fc37cb56866a57939487f45eca00 (diff) |
Add "check/remove dbg var" helper routines.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66223 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | lib/Transforms/Utils/Local.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp index d2cbec0226..4be1b8717d 100644 --- a/lib/Transforms/Utils/Local.cpp +++ b/lib/Transforms/Utils/Local.cpp @@ -14,11 +14,13 @@ #include "llvm/Transforms/Utils/Local.h" #include "llvm/Constants.h" +#include "llvm/GlobalVariable.h" #include "llvm/DerivedTypes.h" #include "llvm/Instructions.h" #include "llvm/Intrinsics.h" #include "llvm/IntrinsicInst.h" #include "llvm/Analysis/ConstantFolding.h" +#include "llvm/Analysis/DebugInfo.h" #include "llvm/Target/TargetData.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/MathExtras.h" @@ -273,3 +275,45 @@ bool llvm::OnlyUsedByDbgInfoIntrinsics(Instruction *I, } return true; } + +/// UserIsDebugInfo - Return true if U is a constant expr used by +/// llvm.dbg.variable or llvm.dbg.global_variable +bool llvm::UserIsDebugInfo(User *U) { + ConstantExpr *CE = dyn_cast<ConstantExpr>(U); + + if (!CE || CE->getNumUses() != 1) + return false; + + Constant *Init = dyn_cast<Constant>(CE->use_back()); + if (!Init || Init->getNumUses() != 1) + return false; + + GlobalVariable *GV = dyn_cast<GlobalVariable>(Init->use_back()); + if (!GV || !GV->hasInitializer() || GV->getInitializer() != Init) + return false; + + DIVariable DV(GV); + if (!DV.isNull()) + return true; // User is llvm.dbg.variable + + DIGlobalVariable DGV(GV); + if (!DGV.isNull()) + return true; // User is llvm.dbg.global_variable + + return false; +} + +/// RemoveDbgInfoUser - Remove an User which is representing debug info. +void llvm::RemoveDbgInfoUser(User *U) { + assert (UserIsDebugInfo(U) && "Unexpected User!"); + ConstantExpr *CE = cast<ConstantExpr>(U); + while (!CE->use_empty()) { + Constant *C = cast<Constant>(CE->use_back()); + while (!C->use_empty()) { + GlobalVariable *GV = cast<GlobalVariable>(C->use_back()); + GV->eraseFromParent(); + } + C->destroyConstant(); + } + CE->destroyConstant(); +} |