[clang] 772e9f8 - [clang][deps] NFC: Document collector, rename members
Jan Svoboda via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 24 03:58:49 PDT 2021
Author: Jan Svoboda
Date: 2021-03-24T11:58:43+01:00
New Revision: 772e9f88dd78e6295bd71f1add4bcd7be0582817
URL: https://github.com/llvm/llvm-project/commit/772e9f88dd78e6295bd71f1add4bcd7be0582817
DIFF: https://github.com/llvm/llvm-project/commit/772e9f88dd78e6295bd71f1add4bcd7be0582817.diff
LOG: [clang][deps] NFC: Document collector, rename members
This patch documents how `ModuleDepCollector{,PP}` work and what their members store. Also renames somewhat vague `MainDeps` to `FileDeps` and `Deps` to `ModularDeps`.
Depends on D98943.
Reviewed By: Bigcheese
Differential Revision: https://reviews.llvm.org/D98950
Added:
Modified:
clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h
clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h b/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h
index 2e487c7d89f3..87bb1b86c279 100644
--- a/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h
+++ b/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h
@@ -104,6 +104,10 @@ void appendCommonModuleArguments(
class ModuleDepCollector;
+/// Callback that records textual includes and direct modular includes/imports
+/// during preprocessing. At the end of the main file, it also collects
+/// transitive modular dependencies and passes everything to the
+/// \c DependencyConsumer of the parent \c ModuleDepCollector.
class ModuleDepCollectorPP final : public PPCallbacks {
public:
ModuleDepCollectorPP(CompilerInstance &I, ModuleDepCollector &MDC)
@@ -124,11 +128,18 @@ class ModuleDepCollectorPP final : public PPCallbacks {
void EndOfMainFile() override;
private:
+ /// The compiler instance for the current translation unit.
CompilerInstance &Instance;
+ /// The parent dependency collector.
ModuleDepCollector &MDC;
- llvm::DenseSet<const Module *> DirectDeps;
+ /// Working set of direct modular dependencies.
+ llvm::DenseSet<const Module *> DirectModularDeps;
void handleImport(const Module *Imported);
+
+ /// Traverses the previously collected direct modular dependencies to discover
+ /// transitive modular dependencies and fills the parent \c ModuleDepCollector
+ /// with both.
void handleTopLevelModule(const Module *M);
void addAllSubmoduleDeps(const Module *M, ModuleDeps &MD,
llvm::DenseSet<const Module *> &AddedModules);
@@ -136,6 +147,8 @@ class ModuleDepCollectorPP final : public PPCallbacks {
llvm::DenseSet<const Module *> &AddedModules);
};
+/// Collects modular and non-modular dependencies of the main file by attaching
+/// \c ModuleDepCollectorPP to the preprocessor.
class ModuleDepCollector final : public DependencyCollector {
public:
ModuleDepCollector(std::unique_ptr<DependencyOutputOptions> Opts,
@@ -147,12 +160,20 @@ class ModuleDepCollector final : public DependencyCollector {
private:
friend ModuleDepCollectorPP;
+ /// The compiler instance for the current translation unit.
CompilerInstance &Instance;
+ /// The consumer of collected dependency information.
DependencyConsumer &Consumer;
+ /// Path to the main source file.
std::string MainFile;
+ /// The module hash identifying the compilation conditions.
std::string ContextHash;
- std::vector<std::string> MainDeps;
- std::unordered_map<std::string, ModuleDeps> Deps;
+ /// Non-modular file dependencies. This includes the main source file and
+ /// textually included header files.
+ std::vector<std::string> FileDeps;
+ /// Direct and transitive modular dependencies of the main source file.
+ std::unordered_map<std::string, ModuleDeps> ModularDeps;
+ /// Options that control the dependency output generation.
std::unique_ptr<DependencyOutputOptions> Opts;
};
diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
index 42a0b5af9d22..1fee831143e6 100644
--- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
+++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
@@ -79,7 +79,7 @@ void ModuleDepCollectorPP::FileChanged(SourceLocation Loc,
// We do not want #line markers to affect dependency generation!
if (Optional<StringRef> Filename =
SM.getNonBuiltinFilenameForID(SM.getFileID(SM.getExpansionLoc(Loc))))
- MDC.MainDeps.push_back(
+ MDC.FileDeps.push_back(
std::string(llvm::sys::path::remove_leading_dotslash(*Filename)));
}
@@ -91,7 +91,7 @@ void ModuleDepCollectorPP::InclusionDirective(
if (!File && !Imported) {
// This is a non-modular include that HeaderSearch failed to find. Add it
// here as `FileChanged` will never see it.
- MDC.MainDeps.push_back(std::string(FileName));
+ MDC.FileDeps.push_back(std::string(FileName));
}
handleImport(Imported);
}
@@ -106,9 +106,10 @@ void ModuleDepCollectorPP::handleImport(const Module *Imported) {
if (!Imported)
return;
- MDC.Deps[MDC.ContextHash + Imported->getTopLevelModule()->getFullModuleName()]
+ const Module *TopLevelModule = Imported->getTopLevelModule();
+ MDC.ModularDeps[MDC.ContextHash + TopLevelModule->getFullModuleName()]
.ImportedByMainFile = true;
- DirectDeps.insert(Imported->getTopLevelModule());
+ DirectModularDeps.insert(TopLevelModule);
}
void ModuleDepCollectorPP::EndOfMainFile() {
@@ -116,21 +117,20 @@ void ModuleDepCollectorPP::EndOfMainFile() {
MDC.MainFile = std::string(
Instance.getSourceManager().getFileEntryForID(MainFileID)->getName());
- for (const Module *M : DirectDeps) {
+ for (const Module *M : DirectModularDeps)
handleTopLevelModule(M);
- }
- for (auto &&I : MDC.Deps)
+ for (auto &&I : MDC.ModularDeps)
MDC.Consumer.handleModuleDependency(I.second);
- for (auto &&I : MDC.MainDeps)
+ for (auto &&I : MDC.FileDeps)
MDC.Consumer.handleFileDependency(*MDC.Opts, I);
}
void ModuleDepCollectorPP::handleTopLevelModule(const Module *M) {
assert(M == M->getTopLevelModule() && "Expected top level module!");
- auto ModI = MDC.Deps.insert(
+ auto ModI = MDC.ModularDeps.insert(
std::make_pair(MDC.ContextHash + M->getFullModuleName(), ModuleDeps{}));
if (!ModI.first->second.ID.ModuleName.empty())
More information about the cfe-commits
mailing list