10a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//===-- llvm/Metadata.h - Metadata definitions ------------------*- C++ -*-===//
2cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky//
3cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky//                     The LLVM Compiler Infrastructure
4cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky//
5cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky// This file is distributed under the University of Illinois Open Source
6cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky// License. See LICENSE.TXT for details.
7cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky//
8cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky//===----------------------------------------------------------------------===//
9cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky//
10cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky/// @file
110a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel/// This file contains the declarations for metadata subclasses.
120a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel/// They represent the different flavors of metadata that live in LLVM.
13cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky//
14cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky//===----------------------------------------------------------------------===//
15cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky
16174101e13a6f24f6f2737e043194f0ffae925bb3Benjamin Kramer#ifndef LLVM_METADATA_H
17174101e13a6f24f6f2737e043194f0ffae925bb3Benjamin Kramer#define LLVM_METADATA_H
18cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky
1949708ad993529611cedfbe49ae44bb10beb73abeDevang Patel#include "llvm/Value.h"
20566bd12e54247b96823112e945e67ed7b9b7dce0Devang Patel#include "llvm/ADT/ArrayRef.h"
215f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel#include "llvm/ADT/FoldingSet.h"
2228bc9d88260a3e153ead4311c9129e3d3ad07736Devang Patel#include "llvm/ADT/ilist_node.h"
23cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky
24cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewyckynamespace llvm {
25c7364243e31773b78c98b631258a56c868526395Devang Patelclass Constant;
26937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patelclass Instruction;
2712ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerclass LLVMContext;
285e9cd434234a36089daeee915f1dc02b96947fbaChris Lattnerclass Module;
29fc252dae10e339d423e162616a9cb75238afaca5Chris Lattnertemplate <typename T> class SmallVectorImpl;
305d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattnertemplate<typename ValueSubClass, typename ItemParentClass>
315d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  class SymbolTableListTraits;
325d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner
335d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner
34cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky//===----------------------------------------------------------------------===//
35e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel/// MDString - a single uniqued string.
36e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel/// These are used to efficiently contain a byte sequence for metadata.
3711772e093f159a37d92fe5855faa89ad70b1639dChad Rosier/// MDString is always unnamed.
38bc5201f8371f9041e79efcca3b158335da5c2604Devang Patelclass MDString : public Value {
39e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel  MDString(const MDString &);            // DO NOT IMPLEMENT
40e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel
414771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  StringRef Str;
425e9cd434234a36089daeee915f1dc02b96947fbaChris Lattner  explicit MDString(LLVMContext &C, StringRef S);
43e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel
446b0c2173a348ec7349bee2185f1ad16d9f07040cDevang Patelpublic:
4549b63a1f2c493f6452d22cf0df4c147e0539fb2eDevang Patel  static MDString *get(LLVMContext &Context, StringRef Str);
4648ee0bbb729ae5b4757c74d029b9f5ce602f530aBenjamin Kramer  static MDString *get(LLVMContext &Context, const char *Str) {
4748ee0bbb729ae5b4757c74d029b9f5ce602f530aBenjamin Kramer    return get(Context, Str ? StringRef(Str) : StringRef());
4848ee0bbb729ae5b4757c74d029b9f5ce602f530aBenjamin Kramer  }
4948ee0bbb729ae5b4757c74d029b9f5ce602f530aBenjamin Kramer
5003d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar  StringRef getString() const { return Str; }
5103d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar
529111c4fef5a963f6d091e0a2401346fc98b521daEvan Cheng  unsigned getLength() const { return (unsigned)Str.size(); }
53e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel
54b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  typedef StringRef::iterator iterator;
55b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner
56e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel  /// begin() - Pointer to the first byte of the string.
57e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel  ///
58b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  iterator begin() const { return Str.begin(); }
59e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel
60e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel  /// end() - Pointer to one byte past the end of the string.
61e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel  ///
62b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  iterator end() const { return Str.end(); }
63e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel
64e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel  /// Methods for support type inquiry through isa, cast, and dyn_cast:
65e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel  static inline bool classof(const MDString *) { return true; }
66e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel  static bool classof(const Value *V) {
67e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel    return V->getValueID() == MDStringVal;
68e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel  }
69e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel};
70e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel
71c5e08a963973f43c10869cd249c0718d307dd031Chris Lattner
725d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattnerclass MDNodeOperand;
73c5e08a963973f43c10869cd249c0718d307dd031Chris Lattner
74e54abc90fe9942ef3902040a7ac475ce0c369dc9Devang Patel//===----------------------------------------------------------------------===//
75cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky/// MDNode - a tuple of other values.
76bc5201f8371f9041e79efcca3b158335da5c2604Devang Patelclass MDNode : public Value, public FoldingSetNode {
774771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  MDNode(const MDNode &);                // DO NOT IMPLEMENT
78b241b370313588837f9960b3ec3de4dcfb8aee4eChris Lattner  void operator=(const MDNode &);        // DO NOT IMPLEMENT
795d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  friend class MDNodeOperand;
8006fdaccc89d9abdc7e03797b25173791a2f5692fDevang Patel  friend class LLVMContextImpl;
81b241b370313588837f9960b3ec3de4dcfb8aee4eChris Lattner
825d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  /// NumOperands - This many 'MDNodeOperand' items are co-allocated onto the
83b76359e36e75dfe16c5153c3cac903efbb2cd8d7Chris Lattner  /// end of this MDNode.
84b241b370313588837f9960b3ec3de4dcfb8aee4eChris Lattner  unsigned NumOperands;
855d3016215075c52766711e741ce5401ee891d4acVictor Hernandez
86b241b370313588837f9960b3ec3de4dcfb8aee4eChris Lattner  // Subclass data enums.
87b241b370313588837f9960b3ec3de4dcfb8aee4eChris Lattner  enum {
8854a1f9f9c1e2cf6f4541e998b20f5c7cfbe642d9Chris Lattner    /// FunctionLocalBit - This bit is set if this MDNode is function local.
8954a1f9f9c1e2cf6f4541e998b20f5c7cfbe642d9Chris Lattner    /// This is true when it (potentially transitively) contains a reference to
9054a1f9f9c1e2cf6f4541e998b20f5c7cfbe642d9Chris Lattner    /// something in a function, like an argument, basicblock, or instruction.
9154a1f9f9c1e2cf6f4541e998b20f5c7cfbe642d9Chris Lattner    FunctionLocalBit = 1 << 0,
9254a1f9f9c1e2cf6f4541e998b20f5c7cfbe642d9Chris Lattner
9354a1f9f9c1e2cf6f4541e998b20f5c7cfbe642d9Chris Lattner    /// NotUniquedBit - This is set on MDNodes that are not uniqued because they
94e57f048b916af70c59ab6836494d77a1bbb769d1Duncan Sands    /// have a null operand.
95b76359e36e75dfe16c5153c3cac903efbb2cd8d7Chris Lattner    NotUniquedBit    = 1 << 1,
96b76359e36e75dfe16c5153c3cac903efbb2cd8d7Chris Lattner
97b76359e36e75dfe16c5153c3cac903efbb2cd8d7Chris Lattner    /// DestroyFlag - This bit is set by destroy() so the destructor can assert
98b76359e36e75dfe16c5153c3cac903efbb2cd8d7Chris Lattner    /// that the node isn't being destroyed with a plain 'delete'.
99b76359e36e75dfe16c5153c3cac903efbb2cd8d7Chris Lattner    DestroyFlag      = 1 << 2
100b241b370313588837f9960b3ec3de4dcfb8aee4eChris Lattner  };
1015d3016215075c52766711e741ce5401ee891d4acVictor Hernandez
10224e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez  // FunctionLocal enums.
10324e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez  enum FunctionLocalness {
10424e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez    FL_Unknown = -1,
10524e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez    FL_No = 0,
10624e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez    FL_Yes = 1
10724e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez  };
10824e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez
1090ce7b1255c86dcfdfdd4dfad9ea625de12657944Devang Patel  /// replaceOperand - Replace each instance of F from the operand list of this
1100ce7b1255c86dcfdfdd4dfad9ea625de12657944Devang Patel  /// node with T.
1115d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  void replaceOperand(MDNodeOperand *Op, Value *NewVal);
112b76359e36e75dfe16c5153c3cac903efbb2cd8d7Chris Lattner  ~MDNode();
1135f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
114ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad  MDNode(LLVMContext &C, ArrayRef<Value*> Vals, bool isFunctionLocal);
11524e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez
116ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad  static MDNode *getMDNode(LLVMContext &C, ArrayRef<Value*> Vals,
117e685f230b6f4f7cd65f45e07cbbbcaa4d66a1ceaVictor Hernandez                           FunctionLocalness FL, bool Insert = true);
118cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewyckypublic:
1194771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  // Constructors and destructors.
120ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad  static MDNode *get(LLVMContext &Context, ArrayRef<Value*> Vals);
12124e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez  // getWhenValsUnresolved - Construct MDNode determining function-localness
12224e64df7ec25b55aa872c2ef33728dfbb8c353c4Victor Hernandez  // from isFunctionLocal argument, not by analyzing Vals.
123ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad  static MDNode *getWhenValsUnresolved(LLVMContext &Context,
124ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad                                       ArrayRef<Value*> Vals,
125ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad                                       bool isFunctionLocal);
126e685f230b6f4f7cd65f45e07cbbbcaa4d66a1ceaVictor Hernandez
127ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad  static MDNode *getIfExists(LLVMContext &Context, ArrayRef<Value*> Vals);
128489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman
129489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman  /// getTemporary - Return a temporary MDNode, for use in constructing
130489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman  /// cyclic MDNode structures. A temporary MDNode is not uniqued,
131489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman  /// may be RAUW'd, and must be manually deleted with deleteTemporary.
132ec9186bcf975c9ffa3ec7ca97867f0ec6eb55115Jay Foad  static MDNode *getTemporary(LLVMContext &Context, ArrayRef<Value*> Vals);
133489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman
134489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman  /// deleteTemporary - Deallocate a node created by getTemporary. The
135489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman  /// node must not have any users.
136489b29b0a4ee4526e3d50ad88d3d48745baf5042Dan Gohman  static void deleteTemporary(MDNode *N);
1374771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel
1385d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  /// getOperand - Return specified operand.
1395d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  Value *getOperand(unsigned i) const;
140c5e08a963973f43c10869cd249c0718d307dd031Chris Lattner
1415d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  /// getNumOperands - Return number of MDNode operands.
1425d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  unsigned getNumOperands() const { return NumOperands; }
14357c0f206011ce3dff01075c0b38a8c55c19c7fc9Victor Hernandez
14457c0f206011ce3dff01075c0b38a8c55c19c7fc9Victor Hernandez  /// isFunctionLocal - Return whether MDNode is local to a function.
145cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner  bool isFunctionLocal() const {
146cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner    return (getSubclassDataFromValue() & FunctionLocalBit) != 0;
147cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner  }
148c7650b4d1907becbf2ed112074fd2c4a6f174aa8Victor Hernandez
149c7650b4d1907becbf2ed112074fd2c4a6f174aa8Victor Hernandez  // getFunction - If this metadata is function-local and recursively has a
150c7650b4d1907becbf2ed112074fd2c4a6f174aa8Victor Hernandez  // function-local operand, return the first such operand's parent function.
1516cead7879aa8902905809e3853d31093a5511c2fVictor Hernandez  // Otherwise, return null. getFunction() should not be used for performance-
1526cead7879aa8902905809e3853d31093a5511c2fVictor Hernandez  // critical code because it recursively visits all the MDNode's operands.
1538fffff537194e2375e65600f27d716c99f0eb38aVictor Hernandez  const Function *getFunction() const;
1545d3016215075c52766711e741ce5401ee891d4acVictor Hernandez
1555f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  /// Profile - calculate a unique identifier for this MDNode to collapse
1565f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  /// duplicates
1575f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  void Profile(FoldingSetNodeID &ID) const;
1585f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
159cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky  /// Methods for support type inquiry through isa, cast, and dyn_cast:
160cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky  static inline bool classof(const MDNode *) { return true; }
161cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky  static bool classof(const Value *V) {
162cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky    return V->getValueID() == MDNodeVal;
163cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky  }
164cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattnerprivate:
165872814ae048df032bddf9299c850f5bda08299a9Dan Gohman  // destroy - Delete this node.  Only when there are no uses.
166872814ae048df032bddf9299c850f5bda08299a9Dan Gohman  void destroy();
167872814ae048df032bddf9299c850f5bda08299a9Dan Gohman
16854a1f9f9c1e2cf6f4541e998b20f5c7cfbe642d9Chris Lattner  bool isNotUniqued() const {
16954a1f9f9c1e2cf6f4541e998b20f5c7cfbe642d9Chris Lattner    return (getSubclassDataFromValue() & NotUniquedBit) != 0;
17054a1f9f9c1e2cf6f4541e998b20f5c7cfbe642d9Chris Lattner  }
1716f555ca2cd0bba50542adcbb131f541ae70d34cdJeffrey Yasskin  void setIsNotUniqued();
17254a1f9f9c1e2cf6f4541e998b20f5c7cfbe642d9Chris Lattner
173cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner  // Shadow Value::setValueSubclassData with a private forwarding method so that
174cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner  // any future subclasses cannot accidentally use it.
175cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner  void setValueSubclassData(unsigned short D) {
176cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner    Value::setValueSubclassData(D);
177cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner  }
178cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky};
179cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky
180f457d1316dec017cf204b54524878310c356bf64Devang Patel//===----------------------------------------------------------------------===//
181c85829617bae7f0520c92c5819a5ca8ad520b4f1Dan Gohman/// NamedMDNode - a tuple of MDNodes. Despite its name, a NamedMDNode isn't
182c85829617bae7f0520c92c5819a5ca8ad520b4f1Dan Gohman/// itself an MDNode. NamedMDNodes belong to modules, have names, and contain
183c85829617bae7f0520c92c5819a5ca8ad520b4f1Dan Gohman/// lists of MDNodes.
18417aa92c92a925b4a674440c7ef088c223990e854Dan Gohmanclass NamedMDNode : public ilist_node<NamedMDNode> {
18528bc9d88260a3e153ead4311c9129e3d3ad07736Devang Patel  friend class SymbolTableListTraits<NamedMDNode, Module>;
186acb4722856a49217e7aa86f6909d51531d3f42ccChris Lattner  friend struct ilist_traits<NamedMDNode>;
18712ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramer  friend class LLVMContextImpl;
18817aa92c92a925b4a674440c7ef088c223990e854Dan Gohman  friend class Module;
1894771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  NamedMDNode(const NamedMDNode &);      // DO NOT IMPLEMENT
1904771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel
1910386f01e061513094504bc11f8352a40173cada7Devang Patel  std::string Name;
192f457d1316dec017cf204b54524878310c356bf64Devang Patel  Module *Parent;
193d9c86dc6d95885f0c88f8068a06eab87da328490Dan Gohman  void *Operands; // SmallVector<TrackingVH<MDNode>, 4>
194f457d1316dec017cf204b54524878310c356bf64Devang Patel
195b5df28a151421fcce53547763ae9772461d5bbdbDevang Patel  void setParent(Module *M) { Parent = M; }
196f457d1316dec017cf204b54524878310c356bf64Devang Patel
19717aa92c92a925b4a674440c7ef088c223990e854Dan Gohman  explicit NamedMDNode(const Twine &N);
198ab67e705f59d567afded845465f358b8a66ab62eDevang Patel
19917aa92c92a925b4a674440c7ef088c223990e854Dan Gohmanpublic:
200a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel  /// eraseFromParent - Drop all references and remove the node from parent
201a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel  /// module.
202a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel  void eraseFromParent();
203a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel
204a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel  /// dropAllReferences - Remove all uses and clear node vector.
205a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel  void dropAllReferences();
206a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel
2074771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  /// ~NamedMDNode - Destroy NamedMDNode.
208a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel  ~NamedMDNode();
209a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel
210f457d1316dec017cf204b54524878310c356bf64Devang Patel  /// getParent - Get the module that holds this named metadata collection.
211f457d1316dec017cf204b54524878310c356bf64Devang Patel  inline Module *getParent() { return Parent; }
212f457d1316dec017cf204b54524878310c356bf64Devang Patel  inline const Module *getParent() const { return Parent; }
213f457d1316dec017cf204b54524878310c356bf64Devang Patel
2145d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  /// getOperand - Return specified operand.
2153e30c2a3c54c50246e6cccf0c8842619e29fe66cDevang Patel  MDNode *getOperand(unsigned i) const;
21657109697282c6dffd04e2e275606352914217114Chris Lattner
2175d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  /// getNumOperands - Return the number of NamedMDNode operands.
2185d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  unsigned getNumOperands() const;
219f457d1316dec017cf204b54524878310c356bf64Devang Patel
2205d0cacdbb6577f2449986f345858db17dc1bcf59Chris Lattner  /// addOperand - Add metadata operand.
2213e30c2a3c54c50246e6cccf0c8842619e29fe66cDevang Patel  void addOperand(MDNode *M);
2220386f01e061513094504bc11f8352a40173cada7Devang Patel
2230386f01e061513094504bc11f8352a40173cada7Devang Patel  /// getName - Return a constant reference to this named metadata's name.
2240386f01e061513094504bc11f8352a40173cada7Devang Patel  StringRef getName() const;
2250386f01e061513094504bc11f8352a40173cada7Devang Patel
22617aa92c92a925b4a674440c7ef088c223990e854Dan Gohman  /// print - Implement operator<< on NamedMDNode.
22717aa92c92a925b4a674440c7ef088c223990e854Dan Gohman  void print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW = 0) const;
228f457d1316dec017cf204b54524878310c356bf64Devang Patel};
229f457d1316dec017cf204b54524878310c356bf64Devang Patel
230cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky} // end llvm namespace
231cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky
232cb33799b9f4e152e3460faa83e59b53ff604c87dNick Lewycky#endif
233