Skip to content

Commit fca0dc0

Browse files
committed
Merge remote-tracking branch 'origin/main' into rebranch
2 parents 5ad81c7 + 6de8597 commit fca0dc0

20 files changed

+256
-69
lines changed

Diff for: include/swift/Basic/LangOptions.h

+4
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,10 @@ namespace swift {
802802

803803
/// Defer typechecking of declarations to their use at runtime
804804
bool DeferToRuntime = false;
805+
806+
/// Allow request evalutation to perform type checking lazily, instead of
807+
/// eagerly typechecking source files after parsing.
808+
bool EnableLazyTypecheck = false;
805809
};
806810

807811
/// Options for controlling the behavior of the Clang importer.

Diff for: include/swift/Frontend/FrontendOptions.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ class FrontendOptions {
156156
NoneAction, ///< No specific action
157157
Parse, ///< Parse only
158158
ResolveImports, ///< Parse and resolve imports only
159-
LazyTypecheck, ///< Parse and then do minimal type-checking for outputs
160159
Typecheck, ///< Parse and type-check only
161160
DumpParse, ///< Parse only and dump AST
162161
DumpInterfaceHash, ///< Parse and dump the interface token hash.
@@ -269,7 +268,6 @@ class FrontendOptions {
269268
/// \see ModuleDecl::arePrivateImportsEnabled
270269
bool EnablePrivateImports = false;
271270

272-
273271
/// Indicates whether we add implicit dynamic.
274272
///
275273
/// \see ModuleDecl::isImplicitDynamicEnabled
@@ -324,6 +322,10 @@ class FrontendOptions {
324322
/// times) when compiling a module interface?
325323
bool SerializeModuleInterfaceDependencyHashes = false;
326324

325+
/// Should we only serialize decls that may be referenced externally in the
326+
/// binary module?
327+
bool SerializeExternalDeclsOnly = false;
328+
327329
/// Should we warn if an imported module needed to be rebuilt from a
328330
/// module interface file?
329331
bool RemarkOnRebuildFromModuleInterface = false;

Diff for: include/swift/Option/FrontendOptions.td

+7
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,10 @@ def serialize_debugging_options : Flag<["-"], "serialize-debugging-options">,
166166
def serialized_path_obfuscate : Separate<["-"], "serialized-path-obfuscate">,
167167
HelpText<"Remap source paths in debug info">, MetaVarName<"<prefix=replacement>">;
168168

169+
def experimental_serialize_external_decls_only
170+
: Flag<["-"], "experimental-serialize-external-decls-only">,
171+
HelpText<"Only serialize decls that should be exposed to clients">;
172+
169173
def empty_abi_descriptor : Flag<["-"], "empty-abi-descriptor">,
170174
HelpText<"Avoid printing actual module content into ABI descriptor file">;
171175

@@ -406,6 +410,9 @@ def debug_forbid_typecheck_prefix : Separate<["-"], "debug-forbid-typecheck-pref
406410
HelpText<"Triggers llvm fatal_error if typechecker tries to typecheck a decl "
407411
"with the provided prefix name">;
408412

413+
def experimental_lazy_typecheck : Flag<["-"], "experimental-lazy-typecheck">,
414+
HelpText<"Type-check lazily as needed to produce requested outputs">;
415+
409416
def debug_emit_invalid_swiftinterface_syntax : Flag<["-"], "debug-emit-invalid-swiftinterface-syntax">,
410417
HelpText<"Write an invalid declaration into swiftinterface files">;
411418

Diff for: include/swift/Option/Options.td

-3
Original file line numberDiff line numberDiff line change
@@ -1164,9 +1164,6 @@ def resolve_imports : Flag<["-"], "resolve-imports">,
11641164
def typecheck : Flag<["-"], "typecheck">,
11651165
HelpText<"Parse and type-check input file(s)">, ModeOpt,
11661166
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild]>;
1167-
def experimental_lazy_typecheck : Flag<["-"], "experimental-lazy-typecheck">,
1168-
HelpText<"Parse input file(s), then type-check lazily as needed to produce requested outputs">, ModeOpt,
1169-
Flags<[FrontendOption, NoInteractiveOption, HelpHidden, DoesNotAffectIncrementalBuild]>;
11701167
def dump_parse : Flag<["-"], "dump-parse">,
11711168
HelpText<"Parse input file(s) and dump AST(s)">, ModeOpt,
11721169
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild]>;

Diff for: include/swift/Serialization/SerializationOptions.h

+1
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ namespace swift {
156156
bool StaticLibrary = false;
157157
bool HermeticSealAtLink = false;
158158
bool IsOSSA = false;
159+
bool SerializeExternalDeclsOnly = false;
159160
};
160161

161162
} // end namespace swift

