Skip to content

Commit 8140cbe

Browse files
authored
Merge pull request #81682 from artemcm/CxxUnderlyingStdLibLookupRemap_62
[6.2 🍒][Dependency Scanning][C++ Interop] Remap lookup of Clang module `CxxStdlib` to `std`
2 parents 3db1314 + 93da5b4 commit 8140cbe

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)