diff options
author | Paul Kirth <paulkirth@google.com> | 2022-03-18 00:04:22 +0000 |
---|---|---|
committer | Paul Kirth <paulkirth@google.com> | 2022-03-18 00:04:22 +0000 |
commit | 6cf560d69a222bff4af4e1d092437fd77f0f981c (patch) | |
tree | 1294c0be71860eb829e4f5ad9d5a3bcbbbcf6edd /clang/lib/CodeGen/CodeGenAction.cpp | |
parent | 10866a1df4a82cdc54187330c509a2d46235455d (diff) | |
download | llvm-6cf560d69a222bff4af4e1d092437fd77f0f981c.zip llvm-6cf560d69a222bff4af4e1d092437fd77f0f981c.tar.gz llvm-6cf560d69a222bff4af4e1d092437fd77f0f981c.tar.bz2 |
Revert "Revert "[misexpect] Re-implement MisExpect Diagnostics""
I mistakenly reverted my commit, so I'm relanding it.
This reverts commit 10866a1df4a82cdc54187330c509a2d46235455d.
Diffstat (limited to 'clang/lib/CodeGen/CodeGenAction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenAction.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp index 807880f..6780820 100644 --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -340,6 +340,15 @@ namespace clang { CodeGenOpts.getProfileUse() != CodeGenOptions::ProfileNone) Ctx.setDiagnosticsHotnessRequested(true); + if (CodeGenOpts.MisExpect) { + Ctx.setMisExpectWarningRequested(true); + } + + if (CodeGenOpts.DiagnosticsMisExpectTolerance) { + Ctx.setDiagnosticsMisExpectTolerance( + CodeGenOpts.DiagnosticsMisExpectTolerance); + } + // Link each LinkModule into our module. if (LinkInModules()) return; @@ -440,6 +449,9 @@ namespace clang { void OptimizationFailureHandler( const llvm::DiagnosticInfoOptimizationFailure &D); void DontCallDiagHandler(const DiagnosticInfoDontCall &D); + /// Specialized handler for misexpect warnings. + /// Note that misexpect remarks are emitted through ORE + void MisExpectDiagHandler(const llvm::DiagnosticInfoMisExpect &D); }; void BackendConsumer::anchor() {} @@ -821,6 +833,25 @@ void BackendConsumer::DontCallDiagHandler(const DiagnosticInfoDontCall &D) { << llvm::demangle(D.getFunctionName().str()) << D.getNote(); } +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; +} + /// This function is invoked when the backend needs /// to report something to the user. void BackendConsumer::DiagnosticHandlerImpl(const DiagnosticInfo &DI) { @@ -895,6 +926,9 @@ void BackendConsumer::DiagnosticHandlerImpl(const DiagnosticInfo &DI) { case llvm::DK_DontCall: DontCallDiagHandler(cast<DiagnosticInfoDontCall>(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); |