mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Add "check/remove dbg var" helper routines.
llvm-svn: 66223
This commit is contained in:
parent
fbcb5235b0
commit
28a28a2588
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
|
class User;
|
||||||
class BasicBlock;
|
class BasicBlock;
|
||||||
class Instruction;
|
class Instruction;
|
||||||
class Value;
|
class Value;
|
||||||
@ -100,6 +101,14 @@ AllocaInst *DemotePHIToStack(PHINode *P, Instruction *AllocaPoint = 0);
|
|||||||
/// with DbgInfoIntrinsic that use the instruction I.
|
/// with DbgInfoIntrinsic that use the instruction I.
|
||||||
bool OnlyUsedByDbgInfoIntrinsics(Instruction *I,
|
bool OnlyUsedByDbgInfoIntrinsics(Instruction *I,
|
||||||
SmallVectorImpl<DbgInfoIntrinsic *> *DbgInUses = 0);
|
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
|
} // End llvm namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -14,11 +14,13 @@
|
|||||||
|
|
||||||
#include "llvm/Transforms/Utils/Local.h"
|
#include "llvm/Transforms/Utils/Local.h"
|
||||||
#include "llvm/Constants.h"
|
#include "llvm/Constants.h"
|
||||||
|
#include "llvm/GlobalVariable.h"
|
||||||
#include "llvm/DerivedTypes.h"
|
#include "llvm/DerivedTypes.h"
|
||||||
#include "llvm/Instructions.h"
|
#include "llvm/Instructions.h"
|
||||||
#include "llvm/Intrinsics.h"
|
#include "llvm/Intrinsics.h"
|
||||||
#include "llvm/IntrinsicInst.h"
|
#include "llvm/IntrinsicInst.h"
|
||||||
#include "llvm/Analysis/ConstantFolding.h"
|
#include "llvm/Analysis/ConstantFolding.h"
|
||||||
|
#include "llvm/Analysis/DebugInfo.h"
|
||||||
#include "llvm/Target/TargetData.h"
|
#include "llvm/Target/TargetData.h"
|
||||||
#include "llvm/Support/GetElementPtrTypeIterator.h"
|
#include "llvm/Support/GetElementPtrTypeIterator.h"
|
||||||
#include "llvm/Support/MathExtras.h"
|
#include "llvm/Support/MathExtras.h"
|
||||||
@ -273,3 +275,45 @@ bool llvm::OnlyUsedByDbgInfoIntrinsics(Instruction *I,
|
|||||||
}
|
}
|
||||||
return true;
|
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();
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user