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