From 55ace4d14637866466498ed43e02d6f95af98f10 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 5 Mar 2020 14:01:30 -0700 Subject: [PATCH] Fix location maybe_diag_overlap passes to diagnostics so that diagnostic pragmas work better. PR tree-optimization/91890 * gimple-ssa-warn-restrict.c (maybe_diag_overlap): Remove LOC argument. Use gimple_or_expr_nonartificial_location. (check_bounds_overlap): Drop LOC argument to maybe_diag_access_bounds. Use gimple_or_expr_nonartificial_location. * gimple.c (gimple_or_expr_nonartificial_location): New function. * gimple.h (gimple_or_expr_nonartificial_location): Declare it. * tree-ssa-strlen.c (maybe_warn_overflow): Use gimple_or_expr_nonartificial_location. (maybe_diag_stxncpy_trunc, handle_builtin_stxncpy_strncat): Likewise. (maybe_warn_pointless_strcmp): Likewise. * gcc.dg/pragma-diag-8.c: New test. --- gcc/ChangeLog | 14 ++++++++++++++ gcc/gimple-ssa-warn-restrict.c | 21 +++++---------------- gcc/gimple.c | 13 +++++++++++++ gcc/gimple.h | 2 ++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pragma-diag-8.c | 20 ++++++++++++++++++++ gcc/tree-ssa-strlen.c | 18 ++++-------------- 7 files changed, 63 insertions(+), 30 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pragma-diag-8.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a20f8dcbd5d..14e90fbd8b7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2020-03-05 Jeff Law + + PR tree-optimization/91890 + * gimple-ssa-warn-restrict.c (maybe_diag_overlap): Remove LOC argument. + Use gimple_or_expr_nonartificial_location. + (check_bounds_overlap): Drop LOC argument to maybe_diag_access_bounds. + Use gimple_or_expr_nonartificial_location. + * gimple.c (gimple_or_expr_nonartificial_location): New function. + * gimple.h (gimple_or_expr_nonartificial_location): Declare it. + * tree-ssa-strlen.c (maybe_warn_overflow): Use + gimple_or_expr_nonartificial_location. + (maybe_diag_stxncpy_trunc, handle_builtin_stxncpy_strncat): Likewise. + (maybe_warn_pointless_strcmp): Likewise. + 2020-03-05 Jakub Jelinek PR target/94046 diff --git a/gcc/gimple-ssa-warn-restrict.c b/gcc/gimple-ssa-warn-restrict.c index 2c582a670eb..5e7e5d41dbb 100644 --- a/gcc/gimple-ssa-warn-restrict.c +++ b/gcc/gimple-ssa-warn-restrict.c @@ -1692,10 +1692,11 @@ maybe_diag_overlap (location_t loc, gimple *call, builtin_access &acs) has been issued, or would have been issued if DO_WARN had been true. */ static bool -maybe_diag_access_bounds (location_t loc, gimple *call, tree func, int strict, +maybe_diag_access_bounds (gimple *call, tree func, int strict, const builtin_memref &ref, offset_int wroff, bool do_warn) { + location_t loc = gimple_or_expr_nonartificial_location (call, ref.ptr); const offset_int maxobjsize = ref.maxobjsize; /* Check for excessive size first and regardless of warning options @@ -1711,11 +1712,6 @@ maybe_diag_access_bounds (location_t loc, gimple *call, tree func, int strict, if (warn_stringop_overflow) { - if (EXPR_HAS_LOCATION (ref.ptr)) - loc = EXPR_LOCATION (ref.ptr); - - loc = expansion_point_location_if_in_system_header (loc); - if (ref.sizrange[0] == ref.sizrange[1]) return warning_at (loc, OPT_Wstringop_overflow_, "%G%qD specified bound %wu " @@ -1754,11 +1750,6 @@ maybe_diag_access_bounds (location_t loc, gimple *call, tree func, int strict, || (ref.ref && TREE_NO_WARNING (ref.ref))) return false; - if (EXPR_HAS_LOCATION (ref.ptr)) - loc = EXPR_LOCATION (ref.ptr); - - loc = expansion_point_location_if_in_system_header (loc); - char rangestr[2][64]; if (ooboff[0] == ooboff[1] || (ooboff[0] != ref.offrange[0] @@ -2018,9 +2009,6 @@ check_bounds_or_overlap (gimple *call, tree dst, tree src, tree dstsize, tree srcsize, bool bounds_only /* = false */, bool do_warn /* = true */) { - location_t loc = gimple_nonartificial_location (call); - loc = expansion_point_location_if_in_system_header (loc); - tree func = gimple_call_fndecl (call); builtin_memref dstref (dst, dstsize); @@ -2041,8 +2029,8 @@ check_bounds_or_overlap (gimple *call, tree dst, tree src, tree dstsize, /* Validate offsets to each reference before the access first to make sure they are within the bounds of the destination object if its size is known, or PTRDIFF_MAX otherwise. */ - if (maybe_diag_access_bounds (loc, call, func, strict, dstref, wroff, do_warn) - || maybe_diag_access_bounds (loc, call, func, strict, srcref, 0, do_warn)) + if (maybe_diag_access_bounds (call, func, strict, dstref, wroff, do_warn) + || maybe_diag_access_bounds (call, func, strict, srcref, 0, do_warn)) { if (do_warn) gimple_set_no_warning (call, true); @@ -2066,6 +2054,7 @@ check_bounds_or_overlap (gimple *call, tree dst, tree src, tree dstsize, } } + location_t loc = gimple_or_expr_nonartificial_location (call, dst); if (operand_equal_p (dst, src, 0)) { /* Issue -Wrestrict unless the pointers are null (those do diff --git a/gcc/gimple.c b/gcc/gimple.c index 324e706d508..92c6e642589 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -3285,6 +3285,19 @@ gimple_inexpensive_call_p (gcall *stmt) return false; } +/* Return a non-artificial location for STMT. If STMT does not have + location information, get the location from EXPR. */ + +location_t +gimple_or_expr_nonartificial_location (gimple *stmt, tree) +{ + location_t loc = gimple_nonartificial_location (stmt); + if (loc == UNKNOWN_LOCATION && EXPR_HAS_LOCATION (expr)) + loc = tree_nonartificial_location (expr); + return expansion_point_location_if_in_system_header (loc); +} + + #if CHECKING_P namespace selftest { diff --git a/gcc/gimple.h b/gcc/gimple.h index 192f19ad23a..0420d6d2251 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -1633,6 +1633,8 @@ extern void gimple_seq_discard (gimple_seq); extern void maybe_remove_unused_call_args (struct function *, gimple *); extern bool gimple_inexpensive_call_p (gcall *); extern bool stmt_can_terminate_bb_p (gimple *); +extern location_t gimple_or_expr_nonartificial_location (gimple *, tree); + /* Formal (expression) temporary table handling: multiple occurrences of the same scalar expression are evaluated into the same temporary. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 169cedea81b..36c87d68e56 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-03-05 Jeff Law + + PR tree-optimization/91890 + * gcc.dg/pragma-diag-8.c: New test. + 2020-03-05 Jakub Jelinek PR target/94046 diff --git a/gcc/testsuite/gcc.dg/pragma-diag-8.c b/gcc/testsuite/gcc.dg/pragma-diag-8.c new file mode 100644 index 00000000000..00780606e9b --- /dev/null +++ b/gcc/testsuite/gcc.dg/pragma-diag-8.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wall" } */ + + +char one[50]; +char two[50]; + +void +test_strncat (void) +{ + (void) __builtin_strcpy (one, "gh"); + (void) __builtin_strcpy (two, "ef"); + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow=" +#pragma GCC diagnostic ignored "-Warray-bounds" + (void) __builtin_strncat (one, two, 99); +#pragma GCC diagnostic pop +} + diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index 81be11de797..8815cdbc9ca 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -2129,11 +2129,7 @@ maybe_warn_overflow (gimple *stmt, tree len, || !si || !is_strlen_related_p (si->ptr, len))) return; - location_t loc = gimple_nonartificial_location (stmt); - if (loc == UNKNOWN_LOCATION && dest && EXPR_HAS_LOCATION (dest)) - loc = tree_nonartificial_location (dest); - loc = expansion_point_location_if_in_system_header (loc); - + location_t loc = gimple_or_expr_nonartificial_location (stmt, dest); bool warned = false; if (wi::leu_p (lenrng[0], spcrng[1])) { @@ -3189,9 +3185,7 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt) } } - location_t callloc = gimple_nonartificial_location (stmt); - callloc = expansion_point_location_if_in_system_header (callloc); - + location_t callloc = gimple_or_expr_nonartificial_location (stmt, dst); tree func = gimple_call_fndecl (stmt); if (lenrange[0] != 0 || !wi::neg_p (lenrange[1])) @@ -3403,8 +3397,7 @@ handle_builtin_stxncpy_strncat (bool append_p, gimple_stmt_iterator *gsi) to strlen(S)). */ strinfo *silen = get_strinfo (pss->first); - location_t callloc = gimple_nonartificial_location (stmt); - callloc = expansion_point_location_if_in_system_header (callloc); + location_t callloc = gimple_or_expr_nonartificial_location (stmt, dst); tree func = gimple_call_fndecl (stmt); @@ -4331,10 +4324,7 @@ maybe_warn_pointless_strcmp (gimple *stmt, HOST_WIDE_INT bound, /* FIXME: Include a note pointing to the declaration of the smaller array. */ - location_t stmt_loc = gimple_nonartificial_location (stmt); - if (stmt_loc == UNKNOWN_LOCATION && EXPR_HAS_LOCATION (lhs)) - stmt_loc = tree_nonartificial_location (lhs); - stmt_loc = expansion_point_location_if_in_system_header (stmt_loc); + location_t stmt_loc = gimple_or_expr_nonartificial_location (stmt, lhs); tree callee = gimple_call_fndecl (stmt); bool warned = false; -- 2.30.2