[clang-tools-extra] [clangd] [C++20] [Modules] Add scanning cache (PR #125988)
kadir çetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 25 23:49:57 PST 2025
================
@@ -380,30 +381,114 @@ llvm::SmallVector<StringRef> getAllRequiredModules(ProjectModules &MDB,
return ModuleNames;
}
+class CachingProjectModules : public ProjectModules {
+public:
+ CachingProjectModules(const GlobalCompilationDatabase &CDB) : CDB(CDB) {}
+
+ std::vector<std::string> getRequiredModules(PathRef File) override {
+ std::unique_ptr<ProjectModules> MDB = CDB.getProjectModules(File);
+ if (!MDB) {
+ elog("Failed to get Project Modules information for {0}", File);
+ return {};
+ }
+ return MDB->getRequiredModules(File);
+ }
+
+ std::string getModuleNameForSource(PathRef File) override {
+ std::unique_ptr<ProjectModules> MDB = CDB.getProjectModules(File);
+ if (!MDB) {
+ elog("Failed to get Project Modules information for {0}", File);
+ return {};
+ }
+ return MDB->getModuleNameForSource(File);
+ }
+
+ void setCommandMangler(CommandMangler M) override {
+ // GlobalCompilationDatabase::getProjectModules() will set mangler
+ // for the underlying ProjectModules.
+ }
+
+ std::string getSourceForModuleName(llvm::StringRef ModuleName,
+ PathRef RequiredSrcFile) override {
+ std::string CachedResult;
+ {
+ std::lock_guard<std::mutex> Lock(CacheMutex);
+ auto Iter = ModuleNameToSourceCache.find(ModuleName);
+ if (Iter != ModuleNameToSourceCache.end())
+ CachedResult = Iter->second;
+ }
+
+ std::unique_ptr<ProjectModules> MDB =
+ CDB.getProjectModules(RequiredSrcFile);
+ if (!MDB) {
+ elog("Failed to get Project Modules information for {0}",
+ RequiredSrcFile);
+ return {};
+ }
+
+ // Verify Cached Result by seeing if the source declaring the same module
+ // as we query.
+ if (!CachedResult.empty()) {
+ std::string ModuleNameOfCachedSource =
+ MDB->getModuleNameForSource(CachedResult);
+ if (ModuleNameOfCachedSource == ModuleName)
+ return CachedResult;
+ else {
+ // Cached Result is invalid. Clear it.
+
+ std::lock_guard<std::mutex> Lock(CacheMutex);
+ ModuleNameToSourceCache.erase(ModuleName);
+ }
+ }
+
+ auto Result = MDB->getSourceForModuleName(ModuleName, RequiredSrcFile);
----------------
kadircet wrote:
thanks that makes sense!
https://github.com/llvm/llvm-project/pull/125988
More information about the cfe-commits
mailing list