Skip to content

Commit 9615729

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 41dc466 commit 9615729

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
@@ -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

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
@@ -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

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
@@ -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

Lines changed: 17 additions & 2 deletions
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())};
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
}

0 commit comments

Comments
 (0)