r213400 - Recommit: Handle diagnostic warnings in Frontend diagnostic handler.
NAKAMURA Takumi
geek4civic at gmail.com
Fri Jul 18 17:12:49 PDT 2014
It seems the test would be incompatible to i686.
For example with -triple i686-linux,
error: 'warning' diagnostics expected but not seen:
File clang/test/Misc/backend-optimization-failure.cpp Line 9: loop
not vectorized: failed explicitly specified loop vectorization
2014-07-19 4:40 GMT+09:00 Tyler Nowicki <tnowicki at apple.com>:
> Author: tnowicki
> Date: Fri Jul 18 14:40:19 2014
> New Revision: 213400
>
> URL: http://llvm.org/viewvc/llvm-project?rev=213400&view=rev
> Log:
> Recommit: Handle diagnostic warnings in Frontend diagnostic handler.
>
> Clang uses a diagnostic handler to grab diagnostic messages so it can print them
> with the line of source code they refer to. This patch extends this to handle
> optimization failures that were added to llvm to produce a warning when
> loop vectorization is explicitly specified (using a pragma clang loop directive)
> but fails.
>
> Update renames warning flag name to avoid indicating the flag's severity and
> adds a test.
>
> Reviewed by Alp Toker
>
>
> Added:
> cfe/trunk/test/Misc/backend-optimization-failure.cpp
> Modified:
> cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> cfe/trunk/lib/CodeGen/CodeGenAction.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=213400&r1=213399&r2=213400&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Fri Jul 18 14:40:19 2014
> @@ -41,6 +41,8 @@ def remark_fe_backend_optimization_remar
> InGroup<BackendOptimizationRemarkMissed>, DefaultRemark;
> def remark_fe_backend_optimization_remark_analysis : Remark<"%0">, BackendInfo,
> InGroup<BackendOptimizationRemarkAnalysis>, DefaultRemark;
> +def warn_fe_backend_optimization_failure : Warning<"%0">, BackendInfo,
> + InGroup<BackendOptimizationFailure>, DefaultWarn;
> def note_fe_backend_optimization_remark_invalid_loc : Note<"could "
> "not determine the original source location for %0:%1:%2">;
>
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=213400&r1=213399&r2=213400&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Fri Jul 18 14:40:19 2014
> @@ -704,6 +704,7 @@ def RemarkBackendPlugin : DiagGroup<"rem
> def BackendOptimizationRemark : DiagGroup<"pass">;
> def BackendOptimizationRemarkMissed : DiagGroup<"pass-missed">;
> def BackendOptimizationRemarkAnalysis : DiagGroup<"pass-analysis">;
> +def BackendOptimizationFailure : DiagGroup<"pass-failed">;
>
> // Instrumentation based profiling warnings.
> def ProfileInstrOutOfDate : DiagGroup<"profile-instr-out-of-date">;
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenAction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=213400&r1=213399&r2=213400&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenAction.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenAction.cpp Fri Jul 18 14:40:19 2014
> @@ -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(co
> 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::EmitOptimizationRe
> 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::OptimizationRemark
> // 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::OptimizationRemark
> // 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::OptimizationRemark
> // 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::DiagnosticHandlerI
> 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);
>
> Added: cfe/trunk/test/Misc/backend-optimization-failure.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/backend-optimization-failure.cpp?rev=213400&view=auto
> ==============================================================================
> --- cfe/trunk/test/Misc/backend-optimization-failure.cpp (added)
> +++ cfe/trunk/test/Misc/backend-optimization-failure.cpp Fri Jul 18 14:40:19 2014
> @@ -0,0 +1,20 @@
> +// RUN: %clang_cc1 %s -O3 -emit-llvm -gline-tables-only -S -verify -o /dev/null
> +
> +// Test verifies optimization failures generated by the backend are handled
> +// correctly by clang. LLVM tests verify all of the failure conditions.
> +
> +void test_switch(int *A, int *B, int Length) {
> +#pragma clang loop vectorize(enable) unroll(disable)
> + for (int i = 0; i < Length; i++) {
> + /* expected-warning {{loop not vectorized: failed explicitly specified loop vectorization}} */ switch (A[i]) {
> + case 0:
> + B[i] = 1;
> + break;
> + case 1:
> + B[i] = 2;
> + break;
> + default:
> + B[i] = 3;
> + }
> + }
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list