@@ -142,30 +142,33 @@ class IncludeTreeBuilder {
142
142
std::optional<llvm::Error> ErrorToReport;
143
143
};
144
144
145
- // / A utility for adding \c PPCallbacks to a compiler instance at the
146
- // / appropriate time.
147
- struct PPCallbacksDependencyCollector : public DependencyCollector {
148
- using MakeCB =
145
+ // / A utility for adding \c PPCallbacks and/or \cASTReaderListener to a compiler
146
+ // / instance at the appropriate time.
147
+ struct AttachOnlyDependencyCollector : public DependencyCollector {
148
+ using MakePPCB =
149
149
llvm::unique_function<std::unique_ptr<PPCallbacks>(Preprocessor &)>;
150
- MakeCB Create;
151
- PPCallbacksDependencyCollector (MakeCB Create) : Create(std::move(Create)) {}
150
+ using MakeASTReaderL =
151
+ llvm::unique_function<std::unique_ptr<ASTReaderListener>(ASTReader &R)>;
152
+ MakePPCB CreatePPCB;
153
+ MakeASTReaderL CreateASTReaderL;
154
+ AttachOnlyDependencyCollector (MakePPCB CreatePPCB, MakeASTReaderL CreateL)
155
+ : CreatePPCB(std::move(CreatePPCB)),
156
+ CreateASTReaderL (std::move(CreateL)) {}
157
+
152
158
void attachToPreprocessor (Preprocessor &PP) final {
153
- std::unique_ptr<PPCallbacks> CB = Create (PP);
154
- assert (CB);
155
- PP.addPPCallbacks (std::move (CB));
159
+ if (CreatePPCB) {
160
+ std::unique_ptr<PPCallbacks> CB = CreatePPCB (PP);
161
+ assert (CB);
162
+ PP.addPPCallbacks (std::move (CB));
163
+ }
156
164
}
157
- };
158
- // / A utility for adding \c ASTReaderListener to a compiler instance at the
159
- // / appropriate time.
160
- struct ASTReaderListenerDependencyCollector : public DependencyCollector {
161
- using MakeL =
162
- llvm::unique_function<std::unique_ptr<ASTReaderListener>(ASTReader &R)>;
163
- MakeL Create;
164
- ASTReaderListenerDependencyCollector (MakeL Create) : Create(std::move(Create)) {}
165
+
165
166
void attachToASTReader (ASTReader &R) final {
166
- std::unique_ptr<ASTReaderListener> L = Create (R);
167
- assert (L);
168
- R.addListener (std::move (L));
167
+ if (CreateASTReaderL) {
168
+ std::unique_ptr<ASTReaderListener> L = CreateASTReaderL (R);
169
+ assert (L);
170
+ R.addListener (std::move (L));
171
+ }
169
172
}
170
173
};
171
174
@@ -244,27 +247,29 @@ struct IncludeTreePPCallbacks : public PPCallbacks {
244
247
// / MODULE_DIRECTORY record, and ignores the result.
245
248
class LookupPCHModulesListener : public ASTReaderListener {
246
249
public:
247
- LookupPCHModulesListener (Preprocessor &PP ) : PP(PP ) {}
250
+ LookupPCHModulesListener (ASTReader &R ) : Reader(R ) {}
248
251
249
252
private:
250
- void ReadModuleName (StringRef ModuleName) final {
251
- if (PCHFinished)
252
- return ;
253
- // Match MODULE_DIRECTORY: allow full search and ignore failure to find
254
- // the module.
255
- (void )PP.getHeaderSearchInfo ().lookupModule (
256
- ModuleName, SourceLocation (), /* AllowSearch=*/ true ,
257
- /* AllowExtraModuleMapSearch=*/ true );
258
- }
259
253
void visitModuleFile (StringRef Filename,
260
254
serialization::ModuleKind Kind) final {
261
- if (Kind == serialization::MK_PCH)
262
- PCHFinished = true ;
255
+ // Any prebuilt or explicit modules seen during scanning are "full" modules
256
+ // rather than implicitly built scanner modules.
257
+ if (Kind == serialization::MK_PrebuiltModule ||
258
+ Kind == serialization::MK_ExplicitModule) {
259
+ serialization::ModuleManager &Manager = Reader.getModuleManager ();
260
+ serialization::ModuleFile *MF = Manager.lookupByFileName (Filename);
261
+ assert (MF && " module file missing in visitModuleFile" );
262
+ // Match MODULE_DIRECTORY: allow full search and ignore failure to find
263
+ // the module.
264
+ HeaderSearch &HS = Reader.getPreprocessor ().getHeaderSearchInfo ();
265
+ (void )HS.lookupModule (MF->ModuleName , SourceLocation (),
266
+ /* AllowSearch=*/ true ,
267
+ /* AllowExtraModuleMapSearch=*/ true );
268
+ }
263
269
}
264
270
265
271
private:
266
- Preprocessor &PP;
267
- bool PCHFinished = false ;
272
+ ASTReader &Reader;
268
273
};
269
274
} // namespace
270
275
@@ -317,21 +322,15 @@ Error IncludeTreeActionController::initialize(
317
322
318
323
// Attach callbacks for the IncludeTree of the TU. The preprocessor
319
324
// does not exist yet, so we need to indirect this via DependencyCollector.
320
- auto DC = std::make_shared<PPCallbacksDependencyCollector >(
325
+ auto DC = std::make_shared<AttachOnlyDependencyCollector >(
321
326
[&Builder = current ()](Preprocessor &PP) {
322
327
return std::make_unique<IncludeTreePPCallbacks>(Builder, PP);
328
+ },
329
+ [](ASTReader &R) {
330
+ return std::make_unique<LookupPCHModulesListener>(R);
323
331
});
324
332
ScanInstance.addDependencyCollector (std::move (DC));
325
333
326
- // Attach callback for modules loaded via PCH.
327
- if (!ScanInstance.getPreprocessorOpts ().ImplicitPCHInclude .empty ()) {
328
- auto DC = std::make_shared<ASTReaderListenerDependencyCollector>(
329
- [&](ASTReader &R) {
330
- return std::make_unique<LookupPCHModulesListener>(R.getPreprocessor ());
331
- });
332
- ScanInstance.addDependencyCollector (std::move (DC));
333
- }
334
-
335
334
// Enable caching in the resulting commands.
336
335
ScanInstance.getFrontendOpts ().CacheCompileJob = true ;
337
336
CASOpts = ScanInstance.getCASOpts ();
@@ -367,9 +366,12 @@ Error IncludeTreeActionController::initializeModuleBuild(
367
366
368
367
// Attach callbacks for the IncludeTree of the module. The preprocessor
369
368
// does not exist yet, so we need to indirect this via DependencyCollector.
370
- auto DC = std::make_shared<PPCallbacksDependencyCollector >(
369
+ auto DC = std::make_shared<AttachOnlyDependencyCollector >(
371
370
[&Builder = current ()](Preprocessor &PP) {
372
371
return std::make_unique<IncludeTreePPCallbacks>(Builder, PP);
372
+ },
373
+ [](ASTReader &R) {
374
+ return std::make_unique<LookupPCHModulesListener>(R);
373
375
});
374
376
ModuleScanInstance.addDependencyCollector (std::move (DC));
375
377
0 commit comments