]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/lto-streamer-out.cc
Fix profiledbootstrap
[thirdparty/gcc.git] / gcc / lto-streamer-out.cc
CommitLineData
d7f09764
DN
1/* Write the GIMPLE representation to a file stream.
2
aeee4812 3 Copyright (C) 2009-2023 Free Software Foundation, Inc.
d7f09764
DN
4 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
5 Re-implemented by Diego Novillo <dnovillo@google.com>
6
7This file is part of GCC.
8
9GCC is free software; you can redistribute it and/or modify it under
10the terms of the GNU General Public License as published by the Free
11Software Foundation; either version 3, or (at your option) any later
12version.
13
14GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15WARRANTY; without even the implied warranty of MERCHANTABILITY or
16FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17for more details.
18
19You should have received a copy of the GNU General Public License
20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
22
23#include "config.h"
24#include "system.h"
25#include "coretypes.h"
c7131fb2 26#include "backend.h"
957060b5
AM
27#include "target.h"
28#include "rtl.h"
d7f09764 29#include "tree.h"
c7131fb2 30#include "gimple.h"
957060b5 31#include "tree-pass.h"
c7131fb2 32#include "ssa.h"
957060b5 33#include "gimple-streamer.h"
c7131fb2 34#include "alias.h"
d8a2d370 35#include "stor-layout.h"
5be5c238 36#include "gimple-iterator.h"
d7f09764 37#include "except.h"
d7f09764 38#include "lto-symtab.h"
c582198b 39#include "cgraph.h"
dd366ec3 40#include "cfgloop.h"
9b2b7279 41#include "builtins.h"
41dbbb37 42#include "gomp-constants.h"
1ea85365 43#include "debug.h"
60bf575c 44#include "omp-offload.h"
b4da704c 45#include "print-tree.h"
1fcf52a6 46#include "tree-dfa.h"
d1215304 47#include "file-prefix-map.h" /* remap_debug_filename() */
c8429c2a 48#include "output.h"
03d90a20 49#include "ipa-utils.h"
3d0af0c9 50#include "toplev.h"
d7f09764
DN
51
52
5f673c6a
TB
53static void lto_write_tree (struct output_block*, tree, bool);
54
d7f09764
DN
55/* Clear the line info stored in DATA_IN. */
56
57static void
58clear_line_info (struct output_block *ob)
59{
60 ob->current_file = NULL;
61 ob->current_line = 0;
62 ob->current_col = 0;
a9dfad6d 63 ob->current_sysp = false;
70d8d9bd 64 ob->reset_locus = true;
3d0af0c9 65 ob->emit_pwd = true;
3536ff2d
JJ
66 /* Initialize to something that will never appear as block,
67 so that the first location with block in a function etc.
68 always streams a change_block bit and the first block. */
69 ob->current_block = void_node;
f1adf45b 70 ob->current_discr = UINT_MAX;
d7f09764
DN
71}
72
73
74/* Create the output block and return it. SECTION_TYPE is
75 LTO_section_function_body or LTO_static_initializer. */
76
77struct output_block *
78create_output_block (enum lto_section_type section_type)
79{
80 struct output_block *ob = XCNEW (struct output_block);
b4da704c
JH
81 if (streamer_dump_file)
82 fprintf (streamer_dump_file, "Creating output block for %s\n",
0896cc42 83 lto_section_name[section_type]);
d7f09764
DN
84
85 ob->section_type = section_type;
86 ob->decl_state = lto_get_out_decl_state ();
03d90a20
JH
87 /* Only global decl stream in non-wpa will ever be considered by tree
88 merging. */
89 if (!flag_wpa && section_type == LTO_section_decls)
90 ob->local_trees = new (hash_set <tree>);
f0efc7aa
DN
91 ob->main_stream = XCNEW (struct lto_output_stream);
92 ob->string_stream = XCNEW (struct lto_output_stream);
bdc67fd6 93 ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true, false);
d7f09764 94
f0efc7aa
DN
95 if (section_type == LTO_section_function_body)
96 ob->cfg_stream = XCNEW (struct lto_output_stream);
d7f09764 97
f0efc7aa 98 clear_line_info (ob);
51545682 99
c203e8a7 100 ob->string_hash_table = new hash_table<string_slot_hasher> (37);
f0efc7aa 101 gcc_obstack_init (&ob->obstack);
d7f09764 102
f0efc7aa
DN
103 return ob;
104}
d7f09764 105
d7f09764 106
f0efc7aa 107/* Destroy the output block OB. */
d7f09764 108
f0efc7aa
DN
109void
110destroy_output_block (struct output_block *ob)
111{
112 enum lto_section_type section_type = ob->section_type;
d7f09764 113
c203e8a7
TS
114 delete ob->string_hash_table;
115 ob->string_hash_table = NULL;
03d90a20 116 delete ob->local_trees;
d7f09764 117
f0efc7aa
DN
118 free (ob->main_stream);
119 free (ob->string_stream);
120 if (section_type == LTO_section_function_body)
121 free (ob->cfg_stream);
d7f09764 122
412288f1 123 streamer_tree_cache_delete (ob->writer_cache);
f0efc7aa 124 obstack_free (&ob->obstack, NULL);
6be14c0e 125
f0efc7aa 126 free (ob);
d7f09764
DN
127}
128
129
7e601a1d
RB
130/* Wrapper around variably_modified_type_p avoiding type modification
131 during WPA streaming. */
132
133static bool
134lto_variably_modified_type_p (tree type)
135{
136 return (in_lto_p
137 ? TYPE_LANG_FLAG_0 (TYPE_MAIN_VARIANT (type))
138 : variably_modified_type_p (type, NULL_TREE));
139}
140
d7f09764 141
f0efc7aa
DN
142/* Return true if tree node T is written to various tables. For these
143 nodes, we sometimes want to write their phyiscal representation
144 (via lto_output_tree), and sometimes we need to emit an index
145 reference into a table (via lto_output_tree_ref). */
d7f09764 146
f0efc7aa
DN
147static bool
148tree_is_indexable (tree t)
d7f09764 149{
61a74079
JH
150 /* Parameters and return values of functions of variably modified types
151 must go to global stream, because they may be used in the type
152 definition. */
e0ffb247
RB
153 if ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
154 && DECL_CONTEXT (t))
7e601a1d 155 return lto_variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)));
6b0917f4
JH
156 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared.
157 We should no longer need to stream it. */
52d8a590 158 else if (TREE_CODE (t) == IMPORTED_DECL)
6b0917f4
JH
159 gcc_unreachable ();
160 else if (TREE_CODE (t) == LABEL_DECL)
161 return FORCED_LABEL (t) || DECL_NONLOCAL (t);
8813a647 162 else if (((VAR_P (t) && !TREE_STATIC (t))
53a5717e 163 || TREE_CODE (t) == TYPE_DECL
c39276b8
RB
164 || TREE_CODE (t) == CONST_DECL
165 || TREE_CODE (t) == NAMELIST_DECL)
53a5717e 166 && decl_function_context (t))
f0efc7aa 167 return false;
ee03e71d
RB
168 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
169 return false;
befa62e7
RG
170 /* Variably modified types need to be streamed alongside function
171 bodies because they can refer to local entities. Together with
172 them we have to localize their members as well.
173 ??? In theory that includes non-FIELD_DECLs as well. */
174 else if (TYPE_P (t)
7e601a1d 175 && lto_variably_modified_type_p (t))
befa62e7
RG
176 return false;
177 else if (TREE_CODE (t) == FIELD_DECL
7e601a1d 178 && lto_variably_modified_type_p (DECL_CONTEXT (t)))
befa62e7 179 return false;
d7f09764 180 else
f6a4d079 181 return (IS_TYPE_OR_DECL_P (t) || TREE_CODE (t) == SSA_NAME);
d7f09764
DN
182}
183
184
f0efc7aa
DN
185/* Output info about new location into bitpack BP.
186 After outputting bitpack, lto_output_location_data has
187 to be done to output actual data. */
d7f09764 188
3536ff2d
JJ
189static void
190lto_output_location_1 (struct output_block *ob, struct bitpack_d *bp,
191 location_t orig_loc, bool block_p)
d7f09764 192{
3536ff2d 193 location_t loc = LOCATION_LOCUS (orig_loc);
d7f09764 194
3536ff2d
JJ
195 if (loc >= RESERVED_LOCATION_COUNT)
196 {
197 expanded_location xloc = expand_location (loc);
f1adf45b 198 unsigned discr = get_discriminator_from_loc (orig_loc);
3536ff2d 199
70d8d9bd
JJ
200 if (ob->reset_locus)
201 {
202 if (xloc.file == NULL)
203 ob->current_file = "";
204 if (xloc.line == 0)
205 ob->current_line = 1;
206 if (xloc.column == 0)
207 ob->current_col = 1;
208 ob->reset_locus = false;
209 }
210
3d0af0c9
JJ
211 /* As RESERVED_LOCATION_COUNT is 2, we can use the spare value of
212 3 without wasting additional bits to signalize file change.
213 If RESERVED_LOCATION_COUNT changes, reconsider this. */
214 gcc_checking_assert (RESERVED_LOCATION_COUNT == 2);
215 bp_pack_int_in_range (bp, 0, RESERVED_LOCATION_COUNT + 1,
216 RESERVED_LOCATION_COUNT
217 + (ob->current_file != xloc.file));
218
3536ff2d
JJ
219 bp_pack_value (bp, ob->current_line != xloc.line, 1);
220 bp_pack_value (bp, ob->current_col != xloc.column, 1);
f1adf45b 221 bp_pack_value (bp, ob->current_discr != discr, 1);
3536ff2d
JJ
222
223 if (ob->current_file != xloc.file)
224 {
3d0af0c9
JJ
225 bool stream_pwd = false;
226 const char *remapped = remap_debug_filename (xloc.file);
227 if (ob->emit_pwd && remapped && !IS_ABSOLUTE_PATH (remapped))
228 {
229 stream_pwd = true;
230 ob->emit_pwd = false;
231 }
232 bp_pack_value (bp, stream_pwd, 1);
233 if (stream_pwd)
234 bp_pack_string (ob, bp, get_src_pwd (), true);
235 bp_pack_string (ob, bp, remapped, true);
3536ff2d
JJ
236 bp_pack_value (bp, xloc.sysp, 1);
237 }
238 ob->current_file = xloc.file;
239 ob->current_sysp = xloc.sysp;
240
241 if (ob->current_line != xloc.line)
242 bp_pack_var_len_unsigned (bp, xloc.line);
243 ob->current_line = xloc.line;
244
245 if (ob->current_col != xloc.column)
246 bp_pack_var_len_unsigned (bp, xloc.column);
247 ob->current_col = xloc.column;
f1adf45b
ER
248
249 if (ob->current_discr != discr)
250 bp_pack_var_len_unsigned (bp, discr);
251 ob->current_discr = discr;
3536ff2d 252 }
3d0af0c9
JJ
253 else
254 bp_pack_int_in_range (bp, 0, RESERVED_LOCATION_COUNT + 1, loc);
e45cde98 255
3536ff2d 256 if (block_p)
6c1bc27c 257 {
3536ff2d
JJ
258 tree block = LOCATION_BLOCK (orig_loc);
259 bp_pack_value (bp, ob->current_block != block, 1);
260 streamer_write_bitpack (bp);
261 if (ob->current_block != block)
262 lto_output_tree (ob, block, true, true);
263 ob->current_block = block;
6c1bc27c 264 }
3536ff2d 265}
d7f09764 266
3536ff2d
JJ
267/* Output info about new location into bitpack BP.
268 After outputting bitpack, lto_output_location_data has
269 to be done to output actual data. */
47c79d56 270
3536ff2d
JJ
271void
272lto_output_location (struct output_block *ob, struct bitpack_d *bp,
273 location_t loc)
274{
275 lto_output_location_1 (ob, bp, loc, false);
276}
277
278/* Output info about new location into bitpack BP.
279 After outputting bitpack, lto_output_location_data has
280 to be done to output actual data. Like lto_output_location, but
281 additionally output LOCATION_BLOCK info too and write the BP bitpack. */
282
283void
284lto_output_location_and_block (struct output_block *ob, struct bitpack_d *bp,
285 location_t loc)
286{
287 lto_output_location_1 (ob, bp, loc, true);
d7f09764
DN
288}
289
290
05430b9b
JH
291/* Lookup NAME in ENCODER. If NAME is not found, create a new entry in
292 ENCODER for NAME with the next available index of ENCODER, then
293 print the index to OBS.
294 Return the index. */
295
296
297static unsigned
298lto_get_index (struct lto_tree_ref_encoder *encoder, tree t)
299{
300 bool existed_p;
301
302 unsigned int &index
303 = encoder->tree_hash_table->get_or_insert (t, &existed_p);
304 if (!existed_p)
305 {
306 index = encoder->trees.length ();
307 if (streamer_dump_file)
308 {
309 print_node_brief (streamer_dump_file, " Encoding indexable ",
310 t, 4);
311 fprintf (streamer_dump_file, " as %i \n", index);
312 }
313 encoder->trees.safe_push (t);
314 }
315
316 return index;
317}
318
319
f0efc7aa
DN
320/* If EXPR is an indexable tree node, output a reference to it to
321 output block OB. Otherwise, output the physical representation of
322 EXPR to OB. */
d7f09764 323
b9393656 324static void
05430b9b
JH
325lto_indexable_tree_ref (struct output_block *ob, tree expr,
326 enum LTO_tags *tag, unsigned *index)
d7f09764 327{
05430b9b 328 gcc_checking_assert (tree_is_indexable (expr));
d7f09764 329
1746d5f3 330 if (TREE_CODE (expr) == SSA_NAME)
d7f09764 331 {
1746d5f3
JH
332 *tag = LTO_ssa_name_ref;
333 *index = SSA_NAME_VERSION (expr);
d7f09764 334 }
05430b9b 335 else
d7f09764 336 {
1746d5f3
JH
337 *tag = LTO_global_stream_ref;
338 *index = lto_get_index (&ob->decl_state->streams[LTO_DECL_STREAM], expr);
b9393656 339 }
05430b9b
JH
340}
341
342
343/* Output a static or extern var DECL to OBS. */
344
345void
ff7da2b5
JH
346lto_output_var_decl_ref (struct lto_out_decl_state *decl_state,
347 struct lto_output_stream * obs, tree decl)
05430b9b 348{
f6a4d079 349 gcc_checking_assert (VAR_P (decl));
05430b9b 350 streamer_write_uhwi_stream
ff7da2b5 351 (obs, lto_get_index (&decl_state->streams[LTO_DECL_STREAM],
05430b9b 352 decl));
b9393656
DN
353}
354
355
05430b9b
JH
356/* Output a static or extern var DECL to OBS. */
357
358void
ff7da2b5
JH
359lto_output_fn_decl_ref (struct lto_out_decl_state *decl_state,
360 struct lto_output_stream * obs, tree decl)
05430b9b
JH
361{
362 gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL);
363 streamer_write_uhwi_stream
ff7da2b5 364 (obs, lto_get_index (&decl_state->streams[LTO_DECL_STREAM], decl));
05430b9b
JH
365}
366
b9393656
DN
367/* Return true if EXPR is a tree node that can be written to disk. */
368
369static inline bool
370lto_is_streamable (tree expr)
371{
372 enum tree_code code = TREE_CODE (expr);
373
374 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
375 name version in lto_output_tree_ref (see output_ssa_names). */
376 return !is_lang_specific (expr)
377 && code != SSA_NAME
b9393656
DN
378 && code != LANG_TYPE
379 && code != MODIFY_EXPR
380 && code != INIT_EXPR
381 && code != TARGET_EXPR
382 && code != BIND_EXPR
383 && code != WITH_CLEANUP_EXPR
384 && code != STATEMENT_LIST
b9393656
DN
385 && (code == CASE_LABEL_EXPR
386 || code == DECL_EXPR
387 || TREE_CODE_CLASS (code) != tcc_statement);
388}
389
155768d6
JH
390/* Very rough estimate of streaming size of the initializer. If we ignored
391 presence of strings, we could simply just count number of non-indexable
392 tree nodes and number of references to indexable nodes. Strings however
393 may be very large and we do not want to dump them int othe global stream.
394
395 Count the size of initializer until the size in DATA is positive. */
396
397static tree
398subtract_estimated_size (tree *tp, int *ws, void *data)
399{
400 long *sum = (long *)data;
401 if (tree_is_indexable (*tp))
402 {
403 /* Indexable tree is one reference to global stream.
404 Guess it may be about 4 bytes. */
405 *sum -= 4;
406 *ws = 0;
407 }
408 /* String table entry + base of tree node needs to be streamed. */
409 if (TREE_CODE (*tp) == STRING_CST)
410 *sum -= TREE_STRING_LENGTH (*tp) + 8;
411 else
412 {
413 /* Identifiers are also variable length but should not appear
414 naked in constructor. */
415 gcc_checking_assert (TREE_CODE (*tp) != IDENTIFIER_NODE);
416 /* We do not really make attempt to work out size of pickled tree, as
417 it is very variable. Make it bigger than the reference. */
418 *sum -= 16;
419 }
420 if (*sum < 0)
421 return *tp;
422 return NULL_TREE;
423}
424
b9393656 425
ee03e71d
RB
426/* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
427
428static tree
0b83e688 429get_symbol_initial_value (lto_symtab_encoder_t encoder, tree expr)
ee03e71d
RB
430{
431 gcc_checking_assert (DECL_P (expr)
432 && TREE_CODE (expr) != FUNCTION_DECL
433 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL);
434
435 /* Handle DECL_INITIAL for symbols. */
436 tree initial = DECL_INITIAL (expr);
8813a647 437 if (VAR_P (expr)
ee03e71d
RB
438 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
439 && !DECL_IN_CONSTANT_POOL (expr)
440 && initial)
441 {
2c8326a5 442 varpool_node *vnode;
0b83e688
JH
443 /* Extra section needs about 30 bytes; do not produce it for simple
444 scalar values. */
155768d6 445 if (!(vnode = varpool_node::get (expr))
0b83e688
JH
446 || !lto_symtab_encoder_encode_initializer_p (encoder, vnode))
447 initial = error_mark_node;
155768d6
JH
448 if (initial != error_mark_node)
449 {
450 long max_size = 30;
451 if (walk_tree (&initial, subtract_estimated_size, (void *)&max_size,
452 NULL))
453 initial = error_mark_node;
454 }
ee03e71d
RB
455 }
456
457 return initial;
458}
459
460
33e23881
JH
461/* Output reference to tree T to the stream.
462 Assume that T is already in encoder cache.
463 This is used to stream tree bodies where we know the DFS walk arranged
464 everything to cache. Must be matched with stream_read_tree_ref. */
465
466void
467stream_write_tree_ref (struct output_block *ob, tree t)
468{
469 if (!t)
470 streamer_write_zero (ob);
471 else
472 {
473 unsigned int ix;
474 bool existed_p = streamer_tree_cache_lookup (ob->writer_cache, t, &ix);
475 if (existed_p)
34e5efa1 476 streamer_write_hwi (ob, ix + 1);
33e23881
JH
477 else
478 {
05430b9b
JH
479 enum LTO_tags tag;
480 unsigned ix;
34e5efa1 481 int id = 0;
05430b9b
JH
482
483 lto_indexable_tree_ref (ob, t, &tag, &ix);
34e5efa1
JH
484 if (tag == LTO_ssa_name_ref)
485 id = 1;
486 else
487 gcc_checking_assert (tag == LTO_global_stream_ref);
488 streamer_write_hwi (ob, -(int)(ix * 2 + id + 1));
33e23881
JH
489 }
490 if (streamer_debugging)
491 streamer_write_uhwi (ob, TREE_CODE (t));
492 }
493}
494
495
496
b9393656
DN
497/* Write a physical representation of tree node EXPR to output block
498 OB. If REF_P is true, the leaves of EXPR are emitted as references
499 via lto_output_tree_ref. IX is the index into the streamer cache
500 where EXPR is stored. */
501
502static void
ee03e71d 503lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
b9393656 504{
0896cc42
JH
505 if (streamer_dump_file)
506 {
507 print_node_brief (streamer_dump_file, " Streaming body of ",
508 expr, 4);
509 fprintf (streamer_dump_file, " to %s\n",
510 lto_section_name[ob->section_type]);
511 }
512
b9393656
DN
513 /* Pack all the non-pointer fields in EXPR into a bitpack and write
514 the resulting bitpack. */
b6bf201e 515 streamer_write_tree_bitfields (ob, expr);
b9393656
DN
516
517 /* Write all the pointer fields in EXPR. */
33e23881 518 streamer_write_tree_body (ob, expr);
b9393656
DN
519
520 /* Write any LTO-specific data to OB. */
521 if (DECL_P (expr)
522 && TREE_CODE (expr) != FUNCTION_DECL
523 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
524 {
525 /* Handle DECL_INITIAL for symbols. */
0b83e688
JH
526 tree initial = get_symbol_initial_value
527 (ob->decl_state->symtab_node_encoder, expr);
b9393656
DN
528 stream_write_tree (ob, initial, ref_p);
529 }
1ea85365
RB
530
531 /* Stream references to early generated DIEs. Keep in sync with the
532 trees handled in dwarf2out_die_ref_for_decl. */
533 if ((DECL_P (expr)
534 && TREE_CODE (expr) != FIELD_DECL
535 && TREE_CODE (expr) != DEBUG_EXPR_DECL
536 && TREE_CODE (expr) != TYPE_DECL)
537 || TREE_CODE (expr) == BLOCK)
538 {
539 const char *sym;
540 unsigned HOST_WIDE_INT off;
541 if (debug_info_level > DINFO_LEVEL_NONE
542 && debug_hooks->die_ref_for_decl (expr, &sym, &off))
543 {
544 streamer_write_string (ob, ob->main_stream, sym, true);
545 streamer_write_uhwi (ob, off);
546 }
547 else
548 streamer_write_string (ob, ob->main_stream, NULL, true);
549 }
ee03e71d
RB
550}
551
552/* Write a physical representation of tree node EXPR to output block
553 OB. If REF_P is true, the leaves of EXPR are emitted as references
554 via lto_output_tree_ref. IX is the index into the streamer cache
555 where EXPR is stored. */
556
557static void
558lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
559{
560 if (!lto_is_streamable (expr))
561 internal_error ("tree code %qs is not supported in LTO streams",
5806f481 562 get_tree_code_name (TREE_CODE (expr)));
ee03e71d
RB
563
564 /* Write the header, containing everything needed to materialize
565 EXPR on the reading side. */
566 streamer_write_tree_header (ob, expr);
567
568 lto_write_tree_1 (ob, expr, ref_p);
b9393656
DN
569}
570
cec34ee5
EB
571/* Emit the physical representation of tree node EXPR to output block OB,
572 If THIS_REF_P is true, the leaves of EXPR are emitted as references via
573 lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
ee03e71d
RB
574
575static void
576lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
577 bool ref_p, bool this_ref_p)
578{
579 unsigned ix;
580
581 gcc_checking_assert (expr != NULL_TREE
582 && !(this_ref_p && tree_is_indexable (expr)));
583
584 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
585 expr, hash, &ix);
586 gcc_assert (!exists_p);
ea6e17d5
RB
587 if (TREE_CODE (expr) == INTEGER_CST
588 && !TREE_OVERFLOW (expr))
ee03e71d
RB
589 {
590 /* Shared INTEGER_CST nodes are special because they need their
591 original type to be materialized by the reader (to implement
592 TYPE_CACHED_VALUES). */
33e23881 593 streamer_write_integer_cst (ob, expr);
ee03e71d
RB
594 }
595 else
596 {
597 /* This is the first time we see EXPR, write its fields
598 to OB. */
599 lto_write_tree (ob, expr, ref_p);
600 }
601}
602
a4b0388b 603class DFS
ee03e71d 604{
a4b0388b
JH
605public:
606 DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
607 bool single_p);
608 ~DFS ();
609
610 struct scc_entry
611 {
612 tree t;
613 hashval_t hash;
614 };
17b95f0e 615 auto_vec<scc_entry,32> sccstack;
a4b0388b
JH
616
617private:
618 struct sccs
619 {
620 unsigned int dfsnum;
621 unsigned int low;
622 };
bbf043c2
JJ
623 struct worklist
624 {
625 tree expr;
626 sccs *from_state;
627 sccs *cstate;
628 bool ref_p;
629 bool this_ref_p;
630 };
03d90a20
JH
631 /* Maximum index of scc stack containing a local tree. */
632 int max_local_entry;
a4b0388b
JH
633
634 static int scc_entry_compare (const void *, const void *);
635
636 void DFS_write_tree_body (struct output_block *ob,
bbf043c2 637 tree expr, sccs *expr_state, bool ref_p);
a4b0388b
JH
638
639 void DFS_write_tree (struct output_block *ob, sccs *from_state,
bbf043c2
JJ
640 tree expr, bool ref_p, bool this_ref_p);
641
a4b0388b 642 hashval_t
cec34ee5
EB
643 hash_scc (struct output_block *ob, unsigned first, unsigned size,
644 bool ref_p, bool this_ref_p);
a4b0388b 645
39c8aaa4 646 hash_map<tree, sccs *> sccstate;
17b95f0e 647 auto_vec<worklist, 32> worklist_vec;
a4b0388b 648 struct obstack sccstate_obstack;
ee03e71d
RB
649};
650
03d90a20
JH
651/* Return true if type can not be merged with structurally same tree in
652 other translation unit. During stream out this information is propagated
653 to all trees referring to T and they are not streamed with additional
e53b6e56 654 information needed by the tree merging in lto-common.cc (in particular,
03d90a20
JH
655 scc hash codes are not streamed).
656
657 TRANSLATION_UNIT_DECL is handled specially since references to it does
658 not make other trees local as well. */
659
660static bool
661local_tree_p (tree t)
662{
663 switch (TREE_CODE (t))
664 {
665 case LABEL_DECL:
666 return true;
667 case NAMESPACE_DECL:
668 return !DECL_NAME (t);
669 case VAR_DECL:
670 case FUNCTION_DECL:
671 return !TREE_PUBLIC (t) && !DECL_EXTERNAL (t);
672 case RECORD_TYPE:
673 case UNION_TYPE:
674 case ENUMERAL_TYPE:
675 /* Anonymous namespace types are local.
676 Only work hard for main variants;
677 variant types will inherit locality. */
678 return TYPE_MAIN_VARIANT (t) == t
679 && odr_type_p (t) && type_with_linkage_p (t)
680 && type_in_anonymous_namespace_p (t);
681 default:
682 return false;
683 }
684}
685
cec34ee5
EB
686/* Emit the physical representation of tree node EXPR to output block OB,
687 using depth-first search on the subgraph. If THIS_REF_P is true, the
688 leaves of EXPR are emitted as references via lto_output_tree_ref.
689 REF_P is used for streaming siblings of EXPR. If SINGLE_P is true,
690 this is for a rewalk of a single leaf SCC. */
691
a4b0388b
JH
692DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
693 bool single_p)
ee03e71d 694{
bbf043c2 695 unsigned int next_dfs_num = 1;
03d90a20
JH
696
697 max_local_entry = -1;
a4b0388b 698 gcc_obstack_init (&sccstate_obstack);
bbf043c2
JJ
699 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p);
700 while (!worklist_vec.is_empty ())
701 {
702 worklist &w = worklist_vec.last ();
703 expr = w.expr;
704 sccs *from_state = w.from_state;
705 sccs *cstate = w.cstate;
706 ref_p = w.ref_p;
707 this_ref_p = w.this_ref_p;
708 if (cstate == NULL)
709 {
710 sccs **slot = &sccstate.get_or_insert (expr);
711 cstate = *slot;
712 if (cstate)
713 {
714 gcc_checking_assert (from_state);
715 if (cstate->dfsnum < from_state->dfsnum)
716 from_state->low = MIN (cstate->dfsnum, from_state->low);
717 worklist_vec.pop ();
718 continue;
719 }
720
721 scc_entry e = { expr, 0 };
722 /* Not yet visited. DFS recurse and push it onto the stack. */
723 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
03d90a20
JH
724 if (ob->local_trees && local_tree_p (expr))
725 max_local_entry = sccstack.length ();
bbf043c2
JJ
726 sccstack.safe_push (e);
727 cstate->dfsnum = next_dfs_num++;
728 cstate->low = cstate->dfsnum;
729 w.cstate = cstate;
730
ea6e17d5
RB
731 if (TREE_CODE (expr) == INTEGER_CST
732 && !TREE_OVERFLOW (expr))
bbf043c2
JJ
733 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
734 else
735 {
736 DFS_write_tree_body (ob, expr, cstate, ref_p);
737
738 /* Walk any LTO-specific edges. */
739 if (DECL_P (expr)
740 && TREE_CODE (expr) != FUNCTION_DECL
741 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
742 {
743 /* Handle DECL_INITIAL for symbols. */
744 tree initial
745 = get_symbol_initial_value (ob->decl_state->symtab_node_encoder,
746 expr);
747 DFS_write_tree (ob, cstate, initial, ref_p, ref_p);
748 }
749 }
750 continue;
751 }
752
753 /* See if we found an SCC. */
754 if (cstate->low == cstate->dfsnum)
755 {
756 unsigned first, size;
757 tree x;
758
cec34ee5 759 /* If we are re-walking a single leaf SCC just pop it,
bbf043c2
JJ
760 let earlier worklist item access the sccstack. */
761 if (single_p)
762 {
763 worklist_vec.pop ();
764 continue;
765 }
766
767 /* Pop the SCC and compute its size. */
768 first = sccstack.length ();
769 do
770 {
771 x = sccstack[--first].t;
772 }
773 while (x != expr);
774 size = sccstack.length () - first;
775
776 /* No need to compute hashes for LTRANS units, we don't perform
777 any merging there. */
778 hashval_t scc_hash = 0;
779 unsigned scc_entry_len = 0;
03d90a20
JH
780 bool local_to_unit = !ob->local_trees
781 || max_local_entry >= (int)first;
782
783 /* Remember that trees are local so info gets propagated to other
784 SCCs. */
785 if (local_to_unit && ob->local_trees)
786 {
787 for (unsigned i = 0; i < size; ++i)
788 ob->local_trees->add (sccstack[first + i].t);
789 }
790
791 /* As a special case do not stream TRANSLATION_UNIT_DECL as shared
792 tree. We can not mark it local because references to it does not
793 make other trees local (all global decls reffer to it via
794 CONTEXT). */
795 if (size == 1
796 && TREE_CODE (sccstack[first].t) == TRANSLATION_UNIT_DECL)
797 local_to_unit = true;
798
799 if (!local_to_unit)
bbf043c2 800 {
cec34ee5 801 scc_hash = hash_scc (ob, first, size, ref_p, this_ref_p);
bbf043c2
JJ
802
803 /* Put the entries with the least number of collisions first. */
804 unsigned entry_start = 0;
805 scc_entry_len = size + 1;
806 for (unsigned i = 0; i < size;)
807 {
808 unsigned from = i;
809 for (i = i + 1; i < size
810 && (sccstack[first + i].hash
811 == sccstack[first + from].hash); ++i)
812 ;
813 if (i - from < scc_entry_len)
814 {
815 scc_entry_len = i - from;
816 entry_start = from;
817 }
818 }
819 for (unsigned i = 0; i < scc_entry_len; ++i)
6b4db501
MM
820 std::swap (sccstack[first + i],
821 sccstack[first + entry_start + i]);
bbf043c2 822
b2b29377
MM
823 /* We already sorted SCC deterministically in hash_scc. */
824
825 /* Check that we have only one SCC.
826 Naturally we may have conflicts if hash function is not
827 strong enough. Lets see how far this gets. */
828 gcc_checking_assert (scc_entry_len == 1);
bbf043c2
JJ
829 }
830
03d90a20
JH
831 worklist_vec.pop ();
832
0896cc42
JH
833 unsigned int prev_size = ob->main_stream->total_size;
834
03d90a20
JH
835 /* Only global decl sections are considered by tree merging. */
836 if (ob->section_type != LTO_section_decls)
837 {
838 /* If this is the original tree we stream and it forms SCC
839 by itself then we do not need to stream SCC at all. */
840 if (worklist_vec.is_empty () && first == 0 && size == 1)
841 return;
0896cc42
JH
842 if (streamer_dump_file)
843 {
844 fprintf (streamer_dump_file,
845 " Start of LTO_trees of size %i\n", size);
846 }
03d90a20
JH
847 streamer_write_record_start (ob, LTO_trees);
848 streamer_write_uhwi (ob, size);
849 }
850 /* Write LTO_tree_scc if tree merging is going to be performed. */
851 else if (!local_to_unit
852 /* These are special since sharing is not done by tree
853 merging machinery. We can not special case them earlier
854 because we still need to compute hash for further sharing
855 of trees referring to them. */
856 && (size != 1
857 || (TREE_CODE (sccstack[first].t) != IDENTIFIER_NODE
858 && (TREE_CODE (sccstack[first].t) != INTEGER_CST
859 || TREE_OVERFLOW (sccstack[first].t)))))
860
861 {
862 gcc_checking_assert (ob->section_type == LTO_section_decls);
0896cc42
JH
863 if (streamer_dump_file)
864 {
865 fprintf (streamer_dump_file,
866 " Start of LTO_tree_scc of size %i\n", size);
867 }
03d90a20 868 streamer_write_record_start (ob, LTO_tree_scc);
47273df0
JH
869 /* In wast majority of cases scc_entry_len is 1 and size is small
870 integer. Use extra bit of size to stream info about
871 exceptions. */
872 streamer_write_uhwi (ob, size * 2 + (scc_entry_len != 1));
873 if (scc_entry_len != 1)
874 streamer_write_uhwi (ob, scc_entry_len);
03d90a20
JH
875 streamer_write_uhwi (ob, scc_hash);
876 }
877 /* Non-trivial SCCs must be packed to trees blocks so forward
878 references work correctly. */
879 else if (size != 1)
880 {
0896cc42
JH
881 if (streamer_dump_file)
882 {
883 fprintf (streamer_dump_file,
884 " Start of LTO_trees of size %i\n", size);
885 }
886 streamer_write_record_start (ob, LTO_trees);
887 streamer_write_uhwi (ob, size);
888 }
889 else if (streamer_dump_file)
890 {
dc50686d 891 fprintf (streamer_dump_file, " Streaming single tree\n");
03d90a20 892 }
bbf043c2
JJ
893
894 /* Write size-1 SCCs without wrapping them inside SCC bundles.
895 All INTEGER_CSTs need to be handled this way as we need
896 their type to materialize them. Also builtins are handled
03d90a20 897 this way. */
bbf043c2
JJ
898 if (size == 1)
899 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
900 else
901 {
bbf043c2
JJ
902
903 /* Write all headers and populate the streamer cache. */
904 for (unsigned i = 0; i < size; ++i)
905 {
906 hashval_t hash = sccstack[first+i].hash;
907 tree t = sccstack[first+i].t;
908 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
909 t, hash, NULL);
910 gcc_assert (!exists_p);
911
912 if (!lto_is_streamable (t))
913 internal_error ("tree code %qs is not supported "
914 "in LTO streams",
915 get_tree_code_name (TREE_CODE (t)));
916
bbf043c2
JJ
917 /* Write the header, containing everything needed to
918 materialize EXPR on the reading side. */
919 streamer_write_tree_header (ob, t);
920 }
921
922 /* Write the bitpacks and tree references. */
923 for (unsigned i = 0; i < size; ++i)
47273df0 924 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
bbf043c2 925 }
0896cc42
JH
926 if (streamer_dump_file)
927 fprintf (streamer_dump_file, " %u bytes\n",
928 ob->main_stream->total_size - prev_size);
bbf043c2
JJ
929
930 /* Finally truncate the vector. */
931 sccstack.truncate (first);
03d90a20
JH
932 if ((int)first <= max_local_entry)
933 max_local_entry = first - 1;
bbf043c2
JJ
934
935 if (from_state)
936 from_state->low = MIN (from_state->low, cstate->low);
bbf043c2
JJ
937 continue;
938 }
939
940 gcc_checking_assert (from_state);
941 from_state->low = MIN (from_state->low, cstate->low);
942 if (cstate->dfsnum < from_state->dfsnum)
943 from_state->low = MIN (cstate->dfsnum, from_state->low);
944 worklist_vec.pop ();
945 }
a4b0388b 946}
ee03e71d 947
a4b0388b
JH
948DFS::~DFS ()
949{
a4b0388b
JH
950 obstack_free (&sccstate_obstack, NULL);
951}
ee03e71d
RB
952
953/* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
954 DFS recurse for all tree edges originating from it. */
955
a4b0388b
JH
956void
957DFS::DFS_write_tree_body (struct output_block *ob,
bbf043c2 958 tree expr, sccs *expr_state, bool ref_p)
ee03e71d
RB
959{
960#define DFS_follow_tree_edge(DEST) \
bbf043c2 961 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
ee03e71d
RB
962
963 enum tree_code code;
964
965 code = TREE_CODE (expr);
966
967 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
968 {
969 if (TREE_CODE (expr) != IDENTIFIER_NODE)
970 DFS_follow_tree_edge (TREE_TYPE (expr));
971 }
972
973 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
974 {
734914b6
RS
975 unsigned int count = vector_cst_encoded_nelts (expr);
976 for (unsigned int i = 0; i < count; ++i)
977 DFS_follow_tree_edge (VECTOR_CST_ENCODED_ELT (expr, i));
ee03e71d
RB
978 }
979
36fd6408
RS
980 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
981 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
982 DFS_follow_tree_edge (POLY_INT_CST_COEFF (expr, i));
983
ee03e71d
RB
984 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
985 {
986 DFS_follow_tree_edge (TREE_REALPART (expr));
987 DFS_follow_tree_edge (TREE_IMAGPART (expr));
988 }
989
990 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
991 {
992 /* Drop names that were created for anonymous entities. */
993 if (DECL_NAME (expr)
994 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
7daef9ac 995 && IDENTIFIER_ANON_P (DECL_NAME (expr)))
ee03e71d
RB
996 ;
997 else
998 DFS_follow_tree_edge (DECL_NAME (expr));
1ea85365
RB
999 if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
1000 && ! DECL_CONTEXT (expr))
1001 DFS_follow_tree_edge ((*all_translation_units)[0]);
1002 else
1003 DFS_follow_tree_edge (DECL_CONTEXT (expr));
ee03e71d
RB
1004 }
1005
1006 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1007 {
1008 DFS_follow_tree_edge (DECL_SIZE (expr));
1009 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
1010
1011 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
1012 special handling in LTO, it must be handled by streamer hooks. */
1013
1014 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
1015
f5fe239e 1016 /* We use DECL_ABSTRACT_ORIGIN == error_mark_node to mark
6b9ac179
JH
1017 declarations which should be eliminated by decl merging. Be sure none
1018 leaks to this point. */
1019 gcc_assert (DECL_ABSTRACT_ORIGIN (expr) != error_mark_node);
1ea85365 1020 DFS_follow_tree_edge (DECL_ABSTRACT_ORIGIN (expr));
ee03e71d 1021
8813a647 1022 if ((VAR_P (expr)
ee03e71d
RB
1023 || TREE_CODE (expr) == PARM_DECL)
1024 && DECL_HAS_VALUE_EXPR_P (expr))
1025 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
c1a7ca7c
RB
1026 if (VAR_P (expr)
1027 && DECL_HAS_DEBUG_EXPR_P (expr))
ee03e71d
RB
1028 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
1029 }
1030
ee03e71d
RB
1031 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1032 {
1033 /* Make sure we don't inadvertently set the assembler name. */
1034 if (DECL_ASSEMBLER_NAME_SET_P (expr))
1035 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
ee03e71d
RB
1036 }
1037
1038 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1039 {
1040 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
1041 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
1042 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
1043 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
d5cbbf87 1044 gcc_checking_assert (!DECL_FCONTEXT (expr));
ee03e71d
RB
1045 }
1046
1047 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1048 {
28428506 1049 gcc_checking_assert (DECL_VINDEX (expr) == NULL);
ee03e71d 1050 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
325fe981 1051 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr));
ee03e71d
RB
1052 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
1053 }
1054
1055 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1056 {
1057 DFS_follow_tree_edge (TYPE_SIZE (expr));
1058 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
1059 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
1060 DFS_follow_tree_edge (TYPE_NAME (expr));
1061 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
1062 reconstructed during fixup. */
1063 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
1064 during fixup. */
1065 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
1066 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
1067 /* TYPE_CANONICAL is re-computed during type merging, so no need
1068 to follow it here. */
2ebbdb6c 1069 /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
67914693 1070 it cannot be freed by free_lang_data without triggering ICEs in
2ebbdb6c 1071 langhooks. */
ee03e71d
RB
1072 }
1073
1074 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1075 {
3fb68f2e 1076 if (TREE_CODE (expr) == ARRAY_TYPE)
ee03e71d
RB
1077 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
1078 else if (RECORD_OR_UNION_TYPE_P (expr))
1079 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
1080 DFS_follow_tree_edge (t);
f6a4d079 1081 else if (FUNC_OR_METHOD_TYPE_P (expr))
ee03e71d
RB
1082 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
1083
1084 if (!POINTER_TYPE_P (expr))
20deef65
NS
1085 DFS_follow_tree_edge (TYPE_MIN_VALUE_RAW (expr));
1086 DFS_follow_tree_edge (TYPE_MAX_VALUE_RAW (expr));
ee03e71d
RB
1087 }
1088
1089 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1090 {
1091 DFS_follow_tree_edge (TREE_PURPOSE (expr));
1092 DFS_follow_tree_edge (TREE_VALUE (expr));
1093 DFS_follow_tree_edge (TREE_CHAIN (expr));
1094 }
1095
1096 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1097 {
1098 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
1099 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
1100 }
1101
1102 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1103 {
1104 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
1105 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
1106 DFS_follow_tree_edge (TREE_BLOCK (expr));
1107 }
1108
1109 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
1110 {
1111 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
69e02b35
JH
1112 {
1113 /* We would have to stream externals in the block chain as
1114 non-references but we should have dropped them in
1115 free-lang-data. */
1116 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
ee03e71d 1117 DFS_follow_tree_edge (t);
69e02b35 1118 }
ee03e71d
RB
1119
1120 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
f5fe239e 1121 DFS_follow_tree_edge (BLOCK_ABSTRACT_ORIGIN (expr));
ee03e71d 1122
ee03e71d
RB
1123 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
1124 information for early inlined BLOCKs so drop it on the floor instead
e53b6e56 1125 of ICEing in dwarf2out.cc. */
ee03e71d
RB
1126
1127 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
1128 streaming time. */
1129
1130 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
1131 list is re-constructed from BLOCK_SUPERCONTEXT. */
1132 }
1133
1134 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1135 {
1136 unsigned i;
1137 tree t;
1138
1139 /* Note that the number of BINFO slots has already been emitted in
1140 EXPR's header (see streamer_write_tree_header) because this length
1141 is needed to build the empty BINFO node on the reader side. */
1142 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
1143 DFS_follow_tree_edge (t);
1144 DFS_follow_tree_edge (BINFO_OFFSET (expr));
1145 DFS_follow_tree_edge (BINFO_VTABLE (expr));
ee03e71d 1146
0c172706
JH
1147 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
1148 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
1149 by C++ FE only. */
ee03e71d
RB
1150 }
1151
1152 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1153 {
1154 unsigned i;
1155 tree index, value;
1156
1157 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
1158 {
1159 DFS_follow_tree_edge (index);
1160 DFS_follow_tree_edge (value);
1161 }
1162 }
1163
c193f58b
JJ
1164 if (code == OMP_CLAUSE)
1165 {
1166 int i;
1167 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
1168 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
1169 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
1170 }
1171
ee03e71d
RB
1172#undef DFS_follow_tree_edge
1173}
1174
a4b0388b
JH
1175/* Return a hash value for the tree T.
1176 CACHE holds hash values of trees outside current SCC. MAP, if non-NULL,
1177 may hold hash values if trees inside current SCC. */
ee03e71d
RB
1178
1179static hashval_t
a4b0388b 1180hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map, tree t)
ee03e71d 1181{
50de5793 1182 inchash::hash hstate;
e8326772 1183
ee03e71d
RB
1184#define visit(SIBLING) \
1185 do { \
1186 unsigned ix; \
a4b0388b
JH
1187 if (!SIBLING) \
1188 hstate.add_int (0); \
1189 else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
e8326772 1190 hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \
a4b0388b
JH
1191 else if (map) \
1192 hstate.add_int (*map->get (SIBLING)); \
1193 else \
1194 hstate.add_int (1); \
ee03e71d
RB
1195 } while (0)
1196
1197 /* Hash TS_BASE. */
1198 enum tree_code code = TREE_CODE (t);
e8326772 1199 hstate.add_int (code);
ee03e71d
RB
1200 if (!TYPE_P (t))
1201 {
e8326772
AK
1202 hstate.add_flag (TREE_SIDE_EFFECTS (t));
1203 hstate.add_flag (TREE_CONSTANT (t));
1204 hstate.add_flag (TREE_READONLY (t));
1205 hstate.add_flag (TREE_PUBLIC (t));
ee03e71d 1206 }
e8326772
AK
1207 hstate.add_flag (TREE_ADDRESSABLE (t));
1208 hstate.add_flag (TREE_THIS_VOLATILE (t));
ee03e71d 1209 if (DECL_P (t))
e8326772 1210 hstate.add_flag (DECL_UNSIGNED (t));
ee03e71d 1211 else if (TYPE_P (t))
e8326772 1212 hstate.add_flag (TYPE_UNSIGNED (t));
ee03e71d 1213 if (TYPE_P (t))
e8326772 1214 hstate.add_flag (TYPE_ARTIFICIAL (t));
ee03e71d 1215 else
e8326772
AK
1216 hstate.add_flag (TREE_NO_WARNING (t));
1217 hstate.add_flag (TREE_NOTHROW (t));
1218 hstate.add_flag (TREE_STATIC (t));
1219 hstate.add_flag (TREE_PROTECTED (t));
1220 hstate.add_flag (TREE_DEPRECATED (t));
ee03e71d 1221 if (code != TREE_BINFO)
e8326772 1222 hstate.add_flag (TREE_PRIVATE (t));
ee03e71d 1223 if (TYPE_P (t))
e8326772 1224 {
ee45a32d
EB
1225 hstate.add_flag (AGGREGATE_TYPE_P (t)
1226 ? TYPE_REVERSE_STORAGE_ORDER (t) : TYPE_SATURATING (t));
e8326772
AK
1227 hstate.add_flag (TYPE_ADDR_SPACE (t));
1228 }
ee03e71d 1229 else if (code == SSA_NAME)
e8326772
AK
1230 hstate.add_flag (SSA_NAME_IS_DEFAULT_DEF (t));
1231 hstate.commit_flag ();
ee03e71d
RB
1232
1233 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
cae115d6 1234 hstate.add_wide_int (wi::to_widest (t));
ee03e71d
RB
1235
1236 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
1237 {
1238 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
e8326772
AK
1239 hstate.add_flag (r.cl);
1240 hstate.add_flag (r.sign);
1241 hstate.add_flag (r.signalling);
1242 hstate.add_flag (r.canonical);
1243 hstate.commit_flag ();
1244 hstate.add_int (r.uexp);
1245 hstate.add (r.sig, sizeof (r.sig));
ee03e71d
RB
1246 }
1247
1248 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
1249 {
1250 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
e8326772
AK
1251 hstate.add_int (f.mode);
1252 hstate.add_int (f.data.low);
1253 hstate.add_int (f.data.high);
ee03e71d
RB
1254 }
1255
1256 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1257 {
449e9a33 1258 hstate.add_hwi (DECL_MODE (t));
e8326772
AK
1259 hstate.add_flag (DECL_NONLOCAL (t));
1260 hstate.add_flag (DECL_VIRTUAL_P (t));
1261 hstate.add_flag (DECL_IGNORED_P (t));
00de328a 1262 hstate.add_flag (DECL_ABSTRACT_P (t));
e8326772
AK
1263 hstate.add_flag (DECL_ARTIFICIAL (t));
1264 hstate.add_flag (DECL_USER_ALIGN (t));
1265 hstate.add_flag (DECL_PRESERVE_P (t));
1266 hstate.add_flag (DECL_EXTERNAL (t));
eb72dc66 1267 hstate.add_flag (DECL_NOT_GIMPLE_REG_P (t));
e8326772
AK
1268 hstate.commit_flag ();
1269 hstate.add_int (DECL_ALIGN (t));
ee03e71d
RB
1270 if (code == LABEL_DECL)
1271 {
e8326772
AK
1272 hstate.add_int (EH_LANDING_PAD_NR (t));
1273 hstate.add_int (LABEL_DECL_UID (t));
ee03e71d
RB
1274 }
1275 else if (code == FIELD_DECL)
1276 {
e8326772
AK
1277 hstate.add_flag (DECL_PACKED (t));
1278 hstate.add_flag (DECL_NONADDRESSABLE_P (t));
974aedcc 1279 hstate.add_flag (DECL_PADDING_P (t));
e902136b
JJ
1280 if (DECL_BIT_FIELD (t))
1281 hstate.add_flag (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (t));
1282 else
1283 hstate.add_flag (DECL_FIELD_ABI_IGNORED (t));
e8326772 1284 hstate.add_int (DECL_OFFSET_ALIGN (t));
ee03e71d
RB
1285 }
1286 else if (code == VAR_DECL)
1287 {
e8326772
AK
1288 hstate.add_flag (DECL_HAS_DEBUG_EXPR_P (t));
1289 hstate.add_flag (DECL_NONLOCAL_FRAME (t));
ee03e71d
RB
1290 }
1291 if (code == RESULT_DECL
1292 || code == PARM_DECL
1293 || code == VAR_DECL)
1294 {
e8326772 1295 hstate.add_flag (DECL_BY_REFERENCE (t));
ee03e71d
RB
1296 if (code == VAR_DECL
1297 || code == PARM_DECL)
e8326772 1298 hstate.add_flag (DECL_HAS_VALUE_EXPR_P (t));
ee03e71d 1299 }
e8326772 1300 hstate.commit_flag ();
ee03e71d
RB
1301 }
1302
1303 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
e8326772 1304 hstate.add_int (DECL_REGISTER (t));
ee03e71d
RB
1305
1306 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1307 {
e8326772
AK
1308 hstate.add_flag (DECL_COMMON (t));
1309 hstate.add_flag (DECL_DLLIMPORT_P (t));
1310 hstate.add_flag (DECL_WEAK (t));
1311 hstate.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t));
1312 hstate.add_flag (DECL_COMDAT (t));
1313 hstate.add_flag (DECL_VISIBILITY_SPECIFIED (t));
1314 hstate.add_int (DECL_VISIBILITY (t));
ee03e71d
RB
1315 if (code == VAR_DECL)
1316 {
c01c111b 1317 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
e8326772
AK
1318 hstate.add_flag (DECL_HARD_REGISTER (t));
1319 hstate.add_flag (DECL_IN_CONSTANT_POOL (t));
ee03e71d 1320 }
0170f33c 1321 if (TREE_CODE (t) == FUNCTION_DECL)
e8326772
AK
1322 {
1323 hstate.add_flag (DECL_FINAL_P (t));
1324 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (t));
1325 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (t));
1326 }
1327 hstate.commit_flag ();
ee03e71d
RB
1328 }
1329
1330 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1331 {
e8326772
AK
1332 hstate.add_int (DECL_BUILT_IN_CLASS (t));
1333 hstate.add_flag (DECL_STATIC_CONSTRUCTOR (t));
1334 hstate.add_flag (DECL_STATIC_DESTRUCTOR (t));
cb50701e 1335 hstate.add_flag (FUNCTION_DECL_DECL_TYPE (t));
e8326772
AK
1336 hstate.add_flag (DECL_UNINLINABLE (t));
1337 hstate.add_flag (DECL_POSSIBLY_INLINED (t));
1338 hstate.add_flag (DECL_IS_NOVOPS (t));
1339 hstate.add_flag (DECL_IS_RETURNS_TWICE (t));
1340 hstate.add_flag (DECL_IS_MALLOC (t));
e8326772
AK
1341 hstate.add_flag (DECL_DECLARED_INLINE_P (t));
1342 hstate.add_flag (DECL_STATIC_CHAIN (t));
1343 hstate.add_flag (DECL_NO_INLINE_WARNING_P (t));
1344 hstate.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t));
1345 hstate.add_flag (DECL_NO_LIMIT_STACK (t));
1346 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (t));
1347 hstate.add_flag (DECL_PURE_P (t));
1348 hstate.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t));
1349 hstate.commit_flag ();
ee03e71d 1350 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
4d732405 1351 hstate.add_int (DECL_UNCHECKED_FUNCTION_CODE (t));
ee03e71d
RB
1352 }
1353
1354 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1355 {
449e9a33 1356 hstate.add_hwi (TYPE_MODE (t));
351d90f4 1357 /* TYPE_NO_FORCE_BLK is private to stor-layout and need
0896cc42 1358 no streaming. */
e8326772
AK
1359 hstate.add_flag (TYPE_PACKED (t));
1360 hstate.add_flag (TYPE_RESTRICT (t));
1361 hstate.add_flag (TYPE_USER_ALIGN (t));
1362 hstate.add_flag (TYPE_READONLY (t));
ee03e71d 1363 if (RECORD_OR_UNION_TYPE_P (t))
0170f33c 1364 {
e8326772
AK
1365 hstate.add_flag (TYPE_TRANSPARENT_AGGR (t));
1366 hstate.add_flag (TYPE_FINAL_P (t));
f4af4019 1367 hstate.add_flag (TYPE_CXX_ODR_P (t));
0170f33c 1368 }
ee03e71d 1369 else if (code == ARRAY_TYPE)
e8326772 1370 hstate.add_flag (TYPE_NONALIASED_COMPONENT (t));
f4af4019
JH
1371 if (code == ARRAY_TYPE || code == INTEGER_TYPE)
1372 hstate.add_flag (TYPE_STRING_FLAG (t));
350792ff
RB
1373 if (AGGREGATE_TYPE_P (t))
1374 hstate.add_flag (TYPE_TYPELESS_STORAGE (t));
e8326772 1375 hstate.commit_flag ();
fe48f265 1376 hstate.add_int (TYPE_PRECISION_RAW (t));
e8326772 1377 hstate.add_int (TYPE_ALIGN (t));
974aedcc 1378 hstate.add_int (TYPE_EMPTY_P (t));
ee03e71d
RB
1379 }
1380
1381 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
e8326772
AK
1382 hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
1383 strlen (TRANSLATION_UNIT_LANGUAGE (t)));
ee03e71d 1384
1b34e6e2
BS
1385 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
1386 /* We don't stream these when passing things to a different target. */
1387 && !lto_stream_offload_p)
449e9a33 1388 hstate.add_hwi (cl_target_option_hash (TREE_TARGET_OPTION (t)));
ee03e71d
RB
1389
1390 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
449e9a33 1391 hstate.add_hwi (cl_optimization_hash (TREE_OPTIMIZATION (t)));
ee03e71d
RB
1392
1393 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
e8326772 1394 hstate.merge_hash (IDENTIFIER_HASH_VALUE (t));
ee03e71d
RB
1395
1396 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
e8326772 1397 hstate.add (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t));
ee03e71d
RB
1398
1399 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
1400 {
a4b0388b 1401 if (code != IDENTIFIER_NODE)
ee03e71d
RB
1402 visit (TREE_TYPE (t));
1403 }
1404
1405 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
734914b6
RS
1406 {
1407 unsigned int count = vector_cst_encoded_nelts (t);
1408 for (unsigned int i = 0; i < count; ++i)
1409 visit (VECTOR_CST_ENCODED_ELT (t, i));
1410 }
ee03e71d 1411
36fd6408
RS
1412 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
1413 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
1414 visit (POLY_INT_CST_COEFF (t, i));
1415
ee03e71d
RB
1416 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
1417 {
1418 visit (TREE_REALPART (t));
1419 visit (TREE_IMAGPART (t));
1420 }
1421
1422 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
1423 {
1424 /* Drop names that were created for anonymous entities. */
1425 if (DECL_NAME (t)
1426 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
7daef9ac 1427 && IDENTIFIER_ANON_P (DECL_NAME (t)))
ee03e71d
RB
1428 ;
1429 else
1430 visit (DECL_NAME (t));
1431 if (DECL_FILE_SCOPE_P (t))
1432 ;
1433 else
1434 visit (DECL_CONTEXT (t));
1435 }
1436
1437 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1438 {
1439 visit (DECL_SIZE (t));
1440 visit (DECL_SIZE_UNIT (t));
1441 visit (DECL_ATTRIBUTES (t));
1442 if ((code == VAR_DECL
1443 || code == PARM_DECL)
1444 && DECL_HAS_VALUE_EXPR_P (t))
1445 visit (DECL_VALUE_EXPR (t));
1446 if (code == VAR_DECL
1447 && DECL_HAS_DEBUG_EXPR_P (t))
1448 visit (DECL_DEBUG_EXPR (t));
1449 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
1450 be able to call get_symbol_initial_value. */
1451 }
1452
ee03e71d
RB
1453 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1454 {
1455 if (DECL_ASSEMBLER_NAME_SET_P (t))
1456 visit (DECL_ASSEMBLER_NAME (t));
ee03e71d
RB
1457 }
1458
1459 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1460 {
1461 visit (DECL_FIELD_OFFSET (t));
1462 visit (DECL_BIT_FIELD_TYPE (t));
1463 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
1464 visit (DECL_FIELD_BIT_OFFSET (t));
ee03e71d
RB
1465 }
1466
1467 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1468 {
1469 visit (DECL_FUNCTION_PERSONALITY (t));
325fe981 1470 visit (DECL_FUNCTION_SPECIFIC_TARGET (t));
ee03e71d
RB
1471 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
1472 }
1473
1474 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1475 {
1476 visit (TYPE_SIZE (t));
1477 visit (TYPE_SIZE_UNIT (t));
1478 visit (TYPE_ATTRIBUTES (t));
1479 visit (TYPE_NAME (t));
1480 visit (TYPE_MAIN_VARIANT (t));
1481 if (TYPE_FILE_SCOPE_P (t))
1482 ;
1483 else
1484 visit (TYPE_CONTEXT (t));
ee03e71d
RB
1485 }
1486
1487 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1488 {
3fb68f2e 1489 if (code == ARRAY_TYPE)
ee03e71d
RB
1490 visit (TYPE_DOMAIN (t));
1491 else if (RECORD_OR_UNION_TYPE_P (t))
1492 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1493 visit (f);
1494 else if (code == FUNCTION_TYPE
1495 || code == METHOD_TYPE)
1496 visit (TYPE_ARG_TYPES (t));
1497 if (!POINTER_TYPE_P (t))
20deef65
NS
1498 visit (TYPE_MIN_VALUE_RAW (t));
1499 visit (TYPE_MAX_VALUE_RAW (t));
ee03e71d
RB
1500 }
1501
1502 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1503 {
1504 visit (TREE_PURPOSE (t));
1505 visit (TREE_VALUE (t));
1506 visit (TREE_CHAIN (t));
1507 }
1508
1509 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1510 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1511 visit (TREE_VEC_ELT (t, i));
1512
1513 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1514 {
449e9a33 1515 hstate.add_hwi (TREE_OPERAND_LENGTH (t));
ee03e71d
RB
1516 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1517 visit (TREE_OPERAND (t, i));
1518 }
1519
1520 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1521 {
1522 unsigned i;
1523 tree b;
1524 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1525 visit (b);
1526 visit (BINFO_OFFSET (t));
1527 visit (BINFO_VTABLE (t));
c01c111b 1528 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
0c172706
JH
1529 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
1530 by C++ FE only. */
ee03e71d
RB
1531 }
1532
1533 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1534 {
1535 unsigned i;
1536 tree index, value;
449e9a33 1537 hstate.add_hwi (CONSTRUCTOR_NELTS (t));
ee03e71d
RB
1538 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1539 {
1540 visit (index);
1541 visit (value);
1542 }
1543 }
1544
e06f9964
JJ
1545 if (code == OMP_CLAUSE)
1546 {
1547 int i;
e8326772 1548 HOST_WIDE_INT val;
e06f9964 1549
449e9a33 1550 hstate.add_hwi (OMP_CLAUSE_CODE (t));
e06f9964
JJ
1551 switch (OMP_CLAUSE_CODE (t))
1552 {
1553 case OMP_CLAUSE_DEFAULT:
e8326772 1554 val = OMP_CLAUSE_DEFAULT_KIND (t);
e06f9964
JJ
1555 break;
1556 case OMP_CLAUSE_SCHEDULE:
e8326772 1557 val = OMP_CLAUSE_SCHEDULE_KIND (t);
e06f9964
JJ
1558 break;
1559 case OMP_CLAUSE_DEPEND:
e8326772 1560 val = OMP_CLAUSE_DEPEND_KIND (t);
e06f9964 1561 break;
a651e6d5
JJ
1562 case OMP_CLAUSE_DOACROSS:
1563 val = OMP_CLAUSE_DOACROSS_KIND (t);
1564 break;
e06f9964 1565 case OMP_CLAUSE_MAP:
e8326772 1566 val = OMP_CLAUSE_MAP_KIND (t);
e06f9964
JJ
1567 break;
1568 case OMP_CLAUSE_PROC_BIND:
e8326772 1569 val = OMP_CLAUSE_PROC_BIND_KIND (t);
e06f9964
JJ
1570 break;
1571 case OMP_CLAUSE_REDUCTION:
28567c40
JJ
1572 case OMP_CLAUSE_TASK_REDUCTION:
1573 case OMP_CLAUSE_IN_REDUCTION:
e8326772 1574 val = OMP_CLAUSE_REDUCTION_CODE (t);
e06f9964
JJ
1575 break;
1576 default:
e8326772 1577 val = 0;
e06f9964
JJ
1578 break;
1579 }
449e9a33 1580 hstate.add_hwi (val);
e06f9964
JJ
1581 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1582 visit (OMP_CLAUSE_OPERAND (t, i));
1583 visit (OMP_CLAUSE_CHAIN (t));
1584 }
1585
e8326772 1586 return hstate.end ();
ee03e71d
RB
1587
1588#undef visit
1589}
1590
1591/* Compare two SCC entries by their hash value for qsorting them. */
1592
a4b0388b
JH
1593int
1594DFS::scc_entry_compare (const void *p1_, const void *p2_)
ee03e71d
RB
1595{
1596 const scc_entry *p1 = (const scc_entry *) p1_;
1597 const scc_entry *p2 = (const scc_entry *) p2_;
1598 if (p1->hash < p2->hash)
1599 return -1;
1600 else if (p1->hash > p2->hash)
1601 return 1;
1602 return 0;
1603}
1604
cec34ee5
EB
1605/* Return a hash value for the SCC on the SCC stack from FIRST with SIZE.
1606 THIS_REF_P and REF_P are as passed to lto_output_tree for FIRST. */
ee03e71d 1607
a4b0388b 1608hashval_t
cec34ee5
EB
1609DFS::hash_scc (struct output_block *ob, unsigned first, unsigned size,
1610 bool ref_p, bool this_ref_p)
ee03e71d 1611{
a4b0388b
JH
1612 unsigned int last_classes = 0, iterations = 0;
1613
ee03e71d
RB
1614 /* Compute hash values for the SCC members. */
1615 for (unsigned i = 0; i < size; ++i)
0cf094c0
EB
1616 sccstack[first+i].hash
1617 = hash_tree (ob->writer_cache, NULL, sccstack[first+i].t);
ee03e71d
RB
1618
1619 if (size == 1)
1620 return sccstack[first].hash;
1621
a4b0388b 1622 /* We aim to get unique hash for every tree within SCC and compute hash value
0cf094c0 1623 of the whole SCC by combining all values together in a stable (entry-point
a4b0388b
JH
1624 independent) order. This guarantees that the same SCC regions within
1625 different translation units will get the same hash values and therefore
1626 will be merged at WPA time.
1627
0cf094c0 1628 Often the hashes are already unique. In that case we compute the SCC hash
a4b0388b
JH
1629 by combining individual hash values in an increasing order.
1630
0cf094c0
EB
1631 If there are duplicates, we seek at least one tree with unique hash (and
1632 pick one with minimal hash and this property). Then we obtain a stable
1633 order by DFS walk starting from this unique tree and then use the index
a4b0388b
JH
1634 within this order to make individual hash values unique.
1635
1636 If there is no tree with unique hash, we iteratively propagate the hash
1637 values across the internal edges of SCC. This usually quickly leads
1638 to unique hashes. Consider, for example, an SCC containing two pointers
0cf094c0
EB
1639 that are identical except for the types they point to and assume that
1640 these types are also part of the SCC. The propagation will add the
1641 points-to type information into their hash values. */
a4b0388b
JH
1642 do
1643 {
0cf094c0 1644 /* Sort the SCC so we can easily check for uniqueness. */
a4b0388b
JH
1645 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1646
1647 unsigned int classes = 1;
1648 int firstunique = -1;
1649
0cf094c0
EB
1650 /* Find the tree with lowest unique hash (if it exists) and compute
1651 the number of equivalence classes. */
a4b0388b
JH
1652 if (sccstack[first].hash != sccstack[first+1].hash)
1653 firstunique = 0;
1654 for (unsigned i = 1; i < size; ++i)
1655 if (sccstack[first+i-1].hash != sccstack[first+i].hash)
1656 {
1657 classes++;
1658 if (firstunique == -1
1659 && (i == size - 1
1660 || sccstack[first+i+1].hash != sccstack[first+i].hash))
1661 firstunique = i;
1662 }
1663
0cf094c0 1664 /* If we found a tree with unique hash, stop the iteration. */
a4b0388b
JH
1665 if (firstunique != -1
1666 /* Also terminate if we run out of iterations or if the number of
1667 equivalence classes is no longer increasing.
1668 For example a cyclic list of trees that are all equivalent will
1669 never have unique entry point; we however do not build such SCCs
1670 in our IL. */
1671 || classes <= last_classes || iterations > 16)
1672 {
1673 hashval_t scc_hash;
1674
1675 /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk
0cf094c0 1676 starting from FIRSTUNIQUE to obtain a stable order. */
a4b0388b
JH
1677 if (classes != size && firstunique != -1)
1678 {
1679 hash_map <tree, hashval_t> map(size*2);
1680
1681 /* Store hash values into a map, so we can associate them with
0cf094c0 1682 the reordered SCC. */
a4b0388b
JH
1683 for (unsigned i = 0; i < size; ++i)
1684 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1685
cec34ee5
EB
1686 DFS again (ob, sccstack[first+firstunique].t, ref_p, this_ref_p,
1687 true);
a4b0388b
JH
1688 gcc_assert (again.sccstack.length () == size);
1689
1690 memcpy (sccstack.address () + first,
1691 again.sccstack.address (),
1692 sizeof (scc_entry) * size);
1693
1694 /* Update hash values of individual members by hashing in the
1695 index within the stable order. This ensures uniqueness.
0cf094c0
EB
1696 Also compute the SCC hash by mixing in all hash values in
1697 the stable order we obtained. */
a4b0388b
JH
1698 sccstack[first].hash = *map.get (sccstack[first].t);
1699 scc_hash = sccstack[first].hash;
1700 for (unsigned i = 1; i < size; ++i)
1701 {
1702 sccstack[first+i].hash
1703 = iterative_hash_hashval_t (i,
1704 *map.get (sccstack[first+i].t));
0cf094c0
EB
1705 scc_hash
1706 = iterative_hash_hashval_t (scc_hash,
1707 sccstack[first+i].hash);
a4b0388b
JH
1708 }
1709 }
0cf094c0
EB
1710 /* If we got a unique hash value for each tree, then sort already
1711 ensured entry-point independent order. Only compute the final
1712 SCC hash.
a4b0388b
JH
1713
1714 If we failed to find the unique entry point, we go by the same
0cf094c0 1715 route. We will eventually introduce unwanted hash conflicts. */
a4b0388b
JH
1716 else
1717 {
1718 scc_hash = sccstack[first].hash;
1719 for (unsigned i = 1; i < size; ++i)
0cf094c0
EB
1720 scc_hash
1721 = iterative_hash_hashval_t (scc_hash, sccstack[first+i].hash);
1722
1723 /* We cannot 100% guarantee that the hash won't conflict so as
1724 to make it impossible to find a unique hash. This however
1725 should be an extremely rare case. ICE for now so possible
1726 issues are found and evaluated. */
a4b0388b
JH
1727 gcc_checking_assert (classes == size);
1728 }
1729
0cf094c0
EB
1730 /* To avoid conflicts across SCCs, iteratively hash the whole SCC
1731 hash into the hash of each element. */
a4b0388b
JH
1732 for (unsigned i = 0; i < size; ++i)
1733 sccstack[first+i].hash
1734 = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
1735 return scc_hash;
1736 }
1737
1738 last_classes = classes;
1739 iterations++;
1740
1741 /* We failed to identify the entry point; propagate hash values across
1742 the edges. */
0cf094c0
EB
1743 hash_map <tree, hashval_t> map(size*2);
1744
1745 for (unsigned i = 0; i < size; ++i)
1746 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1747
1748 for (unsigned i = 0; i < size; i++)
1749 sccstack[first+i].hash
1750 = hash_tree (ob->writer_cache, &map, sccstack[first+i].t);
a4b0388b
JH
1751 }
1752 while (true);
ee03e71d
RB
1753}
1754
1755/* DFS walk EXPR and stream SCCs of tree bodies if they are not
1756 already in the streamer cache. Main routine called for
1757 each visit of EXPR. */
1758
a4b0388b
JH
1759void
1760DFS::DFS_write_tree (struct output_block *ob, sccs *from_state,
bbf043c2 1761 tree expr, bool ref_p, bool this_ref_p)
ee03e71d 1762{
ee03e71d
RB
1763 /* Handle special cases. */
1764 if (expr == NULL_TREE)
1765 return;
1766
1767 /* Do not DFS walk into indexable trees. */
1768 if (this_ref_p && tree_is_indexable (expr))
1769 return;
1770
1771 /* Check if we already streamed EXPR. */
bbf043c2 1772 if (streamer_tree_cache_lookup (ob->writer_cache, expr, NULL))
03d90a20 1773 {
33e23881 1774 /* Reference to a local tree makes entry also local. We always process
03d90a20
JH
1775 top of stack entry, so set max to number of entries in stack - 1. */
1776 if (ob->local_trees
1777 && ob->local_trees->contains (expr))
1778 max_local_entry = sccstack.length () - 1;
1779 return;
1780 }
ee03e71d 1781
bbf043c2
JJ
1782 worklist w;
1783 w.expr = expr;
1784 w.from_state = from_state;
1785 w.cstate = NULL;
1786 w.ref_p = ref_p;
1787 w.this_ref_p = this_ref_p;
1788 worklist_vec.safe_push (w);
ee03e71d
RB
1789}
1790
b9393656 1791
cec34ee5
EB
1792/* Emit the physical representation of tree node EXPR to output block OB.
1793 If THIS_REF_P is true, the leaves of EXPR are emitted as references via
1794 lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
b9393656
DN
1795
1796void
7e54c608
RG
1797lto_output_tree (struct output_block *ob, tree expr,
1798 bool ref_p, bool this_ref_p)
b9393656
DN
1799{
1800 unsigned ix;
1801 bool existed_p;
0896cc42
JH
1802 unsigned int size = ob->main_stream->total_size;
1803 /* This is the first time we see EXPR, write all reachable
1804 trees to OB. */
1805 static bool in_dfs_walk;
b9393656
DN
1806
1807 if (expr == NULL_TREE)
1808 {
412288f1 1809 streamer_write_record_start (ob, LTO_null);
b9393656
DN
1810 return;
1811 }
1812
7e54c608 1813 if (this_ref_p && tree_is_indexable (expr))
b9393656 1814 {
05430b9b
JH
1815 enum LTO_tags tag;
1816 unsigned ix;
1817
1818 lto_indexable_tree_ref (ob, expr, &tag, &ix);
1819 streamer_write_record_start (ob, tag);
1820 streamer_write_uhwi (ob, ix);
b9393656
DN
1821 return;
1822 }
1823
ee03e71d 1824 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
b9393656
DN
1825 if (existed_p)
1826 {
0896cc42
JH
1827 if (streamer_dump_file)
1828 {
1829 if (in_dfs_walk)
1830 print_node_brief (streamer_dump_file, " Streaming ref to ",
1831 expr, 4);
1832 else
1833 print_node_brief (streamer_dump_file, " Streaming ref to ",
1834 expr, 4);
1835 fprintf (streamer_dump_file, "\n");
1836 }
b9393656
DN
1837 /* If a node has already been streamed out, make sure that
1838 we don't write it more than once. Otherwise, the reader
1839 will instantiate two different nodes for the same object. */
412288f1
DN
1840 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1841 streamer_write_uhwi (ob, ix);
a746f952
JH
1842 if (streamer_debugging)
1843 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1844 lto_tree_code_to_tag (TREE_CODE (expr)));
ee03e71d 1845 lto_stats.num_pickle_refs_output++;
b9393656
DN
1846 }
1847 else
1848 {
ee03e71d 1849 /* Protect against recursion which means disconnect between
0896cc42 1850 what tree edges we walk in the DFS walk and what edges
ee03e71d
RB
1851 we stream out. */
1852 gcc_assert (!in_dfs_walk);
1853
b4da704c
JH
1854 if (streamer_dump_file)
1855 {
0896cc42 1856 print_node_brief (streamer_dump_file, " Streaming tree ",
b4da704c 1857 expr, 4);
0896cc42 1858 fprintf (streamer_dump_file, "\n");
b4da704c
JH
1859 }
1860
ee03e71d
RB
1861 /* Start the DFS walk. */
1862 /* Save ob state ... */
1863 /* let's see ... */
1864 in_dfs_walk = true;
a4b0388b 1865 DFS (ob, expr, ref_p, this_ref_p, false);
ee03e71d 1866
03d90a20 1867 /* Finally append a reference to the tree we were writing. */
ee03e71d 1868 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
03d90a20
JH
1869
1870 /* DFS walk above possibly skipped streaming EXPR itself to let us inline
1871 it. */
1872 if (!existed_p)
1873 lto_output_tree_1 (ob, expr, 0, ref_p, this_ref_p);
bcb63eb2 1874 else if (this_ref_p)
03d90a20 1875 {
0896cc42
JH
1876 if (streamer_dump_file)
1877 {
1878 print_node_brief (streamer_dump_file,
1879 " Streaming final ref to ",
1880 expr, 4);
1881 fprintf (streamer_dump_file, "\n");
1882 }
03d90a20
JH
1883 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1884 streamer_write_uhwi (ob, ix);
11041c31
JH
1885 if (streamer_debugging)
1886 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1887 lto_tree_code_to_tag (TREE_CODE (expr)));
03d90a20 1888 }
0896cc42 1889 in_dfs_walk = false;
ee03e71d 1890 lto_stats.num_pickle_refs_output++;
d7f09764 1891 }
0896cc42
JH
1892 if (streamer_dump_file && !in_dfs_walk)
1893 fprintf (streamer_dump_file, " %u bytes\n",
1894 ob->main_stream->total_size - size);
d7f09764
DN
1895}
1896
1897
1898/* Output to OB a list of try/catch handlers starting with FIRST. */
1899
1900static void
1901output_eh_try_list (struct output_block *ob, eh_catch first)
1902{
1903 eh_catch n;
1904
1905 for (n = first; n; n = n->next_catch)
1906 {
412288f1 1907 streamer_write_record_start (ob, LTO_eh_catch);
b9393656
DN
1908 stream_write_tree (ob, n->type_list, true);
1909 stream_write_tree (ob, n->filter_list, true);
1910 stream_write_tree (ob, n->label, true);
d7f09764
DN
1911 }
1912
412288f1 1913 streamer_write_record_start (ob, LTO_null);
d7f09764
DN
1914}
1915
1916
1917/* Output EH region R in function FN to OB. CURR_RN is the slot index
1918 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1919 detect EH region sharing. */
1920
1921static void
1922output_eh_region (struct output_block *ob, eh_region r)
1923{
1924 enum LTO_tags tag;
1925
1926 if (r == NULL)
1927 {
412288f1 1928 streamer_write_record_start (ob, LTO_null);
d7f09764
DN
1929 return;
1930 }
1931
1932 if (r->type == ERT_CLEANUP)
1933 tag = LTO_ert_cleanup;
1934 else if (r->type == ERT_TRY)
1935 tag = LTO_ert_try;
1936 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1937 tag = LTO_ert_allowed_exceptions;
1938 else if (r->type == ERT_MUST_NOT_THROW)
1939 tag = LTO_ert_must_not_throw;
1940 else
1941 gcc_unreachable ();
1942
412288f1
DN
1943 streamer_write_record_start (ob, tag);
1944 streamer_write_hwi (ob, r->index);
d7f09764
DN
1945
1946 if (r->outer)
412288f1 1947 streamer_write_hwi (ob, r->outer->index);
d7f09764 1948 else
412288f1 1949 streamer_write_zero (ob);
d7f09764
DN
1950
1951 if (r->inner)
412288f1 1952 streamer_write_hwi (ob, r->inner->index);
d7f09764 1953 else
412288f1 1954 streamer_write_zero (ob);
d7f09764
DN
1955
1956 if (r->next_peer)
412288f1 1957 streamer_write_hwi (ob, r->next_peer->index);
d7f09764 1958 else
412288f1 1959 streamer_write_zero (ob);
d7f09764
DN
1960
1961 if (r->type == ERT_TRY)
1962 {
1963 output_eh_try_list (ob, r->u.eh_try.first_catch);
1964 }
1965 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1966 {
b9393656
DN
1967 stream_write_tree (ob, r->u.allowed.type_list, true);
1968 stream_write_tree (ob, r->u.allowed.label, true);
412288f1 1969 streamer_write_uhwi (ob, r->u.allowed.filter);
d7f09764
DN
1970 }
1971 else if (r->type == ERT_MUST_NOT_THROW)
1972 {
b9393656 1973 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
7cb7d208
RB
1974 bitpack_d bp = bitpack_create (ob->main_stream);
1975 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1976 streamer_write_bitpack (&bp);
d7f09764
DN
1977 }
1978
1979 if (r->landing_pads)
412288f1 1980 streamer_write_hwi (ob, r->landing_pads->index);
d7f09764 1981 else
412288f1 1982 streamer_write_zero (ob);
d7f09764
DN
1983}
1984
1985
1986/* Output landing pad LP to OB. */
1987
1988static void
1989output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1990{
1991 if (lp == NULL)
1992 {
412288f1 1993 streamer_write_record_start (ob, LTO_null);
d7f09764
DN
1994 return;
1995 }
1996
412288f1
DN
1997 streamer_write_record_start (ob, LTO_eh_landing_pad);
1998 streamer_write_hwi (ob, lp->index);
d7f09764 1999 if (lp->next_lp)
412288f1 2000 streamer_write_hwi (ob, lp->next_lp->index);
d7f09764 2001 else
412288f1 2002 streamer_write_zero (ob);
d7f09764
DN
2003
2004 if (lp->region)
412288f1 2005 streamer_write_hwi (ob, lp->region->index);
d7f09764 2006 else
412288f1 2007 streamer_write_zero (ob);
d7f09764 2008
b9393656 2009 stream_write_tree (ob, lp->post_landing_pad, true);
d7f09764
DN
2010}
2011
2012
2013/* Output the existing eh_table to OB. */
2014
2015static void
2016output_eh_regions (struct output_block *ob, struct function *fn)
2017{
2018 if (fn->eh && fn->eh->region_tree)
2019 {
2020 unsigned i;
2021 eh_region eh;
2022 eh_landing_pad lp;
2023 tree ttype;
2024
412288f1 2025 streamer_write_record_start (ob, LTO_eh_table);
d7f09764
DN
2026
2027 /* Emit the index of the root of the EH region tree. */
412288f1 2028 streamer_write_hwi (ob, fn->eh->region_tree->index);
d7f09764
DN
2029
2030 /* Emit all the EH regions in the region array. */
9771b263
DN
2031 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
2032 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
d7f09764
DN
2033 output_eh_region (ob, eh);
2034
2035 /* Emit all landing pads. */
9771b263
DN
2036 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
2037 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
d7f09764
DN
2038 output_eh_lp (ob, lp);
2039
2040 /* Emit all the runtime type data. */
9771b263
DN
2041 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
2042 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
b9393656 2043 stream_write_tree (ob, ttype, true);
d7f09764
DN
2044
2045 /* Emit the table of action chains. */
2046 if (targetm.arm_eabi_unwinder)
2047 {
2048 tree t;
9771b263
DN
2049 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
2050 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
b9393656 2051 stream_write_tree (ob, t, true);
d7f09764
DN
2052 }
2053 else
2054 {
2055 uchar c;
9771b263
DN
2056 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
2057 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
412288f1 2058 streamer_write_char_stream (ob->main_stream, c);
d7f09764
DN
2059 }
2060 }
2061
07233947
DN
2062 /* The LTO_null either terminates the record or indicates that there
2063 are no eh_records at all. */
412288f1 2064 streamer_write_record_start (ob, LTO_null);
d7f09764
DN
2065}
2066
2067
2068/* Output all of the active ssa names to the ssa_names stream. */
2069
2070static void
2071output_ssa_names (struct output_block *ob, struct function *fn)
2072{
2073 unsigned int i, len;
2074
9771b263 2075 len = vec_safe_length (SSANAMES (fn));
412288f1 2076 streamer_write_uhwi (ob, len);
d7f09764
DN
2077
2078 for (i = 1; i < len; i++)
2079 {
9771b263 2080 tree ptr = (*SSANAMES (fn))[i];
d7f09764
DN
2081
2082 if (ptr == NULL_TREE
2083 || SSA_NAME_IN_FREE_LIST (ptr)
9a13d066
RB
2084 || virtual_operand_p (ptr)
2085 /* Simply skip unreleased SSA names. */
2086 || (! SSA_NAME_IS_DEFAULT_DEF (ptr)
2087 && (! SSA_NAME_DEF_STMT (ptr)
2088 || ! gimple_bb (SSA_NAME_DEF_STMT (ptr)))))
d7f09764
DN
2089 continue;
2090
412288f1
DN
2091 streamer_write_uhwi (ob, i);
2092 streamer_write_char_stream (ob->main_stream,
2093 SSA_NAME_IS_DEFAULT_DEF (ptr));
70b5e7dc
RG
2094 if (SSA_NAME_VAR (ptr))
2095 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
2096 else
2097 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
2098 stream_write_tree (ob, TREE_TYPE (ptr), true);
d7f09764
DN
2099 }
2100
412288f1 2101 streamer_write_zero (ob);
d7f09764
DN
2102}
2103
2104
807e902e 2105
d7f09764
DN
2106/* Output the cfg. */
2107
2108static void
2109output_cfg (struct output_block *ob, struct function *fn)
2110{
2111 struct lto_output_stream *tmp_stream = ob->main_stream;
2112 basic_block bb;
2113
2114 ob->main_stream = ob->cfg_stream;
2115
412288f1 2116 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
ea19eb9f 2117 profile_status_for_fn (fn));
d7f09764
DN
2118
2119 /* Output the number of the highest basic block. */
3986e690 2120 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
d7f09764
DN
2121
2122 FOR_ALL_BB_FN (bb, fn)
2123 {
2124 edge_iterator ei;
2125 edge e;
2126
412288f1 2127 streamer_write_hwi (ob, bb->index);
d7f09764
DN
2128
2129 /* Output the successors and the edge flags. */
412288f1 2130 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
d7f09764
DN
2131 FOR_EACH_EDGE (e, ei, bb->succs)
2132 {
fea13fcd
JJ
2133 bitpack_d bp = bitpack_create (ob->main_stream);
2134 bp_pack_var_len_unsigned (&bp, e->dest->index);
2135 bp_pack_var_len_unsigned (&bp, e->flags);
2136 stream_output_location_and_block (ob, &bp, e->goto_locus);
357067f2 2137 e->probability.stream_out (ob);
d7f09764
DN
2138 }
2139 }
2140
412288f1 2141 streamer_write_hwi (ob, -1);
d7f09764 2142
1fcf52a6 2143 bb = ENTRY_BLOCK_PTR_FOR_FN (fn);
d7f09764
DN
2144 while (bb->next_bb)
2145 {
412288f1 2146 streamer_write_hwi (ob, bb->next_bb->index);
d7f09764
DN
2147 bb = bb->next_bb;
2148 }
2149
412288f1 2150 streamer_write_hwi (ob, -1);
d7f09764 2151
dd366ec3 2152 /* Output the number of loops. */
0fc822d0 2153 streamer_write_uhwi (ob, number_of_loops (fn));
dd366ec3
RB
2154
2155 /* Output each loop, skipping the tree root which has number zero. */
0fc822d0 2156 for (unsigned i = 1; i < number_of_loops (fn); ++i)
dd366ec3 2157 {
99b1c316 2158 class loop *loop = get_loop (fn, i);
dd366ec3
RB
2159
2160 /* Write the index of the loop header. That's enough to rebuild
2161 the loop tree on the reader side. Stream -1 for an unused
2162 loop entry. */
2163 if (!loop)
2164 {
2165 streamer_write_hwi (ob, -1);
2166 continue;
2167 }
2168 else
2169 streamer_write_hwi (ob, loop->header->index);
2170
2171 /* Write everything copy_loop_info copies. */
2172 streamer_write_enum (ob->main_stream,
2173 loop_estimation, EST_LAST, loop->estimate_state);
2174 streamer_write_hwi (ob, loop->any_upper_bound);
2175 if (loop->any_upper_bound)
a73f34c2 2176 streamer_write_widest_int (ob, loop->nb_iterations_upper_bound);
105e29c5
JH
2177 streamer_write_hwi (ob, loop->any_likely_upper_bound);
2178 if (loop->any_likely_upper_bound)
a73f34c2 2179 streamer_write_widest_int (ob, loop->nb_iterations_likely_upper_bound);
dd366ec3
RB
2180 streamer_write_hwi (ob, loop->any_estimate);
2181 if (loop->any_estimate)
a73f34c2 2182 streamer_write_widest_int (ob, loop->nb_iterations_estimate);
e9287a41
RB
2183
2184 /* Write OMP SIMD related info. */
2185 streamer_write_hwi (ob, loop->safelen);
ac9effed 2186 streamer_write_hwi (ob, loop->unroll);
94ec37a9 2187 streamer_write_hwi (ob, loop->owned_clique);
718c4601 2188 streamer_write_hwi (ob, loop->dont_vectorize);
b15b5979 2189 streamer_write_hwi (ob, loop->force_vectorize);
75efe9cb 2190 streamer_write_hwi (ob, loop->finite_p);
e9287a41 2191 stream_write_tree (ob, loop->simduid, true);
dd366ec3
RB
2192 }
2193
d7f09764
DN
2194 ob->main_stream = tmp_stream;
2195}
2196
2197
d7f09764
DN
2198/* Create the header in the file using OB. If the section type is for
2199 a function, set FN to the decl for that function. */
2200
fb3f88cc 2201void
d7f09764
DN
2202produce_asm (struct output_block *ob, tree fn)
2203{
2204 enum lto_section_type section_type = ob->section_type;
2205 struct lto_function_header header;
2206 char *section_name;
d7f09764
DN
2207
2208 if (section_type == LTO_section_function_body)
2209 {
2210 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
3c56d8d8
ML
2211 section_name = lto_get_section_name (section_type, name,
2212 symtab_node::get (fn)->order,
2213 NULL);
d7f09764
DN
2214 }
2215 else
3c56d8d8 2216 section_name = lto_get_section_name (section_type, NULL, 0, NULL);
d7f09764
DN
2217
2218 lto_begin_section (section_name, !flag_wpa);
2219 free (section_name);
2220
2221 /* The entire header is stream computed here. */
2222 memset (&header, 0, sizeof (struct lto_function_header));
b8698a0f 2223
d7f09764
DN
2224 if (section_type == LTO_section_function_body)
2225 header.cfg_size = ob->cfg_stream->total_size;
2226 header.main_size = ob->main_stream->total_size;
2227 header.string_size = ob->string_stream->total_size;
f6bcdb5e 2228 lto_write_data (&header, sizeof header);
d7f09764
DN
2229
2230 /* Put all of the gimple and the string table out the asm file as a
2231 block of text. */
2232 if (section_type == LTO_section_function_body)
2233 lto_write_stream (ob->cfg_stream);
2234 lto_write_stream (ob->main_stream);
2235 lto_write_stream (ob->string_stream);
2236
2237 lto_end_section ();
2238}
2239
2240
35f5b1c1 2241/* Output the base body of struct function FN using output block OB. */
d7f09764
DN
2242
2243static void
35f5b1c1 2244output_struct_function_base (struct output_block *ob, struct function *fn)
d7f09764 2245{
2465dcc2 2246 struct bitpack_d bp;
c021f10b
NF
2247 unsigned i;
2248 tree t;
d7f09764 2249
35f5b1c1
LC
2250 /* Output the static chain and non-local goto save area. */
2251 stream_write_tree (ob, fn->static_chain_decl, true);
2252 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
d7f09764 2253
35f5b1c1 2254 /* Output all the local variables in the function. */
9771b263
DN
2255 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
2256 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
35f5b1c1 2257 stream_write_tree (ob, t, true);
d7f09764 2258
dd366ec3
RB
2259 /* Output current IL state of the function. */
2260 streamer_write_uhwi (ob, fn->curr_properties);
d7f09764
DN
2261
2262 /* Write all the attributes for FN. */
2465dcc2
RG
2263 bp = bitpack_create (ob->main_stream);
2264 bp_pack_value (&bp, fn->is_thunk, 1);
2265 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
2465dcc2
RG
2266 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
2267 bp_pack_value (&bp, fn->returns_struct, 1);
2268 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
2da02156 2269 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
2465dcc2
RG
2270 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
2271 bp_pack_value (&bp, fn->after_inlining, 1);
2465dcc2
RG
2272 bp_pack_value (&bp, fn->stdarg, 1);
2273 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
aa43616c 2274 bp_pack_value (&bp, fn->has_forced_label_in_static, 1);
2465dcc2
RG
2275 bp_pack_value (&bp, fn->calls_alloca, 1);
2276 bp_pack_value (&bp, fn->calls_setjmp, 1);
500e4868 2277 bp_pack_value (&bp, fn->calls_eh_return, 1);
b15b5979 2278 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
e9287a41 2279 bp_pack_value (&bp, fn->has_simduid_loops, 1);
4dda30e9 2280 bp_pack_value (&bp, fn->assume_function, 1);
2465dcc2
RG
2281 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
2282 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
743c1134 2283 bp_pack_value (&bp, fn->last_clique, sizeof (short) * 8);
7cb7d208
RB
2284
2285 /* Output the function start and end loci. */
2286 stream_output_location (ob, &bp, fn->function_start_locus);
2287 stream_output_location (ob, &bp, fn->function_end_locus);
2288
b348c78a
AO
2289 /* Save the instance discriminator if present. */
2290 int *instance_number_p = NULL;
2291 if (decl_to_instance_map)
2292 instance_number_p = decl_to_instance_map->get (fn->decl);
2293 bp_pack_value (&bp, !!instance_number_p, 1);
2294 if (instance_number_p)
2295 bp_pack_value (&bp, *instance_number_p, sizeof (int) * CHAR_BIT);
2296
412288f1 2297 streamer_write_bitpack (&bp);
35f5b1c1 2298}
d7f09764 2299
ac364a48 2300
ec1db2a9
RB
2301/* Collect all leaf BLOCKs beyond ROOT into LEAFS. */
2302
2303static void
2304collect_block_tree_leafs (tree root, vec<tree> &leafs)
2305{
2306 for (root = BLOCK_SUBBLOCKS (root); root; root = BLOCK_CHAIN (root))
2307 if (! BLOCK_SUBBLOCKS (root))
2308 leafs.safe_push (root);
2309 else
a8f9b4c5 2310 collect_block_tree_leafs (root, leafs);
ec1db2a9
RB
2311}
2312
1fcf52a6
JH
2313/* This performs function body modifications that are needed for streaming
2314 to work. */
2315
2316void
2317lto_prepare_function_for_streaming (struct cgraph_node *node)
2318{
af0d0f50
JH
2319 struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
2320 basic_block bb;
2321
2322 if (number_of_loops (fn))
1fcf52a6 2323 {
af0d0f50 2324 push_cfun (fn);
1fcf52a6
JH
2325 loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
2326 loop_optimizer_finalize ();
2327 pop_cfun ();
2328 }
af0d0f50
JH
2329 /* We will renumber the statements. The code that does this uses
2330 the same ordering that we use for serializing them so we can use
2331 the same code on the other end and not have to write out the
2332 statement numbers. We do not assign UIDs to PHIs here because
2333 virtual PHIs get re-computed on-the-fly which would make numbers
2334 inconsistent. */
2335 set_gimple_stmt_max_uid (fn, 0);
2336 FOR_ALL_BB_FN (bb, fn)
2337 {
2338 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2339 gsi_next (&gsi))
2340 {
2341 gphi *stmt = gsi.phi ();
2342
2343 /* Virtual PHIs are not going to be streamed. */
2344 if (!virtual_operand_p (gimple_phi_result (stmt)))
2345 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2346 }
2347 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
2348 gsi_next (&gsi))
2349 {
2350 gimple *stmt = gsi_stmt (gsi);
2351 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2352 }
2353 }
2354 /* To avoid keeping duplicate gimple IDs in the statements, renumber
2355 virtual phis now. */
2356 FOR_ALL_BB_FN (bb, fn)
2357 {
2358 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2359 gsi_next (&gsi))
2360 {
2361 gphi *stmt = gsi.phi ();
2362 if (virtual_operand_p (gimple_phi_result (stmt)))
2363 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2364 }
2365 }
2366
1fcf52a6
JH
2367}
2368
33e23881
JH
2369/* Emit the chain of tree nodes starting at T. OB is the output block
2370 to write to. REF_P is true if chain elements should be emitted
2371 as references. */
2372
2373static void
2374streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
2375{
2376 while (t)
2377 {
2378 /* We avoid outputting external vars or functions by reference
2379 to the global decls section as we do not want to have them
2380 enter decl merging. We should not need to do this anymore because
2381 free_lang_data removes them from block scopes. */
2382 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
2383 stream_write_tree (ob, t, ref_p);
2384
2385 t = TREE_CHAIN (t);
2386 }
2387
2388 /* Write a sentinel to terminate the chain. */
2389 stream_write_tree (ob, NULL_TREE, ref_p);
2390}
2391
35f5b1c1 2392/* Output the body of function NODE->DECL. */
688a482d 2393
35f5b1c1
LC
2394static void
2395output_function (struct cgraph_node *node)
2396{
2397 tree function;
2398 struct function *fn;
2399 basic_block bb;
2400 struct output_block *ob;
d7f09764 2401
b4da704c
JH
2402 if (streamer_dump_file)
2403 fprintf (streamer_dump_file, "\nStreaming body of %s\n",
3629ff8a 2404 node->dump_name ());
b4da704c 2405
67348ccc 2406 function = node->decl;
35f5b1c1
LC
2407 fn = DECL_STRUCT_FUNCTION (function);
2408 ob = create_output_block (LTO_section_function_body);
2409
0b83e688 2410 ob->symbol = node;
35f5b1c1
LC
2411
2412 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
2413
35f5b1c1
LC
2414 /* Make string 0 be a NULL string. */
2415 streamer_write_char_stream (ob->string_stream, 0);
2416
2417 streamer_write_record_start (ob, LTO_function);
2418
815effe1
JH
2419 /* Output decls for parameters and args. */
2420 stream_write_tree (ob, DECL_RESULT (function), true);
2421 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
d7f09764 2422
1ea85365
RB
2423 /* Output debug args if available. */
2424 vec<tree, va_gc> **debugargs = decl_debug_args_lookup (function);
2425 if (! debugargs)
2426 streamer_write_uhwi (ob, 0);
2427 else
2428 {
2429 streamer_write_uhwi (ob, (*debugargs)->length ());
2430 for (unsigned i = 0; i < (*debugargs)->length (); ++i)
2431 stream_write_tree (ob, (**debugargs)[i], true);
2432 }
2433
d7f09764 2434 /* Output DECL_INITIAL for the function, which contains the tree of
ec1db2a9 2435 lexical scopes. */
b9393656 2436 stream_write_tree (ob, DECL_INITIAL (function), true);
ec1db2a9
RB
2437 /* As we do not recurse into BLOCK_SUBBLOCKS but only BLOCK_SUPERCONTEXT
2438 collect block tree leafs and stream those. */
2439 auto_vec<tree> block_tree_leafs;
f165ef89 2440 if (DECL_INITIAL (function) && DECL_INITIAL (function) != error_mark_node)
ec1db2a9
RB
2441 collect_block_tree_leafs (DECL_INITIAL (function), block_tree_leafs);
2442 streamer_write_uhwi (ob, block_tree_leafs.length ());
2443 for (unsigned i = 0; i < block_tree_leafs.length (); ++i)
2444 stream_write_tree (ob, block_tree_leafs[i], true);
d7f09764 2445
815effe1
JH
2446 /* We also stream abstract functions where we stream only stuff needed for
2447 debug info. */
2448 if (gimple_has_body_p (function))
2449 {
2450 streamer_write_uhwi (ob, 1);
2451 output_struct_function_base (ob, fn);
2452
fea13fcd
JJ
2453 output_cfg (ob, fn);
2454
815effe1
JH
2455 /* Output all the SSA names used in the function. */
2456 output_ssa_names (ob, fn);
2457
2458 /* Output any exception handling regions. */
2459 output_eh_regions (ob, fn);
2460
815effe1
JH
2461 /* Output the code for the function. */
2462 FOR_ALL_BB_FN (bb, fn)
2463 output_bb (ob, bb, fn);
d7f09764 2464
815effe1
JH
2465 /* The terminator for this function. */
2466 streamer_write_record_start (ob, LTO_null);
815effe1
JH
2467 }
2468 else
2469 streamer_write_uhwi (ob, 0);
d7f09764
DN
2470
2471 /* Create a section to hold the pickled output of this function. */
2472 produce_asm (ob, function);
2473
2474 destroy_output_block (ob);
b4da704c
JH
2475 if (streamer_dump_file)
2476 fprintf (streamer_dump_file, "Finished streaming %s\n",
3629ff8a 2477 node->dump_name ());
d7f09764
DN
2478}
2479
0b83e688
JH
2480/* Output the body of function NODE->DECL. */
2481
2482static void
2483output_constructor (struct varpool_node *node)
2484{
2485 tree var = node->decl;
2486 struct output_block *ob;
2487
b4da704c
JH
2488 if (streamer_dump_file)
2489 fprintf (streamer_dump_file, "\nStreaming constructor of %s\n",
3629ff8a 2490 node->dump_name ());
b4da704c 2491
ebad2eee 2492 timevar_push (TV_IPA_LTO_CTORS_OUT);
0b83e688
JH
2493 ob = create_output_block (LTO_section_function_body);
2494
0b83e688
JH
2495 ob->symbol = node;
2496
2497 /* Make string 0 be a NULL string. */
2498 streamer_write_char_stream (ob->string_stream, 0);
2499
2500 /* Output DECL_INITIAL for the function, which contains the tree of
2501 lexical scopes. */
2502 stream_write_tree (ob, DECL_INITIAL (var), true);
2503
2504 /* Create a section to hold the pickled output of this function. */
2505 produce_asm (ob, var);
2506
2507 destroy_output_block (ob);
b4da704c
JH
2508 if (streamer_dump_file)
2509 fprintf (streamer_dump_file, "Finished streaming %s\n",
3629ff8a 2510 node->dump_name ());
ebad2eee 2511 timevar_pop (TV_IPA_LTO_CTORS_OUT);
0b83e688
JH
2512}
2513
d7f09764 2514
49f836ba
JB
2515/* Emit toplevel asms. */
2516
2517void
2518lto_output_toplevel_asms (void)
2519{
2520 struct output_block *ob;
65d630d4 2521 struct asm_node *can;
49f836ba 2522 char *section_name;
207c68cd 2523 struct lto_simple_header_with_strings header;
49f836ba 2524
3dafb85c 2525 if (!symtab->first_asm_symbol ())
49f836ba
JB
2526 return;
2527
2528 ob = create_output_block (LTO_section_asm);
2529
2530 /* Make string 0 be a NULL string. */
2531 streamer_write_char_stream (ob->string_stream, 0);
2532
3dafb85c 2533 for (can = symtab->first_asm_symbol (); can; can = can->next)
398f05da
JH
2534 {
2535 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
2536 streamer_write_hwi (ob, can->order);
2537 }
49f836ba
JB
2538
2539 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
2540
3c56d8d8 2541 section_name = lto_get_section_name (LTO_section_asm, NULL, 0, NULL);
49f836ba
JB
2542 lto_begin_section (section_name, !flag_wpa);
2543 free (section_name);
2544
2545 /* The entire header stream is computed here. */
2546 memset (&header, 0, sizeof (header));
2547
49f836ba
JB
2548 header.main_size = ob->main_stream->total_size;
2549 header.string_size = ob->string_stream->total_size;
f6bcdb5e 2550 lto_write_data (&header, sizeof header);
49f836ba
JB
2551
2552 /* Put all of the gimple and the string table out the asm file as a
2553 block of text. */
2554 lto_write_stream (ob->main_stream);
2555 lto_write_stream (ob->string_stream);
2556
2557 lto_end_section ();
2558
2559 destroy_output_block (ob);
2560}
2561
2562
0b83e688 2563/* Copy the function body or variable constructor of NODE without deserializing. */
d7f09764
DN
2564
2565static void
0b83e688 2566copy_function_or_variable (struct symtab_node *node)
d7f09764 2567{
67348ccc
DM
2568 tree function = node->decl;
2569 struct lto_file_decl_data *file_data = node->lto_file_data;
d7f09764
DN
2570 const char *data;
2571 size_t len;
2572 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
91539475 2573 char *section_name =
3c56d8d8 2574 lto_get_section_name (LTO_section_function_body, name, node->order, NULL);
d7f09764
DN
2575 size_t i, j;
2576 struct lto_in_decl_state *in_state;
91539475 2577 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
d7f09764 2578
814f3331
JH
2579 if (streamer_dump_file)
2580 fprintf (streamer_dump_file, "Copying section for %s\n", name);
7fa658c2 2581 lto_begin_section (section_name, false);
d7f09764
DN
2582 free (section_name);
2583
2584 /* We may have renamed the declaration, e.g., a static function. */
2585 name = lto_get_decl_name_mapping (file_data, name);
2586
7fa658c2 2587 data = lto_get_raw_section_data (file_data, LTO_section_function_body,
3c56d8d8
ML
2588 name, node->order - file_data->order_base,
2589 &len);
d7f09764
DN
2590 gcc_assert (data);
2591
2592 /* Do a bit copy of the function body. */
7fa658c2 2593 lto_write_raw_data (data, len);
d7f09764
DN
2594
2595 /* Copy decls. */
2596 in_state =
67348ccc 2597 lto_get_function_in_decl_state (node->lto_file_data, function);
7fa658c2 2598 out_state->compressed = in_state->compressed;
d7f09764
DN
2599 gcc_assert (in_state);
2600
2601 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2602 {
9c71e9df
TS
2603 size_t n = vec_safe_length (in_state->streams[i]);
2604 vec<tree, va_gc> *trees = in_state->streams[i];
d7f09764
DN
2605 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2606
2607 /* The out state must have the same indices and the in state.
2608 So just copy the vector. All the encoders in the in state
2609 must be empty where we reach here. */
2610 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
d579fcda 2611 encoder->trees.reserve_exact (n);
d7f09764 2612 for (j = 0; j < n; j++)
9c71e9df 2613 encoder->trees.safe_push ((*trees)[j]);
d7f09764 2614 }
b8698a0f 2615
7fa658c2
JH
2616 lto_free_raw_section_data (file_data, LTO_section_function_body, name,
2617 data, len);
d7f09764
DN
2618 lto_end_section ();
2619}
2620
8359c87e
RB
2621/* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2622
2623static tree
2624wrap_refs (tree *tp, int *ws, void *)
2625{
2626 tree t = *tp;
2627 if (handled_component_p (t)
f6a4d079 2628 && VAR_P (TREE_OPERAND (t, 0))
35bd8e8f 2629 && TREE_PUBLIC (TREE_OPERAND (t, 0)))
8359c87e
RB
2630 {
2631 tree decl = TREE_OPERAND (t, 0);
2632 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2633 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2634 build1 (ADDR_EXPR, ptrtype, decl),
2635 build_int_cst (ptrtype, 0));
2636 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2637 *ws = 0;
2638 }
2639 else if (TREE_CODE (t) == CONSTRUCTOR)
2640 ;
2641 else if (!EXPR_P (t))
2642 *ws = 0;
2643 return NULL_TREE;
2644}
d7f09764 2645
60bf575c
TV
2646/* Remove functions that are no longer used from offload_funcs, and mark the
2647 remaining ones with DECL_PRESERVE_P. */
2648
2649static void
2650prune_offload_funcs (void)
2651{
2652 if (!offload_funcs)
2653 return;
2654
b94c2dc1
TV
2655 unsigned ix, ix2;
2656 tree *elem_ptr;
2657 VEC_ORDERED_REMOVE_IF (*offload_funcs, ix, ix2, elem_ptr,
2658 cgraph_node::get (*elem_ptr) == NULL);
2659
2660 tree fn_decl;
2661 FOR_EACH_VEC_ELT (*offload_funcs, ix, fn_decl)
2662 DECL_PRESERVE_P (fn_decl) = 1;
60bf575c
TV
2663}
2664
88614dfa
ML
2665/* Produce LTO section that contains global information
2666 about LTO bytecode. */
2667
2668static void
2669produce_lto_section ()
2670{
2671 /* Stream LTO meta section. */
2672 output_block *ob = create_output_block (LTO_section_lto);
2673
3c56d8d8 2674 char * section_name = lto_get_section_name (LTO_section_lto, NULL, 0, NULL);
88614dfa
ML
2675 lto_begin_section (section_name, false);
2676 free (section_name);
2677
87741e51
ML
2678#ifdef HAVE_ZSTD_H
2679 lto_compression compression = ZSTD;
2680#else
88614dfa 2681 lto_compression compression = ZLIB;
87741e51 2682#endif
88614dfa
ML
2683
2684 bool slim_object = flag_generate_lto && !flag_fat_lto_objects;
2685 lto_section s
84110515 2686 = { LTO_major_version, LTO_minor_version, slim_object, 0, 0 };
d1caf05a 2687 s.set_compression (compression);
88614dfa
ML
2688 lto_write_data (&s, sizeof s);
2689 lto_end_section ();
2690 destroy_output_block (ob);
2691}
2692
ebad2eee
JH
2693/* Compare symbols to get them sorted by filename (to optimize streaming) */
2694
2695static int
c50502ca 2696cmp_symbol_files (const void *pn1, const void *pn2, void *id_map_)
ebad2eee
JH
2697{
2698 const symtab_node *n1 = *(const symtab_node * const *)pn1;
2699 const symtab_node *n2 = *(const symtab_node * const *)pn2;
c50502ca
RB
2700 hash_map<lto_file_decl_data *, int> *id_map
2701 = (hash_map<lto_file_decl_data *, int> *)id_map_;
ebad2eee
JH
2702
2703 int file_order1 = n1->lto_file_data ? n1->lto_file_data->order : -1;
2704 int file_order2 = n2->lto_file_data ? n2->lto_file_data->order : -1;
2705
2706 /* Order files same way as they appeared in the command line to reduce
2707 seeking while copying sections. */
2708 if (file_order1 != file_order2)
2709 return file_order1 - file_order2;
2710
2711 /* Order within static library. */
2712 if (n1->lto_file_data && n1->lto_file_data->id != n2->lto_file_data->id)
c50502ca 2713 return *id_map->get (n1->lto_file_data) - *id_map->get (n2->lto_file_data);
ebad2eee
JH
2714
2715 /* And finaly order by the definition order. */
2716 return n1->order - n2->order;
2717}
2718
d7f09764
DN
2719/* Main entry point from the pass manager. */
2720
38f4f02f 2721void
f27c1867 2722lto_output (void)
d7f09764 2723{
d7f09764 2724 struct lto_out_decl_state *decl_state;
b2b29377 2725 bitmap output = NULL;
6ab601ef 2726 bitmap_obstack output_obstack;
ebad2eee 2727 unsigned int i, n_nodes;
7380e6ef 2728 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
ebad2eee 2729 auto_vec<symtab_node *> symbols_to_copy;
d7f09764 2730
60bf575c
TV
2731 prune_offload_funcs ();
2732
b2b29377 2733 if (flag_checking)
6ab601ef
RB
2734 {
2735 bitmap_obstack_initialize (&output_obstack);
2736 output = BITMAP_ALLOC (&output_obstack);
2737 }
b2b29377 2738
47c79d56
DN
2739 /* Initialize the streamer. */
2740 lto_streamer_init ();
d7f09764 2741
88614dfa
ML
2742 produce_lto_section ();
2743
7380e6ef 2744 n_nodes = lto_symtab_encoder_size (encoder);
ebad2eee
JH
2745 /* Prepare vector of functions to output and then sort it to optimize
2746 section copying. */
91fbf0c7 2747 for (i = 0; i < n_nodes; i++)
d7f09764 2748 {
5e20cdc9 2749 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
ebad2eee
JH
2750 if (snode->alias)
2751 continue;
7de90a6c 2752 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
d7f09764 2753 {
7450b255
MJ
2754 if (lto_symtab_encoder_encode_body_p (encoder, node)
2755 && !node->clone_of)
ebad2eee 2756 symbols_to_copy.safe_push (node);
8359c87e 2757 }
7de90a6c 2758 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
8359c87e
RB
2759 {
2760 /* Wrap symbol references inside the ctor in a type
2761 preserving MEM_REF. */
2762 tree ctor = DECL_INITIAL (node->decl);
2763 if (ctor && !in_lto_p)
2764 walk_tree (&ctor, wrap_refs, NULL, NULL);
0b83e688 2765 if (get_symbol_initial_value (encoder, node->decl) == error_mark_node
ebad2eee
JH
2766 && lto_symtab_encoder_encode_initializer_p (encoder, node))
2767 symbols_to_copy.safe_push (node);
d7f09764
DN
2768 }
2769 }
c50502ca
RB
2770 /* Map the section hash to an order it appears in symbols_to_copy
2771 since we want to sort same ID symbols next to each other but need
2772 to avoid making overall order depend on the actual hash value. */
2773 int order = 0;
2774 hash_map<lto_file_decl_data *, int> id_map;
2775 for (i = 0; i < symbols_to_copy.length (); ++i)
2776 {
2777 symtab_node *snode = symbols_to_copy[i];
2778 if (snode->lto_file_data)
2779 {
2780 bool existed_p = false;
2781 int &ord = id_map.get_or_insert (snode->lto_file_data, &existed_p);
2782 if (!existed_p)
2783 ord = order++;
2784 }
2785 }
2786 symbols_to_copy.sort (cmp_symbol_files, (void *)&id_map);
ebad2eee
JH
2787 for (i = 0; i < symbols_to_copy.length (); i++)
2788 {
2789 symtab_node *snode = symbols_to_copy[i];
2790 cgraph_node *cnode;
2791 varpool_node *vnode;
2792
2793 if (flag_checking)
2794 gcc_assert (bitmap_set_bit (output, DECL_UID (snode->decl)));
2795
2796 decl_state = lto_new_out_decl_state ();
2797 lto_push_out_decl_state (decl_state);
2798
2799 if ((cnode = dyn_cast <cgraph_node *> (snode))
2800 && (gimple_has_body_p (cnode->decl)
2801 || (!flag_wpa
2802 && flag_incremental_link != INCREMENTAL_LINK_LTO)
2803 /* Thunks have no body but they may be synthetized
2804 at WPA time. */
f165ef89
JJ
2805 || DECL_ARGUMENTS (cnode->decl)
2806 || cnode->declare_variant_alt))
ebad2eee
JH
2807 output_function (cnode);
2808 else if ((vnode = dyn_cast <varpool_node *> (snode))
2809 && (DECL_INITIAL (vnode->decl) != error_mark_node
2810 || (!flag_wpa
2811 && flag_incremental_link != INCREMENTAL_LINK_LTO)))
2812 output_constructor (vnode);
2813 else
2814 copy_function_or_variable (snode);
2815 gcc_assert (lto_get_out_decl_state () == decl_state);
2816 lto_pop_out_decl_state ();
2817 lto_record_function_out_decl_state (snode->decl, decl_state);
2818 }
d7f09764
DN
2819
2820 /* Emit the callgraph after emitting function bodies. This needs to
2821 be done now to make sure that all the statements in every function
2822 have been renumbered so that edges can be associated with call
2823 statements using the statement UIDs. */
f27c1867 2824 output_symtab ();
d7f09764 2825
ec6fe917
IV
2826 output_offload_tables ();
2827
6ab601ef
RB
2828 if (flag_checking)
2829 {
2830 BITMAP_FREE (output);
2831 bitmap_obstack_release (&output_obstack);
2832 }
d7f09764
DN
2833}
2834
b8698a0f 2835/* Write each node in encoded by ENCODER to OB, as well as those reachable
d7f09764
DN
2836 from it and required for correct representation of its semantics.
2837 Each node in ENCODER must be a global declaration or a type. A node
2838 is written only once, even if it appears multiple times in the
2839 vector. Certain transitively-reachable nodes, such as those
2840 representing expressions, may be duplicated, but such nodes
2841 must not appear in ENCODER itself. */
2842
2843static void
2844write_global_stream (struct output_block *ob,
2845 struct lto_tree_ref_encoder *encoder)
2846{
2847 tree t;
2848 size_t index;
2849 const size_t size = lto_tree_ref_encoder_size (encoder);
2850
2851 for (index = 0; index < size; index++)
2852 {
2853 t = lto_tree_ref_encoder_get_tree (encoder, index);
b4da704c
JH
2854 if (streamer_dump_file)
2855 {
2856 fprintf (streamer_dump_file, " %i:", (int)index);
2857 print_node_brief (streamer_dump_file, "", t, 4);
2858 fprintf (streamer_dump_file, "\n");
2859 }
412288f1 2860 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
b9393656 2861 stream_write_tree (ob, t, false);
d7f09764
DN
2862 }
2863}
2864
2865
2866/* Write a sequence of indices into the globals vector corresponding
2867 to the trees in ENCODER. These are used by the reader to map the
2868 indices used to refer to global entities within function bodies to
2869 their referents. */
2870
2871static void
2872write_global_references (struct output_block *ob,
0896cc42 2873 struct lto_tree_ref_encoder *encoder)
d7f09764
DN
2874{
2875 tree t;
e89964e3
MM
2876 uint32_t index;
2877 const uint32_t size = lto_tree_ref_encoder_size (encoder);
d7f09764 2878
f6bcdb5e
RB
2879 /* Write size and slot indexes as 32-bit unsigned numbers. */
2880 uint32_t *data = XNEWVEC (uint32_t, size + 1);
2881 data[0] = size;
d7f09764
DN
2882
2883 for (index = 0; index < size; index++)
2884 {
83b4db6d 2885 unsigned slot_num;
d7f09764
DN
2886
2887 t = lto_tree_ref_encoder_get_tree (encoder, index);
412288f1 2888 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
e89964e3 2889 gcc_assert (slot_num != (unsigned)-1);
f6bcdb5e 2890 data[index + 1] = slot_num;
d7f09764 2891 }
f6bcdb5e
RB
2892
2893 lto_write_data (data, sizeof (int32_t) * (size + 1));
2894 free (data);
d7f09764
DN
2895}
2896
2897
2898/* Write all the streams in an lto_out_decl_state STATE using
2899 output block OB and output stream OUT_STREAM. */
2900
a183b5c7 2901void
d7f09764
DN
2902lto_output_decl_state_streams (struct output_block *ob,
2903 struct lto_out_decl_state *state)
2904{
2905 int i;
2906
2907 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2908 write_global_stream (ob, &state->streams[i]);
2909}
2910
2911
2912/* Write all the references in an lto_out_decl_state STATE using
2913 output block OB and output stream OUT_STREAM. */
2914
a183b5c7 2915void
d7f09764 2916lto_output_decl_state_refs (struct output_block *ob,
d7f09764
DN
2917 struct lto_out_decl_state *state)
2918{
2919 unsigned i;
83b4db6d 2920 unsigned ref;
d7f09764 2921 tree decl;
b8698a0f 2922
d7f09764
DN
2923 /* Write reference to FUNCTION_DECL. If there is not function,
2924 write reference to void_type_node. */
2925 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
412288f1 2926 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
e89964e3 2927 gcc_assert (ref != (unsigned)-1);
7fa658c2 2928 ref = ref * 2 + (state->compressed ? 1 : 0);
f6bcdb5e 2929 lto_write_data (&ref, sizeof (uint32_t));
d7f09764
DN
2930
2931 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
f6bcdb5e 2932 write_global_references (ob, &state->streams[i]);
d7f09764
DN
2933}
2934
2935
2936/* Return the written size of STATE. */
2937
2938static size_t
2939lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2940{
2941 int i;
2942 size_t size;
2943
2944 size = sizeof (int32_t); /* fn_ref. */
2945 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2946 {
2947 size += sizeof (int32_t); /* vector size. */
2948 size += (lto_tree_ref_encoder_size (&state->streams[i])
2949 * sizeof (int32_t));
2950 }
2951 return size;
2952}
2953
2954
695c3817
JH
2955/* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2956 so far. */
c5d1f058
JH
2957
2958static void
412288f1 2959write_symbol (struct streamer_tree_cache_d *cache,
6e2830c3 2960 tree t, hash_set<const char *> *seen, bool alias)
c5d1f058
JH
2961{
2962 const char *name;
2963 enum gcc_plugin_symbol_kind kind;
083e891e 2964 enum gcc_plugin_symbol_visibility visibility = GCCPV_DEFAULT;
e89964e3 2965 unsigned slot_num;
a9243bfc 2966 uint64_t size;
c5d1f058 2967 const char *comdat;
7d58701c 2968 unsigned char c;
c5d1f058 2969
8813a647 2970 gcc_assert (VAR_OR_FUNCTION_DECL_P (t));
c5d1f058
JH
2971
2972 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2973
e53b6e56 2974 /* This behaves like assemble_name_raw in varasm.cc, performing the
77754180
DK
2975 same name manipulations that ASM_OUTPUT_LABELREF does. */
2976 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2977
6e2830c3 2978 if (seen->add (name))
695c3817 2979 return;
695c3817 2980
412288f1 2981 streamer_tree_cache_lookup (cache, t, &slot_num);
e89964e3 2982 gcc_assert (slot_num != (unsigned)-1);
c5d1f058 2983
c5d1f058 2984 if (DECL_EXTERNAL (t))
d7f09764 2985 {
c5d1f058
JH
2986 if (DECL_WEAK (t))
2987 kind = GCCPK_WEAKUNDEF;
d7f09764 2988 else
c5d1f058
JH
2989 kind = GCCPK_UNDEF;
2990 }
2991 else
2992 {
2993 if (DECL_WEAK (t))
2994 kind = GCCPK_WEAKDEF;
2995 else if (DECL_COMMON (t))
2996 kind = GCCPK_COMMON;
d7f09764 2997 else
c5d1f058
JH
2998 kind = GCCPK_DEF;
2999
695c3817 3000 /* When something is defined, it should have node attached. */
8813a647 3001 gcc_assert (alias || !VAR_P (t) || varpool_node::get (t)->definition);
c5d1f058 3002 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
d52f5295
ML
3003 || (cgraph_node::get (t)
3004 && cgraph_node::get (t)->definition));
d7f09764 3005 }
d7f09764 3006
5d7f4d9c
JH
3007 /* Imitate what default_elf_asm_output_external do.
3008 When symbol is external, we need to output it with DEFAULT visibility
3009 when compiling with -fvisibility=default, while with HIDDEN visibility
3010 when symbol has attribute (visibility("hidden")) specified.
3011 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
3012 right. */
4ad9a9de 3013
5d7f4d9c
JH
3014 if (DECL_EXTERNAL (t)
3015 && !targetm.binds_local_p (t))
3016 visibility = GCCPV_DEFAULT;
3017 else
c3284718 3018 switch (DECL_VISIBILITY (t))
5d7f4d9c
JH
3019 {
3020 case VISIBILITY_DEFAULT:
3021 visibility = GCCPV_DEFAULT;
3022 break;
3023 case VISIBILITY_PROTECTED:
3024 visibility = GCCPV_PROTECTED;
3025 break;
3026 case VISIBILITY_HIDDEN:
3027 visibility = GCCPV_HIDDEN;
3028 break;
3029 case VISIBILITY_INTERNAL:
3030 visibility = GCCPV_INTERNAL;
3031 break;
3032 }
d7f09764 3033
c5d1f058 3034 if (kind == GCCPK_COMMON
4ad9a9de
EB
3035 && DECL_SIZE_UNIT (t)
3036 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
3037 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
c5d1f058
JH
3038 else
3039 size = 0;
3040
3041 if (DECL_ONE_ONLY (t))
d67ff7b7 3042 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
c5d1f058
JH
3043 else
3044 comdat = "";
3045
f6bcdb5e
RB
3046 lto_write_data (name, strlen (name) + 1);
3047 lto_write_data (comdat, strlen (comdat) + 1);
7d58701c 3048 c = (unsigned char) kind;
f6bcdb5e 3049 lto_write_data (&c, 1);
7d58701c 3050 c = (unsigned char) visibility;
f6bcdb5e
RB
3051 lto_write_data (&c, 1);
3052 lto_write_data (&size, 8);
3053 lto_write_data (&slot_num, 4);
d7f09764
DN
3054}
3055
c8429c2a
ML
3056/* Write extension information for symbols (symbol type, section flags). */
3057
3058static void
3059write_symbol_extension_info (tree t)
3060{
3061 unsigned char c;
3062 c = ((unsigned char) TREE_CODE (t) == VAR_DECL
3063 ? GCCST_VARIABLE : GCCST_FUNCTION);
3064 lto_write_data (&c, 1);
3065 unsigned char section_kind = 0;
f6a4d079 3066 if (VAR_P (t))
c8429c2a
ML
3067 {
3068 section *s = get_variable_section (t, false);
3069 if (s->common.flags & SECTION_BSS)
3070 section_kind |= GCCSSK_BSS;
3071 }
3072 lto_write_data (&section_kind, 1);
3073}
3074
c5d1f058
JH
3075/* Write an IL symbol table to OB.
3076 SET and VSET are cgraph/varpool node sets we are outputting. */
d7f09764 3077
c8429c2a 3078static unsigned int
877ab5e9 3079produce_symtab (struct output_block *ob)
d7f09764 3080{
c8429c2a 3081 unsigned int streamed_symbols = 0;
412288f1 3082 struct streamer_tree_cache_d *cache = ob->writer_cache;
3c56d8d8 3083 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, 0, NULL);
7380e6ef 3084 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
c2954538 3085 lto_symtab_encoder_iterator lsei;
d7f09764
DN
3086
3087 lto_begin_section (section_name, false);
3088 free (section_name);
3089
6e2830c3 3090 hash_set<const char *> seen;
c5d1f058 3091
c2954538
JH
3092 /* Write the symbol table.
3093 First write everything defined and then all declarations.
1aa95df7 3094 This is necessary to handle cases where we have duplicated symbols. */
c2954538
JH
3095 for (lsei = lsei_start (encoder);
3096 !lsei_end_p (lsei); lsei_next (&lsei))
c5d1f058 3097 {
5e20cdc9 3098 symtab_node *node = lsei_node (lsei);
c2954538 3099
39aa9b23 3100 if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
695c3817 3101 continue;
6e2830c3 3102 write_symbol (cache, node->decl, &seen, false);
c8429c2a 3103 ++streamed_symbols;
695c3817 3104 }
c2954538
JH
3105 for (lsei = lsei_start (encoder);
3106 !lsei_end_p (lsei); lsei_next (&lsei))
695c3817 3107 {
5e20cdc9 3108 symtab_node *node = lsei_node (lsei);
c5d1f058 3109
39aa9b23 3110 if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
695c3817 3111 continue;
6e2830c3 3112 write_symbol (cache, node->decl, &seen, false);
c8429c2a
ML
3113 ++streamed_symbols;
3114 }
3115
3116 lto_end_section ();
3117
3118 return streamed_symbols;
3119}
3120
3121/* Symtab extension version. */
3122#define LTO_SYMTAB_EXTENSION_VERSION 1
3123
3124/* Write an IL symbol table extension to OB.
3125 SET and VSET are cgraph/varpool node sets we are outputting. */
3126
3127static void
3128produce_symtab_extension (struct output_block *ob,
3129 unsigned int previous_streamed_symbols)
3130{
3131 unsigned int streamed_symbols = 0;
3132 char *section_name = lto_get_section_name (LTO_section_symtab_extension,
3133 NULL, 0, NULL);
3134 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
3135 lto_symtab_encoder_iterator lsei;
3136
3137 lto_begin_section (section_name, false);
3138 free (section_name);
3139
3140 unsigned char version = LTO_SYMTAB_EXTENSION_VERSION;
3141 lto_write_data (&version, 1);
3142
3143 /* Write the symbol table.
3144 First write everything defined and then all declarations.
3145 This is necessary to handle cases where we have duplicated symbols. */
3146 for (lsei = lsei_start (encoder);
3147 !lsei_end_p (lsei); lsei_next (&lsei))
3148 {
3149 symtab_node *node = lsei_node (lsei);
3150
3151 if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
3152 continue;
3153 write_symbol_extension_info (node->decl);
3154 ++streamed_symbols;
3155 }
3156 for (lsei = lsei_start (encoder);
3157 !lsei_end_p (lsei); lsei_next (&lsei))
3158 {
3159 symtab_node *node = lsei_node (lsei);
3160
3161 if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
3162 continue;
3163 write_symbol_extension_info (node->decl);
3164 ++streamed_symbols;
c5d1f058
JH
3165 }
3166
c8429c2a 3167 gcc_assert (previous_streamed_symbols == streamed_symbols);
d7f09764
DN
3168 lto_end_section ();
3169}
3170
3171
db847fa8
JJ
3172/* Init the streamer_mode_table for output, where we collect info on what
3173 machine_mode values have been streamed. */
3174void
3175lto_output_init_mode_table (void)
3176{
3177 memset (streamer_mode_table, '\0', MAX_MACHINE_MODE);
3178}
3179
3180
3181/* Write the mode table. */
3182static void
3183lto_write_mode_table (void)
3184{
3185 struct output_block *ob;
3186 ob = create_output_block (LTO_section_mode_table);
3187 bitpack_d bp = bitpack_create (ob->main_stream);
3188
96a2d174 3189 /* Ensure that for GET_MODE_INNER (m) != m we have
db847fa8
JJ
3190 also the inner mode marked. */
3191 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
3192 if (streamer_mode_table[i])
3193 {
3194 machine_mode m = (machine_mode) i;
40f683e8
RB
3195 machine_mode inner_m = GET_MODE_INNER (m);
3196 if (inner_m != m)
3197 streamer_mode_table[(int) inner_m] = 1;
db847fa8 3198 }
86ff0533
PL
3199
3200 /* Pack the mode_bits value within 5 bits (up to 31) in the beginning. */
3201 unsigned mode_bits = ceil_log2 (MAX_MACHINE_MODE);
3202 bp_pack_value (&bp, mode_bits, 5);
3203
96a2d174 3204 /* First stream modes that have GET_MODE_INNER (m) == m,
db847fa8
JJ
3205 so that we can refer to them afterwards. */
3206 for (int pass = 0; pass < 2; pass++)
3207 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
3208 if (streamer_mode_table[i] && i != (int) VOIDmode && i != (int) BLKmode)
3209 {
3210 machine_mode m = (machine_mode) i;
1c0e448f 3211 if ((GET_MODE_INNER (m) == m) ^ (pass == 0))
db847fa8 3212 continue;
86ff0533 3213 bp_pack_value (&bp, m, mode_bits);
db847fa8 3214 bp_pack_enum (&bp, mode_class, MAX_MODE_CLASS, GET_MODE_CLASS (m));
cf098191 3215 bp_pack_poly_value (&bp, GET_MODE_SIZE (m), 16);
bb94ec76 3216 bp_pack_poly_value (&bp, GET_MODE_PRECISION (m), 16);
86ff0533 3217 bp_pack_value (&bp, GET_MODE_INNER (m), mode_bits);
7b777afa 3218 bp_pack_poly_value (&bp, GET_MODE_NUNITS (m), 16);
db847fa8
JJ
3219 switch (GET_MODE_CLASS (m))
3220 {
3221 case MODE_FRACT:
3222 case MODE_UFRACT:
3223 case MODE_ACCUM:
3224 case MODE_UACCUM:
3225 bp_pack_value (&bp, GET_MODE_IBIT (m), 8);
3226 bp_pack_value (&bp, GET_MODE_FBIT (m), 8);
3227 break;
3228 case MODE_FLOAT:
3229 case MODE_DECIMAL_FLOAT:
3230 bp_pack_string (ob, &bp, REAL_MODE_FORMAT (m)->name, true);
3231 break;
3232 default:
3233 break;
3234 }
3235 bp_pack_string (ob, &bp, GET_MODE_NAME (m), true);
3236 }
86ff0533 3237 bp_pack_value (&bp, VOIDmode, mode_bits);
db847fa8
JJ
3238
3239 streamer_write_bitpack (&bp);
3240
3241 char *section_name
3c56d8d8 3242 = lto_get_section_name (LTO_section_mode_table, NULL, 0, NULL);
db847fa8
JJ
3243 lto_begin_section (section_name, !flag_wpa);
3244 free (section_name);
3245
3246 /* The entire header stream is computed here. */
3247 struct lto_simple_header_with_strings header;
3248 memset (&header, 0, sizeof (header));
3249
db847fa8
JJ
3250 header.main_size = ob->main_stream->total_size;
3251 header.string_size = ob->string_stream->total_size;
3252 lto_write_data (&header, sizeof header);
3253
3254 /* Put all of the gimple and the string table out the asm file as a
3255 block of text. */
3256 lto_write_stream (ob->main_stream);
3257 lto_write_stream (ob->string_stream);
3258
3259 lto_end_section ();
3260 destroy_output_block (ob);
3261}
3262
3263
d7f09764
DN
3264/* This pass is run after all of the functions are serialized and all
3265 of the IPA passes have written their serialized forms. This pass
3266 causes the vector of all of the global decls and types used from
3267 this file to be written in to a section that can then be read in to
3268 recover these on other side. */
3269
38f4f02f 3270void
f27c1867 3271produce_asm_for_decls (void)
d7f09764
DN
3272{
3273 struct lto_out_decl_state *out_state;
3274 struct lto_out_decl_state *fn_out_state;
3275 struct lto_decl_header header;
3276 char *section_name;
3277 struct output_block *ob;
d7f09764
DN
3278 unsigned idx, num_fns;
3279 size_t decl_state_size;
3280 int32_t num_decl_states;
3281
3282 ob = create_output_block (LTO_section_decls);
d7f09764 3283
b8698a0f 3284 memset (&header, 0, sizeof (struct lto_decl_header));
d7f09764 3285
3c56d8d8 3286 section_name = lto_get_section_name (LTO_section_decls, NULL, 0, NULL);
d7f09764
DN
3287 lto_begin_section (section_name, !flag_wpa);
3288 free (section_name);
3289
3290 /* Make string 0 be a NULL string. */
412288f1 3291 streamer_write_char_stream (ob->string_stream, 0);
d7f09764 3292
877ab5e9
JH
3293 gcc_assert (!alias_pairs);
3294
bdc67fd6 3295 /* Get rid of the global decl state hash tables to save some memory. */
d7f09764 3296 out_state = lto_get_out_decl_state ();
bdc67fd6
RB
3297 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
3298 if (out_state->streams[i].tree_hash_table)
3299 {
3300 delete out_state->streams[i].tree_hash_table;
3301 out_state->streams[i].tree_hash_table = NULL;
3302 }
3303
3304 /* Write the global symbols. */
b4da704c
JH
3305 if (streamer_dump_file)
3306 fprintf (streamer_dump_file, "Outputting global stream\n");
d7f09764 3307 lto_output_decl_state_streams (ob, out_state);
bdc67fd6 3308 num_fns = lto_function_decl_states.length ();
d7f09764
DN
3309 for (idx = 0; idx < num_fns; idx++)
3310 {
3311 fn_out_state =
9771b263 3312 lto_function_decl_states[idx];
b4da704c 3313 if (streamer_dump_file)
0896cc42 3314 fprintf (streamer_dump_file, "Outputting stream for %s\n",
b4da704c
JH
3315 IDENTIFIER_POINTER
3316 (DECL_ASSEMBLER_NAME (fn_out_state->fn_decl)));
d7f09764
DN
3317 lto_output_decl_state_streams (ob, fn_out_state);
3318 }
3319
d7f09764
DN
3320 /* Currently not used. This field would allow us to preallocate
3321 the globals vector, so that it need not be resized as it is extended. */
3322 header.num_nodes = -1;
3323
3324 /* Compute the total size of all decl out states. */
3325 decl_state_size = sizeof (int32_t);
3326 decl_state_size += lto_out_decl_state_written_size (out_state);
3327 for (idx = 0; idx < num_fns; idx++)
3328 {
3329 fn_out_state =
9771b263 3330 lto_function_decl_states[idx];
d7f09764
DN
3331 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
3332 }
3333 header.decl_state_size = decl_state_size;
3334
3335 header.main_size = ob->main_stream->total_size;
3336 header.string_size = ob->string_stream->total_size;
3337
f6bcdb5e 3338 lto_write_data (&header, sizeof header);
b8698a0f 3339
d7f09764
DN
3340 /* Write the main out-decl state, followed by out-decl states of
3341 functions. */
d7f09764 3342 num_decl_states = num_fns + 1;
f6bcdb5e
RB
3343 lto_write_data (&num_decl_states, sizeof (num_decl_states));
3344 lto_output_decl_state_refs (ob, out_state);
d7f09764
DN
3345 for (idx = 0; idx < num_fns; idx++)
3346 {
f6bcdb5e
RB
3347 fn_out_state = lto_function_decl_states[idx];
3348 lto_output_decl_state_refs (ob, fn_out_state);
d7f09764 3349 }
d7f09764
DN
3350
3351 lto_write_stream (ob->main_stream);
3352 lto_write_stream (ob->string_stream);
3353
3354 lto_end_section ();
3355
c5d1f058
JH
3356 /* Write the symbol table. It is used by linker to determine dependencies
3357 and thus we can skip it for WPA. */
3358 if (!flag_wpa)
c8429c2a
ML
3359 {
3360 unsigned int streamed_symbols = produce_symtab (ob);
3361 produce_symtab_extension (ob, streamed_symbols);
3362 }
d7f09764
DN
3363
3364 /* Write command line opts. */
3365 lto_write_options ();
3366
3367 /* Deallocate memory and clean up. */
6cd174f6
JH
3368 for (idx = 0; idx < num_fns; idx++)
3369 {
3370 fn_out_state =
9771b263 3371 lto_function_decl_states[idx];
6cd174f6
JH
3372 lto_delete_out_decl_state (fn_out_state);
3373 }
7380e6ef 3374 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
9771b263 3375 lto_function_decl_states.release ();
d7f09764 3376 destroy_output_block (ob);
db847fa8
JJ
3377 if (lto_stream_offload_p)
3378 lto_write_mode_table ();
d7f09764 3379}