diff --git a/clang/include/clang/CrossTU/CrossTranslationUnit.h b/clang/include/clang/CrossTU/CrossTranslationUnit.h --- a/clang/include/clang/CrossTU/CrossTranslationUnit.h +++ b/clang/include/clang/CrossTU/CrossTranslationUnit.h @@ -167,19 +167,18 @@ llvm::Error lazyInitCTUIndex(StringRef CrossTUDir, StringRef IndexName); ASTUnit *getCachedASTUnitForName(StringRef LookupName) const; std::unique_ptr loadFromASTFile(StringRef ASTFileName) const; + ASTUnit *loadFromASTFileCached(StringRef LookupName, StringRef ASTFileName); llvm::Expected getASTFileNameForLookup(StringRef LookupName) const; void lazyInitImporterSharedSt(TranslationUnitDecl *ToTU); ASTImporter &getOrCreateASTImporter(ASTContext &From); template - llvm::Expected getCrossTUDefinitionImpl(const T *D, - StringRef CrossTUDir, - StringRef IndexName, - bool DisplayCTUProgress); + llvm::Expected + getCrossTUDefinitionImpl(const T *D, StringRef CrossTUDir, + StringRef IndexName, bool DisplayCTUProgress); template - const T *findDefInDeclContext(const DeclContext *DC, - StringRef LookupName); + const T *findDefInDeclContext(const DeclContext *DC, StringRef LookupName); template llvm::Expected importDefinitionImpl(const T *D); diff --git a/clang/lib/CrossTU/CrossTranslationUnit.cpp b/clang/lib/CrossTU/CrossTranslationUnit.cpp --- a/clang/lib/CrossTU/CrossTranslationUnit.cpp +++ b/clang/lib/CrossTU/CrossTranslationUnit.cpp @@ -18,8 +18,8 @@ #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/TextDiagnosticPrinter.h" #include "clang/Index/USRGeneration.h" -#include "llvm/ADT/Triple.h" #include "llvm/ADT/Statistic.h" +#include "llvm/ADT/Triple.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Path.h" @@ -65,8 +65,7 @@ Rhs.getVendor() != Triple::UnknownVendor && Lhs.getVendor() != Rhs.getVendor()) return false; - if (!Lhs.isOSUnknown() && !Rhs.isOSUnknown() && - Lhs.getOS() != Rhs.getOS()) + if (!Lhs.isOSUnknown() && !Rhs.isOSUnknown() && Lhs.getOS() != Rhs.getOS()) return false; if (Lhs.getEnvironment() != Triple::UnknownEnvironment && Rhs.getEnvironment() != Triple::UnknownEnvironment && @@ -237,8 +236,8 @@ if (LookupName.empty()) return llvm::make_error( index_error_code::failed_to_generate_usr); - llvm::Expected ASTUnitOrError = loadExternalAST( - LookupName, CrossTUDir, IndexName, DisplayCTUProgress); + llvm::Expected ASTUnitOrError = + loadExternalAST(LookupName, CrossTUDir, IndexName, DisplayCTUProgress); if (!ASTUnitOrError) return ASTUnitOrError.takeError(); ASTUnit *Unit = *ASTUnitOrError; @@ -407,6 +406,25 @@ } } +ASTUnit * +CrossTranslationUnitContext::loadFromASTFileCached(StringRef LookupName, + StringRef ASTFileName) { + ASTUnit *Unit = nullptr; + + auto ASTCacheEntry = FileASTUnitMap.find(ASTFileName); + if (ASTCacheEntry == FileASTUnitMap.end()) { + // Load the ASTUnit from the pre-dumped AST file specified by ASTFileName. + std::unique_ptr LoadedUnit = loadFromASTFile(ASTFileName); + Unit = LoadedUnit.get(); + FileASTUnitMap[ASTFileName] = std::move(LoadedUnit); + } else { + Unit = ASTCacheEntry->second.get(); + } + NameASTUnitMap[LookupName] = Unit; + + return Unit; +} + llvm::Expected CrossTranslationUnitContext::loadExternalAST( StringRef LookupName, StringRef CrossTUDir, StringRef IndexName, bool DisplayCTUProgress) { @@ -434,25 +452,19 @@ if (!ASTFileName) return ASTFileName.takeError(); - auto ASTCacheEntry = FileASTUnitMap.find(*ASTFileName); - if (ASTCacheEntry == FileASTUnitMap.end()) { - // Load the ASTUnit from the pre-dumped AST file specified by ASTFileName. - std::unique_ptr LoadedUnit = loadFromASTFile(*ASTFileName); - Unit = LoadedUnit.get(); - FileASTUnitMap[*ASTFileName] = std::move(LoadedUnit); + // Try to load from ASTFile but use cache for both file and function names. + Unit = loadFromASTFileCached(LookupName, *ASTFileName); + + if (Unit) { ++NumASTLoaded; if (DisplayCTUProgress) { llvm::errs() << "CTU loaded AST file: " << *ASTFileName << "\n"; } + return Unit; } else { - Unit = ASTCacheEntry->second.get(); - } - NameASTUnitMap[LookupName] = Unit; - - if (!Unit) return llvm::make_error( index_error_code::failed_to_get_external_ast); - return Unit; + } } template @@ -463,20 +475,19 @@ ASTImporter &Importer = getOrCreateASTImporter(D->getASTContext()); auto ToDeclOrError = Importer.Import(D); if (!ToDeclOrError) { - handleAllErrors(ToDeclOrError.takeError(), - [&](const ImportError &IE) { - switch (IE.Error) { - case ImportError::NameConflict: - ++NumNameConflicts; - break; - case ImportError::UnsupportedConstruct: - ++NumUnsupportedNodeFound; - break; - case ImportError::Unknown: - llvm_unreachable("Unknown import error happened."); - break; - } - }); + handleAllErrors(ToDeclOrError.takeError(), [&](const ImportError &IE) { + switch (IE.Error) { + case ImportError::NameConflict: + ++NumNameConflicts; + break; + case ImportError::UnsupportedConstruct: + ++NumUnsupportedNodeFound; + break; + case ImportError::Unknown: + llvm_unreachable("Unknown import error happened."); + break; + } + }); return llvm::make_error(index_error_code::failed_import); } auto *ToDecl = cast(*ToDeclOrError);