Skip to content

Commit 16c3ab5

Browse files
authored
Merge pull request #81651 from artemcm/CxxUnderlyingStdLibLookupRemap
[Dependency Scanning][C++ Interop] Remap lookup of Clang module `CxxStdlib` to `std`
2 parents a7830d7 + c4fcee0 commit 16c3ab5

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)