- // Element access
- typedef SmallVectorImpl<WeakVH>::const_iterator const_elem_iterator;
- typedef SmallVectorImpl<WeakVH>::iterator elem_iterator;
- /// elem_empty - Return true if MDNode is empty.
- 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(); }
- elem_iterator elem_begin() { return Node.begin(); }
- elem_iterator elem_end() { return Node.end(); }
-
- /// 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;
+ 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);
+public:
+ // Constructors and destructors.
+ static MDNode *get(LLVMContext &Context, ArrayRef<Value*> V);
+ // FIXME: Eliminate this constructor form.
+ static MDNode *get(LLVMContext &Context, Value *const *Vals,
+ unsigned NumVals);
+ // getWhenValsUnresolved - Construct MDNode determining function-localness
+ // from isFunctionLocal argument, not by analyzing Vals.
+ static MDNode *getWhenValsUnresolved(LLVMContext &Context, Value *const *Vals,
+ unsigned NumVals, bool isFunctionLocal);
+
+ 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;
+
+ /// getNumOperands - Return number of MDNode operands.
+ unsigned getNumOperands() const { return NumOperands; }
+
+ /// isFunctionLocal - Return whether MDNode is local to a function.
+ bool isFunctionLocal() const {
+ return (getSubclassDataFromValue() & FunctionLocalBit) != 0;