Skip to content

Commit ec16d2c

Browse files
authored
Merge pull request #69248 from artemcm/510DepScanFixOverlayDeps
[5.10 🍒][Dependency Scanning] Handle binary module dependencies' Swift overlay dependencies
2 parents 14d4bf4 + f79ff8b commit ec16d2c

File tree

13 files changed

+122
-34
lines changed

13 files changed

+122
-34
lines changed

include/swift-c/DependencyScan/DependencyScan.h

Lines changed: 4 additions & 0 deletions
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

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

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

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

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

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

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

609592
std::vector<std::string> getCommandline() const {
@@ -1074,7 +1057,7 @@ class ModuleDependenciesCache {
10741057

10751058
/// Resolve a dependency module's set of Swift module dependencies
10761059
/// that are Swift overlays of Clang module dependencies.
1077-
void setSwiftOverlayDependencues(ModuleDependencyID moduleID,
1060+
void setSwiftOverlayDependencies(ModuleDependencyID moduleID,
10781061
const ArrayRef<ModuleDependencyID> dependencyIDs);
10791062

10801063
StringRef getMainModuleName() const {

include/swift/DependencyScan/DependencyScanImpl.h

Lines changed: 4 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ void ModuleDependenciesCache::resolveDependencyImports(ModuleDependencyID module
734734
updateDependency(moduleID, dependencyInfo);
735735
}
736736

737-
void ModuleDependenciesCache::setSwiftOverlayDependencues(ModuleDependencyID moduleID,
737+
void ModuleDependenciesCache::setSwiftOverlayDependencies(ModuleDependencyID moduleID,
738738
const ArrayRef<ModuleDependencyID> dependencyIDs) {
739739
auto optionalDependencyInfo = findDependency(moduleID);
740740
assert(optionalDependencyInfo.has_value() && "Resolving unknown dependency");

lib/DependencyScan/ModuleDependencyCacheSerialization.cpp

Lines changed: 16 additions & 5 deletions
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ ModuleDependencyScanner::resolveDirectModuleDependencies(
525525
cache.resolveDependencyImports(moduleID, directDependencies.getArrayRef());
526526
// Resolve the dependency info with Swift overlay dependency information.
527527
if (!swiftOverlayDependencies.empty())
528-
cache.setSwiftOverlayDependencues(moduleID,
528+
cache.setSwiftOverlayDependencies(moduleID,
529529
swiftOverlayDependencies.getArrayRef());
530530

531531
ModuleDependencyIDSetVector result = directDependencies;

lib/DependencyScan/ScanDependencies.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,10 @@ static void writeJSON(llvm::raw_ostream &out,
830830
/*indentLevel=*/5,
831831
/*trailingComma=*/false);
832832
} else if (swiftBinaryDeps) {
833+
bool hasOverlayDependencies =
834+
swiftBinaryDeps->swift_overlay_module_dependencies &&
835+
swiftBinaryDeps->swift_overlay_module_dependencies->count > 0;
836+
833837
out << "\"swiftPrebuiltExternal\": {\n";
834838
assert(swiftBinaryDeps->compiled_module_path.data &&
835839
get_C_string(swiftBinaryDeps->compiled_module_path)[0] != '\0' &&
@@ -865,6 +869,12 @@ static void writeJSON(llvm::raw_ostream &out,
865869
swiftBinaryDeps->header_dependencies, 5,
866870
/*trailingComma=*/true);
867871

872+
if (hasOverlayDependencies) {
873+
writeDependencies(out, swiftBinaryDeps->swift_overlay_module_dependencies,
874+
"swiftOverlayDependencies", 5,
875+
/*trailingComma=*/true);
876+
}
877+
868878
writeJSONSingleField(out, "isFramework", swiftBinaryDeps->is_framework,
869879
5, /*trailingComma=*/false);
870880
} else {
@@ -1032,7 +1042,7 @@ generateFullDependencyGraph(const CompilerInstance &instance,
10321042
details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_TEXTUAL;
10331043
// Create an overlay dependencies set according to the output format
10341044
std::vector<std::string> bridgedOverlayDependencyNames;
1035-
bridgeDependencyIDs(swiftTextualDeps->textualModuleDetails.swiftOverlayDependencies,
1045+
bridgeDependencyIDs(swiftTextualDeps->swiftOverlayDependencies,
10361046
bridgedOverlayDependencyNames);
10371047

10381048
details->swift_textual_details = {
@@ -1064,7 +1074,7 @@ generateFullDependencyGraph(const CompilerInstance &instance,
10641074
details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_TEXTUAL;
10651075
// Create an overlay dependencies set according to the output format
10661076
std::vector<std::string> bridgedOverlayDependencyNames;
1067-
bridgeDependencyIDs(swiftSourceDeps->textualModuleDetails.swiftOverlayDependencies,
1077+
bridgeDependencyIDs(swiftSourceDeps->swiftOverlayDependencies,
10681078
bridgedOverlayDependencyNames);
10691079

10701080
details->swift_textual_details = {
@@ -1096,10 +1106,15 @@ generateFullDependencyGraph(const CompilerInstance &instance,
10961106
create_clone(swiftPlaceholderDeps->sourceInfoPath.c_str())};
10971107
} else if (swiftBinaryDeps) {
10981108
details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_BINARY;
1109+
// Create an overlay dependencies set according to the output format
1110+
std::vector<std::string> bridgedOverlayDependencyNames;
1111+
bridgeDependencyIDs(swiftBinaryDeps->swiftOverlayDependencies,
1112+
bridgedOverlayDependencyNames);
10991113
details->swift_binary_details = {
11001114
create_clone(swiftBinaryDeps->compiledModulePath.c_str()),
11011115
create_clone(swiftBinaryDeps->moduleDocPath.c_str()),
11021116
create_clone(swiftBinaryDeps->sourceInfoPath.c_str()),
1117+
create_set(bridgedOverlayDependencyNames),
11031118
create_set(swiftBinaryDeps->preCompiledBridgingHeaderPaths),
11041119
swiftBinaryDeps->isFramework,
11051120
create_clone(swiftBinaryDeps->moduleCacheKey.c_str())};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "F.h"

test/ScanDependencies/Inputs/CHeaders/module.modulemap

Lines changed: 4 additions & 0 deletions
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
}
Lines changed: 52 additions & 0 deletions
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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ void swiftscan_dependency_info_details_dispose(
8181
details_impl->swift_textual_details.bridging_source_files);
8282
swiftscan_string_set_dispose(
8383
details_impl->swift_textual_details.bridging_module_dependencies);
84+
swiftscan_string_set_dispose(
85+
details_impl->swift_textual_details.swift_overlay_module_dependencies);
8486
swiftscan_string_set_dispose(
8587
details_impl->swift_textual_details.command_line);
8688
swiftscan_string_set_dispose(
@@ -100,6 +102,10 @@ void swiftscan_dependency_info_details_dispose(
100102
details_impl->swift_binary_details.module_doc_path);
101103
swiftscan_string_dispose(
102104
details_impl->swift_binary_details.module_source_info_path);
105+
swiftscan_string_set_dispose(
106+
details_impl->swift_binary_details.swift_overlay_module_dependencies);
107+
swiftscan_string_set_dispose(
108+
details_impl->swift_binary_details.header_dependencies);
103109
swiftscan_string_dispose(
104110
details_impl->swift_binary_details.module_cache_key);
105111
break;
@@ -378,6 +384,12 @@ swiftscan_swift_binary_detail_get_module_source_info_path(
378384
return details->swift_binary_details.module_source_info_path;
379385
}
380386

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

tools/libSwiftScan/libSwiftScan.exports

Lines changed: 1 addition & 0 deletions
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)