From 4b43489e894f9667c319d0dceee5969dc5ac2f02 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 6 May 2016 23:14:07 +0000 Subject: [PATCH] [modules] Attempt to improve performance for declaration merging without a Sema object in C. Rather than using the DeclContext (which is very slow because it triggers us to build a lookup table for the DeclContext), use a separate map from identifiers to decls for this case, containing only the ones we've actually deserialized. For convenience, this map is implemented as an IdentifierResolver. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@268817 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Serialization/ASTReader.h | 11 +++++++++++ lib/Serialization/ASTReader.cpp | 5 +++++ lib/Serialization/ASTReaderDecl.cpp | 9 ++++----- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 6e1cb0a916..1b40494fd4 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -27,6 +27,7 @@ #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/PreprocessingRecord.h" #include "clang/Sema/ExternalSemaSource.h" +#include "clang/Sema/IdentifierResolver.h" #include "clang/Serialization/ASTBitCodes.h" #include "clang/Serialization/ContinuousRangeMap.h" #include "clang/Serialization/Module.h" @@ -390,6 +391,11 @@ private: /// \brief The module manager which manages modules and their dependencies ModuleManager ModuleMgr; + /// \brief A dummy identifier resolver used to merge TU-scope declarations in + /// C, for the cases where we don't have a Sema object to provide a real + /// identifier resolver. + IdentifierResolver DummyIdResolver; + /// A mapping from extension block names to module file extensions. llvm::StringMap> ModuleFileExtensions; @@ -2100,6 +2106,11 @@ public: /// imported. Sema *getSema() { return SemaObj; } + /// \brief Get the identifier resolver used for name lookup / updates + /// in the translation unit scope. We have one of these even if we don't + /// have a Sema object. + IdentifierResolver &getIdResolver(); + /// \brief Retrieve the identifier table associated with the /// preprocessor. IdentifierTable &getIdentifierTable(); diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index e33cccbd95..5d459ac9fb 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -8695,6 +8695,7 @@ ASTReader::ASTReader( FileMgr(PP.getFileManager()), PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr), ModuleMgr(PP.getFileManager(), PCHContainerRdr), + DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), PragmaMSStructState(-1), PragmaMSPointersToMembersState(-1), @@ -8733,3 +8734,7 @@ ASTReader::~ASTReader() { if (OwnsDeserializationListener) delete DeserializationListener; } + +IdentifierResolver &ASTReader::getIdResolver() { + return SemaObj ? SemaObj->IdResolver : DummyIdResolver; +} diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index a6e993885a..1a013cee21 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -23,7 +23,6 @@ #include "clang/AST/DeclVisitor.h" #include "clang/AST/Expr.h" #include "clang/Sema/IdentifierResolver.h" -#include "clang/Sema/Sema.h" #include "clang/Sema/SemaDiagnostic.h" #include "llvm/Support/SaveAndRestore.h" @@ -2814,9 +2813,9 @@ ASTDeclReader::FindExistingResult::~FindExistingResult() { if (needsAnonymousDeclarationNumber(New)) { setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(), AnonymousDeclNumber, New); - } else if (DC->isTranslationUnit() && Reader.SemaObj && + } else if (DC->isTranslationUnit() && !Reader.getContext().getLangOpts().CPlusPlus) { - if (Reader.SemaObj->IdResolver.tryAddTopLevelDecl(New, Name)) + if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name)) Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()] .push_back(New); } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) { @@ -2919,9 +2918,9 @@ ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) { if (isSameEntity(Existing, D)) return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber, TypedefNameForLinkage); - } else if (DC->isTranslationUnit() && Reader.SemaObj && + } else if (DC->isTranslationUnit() && !Reader.getContext().getLangOpts().CPlusPlus) { - IdentifierResolver &IdResolver = Reader.SemaObj->IdResolver; + IdentifierResolver &IdResolver = Reader.getIdResolver(); // Temporarily consider the identifier to be up-to-date. We don't want to // cause additional lookups here. -- 2.40.0