diff options
Diffstat (limited to 'include/llvm/Metadata.h')
-rw-r--r-- | include/llvm/Metadata.h | 54 |
1 files changed, 25 insertions, 29 deletions
diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index 64ab6b7583ed..f5a80a3dced2 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -38,7 +38,6 @@ class MDString : public Value { MDString(const MDString &); // DO NOT IMPLEMENT StringRef Str; -protected: explicit MDString(LLVMContext &C, StringRef S); public: @@ -111,9 +110,8 @@ class MDNode : public Value, public FoldingSetNode { void replaceOperand(MDNodeOperand *Op, Value *NewVal); ~MDNode(); -protected: - explicit MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals, - bool isFunctionLocal); + MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals, + bool isFunctionLocal); static MDNode *getMDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals, FunctionLocalness FL, bool Insert = true); @@ -128,6 +126,16 @@ public: static MDNode *getIfExists(LLVMContext &Context, Value *const *Vals, unsigned NumVals); + + /// getTemporary - Return a temporary MDNode, for use in constructing + /// cyclic MDNode structures. A temporary MDNode is not uniqued, + /// may be RAUW'd, and must be manually deleted with deleteTemporary. + static MDNode *getTemporary(LLVMContext &Context, Value *const *Vals, + unsigned NumVals); + + /// deleteTemporary - Deallocate a node created by getTemporary. The + /// node must not have any users. + static void deleteTemporary(MDNode *N); /// getOperand - Return specified operand. Value *getOperand(unsigned i) const; @@ -149,9 +157,6 @@ public: // critical code because it recursively visits all the MDNode's operands. const Function *getFunction() const; - // destroy - Delete this node. Only when there are no uses. - void destroy(); - /// Profile - calculate a unique identifier for this MDNode to collapse /// duplicates void Profile(FoldingSetNodeID &ID) const; @@ -162,6 +167,9 @@ public: return V->getValueID() == MDNodeVal; } private: + // destroy - Delete this node. Only when there are no uses. + void destroy(); + bool isNotUniqued() const { return (getSubclassDataFromValue() & NotUniquedBit) != 0; } @@ -175,31 +183,25 @@ private: }; //===----------------------------------------------------------------------===// -/// NamedMDNode - a tuple of MDNodes. -/// NamedMDNode is always named. All NamedMDNode operand has a type of metadata. -class NamedMDNode : public Value, public ilist_node<NamedMDNode> { +/// NamedMDNode - a tuple of MDNodes. Despite its name, a NamedMDNode isn't +/// itself an MDNode. NamedMDNodes belong to modules, have names, and contain +/// lists of MDNodes. +class NamedMDNode : public ilist_node<NamedMDNode> { friend class SymbolTableListTraits<NamedMDNode, Module>; friend struct ilist_traits<NamedMDNode>; friend class LLVMContextImpl; + friend class Module; NamedMDNode(const NamedMDNode &); // DO NOT IMPLEMENT std::string Name; Module *Parent; - void *Operands; // SmallVector<WeakVH<MDNode>, 4> + void *Operands; // SmallVector<TrackingVH<MDNode>, 4> void setParent(Module *M) { Parent = M; } -protected: - explicit NamedMDNode(LLVMContext &C, const Twine &N, MDNode*const *Vals, - unsigned NumVals, Module *M = 0); -public: - static NamedMDNode *Create(LLVMContext &C, const Twine &N, - MDNode *const *MDs, - unsigned NumMDs, Module *M = 0) { - return new NamedMDNode(C, N, MDs, NumMDs, M); - } - static NamedMDNode *Create(const NamedMDNode *NMD, Module *M = 0); + explicit NamedMDNode(const Twine &N); +public: /// eraseFromParent - Drop all references and remove the node from parent /// module. void eraseFromParent(); @@ -223,17 +225,11 @@ public: /// addOperand - Add metadata operand. void addOperand(MDNode *M); - /// setName - Set the name of this named metadata. - void setName(const Twine &NewName); - /// getName - Return a constant reference to this named metadata's name. StringRef getName() const; - /// Methods for support type inquiry through isa, cast, and dyn_cast: - static inline bool classof(const NamedMDNode *) { return true; } - static bool classof(const Value *V) { - return V->getValueID() == NamedMDNodeVal; - } + /// print - Implement operator<< on NamedMDNode. + void print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW = 0) const; }; } // end llvm namespace |