[clang] Optimize Module Dependency Handling for Efficient Memory Usage (PR #132294)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 20 15:15:22 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Ayush Pareek (ayushpareek2003)
<details>
<summary>Changes</summary>
-Optimized addModuleFiles functions for both CompilerInvocation and CowCompilerInvocation to reduce redundant function calls and improve efficiency
-Introduced memory preallocation using reserve() when eager load is enabled to reduce reallocation overhead
-Used try_emplace() instead of insert() for PrebuiltModuleFiles to avoid unnecessary overwrites
---
Full diff: https://github.com/llvm/llvm-project/pull/132294.diff
1 Files Affected:
- (modified) clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp (+39-22)
``````````diff
diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
index d715ef874e002..e172285c4b32d 100644
--- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
+++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
@@ -393,41 +393,58 @@ void ModuleDepCollector::addModuleMapFiles(
CompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
if (Service.shouldEagerLoadModules())
return; // Only pcm is needed for eager load.
-
+
+ // Preallocate memory to avoid multiple allocations
+ CI.getFrontendOpts().ModuleMapFiles.reserve(
+ CI.getFrontendOpts().ModuleMapFiles.size() + ClangModuleDeps.size());
for (const ModuleID &MID : ClangModuleDeps) {
- ModuleDeps *MD = ModuleDepsByID.lookup(MID);
- assert(MD && "Inconsistent dependency info");
- CI.getFrontendOpts().ModuleMapFiles.push_back(MD->ClangModuleMapFile);
+ if (ModuleDeps *MD = ModuleDepsByID.lookup(MID)) { // Single lookup
+ assert(MD && "Inconsistent dependency info");
+ CI.getFrontendOpts().ModuleMapFiles.emplace_back(MD->ClangModuleMapFile);
+ }
}
}
void ModuleDepCollector::addModuleFiles(
CompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
+
+ // Preallocate memory if eager load is enabled
+ if (Service.shouldEagerLoadModules()) {
+ CI.getFrontendOpts().ModuleFiles.reserve(
+ CI.getFrontendOpts().ModuleFiles.size() + ClangModuleDeps.size());
+ }
for (const ModuleID &MID : ClangModuleDeps) {
- ModuleDeps *MD = ModuleDepsByID.lookup(MID);
- std::string PCMPath =
- Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile);
-
- if (Service.shouldEagerLoadModules())
- CI.getFrontendOpts().ModuleFiles.push_back(std::move(PCMPath));
- else
- CI.getHeaderSearchOpts().PrebuiltModuleFiles.insert(
- {MID.ModuleName, std::move(PCMPath)});
+ if (ModuleDeps *MD = ModuleDepsByID.lookup(MID)) {
+ std::string PCMPath =
+ Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile);
+ if (Service.shouldEagerLoadModules()) {
+ CI.getFrontendOpts().ModuleFiles.emplace_back(std::move(PCMPath));
+ } else {
+ CI.getHeaderSearchOpts().PrebuiltModuleFiles.try_emplace(
+ MID.ModuleName, std::move(PCMPath));
+ }
+ }
}
}
void ModuleDepCollector::addModuleFiles(
CowCompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
+ // Preallocation
+ if (Service.shouldEagerLoadModules()) {
+ CI.getMutFrontendOpts().ModuleFiles.reserve(
+ CI.getMutFrontendOpts().ModuleFiles.size() + ClangModuleDeps.size());
+ }
for (const ModuleID &MID : ClangModuleDeps) {
- ModuleDeps *MD = ModuleDepsByID.lookup(MID);
- std::string PCMPath =
- Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile);
-
- if (Service.shouldEagerLoadModules())
- CI.getMutFrontendOpts().ModuleFiles.push_back(std::move(PCMPath));
- else
- CI.getMutHeaderSearchOpts().PrebuiltModuleFiles.insert(
- {MID.ModuleName, std::move(PCMPath)});
+ if (ModuleDeps *MD = ModuleDepsByID.lookup(MID)) {
+ std::string PCMPath =
+ Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile);
+ if (Service.shouldEagerLoadModules()) {
+ CI.getMutFrontendOpts().ModuleFiles.emplace_back(std::move(PCMPath));
+ } else {
+ CI.getMutHeaderSearchOpts().PrebuiltModuleFiles.try_emplace(
+ MID.ModuleName, std::move(PCMPath));
+ }
+ }
}
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/132294
More information about the cfe-commits
mailing list