[cfe-commits] r146824 - in /cfe/trunk: include/clang/Serialization/ASTReader.h lib/Serialization/ASTReader.cpp
Argyrios Kyrtzidis
akyrtzi at gmail.com
Sat Dec 17 00:11:25 PST 2011
Author: akirtzidis
Date: Sat Dec 17 02:11:25 2011
New Revision: 146824
URL: http://llvm.org/viewvc/llvm-project?rev=146824&view=rev
Log:
[PCH] Don't deserialize bodies of interesting decls while iterating
over them because more interesting decls can be added during body
deserialization.
Should fix msvc build tests.
Modified:
cfe/trunk/include/clang/Serialization/ASTReader.h
cfe/trunk/lib/Serialization/ASTReader.cpp
Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=146824&r1=146823&r2=146824&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
+++ cfe/trunk/include/clang/Serialization/ASTReader.h Sat Dec 17 02:11:25 2011
@@ -790,6 +790,8 @@
void PassInterestingDeclsToConsumer();
void PassInterestingDeclToConsumer(Decl *D);
+ void finishPendingActions();
+
/// \brief Produce an error diagnostic and return true.
///
/// This routine should only be used for fatal errors that have to
Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=146824&r1=146823&r2=146824&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReader.cpp Sat Dec 17 02:11:25 2011
@@ -6024,56 +6024,64 @@
SwitchCaseStmts.clear();
}
+void ASTReader::finishPendingActions() {
+ while (!PendingIdentifierInfos.empty() ||
+ !PendingPreviousDecls.empty() ||
+ !PendingChainedObjCCategories.empty()) {
+
+ // If any identifiers with corresponding top-level declarations have
+ // been loaded, load those declarations now.
+ while (!PendingIdentifierInfos.empty()) {
+ SetGloballyVisibleDecls(PendingIdentifierInfos.front().II,
+ PendingIdentifierInfos.front().DeclIDs, true);
+ PendingIdentifierInfos.pop_front();
+ }
+
+ // Ready to load previous declarations of Decls that were delayed.
+ while (!PendingPreviousDecls.empty()) {
+ loadAndAttachPreviousDecl(PendingPreviousDecls.front().first,
+ PendingPreviousDecls.front().second);
+ PendingPreviousDecls.pop_front();
+ }
+
+ for (std::vector<std::pair<ObjCInterfaceDecl *,
+ serialization::DeclID> >::iterator
+ I = PendingChainedObjCCategories.begin(),
+ E = PendingChainedObjCCategories.end(); I != E; ++I) {
+ loadObjCChainedCategories(I->second, I->first);
+ }
+ PendingChainedObjCCategories.clear();
+ }
+}
+
void ASTReader::FinishedDeserializing() {
assert(NumCurrentElementsDeserializing &&
"FinishedDeserializing not paired with StartedDeserializing");
if (NumCurrentElementsDeserializing == 1) {
- // Fully load the interesting decls, including deserializing their bodies,
- // so that any other declarations that get referenced in the body will be
- // fully deserialized by the time we pass them to the consumer.
- for (std::deque<Decl *>::iterator
- I = InterestingDecls.begin(),
- E = InterestingDecls.end(); I != E; ++I)
- (*I)->getBody();
-
- do {
- // If any identifiers with corresponding top-level declarations have
- // been loaded, load those declarations now.
- while (!PendingIdentifierInfos.empty()) {
- SetGloballyVisibleDecls(PendingIdentifierInfos.front().II,
- PendingIdentifierInfos.front().DeclIDs, true);
- PendingIdentifierInfos.pop_front();
- }
-
- // Ready to load previous declarations of Decls that were delayed.
- while (!PendingPreviousDecls.empty()) {
- loadAndAttachPreviousDecl(PendingPreviousDecls.front().first,
- PendingPreviousDecls.front().second);
- PendingPreviousDecls.pop_front();
- }
-
- for (std::vector<std::pair<ObjCInterfaceDecl *,
- serialization::DeclID> >::iterator
- I = PendingChainedObjCCategories.begin(),
- E = PendingChainedObjCCategories.end(); I != E; ++I) {
- loadObjCChainedCategories(I->second, I->first);
- }
- PendingChainedObjCCategories.clear();
-
+ while (Consumer && !InterestingDecls.empty()) {
+ finishPendingActions();
+
// We are not in recursive loading, so it's safe to pass the "interesting"
// decls to the consumer.
- if (Consumer && !InterestingDecls.empty()) {
- Decl *D = InterestingDecls.front();
- InterestingDecls.pop_front();
+ Decl *D = InterestingDecls.front();
+ InterestingDecls.pop_front();
- PassInterestingDeclToConsumer(D);
+ // Fully load the interesting decls, including deserializing their
+ // bodies, so that any other declarations that get referenced in the
+ // body will be fully deserialized by the time we pass them to the
+ // consumer.
+ if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
+ if (FD->doesThisDeclarationHaveABody()) {
+ FD->getBody();
+ finishPendingActions();
+ }
}
- } while ((Consumer && !InterestingDecls.empty()) ||
- !PendingIdentifierInfos.empty() ||
- !PendingPreviousDecls.empty() ||
- !PendingChainedObjCCategories.empty());
+ PassInterestingDeclToConsumer(D);
+ }
+
+ finishPendingActions();
assert(PendingForwardRefs.size() == 0 &&
"Some forward refs did not get linked to the definition!");
More information about the cfe-commits
mailing list