Skip to content

Commit f79ff8b

Browse files
committed
[Dependency Scanning] Handle binary module dependencies' Swift overlay dependencies
The code, previously, only properly handled such dependencies being a distinct category for Swift source and Swift textual dependency infos. Swift binary module dependencies must handle this similarly and this change adds the missing support for them. Recent refactor of the scanner also means that now Swift binary dependencies with Swift overlay dependencies may crash the scanner, and this change resolves this as well. Resolves rdar://117088840
1 parent 14d4bf4 commit f79ff8b

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)