Branch data Line data Source code
1 : : /* Definitions of the pointer_query and related classes.
2 : :
3 : : Copyright (C) 2020-2024 Free Software Foundation, Inc.
4 : :
5 : : This file is part of GCC.
6 : :
7 : : GCC is free software; you can redistribute it and/or modify it under
8 : : the terms of the GNU General Public License as published by the Free
9 : : Software Foundation; either version 3, or (at your option) any later
10 : : version.
11 : :
12 : : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 : : WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 : : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 : : for more details.
16 : :
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/>. */
20 : :
21 : : #include "config.h"
22 : : #include "system.h"
23 : : #include "coretypes.h"
24 : : #include "backend.h"
25 : : #include "tree.h"
26 : : #include "gimple.h"
27 : : #include "stringpool.h"
28 : : #include "tree-vrp.h"
29 : : #include "diagnostic-core.h"
30 : : #include "fold-const.h"
31 : : #include "tree-object-size.h"
32 : : #include "tree-ssa-strlen.h"
33 : : #include "langhooks.h"
34 : : #include "stringpool.h"
35 : : #include "attribs.h"
36 : : #include "gimple-iterator.h"
37 : : #include "gimple-fold.h"
38 : : #include "gimple-ssa.h"
39 : : #include "intl.h"
40 : : #include "attr-fnspec.h"
41 : : #include "gimple-range.h"
42 : : #include "pointer-query.h"
43 : : #include "tree-pretty-print.h"
44 : : #include "tree-ssanames.h"
45 : : #include "target.h"
46 : :
47 : : static bool compute_objsize_r (tree, gimple *, bool, int, access_ref *,
48 : : ssa_name_limit_t &, pointer_query *);
49 : :
50 : : /* Wrapper around the wide_int overload of get_range that accepts
51 : : offset_int instead. For middle end expressions returns the same
52 : : result. For a subset of nonconstamt expressions emitted by the front
53 : : end determines a more precise range than would be possible otherwise. */
54 : :
55 : : static bool
56 : 4050318 : get_offset_range (tree x, gimple *stmt, offset_int r[2], range_query *rvals)
57 : : {
58 : 4050318 : offset_int add = 0;
59 : 4050318 : if (TREE_CODE (x) == PLUS_EXPR)
60 : : {
61 : : /* Handle constant offsets in pointer addition expressions seen
62 : : n the front end IL. */
63 : 39 : tree op = TREE_OPERAND (x, 1);
64 : 39 : if (TREE_CODE (op) == INTEGER_CST)
65 : : {
66 : 39 : op = fold_convert (signed_type_for (TREE_TYPE (op)), op);
67 : 39 : add = wi::to_offset (op);
68 : 39 : x = TREE_OPERAND (x, 0);
69 : : }
70 : : }
71 : :
72 : 4050318 : if (TREE_CODE (x) == NOP_EXPR)
73 : : /* Also handle conversions to sizetype seen in the front end IL. */
74 : 117 : x = TREE_OPERAND (x, 0);
75 : :
76 : 4050318 : tree type = TREE_TYPE (x);
77 : 4050318 : if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
78 : : return false;
79 : :
80 : 4050309 : if (TREE_CODE (x) != INTEGER_CST
81 : 614368 : && TREE_CODE (x) != SSA_NAME)
82 : : {
83 : 180 : if (TYPE_UNSIGNED (type)
84 : 180 : && TYPE_PRECISION (type) == TYPE_PRECISION (sizetype))
85 : 48 : type = signed_type_for (type);
86 : :
87 : 180 : r[0] = wi::to_offset (TYPE_MIN_VALUE (type)) + add;
88 : 180 : r[1] = wi::to_offset (TYPE_MAX_VALUE (type)) + add;
89 : 180 : return x;
90 : : }
91 : :
92 : 20250645 : wide_int wr[2];
93 : 4050129 : if (!get_range (x, stmt, wr, rvals))
94 : : return false;
95 : :
96 : 3767986 : signop sgn = SIGNED;
97 : : /* Only convert signed integers or unsigned sizetype to a signed
98 : : offset and avoid converting large positive values in narrower
99 : : types to negative offsets. */
100 : 3767986 : if (TYPE_UNSIGNED (type)
101 : 3767986 : && wr[0].get_precision () < TYPE_PRECISION (sizetype))
102 : : sgn = UNSIGNED;
103 : :
104 : 3767986 : r[0] = offset_int::from (wr[0], sgn);
105 : 3767986 : r[1] = offset_int::from (wr[1], sgn);
106 : 3767986 : return true;
107 : 12150387 : }
108 : :
109 : : /* Return the argument that the call STMT to a built-in function returns
110 : : or null if it doesn't. On success, set OFFRNG[] to the range of offsets
111 : : from the argument reflected in the value returned by the built-in if it
112 : : can be determined, otherwise to 0 and HWI_M1U respectively. Set
113 : : *PAST_END for functions like mempcpy that might return a past the end
114 : : pointer (most functions return a dereferenceable pointer to an existing
115 : : element of an array). */
116 : :
117 : : static tree
118 : 312005 : gimple_call_return_array (gimple *stmt, offset_int offrng[2], bool *past_end,
119 : : ssa_name_limit_t &snlim, pointer_query *qry)
120 : : {
121 : : /* Clear and set below for the rare function(s) that might return
122 : : a past-the-end pointer. */
123 : 312005 : *past_end = false;
124 : :
125 : 312005 : {
126 : : /* Check for attribute fn spec to see if the function returns one
127 : : of its arguments. */
128 : 312005 : attr_fnspec fnspec = gimple_call_fnspec (as_a <gcall *>(stmt));
129 : 312005 : unsigned int argno;
130 : 312005 : if (fnspec.returns_arg (&argno))
131 : : {
132 : : /* Functions return the first argument (not a range). */
133 : 4147 : offrng[0] = offrng[1] = 0;
134 : 4147 : return gimple_call_arg (stmt, argno);
135 : : }
136 : : }
137 : :
138 : 307858 : if (gimple_call_num_args (stmt) < 1)
139 : : return NULL_TREE;
140 : :
141 : 295753 : tree fn = gimple_call_fndecl (stmt);
142 : 295753 : if (!gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
143 : : {
144 : : /* See if this is a call to placement new. */
145 : 243113 : if (!fn
146 : 225586 : || !DECL_IS_OPERATOR_NEW_P (fn)
147 : 251136 : || DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fn))
148 : : return NULL_TREE;
149 : :
150 : : /* Check the mangling, keeping in mind that operator new takes
151 : : a size_t which could be unsigned int or unsigned long. */
152 : 8017 : tree fname = DECL_ASSEMBLER_NAME (fn);
153 : 8017 : if (!id_equal (fname, "_ZnwjPv") // ordinary form
154 : 7975 : && !id_equal (fname, "_ZnwmPv") // ordinary form
155 : 523 : && !id_equal (fname, "_ZnajPv") // array form
156 : 8536 : && !id_equal (fname, "_ZnamPv")) // array form
157 : : return NULL_TREE;
158 : :
159 : 7589 : if (gimple_call_num_args (stmt) != 2)
160 : : return NULL_TREE;
161 : :
162 : : /* Allocation functions return a pointer to the beginning. */
163 : 7589 : offrng[0] = offrng[1] = 0;
164 : 7589 : return gimple_call_arg (stmt, 1);
165 : : }
166 : :
167 : 52640 : switch (DECL_FUNCTION_CODE (fn))
168 : : {
169 : 0 : case BUILT_IN_MEMCPY:
170 : 0 : case BUILT_IN_MEMCPY_CHK:
171 : 0 : case BUILT_IN_MEMMOVE:
172 : 0 : case BUILT_IN_MEMMOVE_CHK:
173 : 0 : case BUILT_IN_MEMSET:
174 : 0 : case BUILT_IN_STRCAT:
175 : 0 : case BUILT_IN_STRCAT_CHK:
176 : 0 : case BUILT_IN_STRCPY:
177 : 0 : case BUILT_IN_STRCPY_CHK:
178 : 0 : case BUILT_IN_STRNCAT:
179 : 0 : case BUILT_IN_STRNCAT_CHK:
180 : 0 : case BUILT_IN_STRNCPY:
181 : 0 : case BUILT_IN_STRNCPY_CHK:
182 : : /* Functions return the first argument (not a range). */
183 : 0 : offrng[0] = offrng[1] = 0;
184 : 0 : return gimple_call_arg (stmt, 0);
185 : :
186 : 199 : case BUILT_IN_MEMPCPY:
187 : 199 : case BUILT_IN_MEMPCPY_CHK:
188 : 199 : {
189 : : /* The returned pointer is in a range constrained by the smaller
190 : : of the upper bound of the size argument and the source object
191 : : size. */
192 : 199 : offrng[0] = 0;
193 : 199 : offrng[1] = HOST_WIDE_INT_M1U;
194 : 199 : tree off = gimple_call_arg (stmt, 2);
195 : 199 : bool off_valid = get_offset_range (off, stmt, offrng, qry->rvals);
196 : 199 : if (!off_valid || offrng[0] != offrng[1])
197 : : {
198 : : /* If the offset is either indeterminate or in some range,
199 : : try to constrain its upper bound to at most the size
200 : : of the source object. */
201 : 82 : access_ref aref;
202 : 82 : tree src = gimple_call_arg (stmt, 1);
203 : 82 : if (compute_objsize_r (src, stmt, false, 1, &aref, snlim, qry)
204 : 82 : && aref.sizrng[1] < offrng[1])
205 : 27 : offrng[1] = aref.sizrng[1];
206 : : }
207 : :
208 : : /* Mempcpy may return a past-the-end pointer. */
209 : 199 : *past_end = true;
210 : 199 : return gimple_call_arg (stmt, 0);
211 : : }
212 : :
213 : 523 : case BUILT_IN_MEMCHR:
214 : 523 : {
215 : 523 : tree off = gimple_call_arg (stmt, 2);
216 : 523 : if (get_offset_range (off, stmt, offrng, qry->rvals))
217 : 469 : offrng[1] -= 1;
218 : : else
219 : 54 : offrng[1] = HOST_WIDE_INT_M1U;
220 : :
221 : 523 : offrng[0] = 0;
222 : 523 : return gimple_call_arg (stmt, 0);
223 : : }
224 : :
225 : 314 : case BUILT_IN_STRCHR:
226 : 314 : case BUILT_IN_STRRCHR:
227 : 314 : case BUILT_IN_STRSTR:
228 : 314 : offrng[0] = 0;
229 : 314 : offrng[1] = HOST_WIDE_INT_M1U;
230 : 314 : return gimple_call_arg (stmt, 0);
231 : :
232 : 533 : case BUILT_IN_STPCPY:
233 : 533 : case BUILT_IN_STPCPY_CHK:
234 : 533 : {
235 : 533 : access_ref aref;
236 : 533 : tree src = gimple_call_arg (stmt, 1);
237 : 533 : if (compute_objsize_r (src, stmt, false, 1, &aref, snlim, qry))
238 : 533 : offrng[1] = aref.sizrng[1] - 1;
239 : : else
240 : 0 : offrng[1] = HOST_WIDE_INT_M1U;
241 : :
242 : 533 : offrng[0] = 0;
243 : 533 : return gimple_call_arg (stmt, 0);
244 : : }
245 : :
246 : 88 : case BUILT_IN_STPNCPY:
247 : 88 : case BUILT_IN_STPNCPY_CHK:
248 : 88 : {
249 : : /* The returned pointer is in a range between the first argument
250 : : and it plus the smaller of the upper bound of the size argument
251 : : and the source object size. */
252 : 88 : offrng[1] = HOST_WIDE_INT_M1U;
253 : 88 : tree off = gimple_call_arg (stmt, 2);
254 : 88 : if (!get_offset_range (off, stmt, offrng, qry->rvals)
255 : 88 : || offrng[0] != offrng[1])
256 : : {
257 : : /* If the offset is either indeterminate or in some range,
258 : : try to constrain its upper bound to at most the size
259 : : of the source object. */
260 : 13 : access_ref aref;
261 : 13 : tree src = gimple_call_arg (stmt, 1);
262 : 13 : if (compute_objsize_r (src, stmt, false, 1, &aref, snlim, qry)
263 : 13 : && aref.sizrng[1] < offrng[1])
264 : 13 : offrng[1] = aref.sizrng[1];
265 : : }
266 : :
267 : : /* When the source is the empty string the returned pointer is
268 : : a copy of the argument. Otherwise stpcpy can also return
269 : : a past-the-end pointer. */
270 : 88 : offrng[0] = 0;
271 : 88 : *past_end = true;
272 : 88 : return gimple_call_arg (stmt, 0);
273 : : }
274 : :
275 : : default:
276 : : break;
277 : : }
278 : :
279 : : return NULL_TREE;
280 : : }
281 : :
282 : : /* Return true when EXP's range can be determined and set RANGE[] to it
283 : : after adjusting it if necessary to make EXP a represents a valid size
284 : : of object, or a valid size argument to an allocation function declared
285 : : with attribute alloc_size (whose argument may be signed), or to a string
286 : : manipulation function like memset.
287 : : When ALLOW_ZERO is set in FLAGS, allow returning a range of [0, 0] for
288 : : a size in an anti-range [1, N] where N > PTRDIFF_MAX. A zero range is
289 : : a (nearly) invalid argument to allocation functions like malloc but it
290 : : is a valid argument to functions like memset.
291 : : When USE_LARGEST is set in FLAGS set RANGE to the largest valid subrange
292 : : in a multi-range, otherwise to the smallest valid subrange. */
293 : :
294 : : bool
295 : 1218555 : get_size_range (range_query *query, tree exp, gimple *stmt, tree range[2],
296 : : int flags /* = 0 */)
297 : : {
298 : 1218555 : if (!exp)
299 : : return false;
300 : :
301 : 1218555 : if (tree_fits_uhwi_p (exp))
302 : : {
303 : : /* EXP is a constant. */
304 : 989669 : range[0] = range[1] = exp;
305 : 989669 : return true;
306 : : }
307 : :
308 : 228886 : tree exptype = TREE_TYPE (exp);
309 : 228886 : bool integral = INTEGRAL_TYPE_P (exptype);
310 : :
311 : 228886 : wide_int min, max;
312 : 228886 : enum value_range_kind range_type;
313 : :
314 : 228886 : if (!query)
315 : 22727 : query = get_range_query (cfun);
316 : :
317 : 228886 : if (integral)
318 : : {
319 : 228864 : int_range_max vr;
320 : 228864 : tree tmin, tmax;
321 : :
322 : 228864 : query->range_of_expr (vr, exp, stmt);
323 : :
324 : 228864 : if (vr.undefined_p ())
325 : 4 : vr.set_varying (TREE_TYPE (exp));
326 : 228864 : range_type = get_legacy_range (vr, tmin, tmax);
327 : 228864 : min = wi::to_wide (tmin);
328 : 228864 : max = wi::to_wide (tmax);
329 : 228864 : }
330 : : else
331 : : range_type = VR_VARYING;
332 : :
333 : 228864 : if (range_type == VR_VARYING)
334 : : {
335 : 47561 : if (integral)
336 : : {
337 : : /* Use the full range of the type of the expression when
338 : : no value range information is available. */
339 : 47539 : range[0] = TYPE_MIN_VALUE (exptype);
340 : 47539 : range[1] = TYPE_MAX_VALUE (exptype);
341 : 47539 : return true;
342 : : }
343 : :
344 : 22 : range[0] = NULL_TREE;
345 : 22 : range[1] = NULL_TREE;
346 : 22 : return false;
347 : : }
348 : :
349 : 181325 : unsigned expprec = TYPE_PRECISION (exptype);
350 : :
351 : 181325 : bool signed_p = !TYPE_UNSIGNED (exptype);
352 : :
353 : 181325 : if (range_type == VR_ANTI_RANGE)
354 : : {
355 : 29420 : if (signed_p)
356 : : {
357 : 65 : if (wi::les_p (max, 0))
358 : : {
359 : : /* EXP is not in a strictly negative range. That means
360 : : it must be in some (not necessarily strictly) positive
361 : : range which includes zero. Since in signed to unsigned
362 : : conversions negative values end up converted to large
363 : : positive values, and otherwise they are not valid sizes,
364 : : the resulting range is in both cases [0, TYPE_MAX]. */
365 : 9 : min = wi::zero (expprec);
366 : 9 : max = wi::to_wide (TYPE_MAX_VALUE (exptype));
367 : : }
368 : 56 : else if (wi::les_p (min - 1, 0))
369 : : {
370 : : /* EXP is not in a negative-positive range. That means EXP
371 : : is either negative, or greater than max. Since negative
372 : : sizes are invalid make the range [MAX + 1, TYPE_MAX]. */
373 : 30 : min = max + 1;
374 : 30 : max = wi::to_wide (TYPE_MAX_VALUE (exptype));
375 : : }
376 : : else
377 : : {
378 : 26 : max = min - 1;
379 : 26 : min = wi::zero (expprec);
380 : : }
381 : : }
382 : : else
383 : : {
384 : 29355 : wide_int maxsize = wi::to_wide (max_object_size ());
385 : 29355 : min = wide_int::from (min, maxsize.get_precision (), UNSIGNED);
386 : 29355 : max = wide_int::from (max, maxsize.get_precision (), UNSIGNED);
387 : 29355 : if (wi::eq_p (0, min - 1))
388 : : {
389 : : /* EXP is unsigned and not in the range [1, MAX]. That means
390 : : it's either zero or greater than MAX. Even though 0 would
391 : : normally be detected by -Walloc-zero, unless ALLOW_ZERO
392 : : is set, set the range to [MAX, TYPE_MAX] so that when MAX
393 : : is greater than the limit the whole range is diagnosed. */
394 : 6999 : wide_int maxsize = wi::to_wide (max_object_size ());
395 : 6999 : if (flags & SR_ALLOW_ZERO)
396 : : {
397 : 7704 : if (wi::leu_p (maxsize, max + 1)
398 : 3852 : || !(flags & SR_USE_LARGEST))
399 : 2613 : min = max = wi::zero (expprec);
400 : : else
401 : : {
402 : 1239 : min = max + 1;
403 : 1239 : max = wi::to_wide (TYPE_MAX_VALUE (exptype));
404 : : }
405 : : }
406 : : else
407 : : {
408 : 3147 : min = max + 1;
409 : 3147 : max = wi::to_wide (TYPE_MAX_VALUE (exptype));
410 : : }
411 : 6999 : }
412 : 44712 : else if ((flags & SR_USE_LARGEST)
413 : 32927 : && wi::ltu_p (max + 1, maxsize))
414 : : {
415 : : /* When USE_LARGEST is set and the larger of the two subranges
416 : : is a valid size, use it... */
417 : 93 : min = max + 1;
418 : 93 : max = maxsize;
419 : : }
420 : : else
421 : : {
422 : : /* ...otherwise use the smaller subrange. */
423 : 22263 : max = min - 1;
424 : 22263 : min = wi::zero (expprec);
425 : : }
426 : 29355 : }
427 : : }
428 : :
429 : 181325 : range[0] = wide_int_to_tree (exptype, min);
430 : 181325 : range[1] = wide_int_to_tree (exptype, max);
431 : :
432 : 181325 : return true;
433 : 228886 : }
434 : :
435 : : bool
436 : 28322 : get_size_range (tree exp, tree range[2], int flags /* = 0 */)
437 : : {
438 : 28322 : return get_size_range (/*query=*/NULL, exp, /*stmt=*/NULL, range, flags);
439 : : }
440 : :
441 : : /* If STMT is a call to an allocation function, returns the constant
442 : : maximum size of the object allocated by the call represented as
443 : : sizetype. If nonnull, sets RNG1[] to the range of the size.
444 : : When nonnull, uses RVALS for range information, otherwise gets global
445 : : range info.
446 : : Returns null when STMT is not a call to a valid allocation function. */
447 : :
448 : : tree
449 : 395819 : gimple_call_alloc_size (gimple *stmt, wide_int rng1[2] /* = NULL */,
450 : : range_query *qry /* = NULL */)
451 : : {
452 : 395819 : if (!stmt || !is_gimple_call (stmt))
453 : : return NULL_TREE;
454 : :
455 : 395815 : tree allocfntype;
456 : 395815 : if (tree fndecl = gimple_call_fndecl (stmt))
457 : 377987 : allocfntype = TREE_TYPE (fndecl);
458 : : else
459 : 17828 : allocfntype = gimple_call_fntype (stmt);
460 : :
461 : 395815 : if (!allocfntype)
462 : : return NULL_TREE;
463 : :
464 : 395241 : unsigned argidx1 = UINT_MAX, argidx2 = UINT_MAX;
465 : 395241 : tree at = lookup_attribute ("alloc_size", TYPE_ATTRIBUTES (allocfntype));
466 : 395241 : if (!at)
467 : : {
468 : 316092 : if (!gimple_call_builtin_p (stmt, BUILT_IN_ALLOCA_WITH_ALIGN))
469 : : return NULL_TREE;
470 : :
471 : : argidx1 = 0;
472 : : }
473 : :
474 : 83812 : unsigned nargs = gimple_call_num_args (stmt);
475 : :
476 : 83812 : if (argidx1 == UINT_MAX)
477 : : {
478 : 79149 : tree atval = TREE_VALUE (at);
479 : 79149 : if (!atval)
480 : : return NULL_TREE;
481 : :
482 : 79149 : argidx1 = TREE_INT_CST_LOW (TREE_VALUE (atval)) - 1;
483 : 79149 : if (nargs <= argidx1)
484 : : return NULL_TREE;
485 : :
486 : 79149 : atval = TREE_CHAIN (atval);
487 : 79149 : if (atval)
488 : : {
489 : 1035 : argidx2 = TREE_INT_CST_LOW (TREE_VALUE (atval)) - 1;
490 : 1035 : if (nargs <= argidx2)
491 : : return NULL_TREE;
492 : : }
493 : : }
494 : :
495 : 83812 : tree size = gimple_call_arg (stmt, argidx1);
496 : :
497 : 502872 : wide_int rng1_buf[2];
498 : : /* If RNG1 is not set, use the buffer. */
499 : 83812 : if (!rng1)
500 : 39 : rng1 = rng1_buf;
501 : :
502 : : /* Use maximum precision to avoid overflow below. */
503 : 83812 : const int prec = ADDR_MAX_PRECISION;
504 : :
505 : 83812 : {
506 : 83812 : tree r[2];
507 : : /* Determine the largest valid range size, including zero. */
508 : 83812 : if (!get_size_range (qry, size, stmt, r, SR_ALLOW_ZERO | SR_USE_LARGEST))
509 : 2 : return NULL_TREE;
510 : 83810 : rng1[0] = wi::to_wide (r[0], prec);
511 : 83810 : rng1[1] = wi::to_wide (r[1], prec);
512 : : }
513 : :
514 : 83810 : if (argidx2 > nargs && TREE_CODE (size) == INTEGER_CST)
515 : 36476 : return fold_convert (sizetype, size);
516 : :
517 : : /* To handle ranges do the math in wide_int and return the product
518 : : of the upper bounds as a constant. Ignore anti-ranges. */
519 : 47334 : tree n = argidx2 < nargs ? gimple_call_arg (stmt, argidx2) : integer_one_node;
520 : 236670 : wide_int rng2[2];
521 : 47334 : {
522 : 47334 : tree r[2];
523 : : /* As above, use the full non-negative range on failure. */
524 : 47334 : if (!get_size_range (qry, n, stmt, r, SR_ALLOW_ZERO | SR_USE_LARGEST))
525 : 0 : return NULL_TREE;
526 : 47334 : rng2[0] = wi::to_wide (r[0], prec);
527 : 47334 : rng2[1] = wi::to_wide (r[1], prec);
528 : : }
529 : :
530 : : /* Compute products of both bounds for the caller but return the lesser
531 : : of SIZE_MAX and the product of the upper bounds as a constant. */
532 : 47334 : rng1[0] = rng1[0] * rng2[0];
533 : 47334 : rng1[1] = rng1[1] * rng2[1];
534 : :
535 : 47334 : const tree size_max = TYPE_MAX_VALUE (sizetype);
536 : 47334 : if (wi::gtu_p (rng1[1], wi::to_wide (size_max, prec)))
537 : : {
538 : 90 : rng1[1] = wi::to_wide (size_max, prec);
539 : 90 : return size_max;
540 : : }
541 : :
542 : 47244 : return wide_int_to_tree (sizetype, rng1[1]);
543 : 393438 : }
544 : :
545 : : /* For an access to an object referenced to by the function parameter PTR
546 : : of pointer type, and set RNG[] to the range of sizes of the object
547 : : obtainedfrom the attribute access specification for the current function.
548 : : Set STATIC_ARRAY if the array parameter has been declared [static].
549 : : Return the function parameter on success and null otherwise. */
550 : :
551 : : static tree
552 : 760839 : gimple_parm_array_size (tree ptr, wide_int rng[2],
553 : : bool *static_array /* = NULL */)
554 : : {
555 : : /* For a function argument try to determine the byte size of the array
556 : : from the current function declaratation (e.g., attribute access or
557 : : related). */
558 : 760839 : tree var = SSA_NAME_VAR (ptr);
559 : 760839 : if (TREE_CODE (var) != PARM_DECL || !POINTER_TYPE_P (TREE_TYPE (var)))
560 : : return NULL_TREE;
561 : :
562 : 718274 : const unsigned prec = TYPE_PRECISION (sizetype);
563 : :
564 : 718274 : rdwr_map rdwr_idx;
565 : 718274 : attr_access *access = get_parm_access (rdwr_idx, var);
566 : 718274 : if (!access)
567 : : return NULL_TREE;
568 : :
569 : 2774 : if (access->sizarg != UINT_MAX)
570 : : {
571 : : /* TODO: Try to extract the range from the argument based on
572 : : those of subsequent assertions or based on known calls to
573 : : the current function. */
574 : : return NULL_TREE;
575 : : }
576 : :
577 : 2751 : if (!access->minsize)
578 : : return NULL_TREE;
579 : :
580 : : /* Only consider ordinary array bound at level 2 (or above if it's
581 : : ever added). */
582 : 1898 : if (warn_array_parameter < 2 && !access->static_p)
583 : : return NULL_TREE;
584 : :
585 : 224 : if (static_array)
586 : 224 : *static_array = access->static_p;
587 : :
588 : 224 : rng[0] = wi::zero (prec);
589 : 224 : rng[1] = wi::uhwi (access->minsize, prec);
590 : : /* Multiply the array bound encoded in the attribute by the size
591 : : of what the pointer argument to which it decays points to. */
592 : 224 : tree eltype = TREE_TYPE (TREE_TYPE (ptr));
593 : 224 : tree size = TYPE_SIZE_UNIT (eltype);
594 : 224 : if (!size || TREE_CODE (size) != INTEGER_CST)
595 : : return NULL_TREE;
596 : :
597 : 194 : rng[1] *= wi::to_wide (size, prec);
598 : 194 : return var;
599 : 718274 : }
600 : :
601 : : /* Initialize the object. */
602 : :
603 : 17846074 : access_ref::access_ref ()
604 : 17846074 : : ref (), eval ([](tree x){ return x; }), deref (), ref_nullptr_p (false),
605 : 17846074 : trail1special (true), base0 (true), parmarray ()
606 : : {
607 : : /* Set to valid. */
608 : 17846074 : offrng[0] = offrng[1] = 0;
609 : 17846074 : offmax[0] = offmax[1] = 0;
610 : : /* Invalidate. */
611 : 17846074 : sizrng[0] = sizrng[1] = -1;
612 : 17846074 : }
613 : :
614 : : /* Return the PHI node REF refers to or null if it doesn't. */
615 : :
616 : : gphi *
617 : 552390 : access_ref::phi () const
618 : : {
619 : 552390 : if (!ref || TREE_CODE (ref) != SSA_NAME)
620 : : return NULL;
621 : :
622 : 549430 : gimple *def_stmt = SSA_NAME_DEF_STMT (ref);
623 : 549430 : if (!def_stmt || gimple_code (def_stmt) != GIMPLE_PHI)
624 : : return NULL;
625 : :
626 : 548515 : return as_a <gphi *> (def_stmt);
627 : : }
628 : :
629 : : /* Determine the size and offset for ARG, append it to ALL_REFS, and
630 : : merge the result with *THIS. Ignore ARG if SKIP_NULL is set and
631 : : ARG refers to the null pointer. Return true on success and false
632 : : on failure. */
633 : :
634 : : void
635 : 612287 : access_ref::merge_ref (vec<access_ref> *all_refs, tree arg, gimple *stmt,
636 : : int ostype, bool skip_null,
637 : : ssa_name_limit_t &snlim, pointer_query &qry)
638 : : {
639 : 612287 : access_ref aref;
640 : 612287 : if (!compute_objsize_r (arg, stmt, false, ostype, &aref, snlim, &qry)
641 : 612287 : || aref.sizrng[0] < 0)
642 : : {
643 : : /* This may be a PHI with all null pointer arguments. Handle it
644 : : conservatively by setting all properties to the most permissive
645 : : values. */
646 : 56931 : base0 = false;
647 : 56931 : offrng[0] = offrng[1] = 0;
648 : 56931 : add_max_offset ();
649 : 56931 : set_max_size_range ();
650 : 56931 : return;
651 : : }
652 : :
653 : 555356 : if (all_refs)
654 : : {
655 : 264 : access_ref dummy_ref;
656 : 264 : aref.get_ref (all_refs, &dummy_ref, ostype, &snlim, &qry);
657 : : }
658 : :
659 : 555356 : if (TREE_CODE (arg) == SSA_NAME)
660 : 457180 : qry.put_ref (arg, aref, ostype);
661 : :
662 : 555356 : if (all_refs)
663 : 264 : all_refs->safe_push (aref);
664 : :
665 : 555356 : aref.deref += deref;
666 : :
667 : 555356 : bool merged_parmarray = aref.parmarray;
668 : :
669 : 555356 : const bool nullp = skip_null && integer_zerop (arg);
670 : 555356 : const offset_int maxobjsize = wi::to_offset (max_object_size ());
671 : 555356 : offset_int minsize = sizrng[0];
672 : :
673 : 555356 : if (sizrng[0] < 0)
674 : : {
675 : : /* If *THIS doesn't contain a meaningful result yet set it to AREF
676 : : unless the argument is null and it's okay to ignore it. */
677 : 486287 : if (!nullp)
678 : 466057 : *this = aref;
679 : :
680 : : /* Set if the current argument refers to one or more objects of
681 : : known size (or range of sizes), as opposed to referring to
682 : : one or more unknown object(s). */
683 : 486287 : const bool arg_known_size = (aref.sizrng[0] != 0
684 : 895119 : || aref.sizrng[1] != maxobjsize);
685 : 405961 : if (arg_known_size)
686 : 80326 : sizrng[0] = aref.sizrng[0];
687 : :
688 : 486287 : return;
689 : : }
690 : :
691 : : /* Disregard null pointers in PHIs with two or more arguments.
692 : : TODO: Handle this better! */
693 : 69069 : if (nullp)
694 : : return;
695 : :
696 : 66199 : const bool known_size = (sizrng[0] != 0 || sizrng[1] != maxobjsize);
697 : :
698 : 66199 : if (known_size && aref.sizrng[0] < minsize)
699 : 20187 : minsize = aref.sizrng[0];
700 : :
701 : : /* Extend the size and offset of *THIS to account for AREF. The result
702 : : can be cached but results in false negatives. */
703 : :
704 : 66199 : offset_int orng[2];
705 : 66199 : if (sizrng[1] < aref.sizrng[1])
706 : : {
707 : 23916 : orng[0] = offrng[0];
708 : 23916 : orng[1] = offrng[1];
709 : 23916 : *this = aref;
710 : : }
711 : : else
712 : : {
713 : 42283 : orng[0] = aref.offrng[0];
714 : 42283 : orng[1] = aref.offrng[1];
715 : : }
716 : :
717 : 66199 : if (orng[0] < offrng[0])
718 : 4650 : offrng[0] = orng[0];
719 : 66199 : if (offrng[1] < orng[1])
720 : 15704 : offrng[1] = orng[1];
721 : :
722 : : /* Reset the PHI's BASE0 flag if any of the nonnull arguments
723 : : refers to an object at an unknown offset. */
724 : 66199 : if (!aref.base0)
725 : 19189 : base0 = false;
726 : :
727 : 66199 : sizrng[0] = minsize;
728 : 66199 : parmarray = merged_parmarray;
729 : :
730 : 66199 : return;
731 : : }
732 : :
733 : : /* Determine and return the largest object to which *THIS refers. If
734 : : *THIS refers to a PHI and PREF is nonnull, fill *PREF with the details
735 : : of the object determined by compute_objsize(ARG, OSTYPE) for each PHI
736 : : argument ARG. */
737 : :
738 : : tree
739 : 548572 : access_ref::get_ref (vec<access_ref> *all_refs,
740 : : access_ref *pref /* = NULL */,
741 : : int ostype /* = 1 */,
742 : : ssa_name_limit_t *psnlim /* = NULL */,
743 : : pointer_query *qry /* = NULL */) const
744 : : {
745 : 548572 : if (!ref || TREE_CODE (ref) != SSA_NAME)
746 : : return NULL;
747 : :
748 : : /* FIXME: Calling get_ref() with a null PSNLIM is dangerous and might
749 : : cause unbounded recursion. */
750 : 548366 : ssa_name_limit_t snlim_buf;
751 : 548366 : if (!psnlim)
752 : 82 : psnlim = &snlim_buf;
753 : :
754 : 548366 : pointer_query empty_qry;
755 : 548366 : if (!qry)
756 : 82 : qry = &empty_qry;
757 : :
758 : 548366 : if (gimple *def_stmt = SSA_NAME_DEF_STMT (ref))
759 : : {
760 : 548366 : if (is_gimple_assign (def_stmt))
761 : : {
762 : 0 : tree_code code = gimple_assign_rhs_code (def_stmt);
763 : 0 : if (code != MIN_EXPR && code != MAX_EXPR)
764 : : return NULL_TREE;
765 : :
766 : 0 : access_ref aref;
767 : 0 : tree arg1 = gimple_assign_rhs1 (def_stmt);
768 : 0 : aref.merge_ref (all_refs, arg1, def_stmt, ostype, false,
769 : : *psnlim, *qry);
770 : :
771 : 0 : tree arg2 = gimple_assign_rhs2 (def_stmt);
772 : 0 : aref.merge_ref (all_refs, arg2, def_stmt, ostype, false,
773 : : *psnlim, *qry);
774 : :
775 : 0 : if (pref && pref != this)
776 : : {
777 : 0 : tree ref = pref->ref;
778 : 0 : *pref = aref;
779 : 0 : pref->ref = ref;
780 : : }
781 : :
782 : 0 : return aref.ref;
783 : : }
784 : : }
785 : : else
786 : : return NULL_TREE;
787 : :
788 : 548366 : gphi *phi_stmt = this->phi ();
789 : 548366 : if (!phi_stmt)
790 : 23 : return ref;
791 : :
792 : 548343 : if (!psnlim->visit_phi (ref))
793 : : return NULL_TREE;
794 : :
795 : : /* The conservative result of the PHI reflecting the offset and size
796 : : of the largest PHI argument, regardless of whether or not they all
797 : : refer to the same object. */
798 : 491396 : access_ref phi_ref;
799 : 491396 : if (pref)
800 : : {
801 : : /* The identity of the object has not been determined yet but
802 : : PREF->REF is set by the caller to the PHI for convenience.
803 : : The size is negative/invalid and the offset is zero (it's
804 : : updated only after the identity of the object has been
805 : : established). */
806 : 491396 : gcc_assert (pref->sizrng[0] < 0);
807 : 491396 : gcc_assert (pref->offrng[0] == 0 && pref->offrng[1] == 0);
808 : :
809 : 491396 : phi_ref = *pref;
810 : : }
811 : :
812 : 491396 : const offset_int maxobjsize = wi::to_offset (max_object_size ());
813 : 491396 : const unsigned nargs = gimple_phi_num_args (phi_stmt);
814 : 644368 : for (unsigned i = 0; i < nargs; ++i)
815 : : {
816 : 612287 : access_ref phi_arg_ref;
817 : 612287 : bool skip_null = i || i + 1 < nargs;
818 : 612287 : tree arg = gimple_phi_arg_def (phi_stmt, i);
819 : 612287 : phi_ref.merge_ref (all_refs, arg, phi_stmt, ostype, skip_null,
820 : : *psnlim, *qry);
821 : :
822 : 612287 : if (!phi_ref.base0
823 : 1071602 : && phi_ref.sizrng[0] == 0
824 : 1071602 : && phi_ref.sizrng[1] >= maxobjsize)
825 : : /* When an argument results in the most permissive result,
826 : : the remaining arguments cannot constrain it. Short-circuit
827 : : the evaluation. */
828 : : break;
829 : : }
830 : :
831 : 491396 : if (phi_ref.sizrng[0] < 0)
832 : : {
833 : : /* Fail if none of the PHI's arguments resulted in updating PHI_REF
834 : : (perhaps because they have all been already visited by prior
835 : : recursive calls). */
836 : 3 : psnlim->leave_phi (ref);
837 : 3 : return NULL_TREE;
838 : : }
839 : :
840 : : /* Avoid changing *THIS. */
841 : 491393 : if (pref && pref != this)
842 : : {
843 : : /* Keep the SSA_NAME of the PHI unchanged so that all PHI arguments
844 : : can be referred to later if necessary. This is useful even if
845 : : they all refer to the same object. */
846 : 491393 : tree ref = pref->ref;
847 : 491393 : *pref = phi_ref;
848 : 491393 : pref->ref = ref;
849 : : }
850 : :
851 : 491393 : psnlim->leave_phi (ref);
852 : :
853 : 491393 : return phi_ref.ref;
854 : 548366 : }
855 : :
856 : : /* Return the maximum amount of space remaining and if non-null, set
857 : : argument to the minimum. */
858 : :
859 : : offset_int
860 : 14141416 : access_ref::size_remaining (offset_int *pmin /* = NULL */) const
861 : : {
862 : 14141416 : offset_int minbuf;
863 : 14141416 : if (!pmin)
864 : 10380266 : pmin = &minbuf;
865 : :
866 : 14141416 : if (sizrng[0] < 0)
867 : : {
868 : : /* If the identity of the object hasn't been determined return
869 : : the maximum size range. */
870 : 0 : *pmin = 0;
871 : 0 : return wi::to_offset (max_object_size ());
872 : : }
873 : :
874 : : /* add_offset() ensures the offset range isn't inverted. */
875 : 14141416 : gcc_checking_assert (offrng[0] <= offrng[1]);
876 : :
877 : 14141416 : if (base0)
878 : : {
879 : : /* The offset into referenced object is zero-based (i.e., it's
880 : : not referenced by a pointer into middle of some unknown object). */
881 : 9160694 : if (offrng[0] < 0 && offrng[1] < 0)
882 : : {
883 : : /* If the offset is negative the remaining size is zero. */
884 : 2362 : *pmin = 0;
885 : 2362 : return 0;
886 : : }
887 : :
888 : 9158332 : if (sizrng[1] <= offrng[0])
889 : : {
890 : : /* If the starting offset is greater than or equal to the upper
891 : : bound on the size of the object, the space remaining is zero.
892 : : As a special case, if it's equal, set *PMIN to -1 to let
893 : : the caller know the offset is valid and just past the end. */
894 : 71969 : *pmin = sizrng[1] == offrng[0] ? -1 : 0;
895 : 67703 : return 0;
896 : : }
897 : :
898 : : /* Otherwise return the size minus the lower bound of the offset. */
899 : 9090629 : offset_int or0 = offrng[0] < 0 ? 0 : offrng[0];
900 : :
901 : 9090629 : *pmin = sizrng[0] - or0;
902 : 9090629 : return sizrng[1] - or0;
903 : : }
904 : :
905 : : /* The offset to the referenced object isn't zero-based (i.e., it may
906 : : refer to a byte other than the first. The size of such an object
907 : : is constrained only by the size of the address space (the result
908 : : of max_object_size()). */
909 : 4980722 : if (sizrng[1] <= offrng[0])
910 : : {
911 : 5 : *pmin = 0;
912 : 5 : return 0;
913 : : }
914 : :
915 : 4980717 : offset_int or0 = offrng[0] < 0 ? 0 : offrng[0];
916 : :
917 : 4980717 : *pmin = sizrng[0] - or0;
918 : 4980717 : return sizrng[1] - or0;
919 : : }
920 : :
921 : : /* Return true if the offset and object size are in range for SIZE. */
922 : :
923 : : bool
924 : 591818 : access_ref::offset_in_range (const offset_int &size) const
925 : : {
926 : 591818 : if (size_remaining () < size)
927 : : return false;
928 : :
929 : 581082 : if (base0)
930 : 63508 : return offmax[0] >= 0 && offmax[1] <= sizrng[1];
931 : :
932 : 517592 : offset_int maxoff = wi::to_offset (TYPE_MAX_VALUE (ptrdiff_type_node));
933 : 517592 : return offmax[0] > -maxoff && offmax[1] < maxoff;
934 : : }
935 : :
936 : : /* Add the range [MIN, MAX] to the offset range. For known objects (with
937 : : zero-based offsets) at least one of whose offset's bounds is in range,
938 : : constrain the other (or both) to the bounds of the object (i.e., zero
939 : : and the upper bound of its size). This improves the quality of
940 : : diagnostics. */
941 : :
942 : 7211932 : void access_ref::add_offset (const offset_int &min, const offset_int &max)
943 : : {
944 : 7211932 : if (min <= max)
945 : : {
946 : : /* To add an ordinary range just add it to the bounds. */
947 : 7118146 : offrng[0] += min;
948 : 7118146 : offrng[1] += max;
949 : : }
950 : 93786 : else if (!base0)
951 : : {
952 : : /* To add an inverted range to an offset to an unknown object
953 : : expand it to the maximum. */
954 : 78094 : add_max_offset ();
955 : 3880258 : return;
956 : : }
957 : : else
958 : : {
959 : : /* To add an inverted range to an offset to an known object set
960 : : the upper bound to the maximum representable offset value
961 : : (which may be greater than MAX_OBJECT_SIZE).
962 : : The lower bound is either the sum of the current offset and
963 : : MIN when abs(MAX) is greater than the former, or zero otherwise.
964 : : Zero because then the inverted range includes the negative of
965 : : the lower bound. */
966 : 15692 : offset_int maxoff = wi::to_offset (TYPE_MAX_VALUE (ptrdiff_type_node));
967 : 15692 : offrng[1] = maxoff;
968 : :
969 : 15692 : if (max >= 0)
970 : : {
971 : 0 : offrng[0] = 0;
972 : 0 : if (offmax[0] > 0)
973 : 0 : offmax[0] = 0;
974 : 0 : return;
975 : : }
976 : :
977 : 15692 : offset_int absmax = wi::abs (max);
978 : 15692 : if (offrng[0] < absmax)
979 : : {
980 : 15502 : offrng[0] += min;
981 : : /* Cap the lower bound at the upper (set to MAXOFF above)
982 : : to avoid inadvertently recreating an inverted range. */
983 : 15502 : if (offrng[1] < offrng[0])
984 : 2 : offrng[0] = offrng[1];
985 : : }
986 : : else
987 : 190 : offrng[0] = 0;
988 : : }
989 : :
990 : : /* Set the minimum and maximmum computed so far. */
991 : 7133838 : if (offrng[1] < 0 && offrng[1] < offmax[0])
992 : 25555 : offmax[0] = offrng[1];
993 : 7133838 : if (offrng[0] > 0 && offrng[0] > offmax[1])
994 : 2506498 : offmax[1] = offrng[0];
995 : :
996 : 7133838 : if (!base0)
997 : : return;
998 : :
999 : : /* When referencing a known object check to see if the offset computed
1000 : : so far is in bounds... */
1001 : 3409768 : offset_int remrng[2];
1002 : 3409768 : remrng[1] = size_remaining (remrng);
1003 : 3409768 : if (remrng[1] > 0 || remrng[0] < 0)
1004 : : {
1005 : : /* ...if so, constrain it so that neither bound exceeds the size of
1006 : : the object. Out of bounds offsets are left unchanged, and, for
1007 : : better or worse, become in bounds later. They should be detected
1008 : : and diagnosed at the point they first become invalid by
1009 : : -Warray-bounds. */
1010 : 3406596 : if (offrng[0] < 0)
1011 : 115706 : offrng[0] = 0;
1012 : 3406596 : if (offrng[1] > sizrng[1])
1013 : 133728 : offrng[1] = sizrng[1];
1014 : : }
1015 : : }
1016 : :
1017 : : /* Issue one inform message describing each target of an access REF.
1018 : : WRITE is set for a write access and clear for a read access. */
1019 : :
1020 : : void
1021 : 3555 : access_ref::inform_access (access_mode mode, int ostype /* = 1 */) const
1022 : : {
1023 : 3555 : const access_ref &aref = *this;
1024 : 3555 : if (!aref.ref)
1025 : 3071 : return;
1026 : :
1027 : 3414 : if (phi ())
1028 : : {
1029 : : /* Set MAXREF to refer to the largest object and fill ALL_REFS
1030 : : with data for all objects referenced by the PHI arguments. */
1031 : 82 : access_ref maxref;
1032 : 82 : auto_vec<access_ref> all_refs;
1033 : 82 : if (!get_ref (&all_refs, &maxref, ostype))
1034 : : return;
1035 : :
1036 : 82 : if (all_refs.length ())
1037 : : {
1038 : : /* Except for MAXREF, the rest of the arguments' offsets need not
1039 : : reflect one added to the PHI itself. Determine the latter from
1040 : : MAXREF on which the result is based. */
1041 : 82 : const offset_int orng[] =
1042 : : {
1043 : 82 : offrng[0] - maxref.offrng[0],
1044 : 82 : wi::smax (offrng[1] - maxref.offrng[1], offrng[0]),
1045 : : };
1046 : :
1047 : : /* Add the final PHI's offset to that of each of the arguments
1048 : : and recurse to issue an inform message for it. */
1049 : 692 : for (unsigned i = 0; i != all_refs.length (); ++i)
1050 : : {
1051 : : /* Skip any PHIs; those could lead to infinite recursion. */
1052 : 264 : if (all_refs[i].phi ())
1053 : 35 : continue;
1054 : :
1055 : 229 : all_refs[i].add_offset (orng[0], orng[1]);
1056 : 229 : all_refs[i].inform_access (mode, ostype);
1057 : : }
1058 : 82 : return;
1059 : : }
1060 : 82 : }
1061 : :
1062 : : /* Convert offset range and avoid including a zero range since it
1063 : : isn't necessarily meaningful. */
1064 : 3332 : HOST_WIDE_INT diff_min = tree_to_shwi (TYPE_MIN_VALUE (ptrdiff_type_node));
1065 : 3332 : HOST_WIDE_INT diff_max = tree_to_shwi (TYPE_MAX_VALUE (ptrdiff_type_node));
1066 : 3332 : HOST_WIDE_INT minoff;
1067 : 3332 : HOST_WIDE_INT maxoff = diff_max;
1068 : 3332 : if (wi::fits_shwi_p (aref.offrng[0]))
1069 : 3332 : minoff = aref.offrng[0].to_shwi ();
1070 : : else
1071 : 0 : minoff = aref.offrng[0] < 0 ? diff_min : diff_max;
1072 : :
1073 : 3332 : if (wi::fits_shwi_p (aref.offrng[1]))
1074 : 3329 : maxoff = aref.offrng[1].to_shwi ();
1075 : :
1076 : 3332 : if (maxoff <= diff_min || maxoff >= diff_max)
1077 : : /* Avoid mentioning an upper bound that's equal to or in excess
1078 : : of the maximum of ptrdiff_t. */
1079 : 124 : maxoff = minoff;
1080 : :
1081 : : /* Convert size range and always include it since all sizes are
1082 : : meaningful. */
1083 : 3332 : unsigned long long minsize = 0, maxsize = 0;
1084 : 3332 : if (wi::fits_shwi_p (aref.sizrng[0])
1085 : 3332 : && wi::fits_shwi_p (aref.sizrng[1]))
1086 : : {
1087 : 3332 : minsize = aref.sizrng[0].to_shwi ();
1088 : 3332 : maxsize = aref.sizrng[1].to_shwi ();
1089 : : }
1090 : :
1091 : : /* SIZRNG doesn't necessarily have the same range as the allocation
1092 : : size determined by gimple_call_alloc_size (). */
1093 : 3332 : char sizestr[80];
1094 : 3332 : if (minsize == maxsize)
1095 : 3078 : sprintf (sizestr, "%llu", minsize);
1096 : : else
1097 : 254 : sprintf (sizestr, "[%llu, %llu]", minsize, maxsize);
1098 : :
1099 : 3332 : char offstr[80];
1100 : 3332 : if (minoff == 0
1101 : 3332 : && (maxoff == 0 || aref.sizrng[1] <= maxoff))
1102 : 964 : offstr[0] = '\0';
1103 : 2368 : else if (minoff == maxoff)
1104 : 2103 : sprintf (offstr, "%lli", (long long) minoff);
1105 : : else
1106 : 265 : sprintf (offstr, "[%lli, %lli]", (long long) minoff, (long long) maxoff);
1107 : :
1108 : 3332 : location_t loc = UNKNOWN_LOCATION;
1109 : :
1110 : 3332 : tree ref = this->ref;
1111 : 3332 : tree allocfn = NULL_TREE;
1112 : 3332 : if (TREE_CODE (ref) == SSA_NAME)
1113 : : {
1114 : 761 : gimple *stmt = SSA_NAME_DEF_STMT (ref);
1115 : 761 : if (!stmt)
1116 : : return;
1117 : :
1118 : 761 : if (is_gimple_call (stmt))
1119 : : {
1120 : 721 : loc = gimple_location (stmt);
1121 : 721 : if (gimple_call_builtin_p (stmt, BUILT_IN_ALLOCA_WITH_ALIGN))
1122 : : {
1123 : : /* Strip the SSA_NAME suffix from the variable name and
1124 : : recreate an identifier with the VLA's original name. */
1125 : 23 : ref = gimple_call_lhs (stmt);
1126 : 23 : if (SSA_NAME_IDENTIFIER (ref))
1127 : : {
1128 : 22 : ref = SSA_NAME_IDENTIFIER (ref);
1129 : 22 : const char *id = IDENTIFIER_POINTER (ref);
1130 : 22 : size_t len = strcspn (id, ".$");
1131 : 22 : if (!len)
1132 : 0 : len = strlen (id);
1133 : 22 : ref = get_identifier_with_length (id, len);
1134 : : }
1135 : : }
1136 : : else
1137 : : {
1138 : : /* Except for VLAs, retrieve the allocation function. */
1139 : 698 : allocfn = gimple_call_fndecl (stmt);
1140 : 698 : if (!allocfn)
1141 : 7 : allocfn = gimple_call_fn (stmt);
1142 : 698 : if (TREE_CODE (allocfn) == SSA_NAME)
1143 : : {
1144 : : /* For an ALLOC_CALL via a function pointer make a small
1145 : : effort to determine the destination of the pointer. */
1146 : 4 : gimple *def = SSA_NAME_DEF_STMT (allocfn);
1147 : 4 : if (gimple_assign_single_p (def))
1148 : : {
1149 : 3 : tree rhs = gimple_assign_rhs1 (def);
1150 : 3 : if (DECL_P (rhs))
1151 : : allocfn = rhs;
1152 : 2 : else if (TREE_CODE (rhs) == COMPONENT_REF)
1153 : 1 : allocfn = TREE_OPERAND (rhs, 1);
1154 : : }
1155 : : }
1156 : : }
1157 : : }
1158 : 40 : else if (gimple_nop_p (stmt))
1159 : : /* Handle DECL_PARM below. */
1160 : 5 : ref = SSA_NAME_VAR (ref);
1161 : 35 : else if (is_gimple_assign (stmt)
1162 : 35 : && (gimple_assign_rhs_code (stmt) == MIN_EXPR
1163 : 18 : || gimple_assign_rhs_code (stmt) == MAX_EXPR))
1164 : : {
1165 : : /* MIN or MAX_EXPR here implies a reference to a known object
1166 : : and either an unknown or distinct one (the latter being
1167 : : the result of an invalid relational expression). Determine
1168 : : the identity of the former and point to it in the note.
1169 : : TODO: Consider merging with PHI handling. */
1170 : 105 : access_ref arg_ref[2];
1171 : 35 : tree arg = gimple_assign_rhs1 (stmt);
1172 : 35 : compute_objsize (arg, /* ostype = */ 1 , &arg_ref[0]);
1173 : 35 : arg = gimple_assign_rhs2 (stmt);
1174 : 35 : compute_objsize (arg, /* ostype = */ 1 , &arg_ref[1]);
1175 : :
1176 : : /* Use the argument that references a known object with more
1177 : : space remaining. */
1178 : 35 : const bool idx
1179 : 35 : = (!arg_ref[0].ref || !arg_ref[0].base0
1180 : 67 : || (arg_ref[0].base0 && arg_ref[1].base0
1181 : 11 : && (arg_ref[0].size_remaining ()
1182 : 22 : < arg_ref[1].size_remaining ())));
1183 : :
1184 : 35 : arg_ref[idx].offrng[0] = offrng[0];
1185 : 35 : arg_ref[idx].offrng[1] = offrng[1];
1186 : 35 : arg_ref[idx].inform_access (mode);
1187 : 35 : return;
1188 : : }
1189 : : }
1190 : :
1191 : 3297 : if (DECL_P (ref))
1192 : 2470 : loc = DECL_SOURCE_LOCATION (ref);
1193 : 827 : else if (EXPR_P (ref) && EXPR_HAS_LOCATION (ref))
1194 : 0 : loc = EXPR_LOCATION (ref);
1195 : 827 : else if (TREE_CODE (ref) != IDENTIFIER_NODE
1196 : 827 : && TREE_CODE (ref) != SSA_NAME)
1197 : : {
1198 : 106 : if (TREE_CODE (ref) == INTEGER_CST && ref_nullptr_p)
1199 : : {
1200 : 3 : if (mode == access_read_write || mode == access_write_only)
1201 : 1 : inform (loc, "destination object is likely at address zero");
1202 : : else
1203 : 2 : inform (loc, "source object is likely at address zero");
1204 : : }
1205 : 106 : return;
1206 : : }
1207 : :
1208 : 3191 : if (mode == access_read_write || mode == access_write_only)
1209 : : {
1210 : 1618 : if (allocfn == NULL_TREE)
1211 : : {
1212 : 1411 : if (*offstr)
1213 : 1110 : inform (loc, "at offset %s into destination object %qE of size %s",
1214 : : offstr, ref, sizestr);
1215 : : else
1216 : 301 : inform (loc, "destination object %qE of size %s", ref, sizestr);
1217 : 1411 : return;
1218 : : }
1219 : :
1220 : 207 : if (*offstr)
1221 : 55 : inform (loc,
1222 : : "at offset %s into destination object of size %s "
1223 : : "allocated by %qE", offstr, sizestr, allocfn);
1224 : : else
1225 : 152 : inform (loc, "destination object of size %s allocated by %qE",
1226 : : sizestr, allocfn);
1227 : 207 : return;
1228 : : }
1229 : :
1230 : 1573 : if (mode == access_read_only)
1231 : : {
1232 : 379 : if (allocfn == NULL_TREE)
1233 : : {
1234 : 372 : if (*offstr)
1235 : 249 : inform (loc, "at offset %s into source object %qE of size %s",
1236 : : offstr, ref, sizestr);
1237 : : else
1238 : 123 : inform (loc, "source object %qE of size %s", ref, sizestr);
1239 : :
1240 : 372 : return;
1241 : : }
1242 : :
1243 : 7 : if (*offstr)
1244 : 0 : inform (loc,
1245 : : "at offset %s into source object of size %s allocated by %qE",
1246 : : offstr, sizestr, allocfn);
1247 : : else
1248 : 7 : inform (loc, "source object of size %s allocated by %qE",
1249 : : sizestr, allocfn);
1250 : 7 : return;
1251 : : }
1252 : :
1253 : 1194 : if (allocfn == NULL_TREE)
1254 : : {
1255 : 710 : if (*offstr)
1256 : 587 : inform (loc, "at offset %s into object %qE of size %s",
1257 : : offstr, ref, sizestr);
1258 : : else
1259 : 123 : inform (loc, "object %qE of size %s", ref, sizestr);
1260 : :
1261 : 710 : return;
1262 : : }
1263 : :
1264 : 484 : if (*offstr)
1265 : 252 : inform (loc,
1266 : : "at offset %s into object of size %s allocated by %qE",
1267 : : offstr, sizestr, allocfn);
1268 : : else
1269 : 232 : inform (loc, "object of size %s allocated by %qE",
1270 : : sizestr, allocfn);
1271 : : }
1272 : :
1273 : : /* Dump *THIS to FILE. */
1274 : :
1275 : : void
1276 : 0 : access_ref::dump (FILE *file) const
1277 : : {
1278 : 0 : for (int i = deref; i < 0; ++i)
1279 : 0 : fputc ('&', file);
1280 : :
1281 : 0 : for (int i = 0; i < deref; ++i)
1282 : 0 : fputc ('*', file);
1283 : :
1284 : 0 : if (gphi *phi_stmt = phi ())
1285 : : {
1286 : 0 : fputs ("PHI <", file);
1287 : 0 : unsigned nargs = gimple_phi_num_args (phi_stmt);
1288 : 0 : for (unsigned i = 0; i != nargs; ++i)
1289 : : {
1290 : 0 : tree arg = gimple_phi_arg_def (phi_stmt, i);
1291 : 0 : print_generic_expr (file, arg);
1292 : 0 : if (i + 1 < nargs)
1293 : 0 : fputs (", ", file);
1294 : : }
1295 : 0 : fputc ('>', file);
1296 : : }
1297 : : else
1298 : 0 : print_generic_expr (file, ref);
1299 : :
1300 : 0 : if (offrng[0] != offrng[1])
1301 : 0 : fprintf (file, " + [%lli, %lli]",
1302 : 0 : (long long) offrng[0].to_shwi (),
1303 : 0 : (long long) offrng[1].to_shwi ());
1304 : 0 : else if (offrng[0] != 0)
1305 : 0 : fprintf (file, " %c %lli",
1306 : 0 : offrng[0] < 0 ? '-' : '+',
1307 : 0 : (long long) offrng[0].to_shwi ());
1308 : :
1309 : 0 : if (base0)
1310 : 0 : fputs (" (base0)", file);
1311 : :
1312 : 0 : fputs ("; size: ", file);
1313 : 0 : if (sizrng[0] != sizrng[1])
1314 : : {
1315 : 0 : offset_int maxsize = wi::to_offset (max_object_size ());
1316 : 0 : if (sizrng[0] == 0 && sizrng[1] >= maxsize)
1317 : 0 : fputs ("unknown", file);
1318 : : else
1319 : 0 : fprintf (file, "[%llu, %llu]",
1320 : 0 : (unsigned long long) sizrng[0].to_uhwi (),
1321 : 0 : (unsigned long long) sizrng[1].to_uhwi ());
1322 : : }
1323 : 0 : else if (sizrng[0] != 0)
1324 : 0 : fprintf (file, "%llu",
1325 : 0 : (unsigned long long) sizrng[0].to_uhwi ());
1326 : :
1327 : 0 : fputc ('\n', file);
1328 : 0 : }
1329 : :
1330 : : /* Set the access to at most MAXWRITE and MAXREAD bytes, and at least 1
1331 : : when MINWRITE or MINREAD, respectively, is set. */
1332 : 808049 : access_data::access_data (range_query *query, gimple *stmt, access_mode mode,
1333 : : tree maxwrite /* = NULL_TREE */,
1334 : : bool minwrite /* = false */,
1335 : : tree maxread /* = NULL_TREE */,
1336 : 808049 : bool minread /* = false */)
1337 : 808049 : : stmt (stmt), call (), dst (), src (), mode (mode), ostype ()
1338 : : {
1339 : 808049 : set_bound (dst_bndrng, maxwrite, minwrite, query, stmt);
1340 : 808049 : set_bound (src_bndrng, maxread, minread, query, stmt);
1341 : 808049 : }
1342 : :
1343 : : /* Set the access to at most MAXWRITE and MAXREAD bytes, and at least 1
1344 : : when MINWRITE or MINREAD, respectively, is set. */
1345 : 109 : access_data::access_data (range_query *query, tree expr, access_mode mode,
1346 : : tree maxwrite /* = NULL_TREE */,
1347 : : bool minwrite /* = false */,
1348 : : tree maxread /* = NULL_TREE */,
1349 : 109 : bool minread /* = false */)
1350 : 109 : : stmt (), call (expr), dst (), src (), mode (mode), ostype ()
1351 : : {
1352 : 109 : set_bound (dst_bndrng, maxwrite, minwrite, query, stmt);
1353 : 109 : set_bound (src_bndrng, maxread, minread, query, stmt);
1354 : 109 : }
1355 : :
1356 : : /* Set BNDRNG to the range of BOUND for the statement STMT. */
1357 : :
1358 : : void
1359 : 1616316 : access_data::set_bound (offset_int bndrng[2], tree bound, bool minaccess,
1360 : : range_query *query, gimple *stmt)
1361 : : {
1362 : : /* Set the default bounds of the access and adjust below. */
1363 : 2819225 : bndrng[0] = minaccess ? 1 : 0;
1364 : 1616316 : bndrng[1] = HOST_WIDE_INT_M1U;
1365 : :
1366 : : /* When BOUND is nonnull and a range can be extracted from it,
1367 : : set the bounds of the access to reflect both it and MINACCESS.
1368 : : BNDRNG[0] is the size of the minimum access. */
1369 : 1616316 : tree rng[2];
1370 : 1616316 : if (bound && get_size_range (query, bound, stmt, rng, SR_ALLOW_ZERO))
1371 : : {
1372 : 122793 : bndrng[0] = wi::to_offset (rng[0]);
1373 : 122793 : bndrng[1] = wi::to_offset (rng[1]);
1374 : 129979 : bndrng[0] = bndrng[0] > 0 && minaccess ? 1 : 0;
1375 : : }
1376 : 1616316 : }
1377 : :
1378 : : /* Set a bit for the PHI in VISITED and return true if it wasn't
1379 : : already set. */
1380 : :
1381 : : bool
1382 : 668916 : ssa_name_limit_t::visit_phi (tree ssa_name)
1383 : : {
1384 : 668916 : if (!visited)
1385 : 431853 : visited = BITMAP_ALLOC (NULL);
1386 : :
1387 : : /* Return false if SSA_NAME has already been visited. */
1388 : 668916 : return bitmap_set_bit (visited, SSA_NAME_VERSION (ssa_name));
1389 : : }
1390 : :
1391 : : /* Clear a bit for the PHI in VISITED. */
1392 : :
1393 : : void
1394 : 491396 : ssa_name_limit_t::leave_phi (tree ssa_name)
1395 : : {
1396 : : /* Return false if SSA_NAME has already been visited. */
1397 : 491396 : bitmap_clear_bit (visited, SSA_NAME_VERSION (ssa_name));
1398 : 491396 : }
1399 : :
1400 : : /* Return false if the SSA_NAME chain length counter has reached
1401 : : the limit, otherwise increment the counter and return true. */
1402 : :
1403 : : bool
1404 : 6043126 : ssa_name_limit_t::next ()
1405 : : {
1406 : : /* Return a negative value to let caller avoid recursing beyond
1407 : : the specified limit. */
1408 : 6043126 : if (ssa_def_max == 0)
1409 : : return false;
1410 : :
1411 : 6043117 : --ssa_def_max;
1412 : 6043117 : return true;
1413 : : }
1414 : :
1415 : : /* If the SSA_NAME has already been "seen" return a positive value.
1416 : : Otherwise add it to VISITED. If the SSA_NAME limit has been
1417 : : reached, return a negative value. Otherwise return zero. */
1418 : :
1419 : : int
1420 : 120573 : ssa_name_limit_t::next_phi (tree ssa_name)
1421 : : {
1422 : 120573 : {
1423 : 120573 : gimple *def_stmt = SSA_NAME_DEF_STMT (ssa_name);
1424 : : /* Return a positive value if the PHI has already been visited. */
1425 : 120573 : if (gimple_code (def_stmt) == GIMPLE_PHI
1426 : 120573 : && !visit_phi (ssa_name))
1427 : : return 1;
1428 : : }
1429 : :
1430 : : /* Return a negative value to let caller avoid recursing beyond
1431 : : the specified limit. */
1432 : 81199 : if (ssa_def_max == 0)
1433 : : return -1;
1434 : :
1435 : 81199 : --ssa_def_max;
1436 : :
1437 : 81199 : return 0;
1438 : : }
1439 : :
1440 : 11009339 : ssa_name_limit_t::~ssa_name_limit_t ()
1441 : : {
1442 : 11009339 : if (visited)
1443 : 431853 : BITMAP_FREE (visited);
1444 : 11009339 : }
1445 : :
1446 : : /* Default ctor. Initialize object with pointers to the range_query
1447 : : instance to use or null. */
1448 : :
1449 : 12750524 : pointer_query::pointer_query (range_query *qry /* = NULL */)
1450 : 12750524 : : rvals (qry), hits (), misses (), failures (), depth (), max_depth (),
1451 : 12750524 : var_cache ()
1452 : : {
1453 : : /* No op. */
1454 : 12750524 : }
1455 : :
1456 : : /* Return a pointer to the cached access_ref instance for the SSA_NAME
1457 : : PTR if it's there or null otherwise. */
1458 : :
1459 : : const access_ref *
1460 : 6043117 : pointer_query::get_ref (tree ptr, int ostype /* = 1 */) const
1461 : : {
1462 : 6043117 : unsigned version = SSA_NAME_VERSION (ptr);
1463 : 6043117 : unsigned idx = version << 1 | (ostype & 1);
1464 : 10192641 : if (var_cache.indices.length () <= idx)
1465 : : {
1466 : 2733691 : ++misses;
1467 : 2733691 : return NULL;
1468 : : }
1469 : :
1470 : 3309426 : unsigned cache_idx = var_cache.indices[idx];
1471 : 6618852 : if (var_cache.access_refs.length () <= cache_idx)
1472 : : {
1473 : 0 : ++misses;
1474 : 0 : return NULL;
1475 : : }
1476 : :
1477 : 3309426 : const access_ref &cache_ref = var_cache.access_refs[cache_idx];
1478 : 3309426 : if (cache_ref.ref)
1479 : : {
1480 : 1620023 : ++hits;
1481 : 1620023 : return &cache_ref;
1482 : : }
1483 : :
1484 : 1689403 : ++misses;
1485 : 1689403 : return NULL;
1486 : : }
1487 : :
1488 : : /* Retrieve the access_ref instance for a variable from the cache if it's
1489 : : there or compute it and insert it into the cache if it's nonnonull. */
1490 : :
1491 : : bool
1492 : 7809545 : pointer_query::get_ref (tree ptr, gimple *stmt, access_ref *pref,
1493 : : int ostype /* = 1 */)
1494 : : {
1495 : 7809545 : const unsigned version
1496 : 7809545 : = TREE_CODE (ptr) == SSA_NAME ? SSA_NAME_VERSION (ptr) : 0;
1497 : :
1498 : 1885932 : if (version)
1499 : : {
1500 : 1885932 : unsigned idx = version << 1 | (ostype & 1);
1501 : 1885932 : if (idx < var_cache.indices.length ())
1502 : : {
1503 : 966165 : unsigned cache_idx = var_cache.indices[idx] - 1;
1504 : 966165 : if (cache_idx < var_cache.access_refs.length ()
1505 : 966165 : && var_cache.access_refs[cache_idx].ref)
1506 : : {
1507 : 0 : ++hits;
1508 : 0 : *pref = var_cache.access_refs[cache_idx];
1509 : 0 : return true;
1510 : : }
1511 : : }
1512 : :
1513 : 1885932 : ++misses;
1514 : : }
1515 : :
1516 : 7809545 : if (!compute_objsize (ptr, stmt, ostype, pref, this))
1517 : : {
1518 : 9250 : ++failures;
1519 : 9250 : return false;
1520 : : }
1521 : :
1522 : : return true;
1523 : : }
1524 : :
1525 : : /* Add a copy of the access_ref REF for the SSA_NAME to the cache if it's
1526 : : nonnull. */
1527 : :
1528 : : void
1529 : 3236327 : pointer_query::put_ref (tree ptr, const access_ref &ref, int ostype /* = 1 */)
1530 : : {
1531 : : /* Only add populated/valid entries. */
1532 : 3236327 : if (!ref.ref || ref.sizrng[0] < 0)
1533 : 0 : return;
1534 : :
1535 : : /* Add REF to the two-level cache. */
1536 : 3236327 : unsigned version = SSA_NAME_VERSION (ptr);
1537 : 3236327 : unsigned idx = version << 1 | (ostype & 1);
1538 : :
1539 : : /* Grow INDICES if necessary. An index is valid if it's nonzero.
1540 : : Its value minus one is the index into ACCESS_REFS. Not all
1541 : : entries are valid. */
1542 : 5545278 : if (var_cache.indices.length () <= idx)
1543 : 1688120 : var_cache.indices.safe_grow_cleared (idx + 1);
1544 : :
1545 : 3236327 : if (!var_cache.indices[idx])
1546 : 4923604 : var_cache.indices[idx] = var_cache.access_refs.length () + 1;
1547 : :
1548 : : /* Grow ACCESS_REF cache if necessary. An entry is valid if its
1549 : : REF member is nonnull. All entries except for the last two
1550 : : are valid. Once nonnull, the REF value must stay unchanged. */
1551 : 3236327 : unsigned cache_idx = var_cache.indices[idx];
1552 : 5545278 : if (var_cache.access_refs.length () <= cache_idx)
1553 : 2925490 : var_cache.access_refs.safe_grow_cleared (cache_idx + 1);
1554 : :
1555 : 3236327 : access_ref &cache_ref = var_cache.access_refs[cache_idx];
1556 : 3236327 : if (cache_ref.ref)
1557 : : {
1558 : 310837 : gcc_checking_assert (cache_ref.ref == ref.ref);
1559 : : return;
1560 : : }
1561 : :
1562 : 2925490 : cache_ref = ref;
1563 : : }
1564 : :
1565 : : /* Flush the cache if it's nonnull. */
1566 : :
1567 : : void
1568 : 7878499 : pointer_query::flush_cache ()
1569 : : {
1570 : 7878499 : var_cache.indices.release ();
1571 : 7878499 : var_cache.access_refs.release ();
1572 : 7878499 : }
1573 : :
1574 : : /* Dump statistics and, optionally, cache contents to DUMP_FILE. */
1575 : :
1576 : : void
1577 : 149 : pointer_query::dump (FILE *dump_file, bool contents /* = false */)
1578 : : {
1579 : 149 : unsigned nused = 0, nrefs = 0;
1580 : 149 : unsigned nidxs = var_cache.indices.length ();
1581 : 149 : for (unsigned i = 0; i != nidxs; ++i)
1582 : : {
1583 : 0 : unsigned ari = var_cache.indices[i];
1584 : 0 : if (!ari)
1585 : 0 : continue;
1586 : :
1587 : 0 : ++nused;
1588 : :
1589 : 0 : const access_ref &aref = var_cache.access_refs[ari];
1590 : 0 : if (!aref.ref)
1591 : 0 : continue;
1592 : :
1593 : 0 : ++nrefs;
1594 : : }
1595 : :
1596 : 149 : fprintf (dump_file, "pointer_query counters:\n"
1597 : : " index cache size: %u\n"
1598 : : " index entries: %u\n"
1599 : : " access cache size: %u\n"
1600 : : " access entries: %u\n"
1601 : : " hits: %u\n"
1602 : : " misses: %u\n"
1603 : : " failures: %u\n"
1604 : : " max_depth: %u\n",
1605 : : nidxs, nused,
1606 : : var_cache.access_refs.length (), nrefs,
1607 : : hits, misses, failures, max_depth);
1608 : :
1609 : 149 : if (!contents || !nidxs)
1610 : : return;
1611 : :
1612 : 0 : fputs ("\npointer_query cache contents:\n", dump_file);
1613 : :
1614 : 0 : for (unsigned i = 0; i != nidxs; ++i)
1615 : : {
1616 : 0 : unsigned ari = var_cache.indices[i];
1617 : 0 : if (!ari)
1618 : 0 : continue;
1619 : :
1620 : 0 : const access_ref &aref = var_cache.access_refs[ari];
1621 : 0 : if (!aref.ref)
1622 : 0 : continue;
1623 : :
1624 : : /* The level-1 cache index corresponds to the SSA_NAME_VERSION
1625 : : shifted left by one and ORed with the Object Size Type in
1626 : : the lowest bit. Print the two separately. */
1627 : 0 : unsigned ver = i >> 1;
1628 : 0 : unsigned ost = i & 1;
1629 : :
1630 : 0 : fprintf (dump_file, " %u.%u[%u]: ", ver, ost, ari);
1631 : 0 : if (tree name = ssa_name (ver))
1632 : : {
1633 : 0 : print_generic_expr (dump_file, name);
1634 : 0 : fputs (" = ", dump_file);
1635 : : }
1636 : : else
1637 : 0 : fprintf (dump_file, " _%u = ", ver);
1638 : :
1639 : 0 : aref.dump (dump_file);
1640 : : }
1641 : :
1642 : 0 : fputc ('\n', dump_file);
1643 : : }
1644 : :
1645 : : /* A helper of compute_objsize_r() to determine the size from an assignment
1646 : : statement STMT with the RHS of either MIN_EXPR or MAX_EXPR. On success
1647 : : set PREF->REF to the operand with more or less space remaining,
1648 : : respectively, if both refer to the same (sub)object, or to PTR if they
1649 : : might not, and return true. Otherwise, if the identity of neither
1650 : : operand can be determined, return false. */
1651 : :
1652 : : static bool
1653 : 923 : handle_min_max_size (tree ptr, int ostype, access_ref *pref,
1654 : : ssa_name_limit_t &snlim, pointer_query *qry)
1655 : : {
1656 : 923 : gimple *stmt = SSA_NAME_DEF_STMT (ptr);
1657 : 923 : const tree_code code = gimple_assign_rhs_code (stmt);
1658 : :
1659 : : /* In a valid MAX_/MIN_EXPR both operands must refer to the same array.
1660 : : Determine the size/offset of each and use the one with more or less
1661 : : space remaining, respectively. If either fails, use the information
1662 : : determined from the other instead, adjusted up or down as appropriate
1663 : : for the expression. */
1664 : 923 : access_ref aref[2] = { *pref, *pref };
1665 : 923 : tree arg1 = gimple_assign_rhs1 (stmt);
1666 : 923 : if (!compute_objsize_r (arg1, stmt, false, ostype, &aref[0], snlim, qry))
1667 : : {
1668 : 5 : aref[0].base0 = false;
1669 : 5 : aref[0].offrng[0] = aref[0].offrng[1] = 0;
1670 : 5 : aref[0].add_max_offset ();
1671 : 5 : aref[0].set_max_size_range ();
1672 : : }
1673 : :
1674 : 923 : tree arg2 = gimple_assign_rhs2 (stmt);
1675 : 923 : if (!compute_objsize_r (arg2, stmt, false, ostype, &aref[1], snlim, qry))
1676 : : {
1677 : 4 : aref[1].base0 = false;
1678 : 4 : aref[1].offrng[0] = aref[1].offrng[1] = 0;
1679 : 4 : aref[1].add_max_offset ();
1680 : 4 : aref[1].set_max_size_range ();
1681 : : }
1682 : :
1683 : 923 : if (!aref[0].ref && !aref[1].ref)
1684 : : /* Fail if the identity of neither argument could be determined. */
1685 : : return false;
1686 : :
1687 : 923 : bool i0 = false;
1688 : 923 : if (aref[0].ref && aref[0].base0)
1689 : : {
1690 : 177 : if (aref[1].ref && aref[1].base0)
1691 : : {
1692 : : /* If the object referenced by both arguments has been determined
1693 : : set *PREF to the one with more or less space remainng, whichever
1694 : : is appopriate for CODE.
1695 : : TODO: Indicate when the objects are distinct so it can be
1696 : : diagnosed. */
1697 : 81 : i0 = code == MAX_EXPR;
1698 : 81 : const bool i1 = !i0;
1699 : :
1700 : 81 : if (aref[i0].size_remaining () < aref[i1].size_remaining ())
1701 : 20 : *pref = aref[i1];
1702 : : else
1703 : 61 : *pref = aref[i0];
1704 : :
1705 : 81 : if (aref[i0].ref != aref[i1].ref)
1706 : : /* If the operands don't refer to the same (sub)object set
1707 : : PREF->REF to the SSA_NAME from which STMT was obtained
1708 : : so that both can be identified in a diagnostic. */
1709 : 63 : pref->ref = ptr;
1710 : :
1711 : 81 : return true;
1712 : : }
1713 : :
1714 : : /* If only the object referenced by one of the arguments could be
1715 : : determined, use it and... */
1716 : 96 : *pref = aref[0];
1717 : 96 : i0 = true;
1718 : 96 : }
1719 : : else
1720 : 746 : *pref = aref[1];
1721 : :
1722 : 842 : const bool i1 = !i0;
1723 : : /* ...see if the offset obtained from the other pointer can be used
1724 : : to tighten up the bound on the offset obtained from the first. */
1725 : 373 : if ((code == MAX_EXPR && aref[i1].offrng[1] < aref[i0].offrng[0])
1726 : 1203 : || (code == MIN_EXPR && aref[i0].offrng[0] < aref[i1].offrng[1]))
1727 : : {
1728 : 79 : pref->offrng[0] = aref[i0].offrng[0];
1729 : 79 : pref->offrng[1] = aref[i0].offrng[1];
1730 : : }
1731 : :
1732 : : /* Replace PTR->REF with the SSA_NAME to indicate the expression
1733 : : might not refer to the same (sub)object. */
1734 : 842 : pref->ref = ptr;
1735 : 842 : return true;
1736 : : }
1737 : :
1738 : : /* A helper of compute_objsize_r() to determine the size of a DECL.
1739 : : Return true on success and (possibly in the future) false on failure. */
1740 : :
1741 : : static bool
1742 : 4667998 : handle_decl (tree decl, bool addr, access_ref *pref)
1743 : : {
1744 : 4667998 : tree decl_type = TREE_TYPE (decl);
1745 : :
1746 : 4667998 : pref->ref = decl;
1747 : :
1748 : : /* Reset the offset in case it was set by a prior call and not
1749 : : cleared by the caller. The offset is only adjusted after
1750 : : the identity of the object has been determined. */
1751 : 4667998 : pref->offrng[0] = pref->offrng[1] = 0;
1752 : :
1753 : 4667998 : if (!addr && POINTER_TYPE_P (decl_type))
1754 : : {
1755 : : /* Set the maximum size if the reference is to the pointer
1756 : : itself (as opposed to what it points to), and clear
1757 : : BASE0 since the offset isn't necessarily zero-based. */
1758 : 42288 : pref->set_max_size_range ();
1759 : 42288 : pref->base0 = false;
1760 : 42288 : return true;
1761 : : }
1762 : :
1763 : : /* Valid offsets into the object are nonnegative. */
1764 : 4625710 : pref->base0 = true;
1765 : :
1766 : 4625710 : if (tree size = decl_init_size (decl, false))
1767 : 4602678 : if (TREE_CODE (size) == INTEGER_CST)
1768 : : {
1769 : 4602558 : pref->sizrng[0] = wi::to_offset (size);
1770 : 4602558 : pref->sizrng[1] = pref->sizrng[0];
1771 : 4602558 : return true;
1772 : : }
1773 : :
1774 : 23152 : pref->set_max_size_range ();
1775 : 23152 : return true;
1776 : : }
1777 : :
1778 : : /* A helper of compute_objsize_r() to determine the size from ARRAY_REF
1779 : : AREF. ADDR is true if PTR is the operand of ADDR_EXPR. Return true
1780 : : on success and false on failure. */
1781 : :
1782 : : static bool
1783 : 825831 : handle_array_ref (tree aref, gimple *stmt, bool addr, int ostype,
1784 : : access_ref *pref, ssa_name_limit_t &snlim,
1785 : : pointer_query *qry)
1786 : : {
1787 : 825831 : gcc_assert (TREE_CODE (aref) == ARRAY_REF);
1788 : :
1789 : 825831 : tree arefop = TREE_OPERAND (aref, 0);
1790 : 825831 : tree reftype = TREE_TYPE (arefop);
1791 : 825831 : if (!addr && TREE_CODE (TREE_TYPE (reftype)) == POINTER_TYPE)
1792 : : /* Avoid arrays of pointers. FIXME: Hande pointers to arrays
1793 : : of known bound. */
1794 : : return false;
1795 : :
1796 : 816575 : if (!compute_objsize_r (arefop, stmt, addr, ostype, pref, snlim, qry))
1797 : : return false;
1798 : :
1799 : 816575 : offset_int orng[2];
1800 : 816575 : tree off = pref->eval (TREE_OPERAND (aref, 1));
1801 : 816575 : range_query *const rvals = qry ? qry->rvals : NULL;
1802 : 816575 : if (!get_offset_range (off, stmt, orng, rvals))
1803 : : {
1804 : : /* Set ORNG to the maximum offset representable in ptrdiff_t. */
1805 : 42873 : orng[1] = wi::to_offset (TYPE_MAX_VALUE (ptrdiff_type_node));
1806 : 42873 : orng[0] = -orng[1] - 1;
1807 : : }
1808 : :
1809 : : /* Convert the array index range determined above to a byte offset. */
1810 : 816575 : tree lowbnd = array_ref_low_bound (aref);
1811 : 816575 : if (TREE_CODE (lowbnd) == INTEGER_CST && !integer_zerop (lowbnd))
1812 : : {
1813 : : /* Adjust the index by the low bound of the array domain (0 in C/C++,
1814 : : 1 in Fortran and anything in Ada) by applying the same processing
1815 : : as in get_offset_range. */
1816 : 18301 : const wide_int wlb = wi::to_wide (lowbnd);
1817 : 18301 : signop sgn = SIGNED;
1818 : 18301 : if (TYPE_UNSIGNED (TREE_TYPE (lowbnd))
1819 : 18301 : && wlb.get_precision () < TYPE_PRECISION (sizetype))
1820 : : sgn = UNSIGNED;
1821 : 18301 : const offset_int lb = offset_int::from (wlb, sgn);
1822 : 18301 : orng[0] -= lb;
1823 : 18301 : orng[1] -= lb;
1824 : 18301 : }
1825 : :
1826 : 816575 : tree eltype = TREE_TYPE (aref);
1827 : 816575 : tree tpsize = TYPE_SIZE_UNIT (eltype);
1828 : 816575 : if (!tpsize || TREE_CODE (tpsize) != INTEGER_CST)
1829 : : {
1830 : 450 : pref->add_max_offset ();
1831 : 450 : return true;
1832 : : }
1833 : :
1834 : 816125 : offset_int sz = wi::to_offset (tpsize);
1835 : 816125 : orng[0] *= sz;
1836 : 816125 : orng[1] *= sz;
1837 : :
1838 : 816125 : if (ostype && TREE_CODE (eltype) == ARRAY_TYPE)
1839 : : {
1840 : : /* Except for the permissive raw memory functions which use
1841 : : the size of the whole object determined above, use the size
1842 : : of the referenced array. Because the overall offset is from
1843 : : the beginning of the complete array object add this overall
1844 : : offset to the size of array. */
1845 : 5780 : offset_int sizrng[2] =
1846 : : {
1847 : 5780 : pref->offrng[0] + orng[0] + sz,
1848 : 5780 : pref->offrng[1] + orng[1] + sz
1849 : : };
1850 : 5780 : if (sizrng[1] < sizrng[0])
1851 : 2 : std::swap (sizrng[0], sizrng[1]);
1852 : 5780 : if (sizrng[0] >= 0 && sizrng[0] <= pref->sizrng[0])
1853 : 5287 : pref->sizrng[0] = sizrng[0];
1854 : 5780 : if (sizrng[1] >= 0 && sizrng[1] <= pref->sizrng[1])
1855 : 5420 : pref->sizrng[1] = sizrng[1];
1856 : : }
1857 : :
1858 : 816125 : pref->add_offset (orng[0], orng[1]);
1859 : 816125 : return true;
1860 : : }
1861 : :
1862 : : /* Given a COMPONENT_REF CREF, set *PREF size to the size of the referenced
1863 : : member. */
1864 : :
1865 : : static void
1866 : 52171 : set_component_ref_size (tree cref, access_ref *pref)
1867 : : {
1868 : 52171 : const tree base = TREE_OPERAND (cref, 0);
1869 : 52171 : const tree base_type = TREE_TYPE (base);
1870 : :
1871 : : /* SAM is set for array members that might need special treatment. */
1872 : 52171 : special_array_member sam;
1873 : 52171 : tree size = component_ref_size (cref, &sam);
1874 : 52171 : if (sam == special_array_member::int_0)
1875 : 191 : pref->sizrng[0] = pref->sizrng[1] = 0;
1876 : 51980 : else if (!pref->trail1special && sam == special_array_member::trail_1)
1877 : 27 : pref->sizrng[0] = pref->sizrng[1] = 1;
1878 : 51953 : else if (size && TREE_CODE (size) == INTEGER_CST)
1879 : 49755 : pref->sizrng[0] = pref->sizrng[1] = wi::to_offset (size);
1880 : : else
1881 : : {
1882 : : /* When the size of the member is unknown it's either a flexible
1883 : : array member or a trailing special array member (either zero
1884 : : length or one-element). Set the size to the maximum minus
1885 : : the constant size of the base object's type. */
1886 : 2198 : pref->sizrng[0] = 0;
1887 : 2198 : pref->sizrng[1] = wi::to_offset (TYPE_MAX_VALUE (ptrdiff_type_node));
1888 : 2198 : if (tree base_size = TYPE_SIZE_UNIT (base_type))
1889 : 2198 : if (TREE_CODE (base_size) == INTEGER_CST)
1890 : 2159 : pref->sizrng[1] -= wi::to_offset (base_size);
1891 : : }
1892 : 52171 : }
1893 : :
1894 : : /* A helper of compute_objsize_r() to determine the size from COMPONENT_REF
1895 : : CREF. Return true on success and false on failure. */
1896 : :
1897 : : static bool
1898 : 2997496 : handle_component_ref (tree cref, gimple *stmt, bool addr, int ostype,
1899 : : access_ref *pref, ssa_name_limit_t &snlim,
1900 : : pointer_query *qry)
1901 : : {
1902 : 2997496 : gcc_assert (TREE_CODE (cref) == COMPONENT_REF);
1903 : :
1904 : 2997496 : const tree base = TREE_OPERAND (cref, 0);
1905 : 2997496 : const tree field = TREE_OPERAND (cref, 1);
1906 : 2997496 : access_ref base_ref = *pref;
1907 : :
1908 : : /* Unconditionally determine the size of the base object (it could
1909 : : be smaller than the referenced member when the object is stored
1910 : : in a buffer with an insufficient size). */
1911 : 2997496 : if (!compute_objsize_r (base, stmt, addr, 0, &base_ref, snlim, qry))
1912 : : return false;
1913 : :
1914 : : /* Add the offset of the member to the offset into the object computed
1915 : : so far. */
1916 : 2997496 : tree offset = byte_position (field);
1917 : 2997496 : if (TREE_CODE (offset) == INTEGER_CST)
1918 : 2997469 : base_ref.add_offset (wi::to_offset (offset));
1919 : : else
1920 : 27 : base_ref.add_max_offset ();
1921 : :
1922 : 2997496 : if (!base_ref.ref)
1923 : : /* PREF->REF may have been already set to an SSA_NAME earlier
1924 : : to provide better context for diagnostics. In that case,
1925 : : leave it unchanged. */
1926 : 0 : base_ref.ref = base;
1927 : :
1928 : 2997496 : const tree base_type = TREE_TYPE (base);
1929 : 2997496 : if (TREE_CODE (base_type) == UNION_TYPE)
1930 : : /* In accesses through union types consider the entire unions
1931 : : rather than just their members. */
1932 : : ostype = 0;
1933 : :
1934 : 2616888 : if (ostype == 0)
1935 : : {
1936 : : /* In OSTYPE zero (for raw memory functions like memcpy), use
1937 : : the maximum size instead if the identity of the enclosing
1938 : : object cannot be determined. */
1939 : 2945314 : *pref = base_ref;
1940 : 2945314 : return true;
1941 : : }
1942 : :
1943 : 52182 : pref->ref = field;
1944 : :
1945 : 52182 : if (!addr && POINTER_TYPE_P (TREE_TYPE (field)))
1946 : : {
1947 : : /* Set maximum size if the reference is to the pointer member
1948 : : itself (as opposed to what it points to). */
1949 : 11 : pref->set_max_size_range ();
1950 : 11 : return true;
1951 : : }
1952 : :
1953 : 52171 : set_component_ref_size (cref, pref);
1954 : :
1955 : 52171 : if (base_ref.size_remaining () < pref->size_remaining ())
1956 : : /* Use the base object if it's smaller than the member. */
1957 : 447 : *pref = base_ref;
1958 : :
1959 : : return true;
1960 : : }
1961 : :
1962 : : /* A helper of compute_objsize_r() to determine the size from MEM_REF
1963 : : MREF. Return true on success and false on failure. */
1964 : :
1965 : : static bool
1966 : 2572877 : handle_mem_ref (tree mref, gimple *stmt, int ostype, access_ref *pref,
1967 : : ssa_name_limit_t &snlim, pointer_query *qry)
1968 : : {
1969 : 2572877 : gcc_assert (TREE_CODE (mref) == MEM_REF);
1970 : :
1971 : 2572877 : tree mreftype = TYPE_MAIN_VARIANT (TREE_TYPE (mref));
1972 : 2572877 : if (VECTOR_TYPE_P (mreftype))
1973 : : {
1974 : : /* Hack: Handle MEM_REFs of vector types as those to complete
1975 : : objects; those may be synthesized from multiple assignments
1976 : : to consecutive data members (see PR 93200 and 96963).
1977 : : FIXME: Vectorized assignments should only be present after
1978 : : vectorization so this hack is only necessary after it has
1979 : : run and could be avoided in calls from prior passes (e.g.,
1980 : : tree-ssa-strlen.cc).
1981 : : FIXME: Deal with this more generally, e.g., by marking up
1982 : : such MEM_REFs at the time they're created. */
1983 : 61250 : ostype = 0;
1984 : : }
1985 : :
1986 : 2572877 : tree mrefop = TREE_OPERAND (mref, 0);
1987 : 2572877 : if (!compute_objsize_r (mrefop, stmt, false, ostype, pref, snlim, qry))
1988 : : return false;
1989 : :
1990 : 2572868 : ++pref->deref;
1991 : :
1992 : 2572868 : offset_int orng[2];
1993 : 2572868 : tree off = pref->eval (TREE_OPERAND (mref, 1));
1994 : 2572868 : range_query *const rvals = qry ? qry->rvals : NULL;
1995 : 2572868 : if (!get_offset_range (off, stmt, orng, rvals))
1996 : : {
1997 : : /* Set ORNG to the maximum offset representable in ptrdiff_t. */
1998 : 0 : orng[1] = wi::to_offset (TYPE_MAX_VALUE (ptrdiff_type_node));
1999 : 0 : orng[0] = -orng[1] - 1;
2000 : : }
2001 : :
2002 : 2572868 : pref->add_offset (orng[0], orng[1]);
2003 : 2572868 : return true;
2004 : : }
2005 : :
2006 : : /* A helper of compute_objsize_r() to determine the size from SSA_NAME
2007 : : PTR. Return true on success and false on failure. */
2008 : :
2009 : : static bool
2010 : 6043126 : handle_ssa_name (tree ptr, bool addr, int ostype,
2011 : : access_ref *pref, ssa_name_limit_t &snlim,
2012 : : pointer_query *qry)
2013 : : {
2014 : 6043126 : if (!snlim.next ())
2015 : : return false;
2016 : :
2017 : : /* Only process an SSA_NAME if the recursion limit has not yet
2018 : : been reached. */
2019 : 6043117 : if (qry)
2020 : : {
2021 : 6043117 : if (++qry->depth > qry->max_depth)
2022 : 677047 : qry->max_depth = qry->depth;
2023 : 6043117 : if (const access_ref *cache_ref = qry->get_ref (ptr, ostype))
2024 : : {
2025 : : /* Add the number of DEREFerences accummulated so far. */
2026 : 1620023 : const int deref = pref->deref;
2027 : 1620023 : *pref = *cache_ref;
2028 : 1620023 : pref->deref += deref;
2029 : 1620023 : return true;
2030 : : }
2031 : : }
2032 : :
2033 : 4423094 : gimple *stmt = SSA_NAME_DEF_STMT (ptr);
2034 : 4423094 : if (is_gimple_call (stmt))
2035 : : {
2036 : : /* If STMT is a call to an allocation function get the size
2037 : : from its argument(s). If successful, also set *PREF->REF
2038 : : to PTR for the caller to include in diagnostics. */
2039 : 1978880 : wide_int wr[2];
2040 : 395776 : range_query *const rvals = qry ? qry->rvals : NULL;
2041 : 395776 : if (gimple_call_alloc_size (stmt, wr, rvals))
2042 : : {
2043 : 83771 : pref->ref = ptr;
2044 : 83771 : pref->sizrng[0] = offset_int::from (wr[0], UNSIGNED);
2045 : 83771 : pref->sizrng[1] = offset_int::from (wr[1], UNSIGNED);
2046 : : /* Constrain both bounds to a valid size. */
2047 : 83771 : offset_int maxsize = wi::to_offset (max_object_size ());
2048 : 83771 : if (pref->sizrng[0] > maxsize)
2049 : 336 : pref->sizrng[0] = maxsize;
2050 : 83771 : if (pref->sizrng[1] > maxsize)
2051 : 12362 : pref->sizrng[1] = maxsize;
2052 : : }
2053 : : else
2054 : : {
2055 : : /* For functions known to return one of their pointer arguments
2056 : : try to determine what the returned pointer points to, and on
2057 : : success add OFFRNG which was set to the offset added by
2058 : : the function (e.g., memchr) to the overall offset. */
2059 : : bool past_end;
2060 : 312005 : offset_int offrng[2];
2061 : 312005 : if (tree ret = gimple_call_return_array (stmt, offrng, &past_end,
2062 : : snlim, qry))
2063 : : {
2064 : 13393 : if (!compute_objsize_r (ret, stmt, addr, ostype, pref, snlim, qry))
2065 : 209 : return false;
2066 : :
2067 : : /* Cap OFFRNG[1] to at most the remaining size of
2068 : : the object. */
2069 : 13184 : offset_int remrng[2];
2070 : 13184 : remrng[1] = pref->size_remaining (remrng);
2071 : 13184 : if (remrng[1] != 0 && !past_end)
2072 : : /* Decrement the size for functions that never return
2073 : : a past-the-end pointer. */
2074 : 12893 : remrng[1] -= 1;
2075 : :
2076 : 13184 : if (remrng[1] < offrng[1])
2077 : 789 : offrng[1] = remrng[1];
2078 : 13184 : pref->add_offset (offrng[0], offrng[1]);
2079 : : }
2080 : : else
2081 : : {
2082 : : /* For other calls that might return arbitrary pointers
2083 : : including into the middle of objects set the size
2084 : : range to maximum, clear PREF->BASE0, and also set
2085 : : PREF->REF to include in diagnostics. */
2086 : 298612 : pref->set_max_size_range ();
2087 : 298612 : pref->base0 = false;
2088 : 298612 : pref->ref = ptr;
2089 : : }
2090 : : }
2091 : 395567 : qry->put_ref (ptr, *pref, ostype);
2092 : 395567 : return true;
2093 : 1187328 : }
2094 : :
2095 : 4027318 : if (gimple_nop_p (stmt))
2096 : : {
2097 : : /* For a function argument try to determine the byte size
2098 : : of the array from the current function declaratation
2099 : : (e.g., attribute access or related). */
2100 : 3804195 : wide_int wr[2];
2101 : 760839 : bool static_array = false;
2102 : 760839 : if (tree ref = gimple_parm_array_size (ptr, wr, &static_array))
2103 : : {
2104 : 194 : pref->parmarray = !static_array;
2105 : 194 : pref->sizrng[0] = offset_int::from (wr[0], UNSIGNED);
2106 : 194 : pref->sizrng[1] = offset_int::from (wr[1], UNSIGNED);
2107 : 194 : pref->ref = ref;
2108 : 194 : qry->put_ref (ptr, *pref, ostype);
2109 : 194 : return true;
2110 : : }
2111 : :
2112 : 760645 : pref->set_max_size_range ();
2113 : 760645 : pref->base0 = false;
2114 : 760645 : pref->ref = ptr;
2115 : 760645 : qry->put_ref (ptr, *pref, ostype);
2116 : 760645 : return true;
2117 : 2282517 : }
2118 : :
2119 : 3266479 : if (gimple_code (stmt) == GIMPLE_PHI)
2120 : : {
2121 : : /* Pass PTR to get_ref() via PREF. If all PHI arguments refer
2122 : : to the same object the function will replace it with it. */
2123 : 548226 : pref->ref = ptr;
2124 : 548226 : access_ref phi_ref = *pref;
2125 : 548226 : if (!pref->get_ref (NULL, &phi_ref, ostype, &snlim, qry))
2126 : : return false;
2127 : 491276 : *pref = phi_ref;
2128 : 491276 : qry->put_ref (ptr, *pref, ostype);
2129 : 491276 : return true;
2130 : : }
2131 : :
2132 : 2718253 : if (!is_gimple_assign (stmt))
2133 : : {
2134 : : /* Clear BASE0 since the assigned pointer might point into
2135 : : the middle of the object, set the maximum size range and,
2136 : : if the SSA_NAME refers to a function argumnent, set
2137 : : PREF->REF to it. */
2138 : 7436 : pref->base0 = false;
2139 : 7436 : pref->set_max_size_range ();
2140 : 7436 : pref->ref = ptr;
2141 : 7436 : return true;
2142 : : }
2143 : :
2144 : 2710817 : tree_code code = gimple_assign_rhs_code (stmt);
2145 : :
2146 : 2710817 : if (code == MAX_EXPR || code == MIN_EXPR)
2147 : : {
2148 : 923 : if (!handle_min_max_size (ptr, ostype, pref, snlim, qry))
2149 : : return false;
2150 : :
2151 : 923 : qry->put_ref (ptr, *pref, ostype);
2152 : 923 : return true;
2153 : : }
2154 : :
2155 : 2709894 : tree rhs = gimple_assign_rhs1 (stmt);
2156 : :
2157 : 2709894 : if (code == POINTER_PLUS_EXPR
2158 : 2709894 : && TREE_CODE (TREE_TYPE (rhs)) == POINTER_TYPE)
2159 : : {
2160 : : /* Compute the size of the object first. */
2161 : 702965 : if (!compute_objsize_r (rhs, stmt, addr, ostype, pref, snlim, qry))
2162 : : return false;
2163 : :
2164 : 659630 : offset_int orng[2];
2165 : 659630 : tree off = gimple_assign_rhs2 (stmt);
2166 : 659630 : range_query *const rvals = qry ? qry->rvals : NULL;
2167 : 659630 : if (get_offset_range (off, stmt, orng, rvals))
2168 : 420450 : pref->add_offset (orng[0], orng[1]);
2169 : : else
2170 : 239180 : pref->add_max_offset ();
2171 : :
2172 : 659630 : qry->put_ref (ptr, *pref, ostype);
2173 : 659630 : return true;
2174 : : }
2175 : :
2176 : 2006929 : if (code == ADDR_EXPR || code == SSA_NAME)
2177 : : {
2178 : 472165 : if (!compute_objsize_r (rhs, stmt, addr, ostype, pref, snlim, qry))
2179 : : return false;
2180 : 470912 : qry->put_ref (ptr, *pref, ostype);
2181 : 470912 : return true;
2182 : : }
2183 : :
2184 : 1534764 : if (ostype > 1 && POINTER_TYPE_P (TREE_TYPE (rhs)))
2185 : : {
2186 : : /* When determining the qualifiers follow the pointer but
2187 : : avoid caching the result. As the pointer is added to
2188 : : and/or dereferenced the computed size and offset need
2189 : : not be meaningful for other queries involving the same
2190 : : pointer. */
2191 : 0 : if (!compute_objsize_r (rhs, stmt, addr, ostype, pref, snlim, qry))
2192 : : return false;
2193 : :
2194 : 0 : rhs = pref->ref;
2195 : : }
2196 : :
2197 : : /* (This could also be an assignment from a nonlocal pointer.) Save
2198 : : PTR to mention in diagnostics but otherwise treat it as a pointer
2199 : : to an unknown object. */
2200 : 1534764 : pref->ref = rhs;
2201 : 1534764 : pref->base0 = false;
2202 : 1534764 : pref->set_max_size_range ();
2203 : 1534764 : return true;
2204 : : }
2205 : :
2206 : : /* Helper to compute the size of the object referenced by the PTR
2207 : : expression which must have pointer type, using Object Size type
2208 : : OSTYPE (only the least significant 2 bits are used).
2209 : : On success, sets PREF->REF to the DECL of the referenced object
2210 : : if it's unique, otherwise to null, PREF->OFFRNG to the range of
2211 : : offsets into it, and PREF->SIZRNG to the range of sizes of
2212 : : the object(s).
2213 : : ADDR is true for an enclosing ADDR_EXPR.
2214 : : SNLIM is used to avoid visiting the same PHI operand multiple
2215 : : times, and, when nonnull, RVALS to determine range information.
2216 : : Returns true on success, false when a meaningful size (or range)
2217 : : cannot be determined.
2218 : :
2219 : : The function is intended for diagnostics and should not be used
2220 : : to influence code generation or optimization. */
2221 : :
2222 : : static bool
2223 : 19381999 : compute_objsize_r (tree ptr, gimple *stmt, bool addr, int ostype,
2224 : : access_ref *pref, ssa_name_limit_t &snlim,
2225 : : pointer_query *qry)
2226 : : {
2227 : 19381999 : STRIP_NOPS (ptr);
2228 : :
2229 : 19381999 : if (DECL_P (ptr))
2230 : 4667998 : return handle_decl (ptr, addr, pref);
2231 : :
2232 : 14714001 : switch (TREE_CODE (ptr))
2233 : : {
2234 : 1608687 : case ADDR_EXPR:
2235 : 1608687 : {
2236 : 1608687 : tree ref = TREE_OPERAND (ptr, 0);
2237 : 1608687 : if (!compute_objsize_r (ref, stmt, true, ostype, pref, snlim, qry))
2238 : : return false;
2239 : :
2240 : 1608687 : --pref->deref;
2241 : 1608687 : return true;
2242 : : }
2243 : :
2244 : 4181 : case BIT_FIELD_REF:
2245 : 4181 : {
2246 : 4181 : tree ref = TREE_OPERAND (ptr, 0);
2247 : 4181 : if (!compute_objsize_r (ref, stmt, addr, ostype, pref, snlim, qry))
2248 : : return false;
2249 : :
2250 : 4181 : offset_int off = wi::to_offset (pref->eval (TREE_OPERAND (ptr, 2)));
2251 : 4181 : pref->add_offset (off / BITS_PER_UNIT);
2252 : 4181 : return true;
2253 : : }
2254 : :
2255 : 825831 : case ARRAY_REF:
2256 : 825831 : return handle_array_ref (ptr, stmt, addr, ostype, pref, snlim, qry);
2257 : :
2258 : 2997496 : case COMPONENT_REF:
2259 : 2997496 : return handle_component_ref (ptr, stmt, addr, ostype, pref, snlim, qry);
2260 : :
2261 : 2572877 : case MEM_REF:
2262 : 2572877 : return handle_mem_ref (ptr, stmt, ostype, pref, snlim, qry);
2263 : :
2264 : 12300 : case TARGET_MEM_REF:
2265 : 12300 : {
2266 : 12300 : tree ref = TREE_OPERAND (ptr, 0);
2267 : 12300 : if (!compute_objsize_r (ref, stmt, addr, ostype, pref, snlim, qry))
2268 : : return false;
2269 : :
2270 : : /* TODO: Handle remaining operands. Until then, add maximum offset. */
2271 : 12300 : pref->ref = ptr;
2272 : 12300 : pref->add_max_offset ();
2273 : 12300 : return true;
2274 : : }
2275 : :
2276 : 290995 : case INTEGER_CST:
2277 : : /* Pointer constants other than null smaller than param_min_pagesize
2278 : : might be the result of erroneous null pointer addition/subtraction.
2279 : : Unless zero is a valid address set size to zero. For null pointers,
2280 : : set size to the maximum for now since those may be the result of
2281 : : jump threading. Similarly, for values >= param_min_pagesize in
2282 : : order to support (type *) 0x7cdeab00. */
2283 : 290995 : if (integer_zerop (ptr)
2284 : 336168 : || wi::to_widest (ptr) >= param_min_pagesize)
2285 : 248606 : pref->set_max_size_range ();
2286 : 42389 : else if (POINTER_TYPE_P (TREE_TYPE (ptr)))
2287 : : {
2288 : 545 : tree deref_type = TREE_TYPE (TREE_TYPE (ptr));
2289 : 545 : addr_space_t as = TYPE_ADDR_SPACE (deref_type);
2290 : 545 : if (targetm.addr_space.zero_address_valid (as))
2291 : 0 : pref->set_max_size_range ();
2292 : : else
2293 : : {
2294 : 545 : pref->sizrng[0] = pref->sizrng[1] = 0;
2295 : 545 : pref->ref_nullptr_p = true;
2296 : : }
2297 : : }
2298 : : else
2299 : 41844 : pref->sizrng[0] = pref->sizrng[1] = 0;
2300 : :
2301 : 290995 : pref->ref = ptr;
2302 : 290995 : return true;
2303 : :
2304 : 274635 : case STRING_CST:
2305 : 274635 : pref->sizrng[0] = pref->sizrng[1] = TREE_STRING_LENGTH (ptr);
2306 : 274635 : pref->ref = ptr;
2307 : 274635 : return true;
2308 : :
2309 : 498 : case POINTER_PLUS_EXPR:
2310 : 498 : {
2311 : 498 : tree ref = TREE_OPERAND (ptr, 0);
2312 : 498 : if (!compute_objsize_r (ref, stmt, addr, ostype, pref, snlim, qry))
2313 : : return false;
2314 : :
2315 : : /* The below only makes sense if the offset is being applied to the
2316 : : address of the object. */
2317 : 498 : if (pref->deref != -1)
2318 : : return false;
2319 : :
2320 : 435 : offset_int orng[2];
2321 : 435 : tree off = pref->eval (TREE_OPERAND (ptr, 1));
2322 : 435 : if (get_offset_range (off, stmt, orng, qry->rvals))
2323 : 426 : pref->add_offset (orng[0], orng[1]);
2324 : : else
2325 : 9 : pref->add_max_offset ();
2326 : : return true;
2327 : : }
2328 : :
2329 : 482 : case VIEW_CONVERT_EXPR:
2330 : 482 : ptr = TREE_OPERAND (ptr, 0);
2331 : 482 : return compute_objsize_r (ptr, stmt, addr, ostype, pref, snlim, qry);
2332 : :
2333 : 6043126 : case SSA_NAME:
2334 : 6043126 : return handle_ssa_name (ptr, addr, ostype, pref, snlim, qry);
2335 : :
2336 : 82893 : default:
2337 : 82893 : break;
2338 : : }
2339 : :
2340 : : /* Assume all other expressions point into an unknown object
2341 : : of the maximum valid size. */
2342 : 82893 : pref->ref = ptr;
2343 : 82893 : pref->base0 = false;
2344 : 82893 : pref->set_max_size_range ();
2345 : 82893 : if (TREE_CODE (ptr) == SSA_NAME)
2346 : 0 : qry->put_ref (ptr, *pref);
2347 : : return true;
2348 : : }
2349 : :
2350 : : /* A "public" wrapper around the above. Clients should use this overload
2351 : : instead. */
2352 : :
2353 : : tree
2354 : 9565619 : compute_objsize (tree ptr, gimple *stmt, int ostype, access_ref *pref,
2355 : : pointer_query *ptr_qry)
2356 : : {
2357 : 9565619 : pointer_query qry;
2358 : 9565619 : if (ptr_qry)
2359 : 9564555 : ptr_qry->depth = 0;
2360 : : else
2361 : : ptr_qry = &qry;
2362 : :
2363 : : /* Clear and invalidate in case *PREF is being reused. */
2364 : 9565619 : pref->offrng[0] = pref->offrng[1] = 0;
2365 : 9565619 : pref->sizrng[0] = pref->sizrng[1] = -1;
2366 : :
2367 : 9565619 : ssa_name_limit_t snlim;
2368 : 9565619 : if (!compute_objsize_r (ptr, stmt, false, ostype, pref, snlim, ptr_qry))
2369 : : return NULL_TREE;
2370 : :
2371 : 9556288 : offset_int maxsize = pref->size_remaining ();
2372 : 9556288 : if (pref->base0 && pref->offrng[0] < 0 && pref->offrng[1] >= 0)
2373 : 103 : pref->offrng[0] = 0;
2374 : 9556288 : return wide_int_to_tree (sizetype, maxsize);
2375 : 9565619 : }
2376 : :
2377 : : /* Transitional wrapper. The function should be removed once callers
2378 : : transition to the pointer_query API. */
2379 : :
2380 : : tree
2381 : 331876 : compute_objsize (tree ptr, gimple *stmt, int ostype, access_ref *pref,
2382 : : range_query *rvals /* = NULL */)
2383 : : {
2384 : 331876 : pointer_query qry;
2385 : 331876 : qry.rvals = rvals;
2386 : 331876 : return compute_objsize (ptr, stmt, ostype, pref, &qry);
2387 : 331876 : }
2388 : :
2389 : : /* Legacy wrapper around the above. The function should be removed
2390 : : once callers transition to one of the two above. */
2391 : :
2392 : : tree
2393 : 0 : compute_objsize (tree ptr, gimple *stmt, int ostype, tree *pdecl /* = NULL */,
2394 : : tree *poff /* = NULL */, range_query *rvals /* = NULL */)
2395 : : {
2396 : : /* Set the initial offsets to zero and size to negative to indicate
2397 : : none has been computed yet. */
2398 : 0 : access_ref ref;
2399 : 0 : tree size = compute_objsize (ptr, stmt, ostype, &ref, rvals);
2400 : 0 : if (!size || !ref.base0)
2401 : : return NULL_TREE;
2402 : :
2403 : 0 : if (pdecl)
2404 : 0 : *pdecl = ref.ref;
2405 : :
2406 : 0 : if (poff)
2407 : 0 : *poff = wide_int_to_tree (ptrdiff_type_node, ref.offrng[ref.offrng[0] < 0]);
2408 : :
2409 : : return size;
2410 : : }
2411 : :
2412 : : /* Determine the offset *FLDOFF of the first byte of a struct member
2413 : : of TYPE (possibly recursively) into which the byte offset OFF points,
2414 : : starting after the field START_AFTER if it's non-null. On success,
2415 : : if nonnull, set *FLDOFF to the offset of the first byte, and return
2416 : : the field decl. If nonnull, set *NEXTOFF to the offset of the next
2417 : : field (which reflects any padding between the returned field and
2418 : : the next). Otherwise, if no such member can be found, return null. */
2419 : :
2420 : : tree
2421 : 1404 : field_at_offset (tree type, tree start_after, HOST_WIDE_INT off,
2422 : : HOST_WIDE_INT *fldoff /* = nullptr */,
2423 : : HOST_WIDE_INT *nextoff /* = nullptr */)
2424 : : {
2425 : 1404 : tree first_fld = TYPE_FIELDS (type);
2426 : :
2427 : 1404 : HOST_WIDE_INT offbuf = 0, nextbuf = 0;
2428 : 1404 : if (!fldoff)
2429 : 9 : fldoff = &offbuf;
2430 : 1404 : if (!nextoff)
2431 : 556 : nextoff = &nextbuf;
2432 : :
2433 : 1404 : *nextoff = 0;
2434 : :
2435 : : /* The field to return. */
2436 : 1404 : tree last_fld = NULL_TREE;
2437 : : /* The next field to advance to. */
2438 : 1404 : tree next_fld = NULL_TREE;
2439 : :
2440 : : /* NEXT_FLD's cached offset. */
2441 : 1404 : HOST_WIDE_INT next_pos = -1;
2442 : :
2443 : 1664 : for (tree fld = first_fld; fld; fld = next_fld)
2444 : : {
2445 : : next_fld = fld;
2446 : 1645 : do
2447 : : /* Advance to the next relevant data member. */
2448 : 1645 : next_fld = TREE_CHAIN (next_fld);
2449 : : while (next_fld
2450 : 3170 : && (TREE_CODE (next_fld) != FIELD_DECL
2451 : 1525 : || DECL_ARTIFICIAL (next_fld)));
2452 : :
2453 : 1645 : if (TREE_CODE (fld) != FIELD_DECL || DECL_ARTIFICIAL (fld))
2454 : 0 : continue;
2455 : :
2456 : 1645 : if (fld == start_after)
2457 : 0 : continue;
2458 : :
2459 : 1645 : tree fldtype = TREE_TYPE (fld);
2460 : : /* The offset of FLD within its immediately enclosing structure. */
2461 : 1645 : HOST_WIDE_INT fldpos = next_pos < 0 ? int_byte_position (fld) : next_pos;
2462 : :
2463 : 1645 : tree typesize = TYPE_SIZE_UNIT (fldtype);
2464 : 1645 : if (typesize && TREE_CODE (typesize) != INTEGER_CST)
2465 : : /* Bail if FLD is a variable length member. */
2466 : : return NULL_TREE;
2467 : :
2468 : : /* If the size is not available the field is a flexible array
2469 : : member. Treat this case as success. */
2470 : 3290 : HOST_WIDE_INT fldsize = (tree_fits_uhwi_p (typesize)
2471 : 1645 : ? tree_to_uhwi (typesize)
2472 : : : off);
2473 : :
2474 : : /* If OFF is beyond the end of the current field continue. */
2475 : 1645 : HOST_WIDE_INT fldend = fldpos + fldsize;
2476 : 1645 : if (fldend < off)
2477 : 236 : continue;
2478 : :
2479 : 1409 : if (next_fld)
2480 : : {
2481 : : /* If OFF is equal to the offset of the next field continue
2482 : : to it and skip the array/struct business below. */
2483 : 1303 : tree pos = byte_position (next_fld);
2484 : 1303 : if (!tree_fits_shwi_p (pos))
2485 : : /* Bail if NEXT_FLD is a variable length member. */
2486 : : return NULL_TREE;
2487 : 1303 : next_pos = tree_to_shwi (pos);
2488 : 1303 : *nextoff = *fldoff + next_pos;
2489 : 1303 : if (*nextoff == off && TREE_CODE (type) != UNION_TYPE)
2490 : 19 : continue;
2491 : : }
2492 : : else
2493 : 106 : *nextoff = HOST_WIDE_INT_MAX;
2494 : :
2495 : : /* OFF refers somewhere into the current field or just past its end,
2496 : : which could mean it refers to the next field. */
2497 : 1390 : if (TREE_CODE (fldtype) == ARRAY_TYPE)
2498 : : {
2499 : : /* Will be set to the offset of the first byte of the array
2500 : : element (which may be an array) of FLDTYPE into which
2501 : : OFF - FLDPOS points (which may be past ELTOFF). */
2502 : 549 : HOST_WIDE_INT eltoff = 0;
2503 : 549 : if (tree ft = array_elt_at_offset (fldtype, off - fldpos, &eltoff))
2504 : 549 : fldtype = ft;
2505 : : else
2506 : 0 : continue;
2507 : :
2508 : : /* Advance the position to include the array element above.
2509 : : If OFF - FLPOS refers to a member of FLDTYPE, the member
2510 : : will be determined below. */
2511 : 549 : fldpos += eltoff;
2512 : : }
2513 : :
2514 : 1390 : *fldoff += fldpos;
2515 : :
2516 : 1390 : if (TREE_CODE (fldtype) == RECORD_TYPE)
2517 : : /* Drill down into the current field if it's a struct. */
2518 : 848 : fld = field_at_offset (fldtype, start_after, off - fldpos,
2519 : : fldoff, nextoff);
2520 : :
2521 : 1390 : last_fld = fld;
2522 : :
2523 : : /* Unless the offset is just past the end of the field return it.
2524 : : Otherwise save it and return it only if the offset of the next
2525 : : next field is greater (i.e., there is padding between the two)
2526 : : or if there is no next field. */
2527 : 1390 : if (off < fldend)
2528 : : break;
2529 : : }
2530 : :
2531 : 1404 : if (*nextoff == HOST_WIDE_INT_MAX && next_fld)
2532 : 35 : *nextoff = next_pos;
2533 : :
2534 : : return last_fld;
2535 : : }
2536 : :
2537 : : /* Determine the offset *ELTOFF of the first byte of the array element
2538 : : of array ARTYPE into which the byte offset OFF points. On success
2539 : : set *ELTOFF to the offset of the first byte and return type.
2540 : : Otherwise, if no such element can be found, return null. */
2541 : :
2542 : : tree
2543 : 581 : array_elt_at_offset (tree artype, HOST_WIDE_INT off,
2544 : : HOST_WIDE_INT *eltoff /* = nullptr */,
2545 : : HOST_WIDE_INT *subar_size /* = nullptr */)
2546 : : {
2547 : 581 : gcc_assert (TREE_CODE (artype) == ARRAY_TYPE);
2548 : :
2549 : 581 : HOST_WIDE_INT dummy;
2550 : 581 : if (!eltoff)
2551 : 0 : eltoff = &dummy;
2552 : 581 : if (!subar_size)
2553 : 549 : subar_size = &dummy;
2554 : :
2555 : 581 : tree eltype = artype;
2556 : 613 : while (TREE_CODE (TREE_TYPE (eltype)) == ARRAY_TYPE)
2557 : 32 : eltype = TREE_TYPE (eltype);
2558 : :
2559 : 581 : tree subartype = eltype;
2560 : 581 : if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (eltype))
2561 : 565 : || TYPE_MODE (TREE_TYPE (eltype)) != TYPE_MODE (char_type_node))
2562 : 16 : eltype = TREE_TYPE (eltype);
2563 : :
2564 : 581 : *subar_size = int_size_in_bytes (subartype);
2565 : :
2566 : 581 : if (eltype == artype)
2567 : : {
2568 : 533 : *eltoff = 0;
2569 : 533 : return artype;
2570 : : }
2571 : :
2572 : 48 : HOST_WIDE_INT artype_size = int_size_in_bytes (artype);
2573 : 48 : HOST_WIDE_INT eltype_size = int_size_in_bytes (eltype);
2574 : :
2575 : 48 : if (off < artype_size)// * eltype_size)
2576 : : {
2577 : 32 : *eltoff = (off / eltype_size) * eltype_size;
2578 : 32 : return TREE_CODE (eltype) == ARRAY_TYPE ? TREE_TYPE (eltype) : eltype;
2579 : : }
2580 : :
2581 : : return NULL_TREE;
2582 : : }
2583 : :
2584 : : /* Wrapper around build_array_type_nelts that makes sure the array
2585 : : can be created at all and handles zero sized arrays specially. */
2586 : :
2587 : : tree
2588 : 10827 : build_printable_array_type (tree eltype, unsigned HOST_WIDE_INT nelts)
2589 : : {
2590 : 10827 : if (TYPE_SIZE_UNIT (eltype)
2591 : 10823 : && TREE_CODE (TYPE_SIZE_UNIT (eltype)) == INTEGER_CST
2592 : 10807 : && !integer_zerop (TYPE_SIZE_UNIT (eltype))
2593 : 10717 : && TYPE_ALIGN_UNIT (eltype) > 1
2594 : 26471 : && wi::zext (wi::to_wide (TYPE_SIZE_UNIT (eltype)),
2595 : 26471 : ffs_hwi (TYPE_ALIGN_UNIT (eltype)) - 1) != 0)
2596 : 3 : eltype = TYPE_MAIN_VARIANT (eltype);
2597 : :
2598 : : /* Consider excessive NELTS an array of unknown bound. */
2599 : 10827 : tree idxtype = NULL_TREE;
2600 : 10827 : if (nelts < HOST_WIDE_INT_MAX)
2601 : : {
2602 : 10794 : if (nelts)
2603 : 10305 : return build_array_type_nelts (eltype, nelts);
2604 : 489 : idxtype = build_range_type (sizetype, size_zero_node, NULL_TREE);
2605 : : }
2606 : :
2607 : 522 : tree arrtype = build_array_type (eltype, idxtype);
2608 : 522 : arrtype = build_distinct_type_copy (TYPE_MAIN_VARIANT (arrtype));
2609 : 522 : TYPE_SIZE (arrtype) = bitsize_zero_node;
2610 : 522 : TYPE_SIZE_UNIT (arrtype) = size_zero_node;
2611 : 522 : return arrtype;
2612 : : }
|