Skip to content

Commit

Permalink
[clang][deps] NFC: Stop assuming the TU's context hash
Browse files Browse the repository at this point in the history
The context hash of modular dependencies can be different from the context hash of the original translation unit if we modify their `CompilerInvocation`s.

Stop assuming the TU's context hash everywhere.

No functionality change here, since we're still currently using the unmodified TU CompilerInvocation to compute the context hash.

Reviewed By: dexonsmith

Differential Revision: https://reviews.llvm.org/D102473
  • Loading branch information
jansvoboda11 committed May 17, 2021
1 parent 5ef2150 commit b9d5b0c
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ class ModuleDepCollectorPP final : public PPCallbacks {
/// 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);
ModuleID handleTopLevelModule(const Module *M);
void addAllSubmoduleDeps(const Module *M, ModuleDeps &MD,
llvm::DenseSet<const Module *> &AddedModules);
void addModuleDep(const Module *M, ModuleDeps &MD,
Expand All @@ -173,13 +173,13 @@ class ModuleDepCollector final : public DependencyCollector {
DependencyConsumer &Consumer;
/// Path to the main source file.
std::string MainFile;
/// The module hash identifying the compilation conditions.
/// Hash identifying the compilation conditions of the current TU.
std::string ContextHash;
/// 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;
std::unordered_map<const Module *, ModuleDeps> ModularDeps;
/// Options that control the dependency output generation.
std::unique_ptr<DependencyOutputOptions> Opts;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ DependencyScanningTool::getFullDependencies(
for (auto &&M : ClangModuleDeps) {
auto &MD = M.second;
if (MD.ImportedByMainFile)
FD.ClangModuleDeps.push_back({MD.ID.ModuleName, ContextHash});
FD.ClangModuleDeps.push_back(MD.ID);
}

FullDependenciesResult FDR;
Expand Down
39 changes: 21 additions & 18 deletions clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,6 @@ void ModuleDepCollectorPP::handleImport(const Module *Imported) {
return;

const Module *TopLevelModule = Imported->getTopLevelModule();
MDC.ModularDeps[MDC.ContextHash + TopLevelModule->getFullModuleName()]
.ImportedByMainFile = true;
DirectModularDeps.insert(TopLevelModule);
}

Expand All @@ -164,37 +162,44 @@ void ModuleDepCollectorPP::EndOfMainFile() {
MDC.Consumer.handleFileDependency(*MDC.Opts, I);
}

void ModuleDepCollectorPP::handleTopLevelModule(const Module *M) {
ModuleID ModuleDepCollectorPP::handleTopLevelModule(const Module *M) {
assert(M == M->getTopLevelModule() && "Expected top level module!");

auto ModI = MDC.ModularDeps.insert(
std::make_pair(MDC.ContextHash + M->getFullModuleName(), ModuleDeps{}));

if (!ModI.first->second.ID.ModuleName.empty())
return;
// If this module has been handled already, just return its ID.
auto ModI = MDC.ModularDeps.insert({M, ModuleDeps{}});
if (!ModI.second)
return ModI.first->second.ID;

ModuleDeps &MD = ModI.first->second;

MD.ID.ModuleName = M->getFullModuleName();
MD.ImportedByMainFile = DirectModularDeps.contains(M);
MD.ImplicitModulePCMPath = std::string(M->getASTFile()->getName());
MD.IsSystem = M->IsSystem;

const FileEntry *ModuleMap = Instance.getPreprocessor()
.getHeaderSearchInfo()
.getModuleMap()
.getContainingModuleMapFile(M);

MD.Invocation = Instance.getInvocationPtr();
MD.ClangModuleMapFile = std::string(ModuleMap ? ModuleMap->getName() : "");
MD.ID.ModuleName = M->getFullModuleName();
MD.ImplicitModulePCMPath = std::string(M->getASTFile()->getName());
MD.ID.ContextHash = MDC.ContextHash;
MD.IsSystem = M->IsSystem;

serialization::ModuleFile *MF =
MDC.Instance.getASTReader()->getModuleManager().lookup(M->getASTFile());
MDC.Instance.getASTReader()->visitInputFiles(
*MF, true, true, [&](const serialization::InputFile &IF, bool isSystem) {
MD.FileDeps.insert(IF.getFile()->getName());
});

// FIXME: Prepare the CompilerInvocation for building this module **now**, so
// that we store the actual context hash for this module (not just the
// context hash inherited from the original TU).
MD.Invocation = Instance.getInvocationPtr();
MD.ID.ContextHash = MD.Invocation->getModuleHash();

llvm::DenseSet<const Module *> AddedModules;
addAllSubmoduleDeps(M, MD, AddedModules);

return MD.ID;
}

void ModuleDepCollectorPP::addAllSubmoduleDeps(
Expand All @@ -211,11 +216,9 @@ void ModuleDepCollectorPP::addModuleDep(
llvm::DenseSet<const Module *> &AddedModules) {
for (const Module *Import : M->Imports) {
if (Import->getTopLevelModule() != M->getTopLevelModule()) {
ModuleID ImportID = handleTopLevelModule(Import->getTopLevelModule());
if (AddedModules.insert(Import->getTopLevelModule()).second)
MD.ClangModuleDeps.push_back(
{std::string(Import->getTopLevelModuleName()),
Instance.getInvocation().getModuleHash()});
handleTopLevelModule(Import->getTopLevelModule());
MD.ClangModuleDeps.push_back(ImportID);
}
}
}
Expand Down

0 comments on commit b9d5b0c

Please sign in to comment.