Skip to content

Commit 43fb346

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 e387b36 commit 43fb346

18 files changed

+151
-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("swiftmodulesummary", SwiftModuleSummaryFile, "swiftmodulesummary", "")
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
@@ -333,6 +333,7 @@ class FrontendOptions {
333333
static bool canActionEmitLoadedModuleTrace(ActionType);
334334
static bool canActionEmitModule(ActionType);
335335
static bool canActionEmitModuleDoc(ActionType);
336+
static bool canActionEmitModuleSummary(ActionType);
336337
static bool canActionEmitInterface(ActionType);
337338

338339
public:

include/swift/Option/Options.td

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,17 @@ def emit_module_path_EQ : Joined<["-"], "emit-module-path=">,
443443
ArgumentIsPath, SupplementaryOutput]>,
444444
Alias<emit_module_path>;
445445

446+
def emit_module_summary :
447+
Flag<["-"], "emit-module-summary">,
448+
Flags<[NoInteractiveOption, DoesNotAffectIncrementalBuild,
449+
SupplementaryOutput]>,
450+
HelpText<"Output module summary file">;
451+
def emit_module_summary_path :
452+
Separate<["-"], "emit-module-summary-path">,
453+
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild,
454+
ArgumentIsPath, SupplementaryOutput]>,
455+
MetaVarName<"<path>">, HelpText<"Output module summary file to <path>">;
456+
446457
def emit_module_interface :
447458
Flag<["-"], "emit-module-interface">,
448459
Flags<[NoInteractiveOption, DoesNotAffectIncrementalBuild,

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:
@@ -2855,6 +2856,10 @@ Job *Driver::buildJobsForAction(Compilation &C, const JobAction *JA,
28552856
Output.get());
28562857
}
28572858

