[LTO] Share the optimization remarks setup between Thin/Full LTO.

llvm-svn: 294807
This commit is contained in:
Davide Italiano 2017-02-10 23:49:38 +00:00
parent c18de74165
commit 690ed9dec7
5 changed files with 35 additions and 42 deletions

View File

@ -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<std::unique_ptr<tool_output_file>>
setupOptimizationRemarks(LLVMContext &Context, StringRef LTORemarksFilename,
bool LTOPassRemarksWithHotness, int Count = -1);
class LTO;
struct SymbolResolution;
class ThinBackendProc;

View File

@ -207,7 +207,6 @@ private:
void emitError(const std::string &ErrMsg);
void emitWarning(const std::string &ErrMsg);
Expected<std::unique_ptr<tool_output_file>> setupOptimizationRemarks();
void finishOptimizationRemarks();
LLVMContext &Context;

View File

@ -987,3 +987,27 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache,
return BackendProc->wait();
}
Expected<std::unique_ptr<tool_output_file>>
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<tool_output_file>(Filename, EC, sys::fs::F_None);
if (EC)
return errorCodeToError(EC);
Context.setDiagnosticsOutputFile(
llvm::make_unique<yaml::Output>(DiagnosticFile->os()));
if (LTOPassRemarksWithHotness)
Context.setDiagnosticHotnessRequested(true);
DiagnosticFile->keep();
return std::move(DiagnosticFile);
}

View File

@ -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<std::unique_ptr<tool_output_file>>
LTOCodeGenerator::setupOptimizationRemarks() {
if (LTORemarksFilename.empty())
return nullptr;
std::error_code EC;
auto DiagnosticFile = llvm::make_unique<tool_output_file>(
LTORemarksFilename, EC, sys::fs::F_None);
if (EC)
return errorCodeToError(EC);
Context.setDiagnosticsOutputFile(
llvm::make_unique<yaml::Output>(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");

View File

@ -73,27 +73,6 @@ namespace {
static cl::opt<int>
ThreadCount("threads", cl::init(llvm::heavyweight_hardware_concurrency()));
Expected<std::unique_ptr<tool_output_file>>
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<tool_output_file>(FileName, EC, sys::fs::F_None);
if (EC)
return errorCodeToError(EC);
Ctx.setDiagnosticsOutputFile(
llvm::make_unique<yaml::Output>(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 "