IR: Add DbgInfoIntrinsic::getVariableLocation

Create a common accessor, DbgInfoIntrinsic::getVariableLocation, which
doesn't care about the type of debug info intrinsic.  Use this to
further unify the implementations of DbgDeclareInst::getAddress and
DbgValueInst::getValue.

Besides being a cleanup, I'm planning to use this to prepare DEBUG
output without having to branch on the concrete type.

llvm-svn: 264767
This commit is contained in:
Duncan P. N. Exon Smith 2016-03-29 18:56:03 +00:00
parent 721ddaf471
commit 210e27d1ff
2 changed files with 13 additions and 25 deletions

View File

@ -58,6 +58,10 @@ namespace llvm {
/// This is the common base class for debug info intrinsics.
class DbgInfoIntrinsic : public IntrinsicInst {
public:
/// Get the location corresponding to the variable referenced by the debug
/// info intrinsic. Depending on the intrinsic, this could be the
/// variable's value or its address.
Value *getVariableLocation(bool AllowNullOp = true) const;
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const IntrinsicInst *I) {
@ -78,7 +82,7 @@ namespace llvm {
/// This represents the llvm.dbg.declare instruction.
class DbgDeclareInst : public DbgInfoIntrinsic {
public:
Value *getAddress() const;
Value *getAddress() const { return getVariableLocation(); }
DILocalVariable *getVariable() const {
return cast<DILocalVariable>(getRawVariable());
}
@ -105,8 +109,9 @@ namespace llvm {
/// This represents the llvm.dbg.value instruction.
class DbgValueInst : public DbgInfoIntrinsic {
public:
const Value *getValue() const;
Value *getValue();
Value *getValue() const {
return getVariableLocation(/* AllowNullOp = */ false);
}
uint64_t getOffset() const {
return cast<ConstantInt>(
const_cast<Value*>(getArgOperand(1)))->getZExtValue();

View File

@ -50,7 +50,11 @@ Value *DbgInfoIntrinsic::StripCast(Value *C) {
return dyn_cast<GlobalVariable>(C);
}
static Value *getValueImpl(Value *Op) {
Value *DbgInfoIntrinsic::getVariableLocation(bool AllowNullOp) const {
Value *Op = getArgOperand(0);
if (AllowNullOp && !Op)
return nullptr;
auto *MD = cast<MetadataAsValue>(Op)->getMetadata();
if (auto *V = dyn_cast<ValueAsMetadata>(MD))
return V->getValue();
@ -60,27 +64,6 @@ static Value *getValueImpl(Value *Op) {
return nullptr;
}
//===----------------------------------------------------------------------===//
/// DbgDeclareInst - This represents the llvm.dbg.declare instruction.
///
Value *DbgDeclareInst::getAddress() const {
if (!getArgOperand(0))
return nullptr;
return getValueImpl(getArgOperand(0));
}
//===----------------------------------------------------------------------===//
/// DbgValueInst - This represents the llvm.dbg.value instruction.
///
const Value *DbgValueInst::getValue() const {
return const_cast<DbgValueInst *>(this)->getValue();
}
Value *DbgValueInst::getValue() { return getValueImpl(getArgOperand(0)); }
int llvm::Intrinsic::lookupLLVMIntrinsicByName(ArrayRef<const char *> NameTable,
StringRef Name) {
assert(Name.startswith("llvm."));