Metadata.cpp revision b2a33b46469a6d2c0e61122002079efb7d6d3f9c
10a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//===-- Metadata.cpp - Implement Metadata classes -------------------------===//
20a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//
30a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//                     The LLVM Compiler Infrastructure
40a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//
50a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// This file is distributed under the University of Illinois Open Source
60a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// License. See LICENSE.TXT for details.
70a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//
80a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//===----------------------------------------------------------------------===//
90a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//
100a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel// This file implements the Metadata classes.
110a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//
120a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//===----------------------------------------------------------------------===//
130a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel
14647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson#include "LLVMContextImpl.h"
150a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel#include "llvm/Metadata.h"
16647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson#include "llvm/LLVMContext.h"
17f457d1316dec017cf204b54524878310c356bf64Devang Patel#include "llvm/Module.h"
18937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel#include "llvm/Instruction.h"
1928bc9d88260a3e153ead4311c9129e3d3ad07736Devang Patel#include "SymbolTableListTraitsImpl.h"
200a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patelusing namespace llvm;
210a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel
220a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//===----------------------------------------------------------------------===//
23b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner// MetadataBase implementation.
244771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel//
254771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel
264771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel/// resizeOperands - Metadata keeps track of other metadata uses using
274771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel/// OperandList. Resize this list to hold anticipated number of metadata
284771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel/// operands.
294771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patelvoid MetadataBase::resizeOperands(unsigned NumOps) {
304771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  unsigned e = getNumOperands();
314771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  if (NumOps == 0) {
324771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel    NumOps = e*2;
334771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel    if (NumOps < 2) NumOps = 2;
344771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  } else if (NumOps > NumOperands) {
354771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel    // No resize needed.
364771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel    if (ReservedSpace >= NumOps) return;
374771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  } else if (NumOps == NumOperands) {
384771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel    if (ReservedSpace == NumOps) return;
394771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  } else {
404771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel    return;
414771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  }
424771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel
434771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  ReservedSpace = NumOps;
444771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  Use *OldOps = OperandList;
454771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  Use *NewOps = allocHungoffUses(NumOps);
464771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  std::copy(OldOps, OldOps + e, NewOps);
474771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  OperandList = NewOps;
484771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  if (OldOps) Use::zap(OldOps, OldOps + e, true);
494771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel}
504771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel//===----------------------------------------------------------------------===//
51b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner// MDString implementation.
52647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson//
53647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen AndersonMDString *MDString::get(LLVMContext &Context, const StringRef &Str) {
54647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson  LLVMContextImpl *pImpl = Context.pImpl;
55647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson  sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock);
56647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson  StringMapEntry<MDString *> &Entry =
57647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson    pImpl->MDStringCache.GetOrCreateValue(Str);
58647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson  MDString *&S = Entry.getValue();
59b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  if (S) return S;
60b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner
61b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  return S = new MDString(Context, Entry.getKeyData(), Entry.getKeyLength());
62647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson}
63647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson
64647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson//===----------------------------------------------------------------------===//
65b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner// MDNode implementation.
660a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel//
67b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris LattnerMDNode::MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals)
681d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  : MetadataBase(Type::getMetadataTy(C), Value::MDNodeVal) {
694771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  NumOperands = 0;
704771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  resizeOperands(NumVals);
714771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  for (unsigned i = 0; i != NumVals; ++i) {
724771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel    // Only record metadata uses.
734771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel    if (MetadataBase *MB = dyn_cast_or_null<MetadataBase>(Vals[i]))
744771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel      OperandList[NumOperands++] = MB;
7568f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel    else if(Vals[i] &&
7668f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel            Vals[i]->getType()->getTypeID() == Type::MetadataTyID)
7768f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel      OperandList[NumOperands++] = Vals[i];
785f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    Node.push_back(ElementVH(Vals[i], this));
794771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  }
800a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel}
810a9f7b9c3ebe7d0ec033462e1a7c9101279956f9Devang Patel
825f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patelvoid MDNode::Profile(FoldingSetNodeID &ID) const {
835f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  for (const_elem_iterator I = elem_begin(), E = elem_end(); I != E; ++I)
845f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    ID.AddPointer(*I);
855f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel}
865f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
87647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen AndersonMDNode *MDNode::get(LLVMContext &Context, Value*const* Vals, unsigned NumVals) {
885f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  LLVMContextImpl *pImpl = Context.pImpl;
895f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  FoldingSetNodeID ID;
905f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  for (unsigned i = 0; i != NumVals; ++i)
915f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    ID.AddPointer(Vals[i]);
925f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
935f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  void *InsertPoint;
94b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  MDNode *N;
95b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  {
96b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner    sys::SmartScopedReader<true> Reader(pImpl->ConstantsLock);
97b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner    N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint);
98b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  }
99b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  if (N) return N;
100740fce30206ad3e1759c71ae04af9a5859857af9Devang Patel
101b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock);
102b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint);
1035f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  if (!N) {
104b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner    // InsertPoint will have been set by the FindNodeOrInsertPos call.
105b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner    N = new MDNode(Context, Vals, NumVals);
106b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner    pImpl->MDNodeSet.InsertNode(N, InsertPoint);
1075f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  }
1085f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
1095f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  return N;
110647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson}
111647e3016de18d2fc8b0f233a0b356809e3fdcc54Owen Anderson
1124771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel/// dropAllReferences - Remove all uses and clear node vector.
1134771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patelvoid MDNode::dropAllReferences() {
1144771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  User::dropAllReferences();
1154771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  Node.clear();
1164771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel}
1174771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel
1184771e16fa96f41e62fc54578b6f656a52c23b61cDevang PatelMDNode::~MDNode() {
11988cfd964a3341ad7c89dd5e176f24db1fef6f287Devang Patel  {
12088cfd964a3341ad7c89dd5e176f24db1fef6f287Devang Patel    LLVMContextImpl *pImpl = getType()->getContext().pImpl;
12188cfd964a3341ad7c89dd5e176f24db1fef6f287Devang Patel    sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock);
12288cfd964a3341ad7c89dd5e176f24db1fef6f287Devang Patel    pImpl->MDNodeSet.RemoveNode(this);
12388cfd964a3341ad7c89dd5e176f24db1fef6f287Devang Patel  }
1248cf476be5b4be900ae3ae1fa43cff65d005d3d39Devang Patel  dropAllReferences();
1254771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel}
126ab67e705f59d567afded845465f358b8a66ab62eDevang Patel
1275f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel// Replace value from this node's element list.
1285f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patelvoid MDNode::replaceElement(Value *From, Value *To) {
1295f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  if (From == To || !getType())
1305f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    return;
1315f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  LLVMContext &Context = getType()->getContext();
1325f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  LLVMContextImpl *pImpl = Context.pImpl;
1335f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
1345f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  // Find value. This is a linear search, do something if it consumes
1355f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  // lot of time. It is possible that to have multiple instances of
1365f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  // From in this MDNode's element list.
1375f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  SmallVector<unsigned, 4> Indexes;
1385f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  unsigned Index = 0;
1395f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  for (SmallVector<ElementVH, 4>::iterator I = Node.begin(),
1405f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel         E = Node.end(); I != E; ++I, ++Index) {
1415f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    Value *V = *I;
1425f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    if (V && V == From)
1435f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel      Indexes.push_back(Index);
1445f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  }
1455f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
1465f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  if (Indexes.empty())
1475f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    return;
1485f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
1495f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  // Remove "this" from the context map.
1505f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  {
1515f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock);
1525f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    pImpl->MDNodeSet.RemoveNode(this);
1535f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  }
1545f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
15568f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  // MDNode only lists metadata elements in operand list, because MDNode
15668f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  // used by MDNode is considered a valid use. However on the side, MDNode
15768f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  // using a non-metadata value is not considered a "use" of non-metadata
15868f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  // value.
15968f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  SmallVector<unsigned, 4> OpIndexes;
16068f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  unsigned OpIndex = 0;
16168f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  for (User::op_iterator OI = op_begin(), OE = op_end();
16268f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel       OI != OE; ++OI, OpIndex++) {
16368f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel    if (*OI == From)
16468f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel      OpIndexes.push_back(OpIndex);
16568f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  }
16668f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  if (MetadataBase *MDTo = dyn_cast_or_null<MetadataBase>(To)) {
16768f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel    for (SmallVector<unsigned, 4>::iterator OI = OpIndexes.begin(),
16868f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel           OE = OpIndexes.end(); OI != OE; ++OI)
16968f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel      setOperand(*OI, MDTo);
17068f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  } else {
17168f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel    for (SmallVector<unsigned, 4>::iterator OI = OpIndexes.begin(),
17268f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel           OE = OpIndexes.end(); OI != OE; ++OI)
17368f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel      setOperand(*OI, 0);
17468f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel  }
17568f195cc50a8b7722004c8f3ca3dcf624b524552Devang Patel
1765f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  // Replace From element(s) in place.
1775f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  for (SmallVector<unsigned, 4>::iterator I = Indexes.begin(), E = Indexes.end();
1785f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel       I != E; ++I) {
1795f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    unsigned Index = *I;
1805f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    Node[Index] = ElementVH(To, this);
1815f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  }
1825f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
1835f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  // Insert updated "this" into the context's folding node set.
1845f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  // If a node with same element list already exist then before inserting
1855f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  // updated "this" into the folding node set, replace all uses of existing
1865f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  // node with updated "this" node.
1875f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  FoldingSetNodeID ID;
1885f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  Profile(ID);
1895f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  pImpl->ConstantsLock.reader_acquire();
1905f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  void *InsertPoint;
1915f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  MDNode *N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint);
1925f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  pImpl->ConstantsLock.reader_release();
1935f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
1945f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  if (N) {
1955f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    N->replaceAllUsesWith(this);
1965f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    delete N;
1975f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    N = 0;
1985f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  }
1995f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
2005f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  {
2015f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock);
2025f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint);
2035f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    if (!N) {
2045f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel      // InsertPoint will have been set by the FindNodeOrInsertPos call.
2055f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel      N = this;
2065f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel      pImpl->MDNodeSet.InsertNode(N, InsertPoint);
2075f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel    }
2085f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel  }
2095f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel}
2105f4ac848d94b0a92e19ac7f2b3d0284d7d323173Devang Patel
211f457d1316dec017cf204b54524878310c356bf64Devang Patel//===----------------------------------------------------------------------===//
212b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner// NamedMDNode implementation.
213f457d1316dec017cf204b54524878310c356bf64Devang Patel//
2141d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen AndersonNamedMDNode::NamedMDNode(LLVMContext &C, const Twine &N,
215b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner                         MetadataBase *const *MDs,
2165316bf0252ce9797e90a233645b6580695403837Devang Patel                         unsigned NumMDs, Module *ParentModule)
2171d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  : MetadataBase(Type::getMetadataTy(C), Value::NamedMDNodeVal), Parent(0) {
21828bc9d88260a3e153ead4311c9129e3d3ad07736Devang Patel  setName(N);
2194771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  NumOperands = 0;
2204771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  resizeOperands(NumMDs);
2214771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel
2224771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  for (unsigned i = 0; i != NumMDs; ++i) {
2234771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel    if (MDs[i])
2244771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel      OperandList[NumOperands++] = MDs[i];
225f457d1316dec017cf204b54524878310c356bf64Devang Patel    Node.push_back(WeakMetadataVH(MDs[i]));
2264771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  }
2275316bf0252ce9797e90a233645b6580695403837Devang Patel  if (ParentModule)
2285316bf0252ce9797e90a233645b6580695403837Devang Patel    ParentModule->getNamedMDList().push_back(this);
229f457d1316dec017cf204b54524878310c356bf64Devang Patel}
230a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel
231ab67e705f59d567afded845465f358b8a66ab62eDevang PatelNamedMDNode *NamedMDNode::Create(const NamedMDNode *NMD, Module *M) {
232b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  assert(NMD && "Invalid source NamedMDNode!");
233ab67e705f59d567afded845465f358b8a66ab62eDevang Patel  SmallVector<MetadataBase *, 4> Elems;
234ab67e705f59d567afded845465f358b8a66ab62eDevang Patel  for (unsigned i = 0, e = NMD->getNumElements(); i != e; ++i)
235ab67e705f59d567afded845465f358b8a66ab62eDevang Patel    Elems.push_back(NMD->getElement(i));
2361d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  return new NamedMDNode(NMD->getContext(), NMD->getName().data(),
2371d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson                         Elems.data(), Elems.size(), M);
238ab67e705f59d567afded845465f358b8a66ab62eDevang Patel}
239ab67e705f59d567afded845465f358b8a66ab62eDevang Patel
240a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel/// eraseFromParent - Drop all references and remove the node from parent
241a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel/// module.
242a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patelvoid NamedMDNode::eraseFromParent() {
243a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel  getParent()->getNamedMDList().erase(this);
244a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel}
245a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel
246a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel/// dropAllReferences - Remove all uses and clear node vector.
247a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patelvoid NamedMDNode::dropAllReferences() {
2484771e16fa96f41e62fc54578b6f656a52c23b61cDevang Patel  User::dropAllReferences();
249a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel  Node.clear();
250a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel}
251a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel
252a82f8838c60b7a3b240e185983dacb3291396f3eDevang PatelNamedMDNode::~NamedMDNode() {
253a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel  dropAllReferences();
254a82f8838c60b7a3b240e185983dacb3291396f3eDevang Patel}
255937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel
256937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel//===----------------------------------------------------------------------===//
257b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner// MetadataContext implementation.
258937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel//
259937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel
260937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// RegisterMDKind - Register a new metadata kind and return its ID.
261937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// A metadata kind can be registered only once.
262e30e678865b8dc1b69ef1c26e7567ffd1300553cDevang Patelunsigned MetadataContext::RegisterMDKind(const char *Name) {
263b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  assert(validName(Name) && "Invalid custome metadata name!");
264a2148402ce39fb3aad09e98a32078d3853a01ae9Devang Patel  unsigned Count = MDHandlerNames.size();
26511716d766b283815ac024a51ad75c1d6342cc0d4Devang Patel  assert(MDHandlerNames.find(Name) == MDHandlerNames.end()
26611716d766b283815ac024a51ad75c1d6342cc0d4Devang Patel         && "Already registered MDKind!");
267937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  MDHandlerNames[Name] = Count + 1;
268937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  return Count + 1;
269937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel}
270937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel
2710475c9170e9621292a48c688c3976031be5650bbDevang Patel/// validName - Return true if Name is a valid custom metadata handler name.
2720475c9170e9621292a48c688c3976031be5650bbDevang Patelbool MetadataContext::validName(const char *Name) {
2730475c9170e9621292a48c688c3976031be5650bbDevang Patel  if (!Name)
2740475c9170e9621292a48c688c3976031be5650bbDevang Patel    return false;
2750475c9170e9621292a48c688c3976031be5650bbDevang Patel
2760475c9170e9621292a48c688c3976031be5650bbDevang Patel  if (!isalpha(*Name))
2770475c9170e9621292a48c688c3976031be5650bbDevang Patel    return false;
2780475c9170e9621292a48c688c3976031be5650bbDevang Patel
2790475c9170e9621292a48c688c3976031be5650bbDevang Patel  unsigned Length = strlen(Name);
2800475c9170e9621292a48c688c3976031be5650bbDevang Patel  unsigned Count = 1;
2810475c9170e9621292a48c688c3976031be5650bbDevang Patel  ++Name;
2820475c9170e9621292a48c688c3976031be5650bbDevang Patel  while (Name &&
2830475c9170e9621292a48c688c3976031be5650bbDevang Patel         (isalnum(*Name) || *Name == '_' || *Name == '-' || *Name == '.')) {
2840475c9170e9621292a48c688c3976031be5650bbDevang Patel    ++Name;
2850475c9170e9621292a48c688c3976031be5650bbDevang Patel    ++Count;
2860475c9170e9621292a48c688c3976031be5650bbDevang Patel  }
2870475c9170e9621292a48c688c3976031be5650bbDevang Patel  if (Length != Count)
2880475c9170e9621292a48c688c3976031be5650bbDevang Patel    return false;
2890475c9170e9621292a48c688c3976031be5650bbDevang Patel  return true;
2900475c9170e9621292a48c688c3976031be5650bbDevang Patel}
2910475c9170e9621292a48c688c3976031be5650bbDevang Patel
292937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// getMDKind - Return metadata kind. If the requested metadata kind
293937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// is not registered then return 0.
294e30e678865b8dc1b69ef1c26e7567ffd1300553cDevang Patelunsigned MetadataContext::getMDKind(const char *Name) {
295b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  assert(validName(Name) && "Invalid custome metadata name!");
296937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  StringMap<unsigned>::iterator I = MDHandlerNames.find(Name);
297937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  if (I == MDHandlerNames.end())
298937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel    return 0;
299937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel
300937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  return I->getValue();
301937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel}
302937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel
30358a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel/// addMD - Attach the metadata of given kind with an Instruction.
30458a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patelvoid MetadataContext::addMD(unsigned MDKind, MDNode *Node, Instruction *Inst) {
305b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  assert(Node && "Invalid null MDNode");
306937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  Inst->HasMetadata = true;
30758a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel  MDStoreTy::iterator I = MetadataStore.find(Inst);
308937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  if (I == MetadataStore.end()) {
309937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel    MDMapTy Info;
310937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel    Info.push_back(std::make_pair(MDKind, Node));
311937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel    MetadataStore.insert(std::make_pair(Inst, Info));
312937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel    return;
313937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  }
31458a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel
315937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  MDMapTy &Info = I->second;
31658a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel  // If there is an entry for this MDKind then replace it.
31758a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel  for (unsigned i = 0, e = Info.size(); i != e; ++i) {
31858a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel    MDPairTy &P = Info[i];
31958a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel    if (P.first == MDKind) {
32058a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel      Info[i] = std::make_pair(MDKind, Node);
32158a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel      return;
32258a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel    }
32358a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel  }
32458a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel
32558a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel  // Otherwise add a new entry.
326937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  Info.push_back(std::make_pair(MDKind, Node));
327937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  return;
328937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel}
329937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel
33074da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel/// removeMD - Remove metadata of given kind attached with an instuction.
33174da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patelvoid MetadataContext::removeMD(unsigned Kind, Instruction *Inst) {
33274da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  MDStoreTy::iterator I = MetadataStore.find(Inst);
33374da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  if (I == MetadataStore.end())
33474da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel    return;
33574da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel
33674da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  MDMapTy &Info = I->second;
33774da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  for (MDMapTy::iterator MI = Info.begin(), ME = Info.end(); MI != ME; ++MI) {
33874da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel    MDPairTy &P = *MI;
33974da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel    if (P.first == Kind) {
34074da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel      Info.erase(MI);
34174da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel      return;
34274da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel    }
34374da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  }
34474da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel
34574da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  return;
34674da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel}
34774da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel
34874da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel/// removeMDs - Remove all metadata attached with an instruction.
34974da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patelvoid MetadataContext::removeMDs(const Instruction *Inst) {
35074da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  // Find Metadata handles for this instruction.
35174da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  MDStoreTy::iterator I = MetadataStore.find(Inst);
352b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  assert(I != MetadataStore.end() && "Invalid custom metadata info!");
35374da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  MDMapTy &Info = I->second;
35474da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel
35574da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  // FIXME : Give all metadata handlers a chance to adjust.
35674da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel
35774da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  // Remove the entries for this instruction.
35874da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  Info.clear();
35974da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel  MetadataStore.erase(I);
36074da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel}
36174da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel
3625db2c52270e70271ace8b4f0c2942823be702132Devang Patel/// copyMD - If metadata is attached with Instruction In1 then attach
3635db2c52270e70271ace8b4f0c2942823be702132Devang Patel/// the same metadata to In2.
3645db2c52270e70271ace8b4f0c2942823be702132Devang Patelvoid MetadataContext::copyMD(Instruction *In1, Instruction *In2) {
365b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  assert(In1 && In2 && "Invalid instruction!");
3665db2c52270e70271ace8b4f0c2942823be702132Devang Patel   MDStoreTy::iterator I = MetadataStore.find(In1);
3675db2c52270e70271ace8b4f0c2942823be702132Devang Patel  if (I == MetadataStore.end())
3685db2c52270e70271ace8b4f0c2942823be702132Devang Patel    return;
3695db2c52270e70271ace8b4f0c2942823be702132Devang Patel
3705db2c52270e70271ace8b4f0c2942823be702132Devang Patel  MDMapTy &In1Info = I->second;
3715db2c52270e70271ace8b4f0c2942823be702132Devang Patel  MDMapTy In2Info;
3725db2c52270e70271ace8b4f0c2942823be702132Devang Patel  for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I != E; ++I)
3735db2c52270e70271ace8b4f0c2942823be702132Devang Patel    if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second))
3745db2c52270e70271ace8b4f0c2942823be702132Devang Patel      addMD(I->first, MD, In2);
3755db2c52270e70271ace8b4f0c2942823be702132Devang Patel}
37674da40a96fecd07ce0bb4eee169087bfac2e5f23Devang Patel
377937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// getMD - Get the metadata of given kind attached with an Instruction.
378937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel/// If the metadata is not found then return 0.
379e30e678865b8dc1b69ef1c26e7567ffd1300553cDevang PatelMDNode *MetadataContext::getMD(unsigned MDKind, const Instruction *Inst) {
380937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  MDStoreTy::iterator I = MetadataStore.find(Inst);
381937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  if (I == MetadataStore.end())
38258a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel    return NULL;
383937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel
384937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  MDMapTy &Info = I->second;
385937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel  for (MDMapTy::iterator I = Info.begin(), E = Info.end(); I != E; ++I)
386937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel    if (I->first == MDKind)
38758a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel      return dyn_cast_or_null<MDNode>(I->second);
38858a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel  return NULL;
389937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel}
390937b1e92a9862862722732cb0f72d5ade77ac4c8Devang Patel
39143215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel/// getMDs - Get the metadata attached with an Instruction.
392b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattnerconst MetadataContext::MDMapTy *
393b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris LattnerMetadataContext::getMDs(const Instruction *Inst) {
39443215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel  MDStoreTy::iterator I = MetadataStore.find(Inst);
39543215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel  if (I == MetadataStore.end())
39643215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel    return NULL;
39743215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel
398b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  return &I->second;
39943215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel}
40043215788d5d79a0a336ca85442d7c8a45552dd7aDevang Patel
401e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel/// getHandlerNames - Get handler names. This is used by bitcode
402e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel/// writer.
403e30e678865b8dc1b69ef1c26e7567ffd1300553cDevang Patelconst StringMap<unsigned> *MetadataContext::getHandlerNames() {
404e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel  return &MDHandlerNames;
405e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel}
406e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel
4076c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel/// ValueIsCloned - This handler is used to update metadata store
4086c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel/// when In1 is cloned to create In2.
409e30e678865b8dc1b69ef1c26e7567ffd1300553cDevang Patelvoid MetadataContext::ValueIsCloned(const Instruction *In1, Instruction *In2) {
4106c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel  // Find Metadata handles for In1.
4116c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel  MDStoreTy::iterator I = MetadataStore.find(In1);
412b2a33b46469a6d2c0e61122002079efb7d6d3f9cChris Lattner  assert(I != MetadataStore.end() && "Invalid custom metadata info!");
4136c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel
4146c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel  // FIXME : Give all metadata handlers a chance to adjust.
4156c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel
4166c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel  MDMapTy &In1Info = I->second;
4176c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel  MDMapTy In2Info;
4186c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel  for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I != E; ++I)
4196c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel    if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second))
42058a230a4917592f5c529cb40e75bfc3e1c681b69Devang Patel      addMD(I->first, MD, In2);
4216c6c016b1b9711bc8968b51746d4b867e17905f4Devang Patel}
422740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel
423740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel/// ValueIsRAUWd - This handler is used when V1's all uses are replaced by
424740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel/// V2.
425740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patelvoid MetadataContext::ValueIsRAUWd(Value *V1, Value *V2) {
426740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel  Instruction *I1 = dyn_cast<Instruction>(V1);
427740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel  Instruction *I2 = dyn_cast<Instruction>(V2);
428740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel  if (!I1 || !I2)
429740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel    return;
430740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel
431740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel  // FIXME : Give custom handlers a chance to override this.
432740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel  ValueIsCloned(I1, I2);
433740d0db812a31a8df4ff1b7d6cfb25a3725f5e01Devang Patel}
4345db2c52270e70271ace8b4f0c2942823be702132Devang Patel
435