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