summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenAction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen/CodeGenAction.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenAction.cpp42
1 files changed, 29 insertions, 13 deletions
diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp
index 0f637594413..8c0e8e78fc7 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::DiagnosticInfoOptimizationRemarkBase &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 OptimizationWarningHandler(
+ const llvm::DiagnosticInfoOptimizationWarning &D);
};
void BackendConsumer::anchor() {}
@@ -416,10 +417,11 @@ BackendConsumer::StackSizeDiagHandler(const llvm::DiagnosticInfoStackSize &D) {
return false;
}
-void BackendConsumer::EmitOptimizationRemark(
- const llvm::DiagnosticInfoOptimizationRemarkBase &D, unsigned DiagID) {
- // We only support remarks.
- assert(D.getSeverity() == llvm::DS_Remark);
+void BackendConsumer::EmitOptimizationMessage(
+ const llvm::DiagnosticInfoOptimizationBase &D, unsigned DiagID) {
+ // 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,12 @@ 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();
+ // Flag value not used by all optimization messages.
+ if (D.getPassName())
+ Diags.Report(Loc, DiagID) << AddFlagValue(D.getPassName())
+ << D.getMsg().str();
+ else
+ Diags.Report(Loc, DiagID) << D.getMsg().str();
if (DILoc.isInvalid())
// If we were not able to translate the file:line:col information
@@ -460,7 +466,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 +476,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 +487,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::OptimizationWarningHandler(
+ const llvm::DiagnosticInfoOptimizationWarning &D) {
+ EmitOptimizationMessage(D, diag::warn_fe_backend_optimization_warning);
+}
+
/// \brief This function is invoked when the backend needs
/// to report something to the user.
void BackendConsumer::DiagnosticHandlerImpl(const DiagnosticInfo &DI) {
@@ -518,6 +529,11 @@ void BackendConsumer::DiagnosticHandlerImpl(const DiagnosticInfo &DI) {
OptimizationRemarkHandler(
cast<DiagnosticInfoOptimizationRemarkAnalysis>(DI));
return;
+ case llvm::DK_OptimizationWarning:
+ // Optimization warnings are always handled completely by this
+ // handler.
+ OptimizationWarningHandler(cast<DiagnosticInfoOptimizationWarning>(DI));
+ return;
default:
// Plugin IDs are not bound to any value as they are set dynamically.
ComputeDiagRemarkID(Severity, backend_plugin, DiagID);
OpenPOWER on IntegriCloud