Skip to content

Commit 165af08

Browse files
[Frontend] Set up output file .swiftmodule.summary
This patch focus on teaching frontend and driver to emit this file. The actual serialization and deserialization implementation will come later.
1 parent 8e7dc70 commit 165af08

18 files changed

+149
-1
lines changed

include/swift/AST/DiagnosticsFrontend.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ ERROR(error_mode_cannot_emit_module_source_info,none,
125125
"this mode does not support emitting module source info files", ())
126126
ERROR(error_mode_cannot_emit_interface,none,
127127
"this mode does not support emitting module interface files", ())
128+
ERROR(error_mode_cannot_emit_module_summary,none,
129+
"this mode does not support emitting module summary files", ())
128130
ERROR(cannot_emit_ir_skipping_function_bodies,none,
129131
"-experimental-skip-non-inlinable-function-bodies does not support "
130132
"emitting IR", ())

include/swift/Basic/FileTypes.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ TYPE("swiftmodule", SwiftModuleFile, "swiftmodule", "")
5151
TYPE("swiftdoc", SwiftModuleDocFile, "swiftdoc", "")
5252
TYPE("swiftinterface", SwiftModuleInterfaceFile, "swiftinterface", "")
5353
TYPE("private-swiftinterface", PrivateSwiftModuleInterfaceFile, "private.swiftinterface", "")
54+
TYPE("swiftmodule-summary", SwiftModuleSummaryFile, "swiftmodule.summary", "")
5455
TYPE("swiftsourceinfo", SwiftSourceInfoFile, "swiftsourceinfo", "")
5556
TYPE("assembly", Assembly, "s", "")
5657
TYPE("raw-sil", RawSIL, "sil", "")

include/swift/Basic/PrimarySpecificPaths.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ class PrimarySpecificPaths {
4949
return !SupplementaryOutputs.ModuleOutputPath.empty() ||
5050
!SupplementaryOutputs.ModuleDocOutputPath.empty();
5151
}
52+
bool haveModuleSummaryOutputPath() const {
53+
return !SupplementaryOutputs.ModuleSummaryOutputPath.empty();
54+
}
5255
};
5356
} // namespace swift
5457

