Skip to content

Commit 7566e9f

Browse files
authored
Merge pull request #34070 from CodaFi/an-iron-cross
Stage in Frontend/Driver Feature Flags for Cross-Module Incremental Builds
2 parents 8e16b25 + 574ee39 commit 7566e9f

File tree

10 files changed

+47
-4
lines changed

10 files changed

+47
-4
lines changed

include/swift/Driver/Compilation.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,9 @@ class Compilation {
281281
/// Experiment with source-range-based dependencies
282282
const bool EnableSourceRangeDependencies;
283283

284+
/// (experimental) Enable cross-module incremental build scheduling.
285+
const bool EnableCrossModuleIncrementalBuild;
286+
284287
public:
285288
/// Will contain a comparator if an argument demands it.
286289
Optional<IncrementalSchemeComparator> IncrementalComparator;
@@ -323,7 +326,8 @@ class Compilation {
323326
bool FineGrainedDependenciesIncludeIntrafileOnes = false,
324327
bool EnableSourceRangeDependencies = false,
325328
bool CompareIncrementalSchemes = false,
326-
StringRef CompareIncrementalSchemesPath = "");
329+
StringRef CompareIncrementalSchemesPath = "",
330+
bool EnableCrossModuleIncrementalBuild = false);
327331
// clang-format on
328332
~Compilation();
329333

@@ -429,6 +433,10 @@ class Compilation {
429433
return ShowDriverTimeCompilation;
430434
}
431435

436+
bool getEnableCrossModuleIncrementalBuild() const {
437+
return EnableCrossModuleIncrementalBuild;
438+
}
439+
432440
size_t getFilelistThreshold() const {
433441
return FilelistThreshold;
434442
}

