]> granicus.if.org Git - llvm/commitdiff
[lib/LTO] Rework optimization remarkers setup.
authorDavide Italiano <davide@freebsd.org>
Fri, 10 Feb 2017 22:16:17 +0000 (22:16 +0000)
committerDavide Italiano <davide@freebsd.org>
Fri, 10 Feb 2017 22:16:17 +0000 (22:16 +0000)
This makes this code much more similar to what ThinLTO is
using (also API wise), so now we can probably use a single
code path instead of copying stuff around.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294792 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/LTO/legacy/LTOCodeGenerator.h
lib/LTO/LTOCodeGenerator.cpp

index f1468211128030778d2f45ebb01ad6bf8eb1350f..64833c094eacb0d5eeceb1d35a7a3b4be0a91059 100644 (file)
@@ -41,6 +41,7 @@
 #include "llvm/ADT/StringSet.h"
 #include "llvm/IR/GlobalValue.h"
 #include "llvm/IR/Module.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/ToolOutputFile.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetOptions.h"
@@ -206,7 +207,7 @@ private:
   void emitError(const std::string &ErrMsg);
   void emitWarning(const std::string &ErrMsg);
 
-  bool setupOptimizationRemarks();
+  Expected<std::unique_ptr<tool_output_file>> setupOptimizationRemarks();
   void finishOptimizationRemarks();
 
   LLVMContext &Context;
index 6af31e61f94637342b2949ab9d0abd87095e7676..4853751e0e4040df73a005d3c2658ee341aeb910 100644 (file)
@@ -506,23 +506,22 @@ void LTOCodeGenerator::verifyMergedModuleOnce() {
     report_fatal_error("Broken module found, compilation aborted!");
 }
 
-bool LTOCodeGenerator::setupOptimizationRemarks() {
-  if (LTORemarksFilename != "") {
-    std::error_code EC;
-    DiagnosticOutputFile = llvm::make_unique<tool_output_file>(
-        LTORemarksFilename, EC, sys::fs::F_None);
-    if (EC) {
-      emitError(EC.message());
-      return false;
-    }
-    Context.setDiagnosticsOutputFile(
-        llvm::make_unique<yaml::Output>(DiagnosticOutputFile->os()));
-  }
 
+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 true;
+  return std::move(DiagnosticFile);
 }
 
 void LTOCodeGenerator::finishOptimizationRemarks() {
@@ -540,8 +539,12 @@ bool LTOCodeGenerator::optimize(bool DisableVerify, bool DisableInline,
   if (!this->determineTarget())
     return false;
 
-  if (!setupOptimizationRemarks())
-    return false;
+  auto DiagFileOrErr = setupOptimizationRemarks();
+  if (!DiagFileOrErr) {
+    errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n";
+    report_fatal_error("Can't get an output file for the remarks");
+  }
+  DiagnosticOutputFile = std::move(*DiagFileOrErr);
 
   // We always run the verifier once on the merged module, the `DisableVerify`
   // parameter only applies to subsequent verify.