@@ -57,15 +57,7 @@ void ModuleDepCollector::addOutputPaths(CompilerInvocation &CI,
57
57
// These are technically *inputs* to the compilation, but we populate them
58
58
// here in order to make \c getModuleContextHash() independent of
59
59
// \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 );
69
61
70
62
CI.getFrontendOpts ().OutputFile =
71
63
Consumer.lookupModuleOutput (Deps.ID , ModuleOutputKind::ModuleFile);
@@ -127,24 +119,12 @@ ModuleDepCollector::makeInvocationForModuleBuildWithoutOutputs(
127
119
CI.getFrontendOpts ().Inputs .emplace_back (Deps.ClangModuleMapFile ,
128
120
ModuleMapInputKind);
129
121
CI.getFrontendOpts ().ModuleMapFiles = Deps.ModuleMapFileDeps ;
122
+ addModuleMapFiles (CI, Deps.ClangModuleDeps );
130
123
131
124
// Report the prebuilt modules this module uses.
132
125
for (const auto &PrebuiltModule : Deps.PrebuiltModuleDeps )
133
126
CI.getFrontendOpts ().ModuleFiles .push_back (PrebuiltModule.PCMFile );
134
127
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
-
148
128
// Remove any macro definitions that are explicitly ignored.
149
129
if (!CI.getHeaderSearchOpts ().ModulesIgnoreMacros .empty ()) {
150
130
llvm::erase_if (
@@ -171,6 +151,31 @@ ModuleDepCollector::makeInvocationForModuleBuildWithoutOutputs(
171
151
return CI;
172
152
}
173
153
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
+
174
179
static std::string getModuleContextHash (const ModuleDeps &MD,
175
180
const CompilerInvocation &CI,
176
181
bool EagerLoadModules) {
@@ -212,6 +217,14 @@ static std::string getModuleContextHash(const ModuleDeps &MD,
212
217
return toString (llvm::APInt (sizeof (Words) * 8 , Words), 36 , /* Signed=*/ false );
213
218
}
214
219
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
+
215
228
void ModuleDepCollectorPP::FileChanged (SourceLocation Loc,
216
229
FileChangeReason Reason,
217
230
SrcMgr::CharacteristicKind FileType,
@@ -263,7 +276,8 @@ void ModuleDepCollectorPP::handleImport(const Module *Imported) {
263
276
const Module *TopLevelModule = Imported->getTopLevelModule ();
264
277
265
278
if (MDC.isPrebuiltModule (TopLevelModule))
266
- DirectPrebuiltModularDeps.insert (TopLevelModule);
279
+ MDC.DirectPrebuiltModularDeps .insert (
280
+ {TopLevelModule, PrebuiltModuleDep{TopLevelModule}});
267
281
else
268
282
DirectModularDeps.insert (TopLevelModule);
269
283
}
@@ -300,8 +314,8 @@ void ModuleDepCollectorPP::EndOfMainFile() {
300
314
for (auto &&I : MDC.FileDeps )
301
315
MDC.Consumer .handleFileDependency (I);
302
316
303
- for (auto &&I : DirectPrebuiltModularDeps)
304
- MDC.Consumer .handlePrebuiltModuleDependency (PrebuiltModuleDep{I} );
317
+ for (auto &&I : MDC. DirectPrebuiltModularDeps )
318
+ MDC.Consumer .handlePrebuiltModuleDependency (I. second );
305
319
}
306
320
307
321
ModuleID ModuleDepCollectorPP::handleTopLevelModule (const Module *M) {
@@ -403,8 +417,8 @@ ModuleID ModuleDepCollectorPP::handleTopLevelModule(const Module *M) {
403
417
*MDC.ScanInstance .getASTReader (), *MF);
404
418
});
405
419
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
+
408
422
// Finish the compiler invocation. Requires dependencies and the context hash.
409
423
MDC.addOutputPaths (CI, MD);
410
424
0 commit comments