1 /* String length optimization
2 Copyright (C) 2011-2020 Free Software Foundation, Inc.
3 Contributed by Jakub Jelinek <jakub@redhat.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
28 #include "alloc-pool.h"
29 #include "tree-pass.h"
32 #include "gimple-pretty-print.h"
33 #include "gimple-ssa-warn-restrict.h"
34 #include "fold-const.h"
35 #include "stor-layout.h"
36 #include "gimple-fold.h"
39 #include "gimple-iterator.h"
40 #include "gimplify-me.h"
45 #include "tree-ssa-alias.h"
46 #include "tree-ssa-propagate.h"
47 #include "tree-ssa-strlen.h"
48 #include "tree-hash-traits.h"
49 #include "tree-object-size.h"
52 #include "diagnostic-core.h"
53 #include "diagnostic.h"
58 #include "tree-ssa-loop.h"
59 #include "tree-scalar-evolution.h"
60 #include "vr-values.h"
61 #include "gimple-ssa-evrp-analyze.h"
64 /* A vector indexed by SSA_NAME_VERSION. 0 means unknown, positive value
65 is an index into strinfo vector, negative value stands for
66 string length of a string literal (~strlen). */
67 static vec
<int> ssa_ver_to_stridx
;
69 /* Number of currently active string indexes plus one. */
70 static int max_stridx
;
72 /* Set to true to optimize, false when just checking. */
73 static bool strlen_optimize
;
75 /* String information record. */
78 /* Number of leading characters that are known to be nonzero. This is
79 also the length of the string if FULL_STRING_P.
81 The values in a list of related string pointers must be consistent;
82 that is, if strinfo B comes X bytes after strinfo A, it must be
83 the case that A->nonzero_chars == X + B->nonzero_chars. */
85 /* Any of the corresponding pointers for querying alias oracle. */
87 /* STMT is used for two things:
89 - To record the statement that should be used for delayed length
90 computations. We maintain the invariant that all related strinfos
91 have delayed lengths or none do.
93 - To record the malloc or calloc call that produced this result
94 to optimize away malloc/memset sequences. STMT is reset after
95 a calloc-allocated object has been stored a non-zero value into. */
97 /* Set to the dynamic allocation statement for the object (alloca,
98 calloc, malloc, or VLA). Unlike STMT, once set for a strinfo
99 object, ALLOC doesn't change. */
101 /* Pointer to '\0' if known, if NULL, it can be computed as
104 /* Reference count. Any changes to strinfo entry possibly shared
105 with dominating basic blocks need unshare_strinfo first, except
106 for dont_invalidate which affects only the immediately next
109 /* Copy of index. get_strinfo (si->idx) should return si; */
111 /* These 3 fields are for chaining related string pointers together.
113 bl = strlen (b); dl = strlen (d); strcpy (a, b); c = a + bl;
114 strcpy (c, d); e = c + dl;
115 strinfo(a) -> strinfo(c) -> strinfo(e)
116 All have ->first field equal to strinfo(a)->idx and are doubly
117 chained through prev/next fields. The later strinfos are required
118 to point into the same string with zero or more bytes after
119 the previous pointer and all bytes in between the two pointers
120 must be non-zero. Functions like strcpy or memcpy are supposed
121 to adjust all previous strinfo lengths, but not following strinfo
122 lengths (those are uncertain, usually invalidated during
123 maybe_invalidate, except when the alias oracle knows better).
124 Functions like strcat on the other side adjust the whole
125 related strinfo chain.
126 They are updated lazily, so to use the chain the same first fields
127 and si->prev->next == si->idx needs to be verified. */
131 /* A flag whether the string is known to be written in the current
134 /* A flag for the next maybe_invalidate that this strinfo shouldn't
135 be invalidated. Always cleared by maybe_invalidate. */
136 bool dont_invalidate
;
137 /* True if the string is known to be nul-terminated after NONZERO_CHARS
138 characters. False is useful when detecting strings that are built
139 up via successive memcpys. */
143 /* Pool for allocating strinfo_struct entries. */
144 static object_allocator
<strinfo
> strinfo_pool ("strinfo pool");
146 /* Vector mapping positive string indexes to strinfo, for the
147 current basic block. The first pointer in the vector is special,
148 it is either NULL, meaning the vector isn't shared, or it is
149 a basic block pointer to the owner basic_block if shared.
150 If some other bb wants to modify the vector, the vector needs
151 to be unshared first, and only the owner bb is supposed to free it. */
152 static vec
<strinfo
*, va_heap
, vl_embed
> *stridx_to_strinfo
;
154 /* One OFFSET->IDX mapping. */
157 struct stridxlist
*next
;
158 HOST_WIDE_INT offset
;
162 /* Hash table entry, mapping a DECL to a chain of OFFSET->IDX mappings. */
163 struct decl_stridxlist_map
165 struct tree_map_base base
;
166 struct stridxlist list
;
169 /* Hash table for mapping decls to a chained list of offset -> idx
171 typedef hash_map
<tree_decl_hash
, stridxlist
> decl_to_stridxlist_htab_t
;
172 static decl_to_stridxlist_htab_t
*decl_to_stridxlist_htab
;
174 /* Hash table mapping strlen (or strnlen with constant bound and return
175 smaller than bound) calls to stridx instances describing
176 the calls' arguments. Non-null only when warn_stringop_truncation
178 typedef std::pair
<int, location_t
> stridx_strlenloc
;
179 static hash_map
<tree
, stridx_strlenloc
> *strlen_to_stridx
;
181 /* Obstack for struct stridxlist and struct decl_stridxlist_map. */
182 static struct obstack stridx_obstack
;
184 /* Last memcpy statement if it could be adjusted if the trailing
185 '\0' written is immediately overwritten, or
186 *x = '\0' store that could be removed if it is immediately overwritten. */
187 struct laststmt_struct
194 static int get_stridx_plus_constant (strinfo
*, unsigned HOST_WIDE_INT
, tree
);
195 static void handle_builtin_stxncpy_strncat (bool, gimple_stmt_iterator
*);
197 /* Sets MINMAX to either the constant value or the range VAL is in
198 and returns either the constant value or VAL on success or null
199 when the range couldn't be determined. Uses RVALS when nonnull
200 to determine the range, otherwise get_range_info. */
203 get_range (tree val
, gimple
*stmt
, wide_int minmax
[2],
204 range_query
*rvals
/* = NULL */)
206 if (TREE_CODE (val
) == INTEGER_CST
)
208 minmax
[0] = minmax
[1] = wi::to_wide (val
);
212 if (TREE_CODE (val
) != SSA_NAME
)
218 if (!rvals
->range_of_expr (vr
, val
, stmt
))
220 value_range_kind rng
= vr
.kind ();
224 minmax
[0] = wi::to_wide (vr
.min ());
225 minmax
[1] = wi::to_wide (vr
.max ());
229 value_range_kind rng
= get_range_info (val
, minmax
, minmax
+ 1);
231 /* This may be an inverted range whose MINMAX[1] < MINMAX[0]. */
234 if (rng
== VR_ANTI_RANGE
)
236 /* An anti-range is the same as an ordinary range with inverted
237 bounds (where MINMAX[1] < MINMAX[0] is true) that may result
238 from the conversion of a signed anti-range to unsigned. */
239 wide_int tmp
= minmax
[0];
240 minmax
[0] = minmax
[1] + 1;
241 minmax
[1] = wi::sub (tmp
, 1);
245 /* Do not handle anti-ranges and instead make use of the on-demand
246 VRP if/when it becomes available (hopefully in GCC 11). */
252 * +1 if SI is known to start with more than OFF nonzero characters.
254 * 0 if SI is known to start with exactly OFF nonzero characters.
256 * -1 if SI either does not start with OFF nonzero characters
257 or the relationship between the number of leading nonzero
258 characters in SI and OFF is unknown. */
261 compare_nonzero_chars (strinfo
*si
, unsigned HOST_WIDE_INT off
)
263 if (si
->nonzero_chars
264 && TREE_CODE (si
->nonzero_chars
) == INTEGER_CST
)
265 return compare_tree_int (si
->nonzero_chars
, off
);
270 /* Same as above but suitable also for strings with non-constant lengths.
271 Uses RVALS to determine length range. */
274 compare_nonzero_chars (strinfo
*si
, unsigned HOST_WIDE_INT off
,
277 if (!si
->nonzero_chars
)
280 if (TREE_CODE (si
->nonzero_chars
) == INTEGER_CST
)
281 return compare_tree_int (si
->nonzero_chars
, off
);
283 if (!rvals
|| TREE_CODE (si
->nonzero_chars
) != SSA_NAME
)
287 if (!rvals
->range_of_expr (vr
, si
->nonzero_chars
, si
->stmt
))
289 value_range_kind rng
= vr
.kind ();
293 /* If the offset is less than the minimum length or if the bounds
294 of the length range are equal return the result of the comparison
295 same as in the constant case. Otherwise return a conservative
297 int cmpmin
= compare_tree_int (vr
.min (), off
);
298 if (cmpmin
> 0 || tree_int_cst_equal (vr
.min (), vr
.max ()))
304 /* Return true if SI is known to be a zero-length string. */
307 zero_length_string_p (strinfo
*si
)
309 return si
->full_string_p
&& integer_zerop (si
->nonzero_chars
);
312 /* Return strinfo vector entry IDX. */
314 static inline strinfo
*
315 get_strinfo (int idx
)
317 if (vec_safe_length (stridx_to_strinfo
) <= (unsigned int) idx
)
319 return (*stridx_to_strinfo
)[idx
];
322 /* Get the next strinfo in the chain after SI, or null if none. */
324 static inline strinfo
*
325 get_next_strinfo (strinfo
*si
)
329 strinfo
*nextsi
= get_strinfo (si
->next
);
330 if (nextsi
== NULL
|| nextsi
->first
!= si
->first
|| nextsi
->prev
!= si
->idx
)
335 /* Helper function for get_stridx. Return the strinfo index of the address
336 of EXP, which is available in PTR if nonnull. If OFFSET_OUT, it is
337 OK to return the index for some X <= &EXP and store &EXP - X in
338 *OFFSET_OUT. When RVALS is nonnull uses it to determine range
342 get_addr_stridx (tree exp
, tree ptr
, unsigned HOST_WIDE_INT
*offset_out
,
343 range_query
*rvals
= NULL
)
346 struct stridxlist
*list
, *last
= NULL
;
349 if (!decl_to_stridxlist_htab
)
353 base
= get_addr_base_and_unit_offset (exp
, &poff
);
354 if (base
== NULL
|| !DECL_P (base
) || !poff
.is_constant (&off
))
357 list
= decl_to_stridxlist_htab
->get (base
);
363 if (list
->offset
== off
)
369 if (list
->offset
> off
)
376 if ((offset_out
|| ptr
) && last
&& last
->idx
> 0)
378 unsigned HOST_WIDE_INT rel_off
379 = (unsigned HOST_WIDE_INT
) off
- last
->offset
;
380 strinfo
*si
= get_strinfo (last
->idx
);
381 if (si
&& compare_nonzero_chars (si
, rel_off
, rvals
) >= 0)
385 *offset_out
= rel_off
;
389 return get_stridx_plus_constant (si
, rel_off
, ptr
);
395 /* Returns string index for EXP. When EXP is an SSA_NAME that refers
396 to a known strinfo with an offset and OFFRNG is non-null, sets
397 both elements of the OFFRNG array to the range of the offset and
398 returns the index of the known strinfo. In this case the result
399 must not be used in for functions that modify the string.
400 When nonnull, uses RVALS to determine range information. */
403 get_stridx (tree exp
, wide_int offrng
[2] = NULL
, range_query
*rvals
= NULL
)
406 offrng
[0] = offrng
[1] = wi::zero (TYPE_PRECISION (ptrdiff_type_node
));
408 if (TREE_CODE (exp
) == SSA_NAME
)
410 if (ssa_ver_to_stridx
[SSA_NAME_VERSION (exp
)])
411 return ssa_ver_to_stridx
[SSA_NAME_VERSION (exp
)];
415 HOST_WIDE_INT offset
= 0;
416 /* Follow a chain of at most 5 assignments. */
417 for (int i
= 0; i
< 5; i
++)
419 gimple
*def_stmt
= SSA_NAME_DEF_STMT (e
);
420 if (!is_gimple_assign (def_stmt
))
423 tree_code rhs_code
= gimple_assign_rhs_code (def_stmt
);
426 if (rhs_code
== ADDR_EXPR
)
428 /* Handle indices/offsets into VLAs which are implemented
429 as pointers to arrays. */
430 ptr
= gimple_assign_rhs1 (def_stmt
);
431 ptr
= TREE_OPERAND (ptr
, 0);
433 /* Handle also VLAs of types larger than char. */
434 if (tree eltsize
= TYPE_SIZE_UNIT (TREE_TYPE (ptr
)))
436 if (TREE_CODE (ptr
) == ARRAY_REF
)
438 off
= TREE_OPERAND (ptr
, 1);
439 ptr
= TREE_OPERAND (ptr
, 0);
440 if (!integer_onep (eltsize
))
442 /* Scale the array index by the size of the element
443 type in the rare case that it's greater than
444 the typical 1 for char, making sure both operands
445 have the same type. */
446 eltsize
= fold_convert (ssizetype
, eltsize
);
447 off
= fold_convert (ssizetype
, off
);
448 off
= fold_build2 (MULT_EXPR
, ssizetype
, off
, eltsize
);
452 off
= integer_zero_node
;
457 if (TREE_CODE (ptr
) != MEM_REF
)
460 /* Add the MEM_REF byte offset. */
461 tree mem_off
= TREE_OPERAND (ptr
, 1);
462 off
= fold_build2 (PLUS_EXPR
, TREE_TYPE (off
), off
, mem_off
);
463 ptr
= TREE_OPERAND (ptr
, 0);
465 else if (rhs_code
== POINTER_PLUS_EXPR
)
467 ptr
= gimple_assign_rhs1 (def_stmt
);
468 off
= gimple_assign_rhs2 (def_stmt
);
473 if (TREE_CODE (ptr
) != SSA_NAME
)
476 if (!tree_fits_shwi_p (off
))
478 if (int idx
= ssa_ver_to_stridx
[SSA_NAME_VERSION (ptr
)])
481 /* Only when requested by setting OFFRNG to non-null,
482 return the index corresponding to the SSA_NAME.
483 Do this irrespective of the whether the offset
485 if (get_range (off
, def_stmt
, offrng
, rvals
))
487 /* When the offset range is known, increment it
488 it by the constant offset computed in prior
489 iterations and store it in the OFFRNG array. */
495 /* When the offset range cannot be determined
496 store [0, SIZE_MAX] and let the caller decide
497 if the offset matters. */
498 offrng
[1] = wi::to_wide (TYPE_MAX_VALUE (sizetype
));
499 offrng
[0] = wi::zero (offrng
[1].get_precision ());
506 HOST_WIDE_INT this_off
= tree_to_shwi (off
);
509 offrng
[0] += wi::shwi (this_off
, offrng
->get_precision ());
510 offrng
[1] += offrng
[0];
516 offset
= (unsigned HOST_WIDE_INT
) offset
+ this_off
;
520 if (int idx
= ssa_ver_to_stridx
[SSA_NAME_VERSION (ptr
)])
522 strinfo
*si
= get_strinfo (idx
);
525 if (compare_nonzero_chars (si
, offset
) >= 0)
526 return get_stridx_plus_constant (si
, offset
, exp
);
538 if (TREE_CODE (exp
) == ADDR_EXPR
)
540 int idx
= get_addr_stridx (TREE_OPERAND (exp
, 0), exp
, NULL
);
545 const char *p
= c_getstr (exp
);
547 return ~(int) strlen (p
);
552 /* Return true if strinfo vector is shared with the immediate dominator. */
555 strinfo_shared (void)
557 return vec_safe_length (stridx_to_strinfo
)
558 && (*stridx_to_strinfo
)[0] != NULL
;
561 /* Unshare strinfo vector that is shared with the immediate dominator. */
564 unshare_strinfo_vec (void)
569 gcc_assert (strinfo_shared ());
570 stridx_to_strinfo
= vec_safe_copy (stridx_to_strinfo
);
571 for (i
= 1; vec_safe_iterate (stridx_to_strinfo
, i
, &si
); ++i
)
574 (*stridx_to_strinfo
)[0] = NULL
;
577 /* Attempt to create a string index for exp, ADDR_EXPR's operand.
578 Return a pointer to the location where the string index can
579 be stored (if 0) or is stored, or NULL if this can't be tracked. */
582 addr_stridxptr (tree exp
)
587 tree base
= get_addr_base_and_unit_offset (exp
, &poff
);
588 if (base
== NULL_TREE
|| !DECL_P (base
) || !poff
.is_constant (&off
))
591 if (!decl_to_stridxlist_htab
)
593 decl_to_stridxlist_htab
594 = new hash_map
<tree_decl_hash
, stridxlist
> (64);
595 gcc_obstack_init (&stridx_obstack
);
599 stridxlist
*list
= &decl_to_stridxlist_htab
->get_or_insert (base
, &existed
);
603 stridxlist
*before
= NULL
;
604 for (i
= 0; i
< 32; i
++)
606 if (list
->offset
== off
)
608 if (list
->offset
> off
&& before
== NULL
)
610 if (list
->next
== NULL
)
619 before
= XOBNEW (&stridx_obstack
, struct stridxlist
);
626 list
->next
= XOBNEW (&stridx_obstack
, struct stridxlist
);
636 /* Create a new string index, or return 0 if reached limit. */
639 new_stridx (tree exp
)
642 if (max_stridx
>= param_max_tracked_strlens
)
644 if (TREE_CODE (exp
) == SSA_NAME
)
646 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (exp
))
649 ssa_ver_to_stridx
[SSA_NAME_VERSION (exp
)] = idx
;
652 if (TREE_CODE (exp
) == ADDR_EXPR
)
654 int *pidx
= addr_stridxptr (TREE_OPERAND (exp
, 0));
657 gcc_assert (*pidx
== 0);
658 *pidx
= max_stridx
++;
665 /* Like new_stridx, but for ADDR_EXPR's operand instead. */
668 new_addr_stridx (tree exp
)
671 if (max_stridx
>= param_max_tracked_strlens
)
673 pidx
= addr_stridxptr (exp
);
676 gcc_assert (*pidx
== 0);
677 *pidx
= max_stridx
++;
683 /* Create a new strinfo. */
686 new_strinfo (tree ptr
, int idx
, tree nonzero_chars
, bool full_string_p
)
688 strinfo
*si
= strinfo_pool
.allocate ();
689 si
->nonzero_chars
= nonzero_chars
;
690 STRIP_USELESS_TYPE_CONVERSION (ptr
);
694 si
->endptr
= NULL_TREE
;
700 si
->writable
= false;
701 si
->dont_invalidate
= false;
702 si
->full_string_p
= full_string_p
;
706 /* Decrease strinfo refcount and free it if not referenced anymore. */
709 free_strinfo (strinfo
*si
)
711 if (si
&& --si
->refcount
== 0)
712 strinfo_pool
.remove (si
);
715 /* Set strinfo in the vector entry IDX to SI. */
718 set_strinfo (int idx
, strinfo
*si
)
720 if (vec_safe_length (stridx_to_strinfo
) && (*stridx_to_strinfo
)[0])
721 unshare_strinfo_vec ();
722 if (vec_safe_length (stridx_to_strinfo
) <= (unsigned int) idx
)
723 vec_safe_grow_cleared (stridx_to_strinfo
, idx
+ 1, true);
724 (*stridx_to_strinfo
)[idx
] = si
;
727 /* Return the first strinfo in the related strinfo chain
728 if all strinfos in between belong to the chain, otherwise NULL. */
731 verify_related_strinfos (strinfo
*origsi
)
733 strinfo
*si
= origsi
, *psi
;
735 if (origsi
->first
== 0)
737 for (; si
->prev
; si
= psi
)
739 if (si
->first
!= origsi
->first
)
741 psi
= get_strinfo (si
->prev
);
744 if (psi
->next
!= si
->idx
)
747 if (si
->idx
!= si
->first
)
752 /* Set SI's endptr to ENDPTR and compute its length based on SI->ptr.
753 Use LOC for folding. */
756 set_endptr_and_length (location_t loc
, strinfo
*si
, tree endptr
)
760 tree start_as_size
= fold_convert_loc (loc
, size_type_node
, si
->ptr
);
761 tree end_as_size
= fold_convert_loc (loc
, size_type_node
, endptr
);
762 si
->nonzero_chars
= fold_build2_loc (loc
, MINUS_EXPR
, size_type_node
,
763 end_as_size
, start_as_size
);
764 si
->full_string_p
= true;
767 /* Return the string length, or NULL if it can't be computed.
768 The length may but need not be constant. Instead, it might be
769 the result of a strlen() call. */
772 get_string_length (strinfo
*si
)
774 /* If the length has already been computed return it if it's exact
775 (i.e., the string is nul-terminated at NONZERO_CHARS), or return
777 if (si
->nonzero_chars
)
778 return si
->full_string_p
? si
->nonzero_chars
: NULL
;
780 /* If the string is the result of one of the built-in calls below
781 attempt to compute the length from the call statement. */
784 gimple
*stmt
= si
->stmt
, *lenstmt
;
785 tree callee
, lhs
, fn
, tem
;
787 gimple_stmt_iterator gsi
;
789 gcc_assert (is_gimple_call (stmt
));
790 callee
= gimple_call_fndecl (stmt
);
791 gcc_assert (callee
&& fndecl_built_in_p (callee
, BUILT_IN_NORMAL
));
792 lhs
= gimple_call_lhs (stmt
);
793 /* unshare_strinfo is intentionally not called here. The (delayed)
794 transformation of strcpy or strcat into stpcpy is done at the place
795 of the former strcpy/strcat call and so can affect all the strinfos
796 with the same stmt. If they were unshared before and transformation
797 has been already done, the handling of BUILT_IN_STPCPY{,_CHK} should
798 just compute the right length. */
799 switch (DECL_FUNCTION_CODE (callee
))
801 case BUILT_IN_STRCAT
:
802 case BUILT_IN_STRCAT_CHK
:
803 gsi
= gsi_for_stmt (stmt
);
804 fn
= builtin_decl_implicit (BUILT_IN_STRLEN
);
805 gcc_assert (lhs
== NULL_TREE
);
806 tem
= unshare_expr (gimple_call_arg (stmt
, 0));
807 lenstmt
= gimple_build_call (fn
, 1, tem
);
808 lhs
= make_ssa_name (TREE_TYPE (TREE_TYPE (fn
)), lenstmt
);
809 gimple_call_set_lhs (lenstmt
, lhs
);
810 gimple_set_vuse (lenstmt
, gimple_vuse (stmt
));
811 gsi_insert_before (&gsi
, lenstmt
, GSI_SAME_STMT
);
812 tem
= gimple_call_arg (stmt
, 0);
813 if (!ptrofftype_p (TREE_TYPE (lhs
)))
815 lhs
= convert_to_ptrofftype (lhs
);
816 lhs
= force_gimple_operand_gsi (&gsi
, lhs
, true, NULL_TREE
,
817 true, GSI_SAME_STMT
);
819 lenstmt
= gimple_build_assign
820 (make_ssa_name (TREE_TYPE (gimple_call_arg (stmt
, 0))),
821 POINTER_PLUS_EXPR
,tem
, lhs
);
822 gsi_insert_before (&gsi
, lenstmt
, GSI_SAME_STMT
);
823 gimple_call_set_arg (stmt
, 0, gimple_assign_lhs (lenstmt
));
826 case BUILT_IN_STRCPY
:
827 case BUILT_IN_STRCPY_CHK
:
828 gcc_assert (builtin_decl_implicit_p (BUILT_IN_STPCPY
));
829 if (gimple_call_num_args (stmt
) == 2)
830 fn
= builtin_decl_implicit (BUILT_IN_STPCPY
);
832 fn
= builtin_decl_explicit (BUILT_IN_STPCPY_CHK
);
833 gcc_assert (lhs
== NULL_TREE
);
834 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
836 fprintf (dump_file
, "Optimizing: ");
837 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
839 gimple_call_set_fndecl (stmt
, fn
);
840 lhs
= make_ssa_name (TREE_TYPE (TREE_TYPE (fn
)), stmt
);
841 gimple_call_set_lhs (stmt
, lhs
);
843 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
845 fprintf (dump_file
, "into: ");
846 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
849 case BUILT_IN_STPCPY
:
850 case BUILT_IN_STPCPY_CHK
:
851 gcc_assert (lhs
!= NULL_TREE
);
852 loc
= gimple_location (stmt
);
853 set_endptr_and_length (loc
, si
, lhs
);
854 for (strinfo
*chainsi
= verify_related_strinfos (si
);
856 chainsi
= get_next_strinfo (chainsi
))
857 if (chainsi
->nonzero_chars
== NULL
)
858 set_endptr_and_length (loc
, chainsi
, lhs
);
860 case BUILT_IN_ALLOCA
:
861 case BUILT_IN_ALLOCA_WITH_ALIGN
:
862 case BUILT_IN_MALLOC
:
864 /* BUILT_IN_CALLOC always has si->nonzero_chars set. */
871 return si
->nonzero_chars
;
874 /* Dump strlen data to FP for statement STMT. When non-null, RVALS
875 points to the valuation engine used to calculate ranges, and is
876 used to dump strlen range for non-constant results. */
879 dump_strlen_info (FILE *fp
, gimple
*stmt
, range_query
*rvals
)
883 fprintf (fp
, "\nDumping strlen pass data after ");
884 print_gimple_expr (fp
, stmt
, TDF_LINENO
);
888 fprintf (fp
, "\nDumping strlen pass data\n");
890 fprintf (fp
, "max_stridx = %i\n", max_stridx
);
891 fprintf (fp
, "ssa_ver_to_stridx has %u elements\n",
892 ssa_ver_to_stridx
.length ());
893 fprintf (fp
, "stridx_to_strinfo");
894 if (stridx_to_strinfo
)
896 fprintf (fp
, " has %u elements\n", stridx_to_strinfo
->length ());
897 for (unsigned i
= 0; i
!= stridx_to_strinfo
->length (); ++i
)
899 if (strinfo
*si
= (*stridx_to_strinfo
)[i
])
903 fprintf (fp
, " idx = %i", si
->idx
);
906 fprintf (fp
, ", ptr = ");
907 print_generic_expr (fp
, si
->ptr
);
910 if (si
->nonzero_chars
)
912 fprintf (fp
, ", nonzero_chars = ");
913 print_generic_expr (fp
, si
->nonzero_chars
);
914 if (TREE_CODE (si
->nonzero_chars
) == SSA_NAME
)
916 value_range_kind rng
= VR_UNDEFINED
;
921 rvals
->range_of_expr (vr
, si
->nonzero_chars
,
924 if (range_int_cst_p (&vr
))
926 min
= wi::to_wide (vr
.min ());
927 max
= wi::to_wide (vr
.max ());
933 rng
= get_range_info (si
->nonzero_chars
, &min
, &max
);
935 if (rng
== VR_RANGE
|| rng
== VR_ANTI_RANGE
)
937 fprintf (fp
, " %s[%llu, %llu]",
938 rng
== VR_RANGE
? "" : "~",
939 (long long) min
.to_uhwi (),
940 (long long) max
.to_uhwi ());
945 fprintf (fp
, ", refcount = %i", si
->refcount
);
948 fprintf (fp
, ", stmt = ");
949 print_gimple_expr (fp
, si
->stmt
, 0);
953 fprintf (fp
, ", alloc = ");
954 print_gimple_expr (fp
, si
->alloc
, 0);
957 fprintf (fp
, ", writable");
958 if (si
->dont_invalidate
)
959 fprintf (fp
, ", dont_invalidate");
960 if (si
->full_string_p
)
961 fprintf (fp
, ", full_string_p");
962 if (strinfo
*next
= get_next_strinfo (si
))
966 fprintf (fp
, "%i%s", next
->idx
, next
->first
? ", " : "");
967 while ((next
= get_next_strinfo (next
)));
975 fprintf (fp
, " = null\n");
977 fprintf (fp
, "decl_to_stridxlist_htab");
978 if (decl_to_stridxlist_htab
)
981 typedef decl_to_stridxlist_htab_t::iterator iter_t
;
982 for (iter_t it
= decl_to_stridxlist_htab
->begin ();
983 it
!= decl_to_stridxlist_htab
->end (); ++it
)
985 tree decl
= (*it
).first
;
986 stridxlist
*list
= &(*it
).second
;
987 fprintf (fp
, " decl = ");
988 print_generic_expr (fp
, decl
);
991 fprintf (fp
, ", offsets = {");
992 for (; list
; list
= list
->next
)
993 fprintf (fp
, "%lli%s", (long long) list
->offset
,
994 list
->next
? ", " : "");
1001 fprintf (fp
, " = null\n");
1005 fprintf (fp
, "laststmt = ");
1006 print_gimple_expr (fp
, laststmt
.stmt
, 0);
1007 fprintf (fp
, ", len = ");
1008 print_generic_expr (fp
, laststmt
.len
);
1009 fprintf (fp
, ", stridx = %i\n", laststmt
.stridx
);
1013 /* Attempt to determine the length of the string SRC. On success, store
1014 the length in *PDATA and return true. Otherwise, return false.
1015 VISITED is a bitmap of visited PHI nodes. RVALS points to the valuation
1016 engine used to calculate ranges. PSSA_DEF_MAX to an SSA_NAME
1017 assignment limit used to prevent runaway recursion. */
1020 get_range_strlen_dynamic (tree src
, gimple
*stmt
,
1021 c_strlen_data
*pdata
, bitmap
*visited
,
1022 range_query
*rvals
, unsigned *pssa_def_max
)
1024 int idx
= get_stridx (src
);
1027 if (TREE_CODE (src
) == SSA_NAME
)
1029 gimple
*def_stmt
= SSA_NAME_DEF_STMT (src
);
1030 if (gimple_code (def_stmt
) == GIMPLE_PHI
)
1033 *visited
= BITMAP_ALLOC (NULL
);
1035 if (!bitmap_set_bit (*visited
, SSA_NAME_VERSION (src
)))
1038 if (*pssa_def_max
== 0)
1043 /* Iterate over the PHI arguments and determine the minimum
1044 and maximum length/size of each and incorporate them into
1045 the overall result. */
1046 gphi
*phi
= as_a
<gphi
*> (def_stmt
);
1047 for (unsigned i
= 0; i
!= gimple_phi_num_args (phi
); ++i
)
1049 tree arg
= gimple_phi_arg_def (phi
, i
);
1050 if (arg
== gimple_phi_result (def_stmt
))
1053 c_strlen_data argdata
= { };
1054 if (get_range_strlen_dynamic (arg
, phi
, &argdata
, visited
,
1055 rvals
, pssa_def_max
))
1057 /* Set the DECL of an unterminated array this argument
1058 refers to if one hasn't been found yet. */
1059 if (!pdata
->decl
&& argdata
.decl
)
1060 pdata
->decl
= argdata
.decl
;
1063 || (integer_zerop (argdata
.minlen
)
1064 && (!argdata
.maxbound
1065 || integer_all_onesp (argdata
.maxbound
))
1066 && integer_all_onesp (argdata
.maxlen
)))
1068 /* Set the upper bound of the length to unbounded. */
1069 pdata
->maxlen
= build_all_ones_cst (size_type_node
);
1073 /* Adjust the minimum and maximum length determined
1074 so far and the upper bound on the array size. */
1076 || tree_int_cst_lt (argdata
.minlen
, pdata
->minlen
))
1077 pdata
->minlen
= argdata
.minlen
;
1080 && tree_int_cst_lt (pdata
->maxlen
, argdata
.maxlen
)))
1081 pdata
->maxlen
= argdata
.maxlen
;
1082 if (!pdata
->maxbound
1083 || TREE_CODE (pdata
->maxbound
) != INTEGER_CST
1084 || (argdata
.maxbound
1085 && tree_int_cst_lt (pdata
->maxbound
,
1087 && !integer_all_onesp (argdata
.maxbound
)))
1088 pdata
->maxbound
= argdata
.maxbound
;
1091 pdata
->maxlen
= build_all_ones_cst (size_type_node
);
1098 /* Return success regardless of the result and handle *PDATA
1100 get_range_strlen (src
, pdata
, 1);
1106 /* SRC is a string of constant length. */
1107 pdata
->minlen
= build_int_cst (size_type_node
, ~idx
);
1108 pdata
->maxlen
= pdata
->minlen
;
1109 pdata
->maxbound
= pdata
->maxlen
;
1113 if (strinfo
*si
= get_strinfo (idx
))
1115 pdata
->minlen
= get_string_length (si
);
1116 if (!pdata
->minlen
&& si
->nonzero_chars
)
1118 if (TREE_CODE (si
->nonzero_chars
) == INTEGER_CST
)
1119 pdata
->minlen
= si
->nonzero_chars
;
1120 else if (TREE_CODE (si
->nonzero_chars
) == SSA_NAME
)
1123 rvals
->range_of_expr (vr
, si
->nonzero_chars
, si
->stmt
);
1124 if (range_int_cst_p (&vr
))
1126 pdata
->minlen
= vr
.min ();
1127 pdata
->maxlen
= vr
.max ();
1130 pdata
->minlen
= build_zero_cst (size_type_node
);
1133 pdata
->minlen
= build_zero_cst (size_type_node
);
1135 tree base
= si
->ptr
;
1136 if (TREE_CODE (base
) == ADDR_EXPR
)
1137 base
= TREE_OPERAND (base
, 0);
1141 base
= get_addr_base_and_unit_offset (base
, &poff
);
1144 && TREE_CODE (TREE_TYPE (base
)) == ARRAY_TYPE
1145 && TYPE_SIZE_UNIT (TREE_TYPE (base
))
1146 && poff
.is_constant (&off
))
1148 tree basetype
= TREE_TYPE (base
);
1149 tree size
= TYPE_SIZE_UNIT (basetype
);
1150 if (TREE_CODE (size
) == INTEGER_CST
)
1152 ++off
; /* Increment for the terminating nul. */
1153 tree toffset
= build_int_cst (size_type_node
, off
);
1154 pdata
->maxlen
= fold_build2 (MINUS_EXPR
, size_type_node
, size
,
1156 pdata
->maxbound
= pdata
->maxlen
;
1159 pdata
->maxlen
= build_all_ones_cst (size_type_node
);
1162 pdata
->maxlen
= build_all_ones_cst (size_type_node
);
1164 else if (pdata
->minlen
&& TREE_CODE (pdata
->minlen
) == SSA_NAME
)
1167 rvals
->range_of_expr (vr
, si
->nonzero_chars
, stmt
);
1168 if (range_int_cst_p (&vr
))
1170 pdata
->minlen
= vr
.min ();
1171 pdata
->maxlen
= vr
.max ();
1172 pdata
->maxbound
= pdata
->maxlen
;
1176 pdata
->minlen
= build_zero_cst (size_type_node
);
1177 pdata
->maxlen
= build_all_ones_cst (size_type_node
);
1180 else if (pdata
->minlen
&& TREE_CODE (pdata
->minlen
) == INTEGER_CST
)
1182 pdata
->maxlen
= pdata
->minlen
;
1183 pdata
->maxbound
= pdata
->minlen
;
1187 /* For PDATA->MINLEN that's a non-constant expression such
1188 as PLUS_EXPR whose value range is unknown, set the bounds
1189 to zero and SIZE_MAX. */
1190 pdata
->minlen
= build_zero_cst (size_type_node
);
1191 pdata
->maxlen
= build_all_ones_cst (size_type_node
);
1200 /* Analogous to get_range_strlen but for dynamically created strings,
1201 i.e., those created by calls to strcpy as opposed to just string
1203 Try to obtain the range of the lengths of the string(s) referenced
1204 by SRC, or the size of the largest array SRC refers to if the range
1205 of lengths cannot be determined, and store all in *PDATA. RVALS
1206 points to the valuation engine used to calculate ranges. */
1209 get_range_strlen_dynamic (tree src
, gimple
*stmt
, c_strlen_data
*pdata
,
1212 bitmap visited
= NULL
;
1213 tree maxbound
= pdata
->maxbound
;
1215 unsigned limit
= param_ssa_name_def_chain_limit
;
1216 if (!get_range_strlen_dynamic (src
, stmt
, pdata
, &visited
, rvals
, &limit
))
1218 /* On failure extend the length range to an impossible maximum
1219 (a valid MAXLEN must be less than PTRDIFF_MAX - 1). Other
1220 members can stay unchanged regardless. */
1221 pdata
->minlen
= ssize_int (0);
1222 pdata
->maxlen
= build_all_ones_cst (size_type_node
);
1224 else if (!pdata
->minlen
)
1225 pdata
->minlen
= ssize_int (0);
1227 /* If it's unchanged from it initial non-null value, set the conservative
1228 MAXBOUND to SIZE_MAX. Otherwise leave it null (if it is null). */
1229 if (maxbound
&& pdata
->maxbound
== maxbound
)
1230 pdata
->maxbound
= build_all_ones_cst (size_type_node
);
1233 BITMAP_FREE (visited
);
1236 /* Invalidate string length information for strings whose length might
1237 change due to stores in STMT, except those marked DONT_INVALIDATE.
1238 For string-modifying statements, ZERO_WRITE is set when the statement
1240 Returns true if any STRIDX_TO_STRINFO entries were considered
1241 for invalidation. */
1244 maybe_invalidate (gimple
*stmt
, bool zero_write
= false)
1246 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1248 fprintf (dump_file
, "%s called for ", __func__
);
1249 print_gimple_stmt (dump_file
, stmt
, TDF_LINENO
);
1253 bool nonempty
= false;
1255 for (unsigned i
= 1; vec_safe_iterate (stridx_to_strinfo
, i
, &si
); ++i
)
1257 if (si
== NULL
|| !POINTER_TYPE_P (TREE_TYPE (si
->ptr
)))
1262 /* Unconditionally reset DONT_INVALIDATE. */
1263 bool dont_invalidate
= si
->dont_invalidate
;
1264 si
->dont_invalidate
= false;
1266 if (dont_invalidate
)
1270 tree size
= NULL_TREE
;
1271 if (si
->nonzero_chars
)
1273 /* Include the terminating nul in the size of the string
1274 to consider when determining possible clobber. */
1275 tree type
= TREE_TYPE (si
->nonzero_chars
);
1276 size
= fold_build2 (PLUS_EXPR
, type
, si
->nonzero_chars
,
1277 build_int_cst (type
, 1));
1279 ao_ref_init_from_ptr_and_size (&r
, si
->ptr
, size
);
1280 if (stmt_may_clobber_ref_p_1 (stmt
, &r
))
1282 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1284 fputs (" statement may clobber object ", dump_file
);
1285 print_generic_expr (dump_file
, si
->ptr
);
1286 if (size
&& tree_fits_uhwi_p (size
))
1287 fprintf (dump_file
, " " HOST_WIDE_INT_PRINT_UNSIGNED
1288 " bytes in size", tree_to_uhwi (size
));
1289 fputc ('\n', dump_file
);
1292 set_strinfo (i
, NULL
);
1300 && is_gimple_call (si
->stmt
)
1301 && (DECL_FUNCTION_CODE (gimple_call_fndecl (si
->stmt
))
1302 == BUILT_IN_CALLOC
))
1304 /* If the clobber test above considered the length of
1305 the string (including the nul), then for (potentially)
1306 non-zero writes that might modify storage allocated by
1307 calloc consider the whole object and if it might be
1308 clobbered by the statement reset the statement. */
1309 ao_ref_init_from_ptr_and_size (&r
, si
->ptr
, NULL_TREE
);
1310 if (stmt_may_clobber_ref_p_1 (stmt
, &r
))
1315 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1316 fprintf (dump_file
, "%s returns %i\n", __func__
, nonempty
);
1321 /* Unshare strinfo record SI, if it has refcount > 1 or
1322 if stridx_to_strinfo vector is shared with some other
1326 unshare_strinfo (strinfo
*si
)
1330 if (si
->refcount
== 1 && !strinfo_shared ())
1333 nsi
= new_strinfo (si
->ptr
, si
->idx
, si
->nonzero_chars
, si
->full_string_p
);
1334 nsi
->stmt
= si
->stmt
;
1335 nsi
->alloc
= si
->alloc
;
1336 nsi
->endptr
= si
->endptr
;
1337 nsi
->first
= si
->first
;
1338 nsi
->prev
= si
->prev
;
1339 nsi
->next
= si
->next
;
1340 nsi
->writable
= si
->writable
;
1341 set_strinfo (si
->idx
, nsi
);
1346 /* Attempt to create a new strinfo for BASESI + OFF, or find existing
1347 strinfo if there is any. Return it's idx, or 0 if no strinfo has
1351 get_stridx_plus_constant (strinfo
*basesi
, unsigned HOST_WIDE_INT off
,
1354 if (TREE_CODE (ptr
) == SSA_NAME
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ptr
))
1357 if (compare_nonzero_chars (basesi
, off
) < 0
1358 || !tree_fits_uhwi_p (basesi
->nonzero_chars
))
1361 unsigned HOST_WIDE_INT nonzero_chars
1362 = tree_to_uhwi (basesi
->nonzero_chars
) - off
;
1363 strinfo
*si
= basesi
, *chainsi
;
1364 if (si
->first
|| si
->prev
|| si
->next
)
1365 si
= verify_related_strinfos (basesi
);
1367 || si
->nonzero_chars
== NULL_TREE
1368 || TREE_CODE (si
->nonzero_chars
) != INTEGER_CST
)
1371 if (TREE_CODE (ptr
) == SSA_NAME
1372 && ssa_ver_to_stridx
.length () <= SSA_NAME_VERSION (ptr
))
1373 ssa_ver_to_stridx
.safe_grow_cleared (num_ssa_names
, true);
1375 gcc_checking_assert (compare_tree_int (si
->nonzero_chars
, off
) != -1);
1376 for (chainsi
= si
; chainsi
->next
; chainsi
= si
)
1378 si
= get_next_strinfo (chainsi
);
1380 || si
->nonzero_chars
== NULL_TREE
1381 || TREE_CODE (si
->nonzero_chars
) != INTEGER_CST
)
1383 int r
= compare_tree_int (si
->nonzero_chars
, nonzero_chars
);
1388 if (TREE_CODE (ptr
) == SSA_NAME
)
1389 ssa_ver_to_stridx
[SSA_NAME_VERSION (ptr
)] = si
->idx
;
1392 int *pidx
= addr_stridxptr (TREE_OPERAND (ptr
, 0));
1393 if (pidx
!= NULL
&& *pidx
== 0)
1402 int idx
= new_stridx (ptr
);
1405 si
= new_strinfo (ptr
, idx
, build_int_cst (size_type_node
, nonzero_chars
),
1406 basesi
->full_string_p
);
1407 set_strinfo (idx
, si
);
1408 if (strinfo
*nextsi
= get_strinfo (chainsi
->next
))
1410 nextsi
= unshare_strinfo (nextsi
);
1411 si
->next
= nextsi
->idx
;
1414 chainsi
= unshare_strinfo (chainsi
);
1415 if (chainsi
->first
== 0)
1416 chainsi
->first
= chainsi
->idx
;
1417 chainsi
->next
= idx
;
1418 if (chainsi
->endptr
== NULL_TREE
&& zero_length_string_p (si
))
1419 chainsi
->endptr
= ptr
;
1420 si
->endptr
= chainsi
->endptr
;
1421 si
->prev
= chainsi
->idx
;
1422 si
->first
= chainsi
->first
;
1423 si
->writable
= chainsi
->writable
;
1427 /* Note that PTR, a pointer SSA_NAME initialized in the current stmt, points
1428 to a zero-length string and if possible chain it to a related strinfo
1429 chain whose part is or might be CHAINSI. */
1432 zero_length_string (tree ptr
, strinfo
*chainsi
)
1436 if (ssa_ver_to_stridx
.length () <= SSA_NAME_VERSION (ptr
))
1437 ssa_ver_to_stridx
.safe_grow_cleared (num_ssa_names
, true);
1438 gcc_checking_assert (TREE_CODE (ptr
) == SSA_NAME
1439 && ssa_ver_to_stridx
[SSA_NAME_VERSION (ptr
)] == 0);
1441 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ptr
))
1443 if (chainsi
!= NULL
)
1445 si
= verify_related_strinfos (chainsi
);
1450 /* We shouldn't mix delayed and non-delayed lengths. */
1451 gcc_assert (si
->full_string_p
);
1452 if (si
->endptr
== NULL_TREE
)
1454 si
= unshare_strinfo (si
);
1458 si
= get_next_strinfo (si
);
1461 if (zero_length_string_p (chainsi
))
1465 chainsi
= unshare_strinfo (chainsi
);
1468 ssa_ver_to_stridx
[SSA_NAME_VERSION (ptr
)] = chainsi
->idx
;
1474 /* We shouldn't mix delayed and non-delayed lengths. */
1475 gcc_assert (chainsi
->full_string_p
);
1476 if (chainsi
->first
|| chainsi
->prev
|| chainsi
->next
)
1478 chainsi
= unshare_strinfo (chainsi
);
1485 idx
= new_stridx (ptr
);
1488 si
= new_strinfo (ptr
, idx
, build_int_cst (size_type_node
, 0), true);
1489 set_strinfo (idx
, si
);
1491 if (chainsi
!= NULL
)
1493 chainsi
= unshare_strinfo (chainsi
);
1494 if (chainsi
->first
== 0)
1495 chainsi
->first
= chainsi
->idx
;
1496 chainsi
->next
= idx
;
1497 if (chainsi
->endptr
== NULL_TREE
)
1498 chainsi
->endptr
= ptr
;
1499 si
->prev
= chainsi
->idx
;
1500 si
->first
= chainsi
->first
;
1501 si
->writable
= chainsi
->writable
;
1506 /* For strinfo ORIGSI whose length has been just updated, adjust other
1507 related strinfos so that they match the new ORIGSI. This involves:
1509 - adding ADJ to the nonzero_chars fields
1510 - copying full_string_p from the new ORIGSI. */
1513 adjust_related_strinfos (location_t loc
, strinfo
*origsi
, tree adj
)
1515 strinfo
*si
= verify_related_strinfos (origsi
);
1528 si
= unshare_strinfo (si
);
1529 /* We shouldn't see delayed lengths here; the caller must
1530 have calculated the old length in order to calculate
1532 gcc_assert (si
->nonzero_chars
);
1533 tem
= fold_convert_loc (loc
, TREE_TYPE (si
->nonzero_chars
), adj
);
1534 si
->nonzero_chars
= fold_build2_loc (loc
, PLUS_EXPR
,
1535 TREE_TYPE (si
->nonzero_chars
),
1536 si
->nonzero_chars
, tem
);
1537 si
->full_string_p
= origsi
->full_string_p
;
1539 si
->endptr
= NULL_TREE
;
1540 si
->dont_invalidate
= true;
1542 nsi
= get_next_strinfo (si
);
1549 /* Find if there are other SSA_NAME pointers equal to PTR
1550 for which we don't track their string lengths yet. If so, use
1554 find_equal_ptrs (tree ptr
, int idx
)
1556 if (TREE_CODE (ptr
) != SSA_NAME
)
1560 gimple
*stmt
= SSA_NAME_DEF_STMT (ptr
);
1561 if (!is_gimple_assign (stmt
))
1563 ptr
= gimple_assign_rhs1 (stmt
);
1564 switch (gimple_assign_rhs_code (stmt
))
1569 if (!POINTER_TYPE_P (TREE_TYPE (ptr
)))
1571 if (TREE_CODE (ptr
) == SSA_NAME
)
1573 if (TREE_CODE (ptr
) != ADDR_EXPR
)
1578 int *pidx
= addr_stridxptr (TREE_OPERAND (ptr
, 0));
1579 if (pidx
!= NULL
&& *pidx
== 0)
1587 /* We might find an endptr created in this pass. Grow the
1588 vector in that case. */
1589 if (ssa_ver_to_stridx
.length () <= SSA_NAME_VERSION (ptr
))
1590 ssa_ver_to_stridx
.safe_grow_cleared (num_ssa_names
, true);
1592 if (ssa_ver_to_stridx
[SSA_NAME_VERSION (ptr
)] != 0)
1594 ssa_ver_to_stridx
[SSA_NAME_VERSION (ptr
)] = idx
;
1598 /* Return true if STMT is a call to a builtin function with the right
1599 arguments and attributes that should be considered for optimization
1603 valid_builtin_call (gimple
*stmt
)
1605 if (!gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
))
1608 tree callee
= gimple_call_fndecl (stmt
);
1609 tree decl
= builtin_decl_explicit (DECL_FUNCTION_CODE (callee
));
1612 && !gimple_builtin_call_types_compatible_p (stmt
, decl
))
1615 switch (DECL_FUNCTION_CODE (callee
))
1617 case BUILT_IN_MEMCMP
:
1618 case BUILT_IN_MEMCMP_EQ
:
1619 case BUILT_IN_STRCMP
:
1620 case BUILT_IN_STRNCMP
:
1621 case BUILT_IN_STRCHR
:
1622 case BUILT_IN_STRLEN
:
1623 case BUILT_IN_STRNLEN
:
1624 /* The above functions should be pure. Punt if they aren't. */
1625 if (gimple_vdef (stmt
) || gimple_vuse (stmt
) == NULL_TREE
)
1629 case BUILT_IN_ALLOCA
:
1630 case BUILT_IN_ALLOCA_WITH_ALIGN
:
1631 case BUILT_IN_CALLOC
:
1632 case BUILT_IN_MALLOC
:
1633 case BUILT_IN_MEMCPY
:
1634 case BUILT_IN_MEMCPY_CHK
:
1635 case BUILT_IN_MEMPCPY
:
1636 case BUILT_IN_MEMPCPY_CHK
:
1637 case BUILT_IN_MEMSET
:
1638 case BUILT_IN_STPCPY
:
1639 case BUILT_IN_STPCPY_CHK
:
1640 case BUILT_IN_STPNCPY
:
1641 case BUILT_IN_STPNCPY_CHK
:
1642 case BUILT_IN_STRCAT
:
1643 case BUILT_IN_STRCAT_CHK
:
1644 case BUILT_IN_STRCPY
:
1645 case BUILT_IN_STRCPY_CHK
:
1646 case BUILT_IN_STRNCAT
:
1647 case BUILT_IN_STRNCAT_CHK
:
1648 case BUILT_IN_STRNCPY
:
1649 case BUILT_IN_STRNCPY_CHK
:
1650 /* The above functions should be neither const nor pure. Punt if they
1652 if (gimple_vdef (stmt
) == NULL_TREE
|| gimple_vuse (stmt
) == NULL_TREE
)
1663 /* If the last .MEM setter statement before STMT is
1664 memcpy (x, y, strlen (y) + 1), the only .MEM use of it is STMT
1665 and STMT is known to overwrite x[strlen (x)], adjust the last memcpy to
1666 just memcpy (x, y, strlen (y)). SI must be the zero length
1670 adjust_last_stmt (strinfo
*si
, gimple
*stmt
, bool is_strcat
)
1672 tree vuse
, callee
, len
;
1673 struct laststmt_struct last
= laststmt
;
1674 strinfo
*lastsi
, *firstsi
;
1675 unsigned len_arg_no
= 2;
1677 laststmt
.stmt
= NULL
;
1678 laststmt
.len
= NULL_TREE
;
1679 laststmt
.stridx
= 0;
1681 if (last
.stmt
== NULL
)
1684 vuse
= gimple_vuse (stmt
);
1685 if (vuse
== NULL_TREE
1686 || SSA_NAME_DEF_STMT (vuse
) != last
.stmt
1687 || !has_single_use (vuse
))
1690 gcc_assert (last
.stridx
> 0);
1691 lastsi
= get_strinfo (last
.stridx
);
1697 if (lastsi
->first
== 0 || lastsi
->first
!= si
->first
)
1700 firstsi
= verify_related_strinfos (si
);
1701 if (firstsi
== NULL
)
1703 while (firstsi
!= lastsi
)
1705 firstsi
= get_next_strinfo (firstsi
);
1706 if (firstsi
== NULL
)
1711 if (!is_strcat
&& !zero_length_string_p (si
))
1714 if (is_gimple_assign (last
.stmt
))
1716 gimple_stmt_iterator gsi
;
1718 if (!integer_zerop (gimple_assign_rhs1 (last
.stmt
)))
1720 if (stmt_could_throw_p (cfun
, last
.stmt
))
1722 gsi
= gsi_for_stmt (last
.stmt
);
1723 unlink_stmt_vdef (last
.stmt
);
1724 release_defs (last
.stmt
);
1725 gsi_remove (&gsi
, true);
1729 if (!valid_builtin_call (last
.stmt
))
1732 callee
= gimple_call_fndecl (last
.stmt
);
1733 switch (DECL_FUNCTION_CODE (callee
))
1735 case BUILT_IN_MEMCPY
:
1736 case BUILT_IN_MEMCPY_CHK
:
1742 len
= gimple_call_arg (last
.stmt
, len_arg_no
);
1743 if (tree_fits_uhwi_p (len
))
1745 if (!tree_fits_uhwi_p (last
.len
)
1746 || integer_zerop (len
)
1747 || tree_to_uhwi (len
) != tree_to_uhwi (last
.len
) + 1)
1749 /* Don't adjust the length if it is divisible by 4, it is more efficient
1750 to store the extra '\0' in that case. */
1751 if ((tree_to_uhwi (len
) & 3) == 0)
1754 /* Don't fold away an out of bounds access, as this defeats proper
1756 tree dst
= gimple_call_arg (last
.stmt
, 0);
1757 tree size
= compute_objsize (dst
, 0);
1758 if (size
&& tree_int_cst_lt (size
, len
))
1761 else if (TREE_CODE (len
) == SSA_NAME
)
1763 gimple
*def_stmt
= SSA_NAME_DEF_STMT (len
);
1764 if (!is_gimple_assign (def_stmt
)
1765 || gimple_assign_rhs_code (def_stmt
) != PLUS_EXPR
1766 || gimple_assign_rhs1 (def_stmt
) != last
.len
1767 || !integer_onep (gimple_assign_rhs2 (def_stmt
)))
1773 gimple_call_set_arg (last
.stmt
, len_arg_no
, last
.len
);
1774 update_stmt (last
.stmt
);
1777 /* For an LHS that is an SSA_NAME that is the result of a strlen()
1778 call, or when BOUND is non-null, of a strnlen() call, set LHS
1779 range info to [0, min (MAX, BOUND)] when the range includes more
1780 than one value and return LHS. Otherwise, when the range
1781 [MIN, MAX] is such that MIN == MAX, return the tree representation
1782 of (MIN). The latter allows callers to fold suitable strnlen() calls
1786 set_strlen_range (tree lhs
, wide_int min
, wide_int max
,
1787 tree bound
/* = NULL_TREE */)
1789 if (TREE_CODE (lhs
) != SSA_NAME
1790 || !INTEGRAL_TYPE_P (TREE_TYPE (lhs
)))
1795 /* For strnlen, adjust MIN and MAX as necessary. If the bound
1796 is less than the size of the array set MAX to it. It it's
1797 greater than MAX and MAX is non-zero bump MAX down to account
1798 for the necessary terminating nul. Otherwise leave it alone. */
1799 if (TREE_CODE (bound
) == INTEGER_CST
)
1801 wide_int wibnd
= wi::to_wide (bound
);
1802 int cmp
= wi::cmpu (wibnd
, max
);
1805 else if (cmp
&& wi::ne_p (max
, min
))
1808 else if (TREE_CODE (bound
) == SSA_NAME
)
1810 wide_int minbound
, maxbound
;
1811 // FIXME: Use range_query instead of global ranges.
1812 value_range_kind rng
= get_range_info (bound
, &minbound
, &maxbound
);
1813 if (rng
== VR_RANGE
)
1815 /* For a bound in a known range, adjust the range determined
1816 above as necessary. For a bound in some anti-range or
1817 in an unknown range, use the range determined by callers. */
1818 if (wi::ltu_p (minbound
, min
))
1820 if (wi::ltu_p (maxbound
, max
))
1827 return wide_int_to_tree (size_type_node
, min
);
1829 set_range_info (lhs
, VR_RANGE
, min
, max
);
1833 /* For an LHS that is an SSA_NAME and for strlen() or strnlen() argument
1834 SRC, set LHS range info to [0, min (N, BOUND)] if SRC refers to
1835 a character array A[N] with unknown length bounded by N, and for
1836 strnlen(), by min (N, BOUND). */
1839 maybe_set_strlen_range (tree lhs
, tree src
, tree bound
)
1841 if (TREE_CODE (lhs
) != SSA_NAME
1842 || !INTEGRAL_TYPE_P (TREE_TYPE (lhs
)))
1845 if (TREE_CODE (src
) == SSA_NAME
)
1847 gimple
*def
= SSA_NAME_DEF_STMT (src
);
1848 if (is_gimple_assign (def
)
1849 && gimple_assign_rhs_code (def
) == ADDR_EXPR
)
1850 src
= gimple_assign_rhs1 (def
);
1853 /* The longest string is PTRDIFF_MAX - 1 bytes including the final
1854 NUL so that the difference between a pointer to just past it and
1855 one to its beginning is positive. */
1856 wide_int max
= wi::to_wide (TYPE_MAX_VALUE (ptrdiff_type_node
)) - 2;
1858 if (TREE_CODE (src
) == ADDR_EXPR
)
1860 /* The last array member of a struct can be bigger than its size
1861 suggests if it's treated as a poor-man's flexible array member. */
1862 src
= TREE_OPERAND (src
, 0);
1863 if (TREE_CODE (src
) != MEM_REF
1864 && !array_at_struct_end_p (src
))
1866 tree type
= TREE_TYPE (src
);
1867 tree size
= TYPE_SIZE_UNIT (type
);
1869 && TREE_CODE (size
) == INTEGER_CST
1870 && !integer_zerop (size
))
1872 /* Even though such uses of strlen would be undefined,
1873 avoid relying on arrays of arrays in case some genius
1874 decides to call strlen on an unterminated array element
1875 that's followed by a terminated one. Likewise, avoid
1876 assuming that a struct array member is necessarily
1877 nul-terminated (the nul may be in the member that
1878 follows). In those cases, assume that the length
1879 of the string stored in such an array is bounded
1880 by the size of the enclosing object if one can be
1882 tree base
= get_base_address (src
);
1885 if (tree size
= DECL_SIZE_UNIT (base
))
1887 && TREE_CODE (size
) == INTEGER_CST
1888 && TREE_CODE (TREE_TYPE (base
)) != POINTER_TYPE
)
1889 max
= wi::to_wide (size
);
1893 /* For strlen() the upper bound above is equal to
1894 the longest string that can be stored in the array
1895 (i.e., it accounts for the terminating nul. For
1896 strnlen() bump up the maximum by one since the array
1897 need not be nul-terminated. */
1898 if (!bound
&& max
!= 0)
1903 wide_int min
= wi::zero (max
.get_precision ());
1904 return set_strlen_range (lhs
, min
, max
, bound
);
1907 /* Diagnose buffer overflow by a STMT writing LEN + PLUS_ONE bytes,
1908 either into a region allocated for the object SI when non-null,
1909 or into an object designated by the LHS of STMT otherwise.
1910 When nonnull uses RVALS to determine range information.
1911 RAWMEM may be set by memcpy and other raw memory functions
1912 to allow accesses across subobject boundaries. */
1915 maybe_warn_overflow (gimple
*stmt
, tree len
,
1916 range_query
*rvals
= NULL
,
1917 strinfo
*si
= NULL
, bool plus_one
= false,
1918 bool rawmem
= false)
1920 if (!len
|| gimple_no_warning_p (stmt
))
1923 /* The DECL of the function performing the write if it is done
1925 tree writefn
= NULL_TREE
;
1926 /* The destination expression involved in the store STMT. */
1927 tree dest
= NULL_TREE
;
1929 if (is_gimple_assign (stmt
))
1930 dest
= gimple_assign_lhs (stmt
);
1931 else if (is_gimple_call (stmt
))
1933 dest
= gimple_call_arg (stmt
, 0);
1934 writefn
= gimple_call_fndecl (stmt
);
1937 if (TREE_NO_WARNING (dest
))
1940 /* Use maximum precision to avoid overflow in the addition below.
1941 Make sure all operands have the same precision to keep wide_int
1944 /* Convenience constants. */
1945 const widest_int diff_min
1946 = wi::to_widest (TYPE_MIN_VALUE (ptrdiff_type_node
));
1947 const widest_int diff_max
1948 = wi::to_widest (TYPE_MAX_VALUE (ptrdiff_type_node
));
1949 const widest_int size_max
1950 = wi::to_widest (TYPE_MAX_VALUE (size_type_node
));
1952 /* The offset into the destination object computed below and not
1953 reflected in DESTSIZE. */
1954 widest_int offrng
[2] = { 0, 0 };
1958 /* If no destination STRINFO was provided try to get it from
1959 the DEST argument. */
1961 if (TREE_CODE (ref
) == ARRAY_REF
)
1963 /* Handle stores to VLAs (represented as
1964 ARRAY_REF (MEM_REF (vlaptr, 0), N]. */
1965 tree off
= TREE_OPERAND (ref
, 1);
1966 ref
= TREE_OPERAND (ref
, 0);
1968 if (get_range (off
, stmt
, rng
, rvals
))
1970 /* Convert offsets to the maximum precision. */
1971 offrng
[0] = widest_int::from (rng
[0], SIGNED
);
1972 offrng
[1] = widest_int::from (rng
[1], SIGNED
);
1976 offrng
[0] = diff_min
;
1977 offrng
[1] = diff_max
;
1981 if (TREE_CODE (ref
) == MEM_REF
)
1983 tree mem_off
= TREE_OPERAND (ref
, 1);
1984 ref
= TREE_OPERAND (ref
, 0);
1986 if (get_range (mem_off
, stmt
, rng
, rvals
))
1988 offrng
[0] += widest_int::from (rng
[0], SIGNED
);
1989 offrng
[1] += widest_int::from (rng
[1], SIGNED
);
1993 offrng
[0] = diff_min
;
1994 offrng
[1] = diff_max
;
1999 if (int idx
= get_stridx (ref
, rng
, rvals
))
2001 si
= get_strinfo (idx
);
2002 offrng
[0] += widest_int::from (rng
[0], SIGNED
);
2003 offrng
[1] += widest_int::from (rng
[1], SIGNED
);
2007 /* The allocation call if the destination object was allocated
2009 gimple
*alloc_call
= NULL
;
2010 /* The DECL of the destination object if known and not dynamically
2012 tree destdecl
= NULL_TREE
;
2013 /* The offset into the destination object set by compute_objsize
2014 but already reflected in DESTSIZE. */
2015 tree destoff
= NULL_TREE
;
2016 /* The size of the destination region (which is smaller than
2017 the destination object for stores at a non-zero offset). */
2018 tree destsize
= NULL_TREE
;
2020 /* Compute the range of sizes of the destination object. The range
2021 is constant for declared objects but may be a range for allocated
2023 widest_int sizrng
[2] = { 0, 0 };
2027 destsize
= gimple_call_alloc_size (si
->alloc
, rng
, rvals
);
2030 sizrng
[0] = widest_int::from (rng
[0], UNSIGNED
);
2031 sizrng
[1] = widest_int::from (rng
[1], UNSIGNED
);
2033 alloc_call
= si
->alloc
;
2036 offrng
[0] = offrng
[1] = 0;
2040 /* If there is no STRINFO for DEST, fall back on compute_objsize. */
2041 tree off
= NULL_TREE
;
2042 destsize
= compute_objsize (dest
, rawmem
? 0 : 1, &destdecl
, &off
, rvals
);
2045 /* Remember OFF but clear OFFRNG that may have been set above. */
2047 offrng
[0] = offrng
[1] = 0;
2049 if (destdecl
&& TREE_CODE (destdecl
) == SSA_NAME
)
2051 gimple
*stmt
= SSA_NAME_DEF_STMT (destdecl
);
2052 if (is_gimple_call (stmt
))
2054 destdecl
= NULL_TREE
;
2058 if (get_range (destsize
, stmt
, rng
, rvals
))
2060 sizrng
[0] = widest_int::from (rng
[0], UNSIGNED
);
2061 sizrng
[1] = widest_int::from (rng
[1], UNSIGNED
);
2065 /* On failure, rather than failing, set the maximum range
2066 so that overflow in allocated objects whose size depends
2067 on the strlen of the source can still be diagnosed
2070 sizrng
[1] = size_max
;
2078 sizrng
[1] = size_max
;
2081 /* Return early if the DESTSIZE size expression is the same as LEN
2082 and the offset into the destination is zero. This might happen
2083 in the case of a pair of malloc and memset calls to allocate
2084 an object and clear it as if by calloc. */
2085 if (destsize
== len
&& !plus_one
&& offrng
[0] == 0 && offrng
[0] == offrng
[1])
2089 if (!get_range (len
, stmt
, rng
, rvals
))
2092 widest_int lenrng
[2] =
2093 { widest_int::from (rng
[0], SIGNED
), widest_int::from (rng
[1], SIGNED
) };
2101 /* The size of the remaining space in the destination computed
2102 as the size of the latter minus the offset into it. */
2103 widest_int spcrng
[2] = { sizrng
[0], sizrng
[1] };
2104 if (wi::neg_p (offrng
[0]) && wi::neg_p (offrng
[1]))
2106 /* When the offset is negative and the size of the destination
2107 object unknown there is little to do.
2108 FIXME: Detect offsets that are necessarily invalid regardless
2109 of the size of the object. */
2113 /* The remaining space is necessarily zero. */
2114 spcrng
[0] = spcrng
[1] = 0;
2116 else if (wi::neg_p (offrng
[0]))
2118 /* When the lower bound of the offset is negative but the upper
2119 bound is not, reduce the upper bound of the remaining space
2120 by the upper bound of the offset but leave the lower bound
2121 unchanged. If that makes the upper bound of the space less
2122 than the lower bound swap the two. */
2123 spcrng
[1] -= wi::ltu_p (offrng
[1], spcrng
[1]) ? offrng
[1] : spcrng
[1];
2124 if (wi::ltu_p (spcrng
[1], spcrng
[0]))
2125 std::swap (spcrng
[1], spcrng
[0]);
2129 /* When the offset is positive reduce the remaining space by
2130 the lower bound of the offset or clear it if the offset is
2132 spcrng
[0] -= wi::ltu_p (offrng
[0], spcrng
[0]) ? offrng
[0] : spcrng
[0];
2133 spcrng
[1] -= wi::ltu_p (offrng
[0], spcrng
[1]) ? offrng
[0] : spcrng
[1];
2136 if (wi::leu_p (lenrng
[0], spcrng
[0])
2137 && wi::leu_p (lenrng
[1], spcrng
[1]))
2140 if (lenrng
[0] == spcrng
[1]
2142 || !si
|| !is_strlen_related_p (si
->ptr
, len
)))
2145 location_t loc
= gimple_or_expr_nonartificial_location (stmt
, dest
);
2146 bool warned
= false;
2147 if (wi::leu_p (lenrng
[0], spcrng
[1]))
2150 && (!si
|| !is_strlen_related_p (si
->ptr
, len
)))
2154 ? warning_at (loc
, OPT_Wstringop_overflow_
,
2155 "%G%qD writing one too many bytes into a region "
2156 "of a size that depends on %<strlen%>",
2158 : warning_at (loc
, OPT_Wstringop_overflow_
,
2159 "%Gwriting one too many bytes into a region "
2160 "of a size that depends on %<strlen%>",
2163 else if (lenrng
[0] == lenrng
[1])
2165 if (spcrng
[0] == spcrng
[1])
2167 ? warning_n (loc
, OPT_Wstringop_overflow_
,
2168 lenrng
[0].to_uhwi (),
2169 "%G%qD writing %wu byte into a region "
2171 "%G%qD writing %wu bytes into a region "
2173 stmt
, writefn
, lenrng
[0].to_uhwi (),
2174 spcrng
[0].to_uhwi ())
2175 : warning_n (loc
, OPT_Wstringop_overflow_
,
2176 lenrng
[0].to_uhwi (),
2177 "%Gwriting %wu byte into a region "
2179 "%Gwriting %wu bytes into a region "
2181 stmt
, lenrng
[0].to_uhwi (),
2182 spcrng
[0].to_uhwi ()));
2185 ? warning_n (loc
, OPT_Wstringop_overflow_
,
2186 lenrng
[0].to_uhwi (),
2187 "%G%qD writing %wu byte into a region "
2188 "of size between %wu and %wu",
2189 "%G%qD writing %wu bytes into a region "
2190 "of size between %wu and %wu",
2191 stmt
, writefn
, lenrng
[0].to_uhwi (),
2192 spcrng
[0].to_uhwi (), spcrng
[1].to_uhwi ())
2193 : warning_n (loc
, OPT_Wstringop_overflow_
,
2194 lenrng
[0].to_uhwi (),
2195 "%Gwriting %wu byte into a region "
2196 "of size between %wu and %wu",
2197 "%Gwriting %wu bytes into a region "
2198 "of size between %wu and %wu",
2199 stmt
, lenrng
[0].to_uhwi (),
2200 spcrng
[0].to_uhwi (), spcrng
[1].to_uhwi ()));
2202 else if (spcrng
[0] == spcrng
[1])
2204 ? warning_at (loc
, OPT_Wstringop_overflow_
,
2205 "%G%qD writing between %wu and %wu bytes "
2206 "into a region of size %wu",
2207 stmt
, writefn
, lenrng
[0].to_uhwi (),
2208 lenrng
[1].to_uhwi (),
2209 spcrng
[0].to_uhwi ())
2210 : warning_at (loc
, OPT_Wstringop_overflow_
,
2211 "%Gwriting between %wu and %wu bytes "
2212 "into a region of size %wu",
2213 stmt
, lenrng
[0].to_uhwi (),
2214 lenrng
[1].to_uhwi (),
2215 spcrng
[0].to_uhwi ()));
2218 ? warning_at (loc
, OPT_Wstringop_overflow_
,
2219 "%G%qD writing between %wu and %wu bytes "
2220 "into a region of size between %wu and %wu",
2221 stmt
, writefn
, lenrng
[0].to_uhwi (),
2222 lenrng
[1].to_uhwi (),
2223 spcrng
[0].to_uhwi (), spcrng
[1].to_uhwi ())
2224 : warning_at (loc
, OPT_Wstringop_overflow_
,
2225 "%Gwriting between %wu and %wu bytes "
2226 "into a region of size between %wu and %wu",
2227 stmt
, lenrng
[0].to_uhwi (),
2228 lenrng
[1].to_uhwi (),
2229 spcrng
[0].to_uhwi (), spcrng
[1].to_uhwi ()));
2234 gimple_set_no_warning (stmt
, true);
2236 /* If DESTOFF is not null, use it to format the offset value/range. */
2240 if (get_range (destoff
, stmt
, rng
))
2242 offrng
[0] = widest_int::from (rng
[0], SIGNED
);
2243 offrng
[1] = widest_int::from (rng
[1], SIGNED
);
2246 offrng
[0] = offrng
[1] = 0;
2249 /* Format the offset to keep the number of inform calls from growing
2252 if (offrng
[0] == offrng
[1])
2253 sprintf (offstr
, "%lli", (long long) offrng
[0].to_shwi ());
2255 sprintf (offstr
, "[%lli, %lli]",
2256 (long long) offrng
[0].to_shwi (), (long long) offrng
[1].to_shwi ());
2258 if (destdecl
&& DECL_P (destdecl
))
2260 if (tree size
= DECL_SIZE_UNIT (destdecl
))
2261 inform (DECL_SOURCE_LOCATION (destdecl
),
2262 "at offset %s to object %qD with size %E declared here",
2263 offstr
, destdecl
, size
);
2265 inform (DECL_SOURCE_LOCATION (destdecl
),
2266 "at offset %s to object %qD declared here",
2274 tree allocfn
= gimple_call_fndecl (alloc_call
);
2277 /* For an ALLOC_CALL via a function pointer make a small effort
2278 to determine the destination of the pointer. */
2279 allocfn
= gimple_call_fn (alloc_call
);
2280 if (TREE_CODE (allocfn
) == SSA_NAME
)
2282 gimple
*def
= SSA_NAME_DEF_STMT (allocfn
);
2283 if (gimple_assign_single_p (def
))
2285 tree rhs
= gimple_assign_rhs1 (def
);
2288 else if (TREE_CODE (rhs
) == COMPONENT_REF
)
2289 allocfn
= TREE_OPERAND (rhs
, 1);
2294 if (gimple_call_builtin_p (alloc_call
, BUILT_IN_ALLOCA_WITH_ALIGN
))
2296 if (sizrng
[0] == sizrng
[1])
2297 inform (gimple_location (alloc_call
),
2298 "at offset %s to an object with size %wu declared here",
2299 offstr
, sizrng
[0].to_uhwi ());
2300 else if (sizrng
[0] == 0)
2302 /* Avoid printing impossible sizes. */
2303 if (wi::ltu_p (sizrng
[1], diff_max
- 2))
2304 inform (gimple_location (alloc_call
),
2305 "at offset %s to an object with size at most %wu "
2307 offstr
, sizrng
[1].to_uhwi ());
2309 inform (gimple_location (alloc_call
),
2310 "at offset %s to an object declared here", offstr
);
2313 inform (gimple_location (alloc_call
),
2314 "at offset %s to an object with size between %wu and %wu "
2316 offstr
, sizrng
[0].to_uhwi (), sizrng
[1].to_uhwi ());
2320 if (sizrng
[0] == sizrng
[1])
2321 inform (gimple_location (alloc_call
),
2322 "at offset %s to an object with size %wu allocated by %qE here",
2323 offstr
, sizrng
[0].to_uhwi (), allocfn
);
2324 else if (sizrng
[0] == 0)
2326 /* Avoid printing impossible sizes. */
2327 if (wi::ltu_p (sizrng
[1], diff_max
- 2))
2328 inform (gimple_location (alloc_call
),
2329 "at offset %s to an object with size at most %wu allocated "
2331 offstr
, sizrng
[1].to_uhwi (), allocfn
);
2333 inform (gimple_location (alloc_call
),
2334 "at offset %s to an object allocated by %qE here",
2338 inform (gimple_location (alloc_call
),
2339 "at offset %s to an object with size between %wu and %wu "
2340 "allocated by %qE here",
2341 offstr
, sizrng
[0].to_uhwi (), sizrng
[1].to_uhwi (), allocfn
);
2344 /* Convenience wrapper for the above. */
2347 maybe_warn_overflow (gimple
*stmt
, unsigned HOST_WIDE_INT len
,
2348 range_query
*rvals
= NULL
, strinfo
*si
= NULL
,
2349 bool plus_one
= false, bool rawmem
= false)
2351 maybe_warn_overflow (stmt
, build_int_cst (size_type_node
, len
), rvals
,
2352 si
, plus_one
, rawmem
);
2355 /* Handle a strlen call. If strlen of the argument is known, replace
2356 the strlen call with the known value, otherwise remember that strlen
2357 of the argument is stored in the lhs SSA_NAME. */
2360 handle_builtin_strlen (gimple_stmt_iterator
*gsi
)
2362 gimple
*stmt
= gsi_stmt (*gsi
);
2363 tree lhs
= gimple_call_lhs (stmt
);
2365 if (lhs
== NULL_TREE
)
2368 location_t loc
= gimple_location (stmt
);
2369 tree callee
= gimple_call_fndecl (stmt
);
2370 tree src
= gimple_call_arg (stmt
, 0);
2371 tree bound
= (DECL_FUNCTION_CODE (callee
) == BUILT_IN_STRNLEN
2372 ? gimple_call_arg (stmt
, 1) : NULL_TREE
);
2373 int idx
= get_stridx (src
);
2374 if (idx
|| (bound
&& integer_zerop (bound
)))
2380 rhs
= build_int_cst (TREE_TYPE (lhs
), ~idx
);
2386 si
= get_strinfo (idx
);
2389 rhs
= get_string_length (si
);
2390 /* For strnlen, if bound is constant, even if si is not known
2391 to be zero terminated, if we know at least bound bytes are
2392 not zero, the return value will be bound. */
2393 if (rhs
== NULL_TREE
2394 && bound
!= NULL_TREE
2395 && TREE_CODE (bound
) == INTEGER_CST
2396 && si
->nonzero_chars
!= NULL_TREE
2397 && TREE_CODE (si
->nonzero_chars
) == INTEGER_CST
2398 && tree_int_cst_le (bound
, si
->nonzero_chars
))
2402 if (rhs
!= NULL_TREE
)
2404 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
2406 fprintf (dump_file
, "Optimizing: ");
2407 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2409 rhs
= unshare_expr (rhs
);
2410 if (!useless_type_conversion_p (TREE_TYPE (lhs
), TREE_TYPE (rhs
)))
2411 rhs
= fold_convert_loc (loc
, TREE_TYPE (lhs
), rhs
);
2414 rhs
= fold_build2_loc (loc
, MIN_EXPR
, TREE_TYPE (rhs
), rhs
, bound
);
2416 if (!update_call_from_tree (gsi
, rhs
))
2417 gimplify_and_update_call_from_tree (gsi
, rhs
);
2418 stmt
= gsi_stmt (*gsi
);
2420 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
2422 fprintf (dump_file
, "into: ");
2423 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2427 /* Don't update anything for strnlen. */
2428 && bound
== NULL_TREE
2429 && TREE_CODE (si
->nonzero_chars
) != SSA_NAME
2430 && TREE_CODE (si
->nonzero_chars
) != INTEGER_CST
2431 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs
))
2433 si
= unshare_strinfo (si
);
2434 si
->nonzero_chars
= lhs
;
2435 gcc_assert (si
->full_string_p
);
2438 if (strlen_to_stridx
2439 && (bound
== NULL_TREE
2440 /* For strnlen record this only if the call is proven
2441 to return the same value as strlen would. */
2442 || (TREE_CODE (bound
) == INTEGER_CST
2443 && TREE_CODE (rhs
) == INTEGER_CST
2444 && tree_int_cst_lt (rhs
, bound
))))
2445 strlen_to_stridx
->put (lhs
, stridx_strlenloc (idx
, loc
));
2450 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs
))
2454 idx
= new_stridx (src
);
2457 strinfo
*si
= get_strinfo (idx
);
2460 if (!si
->full_string_p
&& !si
->stmt
)
2462 /* Until now we only had a lower bound on the string length.
2463 Install LHS as the actual length. */
2464 si
= unshare_strinfo (si
);
2465 tree old
= si
->nonzero_chars
;
2466 si
->nonzero_chars
= lhs
;
2467 si
->full_string_p
= true;
2468 if (old
&& TREE_CODE (old
) == INTEGER_CST
)
2470 old
= fold_convert_loc (loc
, TREE_TYPE (lhs
), old
);
2471 tree adj
= fold_build2_loc (loc
, MINUS_EXPR
,
2472 TREE_TYPE (lhs
), lhs
, old
);
2473 adjust_related_strinfos (loc
, si
, adj
);
2474 /* Use the constant minimum length as the lower bound
2475 of the non-constant length. */
2476 wide_int min
= wi::to_wide (old
);
2478 = wi::to_wide (TYPE_MAX_VALUE (ptrdiff_type_node
)) - 2;
2479 set_strlen_range (lhs
, min
, max
);
2495 /* Only store the new length information for calls to strlen(),
2496 not for those to strnlen(). */
2497 strinfo
*si
= new_strinfo (src
, idx
, lhs
, true);
2498 set_strinfo (idx
, si
);
2499 find_equal_ptrs (src
, idx
);
2502 /* For SRC that is an array of N elements, set LHS's range
2503 to [0, min (N, BOUND)]. A constant return value means
2504 the range would have consisted of a single value. In
2505 that case, fold the result into the returned constant. */
2506 if (tree ret
= maybe_set_strlen_range (lhs
, src
, bound
))
2507 if (TREE_CODE (ret
) == INTEGER_CST
)
2509 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
2511 fprintf (dump_file
, "Optimizing: ");
2512 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2514 if (!useless_type_conversion_p (TREE_TYPE (lhs
), TREE_TYPE (ret
)))
2515 ret
= fold_convert_loc (loc
, TREE_TYPE (lhs
), ret
);
2516 if (!update_call_from_tree (gsi
, ret
))
2517 gimplify_and_update_call_from_tree (gsi
, ret
);
2518 stmt
= gsi_stmt (*gsi
);
2520 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
2522 fprintf (dump_file
, "into: ");
2523 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2527 if (strlen_to_stridx
&& !bound
)
2528 strlen_to_stridx
->put (lhs
, stridx_strlenloc (idx
, loc
));
2532 /* Handle a strchr call. If strlen of the first argument is known, replace
2533 the strchr (x, 0) call with the endptr or x + strlen, otherwise remember
2534 that lhs of the call is endptr and strlen of the argument is endptr - x. */
2537 handle_builtin_strchr (gimple_stmt_iterator
*gsi
)
2539 gimple
*stmt
= gsi_stmt (*gsi
);
2540 tree lhs
= gimple_call_lhs (stmt
);
2542 if (lhs
== NULL_TREE
)
2545 if (!integer_zerop (gimple_call_arg (stmt
, 1)))
2548 tree src
= gimple_call_arg (stmt
, 0);
2550 /* Avoid folding if the first argument is not a nul-terminated array.
2551 Defer warning until later. */
2552 if (!check_nul_terminated_array (NULL_TREE
, src
))
2555 int idx
= get_stridx (src
);
2562 rhs
= build_int_cst (size_type_node
, ~idx
);
2566 si
= get_strinfo (idx
);
2568 rhs
= get_string_length (si
);
2570 if (rhs
!= NULL_TREE
)
2572 location_t loc
= gimple_location (stmt
);
2574 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
2576 fprintf (dump_file
, "Optimizing: ");
2577 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2579 if (si
!= NULL
&& si
->endptr
!= NULL_TREE
)
2581 rhs
= unshare_expr (si
->endptr
);
2582 if (!useless_type_conversion_p (TREE_TYPE (lhs
),
2584 rhs
= fold_convert_loc (loc
, TREE_TYPE (lhs
), rhs
);
2588 rhs
= fold_convert_loc (loc
, sizetype
, unshare_expr (rhs
));
2589 rhs
= fold_build2_loc (loc
, POINTER_PLUS_EXPR
,
2590 TREE_TYPE (src
), src
, rhs
);
2591 if (!useless_type_conversion_p (TREE_TYPE (lhs
),
2593 rhs
= fold_convert_loc (loc
, TREE_TYPE (lhs
), rhs
);
2595 if (!update_call_from_tree (gsi
, rhs
))
2596 gimplify_and_update_call_from_tree (gsi
, rhs
);
2597 stmt
= gsi_stmt (*gsi
);
2599 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
2601 fprintf (dump_file
, "into: ");
2602 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2605 && si
->endptr
== NULL_TREE
2606 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs
))
2608 si
= unshare_strinfo (si
);
2611 zero_length_string (lhs
, si
);
2615 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs
))
2617 if (TREE_CODE (src
) != SSA_NAME
|| !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (src
))
2620 idx
= new_stridx (src
);
2621 else if (get_strinfo (idx
) != NULL
)
2623 zero_length_string (lhs
, NULL
);
2628 location_t loc
= gimple_location (stmt
);
2629 tree lhsu
= fold_convert_loc (loc
, size_type_node
, lhs
);
2630 tree srcu
= fold_convert_loc (loc
, size_type_node
, src
);
2631 tree length
= fold_build2_loc (loc
, MINUS_EXPR
,
2632 size_type_node
, lhsu
, srcu
);
2633 strinfo
*si
= new_strinfo (src
, idx
, length
, true);
2635 set_strinfo (idx
, si
);
2636 find_equal_ptrs (src
, idx
);
2637 zero_length_string (lhs
, si
);
2641 zero_length_string (lhs
, NULL
);
2644 /* Handle a strcpy-like ({st{r,p}cpy,__st{r,p}cpy_chk}) call.
2645 If strlen of the second argument is known, strlen of the first argument
2646 is the same after this call. Furthermore, attempt to convert it to
2647 memcpy. Uses RVALS to determine range information. */
2650 handle_builtin_strcpy (enum built_in_function bcode
, gimple_stmt_iterator
*gsi
,
2654 tree src
, dst
, srclen
, len
, lhs
, type
, fn
, oldlen
;
2656 gimple
*stmt
= gsi_stmt (*gsi
);
2657 strinfo
*si
, *dsi
, *olddsi
, *zsi
;
2660 src
= gimple_call_arg (stmt
, 1);
2661 dst
= gimple_call_arg (stmt
, 0);
2662 lhs
= gimple_call_lhs (stmt
);
2663 idx
= get_stridx (src
);
2666 si
= get_strinfo (idx
);
2668 didx
= get_stridx (dst
);
2672 olddsi
= get_strinfo (didx
);
2677 adjust_last_stmt (olddsi
, stmt
, false);
2681 srclen
= get_string_length (si
);
2683 srclen
= build_int_cst (size_type_node
, ~idx
);
2685 maybe_warn_overflow (stmt
, srclen
, rvals
, olddsi
, true);
2688 adjust_last_stmt (olddsi
, stmt
, false);
2690 loc
= gimple_location (stmt
);
2691 if (srclen
== NULL_TREE
)
2694 case BUILT_IN_STRCPY
:
2695 case BUILT_IN_STRCPY_CHK
:
2696 if (lhs
!= NULL_TREE
|| !builtin_decl_implicit_p (BUILT_IN_STPCPY
))
2699 case BUILT_IN_STPCPY
:
2700 case BUILT_IN_STPCPY_CHK
:
2701 if (lhs
== NULL_TREE
)
2705 tree lhsuint
= fold_convert_loc (loc
, size_type_node
, lhs
);
2706 srclen
= fold_convert_loc (loc
, size_type_node
, dst
);
2707 srclen
= fold_build2_loc (loc
, MINUS_EXPR
, size_type_node
,
2717 didx
= new_stridx (dst
);
2723 oldlen
= olddsi
->nonzero_chars
;
2724 dsi
= unshare_strinfo (olddsi
);
2725 dsi
->nonzero_chars
= srclen
;
2726 dsi
->full_string_p
= (srclen
!= NULL_TREE
);
2727 /* Break the chain, so adjust_related_strinfo on later pointers in
2728 the chain won't adjust this one anymore. */
2731 dsi
->endptr
= NULL_TREE
;
2735 dsi
= new_strinfo (dst
, didx
, srclen
, srclen
!= NULL_TREE
);
2736 set_strinfo (didx
, dsi
);
2737 find_equal_ptrs (dst
, didx
);
2739 dsi
->writable
= true;
2740 dsi
->dont_invalidate
= true;
2742 if (dsi
->nonzero_chars
== NULL_TREE
)
2746 /* If string length of src is unknown, use delayed length
2747 computation. If string length of dst will be needed, it
2748 can be computed by transforming this strcpy call into
2749 stpcpy and subtracting dst from the return value. */
2751 /* Look for earlier strings whose length could be determined if
2752 this strcpy is turned into an stpcpy. */
2754 if (dsi
->prev
!= 0 && (chainsi
= verify_related_strinfos (dsi
)) != NULL
)
2756 for (; chainsi
&& chainsi
!= dsi
; chainsi
= get_strinfo (chainsi
->next
))
2758 /* When setting a stmt for delayed length computation
2759 prevent all strinfos through dsi from being
2761 chainsi
= unshare_strinfo (chainsi
);
2762 chainsi
->stmt
= stmt
;
2763 chainsi
->nonzero_chars
= NULL_TREE
;
2764 chainsi
->full_string_p
= false;
2765 chainsi
->endptr
= NULL_TREE
;
2766 chainsi
->dont_invalidate
= true;
2771 /* Try to detect overlap before returning. This catches cases
2772 like strcpy (d, d + n) where n is non-constant whose range
2773 is such that (n <= strlen (d) holds).
2775 OLDDSI->NONZERO_chars may have been reset by this point with
2776 oldlen holding it original value. */
2777 if (olddsi
&& oldlen
)
2779 /* Add 1 for the terminating NUL. */
2780 tree type
= TREE_TYPE (oldlen
);
2781 oldlen
= fold_build2 (PLUS_EXPR
, type
, oldlen
,
2782 build_int_cst (type
, 1));
2783 check_bounds_or_overlap (stmt
, olddsi
->ptr
, src
, oldlen
, NULL_TREE
);
2791 tree adj
= NULL_TREE
;
2792 if (oldlen
== NULL_TREE
)
2794 else if (integer_zerop (oldlen
))
2796 else if (TREE_CODE (oldlen
) == INTEGER_CST
2797 || TREE_CODE (srclen
) == INTEGER_CST
)
2798 adj
= fold_build2_loc (loc
, MINUS_EXPR
,
2799 TREE_TYPE (srclen
), srclen
,
2800 fold_convert_loc (loc
, TREE_TYPE (srclen
),
2802 if (adj
!= NULL_TREE
)
2803 adjust_related_strinfos (loc
, dsi
, adj
);
2807 /* strcpy src may not overlap dst, so src doesn't need to be
2808 invalidated either. */
2810 si
->dont_invalidate
= true;
2816 case BUILT_IN_STRCPY
:
2817 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
2819 ssa_ver_to_stridx
[SSA_NAME_VERSION (lhs
)] = didx
;
2821 case BUILT_IN_STRCPY_CHK
:
2822 fn
= builtin_decl_explicit (BUILT_IN_MEMCPY_CHK
);
2824 ssa_ver_to_stridx
[SSA_NAME_VERSION (lhs
)] = didx
;
2826 case BUILT_IN_STPCPY
:
2827 /* This would need adjustment of the lhs (subtract one),
2828 or detection that the trailing '\0' doesn't need to be
2829 written, if it will be immediately overwritten.
2830 fn = builtin_decl_explicit (BUILT_IN_MEMPCPY); */
2834 zsi
= zero_length_string (lhs
, dsi
);
2837 case BUILT_IN_STPCPY_CHK
:
2838 /* This would need adjustment of the lhs (subtract one),
2839 or detection that the trailing '\0' doesn't need to be
2840 written, if it will be immediately overwritten.
2841 fn = builtin_decl_explicit (BUILT_IN_MEMPCPY_CHK); */
2845 zsi
= zero_length_string (lhs
, dsi
);
2852 zsi
->dont_invalidate
= true;
2856 tree args
= TYPE_ARG_TYPES (TREE_TYPE (fn
));
2857 type
= TREE_VALUE (TREE_CHAIN (TREE_CHAIN (args
)));
2860 type
= size_type_node
;
2862 len
= fold_convert_loc (loc
, type
, unshare_expr (srclen
));
2863 len
= fold_build2_loc (loc
, PLUS_EXPR
, type
, len
, build_int_cst (type
, 1));
2865 /* Set the no-warning bit on the transformed statement? */
2866 bool set_no_warning
= false;
2868 if (const strinfo
*chksi
= olddsi
? olddsi
: dsi
)
2870 && check_bounds_or_overlap (stmt
, chksi
->ptr
, si
->ptr
, NULL_TREE
, len
))
2872 gimple_set_no_warning (stmt
, true);
2873 set_no_warning
= true;
2876 if (fn
== NULL_TREE
)
2879 len
= force_gimple_operand_gsi (gsi
, len
, true, NULL_TREE
, true,
2881 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
2883 fprintf (dump_file
, "Optimizing: ");
2884 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2886 if (gimple_call_num_args (stmt
) == 2)
2887 success
= update_gimple_call (gsi
, fn
, 3, dst
, src
, len
);
2889 success
= update_gimple_call (gsi
, fn
, 4, dst
, src
, len
,
2890 gimple_call_arg (stmt
, 2));
2893 stmt
= gsi_stmt (*gsi
);
2895 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
2897 fprintf (dump_file
, "into: ");
2898 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2900 /* Allow adjust_last_stmt to decrease this memcpy's size. */
2901 laststmt
.stmt
= stmt
;
2902 laststmt
.len
= srclen
;
2903 laststmt
.stridx
= dsi
->idx
;
2905 else if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
2906 fprintf (dump_file
, "not possible.\n");
2909 gimple_set_no_warning (stmt
, true);
2912 /* Check the size argument to the built-in forms of stpncpy and strncpy
2913 for out-of-bounds offsets or overlapping access, and to see if the
2914 size argument is derived from a call to strlen() on the source argument,
2915 and if so, issue an appropriate warning. */
2918 handle_builtin_strncat (built_in_function
, gimple_stmt_iterator
*gsi
)
2920 /* Same as stxncpy(). */
2921 handle_builtin_stxncpy_strncat (true, gsi
);
2924 /* Return true if LEN depends on a call to strlen(SRC) in an interesting
2925 way. LEN can either be an integer expression, or a pointer (to char).
2926 When it is the latter (such as in recursive calls to self) it is
2927 assumed to be the argument in some call to strlen() whose relationship
2928 to SRC is being ascertained. */
2931 is_strlen_related_p (tree src
, tree len
)
2933 if (TREE_CODE (TREE_TYPE (len
)) == POINTER_TYPE
2934 && operand_equal_p (src
, len
, 0))
2937 if (TREE_CODE (len
) != SSA_NAME
)
2940 if (TREE_CODE (src
) == SSA_NAME
)
2942 gimple
*srcdef
= SSA_NAME_DEF_STMT (src
);
2943 if (is_gimple_assign (srcdef
))
2945 /* Handle bitwise AND used in conversions from wider size_t
2946 to narrower unsigned types. */
2947 tree_code code
= gimple_assign_rhs_code (srcdef
);
2948 if (code
== BIT_AND_EXPR
2949 || code
== NOP_EXPR
)
2950 return is_strlen_related_p (gimple_assign_rhs1 (srcdef
), len
);
2955 if (gimple_call_builtin_p (srcdef
, BUILT_IN_NORMAL
))
2957 /* If SRC is the result of a call to an allocation function
2958 or strlen, use the function's argument instead. */
2959 tree func
= gimple_call_fndecl (srcdef
);
2960 built_in_function code
= DECL_FUNCTION_CODE (func
);
2961 if (code
== BUILT_IN_ALLOCA
2962 || code
== BUILT_IN_ALLOCA_WITH_ALIGN
2963 || code
== BUILT_IN_MALLOC
2964 || code
== BUILT_IN_STRLEN
)
2965 return is_strlen_related_p (gimple_call_arg (srcdef
, 0), len
);
2967 /* FIXME: Handle other functions with attribute alloc_size. */
2972 gimple
*lendef
= SSA_NAME_DEF_STMT (len
);
2976 if (is_gimple_call (lendef
))
2978 tree func
= gimple_call_fndecl (lendef
);
2979 if (!valid_builtin_call (lendef
)
2980 || DECL_FUNCTION_CODE (func
) != BUILT_IN_STRLEN
)
2983 tree arg
= gimple_call_arg (lendef
, 0);
2984 return is_strlen_related_p (src
, arg
);
2987 if (!is_gimple_assign (lendef
))
2990 tree_code code
= gimple_assign_rhs_code (lendef
);
2991 tree rhs1
= gimple_assign_rhs1 (lendef
);
2992 tree rhstype
= TREE_TYPE (rhs1
);
2994 if ((TREE_CODE (rhstype
) == POINTER_TYPE
&& code
== POINTER_PLUS_EXPR
)
2995 || (INTEGRAL_TYPE_P (rhstype
)
2996 && (code
== BIT_AND_EXPR
2997 || code
== NOP_EXPR
)))
2999 /* Pointer plus (an integer), and truncation are considered among
3000 the (potentially) related expressions to strlen. */
3001 return is_strlen_related_p (src
, rhs1
);
3004 if (tree rhs2
= gimple_assign_rhs2 (lendef
))
3006 /* Integer subtraction is considered strlen-related when both
3007 arguments are integers and second one is strlen-related. */
3008 rhstype
= TREE_TYPE (rhs2
);
3009 if (INTEGRAL_TYPE_P (rhstype
) && code
== MINUS_EXPR
)
3010 return is_strlen_related_p (src
, rhs2
);
3016 /* Called by handle_builtin_stxncpy_strncat and by
3017 gimple_fold_builtin_strncpy in gimple-fold.c.
3018 Check to see if the specified bound is a) equal to the size of
3019 the destination DST and if so, b) if it's immediately followed by
3020 DST[CNT - 1] = '\0'. If a) holds and b) does not, warn. Otherwise,
3021 do nothing. Return true if diagnostic has been issued.
3023 The purpose is to diagnose calls to strncpy and stpncpy that do
3024 not nul-terminate the copy while allowing for the idiom where
3025 such a call is immediately followed by setting the last element
3028 strncpy (a, s, sizeof a);
3029 a[sizeof a - 1] = '\0';
3033 maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi
, tree src
, tree cnt
)
3035 gimple
*stmt
= gsi_stmt (gsi
);
3036 if (gimple_no_warning_p (stmt
))
3039 wide_int cntrange
[2];
3041 if (TREE_CODE (cnt
) == INTEGER_CST
)
3042 cntrange
[0] = cntrange
[1] = wi::to_wide (cnt
);
3043 else if (TREE_CODE (cnt
) == SSA_NAME
)
3045 // FIXME: Use range_query instead of global ranges.
3046 enum value_range_kind rng
= get_range_info (cnt
, cntrange
, cntrange
+ 1);
3047 if (rng
== VR_RANGE
)
3049 else if (rng
== VR_ANTI_RANGE
)
3051 wide_int maxobjsize
= wi::to_wide (TYPE_MAX_VALUE (ptrdiff_type_node
));
3053 if (wi::ltu_p (cntrange
[1], maxobjsize
))
3055 cntrange
[0] = cntrange
[1] + 1;
3056 cntrange
[1] = maxobjsize
;
3060 cntrange
[1] = cntrange
[0] - 1;
3061 cntrange
[0] = wi::zero (TYPE_PRECISION (TREE_TYPE (cnt
)));
3070 /* Negative value is the constant string length. If it's less than
3071 the lower bound there is no truncation. Avoid calling get_stridx()
3072 when ssa_ver_to_stridx is empty. That implies the caller isn't
3073 running under the control of this pass and ssa_ver_to_stridx hasn't
3074 been created yet. */
3075 int sidx
= ssa_ver_to_stridx
.length () ? get_stridx (src
) : 0;
3076 if (sidx
< 0 && wi::gtu_p (cntrange
[0], ~sidx
))
3079 tree dst
= gimple_call_arg (stmt
, 0);
3081 if (TREE_CODE (dstdecl
) == ADDR_EXPR
)
3082 dstdecl
= TREE_OPERAND (dstdecl
, 0);
3084 tree ref
= NULL_TREE
;
3088 /* If the source is a non-string return early to avoid warning
3089 for possible truncation (if the truncation is certain SIDX
3091 tree srcdecl
= gimple_call_arg (stmt
, 1);
3092 if (TREE_CODE (srcdecl
) == ADDR_EXPR
)
3093 srcdecl
= TREE_OPERAND (srcdecl
, 0);
3094 if (get_attr_nonstring_decl (srcdecl
, &ref
))
3098 /* Likewise, if the destination refers to an array/pointer declared
3099 nonstring return early. */
3100 if (get_attr_nonstring_decl (dstdecl
, &ref
))
3103 /* Look for dst[i] = '\0'; after the stxncpy() call and if found
3104 avoid the truncation warning. */
3105 gsi_next_nondebug (&gsi
);
3106 gimple
*next_stmt
= gsi_stmt (gsi
);
3109 /* When there is no statement in the same basic block check
3110 the immediate successor block. */
3111 if (basic_block bb
= gimple_bb (stmt
))
3113 if (single_succ_p (bb
))
3115 /* For simplicity, ignore blocks with multiple outgoing
3116 edges for now and only consider successor blocks along
3118 edge e
= EDGE_SUCC (bb
, 0);
3119 if (!(e
->flags
& EDGE_ABNORMAL
))
3121 gsi
= gsi_start_bb (e
->dest
);
3122 next_stmt
= gsi_stmt (gsi
);
3123 if (next_stmt
&& is_gimple_debug (next_stmt
))
3125 gsi_next_nondebug (&gsi
);
3126 next_stmt
= gsi_stmt (gsi
);
3133 if (next_stmt
&& is_gimple_assign (next_stmt
))
3135 tree lhs
= gimple_assign_lhs (next_stmt
);
3136 tree_code code
= TREE_CODE (lhs
);
3137 if (code
== ARRAY_REF
|| code
== MEM_REF
)
3138 lhs
= TREE_OPERAND (lhs
, 0);
3140 tree func
= gimple_call_fndecl (stmt
);
3141 if (DECL_FUNCTION_CODE (func
) == BUILT_IN_STPNCPY
)
3143 tree ret
= gimple_call_lhs (stmt
);
3144 if (ret
&& operand_equal_p (ret
, lhs
, 0))
3148 /* Determine the base address and offset of the reference,
3149 ignoring the innermost array index. */
3150 if (TREE_CODE (ref
) == ARRAY_REF
)
3151 ref
= TREE_OPERAND (ref
, 0);
3154 tree dstbase
= get_addr_base_and_unit_offset (ref
, &dstoff
);
3157 tree lhsbase
= get_addr_base_and_unit_offset (lhs
, &lhsoff
);
3160 && known_eq (dstoff
, lhsoff
)
3161 && operand_equal_p (dstbase
, lhsbase
, 0))
3165 int prec
= TYPE_PRECISION (TREE_TYPE (cnt
));
3166 wide_int lenrange
[2];
3167 if (strinfo
*sisrc
= sidx
> 0 ? get_strinfo (sidx
) : NULL
)
3169 lenrange
[0] = (sisrc
->nonzero_chars
3170 && TREE_CODE (sisrc
->nonzero_chars
) == INTEGER_CST
3171 ? wi::to_wide (sisrc
->nonzero_chars
)
3173 lenrange
[1] = lenrange
[0];
3176 lenrange
[0] = lenrange
[1] = wi::shwi (~sidx
, prec
);
3179 c_strlen_data lendata
= { };
3180 /* Set MAXBOUND to an arbitrary non-null non-integer node as a request
3181 to have it set to the length of the longest string in a PHI. */
3182 lendata
.maxbound
= src
;
3183 get_range_strlen (src
, &lendata
, /* eltsize = */1);
3184 if (TREE_CODE (lendata
.minlen
) == INTEGER_CST
3185 && TREE_CODE (lendata
.maxbound
) == INTEGER_CST
)
3187 /* When LENDATA.MAXLEN is unknown, reset LENDATA.MINLEN
3188 which stores the length of the shortest known string. */
3189 if (integer_all_onesp (lendata
.maxlen
))
3190 lenrange
[0] = wi::shwi (0, prec
);
3192 lenrange
[0] = wi::to_wide (lendata
.minlen
, prec
);
3193 lenrange
[1] = wi::to_wide (lendata
.maxbound
, prec
);
3197 lenrange
[0] = wi::shwi (0, prec
);
3198 lenrange
[1] = wi::shwi (-1, prec
);
3202 location_t callloc
= gimple_or_expr_nonartificial_location (stmt
, dst
);
3203 tree func
= gimple_call_fndecl (stmt
);
3205 if (lenrange
[0] != 0 || !wi::neg_p (lenrange
[1]))
3207 /* If the longest source string is shorter than the lower bound
3208 of the specified count the copy is definitely nul-terminated. */
3209 if (wi::ltu_p (lenrange
[1], cntrange
[0]))
3212 if (wi::neg_p (lenrange
[1]))
3214 /* The length of one of the strings is unknown but at least
3215 one has non-zero length and that length is stored in
3216 LENRANGE[1]. Swap the bounds to force a "may be truncated"
3218 lenrange
[1] = lenrange
[0];
3219 lenrange
[0] = wi::shwi (0, prec
);
3222 /* Set to true for strncat whose bound is derived from the length
3223 of the destination (the expected usage pattern). */
3224 bool cat_dstlen_bounded
= false;
3225 if (DECL_FUNCTION_CODE (func
) == BUILT_IN_STRNCAT
)
3226 cat_dstlen_bounded
= is_strlen_related_p (dst
, cnt
);
3228 if (lenrange
[0] == cntrange
[1] && cntrange
[0] == cntrange
[1])
3229 return warning_n (callloc
, OPT_Wstringop_truncation
,
3230 cntrange
[0].to_uhwi (),
3231 "%G%qD output truncated before terminating "
3232 "nul copying %E byte from a string of the "
3234 "%G%qD output truncated before terminating nul "
3235 "copying %E bytes from a string of the same "
3238 else if (!cat_dstlen_bounded
)
3240 if (wi::geu_p (lenrange
[0], cntrange
[1]))
3242 /* The shortest string is longer than the upper bound of
3243 the count so the truncation is certain. */
3244 if (cntrange
[0] == cntrange
[1])
3245 return warning_n (callloc
, OPT_Wstringop_truncation
,
3246 cntrange
[0].to_uhwi (),
3247 "%G%qD output truncated copying %E byte "
3248 "from a string of length %wu",
3249 "%G%qD output truncated copying %E bytes "
3250 "from a string of length %wu",
3251 stmt
, func
, cnt
, lenrange
[0].to_uhwi ());
3253 return warning_at (callloc
, OPT_Wstringop_truncation
,
3254 "%G%qD output truncated copying between %wu "
3255 "and %wu bytes from a string of length %wu",
3256 stmt
, func
, cntrange
[0].to_uhwi (),
3257 cntrange
[1].to_uhwi (), lenrange
[0].to_uhwi ());
3259 else if (wi::geu_p (lenrange
[1], cntrange
[1]))
3261 /* The longest string is longer than the upper bound of
3262 the count so the truncation is possible. */
3263 if (cntrange
[0] == cntrange
[1])
3264 return warning_n (callloc
, OPT_Wstringop_truncation
,
3265 cntrange
[0].to_uhwi (),
3266 "%G%qD output may be truncated copying %E "
3267 "byte from a string of length %wu",
3268 "%G%qD output may be truncated copying %E "
3269 "bytes from a string of length %wu",
3270 stmt
, func
, cnt
, lenrange
[1].to_uhwi ());
3272 return warning_at (callloc
, OPT_Wstringop_truncation
,
3273 "%G%qD output may be truncated copying between "
3274 "%wu and %wu bytes from a string of length %wu",
3275 stmt
, func
, cntrange
[0].to_uhwi (),
3276 cntrange
[1].to_uhwi (), lenrange
[1].to_uhwi ());
3280 if (!cat_dstlen_bounded
3281 && cntrange
[0] != cntrange
[1]
3282 && wi::leu_p (cntrange
[0], lenrange
[0])
3283 && wi::leu_p (cntrange
[1], lenrange
[0] + 1))
3285 /* If the source (including the terminating nul) is longer than
3286 the lower bound of the specified count but shorter than the
3287 upper bound the copy may (but need not) be truncated. */
3288 return warning_at (callloc
, OPT_Wstringop_truncation
,
3289 "%G%qD output may be truncated copying between "
3290 "%wu and %wu bytes from a string of length %wu",
3291 stmt
, func
, cntrange
[0].to_uhwi (),
3292 cntrange
[1].to_uhwi (), lenrange
[0].to_uhwi ());
3296 if (tree dstsize
= compute_objsize (dst
, 1))
3298 /* The source length is unknown. Try to determine the destination
3299 size and see if it matches the specified bound. If not, bail.
3300 Otherwise go on to see if it should be diagnosed for possible
3305 if (wi::to_wide (dstsize
) != cntrange
[1])
3308 /* Avoid warning for strncpy(a, b, N) calls where the following
3310 N == sizeof a && N == sizeof b */
3311 if (tree srcsize
= compute_objsize (src
, 1))
3312 if (wi::to_wide (srcsize
) == cntrange
[1])
3315 if (cntrange
[0] == cntrange
[1])
3316 return warning_at (callloc
, OPT_Wstringop_truncation
,
3317 "%G%qD specified bound %E equals destination size",
3324 /* Check the arguments to the built-in forms of stpncpy, strncpy, and
3325 strncat, for out-of-bounds offsets or overlapping access, and to see
3326 if the size is derived from calling strlen() on the source argument,
3327 and if so, issue the appropriate warning.
3328 APPEND_P is true for strncat. */
3331 handle_builtin_stxncpy_strncat (bool append_p
, gimple_stmt_iterator
*gsi
)
3333 if (!strlen_to_stridx
)
3336 gimple
*stmt
= gsi_stmt (*gsi
);
3338 tree dst
= gimple_call_arg (stmt
, 0);
3339 tree src
= gimple_call_arg (stmt
, 1);
3340 tree len
= gimple_call_arg (stmt
, 2);
3341 tree dstsize
= NULL_TREE
, srcsize
= NULL_TREE
;
3343 int didx
= get_stridx (dst
);
3344 if (strinfo
*sidst
= didx
> 0 ? get_strinfo (didx
) : NULL
)
3346 /* Compute the size of the destination string including the nul
3347 if it is known to be nul-terminated. */
3348 if (sidst
->nonzero_chars
)
3350 if (sidst
->full_string_p
)
3352 /* String is known to be nul-terminated. */
3353 tree type
= TREE_TYPE (sidst
->nonzero_chars
);
3354 dstsize
= fold_build2 (PLUS_EXPR
, type
, sidst
->nonzero_chars
,
3355 build_int_cst (type
, 1));
3358 dstsize
= sidst
->nonzero_chars
;
3364 int sidx
= get_stridx (src
);
3365 strinfo
*sisrc
= sidx
> 0 ? get_strinfo (sidx
) : NULL
;
3368 /* strncat() and strncpy() can modify the source string by writing
3369 over the terminating nul so SISRC->DONT_INVALIDATE must be left
3372 /* Compute the size of the source string including the terminating
3373 nul if its known to be nul-terminated. */
3374 if (sisrc
->nonzero_chars
)
3376 if (sisrc
->full_string_p
)
3378 tree type
= TREE_TYPE (sisrc
->nonzero_chars
);
3379 srcsize
= fold_build2 (PLUS_EXPR
, type
, sisrc
->nonzero_chars
,
3380 build_int_cst (type
, 1));
3383 srcsize
= sisrc
->nonzero_chars
;
3389 srcsize
= NULL_TREE
;
3391 if (check_bounds_or_overlap (stmt
, dst
, src
, dstsize
, srcsize
))
3393 gimple_set_no_warning (stmt
, true);
3397 /* If the length argument was computed from strlen(S) for some string
3398 S retrieve the strinfo index for the string (PSS->FIRST) along with
3399 the location of the strlen() call (PSS->SECOND). */
3400 stridx_strlenloc
*pss
= strlen_to_stridx
->get (len
);
3401 if (!pss
|| pss
->first
<= 0)
3403 if (maybe_diag_stxncpy_trunc (*gsi
, src
, len
))
3404 gimple_set_no_warning (stmt
, true);
3409 /* Retrieve the strinfo data for the string S that LEN was computed
3410 from as some function F of strlen (S) (i.e., LEN need not be equal
3412 strinfo
*silen
= get_strinfo (pss
->first
);
3414 location_t callloc
= gimple_or_expr_nonartificial_location (stmt
, dst
);
3416 tree func
= gimple_call_fndecl (stmt
);
3418 bool warned
= false;
3420 /* When -Wstringop-truncation is set, try to determine truncation
3421 before diagnosing possible overflow. Truncation is implied by
3422 the LEN argument being equal to strlen(SRC), regardless of
3423 whether its value is known. Otherwise, issue the more generic
3424 -Wstringop-overflow which triggers for LEN arguments that in
3425 any meaningful way depend on strlen(SRC). */
3428 && is_strlen_related_p (src
, len
)
3429 && warning_at (callloc
, OPT_Wstringop_truncation
,
3430 "%G%qD output truncated before terminating nul "
3431 "copying as many bytes from a string as its length",
3434 else if (silen
&& is_strlen_related_p (src
, silen
->ptr
))
3435 warned
= warning_at (callloc
, OPT_Wstringop_overflow_
,
3436 "%G%qD specified bound depends on the length "
3437 "of the source argument",
3441 location_t strlenloc
= pss
->second
;
3442 if (strlenloc
!= UNKNOWN_LOCATION
&& strlenloc
!= callloc
)
3443 inform (strlenloc
, "length computed here");
3447 /* Handle a memcpy-like ({mem{,p}cpy,__mem{,p}cpy_chk}) call.
3448 If strlen of the second argument is known and length of the third argument
3449 is that plus one, strlen of the first argument is the same after this
3450 call. Uses RVALS to determine range information. */
3453 handle_builtin_memcpy (enum built_in_function bcode
, gimple_stmt_iterator
*gsi
,
3456 tree lhs
, oldlen
, newlen
;
3457 gimple
*stmt
= gsi_stmt (*gsi
);
3460 tree len
= gimple_call_arg (stmt
, 2);
3461 tree src
= gimple_call_arg (stmt
, 1);
3462 tree dst
= gimple_call_arg (stmt
, 0);
3464 int didx
= get_stridx (dst
);
3465 strinfo
*olddsi
= NULL
;
3467 olddsi
= get_strinfo (didx
);
3472 && !integer_zerop (len
))
3474 maybe_warn_overflow (stmt
, len
, rvals
, olddsi
, false, true);
3475 adjust_last_stmt (olddsi
, stmt
, false);
3478 int idx
= get_stridx (src
);
3487 /* Handle memcpy (x, y, l) where l's relationship with strlen (y)
3489 si
= get_strinfo (idx
);
3490 if (si
== NULL
|| si
->nonzero_chars
== NULL_TREE
)
3492 if (TREE_CODE (len
) == INTEGER_CST
3493 && TREE_CODE (si
->nonzero_chars
) == INTEGER_CST
)
3495 if (tree_int_cst_le (len
, si
->nonzero_chars
))
3497 /* Copying LEN nonzero characters, where LEN is constant. */
3499 full_string_p
= false;
3503 /* Copying the whole of the analyzed part of SI. */
3504 newlen
= si
->nonzero_chars
;
3505 full_string_p
= si
->full_string_p
;
3510 if (!si
->full_string_p
)
3512 if (TREE_CODE (len
) != SSA_NAME
)
3514 def_stmt
= SSA_NAME_DEF_STMT (len
);
3515 if (!is_gimple_assign (def_stmt
)
3516 || gimple_assign_rhs_code (def_stmt
) != PLUS_EXPR
3517 || gimple_assign_rhs1 (def_stmt
) != si
->nonzero_chars
3518 || !integer_onep (gimple_assign_rhs2 (def_stmt
)))
3520 /* Copying variable-length string SI (and no more). */
3521 newlen
= si
->nonzero_chars
;
3522 full_string_p
= true;
3528 /* Handle memcpy (x, "abcd", 5) or
3529 memcpy (x, "abc\0uvw", 7). */
3530 if (!tree_fits_uhwi_p (len
))
3533 unsigned HOST_WIDE_INT clen
= tree_to_uhwi (len
);
3534 unsigned HOST_WIDE_INT nonzero_chars
= ~idx
;
3535 newlen
= build_int_cst (size_type_node
, MIN (nonzero_chars
, clen
));
3536 full_string_p
= clen
> nonzero_chars
;
3541 && olddsi
->nonzero_chars
3542 && TREE_CODE (olddsi
->nonzero_chars
) == INTEGER_CST
3543 && tree_int_cst_le (newlen
, olddsi
->nonzero_chars
))
3545 /* The SRC substring being written strictly overlaps
3546 a subsequence of the existing string OLDDSI. */
3547 newlen
= olddsi
->nonzero_chars
;
3548 full_string_p
= olddsi
->full_string_p
;
3551 if (olddsi
!= NULL
&& TREE_CODE (len
) == SSA_NAME
)
3552 adjust_last_stmt (olddsi
, stmt
, false);
3556 didx
= new_stridx (dst
);
3563 dsi
= unshare_strinfo (olddsi
);
3564 oldlen
= olddsi
->nonzero_chars
;
3565 dsi
->nonzero_chars
= newlen
;
3566 dsi
->full_string_p
= full_string_p
;
3567 /* Break the chain, so adjust_related_strinfo on later pointers in
3568 the chain won't adjust this one anymore. */
3571 dsi
->endptr
= NULL_TREE
;
3575 dsi
= new_strinfo (dst
, didx
, newlen
, full_string_p
);
3576 set_strinfo (didx
, dsi
);
3577 find_equal_ptrs (dst
, didx
);
3579 dsi
->writable
= true;
3580 dsi
->dont_invalidate
= true;
3583 tree adj
= NULL_TREE
;
3584 location_t loc
= gimple_location (stmt
);
3585 if (oldlen
== NULL_TREE
)
3587 else if (integer_zerop (oldlen
))
3589 else if (TREE_CODE (oldlen
) == INTEGER_CST
3590 || TREE_CODE (newlen
) == INTEGER_CST
)
3591 adj
= fold_build2_loc (loc
, MINUS_EXPR
, TREE_TYPE (newlen
), newlen
,
3592 fold_convert_loc (loc
, TREE_TYPE (newlen
),
3594 if (adj
!= NULL_TREE
)
3595 adjust_related_strinfos (loc
, dsi
, adj
);
3599 /* memcpy src may not overlap dst, so src doesn't need to be
3600 invalidated either. */
3602 si
->dont_invalidate
= true;
3606 lhs
= gimple_call_lhs (stmt
);
3609 case BUILT_IN_MEMCPY
:
3610 case BUILT_IN_MEMCPY_CHK
:
3611 /* Allow adjust_last_stmt to decrease this memcpy's size. */
3612 laststmt
.stmt
= stmt
;
3613 laststmt
.len
= dsi
->nonzero_chars
;
3614 laststmt
.stridx
= dsi
->idx
;
3616 ssa_ver_to_stridx
[SSA_NAME_VERSION (lhs
)] = didx
;
3618 case BUILT_IN_MEMPCPY
:
3619 case BUILT_IN_MEMPCPY_CHK
:
3627 /* Handle a strcat-like ({strcat,__strcat_chk}) call.
3628 If strlen of the second argument is known, strlen of the first argument
3629 is increased by the length of the second argument. Furthermore, attempt
3630 to convert it to memcpy/strcpy if the length of the first argument
3634 handle_builtin_strcat (enum built_in_function bcode
, gimple_stmt_iterator
*gsi
)
3637 tree srclen
, args
, type
, fn
, objsz
, endptr
;
3639 gimple
*stmt
= gsi_stmt (*gsi
);
3641 location_t loc
= gimple_location (stmt
);
3643 tree src
= gimple_call_arg (stmt
, 1);
3644 tree dst
= gimple_call_arg (stmt
, 0);
3646 /* Bail if the source is the same as destination. It will be diagnosed
3648 if (operand_equal_p (src
, dst
, 0))
3651 tree lhs
= gimple_call_lhs (stmt
);
3653 didx
= get_stridx (dst
);
3659 dsi
= get_strinfo (didx
);
3663 idx
= get_stridx (src
);
3665 srclen
= build_int_cst (size_type_node
, ~idx
);
3668 si
= get_strinfo (idx
);
3670 srclen
= get_string_length (si
);
3673 /* Set the no-warning bit on the transformed statement? */
3674 bool set_no_warning
= false;
3676 if (dsi
== NULL
|| get_string_length (dsi
) == NULL_TREE
)
3679 /* The concatenation always involves copying at least one byte
3680 (the terminating nul), even if the source string is empty.
3681 If the source is unknown assume it's one character long and
3682 used that as both sizes. */
3686 tree type
= TREE_TYPE (slen
);
3687 slen
= fold_build2 (PLUS_EXPR
, type
, slen
, build_int_cst (type
, 1));
3690 tree sptr
= si
&& si
->ptr
? si
->ptr
: src
;
3692 if (check_bounds_or_overlap (stmt
, dst
, sptr
, NULL_TREE
, slen
))
3694 gimple_set_no_warning (stmt
, true);
3695 set_no_warning
= true;
3699 /* strcat (p, q) can be transformed into
3700 tmp = p + strlen (p); endptr = stpcpy (tmp, q);
3701 with length endptr - p if we need to compute the length
3702 later on. Don't do this transformation if we don't need
3704 if (builtin_decl_implicit_p (BUILT_IN_STPCPY
) && lhs
== NULL_TREE
)
3708 didx
= new_stridx (dst
);
3714 dsi
= new_strinfo (dst
, didx
, NULL_TREE
, false);
3715 set_strinfo (didx
, dsi
);
3716 find_equal_ptrs (dst
, didx
);
3720 dsi
= unshare_strinfo (dsi
);
3721 dsi
->nonzero_chars
= NULL_TREE
;
3722 dsi
->full_string_p
= false;
3724 dsi
->endptr
= NULL_TREE
;
3726 dsi
->writable
= true;
3728 dsi
->dont_invalidate
= true;
3733 tree dstlen
= dsi
->nonzero_chars
;
3734 endptr
= dsi
->endptr
;
3736 dsi
= unshare_strinfo (dsi
);
3737 dsi
->endptr
= NULL_TREE
;
3739 dsi
->writable
= true;
3741 if (srclen
!= NULL_TREE
)
3743 dsi
->nonzero_chars
= fold_build2_loc (loc
, PLUS_EXPR
,
3744 TREE_TYPE (dsi
->nonzero_chars
),
3745 dsi
->nonzero_chars
, srclen
);
3746 gcc_assert (dsi
->full_string_p
);
3747 adjust_related_strinfos (loc
, dsi
, srclen
);
3748 dsi
->dont_invalidate
= true;
3752 dsi
->nonzero_chars
= NULL
;
3753 dsi
->full_string_p
= false;
3754 if (lhs
== NULL_TREE
&& builtin_decl_implicit_p (BUILT_IN_STPCPY
))
3755 dsi
->dont_invalidate
= true;
3759 /* strcat src may not overlap dst, so src doesn't need to be
3760 invalidated either. */
3761 si
->dont_invalidate
= true;
3763 /* For now. Could remove the lhs from the call and add
3764 lhs = dst; afterwards. */
3772 case BUILT_IN_STRCAT
:
3773 if (srclen
!= NULL_TREE
)
3774 fn
= builtin_decl_implicit (BUILT_IN_MEMCPY
);
3776 fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
3778 case BUILT_IN_STRCAT_CHK
:
3779 if (srclen
!= NULL_TREE
)
3780 fn
= builtin_decl_explicit (BUILT_IN_MEMCPY_CHK
);
3782 fn
= builtin_decl_explicit (BUILT_IN_STRCPY_CHK
);
3783 objsz
= gimple_call_arg (stmt
, 2);
3789 if (fn
== NULL_TREE
)
3794 tree type
= TREE_TYPE (dstlen
);
3796 /* Compute the size of the source sequence, including the nul. */
3797 tree srcsize
= srclen
? srclen
: size_zero_node
;
3798 tree one
= build_int_cst (type
, 1);
3799 srcsize
= fold_build2 (PLUS_EXPR
, type
, srcsize
, one
);
3800 tree dstsize
= fold_build2 (PLUS_EXPR
, type
, dstlen
, one
);
3801 tree sptr
= si
&& si
->ptr
? si
->ptr
: src
;
3803 if (check_bounds_or_overlap (stmt
, dst
, sptr
, dstsize
, srcsize
))
3805 gimple_set_no_warning (stmt
, true);
3806 set_no_warning
= true;
3810 tree len
= NULL_TREE
;
3811 if (srclen
!= NULL_TREE
)
3813 args
= TYPE_ARG_TYPES (TREE_TYPE (fn
));
3814 type
= TREE_VALUE (TREE_CHAIN (TREE_CHAIN (args
)));
3816 len
= fold_convert_loc (loc
, type
, unshare_expr (srclen
));
3817 len
= fold_build2_loc (loc
, PLUS_EXPR
, type
, len
,
3818 build_int_cst (type
, 1));
3819 len
= force_gimple_operand_gsi (gsi
, len
, true, NULL_TREE
, true,
3823 dst
= fold_convert_loc (loc
, TREE_TYPE (dst
), unshare_expr (endptr
));
3825 dst
= fold_build2_loc (loc
, POINTER_PLUS_EXPR
, TREE_TYPE (dst
), dst
,
3826 fold_convert_loc (loc
, sizetype
,
3827 unshare_expr (dstlen
)));
3828 dst
= force_gimple_operand_gsi (gsi
, dst
, true, NULL_TREE
, true,
3832 objsz
= fold_build2_loc (loc
, MINUS_EXPR
, TREE_TYPE (objsz
), objsz
,
3833 fold_convert_loc (loc
, TREE_TYPE (objsz
),
3834 unshare_expr (dstlen
)));
3835 objsz
= force_gimple_operand_gsi (gsi
, objsz
, true, NULL_TREE
, true,
3838 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
3840 fprintf (dump_file
, "Optimizing: ");
3841 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
3843 if (srclen
!= NULL_TREE
)
3844 success
= update_gimple_call (gsi
, fn
, 3 + (objsz
!= NULL_TREE
),
3845 dst
, src
, len
, objsz
);
3847 success
= update_gimple_call (gsi
, fn
, 2 + (objsz
!= NULL_TREE
),
3851 stmt
= gsi_stmt (*gsi
);
3853 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
3855 fprintf (dump_file
, "into: ");
3856 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
3858 /* If srclen == NULL, note that current string length can be
3859 computed by transforming this strcpy into stpcpy. */
3860 if (srclen
== NULL_TREE
&& dsi
->dont_invalidate
)
3862 adjust_last_stmt (dsi
, stmt
, true);
3863 if (srclen
!= NULL_TREE
)
3865 laststmt
.stmt
= stmt
;
3866 laststmt
.len
= srclen
;
3867 laststmt
.stridx
= dsi
->idx
;
3870 else if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
3871 fprintf (dump_file
, "not possible.\n");
3874 gimple_set_no_warning (stmt
, true);
3877 /* Handle a call to an allocation function like alloca, malloc or calloc,
3878 or an ordinary allocation function declared with attribute alloc_size. */
3881 handle_alloc_call (enum built_in_function bcode
, gimple_stmt_iterator
*gsi
)
3883 gimple
*stmt
= gsi_stmt (*gsi
);
3884 tree lhs
= gimple_call_lhs (stmt
);
3885 if (lhs
== NULL_TREE
)
3888 gcc_assert (get_stridx (lhs
) == 0);
3889 int idx
= new_stridx (lhs
);
3890 tree length
= NULL_TREE
;
3891 if (bcode
== BUILT_IN_CALLOC
)
3892 length
= build_int_cst (size_type_node
, 0);
3893 strinfo
*si
= new_strinfo (lhs
, idx
, length
, length
!= NULL_TREE
);
3894 if (bcode
== BUILT_IN_CALLOC
)
3896 /* Only set STMT for calloc and malloc. */
3898 /* Only set ENDPTR for calloc. */
3901 else if (bcode
== BUILT_IN_MALLOC
)
3904 /* Set ALLOC is set for all allocation functions. */
3906 set_strinfo (idx
, si
);
3907 si
->writable
= true;
3908 si
->dont_invalidate
= true;
3911 /* Handle a call to memset.
3912 After a call to calloc, memset(,0,) is unnecessary.
3913 memset(malloc(n),0,n) is calloc(n,1).
3914 return true when the call is transformed, false otherwise.
3915 When nonnull uses RVALS to determine range information. */
3918 handle_builtin_memset (gimple_stmt_iterator
*gsi
, bool *zero_write
,
3921 gimple
*memset_stmt
= gsi_stmt (*gsi
);
3922 tree ptr
= gimple_call_arg (memset_stmt
, 0);
3923 /* Set to the non-constant offset added to PTR. */
3925 int idx1
= get_stridx (ptr
, offrng
, rvals
);
3928 strinfo
*si1
= get_strinfo (idx1
);
3931 gimple
*alloc_stmt
= si1
->alloc
;
3932 if (!alloc_stmt
|| !is_gimple_call (alloc_stmt
))
3934 tree callee1
= gimple_call_fndecl (alloc_stmt
);
3935 if (!valid_builtin_call (alloc_stmt
))
3937 tree alloc_size
= gimple_call_arg (alloc_stmt
, 0);
3938 tree memset_size
= gimple_call_arg (memset_stmt
, 2);
3940 /* Check for overflow. */
3941 maybe_warn_overflow (memset_stmt
, memset_size
, rvals
, NULL
, false, true);
3943 /* Bail when there is no statement associated with the destination
3944 (the statement may be null even when SI1->ALLOC is not). */
3948 /* Avoid optimizing if store is at a variable offset from the beginning
3949 of the allocated object. */
3950 if (offrng
[0] != 0 || offrng
[0] != offrng
[1])
3953 /* Bail when the call writes a non-zero value. */
3954 if (!integer_zerop (gimple_call_arg (memset_stmt
, 1)))
3957 /* Let the caller know the memset call cleared the destination. */
3960 enum built_in_function code1
= DECL_FUNCTION_CODE (callee1
);
3961 if (code1
== BUILT_IN_CALLOC
)
3962 /* Not touching alloc_stmt */ ;
3963 else if (code1
== BUILT_IN_MALLOC
3964 && operand_equal_p (memset_size
, alloc_size
, 0))
3966 /* Replace the malloc + memset calls with calloc. */
3967 gimple_stmt_iterator gsi1
= gsi_for_stmt (si1
->stmt
);
3968 update_gimple_call (&gsi1
, builtin_decl_implicit (BUILT_IN_CALLOC
), 2,
3969 alloc_size
, build_one_cst (size_type_node
));
3970 si1
->nonzero_chars
= build_int_cst (size_type_node
, 0);
3971 si1
->full_string_p
= true;
3972 si1
->stmt
= gsi_stmt (gsi1
);
3976 tree lhs
= gimple_call_lhs (memset_stmt
);
3977 unlink_stmt_vdef (memset_stmt
);
3980 gimple
*assign
= gimple_build_assign (lhs
, ptr
);
3981 gsi_replace (gsi
, assign
, false);
3985 gsi_remove (gsi
, true);
3986 release_defs (memset_stmt
);
3992 /* Return a pointer to the first such equality expression if RES is used
3993 only in expressions testing its equality to zero, and null otherwise. */
3996 used_only_for_zero_equality (tree res
)
3998 gimple
*first_use
= NULL
;
4000 use_operand_p use_p
;
4001 imm_use_iterator iter
;
4003 FOR_EACH_IMM_USE_FAST (use_p
, iter
, res
)
4005 gimple
*use_stmt
= USE_STMT (use_p
);
4007 if (is_gimple_debug (use_stmt
))
4009 if (gimple_code (use_stmt
) == GIMPLE_ASSIGN
)
4011 tree_code code
= gimple_assign_rhs_code (use_stmt
);
4012 if (code
== COND_EXPR
)
4014 tree cond_expr
= gimple_assign_rhs1 (use_stmt
);
4015 if ((TREE_CODE (cond_expr
) != EQ_EXPR
4016 && (TREE_CODE (cond_expr
) != NE_EXPR
))
4017 || !integer_zerop (TREE_OPERAND (cond_expr
, 1)))
4020 else if (code
== EQ_EXPR
|| code
== NE_EXPR
)
4022 if (!integer_zerop (gimple_assign_rhs2 (use_stmt
)))
4028 else if (gimple_code (use_stmt
) == GIMPLE_COND
)
4030 tree_code code
= gimple_cond_code (use_stmt
);
4031 if ((code
!= EQ_EXPR
&& code
!= NE_EXPR
)
4032 || !integer_zerop (gimple_cond_rhs (use_stmt
)))
4039 first_use
= use_stmt
;
4045 /* Handle a call to memcmp. We try to handle small comparisons by
4046 converting them to load and compare, and replacing the call to memcmp
4047 with a __builtin_memcmp_eq call where possible.
4048 return true when call is transformed, return false otherwise. */
4051 handle_builtin_memcmp (gimple_stmt_iterator
*gsi
)
4053 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
4054 tree res
= gimple_call_lhs (stmt
);
4056 if (!res
|| !used_only_for_zero_equality (res
))
4059 tree arg1
= gimple_call_arg (stmt
, 0);
4060 tree arg2
= gimple_call_arg (stmt
, 1);
4061 tree len
= gimple_call_arg (stmt
, 2);
4062 unsigned HOST_WIDE_INT leni
;
4064 if (tree_fits_uhwi_p (len
)
4065 && (leni
= tree_to_uhwi (len
)) <= GET_MODE_SIZE (word_mode
)
4066 && pow2p_hwi (leni
))
4068 leni
*= CHAR_TYPE_SIZE
;
4069 unsigned align1
= get_pointer_alignment (arg1
);
4070 unsigned align2
= get_pointer_alignment (arg2
);
4071 unsigned align
= MIN (align1
, align2
);
4072 scalar_int_mode mode
;
4073 if (int_mode_for_size (leni
, 1).exists (&mode
)
4074 && (align
>= leni
|| !targetm
.slow_unaligned_access (mode
, align
)))
4076 location_t loc
= gimple_location (stmt
);
4078 type
= build_nonstandard_integer_type (leni
, 1);
4079 gcc_assert (known_eq (GET_MODE_BITSIZE (TYPE_MODE (type
)), leni
));
4080 tree ptrtype
= build_pointer_type_for_mode (char_type_node
,
4082 off
= build_int_cst (ptrtype
, 0);
4083 arg1
= build2_loc (loc
, MEM_REF
, type
, arg1
, off
);
4084 arg2
= build2_loc (loc
, MEM_REF
, type
, arg2
, off
);
4085 tree tem1
= fold_const_aggregate_ref (arg1
);
4088 tree tem2
= fold_const_aggregate_ref (arg2
);
4091 res
= fold_convert_loc (loc
, TREE_TYPE (res
),
4092 fold_build2_loc (loc
, NE_EXPR
,
4095 gimplify_and_update_call_from_tree (gsi
, res
);
4100 gimple_call_set_fndecl (stmt
, builtin_decl_explicit (BUILT_IN_MEMCMP_EQ
));
4104 /* Given strinfo IDX for ARG, sets LENRNG[] to the range of lengths
4105 of the string(s) referenced by ARG if it can be determined.
4106 If the length cannot be determined, sets *SIZE to the size of
4107 the array the string is stored in, if any. If no such array is
4108 known, sets *SIZE to -1. When the strings are nul-terminated sets
4109 *NULTERM to true, otherwise to false. When nonnull uses RVALS to
4110 determine range information. Returns true on success. */
4113 get_len_or_size (gimple
*stmt
, tree arg
, int idx
,
4114 unsigned HOST_WIDE_INT lenrng
[2],
4115 unsigned HOST_WIDE_INT
*size
, bool *nulterm
,
4119 *size
= HOST_WIDE_INT_M1U
;
4123 /* IDX is the inverted constant string length. */
4125 lenrng
[1] = lenrng
[0];
4130 /* Set so that both LEN and ~LEN are invalid lengths, i.e., maximum
4131 possible length + 1. */
4132 lenrng
[0] = lenrng
[1] = HOST_WIDE_INT_MAX
;
4134 if (strinfo
*si
= idx
? get_strinfo (idx
) : NULL
)
4136 /* FIXME: Handle all this in_range_strlen_dynamic. */
4137 if (!si
->nonzero_chars
)
4139 else if (tree_fits_uhwi_p (si
->nonzero_chars
))
4141 lenrng
[0] = tree_to_uhwi (si
->nonzero_chars
);
4142 *nulterm
= si
->full_string_p
;
4143 /* Set the upper bound only if the string is known to be
4144 nul-terminated, otherwise leave it at maximum + 1. */
4146 lenrng
[1] = lenrng
[0];
4148 else if (TREE_CODE (si
->nonzero_chars
) == SSA_NAME
)
4151 // FIXME: Use range_query instead of global ranges.
4152 value_range_kind rng
= get_range_info (si
->nonzero_chars
, &min
, &max
);
4153 if (rng
== VR_RANGE
)
4155 lenrng
[0] = min
.to_uhwi ();
4156 lenrng
[1] = max
.to_uhwi ();
4157 *nulterm
= si
->full_string_p
;
4162 if (lenrng
[0] != HOST_WIDE_INT_MAX
)
4165 /* Compute the minimum and maximum real or possible lengths. */
4166 c_strlen_data lendata
= { };
4167 /* Set MAXBOUND to an arbitrary non-null non-integer node as a request
4168 to have it set to the length of the longest string in a PHI. */
4169 lendata
.maxbound
= arg
;
4170 get_range_strlen_dynamic (arg
, stmt
, &lendata
, rvals
);
4172 unsigned HOST_WIDE_INT maxbound
= HOST_WIDE_INT_M1U
;
4173 if (tree_fits_uhwi_p (lendata
.maxbound
)
4174 && !integer_all_onesp (lendata
.maxbound
))
4175 maxbound
= tree_to_uhwi (lendata
.maxbound
);
4177 if (tree_fits_uhwi_p (lendata
.minlen
) && tree_fits_uhwi_p (lendata
.maxlen
))
4179 unsigned HOST_WIDE_INT minlen
= tree_to_uhwi (lendata
.minlen
);
4180 unsigned HOST_WIDE_INT maxlen
= tree_to_uhwi (lendata
.maxlen
);
4182 /* The longest string in this data model. */
4183 const unsigned HOST_WIDE_INT lenmax
4184 = tree_to_uhwi (max_object_size ()) - 2;
4186 if (maxbound
== HOST_WIDE_INT_M1U
)
4190 *nulterm
= minlen
== maxlen
;
4192 else if (maxlen
< lenmax
)
4194 *size
= maxbound
+ 1;
4203 if (maxbound
!= HOST_WIDE_INT_M1U
4205 && !integer_all_onesp (lendata
.maxlen
))
4207 /* Set *SIZE to LENDATA.MAXBOUND which is a conservative estimate
4208 of the longest string based on the sizes of the arrays referenced
4210 *size
= maxbound
+ 1;
4218 /* If IDX1 and IDX2 refer to strings A and B of unequal lengths, return
4219 the result of 0 == strncmp (A, B, BOUND) (which is the same as strcmp
4220 for a sufficiently large BOUND). If the result is based on the length
4221 of one string being greater than the longest string that would fit in
4222 the array pointer to by the argument, set *PLEN and *PSIZE to
4223 the corresponding length (or its complement when the string is known
4224 to be at least as long and need not be nul-terminated) and size.
4225 Otherwise return null. */
4228 strxcmp_eqz_result (gimple
*stmt
, tree arg1
, int idx1
, tree arg2
, int idx2
,
4229 unsigned HOST_WIDE_INT bound
, unsigned HOST_WIDE_INT len
[2],
4230 unsigned HOST_WIDE_INT
*psize
, range_query
*rvals
)
4232 /* Determine the range the length of each string is in and whether it's
4233 known to be nul-terminated, or the size of the array it's stored in. */
4235 unsigned HOST_WIDE_INT siz1
, siz2
;
4236 unsigned HOST_WIDE_INT len1rng
[2], len2rng
[2];
4237 if (!get_len_or_size (stmt
, arg1
, idx1
, len1rng
, &siz1
, &nul1
, rvals
)
4238 || !get_len_or_size (stmt
, arg2
, idx2
, len2rng
, &siz2
, &nul2
, rvals
))
4241 /* BOUND is set to HWI_M1U for strcmp and less to strncmp, and LENiRNG
4242 to HWI_MAX when invalid. Adjust the length of each string to consider
4243 to be no more than BOUND. */
4244 if (len1rng
[0] < HOST_WIDE_INT_MAX
&& len1rng
[0] > bound
)
4246 if (len1rng
[1] < HOST_WIDE_INT_MAX
&& len1rng
[1] > bound
)
4248 if (len2rng
[0] < HOST_WIDE_INT_MAX
&& len2rng
[0] > bound
)
4250 if (len2rng
[1] < HOST_WIDE_INT_MAX
&& len2rng
[1] > bound
)
4253 /* Two empty strings are equal. */
4254 if (len1rng
[1] == 0 && len2rng
[1] == 0)
4255 return integer_one_node
;
4257 /* The strings are definitely unequal when the lower bound of the length
4258 of one of them is greater than the length of the longest string that
4259 would fit into the other array. */
4260 if (len1rng
[0] == HOST_WIDE_INT_MAX
4261 && len2rng
[0] != HOST_WIDE_INT_MAX
4262 && ((len2rng
[0] < bound
&& len2rng
[0] >= siz1
)
4263 || len2rng
[0] > siz1
))
4266 len
[0] = len1rng
[0];
4267 /* Set LEN[0] to the lower bound of ARG1's length when it's
4268 nul-terminated or to the complement of its minimum length
4270 len
[1] = nul2
? len2rng
[0] : ~len2rng
[0];
4271 return integer_zero_node
;
4274 if (len2rng
[0] == HOST_WIDE_INT_MAX
4275 && len1rng
[0] != HOST_WIDE_INT_MAX
4276 && ((len1rng
[0] < bound
&& len1rng
[0] >= siz2
)
4277 || len1rng
[0] > siz2
))
4280 len
[0] = nul1
? len1rng
[0] : ~len1rng
[0];
4281 len
[1] = len2rng
[0];
4282 return integer_zero_node
;
4285 /* The strings are also definitely unequal when their lengths are unequal
4286 and at least one is nul-terminated. */
4287 if (len1rng
[0] != HOST_WIDE_INT_MAX
4288 && len2rng
[0] != HOST_WIDE_INT_MAX
4289 && ((len1rng
[1] < len2rng
[0] && nul1
)
4290 || (len2rng
[1] < len1rng
[0] && nul2
)))
4292 if (bound
<= len1rng
[0] || bound
<= len2rng
[0])
4295 *psize
= HOST_WIDE_INT_M1U
;
4297 len
[0] = len1rng
[0];
4298 len
[1] = len2rng
[0];
4299 return integer_zero_node
;
4302 /* The string lengths may be equal or unequal. Even when equal and
4303 both strings nul-terminated, without the string contents there's
4304 no way to determine whether they are equal. */
4308 /* Diagnose pointless calls to strcmp or strncmp STMT with string
4309 arguments of lengths LEN or size SIZ and (for strncmp) BOUND,
4310 whose result is used in equality expressions that evaluate to
4311 a constant due to one argument being longer than the size of
4315 maybe_warn_pointless_strcmp (gimple
*stmt
, HOST_WIDE_INT bound
,
4316 unsigned HOST_WIDE_INT len
[2],
4317 unsigned HOST_WIDE_INT siz
)
4319 tree lhs
= gimple_call_lhs (stmt
);
4320 gimple
*use
= used_only_for_zero_equality (lhs
);
4324 bool at_least
= false;
4326 /* Excessive LEN[i] indicates a lower bound. */
4327 if (len
[0] > HOST_WIDE_INT_MAX
)
4333 if (len
[1] > HOST_WIDE_INT_MAX
)
4339 unsigned HOST_WIDE_INT minlen
= MIN (len
[0], len
[1]);
4341 /* FIXME: Include a note pointing to the declaration of the smaller
4343 location_t stmt_loc
= gimple_or_expr_nonartificial_location (stmt
, lhs
);
4345 tree callee
= gimple_call_fndecl (stmt
);
4346 bool warned
= false;
4347 if (siz
<= minlen
&& bound
== -1)
4348 warned
= warning_at (stmt_loc
, OPT_Wstring_compare
,
4350 ? G_("%G%qD of a string of length %wu or more and "
4351 "an array of size %wu evaluates to nonzero")
4352 : G_("%G%qD of a string of length %wu and an array "
4353 "of size %wu evaluates to nonzero")),
4354 stmt
, callee
, minlen
, siz
);
4355 else if (!at_least
&& siz
<= HOST_WIDE_INT_MAX
)
4357 if (len
[0] != HOST_WIDE_INT_MAX
&& len
[1] != HOST_WIDE_INT_MAX
)
4358 warned
= warning_at (stmt_loc
, OPT_Wstring_compare
,
4359 "%G%qD of strings of length %wu and %wu "
4360 "and bound of %wu evaluates to nonzero",
4361 stmt
, callee
, len
[0], len
[1], bound
);
4363 warned
= warning_at (stmt_loc
, OPT_Wstring_compare
,
4364 "%G%qD of a string of length %wu, an array "
4365 "of size %wu and bound of %wu evaluates to "
4367 stmt
, callee
, minlen
, siz
, bound
);
4372 location_t use_loc
= gimple_location (use
);
4373 if (LOCATION_LINE (stmt_loc
) != LOCATION_LINE (use_loc
))
4374 inform (use_loc
, "in this expression");
4379 /* Optimize a call to strcmp or strncmp either by folding it to a constant
4380 when possible or by transforming the latter to the former. Warn about
4381 calls where the length of one argument is greater than the size of
4382 the array to which the other argument points if the latter's length
4383 is not known. Return true when the call has been transformed into
4384 another and false otherwise. */
4387 handle_builtin_string_cmp (gimple_stmt_iterator
*gsi
, range_query
*rvals
)
4389 gcall
*stmt
= as_a
<gcall
*> (gsi_stmt (*gsi
));
4390 tree lhs
= gimple_call_lhs (stmt
);
4395 tree arg1
= gimple_call_arg (stmt
, 0);
4396 tree arg2
= gimple_call_arg (stmt
, 1);
4397 int idx1
= get_stridx (arg1
);
4398 int idx2
= get_stridx (arg2
);
4400 /* For strncmp set to the value of the third argument if known. */
4401 HOST_WIDE_INT bound
= -1;
4402 tree len
= NULL_TREE
;
4403 /* Extract the strncmp bound. */
4404 if (gimple_call_num_args (stmt
) == 3)
4406 len
= gimple_call_arg (stmt
, 2);
4407 if (tree_fits_shwi_p (len
))
4408 bound
= tree_to_shwi (len
);
4410 /* If the bound argument is NOT known, do nothing. */
4415 /* Avoid folding if either argument is not a nul-terminated array.
4416 Defer warning until later. */
4417 if (!check_nul_terminated_array (NULL_TREE
, arg1
, len
)
4418 || !check_nul_terminated_array (NULL_TREE
, arg2
, len
))
4422 /* Set to the length of one argument (or its complement if it's
4423 the lower bound of a range) and the size of the array storing
4424 the other if the result is based on the former being equal to
4425 or greater than the latter. */
4426 unsigned HOST_WIDE_INT len
[2] = { HOST_WIDE_INT_MAX
, HOST_WIDE_INT_MAX
};
4427 unsigned HOST_WIDE_INT siz
= HOST_WIDE_INT_M1U
;
4429 /* Try to determine if the two strings are either definitely equal
4430 or definitely unequal and if so, either fold the result to zero
4431 (when equal) or set the range of the result to ~[0, 0] otherwise. */
4432 if (tree eqz
= strxcmp_eqz_result (stmt
, arg1
, idx1
, arg2
, idx2
, bound
,
4435 if (integer_zerop (eqz
))
4437 maybe_warn_pointless_strcmp (stmt
, bound
, len
, siz
);
4439 /* When the lengths of the first two string arguments are
4440 known to be unequal set the range of the result to non-zero.
4441 This allows the call to be eliminated if its result is only
4442 used in tests for equality to zero. */
4443 wide_int zero
= wi::zero (TYPE_PRECISION (TREE_TYPE (lhs
)));
4444 set_range_info (lhs
, VR_ANTI_RANGE
, zero
, zero
);
4447 /* When the two strings are definitely equal (such as when they
4448 are both empty) fold the call to the constant result. */
4449 replace_call_with_value (gsi
, integer_zero_node
);
4454 /* Return if nothing is known about the strings pointed to by ARG1
4456 if (idx1
== 0 && idx2
== 0)
4459 /* Determine either the length or the size of each of the strings,
4460 whichever is available. */
4461 HOST_WIDE_INT cstlen1
= -1, cstlen2
= -1;
4462 HOST_WIDE_INT arysiz1
= -1, arysiz2
= -1;
4465 unsigned HOST_WIDE_INT len1rng
[2], len2rng
[2];
4466 unsigned HOST_WIDE_INT arsz1
, arsz2
;
4469 if (!get_len_or_size (stmt
, arg1
, idx1
, len1rng
, &arsz1
, nulterm
, rvals
)
4470 || !get_len_or_size (stmt
, arg2
, idx2
, len2rng
, &arsz2
, nulterm
+ 1,
4474 if (len1rng
[0] == len1rng
[1] && len1rng
[0] < HOST_WIDE_INT_MAX
)
4475 cstlen1
= len1rng
[0];
4476 else if (arsz1
< HOST_WIDE_INT_M1U
)
4479 if (len2rng
[0] == len2rng
[1] && len2rng
[0] < HOST_WIDE_INT_MAX
)
4480 cstlen2
= len2rng
[0];
4481 else if (arsz2
< HOST_WIDE_INT_M1U
)
4485 /* Bail if neither the string length nor the size of the array
4486 it is stored in can be determined. */
4487 if ((cstlen1
< 0 && arysiz1
< 0)
4488 || (cstlen2
< 0 && arysiz2
< 0)
4489 || (cstlen1
< 0 && cstlen2
< 0))
4497 /* The exact number of characters to compare. */
4498 HOST_WIDE_INT cmpsiz
;
4499 if (cstlen1
>= 0 && cstlen2
>= 0)
4500 cmpsiz
= MIN (cstlen1
, cstlen2
);
4501 else if (cstlen1
>= 0)
4506 cmpsiz
= MIN (cmpsiz
, bound
);
4507 /* The size of the array in which the unknown string is stored. */
4508 HOST_WIDE_INT varsiz
= arysiz1
< 0 ? arysiz2
: arysiz1
;
4510 if ((varsiz
< 0 || cmpsiz
< varsiz
) && used_only_for_zero_equality (lhs
))
4512 /* If the known length is less than the size of the other array
4513 and the strcmp result is only used to test equality to zero,
4514 transform the call to the equivalent _eq call. */
4515 if (tree fn
= builtin_decl_implicit (bound
< 0 ? BUILT_IN_STRCMP_EQ
4516 : BUILT_IN_STRNCMP_EQ
))
4518 tree n
= build_int_cst (size_type_node
, cmpsiz
);
4519 update_gimple_call (gsi
, fn
, 3, arg1
, arg2
, n
);
4527 /* Handle a POINTER_PLUS_EXPR statement.
4528 For p = "abcd" + 2; compute associated length, or if
4529 p = q + off is pointing to a '\0' character of a string, call
4530 zero_length_string on it. */
4533 handle_pointer_plus (gimple_stmt_iterator
*gsi
)
4535 gimple
*stmt
= gsi_stmt (*gsi
);
4536 tree lhs
= gimple_assign_lhs (stmt
), off
;
4537 int idx
= get_stridx (gimple_assign_rhs1 (stmt
));
4545 tree off
= gimple_assign_rhs2 (stmt
);
4546 if (tree_fits_uhwi_p (off
)
4547 && tree_to_uhwi (off
) <= (unsigned HOST_WIDE_INT
) ~idx
)
4548 ssa_ver_to_stridx
[SSA_NAME_VERSION (lhs
)]
4549 = ~(~idx
- (int) tree_to_uhwi (off
));
4553 si
= get_strinfo (idx
);
4554 if (si
== NULL
|| si
->nonzero_chars
== NULL_TREE
)
4557 off
= gimple_assign_rhs2 (stmt
);
4559 if (si
->full_string_p
&& operand_equal_p (si
->nonzero_chars
, off
, 0))
4560 zsi
= zero_length_string (lhs
, si
);
4561 else if (TREE_CODE (off
) == SSA_NAME
)
4563 gimple
*def_stmt
= SSA_NAME_DEF_STMT (off
);
4564 if (gimple_assign_single_p (def_stmt
)
4565 && si
->full_string_p
4566 && operand_equal_p (si
->nonzero_chars
,
4567 gimple_assign_rhs1 (def_stmt
), 0))
4568 zsi
= zero_length_string (lhs
, si
);
4571 && si
->endptr
!= NULL_TREE
4572 && si
->endptr
!= lhs
4573 && TREE_CODE (si
->endptr
) == SSA_NAME
)
4575 enum tree_code rhs_code
4576 = useless_type_conversion_p (TREE_TYPE (lhs
), TREE_TYPE (si
->endptr
))
4577 ? SSA_NAME
: NOP_EXPR
;
4578 gimple_assign_set_rhs_with_ops (gsi
, rhs_code
, si
->endptr
);
4579 gcc_assert (gsi_stmt (*gsi
) == stmt
);
4584 /* Describes recursion limits used by count_nonzero_bytes. */
4586 class ssa_name_limit_t
4588 bitmap visited
; /* Bitmap of visited SSA_NAMEs. */
4589 unsigned ssa_def_max
; /* Longest chain of SSA_NAMEs to follow. */
4591 /* Not copyable or assignable. */
4592 ssa_name_limit_t (ssa_name_limit_t
&);
4593 void operator= (ssa_name_limit_t
&);
4599 ssa_def_max (param_ssa_name_def_chain_limit
) { }
4601 int next_ssa_name (tree
);
4603 ~ssa_name_limit_t ()
4606 BITMAP_FREE (visited
);
4610 /* If the SSA_NAME has already been "seen" return a positive value.
4611 Otherwise add it to VISITED. If the SSA_NAME limit has been
4612 reached, return a negative value. Otherwise return zero. */
4614 int ssa_name_limit_t::next_ssa_name (tree ssa_name
)
4617 visited
= BITMAP_ALLOC (NULL
);
4619 /* Return a positive value if SSA_NAME has already been visited. */
4620 if (!bitmap_set_bit (visited
, SSA_NAME_VERSION (ssa_name
)))
4623 /* Return a negative value to let caller avoid recursing beyond
4624 the specified limit. */
4625 if (ssa_def_max
== 0)
4634 count_nonzero_bytes_addr (tree
, unsigned HOST_WIDE_INT
, unsigned HOST_WIDE_INT
,
4635 unsigned [3], bool *, bool *, bool *,
4636 range_query
*, ssa_name_limit_t
&);
4638 /* Determines the minimum and maximum number of leading non-zero bytes
4639 in the representation of EXP and set LENRANGE[0] and LENRANGE[1]
4641 Sets LENRANGE[2] to the total size of the access (which may be less
4642 than LENRANGE[1] when what's being referenced by EXP is a pointer
4643 rather than an array).
4644 Sets *NULTERM if the representation contains a zero byte, and sets
4645 *ALLNUL if all the bytes are zero.
4646 OFFSET and NBYTES are the offset into the representation and
4647 the size of the access to it determined from an ADDR_EXPR (i.e.,
4648 a pointer) or MEM_REF or zero for other expressions.
4649 Uses RVALS to determine range information.
4650 Avoids recursing deeper than the limits in SNLIM allow.
4651 Returns true on success and false otherwise. */
4654 count_nonzero_bytes (tree exp
, unsigned HOST_WIDE_INT offset
,
4655 unsigned HOST_WIDE_INT nbytes
,
4656 unsigned lenrange
[3], bool *nulterm
,
4657 bool *allnul
, bool *allnonnul
, range_query
*rvals
,
4658 ssa_name_limit_t
&snlim
)
4660 if (TREE_CODE (exp
) == SSA_NAME
)
4662 /* Handle non-zero single-character stores specially. */
4663 tree type
= TREE_TYPE (exp
);
4664 if (TREE_CODE (type
) == INTEGER_TYPE
4665 && TYPE_MODE (type
) == TYPE_MODE (char_type_node
)
4666 && TYPE_PRECISION (type
) == TYPE_PRECISION (char_type_node
)
4667 && tree_expr_nonzero_p (exp
))
4669 /* If the character EXP is known to be non-zero (even if its
4670 exact value is not known) recurse once to set the range
4671 for an arbitrary constant. */
4672 exp
= build_int_cst (type
, 1);
4673 return count_nonzero_bytes (exp
, offset
, 1, lenrange
,
4674 nulterm
, allnul
, allnonnul
, rvals
, snlim
);
4677 gimple
*stmt
= SSA_NAME_DEF_STMT (exp
);
4678 if (gimple_assign_single_p (stmt
))
4680 exp
= gimple_assign_rhs1 (stmt
);
4681 if (TREE_CODE (exp
) != MEM_REF
)
4683 /* Handle MEM_REF below. */
4685 else if (gimple_code (stmt
) == GIMPLE_PHI
)
4687 /* Avoid processing an SSA_NAME that has already been visited
4688 or if an SSA_NAME limit has been reached. Indicate success
4689 if the former and failure if the latter. */
4690 if (int res
= snlim
.next_ssa_name (exp
))
4693 /* Determine the minimum and maximum from the PHI arguments. */
4694 unsigned int n
= gimple_phi_num_args (stmt
);
4695 for (unsigned i
= 0; i
!= n
; i
++)
4697 tree def
= gimple_phi_arg_def (stmt
, i
);
4698 if (!count_nonzero_bytes (def
, offset
, nbytes
, lenrange
, nulterm
,
4699 allnul
, allnonnul
, rvals
, snlim
))
4707 if (TREE_CODE (exp
) == MEM_REF
)
4712 tree arg
= TREE_OPERAND (exp
, 0);
4713 tree off
= TREE_OPERAND (exp
, 1);
4715 if (TREE_CODE (off
) != INTEGER_CST
|| !tree_fits_uhwi_p (off
))
4718 unsigned HOST_WIDE_INT wioff
= tree_to_uhwi (off
);
4719 if (INT_MAX
< wioff
)
4723 if (INT_MAX
< offset
)
4726 /* The size of the MEM_REF access determines the number of bytes. */
4727 tree type
= TREE_TYPE (exp
);
4728 tree typesize
= TYPE_SIZE_UNIT (type
);
4729 if (!typesize
|| !tree_fits_uhwi_p (typesize
))
4731 nbytes
= tree_to_uhwi (typesize
);
4735 /* Handle MEM_REF = SSA_NAME types of assignments. */
4736 return count_nonzero_bytes_addr (arg
, offset
, nbytes
, lenrange
, nulterm
,
4737 allnul
, allnonnul
, rvals
, snlim
);
4740 if (VAR_P (exp
) || TREE_CODE (exp
) == CONST_DECL
)
4742 exp
= ctor_for_folding (exp
);
4747 const char *prep
= NULL
;
4748 if (TREE_CODE (exp
) == STRING_CST
)
4750 unsigned nchars
= TREE_STRING_LENGTH (exp
);
4751 if (nchars
< offset
)
4755 /* If NBYTES hasn't been determined earlier, either from ADDR_EXPR
4756 (i.e., it's the size of a pointer), or from MEM_REF (as the size
4757 of the access), set it here to the size of the string, including
4758 all internal and trailing nuls if the string has any. */
4759 nbytes
= nchars
- offset
;
4760 else if (nchars
- offset
< nbytes
)
4763 prep
= TREE_STRING_POINTER (exp
) + offset
;
4766 unsigned char buf
[256];
4769 if (CHAR_BIT
!= 8 || BITS_PER_UNIT
!= 8)
4771 /* If the pointer to representation hasn't been set above
4772 for STRING_CST point it at the buffer. */
4773 prep
= reinterpret_cast <char *>(buf
);
4774 /* Try to extract the representation of the constant object
4775 or expression starting from the offset. */
4776 unsigned repsize
= native_encode_expr (exp
, buf
, sizeof buf
, offset
);
4777 if (repsize
< nbytes
)
4779 /* This should only happen when REPSIZE is zero because EXP
4780 doesn't denote an object with a known initializer, except
4781 perhaps when the reference reads past its end. */
4787 else if (nbytes
< repsize
)
4794 /* Compute the number of leading nonzero bytes in the representation
4795 and update the minimum and maximum. */
4796 unsigned n
= prep
? strnlen (prep
, nbytes
) : nbytes
;
4798 if (n
< lenrange
[0])
4800 if (lenrange
[1] < n
)
4803 /* Set the size of the representation. */
4804 if (lenrange
[2] < nbytes
)
4805 lenrange
[2] = nbytes
;
4807 /* Clear NULTERM if none of the bytes is zero. */
4813 /* When the initial number of non-zero bytes N is non-zero, reset
4814 *ALLNUL; if N is less than that the size of the representation
4815 also clear *ALLNONNUL. */
4820 else if (*allnul
|| *allnonnul
)
4826 /* When either ALLNUL is set and N is zero, also determine
4827 whether all subsequent bytes after the first one (which
4828 is nul) are zero or nonzero and clear ALLNUL if not. */
4829 for (const char *p
= prep
; p
!= prep
+ nbytes
; ++p
)
4841 /* Like count_nonzero_bytes, but instead of counting bytes in EXP, count
4842 bytes that are pointed to by EXP, which should be a pointer. */
4845 count_nonzero_bytes_addr (tree exp
, unsigned HOST_WIDE_INT offset
,
4846 unsigned HOST_WIDE_INT nbytes
,
4847 unsigned lenrange
[3], bool *nulterm
,
4848 bool *allnul
, bool *allnonnul
,
4849 range_query
*rvals
, ssa_name_limit_t
&snlim
)
4851 int idx
= get_stridx (exp
);
4854 strinfo
*si
= get_strinfo (idx
);
4858 /* Handle both constant lengths as well non-constant lengths
4860 unsigned HOST_WIDE_INT minlen
, maxlen
;
4861 if (tree_fits_shwi_p (si
->nonzero_chars
))
4862 minlen
= maxlen
= tree_to_shwi (si
->nonzero_chars
);
4863 else if (si
->nonzero_chars
4864 && TREE_CODE (si
->nonzero_chars
) == SSA_NAME
)
4867 rvals
->range_of_expr (vr
, si
->nonzero_chars
, si
->stmt
);
4868 if (vr
.kind () != VR_RANGE
)
4871 minlen
= tree_to_uhwi (vr
.min ());
4872 maxlen
= tree_to_uhwi (vr
.max ());
4877 if (maxlen
< offset
)
4880 minlen
= minlen
< offset
? 0 : minlen
- offset
;
4882 if (maxlen
+ 1 < nbytes
)
4885 if (nbytes
<= minlen
)
4888 if (nbytes
< minlen
)
4891 if (nbytes
< maxlen
)
4895 if (minlen
< lenrange
[0])
4896 lenrange
[0] = minlen
;
4897 if (lenrange
[1] < maxlen
)
4898 lenrange
[1] = maxlen
;
4900 if (lenrange
[2] < nbytes
)
4901 lenrange
[2] = nbytes
;
4903 /* Since only the length of the string are known and not its contents,
4904 clear ALLNUL and ALLNONNUL purely on the basis of the length. */
4906 if (minlen
< nbytes
)
4912 if (TREE_CODE (exp
) == ADDR_EXPR
)
4913 return count_nonzero_bytes (TREE_OPERAND (exp
, 0), offset
, nbytes
,
4914 lenrange
, nulterm
, allnul
, allnonnul
, rvals
,
4917 if (TREE_CODE (exp
) == SSA_NAME
)
4919 gimple
*stmt
= SSA_NAME_DEF_STMT (exp
);
4920 if (gimple_code (stmt
) == GIMPLE_PHI
)
4922 /* Avoid processing an SSA_NAME that has already been visited
4923 or if an SSA_NAME limit has been reached. Indicate success
4924 if the former and failure if the latter. */
4925 if (int res
= snlim
.next_ssa_name (exp
))
4928 /* Determine the minimum and maximum from the PHI arguments. */
4929 unsigned int n
= gimple_phi_num_args (stmt
);
4930 for (unsigned i
= 0; i
!= n
; i
++)
4932 tree def
= gimple_phi_arg_def (stmt
, i
);
4933 if (!count_nonzero_bytes_addr (def
, offset
, nbytes
, lenrange
,
4934 nulterm
, allnul
, allnonnul
, rvals
,
4943 /* Otherwise we don't know anything. */
4945 if (lenrange
[1] < nbytes
)
4946 lenrange
[1] = nbytes
;
4947 if (lenrange
[2] < nbytes
)
4948 lenrange
[2] = nbytes
;
4955 /* Same as above except with an implicit SSA_NAME limit. RVALS is used
4956 to determine ranges of dynamically computed string lengths (the results
4960 count_nonzero_bytes (tree exp
, unsigned lenrange
[3], bool *nulterm
,
4961 bool *allnul
, bool *allnonnul
, range_query
*rvals
)
4963 /* Set to optimistic values so the caller doesn't have to worry about
4964 initializing these and to what. On success, the function will clear
4965 these if it determines their values are different but being recursive
4966 it never sets either to true. On failure, their values are
4972 ssa_name_limit_t snlim
;
4973 return count_nonzero_bytes (exp
, 0, 0, lenrange
, nulterm
, allnul
, allnonnul
,
4977 /* Handle a single or multibyte store other than by a built-in function,
4978 either via a single character assignment or by multi-byte assignment
4979 either via MEM_REF or via a type other than char (such as in
4980 '*(int*)a = 12345'). Return true to let the caller advance *GSI to
4981 the next statement in the basic block and false otherwise. */
4984 handle_store (gimple_stmt_iterator
*gsi
, bool *zero_write
,
4989 gimple
*stmt
= gsi_stmt (*gsi
);
4990 tree ssaname
= NULL_TREE
, lhs
= gimple_assign_lhs (stmt
);
4991 tree rhs
= gimple_assign_rhs1 (stmt
);
4993 /* The offset of the first byte in LHS modified by the store. */
4994 unsigned HOST_WIDE_INT offset
= 0;
4996 if (TREE_CODE (lhs
) == MEM_REF
4997 && TREE_CODE (TREE_OPERAND (lhs
, 0)) == SSA_NAME
)
4999 tree mem_offset
= TREE_OPERAND (lhs
, 1);
5000 if (tree_fits_uhwi_p (mem_offset
))
5002 /* Get the strinfo for the base, and use it if it starts with at
5003 least OFFSET nonzero characters. This is trivially true if
5005 offset
= tree_to_uhwi (mem_offset
);
5006 idx
= get_stridx (TREE_OPERAND (lhs
, 0));
5008 si
= get_strinfo (idx
);
5010 ssaname
= TREE_OPERAND (lhs
, 0);
5011 else if (si
== NULL
|| compare_nonzero_chars (si
, offset
, rvals
) < 0)
5013 *zero_write
= initializer_zerop (rhs
);
5016 unsigned lenrange
[] = { UINT_MAX
, 0, 0 };
5017 if (count_nonzero_bytes (rhs
, lenrange
, &dummy
, &dummy
, &dummy
,
5019 maybe_warn_overflow (stmt
, lenrange
[2], rvals
);
5027 idx
= get_addr_stridx (lhs
, NULL_TREE
, &offset
, rvals
);
5029 si
= get_strinfo (idx
);
5032 /* Minimum and maximum leading non-zero bytes and the size of the store. */
5033 unsigned lenrange
[] = { UINT_MAX
, 0, 0 };
5035 /* Set to the minimum length of the string being assigned if known. */
5036 unsigned HOST_WIDE_INT rhs_minlen
;
5038 /* STORING_NONZERO_P is true iff not all stored characters are zero.
5039 STORING_ALL_NONZERO_P is true if all stored characters are zero.
5040 STORING_ALL_ZEROS_P is true iff all stored characters are zero.
5041 Both are false when it's impossible to determine which is true. */
5042 bool storing_nonzero_p
;
5043 bool storing_all_nonzero_p
;
5044 bool storing_all_zeros_p
;
5045 /* FULL_STRING_P is set when the stored sequence of characters form
5046 a nul-terminated string. */
5049 const bool ranges_valid
5050 = count_nonzero_bytes (rhs
, lenrange
, &full_string_p
,
5051 &storing_all_zeros_p
, &storing_all_nonzero_p
,
5055 rhs_minlen
= lenrange
[0];
5056 storing_nonzero_p
= lenrange
[1] > 0;
5057 *zero_write
= storing_all_zeros_p
;
5059 maybe_warn_overflow (stmt
, lenrange
[2], rvals
);
5063 rhs_minlen
= HOST_WIDE_INT_M1U
;
5064 full_string_p
= false;
5065 storing_nonzero_p
= false;
5066 storing_all_zeros_p
= false;
5067 storing_all_nonzero_p
= false;
5072 /* The corresponding element is set to 1 if the first and last
5073 element, respectively, of the sequence of characters being
5074 written over the string described by SI ends before
5075 the terminating nul (if it has one), to zero if the nul is
5076 being overwritten but not beyond, or negative otherwise. */
5077 int store_before_nul
[2];
5080 /* The offset of the last stored byte. */
5081 unsigned HOST_WIDE_INT endoff
= offset
+ lenrange
[2] - 1;
5082 store_before_nul
[0] = compare_nonzero_chars (si
, offset
, rvals
);
5083 if (endoff
== offset
)
5084 store_before_nul
[1] = store_before_nul
[0];
5086 store_before_nul
[1] = compare_nonzero_chars (si
, endoff
, rvals
);
5090 store_before_nul
[0] = compare_nonzero_chars (si
, offset
, rvals
);
5091 store_before_nul
[1] = store_before_nul
[0];
5092 gcc_assert (offset
== 0 || store_before_nul
[0] >= 0);
5095 if (storing_all_zeros_p
5096 && store_before_nul
[0] == 0
5097 && store_before_nul
[1] == 0
5098 && si
->full_string_p
)
5100 /* When overwriting a '\0' with a '\0', the store can be removed
5101 if we know it has been stored in the current function. */
5102 if (!stmt_could_throw_p (cfun
, stmt
) && si
->writable
)
5104 unlink_stmt_vdef (stmt
);
5105 release_defs (stmt
);
5106 gsi_remove (gsi
, true);
5111 si
->writable
= true;
5117 if (store_before_nul
[1] > 0
5118 && storing_nonzero_p
5119 && lenrange
[0] == lenrange
[1]
5120 && lenrange
[0] == lenrange
[2]
5121 && TREE_CODE (TREE_TYPE (rhs
)) == INTEGER_TYPE
)
5123 /* Handle a store of one or more non-nul characters that ends
5124 before the terminating nul of the destination and so does
5125 not affect its length
5126 If si->nonzero_chars > OFFSET, we aren't overwriting '\0',
5127 and if we aren't storing '\0', we know that the length of
5128 the string and any other zero terminated string in memory
5129 remains the same. In that case we move to the next gimple
5130 statement and return to signal the caller that it shouldn't
5131 invalidate anything.
5133 This is beneficial for cases like:
5138 strcpy (p, "foobar");
5139 size_t len = strlen (p); // can be folded to 6
5140 size_t len2 = strlen (q); // has to be computed
5142 size_t len3 = strlen (p); // can be folded to 6
5143 size_t len4 = strlen (q); // can be folded to len2
5144 bar (len, len2, len3, len4);
5150 if (storing_all_zeros_p
5151 || storing_nonzero_p
5152 || (offset
!= 0 && store_before_nul
[1] > 0))
5154 /* When STORING_NONZERO_P, we know that the string will start
5155 with at least OFFSET + 1 nonzero characters. If storing
5156 a single character, set si->NONZERO_CHARS to the result.
5157 If storing multiple characters, try to determine the number
5158 of leading non-zero characters and set si->NONZERO_CHARS to
5161 When STORING_ALL_ZEROS_P, we know that the string is now
5162 OFFSET characters long.
5164 Otherwise, we're storing an unknown value at offset OFFSET,
5165 so need to clip the nonzero_chars to OFFSET.
5166 Use the minimum length of the string (or individual character)
5167 being stored if it's known. Otherwise, STORING_NONZERO_P
5168 guarantees it's at least 1. */
5170 = storing_nonzero_p
&& ranges_valid
? lenrange
[0] : 1;
5171 location_t loc
= gimple_location (stmt
);
5172 tree oldlen
= si
->nonzero_chars
;
5173 if (store_before_nul
[1] == 0 && si
->full_string_p
)
5174 /* We're overwriting the nul terminator with a nonzero or
5175 unknown character. If the previous stmt was a memcpy,
5176 its length may be decreased. */
5177 adjust_last_stmt (si
, stmt
, false);
5178 si
= unshare_strinfo (si
);
5179 if (storing_nonzero_p
)
5181 gcc_assert (len
>= 0);
5182 si
->nonzero_chars
= build_int_cst (size_type_node
, offset
+ len
);
5185 si
->nonzero_chars
= build_int_cst (size_type_node
, offset
);
5187 /* Set FULL_STRING_P only if the length of the strings being
5188 written is the same, and clear it if the strings have
5189 different lengths. In the latter case the length stored
5190 in si->NONZERO_CHARS becomes the lower bound.
5191 FIXME: Handle the upper bound of the length if possible. */
5192 si
->full_string_p
= full_string_p
&& lenrange
[0] == lenrange
[1];
5194 if (storing_all_zeros_p
5196 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssaname
))
5197 si
->endptr
= ssaname
;
5202 si
->writable
= true;
5203 si
->dont_invalidate
= true;
5206 tree adj
= fold_build2_loc (loc
, MINUS_EXPR
, size_type_node
,
5207 si
->nonzero_chars
, oldlen
);
5208 adjust_related_strinfos (loc
, si
, adj
);
5214 else if (idx
== 0 && (storing_all_zeros_p
|| storing_nonzero_p
))
5217 idx
= new_stridx (ssaname
);
5219 idx
= new_addr_stridx (lhs
);
5222 tree ptr
= (ssaname
? ssaname
: build_fold_addr_expr (lhs
));
5225 if (storing_all_zeros_p
)
5227 else if (storing_nonzero_p
&& ranges_valid
)
5229 /* FIXME: Handle the upper bound of the length when
5230 LENRANGE[0] != LENRANGE[1]. */
5232 if (lenrange
[0] != lenrange
[1])
5233 /* Set the minimum length but ignore the maximum
5235 full_string_p
= false;
5240 tree len
= (slen
<= 0
5242 : build_int_cst (size_type_node
, slen
));
5243 si
= new_strinfo (ptr
, idx
, len
, slen
>= 0 && full_string_p
);
5244 set_strinfo (idx
, si
);
5245 if (storing_all_zeros_p
5247 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssaname
))
5248 si
->endptr
= ssaname
;
5249 si
->dont_invalidate
= true;
5250 si
->writable
= true;
5254 && rhs_minlen
< HOST_WIDE_INT_M1U
5255 && ssaname
== NULL_TREE
5256 && TREE_CODE (TREE_TYPE (lhs
)) == ARRAY_TYPE
)
5258 HOST_WIDE_INT a
= int_size_in_bytes (TREE_TYPE (lhs
));
5259 if (a
> 0 && (unsigned HOST_WIDE_INT
) a
> rhs_minlen
)
5261 int idx
= new_addr_stridx (lhs
);
5264 si
= new_strinfo (build_fold_addr_expr (lhs
), idx
,
5265 build_int_cst (size_type_node
, rhs_minlen
),
5267 set_strinfo (idx
, si
);
5268 si
->dont_invalidate
= true;
5273 if (si
!= NULL
&& offset
== 0 && storing_all_zeros_p
&& lenrange
[2] == 1)
5275 /* For single-byte stores only, allow adjust_last_stmt to remove
5276 the statement if the stored '\0' is immediately overwritten. */
5277 laststmt
.stmt
= stmt
;
5278 laststmt
.len
= build_int_cst (size_type_node
, 1);
5279 laststmt
.stridx
= si
->idx
;
5284 /* Try to fold strstr (s, t) eq/ne s to strncmp (s, t, strlen (t)) eq/ne 0. */
5287 fold_strstr_to_strncmp (tree rhs1
, tree rhs2
, gimple
*stmt
)
5289 if (TREE_CODE (rhs1
) != SSA_NAME
5290 || TREE_CODE (rhs2
) != SSA_NAME
)
5293 gimple
*call_stmt
= NULL
;
5294 for (int pass
= 0; pass
< 2; pass
++)
5296 gimple
*g
= SSA_NAME_DEF_STMT (rhs1
);
5297 if (gimple_call_builtin_p (g
, BUILT_IN_STRSTR
)
5298 && has_single_use (rhs1
)
5299 && gimple_call_arg (g
, 0) == rhs2
)
5304 std::swap (rhs1
, rhs2
);
5309 tree arg0
= gimple_call_arg (call_stmt
, 0);
5313 tree arg1
= gimple_call_arg (call_stmt
, 1);
5314 tree arg1_len
= NULL_TREE
;
5315 int idx
= get_stridx (arg1
);
5320 arg1_len
= build_int_cst (size_type_node
, ~idx
);
5323 strinfo
*si
= get_strinfo (idx
);
5325 arg1_len
= get_string_length (si
);
5329 if (arg1_len
!= NULL_TREE
)
5331 gimple_stmt_iterator gsi
= gsi_for_stmt (call_stmt
);
5332 tree strncmp_decl
= builtin_decl_explicit (BUILT_IN_STRNCMP
);
5334 if (!is_gimple_val (arg1_len
))
5336 tree arg1_len_tmp
= make_ssa_name (TREE_TYPE (arg1_len
));
5337 gassign
*arg1_stmt
= gimple_build_assign (arg1_len_tmp
,
5339 gsi_insert_before (&gsi
, arg1_stmt
, GSI_SAME_STMT
);
5340 arg1_len
= arg1_len_tmp
;
5343 gcall
*strncmp_call
= gimple_build_call (strncmp_decl
, 3,
5344 arg0
, arg1
, arg1_len
);
5345 tree strncmp_lhs
= make_ssa_name (integer_type_node
);
5346 gimple_set_vuse (strncmp_call
, gimple_vuse (call_stmt
));
5347 gimple_call_set_lhs (strncmp_call
, strncmp_lhs
);
5348 gsi_remove (&gsi
, true);
5349 gsi_insert_before (&gsi
, strncmp_call
, GSI_SAME_STMT
);
5350 tree zero
= build_zero_cst (TREE_TYPE (strncmp_lhs
));
5352 if (is_gimple_assign (stmt
))
5354 if (gimple_assign_rhs_code (stmt
) == COND_EXPR
)
5356 tree cond
= gimple_assign_rhs1 (stmt
);
5357 TREE_OPERAND (cond
, 0) = strncmp_lhs
;
5358 TREE_OPERAND (cond
, 1) = zero
;
5362 gimple_assign_set_rhs1 (stmt
, strncmp_lhs
);
5363 gimple_assign_set_rhs2 (stmt
, zero
);
5368 gcond
*cond
= as_a
<gcond
*> (stmt
);
5369 gimple_cond_set_lhs (cond
, strncmp_lhs
);
5370 gimple_cond_set_rhs (cond
, zero
);
5378 /* Return true if TYPE corresponds to a narrow character type. */
5381 is_char_type (tree type
)
5383 return (TREE_CODE (type
) == INTEGER_TYPE
5384 && TYPE_MODE (type
) == TYPE_MODE (char_type_node
)
5385 && TYPE_PRECISION (type
) == TYPE_PRECISION (char_type_node
));
5388 /* Check the built-in call at GSI for validity and optimize it.
5389 Uses RVALS to determine range information.
5390 Return true to let the caller advance *GSI to the next statement
5391 in the basic block and false otherwise. */
5394 strlen_check_and_optimize_call (gimple_stmt_iterator
*gsi
, bool *zero_write
,
5397 gimple
*stmt
= gsi_stmt (*gsi
);
5399 if (!gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
))
5401 tree fntype
= gimple_call_fntype (stmt
);
5402 if (fntype
&& lookup_attribute ("alloc_size", TYPE_ATTRIBUTES (fntype
)))
5403 handle_alloc_call (BUILT_IN_NONE
, gsi
);
5406 /* When not optimizing we must be checking printf calls which
5407 we do even for user-defined functions when they are declared
5408 with attribute format. */
5409 if (!flag_optimize_strlen
5411 || !valid_builtin_call (stmt
))
5412 return !handle_printf_call (gsi
, rvals
);
5414 tree callee
= gimple_call_fndecl (stmt
);
5415 switch (DECL_FUNCTION_CODE (callee
))
5417 case BUILT_IN_STRLEN
:
5418 case BUILT_IN_STRNLEN
:
5419 handle_builtin_strlen (gsi
);
5421 case BUILT_IN_STRCHR
:
5422 handle_builtin_strchr (gsi
);
5424 case BUILT_IN_STRCPY
:
5425 case BUILT_IN_STRCPY_CHK
:
5426 case BUILT_IN_STPCPY
:
5427 case BUILT_IN_STPCPY_CHK
:
5428 handle_builtin_strcpy (DECL_FUNCTION_CODE (callee
), gsi
, rvals
);
5431 case BUILT_IN_STRNCAT
:
5432 case BUILT_IN_STRNCAT_CHK
:
5433 handle_builtin_strncat (DECL_FUNCTION_CODE (callee
), gsi
);
5436 case BUILT_IN_STPNCPY
:
5437 case BUILT_IN_STPNCPY_CHK
:
5438 case BUILT_IN_STRNCPY
:
5439 case BUILT_IN_STRNCPY_CHK
:
5440 handle_builtin_stxncpy_strncat (false, gsi
);
5443 case BUILT_IN_MEMCPY
:
5444 case BUILT_IN_MEMCPY_CHK
:
5445 case BUILT_IN_MEMPCPY
:
5446 case BUILT_IN_MEMPCPY_CHK
:
5447 handle_builtin_memcpy (DECL_FUNCTION_CODE (callee
), gsi
, rvals
);
5449 case BUILT_IN_STRCAT
:
5450 case BUILT_IN_STRCAT_CHK
:
5451 handle_builtin_strcat (DECL_FUNCTION_CODE (callee
), gsi
);
5453 case BUILT_IN_ALLOCA
:
5454 case BUILT_IN_ALLOCA_WITH_ALIGN
:
5455 case BUILT_IN_MALLOC
:
5456 case BUILT_IN_CALLOC
:
5457 handle_alloc_call (DECL_FUNCTION_CODE (callee
), gsi
);
5459 case BUILT_IN_MEMSET
:
5460 if (handle_builtin_memset (gsi
, zero_write
, rvals
))
5463 case BUILT_IN_MEMCMP
:
5464 if (handle_builtin_memcmp (gsi
))
5467 case BUILT_IN_STRCMP
:
5468 case BUILT_IN_STRNCMP
:
5469 if (handle_builtin_string_cmp (gsi
, rvals
))
5473 if (handle_printf_call (gsi
, rvals
))
5481 /* Handle an assignment statement at *GSI to a LHS of integral type.
5482 If GSI's basic block needs clean-up of EH, set *CLEANUP_EH to true. */
5485 handle_integral_assign (gimple_stmt_iterator
*gsi
, bool *cleanup_eh
,
5488 gimple
*stmt
= gsi_stmt (*gsi
);
5489 tree lhs
= gimple_assign_lhs (stmt
);
5490 tree lhs_type
= TREE_TYPE (lhs
);
5492 enum tree_code code
= gimple_assign_rhs_code (stmt
);
5493 if (code
== COND_EXPR
)
5495 tree cond
= gimple_assign_rhs1 (stmt
);
5496 enum tree_code cond_code
= TREE_CODE (cond
);
5498 if (cond_code
== EQ_EXPR
|| cond_code
== NE_EXPR
)
5499 fold_strstr_to_strncmp (TREE_OPERAND (cond
, 0),
5500 TREE_OPERAND (cond
, 1), stmt
);
5502 else if (code
== EQ_EXPR
|| code
== NE_EXPR
)
5503 fold_strstr_to_strncmp (gimple_assign_rhs1 (stmt
),
5504 gimple_assign_rhs2 (stmt
), stmt
);
5505 else if (gimple_assign_load_p (stmt
)
5506 && TREE_CODE (lhs_type
) == INTEGER_TYPE
5507 && TYPE_MODE (lhs_type
) == TYPE_MODE (char_type_node
)
5508 && (TYPE_PRECISION (lhs_type
)
5509 == TYPE_PRECISION (char_type_node
))
5510 && !gimple_has_volatile_ops (stmt
))
5512 tree off
= integer_zero_node
;
5513 unsigned HOST_WIDE_INT coff
= 0;
5515 tree rhs1
= gimple_assign_rhs1 (stmt
);
5516 if (code
== MEM_REF
)
5518 idx
= get_stridx (TREE_OPERAND (rhs1
, 0));
5521 strinfo
*si
= get_strinfo (idx
);
5523 && si
->nonzero_chars
5524 && TREE_CODE (si
->nonzero_chars
) == INTEGER_CST
5525 && (wi::to_widest (si
->nonzero_chars
)
5526 >= wi::to_widest (off
)))
5527 off
= TREE_OPERAND (rhs1
, 1);
5529 /* This case is not useful. See if get_addr_stridx
5530 returns something usable. */
5535 idx
= get_addr_stridx (rhs1
, NULL_TREE
, &coff
);
5538 strinfo
*si
= get_strinfo (idx
);
5540 && si
->nonzero_chars
5541 && TREE_CODE (si
->nonzero_chars
) == INTEGER_CST
)
5543 widest_int w1
= wi::to_widest (si
->nonzero_chars
);
5544 widest_int w2
= wi::to_widest (off
) + coff
;
5546 && si
->full_string_p
)
5548 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
5550 fprintf (dump_file
, "Optimizing: ");
5551 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
5554 /* Reading the final '\0' character. */
5555 tree zero
= build_int_cst (lhs_type
, 0);
5556 gimple_set_vuse (stmt
, NULL_TREE
);
5557 gimple_assign_set_rhs_from_tree (gsi
, zero
);
5559 |= maybe_clean_or_replace_eh_stmt (stmt
,
5561 stmt
= gsi_stmt (*gsi
);
5564 if (dump_file
&& (dump_flags
& TDF_DETAILS
) != 0)
5566 fprintf (dump_file
, "into: ");
5567 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
5572 /* Reading a character before the final '\0'
5573 character. Just set the value range to ~[0, 0]
5574 if we don't have anything better. */
5576 signop sign
= TYPE_SIGN (lhs_type
);
5577 int prec
= TYPE_PRECISION (lhs_type
);
5578 // FIXME: Use range_query instead of global ranges.
5579 value_range_kind vr
= get_range_info (lhs
, &min
, &max
);
5580 if (vr
== VR_VARYING
5582 && min
== wi::min_value (prec
, sign
)
5583 && max
== wi::max_value (prec
, sign
)))
5584 set_range_info (lhs
, VR_ANTI_RANGE
,
5585 wi::zero (prec
), wi::zero (prec
));
5590 else if (code
== MEM_REF
&& TREE_CODE (lhs
) == SSA_NAME
)
5592 if (int idx
= new_stridx (lhs
))
5594 /* Record multi-byte assignments from MEM_REFs. */
5595 bool storing_all_nonzero_p
;
5596 bool storing_all_zeros_p
;
5598 unsigned lenrange
[] = { UINT_MAX
, 0, 0 };
5599 tree rhs
= gimple_assign_rhs1 (stmt
);
5600 const bool ranges_valid
5601 = count_nonzero_bytes (rhs
, lenrange
, &full_string_p
,
5602 &storing_all_zeros_p
, &storing_all_nonzero_p
,
5606 tree length
= build_int_cst (sizetype
, lenrange
[0]);
5607 strinfo
*si
= new_strinfo (lhs
, idx
, length
, full_string_p
);
5608 set_strinfo (idx
, si
);
5609 si
->writable
= true;
5610 si
->dont_invalidate
= true;
5615 if (strlen_to_stridx
)
5617 tree rhs1
= gimple_assign_rhs1 (stmt
);
5618 if (stridx_strlenloc
*ps
= strlen_to_stridx
->get (rhs1
))
5619 strlen_to_stridx
->put (lhs
, stridx_strlenloc (*ps
));
5623 /* Attempt to check for validity of the performed access a single statement
5624 at *GSI using string length knowledge, and to optimize it.
5625 If the given basic block needs clean-up of EH, CLEANUP_EH is set to
5626 true. Return true to let the caller advance *GSI to the next statement
5627 in the basic block and false otherwise. */
5630 check_and_optimize_stmt (gimple_stmt_iterator
*gsi
, bool *cleanup_eh
,
5633 gimple
*stmt
= gsi_stmt (*gsi
);
5635 /* For statements that modify a string, set to true if the write
5637 bool zero_write
= false;
5639 if (is_gimple_call (stmt
))
5641 if (!strlen_check_and_optimize_call (gsi
, &zero_write
, rvals
))
5644 else if (!flag_optimize_strlen
|| !strlen_optimize
)
5646 else if (is_gimple_assign (stmt
) && !gimple_clobber_p (stmt
))
5648 /* Handle non-clobbering assignment. */
5649 tree lhs
= gimple_assign_lhs (stmt
);
5650 tree lhs_type
= TREE_TYPE (lhs
);
5652 if (TREE_CODE (lhs
) == SSA_NAME
&& POINTER_TYPE_P (lhs_type
))
5654 if (gimple_assign_single_p (stmt
)
5655 || (gimple_assign_cast_p (stmt
)
5656 && POINTER_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt
)))))
5658 int idx
= get_stridx (gimple_assign_rhs1 (stmt
));
5659 ssa_ver_to_stridx
[SSA_NAME_VERSION (lhs
)] = idx
;
5661 else if (gimple_assign_rhs_code (stmt
) == POINTER_PLUS_EXPR
)
5662 handle_pointer_plus (gsi
);
5664 else if (TREE_CODE (lhs
) == SSA_NAME
&& INTEGRAL_TYPE_P (lhs_type
))
5665 /* Handle assignment to a character. */
5666 handle_integral_assign (gsi
, cleanup_eh
, rvals
);
5667 else if (TREE_CODE (lhs
) != SSA_NAME
&& !TREE_SIDE_EFFECTS (lhs
))
5669 tree type
= TREE_TYPE (lhs
);
5670 if (TREE_CODE (type
) == ARRAY_TYPE
)
5671 type
= TREE_TYPE (type
);
5673 bool is_char_store
= is_char_type (type
);
5674 if (!is_char_store
&& TREE_CODE (lhs
) == MEM_REF
)
5676 /* To consider stores into char objects via integer types
5677 other than char but not those to non-character objects,
5678 determine the type of the destination rather than just
5679 the type of the access. */
5680 for (int i
= 0; i
!= 2; ++i
)
5682 tree ref
= TREE_OPERAND (lhs
, i
);
5683 type
= TREE_TYPE (ref
);
5684 if (TREE_CODE (type
) == POINTER_TYPE
)
5685 type
= TREE_TYPE (type
);
5686 if (TREE_CODE (type
) == ARRAY_TYPE
)
5687 type
= TREE_TYPE (type
);
5688 if (is_char_type (type
))
5690 is_char_store
= true;
5696 /* Handle a single or multibyte assignment. */
5697 if (is_char_store
&& !handle_store (gsi
, &zero_write
, rvals
))
5701 else if (gcond
*cond
= dyn_cast
<gcond
*> (stmt
))
5703 enum tree_code code
= gimple_cond_code (cond
);
5704 if (code
== EQ_EXPR
|| code
== NE_EXPR
)
5705 fold_strstr_to_strncmp (gimple_cond_lhs (stmt
),
5706 gimple_cond_rhs (stmt
), stmt
);
5709 if (gimple_vdef (stmt
))
5710 maybe_invalidate (stmt
, zero_write
);
5714 /* Recursively call maybe_invalidate on stmts that might be executed
5715 in between dombb and current bb and that contain a vdef. Stop when
5716 *count stmts are inspected, or if the whole strinfo vector has
5717 been invalidated. */
5720 do_invalidate (basic_block dombb
, gimple
*phi
, bitmap visited
, int *count
)
5722 unsigned int i
, n
= gimple_phi_num_args (phi
);
5724 for (i
= 0; i
< n
; i
++)
5726 tree vuse
= gimple_phi_arg_def (phi
, i
);
5727 gimple
*stmt
= SSA_NAME_DEF_STMT (vuse
);
5728 basic_block bb
= gimple_bb (stmt
);
5731 || !bitmap_set_bit (visited
, bb
->index
)
5732 || !dominated_by_p (CDI_DOMINATORS
, bb
, dombb
))
5736 if (gimple_code (stmt
) == GIMPLE_PHI
)
5738 do_invalidate (dombb
, stmt
, visited
, count
);
5745 if (!maybe_invalidate (stmt
))
5750 vuse
= gimple_vuse (stmt
);
5751 stmt
= SSA_NAME_DEF_STMT (vuse
);
5752 if (gimple_bb (stmt
) != bb
)
5754 bb
= gimple_bb (stmt
);
5757 || !bitmap_set_bit (visited
, bb
->index
)
5758 || !dominated_by_p (CDI_DOMINATORS
, bb
, dombb
))
5765 class strlen_dom_walker
: public dom_walker
5768 strlen_dom_walker (cdi_direction direction
)
5769 : dom_walker (direction
),
5771 m_cleanup_cfg (false)
5774 virtual edge
before_dom_children (basic_block
);
5775 virtual void after_dom_children (basic_block
);
5777 /* EVRP analyzer used for printf argument range processing, and
5778 to track strlen results across integer variable assignments. */
5779 evrp_range_analyzer evrp
;
5781 /* Flag that will trigger TODO_cleanup_cfg to be returned in strlen
5782 execute function. */
5786 /* Callback for walk_dominator_tree. Attempt to optimize various
5787 string ops by remembering string lengths pointed by pointer SSA_NAMEs. */
5790 strlen_dom_walker::before_dom_children (basic_block bb
)
5794 basic_block dombb
= get_immediate_dominator (CDI_DOMINATORS
, bb
);
5797 stridx_to_strinfo
= NULL
;
5800 stridx_to_strinfo
= ((vec
<strinfo
*, va_heap
, vl_embed
> *) dombb
->aux
);
5801 if (stridx_to_strinfo
)
5803 for (gphi_iterator gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
);
5806 gphi
*phi
= gsi
.phi ();
5807 if (virtual_operand_p (gimple_phi_result (phi
)))
5809 bitmap visited
= BITMAP_ALLOC (NULL
);
5810 int count_vdef
= 100;
5811 do_invalidate (dombb
, phi
, visited
, &count_vdef
);
5812 BITMAP_FREE (visited
);
5813 if (count_vdef
== 0)
5815 /* If there were too many vdefs in between immediate
5816 dominator and current bb, invalidate everything.
5817 If stridx_to_strinfo has been unshared, we need
5818 to free it, otherwise just set it to NULL. */
5819 if (!strinfo_shared ())
5825 vec_safe_iterate (stridx_to_strinfo
, i
, &si
);
5829 (*stridx_to_strinfo
)[i
] = NULL
;
5833 stridx_to_strinfo
= NULL
;
5841 /* If all PHI arguments have the same string index, the PHI result
5843 for (gphi_iterator gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
);
5846 gphi
*phi
= gsi
.phi ();
5847 tree result
= gimple_phi_result (phi
);
5848 if (!virtual_operand_p (result
) && POINTER_TYPE_P (TREE_TYPE (result
)))
5850 int idx
= get_stridx (gimple_phi_arg_def (phi
, 0));
5853 unsigned int i
, n
= gimple_phi_num_args (phi
);
5854 for (i
= 1; i
< n
; i
++)
5855 if (idx
!= get_stridx (gimple_phi_arg_def (phi
, i
)))
5858 ssa_ver_to_stridx
[SSA_NAME_VERSION (result
)] = idx
;
5863 bool cleanup_eh
= false;
5865 /* Attempt to optimize individual statements. */
5866 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); )
5868 gimple
*stmt
= gsi_stmt (gsi
);
5870 /* First record ranges generated by this statement so they
5871 can be used by printf argument processing. */
5872 evrp
.record_ranges_from_stmt (stmt
, false);
5874 if (check_and_optimize_stmt (&gsi
, &cleanup_eh
, &evrp
))
5878 if (cleanup_eh
&& gimple_purge_dead_eh_edges (bb
))
5879 m_cleanup_cfg
= true;
5881 bb
->aux
= stridx_to_strinfo
;
5882 if (vec_safe_length (stridx_to_strinfo
) && !strinfo_shared ())
5883 (*stridx_to_strinfo
)[0] = (strinfo
*) bb
;
5887 /* Callback for walk_dominator_tree. Free strinfo vector if it is
5888 owned by the current bb, clear bb->aux. */
5891 strlen_dom_walker::after_dom_children (basic_block bb
)
5897 stridx_to_strinfo
= ((vec
<strinfo
*, va_heap
, vl_embed
> *) bb
->aux
);
5898 if (vec_safe_length (stridx_to_strinfo
)
5899 && (*stridx_to_strinfo
)[0] == (strinfo
*) bb
)
5904 for (i
= 1; vec_safe_iterate (stridx_to_strinfo
, i
, &si
); ++i
)
5906 vec_free (stridx_to_strinfo
);
5915 printf_strlen_execute (function
*fun
, bool warn_only
)
5917 strlen_optimize
= !warn_only
;
5919 calculate_dominance_info (CDI_DOMINATORS
);
5921 bool use_scev
= optimize
> 0 && flag_printf_return_value
;
5924 loop_optimizer_init (LOOPS_NORMAL
);
5928 gcc_assert (!strlen_to_stridx
);
5929 if (warn_stringop_overflow
|| warn_stringop_truncation
)
5930 strlen_to_stridx
= new hash_map
<tree
, stridx_strlenloc
> ();
5932 /* This has to happen after initializing the loop optimizer
5933 and initializing SCEV as they create new SSA_NAMEs. */
5934 ssa_ver_to_stridx
.safe_grow_cleared (num_ssa_names
, true);
5937 /* String length optimization is implemented as a walk of the dominator
5938 tree and a forward walk of statements within each block. */
5939 strlen_dom_walker
walker (CDI_DOMINATORS
);
5940 walker
.walk (ENTRY_BLOCK_PTR_FOR_FN (fun
));
5942 ssa_ver_to_stridx
.release ();
5943 strinfo_pool
.release ();
5944 if (decl_to_stridxlist_htab
)
5946 obstack_free (&stridx_obstack
, NULL
);
5947 delete decl_to_stridxlist_htab
;
5948 decl_to_stridxlist_htab
= NULL
;
5950 laststmt
.stmt
= NULL
;
5951 laststmt
.len
= NULL_TREE
;
5952 laststmt
.stridx
= 0;
5954 if (strlen_to_stridx
)
5956 strlen_to_stridx
->empty ();
5957 delete strlen_to_stridx
;
5958 strlen_to_stridx
= NULL
;
5964 loop_optimizer_finalize ();
5967 /* Clean up object size info. */
5968 fini_object_sizes ();
5970 return walker
.m_cleanup_cfg
? TODO_cleanup_cfg
: 0;
5973 /* This file defines two passes: one for warnings that runs only when
5974 optimization is disabled, and another that implements optimizations
5975 and also issues warnings. */
5977 const pass_data pass_data_warn_printf
=
5979 GIMPLE_PASS
, /* type */
5980 "warn-printf", /* name */
5981 OPTGROUP_NONE
, /* optinfo_flags */
5982 TV_NONE
, /* tv_id */
5983 /* Normally an optimization pass would require PROP_ssa but because
5984 this pass runs early, with no optimization, to do sprintf format
5985 checking, it only requires PROP_cfg. */
5986 PROP_cfg
, /* properties_required */
5987 0, /* properties_provided */
5988 0, /* properties_destroyed */
5989 0, /* todo_flags_start */
5990 0, /* todo_flags_finish */
5993 class pass_warn_printf
: public gimple_opt_pass
5996 pass_warn_printf (gcc::context
*ctxt
)
5997 : gimple_opt_pass (pass_data_warn_printf
, ctxt
)
6000 virtual bool gate (function
*);
6001 virtual unsigned int execute (function
*fun
)
6003 return printf_strlen_execute (fun
, true);
6008 /* Return true to run the warning pass only when not optimizing and
6009 iff either -Wformat-overflow or -Wformat-truncation is specified. */
6012 pass_warn_printf::gate (function
*)
6014 return !optimize
&& (warn_format_overflow
> 0 || warn_format_trunc
> 0);
6017 const pass_data pass_data_strlen
=
6019 GIMPLE_PASS
, /* type */
6020 "strlen", /* name */
6021 OPTGROUP_NONE
, /* optinfo_flags */
6022 TV_TREE_STRLEN
, /* tv_id */
6023 PROP_cfg
| PROP_ssa
, /* properties_required */
6024 0, /* properties_provided */
6025 0, /* properties_destroyed */
6026 0, /* todo_flags_start */
6027 0, /* todo_flags_finish */
6030 class pass_strlen
: public gimple_opt_pass
6033 pass_strlen (gcc::context
*ctxt
)
6034 : gimple_opt_pass (pass_data_strlen
, ctxt
)
6037 opt_pass
* clone () { return new pass_strlen (m_ctxt
); }
6039 virtual bool gate (function
*);
6040 virtual unsigned int execute (function
*fun
)
6042 return printf_strlen_execute (fun
, false);
6046 /* Return true to run the pass only when the sprintf and/or strlen
6047 optimizations are enabled and -Wformat-overflow or -Wformat-truncation
6051 pass_strlen::gate (function
*)
6053 return ((warn_format_overflow
> 0
6054 || warn_format_trunc
> 0
6055 || warn_restrict
> 0
6056 || flag_optimize_strlen
> 0
6057 || flag_printf_return_value
)
6064 make_pass_warn_printf (gcc::context
*ctxt
)
6066 return new pass_warn_printf (ctxt
);
6070 make_pass_strlen (gcc::context
*ctxt
)
6072 return new pass_strlen (ctxt
);