diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2020-01-22 21:31:48 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2020-01-22 21:31:48 +0000 | 
| commit | a7dea1671b87c07d2d266f836bfa8b58efc7c134 (patch) | |
| tree | ff67344b3b18fc14e0cec322849afb4e3b94ea56 /contrib/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp | |
| parent | 5c713029ff7939f90b6f96df914953e758855a7f (diff) | |
| parent | 519fc96c475680de2cc49e7811dbbfadb912cbcc (diff) | |
Notes
Diffstat (limited to 'contrib/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp')
| -rw-r--r-- | contrib/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp | 41 | 
1 files changed, 35 insertions, 6 deletions
diff --git a/contrib/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp b/contrib/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp index 0ae9ea427d65..87bda4a0fc2c 100644 --- a/contrib/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp +++ b/contrib/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp @@ -14,7 +14,9 @@  #include "clang/AST/ASTContext.h"  #include "clang/AST/DeclCXX.h"  #include "clang/AST/DeclGroup.h" +#include "clang/Basic/DiagnosticFrontend.h"  #include "clang/Basic/FileManager.h" +#include "clang/Basic/LangStandard.h"  #include "clang/Basic/SourceManager.h"  #include "clang/Basic/TargetInfo.h"  #include "clang/CodeGen/BackendUtil.h" @@ -37,6 +39,7 @@  #include "llvm/Pass.h"  #include "llvm/Support/MemoryBuffer.h"  #include "llvm/Support/SourceMgr.h" +#include "llvm/Support/TimeProfiler.h"  #include "llvm/Support/Timer.h"  #include "llvm/Support/ToolOutputFile.h"  #include "llvm/Support/YAMLTraits.h" @@ -228,6 +231,7 @@ namespace clang {      void HandleTranslationUnit(ASTContext &C) override {        { +        llvm::TimeTraceScope TimeScope("Frontend", StringRef(""));          PrettyStackTraceString CrashInfo("Per-file LLVM IR generation");          if (FrontendTimesIsEnabled) {            LLVMIRGenerationRefCount += 1; @@ -260,7 +264,7 @@ namespace clang {        std::unique_ptr<DiagnosticHandler> OldDiagnosticHandler =            Ctx.getDiagnosticHandler(); -      Ctx.setDiagnosticHandler(llvm::make_unique<ClangDiagnosticHandler>( +      Ctx.setDiagnosticHandler(std::make_unique<ClangDiagnosticHandler>(          CodeGenOpts, this));        Expected<std::unique_ptr<llvm::ToolOutputFile>> OptRecordFileOrErr = @@ -362,6 +366,9 @@ namespace clang {      bool StackSizeDiagHandler(const llvm::DiagnosticInfoStackSize &D);      /// Specialized handler for unsupported backend feature diagnostic.      void UnsupportedDiagHandler(const llvm::DiagnosticInfoUnsupported &D); +    /// Specialized handler for misexpect warnings. +    /// Note that misexpect remarks are emitted through ORE +    void MisExpectDiagHandler(const llvm::DiagnosticInfoMisExpect &D);      /// Specialized handlers for optimization remarks.      /// Note that these handlers only accept remarks and they always handle      /// them. @@ -561,13 +568,13 @@ const FullSourceLoc BackendConsumer::getBestLocationFromDebugLoc(    if (D.isLocationAvailable()) {      D.getLocation(Filename, Line, Column);      if (Line > 0) { -      const FileEntry *FE = FileMgr.getFile(Filename); +      auto FE = FileMgr.getFile(Filename);        if (!FE)          FE = FileMgr.getFile(D.getAbsolutePath());        if (FE) {          // If -gcolumn-info was not used, Column will be 0. This upsets the          // source manager, so pass 1 if Column is not set. -        DILoc = SourceMgr.translateFileLineCol(FE, Line, Column ? Column : 1); +        DILoc = SourceMgr.translateFileLineCol(*FE, Line, Column ? Column : 1);        }      }      BadDebugInfo = DILoc.isInvalid(); @@ -614,6 +621,25 @@ void BackendConsumer::UnsupportedDiagHandler(          << Filename << Line << Column;  } +void BackendConsumer::MisExpectDiagHandler( +    const llvm::DiagnosticInfoMisExpect &D) { +  StringRef Filename; +  unsigned Line, Column; +  bool BadDebugInfo = false; +  FullSourceLoc Loc = +      getBestLocationFromDebugLoc(D, BadDebugInfo, Filename, Line, Column); + +  Diags.Report(Loc, diag::warn_profile_data_misexpect) << D.getMsg().str(); + +  if (BadDebugInfo) +    // If we were not able to translate the file:line:col information +    // back to a SourceLocation, at least emit a note stating that +    // we could not translate this location. This can happen in the +    // case of #line directives. +    Diags.Report(Loc, diag::note_fe_backend_invalid_loc) +        << Filename << Line << Column; +} +  void BackendConsumer::EmitOptimizationMessage(      const llvm::DiagnosticInfoOptimizationBase &D, unsigned DiagID) {    // We only support warnings and remarks. @@ -784,6 +810,9 @@ void BackendConsumer::DiagnosticHandlerImpl(const DiagnosticInfo &DI) {    case llvm::DK_Unsupported:      UnsupportedDiagHandler(cast<DiagnosticInfoUnsupported>(DI));      return; +  case llvm::DK_MisExpect: +    MisExpectDiagHandler(cast<DiagnosticInfoMisExpect>(DI)); +    return;    default:      // Plugin IDs are not bound to any value as they are set dynamically.      ComputeDiagRemarkID(Severity, backend_plugin, DiagID); @@ -914,7 +943,7 @@ CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {    if (CI.getCodeGenOpts().getDebugInfo() != codegenoptions::NoDebugInfo &&        CI.getCodeGenOpts().MacroDebugInfo) {      std::unique_ptr<PPCallbacks> Callbacks = -        llvm::make_unique<MacroPPCallbacks>(BEConsumer->getCodeGenerator(), +        std::make_unique<MacroPPCallbacks>(BEConsumer->getCodeGenerator(),                                              CI.getPreprocessor());      CI.getPreprocessor().addPPCallbacks(std::move(Callbacks));    } @@ -975,7 +1004,7 @@ CodeGenAction::loadModule(MemoryBufferRef MBRef) {      // the file was already processed by indexing and will be passed to the      // linker using merged object file.      if (!Bm) { -      auto M = llvm::make_unique<llvm::Module>("empty", *VMContext); +      auto M = std::make_unique<llvm::Module>("empty", *VMContext);        M->setTargetTriple(CI.getTargetOpts().Triple);        return M;      } @@ -1014,7 +1043,7 @@ CodeGenAction::loadModule(MemoryBufferRef MBRef) {  void CodeGenAction::ExecuteAction() {    // If this is an IR file, we have to treat it specially. -  if (getCurrentFileKind().getLanguage() == InputKind::LLVM_IR) { +  if (getCurrentFileKind().getLanguage() == Language::LLVM_IR) {      BackendAction BA = static_cast<BackendAction>(Act);      CompilerInstance &CI = getCompilerInstance();      std::unique_ptr<raw_pwrite_stream> OS =  | 
