summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ASTReader.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-08-25 18:03:05 +0000
committerDouglas Gregor <dgregor@apple.com>2011-08-25 18:03:05 +0000
commit14f771695a0e9a8d80d0da24d45a8f9ba0c4ae4c (patch)
tree47e6e18abdf9b79cd87e68881b4c097cd37e83ab /clang/lib/Serialization/ASTReader.cpp
parent35d0e66bee4aa2cccaad1c1a2193b927914176cf (diff)
downloadbcm5719-llvm-14f771695a0e9a8d80d0da24d45a8f9ba0c4ae4c.tar.gz
bcm5719-llvm-14f771695a0e9a8d80d0da24d45a8f9ba0c4ae4c.zip
Switch the forward walk through the module chain over to a depth-first
search in ASTReader::ReadPreprocessedEntities(). llvm-svn: 138572
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
-rw-r--r--clang/lib/Serialization/ASTReader.cpp39
1 files changed, 30 insertions, 9 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 9b23e9ab4f2..75f12ec5841 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -3230,16 +3230,37 @@ bool ASTReader::ParseLanguageOptions(
return false;
}
-void ASTReader::ReadPreprocessedEntities() {
- for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
- Module &F = *(*I);
- if (!F.PreprocessorDetailCursor.getBitStreamReader())
- continue;
+namespace {
+ /// \brief Visitor used by ASTReader::ReadPreprocessedEntities() to load
+ /// all of the preprocessed entities within a module.
+ class ReadPreprocessedEntitiesVisitor {
+ ASTReader &Reader;
+
+ public:
+ explicit ReadPreprocessedEntitiesVisitor(ASTReader &Reader)
+ : Reader(Reader) { }
+
+ static bool visit(Module &M, bool Preorder, void *UserData) {
+ if (Preorder)
+ return false;
+
+ ReadPreprocessedEntitiesVisitor *This
+ = static_cast<ReadPreprocessedEntitiesVisitor *>(UserData);
+
+ if (!M.PreprocessorDetailCursor.getBitStreamReader())
+ return false;
+
+ SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
+ M.PreprocessorDetailCursor.JumpToBit(M.PreprocessorDetailStartOffset);
+ while (This->Reader.LoadPreprocessedEntity(M)) { }
+ return false;
+ }
+ };
+}
- SavedStreamPosition SavedPosition(F.PreprocessorDetailCursor);
- F.PreprocessorDetailCursor.JumpToBit(F.PreprocessorDetailStartOffset);
- while (LoadPreprocessedEntity(F)) { }
- }
+void ASTReader::ReadPreprocessedEntities() {
+ ReadPreprocessedEntitiesVisitor Visitor(*this);
+ ModuleMgr.visitDepthFirst(&ReadPreprocessedEntitiesVisitor::visit, &Visitor);
}
PreprocessedEntity *ASTReader::ReadPreprocessedEntityAtOffset(uint64_t Offset) {
OpenPOWER on IntegriCloud