diff options
author | rdivacky <rdivacky@FreeBSD.org> | 2009-10-23 14:19:52 +0000 |
---|---|---|
committer | rdivacky <rdivacky@FreeBSD.org> | 2009-10-23 14:19:52 +0000 |
commit | 9643cca39fb9fb3b49a8912926de98acf882283c (patch) | |
tree | 22cc59e4b240d84c3a5a60531119c4eca914a256 /lib/VMCore/Metadata.cpp | |
parent | 1adacceba9c9ee0f16e54388e56c9a249b296f75 (diff) | |
download | FreeBSD-src-9643cca39fb9fb3b49a8912926de98acf882283c.zip FreeBSD-src-9643cca39fb9fb3b49a8912926de98acf882283c.tar.gz |
Update LLVM to r84949.
Diffstat (limited to 'lib/VMCore/Metadata.cpp')
-rw-r--r-- | lib/VMCore/Metadata.cpp | 444 |
1 files changed, 246 insertions, 198 deletions
diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp index 110c5e3..ad9653f 100644 --- a/lib/VMCore/Metadata.cpp +++ b/lib/VMCore/Metadata.cpp @@ -16,73 +16,44 @@ #include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "llvm/Instruction.h" +#include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/StringMap.h" #include "SymbolTableListTraitsImpl.h" using namespace llvm; //===----------------------------------------------------------------------===// -//MetadataBase implementation +// MetadataBase implementation. // -/// resizeOperands - Metadata keeps track of other metadata uses using -/// OperandList. Resize this list to hold anticipated number of metadata -/// operands. -void MetadataBase::resizeOperands(unsigned NumOps) { - unsigned e = getNumOperands(); - if (NumOps == 0) { - NumOps = e*2; - if (NumOps < 2) NumOps = 2; - } else if (NumOps > NumOperands) { - // No resize needed. - if (ReservedSpace >= NumOps) return; - } else if (NumOps == NumOperands) { - if (ReservedSpace == NumOps) return; - } else { - return; - } - - ReservedSpace = NumOps; - Use *OldOps = OperandList; - Use *NewOps = allocHungoffUses(NumOps); - std::copy(OldOps, OldOps + e, NewOps); - OperandList = NewOps; - if (OldOps) Use::zap(OldOps, OldOps + e, true); -} //===----------------------------------------------------------------------===// -//MDString implementation +// MDString implementation. // -MDString *MDString::get(LLVMContext &Context, const StringRef &Str) { +MDString *MDString::get(LLVMContext &Context, StringRef Str) { LLVMContextImpl *pImpl = Context.pImpl; - sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); StringMapEntry<MDString *> &Entry = pImpl->MDStringCache.GetOrCreateValue(Str); MDString *&S = Entry.getValue(); - if (!S) S = new MDString(Context, Entry.getKeyData(), - Entry.getKeyLength()); - - return S; + if (S) return S; + + return S = + new MDString(Context, Entry.getKey()); } //===----------------------------------------------------------------------===// -//MDNode implementation +// MDNode implementation. // -MDNode::MDNode(LLVMContext &C, Value*const* Vals, unsigned NumVals) +MDNode::MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals) : MetadataBase(Type::getMetadataTy(C), Value::MDNodeVal) { - NumOperands = 0; - resizeOperands(NumVals); - for (unsigned i = 0; i != NumVals; ++i) { - // Only record metadata uses. - if (MetadataBase *MB = dyn_cast_or_null<MetadataBase>(Vals[i])) - OperandList[NumOperands++] = MB; - else if(Vals[i] && - Vals[i]->getType()->getTypeID() == Type::MetadataTyID) - OperandList[NumOperands++] = Vals[i]; - Node.push_back(ElementVH(Vals[i], this)); - } + NodeSize = NumVals; + Node = new ElementVH[NodeSize]; + ElementVH *Ptr = Node; + for (unsigned i = 0; i != NumVals; ++i) + *Ptr++ = ElementVH(Vals[i], this); } void MDNode::Profile(FoldingSetNodeID &ID) const { - for (const_elem_iterator I = elem_begin(), E = elem_end(); I != E; ++I) - ID.AddPointer(*I); + for (unsigned i = 0, e = getNumElements(); i != e; ++i) + ID.AddPointer(getElement(i)); } MDNode *MDNode::get(LLVMContext &Context, Value*const* Vals, unsigned NumVals) { @@ -91,37 +62,31 @@ MDNode *MDNode::get(LLVMContext &Context, Value*const* Vals, unsigned NumVals) { for (unsigned i = 0; i != NumVals; ++i) ID.AddPointer(Vals[i]); - pImpl->ConstantsLock.reader_acquire(); void *InsertPoint; - MDNode *N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); - pImpl->ConstantsLock.reader_release(); + MDNode *N; + { + N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); + } + if (N) return N; + N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); if (!N) { - sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); - N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); - if (!N) { - // InsertPoint will have been set by the FindNodeOrInsertPos call. - N = new MDNode(Context, Vals, NumVals); - pImpl->MDNodeSet.InsertNode(N, InsertPoint); - } + // InsertPoint will have been set by the FindNodeOrInsertPos call. + N = new MDNode(Context, Vals, NumVals); + pImpl->MDNodeSet.InsertNode(N, InsertPoint); } return N; } -/// dropAllReferences - Remove all uses and clear node vector. -void MDNode::dropAllReferences() { - User::dropAllReferences(); - Node.clear(); -} - +/// ~MDNode - Destroy MDNode. MDNode::~MDNode() { { LLVMContextImpl *pImpl = getType()->getContext().pImpl; - sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); pImpl->MDNodeSet.RemoveNode(this); } - dropAllReferences(); + delete [] Node; + Node = NULL; } // Replace value from this node's element list. @@ -136,9 +101,8 @@ void MDNode::replaceElement(Value *From, Value *To) { // From in this MDNode's element list. SmallVector<unsigned, 4> Indexes; unsigned Index = 0; - for (SmallVector<ElementVH, 4>::iterator I = Node.begin(), - E = Node.end(); I != E; ++I, ++Index) { - Value *V = *I; + for (unsigned i = 0, e = getNumElements(); i != e; ++i, ++Index) { + Value *V = getElement(i); if (V && V == From) Indexes.push_back(Index); } @@ -147,31 +111,7 @@ void MDNode::replaceElement(Value *From, Value *To) { return; // Remove "this" from the context map. - { - sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); - pImpl->MDNodeSet.RemoveNode(this); - } - - // MDNode only lists metadata elements in operand list, because MDNode - // used by MDNode is considered a valid use. However on the side, MDNode - // using a non-metadata value is not considered a "use" of non-metadata - // value. - SmallVector<unsigned, 4> OpIndexes; - unsigned OpIndex = 0; - for (User::op_iterator OI = op_begin(), OE = op_end(); - OI != OE; ++OI, OpIndex++) { - if (*OI == From) - OpIndexes.push_back(OpIndex); - } - if (MetadataBase *MDTo = dyn_cast_or_null<MetadataBase>(To)) { - for (SmallVector<unsigned, 4>::iterator OI = OpIndexes.begin(), - OE = OpIndexes.end(); OI != OE; ++OI) - setOperand(*OI, MDTo); - } else { - for (SmallVector<unsigned, 4>::iterator OI = OpIndexes.begin(), - OE = OpIndexes.end(); OI != OE; ++OI) - setOperand(*OI, 0); - } + pImpl->MDNodeSet.RemoveNode(this); // Replace From element(s) in place. for (SmallVector<unsigned, 4>::iterator I = Indexes.begin(), E = Indexes.end(); @@ -186,10 +126,8 @@ void MDNode::replaceElement(Value *From, Value *To) { // node with updated "this" node. FoldingSetNodeID ID; Profile(ID); - pImpl->ConstantsLock.reader_acquire(); void *InsertPoint; MDNode *N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); - pImpl->ConstantsLock.reader_release(); if (N) { N->replaceAllUsesWith(this); @@ -197,39 +135,32 @@ void MDNode::replaceElement(Value *From, Value *To) { N = 0; } - { - sys::SmartScopedWriter<true> Writer(pImpl->ConstantsLock); - N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); - if (!N) { - // InsertPoint will have been set by the FindNodeOrInsertPos call. - N = this; - pImpl->MDNodeSet.InsertNode(N, InsertPoint); - } + N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint); + if (!N) { + // InsertPoint will have been set by the FindNodeOrInsertPos call. + N = this; + pImpl->MDNodeSet.InsertNode(N, InsertPoint); } } //===----------------------------------------------------------------------===// -//NamedMDNode implementation +// NamedMDNode implementation. // NamedMDNode::NamedMDNode(LLVMContext &C, const Twine &N, - MetadataBase*const* MDs, + MetadataBase *const *MDs, unsigned NumMDs, Module *ParentModule) : MetadataBase(Type::getMetadataTy(C), Value::NamedMDNodeVal), Parent(0) { setName(N); - NumOperands = 0; - resizeOperands(NumMDs); - for (unsigned i = 0; i != NumMDs; ++i) { - if (MDs[i]) - OperandList[NumOperands++] = MDs[i]; - Node.push_back(WeakMetadataVH(MDs[i])); - } + for (unsigned i = 0; i != NumMDs; ++i) + Node.push_back(TrackingVH<MetadataBase>(MDs[i])); + if (ParentModule) ParentModule->getNamedMDList().push_back(this); } NamedMDNode *NamedMDNode::Create(const NamedMDNode *NMD, Module *M) { - assert (NMD && "Invalid source NamedMDNode!"); + assert(NMD && "Invalid source NamedMDNode!"); SmallVector<MetadataBase *, 4> Elems; for (unsigned i = 0, e = NMD->getNumElements(); i != e; ++i) Elems.push_back(NMD->getElement(i)); @@ -245,7 +176,6 @@ void NamedMDNode::eraseFromParent() { /// dropAllReferences - Remove all uses and clear node vector. void NamedMDNode::dropAllReferences() { - User::dropAllReferences(); Node.clear(); } @@ -254,65 +184,100 @@ NamedMDNode::~NamedMDNode() { } //===----------------------------------------------------------------------===// -//Metadata implementation +// MetadataContextImpl implementation. // +namespace llvm { +class MetadataContextImpl { +public: + typedef std::pair<unsigned, TrackingVH<MDNode> > MDPairTy; + typedef SmallVector<MDPairTy, 2> MDMapTy; + typedef DenseMap<const Instruction *, MDMapTy> MDStoreTy; + friend class BitcodeReader; +private: + + /// MetadataStore - Collection of metadata used in this context. + MDStoreTy MetadataStore; + + /// MDHandlerNames - Map to hold metadata handler names. + StringMap<unsigned> MDHandlerNames; + +public: + /// registerMDKind - Register a new metadata kind and return its ID. + /// A metadata kind can be registered only once. + unsigned registerMDKind(StringRef Name); + + /// getMDKind - Return metadata kind. If the requested metadata kind + /// is not registered then return 0. + unsigned getMDKind(StringRef Name) const; + + /// getMD - Get the metadata of given kind attached to an Instruction. + /// If the metadata is not found then return 0. + MDNode *getMD(unsigned Kind, const Instruction *Inst); + + /// getMDs - Get the metadata attached to an Instruction. + void getMDs(const Instruction *Inst, SmallVectorImpl<MDPairTy> &MDs) const; + + /// addMD - Attach the metadata of given kind to an Instruction. + void addMD(unsigned Kind, MDNode *Node, Instruction *Inst); + + /// removeMD - Remove metadata of given kind attached with an instuction. + void removeMD(unsigned Kind, Instruction *Inst); + + /// removeAllMetadata - Remove all metadata attached with an instruction. + void removeAllMetadata(Instruction *Inst); + + /// copyMD - If metadata is attached with Instruction In1 then attach + /// the same metadata to In2. + void copyMD(Instruction *In1, Instruction *In2); + + /// getHandlerNames - Populate client supplied smallvector using custome + /// metadata name and ID. + void getHandlerNames(SmallVectorImpl<std::pair<unsigned, StringRef> >&) const; + + /// ValueIsDeleted - This handler is used to update metadata store + /// when a value is deleted. + void ValueIsDeleted(const Value *) {} + void ValueIsDeleted(Instruction *Inst) { + removeAllMetadata(Inst); + } + void ValueIsRAUWd(Value *V1, Value *V2); -/// RegisterMDKind - Register a new metadata kind and return its ID. -/// A metadata kind can be registered only once. -unsigned MetadataContext::RegisterMDKind(const char *Name) { - assert (validName(Name) && "Invalid custome metadata name!"); - unsigned Count = MDHandlerNames.size(); - assert(MDHandlerNames.find(Name) == MDHandlerNames.end() - && "Already registered MDKind!"); - MDHandlerNames[Name] = Count + 1; - return Count + 1; + /// ValueIsCloned - This handler is used to update metadata store + /// when In1 is cloned to create In2. + void ValueIsCloned(const Instruction *In1, Instruction *In2); +}; } -/// validName - Return true if Name is a valid custom metadata handler name. -bool MetadataContext::validName(const char *Name) { - if (!Name) - return false; - - if (!isalpha(*Name)) - return false; - - unsigned Length = strlen(Name); - unsigned Count = 1; - ++Name; - while (Name && - (isalnum(*Name) || *Name == '_' || *Name == '-' || *Name == '.')) { - ++Name; - ++Count; - } - if (Length != Count) - return false; - return true; +/// registerMDKind - Register a new metadata kind and return its ID. +/// A metadata kind can be registered only once. +unsigned MetadataContextImpl::registerMDKind(StringRef Name) { + unsigned Count = MDHandlerNames.size(); + assert(MDHandlerNames.count(Name) == 0 && "Already registered MDKind!"); + return MDHandlerNames[Name] = Count + 1; } /// getMDKind - Return metadata kind. If the requested metadata kind /// is not registered then return 0. -unsigned MetadataContext::getMDKind(const char *Name) { - assert (validName(Name) && "Invalid custome metadata name!"); - StringMap<unsigned>::iterator I = MDHandlerNames.find(Name); +unsigned MetadataContextImpl::getMDKind(StringRef Name) const { + StringMap<unsigned>::const_iterator I = MDHandlerNames.find(Name); if (I == MDHandlerNames.end()) return 0; return I->getValue(); } -/// addMD - Attach the metadata of given kind with an Instruction. -void MetadataContext::addMD(unsigned MDKind, MDNode *Node, Instruction *Inst) { - assert (Node && "Unable to add custome metadata"); +/// addMD - Attach the metadata of given kind to an Instruction. +void MetadataContextImpl::addMD(unsigned MDKind, MDNode *Node, + Instruction *Inst) { + assert(Node && "Invalid null MDNode"); Inst->HasMetadata = true; - MDStoreTy::iterator I = MetadataStore.find(Inst); - if (I == MetadataStore.end()) { - MDMapTy Info; + MDMapTy &Info = MetadataStore[Inst]; + if (Info.empty()) { Info.push_back(std::make_pair(MDKind, Node)); MetadataStore.insert(std::make_pair(Inst, Info)); return; } - MDMapTy &Info = I->second; // If there is an entry for this MDKind then replace it. for (unsigned i = 0, e = Info.size(); i != e; ++i) { MDPairTy &P = Info[i]; @@ -324,11 +289,10 @@ void MetadataContext::addMD(unsigned MDKind, MDNode *Node, Instruction *Inst) { // Otherwise add a new entry. Info.push_back(std::make_pair(MDKind, Node)); - return; } /// removeMD - Remove metadata of given kind attached with an instuction. -void MetadataContext::removeMD(unsigned Kind, Instruction *Inst) { +void MetadataContextImpl::removeMD(unsigned Kind, Instruction *Inst) { MDStoreTy::iterator I = MetadataStore.find(Inst); if (I == MetadataStore.end()) return; @@ -341,87 +305,80 @@ void MetadataContext::removeMD(unsigned Kind, Instruction *Inst) { return; } } - - return; } -/// removeMDs - Remove all metadata attached with an instruction. -void MetadataContext::removeMDs(const Instruction *Inst) { - // Find Metadata handles for this instruction. - MDStoreTy::iterator I = MetadataStore.find(Inst); - assert (I != MetadataStore.end() && "Invalid custom metadata info!"); - MDMapTy &Info = I->second; - - // FIXME : Give all metadata handlers a chance to adjust. - - // Remove the entries for this instruction. - Info.clear(); - MetadataStore.erase(I); +/// removeAllMetadata - Remove all metadata attached with an instruction. +void MetadataContextImpl::removeAllMetadata(Instruction *Inst) { + MetadataStore.erase(Inst); + Inst->HasMetadata = false; } /// copyMD - If metadata is attached with Instruction In1 then attach /// the same metadata to In2. -void MetadataContext::copyMD(Instruction *In1, Instruction *In2) { - assert (In1 && In2 && "Invalid instruction!"); - MDStoreTy::iterator I = MetadataStore.find(In1); - if (I == MetadataStore.end()) +void MetadataContextImpl::copyMD(Instruction *In1, Instruction *In2) { + assert(In1 && In2 && "Invalid instruction!"); + MDMapTy &In1Info = MetadataStore[In1]; + if (In1Info.empty()) return; - MDMapTy &In1Info = I->second; - MDMapTy In2Info; for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I != E; ++I) - if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second)) - addMD(I->first, MD, In2); + addMD(I->first, I->second, In2); } -/// getMD - Get the metadata of given kind attached with an Instruction. +/// getMD - Get the metadata of given kind attached to an Instruction. /// If the metadata is not found then return 0. -MDNode *MetadataContext::getMD(unsigned MDKind, const Instruction *Inst) { - MDStoreTy::iterator I = MetadataStore.find(Inst); - if (I == MetadataStore.end()) +MDNode *MetadataContextImpl::getMD(unsigned MDKind, const Instruction *Inst) { + MDMapTy &Info = MetadataStore[Inst]; + if (Info.empty()) return NULL; - - MDMapTy &Info = I->second; + for (MDMapTy::iterator I = Info.begin(), E = Info.end(); I != E; ++I) if (I->first == MDKind) - return dyn_cast_or_null<MDNode>(I->second); + return I->second; return NULL; } -/// getMDs - Get the metadata attached with an Instruction. -const MetadataContext::MDMapTy *MetadataContext::getMDs(const Instruction *Inst) { +/// getMDs - Get the metadata attached to an Instruction. +void MetadataContextImpl:: +getMDs(const Instruction *Inst, SmallVectorImpl<MDPairTy> &MDs) const { MDStoreTy::iterator I = MetadataStore.find(Inst); if (I == MetadataStore.end()) - return NULL; - - return &(I->second); + return; + for (MDMapTy::iterator MI = I->second.begin(), ME = I->second.end(); + MI != ME; ++MI) + MDs.push_back(std::make_pair(MI->first, MI->second)); + std::sort(MDs.begin(), MDs.end()); } -/// getHandlerNames - Get handler names. This is used by bitcode -/// writer. -const StringMap<unsigned> *MetadataContext::getHandlerNames() { - return &MDHandlerNames; +/// getHandlerNames - Populate client supplied smallvector using custome +/// metadata name and ID. +void MetadataContextImpl:: +getHandlerNames(SmallVectorImpl<std::pair<unsigned, StringRef> >&Names) const { + for (StringMap<unsigned>::const_iterator I = MDHandlerNames.begin(), + E = MDHandlerNames.end(); I != E; ++I) + Names.push_back(std::make_pair(I->second, I->first())); + std::sort(Names.begin(), Names.end()); } /// ValueIsCloned - This handler is used to update metadata store /// when In1 is cloned to create In2. -void MetadataContext::ValueIsCloned(const Instruction *In1, Instruction *In2) { +void MetadataContextImpl::ValueIsCloned(const Instruction *In1, + Instruction *In2) { // Find Metadata handles for In1. MDStoreTy::iterator I = MetadataStore.find(In1); - assert (I != MetadataStore.end() && "Invalid custom metadata info!"); + assert(I != MetadataStore.end() && "Invalid custom metadata info!"); // FIXME : Give all metadata handlers a chance to adjust. MDMapTy &In1Info = I->second; MDMapTy In2Info; for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I != E; ++I) - if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second)) - addMD(I->first, MD, In2); + addMD(I->first, I->second, In2); } /// ValueIsRAUWd - This handler is used when V1's all uses are replaced by /// V2. -void MetadataContext::ValueIsRAUWd(Value *V1, Value *V2) { +void MetadataContextImpl::ValueIsRAUWd(Value *V1, Value *V2) { Instruction *I1 = dyn_cast<Instruction>(V1); Instruction *I2 = dyn_cast<Instruction>(V2); if (!I1 || !I2) @@ -431,3 +388,94 @@ void MetadataContext::ValueIsRAUWd(Value *V1, Value *V2) { ValueIsCloned(I1, I2); } +//===----------------------------------------------------------------------===// +// MetadataContext implementation. +// +MetadataContext::MetadataContext() + : pImpl(new MetadataContextImpl()) { } +MetadataContext::~MetadataContext() { delete pImpl; } + +/// isValidName - Return true if Name is a valid custom metadata handler name. +bool MetadataContext::isValidName(StringRef MDName) { + if (MDName.empty()) + return false; + + if (!isalpha(MDName[0])) + return false; + + for (StringRef::iterator I = MDName.begin() + 1, E = MDName.end(); I != E; + ++I) { + if (!isalnum(*I) && *I != '_' && *I != '-' && *I != '.') + return false; + } + return true; +} + +/// registerMDKind - Register a new metadata kind and return its ID. +/// A metadata kind can be registered only once. +unsigned MetadataContext::registerMDKind(StringRef Name) { + assert(isValidName(Name) && "Invalid custome metadata name!"); + return pImpl->registerMDKind(Name); +} + +/// getMDKind - Return metadata kind. If the requested metadata kind +/// is not registered then return 0. +unsigned MetadataContext::getMDKind(StringRef Name) const { + return pImpl->getMDKind(Name); +} + +/// getMD - Get the metadata of given kind attached to an Instruction. +/// If the metadata is not found then return 0. +MDNode *MetadataContext::getMD(unsigned Kind, const Instruction *Inst) { + return pImpl->getMD(Kind, Inst); +} + +/// getMDs - Get the metadata attached to an Instruction. +void MetadataContext:: +getMDs(const Instruction *Inst, + SmallVectorImpl<std::pair<unsigned, TrackingVH<MDNode> > > &MDs) const { + return pImpl->getMDs(Inst, MDs); +} + +/// addMD - Attach the metadata of given kind to an Instruction. +void MetadataContext::addMD(unsigned Kind, MDNode *Node, Instruction *Inst) { + pImpl->addMD(Kind, Node, Inst); +} + +/// removeMD - Remove metadata of given kind attached with an instuction. +void MetadataContext::removeMD(unsigned Kind, Instruction *Inst) { + pImpl->removeMD(Kind, Inst); +} + +/// removeAllMetadata - Remove all metadata attached with an instruction. +void MetadataContext::removeAllMetadata(Instruction *Inst) { + pImpl->removeAllMetadata(Inst); +} + +/// copyMD - If metadata is attached with Instruction In1 then attach +/// the same metadata to In2. +void MetadataContext::copyMD(Instruction *In1, Instruction *In2) { + pImpl->copyMD(In1, In2); +} + +/// getHandlerNames - Populate client supplied smallvector using custome +/// metadata name and ID. +void MetadataContext:: +getHandlerNames(SmallVectorImpl<std::pair<unsigned, StringRef> >&N) const { + pImpl->getHandlerNames(N); +} + +/// ValueIsDeleted - This handler is used to update metadata store +/// when a value is deleted. +void MetadataContext::ValueIsDeleted(Instruction *Inst) { + pImpl->ValueIsDeleted(Inst); +} +void MetadataContext::ValueIsRAUWd(Value *V1, Value *V2) { + pImpl->ValueIsRAUWd(V1, V2); +} + +/// ValueIsCloned - This handler is used to update metadata store +/// when In1 is cloned to create In2. +void MetadataContext::ValueIsCloned(const Instruction *In1, Instruction *In2) { + pImpl->ValueIsCloned(In1, In2); +} |