diff options
author | Martin Sebor <msebor@redhat.com> | 2021-05-10 14:00:04 -0600 |
---|---|---|
committer | Martin Sebor <msebor@redhat.com> | 2021-05-10 14:02:35 -0600 |
commit | f974b54b8a0c330e9dd2b43ebc940100d601df0f (patch) | |
tree | 43298bab245d60accec860e2f6409f991bf1aef1 /gcc/gimple-ssa-warn-alloca.c | |
parent | 51d89e61f7ebfe75ca752e62bd29b58cb957235c (diff) | |
download | gcc-f974b54b8a0c330e9dd2b43ebc940100d601df0f.zip gcc-f974b54b8a0c330e9dd2b43ebc940100d601df0f.tar.gz gcc-f974b54b8a0c330e9dd2b43ebc940100d601df0f.tar.bz2 |
Avoid -Walloca-larger-than and -Wvla-larger-than false postives and negatives.
Resolves:
PR middle-end/100425 - missing -Walloca-larger-than with -O0
PR middle-end/100510 - bogus -Wvla-large-than with -Walloca
gcc/ChangeLog:
PR middle-end/100425
PR middle-end/100510
* gimple-ssa-warn-alloca.c (pass_walloca::firast_time_p): Rename...
(pass_walloca::xlimit_certain_p): ...to this.
(pass_walloca::gate): Execute for any kind of handled warning.
(pass_walloca::execute): Avoid issuing "maybe" and "unbounded"
warnings when xlimit_certain_p is set.
gcc/testsuite/ChangeLog:
PR middle-end/100425
PR middle-end/100510
* c-c++-common/Walloca-larger-than.C: New test.
* gcc.dg/Walloca-larger-than-4.c: New test.
* gcc.dg/Wvla-larger-than-5.c: New test.
* gcc.dg/pr79972.c: Remove unexpected warning directive.
Diffstat (limited to 'gcc/gimple-ssa-warn-alloca.c')
-rw-r--r-- | gcc/gimple-ssa-warn-alloca.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/gcc/gimple-ssa-warn-alloca.c b/gcc/gimple-ssa-warn-alloca.c index 42c0ba1..e9a24d4 100644 --- a/gcc/gimple-ssa-warn-alloca.c +++ b/gcc/gimple-ssa-warn-alloca.c @@ -56,31 +56,30 @@ class pass_walloca : public gimple_opt_pass { public: pass_walloca (gcc::context *ctxt) - : gimple_opt_pass(pass_data_walloca, ctxt), first_time_p (false) + : gimple_opt_pass(pass_data_walloca, ctxt), xlimit_certain_p (false) {} opt_pass *clone () { return new pass_walloca (m_ctxt); } void set_pass_param (unsigned int n, bool param) { gcc_assert (n == 0); - first_time_p = param; + // Set to true to enable only warnings for alloca calls that + // are certainly in excess of the limit. This includes calls + // with constant arguments but excludes those in ranges (that + // can only be determined by range analysis) as well as + // the "may be too large" kind. + xlimit_certain_p = param; } virtual bool gate (function *); virtual unsigned int execute (function *); private: // Set to TRUE the first time we run this pass on a function. - bool first_time_p; + bool xlimit_certain_p; }; bool pass_walloca::gate (function *fun ATTRIBUTE_UNUSED) { - // The first time this pass is called, it is called before - // optimizations have been run and range information is unavailable, - // so we can only perform strict alloca checking. - if (first_time_p) - return warn_alloca != 0; - // Warning is disabled when its size limit is greater than PTRDIFF_MAX // for the target maximum, which makes the limit negative since when // represented in signed HOST_WIDE_INT. @@ -317,6 +316,9 @@ pass_walloca::execute (function *fun) break; case ALLOCA_BOUND_MAYBE_LARGE: { + if (xlimit_certain_p) + break; + auto_diagnostic_group d; if (warning_at (loc, wcode, (is_vla @@ -354,6 +356,9 @@ pass_walloca::execute (function *fun) } break; case ALLOCA_UNBOUNDED: + if (xlimit_certain_p) + break; + warning_at (loc, wcode, (is_vla ? G_("%Gunbounded use of variable-length array") |