Skip to content

Commit 0666887

Browse files
authored
Merge pull request #69247 from artemcm/DepScanFixOverlayDeps
[Dependency Scanning] Handle binary module dependencies' Swift overlay dependencies
2 parents e364b23 + 9615729 commit 0666887

13 files changed

+122
-34
lines changed

include/swift-c/DependencyScan/DependencyScan.h

+4
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,10 @@ SWIFTSCAN_PUBLIC swiftscan_string_ref_t
180180
swiftscan_swift_binary_detail_get_module_source_info_path(
181181
swiftscan_module_details_t details);
182182

183+
SWIFTSCAN_PUBLIC swiftscan_string_set_t *
184+
swiftscan_swift_binary_detail_get_swift_overlay_dependencies(
185+
swiftscan_module_details_t details);
186+
183187
SWIFTSCAN_PUBLIC swiftscan_string_set_t *
184188
swiftscan_swift_binary_detail_get_header_dependencies(
185189
swiftscan_module_details_t details);

include/swift/AST/ModuleDependencies.h

+8-25
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ class ModuleDependencyInfoStorageBase {
161161
/// to Module IDs, qualified by module kind: Swift, Clang, etc.
162162
std::vector<ModuleDependencyID> resolvedDirectModuleDependencies;
163163

164+
/// Dependencies comprised of Swift overlay modules of direct and
165+
/// transitive Clang dependencies.
166+
std::vector<ModuleDependencyID> swiftOverlayDependencies;
167+
164168
/// The cache key for the produced module.
165169
std::string moduleCacheKey;
166170

@@ -193,10 +197,6 @@ struct CommonSwiftTextualModuleDependencyDetails {
193197
/// (Clang) modules on which the bridging header depends.
194198
std::vector<std::string> bridgingModuleDependencies;
195199

196-
/// Dependencies comprised of Swift overlay modules of direct and
197-
/// transitive Clang dependencies.
198-
std::vector<ModuleDependencyID> swiftOverlayDependencies;
199-
200200
/// The Swift frontend invocation arguments to build the Swift module from the
201201
/// interface.
202202
std::vector<std::string> buildCommandLine;
@@ -582,29 +582,12 @@ class ModuleDependencyInfo {
582582

583583
/// Set this module's set of Swift Overlay dependencies
584584
void setOverlayDependencies(const ArrayRef<ModuleDependencyID> dependencyIDs) {
585-
assert(isSwiftSourceModule() || isSwiftInterfaceModule());
586-
CommonSwiftTextualModuleDependencyDetails *textualModuleDetails;
587-
if (auto sourceDetailsStorage = dyn_cast<SwiftSourceModuleDependenciesStorage>(storage.get())) {
588-
textualModuleDetails = &sourceDetailsStorage->textualModuleDetails;
589-
} else if (auto interfaceDetailsStorage = dyn_cast<SwiftInterfaceModuleDependenciesStorage>(storage.get())) {
590-
textualModuleDetails = &interfaceDetailsStorage->textualModuleDetails;
591-
} else {
592-
llvm_unreachable("Unknown kind of dependency module info.");
593-
}
594-
textualModuleDetails->swiftOverlayDependencies.assign(dependencyIDs.begin(), dependencyIDs.end());
585+
assert(isSwiftModule());
586+
storage->swiftOverlayDependencies.assign(dependencyIDs.begin(), dependencyIDs.end());
595587
}
596588

597589
const ArrayRef<ModuleDependencyID> getSwiftOverlayDependencies() const {
598-
CommonSwiftTextualModuleDependencyDetails *textualModuleDetails = nullptr;
599-
if (auto sourceDetailsStorage = dyn_cast<SwiftSourceModuleDependenciesStorage>(storage.get()))
600-
textualModuleDetails = &sourceDetailsStorage->textualModuleDetails;
601-
else if (auto interfaceDetailsStorage = dyn_cast<SwiftInterfaceModuleDependenciesStorage>(storage.get()))
602-
textualModuleDetails = &interfaceDetailsStorage->textualModuleDetails;
603-
604-
if (textualModuleDetails)
605-
return textualModuleDetails->swiftOverlayDependencies;
606-
else
607-
return {};
590+
return storage->swiftOverlayDependencies;
608591
}
609592

610593
std::vector<std::string> getCommandline() const {
@@ -1090,7 +1073,7 @@ class ModuleDependenciesCache {
10901073

10911074
/// Resolve a dependency module's set of Swift module dependencies
10921075
/// that are Swift overlays of Clang module dependencies.
1093-
void setSwiftOverlayDependencues(ModuleDependencyID moduleID,
1076+
void setSwiftOverlayDependencies(ModuleDependencyID moduleID,
10941077
const ArrayRef<ModuleDependencyID> dependencyIDs);
10951078

10961079
StringRef getMainModuleName() const {

include/swift/DependencyScan/DependencyScanImpl.h

+4
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ typedef struct {
121121
/// The path to the .swiftSourceInfo file.
122122
swiftscan_string_ref_t module_source_info_path;
123123

124+
/// (Swift) module dependencies by means of being overlays of
125+
/// Clang module dependencies
126+
swiftscan_string_set_t *swift_overlay_module_dependencies;
127+
124128
/// (Clang) header dependencies of this binary module.
125129
/// Typically pre-compiled bridging header.
126130
swiftscan_string_set_t *header_dependencies;

include/swift/DependencyScan/SerializedModuleDependencyCacheFormat.h

+1
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ using SwiftBinaryModuleDetailsLayout =
166166
FileIDField, // compiledModulePath
167167
FileIDField, // moduleDocPath
168168
FileIDField, // moduleSourceInfoPath
169+
DependencyIDArrayIDField, // swiftOverlayDependencies
169170
ImportArrayIDField, // headerImports
170171
IsFrameworkField, // isFramework
171172
IdentifierIDField // moduleCacheKey

lib/AST/ModuleDependencies.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -754,7 +754,7 @@ void ModuleDependenciesCache::resolveDependencyImports(ModuleDependencyID module
754754
updateDependency(moduleID, dependencyInfo);
755755
}
756756

757-
void ModuleDependenciesCache::setSwiftOverlayDependencues(ModuleDependencyID moduleID,
757+
void ModuleDependenciesCache::setSwiftOverlayDependencies(ModuleDependencyID moduleID,
758758
const ArrayRef<ModuleDependencyID> dependencyIDs) {
759759
auto optionalDependencyInfo = findDependency(moduleID);
760760
assert(optionalDependencyInfo.has_value() && "Resolving unknown dependency");

lib/DependencyScan/ModuleDependencyCacheSerialization.cpp

+16-5
Original file line numberDiff line numberDiff line change
@@ -474,11 +474,12 @@ bool ModuleDependenciesCacheDeserializer::readGraph(SwiftDependencyScanningServi
474474
"Unexpected SWIFT_BINARY_MODULE_DETAILS_NODE record");
475475
cache.configureForContextHash(getContextHash());
476476
unsigned compiledModulePathID, moduleDocPathID, moduleSourceInfoPathID,
477-
headerImportsArrayID, isFramework, moduleCacheKeyID;
477+
overlayDependencyIDArrayID, headerImportsArrayID, isFramework,
478+
moduleCacheKeyID;
478479
SwiftBinaryModuleDetailsLayout::readRecord(
479480
Scratch, compiledModulePathID, moduleDocPathID,
480-
moduleSourceInfoPathID, headerImportsArrayID, isFramework,
481-
moduleCacheKeyID);
481+
moduleSourceInfoPathID, overlayDependencyIDArrayID,
482+
headerImportsArrayID, isFramework, moduleCacheKeyID);
482483

483484
auto compiledModulePath = getIdentifier(compiledModulePathID);
484485
if (!compiledModulePath)
@@ -503,6 +504,12 @@ bool ModuleDependenciesCacheDeserializer::readGraph(SwiftDependencyScanningServi
503504
*currentModuleImports, *currentOptionalModuleImports,
504505
*headerImports, isFramework, *moduleCacheKey);
505506

507+
// Add Swift overlay dependencies
508+
auto overlayModuleDependencyIDs = getModuleDependencyIDArray(overlayDependencyIDArrayID);
509+
if (!overlayModuleDependencyIDs.has_value())
510+
llvm::report_fatal_error("Bad overlay dependencies: no qualified dependencies");
511+
moduleDep.setOverlayDependencies(overlayModuleDependencyIDs.value());
512+
506513
cache.recordDependency(currentModuleName, std::move(moduleDep),
507514
getContextHash());
508515
hasCurrentModule = false;
@@ -999,6 +1006,7 @@ void ModuleDependenciesCacheSerializer::writeModuleInfo(
9991006
getIdentifier(swiftBinDeps->compiledModulePath),
10001007
getIdentifier(swiftBinDeps->moduleDocPath),
10011008
getIdentifier(swiftBinDeps->sourceInfoPath),
1009+
getArrayID(moduleID, ModuleIdentifierArrayKind::SwiftOverlayDependencyIDs),
10021010
getArrayID(moduleID, ModuleIdentifierArrayKind::DependencyHeaders),
10031011
swiftBinDeps->isFramework,
10041012
getIdentifier(swiftBinDeps->moduleCacheKey));
@@ -1165,7 +1173,7 @@ void ModuleDependenciesCacheSerializer::collectStringsAndArrays(
11651173
swiftTextDeps->textualModuleDetails.bridgingModuleDependencies);
11661174
addDependencyIDArray(
11671175
moduleID, ModuleIdentifierArrayKind::SwiftOverlayDependencyIDs,
1168-
swiftTextDeps->textualModuleDetails.swiftOverlayDependencies);
1176+
swiftTextDeps->swiftOverlayDependencies);
11691177
addIdentifier(swiftTextDeps->textualModuleDetails.CASFileSystemRootID);
11701178
addIdentifier(swiftTextDeps->textualModuleDetails
11711179
.CASBridgingHeaderIncludeTreeRootID);
@@ -1181,6 +1189,9 @@ void ModuleDependenciesCacheSerializer::collectStringsAndArrays(
11811189
addIdentifier(swiftBinDeps->moduleCacheKey);
11821190
addStringArray(moduleID, ModuleIdentifierArrayKind::DependencyHeaders,
11831191
swiftBinDeps->preCompiledBridgingHeaderPaths);
1192+
addDependencyIDArray(
1193+
moduleID, ModuleIdentifierArrayKind::SwiftOverlayDependencyIDs,
1194+
swiftBinDeps->swiftOverlayDependencies);
11841195
break;
11851196
}
11861197
case swift::ModuleDependencyKind::SwiftPlaceholder: {
@@ -1210,7 +1221,7 @@ void ModuleDependenciesCacheSerializer::collectStringsAndArrays(
12101221
swiftSourceDeps->textualModuleDetails.bridgingModuleDependencies);
12111222
addDependencyIDArray(
12121223
moduleID, ModuleIdentifierArrayKind::SwiftOverlayDependencyIDs,
1213-
swiftSourceDeps->textualModuleDetails.swiftOverlayDependencies);
1224+
swiftSourceDeps->swiftOverlayDependencies);
12141225
addStringArray(
12151226
moduleID, ModuleIdentifierArrayKind::BuildCommandLine,
12161227
swiftSourceDeps->textualModuleDetails.buildCommandLine);

lib/DependencyScan/ModuleDependencyScanner.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ ModuleDependencyScanner::resolveDirectModuleDependencies(
529529
cache.resolveDependencyImports(moduleID, directDependencies.getArrayRef());
530530
// Resolve the dependency info with Swift overlay dependency information.
531531
if (!swiftOverlayDependencies.empty())
532-
cache.setSwiftOverlayDependencues(moduleID,
532+
cache.setSwiftOverlayDependencies(moduleID,
533533
swiftOverlayDependencies.getArrayRef());
534534

535535
ModuleDependencyIDSetVector result = directDependencies;

lib/DependencyScan/ScanDependencies.cpp

+17-2
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,10 @@ static void writeJSON(llvm::raw_ostream &out,
836836
/*indentLevel=*/5,
837837
/*trailingComma=*/false);
838838
} else if (swiftBinaryDeps) {
839+
bool hasOverlayDependencies =
840+
swiftBinaryDeps->swift_overlay_module_dependencies &&
841+
swiftBinaryDeps->swift_overlay_module_dependencies->count > 0;
842+
839843
out << "\"swiftPrebuiltExternal\": {\n";
840844
assert(swiftBinaryDeps->compiled_module_path.data &&
841845
get_C_string(swiftBinaryDeps->compiled_module_path)[0] != '\0' &&
@@ -871,6 +875,12 @@ static void writeJSON(llvm::raw_ostream &out,
871875
swiftBinaryDeps->header_dependencies, 5,
872876
/*trailingComma=*/true);
873877

878+
if (hasOverlayDependencies) {
879+
writeDependencies(out, swiftBinaryDeps->swift_overlay_module_dependencies,
880+
"swiftOverlayDependencies", 5,
881+
/*trailingComma=*/true);
882+
}
883+
874884
writeJSONSingleField(out, "isFramework", swiftBinaryDeps->is_framework,
875885
5, /*trailingComma=*/false);
876886
} else {
@@ -1038,7 +1048,7 @@ generateFullDependencyGraph(const CompilerInstance &instance,
10381048
details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_TEXTUAL;
10391049
// Create an overlay dependencies set according to the output format
10401050
std::vector<std::string> bridgedOverlayDependencyNames;
1041-
bridgeDependencyIDs(swiftTextualDeps->textualModuleDetails.swiftOverlayDependencies,
1051+
bridgeDependencyIDs(swiftTextualDeps->swiftOverlayDependencies,
10421052
bridgedOverlayDependencyNames);
10431053

10441054
details->swift_textual_details = {
@@ -1070,7 +1080,7 @@ generateFullDependencyGraph(const CompilerInstance &instance,
10701080
details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_TEXTUAL;
10711081
// Create an overlay dependencies set according to the output format
10721082
std::vector<std::string> bridgedOverlayDependencyNames;
1073-
bridgeDependencyIDs(swiftSourceDeps->textualModuleDetails.swiftOverlayDependencies,
1083+
bridgeDependencyIDs(swiftSourceDeps->swiftOverlayDependencies,
10741084
bridgedOverlayDependencyNames);
10751085

10761086
details->swift_textual_details = {
@@ -1102,10 +1112,15 @@ generateFullDependencyGraph(const CompilerInstance &instance,
11021112
create_clone(swiftPlaceholderDeps->sourceInfoPath.c_str())};
11031113
} else if (swiftBinaryDeps) {
11041114
details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_BINARY;
1115+
// Create an overlay dependencies set according to the output format
1116+
std::vector<std::string> bridgedOverlayDependencyNames;
1117+
bridgeDependencyIDs(swiftBinaryDeps->swiftOverlayDependencies,
1118+
bridgedOverlayDependencyNames);
11051119
details->swift_binary_details = {
11061120
create_clone(swiftBinaryDeps->compiledModulePath.c_str()),
11071121
create_clone(swiftBinaryDeps->moduleDocPath.c_str()),
11081122
create_clone(swiftBinaryDeps->sourceInfoPath.c_str()),
1123+
create_set(bridgedOverlayDependencyNames),
11091124
create_set(swiftBinaryDeps->preCompiledBridgingHeaderPaths),
11101125
swiftBinaryDeps->isFramework,
11111126
create_clone(swiftBinaryDeps->moduleCacheKey.c_str())};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "F.h"

test/ScanDependencies/Inputs/CHeaders/module.modulemap

+4
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,8 @@ module Y {
5252
explicit module Private {
5353
header "Y_Private.h"
5454
}
55+
}
56+
module ClangModuleWithOverlayedDep {
57+
header "ClangModuleWithOverlayedDep.h"
58+
export *
5559
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// REQUIRES: objc_interop
2+
// RUN: %empty-directory(%t)
3+
// RUN: %empty-directory(%t/clang-module-cache)
4+
// RUN: %empty-directory(%t/DependencyModules)
5+
// RUN: split-file --leading-lines %s %t
6+
7+
// Emit a binary module dependency
8+
// RUN: %target-swift-frontend -emit-module -emit-module-path %t/DependencyModules/BinaryModuleDep.swiftmodule -module-cache-path %t/clang-module-cache %t/BinaryModuleDepSource.swift -module-name BinaryModuleDep -I %S/Inputs/CHeaders -I %S/Inputs/Swift
9+
10+
// Scan the client and ensure both the Client and BinaryModuleDep modules have a Swift overlay dependency on 'F' as imported by 'ClangModuleWithOverlayedDep'
11+
// RUN: %target-swift-frontend -scan-dependencies -module-cache-path %t/clang-module-cache %s -o %t/deps.json -I %S/Inputs/CHeaders -I %S/Inputs/Swift -I %t/DependencyModules
12+
// Check the contents of the JSON output
13+
// RUN: %validate-json %t/deps.json | %FileCheck %s
14+
15+
//--- BinaryModuleDepSource.swift
16+
import ClangModuleWithOverlayedDep
17+
18+
//--- Client.swift
19+
import BinaryModuleDep
20+
21+
// CHECK: "swift": "deps"
22+
// CHECK: "directDependencies": [
23+
// CHECK-DAG: "swift": "Swift"
24+
// CHECK-DAG: "swift": "SwiftOnoneSupport"
25+
// CHECK-DAG: "swift": "_Concurrency"
26+
// CHECK-DAG: "clang": "_SwiftConcurrencyShims"
27+
// CHECK-DAG: "swift": "_StringProcessing"
28+
// CHECK-DAG: "clang": "ClangModuleWithOverlayedDep"
29+
// CHECK-DAG: "swiftPrebuiltExternal": "BinaryModuleDep"
30+
// CHECK-DAG: "swift": "F"
31+
// CHECK: ],
32+
// CHECK: "swiftOverlayDependencies": [
33+
// CHECK-NEXT: {
34+
// CHECK-NEXT: "swift": "F"
35+
// CHECK-NEXT: }
36+
// CHECK-NEXT: ]
37+
38+
// CHECK: "swiftPrebuiltExternal": "BinaryModuleDep"
39+
// CHECK: "directDependencies": [
40+
// CHECK-DAG: "swift": "Swift"
41+
// CHECK-DAG: "swift": "SwiftOnoneSupport"
42+
// CHECK-DAG: "swift": "_Concurrency"
43+
// CHECK-DAG: "clang": "_SwiftConcurrencyShims"
44+
// CHECK-DAG: "swift": "_StringProcessing"
45+
// CHECK-DAG: "clang": "ClangModuleWithOverlayedDep"
46+
// CHECK-DAG: "swift": "F"
47+
// CHECK: ],
48+
// CHECK: "swiftOverlayDependencies": [
49+
// CHECK-NEXT: {
50+
// CHECK-NEXT: "swift": "F"
51+
// CHECK-NEXT: }
52+
// CHECK-NEXT: ]

tools/libSwiftScan/libSwiftScan.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ void swiftscan_dependency_info_details_dispose(
8080
details_impl->swift_textual_details.bridging_source_files);
8181
swiftscan_string_set_dispose(
8282
details_impl->swift_textual_details.bridging_module_dependencies);
83+
swiftscan_string_set_dispose(
84+
details_impl->swift_textual_details.swift_overlay_module_dependencies);
8385
swiftscan_string_set_dispose(
8486
details_impl->swift_textual_details.command_line);
8587
swiftscan_string_set_dispose(
@@ -99,6 +101,10 @@ void swiftscan_dependency_info_details_dispose(
99101
details_impl->swift_binary_details.module_doc_path);
100102
swiftscan_string_dispose(
101103
details_impl->swift_binary_details.module_source_info_path);
104+
swiftscan_string_set_dispose(
105+
details_impl->swift_binary_details.swift_overlay_module_dependencies);
106+
swiftscan_string_set_dispose(
107+
details_impl->swift_binary_details.header_dependencies);
102108
swiftscan_string_dispose(
103109
details_impl->swift_binary_details.module_cache_key);
104110
break;
@@ -377,6 +383,12 @@ swiftscan_swift_binary_detail_get_module_source_info_path(
377383
return details->swift_binary_details.module_source_info_path;
378384
}
379385

386+
swiftscan_string_set_t *
387+
swiftscan_swift_binary_detail_get_swift_overlay_dependencies(
388+
swiftscan_module_details_t details) {
389+
return details->swift_binary_details.swift_overlay_module_dependencies;
390+
}
391+
380392
swiftscan_string_set_t *
381393
swiftscan_swift_binary_detail_get_header_dependencies(
382394
swiftscan_module_details_t details) {

tools/libSwiftScan/libSwiftScan.exports

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ swiftscan_swift_textual_detail_get_module_cache_key
2222
swiftscan_swift_binary_detail_get_compiled_module_path
2323
swiftscan_swift_binary_detail_get_module_doc_path
2424
swiftscan_swift_binary_detail_get_module_source_info_path
25+
swiftscan_swift_binary_detail_get_swift_overlay_dependencies
2526
swiftscan_swift_binary_detail_get_header_dependencies
2627
swiftscan_swift_binary_detail_get_is_framework
2728
swiftscan_swift_binary_detail_get_module_cache_key

0 commit comments

Comments
 (0)