gamesh411 updated this revision to Diff 209883. gamesh411 added a comment. Incremental change
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64748/new/ https://reviews.llvm.org/D64748 Files: clang/include/clang/CrossTU/CrossTranslationUnit.h clang/lib/CrossTU/CrossTranslationUnit.cpp
Index: clang/lib/CrossTU/CrossTranslationUnit.cpp =================================================================== --- clang/lib/CrossTU/CrossTranslationUnit.cpp +++ 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<IndexError>( index_error_code::failed_to_generate_usr); - llvm::Expected<ASTUnit *> ASTUnitOrError = loadExternalAST( - LookupName, CrossTUDir, IndexName, DisplayCTUProgress); + llvm::Expected<ASTUnit *> 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<ASTUnit> LoadedUnit = loadFromASTFile(ASTFileName); + Unit = LoadedUnit.get(); + FileASTUnitMap[ASTFileName] = std::move(LoadedUnit); + } else { + Unit = ASTCacheEntry->second.get(); + } + NameASTUnitMap[LookupName] = Unit; + + return Unit; +} + llvm::Expected<ASTUnit *> 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<ASTUnit> 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<IndexError>( index_error_code::failed_to_get_external_ast); - return Unit; + } } template <typename T> @@ -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<IndexError>(index_error_code::failed_import); } auto *ToDecl = cast<T>(*ToDeclOrError); Index: clang/include/clang/CrossTU/CrossTranslationUnit.h =================================================================== --- clang/include/clang/CrossTU/CrossTranslationUnit.h +++ 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<ASTUnit> loadFromASTFile(StringRef ASTFileName) const; + ASTUnit *loadFromASTFileCached(StringRef LookupName, StringRef ASTFileName); llvm::Expected<std::string> getASTFileNameForLookup(StringRef LookupName) const; void lazyInitImporterSharedSt(TranslationUnitDecl *ToTU); ASTImporter &getOrCreateASTImporter(ASTContext &From); template <typename T> - llvm::Expected<const T *> getCrossTUDefinitionImpl(const T *D, - StringRef CrossTUDir, - StringRef IndexName, - bool DisplayCTUProgress); + llvm::Expected<const T *> + getCrossTUDefinitionImpl(const T *D, StringRef CrossTUDir, + StringRef IndexName, bool DisplayCTUProgress); template <typename T> - const T *findDefInDeclContext(const DeclContext *DC, - StringRef LookupName); + const T *findDefInDeclContext(const DeclContext *DC, StringRef LookupName); template <typename T> llvm::Expected<const T *> importDefinitionImpl(const T *D);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits