-//===-- llvm/Metadata.h - Constant class subclass definitions ---*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-/// @file
-/// This file contains the declarations for the subclasses of Constant,
-/// which represent the different flavors of constant values that live in LLVM.
-/// Note that Constants are immutable (once created they never change) and are
-/// fully shared by structural equivalence. This means that two structurally
-/// equivalent constants will always have the same address. Constant's are
-/// created on demand as needed and never deleted: thus clients don't have to
-/// worry about the lifetime of the objects.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_MDNODE_H
-#define LLVM_MDNODE_H
-
-#include "llvm/Constant.h"
-#include "llvm/Type.h"
-#include "llvm/ADT/FoldingSet.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/ValueHandle.h"
-
-namespace llvm {
-
-//===----------------------------------------------------------------------===//
-// MetadataBase - A base class for MDNode and MDString.
-class MetadataBase : public Value {
-protected:
- MetadataBase(const Type *Ty, unsigned scid)
- : Value(Ty, scid) {}
-
-public:
- /// getType() specialization - Type is always MetadataTy.
- ///
- inline const Type *getType() const {
- return Type::MetadataTy;
- }
-
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue. This always returns false because getNullValue will never
- /// produce metadata.
- virtual bool isNullValue() const {
- return false;
- }
-
- /// Methods for support type inquiry through isa, cast, and dyn_cast:
- static inline bool classof(const MDString *) { return true; }
- static bool classof(const Value *V) {
- return V->getValueID() == MDStringVal || V->getValueID() == MDNodeVal;
- }
-};
-
-//===----------------------------------------------------------------------===//
-/// MDString - a single uniqued string.
-/// These are used to efficiently contain a byte sequence for metadata.
-///
-class MDString : public MetadataBase {
- MDString(const MDString &); // DO NOT IMPLEMENT
- StringRef Str;
- friend class LLVMContextImpl;
-
-protected:
- explicit MDString(const char *begin, unsigned l)
- : MetadataBase(Type::MetadataTy, Value::MDStringVal), Str(begin, l) {}
-
-public:
- StringRef getString() const { return Str; }
-
- unsigned length() const { return Str.size(); }
-
- /// begin() - Pointer to the first byte of the string.
- ///
- const char *begin() const { return Str.begin(); }
-
- /// end() - Pointer to one byte past the end of the string.
- ///
- const char *end() const { return Str.end(); }
-
- /// Methods for support type inquiry through isa, cast, and dyn_cast:
- static inline bool classof(const MDString *) { return true; }
- static bool classof(const Value *V) {
- return V->getValueID() == MDStringVal;
- }
-};
-
-//===----------------------------------------------------------------------===//
-/// MDNode - a tuple of other values.
-/// These contain a list of the values that represent the metadata.
-///
-class MDNode : public MetadataBase, public FoldingSetNode {
- MDNode(const MDNode &); // DO NOT IMPLEMENT
-
- friend class LLVMContextImpl;
-
- void replaceElement(Value *From, Value *To);
-
- SmallVector<WeakVH, 4> Node;
- typedef SmallVectorImpl<WeakVH>::iterator elem_iterator;
-
-protected:
- explicit MDNode(Value*const* Vals, unsigned NumVals);
-public:
- typedef SmallVectorImpl<WeakVH>::const_iterator const_elem_iterator;
-
- Value *getElement(unsigned i) const {
- return Node[i];
- }
-
- unsigned getNumElements() const {
- return Node.size();
- }
-
- bool elem_empty() const {
- return Node.empty();
- }
-
- const_elem_iterator elem_begin() const {
- return Node.begin();
- }
-
- const_elem_iterator elem_end() const {
- return Node.end();
- }
-
- /// getType() specialization - Type is always MetadataTy.
- ///
- inline const Type *getType() const {
- return Type::MetadataTy;
- }
-
- /// isNullValue - Return true if this is the value that would be returned by
- /// getNullValue. This always returns false because getNullValue will never
- /// produce metadata.
- virtual bool isNullValue() const {
- return false;
- }
-
- /// Profile - calculate a unique identifier for this MDNode to collapse
- /// duplicates
- void Profile(FoldingSetNodeID &ID) const;
-
- virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U) {
- llvm_unreachable("This should never be called because MDNodes have no ops");
- }
-
- /// Methods for support type inquiry through isa, cast, and dyn_cast:
- static inline bool classof(const MDNode *) { return true; }
- static bool classof(const Value *V) {
- return V->getValueID() == MDNodeVal;
- }
-};
-
-} // end llvm namespace
-
-#endif