From 25cf28fd7b1920dc3a92cc6f7c846a949d127dea Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Sun, 15 Mar 2015 01:23:20 +0000 Subject: [PATCH] DbgIntrinsicInst: Downcast to specialized MDNodes in accessors Change accessors to downcast to `MDLocalVariable` and `MDExpression`, now that we have -verify checks in place to confirm that it's safe. llvm-svn: 232299 --- llvm/include/llvm/IR/IntrinsicInst.h | 16 ++++++++++++---- llvm/include/llvm/IR/Metadata.h | 10 ++++++++++ llvm/lib/IR/Verifier.cpp | 4 ++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/llvm/include/llvm/IR/IntrinsicInst.h b/llvm/include/llvm/IR/IntrinsicInst.h index 72ab46d..bf0adc3 100644 --- a/llvm/include/llvm/IR/IntrinsicInst.h +++ b/llvm/include/llvm/IR/IntrinsicInst.h @@ -82,8 +82,12 @@ namespace llvm { class DbgDeclareInst : public DbgInfoIntrinsic { public: Value *getAddress() const; - MDNode *getVariable() const { return cast(getRawVariable()); } - MDNode *getExpression() const { return cast(getRawExpression()); } + MDLocalVariable *getVariable() const { + return cast(getRawVariable()); + } + MDExpression *getExpression() const { + return cast(getRawExpression()); + } Metadata *getRawVariable() const { return cast(getArgOperand(1))->getMetadata(); @@ -111,8 +115,12 @@ namespace llvm { return cast( const_cast(getArgOperand(1)))->getZExtValue(); } - MDNode *getVariable() const { return cast(getRawVariable()); } - MDNode *getExpression() const { return cast(getRawExpression()); } + MDLocalVariable *getVariable() const { + return cast(getRawVariable()); + } + MDExpression *getExpression() const { + return cast(getRawExpression()); + } Metadata *getRawVariable() const { return cast(getArgOperand(2))->getMetadata(); diff --git a/llvm/include/llvm/IR/Metadata.h b/llvm/include/llvm/IR/Metadata.h index c01cc7c..6ba0fd4 100644 --- a/llvm/include/llvm/IR/Metadata.h +++ b/llvm/include/llvm/IR/Metadata.h @@ -128,6 +128,16 @@ public: #define HANDLE_METADATA(CLASS) class CLASS; #include "llvm/IR/Metadata.def" +// Provide specializations of isa so that we don't need definitions of +// subclasses to see if the metadata is a subclass. +#define HANDLE_METADATA_LEAF(CLASS) \ + template <> struct isa_impl { \ + static inline bool doit(const Metadata &MD) { \ + return MD.getMetadataID() == Metadata::CLASS##Kind; \ + } \ + }; +#include "llvm/IR/Metadata.def" + inline raw_ostream &operator<<(raw_ostream &OS, const Metadata &MD) { MD.print(OS); return OS; diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index f007106..084bfb8 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -3032,8 +3032,8 @@ void Verifier::visitDbgIntrinsic(StringRef Kind, DbgIntrinsicTy &DII) { DII.getRawExpression()); // Don't call visitMDNode(), since that will recurse through operands. - visitMDLocalVariable(*cast(DII.getVariable())); - visitMDExpression(*cast(DII.getExpression())); + visitMDLocalVariable(*DII.getVariable()); + visitMDExpression(*DII.getExpression()); } void DebugInfoVerifier::verifyDebugInfo() { -- 2.7.4