[llvm-commits] [llvm] r66223 - in /llvm/trunk: include/llvm/Transforms/Utils/Local.h lib/Transforms/Utils/Local.cpp
Devang Patel
dpatel at apple.com
Thu Mar 5 16:19:38 PST 2009
Author: dpatel
Date: Thu Mar 5 18:19:37 2009
New Revision: 66223
URL: http://llvm.org/viewvc/llvm-project?rev=66223&view=rev
Log:
Add "check/remove dbg var" helper routines.
Modified:
llvm/trunk/include/llvm/Transforms/Utils/Local.h
llvm/trunk/lib/Transforms/Utils/Local.cpp
Modified: llvm/trunk/include/llvm/Transforms/Utils/Local.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/Local.h?rev=66223&r1=66222&r2=66223&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)
+++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Thu Mar 5 18:19:37 2009
@@ -17,6 +17,7 @@
namespace llvm {
+class User;
class BasicBlock;
class Instruction;
class Value;
@@ -100,6 +101,14 @@
/// with DbgInfoIntrinsic that use the instruction I.
bool OnlyUsedByDbgInfoIntrinsics(Instruction *I,
SmallVectorImpl<DbgInfoIntrinsic *> *DbgInUses = 0);
+
+/// UserIsDebugInfo - Return true if U is a constant expr used by
+/// llvm.dbg.variable or llvm.dbg.global_variable
+bool UserIsDebugInfo(User *U);
+
+/// RemoveDbgInfoUser - Remove an User which is representing debug info.
+void RemoveDbgInfoUser(User *U);
+
} // End llvm namespace
#endif
Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=66223&r1=66222&r2=66223&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/Local.cpp Thu Mar 5 18:19:37 2009
@@ -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 @@
}
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();
+}
More information about the llvm-commits
mailing list