]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree.c
libiberty/
[thirdparty/gcc.git] / gcc / tree.c
CommitLineData
10a9d4cf 1/* Language-independent node constructors for parse phase of GNU compiler.
b278476e 2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
27a1da0a 3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
63bf54cf 4 Free Software Foundation, Inc.
10a9d4cf 5
f12b58b3 6This file is part of GCC.
10a9d4cf 7
f12b58b3 8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
8c4c00c1 10Software Foundation; either version 3, or (at your option) any later
f12b58b3 11version.
10a9d4cf 12
f12b58b3 13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
10a9d4cf 17
18You should have received a copy of the GNU General Public License
8c4c00c1 19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
10a9d4cf 21
10a9d4cf 22/* This file contains the low level primitives for operating on tree nodes,
23 including allocation, list operations, interning of identifiers,
24 construction of data type nodes and statement nodes,
25 and construction of type conversion nodes. It also contains
26 tables index by tree code that describe how to take apart
27 nodes of that code.
28
29 It is intended to be language-independent, but occasionally
92192583 30 calls language-dependent routines defined (for C) in typecheck.c. */
10a9d4cf 31
32#include "config.h"
405711de 33#include "system.h"
805e22b2 34#include "coretypes.h"
35#include "tm.h"
10a9d4cf 36#include "flags.h"
10a9d4cf 37#include "tree.h"
7953c610 38#include "tm_p.h"
9c237f94 39#include "function.h"
10a9d4cf 40#include "obstack.h"
12874aaf 41#include "toplev.h"
a7b0c170 42#include "ggc.h"
f2d83427 43#include "hashtab.h"
e772a198 44#include "output.h"
a767736d 45#include "target.h"
b7fced5e 46#include "langhooks.h"
4189e677 47#include "tree-inline.h"
4ee9c684 48#include "tree-iterator.h"
49#include "basic-block.h"
50#include "tree-flow.h"
00b76131 51#include "params.h"
98f8a662 52#include "pointer-set.h"
34e5cced 53#include "tree-pass.h"
54#include "langhooks-def.h"
55#include "diagnostic.h"
ce084dfc 56#include "tree-diagnostic.h"
57#include "tree-pretty-print.h"
34e5cced 58#include "cgraph.h"
59#include "timevar.h"
60#include "except.h"
61#include "debug.h"
af4d2883 62#include "intl.h"
ad87de1e 63
e014fc6a 64/* Tree code classes. */
65
66#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
67#define END_OF_BASE_TREE_CODES tcc_exceptional,
68
69const enum tree_code_class tree_code_type[] = {
70#include "all-tree.def"
71};
72
73#undef DEFTREECODE
74#undef END_OF_BASE_TREE_CODES
75
76/* Table indexed by tree code giving number of expression
77 operands beyond the fixed part of the node structure.
78 Not used for types or decls. */
79
80#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
81#define END_OF_BASE_TREE_CODES 0,
82
83const unsigned char tree_code_length[] = {
84#include "all-tree.def"
85};
86
87#undef DEFTREECODE
88#undef END_OF_BASE_TREE_CODES
89
90/* Names of tree components.
91 Used for printing out the tree and error messages. */
92#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
93#define END_OF_BASE_TREE_CODES "@dummy",
94
95const char *const tree_code_name[] = {
96#include "all-tree.def"
97};
98
99#undef DEFTREECODE
100#undef END_OF_BASE_TREE_CODES
101
ce45a448 102/* Each tree code class has an associated string representation.
103 These must correspond to the tree_code_class entries. */
104
a93de1ee 105const char *const tree_code_class_strings[] =
106{
107 "exceptional",
108 "constant",
109 "type",
110 "declaration",
111 "reference",
112 "comparison",
113 "unary",
114 "binary",
115 "statement",
c2f47e15 116 "vl_exp",
75a70cf9 117 "expression"
a93de1ee 118};
ce45a448 119
9bfff6cb 120/* obstack.[ch] explicitly declined to prototype this. */
60b8c5b3 121extern int _obstack_allocated_p (struct obstack *h, void *obj);
10a9d4cf 122
6d7f57b2 123#ifdef GATHER_STATISTICS
10a9d4cf 124/* Statistics-gathering stuff. */
1bb37c35 125
9bfff6cb 126int tree_node_counts[(int) all_kinds];
127int tree_node_sizes[(int) all_kinds];
1bb37c35 128
b4b174c3 129/* Keep in sync with tree.h:enum tree_node_kind. */
43182305 130static const char * const tree_node_kind_names[] = {
1bb37c35 131 "decls",
132 "types",
133 "blocks",
134 "stmts",
135 "refs",
136 "exprs",
137 "constants",
138 "identifiers",
1bb37c35 139 "perm_tree_lists",
140 "temp_tree_lists",
141 "vecs",
3cb98335 142 "binfos",
4ee9c684 143 "ssa names",
c75b4594 144 "constructors",
1bb37c35 145 "random kinds",
146 "lang_decl kinds",
55d6e7cd 147 "lang_type kinds",
35cc02b5 148 "omp clauses",
1bb37c35 149};
6d7f57b2 150#endif /* GATHER_STATISTICS */
10a9d4cf 151
6053ec2b 152/* Unique id for next decl created. */
f61c5461 153static GTY(()) int next_decl_uid;
5beefc7b 154/* Unique id for next type created. */
f61c5461 155static GTY(()) int next_type_uid = 1;
688ff29b 156/* Unique id for next debug decl created. Use negative numbers,
157 to catch erroneous uses. */
158static GTY(()) int next_debug_decl_uid;
6053ec2b 159
f2d83427 160/* Since we cannot rehash a type after it is in the table, we have to
161 keep the hash code. */
a7b0c170 162
fb1e4f4a 163struct GTY(()) type_hash {
f2d83427 164 unsigned long hash;
165 tree type;
a7b0c170 166};
167
9bfff6cb 168/* Initial size of the hash table (rounded to next prime). */
f2d83427 169#define TYPE_HASH_INITIAL_SIZE 1000
a7b0c170 170
f2d83427 171/* Now here is the hash table. When recording a type, it is added to
172 the slot whose index is the hash code. Note that the hash table is
173 used for several kinds of types (function types, array types and
174 array index range types, for now). While all these live in the
175 same table, they are completely independent, and the hash code is
176 computed differently for each of these. */
177
1f3233d1 178static GTY ((if_marked ("type_hash_marked_p"), param_is (struct type_hash)))
179 htab_t type_hash_table;
a7b0c170 180
743771b6 181/* Hash table and temporary node for larger integer const values. */
182static GTY (()) tree int_cst_node;
183static GTY ((if_marked ("ggc_marked_p"), param_is (union tree_node)))
184 htab_t int_cst_hash_table;
185
46f8e3b0 186/* Hash table for optimization flags and target option flags. Use the same
187 hash table for both sets of options. Nodes for building the current
188 optimization and target option nodes. The assumption is most of the time
189 the options created will already be in the hash table, so we avoid
190 allocating and freeing up a node repeatably. */
191static GTY (()) tree cl_optimization_node;
192static GTY (()) tree cl_target_option_node;
193static GTY ((if_marked ("ggc_marked_p"), param_is (union tree_node)))
194 htab_t cl_option_hash_table;
195
8bc1e6ff 196/* General tree->tree mapping structure for use in hash tables. */
197
8bc1e6ff 198
48e1416a 199static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
8bc1e6ff 200 htab_t debug_expr_for_decl;
201
48e1416a 202static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
75fa4f82 203 htab_t value_expr_for_decl;
204
48e1416a 205static GTY ((if_marked ("tree_priority_map_marked_p"),
9af7fd5b 206 param_is (struct tree_priority_map)))
5ded8c6f 207 htab_t init_priority_for_decl;
208
60b8c5b3 209static void set_type_quals (tree, int);
60b8c5b3 210static int type_hash_eq (const void *, const void *);
211static hashval_t type_hash_hash (const void *);
743771b6 212static hashval_t int_cst_hash_hash (const void *);
213static int int_cst_hash_eq (const void *, const void *);
46f8e3b0 214static hashval_t cl_option_hash_hash (const void *);
215static int cl_option_hash_eq (const void *, const void *);
60b8c5b3 216static void print_type_hash_statistics (void);
8bc1e6ff 217static void print_debug_expr_statistics (void);
75fa4f82 218static void print_value_expr_statistics (void);
60b8c5b3 219static int type_hash_marked_p (const void *);
720082dc 220static unsigned int type_hash_list (const_tree, hashval_t);
221static unsigned int attribute_hash_list (const_tree, hashval_t);
5f9979a2 222
775e7cc0 223tree global_trees[TI_MAX];
b06898ca 224tree integer_types[itk_none];
8bc1e6ff 225
5ca99950 226unsigned char tree_contains_struct[MAX_TREE_CODES][64];
55d6e7cd 227
228/* Number of operands for each OpenMP clause. */
229unsigned const char omp_clause_num_ops[] =
230{
231 0, /* OMP_CLAUSE_ERROR */
232 1, /* OMP_CLAUSE_PRIVATE */
233 1, /* OMP_CLAUSE_SHARED */
234 1, /* OMP_CLAUSE_FIRSTPRIVATE */
fd6481cf 235 2, /* OMP_CLAUSE_LASTPRIVATE */
55d6e7cd 236 4, /* OMP_CLAUSE_REDUCTION */
237 1, /* OMP_CLAUSE_COPYIN */
238 1, /* OMP_CLAUSE_COPYPRIVATE */
239 1, /* OMP_CLAUSE_IF */
240 1, /* OMP_CLAUSE_NUM_THREADS */
241 1, /* OMP_CLAUSE_SCHEDULE */
242 0, /* OMP_CLAUSE_NOWAIT */
243 0, /* OMP_CLAUSE_ORDERED */
fd6481cf 244 0, /* OMP_CLAUSE_DEFAULT */
245 3, /* OMP_CLAUSE_COLLAPSE */
246 0 /* OMP_CLAUSE_UNTIED */
55d6e7cd 247};
248
249const char * const omp_clause_code_name[] =
250{
251 "error_clause",
252 "private",
253 "shared",
254 "firstprivate",
255 "lastprivate",
256 "reduction",
257 "copyin",
258 "copyprivate",
259 "if",
260 "num_threads",
261 "schedule",
262 "nowait",
263 "ordered",
fd6481cf 264 "default",
265 "collapse",
266 "untied"
55d6e7cd 267};
8dfbefd8 268
269
270/* Return the tree node structure used by tree code CODE. */
271
272static inline enum tree_node_structure_enum
273tree_node_structure_for_code (enum tree_code code)
274{
275 switch (TREE_CODE_CLASS (code))
48e1416a 276 {
8dfbefd8 277 case tcc_declaration:
278 {
279 switch (code)
280 {
281 case FIELD_DECL:
282 return TS_FIELD_DECL;
283 case PARM_DECL:
284 return TS_PARM_DECL;
285 case VAR_DECL:
286 return TS_VAR_DECL;
287 case LABEL_DECL:
288 return TS_LABEL_DECL;
289 case RESULT_DECL:
290 return TS_RESULT_DECL;
0f499ee4 291 case DEBUG_EXPR_DECL:
292 return TS_DECL_WRTL;
8dfbefd8 293 case CONST_DECL:
294 return TS_CONST_DECL;
295 case TYPE_DECL:
296 return TS_TYPE_DECL;
297 case FUNCTION_DECL:
298 return TS_FUNCTION_DECL;
299 default:
300 return TS_DECL_NON_COMMON;
301 }
302 }
303 case tcc_type:
304 return TS_TYPE;
305 case tcc_reference:
306 case tcc_comparison:
307 case tcc_unary:
308 case tcc_binary:
309 case tcc_expression:
310 case tcc_statement:
311 case tcc_vl_exp:
312 return TS_EXP;
313 default: /* tcc_constant and tcc_exceptional */
314 break;
315 }
316 switch (code)
317 {
318 /* tcc_constant cases. */
319 case INTEGER_CST: return TS_INT_CST;
320 case REAL_CST: return TS_REAL_CST;
321 case FIXED_CST: return TS_FIXED_CST;
322 case COMPLEX_CST: return TS_COMPLEX;
323 case VECTOR_CST: return TS_VECTOR;
324 case STRING_CST: return TS_STRING;
325 /* tcc_exceptional cases. */
326 case ERROR_MARK: return TS_COMMON;
327 case IDENTIFIER_NODE: return TS_IDENTIFIER;
328 case TREE_LIST: return TS_LIST;
329 case TREE_VEC: return TS_VEC;
330 case SSA_NAME: return TS_SSA_NAME;
331 case PLACEHOLDER_EXPR: return TS_COMMON;
332 case STATEMENT_LIST: return TS_STATEMENT_LIST;
333 case BLOCK: return TS_BLOCK;
334 case CONSTRUCTOR: return TS_CONSTRUCTOR;
335 case TREE_BINFO: return TS_BINFO;
336 case OMP_CLAUSE: return TS_OMP_CLAUSE;
337 case OPTIMIZATION_NODE: return TS_OPTIMIZATION;
338 case TARGET_OPTION_NODE: return TS_TARGET_OPTION;
339
340 default:
341 gcc_unreachable ();
342 }
343}
344
345
346/* Initialize tree_contains_struct to describe the hierarchy of tree
347 nodes. */
348
349static void
350initialize_tree_contains_struct (void)
351{
352 unsigned i;
353
354#define MARK_TS_BASE(C) \
355 do { \
356 tree_contains_struct[C][TS_BASE] = 1; \
357 } while (0)
358
359#define MARK_TS_COMMON(C) \
360 do { \
361 MARK_TS_BASE (C); \
362 tree_contains_struct[C][TS_COMMON] = 1; \
363 } while (0)
364
365#define MARK_TS_DECL_MINIMAL(C) \
366 do { \
367 MARK_TS_COMMON (C); \
368 tree_contains_struct[C][TS_DECL_MINIMAL] = 1; \
369 } while (0)
48e1416a 370
8dfbefd8 371#define MARK_TS_DECL_COMMON(C) \
372 do { \
373 MARK_TS_DECL_MINIMAL (C); \
374 tree_contains_struct[C][TS_DECL_COMMON] = 1; \
375 } while (0)
376
377#define MARK_TS_DECL_WRTL(C) \
378 do { \
379 MARK_TS_DECL_COMMON (C); \
380 tree_contains_struct[C][TS_DECL_WRTL] = 1; \
381 } while (0)
382
383#define MARK_TS_DECL_WITH_VIS(C) \
384 do { \
385 MARK_TS_DECL_WRTL (C); \
386 tree_contains_struct[C][TS_DECL_WITH_VIS] = 1; \
387 } while (0)
388
389#define MARK_TS_DECL_NON_COMMON(C) \
390 do { \
391 MARK_TS_DECL_WITH_VIS (C); \
392 tree_contains_struct[C][TS_DECL_NON_COMMON] = 1; \
393 } while (0)
394
395 for (i = ERROR_MARK; i < LAST_AND_UNUSED_TREE_CODE; i++)
396 {
397 enum tree_code code;
398 enum tree_node_structure_enum ts_code;
399
400 code = (enum tree_code) i;
401 ts_code = tree_node_structure_for_code (code);
402
403 /* Mark the TS structure itself. */
404 tree_contains_struct[code][ts_code] = 1;
405
406 /* Mark all the structures that TS is derived from. */
407 switch (ts_code)
408 {
409 case TS_COMMON:
410 MARK_TS_BASE (code);
411 break;
412
413 case TS_INT_CST:
414 case TS_REAL_CST:
415 case TS_FIXED_CST:
416 case TS_VECTOR:
417 case TS_STRING:
418 case TS_COMPLEX:
419 case TS_IDENTIFIER:
420 case TS_DECL_MINIMAL:
421 case TS_TYPE:
422 case TS_LIST:
423 case TS_VEC:
424 case TS_EXP:
425 case TS_SSA_NAME:
426 case TS_BLOCK:
427 case TS_BINFO:
428 case TS_STATEMENT_LIST:
429 case TS_CONSTRUCTOR:
430 case TS_OMP_CLAUSE:
431 case TS_OPTIMIZATION:
432 case TS_TARGET_OPTION:
433 MARK_TS_COMMON (code);
434 break;
435
436 case TS_DECL_COMMON:
437 MARK_TS_DECL_MINIMAL (code);
438 break;
439
440 case TS_DECL_WRTL:
441 MARK_TS_DECL_COMMON (code);
442 break;
443
444 case TS_DECL_NON_COMMON:
445 MARK_TS_DECL_WITH_VIS (code);
446 break;
447
448 case TS_DECL_WITH_VIS:
449 case TS_PARM_DECL:
450 case TS_LABEL_DECL:
451 case TS_RESULT_DECL:
452 case TS_CONST_DECL:
453 MARK_TS_DECL_WRTL (code);
454 break;
455
456 case TS_FIELD_DECL:
457 MARK_TS_DECL_COMMON (code);
458 break;
459
460 case TS_VAR_DECL:
461 MARK_TS_DECL_WITH_VIS (code);
462 break;
463
464 case TS_TYPE_DECL:
465 case TS_FUNCTION_DECL:
466 MARK_TS_DECL_NON_COMMON (code);
467 break;
468
469 default:
470 gcc_unreachable ();
471 }
472 }
473
474 /* Basic consistency checks for attributes used in fold. */
475 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_NON_COMMON]);
476 gcc_assert (tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_NON_COMMON]);
477 gcc_assert (tree_contains_struct[TYPE_DECL][TS_DECL_NON_COMMON]);
478 gcc_assert (tree_contains_struct[CONST_DECL][TS_DECL_COMMON]);
479 gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_COMMON]);
480 gcc_assert (tree_contains_struct[PARM_DECL][TS_DECL_COMMON]);
481 gcc_assert (tree_contains_struct[RESULT_DECL][TS_DECL_COMMON]);
482 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_COMMON]);
483 gcc_assert (tree_contains_struct[TYPE_DECL][TS_DECL_COMMON]);
484 gcc_assert (tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_COMMON]);
485 gcc_assert (tree_contains_struct[LABEL_DECL][TS_DECL_COMMON]);
486 gcc_assert (tree_contains_struct[FIELD_DECL][TS_DECL_COMMON]);
487 gcc_assert (tree_contains_struct[CONST_DECL][TS_DECL_WRTL]);
488 gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_WRTL]);
489 gcc_assert (tree_contains_struct[PARM_DECL][TS_DECL_WRTL]);
490 gcc_assert (tree_contains_struct[RESULT_DECL][TS_DECL_WRTL]);
491 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_WRTL]);
492 gcc_assert (tree_contains_struct[LABEL_DECL][TS_DECL_WRTL]);
493 gcc_assert (tree_contains_struct[CONST_DECL][TS_DECL_MINIMAL]);
494 gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_MINIMAL]);
495 gcc_assert (tree_contains_struct[PARM_DECL][TS_DECL_MINIMAL]);
496 gcc_assert (tree_contains_struct[RESULT_DECL][TS_DECL_MINIMAL]);
497 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_MINIMAL]);
498 gcc_assert (tree_contains_struct[TYPE_DECL][TS_DECL_MINIMAL]);
499 gcc_assert (tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_MINIMAL]);
500 gcc_assert (tree_contains_struct[LABEL_DECL][TS_DECL_MINIMAL]);
501 gcc_assert (tree_contains_struct[FIELD_DECL][TS_DECL_MINIMAL]);
502 gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_WITH_VIS]);
503 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_WITH_VIS]);
504 gcc_assert (tree_contains_struct[TYPE_DECL][TS_DECL_WITH_VIS]);
505 gcc_assert (tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_WITH_VIS]);
506 gcc_assert (tree_contains_struct[VAR_DECL][TS_VAR_DECL]);
507 gcc_assert (tree_contains_struct[FIELD_DECL][TS_FIELD_DECL]);
508 gcc_assert (tree_contains_struct[PARM_DECL][TS_PARM_DECL]);
509 gcc_assert (tree_contains_struct[LABEL_DECL][TS_LABEL_DECL]);
510 gcc_assert (tree_contains_struct[RESULT_DECL][TS_RESULT_DECL]);
511 gcc_assert (tree_contains_struct[CONST_DECL][TS_CONST_DECL]);
512 gcc_assert (tree_contains_struct[TYPE_DECL][TS_TYPE_DECL]);
513 gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_FUNCTION_DECL]);
514 gcc_assert (tree_contains_struct[IMPORTED_DECL][TS_DECL_MINIMAL]);
515 gcc_assert (tree_contains_struct[IMPORTED_DECL][TS_DECL_COMMON]);
516
517#undef MARK_TS_BASE
518#undef MARK_TS_COMMON
519#undef MARK_TS_DECL_MINIMAL
520#undef MARK_TS_DECL_COMMON
521#undef MARK_TS_DECL_WRTL
522#undef MARK_TS_DECL_WITH_VIS
523#undef MARK_TS_DECL_NON_COMMON
524}
525
526
92192583 527/* Init tree.c. */
10a9d4cf 528
529void
60b8c5b3 530init_ttree (void)
10a9d4cf 531{
083a2b5e 532 /* Initialize the hash table of types. */
573aba85 533 type_hash_table = htab_create_ggc (TYPE_HASH_INITIAL_SIZE, type_hash_hash,
534 type_hash_eq, 0);
8bc1e6ff 535
536 debug_expr_for_decl = htab_create_ggc (512, tree_map_hash,
537 tree_map_eq, 0);
538
75fa4f82 539 value_expr_for_decl = htab_create_ggc (512, tree_map_hash,
540 tree_map_eq, 0);
9af7fd5b 541 init_priority_for_decl = htab_create_ggc (512, tree_priority_map_hash,
542 tree_priority_map_eq, 0);
75fa4f82 543
743771b6 544 int_cst_hash_table = htab_create_ggc (1024, int_cst_hash_hash,
545 int_cst_hash_eq, NULL);
48e1416a 546
743771b6 547 int_cst_node = make_node (INTEGER_CST);
8bc1e6ff 548
46f8e3b0 549 cl_option_hash_table = htab_create_ggc (64, cl_option_hash_hash,
550 cl_option_hash_eq, NULL);
551
552 cl_optimization_node = make_node (OPTIMIZATION_NODE);
553 cl_target_option_node = make_node (TARGET_OPTION_NODE);
554
8dfbefd8 555 /* Initialize the tree_contains_struct array. */
556 initialize_tree_contains_struct ();
5ded8c6f 557 lang_hooks.init_ts ();
10a9d4cf 558}
559
10a9d4cf 560\f
d1f6c8f2 561/* The name of the object as the assembler will see it (but before any
562 translations made by ASM_OUTPUT_LABELREF). Often this is the same
563 as DECL_NAME. It is an IDENTIFIER_NODE. */
564tree
60b8c5b3 565decl_assembler_name (tree decl)
d1f6c8f2 566{
567 if (!DECL_ASSEMBLER_NAME_SET_P (decl))
dc24ddbd 568 lang_hooks.set_decl_assembler_name (decl);
5ded8c6f 569 return DECL_WITH_VIS_CHECK (decl)->decl_with_vis.assembler_name;
d1f6c8f2 570}
571
1d416bd7 572/* Compare ASMNAME with the DECL_ASSEMBLER_NAME of DECL. */
573
574bool
28485874 575decl_assembler_name_equal (tree decl, const_tree asmname)
1d416bd7 576{
577 tree decl_asmname = DECL_ASSEMBLER_NAME (decl);
ac2722c5 578 const char *decl_str;
579 const char *asmname_str;
580 bool test = false;
1d416bd7 581
582 if (decl_asmname == asmname)
583 return true;
584
ac2722c5 585 decl_str = IDENTIFIER_POINTER (decl_asmname);
586 asmname_str = IDENTIFIER_POINTER (asmname);
48e1416a 587
ac2722c5 588
1d416bd7 589 /* If the target assembler name was set by the user, things are trickier.
590 We have a leading '*' to begin with. After that, it's arguable what
591 is the correct thing to do with -fleading-underscore. Arguably, we've
592 historically been doing the wrong thing in assemble_alias by always
593 printing the leading underscore. Since we're not changing that, make
594 sure user_label_prefix follows the '*' before matching. */
ac2722c5 595 if (decl_str[0] == '*')
1d416bd7 596 {
1d416bd7 597 size_t ulp_len = strlen (user_label_prefix);
598
ac2722c5 599 decl_str ++;
600
1d416bd7 601 if (ulp_len == 0)
ac2722c5 602 test = true;
1d416bd7 603 else if (strncmp (decl_str, user_label_prefix, ulp_len) == 0)
ac2722c5 604 decl_str += ulp_len, test=true;
1d416bd7 605 else
ac2722c5 606 decl_str --;
607 }
608 if (asmname_str[0] == '*')
609 {
610 size_t ulp_len = strlen (user_label_prefix);
611
612 asmname_str ++;
1d416bd7 613
ac2722c5 614 if (ulp_len == 0)
615 test = true;
616 else if (strncmp (asmname_str, user_label_prefix, ulp_len) == 0)
617 asmname_str += ulp_len, test=true;
618 else
619 asmname_str --;
1d416bd7 620 }
621
ac2722c5 622 if (!test)
623 return false;
624 return strcmp (decl_str, asmname_str) == 0;
1d416bd7 625}
626
28485874 627/* Hash asmnames ignoring the user specified marks. */
628
629hashval_t
630decl_assembler_name_hash (const_tree asmname)
631{
632 if (IDENTIFIER_POINTER (asmname)[0] == '*')
633 {
634 const char *decl_str = IDENTIFIER_POINTER (asmname) + 1;
635 size_t ulp_len = strlen (user_label_prefix);
636
637 if (ulp_len == 0)
638 ;
639 else if (strncmp (decl_str, user_label_prefix, ulp_len) == 0)
640 decl_str += ulp_len;
641
642 return htab_hash_string (decl_str);
643 }
644
645 return htab_hash_string (IDENTIFIER_POINTER (asmname));
646}
647
d5406300 648/* Compute the number of bytes occupied by a tree with code CODE.
c2f47e15 649 This function cannot be used for nodes that have variable sizes,
75a70cf9 650 including TREE_VEC, STRING_CST, and CALL_EXPR. */
6663ac46 651size_t
51d121a0 652tree_code_size (enum tree_code code)
6663ac46 653{
6663ac46 654 switch (TREE_CODE_CLASS (code))
655 {
ce45a448 656 case tcc_declaration: /* A decl node */
5ded8c6f 657 {
658 switch (code)
659 {
660 case FIELD_DECL:
661 return sizeof (struct tree_field_decl);
662 case PARM_DECL:
663 return sizeof (struct tree_parm_decl);
664 case VAR_DECL:
665 return sizeof (struct tree_var_decl);
666 case LABEL_DECL:
667 return sizeof (struct tree_label_decl);
668 case RESULT_DECL:
669 return sizeof (struct tree_result_decl);
670 case CONST_DECL:
671 return sizeof (struct tree_const_decl);
672 case TYPE_DECL:
673 return sizeof (struct tree_type_decl);
674 case FUNCTION_DECL:
675 return sizeof (struct tree_function_decl);
0f499ee4 676 case DEBUG_EXPR_DECL:
677 return sizeof (struct tree_decl_with_rtl);
5ded8c6f 678 default:
679 return sizeof (struct tree_decl_non_common);
680 }
681 }
6663ac46 682
ce45a448 683 case tcc_type: /* a type node */
6663ac46 684 return sizeof (struct tree_type);
685
ce45a448 686 case tcc_reference: /* a reference */
687 case tcc_expression: /* an expression */
688 case tcc_statement: /* an expression with side effects */
689 case tcc_comparison: /* a comparison expression */
690 case tcc_unary: /* a unary arithmetic expression */
691 case tcc_binary: /* a binary arithmetic expression */
6663ac46 692 return (sizeof (struct tree_exp)
c2f47e15 693 + (TREE_CODE_LENGTH (code) - 1) * sizeof (tree));
6663ac46 694
ce45a448 695 case tcc_constant: /* a constant */
295e387a 696 switch (code)
697 {
698 case INTEGER_CST: return sizeof (struct tree_int_cst);
699 case REAL_CST: return sizeof (struct tree_real_cst);
06f0b99c 700 case FIXED_CST: return sizeof (struct tree_fixed_cst);
295e387a 701 case COMPLEX_CST: return sizeof (struct tree_complex);
702 case VECTOR_CST: return sizeof (struct tree_vector);
d5406300 703 case STRING_CST: gcc_unreachable ();
295e387a 704 default:
dc24ddbd 705 return lang_hooks.tree_size (code);
295e387a 706 }
6663ac46 707
ce45a448 708 case tcc_exceptional: /* something random, like an identifier. */
295e387a 709 switch (code)
710 {
711 case IDENTIFIER_NODE: return lang_hooks.identifier_size;
712 case TREE_LIST: return sizeof (struct tree_list);
295e387a 713
714 case ERROR_MARK:
715 case PLACEHOLDER_EXPR: return sizeof (struct tree_common);
716
d5406300 717 case TREE_VEC:
75a70cf9 718 case OMP_CLAUSE: gcc_unreachable ();
4ee9c684 719
4ee9c684 720 case SSA_NAME: return sizeof (struct tree_ssa_name);
4ee9c684 721
722 case STATEMENT_LIST: return sizeof (struct tree_statement_list);
1acf0298 723 case BLOCK: return sizeof (struct tree_block);
c75b4594 724 case CONSTRUCTOR: return sizeof (struct tree_constructor);
46f8e3b0 725 case OPTIMIZATION_NODE: return sizeof (struct tree_optimization_option);
726 case TARGET_OPTION_NODE: return sizeof (struct tree_target_option);
4ee9c684 727
295e387a 728 default:
dc24ddbd 729 return lang_hooks.tree_size (code);
295e387a 730 }
6663ac46 731
732 default:
8c0963c4 733 gcc_unreachable ();
6663ac46 734 }
735}
736
51d121a0 737/* Compute the number of bytes occupied by NODE. This routine only
c2f47e15 738 looks at TREE_CODE, except for those nodes that have variable sizes. */
51d121a0 739size_t
720082dc 740tree_size (const_tree node)
51d121a0 741{
720082dc 742 const enum tree_code code = TREE_CODE (node);
51d121a0 743 switch (code)
744 {
1e612ca4 745 case TREE_BINFO:
746 return (offsetof (struct tree_binfo, base_binfos)
747 + VEC_embedded_size (tree, BINFO_N_BASE_BINFOS (node)));
51d121a0 748
749 case TREE_VEC:
750 return (sizeof (struct tree_vec)
c2f47e15 751 + (TREE_VEC_LENGTH (node) - 1) * sizeof (tree));
51d121a0 752
d5406300 753 case STRING_CST:
4043066e 754 return TREE_STRING_LENGTH (node) + offsetof (struct tree_string, str) + 1;
d5406300 755
55d6e7cd 756 case OMP_CLAUSE:
757 return (sizeof (struct tree_omp_clause)
758 + (omp_clause_num_ops[OMP_CLAUSE_CODE (node)] - 1)
759 * sizeof (tree));
760
51d121a0 761 default:
c2f47e15 762 if (TREE_CODE_CLASS (code) == tcc_vl_exp)
763 return (sizeof (struct tree_exp)
764 + (VL_EXP_OPERAND_LENGTH (node) - 1) * sizeof (tree));
765 else
766 return tree_code_size (code);
51d121a0 767 }
768}
769
770/* Return a newly allocated node of code CODE. For decl and type
771 nodes, some other fields are initialized. The rest of the node is
75a70cf9 772 initialized to zero. This function cannot be used for TREE_VEC or
773 OMP_CLAUSE nodes, which is enforced by asserts in tree_code_size.
10a9d4cf 774
775 Achoo! I got a code in the node. */
776
777tree
674b05f5 778make_node_stat (enum tree_code code MEM_STAT_DECL)
10a9d4cf 779{
19cb6b50 780 tree t;
ce45a448 781 enum tree_code_class type = TREE_CODE_CLASS (code);
51d121a0 782 size_t length = tree_code_size (code);
07e64d6e 783#ifdef GATHER_STATISTICS
19cb6b50 784 tree_node_kind kind;
709c2f34 785
10a9d4cf 786 switch (type)
787 {
ce45a448 788 case tcc_declaration: /* A decl node */
10a9d4cf 789 kind = d_kind;
10a9d4cf 790 break;
791
ce45a448 792 case tcc_type: /* a type node */
10a9d4cf 793 kind = t_kind;
10a9d4cf 794 break;
795
ce45a448 796 case tcc_statement: /* an expression with side effects */
10a9d4cf 797 kind = s_kind;
6663ac46 798 break;
799
ce45a448 800 case tcc_reference: /* a reference */
10a9d4cf 801 kind = r_kind;
6663ac46 802 break;
803
ce45a448 804 case tcc_expression: /* an expression */
805 case tcc_comparison: /* a comparison expression */
806 case tcc_unary: /* a unary arithmetic expression */
807 case tcc_binary: /* a binary arithmetic expression */
10a9d4cf 808 kind = e_kind;
10a9d4cf 809 break;
810
ce45a448 811 case tcc_constant: /* a constant */
10a9d4cf 812 kind = c_kind;
56ad1c9b 813 break;
10a9d4cf 814
ce45a448 815 case tcc_exceptional: /* something random, like an identifier. */
83e38fdd 816 switch (code)
817 {
818 case IDENTIFIER_NODE:
819 kind = id_kind;
820 break;
821
c75b4594 822 case TREE_VEC:
83e38fdd 823 kind = vec_kind;
824 break;
825
826 case TREE_BINFO:
827 kind = binfo_kind;
828 break;
829
83e38fdd 830 case SSA_NAME:
831 kind = ssa_name_kind;
832 break;
833
834 case BLOCK:
835 kind = b_kind;
836 break;
837
c75b4594 838 case CONSTRUCTOR:
839 kind = constr_kind;
840 break;
841
83e38fdd 842 default:
843 kind = x_kind;
844 break;
845 }
49ca1fcd 846 break;
48e1416a 847
83e38fdd 848 default:
849 gcc_unreachable ();
10a9d4cf 850 }
851
9bfff6cb 852 tree_node_counts[(int) kind]++;
853 tree_node_sizes[(int) kind] += length;
10a9d4cf 854#endif
855
1bb42c87 856 if (code == IDENTIFIER_NODE)
45ba1503 857 t = (tree) ggc_alloc_zone_pass_stat (length, &tree_id_zone);
1bb42c87 858 else
45ba1503 859 t = (tree) ggc_alloc_zone_pass_stat (length, &tree_zone);
6663ac46 860
b9a7cc69 861 memset (t, 0, length);
6663ac46 862
10a9d4cf 863 TREE_SET_CODE (t, code);
10a9d4cf 864
865 switch (type)
866 {
ce45a448 867 case tcc_statement:
10a9d4cf 868 TREE_SIDE_EFFECTS (t) = 1;
10a9d4cf 869 break;
870
ce45a448 871 case tcc_declaration:
437f5d6b 872 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
873 {
6c96b31e 874 if (code == FUNCTION_DECL)
875 {
876 DECL_ALIGN (t) = FUNCTION_BOUNDARY;
877 DECL_MODE (t) = FUNCTION_MODE;
878 }
879 else
437f5d6b 880 DECL_ALIGN (t) = 1;
437f5d6b 881 }
346064d9 882 DECL_SOURCE_LOCATION (t) = input_location;
688ff29b 883 if (TREE_CODE (t) == DEBUG_EXPR_DECL)
884 DECL_UID (t) = --next_debug_decl_uid;
885 else
1a981e1a 886 {
887 DECL_UID (t) = next_decl_uid++;
888 SET_DECL_PT_UID (t, -1);
889 }
8115f0af 890 if (TREE_CODE (t) == LABEL_DECL)
891 LABEL_DECL_UID (t) = -1;
94733307 892
10a9d4cf 893 break;
894
ce45a448 895 case tcc_type:
5beefc7b 896 TYPE_UID (t) = next_type_uid++;
d1b5d503 897 TYPE_ALIGN (t) = BITS_PER_UNIT;
aca14577 898 TYPE_USER_ALIGN (t) = 0;
10a9d4cf 899 TYPE_MAIN_VARIANT (t) = t;
6753bca0 900 TYPE_CANONICAL (t) = t;
94733307 901
902 /* Default to no attributes for type, but let target change that. */
9dd95dae 903 TYPE_ATTRIBUTES (t) = NULL_TREE;
883b2e73 904 targetm.set_default_type_attributes (t);
94733307 905
906 /* We have not yet computed the alias set for this type. */
b5ba9f3a 907 TYPE_ALIAS_SET (t) = -1;
10a9d4cf 908 break;
909
ce45a448 910 case tcc_constant:
10a9d4cf 911 TREE_CONSTANT (t) = 1;
912 break;
e5b44228 913
ce45a448 914 case tcc_expression:
e5b44228 915 switch (code)
916 {
917 case INIT_EXPR:
918 case MODIFY_EXPR:
919 case VA_ARG_EXPR:
e5b44228 920 case PREDECREMENT_EXPR:
921 case PREINCREMENT_EXPR:
922 case POSTDECREMENT_EXPR:
923 case POSTINCREMENT_EXPR:
924 /* All of these have side-effects, no matter what their
925 operands are. */
926 TREE_SIDE_EFFECTS (t) = 1;
927 break;
9bfff6cb 928
e5b44228 929 default:
930 break;
931 }
932 break;
ce45a448 933
934 default:
935 /* Other classes need no special treatment. */
936 break;
10a9d4cf 937 }
938
939 return t;
940}
941\f
fa6f5153 942/* Return a new node with the same contents as NODE except that its
6ba31ca8 943 TREE_CHAIN is zero and it has a fresh uid. */
10a9d4cf 944
945tree
674b05f5 946copy_node_stat (tree node MEM_STAT_DECL)
10a9d4cf 947{
19cb6b50 948 tree t;
949 enum tree_code code = TREE_CODE (node);
950 size_t length;
10a9d4cf 951
8c0963c4 952 gcc_assert (code != STATEMENT_LIST);
4ee9c684 953
6663ac46 954 length = tree_size (node);
45ba1503 955 t = (tree) ggc_alloc_zone_pass_stat (length, &tree_zone);
86f9e2d8 956 memcpy (t, node, length);
10a9d4cf 957
75a70cf9 958 TREE_CHAIN (t) = 0;
d40095a0 959 TREE_ASM_WRITTEN (t) = 0;
4ee9c684 960 TREE_VISITED (t) = 0;
8cee8dc0 961 if (code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
962 *DECL_VAR_ANN_PTR (t) = 0;
10a9d4cf 963
ce45a448 964 if (TREE_CODE_CLASS (code) == tcc_declaration)
75fa4f82 965 {
688ff29b 966 if (code == DEBUG_EXPR_DECL)
967 DECL_UID (t) = --next_debug_decl_uid;
968 else
1a981e1a 969 {
970 DECL_UID (t) = next_decl_uid++;
971 if (DECL_PT_UID_SET_P (node))
972 SET_DECL_PT_UID (t, DECL_PT_UID (node));
973 }
75fa4f82 974 if ((TREE_CODE (node) == PARM_DECL || TREE_CODE (node) == VAR_DECL)
975 && DECL_HAS_VALUE_EXPR_P (node))
976 {
977 SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (node));
978 DECL_HAS_VALUE_EXPR_P (t) = 1;
979 }
5ded8c6f 980 if (TREE_CODE (node) == VAR_DECL && DECL_HAS_INIT_PRIORITY_P (node))
981 {
982 SET_DECL_INIT_PRIORITY (t, DECL_INIT_PRIORITY (node));
983 DECL_HAS_INIT_PRIORITY_P (t) = 1;
984 }
75fa4f82 985 }
ce45a448 986 else if (TREE_CODE_CLASS (code) == tcc_type)
0b56cc51 987 {
988 TYPE_UID (t) = next_type_uid++;
29cabea4 989 /* The following is so that the debug code for
990 the copy is different from the original type.
991 The two statements usually duplicate each other
992 (because they clear fields of the same union),
a92771b8 993 but the optimizer should catch that. */
29cabea4 994 TYPE_SYMTAB_POINTER (t) = 0;
995 TYPE_SYMTAB_ADDRESS (t) = 0;
48e1416a 996
1561d3cd 997 /* Do not copy the values cache. */
998 if (TYPE_CACHED_VALUES_P(t))
999 {
1000 TYPE_CACHED_VALUES_P (t) = 0;
1001 TYPE_CACHED_VALUES (t) = NULL_TREE;
1002 }
0b56cc51 1003 }
5beefc7b 1004
10a9d4cf 1005 return t;
1006}
1007
1008/* Return a copy of a chain of nodes, chained through the TREE_CHAIN field.
1009 For example, this can copy a list made of TREE_LIST nodes. */
1010
1011tree
60b8c5b3 1012copy_list (tree list)
10a9d4cf 1013{
1014 tree head;
19cb6b50 1015 tree prev, next;
10a9d4cf 1016
1017 if (list == 0)
1018 return 0;
1019
1020 head = prev = copy_node (list);
1021 next = TREE_CHAIN (list);
1022 while (next)
1023 {
1024 TREE_CHAIN (prev) = copy_node (next);
1025 prev = TREE_CHAIN (prev);
1026 next = TREE_CHAIN (next);
1027 }
1028 return head;
1029}
6efd403b 1030
10a9d4cf 1031\f
7016c612 1032/* Create an INT_CST node with a LOW value sign extended. */
1033
9d0db5ea 1034tree
1035build_int_cst (tree type, HOST_WIDE_INT low)
7016c612 1036{
167a3fa5 1037 /* Support legacy code. */
1038 if (!type)
1039 type = integer_type_node;
1040
95a4a2f1 1041 return build_int_cst_wide (type, low, low < 0 ? -1 : 0);
7016c612 1042}
1043
b7584afd 1044/* Create an INT_CST node with a LOW value in TYPE. The value is sign extended
1045 if it is negative. This function is similar to build_int_cst, but
1046 the extra bits outside of the type precision are cleared. Constants
1047 with these extra bits may confuse the fold so that it detects overflows
1048 even in cases when they do not occur, and in general should be avoided.
1049 We cannot however make this a default behavior of build_int_cst without
1050 more intrusive changes, since there are parts of gcc that rely on the extra
1051 precision of the integer constants. */
dec41e98 1052
1053tree
1054build_int_cst_type (tree type, HOST_WIDE_INT low)
1055{
ca9b061d 1056 unsigned HOST_WIDE_INT low1;
1057 HOST_WIDE_INT hi;
dec41e98 1058
ca9b061d 1059 gcc_assert (type);
b7584afd 1060
ca9b061d 1061 fit_double_type (low, low < 0 ? -1 : 0, &low1, &hi, type);
dec41e98 1062
ca9b061d 1063 return build_int_cst_wide (type, low1, hi);
dec41e98 1064}
1065
b79dc18a 1066/* Constructs tree in type TYPE from with value given by CST. Signedness
1067 of CST is assumed to be the same as the signedness of TYPE. */
1068
1069tree
1070double_int_to_tree (tree type, double_int cst)
1071{
d3bd87c3 1072 /* Size types *are* sign extended. */
1073 bool sign_extended_type = (!TYPE_UNSIGNED (type)
1074 || (TREE_CODE (type) == INTEGER_TYPE
1075 && TYPE_IS_SIZETYPE (type)));
1076
1077 cst = double_int_ext (cst, TYPE_PRECISION (type), !sign_extended_type);
b79dc18a 1078
1079 return build_int_cst_wide (type, cst.low, cst.high);
1080}
1081
1082/* Returns true if CST fits into range of TYPE. Signedness of CST is assumed
1083 to be the same as the signedness of TYPE. */
1084
1085bool
1086double_int_fits_to_tree_p (const_tree type, double_int cst)
1087{
d3bd87c3 1088 /* Size types *are* sign extended. */
1089 bool sign_extended_type = (!TYPE_UNSIGNED (type)
1090 || (TREE_CODE (type) == INTEGER_TYPE
1091 && TYPE_IS_SIZETYPE (type)));
1092
1093 double_int ext
1094 = double_int_ext (cst, TYPE_PRECISION (type), !sign_extended_type);
b79dc18a 1095
1096 return double_int_equal_p (cst, ext);
1097}
1098
743771b6 1099/* These are the hash table functions for the hash table of INTEGER_CST
1100 nodes of a sizetype. */
1101
1102/* Return the hash code code X, an INTEGER_CST. */
1103
1104static hashval_t
1105int_cst_hash_hash (const void *x)
1106{
aae87fc3 1107 const_tree const t = (const_tree) x;
743771b6 1108
1109 return (TREE_INT_CST_HIGH (t) ^ TREE_INT_CST_LOW (t)
1110 ^ htab_hash_pointer (TREE_TYPE (t)));
1111}
1112
1113/* Return nonzero if the value represented by *X (an INTEGER_CST tree node)
1114 is the same as that given by *Y, which is the same. */
1115
1116static int
1117int_cst_hash_eq (const void *x, const void *y)
1118{
aae87fc3 1119 const_tree const xt = (const_tree) x;
1120 const_tree const yt = (const_tree) y;
743771b6 1121
1122 return (TREE_TYPE (xt) == TREE_TYPE (yt)
1123 && TREE_INT_CST_HIGH (xt) == TREE_INT_CST_HIGH (yt)
1124 && TREE_INT_CST_LOW (xt) == TREE_INT_CST_LOW (yt));
1125}
1126
697bbc3f 1127/* Create an INT_CST node of TYPE and value HI:LOW.
1128 The returned node is always shared. For small integers we use a
1129 per-type vector cache, for larger ones we use a single hash table. */
10a9d4cf 1130
1131tree
7016c612 1132build_int_cst_wide (tree type, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi)
10a9d4cf 1133{
7c446c95 1134 tree t;
00b76131 1135 int ix = -1;
1136 int limit = 0;
7c446c95 1137
167a3fa5 1138 gcc_assert (type);
ac13e8d9 1139
00b76131 1140 switch (TREE_CODE (type))
1141 {
1142 case POINTER_TYPE:
1143 case REFERENCE_TYPE:
1144 /* Cache NULL pointer. */
1145 if (!hi && !low)
1146 {
1147 limit = 1;
1148 ix = 0;
1149 }
1150 break;
ac13e8d9 1151
00b76131 1152 case BOOLEAN_TYPE:
1153 /* Cache false or true. */
1154 limit = 2;
1155 if (!hi && low < 2)
1156 ix = low;
1157 break;
ac13e8d9 1158
00b76131 1159 case INTEGER_TYPE:
00b76131 1160 case OFFSET_TYPE:
1161 if (TYPE_UNSIGNED (type))
1162 {
1163 /* Cache 0..N */
1164 limit = INTEGER_SHARE_LIMIT;
1165 if (!hi && low < (unsigned HOST_WIDE_INT)INTEGER_SHARE_LIMIT)
1166 ix = low;
1167 }
1168 else
1169 {
1170 /* Cache -1..N */
1171 limit = INTEGER_SHARE_LIMIT + 1;
1172 if (!hi && low < (unsigned HOST_WIDE_INT)INTEGER_SHARE_LIMIT)
1173 ix = low + 1;
1174 else if (hi == -1 && low == -(unsigned HOST_WIDE_INT)1)
1175 ix = 0;
1176 }
1177 break;
aae57ecf 1178
1179 case ENUMERAL_TYPE:
00b76131 1180 break;
aae57ecf 1181
1182 default:
1183 gcc_unreachable ();
00b76131 1184 }
ac13e8d9 1185
00b76131 1186 if (ix >= 0)
1187 {
743771b6 1188 /* Look for it in the type's vector of small shared ints. */
00b76131 1189 if (!TYPE_CACHED_VALUES_P (type))
1190 {
1191 TYPE_CACHED_VALUES_P (type) = 1;
1192 TYPE_CACHED_VALUES (type) = make_tree_vec (limit);
1193 }
ac13e8d9 1194
00b76131 1195 t = TREE_VEC_ELT (TYPE_CACHED_VALUES (type), ix);
1196 if (t)
1197 {
1198 /* Make sure no one is clobbering the shared constant. */
8c0963c4 1199 gcc_assert (TREE_TYPE (t) == type);
1200 gcc_assert (TREE_INT_CST_LOW (t) == low);
1201 gcc_assert (TREE_INT_CST_HIGH (t) == hi);
743771b6 1202 }
1203 else
1204 {
1205 /* Create a new shared int. */
1206 t = make_node (INTEGER_CST);
1207
1208 TREE_INT_CST_LOW (t) = low;
1209 TREE_INT_CST_HIGH (t) = hi;
1210 TREE_TYPE (t) = type;
48e1416a 1211
743771b6 1212 TREE_VEC_ELT (TYPE_CACHED_VALUES (type), ix) = t;
00b76131 1213 }
1214 }
743771b6 1215 else
1216 {
1217 /* Use the cache of larger shared ints. */
1218 void **slot;
ac13e8d9 1219
743771b6 1220 TREE_INT_CST_LOW (int_cst_node) = low;
1221 TREE_INT_CST_HIGH (int_cst_node) = hi;
1222 TREE_TYPE (int_cst_node) = type;
00b76131 1223
743771b6 1224 slot = htab_find_slot (int_cst_hash_table, int_cst_node, INSERT);
45ba1503 1225 t = (tree) *slot;
743771b6 1226 if (!t)
1227 {
1228 /* Insert this one into the hash table. */
1229 t = int_cst_node;
1230 *slot = t;
1231 /* Make a new node for next time round. */
1232 int_cst_node = make_node (INTEGER_CST);
1233 }
1234 }
ac13e8d9 1235
10a9d4cf 1236 return t;
1237}
1238
dede8dcc 1239/* Builds an integer constant in TYPE such that lowest BITS bits are ones
1240 and the rest are zeros. */
1241
1242tree
1243build_low_bits_mask (tree type, unsigned bits)
1244{
41283922 1245 double_int mask;
dede8dcc 1246
1247 gcc_assert (bits <= TYPE_PRECISION (type));
1248
1249 if (bits == TYPE_PRECISION (type)
1250 && !TYPE_UNSIGNED (type))
41283922 1251 /* Sign extended all-ones mask. */
1252 mask = double_int_minus_one;
dede8dcc 1253 else
41283922 1254 mask = double_int_mask (bits);
dede8dcc 1255
41283922 1256 return build_int_cst_wide (type, mask.low, mask.high);
dede8dcc 1257}
1258
dec41e98 1259/* Checks that X is integer constant that can be expressed in (unsigned)
1260 HOST_WIDE_INT without loss of precision. */
1261
1262bool
720082dc 1263cst_and_fits_in_hwi (const_tree x)
dec41e98 1264{
1265 if (TREE_CODE (x) != INTEGER_CST)
1266 return false;
1267
1268 if (TYPE_PRECISION (TREE_TYPE (x)) > HOST_BITS_PER_WIDE_INT)
1269 return false;
1270
1271 return (TREE_INT_CST_HIGH (x) == 0
1272 || TREE_INT_CST_HIGH (x) == -1);
1273}
1274
886cfd4f 1275/* Return a new VECTOR_CST node whose type is TYPE and whose values
5206b159 1276 are in a list pointed to by VALS. */
886cfd4f 1277
1278tree
60b8c5b3 1279build_vector (tree type, tree vals)
886cfd4f 1280{
1281 tree v = make_node (VECTOR_CST);
f96bd2bf 1282 int over = 0;
886cfd4f 1283 tree link;
1284
1285 TREE_VECTOR_CST_ELTS (v) = vals;
1286 TREE_TYPE (v) = type;
1287
1288 /* Iterate through elements and check for overflow. */
1289 for (link = vals; link; link = TREE_CHAIN (link))
1290 {
1291 tree value = TREE_VALUE (link);
1292
96d5c2e2 1293 /* Don't crash if we get an address constant. */
1294 if (!CONSTANT_CLASS_P (value))
1295 continue;
1296
f96bd2bf 1297 over |= TREE_OVERFLOW (value);
886cfd4f 1298 }
709c2f34 1299
f96bd2bf 1300 TREE_OVERFLOW (v) = over;
886cfd4f 1301 return v;
1302}
1303
c75b4594 1304/* Return a new VECTOR_CST node whose type is TYPE and whose values
1305 are extracted from V, a vector of CONSTRUCTOR_ELT. */
1306
1307tree
1308build_vector_from_ctor (tree type, VEC(constructor_elt,gc) *v)
1309{
1310 tree list = NULL_TREE;
1311 unsigned HOST_WIDE_INT idx;
1312 tree value;
1313
1314 FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
1315 list = tree_cons (NULL_TREE, value, list);
1316 return build_vector (type, nreverse (list));
1317}
1318
46518bf2 1319/* Return a new CONSTRUCTOR node whose type is TYPE and whose values
5206b159 1320 are in the VEC pointed to by VALS. */
46518bf2 1321tree
c75b4594 1322build_constructor (tree type, VEC(constructor_elt,gc) *vals)
46518bf2 1323{
1324 tree c = make_node (CONSTRUCTOR);
8ce9d9df 1325 unsigned int i;
1326 constructor_elt *elt;
1327 bool constant_p = true;
1328
46518bf2 1329 TREE_TYPE (c) = type;
1330 CONSTRUCTOR_ELTS (c) = vals;
8ce9d9df 1331
1332 for (i = 0; VEC_iterate (constructor_elt, vals, i, elt); i++)
1333 if (!TREE_CONSTANT (elt->value))
1334 {
1335 constant_p = false;
1336 break;
1337 }
1338
1339 TREE_CONSTANT (c) = constant_p;
1340
c75b4594 1341 return c;
1342}
1343
1344/* Build a CONSTRUCTOR node made of a single initializer, with the specified
1345 INDEX and VALUE. */
1346tree
1347build_constructor_single (tree type, tree index, tree value)
1348{
1349 VEC(constructor_elt,gc) *v;
1350 constructor_elt *elt;
1351
1352 v = VEC_alloc (constructor_elt, gc, 1);
1353 elt = VEC_quick_push (constructor_elt, v, NULL);
1354 elt->index = index;
1355 elt->value = value;
1356
8ce9d9df 1357 return build_constructor (type, v);
c75b4594 1358}
1359
1360
1361/* Return a new CONSTRUCTOR node whose type is TYPE and whose values
1362 are in a list pointed to by VALS. */
1363tree
1364build_constructor_from_list (tree type, tree vals)
1365{
8ce9d9df 1366 tree t;
c75b4594 1367 VEC(constructor_elt,gc) *v = NULL;
46518bf2 1368
46518bf2 1369 if (vals)
1370 {
c75b4594 1371 v = VEC_alloc (constructor_elt, gc, list_length (vals));
1372 for (t = vals; t; t = TREE_CHAIN (t))
8ce9d9df 1373 CONSTRUCTOR_APPEND_ELT (v, TREE_PURPOSE (t), TREE_VALUE (t));
46518bf2 1374 }
46518bf2 1375
8ce9d9df 1376 return build_constructor (type, v);
46518bf2 1377}
1378
06f0b99c 1379/* Return a new FIXED_CST node whose type is TYPE and value is F. */
1380
1381tree
1382build_fixed (tree type, FIXED_VALUE_TYPE f)
1383{
1384 tree v;
1385 FIXED_VALUE_TYPE *fp;
1386
1387 v = make_node (FIXED_CST);
45ba1503 1388 fp = GGC_NEW (FIXED_VALUE_TYPE);
06f0b99c 1389 memcpy (fp, &f, sizeof (FIXED_VALUE_TYPE));
1390
1391 TREE_TYPE (v) = type;
1392 TREE_FIXED_CST_PTR (v) = fp;
1393 return v;
1394}
c75b4594 1395
10a9d4cf 1396/* Return a new REAL_CST node whose type is TYPE and value is D. */
1397
1398tree
60b8c5b3 1399build_real (tree type, REAL_VALUE_TYPE d)
10a9d4cf 1400{
1401 tree v;
ef258422 1402 REAL_VALUE_TYPE *dp;
e31c27ad 1403 int overflow = 0;
10a9d4cf 1404
aa870c1b 1405 /* ??? Used to check for overflow here via CHECK_FLOAT_TYPE.
1406 Consider doing it via real_convert now. */
10a9d4cf 1407
1408 v = make_node (REAL_CST);
45ba1503 1409 dp = GGC_NEW (REAL_VALUE_TYPE);
ef258422 1410 memcpy (dp, &d, sizeof (REAL_VALUE_TYPE));
6c34d0c2 1411
10a9d4cf 1412 TREE_TYPE (v) = type;
ef258422 1413 TREE_REAL_CST_PTR (v) = dp;
f96bd2bf 1414 TREE_OVERFLOW (v) = overflow;
10a9d4cf 1415 return v;
1416}
1417
1418/* Return a new REAL_CST node whose type is TYPE
1419 and whose value is the integer value of the INTEGER_CST node I. */
1420
10a9d4cf 1421REAL_VALUE_TYPE
720082dc 1422real_value_from_int_cst (const_tree type, const_tree i)
10a9d4cf 1423{
1424 REAL_VALUE_TYPE d;
04eb37c0 1425
a3a81d87 1426 /* Clear all bits of the real value type so that we can later do
1427 bitwise comparisons to see if two values are the same. */
f0af5a88 1428 memset (&d, 0, sizeof d);
a3a81d87 1429
67c65562 1430 real_from_integer (&d, type ? TYPE_MODE (type) : VOIDmode,
1431 TREE_INT_CST_LOW (i), TREE_INT_CST_HIGH (i),
78a8ed03 1432 TYPE_UNSIGNED (TREE_TYPE (i)));
10a9d4cf 1433 return d;
1434}
1435
083a2b5e 1436/* Given a tree representing an integer constant I, return a tree
536f5fb1 1437 representing the same value as a floating-point constant of type TYPE. */
10a9d4cf 1438
1439tree
720082dc 1440build_real_from_int_cst (tree type, const_tree i)
10a9d4cf 1441{
1442 tree v;
1aa16793 1443 int overflow = TREE_OVERFLOW (i);
10a9d4cf 1444
ef258422 1445 v = build_real (type, real_value_from_int_cst (type, i));
10a9d4cf 1446
ef258422 1447 TREE_OVERFLOW (v) |= overflow;
10a9d4cf 1448 return v;
1449}
1450
10a9d4cf 1451/* Return a newly constructed STRING_CST node whose value is
1452 the LEN characters at STR.
1453 The TREE_TYPE is not initialized. */
1454
1455tree
60b8c5b3 1456build_string (int len, const char *str)
10a9d4cf 1457{
d5406300 1458 tree s;
1459 size_t length;
65c79db3 1460
1461 /* Do not waste bytes provided by padding of struct tree_string. */
1462 length = len + offsetof (struct tree_string, str) + 1;
d5406300 1463
1464#ifdef GATHER_STATISTICS
1465 tree_node_counts[(int) c_kind]++;
1466 tree_node_sizes[(int) c_kind] += length;
48e1416a 1467#endif
d5406300 1468
1469 s = ggc_alloc_tree (length);
083a2b5e 1470
d5406300 1471 memset (s, 0, sizeof (struct tree_common));
1472 TREE_SET_CODE (s, STRING_CST);
152994e1 1473 TREE_CONSTANT (s) = 1;
10a9d4cf 1474 TREE_STRING_LENGTH (s) = len;
e47a6f81 1475 memcpy (s->string.str, str, len);
1476 s->string.str[len] = '\0';
083a2b5e 1477
10a9d4cf 1478 return s;
1479}
1480
1481/* Return a newly constructed COMPLEX_CST node whose value is
1482 specified by the real and imaginary parts REAL and IMAG.
13079119 1483 Both REAL and IMAG should be constant nodes. TYPE, if specified,
1484 will be the type of the COMPLEX_CST; otherwise a new type will be made. */
10a9d4cf 1485
1486tree
60b8c5b3 1487build_complex (tree type, tree real, tree imag)
10a9d4cf 1488{
19cb6b50 1489 tree t = make_node (COMPLEX_CST);
1aa16793 1490
10a9d4cf 1491 TREE_REALPART (t) = real;
1492 TREE_IMAGPART (t) = imag;
13079119 1493 TREE_TYPE (t) = type ? type : build_complex_type (TREE_TYPE (real));
1aa16793 1494 TREE_OVERFLOW (t) = TREE_OVERFLOW (real) | TREE_OVERFLOW (imag);
10a9d4cf 1495 return t;
1496}
1497
ba56cb50 1498/* Return a constant of arithmetic type TYPE which is the
a3a710ae 1499 multiplicative identity of the set TYPE. */
ba56cb50 1500
1501tree
1502build_one_cst (tree type)
1503{
1504 switch (TREE_CODE (type))
1505 {
1506 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
1507 case POINTER_TYPE: case REFERENCE_TYPE:
1508 case OFFSET_TYPE:
1509 return build_int_cst (type, 1);
1510
1511 case REAL_TYPE:
1512 return build_real (type, dconst1);
1513
06f0b99c 1514 case FIXED_POINT_TYPE:
1515 /* We can only generate 1 for accum types. */
1516 gcc_assert (ALL_SCALAR_ACCUM_MODE_P (TYPE_MODE (type)));
1517 return build_fixed (type, FCONST1(TYPE_MODE (type)));
1518
ba56cb50 1519 case VECTOR_TYPE:
1520 {
1521 tree scalar, cst;
1522 int i;
1523
1524 scalar = build_one_cst (TREE_TYPE (type));
1525
1526 /* Create 'vect_cst_ = {cst,cst,...,cst}' */
1527 cst = NULL_TREE;
1528 for (i = TYPE_VECTOR_SUBPARTS (type); --i >= 0; )
1529 cst = tree_cons (NULL_TREE, scalar, cst);
1530
1531 return build_vector (type, cst);
1532 }
1533
1534 case COMPLEX_TYPE:
1535 return build_complex (type,
1536 build_one_cst (TREE_TYPE (type)),
1537 fold_convert (TREE_TYPE (type), integer_zero_node));
1538
1539 default:
1540 gcc_unreachable ();
1541 }
1542}
1543
3cb98335 1544/* Build a BINFO with LEN language slots. */
1545
1546tree
f6cc6a08 1547make_tree_binfo_stat (unsigned base_binfos MEM_STAT_DECL)
3cb98335 1548{
1549 tree t;
f6cc6a08 1550 size_t length = (offsetof (struct tree_binfo, base_binfos)
1551 + VEC_embedded_size (tree, base_binfos));
b27ac6b5 1552
3cb98335 1553#ifdef GATHER_STATISTICS
1554 tree_node_counts[(int) binfo_kind]++;
1555 tree_node_sizes[(int) binfo_kind] += length;
1556#endif
1557
45ba1503 1558 t = (tree) ggc_alloc_zone_pass_stat (length, &tree_zone);
3cb98335 1559
f6cc6a08 1560 memset (t, 0, offsetof (struct tree_binfo, base_binfos));
3cb98335 1561
1562 TREE_SET_CODE (t, TREE_BINFO);
b27ac6b5 1563
f6cc6a08 1564 VEC_embedded_init (tree, BINFO_BASE_BINFOS (t), base_binfos);
3cb98335 1565
1566 return t;
1567}
1568
1569
10a9d4cf 1570/* Build a newly constructed TREE_VEC node of length LEN. */
a92771b8 1571
10a9d4cf 1572tree
674b05f5 1573make_tree_vec_stat (int len MEM_STAT_DECL)
10a9d4cf 1574{
19cb6b50 1575 tree t;
709c2f34 1576 int length = (len - 1) * sizeof (tree) + sizeof (struct tree_vec);
10a9d4cf 1577
1578#ifdef GATHER_STATISTICS
709c2f34 1579 tree_node_counts[(int) vec_kind]++;
1580 tree_node_sizes[(int) vec_kind] += length;
10a9d4cf 1581#endif
1582
45ba1503 1583 t = (tree) ggc_alloc_zone_pass_stat (length, &tree_zone);
ad31d6ab 1584
b9a7cc69 1585 memset (t, 0, length);
674b05f5 1586
10a9d4cf 1587 TREE_SET_CODE (t, TREE_VEC);
1588 TREE_VEC_LENGTH (t) = len;
10a9d4cf 1589
1590 return t;
1591}
1592\f
c29fe334 1593/* Return 1 if EXPR is the integer constant zero or a complex constant
1594 of zero. */
10a9d4cf 1595
1596int
720082dc 1597integer_zerop (const_tree expr)
10a9d4cf 1598{
84bf2ad1 1599 STRIP_NOPS (expr);
10a9d4cf 1600
c29fe334 1601 return ((TREE_CODE (expr) == INTEGER_CST
1602 && TREE_INT_CST_LOW (expr) == 0
1603 && TREE_INT_CST_HIGH (expr) == 0)
1604 || (TREE_CODE (expr) == COMPLEX_CST
1605 && integer_zerop (TREE_REALPART (expr))
1606 && integer_zerop (TREE_IMAGPART (expr))));
10a9d4cf 1607}
1608
c29fe334 1609/* Return 1 if EXPR is the integer constant one or the corresponding
1610 complex constant. */
10a9d4cf 1611
1612int
720082dc 1613integer_onep (const_tree expr)
10a9d4cf 1614{
84bf2ad1 1615 STRIP_NOPS (expr);
10a9d4cf 1616
c29fe334 1617 return ((TREE_CODE (expr) == INTEGER_CST
1618 && TREE_INT_CST_LOW (expr) == 1
1619 && TREE_INT_CST_HIGH (expr) == 0)
1620 || (TREE_CODE (expr) == COMPLEX_CST
1621 && integer_onep (TREE_REALPART (expr))
1622 && integer_zerop (TREE_IMAGPART (expr))));
10a9d4cf 1623}
1624
c29fe334 1625/* Return 1 if EXPR is an integer containing all 1's in as much precision as
1626 it contains. Likewise for the corresponding complex constant. */
10a9d4cf 1627
1628int
720082dc 1629integer_all_onesp (const_tree expr)
10a9d4cf 1630{
19cb6b50 1631 int prec;
1632 int uns;
10a9d4cf 1633
84bf2ad1 1634 STRIP_NOPS (expr);
10a9d4cf 1635
c29fe334 1636 if (TREE_CODE (expr) == COMPLEX_CST
1637 && integer_all_onesp (TREE_REALPART (expr))
1638 && integer_zerop (TREE_IMAGPART (expr)))
1639 return 1;
1640
ff674908 1641 else if (TREE_CODE (expr) != INTEGER_CST)
10a9d4cf 1642 return 0;
1643
78a8ed03 1644 uns = TYPE_UNSIGNED (TREE_TYPE (expr));
0c3502bc 1645 if (TREE_INT_CST_LOW (expr) == ~(unsigned HOST_WIDE_INT) 0
1646 && TREE_INT_CST_HIGH (expr) == -1)
1647 return 1;
10a9d4cf 1648 if (!uns)
0c3502bc 1649 return 0;
10a9d4cf 1650
94fa8241 1651 /* Note that using TYPE_PRECISION here is wrong. We care about the
1652 actual bits, not the (arbitrary) range of the type. */
1653 prec = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (expr)));
89e66659 1654 if (prec >= HOST_BITS_PER_WIDE_INT)
10a9d4cf 1655 {
a0c2c45b 1656 HOST_WIDE_INT high_value;
1657 int shift_amount;
10a9d4cf 1658
89e66659 1659 shift_amount = prec - HOST_BITS_PER_WIDE_INT;
10a9d4cf 1660
8c0963c4 1661 /* Can not handle precisions greater than twice the host int size. */
1662 gcc_assert (shift_amount <= HOST_BITS_PER_WIDE_INT);
1663 if (shift_amount == HOST_BITS_PER_WIDE_INT)
10a9d4cf 1664 /* Shifting by the host word size is undefined according to the ANSI
1665 standard, so we must handle this as a special case. */
1666 high_value = -1;
1667 else
89e66659 1668 high_value = ((HOST_WIDE_INT) 1 << shift_amount) - 1;
10a9d4cf 1669
9bfff6cb 1670 return (TREE_INT_CST_LOW (expr) == ~(unsigned HOST_WIDE_INT) 0
a0c2c45b 1671 && TREE_INT_CST_HIGH (expr) == high_value);
10a9d4cf 1672 }
1673 else
a0c2c45b 1674 return TREE_INT_CST_LOW (expr) == ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
10a9d4cf 1675}
1676
1677/* Return 1 if EXPR is an integer constant that is a power of 2 (i.e., has only
1678 one bit on). */
1679
1680int
720082dc 1681integer_pow2p (const_tree expr)
10a9d4cf 1682{
ca641ef1 1683 int prec;
89e66659 1684 HOST_WIDE_INT high, low;
10a9d4cf 1685
84bf2ad1 1686 STRIP_NOPS (expr);
10a9d4cf 1687
c29fe334 1688 if (TREE_CODE (expr) == COMPLEX_CST
1689 && integer_pow2p (TREE_REALPART (expr))
1690 && integer_zerop (TREE_IMAGPART (expr)))
1691 return 1;
1692
ff674908 1693 if (TREE_CODE (expr) != INTEGER_CST)
10a9d4cf 1694 return 0;
1695
aaf45dfe 1696 prec = TYPE_PRECISION (TREE_TYPE (expr));
10a9d4cf 1697 high = TREE_INT_CST_HIGH (expr);
1698 low = TREE_INT_CST_LOW (expr);
1699
ca641ef1 1700 /* First clear all bits that are beyond the type's precision in case
1701 we've been sign extended. */
1702
1703 if (prec == 2 * HOST_BITS_PER_WIDE_INT)
1704 ;
1705 else if (prec > HOST_BITS_PER_WIDE_INT)
1706 high &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
1707 else
1708 {
1709 high = 0;
1710 if (prec < HOST_BITS_PER_WIDE_INT)
1711 low &= ~((HOST_WIDE_INT) (-1) << prec);
1712 }
1713
10a9d4cf 1714 if (high == 0 && low == 0)
1715 return 0;
1716
1717 return ((high == 0 && (low & (low - 1)) == 0)
1718 || (low == 0 && (high & (high - 1)) == 0));
1719}
1720
805e22b2 1721/* Return 1 if EXPR is an integer constant other than zero or a
1722 complex constant other than zero. */
1723
1724int
720082dc 1725integer_nonzerop (const_tree expr)
805e22b2 1726{
1727 STRIP_NOPS (expr);
1728
1729 return ((TREE_CODE (expr) == INTEGER_CST
805e22b2 1730 && (TREE_INT_CST_LOW (expr) != 0
1731 || TREE_INT_CST_HIGH (expr) != 0))
1732 || (TREE_CODE (expr) == COMPLEX_CST
1733 && (integer_nonzerop (TREE_REALPART (expr))
1734 || integer_nonzerop (TREE_IMAGPART (expr)))));
1735}
1736
06f0b99c 1737/* Return 1 if EXPR is the fixed-point constant zero. */
1738
1739int
4dc2a232 1740fixed_zerop (const_tree expr)
06f0b99c 1741{
1742 return (TREE_CODE (expr) == FIXED_CST
1743 && double_int_zero_p (TREE_FIXED_CST (expr).data));
1744}
1745
ca641ef1 1746/* Return the power of two represented by a tree node known to be a
1747 power of two. */
1748
1749int
720082dc 1750tree_log2 (const_tree expr)
ca641ef1 1751{
1752 int prec;
1753 HOST_WIDE_INT high, low;
1754
1755 STRIP_NOPS (expr);
1756
1757 if (TREE_CODE (expr) == COMPLEX_CST)
1758 return tree_log2 (TREE_REALPART (expr));
1759
aaf45dfe 1760 prec = TYPE_PRECISION (TREE_TYPE (expr));
ca641ef1 1761 high = TREE_INT_CST_HIGH (expr);
1762 low = TREE_INT_CST_LOW (expr);
1763
1764 /* First clear all bits that are beyond the type's precision in case
1765 we've been sign extended. */
1766
1767 if (prec == 2 * HOST_BITS_PER_WIDE_INT)
1768 ;
1769 else if (prec > HOST_BITS_PER_WIDE_INT)
1770 high &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
1771 else
1772 {
1773 high = 0;
1774 if (prec < HOST_BITS_PER_WIDE_INT)
1775 low &= ~((HOST_WIDE_INT) (-1) << prec);
1776 }
1777
1778 return (high != 0 ? HOST_BITS_PER_WIDE_INT + exact_log2 (high)
9bfff6cb 1779 : exact_log2 (low));
ca641ef1 1780}
1781
a0c2c45b 1782/* Similar, but return the largest integer Y such that 2 ** Y is less
1783 than or equal to EXPR. */
1784
1785int
720082dc 1786tree_floor_log2 (const_tree expr)
a0c2c45b 1787{
1788 int prec;
1789 HOST_WIDE_INT high, low;
1790
1791 STRIP_NOPS (expr);
1792
1793 if (TREE_CODE (expr) == COMPLEX_CST)
1794 return tree_log2 (TREE_REALPART (expr));
1795
aaf45dfe 1796 prec = TYPE_PRECISION (TREE_TYPE (expr));
a0c2c45b 1797 high = TREE_INT_CST_HIGH (expr);
1798 low = TREE_INT_CST_LOW (expr);
1799
1800 /* First clear all bits that are beyond the type's precision in case
1801 we've been sign extended. Ignore if type's precision hasn't been set
1802 since what we are doing is setting it. */
1803
1804 if (prec == 2 * HOST_BITS_PER_WIDE_INT || prec == 0)
1805 ;
1806 else if (prec > HOST_BITS_PER_WIDE_INT)
1807 high &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));
1808 else
1809 {
1810 high = 0;
1811 if (prec < HOST_BITS_PER_WIDE_INT)
1812 low &= ~((HOST_WIDE_INT) (-1) << prec);
1813 }
1814
1815 return (high != 0 ? HOST_BITS_PER_WIDE_INT + floor_log2 (high)
1816 : floor_log2 (low));
1817}
1818
fcd5ffce 1819/* Return 1 if EXPR is the real constant zero. Trailing zeroes matter for
1820 decimal float constants, so don't return 1 for them. */
10a9d4cf 1821
1822int
720082dc 1823real_zerop (const_tree expr)
10a9d4cf 1824{
84bf2ad1 1825 STRIP_NOPS (expr);
10a9d4cf 1826
c29fe334 1827 return ((TREE_CODE (expr) == REAL_CST
fcd5ffce 1828 && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst0)
1829 && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))))
c29fe334 1830 || (TREE_CODE (expr) == COMPLEX_CST
1831 && real_zerop (TREE_REALPART (expr))
1832 && real_zerop (TREE_IMAGPART (expr))));
10a9d4cf 1833}
1834
fcd5ffce 1835/* Return 1 if EXPR is the real constant one in real or complex form.
1836 Trailing zeroes matter for decimal float constants, so don't return
1837 1 for them. */
10a9d4cf 1838
1839int
720082dc 1840real_onep (const_tree expr)
10a9d4cf 1841{
84bf2ad1 1842 STRIP_NOPS (expr);
10a9d4cf 1843
c29fe334 1844 return ((TREE_CODE (expr) == REAL_CST
fcd5ffce 1845 && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst1)
1846 && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))))
c29fe334 1847 || (TREE_CODE (expr) == COMPLEX_CST
1848 && real_onep (TREE_REALPART (expr))
1849 && real_zerop (TREE_IMAGPART (expr))));
10a9d4cf 1850}
1851
fcd5ffce 1852/* Return 1 if EXPR is the real constant two. Trailing zeroes matter
1853 for decimal float constants, so don't return 1 for them. */
10a9d4cf 1854
1855int
720082dc 1856real_twop (const_tree expr)
10a9d4cf 1857{
84bf2ad1 1858 STRIP_NOPS (expr);
10a9d4cf 1859
c29fe334 1860 return ((TREE_CODE (expr) == REAL_CST
fcd5ffce 1861 && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst2)
1862 && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))))
c29fe334 1863 || (TREE_CODE (expr) == COMPLEX_CST
1864 && real_twop (TREE_REALPART (expr))
1865 && real_zerop (TREE_IMAGPART (expr))));
10a9d4cf 1866}
1867
fcd5ffce 1868/* Return 1 if EXPR is the real constant minus one. Trailing zeroes
1869 matter for decimal float constants, so don't return 1 for them. */
19fe5401 1870
1871int
720082dc 1872real_minus_onep (const_tree expr)
19fe5401 1873{
1874 STRIP_NOPS (expr);
1875
1876 return ((TREE_CODE (expr) == REAL_CST
fcd5ffce 1877 && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconstm1)
1878 && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))))
19fe5401 1879 || (TREE_CODE (expr) == COMPLEX_CST
1880 && real_minus_onep (TREE_REALPART (expr))
1881 && real_zerop (TREE_IMAGPART (expr))));
1882}
1883
10a9d4cf 1884/* Nonzero if EXP is a constant or a cast of a constant. */
9bfff6cb 1885
10a9d4cf 1886int
720082dc 1887really_constant_p (const_tree exp)
10a9d4cf 1888{
84bf2ad1 1889 /* This is not quite the same as STRIP_NOPS. It does more. */
72dd6141 1890 while (CONVERT_EXPR_P (exp)
10a9d4cf 1891 || TREE_CODE (exp) == NON_LVALUE_EXPR)
1892 exp = TREE_OPERAND (exp, 0);
1893 return TREE_CONSTANT (exp);
1894}
1895\f
1896/* Return first list element whose TREE_VALUE is ELEM.
edee2468 1897 Return 0 if ELEM is not in LIST. */
10a9d4cf 1898
1899tree
60b8c5b3 1900value_member (tree elem, tree list)
10a9d4cf 1901{
1902 while (list)
1903 {
1904 if (elem == TREE_VALUE (list))
1905 return list;
1906 list = TREE_CHAIN (list);
1907 }
1908 return NULL_TREE;
1909}
1910
1911/* Return first list element whose TREE_PURPOSE is ELEM.
edee2468 1912 Return 0 if ELEM is not in LIST. */
10a9d4cf 1913
1914tree
720082dc 1915purpose_member (const_tree elem, tree list)
10a9d4cf 1916{
1917 while (list)
1918 {
1919 if (elem == TREE_PURPOSE (list))
1920 return list;
1921 list = TREE_CHAIN (list);
10a9d4cf 1922 }
1923 return NULL_TREE;
1924}
1925
7616de93 1926/* Returns element number IDX (zero-origin) of chain CHAIN, or
1927 NULL_TREE. */
1928
1929tree
1930chain_index (int idx, tree chain)
1931{
1932 for (; chain && idx > 0; --idx)
1933 chain = TREE_CHAIN (chain);
1934 return chain;
1935}
1936
a92771b8 1937/* Return nonzero if ELEM is part of the chain CHAIN. */
10a9d4cf 1938
1939int
720082dc 1940chain_member (const_tree elem, const_tree chain)
10a9d4cf 1941{
1942 while (chain)
1943 {
1944 if (elem == chain)
1945 return 1;
1946 chain = TREE_CHAIN (chain);
1947 }
1948
1949 return 0;
1950}
1951
1952/* Return the length of a chain of nodes chained through TREE_CHAIN.
1953 We expect a null pointer to mark the end of the chain.
1954 This is the Lisp primitive `length'. */
1955
1956int
720082dc 1957list_length (const_tree t)
10a9d4cf 1958{
720082dc 1959 const_tree p = t;
393b349a 1960#ifdef ENABLE_TREE_CHECKING
720082dc 1961 const_tree q = t;
393b349a 1962#endif
19cb6b50 1963 int len = 0;
10a9d4cf 1964
393b349a 1965 while (p)
1966 {
1967 p = TREE_CHAIN (p);
1968#ifdef ENABLE_TREE_CHECKING
1969 if (len % 2)
1970 q = TREE_CHAIN (q);
8c0963c4 1971 gcc_assert (p != q);
393b349a 1972#endif
1973 len++;
1974 }
10a9d4cf 1975
1976 return len;
1977}
1978
efd3939c 1979/* Returns the number of FIELD_DECLs in TYPE. */
1980
1981int
720082dc 1982fields_length (const_tree type)
efd3939c 1983{
1984 tree t = TYPE_FIELDS (type);
1985 int count = 0;
1986
1987 for (; t; t = TREE_CHAIN (t))
1988 if (TREE_CODE (t) == FIELD_DECL)
1989 ++count;
1990
1991 return count;
1992}
1993
8df5a43d 1994/* Returns the first FIELD_DECL in the TYPE_FIELDS of the RECORD_TYPE or
1995 UNION_TYPE TYPE, or NULL_TREE if none. */
1996
1997tree
1998first_field (const_tree type)
1999{
2000 tree t = TYPE_FIELDS (type);
2001 while (t && TREE_CODE (t) != FIELD_DECL)
2002 t = TREE_CHAIN (t);
2003 return t;
2004}
2005
10a9d4cf 2006/* Concatenate two chains of nodes (chained through TREE_CHAIN)
2007 by modifying the last node in chain 1 to point to chain 2.
2008 This is the Lisp primitive `nconc'. */
2009
2010tree
60b8c5b3 2011chainon (tree op1, tree op2)
10a9d4cf 2012{
4d2aa485 2013 tree t1;
10a9d4cf 2014
4d2aa485 2015 if (!op1)
2016 return op2;
2017 if (!op2)
2018 return op1;
2019
2020 for (t1 = op1; TREE_CHAIN (t1); t1 = TREE_CHAIN (t1))
2021 continue;
2022 TREE_CHAIN (t1) = op2;
cb764359 2023
0c4e40c5 2024#ifdef ENABLE_TREE_CHECKING
4d2aa485 2025 {
2026 tree t2;
2027 for (t2 = op2; t2; t2 = TREE_CHAIN (t2))
8c0963c4 2028 gcc_assert (t2 != t1);
4d2aa485 2029 }
5fd99be7 2030#endif
4d2aa485 2031
2032 return op1;
10a9d4cf 2033}
2034
2035/* Return the last node in a chain of nodes (chained through TREE_CHAIN). */
2036
2037tree
60b8c5b3 2038tree_last (tree chain)
10a9d4cf 2039{
19cb6b50 2040 tree next;
10a9d4cf 2041 if (chain)
07e64d6e 2042 while ((next = TREE_CHAIN (chain)))
10a9d4cf 2043 chain = next;
2044 return chain;
2045}
2046
2047/* Reverse the order of elements in the chain T,
2048 and return the new head of the chain (old last element). */
2049
2050tree
60b8c5b3 2051nreverse (tree t)
10a9d4cf 2052{
19cb6b50 2053 tree prev = 0, decl, next;
10a9d4cf 2054 for (decl = t; decl; decl = next)
2055 {
2056 next = TREE_CHAIN (decl);
2057 TREE_CHAIN (decl) = prev;
2058 prev = decl;
2059 }
2060 return prev;
2061}
10a9d4cf 2062\f
2063/* Return a newly created TREE_LIST node whose
2064 purpose and value fields are PARM and VALUE. */
2065
2066tree
674b05f5 2067build_tree_list_stat (tree parm, tree value MEM_STAT_DECL)
10a9d4cf 2068{
674b05f5 2069 tree t = make_node_stat (TREE_LIST PASS_MEM_STAT);
10a9d4cf 2070 TREE_PURPOSE (t) = parm;
2071 TREE_VALUE (t) = value;
2072 return t;
2073}
2074
f352a3fb 2075/* Build a chain of TREE_LIST nodes from a vector. */
2076
2077tree
2078build_tree_list_vec_stat (const VEC(tree,gc) *vec MEM_STAT_DECL)
2079{
2080 tree ret = NULL_TREE;
2081 tree *pp = &ret;
2082 unsigned int i;
2083 tree t;
2084 for (i = 0; VEC_iterate (tree, vec, i, t); ++i)
2085 {
2086 *pp = build_tree_list_stat (NULL, t PASS_MEM_STAT);
2087 pp = &TREE_CHAIN (*pp);
2088 }
2089 return ret;
2090}
2091
10a9d4cf 2092/* Return a newly created TREE_LIST node whose
52b078bc 2093 purpose and value fields are PURPOSE and VALUE
10a9d4cf 2094 and whose TREE_CHAIN is CHAIN. */
2095
2096tree
674b05f5 2097tree_cons_stat (tree purpose, tree value, tree chain MEM_STAT_DECL)
10a9d4cf 2098{
19cb6b50 2099 tree node;
1bfd55c5 2100
45ba1503 2101 node = (tree) ggc_alloc_zone_pass_stat (sizeof (struct tree_list), &tree_zone);
791ceafe 2102
2103 memset (node, 0, sizeof (struct tree_common));
1bfd55c5 2104
10a9d4cf 2105#ifdef GATHER_STATISTICS
eff5f036 2106 tree_node_counts[(int) x_kind]++;
2107 tree_node_sizes[(int) x_kind] += sizeof (struct tree_list);
10a9d4cf 2108#endif
2109
10a9d4cf 2110 TREE_SET_CODE (node, TREE_LIST);
10a9d4cf 2111 TREE_CHAIN (node) = chain;
2112 TREE_PURPOSE (node) = purpose;
2113 TREE_VALUE (node) = value;
2114 return node;
2115}
2116
f352a3fb 2117/* Return the values of the elements of a CONSTRUCTOR as a vector of
2118 trees. */
2119
2120VEC(tree,gc) *
2121ctor_to_vec (tree ctor)
2122{
2123 VEC(tree, gc) *vec = VEC_alloc (tree, gc, CONSTRUCTOR_NELTS (ctor));
2124 unsigned int ix;
2125 tree val;
2126
2127 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), ix, val)
2128 VEC_quick_push (tree, vec, val);
2129
2130 return vec;
2131}
10a9d4cf 2132\f
2133/* Return the size nominally occupied by an object of type TYPE
2134 when it resides in memory. The value is measured in units of bytes,
2135 and its data type is that normally used for type sizes
2136 (which is the first type created by make_signed_type or
2137 make_unsigned_type). */
2138
2139tree
f8fd23c0 2140size_in_bytes (const_tree type)
10a9d4cf 2141{
a7478f11 2142 tree t;
2143
10a9d4cf 2144 if (type == error_mark_node)
2145 return integer_zero_node;
cec6c892 2146
10a9d4cf 2147 type = TYPE_MAIN_VARIANT (type);
cec6c892 2148 t = TYPE_SIZE_UNIT (type);
083a2b5e 2149
cec6c892 2150 if (t == 0)
10a9d4cf 2151 {
dc24ddbd 2152 lang_hooks.types.incomplete_type_error (NULL_TREE, type);
786414ee 2153 return size_zero_node;
10a9d4cf 2154 }
083a2b5e 2155
a7478f11 2156 return t;
10a9d4cf 2157}
2158
997d68fe 2159/* Return the size of TYPE (in bytes) as a wide integer
2160 or return -1 if the size can vary or is larger than an integer. */
10a9d4cf 2161
997d68fe 2162HOST_WIDE_INT
720082dc 2163int_size_in_bytes (const_tree type)
10a9d4cf 2164{
997d68fe 2165 tree t;
2166
10a9d4cf 2167 if (type == error_mark_node)
2168 return 0;
997d68fe 2169
10a9d4cf 2170 type = TYPE_MAIN_VARIANT (type);
cec6c892 2171 t = TYPE_SIZE_UNIT (type);
2172 if (t == 0
2173 || TREE_CODE (t) != INTEGER_CST
5d844ba2 2174 || TREE_INT_CST_HIGH (t) != 0
2175 /* If the result would appear negative, it's too big to represent. */
2176 || (HOST_WIDE_INT) TREE_INT_CST_LOW (t) < 0)
10a9d4cf 2177 return -1;
997d68fe 2178
2179 return TREE_INT_CST_LOW (t);
10a9d4cf 2180}
150edb07 2181
2182/* Return the maximum size of TYPE (in bytes) as a wide integer
2183 or return -1 if the size can vary or is larger than an integer. */
2184
2185HOST_WIDE_INT
f8fd23c0 2186max_int_size_in_bytes (const_tree type)
150edb07 2187{
2188 HOST_WIDE_INT size = -1;
2189 tree size_tree;
2190
2191 /* If this is an array type, check for a possible MAX_SIZE attached. */
2192
2193 if (TREE_CODE (type) == ARRAY_TYPE)
2194 {
2195 size_tree = TYPE_ARRAY_MAX_SIZE (type);
2196
2197 if (size_tree && host_integerp (size_tree, 1))
2198 size = tree_low_cst (size_tree, 1);
2199 }
2200
2201 /* If we still haven't been able to get a size, see if the language
2202 can compute a maximum size. */
2203
2204 if (size == -1)
2205 {
2206 size_tree = lang_hooks.types.max_size (type);
2207
2208 if (size_tree && host_integerp (size_tree, 1))
2209 size = tree_low_cst (size_tree, 1);
2210 }
2211
2212 return size;
2213}
92ddcd97 2214
2215/* Returns a tree for the size of EXP in bytes. */
2216
2217tree
2218tree_expr_size (const_tree exp)
2219{
2220 if (DECL_P (exp)
2221 && DECL_SIZE_UNIT (exp) != 0)
2222 return DECL_SIZE_UNIT (exp);
2223 else
2224 return size_in_bytes (TREE_TYPE (exp));
2225}
5d844ba2 2226\f
2227/* Return the bit position of FIELD, in bits from the start of the record.
2228 This is a tree of type bitsizetype. */
2229
2230tree
720082dc 2231bit_position (const_tree field)
5d844ba2 2232{
6d731e4d 2233 return bit_from_pos (DECL_FIELD_OFFSET (field),
2234 DECL_FIELD_BIT_OFFSET (field));
5d844ba2 2235}
fe352cf1 2236
1fa3a8f6 2237/* Likewise, but return as an integer. It must be representable in
2238 that way (since it could be a signed value, we don't have the
2239 option of returning -1 like int_size_in_byte can. */
5d844ba2 2240
2241HOST_WIDE_INT
720082dc 2242int_bit_position (const_tree field)
5d844ba2 2243{
2244 return tree_low_cst (bit_position (field), 0);
2245}
2246\f
02e7a332 2247/* Return the byte position of FIELD, in bytes from the start of the record.
2248 This is a tree of type sizetype. */
2249
2250tree
720082dc 2251byte_position (const_tree field)
02e7a332 2252{
6d731e4d 2253 return byte_from_pos (DECL_FIELD_OFFSET (field),
2254 DECL_FIELD_BIT_OFFSET (field));
02e7a332 2255}
2256
1fa3a8f6 2257/* Likewise, but return as an integer. It must be representable in
2258 that way (since it could be a signed value, we don't have the
2259 option of returning -1 like int_size_in_byte can. */
02e7a332 2260
2261HOST_WIDE_INT
720082dc 2262int_byte_position (const_tree field)
02e7a332 2263{
2264 return tree_low_cst (byte_position (field), 0);
2265}
2266\f
5d844ba2 2267/* Return the strictest alignment, in bits, that T is known to have. */
fe352cf1 2268
2269unsigned int
720082dc 2270expr_align (const_tree t)
fe352cf1 2271{
2272 unsigned int align0, align1;
2273
2274 switch (TREE_CODE (t))
2275 {
72dd6141 2276 CASE_CONVERT: case NON_LVALUE_EXPR:
fe352cf1 2277 /* If we have conversions, we know that the alignment of the
2278 object must meet each of the alignments of the types. */
2279 align0 = expr_align (TREE_OPERAND (t, 0));
2280 align1 = TYPE_ALIGN (TREE_TYPE (t));
2281 return MAX (align0, align1);
2282
41076ef6 2283 case SAVE_EXPR: case COMPOUND_EXPR: case MODIFY_EXPR:
fe352cf1 2284 case INIT_EXPR: case TARGET_EXPR: case WITH_CLEANUP_EXPR:
b27ac6b5 2285 case CLEANUP_POINT_EXPR:
fe352cf1 2286 /* These don't change the alignment of an object. */
2287 return expr_align (TREE_OPERAND (t, 0));
2288
2289 case COND_EXPR:
2290 /* The best we can do is say that the alignment is the least aligned
2291 of the two arms. */
2292 align0 = expr_align (TREE_OPERAND (t, 1));
2293 align1 = expr_align (TREE_OPERAND (t, 2));
2294 return MIN (align0, align1);
2295
6c96b31e 2296 /* FIXME: LABEL_DECL and CONST_DECL never have DECL_ALIGN set
2297 meaningfully, it's always 1. */
b278476e 2298 case LABEL_DECL: case CONST_DECL:
fe352cf1 2299 case VAR_DECL: case PARM_DECL: case RESULT_DECL:
b278476e 2300 case FUNCTION_DECL:
6c96b31e 2301 gcc_assert (DECL_ALIGN (t) != 0);
2302 return DECL_ALIGN (t);
b278476e 2303
fe352cf1 2304 default:
2305 break;
2306 }
2307
2308 /* Otherwise take the alignment from that of the type. */
2309 return TYPE_ALIGN (TREE_TYPE (t));
2310}
5dbb3364 2311\f
2312/* Return, as a tree node, the number of elements for TYPE (which is an
73e36ac1 2313 ARRAY_TYPE) minus one. This counts only elements of the top array. */
10a9d4cf 2314
2315tree
720082dc 2316array_type_nelts (const_tree type)
10a9d4cf 2317{
b88376f1 2318 tree index_type, min, max;
2319
2320 /* If they did it with unspecified bounds, then we should have already
2321 given an error about it before we got here. */
2322 if (! TYPE_DOMAIN (type))
2323 return error_mark_node;
2324
2325 index_type = TYPE_DOMAIN (type);
2326 min = TYPE_MIN_VALUE (index_type);
2327 max = TYPE_MAX_VALUE (index_type);
1e06f4a9 2328
1e06f4a9 2329 return (integer_zerop (min)
2330 ? max
49d00087 2331 : fold_build2 (MINUS_EXPR, TREE_TYPE (max), max, min));
10a9d4cf 2332}
2333\f
5e1a75c5 2334/* If arg is static -- a reference to an object in static storage -- then
2335 return the object. This is not the same as the C meaning of `static'.
2336 If arg isn't static, return NULL. */
10a9d4cf 2337
82e3f297 2338tree
60b8c5b3 2339staticp (tree arg)
10a9d4cf 2340{
2341 switch (TREE_CODE (arg))
2342 {
10a9d4cf 2343 case FUNCTION_DECL:
dedb9173 2344 /* Nested functions are static, even though taking their address will
2345 involve a trampoline as we unnest the nested function and create
2346 the trampoline on the tree level. */
2347 return arg;
c6f5e832 2348
17239360 2349 case VAR_DECL:
2a6f0f81 2350 return ((TREE_STATIC (arg) || DECL_EXTERNAL (arg))
1b53eb20 2351 && ! DECL_THREAD_LOCAL_P (arg)
6c1e551f 2352 && ! DECL_DLLIMPORT_P (arg)
82e3f297 2353 ? arg : NULL);
10a9d4cf 2354
6e030094 2355 case CONST_DECL:
2356 return ((TREE_STATIC (arg) || DECL_EXTERNAL (arg))
2357 ? arg : NULL);
2358
9b7a6be1 2359 case CONSTRUCTOR:
82e3f297 2360 return TREE_STATIC (arg) ? arg : NULL;
9b7a6be1 2361
38d0709d 2362 case LABEL_DECL:
10a9d4cf 2363 case STRING_CST:
82e3f297 2364 return arg;
10a9d4cf 2365
4ee9c684 2366 case COMPONENT_REF:
cf484390 2367 /* If the thing being referenced is not a field, then it is
2368 something language specific. */
862f468c 2369 gcc_assert (TREE_CODE (TREE_OPERAND (arg, 1)) == FIELD_DECL);
4ee9c684 2370
8aa7b9d6 2371 /* If we are referencing a bitfield, we can't evaluate an
2372 ADDR_EXPR at compile time and so it isn't a constant. */
4ee9c684 2373 if (DECL_BIT_FIELD (TREE_OPERAND (arg, 1)))
82e3f297 2374 return NULL;
4ee9c684 2375
2376 return staticp (TREE_OPERAND (arg, 0));
8aa7b9d6 2377
10a9d4cf 2378 case BIT_FIELD_REF:
82e3f297 2379 return NULL;
10a9d4cf 2380
b056d812 2381 case MISALIGNED_INDIRECT_REF:
2382 case ALIGN_INDIRECT_REF:
10a9d4cf 2383 case INDIRECT_REF:
82e3f297 2384 return TREE_CONSTANT (TREE_OPERAND (arg, 0)) ? arg : NULL;
10a9d4cf 2385
2386 case ARRAY_REF:
ba04d9d5 2387 case ARRAY_RANGE_REF:
10a9d4cf 2388 if (TREE_CODE (TYPE_SIZE (TREE_TYPE (arg))) == INTEGER_CST
2389 && TREE_CODE (TREE_OPERAND (arg, 1)) == INTEGER_CST)
2390 return staticp (TREE_OPERAND (arg, 0));
4ee9c684 2391 else
862f468c 2392 return NULL;
2393
2394 case COMPOUND_LITERAL_EXPR:
2395 return TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (arg)) ? arg : NULL;
10a9d4cf 2396
0dbd1c74 2397 default:
862f468c 2398 return NULL;
0dbd1c74 2399 }
10a9d4cf 2400}
c7d4e749 2401
10a9d4cf 2402\f
c7d4e749 2403
2404
2405/* Return whether OP is a DECL whose address is function-invariant. */
2406
2407bool
2408decl_address_invariant_p (const_tree op)
2409{
2410 /* The conditions below are slightly less strict than the one in
2411 staticp. */
2412
2413 switch (TREE_CODE (op))
2414 {
2415 case PARM_DECL:
2416 case RESULT_DECL:
2417 case LABEL_DECL:
2418 case FUNCTION_DECL:
2419 return true;
2420
2421 case VAR_DECL:
2422 if (((TREE_STATIC (op) || DECL_EXTERNAL (op))
2423 && !DECL_DLLIMPORT_P (op))
2424 || DECL_THREAD_LOCAL_P (op)
2425 || DECL_CONTEXT (op) == current_function_decl
2426 || decl_function_context (op) == current_function_decl)
2427 return true;
2428 break;
2429
2430 case CONST_DECL:
2431 if ((TREE_STATIC (op) || DECL_EXTERNAL (op))
2432 || decl_function_context (op) == current_function_decl)
2433 return true;
2434 break;
2435
2436 default:
2437 break;
2438 }
2439
2440 return false;
2441}
2442
b9c94ed7 2443/* Return whether OP is a DECL whose address is interprocedural-invariant. */
2444
2445bool
2446decl_address_ip_invariant_p (const_tree op)
2447{
2448 /* The conditions below are slightly less strict than the one in
2449 staticp. */
2450
2451 switch (TREE_CODE (op))
2452 {
2453 case LABEL_DECL:
2454 case FUNCTION_DECL:
2455 case STRING_CST:
2456 return true;
2457
2458 case VAR_DECL:
2459 if (((TREE_STATIC (op) || DECL_EXTERNAL (op))
2460 && !DECL_DLLIMPORT_P (op))
2461 || DECL_THREAD_LOCAL_P (op))
2462 return true;
2463 break;
2464
2465 case CONST_DECL:
2466 if ((TREE_STATIC (op) || DECL_EXTERNAL (op)))
2467 return true;
2468 break;
2469
2470 default:
2471 break;
2472 }
2473
2474 return false;
2475}
2476
c7d4e749 2477
2478/* Return true if T is function-invariant (internal function, does
2479 not handle arithmetic; that's handled in skip_simple_arithmetic and
2480 tree_invariant_p). */
2481
2482static bool tree_invariant_p (tree t);
2483
2484static bool
2485tree_invariant_p_1 (tree t)
2486{
2487 tree op;
2488
2489 if (TREE_CONSTANT (t)
2490 || (TREE_READONLY (t) && !TREE_SIDE_EFFECTS (t)))
2491 return true;
2492
2493 switch (TREE_CODE (t))
2494 {
2495 case SAVE_EXPR:
2496 return true;
2497
2498 case ADDR_EXPR:
2499 op = TREE_OPERAND (t, 0);
2500 while (handled_component_p (op))
2501 {
2502 switch (TREE_CODE (op))
2503 {
2504 case ARRAY_REF:
2505 case ARRAY_RANGE_REF:
2506 if (!tree_invariant_p (TREE_OPERAND (op, 1))
2507 || TREE_OPERAND (op, 2) != NULL_TREE
2508 || TREE_OPERAND (op, 3) != NULL_TREE)
2509 return false;
2510 break;
2511
2512 case COMPONENT_REF:
2513 if (TREE_OPERAND (op, 2) != NULL_TREE)
2514 return false;
2515 break;
2516
2517 default:;
2518 }
2519 op = TREE_OPERAND (op, 0);
2520 }
2521
2522 return CONSTANT_CLASS_P (op) || decl_address_invariant_p (op);
2523
2524 default:
2525 break;
2526 }
2527
2528 return false;
2529}
2530
2531/* Return true if T is function-invariant. */
2532
2533static bool
2534tree_invariant_p (tree t)
2535{
2536 tree inner = skip_simple_arithmetic (t);
2537 return tree_invariant_p_1 (inner);
2538}
2539
e696cc2a 2540/* Wrap a SAVE_EXPR around EXPR, if appropriate.
2541 Do this to any expression which may be used in more than one place,
2542 but must be evaluated only once.
2543
2544 Normally, expand_expr would reevaluate the expression each time.
2545 Calling save_expr produces something that is evaluated and recorded
2546 the first time expand_expr is called on it. Subsequent calls to
2547 expand_expr just reuse the recorded value.
2548
2549 The call to expand_expr that generates code that actually computes
2550 the value is the first call *at compile time*. Subsequent calls
2551 *at compile time* generate code to use the saved value.
2552 This produces correct result provided that *at run time* control
2553 always flows through the insns made by the first expand_expr
2554 before reaching the other places where the save_expr was evaluated.
2555 You, the caller of save_expr, must make sure this is so.
2556
2557 Constants, and certain read-only nodes, are returned with no
2558 SAVE_EXPR because that is safe. Expressions containing placeholders
2fdc5285 2559 are not touched; see tree.def for an explanation of what these
2560 are used for. */
10a9d4cf 2561
2562tree
60b8c5b3 2563save_expr (tree expr)
10a9d4cf 2564{
ce3fb06e 2565 tree t = fold (expr);
d30525e2 2566 tree inner;
2567
10a9d4cf 2568 /* If the tree evaluates to a constant, then we don't want to hide that
2569 fact (i.e. this allows further folding, and direct checks for constants).
8a7a0a5a 2570 However, a read-only object that has side effects cannot be bypassed.
9bfff6cb 2571 Since it is no problem to reevaluate literals, we just return the
a92771b8 2572 literal node. */
d30525e2 2573 inner = skip_simple_arithmetic (t);
c7d4e749 2574 if (TREE_CODE (inner) == ERROR_MARK)
2575 return inner;
4ee9c684 2576
c7d4e749 2577 if (tree_invariant_p_1 (inner))
10a9d4cf 2578 return t;
2579
414bee42 2580 /* If INNER contains a PLACEHOLDER_EXPR, we must evaluate it each time, since
2387fcfe 2581 it means that the size or offset of some field of an object depends on
2582 the value within another field.
2583
2584 Note that it must not be the case that T contains both a PLACEHOLDER_EXPR
2585 and some variable since it would then need to be both evaluated once and
2586 evaluated more than once. Front-ends must assure this case cannot
2587 happen by surrounding any such subexpressions in their own SAVE_EXPR
2588 and forcing evaluation at the proper time. */
414bee42 2589 if (contains_placeholder_p (inner))
2387fcfe 2590 return t;
2591
67c155cb 2592 t = build1 (SAVE_EXPR, TREE_TYPE (expr), t);
e60a6f7b 2593 SET_EXPR_LOCATION (t, EXPR_LOCATION (expr));
10a9d4cf 2594
2595 /* This expression might be placed ahead of a jump to ensure that the
2596 value was computed on both sides of the jump. So make sure it isn't
2597 eliminated as dead. */
2598 TREE_SIDE_EFFECTS (t) = 1;
2599 return t;
2600}
0e676ec9 2601
414bee42 2602/* Look inside EXPR and into any simple arithmetic operations. Return
2603 the innermost non-arithmetic node. */
2604
2605tree
60b8c5b3 2606skip_simple_arithmetic (tree expr)
414bee42 2607{
2608 tree inner;
60b8c5b3 2609
414bee42 2610 /* We don't care about whether this can be used as an lvalue in this
2611 context. */
2612 while (TREE_CODE (expr) == NON_LVALUE_EXPR)
2613 expr = TREE_OPERAND (expr, 0);
2614
2615 /* If we have simple operations applied to a SAVE_EXPR or to a SAVE_EXPR and
2616 a constant, it will be more efficient to not make another SAVE_EXPR since
2617 it will allow better simplification and GCSE will be able to merge the
2618 computations if they actually occur. */
2619 inner = expr;
2620 while (1)
2621 {
ce45a448 2622 if (UNARY_CLASS_P (inner))
414bee42 2623 inner = TREE_OPERAND (inner, 0);
ce45a448 2624 else if (BINARY_CLASS_P (inner))
414bee42 2625 {
c7d4e749 2626 if (tree_invariant_p (TREE_OPERAND (inner, 1)))
414bee42 2627 inner = TREE_OPERAND (inner, 0);
c7d4e749 2628 else if (tree_invariant_p (TREE_OPERAND (inner, 0)))
414bee42 2629 inner = TREE_OPERAND (inner, 1);
2630 else
2631 break;
2632 }
2633 else
2634 break;
2635 }
2636
2637 return inner;
2638}
2639
8dfbefd8 2640
1f3233d1 2641/* Return which tree structure is used by T. */
2642
2643enum tree_node_structure_enum
720082dc 2644tree_node_structure (const_tree t)
1f3233d1 2645{
720082dc 2646 const enum tree_code code = TREE_CODE (t);
8dfbefd8 2647 return tree_node_structure_for_code (code);
1f3233d1 2648}
01d4d739 2649
2650/* Set various status flags when building a CALL_EXPR object T. */
2651
2652static void
2653process_call_operands (tree t)
2654{
2655 bool side_effects = TREE_SIDE_EFFECTS (t);
e0ca1cb5 2656 bool read_only = false;
2657 int i = call_expr_flags (t);
01d4d739 2658
e0ca1cb5 2659 /* Calls have side-effects, except those to const or pure functions. */
2660 if ((i & ECF_LOOPING_CONST_OR_PURE) || !(i & (ECF_CONST | ECF_PURE)))
2661 side_effects = true;
2662 /* Propagate TREE_READONLY of arguments for const functions. */
2663 if (i & ECF_CONST)
2664 read_only = true;
2665
2666 if (!side_effects || read_only)
01d4d739 2667 for (i = 1; i < TREE_OPERAND_LENGTH (t); i++)
2668 {
2669 tree op = TREE_OPERAND (t, i);
2670 if (op && TREE_SIDE_EFFECTS (op))
e0ca1cb5 2671 side_effects = true;
2672 if (op && !TREE_READONLY (op) && !CONSTANT_CLASS_P (op))
2673 read_only = false;
01d4d739 2674 }
2675
01d4d739 2676 TREE_SIDE_EFFECTS (t) = side_effects;
e0ca1cb5 2677 TREE_READONLY (t) = read_only;
01d4d739 2678}
2387fcfe 2679\f
2680/* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
9b1025bc 2681 or offset that depends on a field within a record. */
2387fcfe 2682
ce3fb06e 2683bool
b7bf20db 2684contains_placeholder_p (const_tree exp)
2387fcfe 2685{
19cb6b50 2686 enum tree_code code;
2387fcfe 2687
e41f0d80 2688 if (!exp)
2689 return 0;
2690
e41f0d80 2691 code = TREE_CODE (exp);
55f9d7dc 2692 if (code == PLACEHOLDER_EXPR)
7b3cf6ac 2693 return 1;
f1875696 2694
2387fcfe 2695 switch (TREE_CODE_CLASS (code))
2696 {
ce45a448 2697 case tcc_reference:
7b3cf6ac 2698 /* Don't look at any PLACEHOLDER_EXPRs that might be in index or bit
2699 position computations since they will be converted into a
2700 WITH_RECORD_EXPR involving the reference, which will assume
2701 here will be valid. */
ce3fb06e 2702 return CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 0));
2387fcfe 2703
ce45a448 2704 case tcc_exceptional:
0dbd1c74 2705 if (code == TREE_LIST)
ce3fb06e 2706 return (CONTAINS_PLACEHOLDER_P (TREE_VALUE (exp))
2707 || CONTAINS_PLACEHOLDER_P (TREE_CHAIN (exp)));
0dbd1c74 2708 break;
9bfff6cb 2709
ce45a448 2710 case tcc_unary:
2711 case tcc_binary:
2712 case tcc_comparison:
2713 case tcc_expression:
9b1025bc 2714 switch (code)
2715 {
2716 case COMPOUND_EXPR:
9bfff6cb 2717 /* Ignoring the first operand isn't quite right, but works best. */
ce3fb06e 2718 return CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 1));
9b1025bc 2719
9b1025bc 2720 case COND_EXPR:
ce3fb06e 2721 return (CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 0))
2722 || CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 1))
2723 || CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 2)));
9b1025bc 2724
9f85d7ea 2725 case SAVE_EXPR:
2726 /* The save_expr function never wraps anything containing
2727 a PLACEHOLDER_EXPR. */
2728 return 0;
2729
0dbd1c74 2730 default:
2731 break;
9b1025bc 2732 }
2733
651396d6 2734 switch (TREE_CODE_LENGTH (code))
2387fcfe 2735 {
2736 case 1:
ce3fb06e 2737 return CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 0));
2387fcfe 2738 case 2:
ce3fb06e 2739 return (CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 0))
2740 || CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 1)));
0dbd1c74 2741 default:
2742 return 0;
2387fcfe 2743 }
2387fcfe 2744
c2f47e15 2745 case tcc_vl_exp:
2746 switch (code)
2747 {
2748 case CALL_EXPR:
2749 {
b7bf20db 2750 const_tree arg;
2751 const_call_expr_arg_iterator iter;
2752 FOR_EACH_CONST_CALL_EXPR_ARG (arg, iter, exp)
c2f47e15 2753 if (CONTAINS_PLACEHOLDER_P (arg))
2754 return 1;
2755 return 0;
2756 }
2757 default:
2758 return 0;
2759 }
2760
0dbd1c74 2761 default:
2762 return 0;
2763 }
a43854ee 2764 return 0;
2387fcfe 2765}
bc280274 2766
2bd342e5 2767/* Return true if any part of the computation of TYPE involves a
2768 PLACEHOLDER_EXPR. This includes size, bounds, qualifiers
2769 (for QUAL_UNION_TYPE) and field positions. */
ce3fb06e 2770
2bd342e5 2771static bool
720082dc 2772type_contains_placeholder_1 (const_tree type)
ce3fb06e 2773{
2774 /* If the size contains a placeholder or the parent type (component type in
2775 the case of arrays) type involves a placeholder, this type does. */
2776 if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (type))
2777 || CONTAINS_PLACEHOLDER_P (TYPE_SIZE_UNIT (type))
2778 || (TREE_TYPE (type) != 0
2779 && type_contains_placeholder_p (TREE_TYPE (type))))
2bd342e5 2780 return true;
ce3fb06e 2781
2782 /* Now do type-specific checks. Note that the last part of the check above
2783 greatly limits what we have to do below. */
2784 switch (TREE_CODE (type))
2785 {
2786 case VOID_TYPE:
2787 case COMPLEX_TYPE:
ce3fb06e 2788 case ENUMERAL_TYPE:
2789 case BOOLEAN_TYPE:
ce3fb06e 2790 case POINTER_TYPE:
2791 case OFFSET_TYPE:
2792 case REFERENCE_TYPE:
2793 case METHOD_TYPE:
ce3fb06e 2794 case FUNCTION_TYPE:
17febea8 2795 case VECTOR_TYPE:
2bd342e5 2796 return false;
ce3fb06e 2797
2798 case INTEGER_TYPE:
2799 case REAL_TYPE:
06f0b99c 2800 case FIXED_POINT_TYPE:
ce3fb06e 2801 /* Here we just check the bounds. */
2802 return (CONTAINS_PLACEHOLDER_P (TYPE_MIN_VALUE (type))
2803 || CONTAINS_PLACEHOLDER_P (TYPE_MAX_VALUE (type)));
2804
2805 case ARRAY_TYPE:
ce3fb06e 2806 /* We're already checked the component type (TREE_TYPE), so just check
2807 the index type. */
2808 return type_contains_placeholder_p (TYPE_DOMAIN (type));
2809
2810 case RECORD_TYPE:
2811 case UNION_TYPE:
2812 case QUAL_UNION_TYPE:
2813 {
ce3fb06e 2814 tree field;
ce3fb06e 2815
2816 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
2817 if (TREE_CODE (field) == FIELD_DECL
2818 && (CONTAINS_PLACEHOLDER_P (DECL_FIELD_OFFSET (field))
2819 || (TREE_CODE (type) == QUAL_UNION_TYPE
2820 && CONTAINS_PLACEHOLDER_P (DECL_QUALIFIER (field)))
2821 || type_contains_placeholder_p (TREE_TYPE (field))))
2bd342e5 2822 return true;
2823
2824 return false;
ce3fb06e 2825 }
2826
2827 default:
8c0963c4 2828 gcc_unreachable ();
ce3fb06e 2829 }
2830}
2bd342e5 2831
2832bool
2833type_contains_placeholder_p (tree type)
2834{
2835 bool result;
2836
2837 /* If the contains_placeholder_bits field has been initialized,
2838 then we know the answer. */
2839 if (TYPE_CONTAINS_PLACEHOLDER_INTERNAL (type) > 0)
2840 return TYPE_CONTAINS_PLACEHOLDER_INTERNAL (type) - 1;
2841
2842 /* Indicate that we've seen this type node, and the answer is false.
2843 This is what we want to return if we run into recursion via fields. */
2844 TYPE_CONTAINS_PLACEHOLDER_INTERNAL (type) = 1;
2845
2846 /* Compute the real value. */
2847 result = type_contains_placeholder_1 (type);
2848
2849 /* Store the real value. */
2850 TYPE_CONTAINS_PLACEHOLDER_INTERNAL (type) = result + 1;
2851
2852 return result;
2853}
2387fcfe 2854\f
4189e677 2855/* Push tree EXP onto vector QUEUE if it is not already present. */
2856
2857static void
2858push_without_duplicates (tree exp, VEC (tree, heap) **queue)
2859{
2860 unsigned int i;
2861 tree iter;
2862
2863 for (i = 0; VEC_iterate (tree, *queue, i, iter); i++)
2864 if (simple_cst_equal (iter, exp) == 1)
2865 break;
2866
2867 if (!iter)
2868 VEC_safe_push (tree, heap, *queue, exp);
2869}
2870
2871/* Given a tree EXP, find all occurences of references to fields
2872 in a PLACEHOLDER_EXPR and place them in vector REFS without
2873 duplicates. Also record VAR_DECLs and CONST_DECLs. Note that
2874 we assume here that EXP contains only arithmetic expressions
2875 or CALL_EXPRs with PLACEHOLDER_EXPRs occurring only in their
2876 argument list. */
2877
2878void
2879find_placeholder_in_expr (tree exp, VEC (tree, heap) **refs)
2880{
2881 enum tree_code code = TREE_CODE (exp);
2882 tree inner;
2883 int i;
2884
2885 /* We handle TREE_LIST and COMPONENT_REF separately. */
2886 if (code == TREE_LIST)
2887 {
2888 FIND_PLACEHOLDER_IN_EXPR (TREE_CHAIN (exp), refs);
2889 FIND_PLACEHOLDER_IN_EXPR (TREE_VALUE (exp), refs);
2890 }
2891 else if (code == COMPONENT_REF)
2892 {
2893 for (inner = TREE_OPERAND (exp, 0);
2894 REFERENCE_CLASS_P (inner);
2895 inner = TREE_OPERAND (inner, 0))
2896 ;
2897
2898 if (TREE_CODE (inner) == PLACEHOLDER_EXPR)
2899 push_without_duplicates (exp, refs);
2900 else
2901 FIND_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 0), refs);
2902 }
2903 else
2904 switch (TREE_CODE_CLASS (code))
2905 {
2906 case tcc_constant:
2907 break;
2908
2909 case tcc_declaration:
2910 /* Variables allocated to static storage can stay. */
2911 if (!TREE_STATIC (exp))
2912 push_without_duplicates (exp, refs);
2913 break;
2914
2915 case tcc_expression:
2916 /* This is the pattern built in ada/make_aligning_type. */
2917 if (code == ADDR_EXPR
2918 && TREE_CODE (TREE_OPERAND (exp, 0)) == PLACEHOLDER_EXPR)
2919 {
2920 push_without_duplicates (exp, refs);
2921 break;
2922 }
2923
2924 /* Fall through... */
2925
2926 case tcc_exceptional:
2927 case tcc_unary:
2928 case tcc_binary:
2929 case tcc_comparison:
2930 case tcc_reference:
2931 for (i = 0; i < TREE_CODE_LENGTH (code); i++)
2932 FIND_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, i), refs);
2933 break;
2934
2935 case tcc_vl_exp:
2936 for (i = 1; i < TREE_OPERAND_LENGTH (exp); i++)
2937 FIND_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, i), refs);
2938 break;
2939
2940 default:
2941 gcc_unreachable ();
2942 }
2943}
2944
2387fcfe 2945/* Given a tree EXP, a FIELD_DECL F, and a replacement value R,
2946 return a tree with all occurrences of references to F in a
4189e677 2947 PLACEHOLDER_EXPR replaced by R. Also handle VAR_DECLs and
2948 CONST_DECLs. Note that we assume here that EXP contains only
2949 arithmetic expressions or CALL_EXPRs with PLACEHOLDER_EXPRs
2950 occurring only in their argument list. */
2387fcfe 2951
2952tree
60b8c5b3 2953substitute_in_expr (tree exp, tree f, tree r)
2387fcfe 2954{
2955 enum tree_code code = TREE_CODE (exp);
38071326 2956 tree op0, op1, op2, op3;
01d4d739 2957 tree new_tree;
2387fcfe 2958
50d1f269 2959 /* We handle TREE_LIST and COMPONENT_REF separately. */
2960 if (code == TREE_LIST)
2387fcfe 2961 {
55f9d7dc 2962 op0 = SUBSTITUTE_IN_EXPR (TREE_CHAIN (exp), f, r);
2963 op1 = SUBSTITUTE_IN_EXPR (TREE_VALUE (exp), f, r);
50d1f269 2964 if (op0 == TREE_CHAIN (exp) && op1 == TREE_VALUE (exp))
2387fcfe 2965 return exp;
0dbd1c74 2966
50d1f269 2967 return tree_cons (TREE_PURPOSE (exp), op1, op0);
2968 }
2969 else if (code == COMPONENT_REF)
01d4d739 2970 {
2971 tree inner;
2972
2973 /* If this expression is getting a value from a PLACEHOLDER_EXPR
2974 and it is the right field, replace it with R. */
2975 for (inner = TREE_OPERAND (exp, 0);
2976 REFERENCE_CLASS_P (inner);
2977 inner = TREE_OPERAND (inner, 0))
2978 ;
2979
2980 /* The field. */
2981 op1 = TREE_OPERAND (exp, 1);
2982
2983 if (TREE_CODE (inner) == PLACEHOLDER_EXPR && op1 == f)
2984 return r;
2985
2986 /* If this expression hasn't been completed let, leave it alone. */
2987 if (TREE_CODE (inner) == PLACEHOLDER_EXPR && !TREE_TYPE (inner))
2988 return exp;
2989
2990 op0 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 0), f, r);
2991 if (op0 == TREE_OPERAND (exp, 0))
2992 return exp;
2993
2994 new_tree
2995 = fold_build3 (COMPONENT_REF, TREE_TYPE (exp), op0, op1, NULL_TREE);
50d1f269 2996 }
2997 else
2998 switch (TREE_CODE_CLASS (code))
2999 {
ce45a448 3000 case tcc_constant:
50d1f269 3001 return exp;
2387fcfe 3002
4189e677 3003 case tcc_declaration:
3004 if (exp == f)
3005 return r;
3006 else
3007 return exp;
3008
3009 case tcc_expression:
3010 if (exp == f)
3011 return r;
3012
3013 /* Fall through... */
3014
ce45a448 3015 case tcc_exceptional:
3016 case tcc_unary:
3017 case tcc_binary:
3018 case tcc_comparison:
ce45a448 3019 case tcc_reference:
651396d6 3020 switch (TREE_CODE_LENGTH (code))
50d1f269 3021 {
3022 case 0:
a93ec305 3023 return exp;
9bfff6cb 3024
50d1f269 3025 case 1:
55f9d7dc 3026 op0 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 0), f, r);
50d1f269 3027 if (op0 == TREE_OPERAND (exp, 0))
3028 return exp;
49393347 3029
f4e36c33 3030 new_tree = fold_build1 (code, TREE_TYPE (exp), op0);
50d1f269 3031 break;
2387fcfe 3032
50d1f269 3033 case 2:
55f9d7dc 3034 op0 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 0), f, r);
3035 op1 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 1), f, r);
b4c3eba3 3036
50d1f269 3037 if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1))
3038 return exp;
a93ec305 3039
f4e36c33 3040 new_tree = fold_build2 (code, TREE_TYPE (exp), op0, op1);
50d1f269 3041 break;
2387fcfe 3042
50d1f269 3043 case 3:
55f9d7dc 3044 op0 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 0), f, r);
3045 op1 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 1), f, r);
3046 op2 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 2), f, r);
2d4694be 3047
50d1f269 3048 if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1)
3049 && op2 == TREE_OPERAND (exp, 2))
3050 return exp;
0dbd1c74 3051
f4e36c33 3052 new_tree = fold_build3 (code, TREE_TYPE (exp), op0, op1, op2);
50d1f269 3053 break;
0dbd1c74 3054
38071326 3055 case 4:
3056 op0 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 0), f, r);
3057 op1 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 1), f, r);
3058 op2 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 2), f, r);
3059 op3 = SUBSTITUTE_IN_EXPR (TREE_OPERAND (exp, 3), f, r);
3060
3061 if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1)
3062 && op2 == TREE_OPERAND (exp, 2)
3063 && op3 == TREE_OPERAND (exp, 3))
3064 return exp;
3065
01d4d739 3066 new_tree
3067 = fold (build4 (code, TREE_TYPE (exp), op0, op1, op2, op3));
38071326 3068 break;
3069
50d1f269 3070 default:
8c0963c4 3071 gcc_unreachable ();
50d1f269 3072 }
3073 break;
2387fcfe 3074
c2f47e15 3075 case tcc_vl_exp:
3076 {
c2f47e15 3077 int i;
a13ff590 3078
01d4d739 3079 new_tree = NULL_TREE;
3080
4189e677 3081 /* If we are trying to replace F with a constant, inline back
3082 functions which do nothing else than computing a value from
3083 the arguments they are passed. This makes it possible to
3084 fold partially or entirely the replacement expression. */
3085 if (CONSTANT_CLASS_P (r) && code == CALL_EXPR)
3086 {
3087 tree t = maybe_inline_call_in_expr (exp);
3088 if (t)
3089 return SUBSTITUTE_IN_EXPR (t, f, r);
3090 }
3091
a13ff590 3092 for (i = 1; i < TREE_OPERAND_LENGTH (exp); i++)
c2f47e15 3093 {
3094 tree op = TREE_OPERAND (exp, i);
7c952a13 3095 tree new_op = SUBSTITUTE_IN_EXPR (op, f, r);
3096 if (new_op != op)
c2f47e15 3097 {
01d4d739 3098 if (!new_tree)
3099 new_tree = copy_node (exp);
3100 TREE_OPERAND (new_tree, i) = new_op;
c2f47e15 3101 }
3102 }
7c952a13 3103
01d4d739 3104 if (new_tree)
3105 {
3106 new_tree = fold (new_tree);
3107 if (TREE_CODE (new_tree) == CALL_EXPR)
3108 process_call_operands (new_tree);
3109 }
c2f47e15 3110 else
3111 return exp;
3112 }
a13ff590 3113 break;
c2f47e15 3114
50d1f269 3115 default:
8c0963c4 3116 gcc_unreachable ();
50d1f269 3117 }
2387fcfe 3118
01d4d739 3119 TREE_READONLY (new_tree) |= TREE_READONLY (exp);
f4e36c33 3120 return new_tree;
2387fcfe 3121}
55f9d7dc 3122
3123/* Similar, but look for a PLACEHOLDER_EXPR in EXP and find a replacement
3124 for it within OBJ, a tree that is an object or a chain of references. */
3125
3126tree
3127substitute_placeholder_in_expr (tree exp, tree obj)
3128{
3129 enum tree_code code = TREE_CODE (exp);
f0ac718c 3130 tree op0, op1, op2, op3;
01d4d739 3131 tree new_tree;
55f9d7dc 3132
3133 /* If this is a PLACEHOLDER_EXPR, see if we find a corresponding type
3134 in the chain of OBJ. */
3135 if (code == PLACEHOLDER_EXPR)
3136 {
3137 tree need_type = TYPE_MAIN_VARIANT (TREE_TYPE (exp));
3138 tree elt;
3139
3140 for (elt = obj; elt != 0;
3141 elt = ((TREE_CODE (elt) == COMPOUND_EXPR
3142 || TREE_CODE (elt) == COND_EXPR)
3143 ? TREE_OPERAND (elt, 1)
ce45a448 3144 : (REFERENCE_CLASS_P (elt)
3145 || UNARY_CLASS_P (elt)
3146 || BINARY_CLASS_P (elt)
c2f47e15 3147 || VL_EXP_CLASS_P (elt)
ce45a448 3148 || EXPRESSION_CLASS_P (elt))
55f9d7dc 3149 ? TREE_OPERAND (elt, 0) : 0))
3150 if (TYPE_MAIN_VARIANT (TREE_TYPE (elt)) == need_type)
3151 return elt;
3152
3153 for (elt = obj; elt != 0;
3154 elt = ((TREE_CODE (elt) == COMPOUND_EXPR
3155 || TREE_CODE (elt) == COND_EXPR)
3156 ? TREE_OPERAND (elt, 1)
ce45a448 3157 : (REFERENCE_CLASS_P (elt)
3158 || UNARY_CLASS_P (elt)
3159 || BINARY_CLASS_P (elt)
c2f47e15 3160 || VL_EXP_CLASS_P (elt)
ce45a448 3161 || EXPRESSION_CLASS_P (elt))
55f9d7dc 3162 ? TREE_OPERAND (elt, 0) : 0))
3163 if (POINTER_TYPE_P (TREE_TYPE (elt))
3164 && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (elt)))
3165 == need_type))
49d00087 3166 return fold_build1 (INDIRECT_REF, need_type, elt);
55f9d7dc 3167
3168 /* If we didn't find it, return the original PLACEHOLDER_EXPR. If it
3169 survives until RTL generation, there will be an error. */
3170 return exp;
3171 }
3172
3173 /* TREE_LIST is special because we need to look at TREE_VALUE
3174 and TREE_CHAIN, not TREE_OPERANDS. */
3175 else if (code == TREE_LIST)
3176 {
3177 op0 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_CHAIN (exp), obj);
3178 op1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_VALUE (exp), obj);
3179 if (op0 == TREE_CHAIN (exp) && op1 == TREE_VALUE (exp))
3180 return exp;
3181
3182 return tree_cons (TREE_PURPOSE (exp), op1, op0);
3183 }
3184 else
3185 switch (TREE_CODE_CLASS (code))
3186 {
ce45a448 3187 case tcc_constant:
3188 case tcc_declaration:
55f9d7dc 3189 return exp;
3190
ce45a448 3191 case tcc_exceptional:
3192 case tcc_unary:
3193 case tcc_binary:
3194 case tcc_comparison:
3195 case tcc_expression:
3196 case tcc_reference:
3197 case tcc_statement:
651396d6 3198 switch (TREE_CODE_LENGTH (code))
55f9d7dc 3199 {
3200 case 0:
3201 return exp;
3202
3203 case 1:
3204 op0 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 0), obj);
3205 if (op0 == TREE_OPERAND (exp, 0))
3206 return exp;
01d4d739 3207
3208 new_tree = fold_build1 (code, TREE_TYPE (exp), op0);
3209 break;
55f9d7dc 3210
3211 case 2:
3212 op0 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 0), obj);
3213 op1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 1), obj);
3214
3215 if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1))
3216 return exp;
01d4d739 3217
3218 new_tree = fold_build2 (code, TREE_TYPE (exp), op0, op1);
3219 break;
55f9d7dc 3220
3221 case 3:
3222 op0 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 0), obj);
3223 op1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 1), obj);
3224 op2 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 2), obj);
3225
3226 if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1)
3227 && op2 == TREE_OPERAND (exp, 2))
3228 return exp;
01d4d739 3229
3230 new_tree = fold_build3 (code, TREE_TYPE (exp), op0, op1, op2);
3231 break;
55f9d7dc 3232
f0ac718c 3233 case 4:
3234 op0 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 0), obj);
3235 op1 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 1), obj);
3236 op2 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 2), obj);
3237 op3 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TREE_OPERAND (exp, 3), obj);
3238
3239 if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1)
3240 && op2 == TREE_OPERAND (exp, 2)
3241 && op3 == TREE_OPERAND (exp, 3))
3242 return exp;
01d4d739 3243
3244 new_tree
3245 = fold (build4 (code, TREE_TYPE (exp), op0, op1, op2, op3));
3246 break;
f0ac718c 3247
55f9d7dc 3248 default:
8c0963c4 3249 gcc_unreachable ();
55f9d7dc 3250 }
3251 break;
3252
c2f47e15 3253 case tcc_vl_exp:
3254 {
c2f47e15 3255 int i;
8084aa18 3256
01d4d739 3257 new_tree = NULL_TREE;
3258
8084aa18 3259 for (i = 1; i < TREE_OPERAND_LENGTH (exp); i++)
c2f47e15 3260 {
3261 tree op = TREE_OPERAND (exp, i);
8084aa18 3262 tree new_op = SUBSTITUTE_PLACEHOLDER_IN_EXPR (op, obj);
3263 if (new_op != op)
c2f47e15 3264 {
01d4d739 3265 if (!new_tree)
3266 new_tree = copy_node (exp);
3267 TREE_OPERAND (new_tree, i) = new_op;
c2f47e15 3268 }
3269 }
8084aa18 3270
01d4d739 3271 if (new_tree)
3272 {
3273 new_tree = fold (new_tree);
3274 if (TREE_CODE (new_tree) == CALL_EXPR)
3275 process_call_operands (new_tree);
3276 }
c2f47e15 3277 else
3278 return exp;
3279 }
01d4d739 3280 break;
c2f47e15 3281
55f9d7dc 3282 default:
8c0963c4 3283 gcc_unreachable ();
55f9d7dc 3284 }
01d4d739 3285
3286 TREE_READONLY (new_tree) |= TREE_READONLY (exp);
3287 return new_tree;
55f9d7dc 3288}
2387fcfe 3289\f
10a9d4cf 3290/* Stabilize a reference so that we can use it any number of times
3291 without causing its operands to be evaluated more than once.
d5d273ee 3292 Returns the stabilized reference. This works by means of save_expr,
3293 so see the caveats in the comments about save_expr.
10a9d4cf 3294
3295 Also allows conversion expressions whose operands are references.
3296 Any other kind of expression is returned unchanged. */
3297
3298tree
60b8c5b3 3299stabilize_reference (tree ref)
10a9d4cf 3300{
19cb6b50 3301 tree result;
3302 enum tree_code code = TREE_CODE (ref);
10a9d4cf 3303
3304 switch (code)
3305 {
3306 case VAR_DECL:
3307 case PARM_DECL:
3308 case RESULT_DECL:
3309 /* No action is needed in this case. */
3310 return ref;
3311
72dd6141 3312 CASE_CONVERT:
10a9d4cf 3313 case FLOAT_EXPR:
3314 case FIX_TRUNC_EXPR:
10a9d4cf 3315 result = build_nt (code, stabilize_reference (TREE_OPERAND (ref, 0)));
3316 break;
3317
3318 case INDIRECT_REF:
3319 result = build_nt (INDIRECT_REF,
3320 stabilize_reference_1 (TREE_OPERAND (ref, 0)));
3321 break;
3322
3323 case COMPONENT_REF:
3324 result = build_nt (COMPONENT_REF,
3325 stabilize_reference (TREE_OPERAND (ref, 0)),
6374121b 3326 TREE_OPERAND (ref, 1), NULL_TREE);
10a9d4cf 3327 break;
3328
3329 case BIT_FIELD_REF:
3330 result = build_nt (BIT_FIELD_REF,
3331 stabilize_reference (TREE_OPERAND (ref, 0)),
3332 stabilize_reference_1 (TREE_OPERAND (ref, 1)),
3333 stabilize_reference_1 (TREE_OPERAND (ref, 2)));
3334 break;
3335
3336 case ARRAY_REF:
3337 result = build_nt (ARRAY_REF,
3338 stabilize_reference (TREE_OPERAND (ref, 0)),
6374121b 3339 stabilize_reference_1 (TREE_OPERAND (ref, 1)),
3340 TREE_OPERAND (ref, 2), TREE_OPERAND (ref, 3));
10a9d4cf 3341 break;
3342
ba04d9d5 3343 case ARRAY_RANGE_REF:
3344 result = build_nt (ARRAY_RANGE_REF,
3345 stabilize_reference (TREE_OPERAND (ref, 0)),
6374121b 3346 stabilize_reference_1 (TREE_OPERAND (ref, 1)),
3347 TREE_OPERAND (ref, 2), TREE_OPERAND (ref, 3));
ba04d9d5 3348 break;
3349
1acba6f7 3350 case COMPOUND_EXPR:
37e76d7d 3351 /* We cannot wrap the first expression in a SAVE_EXPR, as then
3352 it wouldn't be ignored. This matters when dealing with
3353 volatiles. */
3354 return stabilize_reference_1 (ref);
1acba6f7 3355
10a9d4cf 3356 /* If arg isn't a kind of lvalue we recognize, make no change.
3357 Caller should recognize the error for an invalid lvalue. */
3358 default:
3359 return ref;
3360
3361 case ERROR_MARK:
3362 return error_mark_node;
3363 }
3364
3365 TREE_TYPE (result) = TREE_TYPE (ref);
3366 TREE_READONLY (result) = TREE_READONLY (ref);
3367 TREE_SIDE_EFFECTS (result) = TREE_SIDE_EFFECTS (ref);
3368 TREE_THIS_VOLATILE (result) = TREE_THIS_VOLATILE (ref);
10a9d4cf 3369
3370 return result;
3371}
3372
3373/* Subroutine of stabilize_reference; this is called for subtrees of
3374 references. Any expression with side-effects must be put in a SAVE_EXPR
3375 to ensure that it is only evaluated once.
3376
3377 We don't put SAVE_EXPR nodes around everything, because assigning very
3378 simple expressions to temporaries causes us to miss good opportunities
3379 for optimizations. Among other things, the opportunity to fold in the
3380 addition of a constant into an addressing mode often gets lost, e.g.
3381 "y[i+1] += x;". In general, we take the approach that we should not make
3382 an assignment unless we are forced into it - i.e., that any non-side effect
3383 operator should be allowed, and that cse should take care of coalescing
3384 multiple utterances of the same expression should that prove fruitful. */
3385
bebf3d7b 3386tree
60b8c5b3 3387stabilize_reference_1 (tree e)
10a9d4cf 3388{
19cb6b50 3389 tree result;
3390 enum tree_code code = TREE_CODE (e);
10a9d4cf 3391
8a7a0a5a 3392 /* We cannot ignore const expressions because it might be a reference
3393 to a const array but whose index contains side-effects. But we can
3394 ignore things that are actual constant or that already have been
3395 handled by this function. */
3396
c7d4e749 3397 if (tree_invariant_p (e))
10a9d4cf 3398 return e;
3399
3400 switch (TREE_CODE_CLASS (code))
3401 {
ce45a448 3402 case tcc_exceptional:
3403 case tcc_type:
3404 case tcc_declaration:
3405 case tcc_comparison:
3406 case tcc_statement:
3407 case tcc_expression:
3408 case tcc_reference:
c2f47e15 3409 case tcc_vl_exp:
10a9d4cf 3410 /* If the expression has side-effects, then encase it in a SAVE_EXPR
3411 so that it will only be evaluated once. */
3412 /* The reference (r) and comparison (<) classes could be handled as
3413 below, but it is generally faster to only evaluate them once. */
3414 if (TREE_SIDE_EFFECTS (e))
3415 return save_expr (e);
3416 return e;
3417
ce45a448 3418 case tcc_constant:
10a9d4cf 3419 /* Constants need no processing. In fact, we should never reach
3420 here. */
3421 return e;
9bfff6cb 3422
ce45a448 3423 case tcc_binary:
ff00c725 3424 /* Division is slow and tends to be compiled with jumps,
3425 especially the division by powers of 2 that is often
3426 found inside of an array reference. So do it just once. */
3427 if (code == TRUNC_DIV_EXPR || code == TRUNC_MOD_EXPR
3428 || code == FLOOR_DIV_EXPR || code == FLOOR_MOD_EXPR
3429 || code == CEIL_DIV_EXPR || code == CEIL_MOD_EXPR
3430 || code == ROUND_DIV_EXPR || code == ROUND_MOD_EXPR)
3431 return save_expr (e);
10a9d4cf 3432 /* Recursively stabilize each operand. */
3433 result = build_nt (code, stabilize_reference_1 (TREE_OPERAND (e, 0)),
3434 stabilize_reference_1 (TREE_OPERAND (e, 1)));
3435 break;
3436
ce45a448 3437 case tcc_unary:
10a9d4cf 3438 /* Recursively stabilize each operand. */
3439 result = build_nt (code, stabilize_reference_1 (TREE_OPERAND (e, 0)));
3440 break;
49ca1fcd 3441
3442 default:
8c0963c4 3443 gcc_unreachable ();
10a9d4cf 3444 }
9bfff6cb 3445
10a9d4cf 3446 TREE_TYPE (result) = TREE_TYPE (e);
3447 TREE_READONLY (result) = TREE_READONLY (e);
3448 TREE_SIDE_EFFECTS (result) = TREE_SIDE_EFFECTS (e);
3449 TREE_THIS_VOLATILE (result) = TREE_THIS_VOLATILE (e);
10a9d4cf 3450
3451 return result;
3452}
3453\f
3454/* Low-level constructors for expressions. */
3455
6374121b 3456/* A helper function for build1 and constant folders. Set TREE_CONSTANT,
c7d4e749 3457 and TREE_SIDE_EFFECTS for an ADDR_EXPR. */
4ee9c684 3458
3459void
750ad201 3460recompute_tree_invariant_for_addr_expr (tree t)
4ee9c684 3461{
6374121b 3462 tree node;
c7d4e749 3463 bool tc = true, se = false;
4ee9c684 3464
6374121b 3465 /* We started out assuming this address is both invariant and constant, but
3466 does not have side effects. Now go down any handled components and see if
3467 any of them involve offsets that are either non-constant or non-invariant.
3468 Also check for side-effects.
3469
3470 ??? Note that this code makes no attempt to deal with the case where
3471 taking the address of something causes a copy due to misalignment. */
3472
c7d4e749 3473#define UPDATE_FLAGS(NODE) \
6374121b 3474do { tree _node = (NODE); \
6374121b 3475 if (_node && !TREE_CONSTANT (_node)) tc = false; \
3476 if (_node && TREE_SIDE_EFFECTS (_node)) se = true; } while (0)
3477
3478 for (node = TREE_OPERAND (t, 0); handled_component_p (node);
3479 node = TREE_OPERAND (node, 0))
4ee9c684 3480 {
6374121b 3481 /* If the first operand doesn't have an ARRAY_TYPE, this is a bogus
3482 array reference (probably made temporarily by the G++ front end),
3483 so ignore all the operands. */
3484 if ((TREE_CODE (node) == ARRAY_REF
3485 || TREE_CODE (node) == ARRAY_RANGE_REF)
3486 && TREE_CODE (TREE_TYPE (TREE_OPERAND (node, 0))) == ARRAY_TYPE)
4ee9c684 3487 {
c7d4e749 3488 UPDATE_FLAGS (TREE_OPERAND (node, 1));
20506a1d 3489 if (TREE_OPERAND (node, 2))
c7d4e749 3490 UPDATE_FLAGS (TREE_OPERAND (node, 2));
20506a1d 3491 if (TREE_OPERAND (node, 3))
c7d4e749 3492 UPDATE_FLAGS (TREE_OPERAND (node, 3));
4ee9c684 3493 }
6374121b 3494 /* Likewise, just because this is a COMPONENT_REF doesn't mean we have a
3495 FIELD_DECL, apparently. The G++ front end can put something else
3496 there, at least temporarily. */
3497 else if (TREE_CODE (node) == COMPONENT_REF
3498 && TREE_CODE (TREE_OPERAND (node, 1)) == FIELD_DECL)
20506a1d 3499 {
3500 if (TREE_OPERAND (node, 2))
c7d4e749 3501 UPDATE_FLAGS (TREE_OPERAND (node, 2));
20506a1d 3502 }
6374121b 3503 else if (TREE_CODE (node) == BIT_FIELD_REF)
c7d4e749 3504 UPDATE_FLAGS (TREE_OPERAND (node, 2));
6374121b 3505 }
b27ac6b5 3506
c7d4e749 3507 node = lang_hooks.expr_to_decl (node, &tc, &se);
54d7165a 3508
6374121b 3509 /* Now see what's inside. If it's an INDIRECT_REF, copy our properties from
c7d4e749 3510 the address, since &(*a)->b is a form of addition. If it's a constant, the
3511 address is constant too. If it's a decl, its address is constant if the
3512 decl is static. Everything else is not constant and, furthermore,
3513 taking the address of a volatile variable is not volatile. */
6374121b 3514 if (TREE_CODE (node) == INDIRECT_REF)
c7d4e749 3515 UPDATE_FLAGS (TREE_OPERAND (node, 0));
ce45a448 3516 else if (CONSTANT_CLASS_P (node))
6374121b 3517 ;
c7d4e749 3518 else if (DECL_P (node))
3519 tc &= (staticp (node) != NULL_TREE);
6374121b 3520 else
3521 {
c7d4e749 3522 tc = false;
6374121b 3523 se |= TREE_SIDE_EFFECTS (node);
4ee9c684 3524 }
3525
c7d4e749 3526
4ee9c684 3527 TREE_CONSTANT (t) = tc;
6374121b 3528 TREE_SIDE_EFFECTS (t) = se;
c7d4e749 3529#undef UPDATE_FLAGS
4ee9c684 3530}
3531
413a7abf 3532/* Build an expression of code CODE, data type TYPE, and operands as
3533 specified. Expressions and reference nodes can be created this way.
3534 Constants, decls, types and misc nodes cannot be.
3535
3536 We define 5 non-variadic functions, from 0 to 4 arguments. This is
c1f8b332 3537 enough for all extant tree codes. */
10a9d4cf 3538
3539tree
674b05f5 3540build0_stat (enum tree_code code, tree tt MEM_STAT_DECL)
10a9d4cf 3541{
19cb6b50 3542 tree t;
10a9d4cf 3543
8c0963c4 3544 gcc_assert (TREE_CODE_LENGTH (code) == 0);
e9a0313b 3545
674b05f5 3546 t = make_node_stat (code PASS_MEM_STAT);
e9a0313b 3547 TREE_TYPE (t) = tt;
10a9d4cf 3548
10a9d4cf 3549 return t;
3550}
3551
10a9d4cf 3552tree
674b05f5 3553build1_stat (enum tree_code code, tree type, tree node MEM_STAT_DECL)
10a9d4cf 3554{
64b4a388 3555 int length = sizeof (struct tree_exp);
07e64d6e 3556#ifdef GATHER_STATISTICS
19cb6b50 3557 tree_node_kind kind;
07e64d6e 3558#endif
19cb6b50 3559 tree t;
10a9d4cf 3560
3561#ifdef GATHER_STATISTICS
64b4a388 3562 switch (TREE_CODE_CLASS (code))
3563 {
ce45a448 3564 case tcc_statement: /* an expression with side effects */
64b4a388 3565 kind = s_kind;
3566 break;
ce45a448 3567 case tcc_reference: /* a reference */
64b4a388 3568 kind = r_kind;
3569 break;
3570 default:
3571 kind = e_kind;
3572 break;
3573 }
3574
3575 tree_node_counts[(int) kind]++;
3576 tree_node_sizes[(int) kind] += length;
10a9d4cf 3577#endif
3578
8c0963c4 3579 gcc_assert (TREE_CODE_LENGTH (code) == 1);
6ba31ca8 3580
45ba1503 3581 t = (tree) ggc_alloc_zone_pass_stat (length, &tree_zone);
791ceafe 3582
b9a7cc69 3583 memset (t, 0, sizeof (struct tree_common));
10a9d4cf 3584
10a9d4cf 3585 TREE_SET_CODE (t, code);
49393347 3586
791ceafe 3587 TREE_TYPE (t) = type;
fdfe4b3f 3588 SET_EXPR_LOCATION (t, UNKNOWN_LOCATION);
10a9d4cf 3589 TREE_OPERAND (t, 0) = node;
4ee9c684 3590 TREE_BLOCK (t) = NULL_TREE;
4161c18d 3591 if (node && !TYPE_P (node))
49393347 3592 {
3593 TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (node);
3594 TREE_READONLY (t) = TREE_READONLY (node);
3595 }
10a9d4cf 3596
ce45a448 3597 if (TREE_CODE_CLASS (code) == tcc_statement)
13ebc860 3598 TREE_SIDE_EFFECTS (t) = 1;
64b4a388 3599 else switch (code)
c2b39255 3600 {
c2b39255 3601 case VA_ARG_EXPR:
c2b39255 3602 /* All of these have side-effects, no matter what their
3603 operands are. */
3604 TREE_SIDE_EFFECTS (t) = 1;
49393347 3605 TREE_READONLY (t) = 0;
c2b39255 3606 break;
d965574e 3607
b056d812 3608 case MISALIGNED_INDIRECT_REF:
3609 case ALIGN_INDIRECT_REF:
d965574e 3610 case INDIRECT_REF:
3611 /* Whether a dereference is readonly has nothing to do with whether
3612 its operand is readonly. */
3613 TREE_READONLY (t) = 0;
3614 break;
9bfff6cb 3615
a708df98 3616 case ADDR_EXPR:
3617 if (node)
750ad201 3618 recompute_tree_invariant_for_addr_expr (t);
a708df98 3619 break;
3620
c2b39255 3621 default:
25a7cbe1 3622 if ((TREE_CODE_CLASS (code) == tcc_unary || code == VIEW_CONVERT_EXPR)
ce45a448 3623 && node && !TYPE_P (node)
66d12a6c 3624 && TREE_CONSTANT (node))
8541c166 3625 TREE_CONSTANT (t) = 1;
ce45a448 3626 if (TREE_CODE_CLASS (code) == tcc_reference
3627 && node && TREE_THIS_VOLATILE (node))
b25de375 3628 TREE_THIS_VOLATILE (t) = 1;
c2b39255 3629 break;
3630 }
3631
10a9d4cf 3632 return t;
3633}
3634
e0ca1cb5 3635#define PROCESS_ARG(N) \
3636 do { \
3637 TREE_OPERAND (t, N) = arg##N; \
3638 if (arg##N &&!TYPE_P (arg##N)) \
3639 { \
3640 if (TREE_SIDE_EFFECTS (arg##N)) \
3641 side_effects = 1; \
3642 if (!TREE_READONLY (arg##N) \
3643 && !CONSTANT_CLASS_P (arg##N)) \
4081d362 3644 (void) (read_only = 0); \
e0ca1cb5 3645 if (!TREE_CONSTANT (arg##N)) \
4081d362 3646 (void) (constant = 0); \
e0ca1cb5 3647 } \
413a7abf 3648 } while (0)
3649
3650tree
674b05f5 3651build2_stat (enum tree_code code, tree tt, tree arg0, tree arg1 MEM_STAT_DECL)
413a7abf 3652{
c7d4e749 3653 bool constant, read_only, side_effects;
413a7abf 3654 tree t;
413a7abf 3655
8c0963c4 3656 gcc_assert (TREE_CODE_LENGTH (code) == 2);
413a7abf 3657
0de36bdb 3658 if ((code == MINUS_EXPR || code == PLUS_EXPR || code == MULT_EXPR)
5c485e88 3659 && arg0 && arg1 && tt && POINTER_TYPE_P (tt)
3660 /* When sizetype precision doesn't match that of pointers
3661 we need to be able to build explicit extensions or truncations
3662 of the offset argument. */
3663 && TYPE_PRECISION (sizetype) == TYPE_PRECISION (tt))
3664 gcc_assert (TREE_CODE (arg0) == INTEGER_CST
3665 && TREE_CODE (arg1) == INTEGER_CST);
0de36bdb 3666
3667 if (code == POINTER_PLUS_EXPR && arg0 && arg1 && tt)
3668 gcc_assert (POINTER_TYPE_P (tt) && POINTER_TYPE_P (TREE_TYPE (arg0))
d2c9d80d 3669 && INTEGRAL_TYPE_P (TREE_TYPE (arg1))
548044d8 3670 && useless_type_conversion_p (sizetype, TREE_TYPE (arg1)));
0de36bdb 3671
674b05f5 3672 t = make_node_stat (code PASS_MEM_STAT);
413a7abf 3673 TREE_TYPE (t) = tt;
3674
3675 /* Below, we automatically set TREE_SIDE_EFFECTS and TREE_READONLY for the
3676 result based on those same flags for the arguments. But if the
3677 arguments aren't really even `tree' expressions, we shouldn't be trying
3678 to do this. */
413a7abf 3679
3680 /* Expressions without side effects may be constant if their
3681 arguments are as well. */
ce45a448 3682 constant = (TREE_CODE_CLASS (code) == tcc_comparison
3683 || TREE_CODE_CLASS (code) == tcc_binary);
413a7abf 3684 read_only = 1;
3685 side_effects = TREE_SIDE_EFFECTS (t);
3686
3687 PROCESS_ARG(0);
3688 PROCESS_ARG(1);
3689
413a7abf 3690 TREE_READONLY (t) = read_only;
3691 TREE_CONSTANT (t) = constant;
b27ac6b5 3692 TREE_SIDE_EFFECTS (t) = side_effects;
6374121b 3693 TREE_THIS_VOLATILE (t)
ce45a448 3694 = (TREE_CODE_CLASS (code) == tcc_reference
3695 && arg0 && TREE_THIS_VOLATILE (arg0));
413a7abf 3696
3697 return t;
3698}
3699
35cc02b5 3700
413a7abf 3701tree
674b05f5 3702build3_stat (enum tree_code code, tree tt, tree arg0, tree arg1,
3703 tree arg2 MEM_STAT_DECL)
413a7abf 3704{
c7d4e749 3705 bool constant, read_only, side_effects;
413a7abf 3706 tree t;
413a7abf 3707
8c0963c4 3708 gcc_assert (TREE_CODE_LENGTH (code) == 3);
c2f47e15 3709 gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
413a7abf 3710
674b05f5 3711 t = make_node_stat (code PASS_MEM_STAT);
413a7abf 3712 TREE_TYPE (t) = tt;
3713
e0ca1cb5 3714 read_only = 1;
3715
63f88450 3716 /* As a special exception, if COND_EXPR has NULL branches, we
3717 assume that it is a gimple statement and always consider
3718 it to have side effects. */
3719 if (code == COND_EXPR
3720 && tt == void_type_node
3721 && arg1 == NULL_TREE
3722 && arg2 == NULL_TREE)
3723 side_effects = true;
3724 else
3725 side_effects = TREE_SIDE_EFFECTS (t);
413a7abf 3726
3727 PROCESS_ARG(0);
3728 PROCESS_ARG(1);
3729 PROCESS_ARG(2);
3730
e0ca1cb5 3731 if (code == COND_EXPR)
3732 TREE_READONLY (t) = read_only;
3733
b27ac6b5 3734 TREE_SIDE_EFFECTS (t) = side_effects;
6374121b 3735 TREE_THIS_VOLATILE (t)
ce45a448 3736 = (TREE_CODE_CLASS (code) == tcc_reference
3737 && arg0 && TREE_THIS_VOLATILE (arg0));
413a7abf 3738
3739 return t;
3740}
3741
3742tree
674b05f5 3743build4_stat (enum tree_code code, tree tt, tree arg0, tree arg1,
3744 tree arg2, tree arg3 MEM_STAT_DECL)
413a7abf 3745{
c7d4e749 3746 bool constant, read_only, side_effects;
413a7abf 3747 tree t;
413a7abf 3748
8c0963c4 3749 gcc_assert (TREE_CODE_LENGTH (code) == 4);
413a7abf 3750
674b05f5 3751 t = make_node_stat (code PASS_MEM_STAT);
413a7abf 3752 TREE_TYPE (t) = tt;
3753
413a7abf 3754 side_effects = TREE_SIDE_EFFECTS (t);
3755
3756 PROCESS_ARG(0);
3757 PROCESS_ARG(1);
3758 PROCESS_ARG(2);
3759 PROCESS_ARG(3);
3760
b27ac6b5 3761 TREE_SIDE_EFFECTS (t) = side_effects;
6374121b 3762 TREE_THIS_VOLATILE (t)
ce45a448 3763 = (TREE_CODE_CLASS (code) == tcc_reference
3764 && arg0 && TREE_THIS_VOLATILE (arg0));
413a7abf 3765
3766 return t;
3767}
3768
1e8e9920 3769tree
3770build5_stat (enum tree_code code, tree tt, tree arg0, tree arg1,
3771 tree arg2, tree arg3, tree arg4 MEM_STAT_DECL)
3772{
c7d4e749 3773 bool constant, read_only, side_effects;
1e8e9920 3774 tree t;
3775
3776 gcc_assert (TREE_CODE_LENGTH (code) == 5);
3777
3778 t = make_node_stat (code PASS_MEM_STAT);
3779 TREE_TYPE (t) = tt;
3780
3781 side_effects = TREE_SIDE_EFFECTS (t);
3782
3783 PROCESS_ARG(0);
3784 PROCESS_ARG(1);
3785 PROCESS_ARG(2);
3786 PROCESS_ARG(3);
3787 PROCESS_ARG(4);
3788
3789 TREE_SIDE_EFFECTS (t) = side_effects;
3790 TREE_THIS_VOLATILE (t)
3791 = (TREE_CODE_CLASS (code) == tcc_reference
3792 && arg0 && TREE_THIS_VOLATILE (arg0));
3793
3794 return t;
3795}
3796
aed164c3 3797tree
dd277d48 3798build6_stat (enum tree_code code, tree tt, tree arg0, tree arg1,
3799 tree arg2, tree arg3, tree arg4, tree arg5 MEM_STAT_DECL)
aed164c3 3800{
c7d4e749 3801 bool constant, read_only, side_effects;
aed164c3 3802 tree t;
3803
3804 gcc_assert (code == TARGET_MEM_REF);
3805
3806 t = make_node_stat (code PASS_MEM_STAT);
3807 TREE_TYPE (t) = tt;
3808
3809 side_effects = TREE_SIDE_EFFECTS (t);
3810
3811 PROCESS_ARG(0);
3812 PROCESS_ARG(1);
3813 PROCESS_ARG(2);
3814 PROCESS_ARG(3);
3815 PROCESS_ARG(4);
9c44b395 3816 if (code == TARGET_MEM_REF)
3817 side_effects = 0;
aed164c3 3818 PROCESS_ARG(5);
aed164c3 3819
3820 TREE_SIDE_EFFECTS (t) = side_effects;
9c44b395 3821 TREE_THIS_VOLATILE (t)
3822 = (code == TARGET_MEM_REF
3823 && arg5 && TREE_THIS_VOLATILE (arg5));
aed164c3 3824
3825 return t;
3826}
3827
10a9d4cf 3828/* Similar except don't specify the TREE_TYPE
3829 and leave the TREE_SIDE_EFFECTS as 0.
3830 It is permissible for arguments to be null,
3831 or even garbage if their values do not matter. */
3832
3833tree
ee582a61 3834build_nt (enum tree_code code, ...)
10a9d4cf 3835{
19cb6b50 3836 tree t;
3837 int length;
3838 int i;
ee582a61 3839 va_list p;
10a9d4cf 3840
c2f47e15 3841 gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
3842
ee582a61 3843 va_start (p, code);
e9a0313b 3844
10a9d4cf 3845 t = make_node (code);
f3c6d29a 3846 length = TREE_CODE_LENGTH (code);
10a9d4cf 3847
3848 for (i = 0; i < length; i++)
3849 TREE_OPERAND (t, i) = va_arg (p, tree);
3850
ee582a61 3851 va_end (p);
10a9d4cf 3852 return t;
3853}
c2f47e15 3854
3855/* Similar to build_nt, but for creating a CALL_EXPR object with
3856 ARGLIST passed as a list. */
3857
3858tree
3859build_nt_call_list (tree fn, tree arglist)
3860{
3861 tree t;
3862 int i;
3863
3864 t = build_vl_exp (CALL_EXPR, list_length (arglist) + 3);
3865 CALL_EXPR_FN (t) = fn;
3866 CALL_EXPR_STATIC_CHAIN (t) = NULL_TREE;
3867 for (i = 0; arglist; arglist = TREE_CHAIN (arglist), i++)
3868 CALL_EXPR_ARG (t, i) = TREE_VALUE (arglist);
3869 return t;
3870}
f352a3fb 3871
3872/* Similar to build_nt, but for creating a CALL_EXPR object with a
3873 tree VEC. */
3874
3875tree
3876build_nt_call_vec (tree fn, VEC(tree,gc) *args)
3877{
3878 tree ret, t;
3879 unsigned int ix;
3880
3881 ret = build_vl_exp (CALL_EXPR, VEC_length (tree, args) + 3);
3882 CALL_EXPR_FN (ret) = fn;
3883 CALL_EXPR_STATIC_CHAIN (ret) = NULL_TREE;
3884 for (ix = 0; VEC_iterate (tree, args, ix, t); ++ix)
3885 CALL_EXPR_ARG (ret, ix) = t;
3886 return ret;
3887}
10a9d4cf 3888\f
3889/* Create a DECL_... node of code CODE, name NAME and data type TYPE.
3890 We do NOT enter this node in any sort of symbol table.
3891
e60a6f7b 3892 LOC is the location of the decl.
3893
10a9d4cf 3894 layout_decl is used to set up the decl's storage layout.
3895 Other slots are initialized to 0 or null pointers. */
3896
3897tree
e60a6f7b 3898build_decl_stat (location_t loc, enum tree_code code, tree name,
3899 tree type MEM_STAT_DECL)
10a9d4cf 3900{
19cb6b50 3901 tree t;
10a9d4cf 3902
674b05f5 3903 t = make_node_stat (code PASS_MEM_STAT);
e60a6f7b 3904 DECL_SOURCE_LOCATION (t) = loc;
10a9d4cf 3905
3906/* if (type == error_mark_node)
3907 type = integer_type_node; */
3908/* That is not done, deliberately, so that having error_mark_node
3909 as the type can suppress useless errors in the use of this variable. */
3910
3911 DECL_NAME (t) = name;
10a9d4cf 3912 TREE_TYPE (t) = type;
3913
3914 if (code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
3915 layout_decl (t, 0);
b27ac6b5 3916
10a9d4cf 3917 return t;
3918}
d7683f13 3919
3920/* Builds and returns function declaration with NAME and TYPE. */
3921
3922tree
3923build_fn_decl (const char *name, tree type)
3924{
3925 tree id = get_identifier (name);
e60a6f7b 3926 tree decl = build_decl (input_location, FUNCTION_DECL, id, type);
d7683f13 3927
3928 DECL_EXTERNAL (decl) = 1;
3929 TREE_PUBLIC (decl) = 1;
3930 DECL_ARTIFICIAL (decl) = 1;
3931 TREE_NOTHROW (decl) = 1;
3932
3933 return decl;
3934}
3935
10a9d4cf 3936\f
3937/* BLOCK nodes are used to represent the structure of binding contours
3938 and declarations, once those contours have been exited and their contents
98eaba23 3939 compiled. This information is used for outputting debugging info. */
10a9d4cf 3940
3941tree
0a4b7550 3942build_block (tree vars, tree subblocks, tree supercontext, tree chain)
10a9d4cf 3943{
19cb6b50 3944 tree block = make_node (BLOCK);
083a2b5e 3945
10a9d4cf 3946 BLOCK_VARS (block) = vars;
10a9d4cf 3947 BLOCK_SUBBLOCKS (block) = subblocks;
3948 BLOCK_SUPERCONTEXT (block) = supercontext;
3949 BLOCK_CHAIN (block) = chain;
3950 return block;
3951}
dae7d8ad 3952
fdfe4b3f 3953expanded_location
3954expand_location (source_location loc)
3955{
3956 expanded_location xloc;
af4d2883 3957 if (loc <= BUILTINS_LOCATION)
7d4c98bc 3958 {
af4d2883 3959 xloc.file = loc == UNKNOWN_LOCATION ? NULL : _("<built-in>");
7d4c98bc 3960 xloc.line = 0;
3961 xloc.column = 0;
bdbc474b 3962 xloc.sysp = 0;
7d4c98bc 3963 }
fdfe4b3f 3964 else
3965 {
931b0a0f 3966 const struct line_map *map = linemap_lookup (line_table, loc);
fdfe4b3f 3967 xloc.file = map->to_file;
3968 xloc.line = SOURCE_LINE (map, loc);
a59d74d6 3969 xloc.column = SOURCE_COLUMN (map, loc);
bdbc474b 3970 xloc.sysp = map->sysp != 0;
fdfe4b3f 3971 };
3972 return xloc;
3973}
3974
10a9d4cf 3975\f
dda49785 3976/* Like SET_EXPR_LOCATION, but make sure the tree can have a location.
3977
3978 LOC is the location to use in tree T. */
3979
d3e86ba4 3980void
3981protected_set_expr_location (tree t, location_t loc)
dda49785 3982{
064963bb 3983 if (t && CAN_HAVE_LOCATION_P (t))
dda49785 3984 SET_EXPR_LOCATION (t, loc);
3985}
35cc02b5 3986\f
e3c541f0 3987/* Return a declaration like DDECL except that its DECL_ATTRIBUTES
a92771b8 3988 is ATTRIBUTE. */
83e622ea 3989
3990tree
60b8c5b3 3991build_decl_attribute_variant (tree ddecl, tree attribute)
83e622ea 3992{
e3c541f0 3993 DECL_ATTRIBUTES (ddecl) = attribute;
83e622ea 3994 return ddecl;
3995}
3996
c068056a 3997/* Borrowed from hashtab.c iterative_hash implementation. */
3998#define mix(a,b,c) \
3999{ \
4000 a -= b; a -= c; a ^= (c>>13); \
4001 b -= c; b -= a; b ^= (a<< 8); \
4002 c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \
4003 a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \
4004 b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \
4005 c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \
4006 a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \
4007 b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \
4008 c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \
4009}
4010
4011
4012/* Produce good hash value combining VAL and VAL2. */
f6c33c78 4013hashval_t
c068056a 4014iterative_hash_hashval_t (hashval_t val, hashval_t val2)
4015{
4016 /* the golden ratio; an arbitrary value. */
4017 hashval_t a = 0x9e3779b9;
4018
4019 mix (a, val, val2);
4020 return val2;
4021}
4022
c068056a 4023/* Produce good hash value combining VAL and VAL2. */
591f01a8 4024hashval_t
c068056a 4025iterative_hash_host_wide_int (HOST_WIDE_INT val, hashval_t val2)
4026{
4027 if (sizeof (HOST_WIDE_INT) == sizeof (hashval_t))
4028 return iterative_hash_hashval_t (val, val2);
4029 else
4030 {
4031 hashval_t a = (hashval_t) val;
4032 /* Avoid warnings about shifting of more than the width of the type on
4033 hosts that won't execute this path. */
4034 int zero = 0;
4035 hashval_t b = (hashval_t) (val >> (sizeof (hashval_t) * 8 + zero));
4036 mix (a, b, val2);
4037 if (sizeof (HOST_WIDE_INT) > 2 * sizeof (hashval_t))
4038 {
4039 hashval_t a = (hashval_t) (val >> (sizeof (hashval_t) * 16 + zero));
4040 hashval_t b = (hashval_t) (val >> (sizeof (hashval_t) * 24 + zero));
4041 mix (a, b, val2);
4042 }
4043 return val2;
4044 }
4045}
4046
9dd95dae 4047/* Return a type like TTYPE except that its TYPE_ATTRIBUTE
b7d1b569 4048 is ATTRIBUTE and its qualifiers are QUALS.
9dd95dae 4049
7331a85d 4050 Record such modified types already made so we don't make duplicates. */
9dd95dae 4051
e1f1071c 4052tree
b7d1b569 4053build_type_attribute_qual_variant (tree ttype, tree attribute, int quals)
9dd95dae 4054{
709c2f34 4055 if (! attribute_list_equal (TYPE_ATTRIBUTES (ttype), attribute))
9dd95dae 4056 {
908e5f41 4057 hashval_t hashcode = 0;
9dd95dae 4058 tree ntype;
908e5f41 4059 enum tree_code code = TREE_CODE (ttype);
9dd95dae 4060
881eb642 4061 /* Building a distinct copy of a tagged type is inappropriate; it
4062 causes breakage in code that expects there to be a one-to-one
4063 relationship between a struct and its fields.
4064 build_duplicate_type is another solution (as used in
4065 handle_transparent_union_attribute), but that doesn't play well
4066 with the stronger C++ type identity model. */
4067 if (TREE_CODE (ttype) == RECORD_TYPE
4068 || TREE_CODE (ttype) == UNION_TYPE
4069 || TREE_CODE (ttype) == QUAL_UNION_TYPE
4070 || TREE_CODE (ttype) == ENUMERAL_TYPE)
4071 {
4072 warning (OPT_Wattributes,
4073 "ignoring attributes applied to %qT after definition",
4074 TYPE_MAIN_VARIANT (ttype));
4075 return build_qualified_type (ttype, quals);
4076 }
9dd95dae 4077
54deba71 4078 ttype = build_qualified_type (ttype, TYPE_UNQUALIFIED);
881eb642 4079 ntype = build_distinct_type_copy (ttype);
9dd95dae 4080
881eb642 4081 TYPE_ATTRIBUTES (ntype) = attribute;
9dd95dae 4082
908e5f41 4083 hashcode = iterative_hash_object (code, hashcode);
4084 if (TREE_TYPE (ntype))
4085 hashcode = iterative_hash_object (TYPE_HASH (TREE_TYPE (ntype)),
4086 hashcode);
4087 hashcode = attribute_hash_list (attribute, hashcode);
9dd95dae 4088
4089 switch (TREE_CODE (ntype))
9bfff6cb 4090 {
0dbd1c74 4091 case FUNCTION_TYPE:
908e5f41 4092 hashcode = type_hash_list (TYPE_ARG_TYPES (ntype), hashcode);
0dbd1c74 4093 break;
4094 case ARRAY_TYPE:
e14d689c 4095 if (TYPE_DOMAIN (ntype))
4096 hashcode = iterative_hash_object (TYPE_HASH (TYPE_DOMAIN (ntype)),
4097 hashcode);
0dbd1c74 4098 break;
4099 case INTEGER_TYPE:
908e5f41 4100 hashcode = iterative_hash_object
4101 (TREE_INT_CST_LOW (TYPE_MAX_VALUE (ntype)), hashcode);
4102 hashcode = iterative_hash_object
4103 (TREE_INT_CST_HIGH (TYPE_MAX_VALUE (ntype)), hashcode);
0dbd1c74 4104 break;
4105 case REAL_TYPE:
06f0b99c 4106 case FIXED_POINT_TYPE:
908e5f41 4107 {
4108 unsigned int precision = TYPE_PRECISION (ntype);
4109 hashcode = iterative_hash_object (precision, hashcode);
4110 }
0dbd1c74 4111 break;
4112 default:
4113 break;
9bfff6cb 4114 }
9dd95dae 4115
4116 ntype = type_hash_canon (hashcode, ntype);
6753bca0 4117
4118 /* If the target-dependent attributes make NTYPE different from
4119 its canonical type, we will need to use structural equality
54deba71 4120 checks for this type. */
8059d350 4121 if (TYPE_STRUCTURAL_EQUALITY_P (ttype)
4122 || !targetm.comp_type_attributes (ntype, ttype))
6753bca0 4123 SET_TYPE_STRUCTURAL_EQUALITY (ntype);
54deba71 4124 else if (TYPE_CANONICAL (ntype) == ntype)
8059d350 4125 TYPE_CANONICAL (ntype) = TYPE_CANONICAL (ttype);
6753bca0 4126
b7d1b569 4127 ttype = build_qualified_type (ntype, quals);
9dd95dae 4128 }
06faa2fe 4129 else if (TYPE_QUALS (ttype) != quals)
4130 ttype = build_qualified_type (ttype, quals);
9dd95dae 4131
4132 return ttype;
4133}
83e622ea 4134
23e9e85f 4135
b7d1b569 4136/* Return a type like TTYPE except that its TYPE_ATTRIBUTE
4137 is ATTRIBUTE.
4138
4139 Record such modified types already made so we don't make duplicates. */
4140
4141tree
4142build_type_attribute_variant (tree ttype, tree attribute)
4143{
4144 return build_type_attribute_qual_variant (ttype, attribute,
4145 TYPE_QUALS (ttype));
4146}
4147
7bfefa9d 4148
621b002b 4149/* Reset the expression *EXPR_P, a size or position.
4150
4151 ??? We could reset all non-constant sizes or positions. But it's cheap
4152 enough to not do so and refrain from adding workarounds to dwarf2out.c.
4153
4154 We need to reset self-referential sizes or positions because they cannot
4155 be gimplified and thus can contain a CALL_EXPR after the gimplification
4156 is finished, which will run afoul of LTO streaming. And they need to be
4157 reset to something essentially dummy but not constant, so as to preserve
4158 the properties of the object they are attached to. */
4159
4160static inline void
4161free_lang_data_in_one_sizepos (tree *expr_p)
4162{
4163 tree expr = *expr_p;
4164 if (CONTAINS_PLACEHOLDER_P (expr))
4165 *expr_p = build0 (PLACEHOLDER_EXPR, TREE_TYPE (expr));
4166}
4167
4168
7bfefa9d 4169/* Reset all the fields in a binfo node BINFO. We only keep
4170 BINFO_VIRTUALS, which is used by gimple_fold_obj_type_ref. */
4171
4172static void
4173free_lang_data_in_binfo (tree binfo)
4174{
4175 unsigned i;
4176 tree t;
4177
4178 gcc_assert (TREE_CODE (binfo) == TREE_BINFO);
4179
7bfefa9d 4180 BINFO_VTABLE (binfo) = NULL_TREE;
7bfefa9d 4181 BINFO_BASE_ACCESSES (binfo) = NULL;
4182 BINFO_INHERITANCE_CHAIN (binfo) = NULL_TREE;
4183 BINFO_SUBVTT_INDEX (binfo) = NULL_TREE;
7bfefa9d 4184
4185 for (i = 0; VEC_iterate (tree, BINFO_BASE_BINFOS (binfo), i, t); i++)
4186 free_lang_data_in_binfo (t);
4187}
4188
4189
34e5cced 4190/* Reset all language specific information still present in TYPE. */
4191
4192static void
4193free_lang_data_in_type (tree type)
4194{
4195 gcc_assert (TYPE_P (type));
4196
34e5cced 4197 /* Give the FE a chance to remove its own data first. */
4198 lang_hooks.free_lang_data (type);
4199
4200 TREE_LANG_FLAG_0 (type) = 0;
4201 TREE_LANG_FLAG_1 (type) = 0;
4202 TREE_LANG_FLAG_2 (type) = 0;
4203 TREE_LANG_FLAG_3 (type) = 0;
4204 TREE_LANG_FLAG_4 (type) = 0;
4205 TREE_LANG_FLAG_5 (type) = 0;
4206 TREE_LANG_FLAG_6 (type) = 0;
4207
4208 if (TREE_CODE (type) == FUNCTION_TYPE)
4209 {
4210 /* Remove the const and volatile qualifiers from arguments. The
4211 C++ front end removes them, but the C front end does not,
4212 leading to false ODR violation errors when merging two
4213 instances of the same function signature compiled by
4214 different front ends. */
4215 tree p;
4216
4217 for (p = TYPE_ARG_TYPES (type); p; p = TREE_CHAIN (p))
4218 {
4219 tree arg_type = TREE_VALUE (p);
4220
4221 if (TYPE_READONLY (arg_type) || TYPE_VOLATILE (arg_type))
4222 {
4223 int quals = TYPE_QUALS (arg_type)
4224 & ~TYPE_QUAL_CONST
4225 & ~TYPE_QUAL_VOLATILE;
4226 TREE_VALUE (p) = build_qualified_type (arg_type, quals);
4227 free_lang_data_in_type (TREE_VALUE (p));
4228 }
4229 }
4230 }
48e1416a 4231
34e5cced 4232 /* Remove members that are not actually FIELD_DECLs from the field
4233 list of an aggregate. These occur in C++. */
7bfefa9d 4234 if (RECORD_OR_UNION_TYPE_P (type))
34e5cced 4235 {
4236 tree prev, member;
4237
4238 /* Note that TYPE_FIELDS can be shared across distinct
4239 TREE_TYPEs. Therefore, if the first field of TYPE_FIELDS is
4240 to be removed, we cannot set its TREE_CHAIN to NULL.
4241 Otherwise, we would not be able to find all the other fields
4242 in the other instances of this TREE_TYPE.
48e1416a 4243
34e5cced 4244 This was causing an ICE in testsuite/g++.dg/lto/20080915.C. */
4245 prev = NULL_TREE;
4246 member = TYPE_FIELDS (type);
4247 while (member)
4248 {
4249 if (TREE_CODE (member) == FIELD_DECL)
4250 {
4251 if (prev)
4252 TREE_CHAIN (prev) = member;
4253 else
4254 TYPE_FIELDS (type) = member;
4255 prev = member;
4256 }
4257
4258 member = TREE_CHAIN (member);
4259 }
4260
4261 if (prev)
4262 TREE_CHAIN (prev) = NULL_TREE;
4263 else
4264 TYPE_FIELDS (type) = NULL_TREE;
4265
4266 TYPE_METHODS (type) = NULL_TREE;
4267 if (TYPE_BINFO (type))
7bfefa9d 4268 free_lang_data_in_binfo (TYPE_BINFO (type));
34e5cced 4269 }
4270 else
4271 {
4272 /* For non-aggregate types, clear out the language slot (which
4273 overloads TYPE_BINFO). */
4274 TYPE_LANG_SLOT_1 (type) = NULL_TREE;
621b002b 4275
4276 if (INTEGRAL_TYPE_P (type)
4277 || SCALAR_FLOAT_TYPE_P (type)
4278 || FIXED_POINT_TYPE_P (type))
4279 {
4280 free_lang_data_in_one_sizepos (&TYPE_MIN_VALUE (type));
4281 free_lang_data_in_one_sizepos (&TYPE_MAX_VALUE (type));
4282 }
34e5cced 4283 }
4284
621b002b 4285 free_lang_data_in_one_sizepos (&TYPE_SIZE (type));
4286 free_lang_data_in_one_sizepos (&TYPE_SIZE_UNIT (type));
4287
be9d48ea 4288 if (debug_info_level < DINFO_LEVEL_TERSE
4289 || (TYPE_CONTEXT (type)
4290 && TREE_CODE (TYPE_CONTEXT (type)) != FUNCTION_DECL
4291 && TREE_CODE (TYPE_CONTEXT (type)) != NAMESPACE_DECL))
4292 TYPE_CONTEXT (type) = NULL_TREE;
4293
08a7e80f 4294 if (debug_info_level < DINFO_LEVEL_TERSE)
4295 TYPE_STUB_DECL (type) = NULL_TREE;
34e5cced 4296}
4297
4298
4299/* Return true if DECL may need an assembler name to be set. */
4300
4301static inline bool
4302need_assembler_name_p (tree decl)
4303{
4304 /* Only FUNCTION_DECLs and VAR_DECLs are considered. */
4305 if (TREE_CODE (decl) != FUNCTION_DECL
4306 && TREE_CODE (decl) != VAR_DECL)
4307 return false;
4308
4309 /* If DECL already has its assembler name set, it does not need a
4310 new one. */
4311 if (!HAS_DECL_ASSEMBLER_NAME_P (decl)
4312 || DECL_ASSEMBLER_NAME_SET_P (decl))
4313 return false;
4314
9e75edb4 4315 /* Abstract decls do not need an assembler name. */
4316 if (DECL_ABSTRACT (decl))
4317 return false;
4318
34e5cced 4319 /* For VAR_DECLs, only static, public and external symbols need an
4320 assembler name. */
4321 if (TREE_CODE (decl) == VAR_DECL
4322 && !TREE_STATIC (decl)
4323 && !TREE_PUBLIC (decl)
4324 && !DECL_EXTERNAL (decl))
4325 return false;
4326
7bfefa9d 4327 if (TREE_CODE (decl) == FUNCTION_DECL)
4328 {
4329 /* Do not set assembler name on builtins. Allow RTL expansion to
4330 decide whether to expand inline or via a regular call. */
4331 if (DECL_BUILT_IN (decl)
4332 && DECL_BUILT_IN_CLASS (decl) != BUILT_IN_FRONTEND)
4333 return false;
34e5cced 4334
7bfefa9d 4335 /* Functions represented in the callgraph need an assembler name. */
3808c1b8 4336 if (cgraph_get_node (decl) != NULL)
7bfefa9d 4337 return true;
4338
4339 /* Unused and not public functions don't need an assembler name. */
4340 if (!TREE_USED (decl) && !TREE_PUBLIC (decl))
4341 return false;
4342 }
34e5cced 4343
4344 return true;
4345}
4346
4347
4348/* Remove all the non-variable decls from BLOCK. LOCALS is the set of
4349 variables in DECL_STRUCT_FUNCTION (FN)->local_decls. Every decl
4350 in BLOCK that is not in LOCALS is removed. */
4351
4352static void
4353free_lang_data_in_block (tree fn, tree block, struct pointer_set_t *locals)
4354{
4355 tree *tp, t;
4356
4357 tp = &BLOCK_VARS (block);
4358 while (*tp)
4359 {
4360 if (!pointer_set_contains (locals, *tp))
4361 *tp = TREE_CHAIN (*tp);
4362 else
4363 tp = &TREE_CHAIN (*tp);
4364 }
4365
4366 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
4367 free_lang_data_in_block (fn, t, locals);
4368}
4369
4370
4371/* Reset all language specific information still present in symbol
4372 DECL. */
4373
4374static void
4375free_lang_data_in_decl (tree decl)
4376{
4377 gcc_assert (DECL_P (decl));
4378
4379 /* Give the FE a chance to remove its own data first. */
4380 lang_hooks.free_lang_data (decl);
4381
4382 TREE_LANG_FLAG_0 (decl) = 0;
4383 TREE_LANG_FLAG_1 (decl) = 0;
4384 TREE_LANG_FLAG_2 (decl) = 0;
4385 TREE_LANG_FLAG_3 (decl) = 0;
4386 TREE_LANG_FLAG_4 (decl) = 0;
4387 TREE_LANG_FLAG_5 (decl) = 0;
4388 TREE_LANG_FLAG_6 (decl) = 0;
4389
4390 /* Identifiers need not have a type. */
4391 if (DECL_NAME (decl))
4392 TREE_TYPE (DECL_NAME (decl)) = NULL_TREE;
4393
34e5cced 4394 /* Ignore any intervening types, because we are going to clear their
4395 TYPE_CONTEXT fields. */
712afa45 4396 if (TREE_CODE (decl) != FIELD_DECL
4397 && TREE_CODE (decl) != FUNCTION_DECL)
34e5cced 4398 DECL_CONTEXT (decl) = decl_function_context (decl);
4399
4400 if (DECL_CONTEXT (decl)
4401 && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
4402 DECL_CONTEXT (decl) = NULL_TREE;
4403
4404 if (TREE_CODE (decl) == VAR_DECL)
4405 {
4406 tree context = DECL_CONTEXT (decl);
4407
4408 if (context)
4409 {
4410 enum tree_code code = TREE_CODE (context);
4411 if (code == FUNCTION_DECL && DECL_ABSTRACT (context))
4412 {
4413 /* Do not clear the decl context here, that will promote
4414 all vars to global ones. */
4415 DECL_INITIAL (decl) = NULL_TREE;
4416 }
4417
4418 if (TREE_STATIC (decl))
4419 DECL_CONTEXT (decl) = NULL_TREE;
4420 }
4421 }
4422
621b002b 4423 free_lang_data_in_one_sizepos (&DECL_SIZE (decl));
4424 free_lang_data_in_one_sizepos (&DECL_SIZE_UNIT (decl));
4425 if (TREE_CODE (decl) == FIELD_DECL)
4426 free_lang_data_in_one_sizepos (&DECL_FIELD_OFFSET (decl));
34e5cced 4427
08a7e80f 4428 /* DECL_FCONTEXT is only used for debug info generation. */
4429 if (TREE_CODE (decl) == FIELD_DECL
4430 && debug_info_level < DINFO_LEVEL_TERSE)
4431 DECL_FCONTEXT (decl) = NULL_TREE;
35615751 4432
08a7e80f 4433 if (TREE_CODE (decl) == FUNCTION_DECL)
34e5cced 4434 {
4435 if (gimple_has_body_p (decl))
4436 {
4437 tree t;
4438 struct pointer_set_t *locals;
4439
4440 /* If DECL has a gimple body, then the context for its
4441 arguments must be DECL. Otherwise, it doesn't really
4442 matter, as we will not be emitting any code for DECL. In
4443 general, there may be other instances of DECL created by
4444 the front end and since PARM_DECLs are generally shared,
4445 their DECL_CONTEXT changes as the replicas of DECL are
4446 created. The only time where DECL_CONTEXT is important
4447 is for the FUNCTION_DECLs that have a gimple body (since
4448 the PARM_DECL will be used in the function's body). */
4449 for (t = DECL_ARGUMENTS (decl); t; t = TREE_CHAIN (t))
4450 DECL_CONTEXT (t) = decl;
4451
4452 /* Collect all the symbols declared in DECL. */
4453 locals = pointer_set_create ();
4454 t = DECL_STRUCT_FUNCTION (decl)->local_decls;
4455 for (; t; t = TREE_CHAIN (t))
4456 {
4457 pointer_set_insert (locals, TREE_VALUE (t));
4458
4459 /* All the local symbols should have DECL as their
4460 context. */
4461 DECL_CONTEXT (TREE_VALUE (t)) = decl;
4462 }
4463
4464 /* Get rid of any decl not in local_decls. */
4465 free_lang_data_in_block (decl, DECL_INITIAL (decl), locals);
4466
4467 pointer_set_destroy (locals);
4468 }
4469
4470 /* DECL_SAVED_TREE holds the GENERIC representation for DECL.
4471 At this point, it is not needed anymore. */
4472 DECL_SAVED_TREE (decl) = NULL_TREE;
4473 }
4474 else if (TREE_CODE (decl) == VAR_DECL)
4475 {
4476 tree expr = DECL_DEBUG_EXPR (decl);
4477 if (expr
4478 && TREE_CODE (expr) == VAR_DECL
4479 && !TREE_STATIC (expr) && !DECL_EXTERNAL (expr))
4480 SET_DECL_DEBUG_EXPR (decl, NULL_TREE);
4481
c90b5d40 4482 if (DECL_EXTERNAL (decl)
4483 && (!TREE_STATIC (decl) || !TREE_READONLY (decl)))
34e5cced 4484 DECL_INITIAL (decl) = NULL_TREE;
4485 }
4486 else if (TREE_CODE (decl) == TYPE_DECL)
4487 {
4488 DECL_INITIAL (decl) = NULL_TREE;
48e1416a 4489
34e5cced 4490 /* DECL_CONTEXT is overloaded as DECL_FIELD_CONTEXT for
4491 FIELD_DECLs, which should be preserved. Otherwise,
4492 we shouldn't be concerned with source-level lexical
4493 nesting beyond this point. */
4494 DECL_CONTEXT (decl) = NULL_TREE;
4495 }
4496}
4497
4498
4499/* Data used when collecting DECLs and TYPEs for language data removal. */
4500
4501struct free_lang_data_d
4502{
969443c4 4503 /* Worklist to avoid excessive recursion. */
4504 VEC(tree,heap) *worklist;
4505
34e5cced 4506 /* Set of traversed objects. Used to avoid duplicate visits. */
4507 struct pointer_set_t *pset;
4508
4509 /* Array of symbols to process with free_lang_data_in_decl. */
4510 VEC(tree,heap) *decls;
4511
4512 /* Array of types to process with free_lang_data_in_type. */
4513 VEC(tree,heap) *types;
4514};
4515
4516
4517/* Save all language fields needed to generate proper debug information
4518 for DECL. This saves most fields cleared out by free_lang_data_in_decl. */
4519
4520static void
4521save_debug_info_for_decl (tree t)
4522{
4523 /*struct saved_debug_info_d *sdi;*/
4524
4525 gcc_assert (debug_info_level > DINFO_LEVEL_TERSE && t && DECL_P (t));
4526
4527 /* FIXME. Partial implementation for saving debug info removed. */
4528}
4529
4530
4531/* Save all language fields needed to generate proper debug information
4532 for TYPE. This saves most fields cleared out by free_lang_data_in_type. */
4533
4534static void
4535save_debug_info_for_type (tree t)
4536{
4537 /*struct saved_debug_info_d *sdi;*/
4538
4539 gcc_assert (debug_info_level > DINFO_LEVEL_TERSE && t && TYPE_P (t));
4540
4541 /* FIXME. Partial implementation for saving debug info removed. */
4542}
4543
4544
4545/* Add type or decl T to one of the list of tree nodes that need their
4546 language data removed. The lists are held inside FLD. */
4547
4548static void
4549add_tree_to_fld_list (tree t, struct free_lang_data_d *fld)
4550{
4551 if (DECL_P (t))
4552 {
4553 VEC_safe_push (tree, heap, fld->decls, t);
4554 if (debug_info_level > DINFO_LEVEL_TERSE)
4555 save_debug_info_for_decl (t);
4556 }
4557 else if (TYPE_P (t))
4558 {
4559 VEC_safe_push (tree, heap, fld->types, t);
4560 if (debug_info_level > DINFO_LEVEL_TERSE)
4561 save_debug_info_for_type (t);
4562 }
4563 else
4564 gcc_unreachable ();
4565}
4566
7bfefa9d 4567/* Push tree node T into FLD->WORKLIST. */
4568
4569static inline void
4570fld_worklist_push (tree t, struct free_lang_data_d *fld)
4571{
4572 if (t && !is_lang_specific (t) && !pointer_set_contains (fld->pset, t))
4573 VEC_safe_push (tree, heap, fld->worklist, (t));
4574}
4575
34e5cced 4576
4577/* Operand callback helper for free_lang_data_in_node. *TP is the
4578 subtree operand being considered. */
4579
4580static tree
7bfefa9d 4581find_decls_types_r (tree *tp, int *ws, void *data)
34e5cced 4582{
4583 tree t = *tp;
4584 struct free_lang_data_d *fld = (struct free_lang_data_d *) data;
4585
969443c4 4586 if (TREE_CODE (t) == TREE_LIST)
4587 return NULL_TREE;
4588
7bfefa9d 4589 /* Language specific nodes will be removed, so there is no need
4590 to gather anything under them. */
4591 if (is_lang_specific (t))
4592 {
4593 *ws = 0;
4594 return NULL_TREE;
4595 }
4596
34e5cced 4597 if (DECL_P (t))
4598 {
4599 /* Note that walk_tree does not traverse every possible field in
4600 decls, so we have to do our own traversals here. */
4601 add_tree_to_fld_list (t, fld);
4602
7bfefa9d 4603 fld_worklist_push (DECL_NAME (t), fld);
4604 fld_worklist_push (DECL_CONTEXT (t), fld);
4605 fld_worklist_push (DECL_SIZE (t), fld);
4606 fld_worklist_push (DECL_SIZE_UNIT (t), fld);
4607
4608 /* We are going to remove everything under DECL_INITIAL for
4609 TYPE_DECLs. No point walking them. */
4610 if (TREE_CODE (t) != TYPE_DECL)
4611 fld_worklist_push (DECL_INITIAL (t), fld);
4612
4613 fld_worklist_push (DECL_ATTRIBUTES (t), fld);
4614 fld_worklist_push (DECL_ABSTRACT_ORIGIN (t), fld);
34e5cced 4615
4616 if (TREE_CODE (t) == FUNCTION_DECL)
4617 {
7bfefa9d 4618 fld_worklist_push (DECL_ARGUMENTS (t), fld);
4619 fld_worklist_push (DECL_RESULT (t), fld);
34e5cced 4620 }
4621 else if (TREE_CODE (t) == TYPE_DECL)
4622 {
7bfefa9d 4623 fld_worklist_push (DECL_ARGUMENT_FLD (t), fld);
4624 fld_worklist_push (DECL_VINDEX (t), fld);
34e5cced 4625 }
4626 else if (TREE_CODE (t) == FIELD_DECL)
4627 {
7bfefa9d 4628 fld_worklist_push (DECL_FIELD_OFFSET (t), fld);
4629 fld_worklist_push (DECL_BIT_FIELD_TYPE (t), fld);
4630 fld_worklist_push (DECL_QUALIFIER (t), fld);
4631 fld_worklist_push (DECL_FIELD_BIT_OFFSET (t), fld);
4632 fld_worklist_push (DECL_FCONTEXT (t), fld);
34e5cced 4633 }
4634 else if (TREE_CODE (t) == VAR_DECL)
4635 {
7bfefa9d 4636 fld_worklist_push (DECL_SECTION_NAME (t), fld);
4637 fld_worklist_push (DECL_COMDAT_GROUP (t), fld);
34e5cced 4638 }
969443c4 4639
621b002b 4640 if ((TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == PARM_DECL)
4641 && DECL_HAS_VALUE_EXPR_P (t))
4642 fld_worklist_push (DECL_VALUE_EXPR (t), fld);
4643
7bfefa9d 4644 if (TREE_CODE (t) != FIELD_DECL)
4645 fld_worklist_push (TREE_CHAIN (t), fld);
969443c4 4646 *ws = 0;
34e5cced 4647 }
4648 else if (TYPE_P (t))
4649 {
4650 /* Note that walk_tree does not traverse every possible field in
4651 types, so we have to do our own traversals here. */
4652 add_tree_to_fld_list (t, fld);
4653
7bfefa9d 4654 if (!RECORD_OR_UNION_TYPE_P (t))
4655 fld_worklist_push (TYPE_CACHED_VALUES (t), fld);
4656 fld_worklist_push (TYPE_SIZE (t), fld);
4657 fld_worklist_push (TYPE_SIZE_UNIT (t), fld);
4658 fld_worklist_push (TYPE_ATTRIBUTES (t), fld);
4659 fld_worklist_push (TYPE_POINTER_TO (t), fld);
4660 fld_worklist_push (TYPE_REFERENCE_TO (t), fld);
4661 fld_worklist_push (TYPE_NAME (t), fld);
4662 fld_worklist_push (TYPE_MINVAL (t), fld);
4663 if (!RECORD_OR_UNION_TYPE_P (t))
4664 fld_worklist_push (TYPE_MAXVAL (t), fld);
4665 fld_worklist_push (TYPE_MAIN_VARIANT (t), fld);
4666 fld_worklist_push (TYPE_NEXT_VARIANT (t), fld);
4667 fld_worklist_push (TYPE_CONTEXT (t), fld);
4668 fld_worklist_push (TYPE_CANONICAL (t), fld);
4669
4670 if (RECORD_OR_UNION_TYPE_P (t) && TYPE_BINFO (t))
969443c4 4671 {
4672 unsigned i;
4673 tree tem;
4674 for (i = 0; VEC_iterate (tree, BINFO_BASE_BINFOS (TYPE_BINFO (t)),
4675 i, tem); ++i)
7bfefa9d 4676 fld_worklist_push (TREE_TYPE (tem), fld);
4677 tem = BINFO_VIRTUALS (TYPE_BINFO (t));
06323ab0 4678 if (tem
4679 /* The Java FE overloads BINFO_VIRTUALS for its own purpose. */
4680 && TREE_CODE (tem) == TREE_LIST)
4681 do
4682 {
4683 fld_worklist_push (TREE_VALUE (tem), fld);
4684 tem = TREE_CHAIN (tem);
4685 }
4686 while (tem);
7bfefa9d 4687 }
4688 if (RECORD_OR_UNION_TYPE_P (t))
4689 {
4690 tree tem;
4691 /* Push all TYPE_FIELDS - there can be interleaving interesting
4692 and non-interesting things. */
4693 tem = TYPE_FIELDS (t);
4694 while (tem)
4695 {
4696 if (TREE_CODE (tem) == FIELD_DECL)
4697 fld_worklist_push (tem, fld);
4698 tem = TREE_CHAIN (tem);
4699 }
969443c4 4700 }
34e5cced 4701
7bfefa9d 4702 fld_worklist_push (TREE_CHAIN (t), fld);
969443c4 4703 *ws = 0;
34e5cced 4704 }
e35f74d5 4705 else if (TREE_CODE (t) == BLOCK)
4706 {
4707 tree tem;
4708 for (tem = BLOCK_VARS (t); tem; tem = TREE_CHAIN (tem))
4709 fld_worklist_push (tem, fld);
4710 for (tem = BLOCK_SUBBLOCKS (t); tem; tem = BLOCK_CHAIN (tem))
4711 fld_worklist_push (tem, fld);
4712 fld_worklist_push (BLOCK_ABSTRACT_ORIGIN (t), fld);
4713 }
34e5cced 4714
7bfefa9d 4715 fld_worklist_push (TREE_TYPE (t), fld);
969443c4 4716
34e5cced 4717 return NULL_TREE;
4718}
4719
969443c4 4720
4721/* Find decls and types in T. */
4722
4723static void
4724find_decls_types (tree t, struct free_lang_data_d *fld)
4725{
4726 while (1)
4727 {
4728 if (!pointer_set_contains (fld->pset, t))
4729 walk_tree (&t, find_decls_types_r, fld, fld->pset);
4730 if (VEC_empty (tree, fld->worklist))
4731 break;
4732 t = VEC_pop (tree, fld->worklist);
4733 }
4734}
34e5cced 4735
4736/* Translate all the types in LIST with the corresponding runtime
4737 types. */
4738
4739static tree
4740get_eh_types_for_runtime (tree list)
4741{
4742 tree head, prev;
4743
4744 if (list == NULL_TREE)
4745 return NULL_TREE;
4746
4747 head = build_tree_list (0, lookup_type_for_runtime (TREE_VALUE (list)));
4748 prev = head;
4749 list = TREE_CHAIN (list);
4750 while (list)
4751 {
4752 tree n = build_tree_list (0, lookup_type_for_runtime (TREE_VALUE (list)));
4753 TREE_CHAIN (prev) = n;
4754 prev = TREE_CHAIN (prev);
4755 list = TREE_CHAIN (list);
4756 }
4757
4758 return head;
4759}
4760
4761
4762/* Find decls and types referenced in EH region R and store them in
4763 FLD->DECLS and FLD->TYPES. */
4764
4765static void
4766find_decls_types_in_eh_region (eh_region r, struct free_lang_data_d *fld)
4767{
e38def9c 4768 switch (r->type)
34e5cced 4769 {
e38def9c 4770 case ERT_CLEANUP:
4771 break;
4772
4773 case ERT_TRY:
4774 {
4775 eh_catch c;
4776
4777 /* The types referenced in each catch must first be changed to the
4778 EH types used at runtime. This removes references to FE types
4779 in the region. */
4780 for (c = r->u.eh_try.first_catch; c ; c = c->next_catch)
4781 {
4782 c->type_list = get_eh_types_for_runtime (c->type_list);
4783 walk_tree (&c->type_list, find_decls_types_r, fld, fld->pset);
4784 }
4785 }
4786 break;
4787
4788 case ERT_ALLOWED_EXCEPTIONS:
4789 r->u.allowed.type_list
4790 = get_eh_types_for_runtime (r->u.allowed.type_list);
4791 walk_tree (&r->u.allowed.type_list, find_decls_types_r, fld, fld->pset);
4792 break;
4793
4794 case ERT_MUST_NOT_THROW:
4795 walk_tree (&r->u.must_not_throw.failure_decl,
4796 find_decls_types_r, fld, fld->pset);
4797 break;
34e5cced 4798 }
4799}
4800
4801
4802/* Find decls and types referenced in cgraph node N and store them in
4803 FLD->DECLS and FLD->TYPES. Unlike pass_referenced_vars, this will
4804 look for *every* kind of DECL and TYPE node reachable from N,
4805 including those embedded inside types and decls (i.e,, TYPE_DECLs,
4806 NAMESPACE_DECLs, etc). */
4807
4808static void
4809find_decls_types_in_node (struct cgraph_node *n, struct free_lang_data_d *fld)
4810{
4811 basic_block bb;
4812 struct function *fn;
4813 tree t;
4814
969443c4 4815 find_decls_types (n->decl, fld);
34e5cced 4816
4817 if (!gimple_has_body_p (n->decl))
4818 return;
4819
4820 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
4821
4822 fn = DECL_STRUCT_FUNCTION (n->decl);
4823
4824 /* Traverse locals. */
4825 for (t = fn->local_decls; t; t = TREE_CHAIN (t))
969443c4 4826 find_decls_types (TREE_VALUE (t), fld);
34e5cced 4827
4828 /* Traverse EH regions in FN. */
e38def9c 4829 {
4830 eh_region r;
4831 FOR_ALL_EH_REGION_FN (r, fn)
4832 find_decls_types_in_eh_region (r, fld);
4833 }
34e5cced 4834
4835 /* Traverse every statement in FN. */
4836 FOR_EACH_BB_FN (bb, fn)
4837 {
4838 gimple_stmt_iterator si;
4839 unsigned i;
4840
4841 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
4842 {
4843 gimple phi = gsi_stmt (si);
4844
4845 for (i = 0; i < gimple_phi_num_args (phi); i++)
4846 {
4847 tree *arg_p = gimple_phi_arg_def_ptr (phi, i);
969443c4 4848 find_decls_types (*arg_p, fld);
34e5cced 4849 }
4850 }
4851
4852 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
4853 {
4854 gimple stmt = gsi_stmt (si);
4855
4856 for (i = 0; i < gimple_num_ops (stmt); i++)
4857 {
969443c4 4858 tree arg = gimple_op (stmt, i);
4859 find_decls_types (arg, fld);
34e5cced 4860 }
4861 }
4862 }
4863}
4864
4865
4866/* Find decls and types referenced in varpool node N and store them in
4867 FLD->DECLS and FLD->TYPES. Unlike pass_referenced_vars, this will
4868 look for *every* kind of DECL and TYPE node reachable from N,
4869 including those embedded inside types and decls (i.e,, TYPE_DECLs,
4870 NAMESPACE_DECLs, etc). */
4871
4872static void
4873find_decls_types_in_var (struct varpool_node *v, struct free_lang_data_d *fld)
4874{
969443c4 4875 find_decls_types (v->decl, fld);
34e5cced 4876}
4877
6816d0c4 4878/* If T needs an assembler name, have one created for it. */
4879
4880void
4881assign_assembler_name_if_neeeded (tree t)
4882{
4883 if (need_assembler_name_p (t))
4884 {
4885 /* When setting DECL_ASSEMBLER_NAME, the C++ mangler may emit
4886 diagnostics that use input_location to show locus
4887 information. The problem here is that, at this point,
4888 input_location is generally anchored to the end of the file
4889 (since the parser is long gone), so we don't have a good
4890 position to pin it to.
4891
4892 To alleviate this problem, this uses the location of T's
4893 declaration. Examples of this are
4894 testsuite/g++.dg/template/cond2.C and
4895 testsuite/g++.dg/template/pr35240.C. */
4896 location_t saved_location = input_location;
4897 input_location = DECL_SOURCE_LOCATION (t);
4898
4899 decl_assembler_name (t);
4900
4901 input_location = saved_location;
4902 }
4903}
4904
34e5cced 4905
4906/* Free language specific information for every operand and expression
4907 in every node of the call graph. This process operates in three stages:
4908
4909 1- Every callgraph node and varpool node is traversed looking for
4910 decls and types embedded in them. This is a more exhaustive
4911 search than that done by find_referenced_vars, because it will
4912 also collect individual fields, decls embedded in types, etc.
4913
4914 2- All the decls found are sent to free_lang_data_in_decl.
4915
4916 3- All the types found are sent to free_lang_data_in_type.
4917
4918 The ordering between decls and types is important because
4919 free_lang_data_in_decl sets assembler names, which includes
4920 mangling. So types cannot be freed up until assembler names have
4921 been set up. */
4922
4923static void
4924free_lang_data_in_cgraph (void)
4925{
4926 struct cgraph_node *n;
4927 struct varpool_node *v;
4928 struct free_lang_data_d fld;
4929 tree t;
4930 unsigned i;
4931 alias_pair *p;
4932
4933 /* Initialize sets and arrays to store referenced decls and types. */
4934 fld.pset = pointer_set_create ();
969443c4 4935 fld.worklist = NULL;
34e5cced 4936 fld.decls = VEC_alloc (tree, heap, 100);
4937 fld.types = VEC_alloc (tree, heap, 100);
4938
4939 /* Find decls and types in the body of every function in the callgraph. */
4940 for (n = cgraph_nodes; n; n = n->next)
4941 find_decls_types_in_node (n, &fld);
4942
4943 for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
969443c4 4944 find_decls_types (p->decl, &fld);
34e5cced 4945
4946 /* Find decls and types in every varpool symbol. */
4947 for (v = varpool_nodes_queue; v; v = v->next_needed)
4948 find_decls_types_in_var (v, &fld);
4949
4950 /* Set the assembler name on every decl found. We need to do this
4951 now because free_lang_data_in_decl will invalidate data needed
4952 for mangling. This breaks mangling on interdependent decls. */
4953 for (i = 0; VEC_iterate (tree, fld.decls, i, t); i++)
6816d0c4 4954 assign_assembler_name_if_neeeded (t);
34e5cced 4955
4956 /* Traverse every decl found freeing its language data. */
4957 for (i = 0; VEC_iterate (tree, fld.decls, i, t); i++)
4958 free_lang_data_in_decl (t);
4959
4960 /* Traverse every type found freeing its language data. */
4961 for (i = 0; VEC_iterate (tree, fld.types, i, t); i++)
4962 free_lang_data_in_type (t);
4963
4964 pointer_set_destroy (fld.pset);
969443c4 4965 VEC_free (tree, heap, fld.worklist);
34e5cced 4966 VEC_free (tree, heap, fld.decls);
4967 VEC_free (tree, heap, fld.types);
4968}
4969
4970
4971/* Free resources that are used by FE but are not needed once they are done. */
4972
4973static unsigned
4974free_lang_data (void)
4975{
7b7fcfe1 4976 unsigned i;
4977
abd3c475 4978 /* If we are the LTO frontend we have freed lang-specific data already. */
7b887394 4979 if (in_lto_p
4980 || !flag_generate_lto)
abd3c475 4981 return 0;
4982
7b7fcfe1 4983 /* Allocate and assign alias sets to the standard integer types
4984 while the slots are still in the way the frontends generated them. */
4985 for (i = 0; i < itk_none; ++i)
4986 if (integer_types[i])
4987 TYPE_ALIAS_SET (integer_types[i]) = get_alias_set (integer_types[i]);
4988
34e5cced 4989 /* Traverse the IL resetting language specific information for
4990 operands, expressions, etc. */
4991 free_lang_data_in_cgraph ();
4992
4993 /* Create gimple variants for common types. */
4994 ptrdiff_type_node = integer_type_node;
4995 fileptr_type_node = ptr_type_node;
4996 if (TREE_CODE (boolean_type_node) != BOOLEAN_TYPE
4997 || (TYPE_MODE (boolean_type_node)
4998 != mode_for_size (BOOL_TYPE_SIZE, MODE_INT, 0))
4999 || TYPE_PRECISION (boolean_type_node) != 1
5000 || !TYPE_UNSIGNED (boolean_type_node))
5001 {
5002 boolean_type_node = make_unsigned_type (BOOL_TYPE_SIZE);
5003 TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE);
5004 TYPE_MAX_VALUE (boolean_type_node) = build_int_cst (boolean_type_node, 1);
5005 TYPE_PRECISION (boolean_type_node) = 1;
5006 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
5007 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
5008 }
5009
ca1de3a6 5010 /* Unify char_type_node with its properly signed variant. */
5011 if (TYPE_UNSIGNED (char_type_node))
5012 unsigned_char_type_node = char_type_node;
5013 else
5014 signed_char_type_node = char_type_node;
5015
7b7fcfe1 5016 /* Reset some langhooks. Do not reset types_compatible_p, it may
5017 still be used indirectly via the get_alias_set langhook. */
34e5cced 5018 lang_hooks.callgraph.analyze_expr = NULL;
34e5cced 5019 lang_hooks.dwarf_name = lhd_dwarf_name;
5020 lang_hooks.decl_printable_name = gimple_decl_printable_name;
5021 lang_hooks.set_decl_assembler_name = lhd_set_decl_assembler_name;
34e5cced 5022
5023 /* Reset diagnostic machinery. */
ce084dfc 5024 diagnostic_starter (global_dc) = default_tree_diagnostic_starter;
34e5cced 5025 diagnostic_finalizer (global_dc) = default_diagnostic_finalizer;
5026 diagnostic_format_decoder (global_dc) = default_tree_printer;
5027
5028 return 0;
5029}
5030
5031
48e1416a 5032struct simple_ipa_opt_pass pass_ipa_free_lang_data =
34e5cced 5033{
5034 {
5035 SIMPLE_IPA_PASS,
0c297edc 5036 "*free_lang_data", /* name */
7b7fcfe1 5037 NULL, /* gate */
34e5cced 5038 free_lang_data, /* execute */
5039 NULL, /* sub */
5040 NULL, /* next */
5041 0, /* static_pass_number */
5042 TV_IPA_FREE_LANG_DATA, /* tv_id */
5043 0, /* properties_required */
5044 0, /* properties_provided */
5045 0, /* properties_destroyed */
5046 0, /* todo_flags_start */
ca1de3a6 5047 TODO_ggc_collect /* todo_flags_finish */
34e5cced 5048 }
5049};
5050
f712a0dc 5051/* Return nonzero if IDENT is a valid name for attribute ATTR,
edee2468 5052 or zero if not.
5053
5054 We try both `text' and `__text__', ATTR may be either one. */
5055/* ??? It might be a reasonable simplification to require ATTR to be only
5056 `text'. One might then also require attribute lists to be stored in
5057 their canonicalized form. */
5058
23e9e85f 5059static int
720082dc 5060is_attribute_with_length_p (const char *attr, int attr_len, const_tree ident)
edee2468 5061{
23e9e85f 5062 int ident_len;
71d9fc9b 5063 const char *p;
edee2468 5064
5065 if (TREE_CODE (ident) != IDENTIFIER_NODE)
5066 return 0;
48e1416a 5067
edee2468 5068 p = IDENTIFIER_POINTER (ident);
23e9e85f 5069 ident_len = IDENTIFIER_LENGTH (ident);
48e1416a 5070
23e9e85f 5071 if (ident_len == attr_len
5072 && strcmp (attr, p) == 0)
5073 return 1;
edee2468 5074
5075 /* If ATTR is `__text__', IDENT must be `text'; and vice versa. */
5076 if (attr[0] == '_')
5077 {
8c0963c4 5078 gcc_assert (attr[1] == '_');
5079 gcc_assert (attr[attr_len - 2] == '_');
5080 gcc_assert (attr[attr_len - 1] == '_');
edee2468 5081 if (ident_len == attr_len - 4
5082 && strncmp (attr + 2, p, attr_len - 4) == 0)
5083 return 1;
5084 }
5085 else
5086 {
5087 if (ident_len == attr_len + 4
5088 && p[0] == '_' && p[1] == '_'
5089 && p[ident_len - 2] == '_' && p[ident_len - 1] == '_'
5090 && strncmp (attr, p + 2, attr_len) == 0)
5091 return 1;
5092 }
5093
5094 return 0;
5095}
5096
23e9e85f 5097/* Return nonzero if IDENT is a valid name for attribute ATTR,
5098 or zero if not.
5099
5100 We try both `text' and `__text__', ATTR may be either one. */
5101
5102int
720082dc 5103is_attribute_p (const char *attr, const_tree ident)
23e9e85f 5104{
5105 return is_attribute_with_length_p (attr, strlen (attr), ident);
5106}
5107
edee2468 5108/* Given an attribute name and a list of attributes, return a pointer to the
5109 attribute's list element if the attribute is part of the list, or NULL_TREE
e3c541f0 5110 if not found. If the attribute appears more than once, this only
424da949 5111 returns the first occurrence; the TREE_CHAIN of the return value should
5112 be passed back in if further occurrences are wanted. */
edee2468 5113
5114tree
60b8c5b3 5115lookup_attribute (const char *attr_name, tree list)
edee2468 5116{
ce4469fa 5117 tree l;
5118 size_t attr_len = strlen (attr_name);
edee2468 5119
ce4469fa 5120 for (l = list; l; l = TREE_CHAIN (l))
5121 {
5122 gcc_assert (TREE_CODE (TREE_PURPOSE (l)) == IDENTIFIER_NODE);
5123 if (is_attribute_with_length_p (attr_name, attr_len, TREE_PURPOSE (l)))
5124 return l;
5125 }
5126 return NULL_TREE;
edee2468 5127}
0d647a4f 5128
6a47600c 5129/* Remove any instances of attribute ATTR_NAME in LIST and return the
5130 modified list. */
5131
5132tree
5133remove_attribute (const char *attr_name, tree list)
5134{
5135 tree *p;
5136 size_t attr_len = strlen (attr_name);
5137
5138 for (p = &list; *p; )
5139 {
5140 tree l = *p;
5141 gcc_assert (TREE_CODE (TREE_PURPOSE (l)) == IDENTIFIER_NODE);
5142 if (is_attribute_with_length_p (attr_name, attr_len, TREE_PURPOSE (l)))
5143 *p = TREE_CHAIN (l);
5144 else
5145 p = &TREE_CHAIN (l);
5146 }
5147
5148 return list;
5149}
5150
0d647a4f 5151/* Return an attribute list that is the union of a1 and a2. */
5152
5153tree
60b8c5b3 5154merge_attributes (tree a1, tree a2)
0d647a4f 5155{
5156 tree attributes;
5157
5158 /* Either one unset? Take the set one. */
5159
083a2b5e 5160 if ((attributes = a1) == 0)
0d647a4f 5161 attributes = a2;
5162
5163 /* One that completely contains the other? Take it. */
5164
083a2b5e 5165 else if (a2 != 0 && ! attribute_list_contained (a1, a2))
9bfff6cb 5166 {
5167 if (attribute_list_contained (a2, a1))
5168 attributes = a2;
5169 else
5170 {
5171 /* Pick the longest list, and hang on the other list. */
9bfff6cb 5172
5173 if (list_length (a1) < list_length (a2))
5174 attributes = a2, a2 = a1;
5175
5176 for (; a2 != 0; a2 = TREE_CHAIN (a2))
e3c541f0 5177 {
5178 tree a;
5179 for (a = lookup_attribute (IDENTIFIER_POINTER (TREE_PURPOSE (a2)),
5180 attributes);
5181 a != NULL_TREE;
5182 a = lookup_attribute (IDENTIFIER_POINTER (TREE_PURPOSE (a2)),
5183 TREE_CHAIN (a)))
5184 {
9369a09f 5185 if (TREE_VALUE (a) != NULL
5186 && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
5187 && TREE_VALUE (a2) != NULL
5188 && TREE_CODE (TREE_VALUE (a2)) == TREE_LIST)
5189 {
5190 if (simple_cst_list_equal (TREE_VALUE (a),
5191 TREE_VALUE (a2)) == 1)
5192 break;
5193 }
5194 else if (simple_cst_equal (TREE_VALUE (a),
5195 TREE_VALUE (a2)) == 1)
e3c541f0 5196 break;
5197 }
5198 if (a == NULL_TREE)
5199 {
5200 a1 = copy_node (a2);
5201 TREE_CHAIN (a1) = attributes;
5202 attributes = a1;
5203 }
5204 }
9bfff6cb 5205 }
5206 }
0d647a4f 5207 return attributes;
5208}
0bf60c2b 5209
5210/* Given types T1 and T2, merge their attributes and return
a767736d 5211 the result. */
0bf60c2b 5212
5213tree
60b8c5b3 5214merge_type_attributes (tree t1, tree t2)
0bf60c2b 5215{
0bf60c2b 5216 return merge_attributes (TYPE_ATTRIBUTES (t1),
5217 TYPE_ATTRIBUTES (t2));
0bf60c2b 5218}
5219
5220/* Given decls OLDDECL and NEWDECL, merge their attributes and return
5221 the result. */
5222
5223tree
60b8c5b3 5224merge_decl_attributes (tree olddecl, tree newdecl)
0bf60c2b 5225{
e3c541f0 5226 return merge_attributes (DECL_ATTRIBUTES (olddecl),
5227 DECL_ATTRIBUTES (newdecl));
0bf60c2b 5228}
a767736d 5229
3aa0c315 5230#if TARGET_DLLIMPORT_DECL_ATTRIBUTES
a767736d 5231
5232/* Specialization of merge_decl_attributes for various Windows targets.
5233
5234 This handles the following situation:
5235
5236 __declspec (dllimport) int foo;
5237 int foo;
5238
5239 The second instance of `foo' nullifies the dllimport. */
5240
5241tree
8deb3959 5242merge_dllimport_decl_attributes (tree old, tree new_tree)
a767736d 5243{
5244 tree a;
6c1e551f 5245 int delete_dllimport_p = 1;
a767736d 5246
5247 /* What we need to do here is remove from `old' dllimport if it doesn't
5248 appear in `new'. dllimport behaves like extern: if a declaration is
5249 marked dllimport and a definition appears later, then the object
6c1e551f 5250 is not dllimport'd. We also remove a `new' dllimport if the old list
5251 contains dllexport: dllexport always overrides dllimport, regardless
48e1416a 5252 of the order of declaration. */
8deb3959 5253 if (!VAR_OR_FUNCTION_DECL_P (new_tree))
6c1e551f 5254 delete_dllimport_p = 0;
8deb3959 5255 else if (DECL_DLLIMPORT_P (new_tree)
6c1e551f 5256 && lookup_attribute ("dllexport", DECL_ATTRIBUTES (old)))
48e1416a 5257 {
8deb3959 5258 DECL_DLLIMPORT_P (new_tree) = 0;
6c1e551f 5259 warning (OPT_Wattributes, "%q+D already declared with dllexport attribute: "
8deb3959 5260 "dllimport ignored", new_tree);
6c1e551f 5261 }
8deb3959 5262 else if (DECL_DLLIMPORT_P (old) && !DECL_DLLIMPORT_P (new_tree))
6c1e551f 5263 {
f0b5f617 5264 /* Warn about overriding a symbol that has already been used, e.g.:
6c1e551f 5265 extern int __attribute__ ((dllimport)) foo;
5266 int* bar () {return &foo;}
5267 int foo;
5268 */
5269 if (TREE_USED (old))
5270 {
5271 warning (0, "%q+D redeclared without dllimport attribute "
8deb3959 5272 "after being referenced with dll linkage", new_tree);
6c1e551f 5273 /* If we have used a variable's address with dllimport linkage,
5274 keep the old DECL_DLLIMPORT_P flag: the ADDR_EXPR using the
c7d4e749 5275 decl may already have had TREE_CONSTANT computed.
6c1e551f 5276 We still remove the attribute so that assembler code refers
5277 to '&foo rather than '_imp__foo'. */
5278 if (TREE_CODE (old) == VAR_DECL && TREE_ADDRESSABLE (old))
8deb3959 5279 DECL_DLLIMPORT_P (new_tree) = 1;
6c1e551f 5280 }
5281
5282 /* Let an inline definition silently override the external reference,
48e1416a 5283 but otherwise warn about attribute inconsistency. */
8deb3959 5284 else if (TREE_CODE (new_tree) == VAR_DECL
5285 || !DECL_DECLARED_INLINE_P (new_tree))
6c1e551f 5286 warning (OPT_Wattributes, "%q+D redeclared without dllimport attribute: "
8deb3959 5287 "previous dllimport ignored", new_tree);
6c1e551f 5288 }
a767736d 5289 else
5290 delete_dllimport_p = 0;
5291
8deb3959 5292 a = merge_attributes (DECL_ATTRIBUTES (old), DECL_ATTRIBUTES (new_tree));
a767736d 5293
48e1416a 5294 if (delete_dllimport_p)
a767736d 5295 {
ac0c7fb1 5296 tree prev, t;
48e1416a 5297 const size_t attr_len = strlen ("dllimport");
5298
a767736d 5299 /* Scan the list for dllimport and delete it. */
5300 for (prev = NULL_TREE, t = a; t; prev = t, t = TREE_CHAIN (t))
5301 {
6c1e551f 5302 if (is_attribute_with_length_p ("dllimport", attr_len,
5303 TREE_PURPOSE (t)))
a767736d 5304 {
5305 if (prev == NULL_TREE)
5306 a = TREE_CHAIN (a);
5307 else
5308 TREE_CHAIN (prev) = TREE_CHAIN (t);
5309 break;
5310 }
5311 }
5312 }
5313
5314 return a;
5315}
5316
3aa0c315 5317/* Handle a "dllimport" or "dllexport" attribute; arguments as in
5318 struct attribute_spec.handler. */
5319
5320tree
5321handle_dll_attribute (tree * pnode, tree name, tree args, int flags,
5322 bool *no_add_attrs)
5323{
5324 tree node = *pnode;
aed4eb5d 5325 bool is_dllimport;
3aa0c315 5326
5327 /* These attributes may apply to structure and union types being created,
5328 but otherwise should pass to the declaration involved. */
5329 if (!DECL_P (node))
5330 {
5331 if (flags & ((int) ATTR_FLAG_DECL_NEXT | (int) ATTR_FLAG_FUNCTION_NEXT
5332 | (int) ATTR_FLAG_ARRAY_NEXT))
5333 {
5334 *no_add_attrs = true;
5335 return tree_cons (name, args, NULL_TREE);
5336 }
098a01e7 5337 if (TREE_CODE (node) == RECORD_TYPE
5338 || TREE_CODE (node) == UNION_TYPE)
5339 {
5340 node = TYPE_NAME (node);
5341 if (!node)
5342 return NULL_TREE;
5343 }
5344 else
3aa0c315 5345 {
abd3e6b5 5346 warning (OPT_Wattributes, "%qE attribute ignored",
5347 name);
3aa0c315 5348 *no_add_attrs = true;
098a01e7 5349 return NULL_TREE;
3aa0c315 5350 }
3aa0c315 5351 }
5352
27e0de67 5353 if (TREE_CODE (node) != FUNCTION_DECL
098a01e7 5354 && TREE_CODE (node) != VAR_DECL
5355 && TREE_CODE (node) != TYPE_DECL)
27e0de67 5356 {
5357 *no_add_attrs = true;
abd3e6b5 5358 warning (OPT_Wattributes, "%qE attribute ignored",
5359 name);
27e0de67 5360 return NULL_TREE;
5361 }
5362
9c467f13 5363 if (TREE_CODE (node) == TYPE_DECL
5364 && TREE_CODE (TREE_TYPE (node)) != RECORD_TYPE
5365 && TREE_CODE (TREE_TYPE (node)) != UNION_TYPE)
5366 {
5367 *no_add_attrs = true;
abd3e6b5 5368 warning (OPT_Wattributes, "%qE attribute ignored",
5369 name);
9c467f13 5370 return NULL_TREE;
5371 }
5372
aed4eb5d 5373 is_dllimport = is_attribute_p ("dllimport", name);
5374
3aa0c315 5375 /* Report error on dllimport ambiguities seen now before they cause
5376 any damage. */
aed4eb5d 5377 if (is_dllimport)
3aa0c315 5378 {
48e1416a 5379 /* Honor any target-specific overrides. */
6c1e551f 5380 if (!targetm.valid_dllimport_attribute_p (node))
5381 *no_add_attrs = true;
5382
5383 else if (TREE_CODE (node) == FUNCTION_DECL
5384 && DECL_DECLARED_INLINE_P (node))
5385 {
5386 warning (OPT_Wattributes, "inline function %q+D declared as "
48e1416a 5387 " dllimport: attribute ignored", node);
6c1e551f 5388 *no_add_attrs = true;
5389 }
3aa0c315 5390 /* Like MS, treat definition of dllimported variables and
6c1e551f 5391 non-inlined functions on declaration as syntax errors. */
5392 else if (TREE_CODE (node) == FUNCTION_DECL && DECL_INITIAL (node))
3aa0c315 5393 {
3284a242 5394 error ("function %q+D definition is marked dllimport", node);
3aa0c315 5395 *no_add_attrs = true;
5396 }
5397
6c1e551f 5398 else if (TREE_CODE (node) == VAR_DECL)
3aa0c315 5399 {
5400 if (DECL_INITIAL (node))
5401 {
3284a242 5402 error ("variable %q+D definition is marked dllimport",
3cf8b391 5403 node);
3aa0c315 5404 *no_add_attrs = true;
5405 }
5406
5407 /* `extern' needn't be specified with dllimport.
5408 Specify `extern' now and hope for the best. Sigh. */
5409 DECL_EXTERNAL (node) = 1;
5410 /* Also, implicitly give dllimport'd variables declared within
5411 a function global scope, unless declared static. */
5412 if (current_function_decl != NULL_TREE && !TREE_STATIC (node))
5413 TREE_PUBLIC (node) = 1;
5414 }
6c1e551f 5415
5416 if (*no_add_attrs == false)
5417 DECL_DLLIMPORT_P (node) = 1;
3aa0c315 5418 }
de84ad02 5419 else if (TREE_CODE (node) == FUNCTION_DECL
5420 && DECL_DECLARED_INLINE_P (node))
aed4eb5d 5421 /* An exported function, even if inline, must be emitted. */
5422 DECL_EXTERNAL (node) = 0;
3aa0c315 5423
5424 /* Report error if symbol is not accessible at global scope. */
5425 if (!TREE_PUBLIC (node)
5426 && (TREE_CODE (node) == VAR_DECL
5427 || TREE_CODE (node) == FUNCTION_DECL))
5428 {
3cf8b391 5429 error ("external linkage required for symbol %q+D because of "
abd3e6b5 5430 "%qE attribute", node, name);
3aa0c315 5431 *no_add_attrs = true;
5432 }
5433
098a01e7 5434 /* A dllexport'd entity must have default visibility so that other
5435 program units (shared libraries or the main executable) can see
5436 it. A dllimport'd entity must have default visibility so that
5437 the linker knows that undefined references within this program
5438 unit can be resolved by the dynamic linker. */
5439 if (!*no_add_attrs)
5440 {
5441 if (DECL_VISIBILITY_SPECIFIED (node)
5442 && DECL_VISIBILITY (node) != VISIBILITY_DEFAULT)
abd3e6b5 5443 error ("%qE implies default visibility, but %qD has already "
48e1416a 5444 "been declared with a different visibility",
abd3e6b5 5445 name, node);
098a01e7 5446 DECL_VISIBILITY (node) = VISIBILITY_DEFAULT;
5447 DECL_VISIBILITY_SPECIFIED (node) = 1;
5448 }
5449
3aa0c315 5450 return NULL_TREE;
5451}
5452
a767736d 5453#endif /* TARGET_DLLIMPORT_DECL_ATTRIBUTES */
9dd95dae 5454\f
a5b1863e 5455/* Set the type qualifiers for TYPE to TYPE_QUALS, which is a bitmask
5456 of the various TYPE_QUAL values. */
10a9d4cf 5457
a5b1863e 5458static void
60b8c5b3 5459set_type_quals (tree type, int type_quals)
a5b1863e 5460{
5461 TYPE_READONLY (type) = (type_quals & TYPE_QUAL_CONST) != 0;
5462 TYPE_VOLATILE (type) = (type_quals & TYPE_QUAL_VOLATILE) != 0;
5463 TYPE_RESTRICT (type) = (type_quals & TYPE_QUAL_RESTRICT) != 0;
bd1a81f7 5464 TYPE_ADDR_SPACE (type) = DECODE_QUAL_ADDR_SPACE (type_quals);
a5b1863e 5465}
10a9d4cf 5466
f47ba5b1 5467/* Returns true iff CAND is equivalent to BASE with TYPE_QUALS. */
e40000f4 5468
5469bool
720082dc 5470check_qualified_type (const_tree cand, const_tree base, int type_quals)
e40000f4 5471{
5472 return (TYPE_QUALS (cand) == type_quals
5473 && TYPE_NAME (cand) == TYPE_NAME (base)
5474 /* Apparently this is needed for Objective-C. */
5475 && TYPE_CONTEXT (cand) == TYPE_CONTEXT (base)
5476 && attribute_list_equal (TYPE_ATTRIBUTES (cand),
5477 TYPE_ATTRIBUTES (base)));
5478}
5479
051b8c96 5480/* Return a version of the TYPE, qualified as indicated by the
5481 TYPE_QUALS, if one exists. If no qualified version exists yet,
5482 return NULL_TREE. */
10a9d4cf 5483
5484tree
60b8c5b3 5485get_qualified_type (tree type, int type_quals)
10a9d4cf 5486{
051b8c96 5487 tree t;
9bfff6cb 5488
e40000f4 5489 if (TYPE_QUALS (type) == type_quals)
5490 return type;
5491
3daca40f 5492 /* Search the chain of variants to see if there is already one there just
5493 like the one we need to have. If so, use that existing one. We must
5494 preserve the TYPE_NAME, since there is code that depends on this. */
13079119 5495 for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
e40000f4 5496 if (check_qualified_type (t, type, type_quals))
3daca40f 5497 return t;
10a9d4cf 5498
051b8c96 5499 return NULL_TREE;
5500}
5501
5502/* Like get_qualified_type, but creates the type if it does not
5503 exist. This function never returns NULL_TREE. */
5504
5505tree
60b8c5b3 5506build_qualified_type (tree type, int type_quals)
051b8c96 5507{
5508 tree t;
5509
5510 /* See if we already have the appropriate qualified variant. */
5511 t = get_qualified_type (type, type_quals);
5512
5513 /* If not, build it. */
5514 if (!t)
5515 {
e086912e 5516 t = build_variant_type_copy (type);
051b8c96 5517 set_type_quals (t, type_quals);
6753bca0 5518
5519 if (TYPE_STRUCTURAL_EQUALITY_P (type))
5520 /* Propagate structural equality. */
5521 SET_TYPE_STRUCTURAL_EQUALITY (t);
5522 else if (TYPE_CANONICAL (type) != type)
5523 /* Build the underlying canonical type, since it is different
5524 from TYPE. */
5525 TYPE_CANONICAL (t) = build_qualified_type (TYPE_CANONICAL (type),
5526 type_quals);
5527 else
5528 /* T is its own canonical type. */
5529 TYPE_CANONICAL (t) = t;
48e1416a 5530
051b8c96 5531 }
5532
10a9d4cf 5533 return t;
5534}
bdf74c8a 5535
e086912e 5536/* Create a new distinct copy of TYPE. The new type is made its own
6753bca0 5537 MAIN_VARIANT. If TYPE requires structural equality checks, the
5538 resulting type requires structural equality checks; otherwise, its
5539 TYPE_CANONICAL points to itself. */
bdf74c8a 5540
5541tree
e086912e 5542build_distinct_type_copy (tree type)
bdf74c8a 5543{
e086912e 5544 tree t = copy_node (type);
48e1416a 5545
bdf74c8a 5546 TYPE_POINTER_TO (t) = 0;
5547 TYPE_REFERENCE_TO (t) = 0;
5548
6753bca0 5549 /* Set the canonical type either to a new equivalence class, or
5550 propagate the need for structural equality checks. */
5551 if (TYPE_STRUCTURAL_EQUALITY_P (type))
5552 SET_TYPE_STRUCTURAL_EQUALITY (t);
5553 else
5554 TYPE_CANONICAL (t) = t;
5555
e086912e 5556 /* Make it its own variant. */
5557 TYPE_MAIN_VARIANT (t) = t;
5558 TYPE_NEXT_VARIANT (t) = 0;
b876a744 5559
5560 /* Note that it is now possible for TYPE_MIN_VALUE to be a value
5561 whose TREE_TYPE is not t. This can also happen in the Ada
5562 frontend when using subtypes. */
d2154397 5563
e086912e 5564 return t;
5565}
5566
6753bca0 5567/* Create a new variant of TYPE, equivalent but distinct. This is so
5568 the caller can modify it. TYPE_CANONICAL for the return type will
5569 be equivalent to TYPE_CANONICAL of TYPE, indicating that the types
5570 are considered equal by the language itself (or that both types
5571 require structural equality checks). */
e086912e 5572
5573tree
5574build_variant_type_copy (tree type)
5575{
5576 tree t, m = TYPE_MAIN_VARIANT (type);
5577
5578 t = build_distinct_type_copy (type);
6753bca0 5579
5580 /* Since we're building a variant, assume that it is a non-semantic
5581 variant. This also propagates TYPE_STRUCTURAL_EQUALITY_P. */
5582 TYPE_CANONICAL (t) = TYPE_CANONICAL (type);
48e1416a 5583
e086912e 5584 /* Add the new type to the chain of variants of TYPE. */
bdf74c8a 5585 TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (m);
5586 TYPE_NEXT_VARIANT (m) = t;
e086912e 5587 TYPE_MAIN_VARIANT (t) = m;
bdf74c8a 5588
bdf74c8a 5589 return t;
5590}
10a9d4cf 5591\f
8bc1e6ff 5592/* Return true if the from tree in both tree maps are equal. */
5593
5ded8c6f 5594int
9af7fd5b 5595tree_map_base_eq (const void *va, const void *vb)
8bc1e6ff 5596{
45ba1503 5597 const struct tree_map_base *const a = (const struct tree_map_base *) va,
5598 *const b = (const struct tree_map_base *) vb;
8bc1e6ff 5599 return (a->from == b->from);
5600}
5601
5602/* Hash a from tree in a tree_map. */
5603
5ded8c6f 5604unsigned int
9af7fd5b 5605tree_map_base_hash (const void *item)
8bc1e6ff 5606{
9af7fd5b 5607 return htab_hash_pointer (((const struct tree_map_base *)item)->from);
8bc1e6ff 5608}
5609
5610/* Return true if this tree map structure is marked for garbage collection
5611 purposes. We simply return true if the from tree is marked, so that this
5612 structure goes away when the from tree goes away. */
5613
5ded8c6f 5614int
9af7fd5b 5615tree_map_base_marked_p (const void *p)
8bc1e6ff 5616{
aae87fc3 5617 return ggc_marked_p (((const struct tree_map_base *) p)->from);
9af7fd5b 5618}
8bc1e6ff 5619
9af7fd5b 5620unsigned int
5621tree_map_hash (const void *item)
5622{
5623 return (((const struct tree_map *) item)->hash);
8bc1e6ff 5624}
5625
9af7fd5b 5626/* Return the initialization priority for DECL. */
5ded8c6f 5627
9af7fd5b 5628priority_type
5629decl_init_priority_lookup (tree decl)
5ded8c6f 5630{
9af7fd5b 5631 struct tree_priority_map *h;
5632 struct tree_map_base in;
5633
5634 gcc_assert (VAR_OR_FUNCTION_DECL_P (decl));
9af7fd5b 5635 in.from = decl;
45ba1503 5636 h = (struct tree_priority_map *) htab_find (init_priority_for_decl, &in);
9af7fd5b 5637 return h ? h->init : DEFAULT_INIT_PRIORITY;
5ded8c6f 5638}
5639
9af7fd5b 5640/* Return the finalization priority for DECL. */
5ded8c6f 5641
9af7fd5b 5642priority_type
5643decl_fini_priority_lookup (tree decl)
5ded8c6f 5644{
9af7fd5b 5645 struct tree_priority_map *h;
5646 struct tree_map_base in;
5647
5648 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
9af7fd5b 5649 in.from = decl;
45ba1503 5650 h = (struct tree_priority_map *) htab_find (init_priority_for_decl, &in);
9af7fd5b 5651 return h ? h->fini : DEFAULT_INIT_PRIORITY;
5ded8c6f 5652}
5653
9af7fd5b 5654/* Return the initialization and finalization priority information for
5655 DECL. If there is no previous priority information, a freshly
5656 allocated structure is returned. */
5ded8c6f 5657
9af7fd5b 5658static struct tree_priority_map *
5659decl_priority_info (tree decl)
5ded8c6f 5660{
9af7fd5b 5661 struct tree_priority_map in;
5662 struct tree_priority_map *h;
5663 void **loc;
5664
5665 in.base.from = decl;
5666 loc = htab_find_slot (init_priority_for_decl, &in, INSERT);
45ba1503 5667 h = (struct tree_priority_map *) *loc;
9af7fd5b 5668 if (!h)
5669 {
5670 h = GGC_CNEW (struct tree_priority_map);
5671 *loc = h;
5672 h->base.from = decl;
5673 h->init = DEFAULT_INIT_PRIORITY;
5674 h->fini = DEFAULT_INIT_PRIORITY;
5675 }
5ded8c6f 5676
9af7fd5b 5677 return h;
5ded8c6f 5678}
5ded8c6f 5679
9af7fd5b 5680/* Set the initialization priority for DECL to PRIORITY. */
5681
5682void
5683decl_init_priority_insert (tree decl, priority_type priority)
5ded8c6f 5684{
9af7fd5b 5685 struct tree_priority_map *h;
5ded8c6f 5686
9af7fd5b 5687 gcc_assert (VAR_OR_FUNCTION_DECL_P (decl));
5688 h = decl_priority_info (decl);
5689 h->init = priority;
48e1416a 5690}
5ded8c6f 5691
9af7fd5b 5692/* Set the finalization priority for DECL to PRIORITY. */
5ded8c6f 5693
5694void
9af7fd5b 5695decl_fini_priority_insert (tree decl, priority_type priority)
5ded8c6f 5696{
9af7fd5b 5697 struct tree_priority_map *h;
5ded8c6f 5698
9af7fd5b 5699 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
5700 h = decl_priority_info (decl);
5701 h->fini = priority;
48e1416a 5702}
5ded8c6f 5703
8bc1e6ff 5704/* Print out the statistics for the DECL_DEBUG_EXPR hash table. */
5705
5706static void
5707print_debug_expr_statistics (void)
5708{
5709 fprintf (stderr, "DECL_DEBUG_EXPR hash: size %ld, %ld elements, %f collisions\n",
5710 (long) htab_size (debug_expr_for_decl),
5711 (long) htab_elements (debug_expr_for_decl),
5712 htab_collisions (debug_expr_for_decl));
5713}
5714
75fa4f82 5715/* Print out the statistics for the DECL_VALUE_EXPR hash table. */
5716
5717static void
5718print_value_expr_statistics (void)
5719{
5720 fprintf (stderr, "DECL_VALUE_EXPR hash: size %ld, %ld elements, %f collisions\n",
5721 (long) htab_size (value_expr_for_decl),
5722 (long) htab_elements (value_expr_for_decl),
5723 htab_collisions (value_expr_for_decl));
5724}
83b34c62 5725
8bc1e6ff 5726/* Lookup a debug expression for FROM, and return it if we find one. */
5727
48e1416a 5728tree
8bc1e6ff 5729decl_debug_expr_lookup (tree from)
5730{
5731 struct tree_map *h, in;
9af7fd5b 5732 in.base.from = from;
8bc1e6ff 5733
45ba1503 5734 h = (struct tree_map *) htab_find_with_hash (debug_expr_for_decl, &in,
5735 htab_hash_pointer (from));
8bc1e6ff 5736 if (h)
5737 return h->to;
5738 return NULL_TREE;
5739}
5740
5741/* Insert a mapping FROM->TO in the debug expression hashtable. */
5742
5743void
5744decl_debug_expr_insert (tree from, tree to)
5745{
5746 struct tree_map *h;
5747 void **loc;
5748
45ba1503 5749 h = GGC_NEW (struct tree_map);
8bc1e6ff 5750 h->hash = htab_hash_pointer (from);
9af7fd5b 5751 h->base.from = from;
8bc1e6ff 5752 h->to = to;
5753 loc = htab_find_slot_with_hash (debug_expr_for_decl, h, h->hash, INSERT);
5754 *(struct tree_map **) loc = h;
48e1416a 5755}
75fa4f82 5756
5757/* Lookup a value expression for FROM, and return it if we find one. */
5758
48e1416a 5759tree
75fa4f82 5760decl_value_expr_lookup (tree from)
5761{
5762 struct tree_map *h, in;
9af7fd5b 5763 in.base.from = from;
75fa4f82 5764
45ba1503 5765 h = (struct tree_map *) htab_find_with_hash (value_expr_for_decl, &in,
5766 htab_hash_pointer (from));
75fa4f82 5767 if (h)
5768 return h->to;
5769 return NULL_TREE;
5770}
5771
5772/* Insert a mapping FROM->TO in the value expression hashtable. */
5773
5774void
5775decl_value_expr_insert (tree from, tree to)
5776{
5777 struct tree_map *h;
5778 void **loc;
5779
45ba1503 5780 h = GGC_NEW (struct tree_map);
75fa4f82 5781 h->hash = htab_hash_pointer (from);
9af7fd5b 5782 h->base.from = from;
75fa4f82 5783 h->to = to;
5784 loc = htab_find_slot_with_hash (value_expr_for_decl, h, h->hash, INSERT);
5785 *(struct tree_map **) loc = h;
5786}
5787
10a9d4cf 5788/* Hashing of types so that we don't make duplicates.
5789 The entry point is `type_hash_canon'. */
5790
10a9d4cf 5791/* Compute a hash code for a list of types (chain of TREE_LIST nodes
5792 with types in the TREE_VALUE slots), by adding the hash codes
5793 of the individual types. */
5794
720082dc 5795static unsigned int
5796type_hash_list (const_tree list, hashval_t hashcode)
10a9d4cf 5797{
720082dc 5798 const_tree tail;
083a2b5e 5799
908e5f41 5800 for (tail = list; tail; tail = TREE_CHAIN (tail))
5801 if (TREE_VALUE (tail) != error_mark_node)
5802 hashcode = iterative_hash_object (TYPE_HASH (TREE_VALUE (tail)),
5803 hashcode);
083a2b5e 5804
10a9d4cf 5805 return hashcode;
5806}
5807
f2d83427 5808/* These are the Hashtable callback functions. */
5809
82bb2115 5810/* Returns true iff the types are equivalent. */
f2d83427 5811
5812static int
60b8c5b3 5813type_hash_eq (const void *va, const void *vb)
f2d83427 5814{
45ba1503 5815 const struct type_hash *const a = (const struct type_hash *) va,
5816 *const b = (const struct type_hash *) vb;
82bb2115 5817
5818 /* First test the things that are the same for all types. */
5819 if (a->hash != b->hash
5820 || TREE_CODE (a->type) != TREE_CODE (b->type)
5821 || TREE_TYPE (a->type) != TREE_TYPE (b->type)
5822 || !attribute_list_equal (TYPE_ATTRIBUTES (a->type),
5823 TYPE_ATTRIBUTES (b->type))
5824 || TYPE_ALIGN (a->type) != TYPE_ALIGN (b->type)
54deba71 5825 || TYPE_MODE (a->type) != TYPE_MODE (b->type)
48e1416a 5826 || (TREE_CODE (a->type) != COMPLEX_TYPE
54deba71 5827 && TYPE_NAME (a->type) != TYPE_NAME (b->type)))
82bb2115 5828 return 0;
5829
5830 switch (TREE_CODE (a->type))
5831 {
5832 case VOID_TYPE:
5833 case COMPLEX_TYPE:
82bb2115 5834 case POINTER_TYPE:
5835 case REFERENCE_TYPE:
5836 return 1;
5837
bd971849 5838 case VECTOR_TYPE:
5839 return TYPE_VECTOR_SUBPARTS (a->type) == TYPE_VECTOR_SUBPARTS (b->type);
5840
82bb2115 5841 case ENUMERAL_TYPE:
5842 if (TYPE_VALUES (a->type) != TYPE_VALUES (b->type)
5843 && !(TYPE_VALUES (a->type)
5844 && TREE_CODE (TYPE_VALUES (a->type)) == TREE_LIST
5845 && TYPE_VALUES (b->type)
5846 && TREE_CODE (TYPE_VALUES (b->type)) == TREE_LIST
5847 && type_list_equal (TYPE_VALUES (a->type),
5848 TYPE_VALUES (b->type))))
5849 return 0;
5850
5851 /* ... fall through ... */
5852
5853 case INTEGER_TYPE:
5854 case REAL_TYPE:
5855 case BOOLEAN_TYPE:
82bb2115 5856 return ((TYPE_MAX_VALUE (a->type) == TYPE_MAX_VALUE (b->type)
5857 || tree_int_cst_equal (TYPE_MAX_VALUE (a->type),
5858 TYPE_MAX_VALUE (b->type)))
5859 && (TYPE_MIN_VALUE (a->type) == TYPE_MIN_VALUE (b->type)
c257ea20 5860 || tree_int_cst_equal (TYPE_MIN_VALUE (a->type),
82bb2115 5861 TYPE_MIN_VALUE (b->type))));
5862
06f0b99c 5863 case FIXED_POINT_TYPE:
5864 return TYPE_SATURATING (a->type) == TYPE_SATURATING (b->type);
5865
82bb2115 5866 case OFFSET_TYPE:
5867 return TYPE_OFFSET_BASETYPE (a->type) == TYPE_OFFSET_BASETYPE (b->type);
5868
5869 case METHOD_TYPE:
5870 return (TYPE_METHOD_BASETYPE (a->type) == TYPE_METHOD_BASETYPE (b->type)
5871 && (TYPE_ARG_TYPES (a->type) == TYPE_ARG_TYPES (b->type)
5872 || (TYPE_ARG_TYPES (a->type)
5873 && TREE_CODE (TYPE_ARG_TYPES (a->type)) == TREE_LIST
5874 && TYPE_ARG_TYPES (b->type)
5875 && TREE_CODE (TYPE_ARG_TYPES (b->type)) == TREE_LIST
5876 && type_list_equal (TYPE_ARG_TYPES (a->type),
5877 TYPE_ARG_TYPES (b->type)))));
b27ac6b5 5878
82bb2115 5879 case ARRAY_TYPE:
82bb2115 5880 return TYPE_DOMAIN (a->type) == TYPE_DOMAIN (b->type);
5881
5882 case RECORD_TYPE:
5883 case UNION_TYPE:
5884 case QUAL_UNION_TYPE:
5885 return (TYPE_FIELDS (a->type) == TYPE_FIELDS (b->type)
5886 || (TYPE_FIELDS (a->type)
5887 && TREE_CODE (TYPE_FIELDS (a->type)) == TREE_LIST
5888 && TYPE_FIELDS (b->type)
5889 && TREE_CODE (TYPE_FIELDS (b->type)) == TREE_LIST
5890 && type_list_equal (TYPE_FIELDS (a->type),
5891 TYPE_FIELDS (b->type))));
5892
5893 case FUNCTION_TYPE:
743f8dd1 5894 if (TYPE_ARG_TYPES (a->type) == TYPE_ARG_TYPES (b->type)
5895 || (TYPE_ARG_TYPES (a->type)
5896 && TREE_CODE (TYPE_ARG_TYPES (a->type)) == TREE_LIST
5897 && TYPE_ARG_TYPES (b->type)
5898 && TREE_CODE (TYPE_ARG_TYPES (b->type)) == TREE_LIST
5899 && type_list_equal (TYPE_ARG_TYPES (a->type),
5900 TYPE_ARG_TYPES (b->type))))
5901 break;
5902 return 0;
82bb2115 5903
5904 default:
5905 return 0;
5906 }
743f8dd1 5907
5908 if (lang_hooks.types.type_hash_eq != NULL)
5909 return lang_hooks.types.type_hash_eq (a->type, b->type);
5910
5911 return 1;
f2d83427 5912}
5913
5914/* Return the cached hash value. */
5915
aa77e59f 5916static hashval_t
60b8c5b3 5917type_hash_hash (const void *item)
f2d83427 5918{
9bfff6cb 5919 return ((const struct type_hash *) item)->hash;
f2d83427 5920}
5921
10a9d4cf 5922/* Look in the type hash table for a type isomorphic to TYPE.
5923 If one is found, return it. Otherwise return 0. */
5924
5925tree
908e5f41 5926type_hash_lookup (hashval_t hashcode, tree type)
10a9d4cf 5927{
f2d83427 5928 struct type_hash *h, in;
5fbce9e9 5929
5930 /* The TYPE_ALIGN field of a type is set by layout_type(), so we
9bfff6cb 5931 must call that routine before comparing TYPE_ALIGNs. */
5fbce9e9 5932 layout_type (type);
5933
f2d83427 5934 in.hash = hashcode;
5935 in.type = type;
083a2b5e 5936
45ba1503 5937 h = (struct type_hash *) htab_find_with_hash (type_hash_table, &in,
5938 hashcode);
f2d83427 5939 if (h)
5940 return h->type;
5941 return NULL_TREE;
10a9d4cf 5942}
5943
5944/* Add an entry to the type-hash-table
5945 for a type TYPE whose hash code is HASHCODE. */
5946
5947void
908e5f41 5948type_hash_add (hashval_t hashcode, tree type)
10a9d4cf 5949{
f2d83427 5950 struct type_hash *h;
5951 void **loc;
10a9d4cf 5952
45ba1503 5953 h = GGC_NEW (struct type_hash);
f2d83427 5954 h->hash = hashcode;
10a9d4cf 5955 h->type = type;
1cb86e99 5956 loc = htab_find_slot_with_hash (type_hash_table, h, hashcode, INSERT);
0b3b598f 5957 *loc = (void *)h;
10a9d4cf 5958}
5959
5960/* Given TYPE, and HASHCODE its hash code, return the canonical
5961 object for an identical type if one already exists.
a26d3281 5962 Otherwise, return TYPE, and record it as the canonical object.
10a9d4cf 5963
5964 To use this function, first create a type of the sort you want.
5965 Then compute its hash code from the fields of the type that
5966 make it different from other similar types.
a26d3281 5967 Then call this function and use the value. */
10a9d4cf 5968
5969tree
60b8c5b3 5970type_hash_canon (unsigned int hashcode, tree type)
10a9d4cf 5971{
5972 tree t1;
5973
a26d3281 5974 /* The hash table only contains main variants, so ensure that's what we're
5975 being passed. */
8c0963c4 5976 gcc_assert (TYPE_MAIN_VARIANT (type) == type);
a26d3281 5977
5978 if (!lang_hooks.types.hash_types)
10a9d4cf 5979 return type;
5980
15d769aa 5981 /* See if the type is in the hash table already. If so, return it.
5982 Otherwise, add the type. */
10a9d4cf 5983 t1 = type_hash_lookup (hashcode, type);
5984 if (t1 != 0)
5985 {
10a9d4cf 5986#ifdef GATHER_STATISTICS
02e7a332 5987 tree_node_counts[(int) t_kind]--;
5988 tree_node_sizes[(int) t_kind] -= sizeof (struct tree_type);
10a9d4cf 5989#endif
5990 return t1;
5991 }
15d769aa 5992 else
5993 {
5994 type_hash_add (hashcode, type);
5995 return type;
5996 }
10a9d4cf 5997}
5998
073fef87 5999/* See if the data pointed to by the type hash table is marked. We consider
6000 it marked if the type is marked or if a debug type number or symbol
6001 table entry has been made for the type. This reduces the amount of
6002 debugging output and eliminates that dependency of the debug output on
6003 the number of garbage collections. */
f2d83427 6004
6005static int
60b8c5b3 6006type_hash_marked_p (const void *p)
f2d83427 6007{
aae87fc3 6008 const_tree const type = ((const struct type_hash *) p)->type;
073fef87 6009
6010 return ggc_marked_p (type) || TYPE_SYMTAB_POINTER (type);
f2d83427 6011}
6012
f2d83427 6013static void
60b8c5b3 6014print_type_hash_statistics (void)
f2d83427 6015{
02e7a332 6016 fprintf (stderr, "Type hash: size %ld, %ld elements, %f collisions\n",
6017 (long) htab_size (type_hash_table),
6018 (long) htab_elements (type_hash_table),
f2d83427 6019 htab_collisions (type_hash_table));
a7b0c170 6020}
6021
edee2468 6022/* Compute a hash code for a list of attributes (chain of TREE_LIST nodes
6023 with names in the TREE_PURPOSE slots and args in the TREE_VALUE slots),
6024 by adding the hash codes of the individual attributes. */
4599f57a 6025
720082dc 6026static unsigned int
6027attribute_hash_list (const_tree list, hashval_t hashcode)
4599f57a 6028{
720082dc 6029 const_tree tail;
083a2b5e 6030
908e5f41 6031 for (tail = list; tail; tail = TREE_CHAIN (tail))
edee2468 6032 /* ??? Do we want to add in TREE_VALUE too? */
908e5f41 6033 hashcode = iterative_hash_object
6034 (IDENTIFIER_HASH_VALUE (TREE_PURPOSE (tail)), hashcode);
edee2468 6035 return hashcode;
4599f57a 6036}
6037
9dd95dae 6038/* Given two lists of attributes, return true if list l2 is
6039 equivalent to l1. */
6040
6041int
5493cb9a 6042attribute_list_equal (const_tree l1, const_tree l2)
9dd95dae 6043{
709c2f34 6044 return attribute_list_contained (l1, l2)
6045 && attribute_list_contained (l2, l1);
9dd95dae 6046}
6047
edee2468 6048/* Given two lists of attributes, return true if list L2 is
6049 completely contained within L1. */
6050/* ??? This would be faster if attribute names were stored in a canonicalized
6051 form. Otherwise, if L1 uses `foo' and L2 uses `__foo__', the long method
6052 must be used to show these elements are equivalent (which they are). */
6053/* ??? It's not clear that attributes with arguments will always be handled
6054 correctly. */
9dd95dae 6055
6056int
5493cb9a 6057attribute_list_contained (const_tree l1, const_tree l2)
9dd95dae 6058{
5493cb9a 6059 const_tree t1, t2;
9dd95dae 6060
6061 /* First check the obvious, maybe the lists are identical. */
6062 if (l1 == l2)
9bfff6cb 6063 return 1;
9dd95dae 6064
edee2468 6065 /* Maybe the lists are similar. */
9dd95dae 6066 for (t1 = l1, t2 = l2;
083a2b5e 6067 t1 != 0 && t2 != 0
edee2468 6068 && TREE_PURPOSE (t1) == TREE_PURPOSE (t2)
9dd95dae 6069 && TREE_VALUE (t1) == TREE_VALUE (t2);
6070 t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2));
6071
6072 /* Maybe the lists are equal. */
6073 if (t1 == 0 && t2 == 0)
ac0c7fb1 6074 return 1;
9dd95dae 6075
083a2b5e 6076 for (; t2 != 0; t2 = TREE_CHAIN (t2))
edee2468 6077 {
5493cb9a 6078 const_tree attr;
ce4469fa 6079 /* This CONST_CAST is okay because lookup_attribute does not
6080 modify its argument and the return value is assigned to a
6081 const_tree. */
6082 for (attr = lookup_attribute (IDENTIFIER_POINTER (TREE_PURPOSE (t2)),
e47a6f81 6083 CONST_CAST_TREE(l1));
e3c541f0 6084 attr != NULL_TREE;
ce4469fa 6085 attr = lookup_attribute (IDENTIFIER_POINTER (TREE_PURPOSE (t2)),
6086 TREE_CHAIN (attr)))
e3c541f0 6087 {
9369a09f 6088 if (TREE_VALUE (t2) != NULL
6089 && TREE_CODE (TREE_VALUE (t2)) == TREE_LIST
6090 && TREE_VALUE (attr) != NULL
6091 && TREE_CODE (TREE_VALUE (attr)) == TREE_LIST)
6092 {
6093 if (simple_cst_list_equal (TREE_VALUE (t2),
6094 TREE_VALUE (attr)) == 1)
6095 break;
6096 }
6097 else if (simple_cst_equal (TREE_VALUE (t2), TREE_VALUE (attr)) == 1)
e3c541f0 6098 break;
6099 }
edee2468 6100
083a2b5e 6101 if (attr == 0)
9dd95dae 6102 return 0;
edee2468 6103 }
4599f57a 6104
9dd95dae 6105 return 1;
6106}
6107
10a9d4cf 6108/* Given two lists of types
6109 (chains of TREE_LIST nodes with types in the TREE_VALUE slots)
6110 return 1 if the lists contain the same types in the same order.
6111 Also, the TREE_PURPOSEs must match. */
6112
6113int
b7bf20db 6114type_list_equal (const_tree l1, const_tree l2)
10a9d4cf 6115{
b7bf20db 6116 const_tree t1, t2;
3208534e 6117
10a9d4cf 6118 for (t1 = l1, t2 = l2; t1 && t2; t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
3208534e 6119 if (TREE_VALUE (t1) != TREE_VALUE (t2)
6120 || (TREE_PURPOSE (t1) != TREE_PURPOSE (t2)
bc274e3b 6121 && ! (1 == simple_cst_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2))
6122 && (TREE_TYPE (TREE_PURPOSE (t1))
6123 == TREE_TYPE (TREE_PURPOSE (t2))))))
3208534e 6124 return 0;
10a9d4cf 6125
6126 return t1 == t2;
6127}
6128
e4c782a1 6129/* Returns the number of arguments to the FUNCTION_TYPE or METHOD_TYPE
6130 given by TYPE. If the argument list accepts variable arguments,
6131 then this function counts only the ordinary arguments. */
6132
6133int
720082dc 6134type_num_arguments (const_tree type)
e4c782a1 6135{
6136 int i = 0;
6137 tree t;
6138
6139 for (t = TYPE_ARG_TYPES (type); t; t = TREE_CHAIN (t))
6140 /* If the function does not take a variable number of arguments,
6141 the last element in the list will have type `void'. */
6142 if (VOID_TYPE_P (TREE_VALUE (t)))
6143 break;
6144 else
6145 ++i;
6146
6147 return i;
6148}
6149
10a9d4cf 6150/* Nonzero if integer constants T1 and T2
6151 represent the same constant value. */
6152
6153int
720082dc 6154tree_int_cst_equal (const_tree t1, const_tree t2)
10a9d4cf 6155{
6156 if (t1 == t2)
6157 return 1;
083a2b5e 6158
10a9d4cf 6159 if (t1 == 0 || t2 == 0)
6160 return 0;
083a2b5e 6161
10a9d4cf 6162 if (TREE_CODE (t1) == INTEGER_CST
6163 && TREE_CODE (t2) == INTEGER_CST
6164 && TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
6165 && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2))
6166 return 1;
083a2b5e 6167
10a9d4cf 6168 return 0;
6169}
6170
6171/* Nonzero if integer constants T1 and T2 represent values that satisfy <.
6172 The precise way of comparison depends on their data type. */
6173
6174int
720082dc 6175tree_int_cst_lt (const_tree t1, const_tree t2)
10a9d4cf 6176{
6177 if (t1 == t2)
6178 return 0;
6179
78a8ed03 6180 if (TYPE_UNSIGNED (TREE_TYPE (t1)) != TYPE_UNSIGNED (TREE_TYPE (t2)))
1453bbde 6181 {
6182 int t1_sgn = tree_int_cst_sgn (t1);
6183 int t2_sgn = tree_int_cst_sgn (t2);
6184
6185 if (t1_sgn < t2_sgn)
6186 return 1;
6187 else if (t1_sgn > t2_sgn)
6188 return 0;
6189 /* Otherwise, both are non-negative, so we compare them as
6190 unsigned just in case one of them would overflow a signed
6191 type. */
6192 }
78a8ed03 6193 else if (!TYPE_UNSIGNED (TREE_TYPE (t1)))
10a9d4cf 6194 return INT_CST_LT (t1, t2);
083a2b5e 6195
10a9d4cf 6196 return INT_CST_LT_UNSIGNED (t1, t2);
6197}
6198
225ec6aa 6199/* Returns -1 if T1 < T2, 0 if T1 == T2, and 1 if T1 > T2. */
6200
6201int
720082dc 6202tree_int_cst_compare (const_tree t1, const_tree t2)
225ec6aa 6203{
6204 if (tree_int_cst_lt (t1, t2))
6205 return -1;
6206 else if (tree_int_cst_lt (t2, t1))
6207 return 1;
709c2f34 6208 else
225ec6aa 6209 return 0;
6210}
6211
c53485bb 6212/* Return 1 if T is an INTEGER_CST that can be manipulated efficiently on
6213 the host. If POS is zero, the value can be represented in a single
4168cdc3 6214 HOST_WIDE_INT. If POS is nonzero, the value must be non-negative and can
c53485bb 6215 be represented in a single unsigned HOST_WIDE_INT. */
5d844ba2 6216
6217int
720082dc 6218host_integerp (const_tree t, int pos)
5d844ba2 6219{
34e5cced 6220 if (t == NULL_TREE)
6221 return 0;
6222
5d844ba2 6223 return (TREE_CODE (t) == INTEGER_CST
5d844ba2 6224 && ((TREE_INT_CST_HIGH (t) == 0
6225 && (HOST_WIDE_INT) TREE_INT_CST_LOW (t) >= 0)
6226 || (! pos && TREE_INT_CST_HIGH (t) == -1
c53485bb 6227 && (HOST_WIDE_INT) TREE_INT_CST_LOW (t) < 0
be1f1b71 6228 && (!TYPE_UNSIGNED (TREE_TYPE (t))
b2ee3594 6229 || (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
6230 && TYPE_IS_SIZETYPE (TREE_TYPE (t)))))
c53485bb 6231 || (pos && TREE_INT_CST_HIGH (t) == 0)));
5d844ba2 6232}
6233
6234/* Return the HOST_WIDE_INT least significant bits of T if it is an
6235 INTEGER_CST and there is no overflow. POS is nonzero if the result must
4168cdc3 6236 be non-negative. We must be able to satisfy the above conditions. */
5d844ba2 6237
6238HOST_WIDE_INT
720082dc 6239tree_low_cst (const_tree t, int pos)
5d844ba2 6240{
8c0963c4 6241 gcc_assert (host_integerp (t, pos));
6242 return TREE_INT_CST_LOW (t);
9bfff6cb 6243}
5d844ba2 6244
ddb425f3 6245/* Return the most significant bit of the integer constant T. */
6246
6247int
720082dc 6248tree_int_cst_msb (const_tree t)
ddb425f3 6249{
6250 int prec;
6251 HOST_WIDE_INT h;
6252 unsigned HOST_WIDE_INT l;
6253
6254 /* Note that using TYPE_PRECISION here is wrong. We care about the
6255 actual bits, not the (arbitrary) range of the type. */
6256 prec = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (t))) - 1;
6257 rshift_double (TREE_INT_CST_LOW (t), TREE_INT_CST_HIGH (t), prec,
6258 2 * HOST_BITS_PER_WIDE_INT, &l, &h, 0);
6259 return (l & 1) == 1;
6260}
6261
58171fc5 6262/* Return an indication of the sign of the integer constant T.
6263 The return value is -1 if T < 0, 0 if T == 0, and 1 if T > 0.
21a67a88 6264 Note that -1 will never be returned if T's type is unsigned. */
58171fc5 6265
6266int
720082dc 6267tree_int_cst_sgn (const_tree t)
58171fc5 6268{
6269 if (TREE_INT_CST_LOW (t) == 0 && TREE_INT_CST_HIGH (t) == 0)
6270 return 0;
78a8ed03 6271 else if (TYPE_UNSIGNED (TREE_TYPE (t)))
58171fc5 6272 return 1;
6273 else if (TREE_INT_CST_HIGH (t) < 0)
6274 return -1;
6275 else
6276 return 1;
6277}
6278
5485b959 6279/* Return the minimum number of bits needed to represent VALUE in a
6280 signed or unsigned type, UNSIGNEDP says which. */
6281
6282unsigned int
6283tree_int_cst_min_precision (tree value, bool unsignedp)
6284{
6285 int log;
6286
6287 /* If the value is negative, compute its negative minus 1. The latter
6288 adjustment is because the absolute value of the largest negative value
6289 is one larger than the largest positive value. This is equivalent to
6290 a bit-wise negation, so use that operation instead. */
6291
6292 if (tree_int_cst_sgn (value) < 0)
6293 value = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (value), value);
6294
6295 /* Return the number of bits needed, taking into account the fact
6296 that we need one more bit for a signed than unsigned type. */
6297
6298 if (integer_zerop (value))
6299 log = 0;
6300 else
6301 log = tree_floor_log2 (value);
6302
6303 return log + 1 + !unsignedp;
6304}
6305
3208534e 6306/* Compare two constructor-element-type constants. Return 1 if the lists
6307 are known to be equal; otherwise return 0. */
6308
10a9d4cf 6309int
720082dc 6310simple_cst_list_equal (const_tree l1, const_tree l2)
10a9d4cf 6311{
6312 while (l1 != NULL_TREE && l2 != NULL_TREE)
6313 {
3208534e 6314 if (simple_cst_equal (TREE_VALUE (l1), TREE_VALUE (l2)) != 1)
10a9d4cf 6315 return 0;
3208534e 6316
10a9d4cf 6317 l1 = TREE_CHAIN (l1);
6318 l2 = TREE_CHAIN (l2);
6319 }
3208534e 6320
083a2b5e 6321 return l1 == l2;
10a9d4cf 6322}
6323
6324/* Return truthvalue of whether T1 is the same tree structure as T2.
6325 Return 1 if they are the same.
6326 Return 0 if they are understandably different.
6327 Return -1 if either contains tree structure not understood by
6328 this function. */
6329
6330int
b7bf20db 6331simple_cst_equal (const_tree t1, const_tree t2)
10a9d4cf 6332{
19cb6b50 6333 enum tree_code code1, code2;
10a9d4cf 6334 int cmp;
083a2b5e 6335 int i;
10a9d4cf 6336
6337 if (t1 == t2)
6338 return 1;
6339 if (t1 == 0 || t2 == 0)
6340 return 0;
6341
6342 code1 = TREE_CODE (t1);
6343 code2 = TREE_CODE (t2);
6344
d9659041 6345 if (CONVERT_EXPR_CODE_P (code1) || code1 == NON_LVALUE_EXPR)
22e12a56 6346 {
d9659041 6347 if (CONVERT_EXPR_CODE_P (code2)
22e12a56 6348 || code2 == NON_LVALUE_EXPR)
6349 return simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
6350 else
6351 return simple_cst_equal (TREE_OPERAND (t1, 0), t2);
6352 }
083a2b5e 6353
d9659041 6354 else if (CONVERT_EXPR_CODE_P (code2)
10a9d4cf 6355 || code2 == NON_LVALUE_EXPR)
6356 return simple_cst_equal (t1, TREE_OPERAND (t2, 0));
6357
6358 if (code1 != code2)
6359 return 0;
6360
6361 switch (code1)
6362 {
6363 case INTEGER_CST:
083a2b5e 6364 return (TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
6365 && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2));
10a9d4cf 6366
6367 case REAL_CST:
62aa7862 6368 return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
10a9d4cf 6369
06f0b99c 6370 case FIXED_CST:
6371 return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1), TREE_FIXED_CST (t2));
6372
10a9d4cf 6373 case STRING_CST:
083a2b5e 6374 return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
d5130039 6375 && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
083a2b5e 6376 TREE_STRING_LENGTH (t1)));
10a9d4cf 6377
6378 case CONSTRUCTOR:
c75b4594 6379 {
6380 unsigned HOST_WIDE_INT idx;
6381 VEC(constructor_elt, gc) *v1 = CONSTRUCTOR_ELTS (t1);
6382 VEC(constructor_elt, gc) *v2 = CONSTRUCTOR_ELTS (t2);
6383
6384 if (VEC_length (constructor_elt, v1) != VEC_length (constructor_elt, v2))
6385 return false;
6386
6387 for (idx = 0; idx < VEC_length (constructor_elt, v1); ++idx)
6388 /* ??? Should we handle also fields here? */
6389 if (!simple_cst_equal (VEC_index (constructor_elt, v1, idx)->value,
6390 VEC_index (constructor_elt, v2, idx)->value))
6391 return false;
6392 return true;
6393 }
10a9d4cf 6394
6395 case SAVE_EXPR:
6396 return simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
6397
6398 case CALL_EXPR:
c2f47e15 6399 cmp = simple_cst_equal (CALL_EXPR_FN (t1), CALL_EXPR_FN (t2));
10a9d4cf 6400 if (cmp <= 0)
6401 return cmp;
c2f47e15 6402 if (call_expr_nargs (t1) != call_expr_nargs (t2))
6403 return 0;
6404 {
b7bf20db 6405 const_tree arg1, arg2;
6406 const_call_expr_arg_iterator iter1, iter2;
6407 for (arg1 = first_const_call_expr_arg (t1, &iter1),
6408 arg2 = first_const_call_expr_arg (t2, &iter2);
c2f47e15 6409 arg1 && arg2;
b7bf20db 6410 arg1 = next_const_call_expr_arg (&iter1),
6411 arg2 = next_const_call_expr_arg (&iter2))
c2f47e15 6412 {
6413 cmp = simple_cst_equal (arg1, arg2);
6414 if (cmp <= 0)
6415 return cmp;
6416 }
6417 return arg1 == arg2;
6418 }
10a9d4cf 6419
6420 case TARGET_EXPR:
6421 /* Special case: if either target is an unallocated VAR_DECL,
6422 it means that it's going to be unified with whatever the
6423 TARGET_EXPR is really supposed to initialize, so treat it
6424 as being equivalent to anything. */
6425 if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL
6426 && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE
0e8e37b2 6427 && !DECL_RTL_SET_P (TREE_OPERAND (t1, 0)))
10a9d4cf 6428 || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL
6429 && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE
0e8e37b2 6430 && !DECL_RTL_SET_P (TREE_OPERAND (t2, 0))))
10a9d4cf 6431 cmp = 1;
6432 else
6433 cmp = simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
083a2b5e 6434
10a9d4cf 6435 if (cmp <= 0)
6436 return cmp;
083a2b5e 6437
10a9d4cf 6438 return simple_cst_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
6439
6440 case WITH_CLEANUP_EXPR:
6441 cmp = simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
6442 if (cmp <= 0)
6443 return cmp;
083a2b5e 6444
5929001a 6445 return simple_cst_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t1, 1));
10a9d4cf 6446
6447 case COMPONENT_REF:
6448 if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
6449 return simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
083a2b5e 6450
10a9d4cf 6451 return 0;
6452
10a9d4cf 6453 case VAR_DECL:
6454 case PARM_DECL:
6455 case CONST_DECL:
6456 case FUNCTION_DECL:
6457 return 0;
9bfff6cb 6458
0dbd1c74 6459 default:
6460 break;
f768c418 6461 }
10a9d4cf 6462
d2d16a50 6463 /* This general rule works for most tree codes. All exceptions should be
6464 handled above. If this is a language-specific tree code, we can't
6465 trust what might be in the operand, so say we don't know
6466 the situation. */
b4dae43c 6467 if ((int) code1 >= (int) LAST_AND_UNUSED_TREE_CODE)
d2d16a50 6468 return -1;
10a9d4cf 6469
f768c418 6470 switch (TREE_CODE_CLASS (code1))
6471 {
ce45a448 6472 case tcc_unary:
6473 case tcc_binary:
6474 case tcc_comparison:
6475 case tcc_expression:
6476 case tcc_reference:
6477 case tcc_statement:
f768c418 6478 cmp = 1;
f3c6d29a 6479 for (i = 0; i < TREE_CODE_LENGTH (code1); i++)
f768c418 6480 {
6481 cmp = simple_cst_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
6482 if (cmp <= 0)
6483 return cmp;
6484 }
083a2b5e 6485
f768c418 6486 return cmp;
f768c418 6487
0dbd1c74 6488 default:
6489 return -1;
6490 }
10a9d4cf 6491}
a0c2c45b 6492
6493/* Compare the value of T, an INTEGER_CST, with U, an unsigned integer value.
6494 Return -1, 0, or 1 if the value of T is less than, equal to, or greater
6495 than U, respectively. */
6496
6497int
720082dc 6498compare_tree_int (const_tree t, unsigned HOST_WIDE_INT u)
a0c2c45b 6499{
6500 if (tree_int_cst_sgn (t) < 0)
6501 return -1;
6502 else if (TREE_INT_CST_HIGH (t) != 0)
6503 return 1;
6504 else if (TREE_INT_CST_LOW (t) == u)
6505 return 0;
6506 else if (TREE_INT_CST_LOW (t) < u)
6507 return -1;
6508 else
6509 return 1;
6510}
10f6a269 6511
21dff555 6512/* Return true if CODE represents an associative tree code. Otherwise
6513 return false. */
6514bool
6515associative_tree_code (enum tree_code code)
6516{
6517 switch (code)
6518 {
6519 case BIT_IOR_EXPR:
6520 case BIT_AND_EXPR:
6521 case BIT_XOR_EXPR:
6522 case PLUS_EXPR:
21dff555 6523 case MULT_EXPR:
21dff555 6524 case MIN_EXPR:
6525 case MAX_EXPR:
6526 return true;
6527
6528 default:
6529 break;
6530 }
6531 return false;
6532}
6533
86481e89 6534/* Return true if CODE represents a commutative tree code. Otherwise
21dff555 6535 return false. */
6536bool
6537commutative_tree_code (enum tree_code code)
6538{
6539 switch (code)
6540 {
6541 case PLUS_EXPR:
6542 case MULT_EXPR:
6543 case MIN_EXPR:
6544 case MAX_EXPR:
6545 case BIT_IOR_EXPR:
6546 case BIT_XOR_EXPR:
6547 case BIT_AND_EXPR:
6548 case NE_EXPR:
6549 case EQ_EXPR:
bd975dc2 6550 case UNORDERED_EXPR:
6551 case ORDERED_EXPR:
6552 case UNEQ_EXPR:
6553 case LTGT_EXPR:
6554 case TRUTH_AND_EXPR:
6555 case TRUTH_XOR_EXPR:
6556 case TRUTH_OR_EXPR:
21dff555 6557 return true;
6558
6559 default:
6560 break;
6561 }
6562 return false;
6563}
6564
10f6a269 6565/* Generate a hash value for an expression. This can be used iteratively
75a70cf9 6566 by passing a previous result as the VAL argument.
10f6a269 6567
6568 This function is intended to produce the same hash for expressions which
6569 would compare equal using operand_equal_p. */
6570
6571hashval_t
720082dc 6572iterative_hash_expr (const_tree t, hashval_t val)
10f6a269 6573{
6574 int i;
6575 enum tree_code code;
f4e36c33 6576 char tclass;
10f6a269 6577
6578 if (t == NULL_TREE)
f6bf9542 6579 return iterative_hash_hashval_t (0, val);
10f6a269 6580
6581 code = TREE_CODE (t);
10f6a269 6582
c068056a 6583 switch (code)
10f6a269 6584 {
c068056a 6585 /* Alas, constants aren't shared, so we can't rely on pointer
6586 identity. */
6587 case INTEGER_CST:
6588 val = iterative_hash_host_wide_int (TREE_INT_CST_LOW (t), val);
6589 return iterative_hash_host_wide_int (TREE_INT_CST_HIGH (t), val);
6590 case REAL_CST:
6591 {
6592 unsigned int val2 = real_hash (TREE_REAL_CST_PTR (t));
29f35f64 6593
06f0b99c 6594 return iterative_hash_hashval_t (val2, val);
6595 }
6596 case FIXED_CST:
6597 {
6598 unsigned int val2 = fixed_hash (TREE_FIXED_CST_PTR (t));
6599
c068056a 6600 return iterative_hash_hashval_t (val2, val);
6601 }
6602 case STRING_CST:
6603 return iterative_hash (TREE_STRING_POINTER (t),
6604 TREE_STRING_LENGTH (t), val);
6605 case COMPLEX_CST:
6606 val = iterative_hash_expr (TREE_REALPART (t), val);
6607 return iterative_hash_expr (TREE_IMAGPART (t), val);
6608 case VECTOR_CST:
6609 return iterative_hash_expr (TREE_VECTOR_CST_ELTS (t), val);
c068056a 6610 case SSA_NAME:
621b002b 6611 /* We can just compare by pointer. */
f6bf9542 6612 return iterative_hash_host_wide_int (SSA_NAME_VERSION (t), val);
621b002b 6613 case PLACEHOLDER_EXPR:
6614 /* The node itself doesn't matter. */
6615 return val;
c068056a 6616 case TREE_LIST:
6617 /* A list of expressions, for a CALL_EXPR or as the elements of a
6618 VECTOR_CST. */
6619 for (; t; t = TREE_CHAIN (t))
6620 val = iterative_hash_expr (TREE_VALUE (t), val);
6621 return val;
c75b4594 6622 case CONSTRUCTOR:
6623 {
6624 unsigned HOST_WIDE_INT idx;
6625 tree field, value;
6626 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), idx, field, value)
6627 {
6628 val = iterative_hash_expr (field, val);
6629 val = iterative_hash_expr (value, val);
6630 }
6631 return val;
6632 }
0090be28 6633 case FUNCTION_DECL:
4b2b1011 6634 /* When referring to a built-in FUNCTION_DECL, use the __builtin__ form.
6635 Otherwise nodes that compare equal according to operand_equal_p might
6636 get different hash codes. However, don't do this for machine specific
6637 or front end builtins, since the function code is overloaded in those
6638 cases. */
6639 if (DECL_BUILT_IN_CLASS (t) == BUILT_IN_NORMAL
6640 && built_in_decls[DECL_FUNCTION_CODE (t)])
0090be28 6641 {
f6bf9542 6642 t = built_in_decls[DECL_FUNCTION_CODE (t)];
6643 code = TREE_CODE (t);
0090be28 6644 }
f6bf9542 6645 /* FALL THROUGH */
c068056a 6646 default:
f4e36c33 6647 tclass = TREE_CODE_CLASS (code);
10f6a269 6648
f4e36c33 6649 if (tclass == tcc_declaration)
4ee9c684 6650 {
45337e7e 6651 /* DECL's have a unique ID */
6652 val = iterative_hash_host_wide_int (DECL_UID (t), val);
4ee9c684 6653 }
9cee7c3f 6654 else
851a56dc 6655 {
f4e36c33 6656 gcc_assert (IS_EXPR_CODE_CLASS (tclass));
48e1416a 6657
c068056a 6658 val = iterative_hash_object (code, val);
6659
6660 /* Don't hash the type, that can lead to having nodes which
6661 compare equal according to operand_equal_p, but which
6662 have different hash codes. */
d9659041 6663 if (CONVERT_EXPR_CODE_P (code)
c068056a 6664 || code == NON_LVALUE_EXPR)
6665 {
6666 /* Make sure to include signness in the hash computation. */
6667 val += TYPE_UNSIGNED (TREE_TYPE (t));
6668 val = iterative_hash_expr (TREE_OPERAND (t, 0), val);
6669 }
6670
6671 else if (commutative_tree_code (code))
6672 {
6673 /* It's a commutative expression. We want to hash it the same
6674 however it appears. We do this by first hashing both operands
6675 and then rehashing based on the order of their independent
6676 hashes. */
6677 hashval_t one = iterative_hash_expr (TREE_OPERAND (t, 0), 0);
6678 hashval_t two = iterative_hash_expr (TREE_OPERAND (t, 1), 0);
6679 hashval_t t;
6680
6681 if (one > two)
6682 t = one, one = two, two = t;
6683
6684 val = iterative_hash_hashval_t (one, val);
6685 val = iterative_hash_hashval_t (two, val);
6686 }
6687 else
c2f47e15 6688 for (i = TREE_OPERAND_LENGTH (t) - 1; i >= 0; --i)
c068056a 6689 val = iterative_hash_expr (TREE_OPERAND (t, i), val);
851a56dc 6690 }
c068056a 6691 return val;
6692 break;
4ee9c684 6693 }
10f6a269 6694}
75a70cf9 6695
6696/* Generate a hash value for a pair of expressions. This can be used
6697 iteratively by passing a previous result as the VAL argument.
6698
6699 The same hash value is always returned for a given pair of expressions,
6700 regardless of the order in which they are presented. This is useful in
6701 hashing the operands of commutative functions. */
6702
6703hashval_t
6704iterative_hash_exprs_commutative (const_tree t1,
6705 const_tree t2, hashval_t val)
6706{
6707 hashval_t one = iterative_hash_expr (t1, 0);
6708 hashval_t two = iterative_hash_expr (t2, 0);
6709 hashval_t t;
6710
6711 if (one > two)
6712 t = one, one = two, two = t;
6713 val = iterative_hash_hashval_t (one, val);
6714 val = iterative_hash_hashval_t (two, val);
6715
6716 return val;
6717}
10a9d4cf 6718\f
6719/* Constructors for pointer, array and function types.
6720 (RECORD_TYPE, UNION_TYPE and ENUMERAL_TYPE nodes are
6721 constructed by language-dependent code, not here.) */
6722
b24423db 6723/* Construct, lay out and return the type of pointers to TO_TYPE with
6724 mode MODE. If CAN_ALIAS_ALL is TRUE, indicate this type can
6725 reference all of memory. If such a type has already been
6726 constructed, reuse it. */
10a9d4cf 6727
6728tree
b24423db 6729build_pointer_type_for_mode (tree to_type, enum machine_mode mode,
6730 bool can_alias_all)
10a9d4cf 6731{
b24423db 6732 tree t;
6733
9a33af6f 6734 if (to_type == error_mark_node)
6735 return error_mark_node;
6736
f06537f2 6737 /* If the pointed-to type has the may_alias attribute set, force
6738 a TYPE_REF_CAN_ALIAS_ALL pointer to be generated. */
6739 if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (to_type)))
6740 can_alias_all = true;
6741
b24423db 6742 /* In some cases, languages will have things that aren't a POINTER_TYPE
6743 (such as a RECORD_TYPE for fat pointers in Ada) as TYPE_POINTER_TO.
6744 In that case, return that type without regard to the rest of our
6745 operands.
6746
6747 ??? This is a kludge, but consistent with the way this function has
6748 always operated and there doesn't seem to be a good way to avoid this
6749 at the moment. */
6750 if (TYPE_POINTER_TO (to_type) != 0
6751 && TREE_CODE (TYPE_POINTER_TO (to_type)) != POINTER_TYPE)
6752 return TYPE_POINTER_TO (to_type);
10a9d4cf 6753
0237aca8 6754 /* First, if we already have a type for pointers to TO_TYPE and it's
6755 the proper mode, use it. */
b24423db 6756 for (t = TYPE_POINTER_TO (to_type); t; t = TYPE_NEXT_PTR_TO (t))
0237aca8 6757 if (TYPE_MODE (t) == mode && TYPE_REF_CAN_ALIAS_ALL (t) == can_alias_all)
b24423db 6758 return t;
10a9d4cf 6759
10a9d4cf 6760 t = make_node (POINTER_TYPE);
0b56cc51 6761
10a9d4cf 6762 TREE_TYPE (t) = to_type;
342ad2d6 6763 SET_TYPE_MODE (t, mode);
b24423db 6764 TYPE_REF_CAN_ALIAS_ALL (t) = can_alias_all;
6765 TYPE_NEXT_PTR_TO (t) = TYPE_POINTER_TO (to_type);
6766 TYPE_POINTER_TO (to_type) = t;
10a9d4cf 6767
6753bca0 6768 if (TYPE_STRUCTURAL_EQUALITY_P (to_type))
6769 SET_TYPE_STRUCTURAL_EQUALITY (t);
6770 else if (TYPE_CANONICAL (to_type) != to_type)
6771 TYPE_CANONICAL (t)
6772 = build_pointer_type_for_mode (TYPE_CANONICAL (to_type),
6773 mode, can_alias_all);
6774
10a9d4cf 6775 /* Lay out the type. This function has many callers that are concerned
5b4621d9 6776 with expression-construction, and this simplifies them all. */
10a9d4cf 6777 layout_type (t);
6778
10a9d4cf 6779 return t;
6780}
6781
805e22b2 6782/* By default build pointers in ptr_mode. */
083a2b5e 6783
6784tree
60b8c5b3 6785build_pointer_type (tree to_type)
805e22b2 6786{
98155838 6787 addr_space_t as = to_type == error_mark_node? ADDR_SPACE_GENERIC
6788 : TYPE_ADDR_SPACE (to_type);
6789 enum machine_mode pointer_mode = targetm.addr_space.pointer_mode (as);
6790 return build_pointer_type_for_mode (to_type, pointer_mode, false);
805e22b2 6791}
6792
b24423db 6793/* Same as build_pointer_type_for_mode, but for REFERENCE_TYPE. */
805e22b2 6794
6795tree
b24423db 6796build_reference_type_for_mode (tree to_type, enum machine_mode mode,
6797 bool can_alias_all)
083a2b5e 6798{
b24423db 6799 tree t;
083a2b5e 6800
f06537f2 6801 if (to_type == error_mark_node)
6802 return error_mark_node;
6803
6804 /* If the pointed-to type has the may_alias attribute set, force
6805 a TYPE_REF_CAN_ALIAS_ALL pointer to be generated. */
6806 if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (to_type)))
6807 can_alias_all = true;
6808
b24423db 6809 /* In some cases, languages will have things that aren't a REFERENCE_TYPE
6810 (such as a RECORD_TYPE for fat pointers in Ada) as TYPE_REFERENCE_TO.
6811 In that case, return that type without regard to the rest of our
6812 operands.
6813
6814 ??? This is a kludge, but consistent with the way this function has
6815 always operated and there doesn't seem to be a good way to avoid this
6816 at the moment. */
6817 if (TYPE_REFERENCE_TO (to_type) != 0
6818 && TREE_CODE (TYPE_REFERENCE_TO (to_type)) != REFERENCE_TYPE)
6819 return TYPE_REFERENCE_TO (to_type);
6820
0237aca8 6821 /* First, if we already have a type for pointers to TO_TYPE and it's
6822 the proper mode, use it. */
b24423db 6823 for (t = TYPE_REFERENCE_TO (to_type); t; t = TYPE_NEXT_REF_TO (t))
0237aca8 6824 if (TYPE_MODE (t) == mode && TYPE_REF_CAN_ALIAS_ALL (t) == can_alias_all)
b24423db 6825 return t;
083a2b5e 6826
083a2b5e 6827 t = make_node (REFERENCE_TYPE);
083a2b5e 6828
6829 TREE_TYPE (t) = to_type;
342ad2d6 6830 SET_TYPE_MODE (t, mode);
b24423db 6831 TYPE_REF_CAN_ALIAS_ALL (t) = can_alias_all;
6832 TYPE_NEXT_REF_TO (t) = TYPE_REFERENCE_TO (to_type);
083a2b5e 6833 TYPE_REFERENCE_TO (to_type) = t;
6834
6753bca0 6835 if (TYPE_STRUCTURAL_EQUALITY_P (to_type))
6836 SET_TYPE_STRUCTURAL_EQUALITY (t);
6837 else if (TYPE_CANONICAL (to_type) != to_type)
48e1416a 6838 TYPE_CANONICAL (t)
6753bca0 6839 = build_reference_type_for_mode (TYPE_CANONICAL (to_type),
6840 mode, can_alias_all);
6841
083a2b5e 6842 layout_type (t);
6843
6844 return t;
6845}
6846
805e22b2 6847
6848/* Build the node for the type of references-to-TO_TYPE by default
6849 in ptr_mode. */
6850
6851tree
60b8c5b3 6852build_reference_type (tree to_type)
805e22b2 6853{
98155838 6854 addr_space_t as = to_type == error_mark_node? ADDR_SPACE_GENERIC
6855 : TYPE_ADDR_SPACE (to_type);
6856 enum machine_mode pointer_mode = targetm.addr_space.pointer_mode (as);
6857 return build_reference_type_for_mode (to_type, pointer_mode, false);
805e22b2 6858}
6859
211f3116 6860/* Build a type that is compatible with t but has no cv quals anywhere
6861 in its type, thus
6862
6863 const char *const *const * -> char ***. */
6864
6865tree
60b8c5b3 6866build_type_no_quals (tree t)
211f3116 6867{
6868 switch (TREE_CODE (t))
6869 {
6870 case POINTER_TYPE:
a26d3281 6871 return build_pointer_type_for_mode (build_type_no_quals (TREE_TYPE (t)),
b24423db 6872 TYPE_MODE (t),
6873 TYPE_REF_CAN_ALIAS_ALL (t));
211f3116 6874 case REFERENCE_TYPE:
a26d3281 6875 return
6876 build_reference_type_for_mode (build_type_no_quals (TREE_TYPE (t)),
b24423db 6877 TYPE_MODE (t),
6878 TYPE_REF_CAN_ALIAS_ALL (t));
211f3116 6879 default:
6880 return TYPE_MAIN_VARIANT (t);
6881 }
6882}
6883
10a9d4cf 6884/* Create a type of integers to be the TYPE_DOMAIN of an ARRAY_TYPE.
6885 MAXVAL should be the maximum value in the domain
0dbd1c74 6886 (one less than the length of the array).
6887
6888 The maximum value that MAXVAL can have is INT_MAX for a HOST_WIDE_INT.
6889 We don't enforce this limit, that is up to caller (e.g. language front end).
6890 The limit exists because the result is a signed type and we don't handle
6891 sizes that use more than one HOST_WIDE_INT. */
10a9d4cf 6892
6893tree
60b8c5b3 6894build_index_type (tree maxval)
10a9d4cf 6895{
19cb6b50 6896 tree itype = make_node (INTEGER_TYPE);
25b73a2d 6897
02e7a332 6898 TREE_TYPE (itype) = sizetype;
10a9d4cf 6899 TYPE_PRECISION (itype) = TYPE_PRECISION (sizetype);
c832e677 6900 TYPE_MIN_VALUE (itype) = size_zero_node;
5d7ed6c7 6901 TYPE_MAX_VALUE (itype) = fold_convert (sizetype, maxval);
342ad2d6 6902 SET_TYPE_MODE (itype, TYPE_MODE (sizetype));
10a9d4cf 6903 TYPE_SIZE (itype) = TYPE_SIZE (sizetype);
24a7e611 6904 TYPE_SIZE_UNIT (itype) = TYPE_SIZE_UNIT (sizetype);
10a9d4cf 6905 TYPE_ALIGN (itype) = TYPE_ALIGN (sizetype);
aca14577 6906 TYPE_USER_ALIGN (itype) = TYPE_USER_ALIGN (sizetype);
a0c2c45b 6907
c832e677 6908 if (host_integerp (maxval, 1))
02e7a332 6909 return type_hash_canon (tree_low_cst (maxval, 1), itype);
10a9d4cf 6910 else
6753bca0 6911 {
6912 /* Since we cannot hash this type, we need to compare it using
6913 structural equality checks. */
6914 SET_TYPE_STRUCTURAL_EQUALITY (itype);
6915 return itype;
6916 }
10a9d4cf 6917}
6918
27a1da0a 6919#define MAX_INT_CACHED_PREC \
6920 (HOST_BITS_PER_WIDE_INT > 64 ? HOST_BITS_PER_WIDE_INT : 64)
6921static GTY(()) tree nonstandard_integer_type_cache[2 * MAX_INT_CACHED_PREC + 2];
6922
4f7f7efd 6923/* Builds a signed or unsigned integer type of precision PRECISION.
6924 Used for C bitfields whose precision does not match that of
6925 built-in target types. */
6926tree
6927build_nonstandard_integer_type (unsigned HOST_WIDE_INT precision,
6928 int unsignedp)
6929{
27a1da0a 6930 tree itype, ret;
4f7f7efd 6931
27a1da0a 6932 if (unsignedp)
6933 unsignedp = MAX_INT_CACHED_PREC + 1;
6934
6935 if (precision <= MAX_INT_CACHED_PREC)
6936 {
6937 itype = nonstandard_integer_type_cache[precision + unsignedp];
6938 if (itype)
6939 return itype;
6940 }
6941
6942 itype = make_node (INTEGER_TYPE);
4f7f7efd 6943 TYPE_PRECISION (itype) = precision;
6944
6945 if (unsignedp)
6946 fixup_unsigned_type (itype);
6947 else
6948 fixup_signed_type (itype);
6949
27a1da0a 6950 ret = itype;
4f7f7efd 6951 if (host_integerp (TYPE_MAX_VALUE (itype), 1))
27a1da0a 6952 ret = type_hash_canon (tree_low_cst (TYPE_MAX_VALUE (itype), 1), itype);
6953 if (precision <= MAX_INT_CACHED_PREC && lang_hooks.types.hash_types)
6954 nonstandard_integer_type_cache[precision + unsignedp] = ret;
4f7f7efd 6955
27a1da0a 6956 return ret;
4f7f7efd 6957}
6958
0b4f7046 6959/* Create a range of some discrete type TYPE (an INTEGER_TYPE,
63bf54cf 6960 ENUMERAL_TYPE or BOOLEAN_TYPE), with low bound LOWVAL and
6961 high bound HIGHVAL. If TYPE is NULL, sizetype is used. */
10a9d4cf 6962
6963tree
60b8c5b3 6964build_range_type (tree type, tree lowval, tree highval)
10a9d4cf 6965{
19cb6b50 6966 tree itype = make_node (INTEGER_TYPE);
25b73a2d 6967
0b4f7046 6968 TREE_TYPE (itype) = type;
6969 if (type == NULL_TREE)
6970 type = sizetype;
25b73a2d 6971
e3b560a6 6972 TYPE_MIN_VALUE (itype) = fold_convert (type, lowval);
6973 TYPE_MAX_VALUE (itype) = highval ? fold_convert (type, highval) : NULL;
25b73a2d 6974
6975 TYPE_PRECISION (itype) = TYPE_PRECISION (type);
342ad2d6 6976 SET_TYPE_MODE (itype, TYPE_MODE (type));
0b4f7046 6977 TYPE_SIZE (itype) = TYPE_SIZE (type);
b0bd3f2b 6978 TYPE_SIZE_UNIT (itype) = TYPE_SIZE_UNIT (type);
0b4f7046 6979 TYPE_ALIGN (itype) = TYPE_ALIGN (type);
aca14577 6980 TYPE_USER_ALIGN (itype) = TYPE_USER_ALIGN (type);
f52483b5 6981
02e7a332 6982 if (host_integerp (lowval, 0) && highval != 0 && host_integerp (highval, 0))
6983 return type_hash_canon (tree_low_cst (highval, 0)
6984 - tree_low_cst (lowval, 0),
6985 itype);
10a9d4cf 6986 else
6987 return itype;
6988}
6989
a9538d68 6990/* Return true if the debug information for TYPE, a subtype, should be emitted
6991 as a subrange type. If so, set LOWVAL to the low bound and HIGHVAL to the
6992 high bound, respectively. Sometimes doing so unnecessarily obfuscates the
6993 debug info and doesn't reflect the source code. */
6994
6995bool
6996subrange_type_for_debug_p (const_tree type, tree *lowval, tree *highval)
6997{
6998 tree base_type = TREE_TYPE (type), low, high;
6999
7000 /* Subrange types have a base type which is an integral type. */
7001 if (!INTEGRAL_TYPE_P (base_type))
7002 return false;
7003
7004 /* Get the real bounds of the subtype. */
7005 if (lang_hooks.types.get_subrange_bounds)
7006 lang_hooks.types.get_subrange_bounds (type, &low, &high);
7007 else
7008 {
7009 low = TYPE_MIN_VALUE (type);
7010 high = TYPE_MAX_VALUE (type);
7011 }
7012
7013 /* If the type and its base type have the same representation and the same
7014 name, then the type is not a subrange but a copy of the base type. */
7015 if ((TREE_CODE (base_type) == INTEGER_TYPE
7016 || TREE_CODE (base_type) == BOOLEAN_TYPE)
7017 && int_size_in_bytes (type) == int_size_in_bytes (base_type)
7018 && tree_int_cst_equal (low, TYPE_MIN_VALUE (base_type))
7019 && tree_int_cst_equal (high, TYPE_MAX_VALUE (base_type)))
7020 {
7021 tree type_name = TYPE_NAME (type);
7022 tree base_type_name = TYPE_NAME (base_type);
7023
7024 if (type_name && TREE_CODE (type_name) == TYPE_DECL)
7025 type_name = DECL_NAME (type_name);
7026
7027 if (base_type_name && TREE_CODE (base_type_name) == TYPE_DECL)
7028 base_type_name = DECL_NAME (base_type_name);
7029
7030 if (type_name == base_type_name)
7031 return false;
7032 }
7033
7034 if (lowval)
7035 *lowval = low;
7036 if (highval)
7037 *highval = high;
7038 return true;
7039}
7040
0b4f7046 7041/* Just like build_index_type, but takes lowval and highval instead
a92771b8 7042 of just highval (maxval). */
0b4f7046 7043
7044tree
60b8c5b3 7045build_index_2_type (tree lowval, tree highval)
0b4f7046 7046{
02e7a332 7047 return build_range_type (sizetype, lowval, highval);
0b4f7046 7048}
7049
10a9d4cf 7050/* Construct, lay out and return the type of arrays of elements with ELT_TYPE
7051 and number of elements specified by the range of values of INDEX_TYPE.
7052 If such a type has already been constructed, reuse it. */
7053
7054tree
60b8c5b3 7055build_array_type (tree elt_type, tree index_type)
10a9d4cf 7056{
19cb6b50 7057 tree t;
908e5f41 7058 hashval_t hashcode = 0;
10a9d4cf 7059
7060 if (TREE_CODE (elt_type) == FUNCTION_TYPE)
7061 {
7062 error ("arrays of functions are not meaningful");
7063 elt_type = integer_type_node;
7064 }
7065
10a9d4cf 7066 t = make_node (ARRAY_TYPE);
7067 TREE_TYPE (t) = elt_type;
7068 TYPE_DOMAIN (t) = index_type;
bd1a81f7 7069 TYPE_ADDR_SPACE (t) = TYPE_ADDR_SPACE (elt_type);
c8de116d 7070 layout_type (t);
6753bca0 7071
c8de116d 7072 /* If the element type is incomplete at this point we get marked for
7073 structural equality. Do not record these types in the canonical
7074 type hashtable. */
7075 if (TYPE_STRUCTURAL_EQUALITY_P (t))
7076 return t;
10a9d4cf 7077
908e5f41 7078 hashcode = iterative_hash_object (TYPE_HASH (elt_type), hashcode);
c8de116d 7079 if (index_type)
7080 hashcode = iterative_hash_object (TYPE_HASH (index_type), hashcode);
10a9d4cf 7081 t = type_hash_canon (hashcode, t);
7082
6753bca0 7083 if (TYPE_CANONICAL (t) == t)
7084 {
7085 if (TYPE_STRUCTURAL_EQUALITY_P (elt_type)
c8de116d 7086 || (index_type && TYPE_STRUCTURAL_EQUALITY_P (index_type)))
6753bca0 7087 SET_TYPE_STRUCTURAL_EQUALITY (t);
7088 else if (TYPE_CANONICAL (elt_type) != elt_type
c8de116d 7089 || (index_type && TYPE_CANONICAL (index_type) != index_type))
48e1416a 7090 TYPE_CANONICAL (t)
6753bca0 7091 = build_array_type (TYPE_CANONICAL (elt_type),
c8de116d 7092 index_type ? TYPE_CANONICAL (index_type) : NULL);
6753bca0 7093 }
7094
10a9d4cf 7095 return t;
7096}
7097
eec9c06d 7098/* Recursively examines the array elements of TYPE, until a non-array
7099 element type is found. */
8cda90b9 7100
7101tree
eec9c06d 7102strip_array_types (tree type)
8cda90b9 7103{
8cda90b9 7104 while (TREE_CODE (type) == ARRAY_TYPE)
7105 type = TREE_TYPE (type);
7106
7107 return type;
7108}
7109
3084bb6f 7110/* Computes the canonical argument types from the argument type list
48e1416a 7111 ARGTYPES.
3084bb6f 7112
9cdfb835 7113 Upon return, *ANY_STRUCTURAL_P will be true iff either it was true
7114 on entry to this function, or if any of the ARGTYPES are
3084bb6f 7115 structural.
7116
9cdfb835 7117 Upon return, *ANY_NONCANONICAL_P will be true iff either it was
7118 true on entry to this function, or if any of the ARGTYPES are
7119 non-canonical.
3084bb6f 7120
7121 Returns a canonical argument list, which may be ARGTYPES when the
7122 canonical argument list is unneeded (i.e., *ANY_STRUCTURAL_P is
7123 true) or would not differ from ARGTYPES. */
7124
48e1416a 7125static tree
7126maybe_canonicalize_argtypes(tree argtypes,
3084bb6f 7127 bool *any_structural_p,
7128 bool *any_noncanonical_p)
7129{
7130 tree arg;
7131 bool any_noncanonical_argtypes_p = false;
48e1416a 7132
3084bb6f 7133 for (arg = argtypes; arg && !(*any_structural_p); arg = TREE_CHAIN (arg))
7134 {
7135 if (!TREE_VALUE (arg) || TREE_VALUE (arg) == error_mark_node)
7136 /* Fail gracefully by stating that the type is structural. */
7137 *any_structural_p = true;
7138 else if (TYPE_STRUCTURAL_EQUALITY_P (TREE_VALUE (arg)))
7139 *any_structural_p = true;
7140 else if (TYPE_CANONICAL (TREE_VALUE (arg)) != TREE_VALUE (arg)
7141 || TREE_PURPOSE (arg))
7142 /* If the argument has a default argument, we consider it
7143 non-canonical even though the type itself is canonical.
7144 That way, different variants of function and method types
7145 with default arguments will all point to the variant with
7146 no defaults as their canonical type. */
7147 any_noncanonical_argtypes_p = true;
7148 }
7149
7150 if (*any_structural_p)
7151 return argtypes;
7152
7153 if (any_noncanonical_argtypes_p)
7154 {
7155 /* Build the canonical list of argument types. */
7156 tree canon_argtypes = NULL_TREE;
7157 bool is_void = false;
7158
7159 for (arg = argtypes; arg; arg = TREE_CHAIN (arg))
7160 {
7161 if (arg == void_list_node)
7162 is_void = true;
7163 else
7164 canon_argtypes = tree_cons (NULL_TREE,
7165 TYPE_CANONICAL (TREE_VALUE (arg)),
7166 canon_argtypes);
7167 }
7168
7169 canon_argtypes = nreverse (canon_argtypes);
7170 if (is_void)
7171 canon_argtypes = chainon (canon_argtypes, void_list_node);
7172
7173 /* There is a non-canonical type. */
7174 *any_noncanonical_p = true;
7175 return canon_argtypes;
7176 }
7177
7178 /* The canonical argument types are the same as ARGTYPES. */
7179 return argtypes;
7180}
7181
10a9d4cf 7182/* Construct, lay out and return
7183 the type of functions returning type VALUE_TYPE
7184 given arguments of types ARG_TYPES.
7185 ARG_TYPES is a chain of TREE_LIST nodes whose TREE_VALUEs
7186 are data type nodes for the arguments of the function.
7187 If such a type has already been constructed, reuse it. */
7188
7189tree
60b8c5b3 7190build_function_type (tree value_type, tree arg_types)
10a9d4cf 7191{
19cb6b50 7192 tree t;
908e5f41 7193 hashval_t hashcode = 0;
3084bb6f 7194 bool any_structural_p, any_noncanonical_p;
7195 tree canon_argtypes;
10a9d4cf 7196
5dbb3364 7197 if (TREE_CODE (value_type) == FUNCTION_TYPE)
10a9d4cf 7198 {
5dbb3364 7199 error ("function return type cannot be function");
10a9d4cf 7200 value_type = integer_type_node;
7201 }
7202
7203 /* Make a node of the sort we want. */
7204 t = make_node (FUNCTION_TYPE);
7205 TREE_TYPE (t) = value_type;
7206 TYPE_ARG_TYPES (t) = arg_types;
7207
a26d3281 7208 /* If we already have such a type, use the old one. */
908e5f41 7209 hashcode = iterative_hash_object (TYPE_HASH (value_type), hashcode);
7210 hashcode = type_hash_list (arg_types, hashcode);
10a9d4cf 7211 t = type_hash_canon (hashcode, t);
7212
3084bb6f 7213 /* Set up the canonical type. */
7214 any_structural_p = TYPE_STRUCTURAL_EQUALITY_P (value_type);
7215 any_noncanonical_p = TYPE_CANONICAL (value_type) != value_type;
48e1416a 7216 canon_argtypes = maybe_canonicalize_argtypes (arg_types,
3084bb6f 7217 &any_structural_p,
7218 &any_noncanonical_p);
7219 if (any_structural_p)
7220 SET_TYPE_STRUCTURAL_EQUALITY (t);
7221 else if (any_noncanonical_p)
7222 TYPE_CANONICAL (t) = build_function_type (TYPE_CANONICAL (value_type),
7223 canon_argtypes);
48e1416a 7224
4b72716d 7225 if (!COMPLETE_TYPE_P (t))
10a9d4cf 7226 layout_type (t);
7227 return t;
7228}
7229
5afe38fe 7230/* Build variant of function type ORIG_TYPE skipping ARGS_TO_SKIP. */
7231
7232tree
7233build_function_type_skip_args (tree orig_type, bitmap args_to_skip)
7234{
7235 tree new_type = NULL;
7236 tree args, new_args = NULL, t;
7237 tree new_reversed;
7238 int i = 0;
7239
7240 for (args = TYPE_ARG_TYPES (orig_type); args && args != void_list_node;
7241 args = TREE_CHAIN (args), i++)
7242 if (!bitmap_bit_p (args_to_skip, i))
7243 new_args = tree_cons (NULL_TREE, TREE_VALUE (args), new_args);
7244
7245 new_reversed = nreverse (new_args);
7246 if (args)
7247 {
7248 if (new_reversed)
7249 TREE_CHAIN (new_args) = void_list_node;
7250 else
7251 new_reversed = void_list_node;
7252 }
5afe38fe 7253
7254 /* Use copy_node to preserve as much as possible from original type
7255 (debug info, attribute lists etc.)
7256 Exception is METHOD_TYPEs must have THIS argument.
7257 When we are asked to remove it, we need to build new FUNCTION_TYPE
7258 instead. */
7259 if (TREE_CODE (orig_type) != METHOD_TYPE
7260 || !bitmap_bit_p (args_to_skip, 0))
7261 {
7262 new_type = copy_node (orig_type);
7263 TYPE_ARG_TYPES (new_type) = new_reversed;
7264 }
7265 else
48a01d2a 7266 {
7267 new_type
7268 = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
7269 new_reversed));
7270 TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
7271 }
5afe38fe 7272
7273 /* This is a new type, not a copy of an old type. Need to reassociate
7274 variants. We can handle everything except the main variant lazily. */
7275 t = TYPE_MAIN_VARIANT (orig_type);
7276 if (orig_type != t)
7277 {
7278 TYPE_MAIN_VARIANT (new_type) = t;
7279 TYPE_NEXT_VARIANT (new_type) = TYPE_NEXT_VARIANT (t);
7280 TYPE_NEXT_VARIANT (t) = new_type;
7281 }
7282 else
7283 {
7284 TYPE_MAIN_VARIANT (new_type) = new_type;
7285 TYPE_NEXT_VARIANT (new_type) = NULL;
7286 }
7287 return new_type;
7288}
7289
48e1416a 7290/* Build variant of function type ORIG_TYPE skipping ARGS_TO_SKIP.
7291
5afe38fe 7292 Arguments from DECL_ARGUMENTS list can't be removed now, since they are
30b22e1c 7293 linked by TREE_CHAIN directly. The caller is responsible for eliminating
5afe38fe 7294 them when they are being duplicated (i.e. copy_arguments_for_versioning). */
7295
7296tree
7297build_function_decl_skip_args (tree orig_decl, bitmap args_to_skip)
7298{
7299 tree new_decl = copy_node (orig_decl);
7300 tree new_type;
7301
7302 new_type = TREE_TYPE (orig_decl);
7303 if (prototype_p (new_type))
7304 new_type = build_function_type_skip_args (new_type, args_to_skip);
48a01d2a 7305 TREE_TYPE (new_decl) = new_type;
7306
7307 /* For declarations setting DECL_VINDEX (i.e. methods)
7308 we expect first argument to be THIS pointer. */
7309 if (bitmap_bit_p (args_to_skip, 0))
7310 DECL_VINDEX (new_decl) = NULL_TREE;
5afe38fe 7311 return new_decl;
7312}
7313
91c82c20 7314/* Build a function type. The RETURN_TYPE is the type returned by the
30b22e1c 7315 function. If VAARGS is set, no void_type_node is appended to the
7316 the list. ARGP must be always be terminated be a NULL_TREE. */
8b55c4ba 7317
1c73f824 7318static tree
7319build_function_type_list_1 (bool vaargs, tree return_type, va_list argp)
8b55c4ba 7320{
7321 tree t, args, last;
8b55c4ba 7322
1c73f824 7323 t = va_arg (argp, tree);
7324 for (args = NULL_TREE; t != NULL_TREE; t = va_arg (argp, tree))
8b55c4ba 7325 args = tree_cons (NULL_TREE, t, args);
7326
1c73f824 7327 if (vaargs)
7328 {
5afe38fe 7329 last = args;
7330 if (args != NULL_TREE)
7331 args = nreverse (args);
e1036019 7332 gcc_assert (last != void_list_node);
1c73f824 7333 }
7334 else if (args == NULL_TREE)
baf63f24 7335 args = void_list_node;
7336 else
7337 {
7338 last = args;
7339 args = nreverse (args);
7340 TREE_CHAIN (last) = void_list_node;
7341 }
9cc64f48 7342 args = build_function_type (return_type, args);
8b55c4ba 7343
1c73f824 7344 return args;
7345}
7346
7347/* Build a function type. The RETURN_TYPE is the type returned by the
7348 function. If additional arguments are provided, they are
7349 additional argument types. The list of argument types must always
7350 be terminated by NULL_TREE. */
7351
7352tree
7353build_function_type_list (tree return_type, ...)
7354{
7355 tree args;
7356 va_list p;
7357
7358 va_start (p, return_type);
7359 args = build_function_type_list_1 (false, return_type, p);
7360 va_end (p);
7361 return args;
7362}
7363
7364/* Build a variable argument function type. The RETURN_TYPE is the
7365 type returned by the function. If additional arguments are provided,
7366 they are additional argument types. The list of argument types must
7367 always be terminated by NULL_TREE. */
7368
7369tree
7370build_varargs_function_type_list (tree return_type, ...)
7371{
7372 tree args;
7373 va_list p;
7374
7375 va_start (p, return_type);
7376 args = build_function_type_list_1 (true, return_type, p);
ee582a61 7377 va_end (p);
1c73f824 7378
8b55c4ba 7379 return args;
7380}
7381
8b8f063f 7382/* Build a METHOD_TYPE for a member of BASETYPE. The RETTYPE (a TYPE)
7383 and ARGTYPES (a TREE_LIST) are the return type and arguments types
7384 for the method. An implicit additional parameter (of type
7385 pointer-to-BASETYPE) is added to the ARGTYPES. */
10a9d4cf 7386
7387tree
8b8f063f 7388build_method_type_directly (tree basetype,
7389 tree rettype,
7390 tree argtypes)
10a9d4cf 7391{
19cb6b50 7392 tree t;
8b8f063f 7393 tree ptype;
908e5f41 7394 int hashcode = 0;
3084bb6f 7395 bool any_structural_p, any_noncanonical_p;
7396 tree canon_argtypes;
10a9d4cf 7397
7398 /* Make a node of the sort we want. */
7399 t = make_node (METHOD_TYPE);
7400
10a9d4cf 7401 TYPE_METHOD_BASETYPE (t) = TYPE_MAIN_VARIANT (basetype);
8b8f063f 7402 TREE_TYPE (t) = rettype;
7403 ptype = build_pointer_type (basetype);
10a9d4cf 7404
7405 /* The actual arglist for this function includes a "hidden" argument
7406 which is "this". Put it into the list of argument types. */
8b8f063f 7407 argtypes = tree_cons (NULL_TREE, ptype, argtypes);
7408 TYPE_ARG_TYPES (t) = argtypes;
10a9d4cf 7409
a26d3281 7410 /* If we already have such a type, use the old one. */
908e5f41 7411 hashcode = iterative_hash_object (TYPE_HASH (basetype), hashcode);
7412 hashcode = iterative_hash_object (TYPE_HASH (rettype), hashcode);
7413 hashcode = type_hash_list (argtypes, hashcode);
10a9d4cf 7414 t = type_hash_canon (hashcode, t);
7415
3084bb6f 7416 /* Set up the canonical type. */
7417 any_structural_p
7418 = (TYPE_STRUCTURAL_EQUALITY_P (basetype)
7419 || TYPE_STRUCTURAL_EQUALITY_P (rettype));
7420 any_noncanonical_p
7421 = (TYPE_CANONICAL (basetype) != basetype
7422 || TYPE_CANONICAL (rettype) != rettype);
7423 canon_argtypes = maybe_canonicalize_argtypes (TREE_CHAIN (argtypes),
7424 &any_structural_p,
7425 &any_noncanonical_p);
7426 if (any_structural_p)
7427 SET_TYPE_STRUCTURAL_EQUALITY (t);
7428 else if (any_noncanonical_p)
48e1416a 7429 TYPE_CANONICAL (t)
3084bb6f 7430 = build_method_type_directly (TYPE_CANONICAL (basetype),
7431 TYPE_CANONICAL (rettype),
7432 canon_argtypes);
4b72716d 7433 if (!COMPLETE_TYPE_P (t))
10a9d4cf 7434 layout_type (t);
7435
7436 return t;
7437}
7438
8b8f063f 7439/* Construct, lay out and return the type of methods belonging to class
7440 BASETYPE and whose arguments and values are described by TYPE.
7441 If that type exists already, reuse it.
7442 TYPE must be a FUNCTION_TYPE node. */
7443
7444tree
7445build_method_type (tree basetype, tree type)
7446{
8c0963c4 7447 gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
8b8f063f 7448
b27ac6b5 7449 return build_method_type_directly (basetype,
8b8f063f 7450 TREE_TYPE (type),
7451 TYPE_ARG_TYPES (type));
7452}
7453
f768c418 7454/* Construct, lay out and return the type of offsets to a value
7455 of type TYPE, within an object of type BASETYPE.
7456 If a suitable offset type exists already, reuse it. */
10a9d4cf 7457
7458tree
60b8c5b3 7459build_offset_type (tree basetype, tree type)
10a9d4cf 7460{
19cb6b50 7461 tree t;
908e5f41 7462 hashval_t hashcode = 0;
10a9d4cf 7463
7464 /* Make a node of the sort we want. */
7465 t = make_node (OFFSET_TYPE);
7466
7467 TYPE_OFFSET_BASETYPE (t) = TYPE_MAIN_VARIANT (basetype);
7468 TREE_TYPE (t) = type;
7469
a26d3281 7470 /* If we already have such a type, use the old one. */
908e5f41 7471 hashcode = iterative_hash_object (TYPE_HASH (basetype), hashcode);
7472 hashcode = iterative_hash_object (TYPE_HASH (type), hashcode);
10a9d4cf 7473 t = type_hash_canon (hashcode, t);
7474
4b72716d 7475 if (!COMPLETE_TYPE_P (t))
10a9d4cf 7476 layout_type (t);
7477
6753bca0 7478 if (TYPE_CANONICAL (t) == t)
7479 {
7480 if (TYPE_STRUCTURAL_EQUALITY_P (basetype)
7481 || TYPE_STRUCTURAL_EQUALITY_P (type))
7482 SET_TYPE_STRUCTURAL_EQUALITY (t);
7f0d3ba1 7483 else if (TYPE_CANONICAL (TYPE_MAIN_VARIANT (basetype)) != basetype
6753bca0 7484 || TYPE_CANONICAL (type) != type)
48e1416a 7485 TYPE_CANONICAL (t)
7f0d3ba1 7486 = build_offset_type (TYPE_CANONICAL (TYPE_MAIN_VARIANT (basetype)),
6753bca0 7487 TYPE_CANONICAL (type));
7488 }
7489
10a9d4cf 7490 return t;
7491}
7492
7493/* Create a complex type whose components are COMPONENT_TYPE. */
7494
7495tree
60b8c5b3 7496build_complex_type (tree component_type)
10a9d4cf 7497{
19cb6b50 7498 tree t;
908e5f41 7499 hashval_t hashcode;
10a9d4cf 7500
b7860e64 7501 gcc_assert (INTEGRAL_TYPE_P (component_type)
7502 || SCALAR_FLOAT_TYPE_P (component_type)
7503 || FIXED_POINT_TYPE_P (component_type));
7504
10a9d4cf 7505 /* Make a node of the sort we want. */
7506 t = make_node (COMPLEX_TYPE);
7507
7508 TREE_TYPE (t) = TYPE_MAIN_VARIANT (component_type);
10a9d4cf 7509
a26d3281 7510 /* If we already have such a type, use the old one. */
908e5f41 7511 hashcode = iterative_hash_object (TYPE_HASH (component_type), 0);
10a9d4cf 7512 t = type_hash_canon (hashcode, t);
7513
4b72716d 7514 if (!COMPLETE_TYPE_P (t))
10a9d4cf 7515 layout_type (t);
7516
6753bca0 7517 if (TYPE_CANONICAL (t) == t)
7518 {
7519 if (TYPE_STRUCTURAL_EQUALITY_P (component_type))
7520 SET_TYPE_STRUCTURAL_EQUALITY (t);
7521 else if (TYPE_CANONICAL (component_type) != component_type)
48e1416a 7522 TYPE_CANONICAL (t)
6753bca0 7523 = build_complex_type (TYPE_CANONICAL (component_type));
7524 }
7525
c133ba93 7526 /* We need to create a name, since complex is a fundamental type. */
7527 if (! TYPE_NAME (t))
5b5abf88 7528 {
20f0a040 7529 const char *name;
5b5abf88 7530 if (component_type == char_type_node)
7531 name = "complex char";
7532 else if (component_type == signed_char_type_node)
7533 name = "complex signed char";
7534 else if (component_type == unsigned_char_type_node)
7535 name = "complex unsigned char";
7536 else if (component_type == short_integer_type_node)
7537 name = "complex short int";
7538 else if (component_type == short_unsigned_type_node)
7539 name = "complex short unsigned int";
7540 else if (component_type == integer_type_node)
7541 name = "complex int";
7542 else if (component_type == unsigned_type_node)
7543 name = "complex unsigned int";
7544 else if (component_type == long_integer_type_node)
7545 name = "complex long int";
7546 else if (component_type == long_unsigned_type_node)
7547 name = "complex long unsigned int";
7548 else if (component_type == long_long_integer_type_node)
7549 name = "complex long long int";
7550 else if (component_type == long_long_unsigned_type_node)
7551 name = "complex long long unsigned int";
7552 else
083a2b5e 7553 name = 0;
5b5abf88 7554
083a2b5e 7555 if (name != 0)
e60a6f7b 7556 TYPE_NAME (t) = build_decl (UNKNOWN_LOCATION, TYPE_DECL,
7557 get_identifier (name), t);
5b5abf88 7558 }
7559
a26d3281 7560 return build_qualified_type (t, TYPE_QUALS (component_type));
10a9d4cf 7561}
c6418a4e 7562
7563/* If TYPE is a real or complex floating-point type and the target
7564 does not directly support arithmetic on TYPE then return the wider
7565 type to be used for arithmetic on TYPE. Otherwise, return
7566 NULL_TREE. */
7567
7568tree
7569excess_precision_type (tree type)
7570{
7571 if (flag_excess_precision != EXCESS_PRECISION_FAST)
7572 {
7573 int flt_eval_method = TARGET_FLT_EVAL_METHOD;
7574 switch (TREE_CODE (type))
7575 {
7576 case REAL_TYPE:
7577 switch (flt_eval_method)
7578 {
7579 case 1:
7580 if (TYPE_MODE (type) == TYPE_MODE (float_type_node))
7581 return double_type_node;
7582 break;
7583 case 2:
7584 if (TYPE_MODE (type) == TYPE_MODE (float_type_node)
7585 || TYPE_MODE (type) == TYPE_MODE (double_type_node))
7586 return long_double_type_node;
7587 break;
7588 default:
7589 gcc_unreachable ();
7590 }
7591 break;
7592 case COMPLEX_TYPE:
7593 if (TREE_CODE (TREE_TYPE (type)) != REAL_TYPE)
7594 return NULL_TREE;
7595 switch (flt_eval_method)
7596 {
7597 case 1:
7598 if (TYPE_MODE (TREE_TYPE (type)) == TYPE_MODE (float_type_node))
7599 return complex_double_type_node;
7600 break;
7601 case 2:
7602 if (TYPE_MODE (TREE_TYPE (type)) == TYPE_MODE (float_type_node)
7603 || (TYPE_MODE (TREE_TYPE (type))
7604 == TYPE_MODE (double_type_node)))
7605 return complex_long_double_type_node;
7606 break;
7607 default:
7608 gcc_unreachable ();
7609 }
7610 break;
7611 default:
7612 break;
7613 }
7614 }
7615 return NULL_TREE;
7616}
10a9d4cf 7617\f
7618/* Return OP, stripped of any conversions to wider types as much as is safe.
7619 Converting the value back to OP's type makes a value equivalent to OP.
7620
7621 If FOR_TYPE is nonzero, we return a value which, if converted to
7622 type FOR_TYPE, would be equivalent to converting OP to type FOR_TYPE.
7623
10a9d4cf 7624 OP must have integer, real or enumeral type. Pointers are not allowed!
7625
7626 There are some cases where the obvious value we could return
9bfff6cb 7627 would regenerate to OP if converted to OP's type,
10a9d4cf 7628 but would not extend like OP to wider types.
7629 If FOR_TYPE indicates such extension is contemplated, we eschew such values.
7630 For example, if OP is (unsigned short)(signed char)-1,
7631 we avoid returning (signed char)-1 if FOR_TYPE is int,
7632 even though extending that to an unsigned short would regenerate OP,
7633 since the result of extending (signed char)-1 to (int)
7634 is different from (int) OP. */
7635
7636tree
60b8c5b3 7637get_unwidened (tree op, tree for_type)
10a9d4cf 7638{
7639 /* Set UNS initially if converting OP to FOR_TYPE is a zero-extension. */
19cb6b50 7640 tree type = TREE_TYPE (op);
7641 unsigned final_prec
10a9d4cf 7642 = TYPE_PRECISION (for_type != 0 ? for_type : type);
19cb6b50 7643 int uns
10a9d4cf 7644 = (for_type != 0 && for_type != type
7645 && final_prec > TYPE_PRECISION (type)
78a8ed03 7646 && TYPE_UNSIGNED (type));
19cb6b50 7647 tree win = op;
10a9d4cf 7648
72dd6141 7649 while (CONVERT_EXPR_P (op))
10a9d4cf 7650 {
352bd673 7651 int bitschange;
7652
7653 /* TYPE_PRECISION on vector types has different meaning
7654 (TYPE_VECTOR_SUBPARTS) and casts from vectors are view conversions,
7655 so avoid them here. */
7656 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (op, 0))) == VECTOR_TYPE)
7657 break;
7658
7659 bitschange = TYPE_PRECISION (TREE_TYPE (op))
7660 - TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op, 0)));
10a9d4cf 7661
7662 /* Truncations are many-one so cannot be removed.
7663 Unless we are later going to truncate down even farther. */
7664 if (bitschange < 0
7665 && final_prec > TYPE_PRECISION (TREE_TYPE (op)))
7666 break;
7667
7668 /* See what's inside this conversion. If we decide to strip it,
7669 we will set WIN. */
7670 op = TREE_OPERAND (op, 0);
7671
7672 /* If we have not stripped any zero-extensions (uns is 0),
7673 we can strip any kind of extension.
7674 If we have previously stripped a zero-extension,
7675 only zero-extensions can safely be stripped.
7676 Any extension can be stripped if the bits it would produce
7677 are all going to be discarded later by truncating to FOR_TYPE. */
7678
7679 if (bitschange > 0)
7680 {
7681 if (! uns || final_prec <= TYPE_PRECISION (TREE_TYPE (op)))
7682 win = op;
78a8ed03 7683 /* TYPE_UNSIGNED says whether this is a zero-extension.
10a9d4cf 7684 Let's avoid computing it if it does not affect WIN
7685 and if UNS will not be needed again. */
a846fd4d 7686 if ((uns
72dd6141 7687 || CONVERT_EXPR_P (op))
78a8ed03 7688 && TYPE_UNSIGNED (TREE_TYPE (op)))
10a9d4cf 7689 {
7690 uns = 1;
7691 win = op;
7692 }
7693 }
7694 }
7695
4d307e1f 7696 /* If we finally reach a constant see if it fits in for_type and
7697 in that case convert it. */
7698 if (for_type
7699 && TREE_CODE (win) == INTEGER_CST
7700 && TREE_TYPE (win) != for_type
7701 && int_fits_type_p (win, for_type))
7702 win = fold_convert (for_type, win);
7703
10a9d4cf 7704 return win;
7705}
7706\f
7707/* Return OP or a simpler expression for a narrower value
7708 which can be sign-extended or zero-extended to give back OP.
7709 Store in *UNSIGNEDP_PTR either 1 if the value should be zero-extended
7710 or 0 if the value should be sign-extended. */
7711
7712tree
60b8c5b3 7713get_narrower (tree op, int *unsignedp_ptr)
10a9d4cf 7714{
19cb6b50 7715 int uns = 0;
10a9d4cf 7716 int first = 1;
19cb6b50 7717 tree win = op;
727c62dd 7718 bool integral_p = INTEGRAL_TYPE_P (TREE_TYPE (op));
10a9d4cf 7719
7720 while (TREE_CODE (op) == NOP_EXPR)
7721 {
19cb6b50 7722 int bitschange
083a2b5e 7723 = (TYPE_PRECISION (TREE_TYPE (op))
7724 - TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op, 0))));
10a9d4cf 7725
7726 /* Truncations are many-one so cannot be removed. */
7727 if (bitschange < 0)
7728 break;
7729
7730 /* See what's inside this conversion. If we decide to strip it,
7731 we will set WIN. */
10a9d4cf 7732
7733 if (bitschange > 0)
7734 {
6cf10752 7735 op = TREE_OPERAND (op, 0);
10a9d4cf 7736 /* An extension: the outermost one can be stripped,
7737 but remember whether it is zero or sign extension. */
7738 if (first)
78a8ed03 7739 uns = TYPE_UNSIGNED (TREE_TYPE (op));
10a9d4cf 7740 /* Otherwise, if a sign extension has been stripped,
7741 only sign extensions can now be stripped;
7742 if a zero extension has been stripped, only zero-extensions. */
78a8ed03 7743 else if (uns != TYPE_UNSIGNED (TREE_TYPE (op)))
10a9d4cf 7744 break;
7745 first = 0;
7746 }
edbe57f0 7747 else /* bitschange == 0 */
7748 {
7749 /* A change in nominal type can always be stripped, but we must
7750 preserve the unsignedness. */
7751 if (first)
78a8ed03 7752 uns = TYPE_UNSIGNED (TREE_TYPE (op));
edbe57f0 7753 first = 0;
6cf10752 7754 op = TREE_OPERAND (op, 0);
727c62dd 7755 /* Keep trying to narrow, but don't assign op to win if it
7756 would turn an integral type into something else. */
7757 if (INTEGRAL_TYPE_P (TREE_TYPE (op)) != integral_p)
7758 continue;
edbe57f0 7759 }
10a9d4cf 7760
7761 win = op;
7762 }
7763
7764 if (TREE_CODE (op) == COMPONENT_REF
7765 /* Since type_for_size always gives an integer type. */
99651114 7766 && TREE_CODE (TREE_TYPE (op)) != REAL_TYPE
06f0b99c 7767 && TREE_CODE (TREE_TYPE (op)) != FIXED_POINT_TYPE
99651114 7768 /* Ensure field is laid out already. */
6374121b 7769 && DECL_SIZE (TREE_OPERAND (op, 1)) != 0
7770 && host_integerp (DECL_SIZE (TREE_OPERAND (op, 1)), 1))
10a9d4cf 7771 {
99651114 7772 unsigned HOST_WIDE_INT innerprec
7773 = tree_low_cst (DECL_SIZE (TREE_OPERAND (op, 1)), 1);
86ae60fd 7774 int unsignedp = (DECL_UNSIGNED (TREE_OPERAND (op, 1))
78a8ed03 7775 || TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op, 1))));
dc24ddbd 7776 tree type = lang_hooks.types.type_for_size (innerprec, unsignedp);
10a9d4cf 7777
7778 /* We can get this structure field in a narrower type that fits it,
7779 but the resulting extension to its nominal type (a fullword type)
7780 must satisfy the same conditions as for other extensions.
7781
7782 Do this only for fields that are aligned (not bit-fields),
7783 because when bit-field insns will be used there is no
7784 advantage in doing this. */
7785
7786 if (innerprec < TYPE_PRECISION (TREE_TYPE (op))
7787 && ! DECL_BIT_FIELD (TREE_OPERAND (op, 1))
86ae60fd 7788 && (first || uns == DECL_UNSIGNED (TREE_OPERAND (op, 1)))
10a9d4cf 7789 && type != 0)
7790 {
7791 if (first)
86ae60fd 7792 uns = DECL_UNSIGNED (TREE_OPERAND (op, 1));
b1088b3e 7793 win = fold_convert (type, op);
10a9d4cf 7794 }
7795 }
b1088b3e 7796
10a9d4cf 7797 *unsignedp_ptr = uns;
7798 return win;
7799}
7800\f
10a9d4cf 7801/* Nonzero if integer constant C has a value that is permissible
7802 for type TYPE (an INTEGER_TYPE). */
7803
7804int
720082dc 7805int_fits_type_p (const_tree c, const_tree type)
10a9d4cf 7806{
d235ab60 7807 tree type_low_bound, type_high_bound;
7808 bool ok_for_low_bound, ok_for_high_bound, unsc;
7809 double_int dc, dd;
7810
7811 dc = tree_to_double_int (c);
7812 unsc = TYPE_UNSIGNED (TREE_TYPE (c));
7813
7814 if (TREE_CODE (TREE_TYPE (c)) == INTEGER_TYPE
7815 && TYPE_IS_SIZETYPE (TREE_TYPE (c))
7816 && unsc)
7817 /* So c is an unsigned integer whose type is sizetype and type is not.
7818 sizetype'd integers are sign extended even though they are
7819 unsigned. If the integer value fits in the lower end word of c,
7820 and if the higher end word has all its bits set to 1, that
7821 means the higher end bits are set to 1 only for sign extension.
7822 So let's convert c into an equivalent zero extended unsigned
7823 integer. */
7824 dc = double_int_zext (dc, TYPE_PRECISION (TREE_TYPE (c)));
7825
7826retry:
7827 type_low_bound = TYPE_MIN_VALUE (type);
7828 type_high_bound = TYPE_MAX_VALUE (type);
ddb425f3 7829
7830 /* If at least one bound of the type is a constant integer, we can check
7831 ourselves and maybe make a decision. If no such decision is possible, but
7832 this type is a subtype, try checking against that. Otherwise, use
ca9b061d 7833 fit_double_type, which checks against the precision.
ddb425f3 7834
7835 Compute the status for each possibly constant bound, and return if we see
7836 one does not match. Use ok_for_xxx_bound for this purpose, assigning -1
7837 for "unknown if constant fits", 0 for "constant known *not* to fit" and 1
7838 for "constant known to fit". */
7839
d235ab60 7840 /* Check if c >= type_low_bound. */
ddb425f3 7841 if (type_low_bound && TREE_CODE (type_low_bound) == INTEGER_CST)
f27f695c 7842 {
d235ab60 7843 dd = tree_to_double_int (type_low_bound);
7844 if (TREE_CODE (type) == INTEGER_TYPE
7845 && TYPE_IS_SIZETYPE (type)
7846 && TYPE_UNSIGNED (type))
7847 dd = double_int_zext (dd, TYPE_PRECISION (type));
7848 if (unsc != TYPE_UNSIGNED (TREE_TYPE (type_low_bound)))
7849 {
7850 int c_neg = (!unsc && double_int_negative_p (dc));
7851 int t_neg = (unsc && double_int_negative_p (dd));
7852
7853 if (c_neg && !t_neg)
7854 return 0;
7855 if ((c_neg || !t_neg) && double_int_ucmp (dc, dd) < 0)
7856 return 0;
7857 }
7858 else if (double_int_cmp (dc, dd, unsc) < 0)
ddb425f3 7859 return 0;
46d3b0a2 7860 ok_for_low_bound = true;
f27f695c 7861 }
46d3b0a2 7862 else
7863 ok_for_low_bound = false;
ddb425f3 7864
7865 /* Check if c <= type_high_bound. */
7866 if (type_high_bound && TREE_CODE (type_high_bound) == INTEGER_CST)
7867 {
d235ab60 7868 dd = tree_to_double_int (type_high_bound);
7869 if (TREE_CODE (type) == INTEGER_TYPE
7870 && TYPE_IS_SIZETYPE (type)
7871 && TYPE_UNSIGNED (type))
7872 dd = double_int_zext (dd, TYPE_PRECISION (type));
7873 if (unsc != TYPE_UNSIGNED (TREE_TYPE (type_high_bound)))
7874 {
7875 int c_neg = (!unsc && double_int_negative_p (dc));
7876 int t_neg = (unsc && double_int_negative_p (dd));
7877
7878 if (t_neg && !c_neg)
7879 return 0;
7880 if ((t_neg || !c_neg) && double_int_ucmp (dc, dd) > 0)
7881 return 0;
7882 }
7883 else if (double_int_cmp (dc, dd, unsc) > 0)
ddb425f3 7884 return 0;
46d3b0a2 7885 ok_for_high_bound = true;
ddb425f3 7886 }
46d3b0a2 7887 else
7888 ok_for_high_bound = false;
ddb425f3 7889
7890 /* If the constant fits both bounds, the result is known. */
46d3b0a2 7891 if (ok_for_low_bound && ok_for_high_bound)
ddb425f3 7892 return 1;
7893
46d3b0a2 7894 /* Perform some generic filtering which may allow making a decision
7895 even if the bounds are not constant. First, negative integers
7896 never fit in unsigned types, */
d235ab60 7897 if (TYPE_UNSIGNED (type) && !unsc && double_int_negative_p (dc))
46d3b0a2 7898 return 0;
7899
7900 /* Second, narrower types always fit in wider ones. */
7901 if (TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (c)))
7902 return 1;
7903
7904 /* Third, unsigned integers with top bit set never fit signed types. */
d235ab60 7905 if (! TYPE_UNSIGNED (type) && unsc)
7906 {
7907 int prec = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (c))) - 1;
7908 if (prec < HOST_BITS_PER_WIDE_INT)
7909 {
7910 if (((((unsigned HOST_WIDE_INT) 1) << prec) & dc.low) != 0)
7911 return 0;
7912 }
7913 else if (((((unsigned HOST_WIDE_INT) 1)
7914 << (prec - HOST_BITS_PER_WIDE_INT)) & dc.high) != 0)
7915 return 0;
7916 }
46d3b0a2 7917
ddb425f3 7918 /* If we haven't been able to decide at this point, there nothing more we
ca6a2cc9 7919 can check ourselves here. Look at the base type if we have one and it
7920 has the same precision. */
7921 if (TREE_CODE (type) == INTEGER_TYPE
7922 && TREE_TYPE (type) != 0
7923 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (type)))
d235ab60 7924 {
7925 type = TREE_TYPE (type);
7926 goto retry;
7927 }
60b8c5b3 7928
ca9b061d 7929 /* Or to fit_double_type, if nothing else. */
d235ab60 7930 return !fit_double_type (dc.low, dc.high, &dc.low, &dc.high, type);
10a9d4cf 7931}
7932
612a17fc 7933/* Stores bounds of an integer TYPE in MIN and MAX. If TYPE has non-constant
7934 bounds or is a POINTER_TYPE, the maximum and/or minimum values that can be
7935 represented (assuming two's-complement arithmetic) within the bit
7936 precision of the type are returned instead. */
7937
7938void
1f1872fd 7939get_type_static_bounds (const_tree type, mpz_t min, mpz_t max)
612a17fc 7940{
7941 if (!POINTER_TYPE_P (type) && TYPE_MIN_VALUE (type)
7942 && TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST)
7943 mpz_set_double_int (min, tree_to_double_int (TYPE_MIN_VALUE (type)),
7944 TYPE_UNSIGNED (type));
7945 else
7946 {
7947 if (TYPE_UNSIGNED (type))
7948 mpz_set_ui (min, 0);
7949 else
7950 {
7951 double_int mn;
7952 mn = double_int_mask (TYPE_PRECISION (type) - 1);
7953 mn = double_int_sext (double_int_add (mn, double_int_one),
7954 TYPE_PRECISION (type));
7955 mpz_set_double_int (min, mn, false);
7956 }
7957 }
7958
48e1416a 7959 if (!POINTER_TYPE_P (type) && TYPE_MAX_VALUE (type)
612a17fc 7960 && TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST)
7961 mpz_set_double_int (max, tree_to_double_int (TYPE_MAX_VALUE (type)),
7962 TYPE_UNSIGNED (type));
7963 else
7964 {
7965 if (TYPE_UNSIGNED (type))
7966 mpz_set_double_int (max, double_int_mask (TYPE_PRECISION (type)),
7967 true);
7968 else
7969 mpz_set_double_int (max, double_int_mask (TYPE_PRECISION (type) - 1),
7970 true);
7971 }
7972}
7973
75a70cf9 7974/* Return true if VAR is an automatic variable defined in function FN. */
2ef41604 7975
7976bool
9f627b1a 7977auto_var_in_fn_p (const_tree var, const_tree fn)
2ef41604 7978{
7979 return (DECL_P (var) && DECL_CONTEXT (var) == fn
877fe380 7980 && ((((TREE_CODE (var) == VAR_DECL && ! DECL_EXTERNAL (var))
7981 || TREE_CODE (var) == PARM_DECL)
2ef41604 7982 && ! TREE_STATIC (var))
7983 || TREE_CODE (var) == LABEL_DECL
7984 || TREE_CODE (var) == RESULT_DECL));
7985}
7986
1f8a6ff8 7987/* Subprogram of following function. Called by walk_tree.
7988
7989 Return *TP if it is an automatic variable or parameter of the
7990 function passed in as DATA. */
7991
7992static tree
7993find_var_from_fn (tree *tp, int *walk_subtrees, void *data)
7994{
7995 tree fn = (tree) data;
7996
7997 if (TYPE_P (*tp))
7998 *walk_subtrees = 0;
7999
ce45a448 8000 else if (DECL_P (*tp)
2ef41604 8001 && auto_var_in_fn_p (*tp, fn))
1f8a6ff8 8002 return *tp;
8003
8004 return NULL_TREE;
8005}
8006
21ac3a84 8007/* Returns true if T is, contains, or refers to a type with variable
de8dea22 8008 size. For METHOD_TYPEs and FUNCTION_TYPEs we exclude the
8009 arguments, but not the return type. If FN is nonzero, only return
8010 true if a modifier of the type or position of FN is a variable or
8011 parameter inside FN.
1f8a6ff8 8012
8013 This concept is more general than that of C99 'variably modified types':
8014 in C99, a struct type is never variably modified because a VLA may not
8015 appear as a structure member. However, in GNU C code like:
60b8c5b3 8016
21ac3a84 8017 struct S { int i[f()]; };
8018
8019 is valid, and other languages may define similar constructs. */
8020
8021bool
1f8a6ff8 8022variably_modified_type_p (tree type, tree fn)
21ac3a84 8023{
ecba2e4c 8024 tree t;
8025
1f8a6ff8 8026/* Test if T is either variable (if FN is zero) or an expression containing
8027 a variable in FN. */
8028#define RETURN_TRUE_IF_VAR(T) \
8029 do { tree _t = (T); \
8030 if (_t && _t != error_mark_node && TREE_CODE (_t) != INTEGER_CST \
8031 && (!fn || walk_tree (&_t, find_var_from_fn, fn, NULL))) \
8032 return true; } while (0)
8033
a6543b83 8034 if (type == error_mark_node)
8035 return false;
8036
32d33ab2 8037 /* If TYPE itself has variable size, it is variably modified. */
1f8a6ff8 8038 RETURN_TRUE_IF_VAR (TYPE_SIZE (type));
6726ef59 8039 RETURN_TRUE_IF_VAR (TYPE_SIZE_UNIT (type));
21ac3a84 8040
ecba2e4c 8041 switch (TREE_CODE (type))
8042 {
8043 case POINTER_TYPE:
8044 case REFERENCE_TYPE:
ab7083b0 8045 case VECTOR_TYPE:
1f8a6ff8 8046 if (variably_modified_type_p (TREE_TYPE (type), fn))
ab7083b0 8047 return true;
8048 break;
60b8c5b3 8049
ecba2e4c 8050 case FUNCTION_TYPE:
8051 case METHOD_TYPE:
de8dea22 8052 /* If TYPE is a function type, it is variably modified if the
8053 return type is variably modified. */
1f8a6ff8 8054 if (variably_modified_type_p (TREE_TYPE (type), fn))
ab7083b0 8055 return true;
ecba2e4c 8056 break;
21ac3a84 8057
ecba2e4c 8058 case INTEGER_TYPE:
ab7083b0 8059 case REAL_TYPE:
06f0b99c 8060 case FIXED_POINT_TYPE:
ab7083b0 8061 case ENUMERAL_TYPE:
8062 case BOOLEAN_TYPE:
ecba2e4c 8063 /* Scalar types are variably modified if their end points
8064 aren't constant. */
1f8a6ff8 8065 RETURN_TRUE_IF_VAR (TYPE_MIN_VALUE (type));
8066 RETURN_TRUE_IF_VAR (TYPE_MAX_VALUE (type));
ab7083b0 8067 break;
8068
8069 case RECORD_TYPE:
8070 case UNION_TYPE:
8071 case QUAL_UNION_TYPE:
32d33ab2 8072 /* We can't see if any of the fields are variably-modified by the
ab7083b0 8073 definition we normally use, since that would produce infinite
8074 recursion via pointers. */
8075 /* This is variably modified if some field's type is. */
8076 for (t = TYPE_FIELDS (type); t; t = TREE_CHAIN (t))
8077 if (TREE_CODE (t) == FIELD_DECL)
8078 {
1f8a6ff8 8079 RETURN_TRUE_IF_VAR (DECL_FIELD_OFFSET (t));
8080 RETURN_TRUE_IF_VAR (DECL_SIZE (t));
8081 RETURN_TRUE_IF_VAR (DECL_SIZE_UNIT (t));
ab7083b0 8082
1f8a6ff8 8083 if (TREE_CODE (type) == QUAL_UNION_TYPE)
8084 RETURN_TRUE_IF_VAR (DECL_QUALIFIER (t));
ab7083b0 8085 }
8086 break;
ecba2e4c 8087
6726ef59 8088 case ARRAY_TYPE:
8089 /* Do not call ourselves to avoid infinite recursion. This is
8090 variably modified if the element type is. */
8091 RETURN_TRUE_IF_VAR (TYPE_SIZE (TREE_TYPE (type)));
8092 RETURN_TRUE_IF_VAR (TYPE_SIZE_UNIT (TREE_TYPE (type)));
8093 break;
8094
ecba2e4c 8095 default:
8096 break;
21ac3a84 8097 }
8098
8099 /* The current language may have other cases to check, but in general,
8100 all other types are not variably modified. */
1f8a6ff8 8101 return lang_hooks.tree_inlining.var_mod_type_p (type, fn);
8102
8103#undef RETURN_TRUE_IF_VAR
21ac3a84 8104}
8105
804dff30 8106/* Given a DECL or TYPE, return the scope in which it was declared, or
d5e65e3e 8107 NULL_TREE if there is no containing scope. */
804dff30 8108
8109tree
720082dc 8110get_containing_scope (const_tree t)
804dff30 8111{
8112 return (TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t));
8113}
8114
d3862ba2 8115/* Return the innermost context enclosing DECL that is
10a9d4cf 8116 a FUNCTION_DECL, or zero if none. */
8117
8118tree
720082dc 8119decl_function_context (const_tree decl)
10a9d4cf 8120{
8121 tree context;
8122
d3862ba2 8123 if (TREE_CODE (decl) == ERROR_MARK)
10a9d4cf 8124 return 0;
8125
53bdb86c 8126 /* C++ virtual functions use DECL_CONTEXT for the class of the vtable
8127 where we look up the function at runtime. Such functions always take
8128 a first argument of type 'pointer to real context'.
8129
8130 C++ should really be fixed to use DECL_CONTEXT for the real context,
8131 and use something else for the "virtual context". */
8132 else if (TREE_CODE (decl) == FUNCTION_DECL && DECL_VINDEX (decl))
d5e65e3e 8133 context
8134 = TYPE_MAIN_VARIANT
8135 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)))));
10a9d4cf 8136 else
d3862ba2 8137 context = DECL_CONTEXT (decl);
10a9d4cf 8138
8139 while (context && TREE_CODE (context) != FUNCTION_DECL)
8140 {
804dff30 8141 if (TREE_CODE (context) == BLOCK)
10a9d4cf 8142 context = BLOCK_SUPERCONTEXT (context);
9bfff6cb 8143 else
804dff30 8144 context = get_containing_scope (context);
10a9d4cf 8145 }
8146
8147 return context;
8148}
8149
d3862ba2 8150/* Return the innermost context enclosing DECL that is
5dbb3364 8151 a RECORD_TYPE, UNION_TYPE or QUAL_UNION_TYPE, or zero if none.
10a9d4cf 8152 TYPE_DECLs and FUNCTION_DECLs are transparent to this function. */
8153
8154tree
720082dc 8155decl_type_context (const_tree decl)
10a9d4cf 8156{
d3862ba2 8157 tree context = DECL_CONTEXT (decl);
10a9d4cf 8158
8159 while (context)
40109983 8160 switch (TREE_CODE (context))
8161 {
8162 case NAMESPACE_DECL:
8163 case TRANSLATION_UNIT_DECL:
6c34d0c2 8164 return NULL_TREE;
e9750a4e 8165
40109983 8166 case RECORD_TYPE:
8167 case UNION_TYPE:
8168 case QUAL_UNION_TYPE:
10a9d4cf 8169 return context;
b27ac6b5 8170
40109983 8171 case TYPE_DECL:
8172 case FUNCTION_DECL:
10a9d4cf 8173 context = DECL_CONTEXT (context);
40109983 8174 break;
b27ac6b5 8175
40109983 8176 case BLOCK:
10a9d4cf 8177 context = BLOCK_SUPERCONTEXT (context);
40109983 8178 break;
b27ac6b5 8179
40109983 8180 default:
8c0963c4 8181 gcc_unreachable ();
40109983 8182 }
8183
10a9d4cf 8184 return NULL_TREE;
8185}
8186
4a2fac76 8187/* CALL is a CALL_EXPR. Return the declaration for the function
9bfff6cb 8188 called, or NULL_TREE if the called function cannot be
4a2fac76 8189 determined. */
8190
8191tree
b7bf20db 8192get_callee_fndecl (const_tree call)
4a2fac76 8193{
8194 tree addr;
8195
6da06c90 8196 if (call == error_mark_node)
b7bf20db 8197 return error_mark_node;
6da06c90 8198
4a2fac76 8199 /* It's invalid to call this function with anything but a
8200 CALL_EXPR. */
8c0963c4 8201 gcc_assert (TREE_CODE (call) == CALL_EXPR);
4a2fac76 8202
8203 /* The first operand to the CALL is the address of the function
8204 called. */
c2f47e15 8205 addr = CALL_EXPR_FN (call);
4a2fac76 8206
b85737ba 8207 STRIP_NOPS (addr);
8208
8209 /* If this is a readonly function pointer, extract its initial value. */
8210 if (DECL_P (addr) && TREE_CODE (addr) != FUNCTION_DECL
8211 && TREE_READONLY (addr) && ! TREE_THIS_VOLATILE (addr)
8212 && DECL_INITIAL (addr))
8213 addr = DECL_INITIAL (addr);
8214
4a2fac76 8215 /* If the address is just `&f' for some function `f', then we know
8216 that `f' is being called. */
8217 if (TREE_CODE (addr) == ADDR_EXPR
8218 && TREE_CODE (TREE_OPERAND (addr, 0)) == FUNCTION_DECL)
ad850f1c 8219 return TREE_OPERAND (addr, 0);
b27ac6b5 8220
4cd62850 8221 /* We couldn't figure out what was being called. */
8222 return NULL_TREE;
4a2fac76 8223}
8224
73eac312 8225/* Print debugging information about tree nodes generated during the compile,
8226 and any language-specific information. */
8227
10a9d4cf 8228void
60b8c5b3 8229dump_tree_statistics (void)
10a9d4cf 8230{
07e64d6e 8231#ifdef GATHER_STATISTICS
10a9d4cf 8232 int i;
8233 int total_nodes, total_bytes;
07e64d6e 8234#endif
10a9d4cf 8235
8236 fprintf (stderr, "\n??? tree nodes created\n\n");
8237#ifdef GATHER_STATISTICS
b7257530 8238 fprintf (stderr, "Kind Nodes Bytes\n");
8239 fprintf (stderr, "---------------------------------------\n");
10a9d4cf 8240 total_nodes = total_bytes = 0;
8241 for (i = 0; i < (int) all_kinds; i++)
8242 {
b7257530 8243 fprintf (stderr, "%-20s %7d %10d\n", tree_node_kind_names[i],
10a9d4cf 8244 tree_node_counts[i], tree_node_sizes[i]);
8245 total_nodes += tree_node_counts[i];
8246 total_bytes += tree_node_sizes[i];
8247 }
b7257530 8248 fprintf (stderr, "---------------------------------------\n");
8249 fprintf (stderr, "%-20s %7d %10d\n", "Total", total_nodes, total_bytes);
8250 fprintf (stderr, "---------------------------------------\n");
4ee9c684 8251 ssanames_print_statistics ();
8252 phinodes_print_statistics ();
10a9d4cf 8253#else
8254 fprintf (stderr, "(No per-node statistics)\n");
8255#endif
f2d83427 8256 print_type_hash_statistics ();
8bc1e6ff 8257 print_debug_expr_statistics ();
75fa4f82 8258 print_value_expr_statistics ();
dc24ddbd 8259 lang_hooks.print_statistics ();
10a9d4cf 8260}
38d47eb8 8261\f
9bc65db1 8262#define FILE_FUNCTION_FORMAT "_GLOBAL__%s_%s"
38d47eb8 8263
eac18265 8264/* Generate a crc32 of a string. */
6717a67d 8265
eac18265 8266unsigned
8267crc32_string (unsigned chksum, const char *string)
6717a67d 8268{
eac18265 8269 do
8270 {
8271 unsigned value = *string << 24;
8272 unsigned ix;
b27ac6b5 8273
eac18265 8274 for (ix = 8; ix--; value <<= 1)
8275 {
8276 unsigned feedback;
b27ac6b5 8277
eac18265 8278 feedback = (value ^ chksum) & 0x80000000 ? 0x04c11db7 : 0;
8279 chksum <<= 1;
8280 chksum ^= feedback;
8281 }
8282 }
8283 while (*string++);
8284 return chksum;
6717a67d 8285}
8286
19f716e5 8287/* P is a string that will be used in a symbol. Mask out any characters
8288 that are not valid in that context. */
8289
8290void
60b8c5b3 8291clean_symbol_name (char *p)
19f716e5 8292{
8293 for (; *p; p++)
66a33570 8294 if (! (ISALNUM (*p)
19f716e5 8295#ifndef NO_DOLLAR_IN_LABEL /* this for `$'; unlikely, but... -- kr */
8296 || *p == '$'
8297#endif
8298#ifndef NO_DOT_IN_LABEL /* this for `.'; unlikely, but... */
8299 || *p == '.'
8300#endif
66a33570 8301 ))
19f716e5 8302 *p = '_';
8303}
709c2f34 8304
db85cc4f 8305/* Generate a name for a special-purpose function function.
8306 The generated name may need to be unique across the whole link.
6717a67d 8307 TYPE is some string to identify the purpose of this function to the
db85cc4f 8308 linker or collect2; it must start with an uppercase letter,
8309 one of:
8310 I - for constructors
8311 D - for destructors
8312 N - for C++ anonymous namespaces
8313 F - for DWARF unwind frame information. */
38d47eb8 8314
8315tree
db85cc4f 8316get_file_function_name (const char *type)
38d47eb8 8317{
8318 char *buf;
e772a198 8319 const char *p;
8320 char *q;
38d47eb8 8321
db85cc4f 8322 /* If we already have a name we know to be unique, just use that. */
38d47eb8 8323 if (first_global_object_name)
24e20bcd 8324 p = q = ASTRDUP (first_global_object_name);
db85cc4f 8325 /* If the target is handling the constructors/destructors, they
8326 will be local to this file and the name is only necessary for
8327 debugging purposes. */
8328 else if ((type[0] == 'I' || type[0] == 'D') && targetm.have_ctors_dtors)
a0028b3d 8329 {
db85cc4f 8330 const char *file = main_input_filename;
8331 if (! file)
8332 file = input_filename;
8333 /* Just use the file's basename, because the full pathname
8334 might be quite long. */
8335 p = strrchr (file, '/');
8336 if (p)
8337 p++;
8338 else
8339 p = file;
8340 p = q = ASTRDUP (p);
a0028b3d 8341 }
38d47eb8 8342 else
6717a67d 8343 {
db85cc4f 8344 /* Otherwise, the name must be unique across the entire link.
8345 We don't have anything that we know to be unique to this translation
6717a67d 8346 unit, so use what we do have and throw in some randomness. */
eac18265 8347 unsigned len;
b788a3c3 8348 const char *name = weak_global_object_name;
8349 const char *file = main_input_filename;
6717a67d 8350
8351 if (! name)
8352 name = "";
8353 if (! file)
8354 file = input_filename;
8355
eac18265 8356 len = strlen (file);
45ba1503 8357 q = (char *) alloca (9 * 2 + len + 1);
eac18265 8358 memcpy (q, file, len + 1);
eac18265 8359
eac18265 8360 sprintf (q + len, "_%08X_%08X", crc32_string (0, name),
b6c1bd72 8361 crc32_string (0, get_random_seed (false)));
6717a67d 8362
e772a198 8363 p = q;
6717a67d 8364 }
38d47eb8 8365
24e20bcd 8366 clean_symbol_name (q);
45ba1503 8367 buf = (char *) alloca (sizeof (FILE_FUNCTION_FORMAT) + strlen (p)
8368 + strlen (type));
38d47eb8 8369
9bfff6cb 8370 /* Set up the name of the file-level functions we may need.
083a2b5e 8371 Use a global object (which is already required to be unique over
38d47eb8 8372 the program) rather than the file name (which imposes extra
083a2b5e 8373 constraints). */
9bc65db1 8374 sprintf (buf, FILE_FUNCTION_FORMAT, type, p);
38d47eb8 8375
38d47eb8 8376 return get_identifier (buf);
8377}
c141f4ab 8378\f
0c4e40c5 8379#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
82bb2115 8380
36066e37 8381/* Complain that the tree code of NODE does not match the expected 0
d409f4c9 8382 terminated list of trailing codes. The trailing code list can be
8383 empty, for a more vague error message. FILE, LINE, and FUNCTION
8384 are of the caller. */
9bfff6cb 8385
a4070a91 8386void
aae87fc3 8387tree_check_failed (const_tree node, const char *file,
36066e37 8388 int line, const char *function, ...)
8389{
8390 va_list args;
aae87fc3 8391 const char *buffer;
36066e37 8392 unsigned length = 0;
8393 int code;
8394
8395 va_start (args, function);
8396 while ((code = va_arg (args, int)))
8397 length += 4 + strlen (tree_code_name[code]);
8398 va_end (args);
d409f4c9 8399 if (length)
36066e37 8400 {
aae87fc3 8401 char *tmp;
d409f4c9 8402 va_start (args, function);
8403 length += strlen ("expected ");
45ba1503 8404 buffer = tmp = (char *) alloca (length);
d409f4c9 8405 length = 0;
8406 while ((code = va_arg (args, int)))
36066e37 8407 {
d409f4c9 8408 const char *prefix = length ? " or " : "expected ";
48e1416a 8409
aae87fc3 8410 strcpy (tmp + length, prefix);
d409f4c9 8411 length += strlen (prefix);
aae87fc3 8412 strcpy (tmp + length, tree_code_name[code]);
d409f4c9 8413 length += strlen (tree_code_name[code]);
36066e37 8414 }
d409f4c9 8415 va_end (args);
36066e37 8416 }
d409f4c9 8417 else
aae87fc3 8418 buffer = "unexpected node";
b27ac6b5 8419
d409f4c9 8420 internal_error ("tree check: %s, have %s in %s, at %s:%d",
36066e37 8421 buffer, tree_code_name[TREE_CODE (node)],
82bb2115 8422 function, trim_filename (file), line);
8423}
8424
36066e37 8425/* Complain that the tree code of NODE does match the expected 0
8426 terminated list of trailing codes. FILE, LINE, and FUNCTION are of
8427 the caller. */
82bb2115 8428
8429void
aae87fc3 8430tree_not_check_failed (const_tree node, const char *file,
36066e37 8431 int line, const char *function, ...)
8432{
8433 va_list args;
8434 char *buffer;
8435 unsigned length = 0;
8436 int code;
8437
8438 va_start (args, function);
8439 while ((code = va_arg (args, int)))
8440 length += 4 + strlen (tree_code_name[code]);
8441 va_end (args);
8442 va_start (args, function);
45ba1503 8443 buffer = (char *) alloca (length);
36066e37 8444 length = 0;
8445 while ((code = va_arg (args, int)))
8446 {
8447 if (length)
8448 {
8449 strcpy (buffer + length, " or ");
8450 length += 4;
8451 }
8452 strcpy (buffer + length, tree_code_name[code]);
8453 length += strlen (tree_code_name[code]);
8454 }
8455 va_end (args);
b27ac6b5 8456
36066e37 8457 internal_error ("tree check: expected none of %s, have %s in %s, at %s:%d",
8458 buffer, tree_code_name[TREE_CODE (node)],
82bb2115 8459 function, trim_filename (file), line);
8460}
8461
82bb2115 8462/* Similar to tree_check_failed, except that we check for a class of tree
9e042f31 8463 code, given in CL. */
9bfff6cb 8464
a4070a91 8465void
aae87fc3 8466tree_class_check_failed (const_tree node, const enum tree_code_class cl,
ce45a448 8467 const char *file, int line, const char *function)
3e207e38 8468{
0fc48b82 8469 internal_error
ce45a448 8470 ("tree check: expected class %qs, have %qs (%s) in %s, at %s:%d",
8471 TREE_CODE_CLASS_STRING (cl),
8472 TREE_CODE_CLASS_STRING (TREE_CODE_CLASS (TREE_CODE (node))),
0fc48b82 8473 tree_code_name[TREE_CODE (node)], function, trim_filename (file), line);
a4070a91 8474}
59db13d3 8475
1e8e9920 8476/* Similar to tree_check_failed, except that instead of specifying a
8477 dozen codes, use the knowledge that they're all sequential. */
8478
8479void
aae87fc3 8480tree_range_check_failed (const_tree node, const char *file, int line,
1e8e9920 8481 const char *function, enum tree_code c1,
8482 enum tree_code c2)
8483{
8484 char *buffer;
8485 unsigned length = 0;
9f1b7d17 8486 unsigned int c;
1e8e9920 8487
8488 for (c = c1; c <= c2; ++c)
8489 length += 4 + strlen (tree_code_name[c]);
8490
8491 length += strlen ("expected ");
45ba1503 8492 buffer = (char *) alloca (length);
1e8e9920 8493 length = 0;
8494
8495 for (c = c1; c <= c2; ++c)
8496 {
8497 const char *prefix = length ? " or " : "expected ";
8498
8499 strcpy (buffer + length, prefix);
8500 length += strlen (prefix);
8501 strcpy (buffer + length, tree_code_name[c]);
8502 length += strlen (tree_code_name[c]);
8503 }
8504
8505 internal_error ("tree check: %s, have %s in %s, at %s:%d",
8506 buffer, tree_code_name[TREE_CODE (node)],
8507 function, trim_filename (file), line);
8508}
8509
8510
59db13d3 8511/* Similar to tree_check_failed, except that we check that a tree does
8512 not have the specified code, given in CL. */
8513
8514void
aae87fc3 8515tree_not_class_check_failed (const_tree node, const enum tree_code_class cl,
59db13d3 8516 const char *file, int line, const char *function)
8517{
8518 internal_error
8519 ("tree check: did not expect class %qs, have %qs (%s) in %s, at %s:%d",
8520 TREE_CODE_CLASS_STRING (cl),
8521 TREE_CODE_CLASS_STRING (TREE_CODE_CLASS (TREE_CODE (node))),
8522 tree_code_name[TREE_CODE (node)], function, trim_filename (file), line);
8523}
8524
55d6e7cd 8525
8526/* Similar to tree_check_failed but applied to OMP_CLAUSE codes. */
8527
8528void
aae87fc3 8529omp_clause_check_failed (const_tree node, const char *file, int line,
55d6e7cd 8530 const char *function, enum omp_clause_code code)
8531{
8532 internal_error ("tree check: expected omp_clause %s, have %s in %s, at %s:%d",
8533 omp_clause_code_name[code], tree_code_name[TREE_CODE (node)],
8534 function, trim_filename (file), line);
8535}
8536
8537
8538/* Similar to tree_range_check_failed but applied to OMP_CLAUSE codes. */
8539
8540void
aae87fc3 8541omp_clause_range_check_failed (const_tree node, const char *file, int line,
55d6e7cd 8542 const char *function, enum omp_clause_code c1,
8543 enum omp_clause_code c2)
8544{
8545 char *buffer;
8546 unsigned length = 0;
9f1b7d17 8547 unsigned int c;
55d6e7cd 8548
8549 for (c = c1; c <= c2; ++c)
8550 length += 4 + strlen (omp_clause_code_name[c]);
8551
8552 length += strlen ("expected ");
45ba1503 8553 buffer = (char *) alloca (length);
55d6e7cd 8554 length = 0;
8555
8556 for (c = c1; c <= c2; ++c)
8557 {
8558 const char *prefix = length ? " or " : "expected ";
8559
8560 strcpy (buffer + length, prefix);
8561 length += strlen (prefix);
8562 strcpy (buffer + length, omp_clause_code_name[c]);
8563 length += strlen (omp_clause_code_name[c]);
8564 }
8565
8566 internal_error ("tree check: %s, have %s in %s, at %s:%d",
8567 buffer, omp_clause_code_name[TREE_CODE (node)],
8568 function, trim_filename (file), line);
8569}
8570
8571
5ded8c6f 8572#undef DEFTREESTRUCT
8573#define DEFTREESTRUCT(VAL, NAME) NAME,
8574
8575static const char *ts_enum_names[] = {
8576#include "treestruct.def"
8577};
8578#undef DEFTREESTRUCT
8579
8580#define TS_ENUM_NAME(EN) (ts_enum_names[(EN)])
8581
8582/* Similar to tree_class_check_failed, except that we check for
8583 whether CODE contains the tree structure identified by EN. */
8584
8585void
48e1416a 8586tree_contains_struct_check_failed (const_tree node,
5ded8c6f 8587 const enum tree_node_structure_enum en,
48e1416a 8588 const char *file, int line,
5ded8c6f 8589 const char *function)
8590{
8591 internal_error
21e9153c 8592 ("tree check: expected tree that contains %qs structure, have %qs in %s, at %s:%d",
5ded8c6f 8593 TS_ENUM_NAME(en),
8594 tree_code_name[TREE_CODE (node)], function, trim_filename (file), line);
8595}
8596
a4070a91 8597
66bc87db 8598/* Similar to above, except that the check is for the bounds of a TREE_VEC's
8599 (dynamically sized) vector. */
8600
8601void
60b8c5b3 8602tree_vec_elt_check_failed (int idx, int len, const char *file, int line,
8603 const char *function)
66bc87db 8604{
8605 internal_error
8606 ("tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d",
8607 idx + 1, len, function, trim_filename (file), line);
8608}
8609
2fcde217 8610/* Similar to above, except that the check is for the bounds of the operand
c2f47e15 8611 vector of an expression node EXP. */
2fcde217 8612
8613void
aae87fc3 8614tree_operand_check_failed (int idx, const_tree exp, const char *file,
60b8c5b3 8615 int line, const char *function)
2fcde217 8616{
c2f47e15 8617 int code = TREE_CODE (exp);
2fcde217 8618 internal_error
8619 ("tree check: accessed operand %d of %s with %d operands in %s, at %s:%d",
c2f47e15 8620 idx + 1, tree_code_name[code], TREE_OPERAND_LENGTH (exp),
2fcde217 8621 function, trim_filename (file), line);
8622}
55d6e7cd 8623
8624/* Similar to above, except that the check is for the number of
8625 operands of an OMP_CLAUSE node. */
8626
8627void
720082dc 8628omp_clause_operand_check_failed (int idx, const_tree t, const char *file,
55d6e7cd 8629 int line, const char *function)
8630{
8631 internal_error
8632 ("tree check: accessed operand %d of omp_clause %s with %d operands "
8633 "in %s, at %s:%d", idx + 1, omp_clause_code_name[OMP_CLAUSE_CODE (t)],
8634 omp_clause_num_ops [OMP_CLAUSE_CODE (t)], function,
8635 trim_filename (file), line);
8636}
0c4e40c5 8637#endif /* ENABLE_TREE_CHECKING */
775e7cc0 8638\f
83e2a11b 8639/* Create a new vector type node holding SUBPARTS units of type INNERTYPE,
8640 and mapped to the machine mode MODE. Initialize its fields and build
8641 the information necessary for debugging output. */
9bfff6cb 8642
83e2a11b 8643static tree
8644make_vector_type (tree innertype, int nunits, enum machine_mode mode)
e2ea7e3a 8645{
b7d1b569 8646 tree t;
8647 hashval_t hashcode = 0;
8648
b7d1b569 8649 t = make_node (VECTOR_TYPE);
bd971849 8650 TREE_TYPE (t) = TYPE_MAIN_VARIANT (innertype);
99d38b9e 8651 SET_TYPE_VECTOR_SUBPARTS (t, nunits);
342ad2d6 8652 SET_TYPE_MODE (t, mode);
bd971849 8653
6753bca0 8654 if (TYPE_STRUCTURAL_EQUALITY_P (innertype))
8655 SET_TYPE_STRUCTURAL_EQUALITY (t);
8656 else if (TYPE_CANONICAL (innertype) != innertype
8657 || mode != VOIDmode)
48e1416a 8658 TYPE_CANONICAL (t)
6753bca0 8659 = make_vector_type (TYPE_CANONICAL (innertype), nunits, VOIDmode);
8660
e2ea7e3a 8661 layout_type (t);
8662
8663 {
7016c612 8664 tree index = build_int_cst (NULL_TREE, nunits - 1);
3b32ccd7 8665 tree array = build_array_type (TYPE_MAIN_VARIANT (innertype),
8666 build_index_type (index));
e2ea7e3a 8667 tree rt = make_node (RECORD_TYPE);
8668
e60a6f7b 8669 TYPE_FIELDS (rt) = build_decl (UNKNOWN_LOCATION, FIELD_DECL,
8670 get_identifier ("f"), array);
e2ea7e3a 8671 DECL_CONTEXT (TYPE_FIELDS (rt)) = rt;
8672 layout_type (rt);
8673 TYPE_DEBUG_REPRESENTATION_TYPE (t) = rt;
8674 /* In dwarfout.c, type lookup uses TYPE_UID numbers. We want to output
8675 the representation type, and we want to find that die when looking up
8676 the vector type. This is most easily achieved by making the TYPE_UID
8677 numbers equal. */
8678 TYPE_UID (rt) = TYPE_UID (t);
8679 }
83e2a11b 8680
b7d1b569 8681 hashcode = iterative_hash_host_wide_int (VECTOR_TYPE, hashcode);
2ed8de55 8682 hashcode = iterative_hash_host_wide_int (nunits, hashcode);
b7d1b569 8683 hashcode = iterative_hash_host_wide_int (mode, hashcode);
2ed8de55 8684 hashcode = iterative_hash_object (TYPE_HASH (TREE_TYPE (t)), hashcode);
8685 t = type_hash_canon (hashcode, t);
8686
8687 /* We have built a main variant, based on the main variant of the
8688 inner type. Use it to build the variant we return. */
8689 if ((TYPE_ATTRIBUTES (innertype) || TYPE_QUALS (innertype))
8690 && TREE_TYPE (t) != innertype)
8691 return build_type_attribute_qual_variant (t,
8692 TYPE_ATTRIBUTES (innertype),
8693 TYPE_QUALS (innertype));
8694
8695 return t;
e2ea7e3a 8696}
8697
8b4b9810 8698static tree
8699make_or_reuse_type (unsigned size, int unsignedp)
8700{
8701 if (size == INT_TYPE_SIZE)
8702 return unsignedp ? unsigned_type_node : integer_type_node;
8703 if (size == CHAR_TYPE_SIZE)
8704 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
8705 if (size == SHORT_TYPE_SIZE)
8706 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
8707 if (size == LONG_TYPE_SIZE)
8708 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
8709 if (size == LONG_LONG_TYPE_SIZE)
8710 return (unsignedp ? long_long_unsigned_type_node
8711 : long_long_integer_type_node);
6388cfe2 8712 if (size == 128 && int128_integer_type_node)
8713 return (unsignedp ? int128_unsigned_type_node
8714 : int128_integer_type_node);
8b4b9810 8715
8716 if (unsignedp)
8717 return make_unsigned_type (size);
8718 else
8719 return make_signed_type (size);
8720}
8721
06f0b99c 8722/* Create or reuse a fract type by SIZE, UNSIGNEDP, and SATP. */
8723
8724static tree
8725make_or_reuse_fract_type (unsigned size, int unsignedp, int satp)
8726{
8727 if (satp)
8728 {
8729 if (size == SHORT_FRACT_TYPE_SIZE)
8730 return unsignedp ? sat_unsigned_short_fract_type_node
8731 : sat_short_fract_type_node;
8732 if (size == FRACT_TYPE_SIZE)
8733 return unsignedp ? sat_unsigned_fract_type_node : sat_fract_type_node;
8734 if (size == LONG_FRACT_TYPE_SIZE)
8735 return unsignedp ? sat_unsigned_long_fract_type_node
8736 : sat_long_fract_type_node;
8737 if (size == LONG_LONG_FRACT_TYPE_SIZE)
8738 return unsignedp ? sat_unsigned_long_long_fract_type_node
8739 : sat_long_long_fract_type_node;
8740 }
8741 else
8742 {
8743 if (size == SHORT_FRACT_TYPE_SIZE)
8744 return unsignedp ? unsigned_short_fract_type_node
8745 : short_fract_type_node;
8746 if (size == FRACT_TYPE_SIZE)
8747 return unsignedp ? unsigned_fract_type_node : fract_type_node;
8748 if (size == LONG_FRACT_TYPE_SIZE)
8749 return unsignedp ? unsigned_long_fract_type_node
8750 : long_fract_type_node;
8751 if (size == LONG_LONG_FRACT_TYPE_SIZE)
8752 return unsignedp ? unsigned_long_long_fract_type_node
8753 : long_long_fract_type_node;
8754 }
8755
8756 return make_fract_type (size, unsignedp, satp);
8757}
8758
8759/* Create or reuse an accum type by SIZE, UNSIGNEDP, and SATP. */
8760
8761static tree
8762make_or_reuse_accum_type (unsigned size, int unsignedp, int satp)
8763{
8764 if (satp)
8765 {
8766 if (size == SHORT_ACCUM_TYPE_SIZE)
8767 return unsignedp ? sat_unsigned_short_accum_type_node
8768 : sat_short_accum_type_node;
8769 if (size == ACCUM_TYPE_SIZE)
8770 return unsignedp ? sat_unsigned_accum_type_node : sat_accum_type_node;
8771 if (size == LONG_ACCUM_TYPE_SIZE)
8772 return unsignedp ? sat_unsigned_long_accum_type_node
8773 : sat_long_accum_type_node;
8774 if (size == LONG_LONG_ACCUM_TYPE_SIZE)
8775 return unsignedp ? sat_unsigned_long_long_accum_type_node
8776 : sat_long_long_accum_type_node;
8777 }
8778 else
8779 {
8780 if (size == SHORT_ACCUM_TYPE_SIZE)
8781 return unsignedp ? unsigned_short_accum_type_node
8782 : short_accum_type_node;
8783 if (size == ACCUM_TYPE_SIZE)
8784 return unsignedp ? unsigned_accum_type_node : accum_type_node;
8785 if (size == LONG_ACCUM_TYPE_SIZE)
8786 return unsignedp ? unsigned_long_accum_type_node
8787 : long_accum_type_node;
8788 if (size == LONG_LONG_ACCUM_TYPE_SIZE)
8789 return unsignedp ? unsigned_long_long_accum_type_node
8790 : long_long_accum_type_node;
8791 }
8792
8793 return make_accum_type (size, unsignedp, satp);
8794}
8795
775e7cc0 8796/* Create nodes for all integer types (and error_mark_node) using the sizes
8797 of C datatypes. The caller should call set_sizetype soon after calling
8798 this function to select one of the types as sizetype. */
9bfff6cb 8799
775e7cc0 8800void
ad086ed4 8801build_common_tree_nodes (bool signed_char)
775e7cc0 8802{
8803 error_mark_node = make_node (ERROR_MARK);
8804 TREE_TYPE (error_mark_node) = error_mark_node;
8805
ad086ed4 8806 initialize_sizetypes ();
902de8ed 8807
775e7cc0 8808 /* Define both `signed char' and `unsigned char'. */
8809 signed_char_type_node = make_signed_type (CHAR_TYPE_SIZE);
e026e576 8810 TYPE_STRING_FLAG (signed_char_type_node) = 1;
775e7cc0 8811 unsigned_char_type_node = make_unsigned_type (CHAR_TYPE_SIZE);
e026e576 8812 TYPE_STRING_FLAG (unsigned_char_type_node) = 1;
775e7cc0 8813
8814 /* Define `char', which is like either `signed char' or `unsigned char'
8815 but not the same as either. */
8816 char_type_node
8817 = (signed_char
8818 ? make_signed_type (CHAR_TYPE_SIZE)
8819 : make_unsigned_type (CHAR_TYPE_SIZE));
e026e576 8820 TYPE_STRING_FLAG (char_type_node) = 1;
775e7cc0 8821
8822 short_integer_type_node = make_signed_type (SHORT_TYPE_SIZE);
8823 short_unsigned_type_node = make_unsigned_type (SHORT_TYPE_SIZE);
8824 integer_type_node = make_signed_type (INT_TYPE_SIZE);
775e7cc0 8825 unsigned_type_node = make_unsigned_type (INT_TYPE_SIZE);
8826 long_integer_type_node = make_signed_type (LONG_TYPE_SIZE);
8827 long_unsigned_type_node = make_unsigned_type (LONG_TYPE_SIZE);
8828 long_long_integer_type_node = make_signed_type (LONG_LONG_TYPE_SIZE);
8829 long_long_unsigned_type_node = make_unsigned_type (LONG_LONG_TYPE_SIZE);
6388cfe2 8830#if HOST_BITS_PER_WIDE_INT >= 64
8831 /* TODO: This isn't correct, but as logic depends at the moment on
8832 host's instead of target's wide-integer.
8833 If there is a target not supporting TImode, but has an 128-bit
8834 integer-scalar register, this target check needs to be adjusted. */
8835 if (targetm.scalar_mode_supported_p (TImode))
8836 {
8837 int128_integer_type_node = make_signed_type (128);
8838 int128_unsigned_type_node = make_unsigned_type (128);
8839 }
8840#endif
3c2239cf 8841 /* Define a boolean type. This type only represents boolean values but
8842 may be larger than char depending on the value of BOOL_TYPE_SIZE.
8843 Front ends which want to override this size (i.e. Java) can redefine
8844 boolean_type_node before calling build_common_tree_nodes_2. */
8845 boolean_type_node = make_unsigned_type (BOOL_TYPE_SIZE);
8846 TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE);
7016c612 8847 TYPE_MAX_VALUE (boolean_type_node) = build_int_cst (boolean_type_node, 1);
3c2239cf 8848 TYPE_PRECISION (boolean_type_node) = 1;
8849
8b4b9810 8850 /* Fill in the rest of the sized types. Reuse existing type nodes
8851 when possible. */
8852 intQI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (QImode), 0);
8853 intHI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (HImode), 0);
8854 intSI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (SImode), 0);
8855 intDI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (DImode), 0);
8856 intTI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (TImode), 0);
8857
8858 unsigned_intQI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (QImode), 1);
8859 unsigned_intHI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (HImode), 1);
8860 unsigned_intSI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (SImode), 1);
8861 unsigned_intDI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (DImode), 1);
8862 unsigned_intTI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (TImode), 1);
b27ac6b5 8863
2c584053 8864 access_public_node = get_identifier ("public");
8865 access_protected_node = get_identifier ("protected");
8866 access_private_node = get_identifier ("private");
775e7cc0 8867}
8868
775e7cc0 8869/* Call this function after calling build_common_tree_nodes and set_sizetype.
902de8ed 8870 It will create several other common tree nodes. */
083a2b5e 8871
775e7cc0 8872void
60b8c5b3 8873build_common_tree_nodes_2 (int short_double)
775e7cc0 8874{
a0c2c45b 8875 /* Define these next since types below may used them. */
7016c612 8876 integer_zero_node = build_int_cst (NULL_TREE, 0);
8877 integer_one_node = build_int_cst (NULL_TREE, 1);
8878 integer_minus_one_node = build_int_cst (NULL_TREE, -1);
775e7cc0 8879
02e7a332 8880 size_zero_node = size_int (0);
8881 size_one_node = size_int (1);
8882 bitsize_zero_node = bitsize_int (0);
8883 bitsize_one_node = bitsize_int (1);
8884 bitsize_unit_node = bitsize_int (BITS_PER_UNIT);
775e7cc0 8885
3c2239cf 8886 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
8887 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
8888
775e7cc0 8889 void_type_node = make_node (VOID_TYPE);
a0c2c45b 8890 layout_type (void_type_node);
083a2b5e 8891
775e7cc0 8892 /* We are not going to have real types in C with less than byte alignment,
8893 so we might as well not have any types that claim to have it. */
8894 TYPE_ALIGN (void_type_node) = BITS_PER_UNIT;
aca14577 8895 TYPE_USER_ALIGN (void_type_node) = 0;
775e7cc0 8896
7016c612 8897 null_pointer_node = build_int_cst (build_pointer_type (void_type_node), 0);
775e7cc0 8898 layout_type (TREE_TYPE (null_pointer_node));
8899
8900 ptr_type_node = build_pointer_type (void_type_node);
8901 const_ptr_type_node
8902 = build_pointer_type (build_type_variant (void_type_node, 1, 0));
e256d445 8903 fileptr_type_node = ptr_type_node;
775e7cc0 8904
8905 float_type_node = make_node (REAL_TYPE);
8906 TYPE_PRECISION (float_type_node) = FLOAT_TYPE_SIZE;
8907 layout_type (float_type_node);
8908
8909 double_type_node = make_node (REAL_TYPE);
8910 if (short_double)
8911 TYPE_PRECISION (double_type_node) = FLOAT_TYPE_SIZE;
8912 else
8913 TYPE_PRECISION (double_type_node) = DOUBLE_TYPE_SIZE;
8914 layout_type (double_type_node);
8915
8916 long_double_type_node = make_node (REAL_TYPE);
8917 TYPE_PRECISION (long_double_type_node) = LONG_DOUBLE_TYPE_SIZE;
8918 layout_type (long_double_type_node);
8919
4070bd43 8920 float_ptr_type_node = build_pointer_type (float_type_node);
8921 double_ptr_type_node = build_pointer_type (double_type_node);
8922 long_double_ptr_type_node = build_pointer_type (long_double_type_node);
8923 integer_ptr_type_node = build_pointer_type (integer_type_node);
8924
42791117 8925 /* Fixed size integer types. */
8926 uint32_type_node = build_nonstandard_integer_type (32, true);
8927 uint64_type_node = build_nonstandard_integer_type (64, true);
8928
c4503c0a 8929 /* Decimal float types. */
8930 dfloat32_type_node = make_node (REAL_TYPE);
48e1416a 8931 TYPE_PRECISION (dfloat32_type_node) = DECIMAL32_TYPE_SIZE;
c4503c0a 8932 layout_type (dfloat32_type_node);
342ad2d6 8933 SET_TYPE_MODE (dfloat32_type_node, SDmode);
c4503c0a 8934 dfloat32_ptr_type_node = build_pointer_type (dfloat32_type_node);
8935
8936 dfloat64_type_node = make_node (REAL_TYPE);
8937 TYPE_PRECISION (dfloat64_type_node) = DECIMAL64_TYPE_SIZE;
8938 layout_type (dfloat64_type_node);
342ad2d6 8939 SET_TYPE_MODE (dfloat64_type_node, DDmode);
c4503c0a 8940 dfloat64_ptr_type_node = build_pointer_type (dfloat64_type_node);
8941
8942 dfloat128_type_node = make_node (REAL_TYPE);
48e1416a 8943 TYPE_PRECISION (dfloat128_type_node) = DECIMAL128_TYPE_SIZE;
c4503c0a 8944 layout_type (dfloat128_type_node);
342ad2d6 8945 SET_TYPE_MODE (dfloat128_type_node, TDmode);
c4503c0a 8946 dfloat128_ptr_type_node = build_pointer_type (dfloat128_type_node);
8947
a024c245 8948 complex_integer_type_node = build_complex_type (integer_type_node);
8949 complex_float_type_node = build_complex_type (float_type_node);
8950 complex_double_type_node = build_complex_type (double_type_node);
8951 complex_long_double_type_node = build_complex_type (long_double_type_node);
775e7cc0 8952
06f0b99c 8953/* Make fixed-point nodes based on sat/non-sat and signed/unsigned. */
9f92e1a2 8954#define MAKE_FIXED_TYPE_NODE(KIND,SIZE) \
8955 sat_ ## KIND ## _type_node = \
8956 make_sat_signed_ ## KIND ## _type (SIZE); \
8957 sat_unsigned_ ## KIND ## _type_node = \
8958 make_sat_unsigned_ ## KIND ## _type (SIZE); \
8959 KIND ## _type_node = make_signed_ ## KIND ## _type (SIZE); \
8960 unsigned_ ## KIND ## _type_node = \
8961 make_unsigned_ ## KIND ## _type (SIZE);
8962
8963#define MAKE_FIXED_TYPE_NODE_WIDTH(KIND,WIDTH,SIZE) \
06f0b99c 8964 sat_ ## WIDTH ## KIND ## _type_node = \
8965 make_sat_signed_ ## KIND ## _type (SIZE); \
8966 sat_unsigned_ ## WIDTH ## KIND ## _type_node = \
8967 make_sat_unsigned_ ## KIND ## _type (SIZE); \
8968 WIDTH ## KIND ## _type_node = make_signed_ ## KIND ## _type (SIZE); \
8969 unsigned_ ## WIDTH ## KIND ## _type_node = \
8970 make_unsigned_ ## KIND ## _type (SIZE);
8971
8972/* Make fixed-point type nodes based on four different widths. */
8973#define MAKE_FIXED_TYPE_NODE_FAMILY(N1,N2) \
9f92e1a2 8974 MAKE_FIXED_TYPE_NODE_WIDTH (N1, short_, SHORT_ ## N2 ## _TYPE_SIZE) \
8975 MAKE_FIXED_TYPE_NODE (N1, N2 ## _TYPE_SIZE) \
8976 MAKE_FIXED_TYPE_NODE_WIDTH (N1, long_, LONG_ ## N2 ## _TYPE_SIZE) \
8977 MAKE_FIXED_TYPE_NODE_WIDTH (N1, long_long_, LONG_LONG_ ## N2 ## _TYPE_SIZE)
06f0b99c 8978
8979/* Make fixed-point mode nodes based on sat/non-sat and signed/unsigned. */
8980#define MAKE_FIXED_MODE_NODE(KIND,NAME,MODE) \
8981 NAME ## _type_node = \
8982 make_or_reuse_signed_ ## KIND ## _type (GET_MODE_BITSIZE (MODE ## mode)); \
8983 u ## NAME ## _type_node = \
8984 make_or_reuse_unsigned_ ## KIND ## _type \
8985 (GET_MODE_BITSIZE (U ## MODE ## mode)); \
8986 sat_ ## NAME ## _type_node = \
8987 make_or_reuse_sat_signed_ ## KIND ## _type \
8988 (GET_MODE_BITSIZE (MODE ## mode)); \
8989 sat_u ## NAME ## _type_node = \
8990 make_or_reuse_sat_unsigned_ ## KIND ## _type \
8991 (GET_MODE_BITSIZE (U ## MODE ## mode));
8992
8993 /* Fixed-point type and mode nodes. */
8994 MAKE_FIXED_TYPE_NODE_FAMILY (fract, FRACT)
8995 MAKE_FIXED_TYPE_NODE_FAMILY (accum, ACCUM)
8996 MAKE_FIXED_MODE_NODE (fract, qq, QQ)
8997 MAKE_FIXED_MODE_NODE (fract, hq, HQ)
8998 MAKE_FIXED_MODE_NODE (fract, sq, SQ)
8999 MAKE_FIXED_MODE_NODE (fract, dq, DQ)
9000 MAKE_FIXED_MODE_NODE (fract, tq, TQ)
9001 MAKE_FIXED_MODE_NODE (accum, ha, HA)
9002 MAKE_FIXED_MODE_NODE (accum, sa, SA)
9003 MAKE_FIXED_MODE_NODE (accum, da, DA)
9004 MAKE_FIXED_MODE_NODE (accum, ta, TA)
9005
36c543f3 9006 {
883b2e73 9007 tree t = targetm.build_builtin_va_list ();
28e67ee6 9008
917bbcab 9009 /* Many back-ends define record types without setting TYPE_NAME.
28e67ee6 9010 If we copied the record type here, we'd keep the original
9011 record type without a name. This breaks name mangling. So,
9012 don't copy record types and let c_common_nodes_and_builtins()
9013 declare the type to be __builtin_va_list. */
9014 if (TREE_CODE (t) != RECORD_TYPE)
e086912e 9015 t = build_variant_type_copy (t);
48e1416a 9016
28e67ee6 9017 va_list_type_node = t;
36c543f3 9018 }
88ae7f04 9019}
9020
9cfddb70 9021/* A subroutine of build_common_builtin_nodes. Define a builtin function. */
9022
9023static void
9024local_define_builtin (const char *name, tree type, enum built_in_function code,
9025 const char *library_name, int ecf_flags)
9026{
9027 tree decl;
9028
54be5d7e 9029 decl = add_builtin_function (name, type, code, BUILT_IN_NORMAL,
9030 library_name, NULL_TREE);
9cfddb70 9031 if (ecf_flags & ECF_CONST)
9032 TREE_READONLY (decl) = 1;
9033 if (ecf_flags & ECF_PURE)
9c2a0c05 9034 DECL_PURE_P (decl) = 1;
9035 if (ecf_flags & ECF_LOOPING_CONST_OR_PURE)
9036 DECL_LOOPING_CONST_OR_PURE_P (decl) = 1;
9cfddb70 9037 if (ecf_flags & ECF_NORETURN)
9038 TREE_THIS_VOLATILE (decl) = 1;
9039 if (ecf_flags & ECF_NOTHROW)
9040 TREE_NOTHROW (decl) = 1;
9041 if (ecf_flags & ECF_MALLOC)
9042 DECL_IS_MALLOC (decl) = 1;
9043
9044 built_in_decls[code] = decl;
9045 implicit_built_in_decls[code] = decl;
9046}
9047
9048/* Call this function after instantiating all builtins that the language
9049 front end cares about. This will build the rest of the builtins that
471eff36 9050 are relied upon by the tree optimizers and the middle-end. */
9cfddb70 9051
9052void
471eff36 9053build_common_builtin_nodes (void)
9cfddb70 9054{
e38def9c 9055 tree tmp, tmp2, ftype;
9cfddb70 9056
9057 if (built_in_decls[BUILT_IN_MEMCPY] == NULL
9058 || built_in_decls[BUILT_IN_MEMMOVE] == NULL)
9059 {
9060 tmp = tree_cons (NULL_TREE, size_type_node, void_list_node);
9061 tmp = tree_cons (NULL_TREE, const_ptr_type_node, tmp);
9062 tmp = tree_cons (NULL_TREE, ptr_type_node, tmp);
9063 ftype = build_function_type (ptr_type_node, tmp);
9064
9065 if (built_in_decls[BUILT_IN_MEMCPY] == NULL)
9066 local_define_builtin ("__builtin_memcpy", ftype, BUILT_IN_MEMCPY,
9067 "memcpy", ECF_NOTHROW);
9068 if (built_in_decls[BUILT_IN_MEMMOVE] == NULL)
9069 local_define_builtin ("__builtin_memmove", ftype, BUILT_IN_MEMMOVE,
9070 "memmove", ECF_NOTHROW);
9071 }
9072
9073 if (built_in_decls[BUILT_IN_MEMCMP] == NULL)
9074 {
9075 tmp = tree_cons (NULL_TREE, size_type_node, void_list_node);
9076 tmp = tree_cons (NULL_TREE, const_ptr_type_node, tmp);
9077 tmp = tree_cons (NULL_TREE, const_ptr_type_node, tmp);
a69ced9f 9078 ftype = build_function_type (integer_type_node, tmp);
9cfddb70 9079 local_define_builtin ("__builtin_memcmp", ftype, BUILT_IN_MEMCMP,
9080 "memcmp", ECF_PURE | ECF_NOTHROW);
9081 }
9082
9083 if (built_in_decls[BUILT_IN_MEMSET] == NULL)
9084 {
9085 tmp = tree_cons (NULL_TREE, size_type_node, void_list_node);
9086 tmp = tree_cons (NULL_TREE, integer_type_node, tmp);
9087 tmp = tree_cons (NULL_TREE, ptr_type_node, tmp);
9088 ftype = build_function_type (ptr_type_node, tmp);
9089 local_define_builtin ("__builtin_memset", ftype, BUILT_IN_MEMSET,
9090 "memset", ECF_NOTHROW);
9091 }
9092
9093 if (built_in_decls[BUILT_IN_ALLOCA] == NULL)
9094 {
9095 tmp = tree_cons (NULL_TREE, size_type_node, void_list_node);
9096 ftype = build_function_type (ptr_type_node, tmp);
9097 local_define_builtin ("__builtin_alloca", ftype, BUILT_IN_ALLOCA,
06a0401b 9098 "alloca", ECF_MALLOC | ECF_NOTHROW);
9cfddb70 9099 }
9100
06a0401b 9101 /* If we're checking the stack, `alloca' can throw. */
9102 if (flag_stack_check)
9103 TREE_NOTHROW (built_in_decls[BUILT_IN_ALLOCA]) = 0;
9104
9cfddb70 9105 tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
9106 tmp = tree_cons (NULL_TREE, ptr_type_node, tmp);
9107 tmp = tree_cons (NULL_TREE, ptr_type_node, tmp);
9108 ftype = build_function_type (void_type_node, tmp);
9109 local_define_builtin ("__builtin_init_trampoline", ftype,
9110 BUILT_IN_INIT_TRAMPOLINE,
9111 "__builtin_init_trampoline", ECF_NOTHROW);
9112
9113 tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
9114 ftype = build_function_type (ptr_type_node, tmp);
9115 local_define_builtin ("__builtin_adjust_trampoline", ftype,
9116 BUILT_IN_ADJUST_TRAMPOLINE,
9117 "__builtin_adjust_trampoline",
9118 ECF_CONST | ECF_NOTHROW);
9119
9120 tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
9121 tmp = tree_cons (NULL_TREE, ptr_type_node, tmp);
9122 ftype = build_function_type (void_type_node, tmp);
9123 local_define_builtin ("__builtin_nonlocal_goto", ftype,
9124 BUILT_IN_NONLOCAL_GOTO,
9125 "__builtin_nonlocal_goto",
9126 ECF_NORETURN | ECF_NOTHROW);
9127
2c8a1497 9128 tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
9129 tmp = tree_cons (NULL_TREE, ptr_type_node, tmp);
9130 ftype = build_function_type (void_type_node, tmp);
9131 local_define_builtin ("__builtin_setjmp_setup", ftype,
9132 BUILT_IN_SETJMP_SETUP,
9133 "__builtin_setjmp_setup", ECF_NOTHROW);
9134
9135 tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
9136 ftype = build_function_type (ptr_type_node, tmp);
9137 local_define_builtin ("__builtin_setjmp_dispatcher", ftype,
9138 BUILT_IN_SETJMP_DISPATCHER,
9139 "__builtin_setjmp_dispatcher",
9140 ECF_PURE | ECF_NOTHROW);
9141
9142 tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
9143 ftype = build_function_type (void_type_node, tmp);
9144 local_define_builtin ("__builtin_setjmp_receiver", ftype,
9145 BUILT_IN_SETJMP_RECEIVER,
9146 "__builtin_setjmp_receiver", ECF_NOTHROW);
9147
9cfddb70 9148 ftype = build_function_type (ptr_type_node, void_list_node);
9149 local_define_builtin ("__builtin_stack_save", ftype, BUILT_IN_STACK_SAVE,
9150 "__builtin_stack_save", ECF_NOTHROW);
9151
9152 tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
9153 ftype = build_function_type (void_type_node, tmp);
9154 local_define_builtin ("__builtin_stack_restore", ftype,
9155 BUILT_IN_STACK_RESTORE,
9156 "__builtin_stack_restore", ECF_NOTHROW);
9157
9158 ftype = build_function_type (void_type_node, void_list_node);
9159 local_define_builtin ("__builtin_profile_func_enter", ftype,
9160 BUILT_IN_PROFILE_FUNC_ENTER, "profile_func_enter", 0);
9161 local_define_builtin ("__builtin_profile_func_exit", ftype,
9162 BUILT_IN_PROFILE_FUNC_EXIT, "profile_func_exit", 0);
0dfc45b5 9163
471eff36 9164 /* If there's a possibility that we might use the ARM EABI, build the
9165 alternate __cxa_end_cleanup node used to resume from C++ and Java. */
9166 if (targetm.arm_eabi_unwinder)
e38def9c 9167 {
9168 ftype = build_function_type (void_type_node, void_list_node);
471eff36 9169 local_define_builtin ("__builtin_cxa_end_cleanup", ftype,
9170 BUILT_IN_CXA_END_CLEANUP,
e38def9c 9171 "__cxa_end_cleanup", ECF_NORETURN);
9172 }
471eff36 9173
9174 tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
9175 ftype = build_function_type (void_type_node, tmp);
9176 local_define_builtin ("__builtin_unwind_resume", ftype,
9177 BUILT_IN_UNWIND_RESUME,
9178 (USING_SJLJ_EXCEPTIONS
9179 ? "_Unwind_SjLj_Resume" : "_Unwind_Resume"),
9180 ECF_NORETURN);
e38def9c 9181
9182 /* The exception object and filter values from the runtime. The argument
9183 must be zero before exception lowering, i.e. from the front end. After
9184 exception lowering, it will be the region number for the exception
9185 landing pad. These functions are PURE instead of CONST to prevent
9186 them from being hoisted past the exception edge that will initialize
9187 its value in the landing pad. */
9188 tmp = tree_cons (NULL_TREE, integer_type_node, void_list_node);
9189 ftype = build_function_type (ptr_type_node, tmp);
9190 local_define_builtin ("__builtin_eh_pointer", ftype, BUILT_IN_EH_POINTER,
9191 "__builtin_eh_pointer", ECF_PURE | ECF_NOTHROW);
9192
9193 tmp2 = lang_hooks.types.type_for_mode (targetm.eh_return_filter_mode (), 0);
9194 ftype = build_function_type (tmp2, tmp);
9195 local_define_builtin ("__builtin_eh_filter", ftype, BUILT_IN_EH_FILTER,
9196 "__builtin_eh_filter", ECF_PURE | ECF_NOTHROW);
9197
9198 tmp = tree_cons (NULL_TREE, integer_type_node, void_list_node);
9199 tmp = tree_cons (NULL_TREE, integer_type_node, tmp);
9200 ftype = build_function_type (void_type_node, tmp);
9201 local_define_builtin ("__builtin_eh_copy_values", ftype,
9202 BUILT_IN_EH_COPY_VALUES,
9203 "__builtin_eh_copy_values", ECF_NOTHROW);
9204
0dfc45b5 9205 /* Complex multiplication and division. These are handled as builtins
9206 rather than optabs because emit_library_call_value doesn't support
48e1416a 9207 complex. Further, we can do slightly better with folding these
0dfc45b5 9208 beasties if the real and complex parts of the arguments are separate. */
9209 {
9f1b7d17 9210 int mode;
0dfc45b5 9211
9212 for (mode = MIN_MODE_COMPLEX_FLOAT; mode <= MAX_MODE_COMPLEX_FLOAT; ++mode)
9213 {
9214 char mode_name_buf[4], *q;
9215 const char *p;
9216 enum built_in_function mcode, dcode;
9217 tree type, inner_type;
9218
9f1b7d17 9219 type = lang_hooks.types.type_for_mode ((enum machine_mode) mode, 0);
0dfc45b5 9220 if (type == NULL)
9221 continue;
9222 inner_type = TREE_TYPE (type);
9223
9224 tmp = tree_cons (NULL_TREE, inner_type, void_list_node);
9225 tmp = tree_cons (NULL_TREE, inner_type, tmp);
9226 tmp = tree_cons (NULL_TREE, inner_type, tmp);
9227 tmp = tree_cons (NULL_TREE, inner_type, tmp);
9228 ftype = build_function_type (type, tmp);
9229
8458f4ca 9230 mcode = ((enum built_in_function)
9231 (BUILT_IN_COMPLEX_MUL_MIN + mode - MIN_MODE_COMPLEX_FLOAT));
9232 dcode = ((enum built_in_function)
9233 (BUILT_IN_COMPLEX_DIV_MIN + mode - MIN_MODE_COMPLEX_FLOAT));
0dfc45b5 9234
9235 for (p = GET_MODE_NAME (mode), q = mode_name_buf; *p; p++, q++)
9236 *q = TOLOWER (*p);
9237 *q = '\0';
9238
9239 built_in_names[mcode] = concat ("__mul", mode_name_buf, "3", NULL);
9240 local_define_builtin (built_in_names[mcode], ftype, mcode,
9241 built_in_names[mcode], ECF_CONST | ECF_NOTHROW);
9242
9243 built_in_names[dcode] = concat ("__div", mode_name_buf, "3", NULL);
9244 local_define_builtin (built_in_names[dcode], ftype, dcode,
9245 built_in_names[dcode], ECF_CONST | ECF_NOTHROW);
9246 }
9247 }
9cfddb70 9248}
9249
409a160c 9250/* HACK. GROSS. This is absolutely disgusting. I wish there was a
9251 better way.
9252
9253 If we requested a pointer to a vector, build up the pointers that
9254 we stripped off while looking for the inner type. Similarly for
9255 return values from functions.
9256
9257 The argument TYPE is the top of the chain, and BOTTOM is the
9258 new type which we will point to. */
9259
9260tree
9261reconstruct_complex_type (tree type, tree bottom)
9262{
9263 tree inner, outer;
48e1416a 9264
86369aa7 9265 if (TREE_CODE (type) == POINTER_TYPE)
9266 {
9267 inner = reconstruct_complex_type (TREE_TYPE (type), bottom);
9268 outer = build_pointer_type_for_mode (inner, TYPE_MODE (type),
9269 TYPE_REF_CAN_ALIAS_ALL (type));
9270 }
9271 else if (TREE_CODE (type) == REFERENCE_TYPE)
409a160c 9272 {
9273 inner = reconstruct_complex_type (TREE_TYPE (type), bottom);
86369aa7 9274 outer = build_reference_type_for_mode (inner, TYPE_MODE (type),
9275 TYPE_REF_CAN_ALIAS_ALL (type));
409a160c 9276 }
9277 else if (TREE_CODE (type) == ARRAY_TYPE)
9278 {
9279 inner = reconstruct_complex_type (TREE_TYPE (type), bottom);
9280 outer = build_array_type (inner, TYPE_DOMAIN (type));
9281 }
9282 else if (TREE_CODE (type) == FUNCTION_TYPE)
9283 {
9284 inner = reconstruct_complex_type (TREE_TYPE (type), bottom);
9285 outer = build_function_type (inner, TYPE_ARG_TYPES (type));
9286 }
9287 else if (TREE_CODE (type) == METHOD_TYPE)
9288 {
9289 inner = reconstruct_complex_type (TREE_TYPE (type), bottom);
c37ff371 9290 /* The build_method_type_directly() routine prepends 'this' to argument list,
9291 so we must compensate by getting rid of it. */
48e1416a 9292 outer
9293 = build_method_type_directly
3084bb6f 9294 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (type))),
9295 inner,
9296 TREE_CHAIN (TYPE_ARG_TYPES (type)));
409a160c 9297 }
2cb0e5d9 9298 else if (TREE_CODE (type) == OFFSET_TYPE)
9299 {
9300 inner = reconstruct_complex_type (TREE_TYPE (type), bottom);
9301 outer = build_offset_type (TYPE_OFFSET_BASETYPE (type), inner);
9302 }
409a160c 9303 else
9304 return bottom;
9305
1770a4b6 9306 return build_type_attribute_qual_variant (outer, TYPE_ATTRIBUTES (type),
9307 TYPE_QUALS (type));
409a160c 9308}
9309
83e2a11b 9310/* Returns a vector tree node given a mode (integer, vector, or BLKmode) and
9311 the inner type. */
409a160c 9312tree
4917c376 9313build_vector_type_for_mode (tree innertype, enum machine_mode mode)
88ae7f04 9314{
83e2a11b 9315 int nunits;
e19896a4 9316
8c0963c4 9317 switch (GET_MODE_CLASS (mode))
83e2a11b 9318 {
8c0963c4 9319 case MODE_VECTOR_INT:
9320 case MODE_VECTOR_FLOAT:
06f0b99c 9321 case MODE_VECTOR_FRACT:
9322 case MODE_VECTOR_UFRACT:
9323 case MODE_VECTOR_ACCUM:
9324 case MODE_VECTOR_UACCUM:
8c0963c4 9325 nunits = GET_MODE_NUNITS (mode);
9326 break;
9327
9328 case MODE_INT:
83e2a11b 9329 /* Check that there are no leftover bits. */
8c0963c4 9330 gcc_assert (GET_MODE_BITSIZE (mode)
9331 % TREE_INT_CST_LOW (TYPE_SIZE (innertype)) == 0);
4917c376 9332
83e2a11b 9333 nunits = GET_MODE_BITSIZE (mode)
9334 / TREE_INT_CST_LOW (TYPE_SIZE (innertype));
8c0963c4 9335 break;
9336
9337 default:
9338 gcc_unreachable ();
83e2a11b 9339 }
4917c376 9340
83e2a11b 9341 return make_vector_type (innertype, nunits, mode);
9342}
4917c376 9343
83e2a11b 9344/* Similarly, but takes the inner type and number of units, which must be
9345 a power of two. */
9346
9347tree
9348build_vector_type (tree innertype, int nunits)
9349{
9350 return make_vector_type (innertype, nunits, VOIDmode);
4917c376 9351}
9352
8d125f7d 9353/* Similarly, but takes the inner type and number of units, which must be
9354 a power of two. */
9355
9356tree
9357build_opaque_vector_type (tree innertype, int nunits)
9358{
9359 tree t;
9360 innertype = build_distinct_type_copy (innertype);
9361 t = make_vector_type (innertype, nunits, VOIDmode);
9362 TYPE_VECTOR_OPAQUE (t) = true;
9363 return t;
9364}
9365
b7d1b569 9366
e19896a4 9367/* Given an initializer INIT, return TRUE if INIT is zero or some
9368 aggregate of zeros. Otherwise return FALSE. */
e19896a4 9369bool
720082dc 9370initializer_zerop (const_tree init)
e19896a4 9371{
4ee9c684 9372 tree elt;
9373
e19896a4 9374 STRIP_NOPS (init);
9375
9376 switch (TREE_CODE (init))
9377 {
9378 case INTEGER_CST:
9379 return integer_zerop (init);
4ee9c684 9380
e19896a4 9381 case REAL_CST:
4ee9c684 9382 /* ??? Note that this is not correct for C4X float formats. There,
9383 a bit pattern of all zeros is 1.0; 0.0 is encoded with the most
9384 negative exponent. */
e19896a4 9385 return real_zerop (init)
9386 && ! REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (init));
4ee9c684 9387
06f0b99c 9388 case FIXED_CST:
9389 return fixed_zerop (init);
9390
e19896a4 9391 case COMPLEX_CST:
9392 return integer_zerop (init)
9393 || (real_zerop (init)
9394 && ! REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (TREE_REALPART (init)))
9395 && ! REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (TREE_IMAGPART (init))));
4ee9c684 9396
9397 case VECTOR_CST:
9398 for (elt = TREE_VECTOR_CST_ELTS (init); elt; elt = TREE_CHAIN (elt))
9399 if (!initializer_zerop (TREE_VALUE (elt)))
ead47c26 9400 return false;
4ee9c684 9401 return true;
ead47c26 9402
4ee9c684 9403 case CONSTRUCTOR:
c75b4594 9404 {
9405 unsigned HOST_WIDE_INT idx;
4ee9c684 9406
c75b4594 9407 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (init), idx, elt)
9408 if (!initializer_zerop (elt))
9409 return false;
9410 return true;
ea181df0 9411 }
9412
9413 case STRING_CST:
9414 {
9415 int i;
9416
9417 /* We need to loop through all elements to handle cases like
9418 "\0" and "\0foobar". */
9419 for (i = 0; i < TREE_STRING_LENGTH (init); ++i)
9420 if (TREE_STRING_POINTER (init)[i] != '\0')
9421 return false;
9422
9423 return true;
c75b4594 9424 }
4ee9c684 9425
e19896a4 9426 default:
9427 return false;
9428 }
9429}
1f3233d1 9430
e60a6f7b 9431/* Build an empty statement at location LOC. */
4ee9c684 9432
9433tree
e60a6f7b 9434build_empty_stmt (location_t loc)
4ee9c684 9435{
e60a6f7b 9436 tree t = build1 (NOP_EXPR, void_type_node, size_zero_node);
9437 SET_EXPR_LOCATION (t, loc);
9438 return t;
4ee9c684 9439}
9440
4ee9c684 9441
e60a6f7b 9442/* Build an OpenMP clause with code CODE. LOC is the location of the
9443 clause. */
55d6e7cd 9444
9445tree
e60a6f7b 9446build_omp_clause (location_t loc, enum omp_clause_code code)
55d6e7cd 9447{
9448 tree t;
9449 int size, length;
9450
9451 length = omp_clause_num_ops[code];
9452 size = (sizeof (struct tree_omp_clause) + (length - 1) * sizeof (tree));
9453
45ba1503 9454 t = GGC_NEWVAR (union tree_node, size);
55d6e7cd 9455 memset (t, 0, size);
9456 TREE_SET_CODE (t, OMP_CLAUSE);
9457 OMP_CLAUSE_SET_CODE (t, code);
e60a6f7b 9458 OMP_CLAUSE_LOCATION (t) = loc;
55d6e7cd 9459
9460#ifdef GATHER_STATISTICS
9461 tree_node_counts[(int) omp_clause_kind]++;
9462 tree_node_sizes[(int) omp_clause_kind] += size;
9463#endif
48e1416a 9464
55d6e7cd 9465 return t;
9466}
9467
c2f47e15 9468/* Build a tcc_vl_exp object with code CODE and room for LEN operands. LEN
9469 includes the implicit operand count in TREE_OPERAND 0, and so must be >= 1.
9470 Except for the CODE and operand count field, other storage for the
9471 object is initialized to zeros. */
9472
9473tree
9474build_vl_exp_stat (enum tree_code code, int len MEM_STAT_DECL)
9475{
9476 tree t;
9477 int length = (len - 1) * sizeof (tree) + sizeof (struct tree_exp);
9478
9479 gcc_assert (TREE_CODE_CLASS (code) == tcc_vl_exp);
9480 gcc_assert (len >= 1);
9481
9482#ifdef GATHER_STATISTICS
9483 tree_node_counts[(int) e_kind]++;
9484 tree_node_sizes[(int) e_kind] += length;
9485#endif
9486
45ba1503 9487 t = (tree) ggc_alloc_zone_pass_stat (length, &tree_zone);
c2f47e15 9488
9489 memset (t, 0, length);
9490
9491 TREE_SET_CODE (t, code);
9492
9493 /* Can't use TREE_OPERAND to store the length because if checking is
9494 enabled, it will try to check the length before we store it. :-P */
9495 t->exp.operands[0] = build_int_cst (sizetype, len);
9496
9497 return t;
9498}
9499
578fcce9 9500
9501/* Build a CALL_EXPR of class tcc_vl_exp with the indicated RETURN_TYPE
9502 and FN and a null static chain slot. ARGLIST is a TREE_LIST of the
9503 arguments. */
9504
9505tree
9506build_call_list (tree return_type, tree fn, tree arglist)
9507{
9508 tree t;
9509 int i;
9510
9511 t = build_vl_exp (CALL_EXPR, list_length (arglist) + 3);
9512 TREE_TYPE (t) = return_type;
9513 CALL_EXPR_FN (t) = fn;
9514 CALL_EXPR_STATIC_CHAIN (t) = NULL_TREE;
9515 for (i = 0; arglist; arglist = TREE_CHAIN (arglist), i++)
9516 CALL_EXPR_ARG (t, i) = TREE_VALUE (arglist);
9517 process_call_operands (t);
9518 return t;
9519}
9520
c2f47e15 9521/* Build a CALL_EXPR of class tcc_vl_exp with the indicated RETURN_TYPE and
9522 FN and a null static chain slot. NARGS is the number of call arguments
9523 which are specified as "..." arguments. */
9524
9525tree
9526build_call_nary (tree return_type, tree fn, int nargs, ...)
9527{
9528 tree ret;
9529 va_list args;
9530 va_start (args, nargs);
9531 ret = build_call_valist (return_type, fn, nargs, args);
9532 va_end (args);
9533 return ret;
9534}
9535
9536/* Build a CALL_EXPR of class tcc_vl_exp with the indicated RETURN_TYPE and
9537 FN and a null static chain slot. NARGS is the number of call arguments
9538 which are specified as a va_list ARGS. */
9539
9540tree
9541build_call_valist (tree return_type, tree fn, int nargs, va_list args)
9542{
9543 tree t;
9544 int i;
9545
9546 t = build_vl_exp (CALL_EXPR, nargs + 3);
9547 TREE_TYPE (t) = return_type;
9548 CALL_EXPR_FN (t) = fn;
9549 CALL_EXPR_STATIC_CHAIN (t) = NULL_TREE;
9550 for (i = 0; i < nargs; i++)
9551 CALL_EXPR_ARG (t, i) = va_arg (args, tree);
9552 process_call_operands (t);
9553 return t;
9554}
9555
9556/* Build a CALL_EXPR of class tcc_vl_exp with the indicated RETURN_TYPE and
9557 FN and a null static chain slot. NARGS is the number of call arguments
9558 which are specified as a tree array ARGS. */
9559
9560tree
389dd41b 9561build_call_array_loc (location_t loc, tree return_type, tree fn,
9562 int nargs, const tree *args)
c2f47e15 9563{
9564 tree t;
9565 int i;
9566
9567 t = build_vl_exp (CALL_EXPR, nargs + 3);
9568 TREE_TYPE (t) = return_type;
9569 CALL_EXPR_FN (t) = fn;
9570 CALL_EXPR_STATIC_CHAIN (t) = NULL_TREE;
9571 for (i = 0; i < nargs; i++)
9572 CALL_EXPR_ARG (t, i) = args[i];
9573 process_call_operands (t);
389dd41b 9574 SET_EXPR_LOCATION (t, loc);
c2f47e15 9575 return t;
9576}
9577
f352a3fb 9578/* Like build_call_array, but takes a VEC. */
9579
9580tree
9581build_call_vec (tree return_type, tree fn, VEC(tree,gc) *args)
9582{
9583 tree ret, t;
9584 unsigned int ix;
9585
9586 ret = build_vl_exp (CALL_EXPR, VEC_length (tree, args) + 3);
9587 TREE_TYPE (ret) = return_type;
9588 CALL_EXPR_FN (ret) = fn;
9589 CALL_EXPR_STATIC_CHAIN (ret) = NULL_TREE;
9590 for (ix = 0; VEC_iterate (tree, args, ix, t); ++ix)
9591 CALL_EXPR_ARG (ret, ix) = t;
9592 process_call_operands (ret);
9593 return ret;
9594}
9595
55d6e7cd 9596
7d23383d 9597/* Returns true if it is possible to prove that the index of
9598 an array access REF (an ARRAY_REF expression) falls into the
9599 array bounds. */
9600
9601bool
9602in_array_bounds_p (tree ref)
9603{
9604 tree idx = TREE_OPERAND (ref, 1);
9605 tree min, max;
9606
9607 if (TREE_CODE (idx) != INTEGER_CST)
9608 return false;
b27ac6b5 9609
7d23383d 9610 min = array_ref_low_bound (ref);
9611 max = array_ref_up_bound (ref);
9612 if (!min
9613 || !max
9614 || TREE_CODE (min) != INTEGER_CST
9615 || TREE_CODE (max) != INTEGER_CST)
9616 return false;
9617
9618 if (tree_int_cst_lt (idx, min)
9619 || tree_int_cst_lt (max, idx))
9620 return false;
9621
9622 return true;
9623}
9624
2100c228 9625/* Returns true if it is possible to prove that the range of
9626 an array access REF (an ARRAY_RANGE_REF expression) falls
9627 into the array bounds. */
9628
9629bool
9630range_in_array_bounds_p (tree ref)
9631{
9632 tree domain_type = TYPE_DOMAIN (TREE_TYPE (ref));
9633 tree range_min, range_max, min, max;
9634
9635 range_min = TYPE_MIN_VALUE (domain_type);
9636 range_max = TYPE_MAX_VALUE (domain_type);
9637 if (!range_min
9638 || !range_max
9639 || TREE_CODE (range_min) != INTEGER_CST
9640 || TREE_CODE (range_max) != INTEGER_CST)
9641 return false;
9642
9643 min = array_ref_low_bound (ref);
9644 max = array_ref_up_bound (ref);
9645 if (!min
9646 || !max
9647 || TREE_CODE (min) != INTEGER_CST
9648 || TREE_CODE (max) != INTEGER_CST)
9649 return false;
9650
9651 if (tree_int_cst_lt (range_min, min)
9652 || tree_int_cst_lt (max, range_max))
9653 return false;
9654
9655 return true;
9656}
9657
4ee9c684 9658/* Return true if T (assumed to be a DECL) must be assigned a memory
9659 location. */
9660
9661bool
fb80456a 9662needs_to_live_in_memory (const_tree t)
4ee9c684 9663{
de6ed584 9664 if (TREE_CODE (t) == SSA_NAME)
9665 t = SSA_NAME_VAR (t);
9666
2ce91ad7 9667 return (TREE_ADDRESSABLE (t)
9668 || is_global_var (t)
4ee9c684 9669 || (TREE_CODE (t) == RESULT_DECL
94e6573f 9670 && aggregate_value_p (t, current_function_decl)));
4ee9c684 9671}
9672
504d3463 9673/* There are situations in which a language considers record types
9674 compatible which have different field lists. Decide if two fields
9675 are compatible. It is assumed that the parent records are compatible. */
9676
9677bool
5d1b319b 9678fields_compatible_p (const_tree f1, const_tree f2)
504d3463 9679{
9680 if (!operand_equal_p (DECL_FIELD_BIT_OFFSET (f1),
9681 DECL_FIELD_BIT_OFFSET (f2), OEP_ONLY_CONST))
9682 return false;
9683
9684 if (!operand_equal_p (DECL_FIELD_OFFSET (f1),
9685 DECL_FIELD_OFFSET (f2), OEP_ONLY_CONST))
9686 return false;
9687
c8ca3ee7 9688 if (!types_compatible_p (TREE_TYPE (f1), TREE_TYPE (f2)))
b27ac6b5 9689 return false;
504d3463 9690
9691 return true;
9692}
9693
9694/* Locate within RECORD a field that is compatible with ORIG_FIELD. */
9695
9696tree
9697find_compatible_field (tree record, tree orig_field)
9698{
9699 tree f;
9700
9701 for (f = TYPE_FIELDS (record); f ; f = TREE_CHAIN (f))
9702 if (TREE_CODE (f) == FIELD_DECL
9703 && fields_compatible_p (f, orig_field))
9704 return f;
9705
9706 /* ??? Why isn't this on the main fields list? */
9707 f = TYPE_VFIELD (record);
9708 if (f && TREE_CODE (f) == FIELD_DECL
9709 && fields_compatible_p (f, orig_field))
9710 return f;
9711
9712 /* ??? We should abort here, but Java appears to do Bad Things
9713 with inherited fields. */
9714 return orig_field;
9715}
9716
c782188f 9717/* Return value of a constant X and sign-extend it. */
2146e26d 9718
9719HOST_WIDE_INT
720082dc 9720int_cst_value (const_tree x)
2146e26d 9721{
9722 unsigned bits = TYPE_PRECISION (TREE_TYPE (x));
9723 unsigned HOST_WIDE_INT val = TREE_INT_CST_LOW (x);
2146e26d 9724
c782188f 9725 /* Make sure the sign-extended value will fit in a HOST_WIDE_INT. */
9726 gcc_assert (TREE_INT_CST_HIGH (x) == 0
9727 || TREE_INT_CST_HIGH (x) == -1);
2146e26d 9728
c782188f 9729 if (bits < HOST_BITS_PER_WIDE_INT)
9730 {
9731 bool negative = ((val >> (bits - 1)) & 1) != 0;
9732 if (negative)
9733 val |= (~(unsigned HOST_WIDE_INT) 0) << (bits - 1) << 1;
9734 else
9735 val &= ~((~(unsigned HOST_WIDE_INT) 0) << (bits - 1) << 1);
9736 }
2146e26d 9737
9738 return val;
9739}
9740
84cc784c 9741/* Return value of a constant X and sign-extend it. */
9742
9743HOST_WIDEST_INT
9744widest_int_cst_value (const_tree x)
9745{
9746 unsigned bits = TYPE_PRECISION (TREE_TYPE (x));
9747 unsigned HOST_WIDEST_INT val = TREE_INT_CST_LOW (x);
9748
9749#if HOST_BITS_PER_WIDEST_INT > HOST_BITS_PER_WIDE_INT
9750 gcc_assert (HOST_BITS_PER_WIDEST_INT >= 2 * HOST_BITS_PER_WIDE_INT);
c6f3d74f 9751 val |= (((unsigned HOST_WIDEST_INT) TREE_INT_CST_HIGH (x))
9752 << HOST_BITS_PER_WIDE_INT);
84cc784c 9753#else
9754 /* Make sure the sign-extended value will fit in a HOST_WIDE_INT. */
9755 gcc_assert (TREE_INT_CST_HIGH (x) == 0
9756 || TREE_INT_CST_HIGH (x) == -1);
9757#endif
9758
9759 if (bits < HOST_BITS_PER_WIDEST_INT)
9760 {
9761 bool negative = ((val >> (bits - 1)) & 1) != 0;
9762 if (negative)
9763 val |= (~(unsigned HOST_WIDEST_INT) 0) << (bits - 1) << 1;
9764 else
9765 val &= ~((~(unsigned HOST_WIDEST_INT) 0) << (bits - 1) << 1);
9766 }
9767
9768 return val;
9769}
9770
11773141 9771/* If TYPE is an integral type, return an equivalent type which is
9772 unsigned iff UNSIGNEDP is true. If TYPE is not an integral type,
9773 return TYPE itself. */
504d3463 9774
11773141 9775tree
9776signed_or_unsigned_type_for (int unsignedp, tree type)
71eea85c 9777{
11773141 9778 tree t = type;
9779 if (POINTER_TYPE_P (type))
98155838 9780 {
9781 /* If the pointer points to the normal address space, use the
9782 size_type_node. Otherwise use an appropriate size for the pointer
9783 based on the named address space it points to. */
9784 if (!TYPE_ADDR_SPACE (TREE_TYPE (t)))
9785 t = size_type_node;
98155838 9786 else
aaf45dfe 9787 return lang_hooks.types.type_for_size (TYPE_PRECISION (t), unsignedp);
98155838 9788 }
11773141 9789
9790 if (!INTEGRAL_TYPE_P (t) || TYPE_UNSIGNED (t) == unsignedp)
9791 return t;
48e1416a 9792
11773141 9793 return lang_hooks.types.type_for_size (TYPE_PRECISION (t), unsignedp);
71eea85c 9794}
9795
dbc64c75 9796/* Returns unsigned variant of TYPE. */
9797
9798tree
9799unsigned_type_for (tree type)
9800{
11773141 9801 return signed_or_unsigned_type_for (1, type);
dbc64c75 9802}
9803
9804/* Returns signed variant of TYPE. */
9805
9806tree
9807signed_type_for (tree type)
9808{
11773141 9809 return signed_or_unsigned_type_for (0, type);
dbc64c75 9810}
9811
faab57e3 9812/* Returns the largest value obtainable by casting something in INNER type to
9813 OUTER type. */
9814
9815tree
9816upper_bound_in_type (tree outer, tree inner)
9817{
9818 unsigned HOST_WIDE_INT lo, hi;
59653f01 9819 unsigned int det = 0;
9820 unsigned oprec = TYPE_PRECISION (outer);
9821 unsigned iprec = TYPE_PRECISION (inner);
9822 unsigned prec;
9823
9824 /* Compute a unique number for every combination. */
9825 det |= (oprec > iprec) ? 4 : 0;
9826 det |= TYPE_UNSIGNED (outer) ? 2 : 0;
9827 det |= TYPE_UNSIGNED (inner) ? 1 : 0;
9828
9829 /* Determine the exponent to use. */
9830 switch (det)
9831 {
9832 case 0:
9833 case 1:
9834 /* oprec <= iprec, outer: signed, inner: don't care. */
9835 prec = oprec - 1;
9836 break;
9837 case 2:
9838 case 3:
9839 /* oprec <= iprec, outer: unsigned, inner: don't care. */
9840 prec = oprec;
9841 break;
9842 case 4:
9843 /* oprec > iprec, outer: signed, inner: signed. */
9844 prec = iprec - 1;
9845 break;
9846 case 5:
9847 /* oprec > iprec, outer: signed, inner: unsigned. */
9848 prec = iprec;
9849 break;
9850 case 6:
9851 /* oprec > iprec, outer: unsigned, inner: signed. */
9852 prec = oprec;
9853 break;
9854 case 7:
9855 /* oprec > iprec, outer: unsigned, inner: unsigned. */
9856 prec = iprec;
9857 break;
9858 default:
9859 gcc_unreachable ();
9860 }
faab57e3 9861
59653f01 9862 /* Compute 2^^prec - 1. */
9863 if (prec <= HOST_BITS_PER_WIDE_INT)
faab57e3 9864 {
59653f01 9865 hi = 0;
9866 lo = ((~(unsigned HOST_WIDE_INT) 0)
9867 >> (HOST_BITS_PER_WIDE_INT - prec));
faab57e3 9868 }
9869 else
9870 {
59653f01 9871 hi = ((~(unsigned HOST_WIDE_INT) 0)
9872 >> (2 * HOST_BITS_PER_WIDE_INT - prec));
9873 lo = ~(unsigned HOST_WIDE_INT) 0;
faab57e3 9874 }
9875
59653f01 9876 return build_int_cst_wide (outer, lo, hi);
faab57e3 9877}
9878
9879/* Returns the smallest value obtainable by casting something in INNER type to
9880 OUTER type. */
9881
9882tree
9883lower_bound_in_type (tree outer, tree inner)
9884{
9885 unsigned HOST_WIDE_INT lo, hi;
59653f01 9886 unsigned oprec = TYPE_PRECISION (outer);
9887 unsigned iprec = TYPE_PRECISION (inner);
9888
9889 /* If OUTER type is unsigned, we can definitely cast 0 to OUTER type
9890 and obtain 0. */
9891 if (TYPE_UNSIGNED (outer)
9892 /* If we are widening something of an unsigned type, OUTER type
9893 contains all values of INNER type. In particular, both INNER
9894 and OUTER types have zero in common. */
9895 || (oprec > iprec && TYPE_UNSIGNED (inner)))
faab57e3 9896 lo = hi = 0;
faab57e3 9897 else
9898 {
59653f01 9899 /* If we are widening a signed type to another signed type, we
9900 want to obtain -2^^(iprec-1). If we are keeping the
9901 precision or narrowing to a signed type, we want to obtain
9902 -2^(oprec-1). */
9903 unsigned prec = oprec > iprec ? iprec : oprec;
9904
9905 if (prec <= HOST_BITS_PER_WIDE_INT)
9906 {
9907 hi = ~(unsigned HOST_WIDE_INT) 0;
9908 lo = (~(unsigned HOST_WIDE_INT) 0) << (prec - 1);
9909 }
9910 else
9911 {
9912 hi = ((~(unsigned HOST_WIDE_INT) 0)
9913 << (prec - HOST_BITS_PER_WIDE_INT - 1));
9914 lo = 0;
9915 }
faab57e3 9916 }
9917
59653f01 9918 return build_int_cst_wide (outer, lo, hi);
faab57e3 9919}
9920
5373158f 9921/* Return nonzero if two operands that are suitable for PHI nodes are
9922 necessarily equal. Specifically, both ARG0 and ARG1 must be either
9923 SSA_NAME or invariant. Note that this is strictly an optimization.
9924 That is, callers of this function can directly call operand_equal_p
9925 and get the same result, only slower. */
9926
9927int
b7bf20db 9928operand_equal_for_phi_arg_p (const_tree arg0, const_tree arg1)
5373158f 9929{
9930 if (arg0 == arg1)
9931 return 1;
9932 if (TREE_CODE (arg0) == SSA_NAME || TREE_CODE (arg1) == SSA_NAME)
9933 return 0;
9934 return operand_equal_p (arg0, arg1, 0);
9935}
9936
b091dc59 9937/* Returns number of zeros at the end of binary representation of X.
48e1416a 9938
b091dc59 9939 ??? Use ffs if available? */
9940
9941tree
720082dc 9942num_ending_zeros (const_tree x)
b091dc59 9943{
9944 unsigned HOST_WIDE_INT fr, nfr;
9945 unsigned num, abits;
9946 tree type = TREE_TYPE (x);
9947
9948 if (TREE_INT_CST_LOW (x) == 0)
9949 {
9950 num = HOST_BITS_PER_WIDE_INT;
9951 fr = TREE_INT_CST_HIGH (x);
9952 }
9953 else
9954 {
9955 num = 0;
9956 fr = TREE_INT_CST_LOW (x);
9957 }
9958
9959 for (abits = HOST_BITS_PER_WIDE_INT / 2; abits; abits /= 2)
9960 {
9961 nfr = fr >> abits;
9962 if (nfr << abits == fr)
9963 {
9964 num += abits;
9965 fr = nfr;
9966 }
9967 }
9968
9969 if (num > TYPE_PRECISION (type))
9970 num = TYPE_PRECISION (type);
9971
9972 return build_int_cst_type (type, num);
9973}
9974
98f8a662 9975
9976#define WALK_SUBTREE(NODE) \
9977 do \
9978 { \
20a8f962 9979 result = walk_tree_1 (&(NODE), func, data, pset, lh); \
98f8a662 9980 if (result) \
9981 return result; \
9982 } \
9983 while (0)
9984
9985/* This is a subroutine of walk_tree that walks field of TYPE that are to
9986 be walked whenever a type is seen in the tree. Rest of operands and return
9987 value are as for walk_tree. */
9988
9989static tree
9990walk_type_fields (tree type, walk_tree_fn func, void *data,
20a8f962 9991 struct pointer_set_t *pset, walk_tree_lh lh)
98f8a662 9992{
9993 tree result = NULL_TREE;
9994
9995 switch (TREE_CODE (type))
9996 {
9997 case POINTER_TYPE:
9998 case REFERENCE_TYPE:
9999 /* We have to worry about mutually recursive pointers. These can't
10000 be written in C. They can in Ada. It's pathological, but
10001 there's an ACATS test (c38102a) that checks it. Deal with this
10002 by checking if we're pointing to another pointer, that one
10003 points to another pointer, that one does too, and we have no htab.
10004 If so, get a hash table. We check three levels deep to avoid
10005 the cost of the hash table if we don't need one. */
10006 if (POINTER_TYPE_P (TREE_TYPE (type))
10007 && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (type)))
10008 && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (TREE_TYPE (type))))
10009 && !pset)
10010 {
10011 result = walk_tree_without_duplicates (&TREE_TYPE (type),
10012 func, data);
10013 if (result)
10014 return result;
10015
10016 break;
10017 }
10018
10019 /* ... fall through ... */
10020
10021 case COMPLEX_TYPE:
10022 WALK_SUBTREE (TREE_TYPE (type));
10023 break;
10024
10025 case METHOD_TYPE:
10026 WALK_SUBTREE (TYPE_METHOD_BASETYPE (type));
10027
10028 /* Fall through. */
10029
10030 case FUNCTION_TYPE:
10031 WALK_SUBTREE (TREE_TYPE (type));
10032 {
10033 tree arg;
10034
10035 /* We never want to walk into default arguments. */
10036 for (arg = TYPE_ARG_TYPES (type); arg; arg = TREE_CHAIN (arg))
10037 WALK_SUBTREE (TREE_VALUE (arg));
10038 }
10039 break;
10040
10041 case ARRAY_TYPE:
6783c055 10042 /* Don't follow this nodes's type if a pointer for fear that
10043 we'll have infinite recursion. If we have a PSET, then we
10044 need not fear. */
10045 if (pset
10046 || (!POINTER_TYPE_P (TREE_TYPE (type))
10047 && TREE_CODE (TREE_TYPE (type)) != OFFSET_TYPE))
98f8a662 10048 WALK_SUBTREE (TREE_TYPE (type));
10049 WALK_SUBTREE (TYPE_DOMAIN (type));
10050 break;
10051
98f8a662 10052 case OFFSET_TYPE:
10053 WALK_SUBTREE (TREE_TYPE (type));
10054 WALK_SUBTREE (TYPE_OFFSET_BASETYPE (type));
10055 break;
10056
10057 default:
10058 break;
10059 }
10060
10061 return NULL_TREE;
10062}
10063
10064/* Apply FUNC to all the sub-trees of TP in a pre-order traversal. FUNC is
10065 called with the DATA and the address of each sub-tree. If FUNC returns a
1fa3a8f6 10066 non-NULL value, the traversal is stopped, and the value returned by FUNC
98f8a662 10067 is returned. If PSET is non-NULL it is used to record the nodes visited,
10068 and to avoid visiting a node more than once. */
10069
10070tree
20a8f962 10071walk_tree_1 (tree *tp, walk_tree_fn func, void *data,
10072 struct pointer_set_t *pset, walk_tree_lh lh)
98f8a662 10073{
10074 enum tree_code code;
10075 int walk_subtrees;
10076 tree result;
10077
10078#define WALK_SUBTREE_TAIL(NODE) \
10079 do \
10080 { \
10081 tp = & (NODE); \
10082 goto tail_recurse; \
10083 } \
10084 while (0)
10085
10086 tail_recurse:
10087 /* Skip empty subtrees. */
10088 if (!*tp)
10089 return NULL_TREE;
10090
10091 /* Don't walk the same tree twice, if the user has requested
10092 that we avoid doing so. */
10093 if (pset && pointer_set_insert (pset, *tp))
10094 return NULL_TREE;
10095
10096 /* Call the function. */
10097 walk_subtrees = 1;
10098 result = (*func) (tp, &walk_subtrees, data);
10099
10100 /* If we found something, return it. */
10101 if (result)
10102 return result;
10103
10104 code = TREE_CODE (*tp);
10105
10106 /* Even if we didn't, FUNC may have decided that there was nothing
10107 interesting below this point in the tree. */
10108 if (!walk_subtrees)
10109 {
1e8e9920 10110 /* But we still need to check our siblings. */
98f8a662 10111 if (code == TREE_LIST)
98f8a662 10112 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
55d6e7cd 10113 else if (code == OMP_CLAUSE)
1e8e9920 10114 WALK_SUBTREE_TAIL (OMP_CLAUSE_CHAIN (*tp));
98f8a662 10115 else
10116 return NULL_TREE;
10117 }
10118
20a8f962 10119 if (lh)
10120 {
10121 result = (*lh) (tp, &walk_subtrees, func, data, pset);
10122 if (result || !walk_subtrees)
10123 return result;
10124 }
98f8a662 10125
1e8e9920 10126 switch (code)
98f8a662 10127 {
1e8e9920 10128 case ERROR_MARK:
10129 case IDENTIFIER_NODE:
10130 case INTEGER_CST:
10131 case REAL_CST:
06f0b99c 10132 case FIXED_CST:
1e8e9920 10133 case VECTOR_CST:
10134 case STRING_CST:
10135 case BLOCK:
10136 case PLACEHOLDER_EXPR:
10137 case SSA_NAME:
10138 case FIELD_DECL:
10139 case RESULT_DECL:
10140 /* None of these have subtrees other than those already walked
10141 above. */
10142 break;
98f8a662 10143
1e8e9920 10144 case TREE_LIST:
10145 WALK_SUBTREE (TREE_VALUE (*tp));
10146 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
10147 break;
98f8a662 10148
1e8e9920 10149 case TREE_VEC:
10150 {
10151 int len = TREE_VEC_LENGTH (*tp);
98f8a662 10152
1e8e9920 10153 if (len == 0)
10154 break;
98f8a662 10155
1e8e9920 10156 /* Walk all elements but the first. */
10157 while (--len)
10158 WALK_SUBTREE (TREE_VEC_ELT (*tp, len));
98f8a662 10159
1e8e9920 10160 /* Now walk the first one as a tail call. */
10161 WALK_SUBTREE_TAIL (TREE_VEC_ELT (*tp, 0));
10162 }
98f8a662 10163
1e8e9920 10164 case COMPLEX_CST:
10165 WALK_SUBTREE (TREE_REALPART (*tp));
10166 WALK_SUBTREE_TAIL (TREE_IMAGPART (*tp));
98f8a662 10167
1e8e9920 10168 case CONSTRUCTOR:
10169 {
10170 unsigned HOST_WIDE_INT idx;
10171 constructor_elt *ce;
98f8a662 10172
1e8e9920 10173 for (idx = 0;
10174 VEC_iterate(constructor_elt, CONSTRUCTOR_ELTS (*tp), idx, ce);
10175 idx++)
10176 WALK_SUBTREE (ce->value);
10177 }
10178 break;
98f8a662 10179
1e8e9920 10180 case SAVE_EXPR:
10181 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, 0));
98f8a662 10182
1e8e9920 10183 case BIND_EXPR:
10184 {
10185 tree decl;
10186 for (decl = BIND_EXPR_VARS (*tp); decl; decl = TREE_CHAIN (decl))
98f8a662 10187 {
1e8e9920 10188 /* Walk the DECL_INITIAL and DECL_SIZE. We don't want to walk
10189 into declarations that are just mentioned, rather than
10190 declared; they don't really belong to this part of the tree.
10191 And, we can see cycles: the initializer for a declaration
10192 can refer to the declaration itself. */
10193 WALK_SUBTREE (DECL_INITIAL (decl));
10194 WALK_SUBTREE (DECL_SIZE (decl));
10195 WALK_SUBTREE (DECL_SIZE_UNIT (decl));
10196 }
10197 WALK_SUBTREE_TAIL (BIND_EXPR_BODY (*tp));
10198 }
98f8a662 10199
1e8e9920 10200 case STATEMENT_LIST:
10201 {
10202 tree_stmt_iterator i;
10203 for (i = tsi_start (*tp); !tsi_end_p (i); tsi_next (&i))
10204 WALK_SUBTREE (*tsi_stmt_ptr (i));
10205 }
10206 break;
98f8a662 10207
55d6e7cd 10208 case OMP_CLAUSE:
10209 switch (OMP_CLAUSE_CODE (*tp))
10210 {
10211 case OMP_CLAUSE_PRIVATE:
10212 case OMP_CLAUSE_SHARED:
10213 case OMP_CLAUSE_FIRSTPRIVATE:
55d6e7cd 10214 case OMP_CLAUSE_COPYIN:
10215 case OMP_CLAUSE_COPYPRIVATE:
10216 case OMP_CLAUSE_IF:
10217 case OMP_CLAUSE_NUM_THREADS:
10218 case OMP_CLAUSE_SCHEDULE:
10219 WALK_SUBTREE (OMP_CLAUSE_OPERAND (*tp, 0));
10220 /* FALLTHRU */
10221
10222 case OMP_CLAUSE_NOWAIT:
10223 case OMP_CLAUSE_ORDERED:
10224 case OMP_CLAUSE_DEFAULT:
fd6481cf 10225 case OMP_CLAUSE_UNTIED:
55d6e7cd 10226 WALK_SUBTREE_TAIL (OMP_CLAUSE_CHAIN (*tp));
10227
fd6481cf 10228 case OMP_CLAUSE_LASTPRIVATE:
10229 WALK_SUBTREE (OMP_CLAUSE_DECL (*tp));
10230 WALK_SUBTREE (OMP_CLAUSE_LASTPRIVATE_STMT (*tp));
10231 WALK_SUBTREE_TAIL (OMP_CLAUSE_CHAIN (*tp));
10232
10233 case OMP_CLAUSE_COLLAPSE:
10234 {
10235 int i;
10236 for (i = 0; i < 3; i++)
10237 WALK_SUBTREE (OMP_CLAUSE_OPERAND (*tp, i));
10238 WALK_SUBTREE_TAIL (OMP_CLAUSE_CHAIN (*tp));
10239 }
10240
55d6e7cd 10241 case OMP_CLAUSE_REDUCTION:
10242 {
10243 int i;
10244 for (i = 0; i < 4; i++)
10245 WALK_SUBTREE (OMP_CLAUSE_OPERAND (*tp, i));
10246 WALK_SUBTREE_TAIL (OMP_CLAUSE_CHAIN (*tp));
10247 }
10248
10249 default:
10250 gcc_unreachable ();
10251 }
10252 break;
98f8a662 10253
1e8e9920 10254 case TARGET_EXPR:
10255 {
10256 int i, len;
10257
10258 /* TARGET_EXPRs are peculiar: operands 1 and 3 can be the same.
10259 But, we only want to walk once. */
10260 len = (TREE_OPERAND (*tp, 3) == TREE_OPERAND (*tp, 1)) ? 2 : 3;
10261 for (i = 0; i < len; ++i)
10262 WALK_SUBTREE (TREE_OPERAND (*tp, i));
10263 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, len));
10264 }
98f8a662 10265
1e8e9920 10266 case DECL_EXPR:
89c5cfdc 10267 /* If this is a TYPE_DECL, walk into the fields of the type that it's
10268 defining. We only want to walk into these fields of a type in this
10269 case and not in the general case of a mere reference to the type.
10270
10271 The criterion is as follows: if the field can be an expression, it
10272 must be walked only here. This should be in keeping with the fields
10273 that are directly gimplified in gimplify_type_sizes in order for the
10274 mark/copy-if-shared/unmark machinery of the gimplifier to work with
10275 variable-sized types.
48e1416a 10276
89c5cfdc 10277 Note that DECLs get walked as part of processing the BIND_EXPR. */
10278 if (TREE_CODE (DECL_EXPR_DECL (*tp)) == TYPE_DECL)
1e8e9920 10279 {
10280 tree *type_p = &TREE_TYPE (DECL_EXPR_DECL (*tp));
89c5cfdc 10281 if (TREE_CODE (*type_p) == ERROR_MARK)
10282 return NULL_TREE;
c75b4594 10283
1e8e9920 10284 /* Call the function for the type. See if it returns anything or
10285 doesn't want us to continue. If we are to continue, walk both
10286 the normal fields and those for the declaration case. */
10287 result = (*func) (type_p, &walk_subtrees, data);
10288 if (result || !walk_subtrees)
89c5cfdc 10289 return result;
98f8a662 10290
20a8f962 10291 result = walk_type_fields (*type_p, func, data, pset, lh);
1e8e9920 10292 if (result)
10293 return result;
98f8a662 10294
1e8e9920 10295 /* If this is a record type, also walk the fields. */
7bfefa9d 10296 if (RECORD_OR_UNION_TYPE_P (*type_p))
1e8e9920 10297 {
10298 tree field;
98f8a662 10299
1e8e9920 10300 for (field = TYPE_FIELDS (*type_p); field;
10301 field = TREE_CHAIN (field))
10302 {
10303 /* We'd like to look at the type of the field, but we can
10304 easily get infinite recursion. So assume it's pointed
10305 to elsewhere in the tree. Also, ignore things that
10306 aren't fields. */
10307 if (TREE_CODE (field) != FIELD_DECL)
10308 continue;
10309
10310 WALK_SUBTREE (DECL_FIELD_OFFSET (field));
10311 WALK_SUBTREE (DECL_SIZE (field));
10312 WALK_SUBTREE (DECL_SIZE_UNIT (field));
10313 if (TREE_CODE (*type_p) == QUAL_UNION_TYPE)
10314 WALK_SUBTREE (DECL_QUALIFIER (field));
10315 }
10316 }
98f8a662 10317
89c5cfdc 10318 /* Same for scalar types. */
10319 else if (TREE_CODE (*type_p) == BOOLEAN_TYPE
10320 || TREE_CODE (*type_p) == ENUMERAL_TYPE
10321 || TREE_CODE (*type_p) == INTEGER_TYPE
06f0b99c 10322 || TREE_CODE (*type_p) == FIXED_POINT_TYPE
89c5cfdc 10323 || TREE_CODE (*type_p) == REAL_TYPE)
10324 {
10325 WALK_SUBTREE (TYPE_MIN_VALUE (*type_p));
10326 WALK_SUBTREE (TYPE_MAX_VALUE (*type_p));
10327 }
10328
1e8e9920 10329 WALK_SUBTREE (TYPE_SIZE (*type_p));
10330 WALK_SUBTREE_TAIL (TYPE_SIZE_UNIT (*type_p));
98f8a662 10331 }
1e8e9920 10332 /* FALLTHRU */
10333
10334 default:
75a70cf9 10335 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
1e8e9920 10336 {
10337 int i, len;
10338
10339 /* Walk over all the sub-trees of this operand. */
c2f47e15 10340 len = TREE_OPERAND_LENGTH (*tp);
1e8e9920 10341
10342 /* Go through the subtrees. We need to do this in forward order so
10343 that the scope of a FOR_EXPR is handled properly. */
10344 if (len)
10345 {
10346 for (i = 0; i < len - 1; ++i)
75a70cf9 10347 WALK_SUBTREE (TREE_OPERAND (*tp, i));
10348 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, len - 1));
1e8e9920 10349 }
10350 }
1e8e9920 10351 /* If this is a type, walk the needed fields in the type. */
10352 else if (TYPE_P (*tp))
20a8f962 10353 return walk_type_fields (*tp, func, data, pset, lh);
1e8e9920 10354 break;
98f8a662 10355 }
10356
10357 /* We didn't find what we were looking for. */
10358 return NULL_TREE;
10359
10360#undef WALK_SUBTREE_TAIL
10361}
10362#undef WALK_SUBTREE
10363
10364/* Like walk_tree, but does not walk duplicate nodes more than once. */
10365
10366tree
20a8f962 10367walk_tree_without_duplicates_1 (tree *tp, walk_tree_fn func, void *data,
10368 walk_tree_lh lh)
98f8a662 10369{
10370 tree result;
10371 struct pointer_set_t *pset;
10372
10373 pset = pointer_set_create ();
20a8f962 10374 result = walk_tree_1 (tp, func, data, pset, lh);
98f8a662 10375 pointer_set_destroy (pset);
10376 return result;
10377}
10378
1e8e9920 10379
35cc02b5 10380tree *
10381tree_block (tree t)
10382{
10383 char const c = TREE_CODE_CLASS (TREE_CODE (t));
10384
10385 if (IS_EXPR_CODE_CLASS (c))
10386 return &t->exp.block;
35cc02b5 10387 gcc_unreachable ();
10388 return NULL;
10389}
10390
e60a6f7b 10391/* Create a nameless artificial label and put it in the current
10392 function context. The label has a location of LOC. Returns the
10393 newly created label. */
75a70cf9 10394
10395tree
e60a6f7b 10396create_artificial_label (location_t loc)
75a70cf9 10397{
e60a6f7b 10398 tree lab = build_decl (loc,
10399 LABEL_DECL, NULL_TREE, void_type_node);
75a70cf9 10400
10401 DECL_ARTIFICIAL (lab) = 1;
10402 DECL_IGNORED_P (lab) = 1;
10403 DECL_CONTEXT (lab) = current_function_decl;
10404 return lab;
10405}
10406
10407/* Given a tree, try to return a useful variable name that we can use
10408 to prefix a temporary that is being assigned the value of the tree.
10409 I.E. given <temp> = &A, return A. */
10410
10411const char *
10412get_name (tree t)
10413{
10414 tree stripped_decl;
10415
10416 stripped_decl = t;
10417 STRIP_NOPS (stripped_decl);
10418 if (DECL_P (stripped_decl) && DECL_NAME (stripped_decl))
10419 return IDENTIFIER_POINTER (DECL_NAME (stripped_decl));
10420 else
10421 {
10422 switch (TREE_CODE (stripped_decl))
10423 {
10424 case ADDR_EXPR:
10425 return get_name (TREE_OPERAND (stripped_decl, 0));
10426 default:
10427 return NULL;
10428 }
10429 }
10430}
10431
448e99f5 10432/* Return true if TYPE has a variable argument list. */
10433
10434bool
10435stdarg_p (tree fntype)
10436{
10437 function_args_iterator args_iter;
10438 tree n = NULL_TREE, t;
10439
10440 if (!fntype)
10441 return false;
10442
10443 FOREACH_FUNCTION_ARGS(fntype, t, args_iter)
10444 {
10445 n = t;
10446 }
10447
10448 return n != NULL_TREE && n != void_type_node;
10449}
10450
10451/* Return true if TYPE has a prototype. */
10452
10453bool
10454prototype_p (tree fntype)
10455{
10456 tree t;
10457
10458 gcc_assert (fntype != NULL_TREE);
10459
10460 t = TYPE_ARG_TYPES (fntype);
10461 return (t != NULL_TREE);
10462}
10463
1b16fc45 10464/* If BLOCK is inlined from an __attribute__((__artificial__))
10465 routine, return pointer to location from where it has been
10466 called. */
10467location_t *
10468block_nonartificial_location (tree block)
10469{
10470 location_t *ret = NULL;
10471
10472 while (block && TREE_CODE (block) == BLOCK
10473 && BLOCK_ABSTRACT_ORIGIN (block))
10474 {
10475 tree ao = BLOCK_ABSTRACT_ORIGIN (block);
10476
c112531f 10477 while (TREE_CODE (ao) == BLOCK
10478 && BLOCK_ABSTRACT_ORIGIN (ao)
10479 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
1b16fc45 10480 ao = BLOCK_ABSTRACT_ORIGIN (ao);
10481
10482 if (TREE_CODE (ao) == FUNCTION_DECL)
10483 {
10484 /* If AO is an artificial inline, point RET to the
10485 call site locus at which it has been inlined and continue
10486 the loop, in case AO's caller is also an artificial
10487 inline. */
10488 if (DECL_DECLARED_INLINE_P (ao)
10489 && lookup_attribute ("artificial", DECL_ATTRIBUTES (ao)))
10490 ret = &BLOCK_SOURCE_LOCATION (block);
10491 else
10492 break;
10493 }
10494 else if (TREE_CODE (ao) != BLOCK)
10495 break;
10496
10497 block = BLOCK_SUPERCONTEXT (block);
10498 }
10499 return ret;
10500}
10501
b430e8d9 10502
10503/* If EXP is inlined from an __attribute__((__artificial__))
10504 function, return the location of the original call expression. */
10505
10506location_t
10507tree_nonartificial_location (tree exp)
10508{
f63d3ecc 10509 location_t *loc = block_nonartificial_location (TREE_BLOCK (exp));
b430e8d9 10510
f63d3ecc 10511 if (loc)
10512 return *loc;
10513 else
10514 return EXPR_LOCATION (exp);
b430e8d9 10515}
10516
10517
46f8e3b0 10518/* These are the hash table functions for the hash table of OPTIMIZATION_NODEq
10519 nodes. */
10520
10521/* Return the hash code code X, an OPTIMIZATION_NODE or TARGET_OPTION code. */
10522
10523static hashval_t
10524cl_option_hash_hash (const void *x)
10525{
10526 const_tree const t = (const_tree) x;
10527 const char *p;
10528 size_t i;
10529 size_t len = 0;
10530 hashval_t hash = 0;
10531
10532 if (TREE_CODE (t) == OPTIMIZATION_NODE)
10533 {
10534 p = (const char *)TREE_OPTIMIZATION (t);
10535 len = sizeof (struct cl_optimization);
10536 }
10537
10538 else if (TREE_CODE (t) == TARGET_OPTION_NODE)
10539 {
10540 p = (const char *)TREE_TARGET_OPTION (t);
10541 len = sizeof (struct cl_target_option);
10542 }
10543
10544 else
10545 gcc_unreachable ();
10546
10547 /* assume most opt flags are just 0/1, some are 2-3, and a few might be
10548 something else. */
10549 for (i = 0; i < len; i++)
10550 if (p[i])
10551 hash = (hash << 4) ^ ((i << 2) | p[i]);
10552
10553 return hash;
10554}
10555
10556/* Return nonzero if the value represented by *X (an OPTIMIZATION or
10557 TARGET_OPTION tree node) is the same as that given by *Y, which is the
10558 same. */
10559
10560static int
10561cl_option_hash_eq (const void *x, const void *y)
10562{
10563 const_tree const xt = (const_tree) x;
10564 const_tree const yt = (const_tree) y;
10565 const char *xp;
10566 const char *yp;
10567 size_t len;
10568
10569 if (TREE_CODE (xt) != TREE_CODE (yt))
10570 return 0;
10571
10572 if (TREE_CODE (xt) == OPTIMIZATION_NODE)
10573 {
10574 xp = (const char *)TREE_OPTIMIZATION (xt);
10575 yp = (const char *)TREE_OPTIMIZATION (yt);
10576 len = sizeof (struct cl_optimization);
10577 }
10578
10579 else if (TREE_CODE (xt) == TARGET_OPTION_NODE)
10580 {
10581 xp = (const char *)TREE_TARGET_OPTION (xt);
10582 yp = (const char *)TREE_TARGET_OPTION (yt);
10583 len = sizeof (struct cl_target_option);
10584 }
10585
10586 else
10587 gcc_unreachable ();
10588
10589 return (memcmp (xp, yp, len) == 0);
10590}
10591
10592/* Build an OPTIMIZATION_NODE based on the current options. */
10593
10594tree
10595build_optimization_node (void)
10596{
10597 tree t;
10598 void **slot;
10599
10600 /* Use the cache of optimization nodes. */
10601
10602 cl_optimization_save (TREE_OPTIMIZATION (cl_optimization_node));
10603
10604 slot = htab_find_slot (cl_option_hash_table, cl_optimization_node, INSERT);
10605 t = (tree) *slot;
10606 if (!t)
10607 {
10608 /* Insert this one into the hash table. */
10609 t = cl_optimization_node;
10610 *slot = t;
10611
10612 /* Make a new node for next time round. */
10613 cl_optimization_node = make_node (OPTIMIZATION_NODE);
10614 }
10615
10616 return t;
10617}
10618
10619/* Build a TARGET_OPTION_NODE based on the current options. */
10620
10621tree
10622build_target_option_node (void)
10623{
10624 tree t;
10625 void **slot;
10626
10627 /* Use the cache of optimization nodes. */
10628
10629 cl_target_option_save (TREE_TARGET_OPTION (cl_target_option_node));
10630
10631 slot = htab_find_slot (cl_option_hash_table, cl_target_option_node, INSERT);
10632 t = (tree) *slot;
10633 if (!t)
10634 {
10635 /* Insert this one into the hash table. */
10636 t = cl_target_option_node;
10637 *slot = t;
10638
10639 /* Make a new node for next time round. */
10640 cl_target_option_node = make_node (TARGET_OPTION_NODE);
10641 }
10642
10643 return t;
10644}
10645
36267649 10646/* Determine the "ultimate origin" of a block. The block may be an inlined
10647 instance of an inlined instance of a block which is local to an inline
10648 function, so we have to trace all of the way back through the origin chain
10649 to find out what sort of node actually served as the original seed for the
10650 given block. */
10651
10652tree
10653block_ultimate_origin (const_tree block)
10654{
10655 tree immediate_origin = BLOCK_ABSTRACT_ORIGIN (block);
10656
10657 /* output_inline_function sets BLOCK_ABSTRACT_ORIGIN for all the
10658 nodes in the function to point to themselves; ignore that if
10659 we're trying to output the abstract instance of this function. */
10660 if (BLOCK_ABSTRACT (block) && immediate_origin == block)
10661 return NULL_TREE;
10662
10663 if (immediate_origin == NULL_TREE)
10664 return NULL_TREE;
10665 else
10666 {
10667 tree ret_val;
10668 tree lookahead = immediate_origin;
10669
10670 do
10671 {
10672 ret_val = lookahead;
10673 lookahead = (TREE_CODE (ret_val) == BLOCK
10674 ? BLOCK_ABSTRACT_ORIGIN (ret_val) : NULL);
10675 }
10676 while (lookahead != NULL && lookahead != ret_val);
10677
10678 /* The block's abstract origin chain may not be the *ultimate* origin of
10679 the block. It could lead to a DECL that has an abstract origin set.
10680 If so, we want that DECL's abstract origin (which is what DECL_ORIGIN
10681 will give us if it has one). Note that DECL's abstract origins are
10682 supposed to be the most distant ancestor (or so decl_ultimate_origin
10683 claims), so we don't need to loop following the DECL origins. */
10684 if (DECL_P (ret_val))
10685 return DECL_ORIGIN (ret_val);
10686
10687 return ret_val;
10688 }
10689}
10690
927a6b6b 10691/* Return true if T1 and T2 are equivalent lists. */
10692
10693bool
10694list_equal_p (const_tree t1, const_tree t2)
10695{
10696 for (; t1 && t2; t1 = TREE_CHAIN (t1) , t2 = TREE_CHAIN (t2))
10697 if (TREE_VALUE (t1) != TREE_VALUE (t2))
10698 return false;
10699 return !t1 && !t2;
10700}
10701
98112881 10702/* Return true iff conversion in EXP generates no instruction. Mark
10703 it inline so that we fully inline into the stripping functions even
10704 though we have two uses of this function. */
10705
10706static inline bool
10707tree_nop_conversion (const_tree exp)
10708{
10709 tree outer_type, inner_type;
10710
10711 if (!CONVERT_EXPR_P (exp)
10712 && TREE_CODE (exp) != NON_LVALUE_EXPR)
10713 return false;
10714 if (TREE_OPERAND (exp, 0) == error_mark_node)
10715 return false;
10716
10717 outer_type = TREE_TYPE (exp);
10718 inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
10719
6d72287b 10720 if (!inner_type)
10721 return false;
10722
98112881 10723 /* Use precision rather then machine mode when we can, which gives
10724 the correct answer even for submode (bit-field) types. */
10725 if ((INTEGRAL_TYPE_P (outer_type)
10726 || POINTER_TYPE_P (outer_type)
10727 || TREE_CODE (outer_type) == OFFSET_TYPE)
10728 && (INTEGRAL_TYPE_P (inner_type)
10729 || POINTER_TYPE_P (inner_type)
10730 || TREE_CODE (inner_type) == OFFSET_TYPE))
10731 return TYPE_PRECISION (outer_type) == TYPE_PRECISION (inner_type);
10732
10733 /* Otherwise fall back on comparing machine modes (e.g. for
10734 aggregate types, floats). */
10735 return TYPE_MODE (outer_type) == TYPE_MODE (inner_type);
10736}
10737
10738/* Return true iff conversion in EXP generates no instruction. Don't
10739 consider conversions changing the signedness. */
10740
10741static bool
10742tree_sign_nop_conversion (const_tree exp)
10743{
10744 tree outer_type, inner_type;
10745
10746 if (!tree_nop_conversion (exp))
10747 return false;
10748
10749 outer_type = TREE_TYPE (exp);
10750 inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
10751
10752 return (TYPE_UNSIGNED (outer_type) == TYPE_UNSIGNED (inner_type)
10753 && POINTER_TYPE_P (outer_type) == POINTER_TYPE_P (inner_type));
10754}
10755
10756/* Strip conversions from EXP according to tree_nop_conversion and
10757 return the resulting expression. */
10758
10759tree
10760tree_strip_nop_conversions (tree exp)
10761{
10762 while (tree_nop_conversion (exp))
10763 exp = TREE_OPERAND (exp, 0);
10764 return exp;
10765}
10766
10767/* Strip conversions from EXP according to tree_sign_nop_conversion
10768 and return the resulting expression. */
10769
10770tree
10771tree_strip_sign_nop_conversions (tree exp)
10772{
10773 while (tree_sign_nop_conversion (exp))
10774 exp = TREE_OPERAND (exp, 0);
10775 return exp;
10776}
10777
58d82cd0 10778static GTY(()) tree gcc_eh_personality_decl;
10779
10780/* Return the GCC personality function decl. */
10781
10782tree
10783lhd_gcc_personality (void)
10784{
10785 if (!gcc_eh_personality_decl)
10786 gcc_eh_personality_decl
10787 = build_personality_function (USING_SJLJ_EXCEPTIONS
10788 ? "__gcc_personality_sj0"
10789 : "__gcc_personality_v0");
10790
10791 return gcc_eh_personality_decl;
10792}
927a6b6b 10793
6378ffb3 10794/* Try to find a base info of BINFO that would have its field decl at offset
10795 OFFSET within the BINFO type and which is of EXPECTED_TYPE. If it can be
10796 found, return, otherwise return NULL_TREE. */
10797
10798tree
10799get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type)
10800{
10801 tree type;
10802
10803 if (offset == 0)
10804 return binfo;
10805
10806 type = TREE_TYPE (binfo);
10807 while (offset > 0)
10808 {
10809 tree base_binfo, found_binfo;
10810 HOST_WIDE_INT pos, size;
10811 tree fld;
10812 int i;
10813
10814 if (TREE_CODE (type) != RECORD_TYPE)
10815 return NULL_TREE;
10816
10817 for (fld = TYPE_FIELDS (type); fld; fld = TREE_CHAIN (fld))
10818 {
10819 if (TREE_CODE (fld) != FIELD_DECL)
10820 continue;
10821
10822 pos = int_bit_position (fld);
10823 size = tree_low_cst (DECL_SIZE (fld), 1);
10824 if (pos <= offset && (pos + size) > offset)
10825 break;
10826 }
10827 if (!fld)
10828 return NULL_TREE;
10829
10830 found_binfo = NULL_TREE;
10831 for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
10832 if (TREE_TYPE (base_binfo) == TREE_TYPE (fld))
10833 {
10834 found_binfo = base_binfo;
10835 break;
10836 }
10837
10838 if (!found_binfo)
10839 return NULL_TREE;
10840
10841 type = TREE_TYPE (fld);
10842 binfo = found_binfo;
10843 offset -= pos;
10844 }
10845 if (type != expected_type)
10846 return NULL_TREE;
10847 return binfo;
10848}
10849
1f3233d1 10850#include "gt-tree.h"