From 520ab696d0bc2096fbb62422364fae6e2807ca32 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Mon, 6 Apr 2015 19:48:50 +0000 Subject: [PATCH] DebugInfo: Add MDTypeRefArray, to replace DITypeArray This array-like wrapper adapts `MDTuple` to have elements of `MDTypeRef` (whereas `MDTypeArray` has elements of `MDType`). This is necessary to migrate code using `DITypeArray`. The only use of this is `MDSubroutineType`'s `getTypeArray()` accessor. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234200 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/DebugInfoMetadata.h | 38 ++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/include/llvm/IR/DebugInfoMetadata.h b/include/llvm/IR/DebugInfoMetadata.h index 4149bd42438..d162f957701 100644 --- a/include/llvm/IR/DebugInfoMetadata.h +++ b/include/llvm/IR/DebugInfoMetadata.h @@ -89,6 +89,42 @@ typedef TypedDebugNodeRef DebugNodeRef; typedef TypedDebugNodeRef MDScopeRef; typedef TypedDebugNodeRef MDTypeRef; +class MDTypeRefArray { + const MDTuple *N = nullptr; + +public: + MDTypeRefArray(const MDTuple *N) : N(N) {} + operator MDTuple *() const { return const_cast(N); } + MDTuple *operator->() const { return const_cast(N); } + MDTuple &operator*() const { return *const_cast(N); } + + unsigned size() const { return N->getNumOperands(); } + MDTypeRef operator[](unsigned I) const { return MDTypeRef(N->getOperand(I)); } + + class iterator : std::iterator { + MDNode::op_iterator I; + + public: + explicit iterator(MDNode::op_iterator I) : I(I) {} + MDTypeRef operator*() const { return MDTypeRef(*I); } + iterator &operator++() { + ++I; + return *this; + } + iterator operator++(int) { + iterator Temp(*this); + ++I; + return Temp; + } + bool operator==(const iterator &X) const { return I == X.I; } + bool operator!=(const iterator &X) const { return I != X.I; } + }; + + iterator begin() const { return iterator(N->op_begin()); } + iterator end() const { return iterator(N->op_end()); } +}; + /// \brief Tagged DWARF-like metadata node. /// /// A metadata node with a DWARF tag (i.e., a constant named \c DW_TAG_*, @@ -826,7 +862,7 @@ public: TempMDSubroutineType clone() const { return cloneImpl(); } - MDTuple *getTypeArray() const { return getElements(); } + MDTypeRefArray getTypeArray() const { return getElements(); } Metadata *getRawTypeArray() const { return getRawElements(); } static bool classof(const Metadata *MD) { -- 2.40.0