]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/lto/lto-common.cc
m2: use _P() defines from tree.h
[thirdparty/gcc.git] / gcc / lto / lto-common.cc
CommitLineData
a79420f9 1/* Top-level LTO routines.
83ffe9cd 2 Copyright (C) 2009-2023 Free Software Foundation, Inc.
a79420f9
ML
3 Contributed by CodeSourcery, Inc.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
24#include "tm.h"
25#include "function.h"
26#include "bitmap.h"
27#include "basic-block.h"
28#include "tree.h"
29#include "gimple.h"
30#include "cfghooks.h"
31#include "alloc-pool.h"
32#include "tree-pass.h"
33#include "tree-streamer.h"
34#include "cgraph.h"
35#include "opts.h"
36#include "toplev.h"
37#include "stor-layout.h"
38#include "symbol-summary.h"
39#include "tree-vrp.h"
40#include "ipa-prop.h"
41#include "common.h"
42#include "debug.h"
43#include "lto.h"
44#include "lto-section-names.h"
45#include "splay-tree.h"
46#include "lto-partition.h"
47#include "context.h"
48#include "pass_manager.h"
49#include "ipa-fnsummary.h"
a79420f9
ML
50#include "ipa-utils.h"
51#include "gomp-constants.h"
52#include "lto-symtab.h"
53#include "stringpool.h"
54#include "fold-const.h"
55#include "attribs.h"
56#include "builtins.h"
57#include "lto-common.h"
a0276c00 58#include "tree-pretty-print.h"
03d90a20 59#include "print-tree.h"
a0276c00
JH
60
61/* True when no new types are going to be streamd from the global stream. */
62
63static bool type_streaming_finished = false;
a79420f9
ML
64
65GTY(()) tree first_personality_decl;
66
67GTY(()) const unsigned char *lto_mode_identity_table;
68
69/* Returns a hash code for P. */
70
71static hashval_t
72hash_name (const void *p)
73{
74 const struct lto_section_slot *ds = (const struct lto_section_slot *) p;
75 return (hashval_t) htab_hash_string (ds->name);
76}
77
78
79/* Returns nonzero if P1 and P2 are equal. */
80
81static int
82eq_name (const void *p1, const void *p2)
83{
ee7a003f
ML
84 const struct lto_section_slot *s1
85 = (const struct lto_section_slot *) p1;
86 const struct lto_section_slot *s2
87 = (const struct lto_section_slot *) p2;
a79420f9
ML
88
89 return strcmp (s1->name, s2->name) == 0;
90}
91
ee7a003f 92/* Free lto_section_slot. */
a79420f9
ML
93
94static void
95free_with_string (void *arg)
96{
97 struct lto_section_slot *s = (struct lto_section_slot *)arg;
98
99 free (CONST_CAST (char *, s->name));
100 free (arg);
101}
102
ee7a003f 103/* Create section hash table. */
a79420f9 104
ee7a003f 105htab_t
a79420f9
ML
106lto_obj_create_section_hash_table (void)
107{
108 return htab_create (37, hash_name, eq_name, free_with_string);
109}
110
111/* Delete an allocated integer KEY in the splay tree. */
112
113static void
114lto_splay_tree_delete_id (splay_tree_key key)
115{
116 free ((void *) key);
117}
118
119/* Compare splay tree node ids A and B. */
120
121static int
122lto_splay_tree_compare_ids (splay_tree_key a, splay_tree_key b)
123{
124 unsigned HOST_WIDE_INT ai;
125 unsigned HOST_WIDE_INT bi;
126
127 ai = *(unsigned HOST_WIDE_INT *) a;
128 bi = *(unsigned HOST_WIDE_INT *) b;
129
130 if (ai < bi)
131 return -1;
132 else if (ai > bi)
133 return 1;
134 return 0;
135}
136
137/* Look up splay tree node by ID in splay tree T. */
138
139static splay_tree_node
140lto_splay_tree_lookup (splay_tree t, unsigned HOST_WIDE_INT id)
141{
142 return splay_tree_lookup (t, (splay_tree_key) &id);
143}
144
145/* Check if KEY has ID. */
146
147static bool
148lto_splay_tree_id_equal_p (splay_tree_key key, unsigned HOST_WIDE_INT id)
149{
150 return *(unsigned HOST_WIDE_INT *) key == id;
151}
152
ee7a003f 153/* Insert a splay tree node into tree T with ID as key and FILE_DATA as value.
a79420f9 154 The ID is allocated separately because we need HOST_WIDE_INTs which may
ee7a003f 155 be wider than a splay_tree_key. */
a79420f9
ML
156
157static void
158lto_splay_tree_insert (splay_tree t, unsigned HOST_WIDE_INT id,
159 struct lto_file_decl_data *file_data)
160{
161 unsigned HOST_WIDE_INT *idp = XCNEW (unsigned HOST_WIDE_INT);
162 *idp = id;
163 splay_tree_insert (t, (splay_tree_key) idp, (splay_tree_value) file_data);
164}
165
166/* Create a splay tree. */
167
168static splay_tree
169lto_splay_tree_new (void)
170{
171 return splay_tree_new (lto_splay_tree_compare_ids,
ee7a003f 172 lto_splay_tree_delete_id,
a79420f9
ML
173 NULL);
174}
175
176/* Decode the content of memory pointed to by DATA in the in decl
ee7a003f
ML
177 state object STATE. DATA_IN points to a data_in structure for
178 decoding. Return the address after the decoded object in the
a79420f9
ML
179 input. */
180
181static const uint32_t *
99b1c316 182lto_read_in_decl_state (class data_in *data_in, const uint32_t *data,
a79420f9
ML
183 struct lto_in_decl_state *state)
184{
185 uint32_t ix;
186 tree decl;
187 uint32_t i, j;
188
189 ix = *data++;
190 state->compressed = ix & 1;
191 ix /= 2;
192 decl = streamer_tree_cache_get_tree (data_in->reader_cache, ix);
193 if (!VAR_OR_FUNCTION_DECL_P (decl))
194 {
195 gcc_assert (decl == void_type_node);
196 decl = NULL_TREE;
197 }
198 state->fn_decl = decl;
199
200 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
201 {
202 uint32_t size = *data++;
203 vec<tree, va_gc> *decls = NULL;
204 vec_alloc (decls, size);
205
206 for (j = 0; j < size; j++)
207 vec_safe_push (decls,
208 streamer_tree_cache_get_tree (data_in->reader_cache,
209 data[j]));
210
211 state->streams[i] = decls;
212 data += size;
213 }
214
215 return data;
216}
217
218
219/* Global canonical type table. */
220static htab_t gimple_canonical_types;
221static hash_map<const_tree, hashval_t> *canonical_type_hash_cache;
222static unsigned long num_canonical_type_hash_entries;
223static unsigned long num_canonical_type_hash_queries;
224
a0276c00
JH
225/* Types postponed for registration to the canonical type table.
226 During streaming we postpone all TYPE_CXX_ODR_P types so we can alter
227 decide whether there is conflict with non-ODR type or not. */
228static GTY(()) vec<tree, va_gc> *types_to_register = NULL;
229
a79420f9
ML
230static void iterative_hash_canonical_type (tree type, inchash::hash &hstate);
231static hashval_t gimple_canonical_type_hash (const void *p);
a0276c00 232static hashval_t gimple_register_canonical_type_1 (tree t, hashval_t hash);
a79420f9
ML
233
234/* Returning a hash value for gimple type TYPE.
235
236 The hash value returned is equal for types considered compatible
237 by gimple_canonical_types_compatible_p. */
238
239static hashval_t
240hash_canonical_type (tree type)
241{
242 inchash::hash hstate;
243 enum tree_code code;
244
245 /* We compute alias sets only for types that needs them.
246 Be sure we do not recurse to something else as we cannot hash incomplete
247 types in a way they would have same hash value as compatible complete
248 types. */
249 gcc_checking_assert (type_with_alias_set_p (type));
250
251 /* Combine a few common features of types so that types are grouped into
252 smaller sets; when searching for existing matching types to merge,
253 only existing types having the same features as the new type will be
254 checked. */
255 code = tree_code_for_canonical_type_merging (TREE_CODE (type));
256 hstate.add_int (code);
257 hstate.add_int (TYPE_MODE (type));
258
259 /* Incorporate common features of numerical types. */
260 if (INTEGRAL_TYPE_P (type)
261 || SCALAR_FLOAT_TYPE_P (type)
262 || FIXED_POINT_TYPE_P (type)
263 || TREE_CODE (type) == OFFSET_TYPE
264 || POINTER_TYPE_P (type))
265 {
266 hstate.add_int (TYPE_PRECISION (type));
267 if (!type_with_interoperable_signedness (type))
ee7a003f 268 hstate.add_int (TYPE_UNSIGNED (type));
a79420f9
ML
269 }
270
271 if (VECTOR_TYPE_P (type))
272 {
273 hstate.add_poly_int (TYPE_VECTOR_SUBPARTS (type));
274 hstate.add_int (TYPE_UNSIGNED (type));
275 }
276
277 if (TREE_CODE (type) == COMPLEX_TYPE)
278 hstate.add_int (TYPE_UNSIGNED (type));
279
280 /* Fortran's C_SIGNED_CHAR is !TYPE_STRING_FLAG but needs to be
281 interoperable with "signed char". Unless all frontends are revisited to
282 agree on these types, we must ignore the flag completely. */
283
284 /* Fortran standard define C_PTR type that is compatible with every
285 C pointer. For this reason we need to glob all pointers into one.
286 Still pointers in different address spaces are not compatible. */
287 if (POINTER_TYPE_P (type))
288 hstate.add_int (TYPE_ADDR_SPACE (TREE_TYPE (type)));
289
290 /* For array types hash the domain bounds and the string flag. */
291 if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
292 {
293 hstate.add_int (TYPE_STRING_FLAG (type));
294 /* OMP lowering can introduce error_mark_node in place of
295 random local decls in types. */
296 if (TYPE_MIN_VALUE (TYPE_DOMAIN (type)) != error_mark_node)
297 inchash::add_expr (TYPE_MIN_VALUE (TYPE_DOMAIN (type)), hstate);
298 if (TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != error_mark_node)
299 inchash::add_expr (TYPE_MAX_VALUE (TYPE_DOMAIN (type)), hstate);
300 }
301
302 /* Recurse for aggregates with a single element type. */
303 if (TREE_CODE (type) == ARRAY_TYPE
304 || TREE_CODE (type) == COMPLEX_TYPE
305 || TREE_CODE (type) == VECTOR_TYPE)
306 iterative_hash_canonical_type (TREE_TYPE (type), hstate);
307
308 /* Incorporate function return and argument types. */
309 if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE)
310 {
311 unsigned na;
312 tree p;
313
314 iterative_hash_canonical_type (TREE_TYPE (type), hstate);
315
316 for (p = TYPE_ARG_TYPES (type), na = 0; p; p = TREE_CHAIN (p))
317 {
318 iterative_hash_canonical_type (TREE_VALUE (p), hstate);
319 na++;
320 }
321
322 hstate.add_int (na);
323 }
324
325 if (RECORD_OR_UNION_TYPE_P (type))
326 {
327 unsigned nf;
328 tree f;
329
330 for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
331 if (TREE_CODE (f) == FIELD_DECL
332 && (! DECL_SIZE (f)
333 || ! integer_zerop (DECL_SIZE (f))))
334 {
335 iterative_hash_canonical_type (TREE_TYPE (f), hstate);
336 nf++;
337 }
338
339 hstate.add_int (nf);
340 }
341
342 return hstate.end();
343}
344
345/* Returning a hash value for gimple type TYPE combined with VAL. */
346
347static void
348iterative_hash_canonical_type (tree type, inchash::hash &hstate)
349{
350 hashval_t v;
351
352 /* All type variants have same TYPE_CANONICAL. */
353 type = TYPE_MAIN_VARIANT (type);
354
355 if (!canonical_type_used_p (type))
356 v = hash_canonical_type (type);
357 /* An already processed type. */
358 else if (TYPE_CANONICAL (type))
359 {
360 type = TYPE_CANONICAL (type);
361 v = gimple_canonical_type_hash (type);
362 }
363 else
364 {
365 /* Canonical types should not be able to form SCCs by design, this
366 recursion is just because we do not register canonical types in
367 optimal order. To avoid quadratic behavior also register the
368 type here. */
369 v = hash_canonical_type (type);
a0276c00 370 v = gimple_register_canonical_type_1 (type, v);
a79420f9 371 }
a0276c00 372 hstate.merge_hash (v);
a79420f9
ML
373}
374
375/* Returns the hash for a canonical type P. */
376
377static hashval_t
378gimple_canonical_type_hash (const void *p)
379{
380 num_canonical_type_hash_queries++;
381 hashval_t *slot = canonical_type_hash_cache->get ((const_tree) p);
382 gcc_assert (slot != NULL);
383 return *slot;
384}
385
386
387
388/* Returns nonzero if P1 and P2 are equal. */
389
390static int
391gimple_canonical_type_eq (const void *p1, const void *p2)
392{
393 const_tree t1 = (const_tree) p1;
394 const_tree t2 = (const_tree) p2;
395 return gimple_canonical_types_compatible_p (CONST_CAST_TREE (t1),
396 CONST_CAST_TREE (t2));
397}
398
399/* Main worker for gimple_register_canonical_type. */
400
a0276c00 401static hashval_t
a79420f9
ML
402gimple_register_canonical_type_1 (tree t, hashval_t hash)
403{
404 void **slot;
405
406 gcc_checking_assert (TYPE_P (t) && !TYPE_CANONICAL (t)
407 && type_with_alias_set_p (t)
408 && canonical_type_used_p (t));
409
a0276c00
JH
410 /* ODR types for which there is no ODR violation and we did not record
411 structurally equivalent non-ODR type can be treated as unique by their
412 name.
413
414 hash passed to gimple_register_canonical_type_1 is a structural hash
415 that we can use to lookup structurally equivalent non-ODR type.
416 In case we decide to treat type as unique ODR type we recompute hash based
417 on name and let TBAA machinery know about our decision. */
18dd2956
JH
418 if (RECORD_OR_UNION_TYPE_P (t) && odr_type_p (t)
419 && TYPE_CXX_ODR_P (t) && !odr_type_violation_reported_p (t))
a0276c00 420 {
b01659aa
JH
421 /* Anonymous namespace types never conflict with non-C++ types. */
422 if (type_with_linkage_p (t) && type_in_anonymous_namespace_p (t))
423 slot = NULL;
424 else
425 {
426 /* Here we rely on fact that all non-ODR types was inserted into
427 canonical type hash and thus we can safely detect conflicts between
428 ODR types and interoperable non-ODR types. */
429 gcc_checking_assert (type_streaming_finished
430 && TYPE_MAIN_VARIANT (t) == t);
431 slot = htab_find_slot_with_hash (gimple_canonical_types, t, hash,
432 NO_INSERT);
433 }
a0276c00
JH
434 if (slot && !TYPE_CXX_ODR_P (*(tree *)slot))
435 {
436 tree nonodr = *(tree *)slot;
18dd2956 437 gcc_checking_assert (!flag_ltrans);
a0276c00
JH
438 if (symtab->dump_file)
439 {
440 fprintf (symtab->dump_file,
441 "ODR and non-ODR type conflict: ");
442 print_generic_expr (symtab->dump_file, t);
443 fprintf (symtab->dump_file, " and ");
444 print_generic_expr (symtab->dump_file, nonodr);
445 fprintf (symtab->dump_file, " mangled:%s\n",
446 IDENTIFIER_POINTER
447 (DECL_ASSEMBLER_NAME (TYPE_NAME (t))));
448 }
449 /* Set canonical for T and all other ODR equivalent duplicates
450 including incomplete structures. */
451 set_type_canonical_for_odr_type (t, nonodr);
452 }
453 else
454 {
455 tree prevail = prevailing_odr_type (t);
456
457 if (symtab->dump_file)
458 {
459 fprintf (symtab->dump_file,
460 "New canonical ODR type: ");
461 print_generic_expr (symtab->dump_file, t);
462 fprintf (symtab->dump_file, " mangled:%s\n",
463 IDENTIFIER_POINTER
464 (DECL_ASSEMBLER_NAME (TYPE_NAME (t))));
465 }
466 /* Set canonical for T and all other ODR equivalent duplicates
467 including incomplete structures. */
468 set_type_canonical_for_odr_type (t, prevail);
469 enable_odr_based_tbaa (t);
470 if (!type_in_anonymous_namespace_p (t))
471 hash = htab_hash_string (IDENTIFIER_POINTER
472 (DECL_ASSEMBLER_NAME
473 (TYPE_NAME (t))));
474 else
475 hash = TYPE_UID (t);
476
477 /* All variants of t now have TYPE_CANONICAL set to prevail.
478 Update canonical type hash cache accordingly. */
479 num_canonical_type_hash_entries++;
480 bool existed_p = canonical_type_hash_cache->put (prevail, hash);
481 gcc_checking_assert (!existed_p);
482 }
483 return hash;
484 }
485
a79420f9
ML
486 slot = htab_find_slot_with_hash (gimple_canonical_types, t, hash, INSERT);
487 if (*slot)
488 {
489 tree new_type = (tree)(*slot);
490 gcc_checking_assert (new_type != t);
491 TYPE_CANONICAL (t) = new_type;
492 }
493 else
494 {
495 TYPE_CANONICAL (t) = t;
496 *slot = (void *) t;
497 /* Cache the just computed hash value. */
498 num_canonical_type_hash_entries++;
499 bool existed_p = canonical_type_hash_cache->put (t, hash);
500 gcc_assert (!existed_p);
501 }
a0276c00 502 return hash;
a79420f9
ML
503}
504
505/* Register type T in the global type table gimple_types and set
506 TYPE_CANONICAL of T accordingly.
507 This is used by LTO to merge structurally equivalent types for
508 type-based aliasing purposes across different TUs and languages.
509
e53b6e56 510 ??? This merging does not exactly match how the tree.cc middle-end
a79420f9
ML
511 functions will assign TYPE_CANONICAL when new types are created
512 during optimization (which at least happens for pointer and array
513 types). */
514
515static void
516gimple_register_canonical_type (tree t)
517{
518 if (TYPE_CANONICAL (t) || !type_with_alias_set_p (t)
519 || !canonical_type_used_p (t))
520 return;
521
522 /* Canonical types are same among all complete variants. */
523 if (TYPE_CANONICAL (TYPE_MAIN_VARIANT (t)))
524 TYPE_CANONICAL (t) = TYPE_CANONICAL (TYPE_MAIN_VARIANT (t));
525 else
526 {
ee7a003f
ML
527 hashval_t h = hash_canonical_type (TYPE_MAIN_VARIANT (t));
528 gimple_register_canonical_type_1 (TYPE_MAIN_VARIANT (t), h);
a79420f9
ML
529 TYPE_CANONICAL (t) = TYPE_CANONICAL (TYPE_MAIN_VARIANT (t));
530 }
531}
532
533/* Re-compute TYPE_CANONICAL for NODE and related types. */
534
535static void
536lto_register_canonical_types (tree node, bool first_p)
537{
538 if (!node
539 || !TYPE_P (node))
540 return;
541
542 if (first_p)
543 TYPE_CANONICAL (node) = NULL_TREE;
544
545 if (POINTER_TYPE_P (node)
546 || TREE_CODE (node) == COMPLEX_TYPE
547 || TREE_CODE (node) == ARRAY_TYPE)
548 lto_register_canonical_types (TREE_TYPE (node), first_p);
549
ee7a003f 550 if (!first_p)
a79420f9
ML
551 gimple_register_canonical_type (node);
552}
553
a0276c00
JH
554/* Finish canonical type calculation: after all units has been streamed in we
555 can check if given ODR type structurally conflicts with a non-ODR type. In
556 the first case we set type canonical according to the canonical type hash.
557 In the second case we use type names. */
558
559static void
560lto_register_canonical_types_for_odr_types ()
561{
562 tree t;
563 unsigned int i;
564
565 if (!types_to_register)
566 return;
567
568 type_streaming_finished = true;
569
570 /* Be sure that no types derived from ODR types was
571 not inserted into the hash table. */
572 if (flag_checking)
573 FOR_EACH_VEC_ELT (*types_to_register, i, t)
574 gcc_assert (!TYPE_CANONICAL (t));
575
576 /* Register all remaining types. */
577 FOR_EACH_VEC_ELT (*types_to_register, i, t)
606a9a8c
JH
578 {
579 /* For pre-streamed types like va-arg it is possible that main variant
580 is !CXX_ODR_P while the variant (which is streamed) is.
581 Copy CXX_ODR_P to make type verifier happy. This is safe because
582 in canonical type calculation we only consider main variants.
583 However we can not change this flag before streaming is finished
584 to not affect tree merging. */
585 TYPE_CXX_ODR_P (t) = TYPE_CXX_ODR_P (TYPE_MAIN_VARIANT (t));
586 if (!TYPE_CANONICAL (t))
587 gimple_register_canonical_type (t);
588 }
a0276c00
JH
589}
590
a79420f9
ML
591
592/* Remember trees that contains references to declarations. */
593vec <tree, va_gc> *tree_with_vars;
594
595#define CHECK_VAR(tt) \
596 do \
597 { \
598 if ((tt) && VAR_OR_FUNCTION_DECL_P (tt) \
599 && (TREE_PUBLIC (tt) || DECL_EXTERNAL (tt))) \
600 return true; \
601 } while (0)
602
603#define CHECK_NO_VAR(tt) \
604 gcc_checking_assert (!(tt) || !VAR_OR_FUNCTION_DECL_P (tt))
605
606/* Check presence of pointers to decls in fields of a tree_typed T. */
607
608static inline bool
609mentions_vars_p_typed (tree t)
610{
611 CHECK_NO_VAR (TREE_TYPE (t));
612 return false;
613}
614
615/* Check presence of pointers to decls in fields of a tree_common T. */
616
617static inline bool
618mentions_vars_p_common (tree t)
619{
620 if (mentions_vars_p_typed (t))
621 return true;
622 CHECK_NO_VAR (TREE_CHAIN (t));
623 return false;
624}
625
626/* Check presence of pointers to decls in fields of a decl_minimal T. */
627
628static inline bool
629mentions_vars_p_decl_minimal (tree t)
630{
631 if (mentions_vars_p_common (t))
632 return true;
633 CHECK_NO_VAR (DECL_NAME (t));
634 CHECK_VAR (DECL_CONTEXT (t));
635 return false;
636}
637
638/* Check presence of pointers to decls in fields of a decl_common T. */
639
640static inline bool
641mentions_vars_p_decl_common (tree t)
642{
643 if (mentions_vars_p_decl_minimal (t))
644 return true;
645 CHECK_VAR (DECL_SIZE (t));
646 CHECK_VAR (DECL_SIZE_UNIT (t));
647 CHECK_VAR (DECL_INITIAL (t));
648 CHECK_NO_VAR (DECL_ATTRIBUTES (t));
649 CHECK_VAR (DECL_ABSTRACT_ORIGIN (t));
650 return false;
651}
652
653/* Check presence of pointers to decls in fields of a decl_with_vis T. */
654
655static inline bool
656mentions_vars_p_decl_with_vis (tree t)
657{
658 if (mentions_vars_p_decl_common (t))
659 return true;
660
ee7a003f 661 /* Accessor macro has side-effects, use field-name here. */
a79420f9
ML
662 CHECK_NO_VAR (DECL_ASSEMBLER_NAME_RAW (t));
663 return false;
664}
665
666/* Check presence of pointers to decls in fields of a decl_non_common T. */
667
668static inline bool
669mentions_vars_p_decl_non_common (tree t)
670{
671 if (mentions_vars_p_decl_with_vis (t))
672 return true;
673 CHECK_NO_VAR (DECL_RESULT_FLD (t));
674 return false;
675}
676
677/* Check presence of pointers to decls in fields of a decl_non_common T. */
678
679static bool
680mentions_vars_p_function (tree t)
681{
682 if (mentions_vars_p_decl_non_common (t))
683 return true;
684 CHECK_NO_VAR (DECL_ARGUMENTS (t));
685 CHECK_NO_VAR (DECL_VINDEX (t));
686 CHECK_VAR (DECL_FUNCTION_PERSONALITY (t));
687 return false;
688}
689
690/* Check presence of pointers to decls in fields of a field_decl T. */
691
692static bool
693mentions_vars_p_field_decl (tree t)
694{
695 if (mentions_vars_p_decl_common (t))
696 return true;
697 CHECK_VAR (DECL_FIELD_OFFSET (t));
698 CHECK_NO_VAR (DECL_BIT_FIELD_TYPE (t));
699 CHECK_NO_VAR (DECL_QUALIFIER (t));
700 CHECK_NO_VAR (DECL_FIELD_BIT_OFFSET (t));
701 CHECK_NO_VAR (DECL_FCONTEXT (t));
702 return false;
703}
704
705/* Check presence of pointers to decls in fields of a type T. */
706
707static bool
708mentions_vars_p_type (tree t)
709{
710 if (mentions_vars_p_common (t))
711 return true;
712 CHECK_NO_VAR (TYPE_CACHED_VALUES (t));
713 CHECK_VAR (TYPE_SIZE (t));
714 CHECK_VAR (TYPE_SIZE_UNIT (t));
715 CHECK_NO_VAR (TYPE_ATTRIBUTES (t));
716 CHECK_NO_VAR (TYPE_NAME (t));
717
718 CHECK_VAR (TYPE_MIN_VALUE_RAW (t));
719 CHECK_VAR (TYPE_MAX_VALUE_RAW (t));
720
ee7a003f 721 /* Accessor is for derived node types only. */
a79420f9
ML
722 CHECK_NO_VAR (TYPE_LANG_SLOT_1 (t));
723
724 CHECK_VAR (TYPE_CONTEXT (t));
725 CHECK_NO_VAR (TYPE_CANONICAL (t));
726 CHECK_NO_VAR (TYPE_MAIN_VARIANT (t));
727 CHECK_NO_VAR (TYPE_NEXT_VARIANT (t));
728 return false;
729}
730
731/* Check presence of pointers to decls in fields of a BINFO T. */
732
733static bool
734mentions_vars_p_binfo (tree t)
735{
736 unsigned HOST_WIDE_INT i, n;
737
738 if (mentions_vars_p_common (t))
739 return true;
740 CHECK_VAR (BINFO_VTABLE (t));
741 CHECK_NO_VAR (BINFO_OFFSET (t));
742 CHECK_NO_VAR (BINFO_VIRTUALS (t));
743 CHECK_NO_VAR (BINFO_VPTR_FIELD (t));
744 n = vec_safe_length (BINFO_BASE_ACCESSES (t));
745 for (i = 0; i < n; i++)
746 CHECK_NO_VAR (BINFO_BASE_ACCESS (t, i));
747 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
748 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
749 n = BINFO_N_BASE_BINFOS (t);
750 for (i = 0; i < n; i++)
751 CHECK_NO_VAR (BINFO_BASE_BINFO (t, i));
752 return false;
753}
754
755/* Check presence of pointers to decls in fields of a CONSTRUCTOR T. */
756
757static bool
758mentions_vars_p_constructor (tree t)
759{
760 unsigned HOST_WIDE_INT idx;
761 constructor_elt *ce;
762
763 if (mentions_vars_p_typed (t))
764 return true;
765
766 for (idx = 0; vec_safe_iterate (CONSTRUCTOR_ELTS (t), idx, &ce); idx++)
767 {
768 CHECK_NO_VAR (ce->index);
769 CHECK_VAR (ce->value);
770 }
771 return false;
772}
773
774/* Check presence of pointers to decls in fields of an expression tree T. */
775
776static bool
777mentions_vars_p_expr (tree t)
778{
779 int i;
780 if (mentions_vars_p_typed (t))
781 return true;
782 for (i = TREE_OPERAND_LENGTH (t) - 1; i >= 0; --i)
783 CHECK_VAR (TREE_OPERAND (t, i));
784 return false;
785}
786
787/* Check presence of pointers to decls in fields of an OMP_CLAUSE T. */
788
789static bool
790mentions_vars_p_omp_clause (tree t)
791{
792 int i;
793 if (mentions_vars_p_common (t))
794 return true;
795 for (i = omp_clause_num_ops[OMP_CLAUSE_CODE (t)] - 1; i >= 0; --i)
796 CHECK_VAR (OMP_CLAUSE_OPERAND (t, i));
797 return false;
798}
799
800/* Check presence of pointers to decls that needs later fixup in T. */
801
802static bool
803mentions_vars_p (tree t)
804{
805 switch (TREE_CODE (t))
806 {
807 case IDENTIFIER_NODE:
808 break;
809
810 case TREE_LIST:
811 CHECK_VAR (TREE_VALUE (t));
812 CHECK_VAR (TREE_PURPOSE (t));
813 CHECK_NO_VAR (TREE_CHAIN (t));
814 break;
815
816 case FIELD_DECL:
817 return mentions_vars_p_field_decl (t);
818
819 case LABEL_DECL:
820 case CONST_DECL:
821 case PARM_DECL:
822 case RESULT_DECL:
823 case IMPORTED_DECL:
824 case NAMESPACE_DECL:
825 case NAMELIST_DECL:
826 return mentions_vars_p_decl_common (t);
827
828 case VAR_DECL:
829 return mentions_vars_p_decl_with_vis (t);
830
831 case TYPE_DECL:
832 return mentions_vars_p_decl_non_common (t);
833
834 case FUNCTION_DECL:
835 return mentions_vars_p_function (t);
836
837 case TREE_BINFO:
838 return mentions_vars_p_binfo (t);
839
840 case PLACEHOLDER_EXPR:
841 return mentions_vars_p_common (t);
842
843 case BLOCK:
844 case TRANSLATION_UNIT_DECL:
845 case OPTIMIZATION_NODE:
846 case TARGET_OPTION_NODE:
847 break;
848
849 case CONSTRUCTOR:
850 return mentions_vars_p_constructor (t);
851
852 case OMP_CLAUSE:
853 return mentions_vars_p_omp_clause (t);
854
855 default:
856 if (TYPE_P (t))
857 {
858 if (mentions_vars_p_type (t))
859 return true;
860 }
861 else if (EXPR_P (t))
862 {
863 if (mentions_vars_p_expr (t))
864 return true;
865 }
866 else if (CONSTANT_CLASS_P (t))
867 CHECK_NO_VAR (TREE_TYPE (t));
868 else
869 gcc_unreachable ();
870 }
871 return false;
872}
873
874
ee7a003f 875/* Return the resolution for the decl with index INDEX from DATA_IN. */
a79420f9
ML
876
877static enum ld_plugin_symbol_resolution
99b1c316 878get_resolution (class data_in *data_in, unsigned index)
a79420f9
ML
879{
880 if (data_in->globals_resolution.exists ())
881 {
882 ld_plugin_symbol_resolution_t ret;
883 /* We can have references to not emitted functions in
884 DECL_FUNCTION_PERSONALITY at least. So we can and have
ee7a003f 885 to indeed return LDPR_UNKNOWN in some cases. */
a79420f9
ML
886 if (data_in->globals_resolution.length () <= index)
887 return LDPR_UNKNOWN;
888 ret = data_in->globals_resolution[index];
889 return ret;
890 }
891 else
892 /* Delay resolution finding until decl merging. */
893 return LDPR_UNKNOWN;
894}
895
896/* We need to record resolutions until symbol table is read. */
897static void
898register_resolution (struct lto_file_decl_data *file_data, tree decl,
899 enum ld_plugin_symbol_resolution resolution)
900{
901 bool existed;
902 if (resolution == LDPR_UNKNOWN)
903 return;
904 if (!file_data->resolution_map)
905 file_data->resolution_map
906 = new hash_map<tree, ld_plugin_symbol_resolution>;
907 ld_plugin_symbol_resolution_t &res
908 = file_data->resolution_map->get_or_insert (decl, &existed);
909 if (!existed
910 || resolution == LDPR_PREVAILING_DEF_IRONLY
911 || resolution == LDPR_PREVAILING_DEF
912 || resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
913 res = resolution;
914}
915
916/* Register DECL with the global symbol table and change its
917 name if necessary to avoid name clashes for static globals across
918 different files. */
919
920static void
99b1c316 921lto_register_var_decl_in_symtab (class data_in *data_in, tree decl,
a79420f9
ML
922 unsigned ix)
923{
924 tree context;
925
926 /* Variable has file scope, not local. */
927 if (!TREE_PUBLIC (decl)
928 && !((context = decl_function_context (decl))
929 && auto_var_in_fn_p (decl, context)))
930 rest_of_decl_compilation (decl, 1, 0);
931
932 /* If this variable has already been declared, queue the
933 declaration for merging. */
934 if (TREE_PUBLIC (decl))
935 register_resolution (data_in->file_data,
936 decl, get_resolution (data_in, ix));
937}
938
939
940/* Register DECL with the global symbol table and change its
941 name if necessary to avoid name clashes for static globals across
942 different files. DATA_IN contains descriptors and tables for the
943 file being read. */
944
945static void
99b1c316 946lto_register_function_decl_in_symtab (class data_in *data_in, tree decl,
a79420f9
ML
947 unsigned ix)
948{
949 /* If this variable has already been declared, queue the
950 declaration for merging. */
951 if (TREE_PUBLIC (decl) && !DECL_ABSTRACT_P (decl))
952 register_resolution (data_in->file_data,
953 decl, get_resolution (data_in, ix));
954}
955
956/* Check if T is a decl and needs register its resolution info. */
957
958static void
99b1c316 959lto_maybe_register_decl (class data_in *data_in, tree t, unsigned ix)
a79420f9
ML
960{
961 if (TREE_CODE (t) == VAR_DECL)
962 lto_register_var_decl_in_symtab (data_in, t, ix);
963 else if (TREE_CODE (t) == FUNCTION_DECL
964 && !fndecl_built_in_p (t))
965 lto_register_function_decl_in_symtab (data_in, t, ix);
966}
967
968
969/* For the type T re-materialize it in the type variant list and
970 the pointer/reference-to chains. */
971
972static void
973lto_fixup_prevailing_type (tree t)
974{
975 /* The following re-creates proper variant lists while fixing up
976 the variant leaders. We do not stream TYPE_NEXT_VARIANT so the
977 variant list state before fixup is broken. */
978
979 /* If we are not our own variant leader link us into our new leaders
980 variant list. */
981 if (TYPE_MAIN_VARIANT (t) != t)
982 {
983 tree mv = TYPE_MAIN_VARIANT (t);
984 TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (mv);
985 TYPE_NEXT_VARIANT (mv) = t;
986 }
9b4f7004 987 else if (!TYPE_ATTRIBUTES (t))
a79420f9 988 {
9b4f7004
JJ
989 /* The following reconstructs the pointer chains
990 of the new pointed-to type if we are a main variant. We do
991 not stream those so they are broken before fixup.
992 Don't add it if despite being main variant it has
993 attributes (then it was created with build_distinct_type_copy).
994 Similarly don't add TYPE_REF_IS_RVALUE REFERENCE_TYPEs.
995 Don't add it if there is something in the chain already. */
996 if (TREE_CODE (t) == POINTER_TYPE)
997 {
998 TYPE_NEXT_PTR_TO (t) = TYPE_POINTER_TO (TREE_TYPE (t));
999 TYPE_POINTER_TO (TREE_TYPE (t)) = t;
1000 }
1001 else if (TREE_CODE (t) == REFERENCE_TYPE && !TYPE_REF_IS_RVALUE (t))
1002 {
1003 TYPE_NEXT_REF_TO (t) = TYPE_REFERENCE_TO (TREE_TYPE (t));
1004 TYPE_REFERENCE_TO (TREE_TYPE (t)) = t;
1005 }
a79420f9
ML
1006 }
1007}
1008
1009
1010/* We keep prevailing tree SCCs in a hashtable with manual collision
1011 handling (in case all hashes compare the same) and keep the colliding
1012 entries in the tree_scc->next chain. */
1013
1014struct tree_scc
1015{
1016 tree_scc *next;
1017 /* Hash of the whole SCC. */
1018 hashval_t hash;
1019 /* Number of trees in the SCC. */
1020 unsigned len;
1021 /* Number of possible entries into the SCC (tree nodes [0..entry_len-1]
1022 which share the same individual tree hash). */
1023 unsigned entry_len;
1024 /* The members of the SCC.
1025 We only need to remember the first entry node candidate for prevailing
1026 SCCs (but of course have access to all entries for SCCs we are
1027 processing).
1028 ??? For prevailing SCCs we really only need hash and the first
1029 entry candidate, but that's too awkward to implement. */
1030 tree entries[1];
1031};
1032
1033struct tree_scc_hasher : nofree_ptr_hash <tree_scc>
1034{
1035 static inline hashval_t hash (const tree_scc *);
1036 static inline bool equal (const tree_scc *, const tree_scc *);
1037};
1038
1039hashval_t
1040tree_scc_hasher::hash (const tree_scc *scc)
1041{
1042 return scc->hash;
1043}
1044
1045bool
1046tree_scc_hasher::equal (const tree_scc *scc1, const tree_scc *scc2)
1047{
1048 if (scc1->hash != scc2->hash
1049 || scc1->len != scc2->len
1050 || scc1->entry_len != scc2->entry_len)
1051 return false;
1052 return true;
1053}
1054
1055static hash_table<tree_scc_hasher> *tree_scc_hash;
1056static struct obstack tree_scc_hash_obstack;
1057
1058static unsigned long num_merged_types;
1059static unsigned long num_prevailing_types;
1060static unsigned long num_type_scc_trees;
1061static unsigned long total_scc_size;
1062static unsigned long num_sccs_read;
03d90a20 1063static unsigned long num_unshared_trees_read;
a79420f9
ML
1064static unsigned long total_scc_size_merged;
1065static unsigned long num_sccs_merged;
1066static unsigned long num_scc_compares;
1067static unsigned long num_scc_compare_collisions;
1068
1069
1070/* Compare the two entries T1 and T2 of two SCCs that are possibly equal,
1071 recursing through in-SCC tree edges. Returns true if the SCCs entered
1072 through T1 and T2 are equal and fills in *MAP with the pairs of
1073 SCC entries we visited, starting with (*MAP)[0] = T1 and (*MAP)[1] = T2. */
1074
1075static bool
1076compare_tree_sccs_1 (tree t1, tree t2, tree **map)
1077{
1078 enum tree_code code;
1079
1080 /* Mark already visited nodes. */
1081 TREE_ASM_WRITTEN (t2) = 1;
1082
1083 /* Push the pair onto map. */
1084 (*map)[0] = t1;
1085 (*map)[1] = t2;
1086 *map = *map + 2;
1087
1088 /* Compare value-fields. */
1089#define compare_values(X) \
1090 do { \
1091 if (X(t1) != X(t2)) \
1092 return false; \
1093 } while (0)
1094
1095 compare_values (TREE_CODE);
1096 code = TREE_CODE (t1);
1097
03d90a20
JH
1098 /* If we end up comparing translation unit decls we either forgot to mark
1099 some SCC as local or we compare too much. */
1100 gcc_checking_assert (code != TRANSLATION_UNIT_DECL);
1101
a79420f9
ML
1102 if (!TYPE_P (t1))
1103 {
1104 compare_values (TREE_SIDE_EFFECTS);
1105 compare_values (TREE_CONSTANT);
1106 compare_values (TREE_READONLY);
1107 compare_values (TREE_PUBLIC);
1108 }
1109 compare_values (TREE_ADDRESSABLE);
1110 compare_values (TREE_THIS_VOLATILE);
1111 if (DECL_P (t1))
1112 compare_values (DECL_UNSIGNED);
1113 else if (TYPE_P (t1))
1114 compare_values (TYPE_UNSIGNED);
1115 if (TYPE_P (t1))
1116 compare_values (TYPE_ARTIFICIAL);
1117 else
1118 compare_values (TREE_NO_WARNING);
1119 compare_values (TREE_NOTHROW);
1120 compare_values (TREE_STATIC);
1121 if (code != TREE_BINFO)
1122 compare_values (TREE_PRIVATE);
1123 compare_values (TREE_PROTECTED);
1124 compare_values (TREE_DEPRECATED);
1125 if (TYPE_P (t1))
1126 {
1127 if (AGGREGATE_TYPE_P (t1))
1128 compare_values (TYPE_REVERSE_STORAGE_ORDER);
1129 else
1130 compare_values (TYPE_SATURATING);
1131 compare_values (TYPE_ADDR_SPACE);
1132 }
1133 else if (code == SSA_NAME)
1134 compare_values (SSA_NAME_IS_DEFAULT_DEF);
1135
1136 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
1137 {
1138 if (wi::to_wide (t1) != wi::to_wide (t2))
1139 return false;
1140 }
1141
1142 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
1143 {
1144 /* ??? No suitable compare routine available. */
1145 REAL_VALUE_TYPE r1 = TREE_REAL_CST (t1);
1146 REAL_VALUE_TYPE r2 = TREE_REAL_CST (t2);
1147 if (r1.cl != r2.cl
1148 || r1.decimal != r2.decimal
1149 || r1.sign != r2.sign
1150 || r1.signalling != r2.signalling
1151 || r1.canonical != r2.canonical
1152 || r1.uexp != r2.uexp)
1153 return false;
1154 for (unsigned i = 0; i < SIGSZ; ++i)
1155 if (r1.sig[i] != r2.sig[i])
1156 return false;
1157 }
1158
1159 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
1160 if (!fixed_compare (EQ_EXPR,
1161 TREE_FIXED_CST_PTR (t1), TREE_FIXED_CST_PTR (t2)))
1162 return false;
1163
1164 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
1165 {
1166 compare_values (VECTOR_CST_LOG2_NPATTERNS);
1167 compare_values (VECTOR_CST_NELTS_PER_PATTERN);
1168 }
1169
1170 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1171 {
1172 compare_values (DECL_MODE);
1173 compare_values (DECL_NONLOCAL);
1174 compare_values (DECL_VIRTUAL_P);
1175 compare_values (DECL_IGNORED_P);
1176 compare_values (DECL_ABSTRACT_P);
1177 compare_values (DECL_ARTIFICIAL);
1178 compare_values (DECL_USER_ALIGN);
1179 compare_values (DECL_PRESERVE_P);
1180 compare_values (DECL_EXTERNAL);
eb72dc66 1181 compare_values (DECL_NOT_GIMPLE_REG_P);
a79420f9
ML
1182 compare_values (DECL_ALIGN);
1183 if (code == LABEL_DECL)
1184 {
1185 compare_values (EH_LANDING_PAD_NR);
1186 compare_values (LABEL_DECL_UID);
1187 }
1188 else if (code == FIELD_DECL)
1189 {
1190 compare_values (DECL_PACKED);
1191 compare_values (DECL_NONADDRESSABLE_P);
1192 compare_values (DECL_PADDING_P);
575ac27f 1193 compare_values (DECL_FIELD_ABI_IGNORED);
e902136b 1194 compare_values (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD);
a79420f9 1195 compare_values (DECL_OFFSET_ALIGN);
924033e3 1196 compare_values (DECL_NOT_FLEXARRAY);
a79420f9
ML
1197 }
1198 else if (code == VAR_DECL)
1199 {
1200 compare_values (DECL_HAS_DEBUG_EXPR_P);
1201 compare_values (DECL_NONLOCAL_FRAME);
1202 }
1203 if (code == RESULT_DECL
1204 || code == PARM_DECL
1205 || code == VAR_DECL)
1206 {
1207 compare_values (DECL_BY_REFERENCE);
1208 if (code == VAR_DECL
1209 || code == PARM_DECL)
1210 compare_values (DECL_HAS_VALUE_EXPR_P);
1211 }
1212 }
1213
1214 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
1215 compare_values (DECL_REGISTER);
1216
1217 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1218 {
1219 compare_values (DECL_COMMON);
1220 compare_values (DECL_DLLIMPORT_P);
1221 compare_values (DECL_WEAK);
1222 compare_values (DECL_SEEN_IN_BIND_EXPR_P);
1223 compare_values (DECL_COMDAT);
1224 compare_values (DECL_VISIBILITY);
1225 compare_values (DECL_VISIBILITY_SPECIFIED);
1226 if (code == VAR_DECL)
1227 {
1228 compare_values (DECL_HARD_REGISTER);
ee7a003f 1229 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
a79420f9
ML
1230 compare_values (DECL_IN_CONSTANT_POOL);
1231 }
1232 }
1233
1234 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1235 {
1236 compare_values (DECL_BUILT_IN_CLASS);
1237 compare_values (DECL_STATIC_CONSTRUCTOR);
1238 compare_values (DECL_STATIC_DESTRUCTOR);
1239 compare_values (DECL_UNINLINABLE);
1240 compare_values (DECL_POSSIBLY_INLINED);
1241 compare_values (DECL_IS_NOVOPS);
1242 compare_values (DECL_IS_RETURNS_TWICE);
1243 compare_values (DECL_IS_MALLOC);
21d7bba2 1244 compare_values (FUNCTION_DECL_DECL_TYPE);
a79420f9
ML
1245 compare_values (DECL_DECLARED_INLINE_P);
1246 compare_values (DECL_STATIC_CHAIN);
1247 compare_values (DECL_NO_INLINE_WARNING_P);
1248 compare_values (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT);
1249 compare_values (DECL_NO_LIMIT_STACK);
1250 compare_values (DECL_DISREGARD_INLINE_LIMITS);
1251 compare_values (DECL_PURE_P);
1252 compare_values (DECL_LOOPING_CONST_OR_PURE_P);
70df40ca 1253 compare_values (DECL_IS_REPLACEABLE_OPERATOR);
a79420f9
ML
1254 compare_values (DECL_FINAL_P);
1255 compare_values (DECL_CXX_CONSTRUCTOR_P);
1256 compare_values (DECL_CXX_DESTRUCTOR_P);
1257 if (DECL_BUILT_IN_CLASS (t1) != NOT_BUILT_IN)
4d732405 1258 compare_values (DECL_UNCHECKED_FUNCTION_CODE);
a79420f9
ML
1259 }
1260
1261 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1262 {
1263 compare_values (TYPE_MODE);
a79420f9
ML
1264 compare_values (TYPE_NEEDS_CONSTRUCTING);
1265 if (RECORD_OR_UNION_TYPE_P (t1))
1266 {
1267 compare_values (TYPE_TRANSPARENT_AGGR);
1268 compare_values (TYPE_FINAL_P);
f4af4019 1269 compare_values (TYPE_CXX_ODR_P);
a79420f9
ML
1270 }
1271 else if (code == ARRAY_TYPE)
1272 compare_values (TYPE_NONALIASED_COMPONENT);
f4af4019
JH
1273 if (code == ARRAY_TYPE || code == INTEGER_TYPE)
1274 compare_values (TYPE_STRING_FLAG);
a79420f9
ML
1275 if (AGGREGATE_TYPE_P (t1))
1276 compare_values (TYPE_TYPELESS_STORAGE);
1277 compare_values (TYPE_EMPTY_P);
4fe34cdc 1278 compare_values (TYPE_NO_NAMED_ARGS_STDARG_P);
a79420f9
ML
1279 compare_values (TYPE_PACKED);
1280 compare_values (TYPE_RESTRICT);
1281 compare_values (TYPE_USER_ALIGN);
1282 compare_values (TYPE_READONLY);
1283 compare_values (TYPE_PRECISION);
1284 compare_values (TYPE_ALIGN);
1285 /* Do not compare TYPE_ALIAS_SET. Doing so introduce ordering issues
ee7a003f
ML
1286 with calls to get_alias_set which may initialize it for streamed
1287 in types. */
a79420f9
ML
1288 }
1289
1290 /* We don't want to compare locations, so there is nothing do compare
1291 for TS_EXP. */
1292
1293 /* BLOCKs are function local and we don't merge anything there, so
1294 simply refuse to merge. */
1295 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
1296 return false;
1297
1298 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
1299 if (strcmp (TRANSLATION_UNIT_LANGUAGE (t1),
1300 TRANSLATION_UNIT_LANGUAGE (t2)) != 0)
1301 return false;
1302
1303 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
1304 if (!cl_target_option_eq (TREE_TARGET_OPTION (t1), TREE_TARGET_OPTION (t2)))
1305 return false;
1306
1307 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
1308 if (!cl_optimization_option_eq (TREE_OPTIMIZATION (t1),
1309 TREE_OPTIMIZATION (t2)))
1310 return false;
1311
1312 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1313 if (vec_safe_length (BINFO_BASE_ACCESSES (t1))
1314 != vec_safe_length (BINFO_BASE_ACCESSES (t2)))
1315 return false;
1316
1317 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
551aa757
RB
1318 {
1319 compare_values (CLOBBER_KIND);
1320 compare_values (CONSTRUCTOR_NELTS);
1321 }
a79420f9
ML
1322
1323 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
1324 if (IDENTIFIER_LENGTH (t1) != IDENTIFIER_LENGTH (t2)
1325 || memcmp (IDENTIFIER_POINTER (t1), IDENTIFIER_POINTER (t2),
1326 IDENTIFIER_LENGTH (t1)) != 0)
1327 return false;
1328
1329 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
1330 if (TREE_STRING_LENGTH (t1) != TREE_STRING_LENGTH (t2)
1331 || memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
1332 TREE_STRING_LENGTH (t1)) != 0)
1333 return false;
1334
1335 if (code == OMP_CLAUSE)
1336 {
1337 compare_values (OMP_CLAUSE_CODE);
1338 switch (OMP_CLAUSE_CODE (t1))
1339 {
1340 case OMP_CLAUSE_DEFAULT:
1341 compare_values (OMP_CLAUSE_DEFAULT_KIND);
1342 break;
1343 case OMP_CLAUSE_SCHEDULE:
1344 compare_values (OMP_CLAUSE_SCHEDULE_KIND);
1345 break;
1346 case OMP_CLAUSE_DEPEND:
1347 compare_values (OMP_CLAUSE_DEPEND_KIND);
1348 break;
1349 case OMP_CLAUSE_MAP:
1350 compare_values (OMP_CLAUSE_MAP_KIND);
1351 break;
1352 case OMP_CLAUSE_PROC_BIND:
1353 compare_values (OMP_CLAUSE_PROC_BIND_KIND);
1354 break;
1355 case OMP_CLAUSE_REDUCTION:
1356 compare_values (OMP_CLAUSE_REDUCTION_CODE);
1357 compare_values (OMP_CLAUSE_REDUCTION_GIMPLE_INIT);
1358 compare_values (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE);
1359 break;
1360 default:
1361 break;
1362 }
1363 }
1364
1365#undef compare_values
1366
1367
1368 /* Compare pointer fields. */
1369
1370 /* Recurse. Search & Replaced from DFS_write_tree_body.
1371 Folding the early checks into the compare_tree_edges recursion
1372 macro makes debugging way quicker as you are able to break on
1373 compare_tree_sccs_1 and simply finish until a call returns false
1374 to spot the SCC members with the difference. */
1375#define compare_tree_edges(E1, E2) \
1376 do { \
1377 tree t1_ = (E1), t2_ = (E2); \
1378 if (t1_ != t2_ \
1379 && (!t1_ || !t2_ \
1380 || !TREE_VISITED (t2_) \
1381 || (!TREE_ASM_WRITTEN (t2_) \
1382 && !compare_tree_sccs_1 (t1_, t2_, map)))) \
1383 return false; \
1384 /* Only non-NULL trees outside of the SCC may compare equal. */ \
1385 gcc_checking_assert (t1_ != t2_ || (!t2_ || !TREE_VISITED (t2_))); \
1386 } while (0)
1387
1388 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
1389 {
1390 if (code != IDENTIFIER_NODE)
1391 compare_tree_edges (TREE_TYPE (t1), TREE_TYPE (t2));
1392 }
1393
1394 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
1395 {
1396 /* Note that the number of elements for EXPR has already been emitted
1397 in EXPR's header (see streamer_write_tree_header). */
1398 unsigned int count = vector_cst_encoded_nelts (t1);
1399 for (unsigned int i = 0; i < count; ++i)
1400 compare_tree_edges (VECTOR_CST_ENCODED_ELT (t1, i),
1401 VECTOR_CST_ENCODED_ELT (t2, i));
1402 }
1403
1404 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
1405 {
1406 compare_tree_edges (TREE_REALPART (t1), TREE_REALPART (t2));
1407 compare_tree_edges (TREE_IMAGPART (t1), TREE_IMAGPART (t2));
1408 }
1409
1410 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
1411 {
1412 compare_tree_edges (DECL_NAME (t1), DECL_NAME (t2));
1413 /* ??? Global decls from different TUs have non-matching
1414 TRANSLATION_UNIT_DECLs. Only consider a small set of
1415 decls equivalent, we should not end up merging others. */
1416 if ((code == TYPE_DECL
1417 || code == NAMESPACE_DECL
1418 || code == IMPORTED_DECL
1419 || code == CONST_DECL
1420 || (VAR_OR_FUNCTION_DECL_P (t1)
1421 && (TREE_PUBLIC (t1) || DECL_EXTERNAL (t1))))
1422 && DECL_FILE_SCOPE_P (t1) && DECL_FILE_SCOPE_P (t2))
1423 ;
1424 else
1425 compare_tree_edges (DECL_CONTEXT (t1), DECL_CONTEXT (t2));
1426 }
1427
1428 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1429 {
1430 compare_tree_edges (DECL_SIZE (t1), DECL_SIZE (t2));
1431 compare_tree_edges (DECL_SIZE_UNIT (t1), DECL_SIZE_UNIT (t2));
1432 compare_tree_edges (DECL_ATTRIBUTES (t1), DECL_ATTRIBUTES (t2));
1433 compare_tree_edges (DECL_ABSTRACT_ORIGIN (t1), DECL_ABSTRACT_ORIGIN (t2));
1434 if ((code == VAR_DECL
1435 || code == PARM_DECL)
1436 && DECL_HAS_VALUE_EXPR_P (t1))
1437 compare_tree_edges (DECL_VALUE_EXPR (t1), DECL_VALUE_EXPR (t2));
1438 if (code == VAR_DECL
1439 && DECL_HAS_DEBUG_EXPR_P (t1))
1440 compare_tree_edges (DECL_DEBUG_EXPR (t1), DECL_DEBUG_EXPR (t2));
1441 /* LTO specific edges. */
1442 if (code != FUNCTION_DECL
1443 && code != TRANSLATION_UNIT_DECL)
1444 compare_tree_edges (DECL_INITIAL (t1), DECL_INITIAL (t2));
1445 }
1446
1447 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
1448 {
1449 if (code == FUNCTION_DECL)
1450 {
1451 tree a1, a2;
1452 for (a1 = DECL_ARGUMENTS (t1), a2 = DECL_ARGUMENTS (t2);
1453 a1 || a2;
1454 a1 = TREE_CHAIN (a1), a2 = TREE_CHAIN (a2))
1455 compare_tree_edges (a1, a2);
1456 compare_tree_edges (DECL_RESULT (t1), DECL_RESULT (t2));
1457 }
1458 else if (code == TYPE_DECL)
1459 compare_tree_edges (DECL_ORIGINAL_TYPE (t1), DECL_ORIGINAL_TYPE (t2));
1460 }
1461
1462 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1463 {
1464 /* Make sure we don't inadvertently set the assembler name. */
1465 if (DECL_ASSEMBLER_NAME_SET_P (t1))
1466 compare_tree_edges (DECL_ASSEMBLER_NAME (t1),
1467 DECL_ASSEMBLER_NAME (t2));
1468 }
1469
1470 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1471 {
1472 compare_tree_edges (DECL_FIELD_OFFSET (t1), DECL_FIELD_OFFSET (t2));
1473 compare_tree_edges (DECL_BIT_FIELD_TYPE (t1), DECL_BIT_FIELD_TYPE (t2));
1474 compare_tree_edges (DECL_BIT_FIELD_REPRESENTATIVE (t1),
1475 DECL_BIT_FIELD_REPRESENTATIVE (t2));
1476 compare_tree_edges (DECL_FIELD_BIT_OFFSET (t1),
1477 DECL_FIELD_BIT_OFFSET (t2));
1478 compare_tree_edges (DECL_FCONTEXT (t1), DECL_FCONTEXT (t2));
1479 }
1480
1481 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1482 {
1483 compare_tree_edges (DECL_FUNCTION_PERSONALITY (t1),
1484 DECL_FUNCTION_PERSONALITY (t2));
1485 compare_tree_edges (DECL_VINDEX (t1), DECL_VINDEX (t2));
1486 compare_tree_edges (DECL_FUNCTION_SPECIFIC_TARGET (t1),
1487 DECL_FUNCTION_SPECIFIC_TARGET (t2));
1488 compare_tree_edges (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t1),
1489 DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t2));
1490 }
1491
1492 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1493 {
1494 compare_tree_edges (TYPE_SIZE (t1), TYPE_SIZE (t2));
1495 compare_tree_edges (TYPE_SIZE_UNIT (t1), TYPE_SIZE_UNIT (t2));
1496 compare_tree_edges (TYPE_ATTRIBUTES (t1), TYPE_ATTRIBUTES (t2));
1497 compare_tree_edges (TYPE_NAME (t1), TYPE_NAME (t2));
1498 /* Do not compare TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
1499 reconstructed during fixup. */
1500 /* Do not compare TYPE_NEXT_VARIANT, we reconstruct the variant lists
1501 during fixup. */
1502 compare_tree_edges (TYPE_MAIN_VARIANT (t1), TYPE_MAIN_VARIANT (t2));
1503 /* ??? Global types from different TUs have non-matching
1504 TRANSLATION_UNIT_DECLs. Still merge them if they are otherwise
1505 equal. */
1506 if (TYPE_FILE_SCOPE_P (t1) && TYPE_FILE_SCOPE_P (t2))
1507 ;
1508 else
1509 compare_tree_edges (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2));
1510 /* TYPE_CANONICAL is re-computed during type merging, so do not
1511 compare it here. */
1512 compare_tree_edges (TYPE_STUB_DECL (t1), TYPE_STUB_DECL (t2));
1513 }
1514
1515 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1516 {
3fb68f2e 1517 if (code == ARRAY_TYPE)
a79420f9
ML
1518 compare_tree_edges (TYPE_DOMAIN (t1), TYPE_DOMAIN (t2));
1519 else if (RECORD_OR_UNION_TYPE_P (t1))
1520 {
1521 tree f1, f2;
1522 for (f1 = TYPE_FIELDS (t1), f2 = TYPE_FIELDS (t2);
1523 f1 || f2;
1524 f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
1525 compare_tree_edges (f1, f2);
1526 }
1527 else if (code == FUNCTION_TYPE
1528 || code == METHOD_TYPE)
1529 compare_tree_edges (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2));
1530
1531 if (!POINTER_TYPE_P (t1))
1532 compare_tree_edges (TYPE_MIN_VALUE_RAW (t1), TYPE_MIN_VALUE_RAW (t2));
1533 compare_tree_edges (TYPE_MAX_VALUE_RAW (t1), TYPE_MAX_VALUE_RAW (t2));
1534 }
1535
1536 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1537 {
1538 compare_tree_edges (TREE_PURPOSE (t1), TREE_PURPOSE (t2));
1539 compare_tree_edges (TREE_VALUE (t1), TREE_VALUE (t2));
1540 compare_tree_edges (TREE_CHAIN (t1), TREE_CHAIN (t2));
1541 }
1542
1543 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1544 for (int i = 0; i < TREE_VEC_LENGTH (t1); i++)
1545 compare_tree_edges (TREE_VEC_ELT (t1, i), TREE_VEC_ELT (t2, i));
1546
1547 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1548 {
1549 for (int i = 0; i < TREE_OPERAND_LENGTH (t1); i++)
1550 compare_tree_edges (TREE_OPERAND (t1, i),
1551 TREE_OPERAND (t2, i));
1552
1553 /* BLOCKs are function local and we don't merge anything there. */
1554 if (TREE_BLOCK (t1) || TREE_BLOCK (t2))
1555 return false;
1556 }
1557
1558 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1559 {
1560 unsigned i;
1561 tree t;
1562 /* Lengths have already been compared above. */
1563 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t1), i, t)
1564 compare_tree_edges (t, BINFO_BASE_BINFO (t2, i));
1565 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t1), i, t)
1566 compare_tree_edges (t, BINFO_BASE_ACCESS (t2, i));
1567 compare_tree_edges (BINFO_OFFSET (t1), BINFO_OFFSET (t2));
1568 compare_tree_edges (BINFO_VTABLE (t1), BINFO_VTABLE (t2));
1569 compare_tree_edges (BINFO_VPTR_FIELD (t1), BINFO_VPTR_FIELD (t2));
1570 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1571 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
1572 }
1573
1574 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1575 {
1576 unsigned i;
1577 tree index, value;
1578 /* Lengths have already been compared above. */
1579 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t1), i, index, value)
1580 {
1581 compare_tree_edges (index, CONSTRUCTOR_ELT (t2, i)->index);
1582 compare_tree_edges (value, CONSTRUCTOR_ELT (t2, i)->value);
1583 }
1584 }
1585
1586 if (code == OMP_CLAUSE)
1587 {
1588 int i;
1589
1590 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t1)]; i++)
1591 compare_tree_edges (OMP_CLAUSE_OPERAND (t1, i),
1592 OMP_CLAUSE_OPERAND (t2, i));
1593 compare_tree_edges (OMP_CLAUSE_CHAIN (t1), OMP_CLAUSE_CHAIN (t2));
1594 }
1595
1596#undef compare_tree_edges
1597
1598 return true;
1599}
1600
1601/* Compare the tree scc SCC to the prevailing candidate PSCC, filling
1602 out MAP if they are equal. */
1603
1604static bool
1605compare_tree_sccs (tree_scc *pscc, tree_scc *scc,
1606 tree *map)
1607{
1608 /* Assume SCC entry hashes are sorted after their cardinality. Which
1609 means we can simply take the first n-tuple of equal hashes
1610 (which is recorded as entry_len) and do n SCC entry candidate
1611 comparisons. */
1612 for (unsigned i = 0; i < pscc->entry_len; ++i)
1613 {
1614 tree *mapp = map;
1615 num_scc_compare_collisions++;
1616 if (compare_tree_sccs_1 (pscc->entries[0], scc->entries[i], &mapp))
1617 {
1618 /* Equal - no need to reset TREE_VISITED or TREE_ASM_WRITTEN
1619 on the scc as all trees will be freed. */
1620 return true;
1621 }
1622 /* Reset TREE_ASM_WRITTEN on scc for the next compare or in case
ee7a003f 1623 the SCC prevails. */
a79420f9
ML
1624 for (unsigned j = 0; j < scc->len; ++j)
1625 TREE_ASM_WRITTEN (scc->entries[j]) = 0;
1626 }
1627
1628 return false;
1629}
1630
1631/* QSort sort function to sort a map of two pointers after the 2nd
1632 pointer. */
1633
1634static int
1635cmp_tree (const void *p1_, const void *p2_)
1636{
1637 tree *p1 = (tree *)(const_cast<void *>(p1_));
1638 tree *p2 = (tree *)(const_cast<void *>(p2_));
1639 if (p1[1] == p2[1])
1640 return 0;
1641 return ((uintptr_t)p1[1] < (uintptr_t)p2[1]) ? -1 : 1;
1642}
1643
03d90a20
JH
1644/* New scc of size 1 containing T was streamed in from DATA_IN and not merged.
1645 Register it to reader cache at index FROM. */
1646
1647static void
1648process_dref (class data_in *data_in, tree t, unsigned from)
1649{
1650 struct streamer_tree_cache_d *cache = data_in->reader_cache;
1651 /* If we got a debug reference queued, see if the prevailing
1652 tree has a debug reference and if not, register the one
1653 for the tree we are about to throw away. */
1654 if (dref_queue.length () == 1)
1655 {
1656 dref_entry e = dref_queue.pop ();
1657 gcc_assert (e.decl
1658 == streamer_tree_cache_get_tree (cache, from));
1659 const char *sym;
1660 unsigned HOST_WIDE_INT off;
1661 if (!debug_hooks->die_ref_for_decl (t, &sym, &off))
1662 debug_hooks->register_external_die (t, e.sym, e.off);
1663 }
1664}
1665
a79420f9
ML
1666/* Try to unify the SCC with nodes FROM to FROM + LEN in CACHE and
1667 hash value SCC_HASH with an already recorded SCC. Return true if
1668 that was successful, otherwise return false. */
1669
1670static bool
99b1c316 1671unify_scc (class data_in *data_in, unsigned from,
a79420f9
ML
1672 unsigned len, unsigned scc_entry_len, hashval_t scc_hash)
1673{
1674 bool unified_p = false;
1675 struct streamer_tree_cache_d *cache = data_in->reader_cache;
1676 tree_scc *scc
1677 = (tree_scc *) alloca (sizeof (tree_scc) + (len - 1) * sizeof (tree));
1678 scc->next = NULL;
1679 scc->hash = scc_hash;
1680 scc->len = len;
1681 scc->entry_len = scc_entry_len;
1682 for (unsigned i = 0; i < len; ++i)
1683 {
1684 tree t = streamer_tree_cache_get_tree (cache, from + i);
1685 scc->entries[i] = t;
03d90a20
JH
1686 /* These types should be streamed as unshared. */
1687 gcc_checking_assert
1688 (!(TREE_CODE (t) == TRANSLATION_UNIT_DECL
1689 || (VAR_OR_FUNCTION_DECL_P (t)
1690 && !(TREE_PUBLIC (t) || DECL_EXTERNAL (t)))
1691 || TREE_CODE (t) == LABEL_DECL
1692 || (TREE_CODE (t) == NAMESPACE_DECL && !DECL_NAME (t))
1693 || (TYPE_P (t)
1694 && type_with_linkage_p (TYPE_MAIN_VARIANT (t))
1695 && type_in_anonymous_namespace_p (TYPE_MAIN_VARIANT (t)))));
a79420f9
ML
1696 }
1697
1698 /* Look for the list of candidate SCCs to compare against. */
1699 tree_scc **slot;
1700 slot = tree_scc_hash->find_slot_with_hash (scc, scc_hash, INSERT);
1701 if (*slot)
1702 {
1703 /* Try unifying against each candidate. */
1704 num_scc_compares++;
1705
1706 /* Set TREE_VISITED on the scc so we can easily identify tree nodes
1707 outside of the scc when following tree edges. Make sure
1708 that TREE_ASM_WRITTEN is unset so we can use it as 2nd bit
1709 to track whether we visited the SCC member during the compare.
1710 We cannot use TREE_VISITED on the pscc members as the extended
1711 scc and pscc can overlap. */
1712 for (unsigned i = 0; i < scc->len; ++i)
1713 {
1714 TREE_VISITED (scc->entries[i]) = 1;
1715 gcc_checking_assert (!TREE_ASM_WRITTEN (scc->entries[i]));
1716 }
1717
1718 tree *map = XALLOCAVEC (tree, 2 * len);
1719 for (tree_scc *pscc = *slot; pscc; pscc = pscc->next)
1720 {
1721 if (!compare_tree_sccs (pscc, scc, map))
1722 continue;
1723
1724 /* Found an equal SCC. */
1725 unified_p = true;
1726 num_scc_compare_collisions--;
1727 num_sccs_merged++;
1728 total_scc_size_merged += len;
1729
1730 if (flag_checking)
1731 for (unsigned i = 0; i < len; ++i)
1732 {
1733 tree t = map[2*i+1];
1734 enum tree_code code = TREE_CODE (t);
1735 /* IDENTIFIER_NODEs should be singletons and are merged by the
1736 streamer. The others should be singletons, too, and we
1737 should not merge them in any way. */
1738 gcc_assert (code != TRANSLATION_UNIT_DECL
1739 && code != IDENTIFIER_NODE);
1740 }
1741
1742 /* Fixup the streamer cache with the prevailing nodes according
1743 to the tree node mapping computed by compare_tree_sccs. */
1744 if (len == 1)
1745 {
03d90a20 1746 process_dref (data_in, pscc->entries[0], from);
a79420f9
ML
1747 lto_maybe_register_decl (data_in, pscc->entries[0], from);
1748 streamer_tree_cache_replace_tree (cache, pscc->entries[0], from);
1749 }
1750 else
1751 {
1752 tree *map2 = XALLOCAVEC (tree, 2 * len);
1753 for (unsigned i = 0; i < len; ++i)
1754 {
1755 map2[i*2] = (tree)(uintptr_t)(from + i);
1756 map2[i*2+1] = scc->entries[i];
1757 }
1758 qsort (map2, len, 2 * sizeof (tree), cmp_tree);
1759 qsort (map, len, 2 * sizeof (tree), cmp_tree);
1760 for (unsigned i = 0; i < len; ++i)
1761 {
1762 lto_maybe_register_decl (data_in, map[2*i],
1763 (uintptr_t)map2[2*i]);
1764 streamer_tree_cache_replace_tree (cache, map[2*i],
1765 (uintptr_t)map2[2*i]);
1766 }
1767 }
1768
1769 /* Free the tree nodes from the read SCC. */
1770 data_in->location_cache.revert_location_cache ();
1771 for (unsigned i = 0; i < len; ++i)
1772 {
1773 if (TYPE_P (scc->entries[i]))
1774 num_merged_types++;
1775 free_node (scc->entries[i]);
1776 }
1777
1778 /* Drop DIE references.
1779 ??? Do as in the size-one SCC case which involves sorting
1780 the queue. */
1781 dref_queue.truncate (0);
1782
1783 break;
1784 }
1785
1786 /* Reset TREE_VISITED if we didn't unify the SCC with another. */
1787 if (!unified_p)
1788 for (unsigned i = 0; i < scc->len; ++i)
1789 TREE_VISITED (scc->entries[i]) = 0;
1790 }
1791
1792 /* If we didn't unify it to any candidate duplicate the relevant
1793 pieces to permanent storage and link it into the chain. */
1794 if (!unified_p)
1795 {
1796 tree_scc *pscc
1797 = XOBNEWVAR (&tree_scc_hash_obstack, tree_scc, sizeof (tree_scc));
1798 memcpy (pscc, scc, sizeof (tree_scc));
1799 pscc->next = (*slot);
1800 *slot = pscc;
1801 }
1802 return unified_p;
1803}
1804
03d90a20 1805typedef int_hash<unsigned, 0, UINT_MAX> code_id_hash;
a79420f9 1806
03d90a20
JH
1807/* Do registering necessary once new tree fully streamed in (including all
1808 trees it reffers to). */
1809
1810static void
1811process_new_tree (tree t, hash_map <code_id_hash, unsigned> *hm,
1812 unsigned index, unsigned *total, class data_in *data_in)
1813{
1814 /* Reconstruct the type variant and pointer-to/reference-to
1815 chains. */
1816 if (TYPE_P (t))
1817 {
1818 /* Map the tree types to their frequencies. */
1819 if (flag_lto_dump_type_stats)
1820 {
1821 unsigned key = (unsigned) TREE_CODE (t);
1822 unsigned *countp = hm->get (key);
1823 hm->put (key, countp ? (*countp) + 1 : 1);
1824 (*total)++;
1825 }
1826
1827 num_prevailing_types++;
1828 lto_fixup_prevailing_type (t);
1829
1830 /* Compute the canonical type of all non-ODR types.
1831 Delay ODR types for the end of merging process - the canonical
1832 type for those can be computed using the (unique) name however
1833 we want to do this only if units in other languages do not
1834 contain structurally equivalent type.
1835
1836 Because SCC components are streamed in random (hash) order
1837 we may have encountered the type before while registering
1838 type canonical of a derived type in the same SCC. */
1839 if (!TYPE_CANONICAL (t))
1840 {
1841 if (!RECORD_OR_UNION_TYPE_P (t)
1842 || !TYPE_CXX_ODR_P (t))
1843 gimple_register_canonical_type (t);
1844 else if (COMPLETE_TYPE_P (t))
1845 vec_safe_push (types_to_register, t);
1846 }
1847 if (TYPE_MAIN_VARIANT (t) == t && odr_type_p (t))
1848 register_odr_type (t);
1849 }
1850 /* Link shared INTEGER_CSTs into TYPE_CACHED_VALUEs of its
1851 type which is also member of this SCC. */
1852 if (TREE_CODE (t) == INTEGER_CST
1853 && !TREE_OVERFLOW (t))
1854 cache_integer_cst (t);
1855 if (!flag_ltrans)
1856 {
1857 lto_maybe_register_decl (data_in, t, index);
1858 /* Scan the tree for references to global functions or
1859 variables and record those for later fixup. */
1860 if (mentions_vars_p (t))
1861 vec_safe_push (tree_with_vars, t);
1862 }
1863}
a0276c00 1864
a79420f9
ML
1865/* Read all the symbols from buffer DATA, using descriptors in DECL_DATA.
1866 RESOLUTIONS is the set of symbols picked by the linker (read from the
1867 resolution file when the linker plugin is being used). */
1868
1869static void
1870lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
1871 vec<ld_plugin_symbol_resolution_t> resolutions)
1872{
1873 const struct lto_decl_header *header = (const struct lto_decl_header *) data;
1874 const int decl_offset = sizeof (struct lto_decl_header);
1875 const int main_offset = decl_offset + header->decl_state_size;
1876 const int string_offset = main_offset + header->main_size;
99b1c316 1877 class data_in *data_in;
a79420f9
ML
1878 unsigned int i;
1879 const uint32_t *data_ptr, *data_end;
1880 uint32_t num_decl_states;
1881
1882 lto_input_block ib_main ((const char *) data + main_offset,
1883 header->main_size, decl_data->mode_table);
1884
1885 data_in = lto_data_in_create (decl_data, (const char *) data + string_offset,
1886 header->string_size, resolutions);
1887
1888 /* We do not uniquify the pre-loaded cache entries, those are middle-end
1889 internal types that should not be merged. */
1890
66d62d9f
HK
1891 hash_map <code_id_hash, unsigned> hm;
1892 unsigned total = 0;
1893
a79420f9
ML
1894 /* Read the global declarations and types. */
1895 while (ib_main.p < ib_main.len)
1896 {
1897 tree t;
1898 unsigned from = data_in->reader_cache->nodes.length ();
1899 /* Read and uniquify SCCs as in the input stream. */
1900 enum LTO_tags tag = streamer_read_record_start (&ib_main);
03d90a20 1901 if (tag == LTO_tree_scc || tag == LTO_trees)
a79420f9
ML
1902 {
1903 unsigned len_;
1904 unsigned scc_entry_len;
03d90a20
JH
1905
1906 /* Because we stream in SCC order we know that all unshared trees
1907 are now fully streamed. Process them. */
a79420f9 1908 hashval_t scc_hash = lto_input_scc (&ib_main, data_in, &len_,
03d90a20
JH
1909 &scc_entry_len,
1910 tag == LTO_tree_scc);
a79420f9
ML
1911 unsigned len = data_in->reader_cache->nodes.length () - from;
1912 gcc_assert (len == len_);
1913
03d90a20
JH
1914 if (tag == LTO_tree_scc)
1915 {
1916 total_scc_size += len;
1917 num_sccs_read++;
1918 }
1919 else
1920 num_unshared_trees_read += len;
a79420f9
ML
1921
1922 /* We have the special case of size-1 SCCs that are pre-merged
1923 by means of identifier and string sharing for example.
1924 ??? Maybe we should avoid streaming those as SCCs. */
1925 tree first = streamer_tree_cache_get_tree (data_in->reader_cache,
1926 from);
03d90a20
JH
1927 /* Identifier and integers are shared specially, they should never
1928 go by the tree merging path. */
1929 gcc_checking_assert ((TREE_CODE (first) != IDENTIFIER_NODE
1930 && (TREE_CODE (first) != INTEGER_CST
1931 || TREE_OVERFLOW (first)))
1932 || len != 1);
a79420f9
ML
1933
1934 /* Try to unify the SCC with already existing ones. */
03d90a20 1935 if (!flag_ltrans && tag != LTO_trees
a79420f9
ML
1936 && unify_scc (data_in, from,
1937 len, scc_entry_len, scc_hash))
1938 continue;
1939
1940 /* Tree merging failed, mark entries in location cache as
1941 permanent. */
1942 data_in->location_cache.accept_location_cache ();
1943
1944 bool seen_type = false;
1945 for (unsigned i = 0; i < len; ++i)
1946 {
1947 tree t = streamer_tree_cache_get_tree (data_in->reader_cache,
1948 from + i);
03d90a20 1949 process_new_tree (t, &hm, from + i, &total, data_in);
a79420f9 1950 if (TYPE_P (t))
03d90a20 1951 seen_type = true;
a79420f9
ML
1952 }
1953
1954 /* Register DECLs with the debuginfo machinery. */
1955 while (!dref_queue.is_empty ())
1956 {
1957 dref_entry e = dref_queue.pop ();
1958 debug_hooks->register_external_die (e.decl, e.sym, e.off);
1959 }
1960
1961 if (seen_type)
1962 num_type_scc_trees += len;
1963 }
1964 else
1965 {
a79420f9 1966 t = lto_input_tree_1 (&ib_main, data_in, tag, 0);
bcb63eb2
JH
1967 gcc_assert (data_in->reader_cache->nodes.length () == from + 1);
1968 num_unshared_trees_read++;
1969 data_in->location_cache.accept_location_cache ();
1970 process_dref (data_in, t, from);
1971 if (TREE_CODE (t) == IDENTIFIER_NODE
1972 || (TREE_CODE (t) == INTEGER_CST
1973 && !TREE_OVERFLOW (t)))
1974 ;
1975 else
03d90a20 1976 {
bcb63eb2
JH
1977 lto_maybe_register_decl (data_in, t, from);
1978 process_new_tree (t, &hm, from, &total, data_in);
03d90a20 1979 }
a79420f9
ML
1980 }
1981 }
66d62d9f
HK
1982
1983 /* Dump type statistics. */
1984 if (flag_lto_dump_type_stats)
1985 {
1986 fprintf (stdout, " Type Frequency Percentage\n\n");
1987 for (hash_map<code_id_hash, unsigned>::iterator itr = hm.begin ();
1988 itr != hm.end ();
1989 ++itr)
1990 {
1991 std::pair<unsigned, unsigned> p = *itr;
1992 enum tree_code code = (enum tree_code) p.first;
1993 fprintf (stdout, "%14s %6d %12.2f\n", get_tree_code_name (code),
1994 p.second, float (p.second)/total*100);
1995 }
1996 }
1997
a79420f9
ML
1998 data_in->location_cache.apply_location_cache ();
1999
2000 /* Read in lto_in_decl_state objects. */
ee7a003f
ML
2001 data_ptr = (const uint32_t *) ((const char*) data + decl_offset);
2002 data_end
2003 = (const uint32_t *) ((const char*) data_ptr + header->decl_state_size);
a79420f9 2004 num_decl_states = *data_ptr++;
ee7a003f 2005
a79420f9
ML
2006 gcc_assert (num_decl_states > 0);
2007 decl_data->global_decl_state = lto_new_in_decl_state ();
2008 data_ptr = lto_read_in_decl_state (data_in, data_ptr,
2009 decl_data->global_decl_state);
2010
2011 /* Read in per-function decl states and enter them in hash table. */
ee7a003f
ML
2012 decl_data->function_decl_states
2013 = hash_table<decl_state_hasher>::create_ggc (37);
a79420f9
ML
2014
2015 for (i = 1; i < num_decl_states; i++)
2016 {
2017 struct lto_in_decl_state *state = lto_new_in_decl_state ();
2018
2019 data_ptr = lto_read_in_decl_state (data_in, data_ptr, state);
2020 lto_in_decl_state **slot
2021 = decl_data->function_decl_states->find_slot (state, INSERT);
2022 gcc_assert (*slot == NULL);
2023 *slot = state;
2024 }
2025
2026 if (data_ptr != data_end)
2027 internal_error ("bytecode stream: garbage at the end of symbols section");
2028
ee7a003f 2029 /* Set the current decl state to be the global state. */
a79420f9
ML
2030 decl_data->current_decl_state = decl_data->global_decl_state;
2031
2032 lto_data_in_delete (data_in);
2033}
2034
2035/* Custom version of strtoll, which is not portable. */
2036
2037static int64_t
2038lto_parse_hex (const char *p)
2039{
2040 int64_t ret = 0;
2041
2042 for (; *p != '\0'; ++p)
2043 {
2044 char c = *p;
2045 unsigned char part;
2046 ret <<= 4;
2047 if (c >= '0' && c <= '9')
ee7a003f 2048 part = c - '0';
a79420f9 2049 else if (c >= 'a' && c <= 'f')
ee7a003f 2050 part = c - 'a' + 10;
a79420f9 2051 else if (c >= 'A' && c <= 'F')
ee7a003f 2052 part = c - 'A' + 10;
a79420f9 2053 else
ee7a003f 2054 internal_error ("could not parse hex number");
a79420f9
ML
2055 ret |= part;
2056 }
2057
2058 return ret;
2059}
2060
ee7a003f
ML
2061/* Read resolution for file named FILE_NAME. The resolution is read from
2062 RESOLUTION. */
a79420f9
ML
2063
2064static void
2065lto_resolution_read (splay_tree file_ids, FILE *resolution, lto_file *file)
2066{
2067 /* We require that objects in the resolution file are in the same
ee7a003f 2068 order as the lto1 command line. */
a79420f9
ML
2069 unsigned int name_len;
2070 char *obj_name;
2071 unsigned int num_symbols;
2072 unsigned int i;
2073 struct lto_file_decl_data *file_data;
ee7a003f 2074 splay_tree_node nd = NULL;
a79420f9
ML
2075
2076 if (!resolution)
2077 return;
2078
2079 name_len = strlen (file->filename);
2080 obj_name = XNEWVEC (char, name_len + 1);
ee7a003f 2081 fscanf (resolution, " "); /* Read white space. */
a79420f9
ML
2082
2083 fread (obj_name, sizeof (char), name_len, resolution);
2084 obj_name[name_len] = '\0';
2085 if (filename_cmp (obj_name, file->filename) != 0)
2086 internal_error ("unexpected file name %s in linker resolution file. "
2087 "Expected %s", obj_name, file->filename);
2088 if (file->offset != 0)
2089 {
2090 int t;
2091 char offset_p[17];
2092 int64_t offset;
2093 t = fscanf (resolution, "@0x%16s", offset_p);
2094 if (t != 1)
ee7a003f 2095 internal_error ("could not parse file offset");
a79420f9
ML
2096 offset = lto_parse_hex (offset_p);
2097 if (offset != file->offset)
ee7a003f 2098 internal_error ("unexpected offset");
a79420f9
ML
2099 }
2100
2101 free (obj_name);
2102
2103 fscanf (resolution, "%u", &num_symbols);
2104
2105 for (i = 0; i < num_symbols; i++)
2106 {
2107 int t;
2108 unsigned index;
2109 unsigned HOST_WIDE_INT id;
2110 char r_str[27];
2111 enum ld_plugin_symbol_resolution r = (enum ld_plugin_symbol_resolution) 0;
2112 unsigned int j;
ca32b29e 2113 unsigned int lto_resolution_str_len = ARRAY_SIZE (lto_resolution_str);
a79420f9
ML
2114 res_pair rp;
2115
ee7a003f
ML
2116 t = fscanf (resolution, "%u " HOST_WIDE_INT_PRINT_HEX_PURE
2117 " %26s %*[^\n]\n", &index, &id, r_str);
a79420f9 2118 if (t != 3)
ee7a003f 2119 internal_error ("invalid line in the resolution file");
a79420f9
ML
2120
2121 for (j = 0; j < lto_resolution_str_len; j++)
2122 {
2123 if (strcmp (lto_resolution_str[j], r_str) == 0)
2124 {
2125 r = (enum ld_plugin_symbol_resolution) j;
39ebd3a9
JH
2126 /* Incremental linking together with -fwhole-program may seem
2127 somewhat contradictionary (as the point of incremental linking
2128 is to allow re-linking with more symbols later) but it is
2129 used to build LTO kernel. We want to hide all symbols that
2130 are not explicitely marked as exported and thus turn
2131 LDPR_PREVAILING_DEF_IRONLY_EXP
2132 to LDPR_PREVAILING_DEF_IRONLY. */
2133 if (flag_whole_program
2134 && flag_incremental_link == INCREMENTAL_LINK_NOLTO
2135 && r == LDPR_PREVAILING_DEF_IRONLY_EXP)
2136 r = LDPR_PREVAILING_DEF_IRONLY;
a79420f9
ML
2137 break;
2138 }
2139 }
2140 if (j == lto_resolution_str_len)
2141 internal_error ("invalid resolution in the resolution file");
2142
2143 if (!(nd && lto_splay_tree_id_equal_p (nd->key, id)))
2144 {
2145 nd = lto_splay_tree_lookup (file_ids, id);
2146 if (nd == NULL)
2147 internal_error ("resolution sub id %wx not in object file", id);
2148 }
2149
2150 file_data = (struct lto_file_decl_data *)nd->value;
ee7a003f
ML
2151 /* The indexes are very sparse. To save memory save them in a compact
2152 format that is only unpacked later when the subfile is processed. */
a79420f9
ML
2153 rp.res = r;
2154 rp.index = index;
2155 file_data->respairs.safe_push (rp);
2156 if (file_data->max_index < index)
ee7a003f 2157 file_data->max_index = index;
a79420f9
ML
2158 }
2159}
2160
ee7a003f 2161/* List of file_decl_datas. */
a79420f9 2162struct file_data_list
ee7a003f
ML
2163{
2164 struct lto_file_decl_data *first, *last;
2165};
a79420f9
ML
2166
2167/* Is the name for a id'ed LTO section? */
2168
ee7a003f 2169static int
a79420f9
ML
2170lto_section_with_id (const char *name, unsigned HOST_WIDE_INT *id)
2171{
2172 const char *s;
2173
2174 if (strncmp (name, section_name_prefix, strlen (section_name_prefix)))
2175 return 0;
2176 s = strrchr (name, '.');
2177 if (!s)
2178 return 0;
2179 /* If the section is not suffixed with an ID return. */
2180 if ((size_t)(s - name) == strlen (section_name_prefix))
2181 return 0;
2182 return sscanf (s, "." HOST_WIDE_INT_PRINT_HEX_PURE, id) == 1;
2183}
2184
ee7a003f 2185/* Create file_data of each sub file id. */
a79420f9 2186
ee7a003f 2187static int
a79420f9 2188create_subid_section_table (struct lto_section_slot *ls, splay_tree file_ids,
ee7a003f 2189 struct file_data_list *list)
a79420f9
ML
2190{
2191 struct lto_section_slot s_slot, *new_slot;
2192 unsigned HOST_WIDE_INT id;
2193 splay_tree_node nd;
2194 void **hash_slot;
2195 char *new_name;
2196 struct lto_file_decl_data *file_data;
2197
2198 if (!lto_section_with_id (ls->name, &id))
2199 return 1;
ee7a003f
ML
2200
2201 /* Find hash table of sub module id. */
a79420f9
ML
2202 nd = lto_splay_tree_lookup (file_ids, id);
2203 if (nd != NULL)
2204 {
2205 file_data = (struct lto_file_decl_data *)nd->value;
2206 }
2207 else
2208 {
2209 file_data = ggc_alloc<lto_file_decl_data> ();
2210 memset(file_data, 0, sizeof (struct lto_file_decl_data));
2211 file_data->id = id;
2212 file_data->section_hash_table = lto_obj_create_section_hash_table ();
2213 lto_splay_tree_insert (file_ids, id, file_data);
2214
ee7a003f 2215 /* Maintain list in linker order. */
a79420f9 2216 if (!list->first)
ee7a003f 2217 list->first = file_data;
a79420f9 2218 if (list->last)
ee7a003f
ML
2219 list->last->next = file_data;
2220
a79420f9
ML
2221 list->last = file_data;
2222 }
2223
ee7a003f 2224 /* Copy section into sub module hash table. */
a79420f9
ML
2225 new_name = XDUPVEC (char, ls->name, strlen (ls->name) + 1);
2226 s_slot.name = new_name;
2227 hash_slot = htab_find_slot (file_data->section_hash_table, &s_slot, INSERT);
2228 gcc_assert (*hash_slot == NULL);
2229
2230 new_slot = XDUP (struct lto_section_slot, ls);
2231 new_slot->name = new_name;
2232 *hash_slot = new_slot;
2233 return 1;
2234}
2235
ee7a003f 2236/* Read declarations and other initializations for a FILE_DATA. */
a79420f9
ML
2237
2238static void
ebad2eee
JH
2239lto_file_finalize (struct lto_file_decl_data *file_data, lto_file *file,
2240 int order)
a79420f9
ML
2241{
2242 const char *data;
2243 size_t len;
2244 vec<ld_plugin_symbol_resolution_t>
2245 resolutions = vNULL;
2246 int i;
2247 res_pair *rp;
2248
ee7a003f
ML
2249 /* Create vector for fast access of resolution. We do this lazily
2250 to save memory. */
cb3874dc 2251 resolutions.safe_grow_cleared (file_data->max_index + 1, true);
a79420f9
ML
2252 for (i = 0; file_data->respairs.iterate (i, &rp); i++)
2253 resolutions[rp->index] = rp->res;
2254 file_data->respairs.release ();
2255
2256 file_data->renaming_hash_table = lto_create_renaming_table ();
2257 file_data->file_name = file->filename;
ebad2eee 2258 file_data->order = order;
88614dfa
ML
2259
2260 /* Read and verify LTO section. */
3c56d8d8 2261 data = lto_get_summary_section_data (file_data, LTO_section_lto, &len);
88614dfa
ML
2262 if (data == NULL)
2263 {
2264 fatal_error (input_location, "bytecode stream in file %qs generated "
2265 "with GCC compiler older than 10.0", file_data->file_name);
2266 return;
2267 }
2268
70980ea2 2269 memcpy (&file_data->lto_section_header, data, sizeof (lto_section));
88614dfa
ML
2270 lto_check_version (file_data->lto_section_header.major_version,
2271 file_data->lto_section_header.minor_version,
2272 file_data->file_name);
2273
b835645c
ML
2274#ifdef ACCEL_COMPILER
2275 lto_input_mode_table (file_data);
2276#else
2277 file_data->mode_table = lto_mode_identity_table;
2278#endif
2279
3c56d8d8 2280 data = lto_get_summary_section_data (file_data, LTO_section_decls, &len);
a79420f9
ML
2281 if (data == NULL)
2282 {
0ecf545c
MS
2283 internal_error ("cannot read %<LTO_section_decls%> from %s",
2284 file_data->file_name);
a79420f9
ML
2285 return;
2286 }
ee7a003f 2287 /* Frees resolutions. */
a79420f9
ML
2288 lto_read_decls (file_data, data, resolutions);
2289 lto_free_section_data (file_data, LTO_section_decls, NULL, data, len);
2290}
2291
ee7a003f 2292/* Finalize FILE_DATA in FILE and increase COUNT. */
a79420f9 2293
ee7a003f 2294static int
a79420f9 2295lto_create_files_from_ids (lto_file *file, struct lto_file_decl_data *file_data,
ebad2eee 2296 int *count, int order)
a79420f9 2297{
ebad2eee 2298 lto_file_finalize (file_data, file, order);
a79420f9
ML
2299 if (symtab->dump_file)
2300 fprintf (symtab->dump_file,
2301 "Creating file %s with sub id " HOST_WIDE_INT_PRINT_HEX "\n",
2302 file_data->file_name, file_data->id);
2303 (*count)++;
2304 return 0;
2305}
2306
2307/* Generate a TREE representation for all types and external decls
ee7a003f 2308 entities in FILE.
a79420f9
ML
2309
2310 Read all of the globals out of the file. Then read the cgraph
2311 and process the .o index into the cgraph nodes so that it can open
ee7a003f 2312 the .o file to load the functions and ipa information. */
a79420f9
ML
2313
2314static struct lto_file_decl_data *
2315lto_file_read (lto_file *file, FILE *resolution_file, int *count)
2316{
2317 struct lto_file_decl_data *file_data = NULL;
2318 splay_tree file_ids;
2319 htab_t section_hash_table;
2320 struct lto_section_slot *section;
2321 struct file_data_list file_list;
2322 struct lto_section_list section_list;
ee7a003f
ML
2323
2324 memset (&section_list, 0, sizeof (struct lto_section_list));
a79420f9
ML
2325 section_hash_table = lto_obj_build_section_table (file, &section_list);
2326
66d62d9f
HK
2327 /* Dump the details of LTO objects. */
2328 if (flag_lto_dump_objects)
2329 {
2330 int i=0;
2331 fprintf (stdout, "\n LTO Object Name: %s\n", file->filename);
2332 fprintf (stdout, "\nNo. Offset Size Section Name\n\n");
2333 for (section = section_list.first; section != NULL; section = section->next)
03de2955
RO
2334 fprintf (stdout, "%2d %8" PRId64 " %8" PRIu64 " %s\n",
2335 ++i, (int64_t) section->start, (uint64_t) section->len,
2336 section->name);
66d62d9f
HK
2337 }
2338
a79420f9 2339 /* Find all sub modules in the object and put their sections into new hash
ee7a003f 2340 tables in a splay tree. */
a79420f9
ML
2341 file_ids = lto_splay_tree_new ();
2342 memset (&file_list, 0, sizeof (struct file_data_list));
2343 for (section = section_list.first; section != NULL; section = section->next)
2344 create_subid_section_table (section, file_ids, &file_list);
2345
ee7a003f 2346 /* Add resolutions to file ids. */
a79420f9
ML
2347 lto_resolution_read (file_ids, resolution_file, file);
2348
ee7a003f 2349 /* Finalize each lto file for each submodule in the merged object. */
ebad2eee 2350 int order = 0;
ee7a003f
ML
2351 for (file_data = file_list.first; file_data != NULL;
2352 file_data = file_data->next)
ebad2eee 2353 lto_create_files_from_ids (file, file_data, count, order++);
ee7a003f 2354
a79420f9
ML
2355 splay_tree_delete (file_ids);
2356 htab_delete (section_hash_table);
2357
2358 return file_list.first;
2359}
2360
2361#if HAVE_MMAP_FILE && HAVE_SYSCONF && defined _SC_PAGE_SIZE
2362#define LTO_MMAP_IO 1
2363#endif
2364
2365#if LTO_MMAP_IO
2366/* Page size of machine is used for mmap and munmap calls. */
2367static size_t page_mask;
2368#endif
2369
2370/* Get the section data of length LEN from FILENAME starting at
2371 OFFSET. The data segment must be freed by the caller when the
2372 caller is finished. Returns NULL if all was not well. */
2373
2374static char *
2375lto_read_section_data (struct lto_file_decl_data *file_data,
2376 intptr_t offset, size_t len)
2377{
2378 char *result;
2379 static int fd = -1;
2380 static char *fd_name;
2381#if LTO_MMAP_IO
2382 intptr_t computed_len;
2383 intptr_t computed_offset;
2384 intptr_t diff;
2385#endif
2386
2387 /* Keep a single-entry file-descriptor cache. The last file we
2388 touched will get closed at exit.
2389 ??? Eventually we want to add a more sophisticated larger cache
2390 or rather fix function body streaming to not stream them in
2391 practically random order. */
2392 if (fd != -1
2393 && filename_cmp (fd_name, file_data->file_name) != 0)
2394 {
2395 free (fd_name);
2396 close (fd);
2397 fd = -1;
2398 }
2399 if (fd == -1)
2400 {
2401 fd = open (file_data->file_name, O_RDONLY|O_BINARY);
2402 if (fd == -1)
ee7a003f 2403 {
a79420f9
ML
2404 fatal_error (input_location, "Cannot open %s", file_data->file_name);
2405 return NULL;
ee7a003f 2406 }
a79420f9
ML
2407 fd_name = xstrdup (file_data->file_name);
2408 }
2409
2410#if LTO_MMAP_IO
2411 if (!page_mask)
2412 {
2413 size_t page_size = sysconf (_SC_PAGE_SIZE);
2414 page_mask = ~(page_size - 1);
2415 }
2416
2417 computed_offset = offset & page_mask;
2418 diff = offset - computed_offset;
2419 computed_len = len + diff;
2420
2421 result = (char *) mmap (NULL, computed_len, PROT_READ, MAP_PRIVATE,
2422 fd, computed_offset);
2423 if (result == MAP_FAILED)
2424 {
2425 fatal_error (input_location, "Cannot map %s", file_data->file_name);
2426 return NULL;
2427 }
2428
2429 return result + diff;
2430#else
2431 result = (char *) xmalloc (len);
2432 if (lseek (fd, offset, SEEK_SET) != offset
2433 || read (fd, result, len) != (ssize_t) len)
2434 {
2435 free (result);
2436 fatal_error (input_location, "Cannot read %s", file_data->file_name);
2437 result = NULL;
2438 }
2439#ifdef __MINGW32__
ee7a003f
ML
2440 /* Native windows doesn't supports delayed unlink on opened file. So
2441 we close file here again. This produces higher I/O load, but at least
a79420f9
ML
2442 it prevents to have dangling file handles preventing unlink. */
2443 free (fd_name);
2444 fd_name = NULL;
2445 close (fd);
2446 fd = -1;
2447#endif
2448 return result;
2449#endif
ee7a003f 2450}
a79420f9
ML
2451
2452
2453/* Get the section data from FILE_DATA of SECTION_TYPE with NAME.
2454 NAME will be NULL unless the section type is for a function
2455 body. */
2456
2457static const char *
2458get_section_data (struct lto_file_decl_data *file_data,
3c56d8d8
ML
2459 enum lto_section_type section_type,
2460 const char *name, int order,
2461 size_t *len)
a79420f9
ML
2462{
2463 htab_t section_hash_table = file_data->section_hash_table;
2464 struct lto_section_slot *f_slot;
2465 struct lto_section_slot s_slot;
ee7a003f 2466 const char *section_name = lto_get_section_name (section_type, name,
3c56d8d8 2467 order, file_data);
a79420f9
ML
2468 char *data = NULL;
2469
2470 *len = 0;
2471 s_slot.name = section_name;
2472 f_slot = (struct lto_section_slot *) htab_find (section_hash_table, &s_slot);
2473 if (f_slot)
2474 {
2475 data = lto_read_section_data (file_data, f_slot->start, f_slot->len);
2476 *len = f_slot->len;
2477 }
2478
2479 free (CONST_CAST (char *, section_name));
2480 return data;
2481}
2482
2483
2484/* Free the section data from FILE_DATA of SECTION_TYPE with NAME that
2485 starts at OFFSET and has LEN bytes. */
2486
2487static void
2488free_section_data (struct lto_file_decl_data *file_data ATTRIBUTE_UNUSED,
2489 enum lto_section_type section_type ATTRIBUTE_UNUSED,
2490 const char *name ATTRIBUTE_UNUSED,
2491 const char *offset, size_t len ATTRIBUTE_UNUSED)
2492{
2493#if LTO_MMAP_IO
2494 intptr_t computed_len;
2495 intptr_t computed_offset;
2496 intptr_t diff;
2497#endif
2498
2499#if LTO_MMAP_IO
2500 computed_offset = ((intptr_t) offset) & page_mask;
2501 diff = (intptr_t) offset - computed_offset;
2502 computed_len = len + diff;
2503
2504 munmap ((caddr_t) computed_offset, computed_len);
2505#else
2506 free (CONST_CAST(char *, offset));
2507#endif
2508}
2509
2510static lto_file *current_lto_file;
2511
2512/* If TT is a variable or function decl replace it with its
2513 prevailing variant. */
2514#define LTO_SET_PREVAIL(tt) \
2515 do {\
2516 if ((tt) && VAR_OR_FUNCTION_DECL_P (tt) \
2517 && (TREE_PUBLIC (tt) || DECL_EXTERNAL (tt))) \
2518 { \
ee7a003f 2519 tt = lto_symtab_prevailing_decl (tt); \
a79420f9
ML
2520 fixed = true; \
2521 } \
2522 } while (0)
2523
2524/* Ensure that TT isn't a replacable var of function decl. */
2525#define LTO_NO_PREVAIL(tt) \
2526 gcc_checking_assert (!(tt) || !VAR_OR_FUNCTION_DECL_P (tt))
2527
2528/* Given a tree T replace all fields referring to variables or functions
2529 with their prevailing variant. */
2530static void
2531lto_fixup_prevailing_decls (tree t)
2532{
2533 enum tree_code code = TREE_CODE (t);
2534 bool fixed = false;
2535
2536 gcc_checking_assert (code != TREE_BINFO);
2537 LTO_NO_PREVAIL (TREE_TYPE (t));
2538 if (CODE_CONTAINS_STRUCT (code, TS_COMMON)
2539 /* lto_symtab_prevail_decl use TREE_CHAIN to link to the prevailing decl.
ee7a003f 2540 in the case T is a prevailed declaration we would ICE here. */
a79420f9
ML
2541 && !VAR_OR_FUNCTION_DECL_P (t))
2542 LTO_NO_PREVAIL (TREE_CHAIN (t));
2543 if (DECL_P (t))
2544 {
2545 LTO_NO_PREVAIL (DECL_NAME (t));
2546 LTO_SET_PREVAIL (DECL_CONTEXT (t));
2547 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
2548 {
2549 LTO_SET_PREVAIL (DECL_SIZE (t));
2550 LTO_SET_PREVAIL (DECL_SIZE_UNIT (t));
2551 LTO_SET_PREVAIL (DECL_INITIAL (t));
2552 LTO_NO_PREVAIL (DECL_ATTRIBUTES (t));
2553 LTO_SET_PREVAIL (DECL_ABSTRACT_ORIGIN (t));
2554 }
2555 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
2556 {
2557 LTO_NO_PREVAIL (DECL_ASSEMBLER_NAME_RAW (t));
2558 }
2559 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
2560 {
2561 LTO_NO_PREVAIL (DECL_RESULT_FLD (t));
2562 }
2563 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
2564 {
2565 LTO_NO_PREVAIL (DECL_ARGUMENTS (t));
2566 LTO_SET_PREVAIL (DECL_FUNCTION_PERSONALITY (t));
2567 LTO_NO_PREVAIL (DECL_VINDEX (t));
2568 }
2569 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
2570 {
2571 LTO_SET_PREVAIL (DECL_FIELD_OFFSET (t));
2572 LTO_NO_PREVAIL (DECL_BIT_FIELD_TYPE (t));
2573 LTO_NO_PREVAIL (DECL_QUALIFIER (t));
2574 LTO_NO_PREVAIL (DECL_FIELD_BIT_OFFSET (t));
2575 LTO_NO_PREVAIL (DECL_FCONTEXT (t));
2576 }
2577 }
2578 else if (TYPE_P (t))
2579 {
2580 LTO_NO_PREVAIL (TYPE_CACHED_VALUES (t));
2581 LTO_SET_PREVAIL (TYPE_SIZE (t));
2582 LTO_SET_PREVAIL (TYPE_SIZE_UNIT (t));
2583 LTO_NO_PREVAIL (TYPE_ATTRIBUTES (t));
2584 LTO_NO_PREVAIL (TYPE_NAME (t));
2585
2586 LTO_SET_PREVAIL (TYPE_MIN_VALUE_RAW (t));
2587 LTO_SET_PREVAIL (TYPE_MAX_VALUE_RAW (t));
2588 LTO_NO_PREVAIL (TYPE_LANG_SLOT_1 (t));
2589
2590 LTO_SET_PREVAIL (TYPE_CONTEXT (t));
2591
2592 LTO_NO_PREVAIL (TYPE_CANONICAL (t));
2593 LTO_NO_PREVAIL (TYPE_MAIN_VARIANT (t));
2594 LTO_NO_PREVAIL (TYPE_NEXT_VARIANT (t));
2595 }
2596 else if (EXPR_P (t))
2597 {
2598 int i;
2599 for (i = TREE_OPERAND_LENGTH (t) - 1; i >= 0; --i)
2600 LTO_SET_PREVAIL (TREE_OPERAND (t, i));
2601 }
2602 else if (TREE_CODE (t) == CONSTRUCTOR)
2603 {
2604 unsigned i;
2605 tree val;
2606 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), i, val)
2607 LTO_SET_PREVAIL (val);
2608 }
2609 else
2610 {
2611 switch (code)
2612 {
2613 case TREE_LIST:
2614 LTO_SET_PREVAIL (TREE_VALUE (t));
2615 LTO_SET_PREVAIL (TREE_PURPOSE (t));
a79420f9
ML
2616 break;
2617 default:
2618 gcc_unreachable ();
2619 }
2620 }
2621 /* If we fixed nothing, then we missed something seen by
2622 mentions_vars_p. */
2623 gcc_checking_assert (fixed);
2624}
2625#undef LTO_SET_PREVAIL
2626#undef LTO_NO_PREVAIL
2627
ee7a003f 2628/* Helper function of lto_fixup_decls. Walks the var and fn streams in STATE,
a79420f9
ML
2629 replaces var and function decls with the corresponding prevailing def. */
2630
2631static void
2632lto_fixup_state (struct lto_in_decl_state *state)
2633{
2634 unsigned i, si;
2635
2636 /* Although we only want to replace FUNCTION_DECLs and VAR_DECLs,
2637 we still need to walk from all DECLs to find the reachable
2638 FUNCTION_DECLs and VAR_DECLs. */
2639 for (si = 0; si < LTO_N_DECL_STREAMS; si++)
2640 {
2641 vec<tree, va_gc> *trees = state->streams[si];
2642 for (i = 0; i < vec_safe_length (trees); i++)
2643 {
2644 tree t = (*trees)[i];
2645 if (flag_checking && TYPE_P (t))
2646 verify_type (t);
2647 if (VAR_OR_FUNCTION_DECL_P (t)
2648 && (TREE_PUBLIC (t) || DECL_EXTERNAL (t)))
2649 (*trees)[i] = lto_symtab_prevailing_decl (t);
2650 }
2651 }
2652}
2653
ee7a003f 2654/* Fix the decls from all FILES. Replaces each decl with the corresponding
a79420f9
ML
2655 prevailing one. */
2656
2657static void
2658lto_fixup_decls (struct lto_file_decl_data **files)
2659{
2660 unsigned int i;
2661 tree t;
2662
2663 if (tree_with_vars)
2664 FOR_EACH_VEC_ELT ((*tree_with_vars), i, t)
2665 lto_fixup_prevailing_decls (t);
2666
2667 for (i = 0; files[i]; i++)
2668 {
2669 struct lto_file_decl_data *file = files[i];
2670 struct lto_in_decl_state *state = file->global_decl_state;
2671 lto_fixup_state (state);
2672
2673 hash_table<decl_state_hasher>::iterator iter;
2674 lto_in_decl_state *elt;
2675 FOR_EACH_HASH_TABLE_ELEMENT (*file->function_decl_states, elt,
2676 lto_in_decl_state *, iter)
2677 lto_fixup_state (elt);
2678 }
2679}
2680
2681static GTY((length ("lto_stats.num_input_files + 1"))) struct lto_file_decl_data **all_file_decl_data;
2682
2683/* Turn file datas for sub files into a single array, so that they look
ee7a003f 2684 like separate files for further passes. */
a79420f9
ML
2685
2686static void
ee7a003f
ML
2687lto_flatten_files (struct lto_file_decl_data **orig, int count,
2688 int last_file_ix)
a79420f9
ML
2689{
2690 struct lto_file_decl_data *n, *next;
2691 int i, k;
2692
2693 lto_stats.num_input_files = count;
2694 all_file_decl_data
2695 = ggc_cleared_vec_alloc<lto_file_decl_data_ptr> (count + 1);
2696 /* Set the hooks so that all of the ipa passes can read in their data. */
2697 lto_set_in_hooks (all_file_decl_data, get_section_data, free_section_data);
ee7a003f 2698 for (i = 0, k = 0; i < last_file_ix; i++)
a79420f9
ML
2699 {
2700 for (n = orig[i]; n != NULL; n = next)
2701 {
2702 all_file_decl_data[k++] = n;
2703 next = n->next;
2704 n->next = NULL;
2705 }
2706 }
2707 all_file_decl_data[k] = NULL;
2708 gcc_assert (k == count);
2709}
2710
2711/* Input file data before flattening (i.e. splitting them to subfiles to support
2712 incremental linking. */
2713static int real_file_count;
2714static GTY((length ("real_file_count + 1"))) struct lto_file_decl_data **real_file_decl_data;
2715
2716/* Read all the symbols from the input files FNAMES. NFILES is the
2717 number of files requested in the command line. Instantiate a
2718 global call graph by aggregating all the sub-graphs found in each
2719 file. */
2720
2721void
2722read_cgraph_and_symbols (unsigned nfiles, const char **fnames)
2723{
2724 unsigned int i, last_file_ix;
2725 FILE *resolution;
9a92e46c 2726 unsigned resolution_objects = 0;
a79420f9
ML
2727 int count = 0;
2728 struct lto_file_decl_data **decl_data;
2729 symtab_node *snode;
2730
2731 symtab->initialize ();
2732
2733 timevar_push (TV_IPA_LTO_DECL_IN);
2734
2735#ifdef ACCEL_COMPILER
2736 section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
2737 lto_stream_offload_p = true;
2738#endif
2739
2740 real_file_decl_data
2741 = decl_data = ggc_cleared_vec_alloc<lto_file_decl_data_ptr> (nfiles + 1);
2742 real_file_count = nfiles;
2743
2744 /* Read the resolution file. */
2745 resolution = NULL;
2746 if (resolution_file_name)
2747 {
2748 int t;
a79420f9
ML
2749
2750 resolution = fopen (resolution_file_name, "r");
2751 if (resolution == NULL)
2752 fatal_error (input_location,
2753 "could not open symbol resolution file: %m");
2754
9a92e46c 2755 t = fscanf (resolution, "%u", &resolution_objects);
a79420f9 2756 gcc_assert (t == 1);
a79420f9
ML
2757 }
2758 symtab->state = LTO_STREAMING;
2759
2760 canonical_type_hash_cache = new hash_map<const_tree, hashval_t> (251);
2761 gimple_canonical_types = htab_create (16381, gimple_canonical_type_hash,
2762 gimple_canonical_type_eq, NULL);
2763 gcc_obstack_init (&tree_scc_hash_obstack);
2764 tree_scc_hash = new hash_table<tree_scc_hasher> (4096);
2765
2766 /* Register the common node types with the canonical type machinery so
2767 we properly share alias-sets across languages and TUs. Do not
2768 expose the common nodes as type merge target - those that should be
2769 are already exposed so by pre-loading the LTO streamer caches.
2770 Do two passes - first clear TYPE_CANONICAL and then re-compute it. */
2771 for (i = 0; i < itk_none; ++i)
2772 lto_register_canonical_types (integer_types[i], true);
2773 for (i = 0; i < stk_type_kind_last; ++i)
2774 lto_register_canonical_types (sizetype_tab[i], true);
2775 for (i = 0; i < TI_MAX; ++i)
2776 lto_register_canonical_types (global_trees[i], true);
2777 for (i = 0; i < itk_none; ++i)
2778 lto_register_canonical_types (integer_types[i], false);
2779 for (i = 0; i < stk_type_kind_last; ++i)
2780 lto_register_canonical_types (sizetype_tab[i], false);
2781 for (i = 0; i < TI_MAX; ++i)
2782 lto_register_canonical_types (global_trees[i], false);
2783
2784 if (!quiet_flag)
2785 fprintf (stderr, "Reading object files:");
2786
2787 /* Read all of the object files specified on the command line. */
2788 for (i = 0, last_file_ix = 0; i < nfiles; ++i)
2789 {
2790 struct lto_file_decl_data *file_data = NULL;
2791 if (!quiet_flag)
2792 {
2793 fprintf (stderr, " %s", fnames[i]);
2794 fflush (stderr);
2795 }
2796
2797 current_lto_file = lto_obj_file_open (fnames[i], false);
2798 if (!current_lto_file)
2799 break;
2800
2801 file_data = lto_file_read (current_lto_file, resolution, &count);
2802 if (!file_data)
2803 {
2804 lto_obj_file_close (current_lto_file);
2805 free (current_lto_file);
2806 current_lto_file = NULL;
2807 break;
2808 }
2809
2810 decl_data[last_file_ix++] = file_data;
2811
2812 lto_obj_file_close (current_lto_file);
2813 free (current_lto_file);
2814 current_lto_file = NULL;
2815 }
2816
2817 lto_flatten_files (decl_data, count, last_file_ix);
2818 lto_stats.num_input_files = count;
2819 ggc_free(decl_data);
2820 real_file_decl_data = NULL;
2821
a0276c00
JH
2822 lto_register_canonical_types_for_odr_types ();
2823
a79420f9 2824 if (resolution_file_name)
9a92e46c
ML
2825 {
2826 /* True, since the plugin splits the archives. */
2827 gcc_assert (resolution_objects == nfiles);
2828 fclose (resolution);
2829 }
a79420f9
ML
2830
2831 /* Show the LTO report before launching LTRANS. */
2832 if (flag_lto_report || (flag_wpa && flag_lto_report_wpa))
2833 print_lto_report_1 ();
2834
2835 /* Free gimple type merging datastructures. */
2836 delete tree_scc_hash;
2837 tree_scc_hash = NULL;
2838 obstack_free (&tree_scc_hash_obstack, NULL);
2839 htab_delete (gimple_canonical_types);
2840 gimple_canonical_types = NULL;
2841 delete canonical_type_hash_cache;
2842 canonical_type_hash_cache = NULL;
2843
ee7a003f 2844 /* At this stage we know that majority of GGC memory is reachable.
a79420f9
ML
2845 Growing the limits prevents unnecesary invocation of GGC. */
2846 ggc_grow ();
c9ef0409 2847 report_heap_memory_use ();
a79420f9
ML
2848
2849 /* Set the hooks so that all of the ipa passes can read in their data. */
2850 lto_set_in_hooks (all_file_decl_data, get_section_data, free_section_data);
2851
2852 timevar_pop (TV_IPA_LTO_DECL_IN);
2853
2854 if (!quiet_flag)
c9ef0409 2855 fprintf (stderr, "\nReading the symbol table:");
a79420f9
ML
2856
2857 timevar_push (TV_IPA_LTO_CGRAPH_IO);
2858 /* Read the symtab. */
2859 input_symtab ();
2860
2861 input_offload_tables (!flag_ltrans);
2862
2863 /* Store resolutions into the symbol table. */
2864
2865 FOR_EACH_SYMBOL (snode)
2866 if (snode->externally_visible && snode->real_symbol_p ()
2867 && snode->lto_file_data && snode->lto_file_data->resolution_map
2868 && !(TREE_CODE (snode->decl) == FUNCTION_DECL
2869 && fndecl_built_in_p (snode->decl))
2870 && !(VAR_P (snode->decl) && DECL_HARD_REGISTER (snode->decl)))
2871 {
2872 ld_plugin_symbol_resolution_t *res;
2873
2874 res = snode->lto_file_data->resolution_map->get (snode->decl);
2875 if (!res || *res == LDPR_UNKNOWN)
2876 {
2877 if (snode->output_to_lto_symbol_table_p ())
2878 fatal_error (input_location, "missing resolution data for %s",
ee7a003f 2879 IDENTIFIER_POINTER
a79420f9
ML
2880 (DECL_ASSEMBLER_NAME (snode->decl)));
2881 }
40ebe1fc
JH
2882 /* Symbol versions are always used externally, but linker does not
2883 report that correctly.
2884 This is binutils PR25924. */
2885 else if (snode->symver && *res == LDPR_PREVAILING_DEF_IRONLY)
2886 snode->resolution = LDPR_PREVAILING_DEF_IRONLY_EXP;
a79420f9 2887 else
ee7a003f 2888 snode->resolution = *res;
a79420f9
ML
2889 }
2890 for (i = 0; all_file_decl_data[i]; i++)
2891 if (all_file_decl_data[i]->resolution_map)
2892 {
ee7a003f
ML
2893 delete all_file_decl_data[i]->resolution_map;
2894 all_file_decl_data[i]->resolution_map = NULL;
a79420f9 2895 }
ee7a003f 2896
a79420f9
ML
2897 timevar_pop (TV_IPA_LTO_CGRAPH_IO);
2898
2899 if (!quiet_flag)
c9ef0409 2900 fprintf (stderr, "\nMerging declarations:");
a79420f9
ML
2901
2902 timevar_push (TV_IPA_LTO_DECL_MERGE);
2903 /* Merge global decls. In ltrans mode we read merged cgraph, we do not
2904 need to care about resolving symbols again, we only need to replace
2905 duplicated declarations read from the callgraph and from function
2906 sections. */
2907 if (!flag_ltrans)
2908 {
2909 lto_symtab_merge_decls ();
2910
2911 /* If there were errors during symbol merging bail out, we have no
2912 good way to recover here. */
2913 if (seen_error ())
2914 fatal_error (input_location,
2915 "errors during merging of translation units");
2916
2917 /* Fixup all decls. */
2918 lto_fixup_decls (all_file_decl_data);
2919 }
2920 if (tree_with_vars)
2921 ggc_free (tree_with_vars);
2922 tree_with_vars = NULL;
7cc47709
JH
2923 /* During WPA we want to prevent ggc collecting by default. Grow limits
2924 until after the IPA summaries are streamed in. Basically all IPA memory
2925 is explcitly managed by ggc_free and ggc collect is not useful.
2926 Exception are the merged declarations. */
2927 ggc_grow ();
c9ef0409 2928 report_heap_memory_use ();
a79420f9
ML
2929
2930 timevar_pop (TV_IPA_LTO_DECL_MERGE);
2931 /* Each pass will set the appropriate timer. */
2932
2933 if (!quiet_flag)
c9ef0409 2934 fprintf (stderr, "\nReading summaries:");
a79420f9
ML
2935
2936 /* Read the IPA summary data. */
2937 if (flag_ltrans)
2938 ipa_read_optimization_summaries ();
2939 else
2940 ipa_read_summaries ();
2941
7cc47709
JH
2942 ggc_grow ();
2943
a79420f9
ML
2944 for (i = 0; all_file_decl_data[i]; i++)
2945 {
2946 gcc_assert (all_file_decl_data[i]->symtab_node_encoder);
2947 lto_symtab_encoder_delete (all_file_decl_data[i]->symtab_node_encoder);
2948 all_file_decl_data[i]->symtab_node_encoder = NULL;
ee7a003f
ML
2949 lto_in_decl_state *global_decl_state
2950 = all_file_decl_data[i]->global_decl_state;
2951 lto_free_function_in_decl_state (global_decl_state);
a79420f9 2952 all_file_decl_data[i]->global_decl_state = NULL;
ee7a003f 2953 all_file_decl_data[i]->current_decl_state = NULL;
a79420f9
ML
2954 }
2955
2956 if (!flag_ltrans)
2957 {
2958 /* Finally merge the cgraph according to the decl merging decisions. */
2959 timevar_push (TV_IPA_LTO_CGRAPH_MERGE);
2960
c9ef0409
JH
2961 if (!quiet_flag)
2962 fprintf (stderr, "\nMerging symbols:");
2963
a79420f9
ML
2964 gcc_assert (!dump_file);
2965 dump_file = dump_begin (lto_link_dump_id, NULL);
2966
2967 if (dump_file)
2968 {
2969 fprintf (dump_file, "Before merging:\n");
2970 symtab->dump (dump_file);
2971 }
2972 lto_symtab_merge_symbols ();
2973 /* Removal of unreachable symbols is needed to make verify_symtab to pass;
2974 we are still having duplicated comdat groups containing local statics.
2975 We could also just remove them while merging. */
2976 symtab->remove_unreachable_nodes (dump_file);
2977 ggc_collect ();
c9ef0409 2978 report_heap_memory_use ();
a79420f9
ML
2979
2980 if (dump_file)
ee7a003f 2981 dump_end (lto_link_dump_id, dump_file);
a79420f9
ML
2982 dump_file = NULL;
2983 timevar_pop (TV_IPA_LTO_CGRAPH_MERGE);
2984 }
2985 symtab->state = IPA_SSA;
2986 /* All node removals happening here are useless, because
2987 WPA should not stream them. Still always perform remove_unreachable_nodes
2988 because we may reshape clone tree, get rid of dead masters of inline
2989 clones and remove symbol entries for read-only variables we keep around
2990 only to be able to constant fold them. */
2991 if (flag_ltrans)
2992 {
2993 if (symtab->dump_file)
2994 symtab->dump (symtab->dump_file);
2995 symtab->remove_unreachable_nodes (symtab->dump_file);
2996 }
2997
2998 /* Indicate that the cgraph is built and ready. */
2999 symtab->function_flags_ready = true;
3000
3001 ggc_free (all_file_decl_data);
3002 all_file_decl_data = NULL;
3003}
3004
3005
3006
3007/* Show various memory usage statistics related to LTO. */
3008void
3009print_lto_report_1 (void)
3010{
3011 const char *pfx = (flag_lto) ? "LTO" : (flag_wpa) ? "WPA" : "LTRANS";
3012 fprintf (stderr, "%s statistics\n", pfx);
3013
03d90a20
JH
3014 fprintf (stderr, "[%s] read %lu unshared trees\n",
3015 pfx, num_unshared_trees_read);
3016 fprintf (stderr, "[%s] read %lu mergeable SCCs of average size %f\n",
a79420f9 3017 pfx, num_sccs_read, total_scc_size / (double)num_sccs_read);
03d90a20
JH
3018 fprintf (stderr, "[%s] %lu tree bodies read in total\n", pfx,
3019 total_scc_size + num_unshared_trees_read);
3020 if (flag_wpa && tree_scc_hash && num_sccs_read)
a79420f9
ML
3021 {
3022 fprintf (stderr, "[%s] tree SCC table: size %ld, %ld elements, "
3023 "collision ratio: %f\n", pfx,
3024 (long) tree_scc_hash->size (),
3025 (long) tree_scc_hash->elements (),
3026 tree_scc_hash->collisions ());
3027 hash_table<tree_scc_hasher>::iterator hiter;
3028 tree_scc *scc, *max_scc = NULL;
3029 unsigned max_length = 0;
3030 FOR_EACH_HASH_TABLE_ELEMENT (*tree_scc_hash, scc, x, hiter)
3031 {
3032 unsigned length = 0;
3033 tree_scc *s = scc;
3034 for (; s; s = s->next)
3035 length++;
3036 if (length > max_length)
3037 {
3038 max_length = length;
3039 max_scc = scc;
3040 }
3041 }
3042 fprintf (stderr, "[%s] tree SCC max chain length %u (size %u)\n",
3043 pfx, max_length, max_scc->len);
3044 fprintf (stderr, "[%s] Compared %lu SCCs, %lu collisions (%f)\n", pfx,
3045 num_scc_compares, num_scc_compare_collisions,
3046 num_scc_compare_collisions / (double) num_scc_compares);
3047 fprintf (stderr, "[%s] Merged %lu SCCs\n", pfx, num_sccs_merged);
3048 fprintf (stderr, "[%s] Merged %lu tree bodies\n", pfx,
3049 total_scc_size_merged);
3050 fprintf (stderr, "[%s] Merged %lu types\n", pfx, num_merged_types);
3051 fprintf (stderr, "[%s] %lu types prevailed (%lu associated trees)\n",
3052 pfx, num_prevailing_types, num_type_scc_trees);
3053 fprintf (stderr, "[%s] GIMPLE canonical type table: size %ld, "
3054 "%ld elements, %ld searches, %ld collisions (ratio: %f)\n", pfx,
3055 (long) htab_size (gimple_canonical_types),
3056 (long) htab_elements (gimple_canonical_types),
3057 (long) gimple_canonical_types->searches,
3058 (long) gimple_canonical_types->collisions,
3059 htab_collisions (gimple_canonical_types));
3060 fprintf (stderr, "[%s] GIMPLE canonical type pointer-map: "
3061 "%lu elements, %ld searches\n", pfx,
3062 num_canonical_type_hash_entries,
3063 num_canonical_type_hash_queries);
3064 }
3065
3066 print_lto_report (pfx);
3067}
3068
3069GTY(()) tree lto_eh_personality_decl;
3070
3071/* Return the LTO personality function decl. */
3072
3073tree
3074lto_eh_personality (void)
3075{
3076 if (!lto_eh_personality_decl)
3077 {
3078 /* Use the first personality DECL for our personality if we don't
3079 support multiple ones. This ensures that we don't artificially
3080 create the need for them in a single-language program. */
3081 if (first_personality_decl && !dwarf2out_do_cfi_asm ())
3082 lto_eh_personality_decl = first_personality_decl;
3083 else
3084 lto_eh_personality_decl = lhd_gcc_personality ();
3085 }
3086
3087 return lto_eh_personality_decl;
3088}
3089
ee7a003f 3090/* Set the process name based on the LTO mode. */
a79420f9 3091
ee7a003f 3092static void
a79420f9
ML
3093lto_process_name (void)
3094{
3095 if (flag_lto)
3096 setproctitle (flag_incremental_link == INCREMENTAL_LINK_LTO
3097 ? "lto1-inclink" : "lto1-lto");
3098 if (flag_wpa)
3099 setproctitle ("lto1-wpa");
3100 if (flag_ltrans)
3101 setproctitle ("lto1-ltrans");
3102}
3103
3104
3105/* Initialize the LTO front end. */
3106
3107void
3108lto_fe_init (void)
3109{
3110 lto_process_name ();
3111 lto_streamer_hooks_init ();
3112 lto_reader_init ();
3113 lto_set_in_hooks (NULL, get_section_data, free_section_data);
3114 memset (&lto_stats, 0, sizeof (lto_stats));
3115 bitmap_obstack_initialize (NULL);
3116 gimple_register_cfg_hooks ();
3117#ifndef ACCEL_COMPILER
3118 unsigned char *table
3119 = ggc_vec_alloc<unsigned char> (MAX_MACHINE_MODE);
3120 for (int m = 0; m < MAX_MACHINE_MODE; m++)
3121 table[m] = m;
3122 lto_mode_identity_table = table;
3123#endif
3124}
3125
3126#include "gt-lto-lto-common.h"