Avoid modifying ValueEnumerator's MD ValueList by choosing which function-local MD...
authorVictor Hernandez <vhernandez@apple.com>
Thu, 14 Jan 2010 19:38:44 +0000 (19:38 +0000)
committerVictor Hernandez <vhernandez@apple.com>
Thu, 14 Jan 2010 19:38:44 +0000 (19:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93441 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bitcode/Writer/BitcodeWriter.cpp
lib/Bitcode/Writer/ValueEnumerator.h

index c71f676d4b7ce3ea5e9e9fbd152792106ea57fcd..5a4a1b2920d8f435be159e4c88d48e607a75f2dc 100644 (file)
@@ -554,30 +554,22 @@ static void WriteModuleMetadata(const ValueEnumerator &VE,
     Stream.ExitBlock();
 }
 
-static void WriteFunctionLocalMetadata(const ValueEnumerator &VE,
+static void WriteFunctionLocalMetadata(const Function &F,
+                                       const ValueEnumerator &VE,
                                        BitstreamWriter &Stream) {
   bool StartedMetadataBlock = false;
   SmallVector<uint64_t, 64> Record;
-  ValueEnumerator::ValueList Vals = VE.getMDValues();
-  ValueEnumerator::ValueList::iterator it = Vals.begin();
-  ValueEnumerator::ValueList::iterator end = Vals.end();
-
-  while (it != end) {
-    if (const MDNode *N = dyn_cast<MDNode>((*it).first)) {
-      if (N->isFunctionLocal()) {
+  const ValueEnumerator::ValueList &Vals = VE.getMDValues();
+  
+  for (unsigned i = 0, e = Vals.size(); i != e; ++i)
+    if (const MDNode *N = dyn_cast<MDNode>(Vals[i].first))
+      if (N->getFunction() == &F) {
         if (!StartedMetadataBlock) {
           Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3);
           StartedMetadataBlock = true;
         }
         WriteMDNode(N, VE, Stream, Record);
-        // Remove function-local MD, since it is not used outside of function.
-        it = Vals.erase(it);
-        end = Vals.end();
-        continue;
       }
-    }
-    ++it;
-  }
 
   if (StartedMetadataBlock)
     Stream.ExitBlock();
@@ -1227,7 +1219,7 @@ static void WriteFunction(const Function &F, ValueEnumerator &VE,
   WriteConstants(CstStart, CstEnd, VE, Stream, false);
 
   // If there is function-local metadata, emit it now.
-  WriteFunctionLocalMetadata(VE, Stream);
+  WriteFunctionLocalMetadata(F, VE, Stream);
 
   // Keep a running idea of what the instruction ID is.
   unsigned InstID = CstEnd;
index cf00e4cec9cec75601130c51925cb0356074be4e..78ea81439cd725c5564787cc8a7d0068ee39129a 100644 (file)
@@ -105,7 +105,6 @@ public:
   
   const ValueList &getValues() const { return Values; }
   const ValueList &getMDValues() const { return MDValues; }
-  ValueList getMDValues() { return MDValues; }
   const TypeList &getTypes() const { return Types; }
   const std::vector<const BasicBlock*> &getBasicBlocks() const {
     return BasicBlocks;