diff options
Diffstat (limited to 'clang/lib/CodeGen/CodeGenAction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenAction.cpp | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp index 559c2ef4bad..04d2cd9d53e 100644 --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -238,15 +238,16 @@ namespace clang { /// \brief Specialized handlers for optimization remarks. /// Note that these handlers only accept remarks and they always handle /// them. - void - EmitOptimizationRemark(const llvm::DiagnosticInfoOptimizationBase &D, - unsigned DiagID); + void EmitOptimizationMessage(const llvm::DiagnosticInfoOptimizationBase &D, + unsigned DiagID); void OptimizationRemarkHandler(const llvm::DiagnosticInfoOptimizationRemark &D); void OptimizationRemarkHandler( const llvm::DiagnosticInfoOptimizationRemarkMissed &D); void OptimizationRemarkHandler( const llvm::DiagnosticInfoOptimizationRemarkAnalysis &D); + void OptimizationFailureHandler( + const llvm::DiagnosticInfoOptimizationFailure &D); }; void BackendConsumer::anchor() {} @@ -416,10 +417,11 @@ BackendConsumer::StackSizeDiagHandler(const llvm::DiagnosticInfoStackSize &D) { return false; } -void BackendConsumer::EmitOptimizationRemark( +void BackendConsumer::EmitOptimizationMessage( const llvm::DiagnosticInfoOptimizationBase &D, unsigned DiagID) { - // We only support remarks. - assert(D.getSeverity() == llvm::DS_Remark); + // We only support warnings and remarks. + assert(D.getSeverity() == llvm::DS_Remark || + D.getSeverity() == llvm::DS_Warning); SourceManager &SourceMgr = Context->getSourceManager(); FileManager &FileMgr = SourceMgr.getFileManager(); @@ -442,8 +444,9 @@ void BackendConsumer::EmitOptimizationRemark( if (const Decl *FD = Gen->GetDeclForMangledName(D.getFunction().getName())) Loc = FD->getASTContext().getFullLoc(FD->getBodyRBrace()); - Diags.Report(Loc, DiagID) << AddFlagValue(D.getPassName()) - << D.getMsg().str(); + Diags.Report(Loc, DiagID) + << AddFlagValue(D.getPassName() ? D.getPassName() : "") + << D.getMsg().str(); if (DILoc.isInvalid()) // If we were not able to translate the file:line:col information @@ -460,7 +463,7 @@ void BackendConsumer::OptimizationRemarkHandler( // expression that matches the name of the pass name in \p D. if (CodeGenOpts.OptimizationRemarkPattern && CodeGenOpts.OptimizationRemarkPattern->match(D.getPassName())) - EmitOptimizationRemark(D, diag::remark_fe_backend_optimization_remark); + EmitOptimizationMessage(D, diag::remark_fe_backend_optimization_remark); } void BackendConsumer::OptimizationRemarkHandler( @@ -470,8 +473,8 @@ void BackendConsumer::OptimizationRemarkHandler( // name in \p D. if (CodeGenOpts.OptimizationRemarkMissedPattern && CodeGenOpts.OptimizationRemarkMissedPattern->match(D.getPassName())) - EmitOptimizationRemark(D, - diag::remark_fe_backend_optimization_remark_missed); + EmitOptimizationMessage(D, + diag::remark_fe_backend_optimization_remark_missed); } void BackendConsumer::OptimizationRemarkHandler( @@ -481,10 +484,15 @@ void BackendConsumer::OptimizationRemarkHandler( // name in \p D. if (CodeGenOpts.OptimizationRemarkAnalysisPattern && CodeGenOpts.OptimizationRemarkAnalysisPattern->match(D.getPassName())) - EmitOptimizationRemark( + EmitOptimizationMessage( D, diag::remark_fe_backend_optimization_remark_analysis); } +void BackendConsumer::OptimizationFailureHandler( + const llvm::DiagnosticInfoOptimizationFailure &D) { + EmitOptimizationMessage(D, diag::warn_fe_backend_optimization_failure); +} + /// \brief This function is invoked when the backend needs /// to report something to the user. void BackendConsumer::DiagnosticHandlerImpl(const DiagnosticInfo &DI) { @@ -518,6 +526,11 @@ void BackendConsumer::DiagnosticHandlerImpl(const DiagnosticInfo &DI) { OptimizationRemarkHandler( cast<DiagnosticInfoOptimizationRemarkAnalysis>(DI)); return; + case llvm::DK_OptimizationFailure: + // Optimization failures are always handled completely by this + // handler. + OptimizationFailureHandler(cast<DiagnosticInfoOptimizationFailure>(DI)); + return; default: // Plugin IDs are not bound to any value as they are set dynamically. ComputeDiagRemarkID(Severity, backend_plugin, DiagID); |