From 8a23fb7cb0d515f1e2006d9a96c56578414e35a7 Mon Sep 17 00:00:00 2001 From: Teresa Johnson Date: Wed, 11 May 2016 20:46:22 +0000 Subject: [PATCH] [ThinLTO] Fix Windows debug failure in new iterator This fixes a debug assert on Windows from the new iterator implementation added in r269059. The Windows std::vector iterator operator== checks in debug mode that the containers being iterated over are the same, which they may not be. Fixed by checking that we are iterating over the same container before comparing the container iterators. llvm-svn: 269232 --- lib/Bitcode/Writer/BitcodeWriter.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index 64d3bd90dac..e69fbe66770 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -333,21 +333,24 @@ public: // is empty. This will be handled specially in operator== as well. if (Writer.ModuleToSummariesForIndex && !Writer.ModuleToSummariesForIndex->empty()) { - ModuleSummariesIter = Writer.ModuleToSummariesForIndex->begin(); for (ModuleSummariesBack = Writer.ModuleToSummariesForIndex->begin(); std::next(ModuleSummariesBack) != Writer.ModuleToSummariesForIndex->end(); ModuleSummariesBack++) ; + ModuleSummariesIter = !IsAtEnd + ? Writer.ModuleToSummariesForIndex->begin() + : ModuleSummariesBack; ModuleGVSummariesIter = !IsAtEnd ? ModuleSummariesIter->second.begin() : ModuleSummariesBack->second.end(); } else if (!Writer.ModuleToSummariesForIndex && Writer.Index.begin() != Writer.Index.end()) { - IndexSummariesIter = Writer.Index.begin(); for (IndexSummariesBack = Writer.Index.begin(); std::next(IndexSummariesBack) != Writer.Index.end(); IndexSummariesBack++) ; + IndexSummariesIter = + !IsAtEnd ? Writer.Index.begin() : IndexSummariesBack; IndexGVSummariesIter = !IsAtEnd ? IndexSummariesIter->second.begin() : IndexSummariesBack->second.end(); } @@ -398,6 +401,10 @@ public: // empty, they both are. if (Writer.ModuleToSummariesForIndex->empty()) return true; + // Ensure the ModuleGVSummariesIter are iterating over the same + // container before checking them below. + if (ModuleSummariesIter != RHS.ModuleSummariesIter) + return false; return ModuleGVSummariesIter == RHS.ModuleGVSummariesIter; } // First ensure RHS also writing the full index, and that both are @@ -409,6 +416,10 @@ public: // empty, they both are. if (Writer.Index.begin() == Writer.Index.end()) return true; + // Ensure the IndexGVSummariesIter are iterating over the same + // container before checking them below. + if (IndexSummariesIter != RHS.IndexSummariesIter) + return false; return IndexGVSummariesIter == RHS.IndexGVSummariesIter; } };