include/swift/Frontend/FrontendOptions.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,14 @@ class FrontendOptions {
276276
/// of the main Swift module's source files.
277277
bool ImportPrescan = false;
278278

279+
/// When performing an incremental build, ensure that cross-module incremental
280+
/// build metadata is available in any swift modules emitted by this frontend
281+
/// job.
282+
///
283+
/// This flag is currently only propagated from the driver to
284+
/// any merge-modules jobs.
285+
bool EnableExperimentalCrossModuleIncrementalBuild = false;
286+
279287
/// The different modes for validating TBD against the LLVM IR.
280288
enum class TBDValidationMode {
281289
Default, ///< Do the default validation for the current platform.

include/swift/Option/Options.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,11 @@ def experimental_cxx_stdlib :
584584
Separate<["-"], "experimental-cxx-stdlib">,
585585
HelpText<"C++ standard library to use; forwarded to Clang's -stdlib flag">;
586586

587+
def enable_experimental_cross_module_incremental_build :
588+
Flag<["-"], "enable-experimental-cross-module-incremental-build">,
589+
HelpText<"(experimental) Enable cross-module incremental build metadata and "
590+
"driver scheduling">;
591+
587592

588593
// Diagnostic control options
589594
def suppress_warnings : Flag<["-"], "suppress-warnings">,

include/swift/Serialization/SerializationOptions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ namespace swift {
131131
bool SerializeAllSIL = false;
132132
bool SerializeOptionsForDebugging = false;
133133
bool IsSIB = false;
134+
bool ExperimentalCrossModuleIncrementalInfo = false;
134135
};
135136

136137
} // end namespace swift

lib/Driver/Compilation.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ Compilation::Compilation(DiagnosticEngine &Diags,
127127
bool FineGrainedDependenciesIncludeIntrafileOnes,
128128
bool EnableSourceRangeDependencies,
129129
bool CompareIncrementalSchemes,
130-
StringRef CompareIncrementalSchemesPath)
130+
StringRef CompareIncrementalSchemesPath,
131+
bool EnableCrossModuleIncrementalBuild)
131132
: Diags(Diags), TheToolChain(TC),
132133
TheOutputInfo(OI),
133134
Level(Level),
@@ -155,7 +156,8 @@ Compilation::Compilation(DiagnosticEngine &Diags,
155156
EmitFineGrainedDependencyDotFileAfterEveryImport),
156157
FineGrainedDependenciesIncludeIntrafileOnes(
157158
FineGrainedDependenciesIncludeIntrafileOnes),
158-
EnableSourceRangeDependencies(EnableSourceRangeDependencies)
159+
EnableSourceRangeDependencies(EnableSourceRangeDependencies),
160+
EnableCrossModuleIncrementalBuild(EnableCrossModuleIncrementalBuild)
159161
{
160162
if (CompareIncrementalSchemes)
161163
IncrementalComparator.emplace(

lib/Driver/Driver.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,8 @@ Driver::buildCompilation(const ToolChain &TC,
10271027
OPT_driver_emit_fine_grained_dependency_dot_file_after_every_import);
10281028
const bool FineGrainedDependenciesIncludeIntrafileOnes =
10291029
ArgList->hasArg(options::OPT_fine_grained_dependency_include_intrafile);
1030+
const bool EnableCrossModuleDependencies = ArgList->hasArg(
1031+
options::OPT_enable_experimental_cross_module_incremental_build);
10301032

10311033
// clang-format off
10321034
C = std::make_unique<Compilation>(
@@ -1054,7 +1056,8 @@ Driver::buildCompilation(const ToolChain &TC,
10541056
FineGrainedDependenciesIncludeIntrafileOnes,
10551057
EnableSourceRangeDependencies,
10561058
CompareIncrementalSchemes,
1057-
CompareIncrementalSchemesPath);
1059+
CompareIncrementalSchemesPath,
1060+
EnableCrossModuleDependencies);
10581061
// clang-format on
10591062
}
10601063

lib/Driver/ToolChains.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,10 @@ ToolChain::constructInvocation(const MergeModuleJobAction &job,
10471047

10481048
context.Args.AddLastArg(Arguments, options::OPT_import_objc_header);
10491049

1050+
context.Args.AddLastArg(
1051+
Arguments,
1052+
options::OPT_enable_experimental_cross_module_incremental_build);
1053+
10501054
Arguments.push_back("-module-name");
10511055
Arguments.push_back(context.Args.MakeArgString(context.OI.ModuleName));
10521056

lib/Frontend/ArgsToFrontendOptionsConverter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ bool ArgsToFrontendOptionsConverter::convert(
9292

9393
Opts.ImportPrescan |= Args.hasArg(OPT_import_prescan);
9494

95+
Opts.EnableExperimentalCrossModuleIncrementalBuild |=
96+
Args.hasArg(OPT_enable_experimental_cross_module_incremental_build);
97+
9598
// Always track system dependencies when scanning dependencies.
9699
if (const Arg *ModeArg = Args.getLastArg(OPT_modes_Group)) {
97100
if (ModeArg->getOption().matches(OPT_scan_dependencies)) {

lib/Frontend/Frontend.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,9 @@ SerializationOptions CompilerInvocation::computeSerializationOptions(
175175
opts.SerializeOptionsForDebugging.getValueOr(
176176
!isModuleExternallyConsumed(module));
177177

178+
serializationOpts.ExperimentalCrossModuleIncrementalInfo =
179+
opts.EnableExperimentalCrossModuleIncrementalBuild;
180+
178181
return serializationOpts;
179182
}
180183

test/Driver/cross_module.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: %empty-directory(%t/sub)
2+
// RUN: echo "{\"\": {\"swift-dependencies\": \"cross_module.swiftdeps\"}}" > %t/ofm.json
3+
// RUN: %swiftc_driver -incremental -emit-module -module-name cross_module -output-file-map=%/t/ofm.json -driver-print-jobs -target x86_64-apple-macosx10.9 %s -enable-experimental-cross-module-incremental-build 2>^1 | %FileCheck -check-prefix ENABLE %s
4+
5+
// ENABLE: {{bin(/|\\\\)swift(-frontend|c)?(\.exe)?"?}} -frontend -merge-modules
6+
// ENABLE-SAME: -enable-experimental-cross-module-incremental-build

0 commit comments

Comments
 (0)