IR: Create the Metadata class
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Thu, 13 Nov 2014 13:17:47 +0000 (13:17 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Thu, 13 Nov 2014 13:17:47 +0000 (13:17 +0000)
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
lib/IR/Metadata.cpp

index 9d3950f90633243d54c422811f35c6c65def8c97..a4e9f5329809c4f57135bc29d56646aa558fd247 100644 (file)
@@ -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<AAMDNodes> {
 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<NamedMDNode> {
   friend class SymbolTableListTraits<NamedMDNode, Module>;
   friend struct ilist_traits<NamedMDNode>;
index 1fb15a075a617d632bab53955d31a3a01aa58dcb..8d616cfb0d6541c6b7efa94790e2ca52381963eb 100644 (file)
@@ -109,8 +109,8 @@ void MDNode::replaceOperandWith(unsigned i, Value *Val) {
   replaceOperand(Op, Val);
 }
 
-MDNode::MDNode(LLVMContext &C, ArrayRef<Value*> Vals, bool isFunctionLocal)
-: Value(Type::getMetadataTy(C), Value::MDNodeVal) {
+MDNode::MDNode(LLVMContext &C, ArrayRef<Value *> Vals, bool isFunctionLocal)
+    : Metadata(Type::getMetadataTy(C), Value::MDNodeVal) {
   NumOperands = Vals.size();
 
   if (isFunctionLocal)