[PATCH] D64753: [CrossTU][NFCI] Refactor loadExternalAST function

Gabor Marton via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 16 03:12:57 PDT 2019

martong added a comment.

Thank you Endre, this patch is a great initiative.
However, I think we can do better encapsulation then just the reorganization of the functions:
We could encapsulate into a nested class `NameASTUnitMap` and the functions which operate on this (`getCachedASTUnitForName`,
We could do the same with `NameFileMap`, `lazyInitCTUIndex`,  `getASTFileNameForLookup`.
And we could also encapsulate `NumASTLoaded` and its related function (`checkThresholdReached`). In this case perhaps we could use RAII to increase the counter.

Comment at: clang/include/clang/CrossTU/CrossTranslationUnit.h:167
+  bool checkThresholdReached() const;
+  llvm::Error lazyInitCTUIndex(StringRef CrossTUDir, StringRef IndexName);
+  ASTUnit *getCachedASTUnitForName(StringRef LookupName) const;
Could you please provide comments for these new functions? E.g. it would be useful to know what is the `IndexName` param.

Comment at: clang/include/clang/CrossTU/CrossTranslationUnit.h:168
+  llvm::Error lazyInitCTUIndex(StringRef CrossTUDir, StringRef IndexName);
+  ASTUnit *getCachedASTUnitForName(StringRef LookupName) const;
+  std::unique_ptr<ASTUnit> loadFromASTFile(StringRef ASTFileName) const;
`LookupName` is the USR?

Comment at: clang/include/clang/CrossTU/CrossTranslationUnit.h:185
   llvm::StringMap<std::unique_ptr<clang::ASTUnit>> FileASTUnitMap;
   llvm::StringMap<clang::ASTUnit *> NameASTUnitMap;
Could you please add comments for these maps (caches) about what we use them for?

Comment at: clang/lib/CrossTU/CrossTranslationUnit.cpp:364
+  if (auto IndexMapping = parseCrossTUIndex(IndexFile, CrossTUDir)) {
+    // Initialize member map.
I don't think we should use `auto` here, because it is not obvious what will be the return type. It is important to see that we deal with an `Expected<...>`.
Perhaps we should have a type alias for `llvm::StringMap<std::string>`.

Comment at: clang/lib/CrossTU/CrossTranslationUnit.cpp:448
-    auto It = NameFileMap.find(LookupName);
-    if (It == NameFileMap.end()) {
-      ++NumNotInOtherTU;
-      return llvm::make_error<IndexError>(index_error_code::missing_definition);
-    }
-    StringRef ASTFileName = It->second;
-    auto ASTCacheEntry = FileASTUnitMap.find(ASTFileName);
-    if (ASTCacheEntry == FileASTUnitMap.end()) {
-      IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
-      TextDiagnosticPrinter *DiagClient =
-          new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts);
-      IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
-      IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
-          new DiagnosticsEngine(DiagID, &*DiagOpts, DiagClient));
-      std::unique_ptr<ASTUnit> LoadedUnit(ASTUnit::LoadFromASTFile(
-          ASTFileName, CI.getPCHContainerOperations()->getRawReader(),
-          ASTUnit::LoadEverything, Diags, CI.getFileSystemOpts()));
-      Unit = LoadedUnit.get();
-      FileASTUnitMap[ASTFileName] = std::move(LoadedUnit);
-      ++NumASTLoaded;
-      if (DisplayCTUProgress) {
-        llvm::errs() << "CTU loaded AST file: "
-                     << ASTFileName << "\n";
-      }
-    } else {
-      Unit = ASTCacheEntry->second.get();
+  // Lazily initialize the mapping from function names to AST files.
+  if (llvm::Error InitFailed = lazyInitCTUIndex(CrossTUDir, IndexName))
This comment might be also placed in the .h file as a oneliner above the function's prototype.

  rG LLVM Github Monorepo



More information about the cfe-commits mailing list