Skip to content

Commit 93da5b4

Browse files
committed
[Dependency Scanning][C++ Interop] Remap lookup of Clang module 'CxxStdlib' to 'std'
Otherwise querying this clang module, e.g. from the corresponding Swift overlay's underlying module import, will fail, since no such module exists. Resolves rdar://151718115
1 parent 86699a2 commit 93da5b4

File tree

5 files changed

+71
-106
lines changed

5 files changed

+71
-106
lines changed

include/swift/AST/ModuleDependencies.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ struct ScannerImportStatementInfo {
164164
: importLocations({location}), importIdentifier(importIdentifier),
165165
isExported(isExported) {}
166166

167+
ScannerImportStatementInfo(std::string importIdentifier, bool isExported,
168+
SmallVector<ImportDiagnosticLocationInfo, 4> locations)
169+
: importLocations(locations), importIdentifier(importIdentifier),
170+
isExported(isExported) {}
171+
167172
void addImportLocation(ImportDiagnosticLocationInfo location) {
168173
importLocations.push_back(location);
169174
}

include/swift/DependencyScan/ModuleDependencyScanner.h

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,6 @@ class ModuleDependencyScanner {
128128
performDependencyScan(ModuleDependencyID rootModuleID,
129129
ModuleDependenciesCache &cache);
130130

131-
/// Query the module dependency info for the Clang module with the given name.
132-
/// Explicit by-name lookups are useful for batch mode scanning.
133-
std::optional<const ModuleDependencyInfo *>
134-
getNamedClangModuleDependencyInfo(StringRef moduleName,
135-
ModuleDependenciesCache &cache,
136-
ModuleDependencyIDSetVector &discoveredClangModules);
137-
138-
/// Query the module dependency info for the Swift module with the given name.
139-
/// Explicit by-name lookups are useful for batch mode scanning.
140-
std::optional<const ModuleDependencyInfo *>
141-
getNamedSwiftModuleDependencyInfo(StringRef moduleName,
142-
ModuleDependenciesCache &cache);
143-
144131
/// How many filesystem lookups were performed by the scanner
145132
unsigned getNumLookups() { return NumLookups; }
146133

lib/DependencyScan/ModuleDependencyScanner.cpp

Lines changed: 29 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -695,88 +695,6 @@ ModuleDependencyScanner::getMainModuleDependencyInfo(ModuleDecl *mainModule) {
695695
return mainDependencies;
696696
}
697697

698-
/// Retrieve the module dependencies for the Clang module with the given name.
699-
std::optional<const ModuleDependencyInfo *>
700-
ModuleDependencyScanner::getNamedClangModuleDependencyInfo(
701-
StringRef moduleName, ModuleDependenciesCache &cache,
702-
ModuleDependencyIDSetVector &discoveredClangModules) {
703-
// Check whether we've cached this result.
704-
auto moduleID = ModuleDependencyID{moduleName.str(),
705-
ModuleDependencyKind::Clang};
706-
if (auto found = cache.findDependency(moduleID)) {
707-
discoveredClangModules.insert(moduleID);
708-
auto directClangDeps = cache.getImportedClangDependencies(moduleID);
709-
ModuleDependencyIDSetVector reachableClangModules;
710-
reachableClangModules.insert(directClangDeps.begin(),
711-
directClangDeps.end());
712-
for (unsigned currentModuleIdx = 0;
713-
currentModuleIdx < reachableClangModules.size();
714-
++currentModuleIdx) {
715-
auto moduleID = reachableClangModules[currentModuleIdx];
716-
auto dependencies =
717-
cache.findKnownDependency(moduleID).getImportedClangDependencies();
718-
reachableClangModules.insert(dependencies.begin(), dependencies.end());
719-
}
720-
discoveredClangModules.insert(reachableClangModules.begin(),
721-
reachableClangModules.end());
722-
return found;
723-
}
724-
725-
// Otherwise perform filesystem scan
726-
auto moduleIdentifier = getModuleImportIdentifier(moduleName);
727-
auto moduleDependencies = withDependencyScanningWorker(
728-
[&cache, moduleIdentifier](ModuleDependencyScanningWorker *ScanningWorker) {
729-
return ScanningWorker->scanFilesystemForClangModuleDependency(
730-
moduleIdentifier, cache.getModuleOutputPath(),
731-
cache.getSDKModuleOutputPath(),
732-
cache.getAlreadySeenClangModules(),
733-
cache.getScanService().getPrefixMapper());
734-
});
735-
if (moduleDependencies.empty())
736-
return std::nullopt;
737-
738-
discoveredClangModules.insert(moduleID);
739-
for (const auto &dep : moduleDependencies)
740-
discoveredClangModules.insert(dep.first);
741-
742-
cache.recordDependencies(moduleDependencies, Diagnostics);
743-
return cache.findDependency(moduleID);
744-
}
745-
746-
/// Retrieve the module dependencies for the Swift module with the given name.
747-
std::optional<const ModuleDependencyInfo *>
748-
ModuleDependencyScanner::getNamedSwiftModuleDependencyInfo(
749-
StringRef moduleName, ModuleDependenciesCache &cache) {
750-
// Check whether we've cached this result.
751-
if (auto found =
752-
cache.findDependency(moduleName, ModuleDependencyKind::SwiftSource))
753-
return found;
754-
if (auto found = cache.findDependency(moduleName,
755-
ModuleDependencyKind::SwiftInterface))
756-
return found;
757-
if (auto found =
758-
cache.findDependency(moduleName, ModuleDependencyKind::SwiftBinary))
759-
return found;
760-
if (auto found = cache.findDependency(moduleName,
761-
ModuleDependencyKind::SwiftPlaceholder))
762-
return found;
763-
764-
// Otherwise perform filesystem scan
765-
auto moduleIdentifier = getModuleImportIdentifier(moduleName);
766-
auto moduleDependencies = withDependencyScanningWorker(
767-
[&cache, moduleIdentifier](ModuleDependencyScanningWorker *ScanningWorker) {
768-
return ScanningWorker->scanFilesystemForSwiftModuleDependency(
769-
moduleIdentifier, cache.getModuleOutputPath(),
770-
cache.getSDKModuleOutputPath(),
771-
cache.getScanService().getPrefixMapper());
772-
});
773-
if (moduleDependencies.empty())
774-
return std::nullopt;
775-
776-
cache.recordDependencies(moduleDependencies, Diagnostics);
777-
return cache.findDependency(moduleName);
778-
}
779-
780698
/// For the dependency set of the main module, discover all
781699
/// cross-import overlays and their corresponding '.swiftcrossimport'
782700
/// files. Cross-import overlay dependencies are required when
@@ -1088,19 +1006,38 @@ void ModuleDependencyScanner::resolveAllClangModuleDependencies(
10881006
// We need to query the Clang dependency scanner for this module's
10891007
// unresolved imports
10901008
llvm::StringSet<> resolvedImportIdentifiers;
1091-
for (const auto &resolvedDep : moduleDependencyInfo.getImportedSwiftDependencies())
1009+
for (const auto &resolvedDep :
1010+
moduleDependencyInfo.getImportedSwiftDependencies())
10921011
resolvedImportIdentifiers.insert(resolvedDep.ModuleName);
10931012

1013+
// When querying a *clang* module 'CxxStdlib' we must
1014+
// instead expect a module called 'std'...
1015+
auto addCanonicalClangModuleImport =
1016+
[this](const ScannerImportStatementInfo &importInfo,
1017+
std::vector<ScannerImportStatementInfo> &unresolvedImports,
1018+
llvm::StringSet<> &unresolvedImportIdentifiers) {
1019+
if (importInfo.importIdentifier ==
1020+
ScanASTContext.Id_CxxStdlib.str()) {
1021+
auto canonicalImportInfo = ScannerImportStatementInfo(
1022+
"std", importInfo.isExported, importInfo.importLocations);
1023+
unresolvedImports.push_back(canonicalImportInfo);
1024+
unresolvedImportIdentifiers.insert(
1025+
canonicalImportInfo.importIdentifier);
1026+
} else {
1027+
unresolvedImports.push_back(importInfo);
1028+
unresolvedImportIdentifiers.insert(importInfo.importIdentifier);
1029+
}
1030+
};
1031+
10941032
for (const auto &depImport : moduleDependencyInfo.getModuleImports())
1095-
if (!resolvedImportIdentifiers.contains(depImport.importIdentifier)) {
1096-
unresolvedImports->push_back(depImport);
1097-
unresolvedImportIdentifiers.insert(depImport.importIdentifier);
1098-
}
1099-
for (const auto &depImport : moduleDependencyInfo.getOptionalModuleImports())
1100-
if (!resolvedImportIdentifiers.contains(depImport.importIdentifier)) {
1101-
unresolvedOptionalImports->push_back(depImport);
1102-
unresolvedOptionalImportIdentifiers.insert(depImport.importIdentifier);
1103-
}
1033+
if (!resolvedImportIdentifiers.contains(depImport.importIdentifier))
1034+
addCanonicalClangModuleImport(depImport, *unresolvedImports,
1035+
unresolvedImportIdentifiers);
1036+
for (const auto &depImport :
1037+
moduleDependencyInfo.getOptionalModuleImports())
1038+
if (!resolvedImportIdentifiers.contains(depImport.importIdentifier))
1039+
addCanonicalClangModuleImport(depImport, *unresolvedOptionalImports,
1040+
unresolvedOptionalImportIdentifiers);
11041041
}
11051042
}
11061043

lib/DependencyScan/ScanDependencies.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1377,7 +1377,8 @@ static void resolveImplicitLinkLibraries(const CompilerInstance &instance,
13771377

13781378
if (langOpts.EnableCXXInterop) {
13791379
auto OptionalCxxDep = cache.findDependency(CXX_MODULE_NAME);
1380-
auto OptionalCxxStdLibDep = cache.findDependency("CxxStdlib");
1380+
auto OptionalCxxStdLibDep =
1381+
cache.findDependency(instance.getASTContext().Id_CxxStdlib.str());
13811382
bool hasStaticCxx =
13821383
OptionalCxxDep.has_value() && OptionalCxxDep.value()->isStaticLibrary();
13831384
bool hasStaticCxxStdlib = OptionalCxxStdLibDep.has_value() &&
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// RUN: %empty-directory(%t)
2+
3+
// RUN: %target-swift-frontend -scan-dependencies -o %t/deps.json %s -cxx-interoperability-mode=default -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import
4+
// RUN: %validate-json %t/deps.json | %FileCheck %s
5+
6+
// rdar://151780437: libstdc++ VFS modulemap redirects not functioning with EBM enabled
7+
// REQUIRES: OS=macosx
8+
9+
import CxxStdlib
10+
11+
// CHECK: "mainModuleName": "deps"
12+
13+
/// --------Main module
14+
// CHECK-LABEL: "modulePath": "deps.swiftmodule",
15+
// CHECK-NEXT: "sourceFiles": [
16+
// CHECK-NEXT: cxx-overlay-underlying-module-lookup.swift
17+
// CHECK-NEXT: ],
18+
19+
// CHECK-NEXT: "directDependencies": [
20+
// CHECK-DAG: "clang": "CxxShim"
21+
// CHECK-DAG: "swift": "CxxStdlib"
22+
// CHECK-DAG: "swift": "Cxx"
23+
// CHECK-DAG: "swift": "Swift"
24+
// CHECK-DAG: "swift": "SwiftOnoneSupport"
25+
// CHECK: ],
26+
27+
/// ----------
28+
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}CxxStdlib-{{.*}}.swiftmodule"
29+
// CHECK-NEXT: "sourceFiles": []
30+
// CHECK-NEXT: "directDependencies": [
31+
// CHECK-DAG: "swift": "Cxx"
32+
// CHECK-DAG: "swift": "Swift"
33+
// CHECK-DAG: "clang": "std"
34+
// CHECK-DAG: "clang": "CxxStdlibShim"
35+
// CHECK: ],

0 commit comments

Comments
 (0)