[clang-tools-extra] [clangd] [Modules] Use ASTReader directly in IsModuleFileUpToDate (PR #113879)
Chuanqi Xu via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 28 19:51:30 PDT 2024
https://github.com/ChuanqiXu9 updated https://github.com/llvm/llvm-project/pull/113879
>From 99e1989c3b2fad7702795a707d130fe96a93f42f Mon Sep 17 00:00:00 2001
From: Chuanqi Xu <yedeng.yd at linux.alibaba.com>
Date: Mon, 28 Oct 2024 15:54:37 +0800
Subject: [PATCH 1/2] [clangd] [Modules] Use ASTReader directly in
IsModuleFileUpToDate
---
clang-tools-extra/clangd/ModulesBuilder.cpp | 59 +++++++++++++--------
1 file changed, 37 insertions(+), 22 deletions(-)
diff --git a/clang-tools-extra/clangd/ModulesBuilder.cpp b/clang-tools-extra/clangd/ModulesBuilder.cpp
index 1eeff468ef1236..1566ec8d9d900d 100644
--- a/clang-tools-extra/clangd/ModulesBuilder.cpp
+++ b/clang-tools-extra/clangd/ModulesBuilder.cpp
@@ -12,6 +12,7 @@
#include "clang/Frontend/FrontendAction.h"
#include "clang/Frontend/FrontendActions.h"
#include "clang/Serialization/ASTReader.h"
+#include "clang/Serialization/InMemoryModuleCache.h"
namespace clang {
namespace clangd {
@@ -127,50 +128,64 @@ struct ModuleFile {
std::string ModuleFilePath;
};
-bool IsModuleFileUpToDate(
- PathRef ModuleFilePath,
- const PrerequisiteModules &RequisiteModules) {
-IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
- CompilerInstance::createDiagnostics(new DiagnosticOptions());
-
+bool IsModuleFileUpToDate(PathRef ModuleFilePath,
+ const PrerequisiteModules &RequisiteModules,
+ llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS) {
auto HSOpts = std::make_shared<HeaderSearchOptions>();
RequisiteModules.adjustHeaderSearchOptions(*HSOpts);
HSOpts->ForceCheckCXX20ModulesInputFiles = true;
HSOpts->ValidateASTInputFilesContent = true;
+ IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
+ CompilerInstance::createDiagnostics(new DiagnosticOptions());
+
+ LangOptions LangOpts;
+ LangOpts.SkipODRCheckInGMF = true;
+
+ FileManager FileMgr(FileSystemOptions(), VFS);
+
+ SourceManager SourceMgr(*Diags, FileMgr);
+
+ HeaderSearch HeaderInfo(HSOpts, SourceMgr, *Diags, LangOpts,
+ /*Target=*/nullptr);
+
+ TrivialModuleLoader ModuleLoader;
+ Preprocessor PP(std::make_shared<PreprocessorOptions>(), *Diags, LangOpts,
+ SourceMgr, HeaderInfo, ModuleLoader);
+
+ IntrusiveRefCntPtr<InMemoryModuleCache> ModuleCache = new InMemoryModuleCache;
PCHContainerOperations PCHOperations;
- std::unique_ptr<ASTUnit> Unit = ASTUnit::LoadFromASTFile(
- ModuleFilePath.str(), PCHOperations.getRawReader(), ASTUnit::LoadASTOnly,
- Diags, FileSystemOptions(), std::move(HSOpts));
+ ASTReader Reader(PP, *ModuleCache, /*ASTContext=*/nullptr,
+ PCHOperations.getRawReader(), {});
- if (!Unit)
- return false;
+ Reader.setListener(std::make_unique<PPIntializer>(PP));
- auto Reader = Unit->getASTReader();
- if (!Reader)
+ if (Reader.ReadAST(ModuleFilePath, serialization::MK_MainFile,
+ SourceLocation(),
+ ASTReader::ARR_None) != ASTReader::Success)
return false;
bool UpToDate = true;
- Reader->getModuleManager().visit([&](serialization::ModuleFile &MF) -> bool {
- Reader->visitInputFiles(
+ Reader.getModuleManager().visit([&](serialization::ModuleFile &MF) -> bool {
+ Reader.visitInputFiles(
MF, /*IncludeSystem=*/false, /*Complain=*/false,
[&](const serialization::InputFile &IF, bool isSystem) {
if (!IF.getFile() || IF.isOutOfDate())
UpToDate = false;
});
-
return !UpToDate;
});
-
return UpToDate;
}
bool IsModuleFilesUpToDate(
llvm::SmallVector<PathRef> ModuleFilePaths,
- const PrerequisiteModules &RequisiteModules) {
- return llvm::all_of(ModuleFilePaths, [&RequisiteModules](auto ModuleFilePath) {
- return IsModuleFileUpToDate(ModuleFilePath, RequisiteModules);
- });
+ const PrerequisiteModules &RequisiteModules,
+ llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS) {
+ return llvm::all_of(
+ ModuleFilePaths, [&RequisiteModules, VFS](auto ModuleFilePath) {
+ return IsModuleFileUpToDate(ModuleFilePath, RequisiteModules, VFS);
+ });
}
// StandalonePrerequisiteModules - stands for PrerequisiteModules for which all
@@ -347,7 +362,7 @@ bool StandalonePrerequisiteModules::canReuse(
SmallVector<StringRef> BMIPaths;
for (auto &MF : RequiredModules)
BMIPaths.push_back(MF.ModuleFilePath);
- return IsModuleFilesUpToDate(BMIPaths, *this);
+ return IsModuleFilesUpToDate(BMIPaths, *this, VFS);
}
} // namespace clangd
>From 61a2c9adf302c49bb91eb81a86ffa2d399e6615e Mon Sep 17 00:00:00 2001
From: Chuanqi Xu <yedeng.yd at linux.alibaba.com>
Date: Tue, 29 Oct 2024 10:51:06 +0800
Subject: [PATCH 2/2] Update
---
clang-tools-extra/clangd/ModulesBuilder.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/clangd/ModulesBuilder.cpp b/clang-tools-extra/clangd/ModulesBuilder.cpp
index 1566ec8d9d900d..c4ed7869d7d1e0 100644
--- a/clang-tools-extra/clangd/ModulesBuilder.cpp
+++ b/clang-tools-extra/clangd/ModulesBuilder.cpp
@@ -136,8 +136,9 @@ bool IsModuleFileUpToDate(PathRef ModuleFilePath,
HSOpts->ForceCheckCXX20ModulesInputFiles = true;
HSOpts->ValidateASTInputFilesContent = true;
+ clang::clangd::IgnoreDiagnostics IgnoreDiags;
IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
- CompilerInstance::createDiagnostics(new DiagnosticOptions());
+ CompilerInstance::createDiagnostics(new DiagnosticOptions, &D, /*ShouldOwnClient=*/false);
LangOptions LangOpts;
LangOpts.SkipODRCheckInGMF = true;
More information about the cfe-commits
mailing list