diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2024-05-27 13:20:13 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2024-05-28 14:51:38 -0400 |
commit | d52b44aa26aa9976caaaa292f4773a08bbaa2fbb (patch) | |
tree | d5b6a8e9d997521cf2eced1afee555d988487523 | |
parent | 5bc731b83b51910dc7f7cacddb4257a16d62ee38 (diff) | |
download | gcc-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.c | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-strlen.cc | 10 |
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 (); |