Diff for: lib/Frontend/ArgsToFrontendOptionsConverter.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,8 @@ bool ArgsToFrontendOptionsConverter::convert(
318318
A->getOption().matches(OPT_serialize_debugging_options);
319319
}
320320

321+
Opts.SerializeExternalDeclsOnly |=
322+
Args.hasArg(OPT_experimental_serialize_external_decls_only);
321323
Opts.DebugPrefixSerializedDebuggingOptions |=
322324
Args.hasArg(OPT_prefix_serialized_debugging_options);
323325
Opts.EnableSourceImport |= Args.hasArg(OPT_enable_source_import);
@@ -552,8 +554,6 @@ ArgsToFrontendOptionsConverter::determineRequestedAction(const ArgList &args) {
552554
return FrontendOptions::ActionType::Parse;
553555
if (Opt.matches(OPT_resolve_imports))
554556
return FrontendOptions::ActionType::ResolveImports;
555-
if (Opt.matches(OPT_experimental_lazy_typecheck))
556-
return FrontendOptions::ActionType::LazyTypecheck;
557557
if (Opt.matches(OPT_typecheck))
558558
return FrontendOptions::ActionType::Typecheck;
559559
if (Opt.matches(OPT_dump_parse))

Diff for: lib/Frontend/CompilerInvocation.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -1423,6 +1423,8 @@ static bool ParseTypeCheckerArgs(TypeCheckerOptions &Opts, ArgList &Args,
14231423

14241424
Opts.DebugGenericSignatures |= Args.hasArg(OPT_debug_generic_signatures);
14251425

1426+
Opts.EnableLazyTypecheck |= Args.hasArg(OPT_experimental_lazy_typecheck);
1427+
14261428
return HadError;
14271429
}
14281430

Diff for: lib/Frontend/Frontend.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,9 @@ SerializationOptions CompilerInvocation::computeSerializationOptions(
225225

226226
serializationOpts.IsOSSA = getSILOptions().EnableOSSAModules;
227227

228+
serializationOpts.SerializeExternalDeclsOnly =
229+
opts.SerializeExternalDeclsOnly;
230+
228231
return serializationOpts;
229232
}
230233

@@ -1395,6 +1398,11 @@ bool CompilerInstance::performParseAndResolveImportsOnly() {
13951398
void CompilerInstance::performSema() {
13961399
performParseAndResolveImportsOnly();
13971400

1401+
// Skip eager type checking. Instead, let later stages of compilation drive
1402+
// type checking as needed through request evaluation.
1403+
if (getASTContext().TypeCheckerOpts.EnableLazyTypecheck)
1404+
return;
1405+
13981406
FrontendStatsTracer tracer(getStatsReporter(), "perform-sema");
13991407

14001408
forEachFileToTypeCheck([&](SourceFile &SF) {

Diff for: lib/Frontend/FrontendOptions.cpp

-19
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ bool FrontendOptions::needsProperModuleName(ActionType action) {
3333
case ActionType::NoneAction:
3434
case ActionType::Parse:
3535
case ActionType::ResolveImports:
36-
case ActionType::LazyTypecheck:
3736
case ActionType::Typecheck:
3837
case ActionType::DumpParse:
3938
case ActionType::DumpAST:
@@ -105,7 +104,6 @@ bool FrontendOptions::doesActionRequireSwiftStandardLibrary(ActionType action) {
105104
case ActionType::PrintFeature:
106105
return false;
107106
case ActionType::ResolveImports:
108-
case ActionType::LazyTypecheck:
109107
case ActionType::Typecheck:
110108
case ActionType::DumpAST:
111109
case ActionType::PrintAST:
@@ -151,7 +149,6 @@ bool FrontendOptions::doesActionRequireInputs(ActionType action) {
151149
case ActionType::CompileModuleFromInterface:
152150
case ActionType::TypecheckModuleFromInterface:
153151
case ActionType::ResolveImports:
154-
case ActionType::LazyTypecheck:
155152
case ActionType::Typecheck:
156153
case ActionType::DumpAST:
157154
case ActionType::PrintAST:
@@ -194,7 +191,6 @@ bool FrontendOptions::doesActionPerformEndOfPipelineActions(ActionType action) {
194191
case ActionType::CompileModuleFromInterface:
195192
case ActionType::TypecheckModuleFromInterface:
196193
case ActionType::ResolveImports:
197-
case ActionType::LazyTypecheck:
198194
case ActionType::Typecheck:
199195
case ActionType::DumpAST:
200196
case ActionType::PrintAST:
@@ -234,7 +230,6 @@ bool FrontendOptions::supportCompilationCaching(ActionType action) {
234230
case ActionType::EmitImportedModules:
235231
case ActionType::ScanDependencies:
236232
case ActionType::ResolveImports:
237-
case ActionType::LazyTypecheck:
238233
case ActionType::Typecheck:
239234
case ActionType::DumpAST:
240235
case ActionType::PrintAST:
@@ -295,7 +290,6 @@ FrontendOptions::formatForPrincipalOutputFileForAction(ActionType action) {
295290

296291
case ActionType::Parse:
297292
case ActionType::ResolveImports:
298-
case ActionType::LazyTypecheck:
299293
case ActionType::Typecheck:
300294
case ActionType::TypecheckModuleFromInterface:
301295
case ActionType::DumpParse:
@@ -383,7 +377,6 @@ bool FrontendOptions::canActionEmitDependencies(ActionType action) {
383377
case ActionType::PrintFeature:
384378
return false;
385379
case ActionType::ResolveImports:
386-
case ActionType::LazyTypecheck:
387380
case ActionType::Typecheck:
388381
case ActionType::MergeModules:
389382
case ActionType::EmitModuleOnly:
@@ -410,7 +403,6 @@ bool FrontendOptions::canActionEmitReferenceDependencies(ActionType action) {
410403
case ActionType::NoneAction:
411404
case ActionType::Parse:
412405
case ActionType::ResolveImports:
413-
case ActionType::LazyTypecheck:
414406
case ActionType::DumpParse:
415407
case ActionType::DumpInterfaceHash:
416408
case ActionType::DumpAST:
@@ -453,7 +445,6 @@ bool FrontendOptions::canActionEmitModuleSummary(ActionType action) {
453445
case ActionType::NoneAction:
454446
case ActionType::Parse:
455447
case ActionType::ResolveImports:
456-
case ActionType::LazyTypecheck:
457448
case ActionType::DumpParse:
458449
case ActionType::DumpInterfaceHash:
459450
case ActionType::DumpAST:
@@ -515,7 +506,6 @@ bool FrontendOptions::canActionEmitClangHeader(ActionType action) {
515506
case ActionType::PrintVersion:
516507
case ActionType::PrintFeature:
517508
return false;
518-
case ActionType::LazyTypecheck:
519509
case ActionType::Typecheck:
520510
case ActionType::MergeModules:
521511
case ActionType::EmitModuleOnly:
@@ -557,7 +547,6 @@ bool FrontendOptions::canActionEmitLoadedModuleTrace(ActionType action) {
557547
case ActionType::PrintFeature:
558548
return false;
559549
case ActionType::ResolveImports:
560-
case ActionType::LazyTypecheck:
561550
case ActionType::Typecheck:
562551
case ActionType::MergeModules:
563552
case ActionType::EmitModuleOnly:
@@ -587,7 +576,6 @@ bool FrontendOptions::canActionEmitModuleSemanticInfo(ActionType action) {
587576
case ActionType::NoneAction:
588577
case ActionType::Parse:
589578
case ActionType::ResolveImports:
590-
case ActionType::LazyTypecheck:
591579
case ActionType::DumpParse:
592580
case ActionType::DumpInterfaceHash:
593581
case ActionType::DumpAST:
@@ -631,7 +619,6 @@ bool FrontendOptions::canActionEmitConstValues(ActionType action) {
631619
case ActionType::NoneAction:
632620
case ActionType::Parse:
633621
case ActionType::ResolveImports:
634-
case ActionType::LazyTypecheck:
635622
case ActionType::DumpParse:
636623
case ActionType::DumpInterfaceHash:
637624
case ActionType::DumpAST:
@@ -673,7 +660,6 @@ bool FrontendOptions::canActionEmitModule(ActionType action) {
673660
case ActionType::NoneAction:
674661
case ActionType::Parse:
675662
case ActionType::ResolveImports:
676-
case ActionType::LazyTypecheck:
677663
case ActionType::Typecheck:
678664
case ActionType::DumpParse:
679665
case ActionType::DumpInterfaceHash:
@@ -741,7 +727,6 @@ bool FrontendOptions::canActionEmitInterface(ActionType action) {
741727
case ActionType::PrintFeature:
742728
return false;
743729
case ActionType::ResolveImports:
744-
case ActionType::LazyTypecheck:
745730
case ActionType::Typecheck:
746731
case ActionType::MergeModules:
747732
case ActionType::EmitModuleOnly:
@@ -762,7 +747,6 @@ bool FrontendOptions::doesActionProduceOutput(ActionType action) {
762747
switch (action) {
763748
case ActionType::Parse:
764749
case ActionType::ResolveImports:
765-
case ActionType::LazyTypecheck:
766750
case ActionType::Typecheck:
767751
case ActionType::DumpParse:
768752
case ActionType::DumpAST:
@@ -821,7 +805,6 @@ bool FrontendOptions::doesActionProduceTextualOutput(ActionType action) {
821805

822806
case ActionType::Parse:
823807
case ActionType::ResolveImports:
824-
case ActionType::LazyTypecheck:
825808
case ActionType::Typecheck:
826809
case ActionType::DumpParse:
827810
case ActionType::DumpInterfaceHash:
@@ -851,7 +834,6 @@ bool FrontendOptions::doesActionGenerateSIL(ActionType action) {
851834
case ActionType::NoneAction:
852835
case ActionType::Parse:
853836
case ActionType::ResolveImports:
854-
case ActionType::LazyTypecheck:
855837
case ActionType::Typecheck:
856838
case ActionType::DumpParse:
857839
case ActionType::DumpInterfaceHash:
@@ -903,7 +885,6 @@ bool FrontendOptions::doesActionGenerateIR(ActionType action) {
903885
case ActionType::DumpTypeInfo:
904886
case ActionType::CompileModuleFromInterface:
905887
case ActionType::TypecheckModuleFromInterface:
906-
case ActionType::LazyTypecheck:
907888
case ActionType::Typecheck:
908889
case ActionType::ResolveImports:
909890
case ActionType::MergeModules:

Diff for: lib/FrontendTool/FrontendTool.cpp

-3
Original file line numberDiff line numberDiff line change
@@ -1359,9 +1359,6 @@ static bool performAction(CompilerInstance &Instance,
13591359
return performParseOnly(*Instance.getMainModule());
13601360
case FrontendOptions::ActionType::ResolveImports:
13611361
return Instance.performParseAndResolveImportsOnly();
1362-
case FrontendOptions::ActionType::LazyTypecheck:
1363-
// For now, this action is just an alias of ResolveImports.
1364-
return Instance.performParseAndResolveImportsOnly();
13651362
case FrontendOptions::ActionType::Typecheck:
13661363
return withSemanticAnalysis(Instance, observer,
13671364
[](CompilerInstance &Instance) {

Diff for: lib/Serialization/Serialization.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -3259,6 +3259,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
32593259
}
32603260
}
32613261

3262+
public:
32623263
/// Determine if \p decl is safe to deserialize when it's public
32633264
/// or otherwise needed by the client in normal builds, this should usually
32643265
/// correspond to logic in type-checking ensuring these safe decls don't
@@ -3337,6 +3338,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
33373338
return false;
33383339
}
33393340

3341+
private:
33403342
/// Write a \c DeserializationSafetyLayout record only when \p decl is unsafe
33413343
/// to deserialize.
33423344
///
@@ -3511,6 +3513,9 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
35113513

35123514
SmallVector<DeclID, 16> memberIDs;
35133515
for (auto member : members) {
3516+
if (S.shouldSkipDecl(member))
3517+
continue;
3518+
35143519
if (!shouldSerializeMember(member))
35153520
continue;
35163521

@@ -4894,6 +4899,14 @@ static bool canSkipWhenInvalid(const Decl *D) {
48944899
return false;
48954900
}
48964901

4902+
bool Serializer::shouldSkipDecl(const Decl *D) const {
4903+
if (Options.SerializeExternalDeclsOnly &&
4904+
!DeclSerializer::isDeserializationSafe(D))
4905+
return true;
4906+
4907+
return false;
4908+
}
4909+
48974910
void Serializer::writeASTBlockEntity(const Decl *D) {
48984911
using namespace decls_block;
48994912

@@ -6364,6 +6377,9 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
63646377
continue;
63656378
}
63666379

6380+
if (shouldSkipDecl(D))
6381+
continue;
6382+
63676383
if (auto VD = dyn_cast<ValueDecl>(D)) {
63686384
if (!VD->hasName())
63696385
continue;
@@ -6412,6 +6428,8 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
64126428
nextFile->getOpaqueReturnTypeDecls(opaqueReturnTypeDecls);
64136429

64146430
for (auto TD : localTypeDecls) {
6431+
if (shouldSkipDecl(TD))
6432+
continue;
64156433

64166434
// FIXME: We should delay parsing function bodies so these type decls
64176435
// don't even get added to the file.
@@ -6442,6 +6460,9 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
64426460
}
64436461

64446462
for (auto OTD : opaqueReturnTypeDecls) {
6463+
if (shouldSkipDecl(OTD))
6464+
continue;
6465+
64456466
// FIXME: We should delay parsing function bodies so these type decls
64466467
// don't even get added to the file.
64476468
if (OTD->getDeclContext()->getInnermostSkippedFunctionContext())

Diff for: lib/Serialization/Serialization.h

+3
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,9 @@ class Serializer : public SerializerBase {
333333
/// Check if a decl is cross-referenced.
334334
bool isDeclXRef(const Decl *D) const;
335335

336+
/// Check if a decl should be skipped during serialization.
337+
bool shouldSkipDecl(const Decl *D) const;
338+
336339
/// Writes a reference to a decl in another module.
337340
void writeCrossReference(const DeclContext *DC, uint32_t pathLen = 1);
338341

Diff for: test/Driver/emit-interface.swift

-6
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,3 @@
2626
// CHECK-FILELIST: swift{{(-frontend|c)?(\.exe)?"?}} -frontend
2727
// CHECK-FILELIST-SAME: -supplementary-output-file-map
2828
// CHECK-FILELIST-NOT: emit-interface.swift{{ }}
29-
30-
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-macosx10.9 -experimental-lazy-typecheck %s -emit-module-interface -o %t/foo 2>&1 | %FileCheck -check-prefix=CHECK-LAZY-TYPECHECK %s
31-
32-
// CHECK-LAZY-TYPECHECK: swift{{(-frontend|c)?(\.exe)?"?}} -frontend
33-
// CHECK-LAZY-TYPECHECK-SAME: -experimental-lazy-typecheck
34-
// CHECK-LAZY-TYPECHECK-SAME: emit-interface.swift

0 commit comments

Comments
 (0)