]> granicus.if.org Git - clang/commitdiff
Refactor to move decl update emission into the decl emission loop.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 20 Mar 2014 20:07:19 +0000 (20:07 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 20 Mar 2014 20:07:19 +0000 (20:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204392 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Serialization/ASTWriter.cpp

index 2967fb3486edafbdca894e962650048624221037..77228229b4da247d9a21db23caf5feabed430396 100644 (file)
@@ -4166,23 +4166,25 @@ void ASTWriter::WriteASTCore(Sema &SemaRef,
 
   RecordData DeclUpdatesOffsetsRecord;
 
-  // Keep writing types and declarations until all types and
-  // declarations have been written.
+  // Keep writing types, declarations, and declaration update records
+  // until we've emitted all of them.
   Stream.EnterSubblock(DECLTYPES_BLOCK_ID, NUM_ALLOWED_ABBREVS_SIZE);
   WriteDeclsBlockAbbrevs();
   for (DeclsToRewriteTy::iterator I = DeclsToRewrite.begin(),
                                   E = DeclsToRewrite.end();
        I != E; ++I)
     DeclTypesToEmit.push(const_cast<Decl*>(*I));
-  while (!DeclTypesToEmit.empty()) {
-    DeclOrType DOT = DeclTypesToEmit.front();
-    DeclTypesToEmit.pop();
-    if (DOT.isType())
-      WriteType(DOT.getType());
-    else
-      WriteDecl(Context, DOT.getDecl());
-  }
-  WriteDeclUpdatesBlocks(DeclUpdatesOffsetsRecord);
+  do {
+    WriteDeclUpdatesBlocks(DeclUpdatesOffsetsRecord);
+    while (!DeclTypesToEmit.empty()) {
+      DeclOrType DOT = DeclTypesToEmit.front();
+      DeclTypesToEmit.pop();
+      if (DOT.isType())
+        WriteType(DOT.getType());
+      else
+        WriteDecl(Context, DOT.getDecl());
+    }
+  } while (!DeclUpdates.empty());
   Stream.ExitBlock();
 
   if (!DeclUpdatesOffsetsRecord.empty())
@@ -4353,10 +4355,12 @@ void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) {
   if (DeclUpdates.empty())
     return;
 
-  for (DeclUpdateMap::iterator
-         I = DeclUpdates.begin(), E = DeclUpdates.end(); I != E; ++I) {
-    const Decl *D = I->first;
-    UpdateRecord &URec = I->second;
+  DeclUpdateMap LocalUpdates;
+  LocalUpdates.swap(DeclUpdates);
+
+  for (auto &Update : LocalUpdates) {
+    const Decl *D = Update.first;
+    UpdateRecord &URec = Update.second;
 
     if (isRewritten(D))
       continue; // The decl will be written completely,no need to store updates.