From b89064f540392776ad55b4bd7572f9a2f6702c1b Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Thu, 13 Nov 2014 13:17:47 +0000 Subject: [PATCH] IR: Create the Metadata class This will become the root of a new class hierarchy separate from `Value`. As a first step, stick it between `Value` and `MDNode`. This is part of PR21532. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221886 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/Metadata.h | 23 +++++++++++++++++++++-- lib/IR/Metadata.cpp | 4 ++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/include/llvm/IR/Metadata.h b/include/llvm/IR/Metadata.h index 9d3950f9063..a4e9f532980 100644 --- a/include/llvm/IR/Metadata.h +++ b/include/llvm/IR/Metadata.h @@ -34,11 +34,28 @@ enum LLVMConstants : uint32_t { DEBUG_METADATA_VERSION = 2 // Current debug info version number. }; +/// \brief Root of the metadata hierarchy. +/// +/// This is a root class for typeless data in the IR. +/// +/// TODO: Detach from the Value hierarchy. +class Metadata : public Value { +protected: + Metadata(Type *Type, unsigned ID) : Value(Type, ID) {} + +public: + static bool classof(const Value *V) { + return V->getValueID() == MDNodeVal; + } +}; + //===----------------------------------------------------------------------===// /// \brief A single uniqued string. /// /// These are used to efficiently contain a byte sequence for metadata. /// MDString is always unnamed. +/// +/// TODO: Inherit from Metadata. class MDString : public Value { virtual void anchor(); MDString(const MDString &) LLVM_DELETED_FUNCTION; @@ -115,8 +132,8 @@ struct DenseMapInfo { class MDNodeOperand; //===----------------------------------------------------------------------===// -/// \brief A tuple of other values. -class MDNode : public Value, public FoldingSetNode { +/// \brief Generic tuple of metadata. +class MDNode : public Metadata, public FoldingSetNode { MDNode(const MDNode &) LLVM_DELETED_FUNCTION; void operator=(const MDNode &) LLVM_DELETED_FUNCTION; friend class MDNodeOperand; @@ -241,6 +258,8 @@ private: /// /// Despite its name, a NamedMDNode isn't itself an MDNode. NamedMDNodes belong /// to modules, have names, and contain lists of MDNodes. +/// +/// TODO: Inherit from Metadata. class NamedMDNode : public ilist_node { friend class SymbolTableListTraits; friend struct ilist_traits; diff --git a/lib/IR/Metadata.cpp b/lib/IR/Metadata.cpp index 1fb15a075a6..8d616cfb0d6 100644 --- a/lib/IR/Metadata.cpp +++ b/lib/IR/Metadata.cpp @@ -109,8 +109,8 @@ void MDNode::replaceOperandWith(unsigned i, Value *Val) { replaceOperand(Op, Val); } -MDNode::MDNode(LLVMContext &C, ArrayRef Vals, bool isFunctionLocal) -: Value(Type::getMetadataTy(C), Value::MDNodeVal) { +MDNode::MDNode(LLVMContext &C, ArrayRef Vals, bool isFunctionLocal) + : Metadata(Type::getMetadataTy(C), Value::MDNodeVal) { NumOperands = Vals.size(); if (isFunctionLocal)