Skip to content

Commit 7f79783

Browse files
authored
Merge pull request swiftlang#36111 from CodaFi/cross-over-episode
Add Real Enable/Disable Flags for Cross-Module Incremental Builds
2 parents b64bd95 + d946df7 commit 7f79783

File tree

17 files changed

+86
-57
lines changed

17 files changed

+86
-57
lines changed

include/swift/Frontend/FrontendOptions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ class FrontendOptions {
298298
///
299299
/// This flag is currently only propagated from the driver to
300300
/// any merge-modules jobs.
301-
bool EnableExperimentalCrossModuleIncrementalBuild = false;
301+
bool DisableCrossModuleIncrementalBuild = false;
302302

303303
/// Best effort to output a .swiftmodule regardless of any compilation
304304
/// errors. SIL generation and serialization is skipped entirely when there

include/swift/Option/Options.td

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,6 +1111,18 @@ def emit_supported_features : Flag<["-"], "emit-supported-features">,
11111111
HelpText<"Emit a JSON file including all supported compiler features">, ModeOpt,
11121112
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild]>;
11131113

1114+
def enable_incremental_imports :
1115+
Flag<["-"], "enable-incremental-imports">,
1116+
Flags<[FrontendOption]>,
1117+
HelpText<"Enable cross-module incremental build metadata and "
1118+
"driver scheduling for Swift modules">;
1119+
1120+
def disable_incremental_imports :
1121+
Flag<["-"], "disable-incremental-imports">,
1122+
Flags<[FrontendOption]>,
1123+
HelpText<"Disable cross-module incremental build metadata and "
1124+
"driver scheduling for Swift modules">;
1125+
11141126
def index_file : Flag<["-"], "index-file">,
11151127
HelpText<"Produce index data for a source file">, ModeOpt,
11161128
Flags<[NoInteractiveOption, DoesNotAffectIncrementalBuild]>;

include/swift/Serialization/SerializationOptions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ namespace swift {
132132
bool SerializeAllSIL = false;
133133
bool SerializeOptionsForDebugging = false;
134134
bool IsSIB = false;
135-
bool ExperimentalCrossModuleIncrementalInfo = false;
135+
bool DisableCrossModuleIncrementalInfo = false;
136136
};
137137

138138
} // end namespace swift

lib/Driver/Driver.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,8 +1008,9 @@ Driver::buildCompilation(const ToolChain &TC,
10081008
const bool EmitFineGrainedDependencyDotFileAfterEveryImport = ArgList->hasArg(
10091009
options::
10101010
OPT_driver_emit_fine_grained_dependency_dot_file_after_every_import);
1011-
const bool EnableCrossModuleDependencies = ArgList->hasArg(
1012-
options::OPT_enable_experimental_cross_module_incremental_build);
1011+
const bool EnableCrossModuleDependencies
1012+
= ArgList->hasArg(options::OPT_enable_incremental_imports,
1013+
options::OPT_disable_incremental_imports, true);
10131014

10141015
// clang-format off
10151016
C = std::make_unique<Compilation>(

lib/Driver/ToolChains.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,9 +1050,7 @@ ToolChain::constructInvocation(const MergeModuleJobAction &job,
10501050

10511051
context.Args.AddLastArg(Arguments, options::OPT_import_objc_header);
10521052

1053-
context.Args.AddLastArg(
1054-
Arguments,
1055-
options::OPT_enable_experimental_cross_module_incremental_build);
1053+
context.Args.AddLastArg(Arguments, options::OPT_disable_incremental_imports);
10561054

10571055
Arguments.push_back("-module-name");
10581056
Arguments.push_back(context.Args.MakeArgString(context.OI.ModuleName));

lib/Frontend/ArgsToFrontendOptionsConverter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ bool ArgsToFrontendOptionsConverter::convert(
103103

104104
Opts.ImportPrescan |= Args.hasArg(OPT_import_prescan);
105105

106-
Opts.EnableExperimentalCrossModuleIncrementalBuild |=
107-
Args.hasArg(OPT_enable_experimental_cross_module_incremental_build);
106+
Opts.DisableCrossModuleIncrementalBuild |=
107+
Args.hasArg(OPT_disable_incremental_imports);
108108

109109
// Always track system dependencies when scanning dependencies.
110110
if (const Arg *ModeArg = Args.getLastArg(OPT_modes_Group)) {

lib/Frontend/Frontend.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,8 @@ SerializationOptions CompilerInvocation::computeSerializationOptions(
178178
opts.SerializeOptionsForDebugging.getValueOr(
179179
!isModuleExternallyConsumed(module));
180180

181-
serializationOpts.ExperimentalCrossModuleIncrementalInfo =
182-
opts.EnableExperimentalCrossModuleIncrementalBuild;
181+
serializationOpts.DisableCrossModuleIncrementalInfo =
182+
opts.DisableCrossModuleIncrementalBuild;
183183

184184
return serializationOpts;
185185
}

lib/Frontend/ModuleInterfaceBuilder.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,13 @@ bool ModuleInterfaceBuilder::collectDepsForSerialization(
7979
path::native(ResourcePath);
8080

8181
auto DTDeps = SubInstance.getDependencyTracker()->getDependencies();
82-
SmallVector<StringRef, 16> InitialDepNames(DTDeps.begin(), DTDeps.end());
83-
InitialDepNames.push_back(interfacePath);
84-
InitialDepNames.insert(InitialDepNames.end(),
85-
extraDependencies.begin(), extraDependencies.end());
82+
SmallVector<std::string, 16> InitialDepNames(DTDeps.begin(), DTDeps.end());
83+
auto IncDeps = SubInstance.getDependencyTracker()->getIncrementalDependencyPaths();
84+
InitialDepNames.append(IncDeps.begin(), IncDeps.end());
85+
InitialDepNames.push_back(interfacePath.str());
86+
for (const auto &extra : extraDependencies) {
87+
InitialDepNames.push_back(extra.str());
88+
}
8689
SmallString<128> Scratch;
8790

8891
for (const auto &InitialDepName : InitialDepNames) {

lib/FrontendTool/FrontendTool.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1536,7 +1536,11 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
15361536

15371537
SerializationOptions serializationOpts =
15381538
Invocation.computeSerializationOptions(outs, Instance.getMainModule());
1539-
if (serializationOpts.ExperimentalCrossModuleIncrementalInfo) {
1539+
1540+
const bool canEmitIncrementalInfoIntoModule =
1541+
!serializationOpts.DisableCrossModuleIncrementalInfo &&
1542+
(Action == FrontendOptions::ActionType::MergeModules);
1543+
if (canEmitIncrementalInfoIntoModule) {
15401544
const auto alsoEmitDotFile =
15411545
Instance.getInvocation()
15421546
.getLangOptions()

lib/FrontendTool/LoadedModuleTrace.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,11 @@ static void computeSwiftModuleTraceInfo(
577577
path::replace_extension(modPath, swiftInterfaceExt);
578578
};
579579

580-
for (auto &depPath : depTracker.getDependencies()) {
580+
auto deps = depTracker.getDependencies();
581+
SmallVector<std::string, 16> dependencies{deps.begin(), deps.end()};
582+
auto incrDeps = depTracker.getIncrementalDependencyPaths();
583+
dependencies.append(incrDeps.begin(), incrDeps.end());
584+
for (const auto &depPath : dependencies) {
581585

582586
// Decide if this is a swiftmodule based on the extension of the raw
583587
// dependency path, as the true file may have a different one.

0 commit comments

Comments
 (0)