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