@@ -192,14 +192,15 @@ updateModuleCacheKey(ModuleDependencyInfo &depInfo,
192
192
}
193
193
194
194
static llvm::Error resolveExplicitModuleInputs (
195
- ModuleDependencyID moduleID, const ModuleDependencyInfo &resolvingDepInfo,
195
+ ModuleDependencyID moduleID,
196
196
const std::set<ModuleDependencyID> &dependencies,
197
197
ModuleDependenciesCache &cache, CompilerInstance &instance,
198
198
std::optional<std::set<ModuleDependencyID>> bridgingHeaderDeps) {
199
199
// Only need to resolve dependency for following dependencies.
200
200
if (moduleID.Kind == ModuleDependencyKind::SwiftPlaceholder)
201
201
return llvm::Error::success ();
202
202
203
+ auto &resolvingDepInfo = cache.findKnownDependency (moduleID);
203
204
// If the dependency is already finalized, nothing needs to be done.
204
205
if (resolvingDepInfo.isFinalized ())
205
206
return llvm::Error::success ();
@@ -242,13 +243,10 @@ static llvm::Error resolveExplicitModuleInputs(
242
243
243
244
std::vector<std::string> commandLine = resolvingDepInfo.getCommandline ();
244
245
for (const auto &depModuleID : dependencies) {
245
- const auto optionalDepInfo =
246
- cache.findDependency (depModuleID);
247
- assert (optionalDepInfo.has_value ());
248
- const auto depInfo = optionalDepInfo.value ();
246
+ const auto &depInfo = cache.findKnownDependency (depModuleID);
249
247
switch (depModuleID.Kind ) {
250
248
case swift::ModuleDependencyKind::SwiftInterface: {
251
- auto interfaceDepDetails = depInfo-> getAsSwiftInterfaceModule ();
249
+ auto interfaceDepDetails = depInfo. getAsSwiftInterfaceModule ();
252
250
assert (interfaceDepDetails && " Expected Swift Interface dependency." );
253
251
auto &path = interfaceDepDetails->moduleCacheKey .empty ()
254
252
? interfaceDepDetails->moduleOutputPath
@@ -257,7 +255,7 @@ static llvm::Error resolveExplicitModuleInputs(
257
255
path);
258
256
} break ;
259
257
case swift::ModuleDependencyKind::SwiftBinary: {
260
- auto binaryDepDetails = depInfo-> getAsSwiftBinaryModule ();
258
+ auto binaryDepDetails = depInfo. getAsSwiftBinaryModule ();
261
259
assert (binaryDepDetails && " Expected Swift Binary Module dependency." );
262
260
auto &path = binaryDepDetails->moduleCacheKey .empty ()
263
261
? binaryDepDetails->compiledModulePath
@@ -266,13 +264,13 @@ static llvm::Error resolveExplicitModuleInputs(
266
264
path);
267
265
} break ;
268
266
case swift::ModuleDependencyKind::SwiftPlaceholder: {
269
- auto placeholderDetails = depInfo-> getAsPlaceholderDependencyModule ();
267
+ auto placeholderDetails = depInfo. getAsPlaceholderDependencyModule ();
270
268
assert (placeholderDetails && " Expected Swift Placeholder dependency." );
271
269
commandLine.push_back (" -swift-module-file=" + depModuleID.ModuleName + " =" +
272
270
placeholderDetails->compiledModulePath );
273
271
} break ;
274
272
case swift::ModuleDependencyKind::Clang: {
275
- auto clangDepDetails = depInfo-> getAsClangModule ();
273
+ auto clangDepDetails = depInfo. getAsClangModule ();
276
274
assert (clangDepDetails && " Expected Clang Module dependency." );
277
275
if (!resolvingDepInfo.isClangModule ()) {
278
276
commandLine.push_back (" -Xcc" );
@@ -296,13 +294,13 @@ static llvm::Error resolveExplicitModuleInputs(
296
294
}
297
295
298
296
// Only need to merge the CASFS from clang importer.
299
- if (auto ID = depInfo-> getCASFSRootID ())
297
+ if (auto ID = depInfo. getCASFSRootID ())
300
298
rootIDs.push_back (*ID);
301
- if (auto ID = depInfo-> getClangIncludeTree ())
299
+ if (auto ID = depInfo. getClangIncludeTree ())
302
300
includeTrees.push_back (*ID);
303
301
} break ;
304
302
case swift::ModuleDependencyKind::SwiftSource: {
305
- if (auto E = addBridgingHeaderDeps (* depInfo))
303
+ if (auto E = addBridgingHeaderDeps (depInfo))
306
304
return E;
307
305
break ;
308
306
}
@@ -383,9 +381,8 @@ static llvm::Error resolveExplicitModuleInputs(
383
381
std::vector<std::string> newCommandLine =
384
382
dependencyInfoCopy.getBridgingHeaderCommandline ();
385
383
for (auto bridgingDep : *bridgingHeaderDeps) {
386
- auto dep = cache.findDependency (bridgingDep);
387
- assert (dep && " unknown clang dependency" );
388
- auto *clangDep = (*dep)->getAsClangModule ();
384
+ auto &dep = cache.findKnownDependency (bridgingDep);
385
+ auto *clangDep = dep.getAsClangModule ();
389
386
assert (clangDep && " wrong module dependency kind" );
390
387
if (!clangDep->moduleCacheKey .empty ()) {
391
388
newCommandLine.push_back (" -Xcc" );
@@ -399,19 +396,11 @@ static llvm::Error resolveExplicitModuleInputs(
399
396
dependencyInfoCopy.updateBridgingHeaderCommandLine (newCommandLine);
400
397
}
401
398
402
- if (resolvingDepInfo.isClangModule () ||
403
- resolvingDepInfo.isSwiftInterfaceModule ()) {
404
- // Compute and update module cache key.
405
- auto Key = updateModuleCacheKey (dependencyInfoCopy, cache, CAS);
406
- if (!Key)
407
- return Key.takeError ();
408
- }
409
-
410
- // For binary module, we need to make sure the lookup key is setup here in
411
- // action cache. We just use the CASID of the binary module itself as key.
412
- if (auto *binaryDep = dependencyInfoCopy.getAsSwiftBinaryModule ()) {
413
- auto Ref =
414
- CASFS.getObjectRefForFileContent (binaryDep->compiledModulePath );
399
+ // Compute and update module cache key.
400
+ auto setupBinaryCacheKey = [&](StringRef path) -> llvm::Error {
401
+ // For binary module, we need to make sure the lookup key is setup here in
402
+ // action cache. We just use the CASID of the binary module itself as key.
403
+ auto Ref = CASFS.getObjectRefForFileContent (path);
415
404
if (!Ref)
416
405
return llvm::errorCodeToError (Ref.getError ());
417
406
assert (*Ref && " Binary module should be loaded into CASFS already" );
@@ -425,30 +414,44 @@ static llvm::Error resolveExplicitModuleInputs(
425
414
if (auto E = instance.getActionCache ().put (CAS.getID (**Ref),
426
415
CAS.getID (*Result)))
427
416
return E;
417
+ return llvm::Error::success ();
418
+ };
419
+
420
+ if (resolvingDepInfo.isClangModule () ||
421
+ resolvingDepInfo.isSwiftInterfaceModule ()) {
422
+ auto Key = updateModuleCacheKey (dependencyInfoCopy, cache, CAS);
423
+ if (!Key)
424
+ return Key.takeError ();
425
+ } else if (auto *binaryDep = dependencyInfoCopy.getAsSwiftBinaryModule ()) {
426
+ if (auto E = setupBinaryCacheKey (binaryDep->compiledModulePath ))
427
+ return E;
428
428
}
429
429
}
430
+
430
431
dependencyInfoCopy.setIsFinalized (true );
431
432
cache.updateDependency (moduleID, dependencyInfoCopy);
432
433
433
434
return llvm::Error::success ();
434
435
}
435
436
436
- static llvm::Error pruneUnusedVFSOverlays (
437
- ModuleDependencyID moduleID, const ModuleDependencyInfo &resolvingDepInfo,
438
- const std::set<ModuleDependencyID> &dependencies,
439
- ModuleDependenciesCache &cache, CompilerInstance &instance) {
437
+ static llvm::Error
438
+ pruneUnusedVFSOverlays (ModuleDependencyID moduleID,
439
+ const std::set<ModuleDependencyID> &dependencies,
440
+ ModuleDependenciesCache &cache,
441
+ CompilerInstance &instance) {
442
+ // Pruning of unused VFS overlay options for Clang dependencies
443
+ // is performed by the Clang dependency scanner.
444
+ if (moduleID.Kind == ModuleDependencyKind::Clang)
445
+ return llvm::Error::success ();
446
+
440
447
auto isVFSOverlayFlag = [](StringRef arg) {
441
448
return arg == " -ivfsoverlay" || arg == " -vfsoverlay" ;
442
449
};
443
450
auto isXCCArg = [](StringRef arg) {
444
451
return arg == " -Xcc" ;
445
452
};
446
453
447
- // Pruning of unused VFS overlay options for Clang dependencies
448
- // is performed by the Clang dependency scanner.
449
- if (!resolvingDepInfo.isSwiftModule ())
450
- return llvm::Error::success ();
451
-
454
+ auto &resolvingDepInfo = cache.findKnownDependency (moduleID);
452
455
// If this Swift dependency contains any VFS overlay paths,
453
456
// then attempt to prune the ones not used by any of the Clang dependencies.
454
457
if (!llvm::any_of (resolvingDepInfo.getCommandline (),
@@ -462,10 +465,8 @@ static llvm::Error pruneUnusedVFSOverlays(
462
465
// pruned by the Clang dependency scanner.
463
466
llvm::StringSet<> usedVFSOverlayPaths;
464
467
for (const auto &depModuleID : dependencies) {
465
- const auto optionalDepInfo = cache.findDependency (depModuleID);
466
- assert (optionalDepInfo.has_value ());
467
- const auto depInfo = optionalDepInfo.value ();
468
- if (auto clangDepDetails = depInfo->getAsClangModule ()) {
468
+ const auto &depInfo = cache.findKnownDependency (depModuleID);
469
+ if (auto clangDepDetails = depInfo.getAsClangModule ()) {
469
470
const auto &depCommandLine = clangDepDetails->buildCommandLine ;
470
471
// true if the previous argument was the dash-option of an option pair
471
472
bool getNext = false ;
@@ -1151,24 +1152,17 @@ generateFullDependencyGraph(const CompilerInstance &instance,
1151
1152
1152
1153
for (size_t i = 0 ; i < allModules.size (); ++i) {
1153
1154
const auto &module = allModules[i];
1154
- // Grab the completed module dependencies.
1155
- auto moduleDepsQuery = cache.findDependency (module );
1156
- if (!moduleDepsQuery) {
1157
- llvm::report_fatal_error (Twine (" Module Dependency Cache missing module" ) +
1158
- module .ModuleName );
1159
- }
1160
-
1161
- auto moduleDeps = *moduleDepsQuery;
1155
+ auto &moduleDeps = cache.findKnownDependency (module );
1162
1156
// Collect all the required pieces to build a ModuleInfo
1163
- auto swiftPlaceholderDeps = moduleDeps-> getAsPlaceholderDependencyModule ();
1164
- auto swiftTextualDeps = moduleDeps-> getAsSwiftInterfaceModule ();
1165
- auto swiftSourceDeps = moduleDeps-> getAsSwiftSourceModule ();
1166
- auto swiftBinaryDeps = moduleDeps-> getAsSwiftBinaryModule ();
1167
- auto clangDeps = moduleDeps-> getAsClangModule ();
1157
+ auto swiftPlaceholderDeps = moduleDeps. getAsPlaceholderDependencyModule ();
1158
+ auto swiftTextualDeps = moduleDeps. getAsSwiftInterfaceModule ();
1159
+ auto swiftSourceDeps = moduleDeps. getAsSwiftSourceModule ();
1160
+ auto swiftBinaryDeps = moduleDeps. getAsSwiftBinaryModule ();
1161
+ auto clangDeps = moduleDeps. getAsClangModule ();
1168
1162
1169
1163
// ModulePath
1170
1164
const char *modulePathSuffix =
1171
- moduleDeps-> isSwiftModule () ? " .swiftmodule" : " .pcm" ;
1165
+ moduleDeps. isSwiftModule () ? " .swiftmodule" : " .pcm" ;
1172
1166
std::string modulePath;
1173
1167
if (swiftTextualDeps)
1174
1168
modulePath = swiftTextualDeps->moduleOutputPath ;
@@ -1189,10 +1183,8 @@ generateFullDependencyGraph(const CompilerInstance &instance,
1189
1183
sourceFiles = clangDeps->fileDependencies ;
1190
1184
}
1191
1185
1192
- auto optionalDepInfo = cache.findDependency (module );
1193
- assert (optionalDepInfo.has_value () && " Missing dependency info during graph generation diagnosis." );
1194
- auto depInfo = optionalDepInfo.value ();
1195
- auto directDependencies = depInfo->getDirectModuleDependencies ();
1186
+ auto &depInfo = cache.findKnownDependency (module );
1187
+ auto directDependencies = depInfo.getDirectModuleDependencies ();
1196
1188
1197
1189
// Generate a swiftscan_clang_details_t object based on the dependency kind
1198
1190
auto getModuleDetails = [&]() -> swiftscan_module_details_t {
@@ -1201,9 +1193,12 @@ generateFullDependencyGraph(const CompilerInstance &instance,
1201
1193
swiftscan_string_ref_t moduleInterfacePath =
1202
1194
create_clone (swiftTextualDeps->swiftInterfaceFile .c_str ());
1203
1195
swiftscan_string_ref_t bridgingHeaderPath =
1204
- swiftTextualDeps->textualModuleDetails .bridgingHeaderFile .has_value ()
1196
+ swiftTextualDeps->textualModuleDetails .bridgingHeaderFile
1197
+ .has_value ()
1205
1198
? create_clone (
1206
- swiftTextualDeps->textualModuleDetails .bridgingHeaderFile .value ().c_str ())
1199
+ swiftTextualDeps->textualModuleDetails .bridgingHeaderFile
1200
+ .value ()
1201
+ .c_str ())
1207
1202
: create_null ();
1208
1203
details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_TEXTUAL;
1209
1204
// Create an overlay dependencies set according to the output format
@@ -1407,12 +1402,12 @@ computeTransitiveClosureOfExplicitDependencies(
1407
1402
}
1408
1403
1409
1404
static std::set<ModuleDependencyID> computeBridgingHeaderTransitiveDependencies (
1410
- const ModuleDependencyInfo * dep,
1405
+ const ModuleDependencyInfo & dep,
1411
1406
const std::unordered_map<ModuleDependencyID, std::set<ModuleDependencyID>>
1412
1407
&transitiveClosures,
1413
1408
const ModuleDependenciesCache &cache) {
1414
1409
std::set<ModuleDependencyID> result;
1415
- auto *sourceDep = dep-> getAsSwiftSourceModule ();
1410
+ auto *sourceDep = dep. getAsSwiftSourceModule ();
1416
1411
if (!sourceDep)
1417
1412
return result;
1418
1413
@@ -1863,22 +1858,19 @@ static void resolveDependencyCommandLineArguments(
1863
1858
// For main module or binary modules, no command-line to resolve.
1864
1859
// For Clang modules, their dependencies are resolved by the clang Scanner
1865
1860
// itself for us.
1866
- auto optionalDeps = cache.findDependency (modID);
1867
- assert (optionalDeps.has_value ());
1868
- auto deps = optionalDeps.value ();
1861
+ auto &deps = cache.findKnownDependency (modID);
1869
1862
std::optional<std::set<ModuleDependencyID>> bridgingHeaderDeps;
1870
1863
if (modID.Kind == ModuleDependencyKind::SwiftSource)
1871
1864
bridgingHeaderDeps = computeBridgingHeaderTransitiveDependencies (
1872
1865
deps, moduleTransitiveClosures, cache);
1873
1866
1874
- if (auto E =
1875
- resolveExplicitModuleInputs (modID, *deps, dependencyClosure, cache,
1876
- instance, bridgingHeaderDeps))
1867
+ if (auto E = resolveExplicitModuleInputs (modID, dependencyClosure, cache,
1868
+ instance, bridgingHeaderDeps))
1877
1869
instance.getDiags ().diagnose (SourceLoc (), diag::error_cas,
1878
1870
toString (std::move (E)));
1879
1871
1880
- if (auto E = pruneUnusedVFSOverlays (modID, *deps, dependencyClosure,
1881
- cache, instance))
1872
+ if (auto E =
1873
+ pruneUnusedVFSOverlays (modID, dependencyClosure, cache, instance))
1882
1874
instance.getDiags ().diagnose (SourceLoc (), diag::error_cas,
1883
1875
toString (std::move (E)));
1884
1876
}
0 commit comments