While cloning a module, clone metadata attached with instructions.
authorDevang Patel <dpatel@apple.com>
Tue, 22 Jun 2010 22:50:42 +0000 (22:50 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 22 Jun 2010 22:50:42 +0000 (22:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106591 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/CloneModule.cpp

index 1809bbb32012f7b479fbb67602c58ef45ab5251d..38c5877657a6cb49a822a58065aedb40ac143c2f 100644 (file)
@@ -133,6 +133,21 @@ Module *llvm::CloneModule(const Module *M,
     NamedMDNode::Create(New->getContext(), NMD.getName(),
                         MDs.data(), MDs.size(), New);
   }
-  
+
+  // Update metadata attach with instructions.
+  for (Module::iterator MI = New->begin(), ME = New->end(); MI != ME; ++MI)   
+    for (Function::iterator FI = MI->begin(), FE = MI->end(); 
+         FI != FE; ++FI)
+      for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); 
+           BI != BE; ++BI) {
+        SmallVector<std::pair<unsigned, MDNode *>, 4 > MDs;
+        BI->getAllMetadata(MDs);
+        for (SmallVector<std::pair<unsigned, MDNode *>, 4>::iterator 
+               MDI = MDs.begin(), MDE = MDs.end(); MDI != MDE; ++MDI) {
+          Value *MappedValue = MapValue(MDI->second, ValueMap);
+          if (MDI->second != MappedValue && MappedValue)
+            BI->setMetadata(MDI->first, cast<MDNode>(MappedValue));
+        }
+      }
   return New;
 }