diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-03-29 18:56:03 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-03-29 18:56:03 +0000 |
| commit | 40b44e1d0a2beafb86d402bbed521423d473aa81 (patch) | |
| tree | 3380f76cf52ca5654c93b27da6b4e20bd2d9a218 /llvm | |
| parent | 89daa29fa610db912fbcef8c283ae8c40702a7dd (diff) | |
| download | bcm5719-llvm-40b44e1d0a2beafb86d402bbed521423d473aa81.tar.gz bcm5719-llvm-40b44e1d0a2beafb86d402bbed521423d473aa81.zip | |
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
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/IR/IntrinsicInst.h | 11 | ||||
| -rw-r--r-- | llvm/lib/IR/IntrinsicInst.cpp | 27 |
2 files changed, 13 insertions, 25 deletions
diff --git a/llvm/include/llvm/IR/IntrinsicInst.h b/llvm/include/llvm/IR/IntrinsicInst.h index af61c8fac08..50e16ce7126 100644 --- a/llvm/include/llvm/IR/IntrinsicInst.h +++ b/llvm/include/llvm/IR/IntrinsicInst.h @@ -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(); diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp index 427cfef5fa3..ce647c292b5 100644 --- a/llvm/lib/IR/IntrinsicInst.cpp +++ b/llvm/lib/IR/IntrinsicInst.cpp @@ -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.")); |

