From 74da40a96fecd07ce0bb4eee169087bfac2e5f23 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Tue, 29 Sep 2009 20:42:25 +0000 Subject: [PATCH] Add removeMD(). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83107 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Metadata.h | 10 ++++++++- lib/VMCore/Metadata.cpp | 48 ++++++++++++++++++++++++++++------------- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index 8ad7aaf3f12..e4414817ca0 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -345,6 +345,12 @@ public: /// addMD - Attach the metadata of given kind with 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); + + /// removeMDs - Remove all metadata attached with an instruction. + void removeMDs(const Instruction *Inst); + /// getHandlerNames - Get handler names. This is used by bitcode /// writer. const StringMap *getHandlerNames(); @@ -352,7 +358,9 @@ public: /// ValueIsDeleted - This handler is used to update metadata store /// when a value is deleted. void ValueIsDeleted(const Value *V) {} - void ValueIsDeleted(const Instruction *Inst); + void ValueIsDeleted(const Instruction *Inst) { + removeMDs(Inst); + } /// ValueIsCloned - This handler is used to update metadata store /// when In1 is cloned to create In2. diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp index 6e2fc3f25fe..54e52424ec5 100644 --- a/lib/VMCore/Metadata.cpp +++ b/lib/VMCore/Metadata.cpp @@ -327,6 +327,39 @@ void MetadataContext::addMD(unsigned MDKind, MDNode *Node, Instruction *Inst) { return; } +/// removeMD - Remove metadata of given kind attached with an instuction. +void MetadataContext::removeMD(unsigned Kind, Instruction *Inst) { + MDStoreTy::iterator I = MetadataStore.find(Inst); + if (I == MetadataStore.end()) + return; + + MDMapTy &Info = I->second; + for (MDMapTy::iterator MI = Info.begin(), ME = Info.end(); MI != ME; ++MI) { + MDPairTy &P = *MI; + if (P.first == Kind) { + Info.erase(MI); + 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); +} + + /// getMD - Get the metadata of given kind attached with an Instruction. /// If the metadata is not found then return 0. MDNode *MetadataContext::getMD(unsigned MDKind, const Instruction *Inst) { @@ -356,21 +389,6 @@ const StringMap *MetadataContext::getHandlerNames() { return &MDHandlerNames; } -/// ValueIsDeleted - This handler is used to update metadata store -/// when a value is deleted. -void MetadataContext::ValueIsDeleted(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); -} - /// ValueIsCloned - This handler is used to update metadata store /// when In1 is cloned to create In2. void MetadataContext::ValueIsCloned(const Instruction *In1, Instruction *In2) { -- 2.34.1