@@ -57,15 +57,7 @@ void ModuleDepCollector::addOutputPaths(CompilerInvocation &CI,
5757 // These are technically *inputs* to the compilation, but we populate them
5858 // here in order to make \c getModuleContextHash() independent of
5959 // \c lookupModuleOutput().
60- for (ModuleID MID : Deps.ClangModuleDeps ) {
61- auto PCMPath =
62- Consumer.lookupModuleOutput (MID, ModuleOutputKind::ModuleFile);
63- if (EagerLoadModules)
64- CI.getFrontendOpts ().ModuleFiles .push_back (PCMPath);
65- else
66- CI.getHeaderSearchOpts ().PrebuiltModuleFiles .insert (
67- {MID.ModuleName , PCMPath});
68- }
60+ addModuleFiles (CI, Deps.ClangModuleDeps );
6961
7062 CI.getFrontendOpts ().OutputFile =
7163 Consumer.lookupModuleOutput (Deps.ID , ModuleOutputKind::ModuleFile);
@@ -127,24 +119,12 @@ ModuleDepCollector::makeInvocationForModuleBuildWithoutOutputs(
127119 CI.getFrontendOpts ().Inputs .emplace_back (Deps.ClangModuleMapFile ,
128120 ModuleMapInputKind);
129121 CI.getFrontendOpts ().ModuleMapFiles = Deps.ModuleMapFileDeps ;
122+ addModuleMapFiles (CI, Deps.ClangModuleDeps );
130123
131124 // Report the prebuilt modules this module uses.
132125 for (const auto &PrebuiltModule : Deps.PrebuiltModuleDeps )
133126 CI.getFrontendOpts ().ModuleFiles .push_back (PrebuiltModule.PCMFile );
134127
135- if (!EagerLoadModules) {
136- ModuleMap &ModMap =
137- ScanInstance.getPreprocessor ().getHeaderSearchInfo ().getModuleMap ();
138- for (ModuleID MID : Deps.ClangModuleDeps ) {
139- const Module *M = ModMap.findModule (MID.ModuleName );
140- assert (M && " Modular dependency not found" );
141- auto MDeps = ModularDeps.find (M);
142- assert (MDeps != ModularDeps.end () && " Inconsistent dependency info" );
143- CI.getFrontendOpts ().ModuleMapFiles .push_back (
144- MDeps->second ->ClangModuleMapFile );
145- }
146- }
147-
148128 // Remove any macro definitions that are explicitly ignored.
149129 if (!CI.getHeaderSearchOpts ().ModulesIgnoreMacros .empty ()) {
150130 llvm::erase_if (
@@ -171,6 +151,31 @@ ModuleDepCollector::makeInvocationForModuleBuildWithoutOutputs(
171151 return CI;
172152}
173153
154+ void ModuleDepCollector::addModuleMapFiles (
155+ CompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
156+ if (EagerLoadModules)
157+ return ; // Only pcm is needed for eager load.
158+
159+ for (const ModuleID &MID : ClangModuleDeps) {
160+ ModuleDeps *MD = ModuleDepsByID.lookup (MID);
161+ assert (MD && " Inconsistent dependency info" );
162+ CI.getFrontendOpts ().ModuleMapFiles .push_back (MD->ClangModuleMapFile );
163+ }
164+ }
165+
166+ void ModuleDepCollector::addModuleFiles (
167+ CompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
168+ for (const ModuleID &MID : ClangModuleDeps) {
169+ std::string PCMPath =
170+ Consumer.lookupModuleOutput (MID, ModuleOutputKind::ModuleFile);
171+ if (EagerLoadModules)
172+ CI.getFrontendOpts ().ModuleFiles .push_back (std::move (PCMPath));
173+ else
174+ CI.getHeaderSearchOpts ().PrebuiltModuleFiles .insert (
175+ {MID.ModuleName , std::move (PCMPath)});
176+ }
177+ }
178+
174179static std::string getModuleContextHash (const ModuleDeps &MD,
175180 const CompilerInvocation &CI,
176181 bool EagerLoadModules) {
@@ -212,6 +217,14 @@ static std::string getModuleContextHash(const ModuleDeps &MD,
212217 return toString (llvm::APInt (sizeof (Words) * 8 , Words), 36 , /* Signed=*/ false );
213218}
214219
220+ void ModuleDepCollector::associateWithContextHash (const CompilerInvocation &CI,
221+ ModuleDeps &Deps) {
222+ Deps.ID .ContextHash = getModuleContextHash (Deps, CI, EagerLoadModules);
223+ bool Inserted = ModuleDepsByID.insert ({Deps.ID , &Deps}).second ;
224+ (void )Inserted;
225+ assert (Inserted && " duplicate module mapping" );
226+ }
227+
215228void ModuleDepCollectorPP::FileChanged (SourceLocation Loc,
216229 FileChangeReason Reason,
217230 SrcMgr::CharacteristicKind FileType,
@@ -263,7 +276,8 @@ void ModuleDepCollectorPP::handleImport(const Module *Imported) {
263276 const Module *TopLevelModule = Imported->getTopLevelModule ();
264277
265278 if (MDC.isPrebuiltModule (TopLevelModule))
266- DirectPrebuiltModularDeps.insert (TopLevelModule);
279+ MDC.DirectPrebuiltModularDeps .insert (
280+ {TopLevelModule, PrebuiltModuleDep{TopLevelModule}});
267281 else
268282 DirectModularDeps.insert (TopLevelModule);
269283}
@@ -300,8 +314,8 @@ void ModuleDepCollectorPP::EndOfMainFile() {
300314 for (auto &&I : MDC.FileDeps )
301315 MDC.Consumer .handleFileDependency (I);
302316
303- for (auto &&I : DirectPrebuiltModularDeps)
304- MDC.Consumer .handlePrebuiltModuleDependency (PrebuiltModuleDep{I} );
317+ for (auto &&I : MDC. DirectPrebuiltModularDeps )
318+ MDC.Consumer .handlePrebuiltModuleDependency (I. second );
305319}
306320
307321ModuleID ModuleDepCollectorPP::handleTopLevelModule (const Module *M) {
@@ -403,8 +417,8 @@ ModuleID ModuleDepCollectorPP::handleTopLevelModule(const Module *M) {
403417 *MDC.ScanInstance .getASTReader (), *MF);
404418 });
405419
406- // Compute the context hash from the inputs. Requires dependencies.
407- MD. ID . ContextHash = getModuleContextHash (MD, CI, MDC. EagerLoadModules );
420+ MDC. associateWithContextHash (CI, MD);
421+
408422 // Finish the compiler invocation. Requires dependencies and the context hash.
409423 MDC.addOutputPaths (CI, MD);
410424
0 commit comments