Bug Summary

File:build/gcc/tree.h
Warning:line 4025, column 7
The left operand of '==' is a garbage value due to array index out of bounds

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-suse-linux -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name tree.cc -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model static -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -resource-dir /usr/lib64/clang/15.0.7 -D IN_GCC -D HAVE_CONFIG_H -I . -I . -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/. -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../include -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcpp/include -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcody -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber/bid -I ../libdecnumber -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libbacktrace -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13 -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13/x86_64-suse-linux -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13/backward -internal-isystem /usr/lib64/clang/15.0.7/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-narrowing -Wwrite-strings -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fdeprecated-macro -fdebug-compilation-dir=/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -ferror-limit 19 -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=plist-html -analyzer-config silence-checkers=core.NullDereference -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /buildworker/marxinbox-gcc-clang-static-analyzer/objdir/clang-static-analyzer/2023-03-27-141847-20772-1/report-leZImh.plist -x c++ /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc

/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc

1/* Language-independent node constructors for parse phase of GNU compiler.
2 Copyright (C) 1987-2023 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
19
20/* This file contains the low level primitives for operating on tree nodes,
21 including allocation, list operations, interning of identifiers,
22 construction of data type nodes and statement nodes,
23 and construction of type conversion nodes. It also contains
24 tables index by tree code that describe how to take apart
25 nodes of that code.
26
27 It is intended to be language-independent but can occasionally
28 calls language-dependent routines. */
29
30#include "config.h"
31#include "system.h"
32#include "coretypes.h"
33#include "backend.h"
34#include "target.h"
35#include "tree.h"
36#include "gimple.h"
37#include "tree-pass.h"
38#include "ssa.h"
39#include "cgraph.h"
40#include "diagnostic.h"
41#include "flags.h"
42#include "alias.h"
43#include "fold-const.h"
44#include "stor-layout.h"
45#include "calls.h"
46#include "attribs.h"
47#include "toplev.h" /* get_random_seed */
48#include "output.h"
49#include "common/common-target.h"
50#include "langhooks.h"
51#include "tree-inline.h"
52#include "tree-iterator.h"
53#include "internal-fn.h"
54#include "gimple-iterator.h"
55#include "gimplify.h"
56#include "tree-dfa.h"
57#include "langhooks-def.h"
58#include "tree-diagnostic.h"
59#include "except.h"
60#include "builtins.h"
61#include "print-tree.h"
62#include "ipa-utils.h"
63#include "selftest.h"
64#include "stringpool.h"
65#include "attribs.h"
66#include "rtl.h"
67#include "regs.h"
68#include "tree-vector-builder.h"
69#include "gimple-fold.h"
70#include "escaped_string.h"
71#include "gimple-range.h"
72#include "gomp-constants.h"
73#include "dfp.h"
74#include "asan.h"
75#include "ubsan.h"
76
77/* Names of tree components.
78 Used for printing out the tree and error messages. */
79#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
80#define END_OF_BASE_TREE_CODES "@dummy",
81
82static const char *const tree_code_name[] = {
83#include "all-tree.def"
84};
85
86#undef DEFTREECODE
87#undef END_OF_BASE_TREE_CODES
88
89/* Each tree code class has an associated string representation.
90 These must correspond to the tree_code_class entries. */
91
92const char *const tree_code_class_strings[] =
93{
94 "exceptional",
95 "constant",
96 "type",
97 "declaration",
98 "reference",
99 "comparison",
100 "unary",
101 "binary",
102 "statement",
103 "vl_exp",
104 "expression"
105};
106
107/* obstack.[ch] explicitly declined to prototype this. */
108extern int _obstack_allocated_p (struct obstack *h, void *obj);
109
110/* Statistics-gathering stuff. */
111
112static uint64_t tree_code_counts[MAX_TREE_CODES];
113uint64_t tree_node_counts[(int) all_kinds];
114uint64_t tree_node_sizes[(int) all_kinds];
115
116/* Keep in sync with tree.h:enum tree_node_kind. */
117static const char * const tree_node_kind_names[] = {
118 "decls",
119 "types",
120 "blocks",
121 "stmts",
122 "refs",
123 "exprs",
124 "constants",
125 "identifiers",
126 "vecs",
127 "binfos",
128 "ssa names",
129 "constructors",
130 "random kinds",
131 "lang_decl kinds",
132 "lang_type kinds",
133 "omp clauses",
134};
135
136/* Unique id for next decl created. */
137static GTY(()) int next_decl_uid;
138/* Unique id for next type created. */
139static GTY(()) unsigned next_type_uid = 1;
140/* Unique id for next debug decl created. Use negative numbers,
141 to catch erroneous uses. */
142static GTY(()) int next_debug_decl_uid;
143
144/* Since we cannot rehash a type after it is in the table, we have to
145 keep the hash code. */
146
147struct GTY((for_user)) type_hash {
148 unsigned long hash;
149 tree type;
150};
151
152/* Initial size of the hash table (rounded to next prime). */
153#define TYPE_HASH_INITIAL_SIZE1000 1000
154
155struct type_cache_hasher : ggc_cache_ptr_hash<type_hash>
156{
157 static hashval_t hash (type_hash *t) { return t->hash; }
158 static bool equal (type_hash *a, type_hash *b);
159
160 static int
161 keep_cache_entry (type_hash *&t)
162 {
163 return ggc_marked_p (t->type);
164 }
165};
166
167/* Now here is the hash table. When recording a type, it is added to
168 the slot whose index is the hash code. Note that the hash table is
169 used for several kinds of types (function types, array types and
170 array index range types, for now). While all these live in the
171 same table, they are completely independent, and the hash code is
172 computed differently for each of these. */
173
174static GTY ((cache)) hash_table<type_cache_hasher> *type_hash_table;
175
176/* Hash table and temporary node for larger integer const values. */
177static GTY (()) tree int_cst_node;
178
179struct int_cst_hasher : ggc_cache_ptr_hash<tree_node>
180{
181 static hashval_t hash (tree t);
182 static bool equal (tree x, tree y);
183};
184
185static GTY ((cache)) hash_table<int_cst_hasher> *int_cst_hash_table;
186
187/* Class and variable for making sure that there is a single POLY_INT_CST
188 for a given value. */
189struct poly_int_cst_hasher : ggc_cache_ptr_hash<tree_node>
190{
191 typedef std::pair<tree, const poly_wide_int *> compare_type;
192 static hashval_t hash (tree t);
193 static bool equal (tree x, const compare_type &y);
194};
195
196static GTY ((cache)) hash_table<poly_int_cst_hasher> *poly_int_cst_hash_table;
197
198/* Hash table for optimization flags and target option flags. Use the same
199 hash table for both sets of options. Nodes for building the current
200 optimization and target option nodes. The assumption is most of the time
201 the options created will already be in the hash table, so we avoid
202 allocating and freeing up a node repeatably. */
203static GTY (()) tree cl_optimization_node;
204static GTY (()) tree cl_target_option_node;
205
206struct cl_option_hasher : ggc_cache_ptr_hash<tree_node>
207{
208 static hashval_t hash (tree t);
209 static bool equal (tree x, tree y);
210};
211
212static GTY ((cache)) hash_table<cl_option_hasher> *cl_option_hash_table;
213
214/* General tree->tree mapping structure for use in hash tables. */
215
216
217static GTY ((cache))
218 hash_table<tree_decl_map_cache_hasher> *debug_expr_for_decl;
219
220static GTY ((cache))
221 hash_table<tree_decl_map_cache_hasher> *value_expr_for_decl;
222
223static GTY ((cache))
224 hash_table<tree_vec_map_cache_hasher> *debug_args_for_decl;
225
226static void set_type_quals (tree, int);
227static void print_type_hash_statistics (void);
228static void print_debug_expr_statistics (void);
229static void print_value_expr_statistics (void);
230
231tree global_trees[TI_MAX];
232tree integer_types[itk_none];
233
234bool int_n_enabled_p[NUM_INT_N_ENTS1];
235struct int_n_trees_t int_n_trees [NUM_INT_N_ENTS1];
236
237bool tree_contains_struct[MAX_TREE_CODES][64];
238
239/* Number of operands for each OMP clause. */
240unsigned const char omp_clause_num_ops[] =
241{
242 0, /* OMP_CLAUSE_ERROR */
243 1, /* OMP_CLAUSE_PRIVATE */
244 1, /* OMP_CLAUSE_SHARED */
245 1, /* OMP_CLAUSE_FIRSTPRIVATE */
246 2, /* OMP_CLAUSE_LASTPRIVATE */
247 5, /* OMP_CLAUSE_REDUCTION */
248 5, /* OMP_CLAUSE_TASK_REDUCTION */
249 5, /* OMP_CLAUSE_IN_REDUCTION */
250 1, /* OMP_CLAUSE_COPYIN */
251 1, /* OMP_CLAUSE_COPYPRIVATE */
252 3, /* OMP_CLAUSE_LINEAR */
253 1, /* OMP_CLAUSE_AFFINITY */
254 2, /* OMP_CLAUSE_ALIGNED */
255 3, /* OMP_CLAUSE_ALLOCATE */
256 1, /* OMP_CLAUSE_DEPEND */
257 1, /* OMP_CLAUSE_NONTEMPORAL */
258 1, /* OMP_CLAUSE_UNIFORM */
259 1, /* OMP_CLAUSE_ENTER */
260 1, /* OMP_CLAUSE_LINK */
261 1, /* OMP_CLAUSE_DETACH */
262 1, /* OMP_CLAUSE_USE_DEVICE_PTR */
263 1, /* OMP_CLAUSE_USE_DEVICE_ADDR */
264 1, /* OMP_CLAUSE_IS_DEVICE_PTR */
265 1, /* OMP_CLAUSE_INCLUSIVE */
266 1, /* OMP_CLAUSE_EXCLUSIVE */
267 2, /* OMP_CLAUSE_FROM */
268 2, /* OMP_CLAUSE_TO */
269 2, /* OMP_CLAUSE_MAP */
270 1, /* OMP_CLAUSE_HAS_DEVICE_ADDR */
271 1, /* OMP_CLAUSE_DOACROSS */
272 2, /* OMP_CLAUSE__CACHE_ */
273 2, /* OMP_CLAUSE_GANG */
274 1, /* OMP_CLAUSE_ASYNC */
275 1, /* OMP_CLAUSE_WAIT */
276 0, /* OMP_CLAUSE_AUTO */
277 0, /* OMP_CLAUSE_SEQ */
278 1, /* OMP_CLAUSE__LOOPTEMP_ */
279 1, /* OMP_CLAUSE__REDUCTEMP_ */
280 1, /* OMP_CLAUSE__CONDTEMP_ */
281 1, /* OMP_CLAUSE__SCANTEMP_ */
282 1, /* OMP_CLAUSE_IF */
283 1, /* OMP_CLAUSE_NUM_THREADS */
284 1, /* OMP_CLAUSE_SCHEDULE */
285 0, /* OMP_CLAUSE_NOWAIT */
286 1, /* OMP_CLAUSE_ORDERED */
287 0, /* OMP_CLAUSE_DEFAULT */
288 3, /* OMP_CLAUSE_COLLAPSE */
289 0, /* OMP_CLAUSE_UNTIED */
290 1, /* OMP_CLAUSE_FINAL */
291 0, /* OMP_CLAUSE_MERGEABLE */
292 1, /* OMP_CLAUSE_DEVICE */
293 1, /* OMP_CLAUSE_DIST_SCHEDULE */
294 0, /* OMP_CLAUSE_INBRANCH */
295 0, /* OMP_CLAUSE_NOTINBRANCH */
296 2, /* OMP_CLAUSE_NUM_TEAMS */
297 1, /* OMP_CLAUSE_THREAD_LIMIT */
298 0, /* OMP_CLAUSE_PROC_BIND */
299 1, /* OMP_CLAUSE_SAFELEN */
300 1, /* OMP_CLAUSE_SIMDLEN */
301 0, /* OMP_CLAUSE_DEVICE_TYPE */
302 0, /* OMP_CLAUSE_FOR */
303 0, /* OMP_CLAUSE_PARALLEL */
304 0, /* OMP_CLAUSE_SECTIONS */
305 0, /* OMP_CLAUSE_TASKGROUP */
306 1, /* OMP_CLAUSE_PRIORITY */
307 1, /* OMP_CLAUSE_GRAINSIZE */
308 1, /* OMP_CLAUSE_NUM_TASKS */
309 0, /* OMP_CLAUSE_NOGROUP */
310 0, /* OMP_CLAUSE_THREADS */
311 0, /* OMP_CLAUSE_SIMD */
312 1, /* OMP_CLAUSE_HINT */
313 0, /* OMP_CLAUSE_DEFAULTMAP */
314 0, /* OMP_CLAUSE_ORDER */
315 0, /* OMP_CLAUSE_BIND */
316 1, /* OMP_CLAUSE_FILTER */
317 1, /* OMP_CLAUSE__SIMDUID_ */
318 0, /* OMP_CLAUSE__SIMT_ */
319 0, /* OMP_CLAUSE_INDEPENDENT */
320 1, /* OMP_CLAUSE_WORKER */
321 1, /* OMP_CLAUSE_VECTOR */
322 1, /* OMP_CLAUSE_NUM_GANGS */
323 1, /* OMP_CLAUSE_NUM_WORKERS */
324 1, /* OMP_CLAUSE_VECTOR_LENGTH */
325 3, /* OMP_CLAUSE_TILE */
326 0, /* OMP_CLAUSE_IF_PRESENT */
327 0, /* OMP_CLAUSE_FINALIZE */
328 0, /* OMP_CLAUSE_NOHOST */
329};
330
331const char * const omp_clause_code_name[] =
332{
333 "error_clause",
334 "private",
335 "shared",
336 "firstprivate",
337 "lastprivate",
338 "reduction",
339 "task_reduction",
340 "in_reduction",
341 "copyin",
342 "copyprivate",
343 "linear",
344 "affinity",
345 "aligned",
346 "allocate",
347 "depend",
348 "nontemporal",
349 "uniform",
350 "enter",
351 "link",
352 "detach",
353 "use_device_ptr",
354 "use_device_addr",
355 "is_device_ptr",
356 "inclusive",
357 "exclusive",
358 "from",
359 "to",
360 "map",
361 "has_device_addr",
362 "doacross",
363 "_cache_",
364 "gang",
365 "async",
366 "wait",
367 "auto",
368 "seq",
369 "_looptemp_",
370 "_reductemp_",
371 "_condtemp_",
372 "_scantemp_",
373 "if",
374 "num_threads",
375 "schedule",
376 "nowait",
377 "ordered",
378 "default",
379 "collapse",
380 "untied",
381 "final",
382 "mergeable",
383 "device",
384 "dist_schedule",
385 "inbranch",
386 "notinbranch",
387 "num_teams",
388 "thread_limit",
389 "proc_bind",
390 "safelen",
391 "simdlen",
392 "device_type",
393 "for",
394 "parallel",
395 "sections",
396 "taskgroup",
397 "priority",
398 "grainsize",
399 "num_tasks",
400 "nogroup",
401 "threads",
402 "simd",
403 "hint",
404 "defaultmap",
405 "order",
406 "bind",
407 "filter",
408 "_simduid_",
409 "_simt_",
410 "independent",
411 "worker",
412 "vector",
413 "num_gangs",
414 "num_workers",
415 "vector_length",
416 "tile",
417 "if_present",
418 "finalize",
419 "nohost",
420};
421
422/* Unless specific to OpenACC, we tend to internally maintain OpenMP-centric
423 clause names, but for use in diagnostics etc. would like to use the "user"
424 clause names. */
425
426const char *
427user_omp_clause_code_name (tree clause, bool oacc)
428{
429 /* For OpenACC, the 'OMP_CLAUSE_MAP_KIND' of an 'OMP_CLAUSE_MAP' is used to
430 distinguish clauses as seen by the user. See also where front ends do
431 'build_omp_clause' with 'OMP_CLAUSE_MAP'. */
432 if (oacc && OMP_CLAUSE_CODE (clause)((tree_check ((clause), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 432, __FUNCTION__, (OMP_CLAUSE))))->omp_clause.code
== OMP_CLAUSE_MAP)
433 switch (OMP_CLAUSE_MAP_KIND (clause)((enum gomp_map_kind) (omp_clause_subcode_check ((clause), (OMP_CLAUSE_MAP
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 433, __FUNCTION__))->omp_clause.subcode.map_kind)
)
434 {
435 case GOMP_MAP_FORCE_ALLOC:
436 case GOMP_MAP_ALLOC: return "create";
437 case GOMP_MAP_FORCE_TO:
438 case GOMP_MAP_TO: return "copyin";
439 case GOMP_MAP_FORCE_FROM:
440 case GOMP_MAP_FROM: return "copyout";
441 case GOMP_MAP_FORCE_TOFROM:
442 case GOMP_MAP_TOFROM: return "copy";
443 case GOMP_MAP_RELEASE: return "delete";
444 case GOMP_MAP_FORCE_PRESENT: return "present";
445 case GOMP_MAP_ATTACH: return "attach";
446 case GOMP_MAP_FORCE_DETACH:
447 case GOMP_MAP_DETACH: return "detach";
448 case GOMP_MAP_DEVICE_RESIDENT: return "device_resident";
449 case GOMP_MAP_LINK: return "link";
450 case GOMP_MAP_FORCE_DEVICEPTR: return "deviceptr";
451 default: break;
452 }
453
454 return omp_clause_code_name[OMP_CLAUSE_CODE (clause)((tree_check ((clause), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 454, __FUNCTION__, (OMP_CLAUSE))))->omp_clause.code
];
455}
456
457
458/* Return the tree node structure used by tree code CODE. */
459
460static inline enum tree_node_structure_enum
461tree_node_structure_for_code (enum tree_code code)
462{
463 switch (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)])
464 {
465 case tcc_declaration:
466 switch (code)
467 {
468 case CONST_DECL: return TS_CONST_DECL;
469 case DEBUG_EXPR_DECL: return TS_DECL_WRTL;
470 case FIELD_DECL: return TS_FIELD_DECL;
471 case FUNCTION_DECL: return TS_FUNCTION_DECL;
472 case LABEL_DECL: return TS_LABEL_DECL;
473 case PARM_DECL: return TS_PARM_DECL;
474 case RESULT_DECL: return TS_RESULT_DECL;
475 case TRANSLATION_UNIT_DECL: return TS_TRANSLATION_UNIT_DECL;
476 case TYPE_DECL: return TS_TYPE_DECL;
477 case VAR_DECL: return TS_VAR_DECL;
478 default: return TS_DECL_NON_COMMON;
479 }
480
481 case tcc_type: return TS_TYPE_NON_COMMON;
482
483 case tcc_binary:
484 case tcc_comparison:
485 case tcc_expression:
486 case tcc_reference:
487 case tcc_statement:
488 case tcc_unary:
489 case tcc_vl_exp: return TS_EXP;
490
491 default: /* tcc_constant and tcc_exceptional */
492 break;
493 }
494
495 switch (code)
496 {
497 /* tcc_constant cases. */
498 case COMPLEX_CST: return TS_COMPLEX;
499 case FIXED_CST: return TS_FIXED_CST;
500 case INTEGER_CST: return TS_INT_CST;
501 case POLY_INT_CST: return TS_POLY_INT_CST;
502 case REAL_CST: return TS_REAL_CST;
503 case STRING_CST: return TS_STRING;
504 case VECTOR_CST: return TS_VECTOR;
505 case VOID_CST: return TS_TYPED;
506
507 /* tcc_exceptional cases. */
508 case BLOCK: return TS_BLOCK;
509 case CONSTRUCTOR: return TS_CONSTRUCTOR;
510 case ERROR_MARK: return TS_COMMON;
511 case IDENTIFIER_NODE: return TS_IDENTIFIER;
512 case OMP_CLAUSE: return TS_OMP_CLAUSE;
513 case OPTIMIZATION_NODE: return TS_OPTIMIZATION;
514 case PLACEHOLDER_EXPR: return TS_COMMON;
515 case SSA_NAME: return TS_SSA_NAME;
516 case STATEMENT_LIST: return TS_STATEMENT_LIST;
517 case TARGET_OPTION_NODE: return TS_TARGET_OPTION;
518 case TREE_BINFO: return TS_BINFO;
519 case TREE_LIST: return TS_LIST;
520 case TREE_VEC: return TS_VEC;
521
522 default:
523 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 523, __FUNCTION__))
;
524 }
525}
526
527
528/* Initialize tree_contains_struct to describe the hierarchy of tree
529 nodes. */
530
531static void
532initialize_tree_contains_struct (void)
533{
534 unsigned i;
535
536 for (i = ERROR_MARK; i < LAST_AND_UNUSED_TREE_CODE; i++)
537 {
538 enum tree_code code;
539 enum tree_node_structure_enum ts_code;
540
541 code = (enum tree_code) i;
542 ts_code = tree_node_structure_for_code (code);
543
544 /* Mark the TS structure itself. */
545 tree_contains_struct[code][ts_code] = 1;
546
547 /* Mark all the structures that TS is derived from. */
548 switch (ts_code)
549 {
550 case TS_TYPED:
551 case TS_BLOCK:
552 case TS_OPTIMIZATION:
553 case TS_TARGET_OPTION:
554 MARK_TS_BASE (code)(tree_contains_struct[code][TS_BASE] = true);
555 break;
556
557 case TS_COMMON:
558 case TS_INT_CST:
559 case TS_POLY_INT_CST:
560 case TS_REAL_CST:
561 case TS_FIXED_CST:
562 case TS_VECTOR:
563 case TS_STRING:
564 case TS_COMPLEX:
565 case TS_SSA_NAME:
566 case TS_CONSTRUCTOR:
567 case TS_EXP:
568 case TS_STATEMENT_LIST:
569 MARK_TS_TYPED (code)((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true)
;
570 break;
571
572 case TS_IDENTIFIER:
573 case TS_DECL_MINIMAL:
574 case TS_TYPE_COMMON:
575 case TS_LIST:
576 case TS_VEC:
577 case TS_BINFO:
578 case TS_OMP_CLAUSE:
579 MARK_TS_COMMON (code)(((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true)
;
580 break;
581
582 case TS_TYPE_WITH_LANG_SPECIFIC:
583 MARK_TS_TYPE_COMMON (code)((((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true), tree_contains_struct[code][TS_TYPE_COMMON] = true)
;
584 break;
585
586 case TS_TYPE_NON_COMMON:
587 MARK_TS_TYPE_WITH_LANG_SPECIFIC (code)(((((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true), tree_contains_struct[code][TS_TYPE_COMMON] = true)
, tree_contains_struct[code][TS_TYPE_WITH_LANG_SPECIFIC] = true
)
;
588 break;
589
590 case TS_DECL_COMMON:
591 MARK_TS_DECL_MINIMAL (code)((((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true), tree_contains_struct[code][TS_DECL_MINIMAL] = true
)
;
592 break;
593
594 case TS_DECL_WRTL:
595 case TS_CONST_DECL:
596 MARK_TS_DECL_COMMON (code)(((((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true), tree_contains_struct[code][TS_DECL_MINIMAL] = true
), tree_contains_struct[code][TS_DECL_COMMON] = true)
;
597 break;
598
599 case TS_DECL_NON_COMMON:
600 MARK_TS_DECL_WITH_VIS (code)(((((((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true), tree_contains_struct[code][TS_DECL_MINIMAL] = true
), tree_contains_struct[code][TS_DECL_COMMON] = true), tree_contains_struct
[code][TS_DECL_WRTL] = true), tree_contains_struct[code][TS_DECL_WITH_VIS
] = true)
;
601 break;
602
603 case TS_DECL_WITH_VIS:
604 case TS_PARM_DECL:
605 case TS_LABEL_DECL:
606 case TS_RESULT_DECL:
607 MARK_TS_DECL_WRTL (code)((((((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true), tree_contains_struct[code][TS_DECL_MINIMAL] = true
), tree_contains_struct[code][TS_DECL_COMMON] = true), tree_contains_struct
[code][TS_DECL_WRTL] = true)
;
608 break;
609
610 case TS_FIELD_DECL:
611 MARK_TS_DECL_COMMON (code)(((((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true), tree_contains_struct[code][TS_DECL_MINIMAL] = true
), tree_contains_struct[code][TS_DECL_COMMON] = true)
;
612 break;
613
614 case TS_VAR_DECL:
615 MARK_TS_DECL_WITH_VIS (code)(((((((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true), tree_contains_struct[code][TS_DECL_MINIMAL] = true
), tree_contains_struct[code][TS_DECL_COMMON] = true), tree_contains_struct
[code][TS_DECL_WRTL] = true), tree_contains_struct[code][TS_DECL_WITH_VIS
] = true)
;
616 break;
617
618 case TS_TYPE_DECL:
619 case TS_FUNCTION_DECL:
620 MARK_TS_DECL_NON_COMMON (code)((((((((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true), tree_contains_struct[code][TS_DECL_MINIMAL] = true
), tree_contains_struct[code][TS_DECL_COMMON] = true), tree_contains_struct
[code][TS_DECL_WRTL] = true), tree_contains_struct[code][TS_DECL_WITH_VIS
] = true), tree_contains_struct[code][TS_DECL_NON_COMMON] = true
)
;
621 break;
622
623 case TS_TRANSLATION_UNIT_DECL:
624 MARK_TS_DECL_COMMON (code)(((((tree_contains_struct[code][TS_BASE] = true), tree_contains_struct
[code][TS_TYPED] = true), tree_contains_struct[code][TS_COMMON
] = true), tree_contains_struct[code][TS_DECL_MINIMAL] = true
), tree_contains_struct[code][TS_DECL_COMMON] = true)
;
625 break;
626
627 default:
628 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 628, __FUNCTION__))
;
629 }
630 }
631
632 /* Basic consistency checks for attributes used in fold. */
633 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_NON_COMMON])((void)(!(tree_contains_struct[FUNCTION_DECL][TS_DECL_NON_COMMON
]) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 633, __FUNCTION__), 0 : 0))
;
634 gcc_assert (tree_contains_struct[TYPE_DECL][TS_DECL_NON_COMMON])((void)(!(tree_contains_struct[TYPE_DECL][TS_DECL_NON_COMMON]
) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 634, __FUNCTION__), 0 : 0))
;
635 gcc_assert (tree_contains_struct[CONST_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[CONST_DECL][TS_DECL_COMMON]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 635, __FUNCTION__), 0 : 0))
;
636 gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[VAR_DECL][TS_DECL_COMMON]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 636, __FUNCTION__), 0 : 0))
;
637 gcc_assert (tree_contains_struct[PARM_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[PARM_DECL][TS_DECL_COMMON]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 637, __FUNCTION__), 0 : 0))
;
638 gcc_assert (tree_contains_struct[RESULT_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[RESULT_DECL][TS_DECL_COMMON]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 638, __FUNCTION__), 0 : 0))
;
639 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[FUNCTION_DECL][TS_DECL_COMMON]
) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 639, __FUNCTION__), 0 : 0))
;
640 gcc_assert (tree_contains_struct[TYPE_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[TYPE_DECL][TS_DECL_COMMON]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 640, __FUNCTION__), 0 : 0))
;
641 gcc_assert (tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_COMMON
]) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 641, __FUNCTION__), 0 : 0))
;
642 gcc_assert (tree_contains_struct[LABEL_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[LABEL_DECL][TS_DECL_COMMON]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 642, __FUNCTION__), 0 : 0))
;
643 gcc_assert (tree_contains_struct[FIELD_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[FIELD_DECL][TS_DECL_COMMON]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 643, __FUNCTION__), 0 : 0))
;
644 gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_WRTL])((void)(!(tree_contains_struct[VAR_DECL][TS_DECL_WRTL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 644, __FUNCTION__), 0 : 0))
;
645 gcc_assert (tree_contains_struct[PARM_DECL][TS_DECL_WRTL])((void)(!(tree_contains_struct[PARM_DECL][TS_DECL_WRTL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 645, __FUNCTION__), 0 : 0))
;
646 gcc_assert (tree_contains_struct[RESULT_DECL][TS_DECL_WRTL])((void)(!(tree_contains_struct[RESULT_DECL][TS_DECL_WRTL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 646, __FUNCTION__), 0 : 0))
;
647 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_WRTL])((void)(!(tree_contains_struct[FUNCTION_DECL][TS_DECL_WRTL]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 647, __FUNCTION__), 0 : 0))
;
648 gcc_assert (tree_contains_struct[LABEL_DECL][TS_DECL_WRTL])((void)(!(tree_contains_struct[LABEL_DECL][TS_DECL_WRTL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 648, __FUNCTION__), 0 : 0))
;
649 gcc_assert (tree_contains_struct[CONST_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[CONST_DECL][TS_DECL_MINIMAL]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 649, __FUNCTION__), 0 : 0))
;
650 gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[VAR_DECL][TS_DECL_MINIMAL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 650, __FUNCTION__), 0 : 0))
;
651 gcc_assert (tree_contains_struct[PARM_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[PARM_DECL][TS_DECL_MINIMAL]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 651, __FUNCTION__), 0 : 0))
;
652 gcc_assert (tree_contains_struct[RESULT_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[RESULT_DECL][TS_DECL_MINIMAL])
? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 652, __FUNCTION__), 0 : 0))
;
653 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[FUNCTION_DECL][TS_DECL_MINIMAL
]) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 653, __FUNCTION__), 0 : 0))
;
654 gcc_assert (tree_contains_struct[TYPE_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[TYPE_DECL][TS_DECL_MINIMAL]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 654, __FUNCTION__), 0 : 0))
;
655 gcc_assert (tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_MINIMAL
]) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 655, __FUNCTION__), 0 : 0))
;
656 gcc_assert (tree_contains_struct[LABEL_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[LABEL_DECL][TS_DECL_MINIMAL]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 656, __FUNCTION__), 0 : 0))
;
657 gcc_assert (tree_contains_struct[FIELD_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[FIELD_DECL][TS_DECL_MINIMAL]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 657, __FUNCTION__), 0 : 0))
;
658 gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_WITH_VIS])((void)(!(tree_contains_struct[VAR_DECL][TS_DECL_WITH_VIS]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 658, __FUNCTION__), 0 : 0))
;
659 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_WITH_VIS])((void)(!(tree_contains_struct[FUNCTION_DECL][TS_DECL_WITH_VIS
]) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 659, __FUNCTION__), 0 : 0))
;
660 gcc_assert (tree_contains_struct[TYPE_DECL][TS_DECL_WITH_VIS])((void)(!(tree_contains_struct[TYPE_DECL][TS_DECL_WITH_VIS]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 660, __FUNCTION__), 0 : 0))
;
661 gcc_assert (tree_contains_struct[VAR_DECL][TS_VAR_DECL])((void)(!(tree_contains_struct[VAR_DECL][TS_VAR_DECL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 661, __FUNCTION__), 0 : 0))
;
662 gcc_assert (tree_contains_struct[FIELD_DECL][TS_FIELD_DECL])((void)(!(tree_contains_struct[FIELD_DECL][TS_FIELD_DECL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 662, __FUNCTION__), 0 : 0))
;
663 gcc_assert (tree_contains_struct[PARM_DECL][TS_PARM_DECL])((void)(!(tree_contains_struct[PARM_DECL][TS_PARM_DECL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 663, __FUNCTION__), 0 : 0))
;
664 gcc_assert (tree_contains_struct[LABEL_DECL][TS_LABEL_DECL])((void)(!(tree_contains_struct[LABEL_DECL][TS_LABEL_DECL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 664, __FUNCTION__), 0 : 0))
;
665 gcc_assert (tree_contains_struct[RESULT_DECL][TS_RESULT_DECL])((void)(!(tree_contains_struct[RESULT_DECL][TS_RESULT_DECL]) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 665, __FUNCTION__), 0 : 0))
;
666 gcc_assert (tree_contains_struct[CONST_DECL][TS_CONST_DECL])((void)(!(tree_contains_struct[CONST_DECL][TS_CONST_DECL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 666, __FUNCTION__), 0 : 0))
;
667 gcc_assert (tree_contains_struct[TYPE_DECL][TS_TYPE_DECL])((void)(!(tree_contains_struct[TYPE_DECL][TS_TYPE_DECL]) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 667, __FUNCTION__), 0 : 0))
;
668 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_FUNCTION_DECL])((void)(!(tree_contains_struct[FUNCTION_DECL][TS_FUNCTION_DECL
]) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 668, __FUNCTION__), 0 : 0))
;
669 gcc_assert (tree_contains_struct[IMPORTED_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[IMPORTED_DECL][TS_DECL_MINIMAL
]) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 669, __FUNCTION__), 0 : 0))
;
670 gcc_assert (tree_contains_struct[IMPORTED_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[IMPORTED_DECL][TS_DECL_COMMON]
) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 670, __FUNCTION__), 0 : 0))
;
671 gcc_assert (tree_contains_struct[NAMELIST_DECL][TS_DECL_MINIMAL])((void)(!(tree_contains_struct[NAMELIST_DECL][TS_DECL_MINIMAL
]) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 671, __FUNCTION__), 0 : 0))
;
672 gcc_assert (tree_contains_struct[NAMELIST_DECL][TS_DECL_COMMON])((void)(!(tree_contains_struct[NAMELIST_DECL][TS_DECL_COMMON]
) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 672, __FUNCTION__), 0 : 0))
;
673}
674
675
676/* Init tree.cc. */
677
678void
679init_ttree (void)
680{
681 /* Initialize the hash table of types. */
682 type_hash_table
683 = hash_table<type_cache_hasher>::create_ggc (TYPE_HASH_INITIAL_SIZE1000);
684
685 debug_expr_for_decl
686 = hash_table<tree_decl_map_cache_hasher>::create_ggc (512);
687
688 value_expr_for_decl
689 = hash_table<tree_decl_map_cache_hasher>::create_ggc (512);
690
691 int_cst_hash_table = hash_table<int_cst_hasher>::create_ggc (1024);
692
693 poly_int_cst_hash_table = hash_table<poly_int_cst_hasher>::create_ggc (64);
694
695 int_cst_node = make_int_cst (1, 1);
696
697 cl_option_hash_table = hash_table<cl_option_hasher>::create_ggc (64);
698
699 cl_optimization_node = make_node (OPTIMIZATION_NODE);
700 cl_target_option_node = make_node (TARGET_OPTION_NODE);
701
702 /* Initialize the tree_contains_struct array. */
703 initialize_tree_contains_struct ();
704 lang_hooks.init_ts ();
705}
706
707
708/* The name of the object as the assembler will see it (but before any
709 translations made by ASM_OUTPUT_LABELREF). Often this is the same
710 as DECL_NAME. It is an IDENTIFIER_NODE. */
711tree
712decl_assembler_name (tree decl)
713{
714 if (!DECL_ASSEMBLER_NAME_SET_P (decl)(((contains_struct_check ((decl), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 714, __FUNCTION__))->decl_with_vis.assembler_name) != (tree
) nullptr)
)
715 lang_hooks.set_decl_assembler_name (decl);
716 return DECL_ASSEMBLER_NAME_RAW (decl)((contains_struct_check ((decl), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 716, __FUNCTION__))->decl_with_vis.assembler_name)
;
717}
718
719/* The DECL_ASSEMBLER_NAME_RAW of DECL is being explicitly set to NAME
720 (either of which may be NULL). Inform the FE, if this changes the
721 name. */
722
723void
724overwrite_decl_assembler_name (tree decl, tree name)
725{
726 if (DECL_ASSEMBLER_NAME_RAW (decl)((contains_struct_check ((decl), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 726, __FUNCTION__))->decl_with_vis.assembler_name)
!= name)
727 lang_hooks.overwrite_decl_assembler_name (decl, name);
728}
729
730/* Return true if DECL may need an assembler name to be set. */
731
732static inline bool
733need_assembler_name_p (tree decl)
734{
735 /* We use DECL_ASSEMBLER_NAME to hold mangled type names for One Definition
736 Rule merging. This makes type_odr_p to return true on those types during
737 LTO and by comparing the mangled name, we can say what types are intended
738 to be equivalent across compilation unit.
739
740 We do not store names of type_in_anonymous_namespace_p.
741
742 Record, union and enumeration type have linkage that allows use
743 to check type_in_anonymous_namespace_p. We do not mangle compound types
744 that always can be compared structurally.
745
746 Similarly for builtin types, we compare properties of their main variant.
747 A special case are integer types where mangling do make differences
748 between char/signed char/unsigned char etc. Storing name for these makes
749 e.g. -fno-signed-char/-fsigned-char mismatches to be handled well.
750 See cp/mangle.cc:write_builtin_type for details. */
751
752 if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TYPE_DECL)
753 {
754 if (DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 754, __FUNCTION__))->decl_minimal.name)
755 && decl == TYPE_NAME (TREE_TYPE (decl))((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 755, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 755, __FUNCTION__))->type_common.name)
756 && TYPE_MAIN_VARIANT (TREE_TYPE (decl))((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 756, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 756, __FUNCTION__))->type_common.main_variant)
== TREE_TYPE (decl)((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 756, __FUNCTION__))->typed.type)
757 && !TYPE_ARTIFICIAL (TREE_TYPE (decl))((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 757, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 757, __FUNCTION__))->base.nowarning_flag)
758 && ((TREE_CODE (TREE_TYPE (decl))((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 758, __FUNCTION__))->typed.type))->base.code)
!= RECORD_TYPE
759 && TREE_CODE (TREE_TYPE (decl))((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 759, __FUNCTION__))->typed.type))->base.code)
!= UNION_TYPE)
760 || TYPE_CXX_ODR_P (TREE_TYPE (decl))((tree_check3 ((((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 760, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 760, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE
)))->type_common.string_flag)
)
761 && (type_with_linkage_p (TREE_TYPE (decl)((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 761, __FUNCTION__))->typed.type)
)
762 || TREE_CODE (TREE_TYPE (decl))((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 762, __FUNCTION__))->typed.type))->base.code)
== INTEGER_TYPE)
763 && !variably_modified_type_p (TREE_TYPE (decl)((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 763, __FUNCTION__))->typed.type)
, NULL_TREE(tree) nullptr))
764 return !DECL_ASSEMBLER_NAME_SET_P (decl)(((contains_struct_check ((decl), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 764, __FUNCTION__))->decl_with_vis.assembler_name) != (tree
) nullptr)
;
765 return false;
766 }
767 /* Only FUNCTION_DECLs and VAR_DECLs are considered. */
768 if (!VAR_OR_FUNCTION_DECL_P (decl)(((enum tree_code) (decl)->base.code) == VAR_DECL || ((enum
tree_code) (decl)->base.code) == FUNCTION_DECL)
)
769 return false;
770
771 /* If DECL already has its assembler name set, it does not need a
772 new one. */
773 if (!HAS_DECL_ASSEMBLER_NAME_P (decl)((tree_contains_struct[(((enum tree_code) (decl)->base.code
))][(TS_DECL_WITH_VIS)]))
774 || DECL_ASSEMBLER_NAME_SET_P (decl)(((contains_struct_check ((decl), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 774, __FUNCTION__))->decl_with_vis.assembler_name) != (tree
) nullptr)
)
775 return false;
776
777 /* Abstract decls do not need an assembler name. */
778 if (DECL_ABSTRACT_P (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 778, __FUNCTION__))->decl_common.abstract_flag)
)
779 return false;
780
781 /* For VAR_DECLs, only static, public and external symbols need an
782 assembler name. */
783 if (VAR_P (decl)(((enum tree_code) (decl)->base.code) == VAR_DECL)
784 && !TREE_STATIC (decl)((decl)->base.static_flag)
785 && !TREE_PUBLIC (decl)((decl)->base.public_flag)
786 && !DECL_EXTERNAL (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 786, __FUNCTION__))->decl_common.decl_flag_1)
)
787 return false;
788
789 if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == FUNCTION_DECL)
790 {
791 /* Do not set assembler name on builtins. Allow RTL expansion to
792 decide whether to expand inline or via a regular call. */
793 if (fndecl_built_in_p (decl)
794 && DECL_BUILT_IN_CLASS (decl)((built_in_class) (tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 794, __FUNCTION__, (FUNCTION_DECL)))->function_decl.built_in_class
)
!= BUILT_IN_FRONTEND)
795 return false;
796
797 /* Functions represented in the callgraph need an assembler name. */
798 if (cgraph_node::get (decl) != NULLnullptr)
799 return true;
800
801 /* Unused and not public functions don't need an assembler name. */
802 if (!TREE_USED (decl)((decl)->base.used_flag) && !TREE_PUBLIC (decl)((decl)->base.public_flag))
803 return false;
804 }
805
806 return true;
807}
808
809/* If T needs an assembler name, have one created for it. */
810
811void
812assign_assembler_name_if_needed (tree t)
813{
814 if (need_assembler_name_p (t))
815 {
816 /* When setting DECL_ASSEMBLER_NAME, the C++ mangler may emit
817 diagnostics that use input_location to show locus
818 information. The problem here is that, at this point,
819 input_location is generally anchored to the end of the file
820 (since the parser is long gone), so we don't have a good
821 position to pin it to.
822
823 To alleviate this problem, this uses the location of T's
824 declaration. Examples of this are
825 testsuite/g++.dg/template/cond2.C and
826 testsuite/g++.dg/template/pr35240.C. */
827 location_t saved_location = input_location;
828 input_location = DECL_SOURCE_LOCATION (t)((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 828, __FUNCTION__))->decl_minimal.locus)
;
829
830 decl_assembler_name (t);
831
832 input_location = saved_location;
833 }
834}
835
836/* When the target supports COMDAT groups, this indicates which group the
837 DECL is associated with. This can be either an IDENTIFIER_NODE or a
838 decl, in which case its DECL_ASSEMBLER_NAME identifies the group. */
839tree
840decl_comdat_group (const_tree node)
841{
842 struct symtab_node *snode = symtab_node::get (node);
843 if (!snode)
844 return NULLnullptr;
845 return snode->get_comdat_group ();
846}
847
848/* Likewise, but make sure it's been reduced to an IDENTIFIER_NODE. */
849tree
850decl_comdat_group_id (const_tree node)
851{
852 struct symtab_node *snode = symtab_node::get (node);
853 if (!snode)
854 return NULLnullptr;
855 return snode->get_comdat_group_id ();
856}
857
858/* When the target supports named section, return its name as IDENTIFIER_NODE
859 or NULL if it is in no section. */
860const char *
861decl_section_name (const_tree node)
862{
863 struct symtab_node *snode = symtab_node::get (node);
864 if (!snode)
865 return NULLnullptr;
866 return snode->get_section ();
867}
868
869/* Set section name of NODE to VALUE (that is expected to be
870 identifier node) */
871void
872set_decl_section_name (tree node, const char *value)
873{
874 struct symtab_node *snode;
875
876 if (value == NULLnullptr)
877 {
878 snode = symtab_node::get (node);
879 if (!snode)
880 return;
881 }
882 else if (VAR_P (node)(((enum tree_code) (node)->base.code) == VAR_DECL))
883 snode = varpool_node::get_create (node);
884 else
885 snode = cgraph_node::get_create (node);
886 snode->set_section (value);
887}
888
889/* Set section name of NODE to match the section name of OTHER.
890
891 set_decl_section_name (decl, other) is equivalent to
892 set_decl_section_name (decl, DECL_SECTION_NAME (other)), but possibly more
893 efficient. */
894void
895set_decl_section_name (tree decl, const_tree other)
896{
897 struct symtab_node *other_node = symtab_node::get (other);
898 if (other_node)
899 {
900 struct symtab_node *decl_node;
901 if (VAR_P (decl)(((enum tree_code) (decl)->base.code) == VAR_DECL))
902 decl_node = varpool_node::get_create (decl);
903 else
904 decl_node = cgraph_node::get_create (decl);
905 decl_node->set_section (*other_node);
906 }
907 else
908 {
909 struct symtab_node *decl_node = symtab_node::get (decl);
910 if (!decl_node)
911 return;
912 decl_node->set_section (NULLnullptr);
913 }
914}
915
916/* Return TLS model of a variable NODE. */
917enum tls_model
918decl_tls_model (const_tree node)
919{
920 struct varpool_node *snode = varpool_node::get (node);
921 if (!snode)
922 return TLS_MODEL_NONE;
923 return snode->tls_model;
924}
925
926/* Set TLS model of variable NODE to MODEL. */
927void
928set_decl_tls_model (tree node, enum tls_model model)
929{
930 struct varpool_node *vnode;
931
932 if (model == TLS_MODEL_NONE)
933 {
934 vnode = varpool_node::get (node);
935 if (!vnode)
936 return;
937 }
938 else
939 vnode = varpool_node::get_create (node);
940 vnode->tls_model = model;
941}
942
943/* Compute the number of bytes occupied by a tree with code CODE.
944 This function cannot be used for nodes that have variable sizes,
945 including TREE_VEC, INTEGER_CST, STRING_CST, and CALL_EXPR. */
946size_t
947tree_code_size (enum tree_code code)
948{
949 switch (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)])
950 {
951 case tcc_declaration: /* A decl node */
952 switch (code)
953 {
954 case FIELD_DECL: return sizeof (tree_field_decl);
955 case PARM_DECL: return sizeof (tree_parm_decl);
956 case VAR_DECL: return sizeof (tree_var_decl);
957 case LABEL_DECL: return sizeof (tree_label_decl);
958 case RESULT_DECL: return sizeof (tree_result_decl);
959 case CONST_DECL: return sizeof (tree_const_decl);
960 case TYPE_DECL: return sizeof (tree_type_decl);
961 case FUNCTION_DECL: return sizeof (tree_function_decl);
962 case DEBUG_EXPR_DECL: return sizeof (tree_decl_with_rtl);
963 case TRANSLATION_UNIT_DECL: return sizeof (tree_translation_unit_decl);
964 case NAMESPACE_DECL:
965 case IMPORTED_DECL:
966 case NAMELIST_DECL: return sizeof (tree_decl_non_common);
967 default:
968 gcc_checking_assert (code >= NUM_TREE_CODES)((void)(!(code >= ((int) LAST_AND_UNUSED_TREE_CODE)) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 968, __FUNCTION__), 0 : 0))
;
969 return lang_hooks.tree_size (code);
970 }
971
972 case tcc_type: /* a type node */
973 switch (code)
974 {
975 case OFFSET_TYPE:
976 case ENUMERAL_TYPE:
977 case BOOLEAN_TYPE:
978 case INTEGER_TYPE:
979 case REAL_TYPE:
980 case OPAQUE_TYPE:
981 case POINTER_TYPE:
982 case REFERENCE_TYPE:
983 case NULLPTR_TYPE:
984 case FIXED_POINT_TYPE:
985 case COMPLEX_TYPE:
986 case VECTOR_TYPE:
987 case ARRAY_TYPE:
988 case RECORD_TYPE:
989 case UNION_TYPE:
990 case QUAL_UNION_TYPE:
991 case VOID_TYPE:
992 case FUNCTION_TYPE:
993 case METHOD_TYPE:
994 case LANG_TYPE: return sizeof (tree_type_non_common);
995 default:
996 gcc_checking_assert (code >= NUM_TREE_CODES)((void)(!(code >= ((int) LAST_AND_UNUSED_TREE_CODE)) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 996, __FUNCTION__), 0 : 0))
;
997 return lang_hooks.tree_size (code);
998 }
999
1000 case tcc_reference: /* a reference */
1001 case tcc_expression: /* an expression */
1002 case tcc_statement: /* an expression with side effects */
1003 case tcc_comparison: /* a comparison expression */
1004 case tcc_unary: /* a unary arithmetic expression */
1005 case tcc_binary: /* a binary arithmetic expression */
1006 return (sizeof (struct tree_exp)
1007 + (TREE_CODE_LENGTH (code)tree_code_length_tmpl <0>::tree_code_length[(int) (code
)]
- 1) * sizeof (tree));
1008
1009 case tcc_constant: /* a constant */
1010 switch (code)
1011 {
1012 case VOID_CST: return sizeof (tree_typed);
1013 case INTEGER_CST: gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1013, __FUNCTION__))
;
1014 case POLY_INT_CST: return sizeof (tree_poly_int_cst);
1015 case REAL_CST: return sizeof (tree_real_cst);
1016 case FIXED_CST: return sizeof (tree_fixed_cst);
1017 case COMPLEX_CST: return sizeof (tree_complex);
1018 case VECTOR_CST: gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1018, __FUNCTION__))
;
1019 case STRING_CST: gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1019, __FUNCTION__))
;
1020 default:
1021 gcc_checking_assert (code >= NUM_TREE_CODES)((void)(!(code >= ((int) LAST_AND_UNUSED_TREE_CODE)) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1021, __FUNCTION__), 0 : 0))
;
1022 return lang_hooks.tree_size (code);
1023 }
1024
1025 case tcc_exceptional: /* something random, like an identifier. */
1026 switch (code)
1027 {
1028 case IDENTIFIER_NODE: return lang_hooks.identifier_size;
1029 case TREE_LIST: return sizeof (tree_list);
1030
1031 case ERROR_MARK:
1032 case PLACEHOLDER_EXPR: return sizeof (tree_common);
1033
1034 case TREE_VEC: gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1034, __FUNCTION__))
;
1035 case OMP_CLAUSE: gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1035, __FUNCTION__))
;
1036
1037 case SSA_NAME: return sizeof (tree_ssa_name);
1038
1039 case STATEMENT_LIST: return sizeof (tree_statement_list);
1040 case BLOCK: return sizeof (struct tree_block);
1041 case CONSTRUCTOR: return sizeof (tree_constructor);
1042 case OPTIMIZATION_NODE: return sizeof (tree_optimization_option);
1043 case TARGET_OPTION_NODE: return sizeof (tree_target_option);
1044
1045 default:
1046 gcc_checking_assert (code >= NUM_TREE_CODES)((void)(!(code >= ((int) LAST_AND_UNUSED_TREE_CODE)) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1046, __FUNCTION__), 0 : 0))
;
1047 return lang_hooks.tree_size (code);
1048 }
1049
1050 default:
1051 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1051, __FUNCTION__))
;
1052 }
1053}
1054
1055/* Compute the number of bytes occupied by NODE. This routine only
1056 looks at TREE_CODE, except for those nodes that have variable sizes. */
1057size_t
1058tree_size (const_tree node)
1059{
1060 const enum tree_code code = TREE_CODE (node)((enum tree_code) (node)->base.code);
1061 switch (code)
1062 {
1063 case INTEGER_CST:
1064 return (sizeof (struct tree_int_cst)
1065 + (TREE_INT_CST_EXT_NUNITS (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1065, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.extended
)
- 1) * sizeof (HOST_WIDE_INTlong));
1066
1067 case TREE_BINFO:
1068 return (offsetof (struct tree_binfo, base_binfos)__builtin_offsetof(struct tree_binfo, base_binfos)
1069 + vec<tree, va_gc>
1070 ::embedded_size (BINFO_N_BASE_BINFOS (node)((&(tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1070, __FUNCTION__, (TREE_BINFO)))->binfo.base_binfos)->
length ())
));
1071
1072 case TREE_VEC:
1073 return (sizeof (struct tree_vec)
1074 + (TREE_VEC_LENGTH (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1074, __FUNCTION__, (TREE_VEC)))->base.u.length)
- 1) * sizeof (tree));
1075
1076 case VECTOR_CST:
1077 return (sizeof (struct tree_vector)
1078 + (vector_cst_encoded_nelts (node) - 1) * sizeof (tree));
1079
1080 case STRING_CST:
1081 return TREE_STRING_LENGTH (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1081, __FUNCTION__, (STRING_CST)))->string.length)
+ offsetof (struct tree_string, str)__builtin_offsetof(struct tree_string, str) + 1;
1082
1083 case OMP_CLAUSE:
1084 return (sizeof (struct tree_omp_clause)
1085 + (omp_clause_num_ops[OMP_CLAUSE_CODE (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1085, __FUNCTION__, (OMP_CLAUSE))))->omp_clause.code
] - 1)
1086 * sizeof (tree));
1087
1088 default:
1089 if (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_vl_exp)
1090 return (sizeof (struct tree_exp)
1091 + (VL_EXP_OPERAND_LENGTH (node)((int)((unsigned long) (*tree_int_cst_elt_check (((tree_class_check
((node), (tcc_vl_exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1091, __FUNCTION__))->exp.operands[0]), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1091, __FUNCTION__))))
- 1) * sizeof (tree));
1092 else
1093 return tree_code_size (code);
1094 }
1095}
1096
1097/* Return tree node kind based on tree CODE. */
1098
1099static tree_node_kind
1100get_stats_node_kind (enum tree_code code)
1101{
1102 enum tree_code_class type = TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)];
1103
1104 switch (type)
1105 {
1106 case tcc_declaration: /* A decl node */
1107 return d_kind;
1108 case tcc_type: /* a type node */
1109 return t_kind;
1110 case tcc_statement: /* an expression with side effects */
1111 return s_kind;
1112 case tcc_reference: /* a reference */
1113 return r_kind;
1114 case tcc_expression: /* an expression */
1115 case tcc_comparison: /* a comparison expression */
1116 case tcc_unary: /* a unary arithmetic expression */
1117 case tcc_binary: /* a binary arithmetic expression */
1118 return e_kind;
1119 case tcc_constant: /* a constant */
1120 return c_kind;
1121 case tcc_exceptional: /* something random, like an identifier. */
1122 switch (code)
1123 {
1124 case IDENTIFIER_NODE:
1125 return id_kind;
1126 case TREE_VEC:
1127 return vec_kind;
1128 case TREE_BINFO:
1129 return binfo_kind;
1130 case SSA_NAME:
1131 return ssa_name_kind;
1132 case BLOCK:
1133 return b_kind;
1134 case CONSTRUCTOR:
1135 return constr_kind;
1136 case OMP_CLAUSE:
1137 return omp_clause_kind;
1138 default:
1139 return x_kind;
1140 }
1141 break;
1142 case tcc_vl_exp:
1143 return e_kind;
1144 default:
1145 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1145, __FUNCTION__))
;
1146 }
1147}
1148
1149/* Record interesting allocation statistics for a tree node with CODE
1150 and LENGTH. */
1151
1152static void
1153record_node_allocation_statistics (enum tree_code code, size_t length)
1154{
1155 if (!GATHER_STATISTICS0)
1156 return;
1157
1158 tree_node_kind kind = get_stats_node_kind (code);
1159
1160 tree_code_counts[(int) code]++;
1161 tree_node_counts[(int) kind]++;
1162 tree_node_sizes[(int) kind] += length;
1163}
1164
1165/* Allocate and return a new UID from the DECL_UID namespace. */
1166
1167int
1168allocate_decl_uid (void)
1169{
1170 return next_decl_uid++;
1171}
1172
1173/* Return a newly allocated node of code CODE. For decl and type
1174 nodes, some other fields are initialized. The rest of the node is
1175 initialized to zero. This function cannot be used for TREE_VEC,
1176 INTEGER_CST or OMP_CLAUSE nodes, which is enforced by asserts in
1177 tree_code_size.
1178
1179 Achoo! I got a code in the node. */
1180
1181tree
1182make_node (enum tree_code code MEM_STAT_DECL)
1183{
1184 tree t;
1185 enum tree_code_class type = TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)];
1186 size_t length = tree_code_size (code);
1187
1188 record_node_allocation_statistics (code, length);
1189
1190 t = ggc_alloc_cleared_tree_node_stat (length PASS_MEM_STAT);
1191 TREE_SET_CODE (t, code)((t)->base.code = (code));
1192
1193 switch (type)
1194 {
1195 case tcc_statement:
1196 if (code != DEBUG_BEGIN_STMT)
1197 TREE_SIDE_EFFECTS (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1197, __FUNCTION__))->base.side_effects_flag)
= 1;
1198 break;
1199
1200 case tcc_declaration:
1201 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)(tree_contains_struct[(code)][(TS_DECL_COMMON)]))
1202 {
1203 if (code == FUNCTION_DECL)
1204 {
1205 SET_DECL_ALIGN (t, FUNCTION_ALIGNMENT (FUNCTION_BOUNDARY))(((contains_struct_check ((t), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1205, __FUNCTION__))->decl_common.align) = ffs_hwi ((lang_hooks
.custom_function_descriptors && targetm.calls.custom_function_descriptors
> 0 ? (((8)) > (2 * targetm.calls.custom_function_descriptors
* (8)) ? ((8)) : (2 * targetm.calls.custom_function_descriptors
* (8))) : (8))))
;
1206 SET_DECL_MODE (t, FUNCTION_MODE)((contains_struct_check ((t), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1206, __FUNCTION__))->decl_common.mode = ((scalar_int_mode
((scalar_int_mode::from_int) E_QImode))))
;
1207 }
1208 else
1209 SET_DECL_ALIGN (t, 1)(((contains_struct_check ((t), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1209, __FUNCTION__))->decl_common.align) = ffs_hwi (1))
;
1210 }
1211 DECL_SOURCE_LOCATION (t)((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1211, __FUNCTION__))->decl_minimal.locus)
= input_location;
1212 if (TREE_CODE (t)((enum tree_code) (t)->base.code) == DEBUG_EXPR_DECL)
1213 DECL_UID (t)((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1213, __FUNCTION__))->decl_minimal.uid)
= --next_debug_decl_uid;
1214 else
1215 {
1216 DECL_UID (t)((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1216, __FUNCTION__))->decl_minimal.uid)
= allocate_decl_uid ();
1217 SET_DECL_PT_UID (t, -1)((contains_struct_check ((t), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1217, __FUNCTION__))->decl_common.pt_uid = (-1))
;
1218 }
1219 if (TREE_CODE (t)((enum tree_code) (t)->base.code) == LABEL_DECL)
1220 LABEL_DECL_UID (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1220, __FUNCTION__, (LABEL_DECL)))->label_decl.label_decl_uid
)
= -1;
1221
1222 break;
1223
1224 case tcc_type:
1225 TYPE_UID (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1225, __FUNCTION__))->type_common.uid)
= next_type_uid++;
1226 SET_TYPE_ALIGN (t, BITS_PER_UNIT)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1226, __FUNCTION__))->type_common.align = ffs_hwi ((8)))
;
1227 TYPE_USER_ALIGN (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1227, __FUNCTION__))->base.u.bits.user_align)
= 0;
1228 TYPE_MAIN_VARIANT (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1228, __FUNCTION__))->type_common.main_variant)
= t;
1229 TYPE_CANONICAL (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1229, __FUNCTION__))->type_common.canonical)
= t;
1230
1231 /* Default to no attributes for type, but let target change that. */
1232 TYPE_ATTRIBUTES (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1232, __FUNCTION__))->type_common.attributes)
= NULL_TREE(tree) nullptr;
1233 targetm.set_default_type_attributes (t);
1234
1235 /* We have not yet computed the alias set for this type. */
1236 TYPE_ALIAS_SET (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1236, __FUNCTION__))->type_common.alias_set)
= -1;
1237 break;
1238
1239 case tcc_constant:
1240 TREE_CONSTANT (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1240, __FUNCTION__))->base.constant_flag)
= 1;
1241 break;
1242
1243 case tcc_expression:
1244 switch (code)
1245 {
1246 case INIT_EXPR:
1247 case MODIFY_EXPR:
1248 case VA_ARG_EXPR:
1249 case PREDECREMENT_EXPR:
1250 case PREINCREMENT_EXPR:
1251 case POSTDECREMENT_EXPR:
1252 case POSTINCREMENT_EXPR:
1253 /* All of these have side-effects, no matter what their
1254 operands are. */
1255 TREE_SIDE_EFFECTS (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1255, __FUNCTION__))->base.side_effects_flag)
= 1;
1256 break;
1257
1258 default:
1259 break;
1260 }
1261 break;
1262
1263 case tcc_exceptional:
1264 switch (code)
1265 {
1266 case TARGET_OPTION_NODE:
1267 TREE_TARGET_OPTION(t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1267, __FUNCTION__, (TARGET_OPTION_NODE)))->target_option
.opts)
1268 = ggc_cleared_alloc<struct cl_target_option> ();
1269 break;
1270
1271 case OPTIMIZATION_NODE:
1272 TREE_OPTIMIZATION (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1272, __FUNCTION__, (OPTIMIZATION_NODE)))->optimization.
opts)
1273 = ggc_cleared_alloc<struct cl_optimization> ();
1274 break;
1275
1276 default:
1277 break;
1278 }
1279 break;
1280
1281 default:
1282 /* Other classes need no special treatment. */
1283 break;
1284 }
1285
1286 return t;
1287}
1288
1289/* Free tree node. */
1290
1291void
1292free_node (tree node)
1293{
1294 enum tree_code code = TREE_CODE (node)((enum tree_code) (node)->base.code);
1295 if (GATHER_STATISTICS0)
1296 {
1297 enum tree_node_kind kind = get_stats_node_kind (code);
1298
1299 gcc_checking_assert (tree_code_counts[(int) TREE_CODE (node)] != 0)((void)(!(tree_code_counts[(int) ((enum tree_code) (node)->
base.code)] != 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1299, __FUNCTION__), 0 : 0))
;
1300 gcc_checking_assert (tree_node_counts[(int) kind] != 0)((void)(!(tree_node_counts[(int) kind] != 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1300, __FUNCTION__), 0 : 0))
;
1301 gcc_checking_assert (tree_node_sizes[(int) kind] >= tree_size (node))((void)(!(tree_node_sizes[(int) kind] >= tree_size (node))
? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1301, __FUNCTION__), 0 : 0))
;
1302
1303 tree_code_counts[(int) TREE_CODE (node)((enum tree_code) (node)->base.code)]--;
1304 tree_node_counts[(int) kind]--;
1305 tree_node_sizes[(int) kind] -= tree_size (node);
1306 }
1307 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)(tree_contains_struct[(code)][(TS_CONSTRUCTOR)]))
1308 vec_free (CONSTRUCTOR_ELTS (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1308, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)
);
1309 else if (code == BLOCK)
1310 vec_free (BLOCK_NONLOCALIZED_VARS (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1310, __FUNCTION__, (BLOCK)))->block.nonlocalized_vars)
);
1311 else if (code == TREE_BINFO)
1312 vec_free (BINFO_BASE_ACCESSES (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1312, __FUNCTION__, (TREE_BINFO)))->binfo.base_accesses)
);
1313 else if (code == OPTIMIZATION_NODE)
1314 cl_optimization_option_free (TREE_OPTIMIZATION (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1314, __FUNCTION__, (OPTIMIZATION_NODE)))->optimization.
opts)
);
1315 else if (code == TARGET_OPTION_NODE)
1316 cl_target_option_free (TREE_TARGET_OPTION (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1316, __FUNCTION__, (TARGET_OPTION_NODE)))->target_option
.opts)
);
1317 ggc_free (node);
1318}
1319
1320/* Return a new node with the same contents as NODE except that its
1321 TREE_CHAIN, if it has one, is zero and it has a fresh uid. */
1322
1323tree
1324copy_node (tree node MEM_STAT_DECL)
1325{
1326 tree t;
1327 enum tree_code code = TREE_CODE (node)((enum tree_code) (node)->base.code);
1328 size_t length;
1329
1330 gcc_assert (code != STATEMENT_LIST)((void)(!(code != STATEMENT_LIST) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1330, __FUNCTION__), 0 : 0))
;
1331
1332 length = tree_size (node);
1333 record_node_allocation_statistics (code, length);
1334 t = ggc_alloc_tree_node_stat (length PASS_MEM_STAT);
1335 memcpy (t, node, length);
1336
1337 if (CODE_CONTAINS_STRUCT (code, TS_COMMON)(tree_contains_struct[(code)][(TS_COMMON)]))
1338 TREE_CHAIN (t)((contains_struct_check ((t), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1338, __FUNCTION__))->common.chain)
= 0;
1339 TREE_ASM_WRITTEN (t)((t)->base.asm_written_flag) = 0;
1340 TREE_VISITED (t)((t)->base.visited) = 0;
1341
1342 if (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_declaration)
1343 {
1344 if (code == DEBUG_EXPR_DECL)
1345 DECL_UID (t)((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1345, __FUNCTION__))->decl_minimal.uid)
= --next_debug_decl_uid;
1346 else
1347 {
1348 DECL_UID (t)((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1348, __FUNCTION__))->decl_minimal.uid)
= allocate_decl_uid ();
1349 if (DECL_PT_UID_SET_P (node)((contains_struct_check ((node), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1349, __FUNCTION__))->decl_common.pt_uid != -1u)
)
1350 SET_DECL_PT_UID (t, DECL_PT_UID (node))((contains_struct_check ((t), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1350, __FUNCTION__))->decl_common.pt_uid = (((contains_struct_check
((node), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1350, __FUNCTION__))->decl_common.pt_uid == -1u ? (node)
->decl_minimal.uid : (node)->decl_common.pt_uid)))
;
1351 }
1352 if ((TREE_CODE (node)((enum tree_code) (node)->base.code) == PARM_DECL || VAR_P (node)(((enum tree_code) (node)->base.code) == VAR_DECL))
1353 && DECL_HAS_VALUE_EXPR_P (node)((tree_check3 ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1353, __FUNCTION__, (VAR_DECL), (PARM_DECL), (RESULT_DECL))
) ->decl_common.decl_flag_2)
)
1354 {
1355 SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (node))(decl_value_expr_insert ((contains_struct_check ((t), (TS_DECL_WRTL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1355, __FUNCTION__)), (decl_value_expr_lookup ((contains_struct_check
((node), (TS_DECL_WRTL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1355, __FUNCTION__))))))
;
1356 DECL_HAS_VALUE_EXPR_P (t)((tree_check3 ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1356, __FUNCTION__, (VAR_DECL), (PARM_DECL), (RESULT_DECL))
) ->decl_common.decl_flag_2)
= 1;
1357 }
1358 /* DECL_DEBUG_EXPR is copied explicitly by callers. */
1359 if (VAR_P (node)(((enum tree_code) (node)->base.code) == VAR_DECL))
1360 {
1361 DECL_HAS_DEBUG_EXPR_P (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1361, __FUNCTION__, (VAR_DECL)))->decl_common.debug_expr_is_from
)
= 0;
1362 t->decl_with_vis.symtab_node = NULLnullptr;
1363 }
1364 if (VAR_P (node)(((enum tree_code) (node)->base.code) == VAR_DECL) && DECL_HAS_INIT_PRIORITY_P (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1364, __FUNCTION__, (VAR_DECL)))->decl_with_vis.init_priority_p
)
)
1365 {
1366 SET_DECL_INIT_PRIORITY (t, DECL_INIT_PRIORITY (node))(decl_init_priority_insert (t, (decl_init_priority_lookup (node
))))
;
1367 DECL_HAS_INIT_PRIORITY_P (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1367, __FUNCTION__, (VAR_DECL)))->decl_with_vis.init_priority_p
)
= 1;
1368 }
1369 if (TREE_CODE (node)((enum tree_code) (node)->base.code) == FUNCTION_DECL)
1370 {
1371 DECL_STRUCT_FUNCTION (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1371, __FUNCTION__, (FUNCTION_DECL)))->function_decl.f)
= NULLnullptr;
1372 t->decl_with_vis.symtab_node = NULLnullptr;
1373 }
1374 }
1375 else if (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_type)
1376 {
1377 TYPE_UID (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1377, __FUNCTION__))->type_common.uid)
= next_type_uid++;
1378 /* The following is so that the debug code for
1379 the copy is different from the original type.
1380 The two statements usually duplicate each other
1381 (because they clear fields of the same union),
1382 but the optimizer should catch that. */
1383 TYPE_SYMTAB_ADDRESS (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1383, __FUNCTION__))->type_common.symtab.address)
= 0;
1384 TYPE_SYMTAB_DIE (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1384, __FUNCTION__))->type_common.symtab.die)
= 0;
1385
1386 /* Do not copy the values cache. */
1387 if (TYPE_CACHED_VALUES_P (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1387, __FUNCTION__))->base.public_flag)
)
1388 {
1389 TYPE_CACHED_VALUES_P (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1389, __FUNCTION__))->base.public_flag)
= 0;
1390 TYPE_CACHED_VALUES (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1390, __FUNCTION__))->type_non_common.values)
= NULL_TREE(tree) nullptr;
1391 }
1392 }
1393 else if (code == TARGET_OPTION_NODE)
1394 {
1395 TREE_TARGET_OPTION (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1395, __FUNCTION__, (TARGET_OPTION_NODE)))->target_option
.opts)
= ggc_alloc<struct cl_target_option>();
1396 memcpy (TREE_TARGET_OPTION (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1396, __FUNCTION__, (TARGET_OPTION_NODE)))->target_option
.opts)
, TREE_TARGET_OPTION (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1396, __FUNCTION__, (TARGET_OPTION_NODE)))->target_option
.opts)
,
1397 sizeof (struct cl_target_option));
1398 }
1399 else if (code == OPTIMIZATION_NODE)
1400 {
1401 TREE_OPTIMIZATION (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1401, __FUNCTION__, (OPTIMIZATION_NODE)))->optimization.
opts)
= ggc_alloc<struct cl_optimization>();
1402 memcpy (TREE_OPTIMIZATION (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1402, __FUNCTION__, (OPTIMIZATION_NODE)))->optimization.
opts)
, TREE_OPTIMIZATION (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1402, __FUNCTION__, (OPTIMIZATION_NODE)))->optimization.
opts)
,
1403 sizeof (struct cl_optimization));
1404 }
1405
1406 return t;
1407}
1408
1409/* Return a copy of a chain of nodes, chained through the TREE_CHAIN field.
1410 For example, this can copy a list made of TREE_LIST nodes. */
1411
1412tree
1413copy_list (tree list)
1414{
1415 tree head;
1416 tree prev, next;
1417
1418 if (list == 0)
1419 return 0;
1420
1421 head = prev = copy_node (list);
1422 next = TREE_CHAIN (list)((contains_struct_check ((list), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1422, __FUNCTION__))->common.chain)
;
1423 while (next)
1424 {
1425 TREE_CHAIN (prev)((contains_struct_check ((prev), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1425, __FUNCTION__))->common.chain)
= copy_node (next);
1426 prev = TREE_CHAIN (prev)((contains_struct_check ((prev), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1426, __FUNCTION__))->common.chain)
;
1427 next = TREE_CHAIN (next)((contains_struct_check ((next), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1427, __FUNCTION__))->common.chain)
;
1428 }
1429 return head;
1430}
1431
1432
1433/* Return the value that TREE_INT_CST_EXT_NUNITS should have for an
1434 INTEGER_CST with value CST and type TYPE. */
1435
1436static unsigned int
1437get_int_cst_ext_nunits (tree type, const wide_int &cst)
1438{
1439 gcc_checking_assert (cst.get_precision () == TYPE_PRECISION (type))((void)(!(cst.get_precision () == ((tree_class_check ((type),
(tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1439, __FUNCTION__))->type_common.precision)) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1439, __FUNCTION__), 0 : 0))
;
1440 /* We need extra HWIs if CST is an unsigned integer with its
1441 upper bit set. */
1442 if (TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1442, __FUNCTION__))->base.u.bits.unsigned_flag)
&& wi::neg_p (cst))
1443 return cst.get_precision () / HOST_BITS_PER_WIDE_INT64 + 1;
1444 return cst.get_len ();
1445}
1446
1447/* Return a new INTEGER_CST with value CST and type TYPE. */
1448
1449static tree
1450build_new_int_cst (tree type, const wide_int &cst)
1451{
1452 unsigned int len = cst.get_len ();
1453 unsigned int ext_len = get_int_cst_ext_nunits (type, cst);
1454 tree nt = make_int_cst (len, ext_len);
1455
1456 if (len < ext_len)
1457 {
1458 --ext_len;
1459 TREE_INT_CST_ELT (nt, ext_len)(*tree_int_cst_elt_check ((nt), (ext_len), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1459, __FUNCTION__))
1460 = zext_hwi (-1, cst.get_precision () % HOST_BITS_PER_WIDE_INT64);
1461 for (unsigned int i = len; i < ext_len; ++i)
1462 TREE_INT_CST_ELT (nt, i)(*tree_int_cst_elt_check ((nt), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1462, __FUNCTION__))
= -1;
1463 }
1464 else if (TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1464, __FUNCTION__))->base.u.bits.unsigned_flag)
1465 && cst.get_precision () < len * HOST_BITS_PER_WIDE_INT64)
1466 {
1467 len--;
1468 TREE_INT_CST_ELT (nt, len)(*tree_int_cst_elt_check ((nt), (len), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1468, __FUNCTION__))
1469 = zext_hwi (cst.elt (len),
1470 cst.get_precision () % HOST_BITS_PER_WIDE_INT64);
1471 }
1472
1473 for (unsigned int i = 0; i < len; i++)
1474 TREE_INT_CST_ELT (nt, i)(*tree_int_cst_elt_check ((nt), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1474, __FUNCTION__))
= cst.elt (i);
1475 TREE_TYPE (nt)((contains_struct_check ((nt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1475, __FUNCTION__))->typed.type)
= type;
1476 return nt;
1477}
1478
1479/* Return a new POLY_INT_CST with coefficients COEFFS and type TYPE. */
1480
1481static tree
1482build_new_poly_int_cst (tree type, tree (&coeffs)[NUM_POLY_INT_COEFFS1]
1483 CXX_MEM_STAT_INFO)
1484{
1485 size_t length = sizeof (struct tree_poly_int_cst);
1486 record_node_allocation_statistics (POLY_INT_CST, length);
1487
1488 tree t = ggc_alloc_cleared_tree_node_stat (length PASS_MEM_STAT);
1489
1490 TREE_SET_CODE (t, POLY_INT_CST)((t)->base.code = (POLY_INT_CST));
1491 TREE_CONSTANT (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1491, __FUNCTION__))->base.constant_flag)
= 1;
1492 TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1492, __FUNCTION__))->typed.type)
= type;
1493 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS1; ++i)
1494 POLY_INT_CST_COEFF (t, i)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1494, __FUNCTION__, (POLY_INT_CST)))->poly_int_cst.coeffs
[i])
= coeffs[i];
1495 return t;
1496}
1497
1498/* Create a constant tree that contains CST sign-extended to TYPE. */
1499
1500tree
1501build_int_cst (tree type, poly_int64 cst)
1502{
1503 /* Support legacy code. */
1504 if (!type)
1505 type = integer_type_nodeinteger_types[itk_int];
1506
1507 return wide_int_to_tree (type, wi::shwi (cst, TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1507, __FUNCTION__))->type_common.precision)
));
1508}
1509
1510/* Create a constant tree that contains CST zero-extended to TYPE. */
1511
1512tree
1513build_int_cstu (tree type, poly_uint64 cst)
1514{
1515 return wide_int_to_tree (type, wi::uhwi (cst, TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1515, __FUNCTION__))->type_common.precision)
));
1516}
1517
1518/* Create a constant tree that contains CST sign-extended to TYPE. */
1519
1520tree
1521build_int_cst_type (tree type, poly_int64 cst)
1522{
1523 gcc_assert (type)((void)(!(type) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1523, __FUNCTION__), 0 : 0))
;
1524 return wide_int_to_tree (type, wi::shwi (cst, TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1524, __FUNCTION__))->type_common.precision)
));
1525}
1526
1527/* Constructs tree in type TYPE from with value given by CST. Signedness
1528 of CST is assumed to be the same as the signedness of TYPE. */
1529
1530tree
1531double_int_to_tree (tree type, double_int cst)
1532{
1533 return wide_int_to_tree (type, widest_int::from (cst, TYPE_SIGN (type)((signop) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1533, __FUNCTION__))->base.u.bits.unsigned_flag))
));
1534}
1535
1536/* We force the wide_int CST to the range of the type TYPE by sign or
1537 zero extending it. OVERFLOWABLE indicates if we are interested in
1538 overflow of the value, when >0 we are only interested in signed
1539 overflow, for <0 we are interested in any overflow. OVERFLOWED
1540 indicates whether overflow has already occurred. CONST_OVERFLOWED
1541 indicates whether constant overflow has already occurred. We force
1542 T's value to be within range of T's type (by setting to 0 or 1 all
1543 the bits outside the type's range). We set TREE_OVERFLOWED if,
1544 OVERFLOWED is nonzero,
1545 or OVERFLOWABLE is >0 and signed overflow occurs
1546 or OVERFLOWABLE is <0 and any overflow occurs
1547 We return a new tree node for the extended wide_int. The node
1548 is shared if no overflow flags are set. */
1549
1550
1551tree
1552force_fit_type (tree type, const poly_wide_int_ref &cst,
1553 int overflowable, bool overflowed)
1554{
1555 signop sign = TYPE_SIGN (type)((signop) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1555, __FUNCTION__))->base.u.bits.unsigned_flag))
;
1556
1557 /* If we need to set overflow flags, return a new unshared node. */
1558 if (overflowed || !wi::fits_to_tree_p (cst, type))
1559 {
1560 if (overflowed
1561 || overflowable < 0
1562 || (overflowable > 0 && sign == SIGNED))
1563 {
1564 poly_wide_int tmp = poly_wide_int::from (cst, TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1564, __FUNCTION__))->type_common.precision)
,
1565 sign);
1566 tree t;
1567 if (tmp.is_constant ())
1568 t = build_new_int_cst (type, tmp.coeffs[0]);
1569 else
1570 {
1571 tree coeffs[NUM_POLY_INT_COEFFS1];
1572 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS1; ++i)
1573 {
1574 coeffs[i] = build_new_int_cst (type, tmp.coeffs[i]);
1575 TREE_OVERFLOW (coeffs[i])((tree_class_check ((coeffs[i]), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1575, __FUNCTION__))->base.public_flag)
= 1;
1576 }
1577 t = build_new_poly_int_cst (type, coeffs);
1578 }
1579 TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1579, __FUNCTION__))->base.public_flag)
= 1;
1580 return t;
1581 }
1582 }
1583
1584 /* Else build a shared node. */
1585 return wide_int_to_tree (type, cst);
1586}
1587
1588/* These are the hash table functions for the hash table of INTEGER_CST
1589 nodes of a sizetype. */
1590
1591/* Return the hash code X, an INTEGER_CST. */
1592
1593hashval_t
1594int_cst_hasher::hash (tree x)
1595{
1596 const_tree const t = x;
1597 hashval_t code = TYPE_UID (TREE_TYPE (t))((tree_class_check ((((contains_struct_check ((t), (TS_TYPED)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1597, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1597, __FUNCTION__))->type_common.uid)
;
1598 int i;
1599
1600 for (i = 0; i < TREE_INT_CST_NUNITS (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1600, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended
)
; i++)
1601 code = iterative_hash_host_wide_int (TREE_INT_CST_ELT(t, i)(*tree_int_cst_elt_check ((t), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1601, __FUNCTION__))
, code);
1602
1603 return code;
1604}
1605
1606/* Return nonzero if the value represented by *X (an INTEGER_CST tree node)
1607 is the same as that given by *Y, which is the same. */
1608
1609bool
1610int_cst_hasher::equal (tree x, tree y)
1611{
1612 const_tree const xt = x;
1613 const_tree const yt = y;
1614
1615 if (TREE_TYPE (xt)((contains_struct_check ((xt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1615, __FUNCTION__))->typed.type)
!= TREE_TYPE (yt)((contains_struct_check ((yt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1615, __FUNCTION__))->typed.type)
1616 || TREE_INT_CST_NUNITS (xt)((tree_check ((xt), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1616, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended
)
!= TREE_INT_CST_NUNITS (yt)((tree_check ((yt), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1616, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended
)
1617 || TREE_INT_CST_EXT_NUNITS (xt)((tree_check ((xt), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1617, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.extended
)
!= TREE_INT_CST_EXT_NUNITS (yt)((tree_check ((yt), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1617, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.extended
)
)
1618 return false;
1619
1620 for (int i = 0; i < TREE_INT_CST_NUNITS (xt)((tree_check ((xt), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1620, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended
)
; i++)
1621 if (TREE_INT_CST_ELT (xt, i)(*tree_int_cst_elt_check ((xt), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1621, __FUNCTION__))
!= TREE_INT_CST_ELT (yt, i)(*tree_int_cst_elt_check ((yt), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1621, __FUNCTION__))
)
1622 return false;
1623
1624 return true;
1625}
1626
1627/* Cache wide_int CST into the TYPE_CACHED_VALUES cache for TYPE.
1628 SLOT is the slot entry to store it in, and MAX_SLOTS is the maximum
1629 number of slots that can be cached for the type. */
1630
1631static inline tree
1632cache_wide_int_in_type_cache (tree type, const wide_int &cst,
1633 int slot, int max_slots)
1634{
1635 gcc_checking_assert (slot >= 0)((void)(!(slot >= 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1635, __FUNCTION__), 0 : 0))
;
1636 /* Initialize cache. */
1637 if (!TYPE_CACHED_VALUES_P (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1637, __FUNCTION__))->base.public_flag)
)
1638 {
1639 TYPE_CACHED_VALUES_P (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1639, __FUNCTION__))->base.public_flag)
= 1;
1640 TYPE_CACHED_VALUES (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1640, __FUNCTION__))->type_non_common.values)
= make_tree_vec (max_slots);
1641 }
1642 tree t = TREE_VEC_ELT (TYPE_CACHED_VALUES (type), slot)(*((const_cast<tree *> (tree_vec_elt_check ((((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1642, __FUNCTION__))->type_non_common.values)), (slot), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1642, __FUNCTION__)))))
;
1643 if (!t)
1644 {
1645 /* Create a new shared int. */
1646 t = build_new_int_cst (type, cst);
1647 TREE_VEC_ELT (TYPE_CACHED_VALUES (type), slot)(*((const_cast<tree *> (tree_vec_elt_check ((((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1647, __FUNCTION__))->type_non_common.values)), (slot), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1647, __FUNCTION__)))))
= t;
1648 }
1649 return t;
1650}
1651
1652/* Create an INT_CST node of TYPE and value CST.
1653 The returned node is always shared. For small integers we use a
1654 per-type vector cache, for larger ones we use a single hash table.
1655 The value is extended from its precision according to the sign of
1656 the type to be a multiple of HOST_BITS_PER_WIDE_INT. This defines
1657 the upper bits and ensures that hashing and value equality based
1658 upon the underlying HOST_WIDE_INTs works without masking. */
1659
1660static tree
1661wide_int_to_tree_1 (tree type, const wide_int_ref &pcst)
1662{
1663 tree t;
1664 int ix = -1;
1665 int limit = 0;
1666
1667 gcc_assert (type)((void)(!(type) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1667, __FUNCTION__), 0 : 0))
;
1668 unsigned int prec = TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1668, __FUNCTION__))->type_common.precision)
;
1669 signop sgn = TYPE_SIGN (type)((signop) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1669, __FUNCTION__))->base.u.bits.unsigned_flag))
;
1670
1671 /* Verify that everything is canonical. */
1672 int l = pcst.get_len ();
1673 if (l > 1)
1674 {
1675 if (pcst.elt (l - 1) == 0)
1676 gcc_checking_assert (pcst.elt (l - 2) < 0)((void)(!(pcst.elt (l - 2) < 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1676, __FUNCTION__), 0 : 0))
;
1677 if (pcst.elt (l - 1) == HOST_WIDE_INT_M1-1L)
1678 gcc_checking_assert (pcst.elt (l - 2) >= 0)((void)(!(pcst.elt (l - 2) >= 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1678, __FUNCTION__), 0 : 0))
;
1679 }
1680
1681 wide_int cst = wide_int::from (pcst, prec, sgn);
1682 unsigned int ext_len = get_int_cst_ext_nunits (type, cst);
1683
1684 enum tree_code code = TREE_CODE (type)((enum tree_code) (type)->base.code);
1685 if (code == POINTER_TYPE || code == REFERENCE_TYPE)
1686 {
1687 /* Cache NULL pointer and zero bounds. */
1688 if (cst == 0)
1689 ix = 0;
1690 /* Cache upper bounds of pointers. */
1691 else if (cst == wi::max_value (prec, sgn))
1692 ix = 1;
1693 /* Cache 1 which is used for a non-zero range. */
1694 else if (cst == 1)
1695 ix = 2;
1696
1697 if (ix >= 0)
1698 {
1699 t = cache_wide_int_in_type_cache (type, cst, ix, 3);
1700 /* Make sure no one is clobbering the shared constant. */
1701 gcc_checking_assert (TREE_TYPE (t) == type((void)(!(((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1701, __FUNCTION__))->typed.type) == type && cst
== wi::to_wide (t)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1702, __FUNCTION__), 0 : 0))
1702 && cst == wi::to_wide (t))((void)(!(((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1701, __FUNCTION__))->typed.type) == type && cst
== wi::to_wide (t)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1702, __FUNCTION__), 0 : 0))
;
1703 return t;
1704 }
1705 }
1706 if (ext_len == 1)
1707 {
1708 /* We just need to store a single HOST_WIDE_INT. */
1709 HOST_WIDE_INTlong hwi;
1710 if (TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1710, __FUNCTION__))->base.u.bits.unsigned_flag)
)
1711 hwi = cst.to_uhwi ();
1712 else
1713 hwi = cst.to_shwi ();
1714
1715 switch (code)
1716 {
1717 case NULLPTR_TYPE:
1718 gcc_assert (hwi == 0)((void)(!(hwi == 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1718, __FUNCTION__), 0 : 0))
;
1719 /* Fallthru. */
1720
1721 case POINTER_TYPE:
1722 case REFERENCE_TYPE:
1723 /* Ignore pointers, as they were already handled above. */
1724 break;
1725
1726 case BOOLEAN_TYPE:
1727 /* Cache false or true. */
1728 limit = 2;
1729 if (IN_RANGE (hwi, 0, 1)((unsigned long) (hwi) - (unsigned long) (0) <= (unsigned long
) (1) - (unsigned long) (0))
)
1730 ix = hwi;
1731 break;
1732
1733 case INTEGER_TYPE:
1734 case OFFSET_TYPE:
1735 if (TYPE_SIGN (type)((signop) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1735, __FUNCTION__))->base.u.bits.unsigned_flag))
== UNSIGNED)
1736 {
1737 /* Cache [0, N). */
1738 limit = param_integer_share_limitglobal_options.x_param_integer_share_limit;
1739 if (IN_RANGE (hwi, 0, param_integer_share_limit - 1)((unsigned long) (hwi) - (unsigned long) (0) <= (unsigned long
) (global_options.x_param_integer_share_limit - 1) - (unsigned
long) (0))
)
1740 ix = hwi;
1741 }
1742 else
1743 {
1744 /* Cache [-1, N). */
1745 limit = param_integer_share_limitglobal_options.x_param_integer_share_limit + 1;
1746 if (IN_RANGE (hwi, -1, param_integer_share_limit - 1)((unsigned long) (hwi) - (unsigned long) (-1) <= (unsigned
long) (global_options.x_param_integer_share_limit - 1) - (unsigned
long) (-1))
)
1747 ix = hwi + 1;
1748 }
1749 break;
1750
1751 case ENUMERAL_TYPE:
1752 break;
1753
1754 default:
1755 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1755, __FUNCTION__))
;
1756 }
1757
1758 if (ix >= 0)
1759 {
1760 t = cache_wide_int_in_type_cache (type, cst, ix, limit);
1761 /* Make sure no one is clobbering the shared constant. */
1762 gcc_checking_assert (TREE_TYPE (t) == type((void)(!(((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1762, __FUNCTION__))->typed.type) == type && ((tree_check
((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1763, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended
) == 1 && ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1764, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.offset
) == 1 && ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1765, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.extended
) == 1 && (*tree_int_cst_elt_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1766, __FUNCTION__)) == hwi) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1766, __FUNCTION__), 0 : 0))
1763 && TREE_INT_CST_NUNITS (t) == 1((void)(!(((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1762, __FUNCTION__))->typed.type) == type && ((tree_check
((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1763, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended
) == 1 && ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1764, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.offset
) == 1 && ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1765, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.extended
) == 1 && (*tree_int_cst_elt_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1766, __FUNCTION__)) == hwi) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1766, __FUNCTION__), 0 : 0))
1764 && TREE_INT_CST_OFFSET_NUNITS (t) == 1((void)(!(((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1762, __FUNCTION__))->typed.type) == type && ((tree_check
((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1763, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended
) == 1 && ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1764, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.offset
) == 1 && ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1765, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.extended
) == 1 && (*tree_int_cst_elt_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1766, __FUNCTION__)) == hwi) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1766, __FUNCTION__), 0 : 0))
1765 && TREE_INT_CST_EXT_NUNITS (t) == 1((void)(!(((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1762, __FUNCTION__))->typed.type) == type && ((tree_check
((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1763, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended
) == 1 && ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1764, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.offset
) == 1 && ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1765, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.extended
) == 1 && (*tree_int_cst_elt_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1766, __FUNCTION__)) == hwi) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1766, __FUNCTION__), 0 : 0))
1766 && TREE_INT_CST_ELT (t, 0) == hwi)((void)(!(((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1762, __FUNCTION__))->typed.type) == type && ((tree_check
((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1763, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended
) == 1 && ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1764, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.offset
) == 1 && ((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1765, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.extended
) == 1 && (*tree_int_cst_elt_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1766, __FUNCTION__)) == hwi) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1766, __FUNCTION__), 0 : 0))
;
1767 return t;
1768 }
1769 else
1770 {
1771 /* Use the cache of larger shared ints, using int_cst_node as
1772 a temporary. */
1773
1774 TREE_INT_CST_ELT (int_cst_node, 0)(*tree_int_cst_elt_check ((int_cst_node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1774, __FUNCTION__))
= hwi;
1775 TREE_TYPE (int_cst_node)((contains_struct_check ((int_cst_node), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1775, __FUNCTION__))->typed.type)
= type;
1776
1777 tree *slot = int_cst_hash_table->find_slot (int_cst_node, INSERT);
1778 t = *slot;
1779 if (!t)
1780 {
1781 /* Insert this one into the hash table. */
1782 t = int_cst_node;
1783 *slot = t;
1784 /* Make a new node for next time round. */
1785 int_cst_node = make_int_cst (1, 1);
1786 }
1787 }
1788 }
1789 else
1790 {
1791 /* The value either hashes properly or we drop it on the floor
1792 for the gc to take care of. There will not be enough of them
1793 to worry about. */
1794
1795 tree nt = build_new_int_cst (type, cst);
1796 tree *slot = int_cst_hash_table->find_slot (nt, INSERT);
1797 t = *slot;
1798 if (!t)
1799 {
1800 /* Insert this one into the hash table. */
1801 t = nt;
1802 *slot = t;
1803 }
1804 else
1805 ggc_free (nt);
1806 }
1807
1808 return t;
1809}
1810
1811hashval_t
1812poly_int_cst_hasher::hash (tree t)
1813{
1814 inchash::hash hstate;
1815
1816 hstate.add_int (TYPE_UID (TREE_TYPE (t))((tree_class_check ((((contains_struct_check ((t), (TS_TYPED)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1816, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1816, __FUNCTION__))->type_common.uid)
);
1817 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS1; ++i)
1818 hstate.add_wide_int (wi::to_wide (POLY_INT_CST_COEFF (t, i)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1818, __FUNCTION__, (POLY_INT_CST)))->poly_int_cst.coeffs
[i])
));
1819
1820 return hstate.end ();
1821}
1822
1823bool
1824poly_int_cst_hasher::equal (tree x, const compare_type &y)
1825{
1826 if (TREE_TYPE (x)((contains_struct_check ((x), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1826, __FUNCTION__))->typed.type)
!= y.first)
1827 return false;
1828 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS1; ++i)
1829 if (wi::to_wide (POLY_INT_CST_COEFF (x, i)((tree_check ((x), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1829, __FUNCTION__, (POLY_INT_CST)))->poly_int_cst.coeffs
[i])
) != y.second->coeffs[i])
1830 return false;
1831 return true;
1832}
1833
1834/* Build a POLY_INT_CST node with type TYPE and with the elements in VALUES.
1835 The elements must also have type TYPE. */
1836
1837tree
1838build_poly_int_cst (tree type, const poly_wide_int_ref &values)
1839{
1840 unsigned int prec = TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1840, __FUNCTION__))->type_common.precision)
;
1841 gcc_assert (prec <= values.coeffs[0].get_precision ())((void)(!(prec <= values.coeffs[0].get_precision ()) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1841, __FUNCTION__), 0 : 0))
;
1842 poly_wide_int c = poly_wide_int::from (values, prec, SIGNED);
1843
1844 inchash::hash h;
1845 h.add_int (TYPE_UID (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1845, __FUNCTION__))->type_common.uid)
);
1846 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS1; ++i)
1847 h.add_wide_int (c.coeffs[i]);
1848 poly_int_cst_hasher::compare_type comp (type, &c);
1849 tree *slot = poly_int_cst_hash_table->find_slot_with_hash (comp, h.end (),
1850 INSERT);
1851 if (*slot == NULL_TREE(tree) nullptr)
1852 {
1853 tree coeffs[NUM_POLY_INT_COEFFS1];
1854 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS1; ++i)
1855 coeffs[i] = wide_int_to_tree_1 (type, c.coeffs[i]);
1856 *slot = build_new_poly_int_cst (type, coeffs);
1857 }
1858 return *slot;
1859}
1860
1861/* Create a constant tree with value VALUE in type TYPE. */
1862
1863tree
1864wide_int_to_tree (tree type, const poly_wide_int_ref &value)
1865{
1866 if (value.is_constant ())
1867 return wide_int_to_tree_1 (type, value.coeffs[0]);
1868 return build_poly_int_cst (type, value);
1869}
1870
1871/* Insert INTEGER_CST T into a cache of integer constants. And return
1872 the cached constant (which may or may not be T). If MIGHT_DUPLICATE
1873 is false, and T falls into the type's 'smaller values' range, there
1874 cannot be an existing entry. Otherwise, if MIGHT_DUPLICATE is true,
1875 or the value is large, should an existing entry exist, it is
1876 returned (rather than inserting T). */
1877
1878tree
1879cache_integer_cst (tree t, bool might_duplicate ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
1880{
1881 tree type = TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1881, __FUNCTION__))->typed.type)
;
1882 int ix = -1;
1883 int limit = 0;
1884 int prec = TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1884, __FUNCTION__))->type_common.precision)
;
1885
1886 gcc_assert (!TREE_OVERFLOW (t))((void)(!(!((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1886, __FUNCTION__))->base.public_flag)) ? fancy_abort (
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1886, __FUNCTION__), 0 : 0))
;
1887
1888 /* The caching indices here must match those in
1889 wide_int_to_type_1. */
1890 switch (TREE_CODE (type)((enum tree_code) (type)->base.code))
1891 {
1892 case NULLPTR_TYPE:
1893 gcc_checking_assert (integer_zerop (t))((void)(!(integer_zerop (t)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1893, __FUNCTION__), 0 : 0))
;
1894 /* Fallthru. */
1895
1896 case POINTER_TYPE:
1897 case REFERENCE_TYPE:
1898 {
1899 if (integer_zerop (t))
1900 ix = 0;
1901 else if (integer_onep (t))
1902 ix = 2;
1903
1904 if (ix >= 0)
1905 limit = 3;
1906 }
1907 break;
1908
1909 case BOOLEAN_TYPE:
1910 /* Cache false or true. */
1911 limit = 2;
1912 if (wi::ltu_p (wi::to_wide (t), 2))
1913 ix = TREE_INT_CST_ELT (t, 0)(*tree_int_cst_elt_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1913, __FUNCTION__))
;
1914 break;
1915
1916 case INTEGER_TYPE:
1917 case OFFSET_TYPE:
1918 if (TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1918, __FUNCTION__))->base.u.bits.unsigned_flag)
)
1919 {
1920 /* Cache 0..N */
1921 limit = param_integer_share_limitglobal_options.x_param_integer_share_limit;
1922
1923 /* This is a little hokie, but if the prec is smaller than
1924 what is necessary to hold param_integer_share_limit, then the
1925 obvious test will not get the correct answer. */
1926 if (prec < HOST_BITS_PER_WIDE_INT64)
1927 {
1928 if (tree_to_uhwi (t)
1929 < (unsigned HOST_WIDE_INTlong) param_integer_share_limitglobal_options.x_param_integer_share_limit)
1930 ix = tree_to_uhwi (t);
1931 }
1932 else if (wi::ltu_p (wi::to_wide (t), param_integer_share_limitglobal_options.x_param_integer_share_limit))
1933 ix = tree_to_uhwi (t);
1934 }
1935 else
1936 {
1937 /* Cache -1..N */
1938 limit = param_integer_share_limitglobal_options.x_param_integer_share_limit + 1;
1939
1940 if (integer_minus_onep (t))
1941 ix = 0;
1942 else if (!wi::neg_p (wi::to_wide (t)))
1943 {
1944 if (prec < HOST_BITS_PER_WIDE_INT64)
1945 {
1946 if (tree_to_shwi (t) < param_integer_share_limitglobal_options.x_param_integer_share_limit)
1947 ix = tree_to_shwi (t) + 1;
1948 }
1949 else if (wi::ltu_p (wi::to_wide (t), param_integer_share_limitglobal_options.x_param_integer_share_limit))
1950 ix = tree_to_shwi (t) + 1;
1951 }
1952 }
1953 break;
1954
1955 case ENUMERAL_TYPE:
1956 /* The slot used by TYPE_CACHED_VALUES is used for the enum
1957 members. */
1958 break;
1959
1960 default:
1961 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1961, __FUNCTION__))
;
1962 }
1963
1964 if (ix >= 0)
1965 {
1966 /* Look for it in the type's vector of small shared ints. */
1967 if (!TYPE_CACHED_VALUES_P (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1967, __FUNCTION__))->base.public_flag)
)
1968 {
1969 TYPE_CACHED_VALUES_P (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1969, __FUNCTION__))->base.public_flag)
= 1;
1970 TYPE_CACHED_VALUES (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1970, __FUNCTION__))->type_non_common.values)
= make_tree_vec (limit);
1971 }
1972
1973 if (tree r = TREE_VEC_ELT (TYPE_CACHED_VALUES (type), ix)(*((const_cast<tree *> (tree_vec_elt_check ((((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1973, __FUNCTION__))->type_non_common.values)), (ix), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1973, __FUNCTION__)))))
)
1974 {
1975 gcc_checking_assert (might_duplicate)((void)(!(might_duplicate) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1975, __FUNCTION__), 0 : 0))
;
1976 t = r;
1977 }
1978 else
1979 TREE_VEC_ELT (TYPE_CACHED_VALUES (type), ix)(*((const_cast<tree *> (tree_vec_elt_check ((((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1979, __FUNCTION__))->type_non_common.values)), (ix), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1979, __FUNCTION__)))))
= t;
1980 }
1981 else
1982 {
1983 /* Use the cache of larger shared ints. */
1984 tree *slot = int_cst_hash_table->find_slot (t, INSERT);
1985 if (tree r = *slot)
1986 {
1987 /* If there is already an entry for the number verify it's the
1988 same value. */
1989 gcc_checking_assert (wi::to_wide (tree (r)) == wi::to_wide (t))((void)(!(wi::to_wide (tree (r)) == wi::to_wide (t)) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 1989, __FUNCTION__), 0 : 0))
;
1990 /* And return the cached value. */
1991 t = r;
1992 }
1993 else
1994 /* Otherwise insert this one into the hash table. */
1995 *slot = t;
1996 }
1997
1998 return t;
1999}
2000
2001
2002/* Builds an integer constant in TYPE such that lowest BITS bits are ones
2003 and the rest are zeros. */
2004
2005tree
2006build_low_bits_mask (tree type, unsigned bits)
2007{
2008 gcc_assert (bits <= TYPE_PRECISION (type))((void)(!(bits <= ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2008, __FUNCTION__))->type_common.precision)) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2008, __FUNCTION__), 0 : 0))
;
2009
2010 return wide_int_to_tree (type, wi::mask (bits, false,
2011 TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2011, __FUNCTION__))->type_common.precision)
));
2012}
2013
2014/* Checks that X is integer constant that can be expressed in (unsigned)
2015 HOST_WIDE_INT without loss of precision. */
2016
2017bool
2018cst_and_fits_in_hwi (const_tree x)
2019{
2020 return (TREE_CODE (x)((enum tree_code) (x)->base.code) == INTEGER_CST
2021 && (tree_fits_shwi_p (x) || tree_fits_uhwi_p (x)));
2022}
2023
2024/* Build a newly constructed VECTOR_CST with the given values of
2025 (VECTOR_CST_)LOG2_NPATTERNS and (VECTOR_CST_)NELTS_PER_PATTERN. */
2026
2027tree
2028make_vector (unsigned log2_npatterns,
2029 unsigned int nelts_per_pattern MEM_STAT_DECL)
2030{
2031 gcc_assert (IN_RANGE (nelts_per_pattern, 1, 3))((void)(!(((unsigned long) (nelts_per_pattern) - (unsigned long
) (1) <= (unsigned long) (3) - (unsigned long) (1))) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2031, __FUNCTION__), 0 : 0))
;
2032 tree t;
2033 unsigned npatterns = 1 << log2_npatterns;
2034 unsigned encoded_nelts = npatterns * nelts_per_pattern;
2035 unsigned length = (sizeof (struct tree_vector)
2036 + (encoded_nelts - 1) * sizeof (tree));
2037
2038 record_node_allocation_statistics (VECTOR_CST, length);
2039
2040 t = ggc_alloc_cleared_tree_node_stat (length PASS_MEM_STAT);
2041
2042 TREE_SET_CODE (t, VECTOR_CST)((t)->base.code = (VECTOR_CST));
2043 TREE_CONSTANT (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2043, __FUNCTION__))->base.constant_flag)
= 1;
2044 VECTOR_CST_LOG2_NPATTERNS (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2044, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.log2_npatterns
)
= log2_npatterns;
2045 VECTOR_CST_NELTS_PER_PATTERN (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2045, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern
)
= nelts_per_pattern;
2046
2047 return t;
2048}
2049
2050/* Return a new VECTOR_CST node whose type is TYPE and whose values
2051 are extracted from V, a vector of CONSTRUCTOR_ELT. */
2052
2053tree
2054build_vector_from_ctor (tree type, const vec<constructor_elt, va_gc> *v)
2055{
2056 if (vec_safe_length (v) == 0)
2057 return build_zero_cst (type);
2058
2059 unsigned HOST_WIDE_INTlong idx, nelts;
2060 tree value;
2061
2062 /* We can't construct a VECTOR_CST for a variable number of elements. */
2063 nelts = TYPE_VECTOR_SUBPARTS (type).to_constant ();
2064 tree_vector_builder vec (type, nelts, 1);
2065 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)for (idx = 0; (idx >= vec_safe_length (v)) ? false : ((value
= (*(v))[idx].value), true); (idx)++)
2066 {
2067 if (TREE_CODE (value)((enum tree_code) (value)->base.code) == VECTOR_CST)
2068 {
2069 /* If NELTS is constant then this must be too. */
2070 unsigned int sub_nelts = VECTOR_CST_NELTS (value)(TYPE_VECTOR_SUBPARTS (((contains_struct_check ((value), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2070, __FUNCTION__))->typed.type)))
.to_constant ();
2071 for (unsigned i = 0; i < sub_nelts; ++i)
2072 vec.quick_push (VECTOR_CST_ELT (value, i)vector_cst_elt (value, i));
2073 }
2074 else
2075 vec.quick_push (value);
2076 }
2077 while (vec.length () < nelts)
2078 vec.quick_push (build_zero_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2078, __FUNCTION__))->typed.type)
));
2079
2080 return vec.build ();
2081}
2082
2083/* Build a vector of type VECTYPE where all the elements are SCs. */
2084tree
2085build_vector_from_val (tree vectype, tree sc)
2086{
2087 unsigned HOST_WIDE_INTlong i, nunits;
2088
2089 if (sc == error_mark_nodeglobal_trees[TI_ERROR_MARK])
2090 return sc;
2091
2092 /* Verify that the vector type is suitable for SC. Note that there
2093 is some inconsistency in the type-system with respect to restrict
2094 qualifications of pointers. Vector types always have a main-variant
2095 element type and the qualification is applied to the vector-type.
2096 So TREE_TYPE (vector-type) does not return a properly qualified
2097 vector element-type. */
2098 gcc_checking_assert (types_compatible_p (TYPE_MAIN_VARIANT (TREE_TYPE (sc)),((void)(!(types_compatible_p (((tree_class_check ((((contains_struct_check
((sc), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2098, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2098, __FUNCTION__))->type_common.main_variant), ((contains_struct_check
((vectype), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2099, __FUNCTION__))->typed.type))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2099, __FUNCTION__), 0 : 0))
2099 TREE_TYPE (vectype)))((void)(!(types_compatible_p (((tree_class_check ((((contains_struct_check
((sc), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2098, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2098, __FUNCTION__))->type_common.main_variant), ((contains_struct_check
((vectype), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2099, __FUNCTION__))->typed.type))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2099, __FUNCTION__), 0 : 0))
;
2100
2101 if (CONSTANT_CLASS_P (sc)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (sc)->base.code))] == tcc_constant)
)
2102 {
2103 tree_vector_builder v (vectype, 1, 1);
2104 v.quick_push (sc);
2105 return v.build ();
2106 }
2107 else if (!TYPE_VECTOR_SUBPARTS (vectype).is_constant (&nunits))
2108 return fold_build1 (VEC_DUPLICATE_EXPR, vectype, sc)fold_build1_loc (((location_t) 0), VEC_DUPLICATE_EXPR, vectype
, sc )
;
2109 else
2110 {
2111 vec<constructor_elt, va_gc> *v;
2112 vec_alloc (v, nunits);
2113 for (i = 0; i < nunits; ++i)
2114 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, sc)do { constructor_elt _ce___ = {(tree) nullptr, sc}; vec_safe_push
((v), _ce___); } while (0)
;
2115 return build_constructor (vectype, v);
2116 }
2117}
2118
2119/* If TYPE is not a vector type, just return SC, otherwise return
2120 build_vector_from_val (TYPE, SC). */
2121
2122tree
2123build_uniform_cst (tree type, tree sc)
2124{
2125 if (!VECTOR_TYPE_P (type)(((enum tree_code) (type)->base.code) == VECTOR_TYPE))
2126 return sc;
2127
2128 return build_vector_from_val (type, sc);
2129}
2130
2131/* Build a vector series of type TYPE in which element I has the value
2132 BASE + I * STEP. The result is a constant if BASE and STEP are constant
2133 and a VEC_SERIES_EXPR otherwise. */
2134
2135tree
2136build_vec_series (tree type, tree base, tree step)
2137{
2138 if (integer_zerop (step))
2139 return build_vector_from_val (type, base);
2140 if (TREE_CODE (base)((enum tree_code) (base)->base.code) == INTEGER_CST && TREE_CODE (step)((enum tree_code) (step)->base.code) == INTEGER_CST)
2141 {
2142 tree_vector_builder builder (type, 1, 3);
2143 tree elt1 = wide_int_to_tree (TREE_TYPE (base)((contains_struct_check ((base), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2143, __FUNCTION__))->typed.type)
,
2144 wi::to_wide (base) + wi::to_wide (step));
2145 tree elt2 = wide_int_to_tree (TREE_TYPE (base)((contains_struct_check ((base), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2145, __FUNCTION__))->typed.type)
,
2146 wi::to_wide (elt1) + wi::to_wide (step));
2147 builder.quick_push (base);
2148 builder.quick_push (elt1);
2149 builder.quick_push (elt2);
2150 return builder.build ();
2151 }
2152 return build2 (VEC_SERIES_EXPR, type, base, step);
2153}
2154
2155/* Return a vector with the same number of units and number of bits
2156 as VEC_TYPE, but in which the elements are a linear series of unsigned
2157 integers { BASE, BASE + STEP, BASE + STEP * 2, ... }. */
2158
2159tree
2160build_index_vector (tree vec_type, poly_uint64 base, poly_uint64 step)
2161{
2162 tree index_vec_type = vec_type;
2163 tree index_elt_type = TREE_TYPE (vec_type)((contains_struct_check ((vec_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2163, __FUNCTION__))->typed.type)
;
2164 poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vec_type);
2165 if (!INTEGRAL_TYPE_P (index_elt_type)(((enum tree_code) (index_elt_type)->base.code) == ENUMERAL_TYPE
|| ((enum tree_code) (index_elt_type)->base.code) == BOOLEAN_TYPE
|| ((enum tree_code) (index_elt_type)->base.code) == INTEGER_TYPE
)
|| !TYPE_UNSIGNED (index_elt_type)((tree_class_check ((index_elt_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2165, __FUNCTION__))->base.u.bits.unsigned_flag)
)
2166 {
2167 index_elt_type = build_nonstandard_integer_type
2168 (GET_MODE_BITSIZE (SCALAR_TYPE_MODE (index_elt_type)(as_a <scalar_mode> ((tree_class_check ((index_elt_type
), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2168, __FUNCTION__))->type_common.mode))
), true);
2169 index_vec_type = build_vector_type (index_elt_type, nunits);
2170 }
2171
2172 tree_vector_builder v (index_vec_type, 1, 3);
2173 for (unsigned int i = 0; i < 3; ++i)
2174 v.quick_push (build_int_cstu (index_elt_type, base + i * step));
2175 return v.build ();
2176}
2177
2178/* Return a VECTOR_CST of type VEC_TYPE in which the first NUM_A
2179 elements are A and the rest are B. */
2180
2181tree
2182build_vector_a_then_b (tree vec_type, unsigned int num_a, tree a, tree b)
2183{
2184 gcc_assert (known_le (num_a, TYPE_VECTOR_SUBPARTS (vec_type)))((void)(!((!maybe_lt (TYPE_VECTOR_SUBPARTS (vec_type), num_a)
)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2184, __FUNCTION__), 0 : 0))
;
2185 unsigned int count = constant_lower_bound (TYPE_VECTOR_SUBPARTS (vec_type));
2186 /* Optimize the constant case. */
2187 if ((count & 1) == 0 && TYPE_VECTOR_SUBPARTS (vec_type).is_constant ())
2188 count /= 2;
2189 tree_vector_builder builder (vec_type, count, 2);
2190 for (unsigned int i = 0; i < count * 2; ++i)
2191 builder.quick_push (i < num_a ? a : b);
2192 return builder.build ();
2193}
2194
2195/* Something has messed with the elements of CONSTRUCTOR C after it was built;
2196 calculate TREE_CONSTANT and TREE_SIDE_EFFECTS. */
2197
2198void
2199recompute_constructor_flags (tree c)
2200{
2201 unsigned int i;
2202 tree val;
2203 bool constant_p = true;
2204 bool side_effects_p = false;
2205 vec<constructor_elt, va_gc> *vals = CONSTRUCTOR_ELTS (c)((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2205, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)
;
2206
2207 FOR_EACH_CONSTRUCTOR_VALUE (vals, i, val)for (i = 0; (i >= vec_safe_length (vals)) ? false : ((val =
(*(vals))[i].value), true); (i)++)
2208 {
2209 /* Mostly ctors will have elts that don't have side-effects, so
2210 the usual case is to scan all the elements. Hence a single
2211 loop for both const and side effects, rather than one loop
2212 each (with early outs). */
2213 if (!TREE_CONSTANT (val)((non_type_check ((val), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2213, __FUNCTION__))->base.constant_flag)
)
2214 constant_p = false;
2215 if (TREE_SIDE_EFFECTS (val)((non_type_check ((val), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2215, __FUNCTION__))->base.side_effects_flag)
)
2216 side_effects_p = true;
2217 }
2218
2219 TREE_SIDE_EFFECTS (c)((non_type_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2219, __FUNCTION__))->base.side_effects_flag)
= side_effects_p;
2220 TREE_CONSTANT (c)((non_type_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2220, __FUNCTION__))->base.constant_flag)
= constant_p;
2221}
2222
2223/* Make sure that TREE_CONSTANT and TREE_SIDE_EFFECTS are correct for
2224 CONSTRUCTOR C. */
2225
2226void
2227verify_constructor_flags (tree c)
2228{
2229 unsigned int i;
2230 tree val;
2231 bool constant_p = TREE_CONSTANT (c)((non_type_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2231, __FUNCTION__))->base.constant_flag)
;
2232 bool side_effects_p = TREE_SIDE_EFFECTS (c)((non_type_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2232, __FUNCTION__))->base.side_effects_flag)
;
2233 vec<constructor_elt, va_gc> *vals = CONSTRUCTOR_ELTS (c)((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2233, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)
;
2234
2235 FOR_EACH_CONSTRUCTOR_VALUE (vals, i, val)for (i = 0; (i >= vec_safe_length (vals)) ? false : ((val =
(*(vals))[i].value), true); (i)++)
2236 {
2237 if (constant_p && !TREE_CONSTANT (val)((non_type_check ((val), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2237, __FUNCTION__))->base.constant_flag)
)
2238 internal_error ("non-constant element in constant CONSTRUCTOR");
2239 if (!side_effects_p && TREE_SIDE_EFFECTS (val)((non_type_check ((val), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2239, __FUNCTION__))->base.side_effects_flag)
)
2240 internal_error ("side-effects element in no-side-effects CONSTRUCTOR");
2241 }
2242}
2243
2244/* Return a new CONSTRUCTOR node whose type is TYPE and whose values
2245 are in the vec pointed to by VALS. */
2246tree
2247build_constructor (tree type, vec<constructor_elt, va_gc> *vals MEM_STAT_DECL)
2248{
2249 tree c = make_node (CONSTRUCTOR PASS_MEM_STAT);
2250
2251 TREE_TYPE (c)((contains_struct_check ((c), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2251, __FUNCTION__))->typed.type)
= type;
2252 CONSTRUCTOR_ELTS (c)((tree_check ((c), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2252, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)
= vals;
2253
2254 recompute_constructor_flags (c);
2255
2256 return c;
2257}
2258
2259/* Build a CONSTRUCTOR node made of a single initializer, with the specified
2260 INDEX and VALUE. */
2261tree
2262build_constructor_single (tree type, tree index, tree value)
2263{
2264 vec<constructor_elt, va_gc> *v;
2265 constructor_elt elt = {index, value};
2266
2267 vec_alloc (v, 1);
2268 v->quick_push (elt);
2269
2270 return build_constructor (type, v);
2271}
2272
2273
2274/* Return a new CONSTRUCTOR node whose type is TYPE and whose values
2275 are in a list pointed to by VALS. */
2276tree
2277build_constructor_from_list (tree type, tree vals)
2278{
2279 tree t;
2280 vec<constructor_elt, va_gc> *v = NULLnullptr;
2281
2282 if (vals)
2283 {
2284 vec_alloc (v, list_length (vals));
2285 for (t = vals; t; t = TREE_CHAIN (t)((contains_struct_check ((t), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2285, __FUNCTION__))->common.chain)
)
2286 CONSTRUCTOR_APPEND_ELT (v, TREE_PURPOSE (t), TREE_VALUE (t))do { constructor_elt _ce___ = {((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2286, __FUNCTION__, (TREE_LIST)))->list.purpose), ((tree_check
((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2286, __FUNCTION__, (TREE_LIST)))->list.value)}; vec_safe_push
((v), _ce___); } while (0)
;
2287 }
2288
2289 return build_constructor (type, v);
2290}
2291
2292/* Return a new CONSTRUCTOR node whose type is TYPE and whose values
2293 are in a vector pointed to by VALS. Note that the TREE_PURPOSE
2294 fields in the constructor remain null. */
2295
2296tree
2297build_constructor_from_vec (tree type, const vec<tree, va_gc> *vals)
2298{
2299 vec<constructor_elt, va_gc> *v = NULLnullptr;
2300
2301 for (tree t : vals)
2302 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, t)do { constructor_elt _ce___ = {(tree) nullptr, t}; vec_safe_push
((v), _ce___); } while (0)
;
2303
2304 return build_constructor (type, v);
2305}
2306
2307/* Return a new CONSTRUCTOR node whose type is TYPE. NELTS is the number
2308 of elements, provided as index/value pairs. */
2309
2310tree
2311build_constructor_va (tree type, int nelts, ...)
2312{
2313 vec<constructor_elt, va_gc> *v = NULLnullptr;
2314 va_list p;
2315
2316 va_start (p, nelts)__builtin_va_start(p, nelts);
2317 vec_alloc (v, nelts);
2318 while (nelts--)
2319 {
2320 tree index = va_arg (p, tree)__builtin_va_arg(p, tree);
2321 tree value = va_arg (p, tree)__builtin_va_arg(p, tree);
2322 CONSTRUCTOR_APPEND_ELT (v, index, value)do { constructor_elt _ce___ = {index, value}; vec_safe_push (
(v), _ce___); } while (0)
;
2323 }
2324 va_end (p)__builtin_va_end(p);
2325 return build_constructor (type, v);
2326}
2327
2328/* Return a node of type TYPE for which TREE_CLOBBER_P is true. */
2329
2330tree
2331build_clobber (tree type, enum clobber_kind kind)
2332{
2333 tree clobber = build_constructor (type, NULLnullptr);
2334 TREE_THIS_VOLATILE (clobber)((clobber)->base.volatile_flag) = true;
2335 CLOBBER_KIND (clobber)((tree_check ((clobber), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2335, __FUNCTION__, (CONSTRUCTOR)))->base.u.bits.address_space
)
= kind;
2336 return clobber;
2337}
2338
2339/* Return a new FIXED_CST node whose type is TYPE and value is F. */
2340
2341tree
2342build_fixed (tree type, FIXED_VALUE_TYPEstruct fixed_value f)
2343{
2344 tree v;
2345 FIXED_VALUE_TYPEstruct fixed_value *fp;
2346
2347 v = make_node (FIXED_CST);
2348 fp = ggc_alloc<fixed_value> ();
2349 memcpy (fp, &f, sizeof (FIXED_VALUE_TYPEstruct fixed_value));
2350
2351 TREE_TYPE (v)((contains_struct_check ((v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2351, __FUNCTION__))->typed.type)
= type;
2352 TREE_FIXED_CST_PTR (v)((tree_check ((v), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2352, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr
)
= fp;
2353 return v;
2354}
2355
2356/* Return a new REAL_CST node whose type is TYPE and value is D. */
2357
2358tree
2359build_real (tree type, REAL_VALUE_TYPEstruct real_value d)
2360{
2361 tree v;
2362 int overflow = 0;
2363
2364 /* dconst{0,1,2,m1,half} are used in various places in
2365 the middle-end and optimizers, allow them here
2366 even for decimal floating point types as an exception
2367 by converting them to decimal. */
2368 if (DECIMAL_FLOAT_MODE_P (TYPE_MODE (type))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2368, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_DECIMAL_FLOAT
)
2369 && (d.cl == rvc_normal || d.cl == rvc_zero)
2370 && !d.decimal)
2371 {
2372 if (memcmp (&d, &dconst1, sizeof (d)) == 0)
2373 decimal_real_from_string (&d, "1");
2374 else if (memcmp (&d, &dconst2, sizeof (d)) == 0)
2375 decimal_real_from_string (&d, "2");
2376 else if (memcmp (&d, &dconstm1, sizeof (d)) == 0)
2377 decimal_real_from_string (&d, "-1");
2378 else if (memcmp (&d, &dconsthalf, sizeof (d)) == 0)
2379 decimal_real_from_string (&d, "0.5");
2380 else if (memcmp (&d, &dconst0, sizeof (d)) == 0)
2381 {
2382 /* Make sure to give zero the minimum quantum exponent for
2383 the type (which corresponds to all bits zero). */
2384 const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type))(real_format_for_mode[(((enum mode_class) mode_class[((((enum
tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2384, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_DECIMAL_FLOAT
) ? (((((((enum tree_code) ((tree_class_check ((type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2384, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)) - MIN_MODE_DECIMAL_FLOAT
) + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) : ((enum mode_class
) mode_class[((((enum tree_code) ((tree_class_check ((type), (
tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2384, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_FLOAT ? ((((
((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2384, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)) - MIN_MODE_FLOAT) : (
(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2384, __FUNCTION__)), 0)])
;
2385 char buf[16];
2386 sprintf (buf, "0e%d", fmt->emin - fmt->p);
2387 decimal_real_from_string (&d, buf);
2388 }
2389 else
2390 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2390, __FUNCTION__))
;
2391 }
2392
2393 /* ??? Used to check for overflow here via CHECK_FLOAT_TYPE.
2394 Consider doing it via real_convert now. */
2395
2396 v = make_node (REAL_CST);
2397 TREE_TYPE (v)((contains_struct_check ((v), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2397, __FUNCTION__))->typed.type)
= type;
2398 memcpy (TREE_REAL_CST_PTR (v)(&(tree_check ((v), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2398, __FUNCTION__, (REAL_CST)))->real_cst.value)
, &d, sizeof (REAL_VALUE_TYPEstruct real_value));
2399 TREE_OVERFLOW (v)((tree_class_check ((v), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2399, __FUNCTION__))->base.public_flag)
= overflow;
2400 return v;
2401}
2402
2403/* Like build_real, but first truncate D to the type. */
2404
2405tree
2406build_real_truncate (tree type, REAL_VALUE_TYPEstruct real_value d)
2407{
2408 return build_real (type, real_value_truncate (TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2408, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
, d));
2409}
2410
2411/* Return a new REAL_CST node whose type is TYPE
2412 and whose value is the integer value of the INTEGER_CST node I. */
2413
2414REAL_VALUE_TYPEstruct real_value
2415real_value_from_int_cst (const_tree type, const_tree i)
2416{
2417 REAL_VALUE_TYPEstruct real_value d;
2418
2419 /* Clear all bits of the real value type so that we can later do
2420 bitwise comparisons to see if two values are the same. */
2421 memset (&d, 0, sizeof d);
2422
2423 real_from_integer (&d, type ? TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2423, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
: VOIDmode((void) 0, E_VOIDmode), wi::to_wide (i),
2424 TYPE_SIGN (TREE_TYPE (i))((signop) ((tree_class_check ((((contains_struct_check ((i), (
TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2424, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2424, __FUNCTION__))->base.u.bits.unsigned_flag))
);
2425 return d;
2426}
2427
2428/* Given a tree representing an integer constant I, return a tree
2429 representing the same value as a floating-point constant of type TYPE. */
2430
2431tree
2432build_real_from_int_cst (tree type, const_tree i)
2433{
2434 tree v;
2435 int overflow = TREE_OVERFLOW (i)((tree_class_check ((i), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2435, __FUNCTION__))->base.public_flag)
;
2436
2437 v = build_real (type, real_value_from_int_cst (type, i));
2438
2439 TREE_OVERFLOW (v)((tree_class_check ((v), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2439, __FUNCTION__))->base.public_flag)
|= overflow;
2440 return v;
2441}
2442
2443/* Return a new REAL_CST node whose type is TYPE
2444 and whose value is the integer value I which has sign SGN. */
2445
2446tree
2447build_real_from_wide (tree type, const wide_int_ref &i, signop sgn)
2448{
2449 REAL_VALUE_TYPEstruct real_value d;
2450
2451 /* Clear all bits of the real value type so that we can later do
2452 bitwise comparisons to see if two values are the same. */
2453 memset (&d, 0, sizeof d);
2454
2455 real_from_integer (&d, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2455, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
, i, sgn);
2456 return build_real (type, d);
2457}
2458
2459/* Return a newly constructed STRING_CST node whose value is the LEN
2460 characters at STR when STR is nonnull, or all zeros otherwise.
2461 Note that for a C string literal, LEN should include the trailing NUL.
2462 The TREE_TYPE is not initialized. */
2463
2464tree
2465build_string (unsigned len, const char *str /*= NULL */)
2466{
2467 /* Do not waste bytes provided by padding of struct tree_string. */
2468 unsigned size = len + offsetof (struct tree_string, str)__builtin_offsetof(struct tree_string, str) + 1;
2469
2470 record_node_allocation_statistics (STRING_CST, size);
2471
2472 tree s = (tree) ggc_internal_alloc (size);
2473
2474 memset (s, 0, sizeof (struct tree_typed));
2475 TREE_SET_CODE (s, STRING_CST)((s)->base.code = (STRING_CST));
2476 TREE_CONSTANT (s)((non_type_check ((s), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2476, __FUNCTION__))->base.constant_flag)
= 1;
2477 TREE_STRING_LENGTH (s)((tree_check ((s), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2477, __FUNCTION__, (STRING_CST)))->string.length)
= len;
2478 if (str)
2479 memcpy (s->string.str, str, len);
2480 else
2481 memset (s->string.str, 0, len);
2482 s->string.str[len] = '\0';
2483
2484 return s;
2485}
2486
2487/* Return a newly constructed COMPLEX_CST node whose value is
2488 specified by the real and imaginary parts REAL and IMAG.
2489 Both REAL and IMAG should be constant nodes. TYPE, if specified,
2490 will be the type of the COMPLEX_CST; otherwise a new type will be made. */
2491
2492tree
2493build_complex (tree type, tree real, tree imag)
2494{
2495 gcc_assert (CONSTANT_CLASS_P (real))((void)(!((tree_code_type_tmpl <0>::tree_code_type[(int
) (((enum tree_code) (real)->base.code))] == tcc_constant)
) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2495, __FUNCTION__), 0 : 0))
;
2496 gcc_assert (CONSTANT_CLASS_P (imag))((void)(!((tree_code_type_tmpl <0>::tree_code_type[(int
) (((enum tree_code) (imag)->base.code))] == tcc_constant)
) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2496, __FUNCTION__), 0 : 0))
;
2497
2498 tree t = make_node (COMPLEX_CST);
2499
2500 TREE_REALPART (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2500, __FUNCTION__, (COMPLEX_CST)))->complex.real)
= real;
2501 TREE_IMAGPART (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2501, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
= imag;
2502 TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2502, __FUNCTION__))->typed.type)
= type ? type : build_complex_type (TREE_TYPE (real)((contains_struct_check ((real), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2502, __FUNCTION__))->typed.type)
);
2503 TREE_OVERFLOW (t)((tree_class_check ((t), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2503, __FUNCTION__))->base.public_flag)
= TREE_OVERFLOW (real)((tree_class_check ((real), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2503, __FUNCTION__))->base.public_flag)
| TREE_OVERFLOW (imag)((tree_class_check ((imag), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2503, __FUNCTION__))->base.public_flag)
;
2504 return t;
2505}
2506
2507/* Build a complex (inf +- 0i), such as for the result of cproj.
2508 TYPE is the complex tree type of the result. If NEG is true, the
2509 imaginary zero is negative. */
2510
2511tree
2512build_complex_inf (tree type, bool neg)
2513{
2514 REAL_VALUE_TYPEstruct real_value rzero = dconst0;
2515
2516 rzero.sign = neg;
2517 return build_complex (type, build_real (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2517, __FUNCTION__))->typed.type)
, dconstinf),
2518 build_real (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2518, __FUNCTION__))->typed.type)
, rzero));
2519}
2520
2521/* Return the constant 1 in type TYPE. If TYPE has several elements, each
2522 element is set to 1. In particular, this is 1 + i for complex types. */
2523
2524tree
2525build_each_one_cst (tree type)
2526{
2527 if (TREE_CODE (type)((enum tree_code) (type)->base.code) == COMPLEX_TYPE)
2528 {
2529 tree scalar = build_one_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2529, __FUNCTION__))->typed.type)
);
2530 return build_complex (type, scalar, scalar);
2531 }
2532 else
2533 return build_one_cst (type);
2534}
2535
2536/* Return a constant of arithmetic type TYPE which is the
2537 multiplicative identity of the set TYPE. */
2538
2539tree
2540build_one_cst (tree type)
2541{
2542 switch (TREE_CODE (type)((enum tree_code) (type)->base.code))
2543 {
2544 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2545 case POINTER_TYPE: case REFERENCE_TYPE:
2546 case OFFSET_TYPE:
2547 return build_int_cst (type, 1);
2548
2549 case REAL_TYPE:
2550 return build_real (type, dconst1);
2551
2552 case FIXED_POINT_TYPE:
2553 /* We can only generate 1 for accum types. */
2554 gcc_assert (ALL_SCALAR_ACCUM_MODE_P (TYPE_MODE (type)))((void)(!(((((enum mode_class) mode_class[((((enum tree_code)
((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2554, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_ACCUM) || ((
(enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2554, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_UACCUM))) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2554, __FUNCTION__), 0 : 0))
;
2555 return build_fixed (type, FCONST1 (TYPE_MODE (type))fconst1[((((enum tree_code) ((tree_class_check ((type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2555, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode) - (scalar_mode ((scalar_mode
::from_int) E_HAmode))]
);
2556
2557 case VECTOR_TYPE:
2558 {
2559 tree scalar = build_one_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2559, __FUNCTION__))->typed.type)
);
2560
2561 return build_vector_from_val (type, scalar);
2562 }
2563
2564 case COMPLEX_TYPE:
2565 return build_complex (type,
2566 build_one_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2566, __FUNCTION__))->typed.type)
),
2567 build_zero_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2567, __FUNCTION__))->typed.type)
));
2568
2569 default:
2570 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2570, __FUNCTION__))
;
2571 }
2572}
2573
2574/* Return an integer of type TYPE containing all 1's in as much precision as
2575 it contains, or a complex or vector whose subparts are such integers. */
2576
2577tree
2578build_all_ones_cst (tree type)
2579{
2580 if (TREE_CODE (type)((enum tree_code) (type)->base.code) == COMPLEX_TYPE)
2581 {
2582 tree scalar = build_all_ones_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2582, __FUNCTION__))->typed.type)
);
2583 return build_complex (type, scalar, scalar);
2584 }
2585 else
2586 return build_minus_one_cst (type);
2587}
2588
2589/* Return a constant of arithmetic type TYPE which is the
2590 opposite of the multiplicative identity of the set TYPE. */
2591
2592tree
2593build_minus_one_cst (tree type)
2594{
2595 switch (TREE_CODE (type)((enum tree_code) (type)->base.code))
2596 {
2597 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2598 case POINTER_TYPE: case REFERENCE_TYPE:
2599 case OFFSET_TYPE:
2600 return build_int_cst (type, -1);
2601
2602 case REAL_TYPE:
2603 return build_real (type, dconstm1);
2604
2605 case FIXED_POINT_TYPE:
2606 /* We can only generate 1 for accum types. */
2607 gcc_assert (ALL_SCALAR_ACCUM_MODE_P (TYPE_MODE (type)))((void)(!(((((enum mode_class) mode_class[((((enum tree_code)
((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2607, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_ACCUM) || ((
(enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2607, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_UACCUM))) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2607, __FUNCTION__), 0 : 0))
;
2608 return build_fixed (type,
2609 fixed_from_double_int (double_int_minus_one(double_int::from_shwi (-1)),
2610 SCALAR_TYPE_MODE (type)(as_a <scalar_mode> ((tree_class_check ((type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2610, __FUNCTION__))->type_common.mode))
));
2611
2612 case VECTOR_TYPE:
2613 {
2614 tree scalar = build_minus_one_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2614, __FUNCTION__))->typed.type)
);
2615
2616 return build_vector_from_val (type, scalar);
2617 }
2618
2619 case COMPLEX_TYPE:
2620 return build_complex (type,
2621 build_minus_one_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2621, __FUNCTION__))->typed.type)
),
2622 build_zero_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2622, __FUNCTION__))->typed.type)
));
2623
2624 default:
2625 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2625, __FUNCTION__))
;
2626 }
2627}
2628
2629/* Build 0 constant of type TYPE. This is used by constructor folding
2630 and thus the constant should be represented in memory by
2631 zero(es). */
2632
2633tree
2634build_zero_cst (tree type)
2635{
2636 switch (TREE_CODE (type)((enum tree_code) (type)->base.code))
2637 {
2638 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2639 case POINTER_TYPE: case REFERENCE_TYPE:
2640 case OFFSET_TYPE: case NULLPTR_TYPE:
2641 return build_int_cst (type, 0);
2642
2643 case REAL_TYPE:
2644 return build_real (type, dconst0);
2645
2646 case FIXED_POINT_TYPE:
2647 return build_fixed (type, FCONST0 (TYPE_MODE (type))fconst0[((((enum tree_code) ((tree_class_check ((type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2647, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode) - (scalar_mode ((scalar_mode
::from_int) E_QQmode))]
);
2648
2649 case VECTOR_TYPE:
2650 {
2651 tree scalar = build_zero_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2651, __FUNCTION__))->typed.type)
);
2652
2653 return build_vector_from_val (type, scalar);
2654 }
2655
2656 case COMPLEX_TYPE:
2657 {
2658 tree zero = build_zero_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2658, __FUNCTION__))->typed.type)
);
2659
2660 return build_complex (type, zero, zero);
2661 }
2662
2663 default:
2664 if (!AGGREGATE_TYPE_P (type)(((enum tree_code) (type)->base.code) == ARRAY_TYPE || (((
enum tree_code) (type)->base.code) == RECORD_TYPE || ((enum
tree_code) (type)->base.code) == UNION_TYPE || ((enum tree_code
) (type)->base.code) == QUAL_UNION_TYPE))
)
2665 return fold_convert (type, integer_zero_node)fold_convert_loc (((location_t) 0), type, global_trees[TI_INTEGER_ZERO
])
;
2666 return build_constructor (type, NULLnullptr);
2667 }
2668}
2669
2670/* If floating-point type TYPE has an IEEE-style sign bit, return an
2671 unsigned constant in which only the sign bit is set. Return null
2672 otherwise. */
2673
2674tree
2675sign_mask_for (tree type)
2676{
2677 /* Avoid having to choose between a real-only sign and a pair of signs.
2678 This could be relaxed if the choice becomes obvious later. */
2679 if (TREE_CODE (type)((enum tree_code) (type)->base.code) == COMPLEX_TYPE)
2680 return NULL_TREE(tree) nullptr;
2681
2682 auto eltmode = as_a<scalar_float_mode> (element_mode (type));
2683 auto bits = REAL_MODE_FORMAT (eltmode)(real_format_for_mode[(((enum mode_class) mode_class[eltmode]
) == MODE_DECIMAL_FLOAT) ? (((eltmode) - MIN_MODE_DECIMAL_FLOAT
) + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) : ((enum mode_class
) mode_class[eltmode]) == MODE_FLOAT ? ((eltmode) - MIN_MODE_FLOAT
) : ((fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2683, __FUNCTION__)), 0)])
->ieee_bits;
2684 if (!bits || !pow2p_hwi (bits))
2685 return NULL_TREE(tree) nullptr;
2686
2687 tree inttype = unsigned_type_for (type);
2688 if (!inttype)
2689 return NULL_TREE(tree) nullptr;
2690
2691 auto mask = wi::set_bit_in_zero (bits - 1, bits);
2692 if (TREE_CODE (inttype)((enum tree_code) (inttype)->base.code) == VECTOR_TYPE)
2693 {
2694 tree elt = wide_int_to_tree (TREE_TYPE (inttype)((contains_struct_check ((inttype), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2694, __FUNCTION__))->typed.type)
, mask);
2695 return build_vector_from_val (inttype, elt);
2696 }
2697 return wide_int_to_tree (inttype, mask);
2698}
2699
2700/* Build a BINFO with LEN language slots. */
2701
2702tree
2703make_tree_binfo (unsigned base_binfos MEM_STAT_DECL)
2704{
2705 tree t;
2706 size_t length = (offsetof (struct tree_binfo, base_binfos)__builtin_offsetof(struct tree_binfo, base_binfos)
2707 + vec<tree, va_gc>::embedded_size (base_binfos));
2708
2709 record_node_allocation_statistics (TREE_BINFO, length);
2710
2711 t = ggc_alloc_tree_node_stat (length PASS_MEM_STAT);
2712
2713 memset (t, 0, offsetof (struct tree_binfo, base_binfos)__builtin_offsetof(struct tree_binfo, base_binfos));
2714
2715 TREE_SET_CODE (t, TREE_BINFO)((t)->base.code = (TREE_BINFO));
2716
2717 BINFO_BASE_BINFOS (t)(&(tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2717, __FUNCTION__, (TREE_BINFO)))->binfo.base_binfos)
->embedded_init (base_binfos);
2718
2719 return t;
2720}
2721
2722/* Create a CASE_LABEL_EXPR tree node and return it. */
2723
2724tree
2725build_case_label (tree low_value, tree high_value, tree label_decl)
2726{
2727 tree t = make_node (CASE_LABEL_EXPR);
2728
2729 TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2729, __FUNCTION__))->typed.type)
= void_type_nodeglobal_trees[TI_VOID_TYPE];
2730 SET_EXPR_LOCATION (t, DECL_SOURCE_LOCATION (label_decl))(expr_check (((t)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2730, __FUNCTION__))->exp.locus = (((contains_struct_check
((label_decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2730, __FUNCTION__))->decl_minimal.locus))
;
2731
2732 CASE_LOW (t)(*((const_cast<tree*> (tree_operand_check (((tree_check
((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2732, __FUNCTION__, (CASE_LABEL_EXPR)))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2732, __FUNCTION__)))))
= low_value;
2733 CASE_HIGH (t)(*((const_cast<tree*> (tree_operand_check (((tree_check
((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2733, __FUNCTION__, (CASE_LABEL_EXPR)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2733, __FUNCTION__)))))
= high_value;
2734 CASE_LABEL (t)(*((const_cast<tree*> (tree_operand_check (((tree_check
((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2734, __FUNCTION__, (CASE_LABEL_EXPR)))), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2734, __FUNCTION__)))))
= label_decl;
2735 CASE_CHAIN (t)(*((const_cast<tree*> (tree_operand_check (((tree_check
((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2735, __FUNCTION__, (CASE_LABEL_EXPR)))), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2735, __FUNCTION__)))))
= NULL_TREE(tree) nullptr;
2736
2737 return t;
2738}
2739
2740/* Build a newly constructed INTEGER_CST node. LEN and EXT_LEN are the
2741 values of TREE_INT_CST_NUNITS and TREE_INT_CST_EXT_NUNITS respectively.
2742 The latter determines the length of the HOST_WIDE_INT vector. */
2743
2744tree
2745make_int_cst (int len, int ext_len MEM_STAT_DECL)
2746{
2747 tree t;
2748 int length = ((ext_len - 1) * sizeof (HOST_WIDE_INTlong)
2749 + sizeof (struct tree_int_cst));
2750
2751 gcc_assert (len)((void)(!(len) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2751, __FUNCTION__), 0 : 0))
;
2752 record_node_allocation_statistics (INTEGER_CST, length);
2753
2754 t = ggc_alloc_cleared_tree_node_stat (length PASS_MEM_STAT);
2755
2756 TREE_SET_CODE (t, INTEGER_CST)((t)->base.code = (INTEGER_CST));
2757 TREE_INT_CST_NUNITS (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2757, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.unextended
)
= len;
2758 TREE_INT_CST_EXT_NUNITS (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2758, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.extended
)
= ext_len;
2759 /* to_offset can only be applied to trees that are offset_int-sized
2760 or smaller. EXT_LEN is correct if it fits, otherwise the constant
2761 must be exactly the precision of offset_int and so LEN is correct. */
2762 if (ext_len <= OFFSET_INT_ELTS(((64 + 4 + 64 - 1) & ~(64 - 1)) / 64))
2763 TREE_INT_CST_OFFSET_NUNITS (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2763, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.offset
)
= ext_len;
2764 else
2765 TREE_INT_CST_OFFSET_NUNITS (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2765, __FUNCTION__, (INTEGER_CST)))->base.u.int_length.offset
)
= len;
2766
2767 TREE_CONSTANT (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2767, __FUNCTION__))->base.constant_flag)
= 1;
2768
2769 return t;
2770}
2771
2772/* Build a newly constructed TREE_VEC node of length LEN. */
2773
2774tree
2775make_tree_vec (int len MEM_STAT_DECL)
2776{
2777 tree t;
2778 size_t length = (len - 1) * sizeof (tree) + sizeof (struct tree_vec);
2779
2780 record_node_allocation_statistics (TREE_VEC, length);
2781
2782 t = ggc_alloc_cleared_tree_node_stat (length PASS_MEM_STAT);
2783
2784 TREE_SET_CODE (t, TREE_VEC)((t)->base.code = (TREE_VEC));
2785 TREE_VEC_LENGTH (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2785, __FUNCTION__, (TREE_VEC)))->base.u.length)
= len;
2786
2787 return t;
2788}
2789
2790/* Grow a TREE_VEC node to new length LEN. */
2791
2792tree
2793grow_tree_vec (tree v, int len MEM_STAT_DECL)
2794{
2795 gcc_assert (TREE_CODE (v) == TREE_VEC)((void)(!(((enum tree_code) (v)->base.code) == TREE_VEC) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2795, __FUNCTION__), 0 : 0))
;
2796
2797 int oldlen = TREE_VEC_LENGTH (v)((tree_check ((v), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2797, __FUNCTION__, (TREE_VEC)))->base.u.length)
;
2798 gcc_assert (len > oldlen)((void)(!(len > oldlen) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2798, __FUNCTION__), 0 : 0))
;
2799
2800 size_t oldlength = (oldlen - 1) * sizeof (tree) + sizeof (struct tree_vec);
2801 size_t length = (len - 1) * sizeof (tree) + sizeof (struct tree_vec);
2802
2803 record_node_allocation_statistics (TREE_VEC, length - oldlength);
2804
2805 v = (tree) ggc_realloc (v, length PASS_MEM_STAT);
2806
2807 TREE_VEC_LENGTH (v)((tree_check ((v), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2807, __FUNCTION__, (TREE_VEC)))->base.u.length)
= len;
2808
2809 return v;
2810}
2811
2812/* Return 1 if EXPR is the constant zero, whether it is integral, float or
2813 fixed, and scalar, complex or vector. */
2814
2815bool
2816zerop (const_tree expr)
2817{
2818 return (integer_zerop (expr)
2819 || real_zerop (expr)
2820 || fixed_zerop (expr));
2821}
2822
2823/* Return 1 if EXPR is the integer constant zero or a complex constant
2824 of zero, or a location wrapper for such a constant. */
2825
2826bool
2827integer_zerop (const_tree expr)
2828{
2829 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
2830
2831 switch (TREE_CODE (expr)((enum tree_code) (expr)->base.code))
2832 {
2833 case INTEGER_CST:
2834 return wi::to_wide (expr) == 0;
2835 case COMPLEX_CST:
2836 return (integer_zerop (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2836, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
2837 && integer_zerop (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2837, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
));
2838 case VECTOR_CST:
2839 return (VECTOR_CST_NPATTERNS (expr)(1U << ((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2839, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.log2_npatterns
))
== 1
2840 && VECTOR_CST_DUPLICATE_P (expr)(((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2840, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern
) == 1)
2841 && integer_zerop (VECTOR_CST_ENCODED_ELT (expr, 0)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2841, __FUNCTION__, (VECTOR_CST)))->vector.elts[0])
));
2842 default:
2843 return false;
2844 }
2845}
2846
2847/* Return 1 if EXPR is the integer constant one or the corresponding
2848 complex constant, or a location wrapper for such a constant. */
2849
2850bool
2851integer_onep (const_tree expr)
2852{
2853 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
2854
2855 switch (TREE_CODE (expr)((enum tree_code) (expr)->base.code))
2856 {
2857 case INTEGER_CST:
2858 return wi::eq_p (wi::to_widest (expr), 1);
2859 case COMPLEX_CST:
2860 return (integer_onep (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2860, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
2861 && integer_zerop (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2861, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
));
2862 case VECTOR_CST:
2863 return (VECTOR_CST_NPATTERNS (expr)(1U << ((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2863, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.log2_npatterns
))
== 1
2864 && VECTOR_CST_DUPLICATE_P (expr)(((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2864, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern
) == 1)
2865 && integer_onep (VECTOR_CST_ENCODED_ELT (expr, 0)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2865, __FUNCTION__, (VECTOR_CST)))->vector.elts[0])
));
2866 default:
2867 return false;
2868 }
2869}
2870
2871/* Return 1 if EXPR is the integer constant one. For complex and vector,
2872 return 1 if every piece is the integer constant one.
2873 Also return 1 for location wrappers for such a constant. */
2874
2875bool
2876integer_each_onep (const_tree expr)
2877{
2878 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
2879
2880 if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == COMPLEX_CST)
2881 return (integer_onep (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2881, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
2882 && integer_onep (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2882, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
));
2883 else
2884 return integer_onep (expr);
2885}
2886
2887/* Return 1 if EXPR is an integer containing all 1's in as much precision as
2888 it contains, or a complex or vector whose subparts are such integers,
2889 or a location wrapper for such a constant. */
2890
2891bool
2892integer_all_onesp (const_tree expr)
2893{
2894 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
2895
2896 if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == COMPLEX_CST
2897 && integer_all_onesp (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2897, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
2898 && integer_all_onesp (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2898, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
))
2899 return true;
2900
2901 else if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == VECTOR_CST)
2902 return (VECTOR_CST_NPATTERNS (expr)(1U << ((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2902, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.log2_npatterns
))
== 1
2903 && VECTOR_CST_DUPLICATE_P (expr)(((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2903, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern
) == 1)
2904 && integer_all_onesp (VECTOR_CST_ENCODED_ELT (expr, 0)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2904, __FUNCTION__, (VECTOR_CST)))->vector.elts[0])
));
2905
2906 else if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) != INTEGER_CST)
2907 return false;
2908
2909 return (wi::max_value (TYPE_PRECISION (TREE_TYPE (expr))((tree_class_check ((((contains_struct_check ((expr), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2909, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2909, __FUNCTION__))->type_common.precision)
, UNSIGNED)
2910 == wi::to_wide (expr));
2911}
2912
2913/* Return 1 if EXPR is the integer constant minus one, or a location wrapper
2914 for such a constant. */
2915
2916bool
2917integer_minus_onep (const_tree expr)
2918{
2919 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
2920
2921 if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == COMPLEX_CST)
2922 return (integer_all_onesp (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2922, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
2923 && integer_zerop (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2923, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
));
2924 else
2925 return integer_all_onesp (expr);
2926}
2927
2928/* Return 1 if EXPR is an integer constant that is a power of 2 (i.e., has only
2929 one bit on), or a location wrapper for such a constant. */
2930
2931bool
2932integer_pow2p (const_tree expr)
2933{
2934 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
2935
2936 if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == COMPLEX_CST
2937 && integer_pow2p (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2937, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
2938 && integer_zerop (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2938, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
))
2939 return true;
2940
2941 if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) != INTEGER_CST)
2942 return false;
2943
2944 return wi::popcount (wi::to_wide (expr)) == 1;
2945}
2946
2947/* Return 1 if EXPR is an integer constant other than zero or a
2948 complex constant other than zero, or a location wrapper for such a
2949 constant. */
2950
2951bool
2952integer_nonzerop (const_tree expr)
2953{
2954 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
2955
2956 return ((TREE_CODE (expr)((enum tree_code) (expr)->base.code) == INTEGER_CST
2957 && wi::to_wide (expr) != 0)
2958 || (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == COMPLEX_CST
2959 && (integer_nonzerop (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2959, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
2960 || integer_nonzerop (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2960, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
))));
2961}
2962
2963/* Return 1 if EXPR is the integer constant one. For vector,
2964 return 1 if every piece is the integer constant minus one
2965 (representing the value TRUE).
2966 Also return 1 for location wrappers for such a constant. */
2967
2968bool
2969integer_truep (const_tree expr)
2970{
2971 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
2972
2973 if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == VECTOR_CST)
2974 return integer_all_onesp (expr);
2975 return integer_onep (expr);
2976}
2977
2978/* Return 1 if EXPR is the fixed-point constant zero, or a location wrapper
2979 for such a constant. */
2980
2981bool
2982fixed_zerop (const_tree expr)
2983{
2984 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
2985
2986 return (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == FIXED_CST
2987 && TREE_FIXED_CST (expr)(*((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2987, __FUNCTION__, (FIXED_CST)))->fixed_cst.fixed_cst_ptr
))
.data.is_zero ());
2988}
2989
2990/* Return the power of two represented by a tree node known to be a
2991 power of two. */
2992
2993int
2994tree_log2 (const_tree expr)
2995{
2996 if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == COMPLEX_CST)
2997 return tree_log2 (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 2997, __FUNCTION__, (COMPLEX_CST)))->complex.real)
);
2998
2999 return wi::exact_log2 (wi::to_wide (expr));
3000}
3001
3002/* Similar, but return the largest integer Y such that 2 ** Y is less
3003 than or equal to EXPR. */
3004
3005int
3006tree_floor_log2 (const_tree expr)
3007{
3008 if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == COMPLEX_CST)
3009 return tree_log2 (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3009, __FUNCTION__, (COMPLEX_CST)))->complex.real)
);
3010
3011 return wi::floor_log2 (wi::to_wide (expr));
3012}
3013
3014/* Return number of known trailing zero bits in EXPR, or, if the value of
3015 EXPR is known to be zero, the precision of it's type. */
3016
3017unsigned int
3018tree_ctz (const_tree expr)
3019{
3020 if (!INTEGRAL_TYPE_P (TREE_TYPE (expr))(((enum tree_code) (((contains_struct_check ((expr), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3020, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE
|| ((enum tree_code) (((contains_struct_check ((expr), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3020, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
|| ((enum tree_code) (((contains_struct_check ((expr), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3020, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)
3021 && !POINTER_TYPE_P (TREE_TYPE (expr))(((enum tree_code) (((contains_struct_check ((expr), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3021, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE
|| ((enum tree_code) (((contains_struct_check ((expr), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3021, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE
)
)
3022 return 0;
3023
3024 unsigned int ret1, ret2, prec = TYPE_PRECISION (TREE_TYPE (expr))((tree_class_check ((((contains_struct_check ((expr), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3024, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3024, __FUNCTION__))->type_common.precision)
;
3025 switch (TREE_CODE (expr)((enum tree_code) (expr)->base.code))
3026 {
3027 case INTEGER_CST:
3028 ret1 = wi::ctz (wi::to_wide (expr));
3029 return MIN (ret1, prec)((ret1) < (prec) ? (ret1) : (prec));
3030 case SSA_NAME:
3031 ret1 = wi::ctz (get_nonzero_bits (expr));
3032 return MIN (ret1, prec)((ret1) < (prec) ? (ret1) : (prec));
3033 case PLUS_EXPR:
3034 case MINUS_EXPR:
3035 case BIT_IOR_EXPR:
3036 case BIT_XOR_EXPR:
3037 case MIN_EXPR:
3038 case MAX_EXPR:
3039 ret1 = tree_ctz (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3039, __FUNCTION__)))))
);
3040 if (ret1 == 0)
3041 return ret1;
3042 ret2 = tree_ctz (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3042, __FUNCTION__)))))
);
3043 return MIN (ret1, ret2)((ret1) < (ret2) ? (ret1) : (ret2));
3044 case POINTER_PLUS_EXPR:
3045 ret1 = tree_ctz (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3045, __FUNCTION__)))))
);
3046 ret2 = tree_ctz (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3046, __FUNCTION__)))))
);
3047 /* Second operand is sizetype, which could be in theory
3048 wider than pointer's precision. Make sure we never
3049 return more than prec. */
3050 ret2 = MIN (ret2, prec)((ret2) < (prec) ? (ret2) : (prec));
3051 return MIN (ret1, ret2)((ret1) < (ret2) ? (ret1) : (ret2));
3052 case BIT_AND_EXPR:
3053 ret1 = tree_ctz (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3053, __FUNCTION__)))))
);
3054 ret2 = tree_ctz (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3054, __FUNCTION__)))))
);
3055 return MAX (ret1, ret2)((ret1) > (ret2) ? (ret1) : (ret2));
3056 case MULT_EXPR:
3057 ret1 = tree_ctz (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3057, __FUNCTION__)))))
);
3058 ret2 = tree_ctz (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3058, __FUNCTION__)))))
);
3059 return MIN (ret1 + ret2, prec)((ret1 + ret2) < (prec) ? (ret1 + ret2) : (prec));
3060 case LSHIFT_EXPR:
3061 ret1 = tree_ctz (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3061, __FUNCTION__)))))
);
3062 if (tree_fits_uhwi_p (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3062, __FUNCTION__)))))
)
3063 && (tree_to_uhwi (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3063, __FUNCTION__)))))
) < prec))
3064 {
3065 ret2 = tree_to_uhwi (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3065, __FUNCTION__)))))
);
3066 return MIN (ret1 + ret2, prec)((ret1 + ret2) < (prec) ? (ret1 + ret2) : (prec));
3067 }
3068 return ret1;
3069 case RSHIFT_EXPR:
3070 if (tree_fits_uhwi_p (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3070, __FUNCTION__)))))
)
3071 && (tree_to_uhwi (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3071, __FUNCTION__)))))
) < prec))
3072 {
3073 ret1 = tree_ctz (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3073, __FUNCTION__)))))
);
3074 ret2 = tree_to_uhwi (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3074, __FUNCTION__)))))
);
3075 if (ret1 > ret2)
3076 return ret1 - ret2;
3077 }
3078 return 0;
3079 case TRUNC_DIV_EXPR:
3080 case CEIL_DIV_EXPR:
3081 case FLOOR_DIV_EXPR:
3082 case ROUND_DIV_EXPR:
3083 case EXACT_DIV_EXPR:
3084 if (TREE_CODE (TREE_OPERAND (expr, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check
((expr), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3084, __FUNCTION__))))))->base.code)
== INTEGER_CST
3085 && tree_int_cst_sgn (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3085, __FUNCTION__)))))
) == 1)
3086 {
3087 int l = tree_log2 (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3087, __FUNCTION__)))))
);
3088 if (l >= 0)
3089 {
3090 ret1 = tree_ctz (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3090, __FUNCTION__)))))
);
3091 ret2 = l;
3092 if (ret1 > ret2)
3093 return ret1 - ret2;
3094 }
3095 }
3096 return 0;
3097 CASE_CONVERTcase NOP_EXPR: case CONVERT_EXPR:
3098 ret1 = tree_ctz (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3098, __FUNCTION__)))))
);
3099 if (ret1 && ret1 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0)))((tree_class_check ((((contains_struct_check (((*((const_cast
<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3099, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3099, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3099, __FUNCTION__))->type_common.precision)
)
3100 ret1 = prec;
3101 return MIN (ret1, prec)((ret1) < (prec) ? (ret1) : (prec));
3102 case SAVE_EXPR:
3103 return tree_ctz (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3103, __FUNCTION__)))))
);
3104 case COND_EXPR:
3105 ret1 = tree_ctz (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3105, __FUNCTION__)))))
);
3106 if (ret1 == 0)
3107 return 0;
3108 ret2 = tree_ctz (TREE_OPERAND (expr, 2)(*((const_cast<tree*> (tree_operand_check ((expr), (2),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3108, __FUNCTION__)))))
);
3109 return MIN (ret1, ret2)((ret1) < (ret2) ? (ret1) : (ret2));
3110 case COMPOUND_EXPR:
3111 return tree_ctz (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3111, __FUNCTION__)))))
);
3112 case ADDR_EXPR:
3113 ret1 = get_pointer_alignment (CONST_CAST_TREE (expr)(const_cast<union tree_node *> (((expr)))));
3114 if (ret1 > BITS_PER_UNIT(8))
3115 {
3116 ret1 = ctz_hwi (ret1 / BITS_PER_UNIT(8));
3117 return MIN (ret1, prec)((ret1) < (prec) ? (ret1) : (prec));
3118 }
3119 return 0;
3120 default:
3121 return 0;
3122 }
3123}
3124
3125/* Return 1 if EXPR is the real constant zero. Trailing zeroes matter for
3126 decimal float constants, so don't return 1 for them.
3127 Also return 1 for location wrappers around such a constant. */
3128
3129bool
3130real_zerop (const_tree expr)
3131{
3132 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
3133
3134 switch (TREE_CODE (expr)((enum tree_code) (expr)->base.code))
3135 {
3136 case REAL_CST:
3137 return real_equal (&TREE_REAL_CST (expr)(*(&(tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3137, __FUNCTION__, (REAL_CST)))->real_cst.value))
, &dconst0)
3138 && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3138, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3138, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3138, __FUNCTION__))->typed.type)) : (((contains_struct_check
((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3138, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_DECIMAL_FLOAT)
);
3139 case COMPLEX_CST:
3140 return real_zerop (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3140, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
3141 && real_zerop (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3141, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
);
3142 case VECTOR_CST:
3143 {
3144 /* Don't simply check for a duplicate because the predicate
3145 accepts both +0.0 and -0.0. */
3146 unsigned count = vector_cst_encoded_nelts (expr);
3147 for (unsigned int i = 0; i < count; ++i)
3148 if (!real_zerop (VECTOR_CST_ENCODED_ELT (expr, i)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3148, __FUNCTION__, (VECTOR_CST)))->vector.elts[i])
))
3149 return false;
3150 return true;
3151 }
3152 default:
3153 return false;
3154 }
3155}
3156
3157/* Return 1 if EXPR is the real constant one in real or complex form.
3158 Trailing zeroes matter for decimal float constants, so don't return
3159 1 for them.
3160 Also return 1 for location wrappers around such a constant. */
3161
3162bool
3163real_onep (const_tree expr)
3164{
3165 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
3166
3167 switch (TREE_CODE (expr)((enum tree_code) (expr)->base.code))
3168 {
3169 case REAL_CST:
3170 return real_equal (&TREE_REAL_CST (expr)(*(&(tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3170, __FUNCTION__, (REAL_CST)))->real_cst.value))
, &dconst1)
3171 && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3171, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3171, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3171, __FUNCTION__))->typed.type)) : (((contains_struct_check
((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3171, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_DECIMAL_FLOAT)
);
3172 case COMPLEX_CST:
3173 return real_onep (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3173, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
3174 && real_zerop (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3174, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
);
3175 case VECTOR_CST:
3176 return (VECTOR_CST_NPATTERNS (expr)(1U << ((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3176, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.log2_npatterns
))
== 1
3177 && VECTOR_CST_DUPLICATE_P (expr)(((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3177, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern
) == 1)
3178 && real_onep (VECTOR_CST_ENCODED_ELT (expr, 0)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3178, __FUNCTION__, (VECTOR_CST)))->vector.elts[0])
));
3179 default:
3180 return false;
3181 }
3182}
3183
3184/* Return 1 if EXPR is the real constant minus one. Trailing zeroes
3185 matter for decimal float constants, so don't return 1 for them.
3186 Also return 1 for location wrappers around such a constant. */
3187
3188bool
3189real_minus_onep (const_tree expr)
3190{
3191 STRIP_ANY_LOCATION_WRAPPER (expr)(expr) = tree_strip_any_location_wrapper ((const_cast<union
tree_node *> (((expr)))))
;
3192
3193 switch (TREE_CODE (expr)((enum tree_code) (expr)->base.code))
3194 {
3195 case REAL_CST:
3196 return real_equal (&TREE_REAL_CST (expr)(*(&(tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3196, __FUNCTION__, (REAL_CST)))->real_cst.value))
, &dconstm1)
3197 && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3197, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3197, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3197, __FUNCTION__))->typed.type)) : (((contains_struct_check
((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3197, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_DECIMAL_FLOAT)
);
3198 case COMPLEX_CST:
3199 return real_minus_onep (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3199, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
3200 && real_zerop (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3200, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
);
3201 case VECTOR_CST:
3202 return (VECTOR_CST_NPATTERNS (expr)(1U << ((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3202, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.log2_npatterns
))
== 1
3203 && VECTOR_CST_DUPLICATE_P (expr)(((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3203, __FUNCTION__, (VECTOR_CST)))->base.u.vector_cst.nelts_per_pattern
) == 1)
3204 && real_minus_onep (VECTOR_CST_ENCODED_ELT (expr, 0)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3204, __FUNCTION__, (VECTOR_CST)))->vector.elts[0])
));
3205 default:
3206 return false;
3207 }
3208}
3209
3210/* Return true if T could be a floating point zero. */
3211
3212bool
3213real_maybe_zerop (const_tree expr)
3214{
3215 switch (TREE_CODE (expr)((enum tree_code) (expr)->base.code))
3216 {
3217 case REAL_CST:
3218 /* Can't use real_zerop here, as it always returns false for decimal
3219 floats. And can't use TREE_REAL_CST (expr).cl == rvc_zero
3220 either, as decimal zeros are rvc_normal. */
3221 return real_equal (&TREE_REAL_CST (expr)(*(&(tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3221, __FUNCTION__, (REAL_CST)))->real_cst.value))
, &dconst0);
3222 case COMPLEX_CST:
3223 return (real_maybe_zerop (TREE_REALPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3223, __FUNCTION__, (COMPLEX_CST)))->complex.real)
)
3224 || real_maybe_zerop (TREE_IMAGPART (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3224, __FUNCTION__, (COMPLEX_CST)))->complex.imag)
));
3225 case VECTOR_CST:
3226 {
3227 unsigned count = vector_cst_encoded_nelts (expr);
3228 for (unsigned int i = 0; i < count; ++i)
3229 if (real_maybe_zerop (VECTOR_CST_ENCODED_ELT (expr, i)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3229, __FUNCTION__, (VECTOR_CST)))->vector.elts[i])
))
3230 return true;
3231 return false;
3232 }
3233 default:
3234 /* Perhaps for SSA_NAMEs we could query frange. */
3235 return true;
3236 }
3237}
3238
3239/* Nonzero if EXP is a constant or a cast of a constant. */
3240
3241bool
3242really_constant_p (const_tree exp)
3243{
3244 /* This is not quite the same as STRIP_NOPS. It does more. */
3245 while (CONVERT_EXPR_P (exp)((((enum tree_code) (exp)->base.code)) == NOP_EXPR || (((enum
tree_code) (exp)->base.code)) == CONVERT_EXPR)
3246 || TREE_CODE (exp)((enum tree_code) (exp)->base.code) == NON_LVALUE_EXPR)
3247 exp = TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3247, __FUNCTION__)))))
;
3248 return TREE_CONSTANT (exp)((non_type_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3248, __FUNCTION__))->base.constant_flag)
;
3249}
3250
3251/* Return true if T holds a polynomial pointer difference, storing it in
3252 *VALUE if so. A true return means that T's precision is no greater
3253 than 64 bits, which is the largest address space we support, so *VALUE
3254 never loses precision. However, the signedness of the result does
3255 not necessarily match the signedness of T: sometimes an unsigned type
3256 like sizetype is used to encode a value that is actually negative. */
3257
3258bool
3259ptrdiff_tree_p (const_tree t, poly_int64_pod *value)
3260{
3261 if (!t)
3262 return false;
3263 if (TREE_CODE (t)((enum tree_code) (t)->base.code) == INTEGER_CST)
3264 {
3265 if (!cst_and_fits_in_hwi (t))
3266 return false;
3267 *value = int_cst_value (t);
3268 return true;
3269 }
3270 if (POLY_INT_CST_P (t)(1 > 1 && ((enum tree_code) (t)->base.code) == POLY_INT_CST
)
)
3271 {
3272 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS1; ++i)
3273 if (!cst_and_fits_in_hwi (POLY_INT_CST_COEFF (t, i)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3273, __FUNCTION__, (POLY_INT_CST)))->poly_int_cst.coeffs
[i])
))
3274 return false;
3275 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS1; ++i)
3276 value->coeffs[i] = int_cst_value (POLY_INT_CST_COEFF (t, i)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3276, __FUNCTION__, (POLY_INT_CST)))->poly_int_cst.coeffs
[i])
);
3277 return true;
3278 }
3279 return false;
3280}
3281
3282poly_int64
3283tree_to_poly_int64 (const_tree t)
3284{
3285 gcc_assert (tree_fits_poly_int64_p (t))((void)(!(tree_fits_poly_int64_p (t)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3285, __FUNCTION__), 0 : 0))
;
3286 if (POLY_INT_CST_P (t)(1 > 1 && ((enum tree_code) (t)->base.code) == POLY_INT_CST
)
)
3287 return poly_int_cst_value (t).force_shwi ();
3288 return TREE_INT_CST_LOW (t)((unsigned long) (*tree_int_cst_elt_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3288, __FUNCTION__)))
;
3289}
3290
3291poly_uint64
3292tree_to_poly_uint64 (const_tree t)
3293{
3294 gcc_assert (tree_fits_poly_uint64_p (t))((void)(!(tree_fits_poly_uint64_p (t)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3294, __FUNCTION__), 0 : 0))
;
3295 if (POLY_INT_CST_P (t)(1 > 1 && ((enum tree_code) (t)->base.code) == POLY_INT_CST
)
)
3296 return poly_int_cst_value (t).force_uhwi ();
3297 return TREE_INT_CST_LOW (t)((unsigned long) (*tree_int_cst_elt_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3297, __FUNCTION__)))
;
3298}
3299
3300/* Return first list element whose TREE_VALUE is ELEM.
3301 Return 0 if ELEM is not in LIST. */
3302
3303tree
3304value_member (tree elem, tree list)
3305{
3306 while (list)
3307 {
3308 if (elem == TREE_VALUE (list)((tree_check ((list), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3308, __FUNCTION__, (TREE_LIST)))->list.value)
)
3309 return list;
3310 list = TREE_CHAIN (list)((contains_struct_check ((list), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3310, __FUNCTION__))->common.chain)
;
3311 }
3312 return NULL_TREE(tree) nullptr;
3313}
3314
3315/* Return first list element whose TREE_PURPOSE is ELEM.
3316 Return 0 if ELEM is not in LIST. */
3317
3318tree
3319purpose_member (const_tree elem, tree list)
3320{
3321 while (list)
3322 {
3323 if (elem == TREE_PURPOSE (list)((tree_check ((list), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3323, __FUNCTION__, (TREE_LIST)))->list.purpose)
)
3324 return list;
3325 list = TREE_CHAIN (list)((contains_struct_check ((list), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3325, __FUNCTION__))->common.chain)
;
3326 }
3327 return NULL_TREE(tree) nullptr;
3328}
3329
3330/* Return true if ELEM is in V. */
3331
3332bool
3333vec_member (const_tree elem, vec<tree, va_gc> *v)
3334{
3335 unsigned ix;
3336 tree t;
3337 FOR_EACH_VEC_SAFE_ELT (v, ix, t)for (ix = 0; vec_safe_iterate ((v), (ix), &(t)); ++(ix))
3338 if (elem == t)
3339 return true;
3340 return false;
3341}
3342
3343/* Returns element number IDX (zero-origin) of chain CHAIN, or
3344 NULL_TREE. */
3345
3346tree
3347chain_index (int idx, tree chain)
3348{
3349 for (; chain && idx > 0; --idx)
3350 chain = TREE_CHAIN (chain)((contains_struct_check ((chain), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3350, __FUNCTION__))->common.chain)
;
3351 return chain;
3352}
3353
3354/* Return nonzero if ELEM is part of the chain CHAIN. */
3355
3356bool
3357chain_member (const_tree elem, const_tree chain)
3358{
3359 while (chain)
3360 {
3361 if (elem == chain)
3362 return true;
3363 chain = DECL_CHAIN (chain)(((contains_struct_check (((contains_struct_check ((chain), (
TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3363, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3363, __FUNCTION__))->common.chain))
;
3364 }
3365
3366 return false;
3367}
3368
3369/* Return the length of a chain of nodes chained through TREE_CHAIN.
3370 We expect a null pointer to mark the end of the chain.
3371 This is the Lisp primitive `length'. */
3372
3373int
3374list_length (const_tree t)
3375{
3376 const_tree p = t;
3377#ifdef ENABLE_TREE_CHECKING1
3378 const_tree q = t;
3379#endif
3380 int len = 0;
3381
3382 while (p)
3383 {
3384 p = TREE_CHAIN (p)((contains_struct_check ((p), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3384, __FUNCTION__))->common.chain)
;
3385#ifdef ENABLE_TREE_CHECKING1
3386 if (len % 2)
3387 q = TREE_CHAIN (q)((contains_struct_check ((q), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3387, __FUNCTION__))->common.chain)
;
3388 gcc_assert (p != q)((void)(!(p != q) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3388, __FUNCTION__), 0 : 0))
;
3389#endif
3390 len++;
3391 }
3392
3393 return len;
3394}
3395
3396/* Returns the first FIELD_DECL in the TYPE_FIELDS of the RECORD_TYPE or
3397 UNION_TYPE TYPE, or NULL_TREE if none. */
3398
3399tree
3400first_field (const_tree type)
3401{
3402 tree t = TYPE_FIELDS (type)((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3402, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE
)))->type_non_common.values)
;
3403 while (t && TREE_CODE (t)((enum tree_code) (t)->base.code) != FIELD_DECL)
3404 t = TREE_CHAIN (t)((contains_struct_check ((t), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3404, __FUNCTION__))->common.chain)
;
3405 return t;
3406}
3407
3408/* Returns the last FIELD_DECL in the TYPE_FIELDS of the RECORD_TYPE or
3409 UNION_TYPE TYPE, or NULL_TREE if none. */
3410
3411tree
3412last_field (const_tree type)
3413{
3414 tree last = NULL_TREE(tree) nullptr;
3415
3416 for (tree fld = TYPE_FIELDS (type)((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3416, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE
)))->type_non_common.values)
; fld; fld = TREE_CHAIN (fld)((contains_struct_check ((fld), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3416, __FUNCTION__))->common.chain)
)
3417 {
3418 if (TREE_CODE (fld)((enum tree_code) (fld)->base.code) != FIELD_DECL)
3419 continue;
3420
3421 last = fld;
3422 }
3423
3424 return last;
3425}
3426
3427/* Concatenate two chains of nodes (chained through TREE_CHAIN)
3428 by modifying the last node in chain 1 to point to chain 2.
3429 This is the Lisp primitive `nconc'. */
3430
3431tree
3432chainon (tree op1, tree op2)
3433{
3434 tree t1;
3435
3436 if (!op1)
3437 return op2;
3438 if (!op2)
3439 return op1;
3440
3441 for (t1 = op1; TREE_CHAIN (t1)((contains_struct_check ((t1), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3441, __FUNCTION__))->common.chain)
; t1 = TREE_CHAIN (t1)((contains_struct_check ((t1), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3441, __FUNCTION__))->common.chain)
)
3442 continue;
3443 TREE_CHAIN (t1)((contains_struct_check ((t1), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3443, __FUNCTION__))->common.chain)
= op2;
3444
3445#ifdef ENABLE_TREE_CHECKING1
3446 {
3447 tree t2;
3448 for (t2 = op2; t2; t2 = TREE_CHAIN (t2)((contains_struct_check ((t2), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3448, __FUNCTION__))->common.chain)
)
3449 gcc_assert (t2 != t1)((void)(!(t2 != t1) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3449, __FUNCTION__), 0 : 0))
;
3450 }
3451#endif
3452
3453 return op1;
3454}
3455
3456/* Return the last node in a chain of nodes (chained through TREE_CHAIN). */
3457
3458tree
3459tree_last (tree chain)
3460{
3461 tree next;
3462 if (chain)
3463 while ((next = TREE_CHAIN (chain)((contains_struct_check ((chain), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3463, __FUNCTION__))->common.chain)
))
3464 chain = next;
3465 return chain;
3466}
3467
3468/* Reverse the order of elements in the chain T,
3469 and return the new head of the chain (old last element). */
3470
3471tree
3472nreverse (tree t)
3473{
3474 tree prev = 0, decl, next;
3475 for (decl = t; decl; decl = next)
3476 {
3477 /* We shouldn't be using this function to reverse BLOCK chains; we
3478 have blocks_nreverse for that. */
3479 gcc_checking_assert (TREE_CODE (decl) != BLOCK)((void)(!(((enum tree_code) (decl)->base.code) != BLOCK) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3479, __FUNCTION__), 0 : 0))
;
3480 next = TREE_CHAIN (decl)((contains_struct_check ((decl), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3480, __FUNCTION__))->common.chain)
;
3481 TREE_CHAIN (decl)((contains_struct_check ((decl), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3481, __FUNCTION__))->common.chain)
= prev;
3482 prev = decl;
3483 }
3484 return prev;
3485}
3486
3487/* Return a newly created TREE_LIST node whose
3488 purpose and value fields are PARM and VALUE. */
3489
3490tree
3491build_tree_list (tree parm, tree value MEM_STAT_DECL)
3492{
3493 tree t = make_node (TREE_LIST PASS_MEM_STAT);
3494 TREE_PURPOSE (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3494, __FUNCTION__, (TREE_LIST)))->list.purpose)
= parm;
3495 TREE_VALUE (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3495, __FUNCTION__, (TREE_LIST)))->list.value)
= value;
3496 return t;
3497}
3498
3499/* Build a chain of TREE_LIST nodes from a vector. */
3500
3501tree
3502build_tree_list_vec (const vec<tree, va_gc> *vec MEM_STAT_DECL)
3503{
3504 tree ret = NULL_TREE(tree) nullptr;
3505 tree *pp = &ret;
3506 unsigned int i;
3507 tree t;
3508 FOR_EACH_VEC_SAFE_ELT (vec, i, t)for (i = 0; vec_safe_iterate ((vec), (i), &(t)); ++(i))
3509 {
3510 *pp = build_tree_list (NULLnullptr, t PASS_MEM_STAT);
3511 pp = &TREE_CHAIN (*pp)((contains_struct_check ((*pp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3511, __FUNCTION__))->common.chain)
;
3512 }
3513 return ret;
3514}
3515
3516/* Return a newly created TREE_LIST node whose
3517 purpose and value fields are PURPOSE and VALUE
3518 and whose TREE_CHAIN is CHAIN. */
3519
3520tree
3521tree_cons (tree purpose, tree value, tree chain MEM_STAT_DECL)
3522{
3523 tree node;
3524
3525 node = ggc_alloc_tree_node_stat (sizeof (struct tree_list) PASS_MEM_STAT);
3526 memset (node, 0, sizeof (struct tree_common));
3527
3528 record_node_allocation_statistics (TREE_LIST, sizeof (struct tree_list));
3529
3530 TREE_SET_CODE (node, TREE_LIST)((node)->base.code = (TREE_LIST));
3531 TREE_CHAIN (node)((contains_struct_check ((node), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3531, __FUNCTION__))->common.chain)
= chain;
3532 TREE_PURPOSE (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3532, __FUNCTION__, (TREE_LIST)))->list.purpose)
= purpose;
3533 TREE_VALUE (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3533, __FUNCTION__, (TREE_LIST)))->list.value)
= value;
3534 return node;
3535}
3536
3537/* Return the values of the elements of a CONSTRUCTOR as a vector of
3538 trees. */
3539
3540vec<tree, va_gc> *
3541ctor_to_vec (tree ctor)
3542{
3543 vec<tree, va_gc> *vec;
3544 vec_alloc (vec, CONSTRUCTOR_NELTS (ctor)(vec_safe_length (((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3544, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)))
);
3545 unsigned int ix;
3546 tree val;
3547
3548 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), ix, val)for (ix = 0; (ix >= vec_safe_length (((tree_check ((ctor),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3548, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)))
? false : ((val = (*(((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3548, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)))
[ix].value), true); (ix)++)
3549 vec->quick_push (val);
3550
3551 return vec;
3552}
3553
3554/* Return the size nominally occupied by an object of type TYPE
3555 when it resides in memory. The value is measured in units of bytes,
3556 and its data type is that normally used for type sizes
3557 (which is the first type created by make_signed_type or
3558 make_unsigned_type). */
3559
3560tree
3561size_in_bytes_loc (location_t loc, const_tree type)
3562{
3563 tree t;
3564
3565 if (type == error_mark_nodeglobal_trees[TI_ERROR_MARK])
3566 return integer_zero_nodeglobal_trees[TI_INTEGER_ZERO];
3567
3568 type = TYPE_MAIN_VARIANT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3568, __FUNCTION__))->type_common.main_variant)
;
3569 t = TYPE_SIZE_UNIT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3569, __FUNCTION__))->type_common.size_unit)
;
3570
3571 if (t == 0)
3572 {
3573 lang_hooks.types.incomplete_type_error (loc, NULL_TREE(tree) nullptr, type);
3574 return size_zero_nodeglobal_trees[TI_SIZE_ZERO];
3575 }
3576
3577 return t;
3578}
3579
3580/* Return the size of TYPE (in bytes) as a wide integer
3581 or return -1 if the size can vary or is larger than an integer. */
3582
3583HOST_WIDE_INTlong
3584int_size_in_bytes (const_tree type)
3585{
3586 tree t;
3587
3588 if (type == error_mark_nodeglobal_trees[TI_ERROR_MARK])
3589 return 0;
3590
3591 type = TYPE_MAIN_VARIANT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3591, __FUNCTION__))->type_common.main_variant)
;
3592 t = TYPE_SIZE_UNIT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3592, __FUNCTION__))->type_common.size_unit)
;
3593
3594 if (t && tree_fits_uhwi_p (t))
3595 return TREE_INT_CST_LOW (t)((unsigned long) (*tree_int_cst_elt_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3595, __FUNCTION__)))
;
3596 else
3597 return -1;
3598}
3599
3600/* Return the maximum size of TYPE (in bytes) as a wide integer
3601 or return -1 if the size can vary or is larger than an integer. */
3602
3603HOST_WIDE_INTlong
3604max_int_size_in_bytes (const_tree type)
3605{
3606 HOST_WIDE_INTlong size = -1;
3607 tree size_tree;
3608
3609 /* If this is an array type, check for a possible MAX_SIZE attached. */
3610
3611 if (TREE_CODE (type)((enum tree_code) (type)->base.code) == ARRAY_TYPE)
3612 {
3613 size_tree = TYPE_ARRAY_MAX_SIZE (type)((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3613, __FUNCTION__, (ARRAY_TYPE)))->type_non_common.maxval
)
;
3614
3615 if (size_tree && tree_fits_uhwi_p (size_tree))
3616 size = tree_to_uhwi (size_tree);
3617 }
3618
3619 /* If we still haven't been able to get a size, see if the language
3620 can compute a maximum size. */
3621
3622 if (size == -1)
3623 {
3624 size_tree = lang_hooks.types.max_size (type);
3625
3626 if (size_tree && tree_fits_uhwi_p (size_tree))
3627 size = tree_to_uhwi (size_tree);
3628 }
3629
3630 return size;
3631}
3632
3633/* Return the bit position of FIELD, in bits from the start of the record.
3634 This is a tree of type bitsizetype. */
3635
3636tree
3637bit_position (const_tree field)
3638{
3639 return bit_from_pos (DECL_FIELD_OFFSET (field)((tree_check ((field), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3639, __FUNCTION__, (FIELD_DECL)))->field_decl.offset)
,
3640 DECL_FIELD_BIT_OFFSET (field)((tree_check ((field), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3640, __FUNCTION__, (FIELD_DECL)))->field_decl.bit_offset
)
);
3641}
3642
3643/* Return the byte position of FIELD, in bytes from the start of the record.
3644 This is a tree of type sizetype. */
3645
3646tree
3647byte_position (const_tree field)
3648{
3649 return byte_from_pos (DECL_FIELD_OFFSET (field)((tree_check ((field), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3649, __FUNCTION__, (FIELD_DECL)))->field_decl.offset)
,
3650 DECL_FIELD_BIT_OFFSET (field)((tree_check ((field), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3650, __FUNCTION__, (FIELD_DECL)))->field_decl.bit_offset
)
);
3651}
3652
3653/* Likewise, but return as an integer. It must be representable in
3654 that way (since it could be a signed value, we don't have the
3655 option of returning -1 like int_size_in_byte can. */
3656
3657HOST_WIDE_INTlong
3658int_byte_position (const_tree field)
3659{
3660 return tree_to_shwi (byte_position (field));
3661}
3662
3663/* Return, as a tree node, the number of elements for TYPE (which is an
3664 ARRAY_TYPE) minus one. This counts only elements of the top array. */
3665
3666tree
3667array_type_nelts (const_tree type)
3668{
3669 tree index_type, min, max;
3670
3671 /* If they did it with unspecified bounds, then we should have already
3672 given an error about it before we got here. */
3673 if (! TYPE_DOMAIN (type)((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3673, __FUNCTION__, (ARRAY_TYPE)))->type_non_common.values
)
)
3674 return error_mark_nodeglobal_trees[TI_ERROR_MARK];
3675
3676 index_type = TYPE_DOMAIN (type)((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3676, __FUNCTION__, (ARRAY_TYPE)))->type_non_common.values
)
;
3677 min = TYPE_MIN_VALUE (index_type)((tree_check5 ((index_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3677, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE
), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.minval
)
;
3678 max = TYPE_MAX_VALUE (index_type)((tree_check5 ((index_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3678, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE
), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.maxval
)
;
3679
3680 /* TYPE_MAX_VALUE may not be set if the array has unknown length. */
3681 if (!max)
3682 {
3683 /* zero sized arrays are represented from C FE as complete types with
3684 NULL TYPE_MAX_VALUE and zero TYPE_SIZE, while C++ FE represents
3685 them as min 0, max -1. */
3686 if (COMPLETE_TYPE_P (type)(((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3686, __FUNCTION__))->type_common.size) != (tree) nullptr
)
3687 && integer_zerop (TYPE_SIZE (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3687, __FUNCTION__))->type_common.size)
)
3688 && integer_zerop (min))
3689 return build_int_cst (TREE_TYPE (min)((contains_struct_check ((min), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3689, __FUNCTION__))->typed.type)
, -1);
3690
3691 return error_mark_nodeglobal_trees[TI_ERROR_MARK];
3692 }
3693
3694 return (integer_zerop (min)
3695 ? max
3696 : fold_build2 (MINUS_EXPR, TREE_TYPE (max), max, min)fold_build2_loc (((location_t) 0), MINUS_EXPR, ((contains_struct_check
((max), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3696, __FUNCTION__))->typed.type), max, min )
);
3697}
3698
3699/* If arg is static -- a reference to an object in static storage -- then
3700 return the object. This is not the same as the C meaning of `static'.
3701 If arg isn't static, return NULL. */
3702
3703tree
3704staticp (tree arg)
3705{
3706 switch (TREE_CODE (arg)((enum tree_code) (arg)->base.code))
3707 {
3708 case FUNCTION_DECL:
3709 /* Nested functions are static, even though taking their address will
3710 involve a trampoline as we unnest the nested function and create
3711 the trampoline on the tree level. */
3712 return arg;
3713
3714 case VAR_DECL:
3715 return ((TREE_STATIC (arg)((arg)->base.static_flag) || DECL_EXTERNAL (arg)((contains_struct_check ((arg), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3715, __FUNCTION__))->decl_common.decl_flag_1)
)
3716 && ! DECL_THREAD_LOCAL_P (arg)((((arg)->base.static_flag) || ((contains_struct_check ((arg
), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3716, __FUNCTION__))->decl_common.decl_flag_1)) &&
decl_tls_model (arg) >= TLS_MODEL_REAL)
3717 && ! DECL_DLLIMPORT_P (arg)((contains_struct_check ((arg), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3717, __FUNCTION__))->decl_with_vis.dllimport_flag)
3718 ? arg : NULLnullptr);
3719
3720 case CONST_DECL:
3721 return ((TREE_STATIC (arg)((arg)->base.static_flag) || DECL_EXTERNAL (arg)((contains_struct_check ((arg), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3721, __FUNCTION__))->decl_common.decl_flag_1)
)
3722 ? arg : NULLnullptr);
3723
3724 case CONSTRUCTOR:
3725 return TREE_STATIC (arg)((arg)->base.static_flag) ? arg : NULLnullptr;
3726
3727 case LABEL_DECL:
3728 case STRING_CST:
3729 return arg;
3730
3731 case COMPONENT_REF:
3732 /* If the thing being referenced is not a field, then it is
3733 something language specific. */
3734 gcc_assert (TREE_CODE (TREE_OPERAND (arg, 1)) == FIELD_DECL)((void)(!(((enum tree_code) ((*((const_cast<tree*> (tree_operand_check
((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3734, __FUNCTION__))))))->base.code) == FIELD_DECL) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3734, __FUNCTION__), 0 : 0))
;
3735
3736 /* If we are referencing a bitfield, we can't evaluate an
3737 ADDR_EXPR at compile time and so it isn't a constant. */
3738 if (DECL_BIT_FIELD (TREE_OPERAND (arg, 1))((tree_check (((*((const_cast<tree*> (tree_operand_check
((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3738, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3738, __FUNCTION__, (FIELD_DECL)))->decl_common.decl_flag_1
)
)
3739 return NULLnullptr;
3740
3741 return staticp (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3741, __FUNCTION__)))))
);
3742
3743 case BIT_FIELD_REF:
3744 return NULLnullptr;
3745
3746 case INDIRECT_REF:
3747 return TREE_CONSTANT (TREE_OPERAND (arg, 0))((non_type_check (((*((const_cast<tree*> (tree_operand_check
((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3747, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3747, __FUNCTION__))->base.constant_flag)
? arg : NULLnullptr;
3748
3749 case ARRAY_REF:
3750 case ARRAY_RANGE_REF:
3751 if (TREE_CODE (TYPE_SIZE (TREE_TYPE (arg)))((enum tree_code) (((tree_class_check ((((contains_struct_check
((arg), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3751, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3751, __FUNCTION__))->type_common.size))->base.code)
== INTEGER_CST
3752 && TREE_CODE (TREE_OPERAND (arg, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check
((arg), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3752, __FUNCTION__))))))->base.code)
== INTEGER_CST)
3753 return staticp (TREE_OPERAND (arg, 0)(*((const_cast<tree*> (tree_operand_check ((arg), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3753, __FUNCTION__)))))
);
3754 else
3755 return NULLnullptr;
3756
3757 case COMPOUND_LITERAL_EXPR:
3758 return TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (arg))(((*((const_cast<tree*> (tree_operand_check (((tree_check
(((*((const_cast<tree*> (tree_operand_check (((tree_check
((arg), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3758, __FUNCTION__, (COMPOUND_LITERAL_EXPR)))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3758, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3758, __FUNCTION__, (DECL_EXPR)))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3758, __FUNCTION__))))))->base.static_flag)
? arg : NULLnullptr;
3759
3760 default:
3761 return NULLnullptr;
3762 }
3763}
3764
3765
3766
3767
3768/* Return whether OP is a DECL whose address is function-invariant. */
3769
3770bool
3771decl_address_invariant_p (const_tree op)
3772{
3773 /* The conditions below are slightly less strict than the one in
3774 staticp. */
3775
3776 switch (TREE_CODE (op)((enum tree_code) (op)->base.code))
3777 {
3778 case PARM_DECL:
3779 case RESULT_DECL:
3780 case LABEL_DECL:
3781 case FUNCTION_DECL:
3782 return true;
3783
3784 case VAR_DECL:
3785 if ((TREE_STATIC (op)((op)->base.static_flag) || DECL_EXTERNAL (op)((contains_struct_check ((op), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3785, __FUNCTION__))->decl_common.decl_flag_1)
)
3786 || DECL_THREAD_LOCAL_P (op)((((op)->base.static_flag) || ((contains_struct_check ((op
), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3786, __FUNCTION__))->decl_common.decl_flag_1)) &&
decl_tls_model (op) >= TLS_MODEL_REAL)
3787 || DECL_CONTEXT (op)((contains_struct_check ((op), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3787, __FUNCTION__))->decl_minimal.context)
== current_function_decl
3788 || decl_function_context (op) == current_function_decl)
3789 return true;
3790 break;
3791
3792 case CONST_DECL:
3793 if ((TREE_STATIC (op)((op)->base.static_flag) || DECL_EXTERNAL (op)((contains_struct_check ((op), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3793, __FUNCTION__))->decl_common.decl_flag_1)
)
3794 || decl_function_context (op) == current_function_decl)
3795 return true;
3796 break;
3797
3798 default:
3799 break;
3800 }
3801
3802 return false;
3803}
3804
3805/* Return whether OP is a DECL whose address is interprocedural-invariant. */
3806
3807bool
3808decl_address_ip_invariant_p (const_tree op)
3809{
3810 /* The conditions below are slightly less strict than the one in
3811 staticp. */
3812
3813 switch (TREE_CODE (op)((enum tree_code) (op)->base.code))
3814 {
3815 case LABEL_DECL:
3816 case FUNCTION_DECL:
3817 case STRING_CST:
3818 return true;
3819
3820 case VAR_DECL:
3821 if (((TREE_STATIC (op)((op)->base.static_flag) || DECL_EXTERNAL (op)((contains_struct_check ((op), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3821, __FUNCTION__))->decl_common.decl_flag_1)
)
3822 && !DECL_DLLIMPORT_P (op)((contains_struct_check ((op), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3822, __FUNCTION__))->decl_with_vis.dllimport_flag)
)
3823 || DECL_THREAD_LOCAL_P (op)((((op)->base.static_flag) || ((contains_struct_check ((op
), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3823, __FUNCTION__))->decl_common.decl_flag_1)) &&
decl_tls_model (op) >= TLS_MODEL_REAL)
)
3824 return true;
3825 break;
3826
3827 case CONST_DECL:
3828 if ((TREE_STATIC (op)((op)->base.static_flag) || DECL_EXTERNAL (op)((contains_struct_check ((op), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3828, __FUNCTION__))->decl_common.decl_flag_1)
))
3829 return true;
3830 break;
3831
3832 default:
3833 break;
3834 }
3835
3836 return false;
3837}
3838
3839
3840/* Return true if T is function-invariant (internal function, does
3841 not handle arithmetic; that's handled in skip_simple_arithmetic and
3842 tree_invariant_p). */
3843
3844static bool
3845tree_invariant_p_1 (tree t)
3846{
3847 tree op;
3848
3849 if (TREE_CONSTANT (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3849, __FUNCTION__))->base.constant_flag)
3850 || (TREE_READONLY (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3850, __FUNCTION__))->base.readonly_flag)
&& !TREE_SIDE_EFFECTS (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3850, __FUNCTION__))->base.side_effects_flag)
))
3851 return true;
3852
3853 switch (TREE_CODE (t)((enum tree_code) (t)->base.code))
3854 {
3855 case SAVE_EXPR:
3856 return true;
3857
3858 case ADDR_EXPR:
3859 op = TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3859, __FUNCTION__)))))
;
3860 while (handled_component_p (op))
3861 {
3862 switch (TREE_CODE (op)((enum tree_code) (op)->base.code))
3863 {
3864 case ARRAY_REF:
3865 case ARRAY_RANGE_REF:
3866 if (!tree_invariant_p (TREE_OPERAND (op, 1)(*((const_cast<tree*> (tree_operand_check ((op), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3866, __FUNCTION__)))))
)
3867 || TREE_OPERAND (op, 2)(*((const_cast<tree*> (tree_operand_check ((op), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3867, __FUNCTION__)))))
!= NULL_TREE(tree) nullptr
3868 || TREE_OPERAND (op, 3)(*((const_cast<tree*> (tree_operand_check ((op), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3868, __FUNCTION__)))))
!= NULL_TREE(tree) nullptr)
3869 return false;
3870 break;
3871
3872 case COMPONENT_REF:
3873 if (TREE_OPERAND (op, 2)(*((const_cast<tree*> (tree_operand_check ((op), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3873, __FUNCTION__)))))
!= NULL_TREE(tree) nullptr)
3874 return false;
3875 break;
3876
3877 default:;
3878 }
3879 op = TREE_OPERAND (op, 0)(*((const_cast<tree*> (tree_operand_check ((op), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3879, __FUNCTION__)))))
;
3880 }
3881
3882 return CONSTANT_CLASS_P (op)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (op)->base.code))] == tcc_constant)
|| decl_address_invariant_p (op);
3883
3884 default:
3885 break;
3886 }
3887
3888 return false;
3889}
3890
3891/* Return true if T is function-invariant. */
3892
3893bool
3894tree_invariant_p (tree t)
3895{
3896 tree inner = skip_simple_arithmetic (t);
3897 return tree_invariant_p_1 (inner);
3898}
3899
3900/* Wrap a SAVE_EXPR around EXPR, if appropriate.
3901 Do this to any expression which may be used in more than one place,
3902 but must be evaluated only once.
3903
3904 Normally, expand_expr would reevaluate the expression each time.
3905 Calling save_expr produces something that is evaluated and recorded
3906 the first time expand_expr is called on it. Subsequent calls to
3907 expand_expr just reuse the recorded value.
3908
3909 The call to expand_expr that generates code that actually computes
3910 the value is the first call *at compile time*. Subsequent calls
3911 *at compile time* generate code to use the saved value.
3912 This produces correct result provided that *at run time* control
3913 always flows through the insns made by the first expand_expr
3914 before reaching the other places where the save_expr was evaluated.
3915 You, the caller of save_expr, must make sure this is so.
3916
3917 Constants, and certain read-only nodes, are returned with no
3918 SAVE_EXPR because that is safe. Expressions containing placeholders
3919 are not touched; see tree.def for an explanation of what these
3920 are used for. */
3921
3922tree
3923save_expr (tree expr)
3924{
3925 tree inner;
3926
3927 /* If the tree evaluates to a constant, then we don't want to hide that
3928 fact (i.e. this allows further folding, and direct checks for constants).
3929 However, a read-only object that has side effects cannot be bypassed.
3930 Since it is no problem to reevaluate literals, we just return the
3931 literal node. */
3932 inner = skip_simple_arithmetic (expr);
3933 if (TREE_CODE (inner)((enum tree_code) (inner)->base.code) == ERROR_MARK)
3934 return inner;
3935
3936 if (tree_invariant_p_1 (inner))
3937 return expr;
3938
3939 /* If INNER contains a PLACEHOLDER_EXPR, we must evaluate it each time, since
3940 it means that the size or offset of some field of an object depends on
3941 the value within another field.
3942
3943 Note that it must not be the case that EXPR contains both a PLACEHOLDER_EXPR
3944 and some variable since it would then need to be both evaluated once and
3945 evaluated more than once. Front-ends must assure this case cannot
3946 happen by surrounding any such subexpressions in their own SAVE_EXPR
3947 and forcing evaluation at the proper time. */
3948 if (contains_placeholder_p (inner))
3949 return expr;
3950
3951 expr = build1_loc (EXPR_LOCATION (expr)((((expr)) && ((tree_code_type_tmpl <0>::tree_code_type
[(int) (((enum tree_code) ((expr))->base.code))]) >= tcc_reference
&& (tree_code_type_tmpl <0>::tree_code_type[(int
) (((enum tree_code) ((expr))->base.code))]) <= tcc_expression
)) ? (expr)->exp.locus : ((location_t) 0))
, SAVE_EXPR, TREE_TYPE (expr)((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3951, __FUNCTION__))->typed.type)
, expr);
3952
3953 /* This expression might be placed ahead of a jump to ensure that the
3954 value was computed on both sides of the jump. So make sure it isn't
3955 eliminated as dead. */
3956 TREE_SIDE_EFFECTS (expr)((non_type_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3956, __FUNCTION__))->base.side_effects_flag)
= 1;
3957 return expr;
3958}
3959
3960/* Look inside EXPR into any simple arithmetic operations. Return the
3961 outermost non-arithmetic or non-invariant node. */
3962
3963tree
3964skip_simple_arithmetic (tree expr)
3965{
3966 /* We don't care about whether this can be used as an lvalue in this
3967 context. */
3968 while (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == NON_LVALUE_EXPR)
3969 expr = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3969, __FUNCTION__)))))
;
3970
3971 /* If we have simple operations applied to a SAVE_EXPR or to a SAVE_EXPR and
3972 a constant, it will be more efficient to not make another SAVE_EXPR since
3973 it will allow better simplification and GCSE will be able to merge the
3974 computations if they actually occur. */
3975 while (true)
3976 {
3977 if (UNARY_CLASS_P (expr)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (expr)->base.code))] == tcc_unary)
)
3978 expr = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3978, __FUNCTION__)))))
;
3979 else if (BINARY_CLASS_P (expr)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (expr)->base.code))] == tcc_binary)
)
3980 {
3981 if (tree_invariant_p (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3981, __FUNCTION__)))))
))
3982 expr = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3982, __FUNCTION__)))))
;
3983 else if (tree_invariant_p (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3983, __FUNCTION__)))))
))
3984 expr = TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 3984, __FUNCTION__)))))
;
3985 else
3986 break;
3987 }
3988 else
3989 break;
3990 }
3991
3992 return expr;
3993}
3994
3995/* Look inside EXPR into simple arithmetic operations involving constants.
3996 Return the outermost non-arithmetic or non-constant node. */
3997
3998tree
3999skip_simple_constant_arithmetic (tree expr)
4000{
4001 while (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == NON_LVALUE_EXPR)
4002 expr = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4002, __FUNCTION__)))))
;
4003
4004 while (true)
4005 {
4006 if (UNARY_CLASS_P (expr)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (expr)->base.code))] == tcc_unary)
)
4007 expr = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4007, __FUNCTION__)))))
;
4008 else if (BINARY_CLASS_P (expr)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (expr)->base.code))] == tcc_binary)
)
4009 {
4010 if (TREE_CONSTANT (TREE_OPERAND (expr, 1))((non_type_check (((*((const_cast<tree*> (tree_operand_check
((expr), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4010, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4010, __FUNCTION__))->base.constant_flag)
)
4011 expr = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4011, __FUNCTION__)))))
;
4012 else if (TREE_CONSTANT (TREE_OPERAND (expr, 0))((non_type_check (((*((const_cast<tree*> (tree_operand_check
((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4012, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4012, __FUNCTION__))->base.constant_flag)
)
4013 expr = TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4013, __FUNCTION__)))))
;
4014 else
4015 break;
4016 }
4017 else
4018 break;
4019 }
4020
4021 return expr;
4022}
4023
4024/* Return which tree structure is used by T. */
4025
4026enum tree_node_structure_enum
4027tree_node_structure (const_tree t)
4028{
4029 const enum tree_code code = TREE_CODE (t)((enum tree_code) (t)->base.code);
4030 return tree_node_structure_for_code (code);
4031}
4032
4033/* Set various status flags when building a CALL_EXPR object T. */
4034
4035static void
4036process_call_operands (tree t)
4037{
4038 bool side_effects = TREE_SIDE_EFFECTS (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4038, __FUNCTION__))->base.side_effects_flag)
;
4039 bool read_only = false;
4040 int i = call_expr_flags (t);
4041
4042 /* Calls have side-effects, except those to const or pure functions. */
4043 if ((i & ECF_LOOPING_CONST_OR_PURE(1 << 2)) || !(i & (ECF_CONST(1 << 0) | ECF_PURE(1 << 1))))
4044 side_effects = true;
4045 /* Propagate TREE_READONLY of arguments for const functions. */
4046 if (i & ECF_CONST(1 << 0))
4047 read_only = true;
4048
4049 if (!side_effects || read_only)
4050 for (i = 1; i < TREE_OPERAND_LENGTH (t)tree_operand_length (t); i++)
4051 {
4052 tree op = TREE_OPERAND (t, i)(*((const_cast<tree*> (tree_operand_check ((t), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4052, __FUNCTION__)))))
;
4053 if (op && TREE_SIDE_EFFECTS (op)((non_type_check ((op), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4053, __FUNCTION__))->base.side_effects_flag)
)
4054 side_effects = true;
4055 if (op && !TREE_READONLY (op)((non_type_check ((op), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4055, __FUNCTION__))->base.readonly_flag)
&& !CONSTANT_CLASS_P (op)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (op)->base.code))] == tcc_constant)
)
4056 read_only = false;
4057 }
4058
4059 TREE_SIDE_EFFECTS (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4059, __FUNCTION__))->base.side_effects_flag)
= side_effects;
4060 TREE_READONLY (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4060, __FUNCTION__))->base.readonly_flag)
= read_only;
4061}
4062
4063/* Return true if EXP contains a PLACEHOLDER_EXPR, i.e. if it represents a
4064 size or offset that depends on a field within a record. */
4065
4066bool
4067contains_placeholder_p (const_tree exp)
4068{
4069 enum tree_code code;
4070
4071 if (!exp)
4072 return 0;
4073
4074 code = TREE_CODE (exp)((enum tree_code) (exp)->base.code);
4075 if (code == PLACEHOLDER_EXPR)
4076 return 1;
4077
4078 switch (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)])
4079 {
4080 case tcc_reference:
4081 /* Don't look at any PLACEHOLDER_EXPRs that might be in index or bit
4082 position computations since they will be converted into a
4083 WITH_RECORD_EXPR involving the reference, which will assume
4084 here will be valid. */
4085 return CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 0))(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4085, __FUNCTION__)))))) != 0 && ! ((non_type_check
(((*((const_cast<tree*> (tree_operand_check ((exp), (0
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4085, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4085, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4085, __FUNCTION__)))))))
;
4086
4087 case tcc_exceptional:
4088 if (code == TREE_LIST)
4089 return (CONTAINS_PLACEHOLDER_P (TREE_VALUE (exp))((((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4089, __FUNCTION__, (TREE_LIST)))->list.value)) != 0 &&
! ((non_type_check ((((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4089, __FUNCTION__, (TREE_LIST)))->list.value)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4089, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
(((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4089, __FUNCTION__, (TREE_LIST)))->list.value)))
4090 || CONTAINS_PLACEHOLDER_P (TREE_CHAIN (exp))((((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4090, __FUNCTION__))->common.chain)) != 0 && ! (
(non_type_check ((((contains_struct_check ((exp), (TS_COMMON)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4090, __FUNCTION__))->common.chain)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4090, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
(((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4090, __FUNCTION__))->common.chain)))
);
4091 break;
4092
4093 case tcc_unary:
4094 case tcc_binary:
4095 case tcc_comparison:
4096 case tcc_expression:
4097 switch (code)
4098 {
4099 case COMPOUND_EXPR:
4100 /* Ignoring the first operand isn't quite right, but works best. */
4101 return CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 1))(((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4101, __FUNCTION__)))))) != 0 && ! ((non_type_check
(((*((const_cast<tree*> (tree_operand_check ((exp), (1
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4101, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4101, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4101, __FUNCTION__)))))))
;
4102
4103 case COND_EXPR:
4104 return (CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 0))(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4104, __FUNCTION__)))))) != 0 && ! ((non_type_check
(((*((const_cast<tree*> (tree_operand_check ((exp), (0
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4104, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4104, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4104, __FUNCTION__)))))))
4105 || CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 1))(((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4105, __FUNCTION__)))))) != 0 && ! ((non_type_check
(((*((const_cast<tree*> (tree_operand_check ((exp), (1
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4105, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4105, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4105, __FUNCTION__)))))))
4106 || CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 2))(((*((const_cast<tree*> (tree_operand_check ((exp), (2)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4106, __FUNCTION__)))))) != 0 && ! ((non_type_check
(((*((const_cast<tree*> (tree_operand_check ((exp), (2
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4106, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4106, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
((*((const_cast<tree*> (tree_operand_check ((exp), (2)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4106, __FUNCTION__)))))))
);
4107
4108 case SAVE_EXPR:
4109 /* The save_expr function never wraps anything containing
4110 a PLACEHOLDER_EXPR. */
4111 return 0;
4112
4113 default:
4114 break;
4115 }
4116
4117 switch (TREE_CODE_LENGTH (code)tree_code_length_tmpl <0>::tree_code_length[(int) (code
)]
)
4118 {
4119 case 1:
4120 return CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 0))(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4120, __FUNCTION__)))))) != 0 && ! ((non_type_check
(((*((const_cast<tree*> (tree_operand_check ((exp), (0
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4120, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4120, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4120, __FUNCTION__)))))))
;
4121 case 2:
4122 return (CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 0))(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4122, __FUNCTION__)))))) != 0 && ! ((non_type_check
(((*((const_cast<tree*> (tree_operand_check ((exp), (0
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4122, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4122, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4122, __FUNCTION__)))))))
4123 || CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 1))(((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4123, __FUNCTION__)))))) != 0 && ! ((non_type_check
(((*((const_cast<tree*> (tree_operand_check ((exp), (1
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4123, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4123, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4123, __FUNCTION__)))))))
);
4124 default:
4125 return 0;
4126 }
4127
4128 case tcc_vl_exp:
4129 switch (code)
4130 {
4131 case CALL_EXPR:
4132 {
4133 const_tree arg;
4134 const_call_expr_arg_iterator iter;
4135 FOR_EACH_CONST_CALL_EXPR_ARG (arg, iter, exp)for ((arg) = first_const_call_expr_arg ((exp), &(iter)); (
arg); (arg) = next_const_call_expr_arg (&(iter)))
4136 if (CONTAINS_PLACEHOLDER_P (arg)((arg) != 0 && ! ((non_type_check ((arg), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4136, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
(arg))
)
4137 return 1;
4138 return 0;
4139 }
4140 default:
4141 return 0;
4142 }
4143
4144 default:
4145 return 0;
4146 }
4147 return 0;
4148}
4149
4150/* Return true if any part of the structure of TYPE involves a PLACEHOLDER_EXPR
4151 directly. This includes size, bounds, qualifiers (for QUAL_UNION_TYPE) and
4152 field positions. */
4153
4154static bool
4155type_contains_placeholder_1 (const_tree type)
4156{
4157 /* If the size contains a placeholder or the parent type (component type in
4158 the case of arrays) type involves a placeholder, this type does. */
4159 if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (type))((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4159, __FUNCTION__))->type_common.size)) != 0 &&
! ((non_type_check ((((tree_class_check ((type), (tcc_type),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4159, __FUNCTION__))->type_common.size)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4159, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
(((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4159, __FUNCTION__))->type_common.size)))
4160 || CONTAINS_PLACEHOLDER_P (TYPE_SIZE_UNIT (type))((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4160, __FUNCTION__))->type_common.size_unit)) != 0 &&
! ((non_type_check ((((tree_class_check ((type), (tcc_type),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4160, __FUNCTION__))->type_common.size_unit)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4160, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
(((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4160, __FUNCTION__))->type_common.size_unit)))
4161 || (!POINTER_TYPE_P (type)(((enum tree_code) (type)->base.code) == POINTER_TYPE || (
(enum tree_code) (type)->base.code) == REFERENCE_TYPE)
4162 && TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4162, __FUNCTION__))->typed.type)
4163 && type_contains_placeholder_p (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4163, __FUNCTION__))->typed.type)
)))
4164 return true;
4165
4166 /* Now do type-specific checks. Note that the last part of the check above
4167 greatly limits what we have to do below. */
4168 switch (TREE_CODE (type)((enum tree_code) (type)->base.code))
4169 {
4170 case VOID_TYPE:
4171 case OPAQUE_TYPE:
4172 case COMPLEX_TYPE:
4173 case ENUMERAL_TYPE:
4174 case BOOLEAN_TYPE:
4175 case POINTER_TYPE:
4176 case OFFSET_TYPE:
4177 case REFERENCE_TYPE:
4178 case METHOD_TYPE:
4179 case FUNCTION_TYPE:
4180 case VECTOR_TYPE:
4181 case NULLPTR_TYPE:
4182 return false;
4183
4184 case INTEGER_TYPE:
4185 case REAL_TYPE:
4186 case FIXED_POINT_TYPE:
4187 /* Here we just check the bounds. */
4188 return (CONTAINS_PLACEHOLDER_P (TYPE_MIN_VALUE (type))((((tree_check5 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4188, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE
), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.minval
)) != 0 && ! ((non_type_check ((((tree_check5 ((type)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4188, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE
), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.minval
)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4188, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
(((tree_check5 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4188, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE
), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.minval
)))
4189 || CONTAINS_PLACEHOLDER_P (TYPE_MAX_VALUE (type))((((tree_check5 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4189, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE
), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.maxval
)) != 0 && ! ((non_type_check ((((tree_check5 ((type)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4189, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE
), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.maxval
)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4189, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
(((tree_check5 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4189, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE
), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.maxval
)))
);
4190
4191 case ARRAY_TYPE:
4192 /* We have already checked the component type above, so just check
4193 the domain type. Flexible array members have a null domain. */
4194 return TYPE_DOMAIN (type)((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4194, __FUNCTION__, (ARRAY_TYPE)))->type_non_common.values
)
?
4195 type_contains_placeholder_p (TYPE_DOMAIN (type)((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4195, __FUNCTION__, (ARRAY_TYPE)))->type_non_common.values
)
) : false;
4196
4197 case RECORD_TYPE:
4198 case UNION_TYPE:
4199 case QUAL_UNION_TYPE:
4200 {
4201 tree field;
4202
4203 for (field = TYPE_FIELDS (type)((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4203, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE
)))->type_non_common.values)
; field; field = DECL_CHAIN (field)(((contains_struct_check (((contains_struct_check ((field), (
TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4203, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4203, __FUNCTION__))->common.chain))
)
4204 if (TREE_CODE (field)((enum tree_code) (field)->base.code) == FIELD_DECL
4205 && (CONTAINS_PLACEHOLDER_P (DECL_FIELD_OFFSET (field))((((tree_check ((field), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4205, __FUNCTION__, (FIELD_DECL)))->field_decl.offset)) !=
0 && ! ((non_type_check ((((tree_check ((field), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4205, __FUNCTION__, (FIELD_DECL)))->field_decl.offset)),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4205, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
(((tree_check ((field), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4205, __FUNCTION__, (FIELD_DECL)))->field_decl.offset)))
4206 || (TREE_CODE (type)((enum tree_code) (type)->base.code) == QUAL_UNION_TYPE
4207 && CONTAINS_PLACEHOLDER_P (DECL_QUALIFIER (field))((((tree_check ((field), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4207, __FUNCTION__, (FIELD_DECL)))->field_decl.qualifier
)) != 0 && ! ((non_type_check ((((tree_check ((field)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4207, __FUNCTION__, (FIELD_DECL)))->field_decl.qualifier
)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4207, __FUNCTION__))->base.constant_flag) && contains_placeholder_p
(((tree_check ((field), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4207, __FUNCTION__, (FIELD_DECL)))->field_decl.qualifier
)))
)
4208 || type_contains_placeholder_p (TREE_TYPE (field)((contains_struct_check ((field), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4208, __FUNCTION__))->typed.type)
)))
4209 return true;
4210
4211 return false;
4212 }
4213
4214 default:
4215 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4215, __FUNCTION__))
;
4216 }
4217}
4218
4219/* Wrapper around above function used to cache its result. */
4220
4221bool
4222type_contains_placeholder_p (tree type)
4223{
4224 bool result;
4225
4226 /* If the contains_placeholder_bits field has been initialized,
4227 then we know the answer. */
4228 if (TYPE_CONTAINS_PLACEHOLDER_INTERNAL (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4228, __FUNCTION__))->type_common.contains_placeholder_bits
)
> 0)
4229 return TYPE_CONTAINS_PLACEHOLDER_INTERNAL (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4229, __FUNCTION__))->type_common.contains_placeholder_bits
)
- 1;
4230
4231 /* Indicate that we've seen this type node, and the answer is false.
4232 This is what we want to return if we run into recursion via fields. */
4233 TYPE_CONTAINS_PLACEHOLDER_INTERNAL (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4233, __FUNCTION__))->type_common.contains_placeholder_bits
)
= 1;
4234
4235 /* Compute the real value. */
4236 result = type_contains_placeholder_1 (type);
4237
4238 /* Store the real value. */
4239 TYPE_CONTAINS_PLACEHOLDER_INTERNAL (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4239, __FUNCTION__))->type_common.contains_placeholder_bits
)
= result + 1;
4240
4241 return result;
4242}
4243
4244/* Push tree EXP onto vector QUEUE if it is not already present. */
4245
4246static void
4247push_without_duplicates (tree exp, vec<tree> *queue)
4248{
4249 unsigned int i;
4250 tree iter;
4251
4252 FOR_EACH_VEC_ELT (*queue, i, iter)for (i = 0; (*queue).iterate ((i), &(iter)); ++(i))
4253 if (simple_cst_equal (iter, exp) == 1)
4254 break;
4255
4256 if (!iter)
4257 queue->safe_push (exp);
4258}
4259
4260/* Given a tree EXP, find all occurrences of references to fields
4261 in a PLACEHOLDER_EXPR and place them in vector REFS without
4262 duplicates. Also record VAR_DECLs and CONST_DECLs. Note that
4263 we assume here that EXP contains only arithmetic expressions
4264 or CALL_EXPRs with PLACEHOLDER_EXPRs occurring only in their
4265 argument list. */
4266
4267void
4268find_placeholder_in_expr (tree exp, vec<tree> *refs)
4269{
4270 enum tree_code code = TREE_CODE (exp)((enum tree_code) (exp)->base.code);
4271 tree inner;
4272 int i;
4273
4274 /* We handle TREE_LIST and COMPONENT_REF separately. */
4275 if (code == TREE_LIST)
4276 {
4277 FIND_PLACEHOLDER_IN_EXPR (TREE_CHAIN (exp), refs)do { if((((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4277, __FUNCTION__))->common.chain)) && !((non_type_check
((((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4277, __FUNCTION__))->common.chain)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4277, __FUNCTION__))->base.constant_flag)) find_placeholder_in_expr
(((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4277, __FUNCTION__))->common.chain), refs); } while (0)
;
4278 FIND_PLACEHOLDER_IN_EXPR (TREE_VALUE (exp), refs)do { if((((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4278, __FUNCTION__, (TREE_LIST)))->list.value)) &&
!((non_type_check ((((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4278, __FUNCTION__, (TREE_LIST)))->list.value)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4278, __FUNCTION__))->base.constant_flag)) find_placeholder_in_expr
(((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4278, __FUNCTION__, (TREE_LIST)))->list.value), refs); }
while (0)
;
4279 }
4280 else if (code == COMPONENT_REF)
4281 {
4282 for (inner = TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4282, __FUNCTION__)))))
;
4283 REFERENCE_CLASS_P (inner)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (inner)->base.code))] == tcc_reference)
;
4284 inner = TREE_OPERAND (inner, 0)(*((const_cast<tree*> (tree_operand_check ((inner), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4284, __FUNCTION__)))))
)
4285 ;
4286
4287 if (TREE_CODE (inner)((enum tree_code) (inner)->base.code) == PLACEHOLDER_EXPR)
4288 push_without_duplicates (exp, refs);
4289 else
4290 FIND_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 0), refs)do { if(((*((const_cast<tree*> (tree_operand_check ((exp
), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4290, __FUNCTION__)))))) && !((non_type_check (((*(
(const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4290, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4290, __FUNCTION__))->base.constant_flag)) find_placeholder_in_expr
((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4290, __FUNCTION__))))), refs); } while (0)
;
4291 }
4292 else
4293 switch (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)])
4294 {
4295 case tcc_constant:
4296 break;
4297
4298 case tcc_declaration:
4299 /* Variables allocated to static storage can stay. */
4300 if (!TREE_STATIC (exp)((exp)->base.static_flag))
4301 push_without_duplicates (exp, refs);
4302 break;
4303
4304 case tcc_expression:
4305 /* This is the pattern built in ada/make_aligning_type. */
4306 if (code == ADDR_EXPR
4307 && TREE_CODE (TREE_OPERAND (exp, 0))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check
((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4307, __FUNCTION__))))))->base.code)
== PLACEHOLDER_EXPR)
4308 {
4309 push_without_duplicates (exp, refs);
4310 break;
4311 }
4312
4313 /* Fall through. */
4314
4315 case tcc_exceptional:
4316 case tcc_unary:
4317 case tcc_binary:
4318 case tcc_comparison:
4319 case tcc_reference:
4320 for (i = 0; i < TREE_CODE_LENGTH (code)tree_code_length_tmpl <0>::tree_code_length[(int) (code
)]
; i++)
4321 FIND_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, i), refs)do { if(((*((const_cast<tree*> (tree_operand_check ((exp
), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4321, __FUNCTION__)))))) && !((non_type_check (((*(
(const_cast<tree*> (tree_operand_check ((exp), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4321, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4321, __FUNCTION__))->base.constant_flag)) find_placeholder_in_expr
((*((const_cast<tree*> (tree_operand_check ((exp), (i)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4321, __FUNCTION__))))), refs); } while (0)
;
4322 break;
4323
4324 case tcc_vl_exp:
4325 for (i = 1; i < TREE_OPERAND_LENGTH (exp)tree_operand_length (exp); i++)
4326 FIND_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, i), refs)do { if(((*((const_cast<tree*> (tree_operand_check ((exp
), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4326, __FUNCTION__)))))) && !((non_type_check (((*(
(const_cast<tree*> (tree_operand_check ((exp), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4326, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4326, __FUNCTION__))->base.constant_flag)) find_placeholder_in_expr
((*((const_cast<tree*> (tree_operand_check ((exp), (i)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4326, __FUNCTION__))))), refs); } while (0)
;
4327 break;
4328
4329 default:
4330 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4330, __FUNCTION__))
;
4331 }
4332}
4333
4334/* Given a tree EXP, a FIELD_DECL F, and a replacement value R,
4335 return a tree with all occurrences of references to F in a
4336 PLACEHOLDER_EXPR replaced by R. Also handle VAR_DECLs and
4337 CONST_DECLs. Note that we assume here that EXP contains only
4338 arithmetic expressions or CALL_EXPRs with PLACEHOLDER_EXPRs
4339 occurring only in their argument list. */
4340
4341tree
4342substitute_in_expr (tree exp, tree f, tree r)
4343{
4344 enum tree_code code = TREE_CODE (exp)((enum tree_code) (exp)->base.code);
4345 tree op0, op1, op2, op3;
4346 tree new_tree;
4347
4348 /* We handle TREE_LIST and COMPONENT_REF separately. */
4349 if (code == TREE_LIST)
4350 {
4351 op0 = SUBSTITUTE_IN_EXPR (TREE_CHAIN (exp), f, r)((((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4351, __FUNCTION__))->common.chain)) == 0 || ((non_type_check
((((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4351, __FUNCTION__))->common.chain)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4351, __FUNCTION__))->base.constant_flag) ? (((contains_struct_check
((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4351, __FUNCTION__))->common.chain)) : substitute_in_expr
(((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4351, __FUNCTION__))->common.chain), f, r))
;
4352 op1 = SUBSTITUTE_IN_EXPR (TREE_VALUE (exp), f, r)((((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4352, __FUNCTION__, (TREE_LIST)))->list.value)) == 0 || (
(non_type_check ((((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4352, __FUNCTION__, (TREE_LIST)))->list.value)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4352, __FUNCTION__))->base.constant_flag) ? (((tree_check
((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4352, __FUNCTION__, (TREE_LIST)))->list.value)) : substitute_in_expr
(((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4352, __FUNCTION__, (TREE_LIST)))->list.value), f, r))
;
4353 if (op0 == TREE_CHAIN (exp)((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4353, __FUNCTION__))->common.chain)
&& op1 == TREE_VALUE (exp)((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4353, __FUNCTION__, (TREE_LIST)))->list.value)
)
4354 return exp;
4355
4356 return tree_cons (TREE_PURPOSE (exp)((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4356, __FUNCTION__, (TREE_LIST)))->list.purpose)
, op1, op0);
4357 }
4358 else if (code == COMPONENT_REF)
4359 {
4360 tree inner;
4361
4362 /* If this expression is getting a value from a PLACEHOLDER_EXPR
4363 and it is the right field, replace it with R. */
4364 for (inner = TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4364, __FUNCTION__)))))
;
4365 REFERENCE_CLASS_P (inner)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (inner)->base.code))] == tcc_reference)
;
4366 inner = TREE_OPERAND (inner, 0)(*((const_cast<tree*> (tree_operand_check ((inner), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4366, __FUNCTION__)))))
)
4367 ;
4368
4369 /* The field. */
4370 op1 = TREE_OPERAND (exp, 1)(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4370, __FUNCTION__)))))
;
4371
4372 if (TREE_CODE (inner)((enum tree_code) (inner)->base.code) == PLACEHOLDER_EXPR && op1 == f)
4373 return r;
4374
4375 /* If this expression hasn't been completed let, leave it alone. */
4376 if (TREE_CODE (inner)((enum tree_code) (inner)->base.code) == PLACEHOLDER_EXPR && !TREE_TYPE (inner)((contains_struct_check ((inner), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4376, __FUNCTION__))->typed.type)
)
4377 return exp;
4378
4379 op0 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 0), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4379, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4379, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4379, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4379, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4379, __FUNCTION__))))), f, r))
;
4380 if (op0 == TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4380, __FUNCTION__)))))
)
4381 return exp;
4382
4383 new_tree
4384 = fold_build3 (COMPONENT_REF, TREE_TYPE (exp), op0, op1, NULL_TREE)fold_build3_loc (((location_t) 0), COMPONENT_REF, ((contains_struct_check
((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4384, __FUNCTION__))->typed.type), op0, op1, (tree) nullptr
)
;
4385 }
4386 else
4387 switch (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)])
4388 {
4389 case tcc_constant:
4390 return exp;
4391
4392 case tcc_declaration:
4393 if (exp == f)
4394 return r;
4395 else
4396 return exp;
4397
4398 case tcc_expression:
4399 if (exp == f)
4400 return r;
4401
4402 /* Fall through. */
4403
4404 case tcc_exceptional:
4405 case tcc_unary:
4406 case tcc_binary:
4407 case tcc_comparison:
4408 case tcc_reference:
4409 switch (TREE_CODE_LENGTH (code)tree_code_length_tmpl <0>::tree_code_length[(int) (code
)]
)
4410 {
4411 case 0:
4412 return exp;
4413
4414 case 1:
4415 op0 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 0), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4415, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4415, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4415, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4415, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4415, __FUNCTION__))))), f, r))
;
4416 if (op0 == TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4416, __FUNCTION__)))))
)
4417 return exp;
4418
4419 new_tree = fold_build1 (code, TREE_TYPE (exp), op0)fold_build1_loc (((location_t) 0), code, ((contains_struct_check
((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4419, __FUNCTION__))->typed.type), op0 )
;
4420 break;
4421
4422 case 2:
4423 op0 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 0), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4423, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4423, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4423, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4423, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4423, __FUNCTION__))))), f, r))
;
4424 op1 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 1), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4424, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4424, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4424, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4424, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4424, __FUNCTION__))))), f, r))
;
4425
4426 if (op0 == TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4426, __FUNCTION__)))))
&& op1 == TREE_OPERAND (exp, 1)(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4426, __FUNCTION__)))))
)
4427 return exp;
4428
4429 new_tree = fold_build2 (code, TREE_TYPE (exp), op0, op1)fold_build2_loc (((location_t) 0), code, ((contains_struct_check
((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4429, __FUNCTION__))->typed.type), op0, op1 )
;
4430 break;
4431
4432 case 3:
4433 op0 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 0), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4433, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4433, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4433, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4433, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4433, __FUNCTION__))))), f, r))
;
4434 op1 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 1), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4434, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4434, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4434, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4434, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4434, __FUNCTION__))))), f, r))
;
4435 op2 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 2), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (2)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4435, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4435, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4435, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4435, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4435, __FUNCTION__))))), f, r))
;
4436
4437 if (op0 == TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4437, __FUNCTION__)))))
&& op1 == TREE_OPERAND (exp, 1)(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4437, __FUNCTION__)))))
4438 && op2 == TREE_OPERAND (exp, 2)(*((const_cast<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4438, __FUNCTION__)))))
)
4439 return exp;
4440
4441 new_tree = fold_build3 (code, TREE_TYPE (exp), op0, op1, op2)fold_build3_loc (((location_t) 0), code, ((contains_struct_check
((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4441, __FUNCTION__))->typed.type), op0, op1, op2 )
;
4442 break;
4443
4444 case 4:
4445 op0 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 0), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4445, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4445, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4445, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4445, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4445, __FUNCTION__))))), f, r))
;
4446 op1 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 1), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4446, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4446, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4446, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4446, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4446, __FUNCTION__))))), f, r))
;
4447 op2 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 2), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (2)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4447, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4447, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4447, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4447, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4447, __FUNCTION__))))), f, r))
;
4448 op3 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 3), f, r)(((*((const_cast<tree*> (tree_operand_check ((exp), (3)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4448, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4448, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4448, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4448, __FUNCTION__)))))) : substitute_in_expr ((*((const_cast
<tree*> (tree_operand_check ((exp), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4448, __FUNCTION__))))), f, r))
;
4449
4450 if (op0 == TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4450, __FUNCTION__)))))
&& op1 == TREE_OPERAND (exp, 1)(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4450, __FUNCTION__)))))
4451 && op2 == TREE_OPERAND (exp, 2)(*((const_cast<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4451, __FUNCTION__)))))
4452 && op3 == TREE_OPERAND (exp, 3)(*((const_cast<tree*> (tree_operand_check ((exp), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4452, __FUNCTION__)))))
)
4453 return exp;
4454
4455 new_tree
4456 = fold (build4 (code, TREE_TYPE (exp)((contains_struct_check ((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4456, __FUNCTION__))->typed.type)
, op0, op1, op2, op3));
4457 break;
4458
4459 default:
4460 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4460, __FUNCTION__))
;
4461 }
4462 break;
4463
4464 case tcc_vl_exp:
4465 {
4466 int i;
4467
4468 new_tree = NULL_TREE(tree) nullptr;
4469
4470 /* If we are trying to replace F with a constant or with another
4471 instance of one of the arguments of the call, inline back
4472 functions which do nothing else than computing a value from
4473 the arguments they are passed. This makes it possible to
4474 fold partially or entirely the replacement expression. */
4475 if (code == CALL_EXPR)
4476 {
4477 bool maybe_inline = false;
4478 if (CONSTANT_CLASS_P (r)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (r)->base.code))] == tcc_constant)
)
4479 maybe_inline = true;
4480 else
4481 for (i = 3; i < TREE_OPERAND_LENGTH (exp)tree_operand_length (exp); i++)
4482 if (operand_equal_p (TREE_OPERAND (exp, i)(*((const_cast<tree*> (tree_operand_check ((exp), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4482, __FUNCTION__)))))
, r, 0))
4483 {
4484 maybe_inline = true;
4485 break;
4486 }
4487 if (maybe_inline)
4488 {
4489 tree t = maybe_inline_call_in_expr (exp);
4490 if (t)
4491 return SUBSTITUTE_IN_EXPR (t, f, r)((t) == 0 || ((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4491, __FUNCTION__))->base.constant_flag) ? (t) : substitute_in_expr
(t, f, r))
;
4492 }
4493 }
4494
4495 for (i = 1; i < TREE_OPERAND_LENGTH (exp)tree_operand_length (exp); i++)
4496 {
4497 tree op = TREE_OPERAND (exp, i)(*((const_cast<tree*> (tree_operand_check ((exp), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4497, __FUNCTION__)))))
;
4498 tree new_op = SUBSTITUTE_IN_EXPR (op, f, r)((op) == 0 || ((non_type_check ((op), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4498, __FUNCTION__))->base.constant_flag) ? (op) : substitute_in_expr
(op, f, r))
;
4499 if (new_op != op)
4500 {
4501 if (!new_tree)
4502 new_tree = copy_node (exp);
4503 TREE_OPERAND (new_tree, i)(*((const_cast<tree*> (tree_operand_check ((new_tree), (
i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4503, __FUNCTION__)))))
= new_op;
4504 }
4505 }
4506
4507 if (new_tree)
4508 {
4509 new_tree = fold (new_tree);
4510 if (TREE_CODE (new_tree)((enum tree_code) (new_tree)->base.code) == CALL_EXPR)
4511 process_call_operands (new_tree);
4512 }
4513 else
4514 return exp;
4515 }
4516 break;
4517
4518 default:
4519 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4519, __FUNCTION__))
;
4520 }
4521
4522 TREE_READONLY (new_tree)((non_type_check ((new_tree), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4522, __FUNCTION__))->base.readonly_flag)
|= TREE_READONLY (exp)((non_type_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4522, __FUNCTION__))->base.readonly_flag)
;
4523
4524 if (code == INDIRECT_REF || code == ARRAY_REF || code == ARRAY_RANGE_REF)
4525 TREE_THIS_NOTRAP (new_tree)((tree_check5 ((new_tree), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4525, __FUNCTION__, (INDIRECT_REF), (MEM_REF), (TARGET_MEM_REF
), (ARRAY_REF), (ARRAY_RANGE_REF)))->base.nothrow_flag)
|= TREE_THIS_NOTRAP (exp)((tree_check5 ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4525, __FUNCTION__, (INDIRECT_REF), (MEM_REF), (TARGET_MEM_REF
), (ARRAY_REF), (ARRAY_RANGE_REF)))->base.nothrow_flag)
;
4526
4527 return new_tree;
4528}
4529
4530/* Similar, but look for a PLACEHOLDER_EXPR in EXP and find a replacement
4531 for it within OBJ, a tree that is an object or a chain of references. */
4532
4533tree
4534substitute_placeholder_in_expr (tree exp, tree obj)
4535{
4536 enum tree_code code = TREE_CODE (exp)((enum tree_code) (exp)->base.code);
4537 tree op0, op1, op2, op3;
4538 tree new_tree;
4539
4540 /* If this is a PLACEHOLDER_EXPR, see if we find a corresponding type
4541 in the chain of OBJ. */
4542 if (code == PLACEHOLDER_EXPR)
4543 {
4544 tree need_type = TYPE_MAIN_VARIANT (TREE_TYPE (exp))((tree_class_check ((((contains_struct_check ((exp), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4544, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4544, __FUNCTION__))->type_common.main_variant)
;
4545 tree elt;
4546
4547 for (elt = obj; elt != 0;
4548 elt = ((TREE_CODE (elt)((enum tree_code) (elt)->base.code) == COMPOUND_EXPR
4549 || TREE_CODE (elt)((enum tree_code) (elt)->base.code) == COND_EXPR)
4550 ? TREE_OPERAND (elt, 1)(*((const_cast<tree*> (tree_operand_check ((elt), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4550, __FUNCTION__)))))
4551 : (REFERENCE_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (elt)->base.code))] == tcc_reference)
4552 || UNARY_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (elt)->base.code))] == tcc_unary)
4553 || BINARY_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (elt)->base.code))] == tcc_binary)
4554 || VL_EXP_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (elt)->base.code))] == tcc_vl_exp)
4555 || EXPRESSION_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (elt)->base.code))] == tcc_expression)
)
4556 ? TREE_OPERAND (elt, 0)(*((const_cast<tree*> (tree_operand_check ((elt), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4556, __FUNCTION__)))))
: 0))
4557 if (TYPE_MAIN_VARIANT (TREE_TYPE (elt))((tree_class_check ((((contains_struct_check ((elt), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4557, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4557, __FUNCTION__))->type_common.main_variant)
== need_type)
4558 return elt;
4559
4560 for (elt = obj; elt != 0;
4561 elt = ((TREE_CODE (elt)((enum tree_code) (elt)->base.code) == COMPOUND_EXPR
4562 || TREE_CODE (elt)((enum tree_code) (elt)->base.code) == COND_EXPR)
4563 ? TREE_OPERAND (elt, 1)(*((const_cast<tree*> (tree_operand_check ((elt), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4563, __FUNCTION__)))))
4564 : (REFERENCE_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (elt)->base.code))] == tcc_reference)
4565 || UNARY_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (elt)->base.code))] == tcc_unary)
4566 || BINARY_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (elt)->base.code))] == tcc_binary)
4567 || VL_EXP_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (elt)->base.code))] == tcc_vl_exp)
4568 || EXPRESSION_CLASS_P (elt)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (elt)->base.code))] == tcc_expression)
)
4569 ? TREE_OPERAND (elt, 0)(*((const_cast<tree*> (tree_operand_check ((elt), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4569, __FUNCTION__)))))
: 0))
4570 if (POINTER_TYPE_P (TREE_TYPE (elt))(((enum tree_code) (((contains_struct_check ((elt), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4570, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE
|| ((enum tree_code) (((contains_struct_check ((elt), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4570, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE
)
4571 && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (elt)))((tree_class_check ((((contains_struct_check ((((contains_struct_check
((elt), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4571, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4571, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4571, __FUNCTION__))->type_common.main_variant)
4572 == need_type))
4573 return fold_build1 (INDIRECT_REF, need_type, elt)fold_build1_loc (((location_t) 0), INDIRECT_REF, need_type, elt
)
;
4574
4575 /* If we didn't find it, return the original PLACEHOLDER_EXPR. If it
4576 survives until RTL generation, there will be an error. */
4577 return exp;
4578 }
4579
4580 /* TREE_LIST is special because we need to look at TREE_VALUE
4581 and TREE_CHAIN, not TREE_OPERANDS. */
4582 else if (code == TREE_LIST)
4583 {
4584 op0 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_CHAIN (exp), obj)((((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4584, __FUNCTION__))->common.chain)) == 0 || ((non_type_check
((((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4584, __FUNCTION__))->common.chain)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4584, __FUNCTION__))->base.constant_flag) ? (((contains_struct_check
((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4584, __FUNCTION__))->common.chain)) : substitute_placeholder_in_expr
(((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4584, __FUNCTION__))->common.chain), obj))
;
4585 op1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_VALUE (exp), obj)((((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4585, __FUNCTION__, (TREE_LIST)))->list.value)) == 0 || (
(non_type_check ((((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4585, __FUNCTION__, (TREE_LIST)))->list.value)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4585, __FUNCTION__))->base.constant_flag) ? (((tree_check
((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4585, __FUNCTION__, (TREE_LIST)))->list.value)) : substitute_placeholder_in_expr
(((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4585, __FUNCTION__, (TREE_LIST)))->list.value), obj))
;
4586 if (op0 == TREE_CHAIN (exp)((contains_struct_check ((exp), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4586, __FUNCTION__))->common.chain)
&& op1 == TREE_VALUE (exp)((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4586, __FUNCTION__, (TREE_LIST)))->list.value)
)
4587 return exp;
4588
4589 return tree_cons (TREE_PURPOSE (exp)((tree_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4589, __FUNCTION__, (TREE_LIST)))->list.purpose)
, op1, op0);
4590 }
4591 else
4592 switch (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)])
4593 {
4594 case tcc_constant:
4595 case tcc_declaration:
4596 return exp;
4597
4598 case tcc_exceptional:
4599 case tcc_unary:
4600 case tcc_binary:
4601 case tcc_comparison:
4602 case tcc_expression:
4603 case tcc_reference:
4604 case tcc_statement:
4605 switch (TREE_CODE_LENGTH (code)tree_code_length_tmpl <0>::tree_code_length[(int) (code
)]
)
4606 {
4607 case 0:
4608 return exp;
4609
4610 case 1:
4611 op0 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 0), obj)(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4611, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4611, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4611, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4611, __FUNCTION__)))))) : substitute_placeholder_in_expr (
(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4611, __FUNCTION__))))), obj))
;
4612 if (op0 == TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4612, __FUNCTION__)))))
)
4613 return exp;
4614
4615 new_tree = fold_build1 (code, TREE_TYPE (exp), op0)fold_build1_loc (((location_t) 0), code, ((contains_struct_check
((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4615, __FUNCTION__))->typed.type), op0 )
;
4616 break;
4617
4618 case 2:
4619 op0 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 0), obj)(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4619, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4619, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4619, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4619, __FUNCTION__)))))) : substitute_placeholder_in_expr (
(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4619, __FUNCTION__))))), obj))
;
4620 op1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 1), obj)(((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4620, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4620, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4620, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4620, __FUNCTION__)))))) : substitute_placeholder_in_expr (
(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4620, __FUNCTION__))))), obj))
;
4621
4622 if (op0 == TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4622, __FUNCTION__)))))
&& op1 == TREE_OPERAND (exp, 1)(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4622, __FUNCTION__)))))
)
4623 return exp;
4624
4625 new_tree = fold_build2 (code, TREE_TYPE (exp), op0, op1)fold_build2_loc (((location_t) 0), code, ((contains_struct_check
((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4625, __FUNCTION__))->typed.type), op0, op1 )
;
4626 break;
4627
4628 case 3:
4629 op0 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 0), obj)(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4629, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4629, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4629, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4629, __FUNCTION__)))))) : substitute_placeholder_in_expr (
(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4629, __FUNCTION__))))), obj))
;
4630 op1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 1), obj)(((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4630, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4630, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4630, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4630, __FUNCTION__)))))) : substitute_placeholder_in_expr (
(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4630, __FUNCTION__))))), obj))
;
4631 op2 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 2), obj)(((*((const_cast<tree*> (tree_operand_check ((exp), (2)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4631, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4631, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4631, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4631, __FUNCTION__)))))) : substitute_placeholder_in_expr (
(*((const_cast<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4631, __FUNCTION__))))), obj))
;
4632
4633 if (op0 == TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4633, __FUNCTION__)))))
&& op1 == TREE_OPERAND (exp, 1)(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4633, __FUNCTION__)))))
4634 && op2 == TREE_OPERAND (exp, 2)(*((const_cast<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4634, __FUNCTION__)))))
)
4635 return exp;
4636
4637 new_tree = fold_build3 (code, TREE_TYPE (exp), op0, op1, op2)fold_build3_loc (((location_t) 0), code, ((contains_struct_check
((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4637, __FUNCTION__))->typed.type), op0, op1, op2 )
;
4638 break;
4639
4640 case 4:
4641 op0 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 0), obj)(((*((const_cast<tree*> (tree_operand_check ((exp), (0)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4641, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4641, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4641, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4641, __FUNCTION__)))))) : substitute_placeholder_in_expr (
(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4641, __FUNCTION__))))), obj))
;
4642 op1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 1), obj)(((*((const_cast<tree*> (tree_operand_check ((exp), (1)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4642, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4642, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4642, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4642, __FUNCTION__)))))) : substitute_placeholder_in_expr (
(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4642, __FUNCTION__))))), obj))
;
4643 op2 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 2), obj)(((*((const_cast<tree*> (tree_operand_check ((exp), (2)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4643, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4643, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4643, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4643, __FUNCTION__)))))) : substitute_placeholder_in_expr (
(*((const_cast<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4643, __FUNCTION__))))), obj))
;
4644 op3 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 3), obj)(((*((const_cast<tree*> (tree_operand_check ((exp), (3)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4644, __FUNCTION__)))))) == 0 || ((non_type_check (((*((const_cast
<tree*> (tree_operand_check ((exp), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4644, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4644, __FUNCTION__))->base.constant_flag) ? ((*((const_cast
<tree*> (tree_operand_check ((exp), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4644, __FUNCTION__)))))) : substitute_placeholder_in_expr (
(*((const_cast<tree*> (tree_operand_check ((exp), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4644, __FUNCTION__))))), obj))
;
4645
4646 if (op0 == TREE_OPERAND (exp, 0)(*((const_cast<tree*> (tree_operand_check ((exp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4646, __FUNCTION__)))))
&& op1 == TREE_OPERAND (exp, 1)(*((const_cast<tree*> (tree_operand_check ((exp), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4646, __FUNCTION__)))))
4647 && op2 == TREE_OPERAND (exp, 2)(*((const_cast<tree*> (tree_operand_check ((exp), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4647, __FUNCTION__)))))
4648 && op3 == TREE_OPERAND (exp, 3)(*((const_cast<tree*> (tree_operand_check ((exp), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4648, __FUNCTION__)))))
)
4649 return exp;
4650
4651 new_tree
4652 = fold (build4 (code, TREE_TYPE (exp)((contains_struct_check ((exp), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4652, __FUNCTION__))->typed.type)
, op0, op1, op2, op3));
4653 break;
4654
4655 default:
4656 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4656, __FUNCTION__))
;
4657 }
4658 break;
4659
4660 case tcc_vl_exp:
4661 {
4662 int i;
4663
4664 new_tree = NULL_TREE(tree) nullptr;
4665
4666 for (i = 1; i < TREE_OPERAND_LENGTH (exp)tree_operand_length (exp); i++)
4667 {
4668 tree op = TREE_OPERAND (exp, i)(*((const_cast<tree*> (tree_operand_check ((exp), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4668, __FUNCTION__)))))
;
4669 tree new_op = SUBSTITUTE_PLACEHOLDER_IN_EXPR (op, obj)((op) == 0 || ((non_type_check ((op), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4669, __FUNCTION__))->base.constant_flag) ? (op) : substitute_placeholder_in_expr
(op, obj))
;
4670 if (new_op != op)
4671 {
4672 if (!new_tree)
4673 new_tree = copy_node (exp);
4674 TREE_OPERAND (new_tree, i)(*((const_cast<tree*> (tree_operand_check ((new_tree), (
i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4674, __FUNCTION__)))))
= new_op;
4675 }
4676 }
4677
4678 if (new_tree)
4679 {
4680 new_tree = fold (new_tree);
4681 if (TREE_CODE (new_tree)((enum tree_code) (new_tree)->base.code) == CALL_EXPR)
4682 process_call_operands (new_tree);
4683 }
4684 else
4685 return exp;
4686 }
4687 break;
4688
4689 default:
4690 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4690, __FUNCTION__))
;
4691 }
4692
4693 TREE_READONLY (new_tree)((non_type_check ((new_tree), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4693, __FUNCTION__))->base.readonly_flag)
|= TREE_READONLY (exp)((non_type_check ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4693, __FUNCTION__))->base.readonly_flag)
;
4694
4695 if (code == INDIRECT_REF || code == ARRAY_REF || code == ARRAY_RANGE_REF)
4696 TREE_THIS_NOTRAP (new_tree)((tree_check5 ((new_tree), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4696, __FUNCTION__, (INDIRECT_REF), (MEM_REF), (TARGET_MEM_REF
), (ARRAY_REF), (ARRAY_RANGE_REF)))->base.nothrow_flag)
|= TREE_THIS_NOTRAP (exp)((tree_check5 ((exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4696, __FUNCTION__, (INDIRECT_REF), (MEM_REF), (TARGET_MEM_REF
), (ARRAY_REF), (ARRAY_RANGE_REF)))->base.nothrow_flag)
;
4697
4698 return new_tree;
4699}
4700
4701
4702/* Subroutine of stabilize_reference; this is called for subtrees of
4703 references. Any expression with side-effects must be put in a SAVE_EXPR
4704 to ensure that it is only evaluated once.
4705
4706 We don't put SAVE_EXPR nodes around everything, because assigning very
4707 simple expressions to temporaries causes us to miss good opportunities
4708 for optimizations. Among other things, the opportunity to fold in the
4709 addition of a constant into an addressing mode often gets lost, e.g.
4710 "y[i+1] += x;". In general, we take the approach that we should not make
4711 an assignment unless we are forced into it - i.e., that any non-side effect
4712 operator should be allowed, and that cse should take care of coalescing
4713 multiple utterances of the same expression should that prove fruitful. */
4714
4715static tree
4716stabilize_reference_1 (tree e)
4717{
4718 tree result;
4719 enum tree_code code = TREE_CODE (e)((enum tree_code) (e)->base.code);
4720
4721 /* We cannot ignore const expressions because it might be a reference
4722 to a const array but whose index contains side-effects. But we can
4723 ignore things that are actual constant or that already have been
4724 handled by this function. */
4725
4726 if (tree_invariant_p (e))
4727 return e;
4728
4729 switch (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)])
4730 {
4731 case tcc_exceptional:
4732 /* Always wrap STATEMENT_LIST into SAVE_EXPR, even if it doesn't
4733 have side-effects. */
4734 if (code == STATEMENT_LIST)
4735 return save_expr (e);
4736 /* FALLTHRU */
4737 case tcc_type:
4738 case tcc_declaration:
4739 case tcc_comparison:
4740 case tcc_statement:
4741 case tcc_expression:
4742 case tcc_reference:
4743 case tcc_vl_exp:
4744 /* If the expression has side-effects, then encase it in a SAVE_EXPR
4745 so that it will only be evaluated once. */
4746 /* The reference (r) and comparison (<) classes could be handled as
4747 below, but it is generally faster to only evaluate them once. */
4748 if (TREE_SIDE_EFFECTS (e)((non_type_check ((e), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4748, __FUNCTION__))->base.side_effects_flag)
)
4749 return save_expr (e);
4750 return e;
4751
4752 case tcc_constant:
4753 /* Constants need no processing. In fact, we should never reach
4754 here. */
4755 return e;
4756
4757 case tcc_binary:
4758 /* Division is slow and tends to be compiled with jumps,
4759 especially the division by powers of 2 that is often
4760 found inside of an array reference. So do it just once. */
4761 if (code == TRUNC_DIV_EXPR || code == TRUNC_MOD_EXPR
4762 || code == FLOOR_DIV_EXPR || code == FLOOR_MOD_EXPR
4763 || code == CEIL_DIV_EXPR || code == CEIL_MOD_EXPR
4764 || code == ROUND_DIV_EXPR || code == ROUND_MOD_EXPR)
4765 return save_expr (e);
4766 /* Recursively stabilize each operand. */
4767 result = build_nt (code, stabilize_reference_1 (TREE_OPERAND (e, 0)(*((const_cast<tree*> (tree_operand_check ((e), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4767, __FUNCTION__)))))
),
4768 stabilize_reference_1 (TREE_OPERAND (e, 1)(*((const_cast<tree*> (tree_operand_check ((e), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4768, __FUNCTION__)))))
));
4769 break;
4770
4771 case tcc_unary:
4772 /* Recursively stabilize each operand. */
4773 result = build_nt (code, stabilize_reference_1 (TREE_OPERAND (e, 0)(*((const_cast<tree*> (tree_operand_check ((e), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4773, __FUNCTION__)))))
));
4774 break;
4775
4776 default:
4777 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4777, __FUNCTION__))
;
4778 }
4779
4780 TREE_TYPE (result)((contains_struct_check ((result), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4780, __FUNCTION__))->typed.type)
= TREE_TYPE (e)((contains_struct_check ((e), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4780, __FUNCTION__))->typed.type)
;
4781 TREE_READONLY (result)((non_type_check ((result), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4781, __FUNCTION__))->base.readonly_flag)
= TREE_READONLY (e)((non_type_check ((e), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4781, __FUNCTION__))->base.readonly_flag)
;
4782 TREE_SIDE_EFFECTS (result)((non_type_check ((result), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4782, __FUNCTION__))->base.side_effects_flag)
= TREE_SIDE_EFFECTS (e)((non_type_check ((e), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4782, __FUNCTION__))->base.side_effects_flag)
;
4783 TREE_THIS_VOLATILE (result)((result)->base.volatile_flag) = TREE_THIS_VOLATILE (e)((e)->base.volatile_flag);
4784
4785 return result;
4786}
4787
4788/* Stabilize a reference so that we can use it any number of times
4789 without causing its operands to be evaluated more than once.
4790 Returns the stabilized reference. This works by means of save_expr,
4791 so see the caveats in the comments about save_expr.
4792
4793 Also allows conversion expressions whose operands are references.
4794 Any other kind of expression is returned unchanged. */
4795
4796tree
4797stabilize_reference (tree ref)
4798{
4799 tree result;
4800 enum tree_code code = TREE_CODE (ref)((enum tree_code) (ref)->base.code);
4801
4802 switch (code)
4803 {
4804 case VAR_DECL:
4805 case PARM_DECL:
4806 case RESULT_DECL:
4807 /* No action is needed in this case. */
4808 return ref;
4809
4810 CASE_CONVERTcase NOP_EXPR: case CONVERT_EXPR:
4811 case FLOAT_EXPR:
4812 case FIX_TRUNC_EXPR:
4813 result = build_nt (code, stabilize_reference (TREE_OPERAND (ref, 0)(*((const_cast<tree*> (tree_operand_check ((ref), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4813, __FUNCTION__)))))
));
4814 break;
4815
4816 case INDIRECT_REF:
4817 result = build_nt (INDIRECT_REF,
4818 stabilize_reference_1 (TREE_OPERAND (ref, 0)(*((const_cast<tree*> (tree_operand_check ((ref), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4818, __FUNCTION__)))))
));
4819 break;
4820
4821 case COMPONENT_REF:
4822 result = build_nt (COMPONENT_REF,
4823 stabilize_reference (TREE_OPERAND (ref, 0)(*((const_cast<tree*> (tree_operand_check ((ref), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4823, __FUNCTION__)))))
),
4824 TREE_OPERAND (ref, 1)(*((const_cast<tree*> (tree_operand_check ((ref), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4824, __FUNCTION__)))))
, NULL_TREE(tree) nullptr);
4825 break;
4826
4827 case BIT_FIELD_REF:
4828 result = build_nt (BIT_FIELD_REF,
4829 stabilize_reference (TREE_OPERAND (ref, 0)(*((const_cast<tree*> (tree_operand_check ((ref), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4829, __FUNCTION__)))))
),
4830 TREE_OPERAND (ref, 1)(*((const_cast<tree*> (tree_operand_check ((ref), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4830, __FUNCTION__)))))
, TREE_OPERAND (ref, 2)(*((const_cast<tree*> (tree_operand_check ((ref), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4830, __FUNCTION__)))))
);
4831 REF_REVERSE_STORAGE_ORDER (result)((tree_check2 ((result), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4831, __FUNCTION__, (BIT_FIELD_REF), (MEM_REF)))->base.default_def_flag
)
= REF_REVERSE_STORAGE_ORDER (ref)((tree_check2 ((ref), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4831, __FUNCTION__, (BIT_FIELD_REF), (MEM_REF)))->base.default_def_flag
)
;
4832 break;
4833
4834 case ARRAY_REF:
4835 result = build_nt (ARRAY_REF,
4836 stabilize_reference (TREE_OPERAND (ref, 0)(*((const_cast<tree*> (tree_operand_check ((ref), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4836, __FUNCTION__)))))
),
4837 stabilize_reference_1 (TREE_OPERAND (ref, 1)(*((const_cast<tree*> (tree_operand_check ((ref), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4837, __FUNCTION__)))))
),
4838 TREE_OPERAND (ref, 2)(*((const_cast<tree*> (tree_operand_check ((ref), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4838, __FUNCTION__)))))
, TREE_OPERAND (ref, 3)(*((const_cast<tree*> (tree_operand_check ((ref), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4838, __FUNCTION__)))))
);
4839 break;
4840
4841 case ARRAY_RANGE_REF:
4842 result = build_nt (ARRAY_RANGE_REF,
4843 stabilize_reference (TREE_OPERAND (ref, 0)(*((const_cast<tree*> (tree_operand_check ((ref), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4843, __FUNCTION__)))))
),
4844 stabilize_reference_1 (TREE_OPERAND (ref, 1)(*((const_cast<tree*> (tree_operand_check ((ref), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4844, __FUNCTION__)))))
),
4845 TREE_OPERAND (ref, 2)(*((const_cast<tree*> (tree_operand_check ((ref), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4845, __FUNCTION__)))))
, TREE_OPERAND (ref, 3)(*((const_cast<tree*> (tree_operand_check ((ref), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4845, __FUNCTION__)))))
);
4846 break;
4847
4848 case COMPOUND_EXPR:
4849 /* We cannot wrap the first expression in a SAVE_EXPR, as then
4850 it wouldn't be ignored. This matters when dealing with
4851 volatiles. */
4852 return stabilize_reference_1 (ref);
4853
4854 /* If arg isn't a kind of lvalue we recognize, make no change.
4855 Caller should recognize the error for an invalid lvalue. */
4856 default:
4857 return ref;
4858
4859 case ERROR_MARK:
4860 return error_mark_nodeglobal_trees[TI_ERROR_MARK];
4861 }
4862
4863 TREE_TYPE (result)((contains_struct_check ((result), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4863, __FUNCTION__))->typed.type)
= TREE_TYPE (ref)((contains_struct_check ((ref), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4863, __FUNCTION__))->typed.type)
;
4864 TREE_READONLY (result)((non_type_check ((result), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4864, __FUNCTION__))->base.readonly_flag)
= TREE_READONLY (ref)((non_type_check ((ref), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4864, __FUNCTION__))->base.readonly_flag)
;
4865 TREE_SIDE_EFFECTS (result)((non_type_check ((result), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4865, __FUNCTION__))->base.side_effects_flag)
= TREE_SIDE_EFFECTS (ref)((non_type_check ((ref), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4865, __FUNCTION__))->base.side_effects_flag)
;
4866 TREE_THIS_VOLATILE (result)((result)->base.volatile_flag) = TREE_THIS_VOLATILE (ref)((ref)->base.volatile_flag);
4867 protected_set_expr_location (result, EXPR_LOCATION (ref)((((ref)) && ((tree_code_type_tmpl <0>::tree_code_type
[(int) (((enum tree_code) ((ref))->base.code))]) >= tcc_reference
&& (tree_code_type_tmpl <0>::tree_code_type[(int
) (((enum tree_code) ((ref))->base.code))]) <= tcc_expression
)) ? (ref)->exp.locus : ((location_t) 0))
);
4868
4869 return result;
4870}
4871
4872/* Low-level constructors for expressions. */
4873
4874/* A helper function for build1 and constant folders. Set TREE_CONSTANT,
4875 and TREE_SIDE_EFFECTS for an ADDR_EXPR. */
4876
4877void
4878recompute_tree_invariant_for_addr_expr (tree t)
4879{
4880 tree node;
4881 bool tc = true, se = false;
4882
4883 gcc_assert (TREE_CODE (t) == ADDR_EXPR)((void)(!(((enum tree_code) (t)->base.code) == ADDR_EXPR) ?
fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4883, __FUNCTION__), 0 : 0))
;
4884
4885 /* We started out assuming this address is both invariant and constant, but
4886 does not have side effects. Now go down any handled components and see if
4887 any of them involve offsets that are either non-constant or non-invariant.
4888 Also check for side-effects.
4889
4890 ??? Note that this code makes no attempt to deal with the case where
4891 taking the address of something causes a copy due to misalignment. */
4892
4893#define UPDATE_FLAGS(NODE) \
4894do { tree _node = (NODE); \
4895 if (_node && !TREE_CONSTANT (_node)((non_type_check ((_node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4895, __FUNCTION__))->base.constant_flag)
) tc = false; \
4896 if (_node && TREE_SIDE_EFFECTS (_node)((non_type_check ((_node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4896, __FUNCTION__))->base.side_effects_flag)
) se = true; } while (0)
4897
4898 for (node = TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4898, __FUNCTION__)))))
; handled_component_p (node);
4899 node = TREE_OPERAND (node, 0)(*((const_cast<tree*> (tree_operand_check ((node), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4899, __FUNCTION__)))))
)
4900 {
4901 /* If the first operand doesn't have an ARRAY_TYPE, this is a bogus
4902 array reference (probably made temporarily by the G++ front end),
4903 so ignore all the operands. */
4904 if ((TREE_CODE (node)((enum tree_code) (node)->base.code) == ARRAY_REF
4905 || TREE_CODE (node)((enum tree_code) (node)->base.code) == ARRAY_RANGE_REF)
4906 && TREE_CODE (TREE_TYPE (TREE_OPERAND (node, 0)))((enum tree_code) (((contains_struct_check (((*((const_cast<
tree*> (tree_operand_check ((node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4906, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4906, __FUNCTION__))->typed.type))->base.code)
== ARRAY_TYPE)
4907 {
4908 UPDATE_FLAGS (TREE_OPERAND (node, 1)(*((const_cast<tree*> (tree_operand_check ((node), (1),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4908, __FUNCTION__)))))
);
4909 if (TREE_OPERAND (node, 2)(*((const_cast<tree*> (tree_operand_check ((node), (2),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4909, __FUNCTION__)))))
)
4910 UPDATE_FLAGS (TREE_OPERAND (node, 2)(*((const_cast<tree*> (tree_operand_check ((node), (2),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4910, __FUNCTION__)))))
);
4911 if (TREE_OPERAND (node, 3)(*((const_cast<tree*> (tree_operand_check ((node), (3),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4911, __FUNCTION__)))))
)
4912 UPDATE_FLAGS (TREE_OPERAND (node, 3)(*((const_cast<tree*> (tree_operand_check ((node), (3),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4912, __FUNCTION__)))))
);
4913 }
4914 /* Likewise, just because this is a COMPONENT_REF doesn't mean we have a
4915 FIELD_DECL, apparently. The G++ front end can put something else
4916 there, at least temporarily. */
4917 else if (TREE_CODE (node)((enum tree_code) (node)->base.code) == COMPONENT_REF
4918 && TREE_CODE (TREE_OPERAND (node, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check
((node), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4918, __FUNCTION__))))))->base.code)
== FIELD_DECL)
4919 {
4920 if (TREE_OPERAND (node, 2)(*((const_cast<tree*> (tree_operand_check ((node), (2),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4920, __FUNCTION__)))))
)
4921 UPDATE_FLAGS (TREE_OPERAND (node, 2)(*((const_cast<tree*> (tree_operand_check ((node), (2),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4921, __FUNCTION__)))))
);
4922 }
4923 }
4924
4925 node = lang_hooks.expr_to_decl (node, &tc, &se);
4926
4927 /* Now see what's inside. If it's an INDIRECT_REF, copy our properties from
4928 the address, since &(*a)->b is a form of addition. If it's a constant, the
4929 address is constant too. If it's a decl, its address is constant if the
4930 decl is static. Everything else is not constant and, furthermore,
4931 taking the address of a volatile variable is not volatile. */
4932 if (TREE_CODE (node)((enum tree_code) (node)->base.code) == INDIRECT_REF
4933 || TREE_CODE (node)((enum tree_code) (node)->base.code) == MEM_REF)
4934 UPDATE_FLAGS (TREE_OPERAND (node, 0)(*((const_cast<tree*> (tree_operand_check ((node), (0),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4934, __FUNCTION__)))))
);
4935 else if (CONSTANT_CLASS_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (node)->base.code))] == tcc_constant)
)
4936 ;
4937 else if (DECL_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (node)->base.code))] == tcc_declaration)
)
4938 tc &= (staticp (node) != NULL_TREE(tree) nullptr);
4939 else
4940 {
4941 tc = false;
4942 se |= TREE_SIDE_EFFECTS (node)((non_type_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4942, __FUNCTION__))->base.side_effects_flag)
;
4943 }
4944
4945
4946 TREE_CONSTANT (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4946, __FUNCTION__))->base.constant_flag)
= tc;
4947 TREE_SIDE_EFFECTS (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4947, __FUNCTION__))->base.side_effects_flag)
= se;
4948#undef UPDATE_FLAGS
4949}
4950
4951/* Build an expression of code CODE, data type TYPE, and operands as
4952 specified. Expressions and reference nodes can be created this way.
4953 Constants, decls, types and misc nodes cannot be.
4954
4955 We define 5 non-variadic functions, from 0 to 4 arguments. This is
4956 enough for all extant tree codes. */
4957
4958tree
4959build0 (enum tree_code code, tree tt MEM_STAT_DECL)
4960{
4961 tree t;
4962
4963 gcc_assert (TREE_CODE_LENGTH (code) == 0)((void)(!(tree_code_length_tmpl <0>::tree_code_length[(
int) (code)] == 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4963, __FUNCTION__), 0 : 0))
;
4964
4965 t = make_node (code PASS_MEM_STAT);
4966 TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4966, __FUNCTION__))->typed.type)
= tt;
4967
4968 return t;
4969}
4970
4971tree
4972build1 (enum tree_code code, tree type, tree node MEM_STAT_DECL)
4973{
4974 int length = sizeof (struct tree_exp);
4975 tree t;
4976
4977 record_node_allocation_statistics (code, length);
4978
4979 gcc_assert (TREE_CODE_LENGTH (code) == 1)((void)(!(tree_code_length_tmpl <0>::tree_code_length[(
int) (code)] == 1) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4979, __FUNCTION__), 0 : 0))
;
4980
4981 t = ggc_alloc_tree_node_stat (length PASS_MEM_STAT);
4982
4983 memset (t, 0, sizeof (struct tree_common));
4984
4985 TREE_SET_CODE (t, code)((t)->base.code = (code));
4986
4987 TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4987, __FUNCTION__))->typed.type)
= type;
4988 SET_EXPR_LOCATION (t, UNKNOWN_LOCATION)(expr_check (((t)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4988, __FUNCTION__))->exp.locus = (((location_t) 0))
;
4989 TREE_OPERAND (t, 0)(*((const_cast<tree*> (tree_operand_check ((t), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4989, __FUNCTION__)))))
= node;
4990 if (node && !TYPE_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (node)->base.code))] == tcc_type)
)
4991 {
4992 TREE_SIDE_EFFECTS (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4992, __FUNCTION__))->base.side_effects_flag)
= TREE_SIDE_EFFECTS (node)((non_type_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4992, __FUNCTION__))->base.side_effects_flag)
;
4993 TREE_READONLY (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4993, __FUNCTION__))->base.readonly_flag)
= TREE_READONLY (node)((non_type_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4993, __FUNCTION__))->base.readonly_flag)
;
4994 }
4995
4996 if (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_statement)
4997 {
4998 if (code != DEBUG_BEGIN_STMT)
4999 TREE_SIDE_EFFECTS (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 4999, __FUNCTION__))->base.side_effects_flag)
= 1;
5000 }
5001 else switch (code)
5002 {
5003 case VA_ARG_EXPR:
5004 /* All of these have side-effects, no matter what their
5005 operands are. */
5006 TREE_SIDE_EFFECTS (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5006, __FUNCTION__))->base.side_effects_flag)
= 1;
5007 TREE_READONLY (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5007, __FUNCTION__))->base.readonly_flag)
= 0;
5008 break;
5009
5010 case INDIRECT_REF:
5011 /* Whether a dereference is readonly has nothing to do with whether
5012 its operand is readonly. */
5013 TREE_READONLY (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5013, __FUNCTION__))->base.readonly_flag)
= 0;
5014 break;
5015
5016 case ADDR_EXPR:
5017 if (node)
5018 recompute_tree_invariant_for_addr_expr (t);
5019 break;
5020
5021 default:
5022 if ((TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_unary || code == VIEW_CONVERT_EXPR)
5023 && node && !TYPE_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (node)->base.code))] == tcc_type)
5024 && TREE_CONSTANT (node)((non_type_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5024, __FUNCTION__))->base.constant_flag)
)
5025 TREE_CONSTANT (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5025, __FUNCTION__))->base.constant_flag)
= 1;
5026 if (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_reference
5027 && node && TREE_THIS_VOLATILE (node)((node)->base.volatile_flag))
5028 TREE_THIS_VOLATILE (t)((t)->base.volatile_flag) = 1;
5029 break;
5030 }
5031
5032 return t;
5033}
5034
5035#define PROCESS_ARG(N)do { (*((const_cast<tree*> (tree_operand_check ((t), (N
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5035, __FUNCTION__))))) = argN; if (argN &&!(tree_code_type_tmpl
<0>::tree_code_type[(int) (((enum tree_code) (argN)->
base.code))] == tcc_type)) { if (((non_type_check ((argN), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5035, __FUNCTION__))->base.side_effects_flag)) side_effects
= 1; if (!((non_type_check ((argN), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5035, __FUNCTION__))->base.readonly_flag) && !(tree_code_type_tmpl
<0>::tree_code_type[(int) (((enum tree_code) (argN)->
base.code))] == tcc_constant)) (void) (read_only = 0); if (!(
(non_type_check ((argN), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5035, __FUNCTION__))->base.constant_flag)) (void) (constant
= 0); } } while (0)
\
5036 do { \
5037 TREE_OPERAND (t, N)(*((const_cast<tree*> (tree_operand_check ((t), (N), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5037, __FUNCTION__)))))
= arg##N; \
5038 if (arg##N &&!TYPE_P (arg##N)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (arg##N)->base.code))] == tcc_type)
) \
5039 { \
5040 if (TREE_SIDE_EFFECTS (arg##N)((non_type_check ((arg##N), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5040, __FUNCTION__))->base.side_effects_flag)
) \
5041 side_effects = 1; \
5042 if (!TREE_READONLY (arg##N)((non_type_check ((arg##N), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5042, __FUNCTION__))->base.readonly_flag)
\
5043 && !CONSTANT_CLASS_P (arg##N)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (arg##N)->base.code))] == tcc_constant)
) \
5044 (void) (read_only = 0); \
5045 if (!TREE_CONSTANT (arg##N)((non_type_check ((arg##N), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5045, __FUNCTION__))->base.constant_flag)
) \
5046 (void) (constant = 0); \
5047 } \
5048 } while (0)
5049
5050tree
5051build2 (enum tree_code code, tree tt, tree arg0, tree arg1 MEM_STAT_DECL)
5052{
5053 bool constant, read_only, side_effects, div_by_zero;
5054 tree t;
5055
5056 gcc_assert (TREE_CODE_LENGTH (code) == 2)((void)(!(tree_code_length_tmpl <0>::tree_code_length[(
int) (code)] == 2) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5056, __FUNCTION__), 0 : 0))
;
5057
5058 if ((code == MINUS_EXPR || code == PLUS_EXPR || code == MULT_EXPR)
5059 && arg0 && arg1 && tt && POINTER_TYPE_P (tt)(((enum tree_code) (tt)->base.code) == POINTER_TYPE || ((enum
tree_code) (tt)->base.code) == REFERENCE_TYPE)
5060 /* When sizetype precision doesn't match that of pointers
5061 we need to be able to build explicit extensions or truncations
5062 of the offset argument. */
5063 && TYPE_PRECISION (sizetype)((tree_class_check ((sizetype_tab[(int) stk_sizetype]), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5063, __FUNCTION__))->type_common.precision)
== TYPE_PRECISION (tt)((tree_class_check ((tt), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5063, __FUNCTION__))->type_common.precision)
)
5064 gcc_assert (TREE_CODE (arg0) == INTEGER_CST((void)(!(((enum tree_code) (arg0)->base.code) == INTEGER_CST
&& ((enum tree_code) (arg1)->base.code) == INTEGER_CST
) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5065, __FUNCTION__), 0 : 0))
5065 && TREE_CODE (arg1) == INTEGER_CST)((void)(!(((enum tree_code) (arg0)->base.code) == INTEGER_CST
&& ((enum tree_code) (arg1)->base.code) == INTEGER_CST
) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5065, __FUNCTION__), 0 : 0))
;
5066
5067 if (code == POINTER_PLUS_EXPR && arg0 && arg1 && tt)
5068 gcc_assert (POINTER_TYPE_P (tt) && POINTER_TYPE_P (TREE_TYPE (arg0))((void)(!((((enum tree_code) (tt)->base.code) == POINTER_TYPE
|| ((enum tree_code) (tt)->base.code) == REFERENCE_TYPE) &&
(((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5068, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE
|| ((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5068, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE
) && ptrofftype_p (((contains_struct_check ((arg1), (
TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5069, __FUNCTION__))->typed.type))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5069, __FUNCTION__), 0 : 0))
5069 && ptrofftype_p (TREE_TYPE (arg1)))((void)(!((((enum tree_code) (tt)->base.code) == POINTER_TYPE
|| ((enum tree_code) (tt)->base.code) == REFERENCE_TYPE) &&
(((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5068, __FUNCTION__))->typed.type))->base.code) == POINTER_TYPE
|| ((enum tree_code) (((contains_struct_check ((arg0), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5068, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE
) && ptrofftype_p (((contains_struct_check ((arg1), (
TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5069, __FUNCTION__))->typed.type))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5069, __FUNCTION__), 0 : 0))
;
5070
5071 t = make_node (code PASS_MEM_STAT);
5072 TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5072, __FUNCTION__))->typed.type)
= tt;
5073
5074 /* Below, we automatically set TREE_SIDE_EFFECTS and TREE_READONLY for the
5075 result based on those same flags for the arguments. But if the
5076 arguments aren't really even `tree' expressions, we shouldn't be trying
5077 to do this. */
5078
5079 /* Expressions without side effects may be constant if their
5080 arguments are as well. */
5081 constant = (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_comparison
5082 || TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_binary);
5083 read_only = 1;
5084 side_effects = TREE_SIDE_EFFECTS (t)((non_type_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
, 5084, __FUNCTION__))->base.side_effects_flag)
;
5085
5086 switch (code)
5087 {
5088 case TRUNC_DIV_EXPR:
5089 case CEIL_DIV_EXPR:
5090 case FLOOR_DIV_EXPR:
5091 case ROUND_DIV_EXPR:
5092 case EXACT_DIV_EXPR:
5093 case CEIL_MOD_EXPR:
5094 case FLOOR_MOD_EXPR:
5095 case ROUND_MOD_EXPR:
5096 case TRUNC_MOD_EXPR:
5097 div_by_zero = integer_zerop (arg1);
5098 break;
5099 default:
5100 div_by_zero = false;
5101 }
5102
5103 PROCESS_ARG (0)do { (*((const_cast<tree*> (tree_operand_check ((t), (0
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree.cc"
,