Skip to content

Commit c4fcee0

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 abcc134 commit c4fcee0

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
@@ -687,88 +687,6 @@ ModuleDependencyScanner::getMainModuleDependencyInfo(ModuleDecl *mainModule) {
687687
return mainDependencies;
688688
}
689689

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

1005+
// When querying a *clang* module 'CxxStdlib' we must
1006+
// instead expect a module called 'std'...
1007+
auto addCanonicalClangModuleImport =
1008+
[this](const ScannerImportStatementInfo &importInfo,
1009+
std::vector<ScannerImportStatementInfo> &unresolvedImports,
1010+
llvm::StringSet<> &unresolvedImportIdentifiers) {
1011+
if (importInfo.importIdentifier ==
1012+
ScanASTContext.Id_CxxStdlib.str()) {
1013+
auto canonicalImportInfo = ScannerImportStatementInfo(
1014+
"std", importInfo.isExported, importInfo.importLocations);
1015+
unresolvedImports.push_back(canonicalImportInfo);
1016+
unresolvedImportIdentifiers.insert(
1017+
canonicalImportInfo.importIdentifier);
1018+
} else {
1019+
unresolvedImports.push_back(importInfo);
1020+
unresolvedImportIdentifiers.insert(importInfo.importIdentifier);
1021+
}
1022+
};
1023+
10861024
for (const auto &depImport : moduleDependencyInfo.getModuleImports())
1087-
if (!resolvedImportIdentifiers.contains(depImport.importIdentifier)) {
1088-
unresolvedImports->push_back(depImport);
1089-
unresolvedImportIdentifiers.insert(depImport.importIdentifier);
1090-
}
1091-
for (const auto &depImport : moduleDependencyInfo.getOptionalModuleImports())
1092-
if (!resolvedImportIdentifiers.contains(depImport.importIdentifier)) {
1093-
unresolvedOptionalImports->push_back(depImport);
1094-
unresolvedOptionalImportIdentifiers.insert(depImport.importIdentifier);
1095-
}
1025+
if (!resolvedImportIdentifiers.contains(depImport.importIdentifier))
1026+
addCanonicalClangModuleImport(depImport, *unresolvedImports,
1027+
unresolvedImportIdentifiers);
1028+
for (const auto &depImport :
1029+
moduleDependencyInfo.getOptionalModuleImports())
1030+
if (!resolvedImportIdentifiers.contains(depImport.importIdentifier))
1031+
addCanonicalClangModuleImport(depImport, *unresolvedOptionalImports,
1032+
unresolvedOptionalImportIdentifiers);
10961033
}
10971034
}
10981035

lib/DependencyScan/ScanDependencies.cpp

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

14051405
if (langOpts.EnableCXXInterop) {
14061406
auto OptionalCxxDep = cache.findDependency(CXX_MODULE_NAME);
1407-
auto OptionalCxxStdLibDep = cache.findDependency("CxxStdlib");
1407+
auto OptionalCxxStdLibDep =
1408+
cache.findDependency(instance.getASTContext().Id_CxxStdlib.str());
14081409
bool hasStaticCxx =
14091410
OptionalCxxDep.has_value() && OptionalCxxDep.value()->isStaticLibrary();
14101411
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)