aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2024-05-27 13:20:13 -0400
committerAndrew MacLeod <amacleod@redhat.com>2024-05-28 14:51:38 -0400
commitd52b44aa26aa9976caaaa292f4773a08bbaa2fbb (patch)
treed5b6a8e9d997521cf2eced1afee555d988487523
parent5bc731b83b51910dc7f7cacddb4257a16d62ee38 (diff)
downloadgcc-d52b44aa26aa9976caaaa292f4773a08bbaa2fbb.zip
gcc-d52b44aa26aa9976caaaa292f4773a08bbaa2fbb.tar.gz
gcc-d52b44aa26aa9976caaaa292f4773a08bbaa2fbb.tar.bz2
Strlen pass should set current range query.
The strlen pass currently has a local ranger instance, but when it invokes SCEV, scev will not be able to access to this ranger. Enable/disable ranger shoud be used, allowing other components to use the current range_query. gcc/ * tree-ssa-strlen.cc (strlen_pass::strlen_pass): Add function pointer and initialize ptr_qry with current range_query. (strlen_pass::m_ranger): Remove. (printf_strlen_execute): Enable and disable ranger. gcc/testsuite/ * gcc.dg/Wstringop-overflow-10.c: Add truncating warning.
-rw-r--r--gcc/testsuite/gcc.dg/Wstringop-overflow-10.c2
-rw-r--r--gcc/tree-ssa-strlen.cc10
2 files changed, 6 insertions, 6 deletions
diff --git a/gcc/testsuite/gcc.dg/Wstringop-overflow-10.c b/gcc/testsuite/gcc.dg/Wstringop-overflow-10.c
index bace08a..ddc27fc 100644
--- a/gcc/testsuite/gcc.dg/Wstringop-overflow-10.c
+++ b/gcc/testsuite/gcc.dg/Wstringop-overflow-10.c
@@ -21,7 +21,7 @@ void
baz (char *a)
{
char b[16] = "abcdefg";
- __builtin_strncpy (a, b, __builtin_strnlen (b, 7)); /* { dg-bogus "specified bound depends on the length of the source argument" } */
+ __builtin_strncpy (a, b, __builtin_strnlen (b, 7)); /* { dg-warning "output truncated before terminating nul" } */
}
void fill (char *);
diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc
index 7596dd8..c43a2da 100644
--- a/gcc/tree-ssa-strlen.cc
+++ b/gcc/tree-ssa-strlen.cc
@@ -235,9 +235,9 @@ get_range (tree val, gimple *stmt, wide_int minmax[2],
class strlen_pass : public dom_walker
{
public:
- strlen_pass (cdi_direction direction)
+ strlen_pass (function *fun, cdi_direction direction)
: dom_walker (direction),
- ptr_qry (&m_ranger),
+ ptr_qry (get_range_query (fun)),
m_cleanup_cfg (false)
{
}
@@ -299,8 +299,6 @@ public:
unsigned HOST_WIDE_INT lenrng[2],
unsigned HOST_WIDE_INT *size, bool *nulterm);
- gimple_ranger m_ranger;
-
/* A pointer_query object to store information about pointers and
their targets in. */
pointer_query ptr_qry;
@@ -5912,9 +5910,10 @@ printf_strlen_execute (function *fun, bool warn_only)
ssa_ver_to_stridx.safe_grow_cleared (num_ssa_names, true);
max_stridx = 1;
+ enable_ranger (fun);
/* String length optimization is implemented as a walk of the dominator
tree and a forward walk of statements within each block. */
- strlen_pass walker (CDI_DOMINATORS);
+ strlen_pass walker (fun, CDI_DOMINATORS);
walker.walk (ENTRY_BLOCK_PTR_FOR_FN (fun));
if (dump_file && (dump_flags & TDF_DETAILS))
@@ -5939,6 +5938,7 @@ printf_strlen_execute (function *fun, bool warn_only)
strlen_to_stridx = NULL;
}
+ disable_ranger (fun);
scev_finalize ();
loop_optimizer_finalize ();