diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/LTO/LTO.cpp | 31 | ||||
-rw-r--r-- | llvm/lib/LTO/LTOCodeGenerator.cpp | 23 |
2 files changed, 41 insertions, 13 deletions
diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index 1accbf40b96..ab5b78071c6 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -885,16 +885,10 @@ Error LTO::run(AddStreamFn AddStream, NativeObjectCache Cache) { isPrevailing, Conf.OptLevel > 0); // Setup output file to emit statistics. - std::unique_ptr<ToolOutputFile> StatsFile = nullptr; - if (!Conf.StatsFile.empty()) { - EnableStatistics(false); - std::error_code EC; - StatsFile = - llvm::make_unique<ToolOutputFile>(Conf.StatsFile, EC, sys::fs::F_None); - if (EC) - return errorCodeToError(EC); - StatsFile->keep(); - } + auto StatsFileOrErr = setupStatsFile(Conf.StatsFile); + if (!StatsFileOrErr) + return StatsFileOrErr.takeError(); + std::unique_ptr<ToolOutputFile> StatsFile = std::move(StatsFileOrErr.get()); // Finalize linking of regular LTO modules containing summaries now that // we have computed liveness information. @@ -1343,3 +1337,20 @@ lto::setupOptimizationRemarks(LLVMContext &Context, DiagnosticFile->keep(); return std::move(DiagnosticFile); } + +Expected<std::unique_ptr<ToolOutputFile>> +lto::setupStatsFile(StringRef StatsFilename) { + // Setup output file to emit statistics. + if (StatsFilename.empty()) + return nullptr; + + llvm::EnableStatistics(false); + std::error_code EC; + auto StatsFile = + llvm::make_unique<ToolOutputFile>(StatsFilename, EC, sys::fs::F_None); + if (EC) + return errorCodeToError(EC); + + StatsFile->keep(); + return std::move(StatsFile); +} diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp index f02907f7a86..79d41ee8966 100644 --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -95,6 +95,11 @@ cl::opt<bool> LTOPassRemarksWithHotness( "lto-pass-remarks-with-hotness", cl::desc("With PGO, include profile count in optimization remarks"), cl::Hidden); + +cl::opt<std::string> LTOStatsFile( + "lto-stats-file", + cl::desc("Save statistics to the specified file"), + cl::Hidden); } LTOCodeGenerator::LTOCodeGenerator(LLVMContext &Context) @@ -518,6 +523,14 @@ bool LTOCodeGenerator::optimize(bool DisableVerify, bool DisableInline, } DiagnosticOutputFile = std::move(*DiagFileOrErr); + // Setup output file to emit statistics. + auto StatsFileOrErr = lto::setupStatsFile(LTOStatsFile); + if (!StatsFileOrErr) { + errs() << "Error: " << toString(StatsFileOrErr.takeError()) << "\n"; + report_fatal_error("Can't get an output file for the statistics"); + } + StatsFile = std::move(StatsFileOrErr.get()); + // We always run the verifier once on the merged module, the `DisableVerify` // parameter only applies to subsequent verify. verifyMergedModuleOnce(); @@ -584,9 +597,13 @@ bool LTOCodeGenerator::compileOptimized(ArrayRef<raw_pwrite_stream *> Out) { [&]() { return createTargetMachine(); }, FileType, ShouldRestoreGlobalsLinkage); - // If statistics were requested, print them out after codegen. - if (llvm::AreStatisticsEnabled()) - llvm::PrintStatistics(); + // If statistics were requested, save them to the specified file or + // print them out after codegen. + if (StatsFile) + PrintStatisticsJSON(StatsFile->os()); + else if (AreStatisticsEnabled()) + PrintStatistics(); + reportAndResetTimings(); finishOptimizationRemarks(); |