================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits