Skip to content

Commit 4920e4a

Browse files
authored
Merge pull request #66031 from artemcm/BreakOutOverlayDeps
[Dependency Scanning] Break out Swift Overlay dependencies into separate output category
2 parents 3212479 + 5ca9178 commit 4920e4a

File tree

12 files changed

+277
-140
lines changed

12 files changed

+277
-140
lines changed

include/swift-c/DependencyScan/DependencyScan.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ swiftscan_swift_textual_detail_get_context_hash(
150150
SWIFTSCAN_PUBLIC bool swiftscan_swift_textual_detail_get_is_framework(
151151
swiftscan_module_details_t details);
152152

153+
SWIFTSCAN_PUBLIC swiftscan_string_set_t *
154+
swiftscan_swift_textual_detail_get_swift_overlay_dependencies(
155+
swiftscan_module_details_t details);
156+
153157
//=== Swift Binary Module Details query APIs ------------------------------===//
154158

155159
SWIFTSCAN_PUBLIC swiftscan_string_ref_t

include/swift/AST/ModuleDependencies.h

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,10 @@ struct CommonSwiftTextualModuleDependencyDetails {
137137

138138
/// (Clang) modules on which the bridging header depends.
139139
std::vector<std::string> bridgingModuleDependencies;
140+
141+
/// Dependencies comprised of Swift overlay modules of direct and
142+
/// transitive Clang dependencies.
143+
std::vector<ModuleDependencyID> swiftOverlayDependencies;
140144
};
141145

142146
/// Describes the dependencies of a Swift module described by an Swift interface file.
@@ -450,12 +454,26 @@ class ModuleDependencyInfo {
450454
}
451455

452456
/// Resolve a dependency's set of `imports` with qualified Module IDs
453-
void resolveDependencies(const std::vector<ModuleDependencyID> &dependencyIDs) {
457+
void resolveDependencies(const ArrayRef<ModuleDependencyID> dependencyIDs) {
454458
assert(!storage->resolved && "Resolving an already-resolved dependency");
455459
storage->resolved = true;
456460
storage->resolvedModuleDependencies.assign(dependencyIDs.begin(), dependencyIDs.end());
457461
}
458462

463+
/// Set this module's set of Swift Overlay dependencies
464+
void setOverlayDependencies(const ArrayRef<ModuleDependencyID> dependencyIDs) {
465+
assert(isSwiftSourceModule() || isSwiftInterfaceModule());
466+
CommonSwiftTextualModuleDependencyDetails *textualModuleDetails;
467+
if (auto sourceDetailsStorage = dyn_cast<SwiftSourceModuleDependenciesStorage>(storage.get())) {
468+
textualModuleDetails = &sourceDetailsStorage->textualModuleDetails;
469+
} else if (auto interfaceDetailsStorage = dyn_cast<SwiftInterfaceModuleDependenciesStorage>(storage.get())) {
470+
textualModuleDetails = &interfaceDetailsStorage->textualModuleDetails;
471+
} else {
472+
llvm_unreachable("Unknown kind of dependency module info.");
473+
}
474+
textualModuleDetails->swiftOverlayDependencies.assign(dependencyIDs.begin(), dependencyIDs.end());
475+
}
476+
459477
void updateCommandLine(const std::vector<std::string> &newCommandLine) {
460478
assert(isSwiftInterfaceModule() && "Can only update command line on Swift interface dependency");
461479
cast<SwiftInterfaceModuleDependenciesStorage>(storage.get())->updateCommandLine(newCommandLine);
@@ -762,7 +780,12 @@ class ModuleDependenciesCache {
762780
/// Resolve a dependency module's set of imports
763781
/// to a kind-qualified set of module IDs.
764782
void resolveDependencyImports(ModuleDependencyID moduleID,
765-
const std::vector<ModuleDependencyID> &dependencyIDs);
783+
const ArrayRef<ModuleDependencyID> dependencyIDs);
784+
785+
/// Resolve a dependency module's set of Swift module dependencies
786+
/// that are Swift overlays of Clang module dependencies.
787+
void setSwiftOverlayDependencues(ModuleDependencyID moduleID,
788+
const ArrayRef<ModuleDependencyID> dependencyIDs);
766789

767790
StringRef getMainModuleName() const {
768791
return mainScanModuleName;

include/swift/DependencyScan/DependencyScanImpl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ typedef struct {
7979
/// (Clang) modules on which the bridging header depends.
8080
swiftscan_string_set_t *bridging_module_dependencies;
8181

82+
/// (Swift) module dependencies by means of being overlays of
83+
/// Clang module dependencies
84+
swiftscan_string_set_t *swift_overlay_module_dependencies;
85+
8286
/// Options to the compile command required to build this module interface
8387
swiftscan_string_set_t *command_line;
8488

include/swift/DependencyScan/SerializedModuleDependencyCacheFormat.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ using llvm::BCVBR;
4141
const unsigned char MODULE_DEPENDENCY_CACHE_FORMAT_SIGNATURE[] = {'I', 'M', 'D','C'};
4242
const unsigned MODULE_DEPENDENCY_CACHE_FORMAT_VERSION_MAJOR = 4;
4343
/// Increment this on every change.
44-
const unsigned MODULE_DEPENDENCY_CACHE_FORMAT_VERSION_MINOR = 0;
44+
const unsigned MODULE_DEPENDENCY_CACHE_FORMAT_VERSION_MINOR = 1;
4545

4646
/// Various identifiers in this format will rely on having their strings mapped
4747
/// using this ID.
@@ -139,7 +139,8 @@ using SwiftInterfaceModuleDetailsLayout =
139139
FileIDField, // bridgingHeaderFile
140140
FileIDArrayIDField, // sourceFiles
141141
FileIDArrayIDField, // bridgingSourceFiles
142-
FileIDArrayIDField // bridgingModuleDependencies
142+
FileIDArrayIDField, // bridgingModuleDependencies
143+
DependencyIDArrayIDField // swiftOverlayDependencies
143144
>;
144145

145146
using SwiftSourceModuleDetailsLayout =
@@ -148,7 +149,8 @@ using SwiftSourceModuleDetailsLayout =
148149
FileIDField, // bridgingHeaderFile
149150
FileIDArrayIDField, // sourceFiles
150151
FileIDArrayIDField, // bridgingSourceFiles
151-
FileIDArrayIDField // bridgingModuleDependencies
152+
FileIDArrayIDField, // bridgingModuleDependencies
153+
DependencyIDArrayIDField // swiftOverlayDependencies
152154
>;
153155

154156
using SwiftBinaryModuleDetailsLayout =

include/swift/Option/Options.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,6 +1285,10 @@ def disable_clang_target : Flag<["-"], "disable-clang-target">,
12851285
Flags<[NewDriverOnlyOption]>,
12861286
HelpText<"Disable a separately specified target triple for Clang instance to use">;
12871287

1288+
def explain_module_dependency : Separate<["-"], "explain-module-dependency">,
1289+
Flags<[NewDriverOnlyOption]>,
1290+
HelpText<"Emit remark/notes describing why compilaiton may depend on a module with a given name.">;
1291+
12881292
def min_inlining_target_version : Separate<["-"], "target-min-inlining-version">,
12891293
Flags<[FrontendOption, ModuleInterfaceOptionIgnorable]>,
12901294
HelpText<"Require inlinable code with no '@available' attribute to back-deploy "

lib/AST/ModuleDependencies.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,11 +447,21 @@ void ModuleDependenciesCache::updateDependency(
447447
}
448448

449449
void ModuleDependenciesCache::resolveDependencyImports(ModuleDependencyID moduleID,
450-
const std::vector<ModuleDependencyID> &dependencyIDs) {
450+
const ArrayRef<ModuleDependencyID> dependencyIDs) {
451451
auto optionalDependencyInfo = findDependency(moduleID.first, moduleID.second);
452452
assert(optionalDependencyInfo.has_value() && "Resolving unknown dependency");
453453
// Copy the existing info to a mutable one we can then replace it with, after resolving its dependencies.
454454
auto dependencyInfo = *(optionalDependencyInfo.value());
455455
dependencyInfo.resolveDependencies(dependencyIDs);
456456
updateDependency(moduleID, dependencyInfo);
457457
}
458+
459+
void ModuleDependenciesCache::setSwiftOverlayDependencues(ModuleDependencyID moduleID,
460+
const ArrayRef<ModuleDependencyID> dependencyIDs) {
461+
auto optionalDependencyInfo = findDependency(moduleID.first, moduleID.second);
462+
assert(optionalDependencyInfo.has_value() && "Resolving unknown dependency");
463+
// Copy the existing info to a mutable one we can then replace it with, after setting its overlay dependencies.
464+
auto dependencyInfo = *(optionalDependencyInfo.value());
465+
dependencyInfo.setOverlayDependencies(dependencyIDs);
466+
updateDependency(moduleID, dependencyInfo);
467+
}

0 commit comments

Comments
 (0)