From: Davide Italiano Date: Fri, 10 Feb 2017 23:49:38 +0000 (+0000) Subject: [LTO] Share the optimization remarks setup between Thin/Full LTO. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e2d3e35b7171b25c859106c0f467771bde6850c;p=llvm [LTO] Share the optimization remarks setup between Thin/Full LTO. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294807 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/LTO/LTO.h b/include/llvm/LTO/LTO.h index 2aeb7e8fda9..f7debe062c5 100644 --- a/include/llvm/LTO/LTO.h +++ b/include/llvm/LTO/LTO.h @@ -26,6 +26,7 @@ #include "llvm/Linker/IRMover.h" #include "llvm/Object/IRObjectFile.h" #include "llvm/Support/Error.h" +#include "llvm/Support/ToolOutputFile.h" #include "llvm/Support/thread.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Transforms/IPO/FunctionImport.h" @@ -69,6 +70,11 @@ std::string getThinLTOOutputFile(const std::string &Path, const std::string &OldPrefix, const std::string &NewPrefix); +/// Setup optimization remarks. +Expected> +setupOptimizationRemarks(LLVMContext &Context, StringRef LTORemarksFilename, + bool LTOPassRemarksWithHotness, int Count = -1); + class LTO; struct SymbolResolution; class ThinBackendProc; diff --git a/include/llvm/LTO/legacy/LTOCodeGenerator.h b/include/llvm/LTO/legacy/LTOCodeGenerator.h index 64833c094ea..ef62a840cbd 100644 --- a/include/llvm/LTO/legacy/LTOCodeGenerator.h +++ b/include/llvm/LTO/legacy/LTOCodeGenerator.h @@ -207,7 +207,6 @@ private: void emitError(const std::string &ErrMsg); void emitWarning(const std::string &ErrMsg); - Expected> setupOptimizationRemarks(); void finishOptimizationRemarks(); LLVMContext &Context; diff --git a/lib/LTO/LTO.cpp b/lib/LTO/LTO.cpp index 9a9240f64c1..8f873242fa5 100644 --- a/lib/LTO/LTO.cpp +++ b/lib/LTO/LTO.cpp @@ -987,3 +987,27 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache, return BackendProc->wait(); } + +Expected> +lto::setupOptimizationRemarks(LLVMContext &Context, + StringRef LTORemarksFilename, + bool LTOPassRemarksWithHotness, int Count) { + if (LTORemarksFilename.empty()) + return nullptr; + + std::string Filename = LTORemarksFilename; + if (Count != -1) + Filename += ".thin." + llvm::utostr(Count) + ".yaml"; + + std::error_code EC; + auto DiagnosticFile = + llvm::make_unique(Filename, EC, sys::fs::F_None); + if (EC) + return errorCodeToError(EC); + Context.setDiagnosticsOutputFile( + llvm::make_unique(DiagnosticFile->os())); + if (LTOPassRemarksWithHotness) + Context.setDiagnosticHotnessRequested(true); + DiagnosticFile->keep(); + return std::move(DiagnosticFile); +} diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index 4853751e0e4..bb1fb90a677 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -35,6 +35,7 @@ #include "llvm/IR/Module.h" #include "llvm/IR/Verifier.h" #include "llvm/InitializePasses.h" +#include "llvm/LTO/LTO.h" #include "llvm/LTO/legacy/LTOModule.h" #include "llvm/LTO/legacy/UpdateCompilerUsed.h" #include "llvm/Linker/Linker.h" @@ -506,24 +507,6 @@ void LTOCodeGenerator::verifyMergedModuleOnce() { report_fatal_error("Broken module found, compilation aborted!"); } - -Expected> -LTOCodeGenerator::setupOptimizationRemarks() { - if (LTORemarksFilename.empty()) - return nullptr; - - std::error_code EC; - auto DiagnosticFile = llvm::make_unique( - LTORemarksFilename, EC, sys::fs::F_None); - if (EC) - return errorCodeToError(EC); - Context.setDiagnosticsOutputFile( - llvm::make_unique(DiagnosticFile->os())); - if (LTOPassRemarksWithHotness) - Context.setDiagnosticHotnessRequested(true); - return std::move(DiagnosticFile); -} - void LTOCodeGenerator::finishOptimizationRemarks() { if (DiagnosticOutputFile) { DiagnosticOutputFile->keep(); @@ -539,7 +522,8 @@ bool LTOCodeGenerator::optimize(bool DisableVerify, bool DisableInline, if (!this->determineTarget()) return false; - auto DiagFileOrErr = setupOptimizationRemarks(); + auto DiagFileOrErr = lto::setupOptimizationRemarks( + Context, LTORemarksFilename, LTOPassRemarksWithHotness); if (!DiagFileOrErr) { errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n"; report_fatal_error("Can't get an output file for the remarks"); diff --git a/lib/LTO/ThinLTOCodeGenerator.cpp b/lib/LTO/ThinLTOCodeGenerator.cpp index 104fb199da0..22b89fe4740 100644 --- a/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/lib/LTO/ThinLTOCodeGenerator.cpp @@ -73,27 +73,6 @@ namespace { static cl::opt ThreadCount("threads", cl::init(llvm::heavyweight_hardware_concurrency())); -Expected> -setupOptimizationRemarks(LLVMContext &Ctx, int Count) { - if (LTOPassRemarksWithHotness) - Ctx.setDiagnosticHotnessRequested(true); - - if (LTORemarksFilename.empty()) - return nullptr; - - std::string FileName = - LTORemarksFilename + ".thin." + llvm::utostr(Count) + ".yaml"; - std::error_code EC; - auto DiagnosticOutputFile = - llvm::make_unique(FileName, EC, sys::fs::F_None); - if (EC) - return errorCodeToError(EC); - Ctx.setDiagnosticsOutputFile( - llvm::make_unique(DiagnosticOutputFile->os())); - DiagnosticOutputFile->keep(); - return std::move(DiagnosticOutputFile); -} - // Simple helper to save temporary files for debug. static void saveTempBitcode(const Module &TheModule, StringRef TempDir, unsigned count, StringRef Suffix) { @@ -988,7 +967,8 @@ void ThinLTOCodeGenerator::run() { LLVMContext Context; Context.setDiscardValueNames(LTODiscardValueNames); Context.enableDebugTypeODRUniquing(); - auto DiagFileOrErr = setupOptimizationRemarks(Context, count); + auto DiagFileOrErr = lto::setupOptimizationRemarks( + Context, LTORemarksFilename, LTOPassRemarksWithHotness, count); if (!DiagFileOrErr) { errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n"; report_fatal_error("ThinLTO: Can't get an output file for the "