Add removeMD().
authorDevang Patel <dpatel@apple.com>
Tue, 29 Sep 2009 20:42:25 +0000 (20:42 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 29 Sep 2009 20:42:25 +0000 (20:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83107 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Metadata.h
lib/VMCore/Metadata.cpp

index 8ad7aaf3f1294bf440a3d9b1735836ae5176b844..e4414817ca0007f7117a1d266999bf3dc3ecff1b 100644 (file)
@@ -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<unsigned> *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.
index 6e2fc3f25fe1b534c9b1665b7e308469dff1dfc1..54e52424ec556535fd2828bfeb7e1d56d68da588 100644 (file)
@@ -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<unsigned> *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) {