@@ -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
@@ -280,13 +278,13 @@ static llvm::Error resolveExplicitModuleInputs(
280
278
}
281
279
} break ;
282
280
case swift::ModuleDependencyKind::SwiftPlaceholder: {
283
- auto placeholderDetails = depInfo-> getAsPlaceholderDependencyModule ();
281
+ auto placeholderDetails = depInfo. getAsPlaceholderDependencyModule ();
284
282
assert (placeholderDetails && " Expected Swift Placeholder dependency." );
285
283
commandLine.push_back (" -swift-module-file=" + depModuleID.ModuleName + " =" +
286
284
placeholderDetails->compiledModulePath );
287
285
} break ;
288
286
case swift::ModuleDependencyKind::Clang: {
289
- auto clangDepDetails = depInfo-> getAsClangModule ();
287
+ auto clangDepDetails = depInfo. getAsClangModule ();
290
288
assert (clangDepDetails && " Expected Clang Module dependency." );
291
289
if (!resolvingDepInfo.isClangModule ()) {
292
290
commandLine.push_back (" -Xcc" );
@@ -303,13 +301,13 @@ static llvm::Error resolveExplicitModuleInputs(
303
301
}
304
302
305
303
// Only need to merge the CASFS from clang importer.
306
- if (auto ID = depInfo-> getCASFSRootID ())
304
+ if (auto ID = depInfo. getCASFSRootID ())
307
305
rootIDs.push_back (*ID);
308
- if (auto ID = depInfo-> getClangIncludeTree ())
306
+ if (auto ID = depInfo. getClangIncludeTree ())
309
307
includeTrees.push_back (*ID);
310
308
} break ;
311
309
case swift::ModuleDependencyKind::SwiftSource: {
312
- if (auto E = addBridgingHeaderDeps (* depInfo))
310
+ if (auto E = addBridgingHeaderDeps (depInfo))
313
311
return E;
314
312
break ;
315
313
}
@@ -390,9 +388,8 @@ static llvm::Error resolveExplicitModuleInputs(
390
388
std::vector<std::string> newCommandLine =
391
389
dependencyInfoCopy.getBridgingHeaderCommandline ();
392
390
for (auto bridgingDep : *bridgingHeaderDeps) {
393
- auto dep = cache.findDependency (bridgingDep);
394
- assert (dep && " unknown clang dependency" );
395
- auto *clangDep = (*dep)->getAsClangModule ();
391
+ auto &dep = cache.findKnownDependency (bridgingDep);
392
+ auto *clangDep = dep.getAsClangModule ();
396
393
assert (clangDep && " wrong module dependency kind" );
397
394
if (!clangDep->moduleCacheKey .empty ()) {
398
395
newCommandLine.push_back (" -Xcc" );
@@ -406,19 +403,11 @@ static llvm::Error resolveExplicitModuleInputs(
406
403
dependencyInfoCopy.updateBridgingHeaderCommandLine (newCommandLine);
407
404
}
408
405
409
- if (resolvingDepInfo.isClangModule () ||
410
- resolvingDepInfo.isSwiftInterfaceModule ()) {
411
- // Compute and update module cache key.
412
- auto Key = updateModuleCacheKey (dependencyInfoCopy, cache, CAS);
413
- if (!Key)
414
- return Key.takeError ();
415
- }
416
-
417
- // For binary module, we need to make sure the lookup key is setup here in
418
- // action cache. We just use the CASID of the binary module itself as key.
419
- if (auto *binaryDep = dependencyInfoCopy.getAsSwiftBinaryModule ()) {
420
- auto Ref =
421
- CASFS.getObjectRefForFileContent (binaryDep->compiledModulePath );
406
+ // Compute and update module cache key.
407
+ auto setupBinaryCacheKey = [&](StringRef path) -> llvm::Error {
408
+ // For binary module, we need to make sure the lookup key is setup here in
409
+ // action cache. We just use the CASID of the binary module itself as key.
410
+ auto Ref = CASFS.getObjectRefForFileContent (path);
422
411
if (!Ref)
423
412
return llvm::errorCodeToError (Ref.getError ());
424
413
assert (*Ref && " Binary module should be loaded into CASFS already" );
@@ -432,30 +421,44 @@ static llvm::Error resolveExplicitModuleInputs(
432
421
if (auto E = instance.getActionCache ().put (CAS.getID (**Ref),
433
422
CAS.getID (*Result)))
434
423
return E;
424
+ return llvm::Error::success ();
425
+ };
426
+
427
+ if (resolvingDepInfo.isClangModule () ||
428
+ resolvingDepInfo.isSwiftInterfaceModule ()) {
429
+ auto Key = updateModuleCacheKey (dependencyInfoCopy, cache, CAS);
430
+ if (!Key)
431
+ return Key.takeError ();
432
+ } else if (auto *binaryDep = dependencyInfoCopy.getAsSwiftBinaryModule ()) {
433
+ if (auto E = setupBinaryCacheKey (binaryDep->compiledModulePath ))
434
+ return E;
435
435
}
436
436
}
437
+
437
438
dependencyInfoCopy.setIsFinalized (true );
438
439
cache.updateDependency (moduleID, dependencyInfoCopy);
439
440
440
441
return llvm::Error::success ();
441
442
}
442
443
443
- static llvm::Error pruneUnusedVFSOverlays (
444
- ModuleDependencyID moduleID, const ModuleDependencyInfo &resolvingDepInfo,
445
- const std::set<ModuleDependencyID> &dependencies,
446
- ModuleDependenciesCache &cache, CompilerInstance &instance) {
444
+ static llvm::Error
445
+ pruneUnusedVFSOverlays (ModuleDependencyID moduleID,
446
+ const std::set<ModuleDependencyID> &dependencies,
447
+ ModuleDependenciesCache &cache,
448
+ CompilerInstance &instance) {
449
+ // Pruning of unused VFS overlay options for Clang dependencies
450
+ // is performed by the Clang dependency scanner.
451
+ if (moduleID.Kind == ModuleDependencyKind::Clang)
452
+ return llvm::Error::success ();
453
+
447
454
auto isVFSOverlayFlag = [](StringRef arg) {
448
455
return arg == " -ivfsoverlay" || arg == " -vfsoverlay" ;
449
456
};
450
457
auto isXCCArg = [](StringRef arg) {
451
458
return arg == " -Xcc" ;
452
459
};
453
460
454
- // Pruning of unused VFS overlay options for Clang dependencies
455
- // is performed by the Clang dependency scanner.
456
- if (!resolvingDepInfo.isSwiftModule ())
457
- return llvm::Error::success ();
458
-
461
+ auto &resolvingDepInfo = cache.findKnownDependency (moduleID);
459
462
// If this Swift dependency contains any VFS overlay paths,
460
463
// then attempt to prune the ones not used by any of the Clang dependencies.
461
464
if (!llvm::any_of (resolvingDepInfo.getCommandline (),
@@ -469,10 +472,8 @@ static llvm::Error pruneUnusedVFSOverlays(
469
472
// pruned by the Clang dependency scanner.
470
473
llvm::StringSet<> usedVFSOverlayPaths;
471
474
for (const auto &depModuleID : dependencies) {
472
- const auto optionalDepInfo = cache.findDependency (depModuleID);
473
- assert (optionalDepInfo.has_value ());
474
- const auto depInfo = optionalDepInfo.value ();
475
- if (auto clangDepDetails = depInfo->getAsClangModule ()) {
475
+ const auto &depInfo = cache.findKnownDependency (depModuleID);
476
+ if (auto clangDepDetails = depInfo.getAsClangModule ()) {
476
477
const auto &depCommandLine = clangDepDetails->buildCommandLine ;
477
478
// true if the previous argument was the dash-option of an option pair
478
479
bool getNext = false ;
@@ -1158,24 +1159,17 @@ generateFullDependencyGraph(const CompilerInstance &instance,
1158
1159
1159
1160
for (size_t i = 0 ; i < allModules.size (); ++i) {
1160
1161
const auto &module = allModules[i];
1161
- // Grab the completed module dependencies.
1162
- auto moduleDepsQuery = cache.findDependency (module );
1163
- if (!moduleDepsQuery) {
1164
- llvm::report_fatal_error (Twine (" Module Dependency Cache missing module" ) +
1165
- module .ModuleName );
1166
- }
1167
-
1168
- auto moduleDeps = *moduleDepsQuery;
1162
+ auto &moduleDeps = cache.findKnownDependency (module );
1169
1163
// Collect all the required pieces to build a ModuleInfo
1170
- auto swiftPlaceholderDeps = moduleDeps-> getAsPlaceholderDependencyModule ();
1171
- auto swiftTextualDeps = moduleDeps-> getAsSwiftInterfaceModule ();
1172
- auto swiftSourceDeps = moduleDeps-> getAsSwiftSourceModule ();
1173
- auto swiftBinaryDeps = moduleDeps-> getAsSwiftBinaryModule ();
1174
- auto clangDeps = moduleDeps-> getAsClangModule ();
1164
+ auto swiftPlaceholderDeps = moduleDeps. getAsPlaceholderDependencyModule ();
1165
+ auto swiftTextualDeps = moduleDeps. getAsSwiftInterfaceModule ();
1166
+ auto swiftSourceDeps = moduleDeps. getAsSwiftSourceModule ();
1167
+ auto swiftBinaryDeps = moduleDeps. getAsSwiftBinaryModule ();
1168
+ auto clangDeps = moduleDeps. getAsClangModule ();
1175
1169
1176
1170
// ModulePath
1177
1171
const char *modulePathSuffix =
1178
- moduleDeps-> isSwiftModule () ? " .swiftmodule" : " .pcm" ;
1172
+ moduleDeps. isSwiftModule () ? " .swiftmodule" : " .pcm" ;
1179
1173
std::string modulePath;
1180
1174
if (swiftTextualDeps)
1181
1175
modulePath = swiftTextualDeps->moduleOutputPath ;
@@ -1196,10 +1190,8 @@ generateFullDependencyGraph(const CompilerInstance &instance,
1196
1190
sourceFiles = clangDeps->fileDependencies ;
1197
1191
}
1198
1192
1199
- auto optionalDepInfo = cache.findDependency (module );
1200
- assert (optionalDepInfo.has_value () && " Missing dependency info during graph generation diagnosis." );
1201
- auto depInfo = optionalDepInfo.value ();
1202
- auto directDependencies = depInfo->getDirectModuleDependencies ();
1193
+ auto &depInfo = cache.findKnownDependency (module );
1194
+ auto directDependencies = depInfo.getDirectModuleDependencies ();
1203
1195
1204
1196
// Generate a swiftscan_clang_details_t object based on the dependency kind
1205
1197
auto getModuleDetails = [&]() -> swiftscan_module_details_t {
@@ -1208,9 +1200,12 @@ generateFullDependencyGraph(const CompilerInstance &instance,
1208
1200
swiftscan_string_ref_t moduleInterfacePath =
1209
1201
create_clone (swiftTextualDeps->swiftInterfaceFile .c_str ());
1210
1202
swiftscan_string_ref_t bridgingHeaderPath =
1211
- swiftTextualDeps->textualModuleDetails .bridgingHeaderFile .has_value ()
1203
+ swiftTextualDeps->textualModuleDetails .bridgingHeaderFile
1204
+ .has_value ()
1212
1205
? create_clone (
1213
- swiftTextualDeps->textualModuleDetails .bridgingHeaderFile .value ().c_str ())
1206
+ swiftTextualDeps->textualModuleDetails .bridgingHeaderFile
1207
+ .value ()
1208
+ .c_str ())
1214
1209
: create_null ();
1215
1210
details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_TEXTUAL;
1216
1211
// Create an overlay dependencies set according to the output format
@@ -1414,12 +1409,12 @@ computeTransitiveClosureOfExplicitDependencies(
1414
1409
}
1415
1410
1416
1411
static std::set<ModuleDependencyID> computeBridgingHeaderTransitiveDependencies (
1417
- const ModuleDependencyInfo * dep,
1412
+ const ModuleDependencyInfo & dep,
1418
1413
const std::unordered_map<ModuleDependencyID, std::set<ModuleDependencyID>>
1419
1414
&transitiveClosures,
1420
1415
const ModuleDependenciesCache &cache) {
1421
1416
std::set<ModuleDependencyID> result;
1422
- auto *sourceDep = dep-> getAsSwiftSourceModule ();
1417
+ auto *sourceDep = dep. getAsSwiftSourceModule ();
1423
1418
if (!sourceDep)
1424
1419
return result;
1425
1420
@@ -1871,22 +1866,19 @@ static void resolveDependencyCommandLineArguments(
1871
1866
// For main module or binary modules, no command-line to resolve.
1872
1867
// For Clang modules, their dependencies are resolved by the clang Scanner
1873
1868
// itself for us.
1874
- auto optionalDeps = cache.findDependency (modID);
1875
- assert (optionalDeps.has_value ());
1876
- auto deps = optionalDeps.value ();
1869
+ auto &deps = cache.findKnownDependency (modID);
1877
1870
std::optional<std::set<ModuleDependencyID>> bridgingHeaderDeps;
1878
1871
if (modID.Kind == ModuleDependencyKind::SwiftSource)
1879
1872
bridgingHeaderDeps = computeBridgingHeaderTransitiveDependencies (
1880
1873
deps, moduleTransitiveClosures, cache);
1881
1874
1882
- if (auto E =
1883
- resolveExplicitModuleInputs (modID, *deps, dependencyClosure, cache,
1884
- instance, bridgingHeaderDeps))
1875
+ if (auto E = resolveExplicitModuleInputs (modID, dependencyClosure, cache,
1876
+ instance, bridgingHeaderDeps))
1885
1877
instance.getDiags ().diagnose (SourceLoc (), diag::error_cas,
1886
1878
toString (std::move (E)));
1887
1879
1888
- if (auto E = pruneUnusedVFSOverlays (modID, *deps, dependencyClosure,
1889
- cache, instance))
1880
+ if (auto E =
1881
+ pruneUnusedVFSOverlays (modID, dependencyClosure, cache, instance))
1890
1882
instance.getDiags ().diagnose (SourceLoc (), diag::error_cas,
1891
1883
toString (std::move (E)));
1892
1884
}
0 commit comments