From 948016228fdfb647ad7bcc978fde173504e3df82 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Tue, 22 Jun 2021 11:20:49 -0700 Subject: [PATCH] Improve clang -Wframe-larger-than= diagnostic Match the style in D104667. This commit is for non-LTO diagnostics, while D104667 is for LTO and llc diagnostics. --- clang/include/clang/Basic/DiagnosticFrontendKinds.td | 2 +- clang/lib/CodeGen/CodeGenAction.cpp | 4 +++- clang/test/Frontend/backend-diagnostic.c | 6 +++--- clang/test/Misc/backend-stack-frame-diagnostics-fallback.cpp | 2 +- clang/test/Misc/backend-stack-frame-diagnostics.cpp | 8 ++++---- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td index e68058d..0f4ccec 100644 --- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td +++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td @@ -25,7 +25,7 @@ def note_fe_source_mgr : Note<"%0">, CatSourceMgr; def err_fe_cannot_link_module : Error<"cannot link module '%0': %1">, DefaultFatal; -def warn_fe_frame_larger_than : Warning<"stack frame size of %0 bytes in %q1">, +def warn_fe_frame_larger_than : Warning<"stack frame size (%0) exceeds limit (%1) in %q2">, BackendInfo, InGroup; def warn_fe_backend_frame_larger_than: Warning<"%0">, BackendInfo, InGroup; diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp index 02dcea2..b30bd11 100644 --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -571,7 +571,9 @@ BackendConsumer::StackSizeDiagHandler(const llvm::DiagnosticInfoStackSize &D) { // FIXME: Shouldn't need to truncate to uint32_t Diags.Report(ND->getASTContext().getFullLoc(ND->getLocation()), diag::warn_fe_frame_larger_than) - << static_cast(D.getStackSize()) << Decl::castToDeclContext(ND); + << static_cast(D.getStackSize()) + << static_cast(D.getStackLimit()) + << Decl::castToDeclContext(ND); return true; } diff --git a/clang/test/Frontend/backend-diagnostic.c b/clang/test/Frontend/backend-diagnostic.c index 01029d7..695158c 100644 --- a/clang/test/Frontend/backend-diagnostic.c +++ b/clang/test/Frontend/backend-diagnostic.c @@ -15,9 +15,9 @@ extern void doIt(char *); -// REGULAR: warning: stack frame size of {{[0-9]+}} bytes in function 'stackSizeWarning' -// PROMOTE: error: stack frame size of {{[0-9]+}} bytes in function 'stackSizeWarning' -// IGNORE-NOT: stack frame size of {{[0-9]+}} bytes in function 'stackSizeWarning' +// REGULAR: warning: stack frame size ([[#]]) exceeds limit ([[#]]) in function 'stackSizeWarning' +// PROMOTE: error: stack frame size ([[#]]) exceeds limit ([[#]]) in function 'stackSizeWarning' +// IGNORE-NOT: stack frame size ([[#]]) exceeds limit ([[#]]) in function 'stackSizeWarning' void stackSizeWarning() { char buffer[80]; doIt(buffer); diff --git a/clang/test/Misc/backend-stack-frame-diagnostics-fallback.cpp b/clang/test/Misc/backend-stack-frame-diagnostics-fallback.cpp index d28d54b..79c6ba9 100644 --- a/clang/test/Misc/backend-stack-frame-diagnostics-fallback.cpp +++ b/clang/test/Misc/backend-stack-frame-diagnostics-fallback.cpp @@ -12,7 +12,7 @@ namespace frameSizeThunkWarning { virtual void f(); }; - // CHECK: warning: stack frame size of {{[0-9]+}} bytes in function 'frameSizeThunkWarning::B::f' + // CHECK: warning: stack frame size ([[#]]) exceeds limit ([[#]]) in function 'frameSizeThunkWarning::B::f' // CHECK: warning: stack frame size ([[#]]) exceeds limit in function '_ZTv0_n12_N21frameSizeThunkWarning1B1fEv' void B::f() { volatile int x = 0; // Ensure there is stack usage. diff --git a/clang/test/Misc/backend-stack-frame-diagnostics.cpp b/clang/test/Misc/backend-stack-frame-diagnostics.cpp index b02e7f4..f0ceac0 100644 --- a/clang/test/Misc/backend-stack-frame-diagnostics.cpp +++ b/clang/test/Misc/backend-stack-frame-diagnostics.cpp @@ -26,7 +26,7 @@ void frameSizeWarning(int, int) {} void frameSizeWarning(); -void frameSizeWarning() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in function 'frameSizeWarning'}} +void frameSizeWarning() { // expected-warning-re {{stack frame size ({{[0-9]+}}) exceeds limit ({{[0-9]+}}) in function 'frameSizeWarning'}} char buffer[80]; doIt(buffer); } @@ -45,7 +45,7 @@ void frameSizeWarningIgnored() { void frameSizeLocalClassWarning() { struct S { - S() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in function 'frameSizeLocalClassWarning()::S::S'}} + S() { // expected-warning-re {{stack frame size ({{[0-9]+}}) exceeds limit ({{[0-9]+}}) in function 'frameSizeLocalClassWarning()::S::S'}} char buffer[80]; doIt(buffer); } @@ -55,7 +55,7 @@ void frameSizeLocalClassWarning() { void frameSizeLambdaWarning() { auto fn = - []() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in lambda expression}} + []() { // expected-warning-re {{stack frame size ({{[0-9]+}}) exceeds limit ({{[0-9]+}}) in lambda expression}} char buffer[80]; doIt(buffer); }; @@ -64,7 +64,7 @@ void frameSizeLambdaWarning() { void frameSizeBlocksWarning() { auto fn = - ^() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in block literal}} + ^() { // expected-warning-re {{stack frame size ({{[0-9]+}}) exceeds limit ({{[0-9]+}}) in block literal}} char buffer[80]; doIt(buffer); }; -- 2.7.4