include/swift/Basic/SupplementaryOutputPaths.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,9 @@ struct SupplementaryOutputPaths {
165165
/// name per symbol, we should eventually remove this.
166166
std::string LdAddCFilePath;
167167

168+
/// The path to which we should emit module summary file.
169+
std::string ModuleSummaryOutputPath;
170+
168171
SupplementaryOutputPaths() = default;
169172
SupplementaryOutputPaths(const SupplementaryOutputPaths &) = default;
170173

include/swift/Driver/Driver.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,11 @@ class Driver {
366366
file_types::ID fileType,
367367
CommandOutput *output) const;
368368

369+
void chooseModuleSummaryPath(Compilation &C, const TypeToPathMap *OutputMap,
370+
StringRef workingDirectory,
371+
llvm::SmallString<128> &Buf,
372+
CommandOutput *Output) const;
373+
369374
void chooseRemappingOutputPath(Compilation &C, const TypeToPathMap *OutputMap,
370375
CommandOutput *Output) const;
371376

include/swift/Frontend/FrontendInputsAndOutputs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ class FrontendInputsAndOutputs {
239239
bool hasModuleSourceInfoOutputPath() const;
240240
bool hasModuleInterfaceOutputPath() const;
241241
bool hasPrivateModuleInterfaceOutputPath() const;
242+
bool hasModuleSummaryOutputPath() const;
242243
bool hasTBDPath() const;
243244

244245
bool hasDependencyTrackerPath() const;

include/swift/Frontend/FrontendOptions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ class FrontendOptions {
325325
static bool canActionEmitLoadedModuleTrace(ActionType);
326326
static bool canActionEmitModule(ActionType);
327327
static bool canActionEmitModuleDoc(ActionType);
328+
static bool canActionEmitModuleSummary(ActionType);
328329
static bool canActionEmitInterface(ActionType);
329330

330331
public:

include/swift/Option/Options.td

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,17 @@ def emit_module_interface_path :
454454
ArgumentIsPath, SupplementaryOutput]>,
455455
MetaVarName<"<path>">, HelpText<"Output module interface file to <path>">;
456456

457+
def emit_module_summary :
458+
Flag<["-"], "emit-module-summary">,
459+
Flags<[NoInteractiveOption, DoesNotAffectIncrementalBuild,
460+
SupplementaryOutput]>,
461+
HelpText<"Output module summary file">;
462+
def emit_module_summary_path :
463+
Separate<["-"], "emit-module-summary-path">,
464+
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild,
465+
ArgumentIsPath, SupplementaryOutput]>,
466+
MetaVarName<"<path>">, HelpText<"Output module summary file to <path>">;
467+
457468
def emit_private_module_interface_path :
458469
Separate<["-"], "emit-private-module-interface-path">,
459470
Flags<[FrontendOption, NoInteractiveOption, HelpHidden,

lib/Basic/FileTypes.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ bool file_types::isTextual(ID Id) {
9494
case file_types::TY_SwiftModuleDocFile:
9595
case file_types::TY_SwiftSourceInfoFile:
9696
case file_types::TY_SwiftCrossImportDir:
97+
case file_types::TY_SwiftModuleSummaryFile:
9798
case file_types::TY_LLVM_BC:
9899
case file_types::TY_SerializedDiagnostics:
99100
case file_types::TY_ClangModuleFile:
@@ -138,6 +139,7 @@ bool file_types::isAfterLLVM(ID Id) {
138139
case file_types::TY_SwiftModuleDocFile:
139140
case file_types::TY_SwiftSourceInfoFile:
140141
case file_types::TY_SwiftCrossImportDir:
142+
case file_types::TY_SwiftModuleSummaryFile:
141143
case file_types::TY_SwiftOverlayFile:
142144
case file_types::TY_SerializedDiagnostics:
143145
case file_types::TY_ClangModuleFile:
@@ -189,6 +191,7 @@ bool file_types::isPartOfSwiftCompilation(ID Id) {
189191
case file_types::TY_SwiftSourceInfoFile:
190192
case file_types::TY_SwiftCrossImportDir:
191193
case file_types::TY_SwiftOverlayFile:
194+
case file_types::TY_SwiftModuleSummaryFile:
192195
case file_types::TY_SerializedDiagnostics:
193196
case file_types::TY_ClangModuleFile:
194197
case file_types::TY_SwiftDeps:

lib/Driver/Driver.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2004,6 +2004,7 @@ void Driver::buildActions(SmallVectorImpl<const Action *> &TopLevelActions,
20042004
case file_types::TY_BitstreamOptRecord:
20052005
case file_types::TY_SwiftModuleInterfaceFile:
20062006
case file_types::TY_PrivateSwiftModuleInterfaceFile:
2007+
case file_types::TY_SwiftModuleSummaryFile:
20072008
case file_types::TY_SwiftCrossImportDir:
20082009
case file_types::TY_SwiftOverlayFile:
20092010
case file_types::TY_JSONDependencies:
@@ -2824,6 +2825,10 @@ Job *Driver::buildJobsForAction(Compilation &C, const JobAction *JA,
28242825
Output.get());
28252826
}
28262827

2828+
if (isa<CompileJobAction>(JA)) {
2829+
chooseModuleSummaryPath(C, OutputMap, workingDirectory, Buf, Output.get());
2830+
}
2831+
28272832
if (isa<MergeModuleJobAction>(JA) ||
28282833
(isa<CompileJobAction>(JA) &&
28292834
OI.CompilerMode == OutputInfo::Mode::SingleCompile)) {
@@ -3177,6 +3182,22 @@ void Driver::chooseModuleInterfacePath(Compilation &C, const JobAction *JA,
31773182
output->setAdditionalOutputForType(fileType, outputPath);
31783183
}
31793184

3185+
void Driver::chooseModuleSummaryPath(Compilation &C,
3186+
const TypeToPathMap *OutputMap,
3187+
StringRef workingDirectory,
3188+
llvm::SmallString<128> &Buf,
3189+
CommandOutput *Output) const {
3190+
StringRef pathFromArgs;
3191+
if (const Arg *A =
3192+
C.getArgs().getLastArg(options::OPT_emit_module_summary_path)) {
3193+
pathFromArgs = A->getValue();
3194+
}
3195+
3196+
addAuxiliaryOutput(C, *Output, file_types::TY_SwiftModuleSummaryFile,
3197+
OutputMap, workingDirectory, pathFromArgs,
3198+
/*requireArg=*/options::OPT_emit_module_summary);
3199+
}
3200+
31803201
void Driver::chooseSerializedDiagnosticsPath(Compilation &C,
31813202
const JobAction *JA,
31823203
const TypeToPathMap *OutputMap,

lib/Driver/ToolChains.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,7 @@ const char *ToolChain::JobContext::computeFrontendModeForCompile() const {
613613
case file_types::TY_BitstreamOptRecord:
614614
case file_types::TY_SwiftModuleInterfaceFile:
615615
case file_types::TY_PrivateSwiftModuleInterfaceFile:
616+
case file_types::TY_SwiftModuleSummaryFile:
616617
case file_types::TY_SwiftSourceInfoFile:
617618
case file_types::TY_SwiftCrossImportDir:
618619
case file_types::TY_SwiftOverlayFile:
@@ -758,6 +759,9 @@ void ToolChain::JobContext::addFrontendSupplementaryOutputArguments(
758759
"-emit-loaded-module-trace-path");
759760
addOutputsOfType(arguments, Output, Args, file_types::TY_TBD,
760761
"-emit-tbd-path");
762+
addOutputsOfType(arguments, Output, Args,
763+
file_types::TY_SwiftModuleSummaryFile,
764+
"-emit-module-summary-path");
761765
}
762766

763767
ToolChain::InvocationInfo
@@ -870,6 +874,7 @@ ToolChain::constructInvocation(const BackendJobAction &job,
870874
case file_types::TY_BitstreamOptRecord:
871875
case file_types::TY_SwiftModuleInterfaceFile:
872876
case file_types::TY_PrivateSwiftModuleInterfaceFile:
877+
case file_types::TY_SwiftModuleSummaryFile:
873878
case file_types::TY_SwiftSourceInfoFile:
874879
case file_types::TY_SwiftCrossImportDir:
875880
case file_types::TY_SwiftOverlayFile:

lib/Frontend/ArgsToFrontendOptionsConverter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,11 @@ bool ArgsToFrontendOptionsConverter::checkUnusedSupplementaryOutputPaths()
559559
Diags.diagnose(SourceLoc(), diag::error_mode_cannot_emit_interface);
560560
return true;
561561
}
562+
if (!FrontendOptions::canActionEmitModuleSummary(Opts.RequestedAction) &&
563+
Opts.InputsAndOutputs.hasModuleSummaryOutputPath()) {
564+
Diags.diagnose(SourceLoc(), diag::error_mode_cannot_emit_module_summary);
565+
return true;
566+
}
562567
return false;
563568
}
564569

lib/Frontend/ArgsToFrontendOutputsConverter.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,11 +306,13 @@ SupplementaryOutputPathsComputer::getSupplementaryOutputPathsFromArguments()
306306
options::OPT_emit_module_source_info_path);
307307
auto ldAddCFileOutput = getSupplementaryFilenamesFromArguments(
308308
options::OPT_emit_ldadd_cfile_path);
309+
auto moduleSummaryOutput = getSupplementaryFilenamesFromArguments(
310+
options::OPT_emit_module_summary_path);
309311
if (!objCHeaderOutput || !moduleOutput || !moduleDocOutput ||
310312
!dependenciesFile || !referenceDependenciesFile ||
311313
!serializedDiagnostics || !fixItsOutput || !loadedModuleTrace || !TBD ||
312314
!moduleInterfaceOutput || !privateModuleInterfaceOutput ||
313-
!moduleSourceInfoOutput || !ldAddCFileOutput) {
315+
!moduleSourceInfoOutput || !ldAddCFileOutput || !moduleSummaryOutput) {
314316
return None;
315317
}
316318
std::vector<SupplementaryOutputPaths> result;
@@ -334,6 +336,7 @@ SupplementaryOutputPathsComputer::getSupplementaryOutputPathsFromArguments()
334336
sop.PrivateModuleInterfaceOutputPath = (*privateModuleInterfaceOutput)[i];
335337
sop.ModuleSourceInfoOutputPath = (*moduleSourceInfoOutput)[i];
336338
sop.LdAddCFilePath = (*ldAddCFileOutput)[i];
339+
sop.ModuleSummaryOutputPath = (*moduleSummaryOutput)[i];
337340
result.push_back(sop);
338341
}
339342
return result;
@@ -422,6 +425,10 @@ SupplementaryOutputPathsComputer::computeOutputPathsForOneInput(
422425
OPT_emit_module_source_info, pathsFromArguments.ModuleSourceInfoOutputPath,
423426
file_types::TY_SwiftSourceInfoFile, "",
424427
defaultSupplementaryOutputPathExcludingExtension);
428+
auto moduleSummaryOutputPath = determineSupplementaryOutputFilename(
429+
OPT_emit_module_summary, pathsFromArguments.ModuleSummaryOutputPath,
430+
file_types::TY_SwiftModuleSummaryFile, "",
431+
defaultSupplementaryOutputPathExcludingExtension);
425432

426433
// There is no non-path form of -emit-interface-path
427434
auto ModuleInterfaceOutputPath =
@@ -456,6 +463,7 @@ SupplementaryOutputPathsComputer::computeOutputPathsForOneInput(
456463
sop.PrivateModuleInterfaceOutputPath = PrivateModuleInterfaceOutputPath;
457464
sop.ModuleSourceInfoOutputPath = moduleSourceInfoOutputPath;
458465
sop.LdAddCFilePath = pathsFromArguments.LdAddCFilePath;
466+
sop.ModuleSummaryOutputPath = moduleSummaryOutputPath;
459467
return sop;
460468
}
461469

@@ -537,6 +545,7 @@ createFromTypeToPathMap(const TypeToPathMap *map) {
537545
{file_types::TY_TBD, paths.TBDPath},
538546
{file_types::TY_SwiftModuleInterfaceFile,
539547
paths.ModuleInterfaceOutputPath},
548+
{file_types::TY_SwiftModuleSummaryFile, paths.ModuleSummaryOutputPath},
540549
{file_types::TY_PrivateSwiftModuleInterfaceFile,
541550
paths.PrivateModuleInterfaceOutputPath}};
542551
for (const std::pair<file_types::ID, std::string &> &typeAndString :

lib/Frontend/FrontendInputsAndOutputs.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,12 @@ bool FrontendInputsAndOutputs::hasPrivateModuleInterfaceOutputPath() const {
466466
return outs.PrivateModuleInterfaceOutputPath;
467467
});
468468
}
469+
bool FrontendInputsAndOutputs::hasModuleSummaryOutputPath() const {
470+
return hasSupplementaryOutputPath(
471+
[](const SupplementaryOutputPaths &outs) -> const std::string & {
472+
return outs.ModuleSummaryOutputPath;
473+
});
474+
}
469475
bool FrontendInputsAndOutputs::hasTBDPath() const {
470476
return hasSupplementaryOutputPath(
471477
[](const SupplementaryOutputPaths &outs) -> const std::string & {

lib/Frontend/FrontendOptions.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,45 @@ bool FrontendOptions::canActionEmitCompiledSource(ActionType action) {
265265
return canActionEmitReferenceDependencies(action);
266266
}
267267

268+
bool FrontendOptions::canActionEmitModuleSummary(ActionType action) {
269+
switch (action) {
270+
case ActionType::NoneAction:
271+
case ActionType::Parse:
272+
case ActionType::ResolveImports:
273+
case ActionType::DumpParse:
274+
case ActionType::DumpInterfaceHash:
275+
case ActionType::DumpAST:
276+
case ActionType::EmitSyntax:
277+
case ActionType::PrintAST:
278+
case ActionType::EmitImportedModules:
279+
case ActionType::EmitPCH:
280+
case ActionType::DumpScopeMaps:
281+
case ActionType::DumpTypeRefinementContexts:
282+
case ActionType::DumpTypeInfo:
283+
case ActionType::EmitSILGen:
284+
case ActionType::EmitSIBGen:
285+
case ActionType::CompileModuleFromInterface:
286+
case ActionType::Immediate:
287+
case ActionType::REPL:
288+
case ActionType::EmitPCM:
289+
case ActionType::DumpPCM:
290+
case ActionType::ScanDependencies:
291+
case ActionType::Typecheck:
292+
case ActionType::MergeModules:
293+
case ActionType::EmitModuleOnly:
294+
case ActionType::PrintVersion:
295+
return false;
296+
case ActionType::EmitSIL:
297+
case ActionType::EmitSIB:
298+
case ActionType::EmitIR:
299+
case ActionType::EmitBC:
300+
case ActionType::EmitAssembly:
301+
case ActionType::EmitObject:
302+
return true;
303+
}
304+
llvm_unreachable("unhandled action");
305+
}
306+
268307
bool FrontendOptions::canActionEmitObjCHeader(ActionType action) {
269308
switch (action) {
270309
case ActionType::NoneAction:

lib/FrontendTool/FrontendTool.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,6 +1824,17 @@ static bool serializeSIB(SILModule *SM, const PrimarySpecificPaths &PSPs,
18241824
return Context.hadError();
18251825
}
18261826

1827+
static bool serializeModuleSummary(SILModule *SM,
1828+
const PrimarySpecificPaths &PSPs,
1829+
const ASTContext &Context) {
1830+
auto summaryOutputPath = PSPs.SupplementaryOutputs.ModuleSummaryOutputPath;
1831+
return withOutputFile(Context.Diags, summaryOutputPath,
1832+
[&](llvm::raw_ostream &out) {
1833+
out << "Some stuff";
1834+
return false;
1835+
});
1836+
}
1837+
18271838
static GeneratedModule
18281839
generateIR(const IRGenOptions &IRGenOpts, const TBDGenOptions &TBDOpts,
18291840
std::unique_ptr<SILModule> SM,
@@ -2048,6 +2059,12 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
20482059
if (observer)
20492060
observer->performedSILProcessing(*SM);
20502061

2062+
if (PSPs.haveModuleSummaryOutputPath()) {
2063+
if (serializeModuleSummary(SM.get(), PSPs, Context)) {
2064+
return true;
2065+
}
2066+
}
2067+
20512068
if (Action == FrontendOptions::ActionType::EmitSIB)
20522069
return serializeSIB(SM.get(), PSPs, Context, MSF);
20532070

test/Driver/emit-module-summary.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: echo 'print("Hello, World!")' >%t/main.swift
3+
// RUN: cd %t
4+
5+
// RUN: %target-swiftc_driver -emit-sib -emit-module-summary -emit-module-summary-path %t/main.swiftmodule.summary %t/main.swift
6+
// RUN: test -f %t/main.swiftmodule.summary
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: echo 'print("Hello, World!")' >%t/main.swift
3+
// RUN: cd %t
4+
5+
// RUN: %target-swift-frontend -emit-sib -emit-module-summary-path %t/main.swiftmodule.summary %t/main.swift
6+
// RUN: test -f %t/main.swiftmodule.summary
7+
8+
// RUN: echo '%t/main.swift: { swiftmodule-summary: %t/foo.swiftmodule.summary }' >%t/filemap.yaml
9+
// RUN: %target-swift-frontend -emit-sib -supplementary-output-file-map %t/filemap.yaml %t/main.swift
10+
// RUN: test -f %t/foo.swiftmodule.summary

0 commit comments

Comments
 (0)