Skip to content

Commit 9685179

Browse files
authored
Merge pull request #33324 from kateinoigakukun/katei/swift-module-summary/frontend
[Frontend] Set up output file .swiftmodule.summary
2 parents 537017a + 43fb346 commit 9685179

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
@@ -240,6 +240,7 @@ class FrontendInputsAndOutputs {
240240
bool hasModuleSourceInfoOutputPath() const;
241241
bool hasModuleInterfaceOutputPath() const;
242242
bool hasPrivateModuleInterfaceOutputPath() const;
243+
bool hasModuleSummaryOutputPath() const;
243244
bool hasTBDPath() const;
244245

245246
bool hasDependencyTrackerPath() const;

include/swift/Frontend/FrontendOptions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ class FrontendOptions {
340340
static bool canActionEmitLoadedModuleTrace(ActionType);
341341
static bool canActionEmitModule(ActionType);
342342
static bool canActionEmitModuleDoc(ActionType);
343+
static bool canActionEmitModuleSummary(ActionType);
343344
static bool canActionEmitInterface(ActionType);
344345

345346
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
@@ -618,6 +618,7 @@ const char *ToolChain::JobContext::computeFrontendModeForCompile() const {
618618
case file_types::TY_BitstreamOptRecord:
619619
case file_types::TY_SwiftModuleInterfaceFile:
620620
case file_types::TY_PrivateSwiftModuleInterfaceFile:
621+
case file_types::TY_SwiftModuleSummaryFile:
621622
case file_types::TY_SwiftSourceInfoFile:
622623
case file_types::TY_SwiftCrossImportDir:
623624
case file_types::TY_SwiftOverlayFile:
@@ -763,6 +764,9 @@ void ToolChain::JobContext::addFrontendSupplementaryOutputArguments(
763764
"-emit-loaded-module-trace-path");
764765
addOutputsOfType(arguments, Output, Args, file_types::TY_TBD,
765766
"-emit-tbd-path");
767+
addOutputsOfType(arguments, Output, Args,
768+
file_types::TY_SwiftModuleSummaryFile,
769+
"-emit-module-summary-path");
766770
}
767771

768772
ToolChain::InvocationInfo
@@ -875,6 +879,7 @@ ToolChain::constructInvocation(const BackendJobAction &job,
875879
case file_types::TY_BitstreamOptRecord:
876880
case file_types::TY_SwiftModuleInterfaceFile:
877881
case file_types::TY_PrivateSwiftModuleInterfaceFile:
882+
case file_types::TY_SwiftModuleSummaryFile:
878883
case file_types::TY_SwiftSourceInfoFile:
879884
case file_types::TY_SwiftCrossImportDir:
880885
case file_types::TY_SwiftOverlayFile:

lib/Frontend/ArgsToFrontendOptionsConverter.cpp

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

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
@@ -358,6 +358,47 @@ bool FrontendOptions::canActionEmitCompiledSource(ActionType action) {
358358
return canActionEmitReferenceDependencies(action);
359359
}
360360

361+
bool FrontendOptions::canActionEmitModuleSummary(ActionType action) {
362+
switch (action) {
363+
case ActionType::NoneAction:
364+
case ActionType::Parse:
365+
case ActionType::ResolveImports:
366+
case ActionType::DumpParse:
367+
case ActionType::DumpInterfaceHash:
368+
case ActionType::DumpAST:
369+
case ActionType::EmitSyntax:
370+
case ActionType::PrintAST:
371+
case ActionType::EmitImportedModules:
372+
case ActionType::EmitPCH:
373+
case ActionType::DumpScopeMaps:
374+
case ActionType::DumpTypeRefinementContexts:
375+
case ActionType::DumpTypeInfo:
376+
case ActionType::EmitSILGen:
377+
case ActionType::EmitSIBGen:
378+
case ActionType::CompileModuleFromInterface:
379+
case ActionType::TypecheckModuleFromInterface:
380+
case ActionType::Immediate:
381+
case ActionType::REPL:
382+
case ActionType::EmitPCM:
383+
case ActionType::DumpPCM:
384+
case ActionType::ScanDependencies:
385+
case ActionType::ScanClangDependencies:
386+
case ActionType::Typecheck:
387+
case ActionType::MergeModules:
388+
case ActionType::EmitModuleOnly:
389+
case ActionType::PrintVersion:
390+
return false;
391+
case ActionType::EmitSIL:
392+
case ActionType::EmitSIB:
393+
case ActionType::EmitIR:
394+
case ActionType::EmitBC:
395+
case ActionType::EmitAssembly:
396+
case ActionType::EmitObject:
397+
return true;
398+
}
399+
llvm_unreachable("unhandled action");
400+
}
401+
361402
bool FrontendOptions::canActionEmitObjCHeader(ActionType action) {
362403
switch (action) {
363404
case ActionType::NoneAction:

lib/FrontendTool/FrontendTool.cpp

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

2021+
static bool serializeModuleSummary(SILModule *SM,
2022+
const PrimarySpecificPaths &PSPs,
2023+
const ASTContext &Context) {
2024+
auto summaryOutputPath = PSPs.SupplementaryOutputs.ModuleSummaryOutputPath;
2025+
return withOutputFile(Context.Diags, summaryOutputPath,
2026+
[&](llvm::raw_ostream &out) {
2027+
out << "Some stuff";
2028+
return false;
2029+
});
2030+
}
2031+
20212032
static GeneratedModule
20222033
generateIR(const IRGenOptions &IRGenOpts, const TBDGenOptions &TBDOpts,
20232034
std::unique_ptr<SILModule> SM,
@@ -2242,6 +2253,12 @@ static bool performCompileStepsPostSILGen(CompilerInstance &Instance,
22422253
if (observer)
22432254
observer->performedSILProcessing(*SM);
22442255

2256+
if (PSPs.haveModuleSummaryOutputPath()) {
2257+
if (serializeModuleSummary(SM.get(), PSPs, Context)) {
2258+
return true;
2259+
}
2260+
}
2261+
22452262
if (Action == FrontendOptions::ActionType::EmitSIB)
22462263
return serializeSIB(SM.get(), PSPs, Context, MSF);
22472264

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)