diff options
Diffstat (limited to 'lib/CodeGen/CodeGenAction.cpp')
| -rw-r--r-- | lib/CodeGen/CodeGenAction.cpp | 63 | 
1 files changed, 37 insertions, 26 deletions
diff --git a/lib/CodeGen/CodeGenAction.cpp b/lib/CodeGen/CodeGenAction.cpp index fd4506f2d197e..0ae9ea427d659 100644 --- a/lib/CodeGen/CodeGenAction.cpp +++ b/lib/CodeGen/CodeGenAction.cpp @@ -1,9 +1,8 @@  //===--- CodeGenAction.cpp - LLVM Code Generation Frontend Action ---------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===// @@ -20,6 +19,7 @@  #include "clang/Basic/TargetInfo.h"  #include "clang/CodeGen/BackendUtil.h"  #include "clang/CodeGen/ModuleBuilder.h" +#include "clang/Driver/DriverDiagnostic.h"  #include "clang/Frontend/CompilerInstance.h"  #include "clang/Frontend/FrontendDiagnostic.h"  #include "clang/Lex/Preprocessor.h" @@ -31,6 +31,7 @@  #include "llvm/IR/GlobalValue.h"  #include "llvm/IR/LLVMContext.h"  #include "llvm/IR/Module.h" +#include "llvm/IR/RemarkStreamer.h"  #include "llvm/IRReader/IRReader.h"  #include "llvm/Linker/Linker.h"  #include "llvm/Pass.h" @@ -261,28 +262,37 @@ namespace clang {            Ctx.getDiagnosticHandler();        Ctx.setDiagnosticHandler(llvm::make_unique<ClangDiagnosticHandler>(          CodeGenOpts, this)); -      Ctx.setDiagnosticsHotnessRequested(CodeGenOpts.DiagnosticsWithHotness); -      if (CodeGenOpts.DiagnosticsHotnessThreshold != 0) -        Ctx.setDiagnosticsHotnessThreshold( -            CodeGenOpts.DiagnosticsHotnessThreshold); - -      std::unique_ptr<llvm::ToolOutputFile> OptRecordFile; -      if (!CodeGenOpts.OptRecordFile.empty()) { -        std::error_code EC; -        OptRecordFile = llvm::make_unique<llvm::ToolOutputFile>( -            CodeGenOpts.OptRecordFile, EC, sys::fs::F_None); -        if (EC) { -          Diags.Report(diag::err_cannot_open_file) << -            CodeGenOpts.OptRecordFile << EC.message(); -          return; -        } - -        Ctx.setDiagnosticsOutputFile( -            llvm::make_unique<yaml::Output>(OptRecordFile->os())); -        if (CodeGenOpts.getProfileUse() != CodeGenOptions::ProfileNone) -          Ctx.setDiagnosticsHotnessRequested(true); +      Expected<std::unique_ptr<llvm::ToolOutputFile>> OptRecordFileOrErr = +          setupOptimizationRemarks(Ctx, CodeGenOpts.OptRecordFile, +                                   CodeGenOpts.OptRecordPasses, +                                   CodeGenOpts.OptRecordFormat, +                                   CodeGenOpts.DiagnosticsWithHotness, +                                   CodeGenOpts.DiagnosticsHotnessThreshold); + +      if (Error E = OptRecordFileOrErr.takeError()) { +        handleAllErrors( +            std::move(E), +            [&](const RemarkSetupFileError &E) { +              Diags.Report(diag::err_cannot_open_file) +                  << CodeGenOpts.OptRecordFile << E.message(); +            }, +            [&](const RemarkSetupPatternError &E) { +              Diags.Report(diag::err_drv_optimization_remark_pattern) +                  << E.message() << CodeGenOpts.OptRecordPasses; +            }, +            [&](const RemarkSetupFormatError &E) { +              Diags.Report(diag::err_drv_optimization_remark_format) +                  << CodeGenOpts.OptRecordFormat; +            }); +        return;        } +      std::unique_ptr<llvm::ToolOutputFile> OptRecordFile = +          std::move(*OptRecordFileOrErr); + +      if (OptRecordFile && +          CodeGenOpts.getProfileUse() != CodeGenOptions::ProfileNone) +        Ctx.setDiagnosticsHotnessRequested(true);        // Link each LinkModule into our module.        if (LinkInModules()) @@ -936,7 +946,8 @@ static void BitcodeInlineAsmDiagHandler(const llvm::SMDiagnostic &SM,    Diags->Report(DiagID).AddString("cannot compile inline asm");  } -std::unique_ptr<llvm::Module> CodeGenAction::loadModule(MemoryBufferRef MBRef) { +std::unique_ptr<llvm::Module> +CodeGenAction::loadModule(MemoryBufferRef MBRef) {    CompilerInstance &CI = getCompilerInstance();    SourceManager &SM = CI.getSourceManager(); @@ -1014,7 +1025,7 @@ void CodeGenAction::ExecuteAction() {      bool Invalid;      SourceManager &SM = CI.getSourceManager();      FileID FID = SM.getMainFileID(); -    llvm::MemoryBuffer *MainFile = SM.getBuffer(FID, &Invalid); +    const llvm::MemoryBuffer *MainFile = SM.getBuffer(FID, &Invalid);      if (Invalid)        return;  | 