2859+
if (isa<CompileJobAction>(JA)) {
2860+
chooseModuleSummaryPath(C, OutputMap, workingDirectory, Buf, Output.get());
2861+
}
2862+
28582863
if (isa<MergeModuleJobAction>(JA) ||
28592864
(isa<CompileJobAction>(JA) &&
28602865
OI.CompilerMode == OutputInfo::Mode::SingleCompile)) {
@@ -3208,6 +3213,22 @@ void Driver::chooseModuleInterfacePath(Compilation &C, const JobAction *JA,
32083213
output->setAdditionalOutputForType(fileType, outputPath);
32093214
}
32103215

3216+
void Driver::chooseModuleSummaryPath(Compilation &C,
3217+
const TypeToPathMap *OutputMap,
3218+
StringRef workingDirectory,
3219+
llvm::SmallString<128> &Buf,
3220+
CommandOutput *Output) const {
3221+
StringRef pathFromArgs;
3222+
if (const Arg *A =
3223+
C.getArgs().getLastArg(options::OPT_emit_module_summary_path)) {
3224+
pathFromArgs = A->getValue();
3225+
}
3226+
3227+
addAuxiliaryOutput(C, *Output, file_types::TY_SwiftModuleSummaryFile,
3228+
OutputMap, workingDirectory, pathFromArgs,
3229+
/*requireArg=*/options::OPT_emit_module_summary);
3230+
}
3231+
32113232
void Driver::chooseSerializedDiagnosticsPath(Compilation &C,
32123233
const JobAction *JA,
32133234
const TypeToPathMap *OutputMap,

lib/Driver/ToolChains.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@ const char *ToolChain::JobContext::computeFrontendModeForCompile() const {
620620
case file_types::TY_BitstreamOptRecord:
621621
case file_types::TY_SwiftModuleInterfaceFile:
622622
case file_types::TY_PrivateSwiftModuleInterfaceFile:
623+
case file_types::TY_SwiftModuleSummaryFile:
623624
case file_types::TY_SwiftSourceInfoFile:
624625
case file_types::TY_SwiftCrossImportDir:
625626
case file_types::TY_SwiftOverlayFile:
@@ -765,6 +766,9 @@ void ToolChain::JobContext::addFrontendSupplementaryOutputArguments(
765766
"-emit-loaded-module-trace-path");
766767
addOutputsOfType(arguments, Output, Args, file_types::TY_TBD,
767768
"-emit-tbd-path");
769+
addOutputsOfType(arguments, Output, Args,
770+
file_types::TY_SwiftModuleSummaryFile,
771+
"-emit-module-summary-path");
768772
}
769773

770774
ToolChain::InvocationInfo
@@ -877,6 +881,7 @@ ToolChain::constructInvocation(const BackendJobAction &job,
877881
case file_types::TY_BitstreamOptRecord:
878882
case file_types::TY_SwiftModuleInterfaceFile:
879883
case file_types::TY_PrivateSwiftModuleInterfaceFile:
884+
case file_types::TY_SwiftModuleSummaryFile:
880885
case file_types::TY_SwiftSourceInfoFile:
881886
case file_types::TY_SwiftCrossImportDir:
882887
case file_types::TY_SwiftOverlayFile:

lib/Frontend/ArgsToFrontendOptionsConverter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,11 @@ bool ArgsToFrontendOptionsConverter::checkUnusedSupplementaryOutputPaths()
565565
Diags.diagnose(SourceLoc(), diag::error_mode_cannot_emit_interface);
566566
return true;
567567
}
568+
if (!FrontendOptions::canActionEmitModuleSummary(Opts.RequestedAction) &&
569+
Opts.InputsAndOutputs.hasModuleSummaryOutputPath()) {
570+
Diags.diagnose(SourceLoc(), diag::error_mode_cannot_emit_module_summary);
571+
return true;
572+
}
568573
return false;
569574
}
570575

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: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,47 @@ bool FrontendOptions::canActionEmitCompiledSource(ActionType action) {
274274
return canActionEmitReferenceDependencies(action);
275275
}
276276

277+
bool FrontendOptions::canActionEmitModuleSummary(ActionType action) {
278+
switch (action) {
279+
case ActionType::NoneAction:
280+
case ActionType::Parse:
281+
case ActionType::ResolveImports:
282+
case ActionType::DumpParse:
283+
case ActionType::DumpInterfaceHash:
284+
case ActionType::DumpAST:
285+
case ActionType::EmitSyntax:
286+
case ActionType::PrintAST:
287+
case ActionType::EmitImportedModules:
288+
case ActionType::EmitPCH:
289+
case ActionType::DumpScopeMaps:
290+
case ActionType::DumpTypeRefinementContexts:
291+
case ActionType::DumpTypeInfo:
292+
case ActionType::EmitSILGen:
293+
case ActionType::EmitSIBGen:
294+
case ActionType::CompileModuleFromInterface:
295+
case ActionType::TypecheckModuleFromInterface:
296+
case ActionType::Immediate:
297+
case ActionType::REPL:
298+
case ActionType::EmitPCM:
299+
case ActionType::DumpPCM:
300+
case ActionType::ScanDependencies:
301+
case ActionType::ScanClangDependencies:
302+
case ActionType::Typecheck:
303+
case ActionType::MergeModules:
304+
case ActionType::EmitModuleOnly:
305+
case ActionType::PrintVersion:
306+
return false;
307+
case ActionType::EmitSIL:
308+
case ActionType::EmitSIB:
309+
case ActionType::EmitIR:
310+
case ActionType::EmitBC:
311+
case ActionType::EmitAssembly:
312+
case ActionType::EmitObject:
313+
return true;
314+
}
315+
llvm_unreachable("unhandled action");
316+
}
317+
277318
bool FrontendOptions::canActionEmitObjCHeader(ActionType action) {
278319
switch (action) {
279320
case ActionType::NoneAction:

lib/FrontendTool/FrontendTool.cpp

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

1902+
static bool serializeModuleSummary(SILModule *SM,
1903+
const PrimarySpecificPaths &PSPs,
1904+
const ASTContext &Context) {
1905+
auto summaryOutputPath = PSPs.SupplementaryOutputs.ModuleSummaryOutputPath;
1906+
return withOutputFile(Context.Diags, summaryOutputPath,
1907+
[&](llvm::raw_ostream &out) {
1908+
out << "Some stuff";
1909+
return false;
1910+
});
1911+
}
1912+
19021913
static GeneratedModule
19031914
generateIR(const IRGenOptions &IRGenOpts, const TBDGenOptions &TBDOpts,
19041915
std::unique_ptr<SILModule> SM,
@@ -2123,6 +2134,12 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
21232134
if (observer)
21242135
observer->performedSILProcessing(*SM);
21252136

2137+
if (PSPs.haveModuleSummaryOutputPath()) {
2138+
if (serializeModuleSummary(SM.get(), PSPs, Context)) {
2139+
return true;
2140+
}
2141+
}
2142+
21262143
if (Action == FrontendOptions::ActionType::EmitSIB)
21272144
return serializeSIB(SM.get(), PSPs, Context, MSF);
21282145

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.swiftmodulesummary %t/main.swift
6+
// RUN: test -f %t/main.swiftmodulesummary
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.swiftmodulesummary %t/main.swift
6+
// RUN: test -f %t/main.swiftmodulesummary
7+
8+
// RUN: echo '"%/t/main.swift": { swiftmodulesummary: "%/t/foo.swiftmodulesummary" }' > %/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.swiftmodulesummary

0 commit comments

Comments
 (0)