diff --git a/llvm/include/llvm/IR/Metadata.h b/llvm/include/llvm/IR/Metadata.h index e0363af57a78..6b202d88a96c 100644 --- a/llvm/include/llvm/IR/Metadata.h +++ b/llvm/include/llvm/IR/Metadata.h @@ -604,25 +604,15 @@ protected: void dropAllReferences(); - static MDNode *getMDNode(LLVMContext &C, ArrayRef MDs, - bool Insert = true); - MDOperand *mutable_begin() { return mutable_end() - NumOperands; } MDOperand *mutable_end() { return reinterpret_cast(this); } public: - static MDNode *get(LLVMContext &Context, ArrayRef MDs) { - return getMDNode(Context, MDs, true); - } - - static MDNode *getIfExists(LLVMContext &Context, ArrayRef MDs) { - return getMDNode(Context, MDs, false); - } - - /// \brief Return a distinct node. - /// - /// Return a distinct node -- i.e., a node that is not uniqued. - static MDNode *getDistinct(LLVMContext &Context, ArrayRef MDs); + static inline MDNode *get(LLVMContext &Context, ArrayRef MDs); + static inline MDNode *getIfExists(LLVMContext &Context, + ArrayRef MDs); + static inline MDNode *getDistinct(LLVMContext &Context, + ArrayRef MDs); /// \brief Return a temporary MDNode /// @@ -774,7 +764,6 @@ private: class MDTuple : public UniquableMDNode { friend class LLVMContextImpl; friend class UniquableMDNode; - friend class MDNode; MDTuple(LLVMContext &C, ArrayRef Vals, bool AllowRAUW) : UniquableMDNode(C, MDTupleKind, Vals, AllowRAUW) {} @@ -783,15 +772,40 @@ class MDTuple : public UniquableMDNode { void setHash(unsigned Hash) { MDNodeSubclassData = Hash; } void recalculateHash(); + static MDTuple *getImpl(LLVMContext &Context, ArrayRef MDs, + bool ShouldCreate); + public: /// \brief Get the hash, if any. unsigned getHash() const { return MDNodeSubclassData; } + static MDTuple *get(LLVMContext &Context, ArrayRef MDs) { + return getImpl(Context, MDs, /* ShouldCreate */ true); + } + static MDTuple *getIfExists(LLVMContext &Context, ArrayRef MDs) { + return getImpl(Context, MDs, /* ShouldCreate */ false); + } + + /// \brief Return a distinct node. + /// + /// Return a distinct node -- i.e., a node that is not uniqued. + static MDTuple *getDistinct(LLVMContext &Context, ArrayRef MDs); + static bool classof(const Metadata *MD) { return MD->getMetadataID() == MDTupleKind; } }; +MDNode *MDNode::get(LLVMContext &Context, ArrayRef MDs) { + return MDTuple::get(Context, MDs); +} +MDNode *MDNode::getIfExists(LLVMContext &Context, ArrayRef MDs) { + return MDTuple::getIfExists(Context, MDs); +} +MDNode *MDNode::getDistinct(LLVMContext &Context, ArrayRef MDs) { + return MDTuple::getDistinct(Context, MDs); +} + /// \brief Forward declaration of metadata. /// /// Forward declaration of metadata, in the form of a basic tuple. Unlike \a diff --git a/llvm/lib/IR/Metadata.cpp b/llvm/lib/IR/Metadata.cpp index 8ff467357577..3d444660c67c 100644 --- a/llvm/lib/IR/Metadata.cpp +++ b/llvm/lib/IR/Metadata.cpp @@ -581,15 +581,15 @@ void UniquableMDNode::handleChangedOperand(void *Ref, Metadata *New) { storeDistinctInContext(); } -MDNode *MDNode::getMDNode(LLVMContext &Context, ArrayRef MDs, - bool Insert) { - auto &Store = Context.pImpl->MDTuples; - +MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef MDs, + bool ShouldCreate) { MDTupleInfo::KeyTy Key(MDs); + + auto &Store = Context.pImpl->MDTuples; auto I = Store.find_as(Key); if (I != Store.end()) return *I; - if (!Insert) + if (!ShouldCreate) return nullptr; // Coallocate space for the node and Operands together, then placement new. @@ -599,7 +599,7 @@ MDNode *MDNode::getMDNode(LLVMContext &Context, ArrayRef MDs, return N; } -MDNode *MDNode::getDistinct(LLVMContext &Context, ArrayRef MDs) { +MDTuple *MDTuple::getDistinct(LLVMContext &Context, ArrayRef MDs) { auto *N = new (MDs.size()) MDTuple(Context, MDs, /* AllowRAUW */ false); N->storeDistinctInContext(); return N;