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
This commit is contained in:
Duncan P. N. Exon Smith 2014-11-13 13:17:47 +00:00
parent 18e1185ddf
commit b89064f540
2 changed files with 23 additions and 4 deletions

View 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>;

View 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)