gccrs: add test case to show our query-type system is working
[official-gcc.git] / gcc / lto-streamer-out.cc
blob0bca530313cfe32e79b884ca9831e487725ab4fb
1 /* Write the GIMPLE representation to a file stream.
3 Copyright (C) 2009-2023 Free Software Foundation, Inc.
4 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
5 Re-implemented by Diego Novillo <dnovillo@google.com>
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "backend.h"
27 #include "target.h"
28 #include "rtl.h"
29 #include "tree.h"
30 #include "gimple.h"
31 #include "tree-pass.h"
32 #include "ssa.h"
33 #include "gimple-streamer.h"
34 #include "alias.h"
35 #include "stor-layout.h"
36 #include "gimple-iterator.h"
37 #include "except.h"
38 #include "lto-symtab.h"
39 #include "cgraph.h"
40 #include "cfgloop.h"
41 #include "builtins.h"
42 #include "gomp-constants.h"
43 #include "debug.h"
44 #include "omp-offload.h"
45 #include "print-tree.h"
46 #include "tree-dfa.h"
47 #include "file-prefix-map.h" /* remap_debug_filename() */
48 #include "output.h"
49 #include "ipa-utils.h"
50 #include "toplev.h"
53 static void lto_write_tree (struct output_block*, tree, bool);
55 /* Clear the line info stored in DATA_IN. */
57 static void
58 clear_line_info (struct output_block *ob)
60 ob->current_file = NULL;
61 ob->current_line = 0;
62 ob->current_col = 0;
63 ob->current_sysp = false;
64 ob->reset_locus = true;
65 ob->emit_pwd = true;
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;
70 ob->current_discr = UINT_MAX;
74 /* Create the output block and return it. SECTION_TYPE is
75 LTO_section_function_body or LTO_static_initializer. */
77 struct output_block *
78 create_output_block (enum lto_section_type section_type)
80 struct output_block *ob = XCNEW (struct output_block);
81 if (streamer_dump_file)
82 fprintf (streamer_dump_file, "Creating output block for %s\n",
83 lto_section_name[section_type]);
85 ob->section_type = section_type;
86 ob->decl_state = lto_get_out_decl_state ();
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>);
91 ob->main_stream = XCNEW (struct lto_output_stream);
92 ob->string_stream = XCNEW (struct lto_output_stream);
93 ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true, false);
95 if (section_type == LTO_section_function_body)
96 ob->cfg_stream = XCNEW (struct lto_output_stream);
98 clear_line_info (ob);
100 ob->string_hash_table = new hash_table<string_slot_hasher> (37);
101 gcc_obstack_init (&ob->obstack);
103 return ob;
107 /* Destroy the output block OB. */
109 void
110 destroy_output_block (struct output_block *ob)
112 enum lto_section_type section_type = ob->section_type;
114 delete ob->string_hash_table;
115 ob->string_hash_table = NULL;
116 delete ob->local_trees;
118 free (ob->main_stream);
119 free (ob->string_stream);
120 if (section_type == LTO_section_function_body)
121 free (ob->cfg_stream);
123 streamer_tree_cache_delete (ob->writer_cache);
124 obstack_free (&ob->obstack, NULL);
126 free (ob);
130 /* Wrapper around variably_modified_type_p avoiding type modification
131 during WPA streaming. */
133 static bool
134 lto_variably_modified_type_p (tree type)
136 return (in_lto_p
137 ? TYPE_LANG_FLAG_0 (TYPE_MAIN_VARIANT (type))
138 : variably_modified_type_p (type, NULL_TREE));
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). */
147 static bool
148 tree_is_indexable (tree t)
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. */
153 if ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
154 && DECL_CONTEXT (t))
155 return lto_variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)));
156 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared.
157 We should no longer need to stream it. */
158 else if (TREE_CODE (t) == IMPORTED_DECL)
159 gcc_unreachable ();
160 else if (TREE_CODE (t) == LABEL_DECL)
161 return FORCED_LABEL (t) || DECL_NONLOCAL (t);
162 else if (((VAR_P (t) && !TREE_STATIC (t))
163 || TREE_CODE (t) == TYPE_DECL
164 || TREE_CODE (t) == CONST_DECL
165 || TREE_CODE (t) == NAMELIST_DECL)
166 && decl_function_context (t))
167 return false;
168 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
169 return false;
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)
175 && lto_variably_modified_type_p (t))
176 return false;
177 else if (TREE_CODE (t) == FIELD_DECL
178 && lto_variably_modified_type_p (DECL_CONTEXT (t)))
179 return false;
180 else
181 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
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. */
189 static void
190 lto_output_location_1 (struct output_block *ob, struct bitpack_d *bp,
191 location_t orig_loc, bool block_p)
193 location_t loc = LOCATION_LOCUS (orig_loc);
195 if (loc >= RESERVED_LOCATION_COUNT)
197 expanded_location xloc = expand_location (loc);
198 unsigned discr = get_discriminator_from_loc (orig_loc);
200 if (ob->reset_locus)
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;
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));
219 bp_pack_value (bp, ob->current_line != xloc.line, 1);
220 bp_pack_value (bp, ob->current_col != xloc.column, 1);
221 bp_pack_value (bp, ob->current_discr != discr, 1);
223 if (ob->current_file != xloc.file)
225 bool stream_pwd = false;
226 const char *remapped = remap_debug_filename (xloc.file);
227 if (ob->emit_pwd && remapped && !IS_ABSOLUTE_PATH (remapped))
229 stream_pwd = true;
230 ob->emit_pwd = false;
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);
236 bp_pack_value (bp, xloc.sysp, 1);
238 ob->current_file = xloc.file;
239 ob->current_sysp = xloc.sysp;
241 if (ob->current_line != xloc.line)
242 bp_pack_var_len_unsigned (bp, xloc.line);
243 ob->current_line = xloc.line;
245 if (ob->current_col != xloc.column)
246 bp_pack_var_len_unsigned (bp, xloc.column);
247 ob->current_col = xloc.column;
249 if (ob->current_discr != discr)
250 bp_pack_var_len_unsigned (bp, discr);
251 ob->current_discr = discr;
253 else
254 bp_pack_int_in_range (bp, 0, RESERVED_LOCATION_COUNT + 1, loc);
256 if (block_p)
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;
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. */
271 void
272 lto_output_location (struct output_block *ob, struct bitpack_d *bp,
273 location_t loc)
275 lto_output_location_1 (ob, bp, loc, false);
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. */
283 void
284 lto_output_location_and_block (struct output_block *ob, struct bitpack_d *bp,
285 location_t loc)
287 lto_output_location_1 (ob, bp, loc, true);
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. */
297 static unsigned
298 lto_get_index (struct lto_tree_ref_encoder *encoder, tree t)
300 bool existed_p;
302 unsigned int &index
303 = encoder->tree_hash_table->get_or_insert (t, &existed_p);
304 if (!existed_p)
306 index = encoder->trees.length ();
307 if (streamer_dump_file)
309 print_node_brief (streamer_dump_file, " Encoding indexable ",
310 t, 4);
311 fprintf (streamer_dump_file, " as %i \n", index);
313 encoder->trees.safe_push (t);
316 return index;
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. */
324 static void
325 lto_indexable_tree_ref (struct output_block *ob, tree expr,
326 enum LTO_tags *tag, unsigned *index)
328 gcc_checking_assert (tree_is_indexable (expr));
330 if (TREE_CODE (expr) == SSA_NAME)
332 *tag = LTO_ssa_name_ref;
333 *index = SSA_NAME_VERSION (expr);
335 else
337 *tag = LTO_global_stream_ref;
338 *index = lto_get_index (&ob->decl_state->streams[LTO_DECL_STREAM], expr);
343 /* Output a static or extern var DECL to OBS. */
345 void
346 lto_output_var_decl_ref (struct lto_out_decl_state *decl_state,
347 struct lto_output_stream * obs, tree decl)
349 gcc_checking_assert (TREE_CODE (decl) == VAR_DECL);
350 streamer_write_uhwi_stream
351 (obs, lto_get_index (&decl_state->streams[LTO_DECL_STREAM],
352 decl));
356 /* Output a static or extern var DECL to OBS. */
358 void
359 lto_output_fn_decl_ref (struct lto_out_decl_state *decl_state,
360 struct lto_output_stream * obs, tree decl)
362 gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL);
363 streamer_write_uhwi_stream
364 (obs, lto_get_index (&decl_state->streams[LTO_DECL_STREAM], decl));
367 /* Return true if EXPR is a tree node that can be written to disk. */
369 static inline bool
370 lto_is_streamable (tree expr)
372 enum tree_code code = TREE_CODE (expr);
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
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
385 && (code == CASE_LABEL_EXPR
386 || code == DECL_EXPR
387 || TREE_CODE_CLASS (code) != tcc_statement);
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.
395 Count the size of initializer until the size in DATA is positive. */
397 static tree
398 subtract_estimated_size (tree *tp, int *ws, void *data)
400 long *sum = (long *)data;
401 if (tree_is_indexable (*tp))
403 /* Indexable tree is one reference to global stream.
404 Guess it may be about 4 bytes. */
405 *sum -= 4;
406 *ws = 0;
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
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;
420 if (*sum < 0)
421 return *tp;
422 return NULL_TREE;
426 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
428 static tree
429 get_symbol_initial_value (lto_symtab_encoder_t encoder, tree expr)
431 gcc_checking_assert (DECL_P (expr)
432 && TREE_CODE (expr) != FUNCTION_DECL
433 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL);
435 /* Handle DECL_INITIAL for symbols. */
436 tree initial = DECL_INITIAL (expr);
437 if (VAR_P (expr)
438 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
439 && !DECL_IN_CONSTANT_POOL (expr)
440 && initial)
442 varpool_node *vnode;
443 /* Extra section needs about 30 bytes; do not produce it for simple
444 scalar values. */
445 if (!(vnode = varpool_node::get (expr))
446 || !lto_symtab_encoder_encode_initializer_p (encoder, vnode))
447 initial = error_mark_node;
448 if (initial != error_mark_node)
450 long max_size = 30;
451 if (walk_tree (&initial, subtract_estimated_size, (void *)&max_size,
452 NULL))
453 initial = error_mark_node;
457 return initial;
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. */
466 void
467 stream_write_tree_ref (struct output_block *ob, tree t)
469 if (!t)
470 streamer_write_zero (ob);
471 else
473 unsigned int ix;
474 bool existed_p = streamer_tree_cache_lookup (ob->writer_cache, t, &ix);
475 if (existed_p)
476 streamer_write_hwi (ob, ix + 1);
477 else
479 enum LTO_tags tag;
480 unsigned ix;
481 int id = 0;
483 lto_indexable_tree_ref (ob, t, &tag, &ix);
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));
490 if (streamer_debugging)
491 streamer_write_uhwi (ob, TREE_CODE (t));
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. */
502 static void
503 lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
505 if (streamer_dump_file)
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]);
513 /* Pack all the non-pointer fields in EXPR into a bitpack and write
514 the resulting bitpack. */
515 streamer_write_tree_bitfields (ob, expr);
517 /* Write all the pointer fields in EXPR. */
518 streamer_write_tree_body (ob, expr);
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)
525 /* Handle DECL_INITIAL for symbols. */
526 tree initial = get_symbol_initial_value
527 (ob->decl_state->symtab_node_encoder, expr);
528 stream_write_tree (ob, initial, ref_p);
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)
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))
544 streamer_write_string (ob, ob->main_stream, sym, true);
545 streamer_write_uhwi (ob, off);
547 else
548 streamer_write_string (ob, ob->main_stream, NULL, true);
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. */
557 static void
558 lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
560 if (!lto_is_streamable (expr))
561 internal_error ("tree code %qs is not supported in LTO streams",
562 get_tree_code_name (TREE_CODE (expr)));
564 /* Write the header, containing everything needed to materialize
565 EXPR on the reading side. */
566 streamer_write_tree_header (ob, expr);
568 lto_write_tree_1 (ob, expr, ref_p);
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. */
575 static void
576 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
577 bool ref_p, bool this_ref_p)
579 unsigned ix;
581 gcc_checking_assert (expr != NULL_TREE
582 && !(this_ref_p && tree_is_indexable (expr)));
584 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
585 expr, hash, &ix);
586 gcc_assert (!exists_p);
587 if (TREE_CODE (expr) == INTEGER_CST
588 && !TREE_OVERFLOW (expr))
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). */
593 streamer_write_integer_cst (ob, expr);
595 else
597 /* This is the first time we see EXPR, write its fields
598 to OB. */
599 lto_write_tree (ob, expr, ref_p);
603 class DFS
605 public:
606 DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
607 bool single_p);
608 ~DFS ();
610 struct scc_entry
612 tree t;
613 hashval_t hash;
615 auto_vec<scc_entry,32> sccstack;
617 private:
618 struct sccs
620 unsigned int dfsnum;
621 unsigned int low;
623 struct worklist
625 tree expr;
626 sccs *from_state;
627 sccs *cstate;
628 bool ref_p;
629 bool this_ref_p;
631 /* Maximum index of scc stack containing a local tree. */
632 int max_local_entry;
634 static int scc_entry_compare (const void *, const void *);
636 void DFS_write_tree_body (struct output_block *ob,
637 tree expr, sccs *expr_state, bool ref_p);
639 void DFS_write_tree (struct output_block *ob, sccs *from_state,
640 tree expr, bool ref_p, bool this_ref_p);
642 hashval_t
643 hash_scc (struct output_block *ob, unsigned first, unsigned size,
644 bool ref_p, bool this_ref_p);
646 hash_map<tree, sccs *> sccstate;
647 auto_vec<worklist, 32> worklist_vec;
648 struct obstack sccstate_obstack;
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
654 information needed by the tree merging in lto-common.cc (in particular,
655 scc hash codes are not streamed).
657 TRANSLATION_UNIT_DECL is handled specially since references to it does
658 not make other trees local as well. */
660 static bool
661 local_tree_p (tree t)
663 switch (TREE_CODE (t))
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;
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. */
692 DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
693 bool single_p)
695 unsigned int next_dfs_num = 1;
697 max_local_entry = -1;
698 gcc_obstack_init (&sccstate_obstack);
699 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p);
700 while (!worklist_vec.is_empty ())
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)
710 sccs **slot = &sccstate.get_or_insert (expr);
711 cstate = *slot;
712 if (cstate)
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;
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);
724 if (ob->local_trees && local_tree_p (expr))
725 max_local_entry = sccstack.length ();
726 sccstack.safe_push (e);
727 cstate->dfsnum = next_dfs_num++;
728 cstate->low = cstate->dfsnum;
729 w.cstate = cstate;
731 if (TREE_CODE (expr) == INTEGER_CST
732 && !TREE_OVERFLOW (expr))
733 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
734 else
736 DFS_write_tree_body (ob, expr, cstate, ref_p);
738 /* Walk any LTO-specific edges. */
739 if (DECL_P (expr)
740 && TREE_CODE (expr) != FUNCTION_DECL
741 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
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);
750 continue;
753 /* See if we found an SCC. */
754 if (cstate->low == cstate->dfsnum)
756 unsigned first, size;
757 tree x;
759 /* If we are re-walking a single leaf SCC just pop it,
760 let earlier worklist item access the sccstack. */
761 if (single_p)
763 worklist_vec.pop ();
764 continue;
767 /* Pop the SCC and compute its size. */
768 first = sccstack.length ();
771 x = sccstack[--first].t;
773 while (x != expr);
774 size = sccstack.length () - first;
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;
780 bool local_to_unit = !ob->local_trees
781 || max_local_entry >= (int)first;
783 /* Remember that trees are local so info gets propagated to other
784 SCCs. */
785 if (local_to_unit && ob->local_trees)
787 for (unsigned i = 0; i < size; ++i)
788 ob->local_trees->add (sccstack[first + i].t);
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;
799 if (!local_to_unit)
801 scc_hash = hash_scc (ob, first, size, ref_p, this_ref_p);
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;)
808 unsigned from = i;
809 for (i = i + 1; i < size
810 && (sccstack[first + i].hash
811 == sccstack[first + from].hash); ++i)
813 if (i - from < scc_entry_len)
815 scc_entry_len = i - from;
816 entry_start = from;
819 for (unsigned i = 0; i < scc_entry_len; ++i)
820 std::swap (sccstack[first + i],
821 sccstack[first + entry_start + i]);
823 /* We already sorted SCC deterministically in hash_scc. */
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);
831 worklist_vec.pop ();
833 unsigned int prev_size = ob->main_stream->total_size;
835 /* Only global decl sections are considered by tree merging. */
836 if (ob->section_type != LTO_section_decls)
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;
842 if (streamer_dump_file)
844 fprintf (streamer_dump_file,
845 " Start of LTO_trees of size %i\n", size);
847 streamer_write_record_start (ob, LTO_trees);
848 streamer_write_uhwi (ob, size);
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)))))
862 gcc_checking_assert (ob->section_type == LTO_section_decls);
863 if (streamer_dump_file)
865 fprintf (streamer_dump_file,
866 " Start of LTO_tree_scc of size %i\n", size);
868 streamer_write_record_start (ob, LTO_tree_scc);
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);
875 streamer_write_uhwi (ob, scc_hash);
877 /* Non-trivial SCCs must be packed to trees blocks so forward
878 references work correctly. */
879 else if (size != 1)
881 if (streamer_dump_file)
883 fprintf (streamer_dump_file,
884 " Start of LTO_trees of size %i\n", size);
886 streamer_write_record_start (ob, LTO_trees);
887 streamer_write_uhwi (ob, size);
889 else if (streamer_dump_file)
891 fprintf (streamer_dump_file, " Streaming single tree\n");
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
897 this way. */
898 if (size == 1)
899 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
900 else
903 /* Write all headers and populate the streamer cache. */
904 for (unsigned i = 0; i < size; ++i)
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);
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)));
917 /* Write the header, containing everything needed to
918 materialize EXPR on the reading side. */
919 streamer_write_tree_header (ob, t);
922 /* Write the bitpacks and tree references. */
923 for (unsigned i = 0; i < size; ++i)
924 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
926 if (streamer_dump_file)
927 fprintf (streamer_dump_file, " %u bytes\n",
928 ob->main_stream->total_size - prev_size);
930 /* Finally truncate the vector. */
931 sccstack.truncate (first);
932 if ((int)first <= max_local_entry)
933 max_local_entry = first - 1;
935 if (from_state)
936 from_state->low = MIN (from_state->low, cstate->low);
937 continue;
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 ();
948 DFS::~DFS ()
950 obstack_free (&sccstate_obstack, NULL);
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. */
956 void
957 DFS::DFS_write_tree_body (struct output_block *ob,
958 tree expr, sccs *expr_state, bool ref_p)
960 #define DFS_follow_tree_edge(DEST) \
961 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
963 enum tree_code code;
965 code = TREE_CODE (expr);
967 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
969 if (TREE_CODE (expr) != IDENTIFIER_NODE)
970 DFS_follow_tree_edge (TREE_TYPE (expr));
973 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
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));
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));
984 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
986 DFS_follow_tree_edge (TREE_REALPART (expr));
987 DFS_follow_tree_edge (TREE_IMAGPART (expr));
990 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
992 /* Drop names that were created for anonymous entities. */
993 if (DECL_NAME (expr)
994 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
995 && IDENTIFIER_ANON_P (DECL_NAME (expr)))
997 else
998 DFS_follow_tree_edge (DECL_NAME (expr));
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));
1006 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1008 DFS_follow_tree_edge (DECL_SIZE (expr));
1009 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
1011 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
1012 special handling in LTO, it must be handled by streamer hooks. */
1014 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
1016 /* We use DECL_ABSTRACT_ORIGIN == error_mark_node to mark
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);
1020 DFS_follow_tree_edge (DECL_ABSTRACT_ORIGIN (expr));
1022 if ((VAR_P (expr)
1023 || TREE_CODE (expr) == PARM_DECL)
1024 && DECL_HAS_VALUE_EXPR_P (expr))
1025 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
1026 if (VAR_P (expr)
1027 && DECL_HAS_DEBUG_EXPR_P (expr))
1028 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
1031 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
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));
1038 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
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));
1044 gcc_checking_assert (!DECL_FCONTEXT (expr));
1047 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1049 gcc_checking_assert (DECL_VINDEX (expr) == NULL);
1050 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
1051 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr));
1052 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
1055 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
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. */
1069 /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
1070 it cannot be freed by free_lang_data without triggering ICEs in
1071 langhooks. */
1074 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1076 if (TREE_CODE (expr) == ARRAY_TYPE)
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);
1081 else if (TREE_CODE (expr) == FUNCTION_TYPE
1082 || TREE_CODE (expr) == METHOD_TYPE)
1083 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
1085 if (!POINTER_TYPE_P (expr))
1086 DFS_follow_tree_edge (TYPE_MIN_VALUE_RAW (expr));
1087 DFS_follow_tree_edge (TYPE_MAX_VALUE_RAW (expr));
1090 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1092 DFS_follow_tree_edge (TREE_PURPOSE (expr));
1093 DFS_follow_tree_edge (TREE_VALUE (expr));
1094 DFS_follow_tree_edge (TREE_CHAIN (expr));
1097 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1099 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
1100 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
1103 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1105 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
1106 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
1107 DFS_follow_tree_edge (TREE_BLOCK (expr));
1110 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
1112 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
1114 /* We would have to stream externals in the block chain as
1115 non-references but we should have dropped them in
1116 free-lang-data. */
1117 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
1118 DFS_follow_tree_edge (t);
1121 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
1122 DFS_follow_tree_edge (BLOCK_ABSTRACT_ORIGIN (expr));
1124 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
1125 information for early inlined BLOCKs so drop it on the floor instead
1126 of ICEing in dwarf2out.cc. */
1128 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
1129 streaming time. */
1131 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
1132 list is re-constructed from BLOCK_SUPERCONTEXT. */
1135 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1137 unsigned i;
1138 tree t;
1140 /* Note that the number of BINFO slots has already been emitted in
1141 EXPR's header (see streamer_write_tree_header) because this length
1142 is needed to build the empty BINFO node on the reader side. */
1143 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
1144 DFS_follow_tree_edge (t);
1145 DFS_follow_tree_edge (BINFO_OFFSET (expr));
1146 DFS_follow_tree_edge (BINFO_VTABLE (expr));
1148 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
1149 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
1150 by C++ FE only. */
1153 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1155 unsigned i;
1156 tree index, value;
1158 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
1160 DFS_follow_tree_edge (index);
1161 DFS_follow_tree_edge (value);
1165 if (code == OMP_CLAUSE)
1167 int i;
1168 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
1169 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
1170 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
1173 #undef DFS_follow_tree_edge
1176 /* Return a hash value for the tree T.
1177 CACHE holds hash values of trees outside current SCC. MAP, if non-NULL,
1178 may hold hash values if trees inside current SCC. */
1180 static hashval_t
1181 hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map, tree t)
1183 inchash::hash hstate;
1185 #define visit(SIBLING) \
1186 do { \
1187 unsigned ix; \
1188 if (!SIBLING) \
1189 hstate.add_int (0); \
1190 else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
1191 hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \
1192 else if (map) \
1193 hstate.add_int (*map->get (SIBLING)); \
1194 else \
1195 hstate.add_int (1); \
1196 } while (0)
1198 /* Hash TS_BASE. */
1199 enum tree_code code = TREE_CODE (t);
1200 hstate.add_int (code);
1201 if (!TYPE_P (t))
1203 hstate.add_flag (TREE_SIDE_EFFECTS (t));
1204 hstate.add_flag (TREE_CONSTANT (t));
1205 hstate.add_flag (TREE_READONLY (t));
1206 hstate.add_flag (TREE_PUBLIC (t));
1208 hstate.add_flag (TREE_ADDRESSABLE (t));
1209 hstate.add_flag (TREE_THIS_VOLATILE (t));
1210 if (DECL_P (t))
1211 hstate.add_flag (DECL_UNSIGNED (t));
1212 else if (TYPE_P (t))
1213 hstate.add_flag (TYPE_UNSIGNED (t));
1214 if (TYPE_P (t))
1215 hstate.add_flag (TYPE_ARTIFICIAL (t));
1216 else
1217 hstate.add_flag (TREE_NO_WARNING (t));
1218 hstate.add_flag (TREE_NOTHROW (t));
1219 hstate.add_flag (TREE_STATIC (t));
1220 hstate.add_flag (TREE_PROTECTED (t));
1221 hstate.add_flag (TREE_DEPRECATED (t));
1222 if (code != TREE_BINFO)
1223 hstate.add_flag (TREE_PRIVATE (t));
1224 if (TYPE_P (t))
1226 hstate.add_flag (AGGREGATE_TYPE_P (t)
1227 ? TYPE_REVERSE_STORAGE_ORDER (t) : TYPE_SATURATING (t));
1228 hstate.add_flag (TYPE_ADDR_SPACE (t));
1230 else if (code == SSA_NAME)
1231 hstate.add_flag (SSA_NAME_IS_DEFAULT_DEF (t));
1232 hstate.commit_flag ();
1234 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
1235 hstate.add_wide_int (wi::to_widest (t));
1237 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
1239 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
1240 hstate.add_flag (r.cl);
1241 hstate.add_flag (r.sign);
1242 hstate.add_flag (r.signalling);
1243 hstate.add_flag (r.canonical);
1244 hstate.commit_flag ();
1245 hstate.add_int (r.uexp);
1246 hstate.add (r.sig, sizeof (r.sig));
1249 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
1251 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
1252 hstate.add_int (f.mode);
1253 hstate.add_int (f.data.low);
1254 hstate.add_int (f.data.high);
1257 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1259 hstate.add_hwi (DECL_MODE (t));
1260 hstate.add_flag (DECL_NONLOCAL (t));
1261 hstate.add_flag (DECL_VIRTUAL_P (t));
1262 hstate.add_flag (DECL_IGNORED_P (t));
1263 hstate.add_flag (DECL_ABSTRACT_P (t));
1264 hstate.add_flag (DECL_ARTIFICIAL (t));
1265 hstate.add_flag (DECL_USER_ALIGN (t));
1266 hstate.add_flag (DECL_PRESERVE_P (t));
1267 hstate.add_flag (DECL_EXTERNAL (t));
1268 hstate.add_flag (DECL_NOT_GIMPLE_REG_P (t));
1269 hstate.commit_flag ();
1270 hstate.add_int (DECL_ALIGN (t));
1271 if (code == LABEL_DECL)
1273 hstate.add_int (EH_LANDING_PAD_NR (t));
1274 hstate.add_int (LABEL_DECL_UID (t));
1276 else if (code == FIELD_DECL)
1278 hstate.add_flag (DECL_PACKED (t));
1279 hstate.add_flag (DECL_NONADDRESSABLE_P (t));
1280 hstate.add_flag (DECL_PADDING_P (t));
1281 if (DECL_BIT_FIELD (t))
1282 hstate.add_flag (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (t));
1283 else
1284 hstate.add_flag (DECL_FIELD_ABI_IGNORED (t));
1285 hstate.add_int (DECL_OFFSET_ALIGN (t));
1287 else if (code == VAR_DECL)
1289 hstate.add_flag (DECL_HAS_DEBUG_EXPR_P (t));
1290 hstate.add_flag (DECL_NONLOCAL_FRAME (t));
1292 if (code == RESULT_DECL
1293 || code == PARM_DECL
1294 || code == VAR_DECL)
1296 hstate.add_flag (DECL_BY_REFERENCE (t));
1297 if (code == VAR_DECL
1298 || code == PARM_DECL)
1299 hstate.add_flag (DECL_HAS_VALUE_EXPR_P (t));
1301 hstate.commit_flag ();
1304 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
1305 hstate.add_int (DECL_REGISTER (t));
1307 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1309 hstate.add_flag (DECL_COMMON (t));
1310 hstate.add_flag (DECL_DLLIMPORT_P (t));
1311 hstate.add_flag (DECL_WEAK (t));
1312 hstate.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t));
1313 hstate.add_flag (DECL_COMDAT (t));
1314 hstate.add_flag (DECL_VISIBILITY_SPECIFIED (t));
1315 hstate.add_int (DECL_VISIBILITY (t));
1316 if (code == VAR_DECL)
1318 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
1319 hstate.add_flag (DECL_HARD_REGISTER (t));
1320 hstate.add_flag (DECL_IN_CONSTANT_POOL (t));
1322 if (TREE_CODE (t) == FUNCTION_DECL)
1324 hstate.add_flag (DECL_FINAL_P (t));
1325 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (t));
1326 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (t));
1328 hstate.commit_flag ();
1331 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1333 hstate.add_int (DECL_BUILT_IN_CLASS (t));
1334 hstate.add_flag (DECL_STATIC_CONSTRUCTOR (t));
1335 hstate.add_flag (DECL_STATIC_DESTRUCTOR (t));
1336 hstate.add_flag (FUNCTION_DECL_DECL_TYPE (t));
1337 hstate.add_flag (DECL_UNINLINABLE (t));
1338 hstate.add_flag (DECL_POSSIBLY_INLINED (t));
1339 hstate.add_flag (DECL_IS_NOVOPS (t));
1340 hstate.add_flag (DECL_IS_RETURNS_TWICE (t));
1341 hstate.add_flag (DECL_IS_MALLOC (t));
1342 hstate.add_flag (DECL_DECLARED_INLINE_P (t));
1343 hstate.add_flag (DECL_STATIC_CHAIN (t));
1344 hstate.add_flag (DECL_NO_INLINE_WARNING_P (t));
1345 hstate.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t));
1346 hstate.add_flag (DECL_NO_LIMIT_STACK (t));
1347 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (t));
1348 hstate.add_flag (DECL_PURE_P (t));
1349 hstate.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t));
1350 hstate.commit_flag ();
1351 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
1352 hstate.add_int (DECL_UNCHECKED_FUNCTION_CODE (t));
1355 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1357 hstate.add_hwi (TYPE_MODE (t));
1358 /* TYPE_NO_FORCE_BLK is private to stor-layout and need
1359 no streaming. */
1360 hstate.add_flag (TYPE_PACKED (t));
1361 hstate.add_flag (TYPE_RESTRICT (t));
1362 hstate.add_flag (TYPE_USER_ALIGN (t));
1363 hstate.add_flag (TYPE_READONLY (t));
1364 if (RECORD_OR_UNION_TYPE_P (t))
1366 hstate.add_flag (TYPE_TRANSPARENT_AGGR (t));
1367 hstate.add_flag (TYPE_FINAL_P (t));
1368 hstate.add_flag (TYPE_CXX_ODR_P (t));
1370 else if (code == ARRAY_TYPE)
1371 hstate.add_flag (TYPE_NONALIASED_COMPONENT (t));
1372 if (code == ARRAY_TYPE || code == INTEGER_TYPE)
1373 hstate.add_flag (TYPE_STRING_FLAG (t));
1374 if (AGGREGATE_TYPE_P (t))
1375 hstate.add_flag (TYPE_TYPELESS_STORAGE (t));
1376 hstate.commit_flag ();
1377 hstate.add_int (TYPE_PRECISION (t));
1378 hstate.add_int (TYPE_ALIGN (t));
1379 hstate.add_int (TYPE_EMPTY_P (t));
1382 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
1383 hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
1384 strlen (TRANSLATION_UNIT_LANGUAGE (t)));
1386 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
1387 /* We don't stream these when passing things to a different target. */
1388 && !lto_stream_offload_p)
1389 hstate.add_hwi (cl_target_option_hash (TREE_TARGET_OPTION (t)));
1391 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
1392 hstate.add_hwi (cl_optimization_hash (TREE_OPTIMIZATION (t)));
1394 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
1395 hstate.merge_hash (IDENTIFIER_HASH_VALUE (t));
1397 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
1398 hstate.add (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t));
1400 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
1402 if (code != IDENTIFIER_NODE)
1403 visit (TREE_TYPE (t));
1406 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
1408 unsigned int count = vector_cst_encoded_nelts (t);
1409 for (unsigned int i = 0; i < count; ++i)
1410 visit (VECTOR_CST_ENCODED_ELT (t, i));
1413 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
1414 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
1415 visit (POLY_INT_CST_COEFF (t, i));
1417 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
1419 visit (TREE_REALPART (t));
1420 visit (TREE_IMAGPART (t));
1423 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
1425 /* Drop names that were created for anonymous entities. */
1426 if (DECL_NAME (t)
1427 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
1428 && IDENTIFIER_ANON_P (DECL_NAME (t)))
1430 else
1431 visit (DECL_NAME (t));
1432 if (DECL_FILE_SCOPE_P (t))
1434 else
1435 visit (DECL_CONTEXT (t));
1438 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1440 visit (DECL_SIZE (t));
1441 visit (DECL_SIZE_UNIT (t));
1442 visit (DECL_ATTRIBUTES (t));
1443 if ((code == VAR_DECL
1444 || code == PARM_DECL)
1445 && DECL_HAS_VALUE_EXPR_P (t))
1446 visit (DECL_VALUE_EXPR (t));
1447 if (code == VAR_DECL
1448 && DECL_HAS_DEBUG_EXPR_P (t))
1449 visit (DECL_DEBUG_EXPR (t));
1450 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
1451 be able to call get_symbol_initial_value. */
1454 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1456 if (DECL_ASSEMBLER_NAME_SET_P (t))
1457 visit (DECL_ASSEMBLER_NAME (t));
1460 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1462 visit (DECL_FIELD_OFFSET (t));
1463 visit (DECL_BIT_FIELD_TYPE (t));
1464 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
1465 visit (DECL_FIELD_BIT_OFFSET (t));
1468 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1470 visit (DECL_FUNCTION_PERSONALITY (t));
1471 visit (DECL_FUNCTION_SPECIFIC_TARGET (t));
1472 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
1475 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1477 visit (TYPE_SIZE (t));
1478 visit (TYPE_SIZE_UNIT (t));
1479 visit (TYPE_ATTRIBUTES (t));
1480 visit (TYPE_NAME (t));
1481 visit (TYPE_MAIN_VARIANT (t));
1482 if (TYPE_FILE_SCOPE_P (t))
1484 else
1485 visit (TYPE_CONTEXT (t));
1488 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1490 if (code == ARRAY_TYPE)
1491 visit (TYPE_DOMAIN (t));
1492 else if (RECORD_OR_UNION_TYPE_P (t))
1493 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1494 visit (f);
1495 else if (code == FUNCTION_TYPE
1496 || code == METHOD_TYPE)
1497 visit (TYPE_ARG_TYPES (t));
1498 if (!POINTER_TYPE_P (t))
1499 visit (TYPE_MIN_VALUE_RAW (t));
1500 visit (TYPE_MAX_VALUE_RAW (t));
1503 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1505 visit (TREE_PURPOSE (t));
1506 visit (TREE_VALUE (t));
1507 visit (TREE_CHAIN (t));
1510 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1511 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1512 visit (TREE_VEC_ELT (t, i));
1514 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1516 hstate.add_hwi (TREE_OPERAND_LENGTH (t));
1517 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1518 visit (TREE_OPERAND (t, i));
1521 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1523 unsigned i;
1524 tree b;
1525 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1526 visit (b);
1527 visit (BINFO_OFFSET (t));
1528 visit (BINFO_VTABLE (t));
1529 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1530 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
1531 by C++ FE only. */
1534 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1536 unsigned i;
1537 tree index, value;
1538 hstate.add_hwi (CONSTRUCTOR_NELTS (t));
1539 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1541 visit (index);
1542 visit (value);
1546 if (code == OMP_CLAUSE)
1548 int i;
1549 HOST_WIDE_INT val;
1551 hstate.add_hwi (OMP_CLAUSE_CODE (t));
1552 switch (OMP_CLAUSE_CODE (t))
1554 case OMP_CLAUSE_DEFAULT:
1555 val = OMP_CLAUSE_DEFAULT_KIND (t);
1556 break;
1557 case OMP_CLAUSE_SCHEDULE:
1558 val = OMP_CLAUSE_SCHEDULE_KIND (t);
1559 break;
1560 case OMP_CLAUSE_DEPEND:
1561 val = OMP_CLAUSE_DEPEND_KIND (t);
1562 break;
1563 case OMP_CLAUSE_DOACROSS:
1564 val = OMP_CLAUSE_DOACROSS_KIND (t);
1565 break;
1566 case OMP_CLAUSE_MAP:
1567 val = OMP_CLAUSE_MAP_KIND (t);
1568 break;
1569 case OMP_CLAUSE_PROC_BIND:
1570 val = OMP_CLAUSE_PROC_BIND_KIND (t);
1571 break;
1572 case OMP_CLAUSE_REDUCTION:
1573 case OMP_CLAUSE_TASK_REDUCTION:
1574 case OMP_CLAUSE_IN_REDUCTION:
1575 val = OMP_CLAUSE_REDUCTION_CODE (t);
1576 break;
1577 default:
1578 val = 0;
1579 break;
1581 hstate.add_hwi (val);
1582 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1583 visit (OMP_CLAUSE_OPERAND (t, i));
1584 visit (OMP_CLAUSE_CHAIN (t));
1587 return hstate.end ();
1589 #undef visit
1592 /* Compare two SCC entries by their hash value for qsorting them. */
1595 DFS::scc_entry_compare (const void *p1_, const void *p2_)
1597 const scc_entry *p1 = (const scc_entry *) p1_;
1598 const scc_entry *p2 = (const scc_entry *) p2_;
1599 if (p1->hash < p2->hash)
1600 return -1;
1601 else if (p1->hash > p2->hash)
1602 return 1;
1603 return 0;
1606 /* Return a hash value for the SCC on the SCC stack from FIRST with SIZE.
1607 THIS_REF_P and REF_P are as passed to lto_output_tree for FIRST. */
1609 hashval_t
1610 DFS::hash_scc (struct output_block *ob, unsigned first, unsigned size,
1611 bool ref_p, bool this_ref_p)
1613 unsigned int last_classes = 0, iterations = 0;
1615 /* Compute hash values for the SCC members. */
1616 for (unsigned i = 0; i < size; ++i)
1617 sccstack[first+i].hash
1618 = hash_tree (ob->writer_cache, NULL, sccstack[first+i].t);
1620 if (size == 1)
1621 return sccstack[first].hash;
1623 /* We aim to get unique hash for every tree within SCC and compute hash value
1624 of the whole SCC by combining all values together in a stable (entry-point
1625 independent) order. This guarantees that the same SCC regions within
1626 different translation units will get the same hash values and therefore
1627 will be merged at WPA time.
1629 Often the hashes are already unique. In that case we compute the SCC hash
1630 by combining individual hash values in an increasing order.
1632 If there are duplicates, we seek at least one tree with unique hash (and
1633 pick one with minimal hash and this property). Then we obtain a stable
1634 order by DFS walk starting from this unique tree and then use the index
1635 within this order to make individual hash values unique.
1637 If there is no tree with unique hash, we iteratively propagate the hash
1638 values across the internal edges of SCC. This usually quickly leads
1639 to unique hashes. Consider, for example, an SCC containing two pointers
1640 that are identical except for the types they point to and assume that
1641 these types are also part of the SCC. The propagation will add the
1642 points-to type information into their hash values. */
1645 /* Sort the SCC so we can easily check for uniqueness. */
1646 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1648 unsigned int classes = 1;
1649 int firstunique = -1;
1651 /* Find the tree with lowest unique hash (if it exists) and compute
1652 the number of equivalence classes. */
1653 if (sccstack[first].hash != sccstack[first+1].hash)
1654 firstunique = 0;
1655 for (unsigned i = 1; i < size; ++i)
1656 if (sccstack[first+i-1].hash != sccstack[first+i].hash)
1658 classes++;
1659 if (firstunique == -1
1660 && (i == size - 1
1661 || sccstack[first+i+1].hash != sccstack[first+i].hash))
1662 firstunique = i;
1665 /* If we found a tree with unique hash, stop the iteration. */
1666 if (firstunique != -1
1667 /* Also terminate if we run out of iterations or if the number of
1668 equivalence classes is no longer increasing.
1669 For example a cyclic list of trees that are all equivalent will
1670 never have unique entry point; we however do not build such SCCs
1671 in our IL. */
1672 || classes <= last_classes || iterations > 16)
1674 hashval_t scc_hash;
1676 /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk
1677 starting from FIRSTUNIQUE to obtain a stable order. */
1678 if (classes != size && firstunique != -1)
1680 hash_map <tree, hashval_t> map(size*2);
1682 /* Store hash values into a map, so we can associate them with
1683 the reordered SCC. */
1684 for (unsigned i = 0; i < size; ++i)
1685 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1687 DFS again (ob, sccstack[first+firstunique].t, ref_p, this_ref_p,
1688 true);
1689 gcc_assert (again.sccstack.length () == size);
1691 memcpy (sccstack.address () + first,
1692 again.sccstack.address (),
1693 sizeof (scc_entry) * size);
1695 /* Update hash values of individual members by hashing in the
1696 index within the stable order. This ensures uniqueness.
1697 Also compute the SCC hash by mixing in all hash values in
1698 the stable order we obtained. */
1699 sccstack[first].hash = *map.get (sccstack[first].t);
1700 scc_hash = sccstack[first].hash;
1701 for (unsigned i = 1; i < size; ++i)
1703 sccstack[first+i].hash
1704 = iterative_hash_hashval_t (i,
1705 *map.get (sccstack[first+i].t));
1706 scc_hash
1707 = iterative_hash_hashval_t (scc_hash,
1708 sccstack[first+i].hash);
1711 /* If we got a unique hash value for each tree, then sort already
1712 ensured entry-point independent order. Only compute the final
1713 SCC hash.
1715 If we failed to find the unique entry point, we go by the same
1716 route. We will eventually introduce unwanted hash conflicts. */
1717 else
1719 scc_hash = sccstack[first].hash;
1720 for (unsigned i = 1; i < size; ++i)
1721 scc_hash
1722 = iterative_hash_hashval_t (scc_hash, sccstack[first+i].hash);
1724 /* We cannot 100% guarantee that the hash won't conflict so as
1725 to make it impossible to find a unique hash. This however
1726 should be an extremely rare case. ICE for now so possible
1727 issues are found and evaluated. */
1728 gcc_checking_assert (classes == size);
1731 /* To avoid conflicts across SCCs, iteratively hash the whole SCC
1732 hash into the hash of each element. */
1733 for (unsigned i = 0; i < size; ++i)
1734 sccstack[first+i].hash
1735 = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
1736 return scc_hash;
1739 last_classes = classes;
1740 iterations++;
1742 /* We failed to identify the entry point; propagate hash values across
1743 the edges. */
1744 hash_map <tree, hashval_t> map(size*2);
1746 for (unsigned i = 0; i < size; ++i)
1747 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1749 for (unsigned i = 0; i < size; i++)
1750 sccstack[first+i].hash
1751 = hash_tree (ob->writer_cache, &map, sccstack[first+i].t);
1753 while (true);
1756 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1757 already in the streamer cache. Main routine called for
1758 each visit of EXPR. */
1760 void
1761 DFS::DFS_write_tree (struct output_block *ob, sccs *from_state,
1762 tree expr, bool ref_p, bool this_ref_p)
1764 /* Handle special cases. */
1765 if (expr == NULL_TREE)
1766 return;
1768 /* Do not DFS walk into indexable trees. */
1769 if (this_ref_p && tree_is_indexable (expr))
1770 return;
1772 /* Check if we already streamed EXPR. */
1773 if (streamer_tree_cache_lookup (ob->writer_cache, expr, NULL))
1775 /* Reference to a local tree makes entry also local. We always process
1776 top of stack entry, so set max to number of entries in stack - 1. */
1777 if (ob->local_trees
1778 && ob->local_trees->contains (expr))
1779 max_local_entry = sccstack.length () - 1;
1780 return;
1783 worklist w;
1784 w.expr = expr;
1785 w.from_state = from_state;
1786 w.cstate = NULL;
1787 w.ref_p = ref_p;
1788 w.this_ref_p = this_ref_p;
1789 worklist_vec.safe_push (w);
1793 /* Emit the physical representation of tree node EXPR to output block OB.
1794 If THIS_REF_P is true, the leaves of EXPR are emitted as references via
1795 lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1797 void
1798 lto_output_tree (struct output_block *ob, tree expr,
1799 bool ref_p, bool this_ref_p)
1801 unsigned ix;
1802 bool existed_p;
1803 unsigned int size = ob->main_stream->total_size;
1804 /* This is the first time we see EXPR, write all reachable
1805 trees to OB. */
1806 static bool in_dfs_walk;
1808 if (expr == NULL_TREE)
1810 streamer_write_record_start (ob, LTO_null);
1811 return;
1814 if (this_ref_p && tree_is_indexable (expr))
1816 enum LTO_tags tag;
1817 unsigned ix;
1819 lto_indexable_tree_ref (ob, expr, &tag, &ix);
1820 streamer_write_record_start (ob, tag);
1821 streamer_write_uhwi (ob, ix);
1822 return;
1825 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1826 if (existed_p)
1828 if (streamer_dump_file)
1830 if (in_dfs_walk)
1831 print_node_brief (streamer_dump_file, " Streaming ref to ",
1832 expr, 4);
1833 else
1834 print_node_brief (streamer_dump_file, " Streaming ref to ",
1835 expr, 4);
1836 fprintf (streamer_dump_file, "\n");
1838 /* If a node has already been streamed out, make sure that
1839 we don't write it more than once. Otherwise, the reader
1840 will instantiate two different nodes for the same object. */
1841 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1842 streamer_write_uhwi (ob, ix);
1843 if (streamer_debugging)
1844 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1845 lto_tree_code_to_tag (TREE_CODE (expr)));
1846 lto_stats.num_pickle_refs_output++;
1848 else
1850 /* Protect against recursion which means disconnect between
1851 what tree edges we walk in the DFS walk and what edges
1852 we stream out. */
1853 gcc_assert (!in_dfs_walk);
1855 if (streamer_dump_file)
1857 print_node_brief (streamer_dump_file, " Streaming tree ",
1858 expr, 4);
1859 fprintf (streamer_dump_file, "\n");
1862 /* Start the DFS walk. */
1863 /* Save ob state ... */
1864 /* let's see ... */
1865 in_dfs_walk = true;
1866 DFS (ob, expr, ref_p, this_ref_p, false);
1868 /* Finally append a reference to the tree we were writing. */
1869 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1871 /* DFS walk above possibly skipped streaming EXPR itself to let us inline
1872 it. */
1873 if (!existed_p)
1874 lto_output_tree_1 (ob, expr, 0, ref_p, this_ref_p);
1875 else if (this_ref_p)
1877 if (streamer_dump_file)
1879 print_node_brief (streamer_dump_file,
1880 " Streaming final ref to ",
1881 expr, 4);
1882 fprintf (streamer_dump_file, "\n");
1884 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1885 streamer_write_uhwi (ob, ix);
1886 if (streamer_debugging)
1887 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1888 lto_tree_code_to_tag (TREE_CODE (expr)));
1890 in_dfs_walk = false;
1891 lto_stats.num_pickle_refs_output++;
1893 if (streamer_dump_file && !in_dfs_walk)
1894 fprintf (streamer_dump_file, " %u bytes\n",
1895 ob->main_stream->total_size - size);
1899 /* Output to OB a list of try/catch handlers starting with FIRST. */
1901 static void
1902 output_eh_try_list (struct output_block *ob, eh_catch first)
1904 eh_catch n;
1906 for (n = first; n; n = n->next_catch)
1908 streamer_write_record_start (ob, LTO_eh_catch);
1909 stream_write_tree (ob, n->type_list, true);
1910 stream_write_tree (ob, n->filter_list, true);
1911 stream_write_tree (ob, n->label, true);
1914 streamer_write_record_start (ob, LTO_null);
1918 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1919 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1920 detect EH region sharing. */
1922 static void
1923 output_eh_region (struct output_block *ob, eh_region r)
1925 enum LTO_tags tag;
1927 if (r == NULL)
1929 streamer_write_record_start (ob, LTO_null);
1930 return;
1933 if (r->type == ERT_CLEANUP)
1934 tag = LTO_ert_cleanup;
1935 else if (r->type == ERT_TRY)
1936 tag = LTO_ert_try;
1937 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1938 tag = LTO_ert_allowed_exceptions;
1939 else if (r->type == ERT_MUST_NOT_THROW)
1940 tag = LTO_ert_must_not_throw;
1941 else
1942 gcc_unreachable ();
1944 streamer_write_record_start (ob, tag);
1945 streamer_write_hwi (ob, r->index);
1947 if (r->outer)
1948 streamer_write_hwi (ob, r->outer->index);
1949 else
1950 streamer_write_zero (ob);
1952 if (r->inner)
1953 streamer_write_hwi (ob, r->inner->index);
1954 else
1955 streamer_write_zero (ob);
1957 if (r->next_peer)
1958 streamer_write_hwi (ob, r->next_peer->index);
1959 else
1960 streamer_write_zero (ob);
1962 if (r->type == ERT_TRY)
1964 output_eh_try_list (ob, r->u.eh_try.first_catch);
1966 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1968 stream_write_tree (ob, r->u.allowed.type_list, true);
1969 stream_write_tree (ob, r->u.allowed.label, true);
1970 streamer_write_uhwi (ob, r->u.allowed.filter);
1972 else if (r->type == ERT_MUST_NOT_THROW)
1974 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1975 bitpack_d bp = bitpack_create (ob->main_stream);
1976 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1977 streamer_write_bitpack (&bp);
1980 if (r->landing_pads)
1981 streamer_write_hwi (ob, r->landing_pads->index);
1982 else
1983 streamer_write_zero (ob);
1987 /* Output landing pad LP to OB. */
1989 static void
1990 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1992 if (lp == NULL)
1994 streamer_write_record_start (ob, LTO_null);
1995 return;
1998 streamer_write_record_start (ob, LTO_eh_landing_pad);
1999 streamer_write_hwi (ob, lp->index);
2000 if (lp->next_lp)
2001 streamer_write_hwi (ob, lp->next_lp->index);
2002 else
2003 streamer_write_zero (ob);
2005 if (lp->region)
2006 streamer_write_hwi (ob, lp->region->index);
2007 else
2008 streamer_write_zero (ob);
2010 stream_write_tree (ob, lp->post_landing_pad, true);
2014 /* Output the existing eh_table to OB. */
2016 static void
2017 output_eh_regions (struct output_block *ob, struct function *fn)
2019 if (fn->eh && fn->eh->region_tree)
2021 unsigned i;
2022 eh_region eh;
2023 eh_landing_pad lp;
2024 tree ttype;
2026 streamer_write_record_start (ob, LTO_eh_table);
2028 /* Emit the index of the root of the EH region tree. */
2029 streamer_write_hwi (ob, fn->eh->region_tree->index);
2031 /* Emit all the EH regions in the region array. */
2032 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
2033 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
2034 output_eh_region (ob, eh);
2036 /* Emit all landing pads. */
2037 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
2038 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
2039 output_eh_lp (ob, lp);
2041 /* Emit all the runtime type data. */
2042 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
2043 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
2044 stream_write_tree (ob, ttype, true);
2046 /* Emit the table of action chains. */
2047 if (targetm.arm_eabi_unwinder)
2049 tree t;
2050 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
2051 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
2052 stream_write_tree (ob, t, true);
2054 else
2056 uchar c;
2057 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
2058 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
2059 streamer_write_char_stream (ob->main_stream, c);
2063 /* The LTO_null either terminates the record or indicates that there
2064 are no eh_records at all. */
2065 streamer_write_record_start (ob, LTO_null);
2069 /* Output all of the active ssa names to the ssa_names stream. */
2071 static void
2072 output_ssa_names (struct output_block *ob, struct function *fn)
2074 unsigned int i, len;
2076 len = vec_safe_length (SSANAMES (fn));
2077 streamer_write_uhwi (ob, len);
2079 for (i = 1; i < len; i++)
2081 tree ptr = (*SSANAMES (fn))[i];
2083 if (ptr == NULL_TREE
2084 || SSA_NAME_IN_FREE_LIST (ptr)
2085 || virtual_operand_p (ptr)
2086 /* Simply skip unreleased SSA names. */
2087 || (! SSA_NAME_IS_DEFAULT_DEF (ptr)
2088 && (! SSA_NAME_DEF_STMT (ptr)
2089 || ! gimple_bb (SSA_NAME_DEF_STMT (ptr)))))
2090 continue;
2092 streamer_write_uhwi (ob, i);
2093 streamer_write_char_stream (ob->main_stream,
2094 SSA_NAME_IS_DEFAULT_DEF (ptr));
2095 if (SSA_NAME_VAR (ptr))
2096 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
2097 else
2098 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
2099 stream_write_tree (ob, TREE_TYPE (ptr), true);
2102 streamer_write_zero (ob);
2107 /* Output the cfg. */
2109 static void
2110 output_cfg (struct output_block *ob, struct function *fn)
2112 struct lto_output_stream *tmp_stream = ob->main_stream;
2113 basic_block bb;
2115 ob->main_stream = ob->cfg_stream;
2117 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
2118 profile_status_for_fn (fn));
2120 /* Output the number of the highest basic block. */
2121 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
2123 FOR_ALL_BB_FN (bb, fn)
2125 edge_iterator ei;
2126 edge e;
2128 streamer_write_hwi (ob, bb->index);
2130 /* Output the successors and the edge flags. */
2131 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
2132 FOR_EACH_EDGE (e, ei, bb->succs)
2134 bitpack_d bp = bitpack_create (ob->main_stream);
2135 bp_pack_var_len_unsigned (&bp, e->dest->index);
2136 bp_pack_var_len_unsigned (&bp, e->flags);
2137 stream_output_location_and_block (ob, &bp, e->goto_locus);
2138 e->probability.stream_out (ob);
2142 streamer_write_hwi (ob, -1);
2144 bb = ENTRY_BLOCK_PTR_FOR_FN (fn);
2145 while (bb->next_bb)
2147 streamer_write_hwi (ob, bb->next_bb->index);
2148 bb = bb->next_bb;
2151 streamer_write_hwi (ob, -1);
2153 /* Output the number of loops. */
2154 streamer_write_uhwi (ob, number_of_loops (fn));
2156 /* Output each loop, skipping the tree root which has number zero. */
2157 for (unsigned i = 1; i < number_of_loops (fn); ++i)
2159 class loop *loop = get_loop (fn, i);
2161 /* Write the index of the loop header. That's enough to rebuild
2162 the loop tree on the reader side. Stream -1 for an unused
2163 loop entry. */
2164 if (!loop)
2166 streamer_write_hwi (ob, -1);
2167 continue;
2169 else
2170 streamer_write_hwi (ob, loop->header->index);
2172 /* Write everything copy_loop_info copies. */
2173 streamer_write_enum (ob->main_stream,
2174 loop_estimation, EST_LAST, loop->estimate_state);
2175 streamer_write_hwi (ob, loop->any_upper_bound);
2176 if (loop->any_upper_bound)
2177 streamer_write_widest_int (ob, loop->nb_iterations_upper_bound);
2178 streamer_write_hwi (ob, loop->any_likely_upper_bound);
2179 if (loop->any_likely_upper_bound)
2180 streamer_write_widest_int (ob, loop->nb_iterations_likely_upper_bound);
2181 streamer_write_hwi (ob, loop->any_estimate);
2182 if (loop->any_estimate)
2183 streamer_write_widest_int (ob, loop->nb_iterations_estimate);
2185 /* Write OMP SIMD related info. */
2186 streamer_write_hwi (ob, loop->safelen);
2187 streamer_write_hwi (ob, loop->unroll);
2188 streamer_write_hwi (ob, loop->owned_clique);
2189 streamer_write_hwi (ob, loop->dont_vectorize);
2190 streamer_write_hwi (ob, loop->force_vectorize);
2191 streamer_write_hwi (ob, loop->finite_p);
2192 stream_write_tree (ob, loop->simduid, true);
2195 ob->main_stream = tmp_stream;
2199 /* Create the header in the file using OB. If the section type is for
2200 a function, set FN to the decl for that function. */
2202 void
2203 produce_asm (struct output_block *ob, tree fn)
2205 enum lto_section_type section_type = ob->section_type;
2206 struct lto_function_header header;
2207 char *section_name;
2209 if (section_type == LTO_section_function_body)
2211 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
2212 section_name = lto_get_section_name (section_type, name,
2213 symtab_node::get (fn)->order,
2214 NULL);
2216 else
2217 section_name = lto_get_section_name (section_type, NULL, 0, NULL);
2219 lto_begin_section (section_name, !flag_wpa);
2220 free (section_name);
2222 /* The entire header is stream computed here. */
2223 memset (&header, 0, sizeof (struct lto_function_header));
2225 if (section_type == LTO_section_function_body)
2226 header.cfg_size = ob->cfg_stream->total_size;
2227 header.main_size = ob->main_stream->total_size;
2228 header.string_size = ob->string_stream->total_size;
2229 lto_write_data (&header, sizeof header);
2231 /* Put all of the gimple and the string table out the asm file as a
2232 block of text. */
2233 if (section_type == LTO_section_function_body)
2234 lto_write_stream (ob->cfg_stream);
2235 lto_write_stream (ob->main_stream);
2236 lto_write_stream (ob->string_stream);
2238 lto_end_section ();
2242 /* Output the base body of struct function FN using output block OB. */
2244 static void
2245 output_struct_function_base (struct output_block *ob, struct function *fn)
2247 struct bitpack_d bp;
2248 unsigned i;
2249 tree t;
2251 /* Output the static chain and non-local goto save area. */
2252 stream_write_tree (ob, fn->static_chain_decl, true);
2253 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
2255 /* Output all the local variables in the function. */
2256 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
2257 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
2258 stream_write_tree (ob, t, true);
2260 /* Output current IL state of the function. */
2261 streamer_write_uhwi (ob, fn->curr_properties);
2263 /* Write all the attributes for FN. */
2264 bp = bitpack_create (ob->main_stream);
2265 bp_pack_value (&bp, fn->is_thunk, 1);
2266 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
2267 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
2268 bp_pack_value (&bp, fn->returns_struct, 1);
2269 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
2270 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
2271 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
2272 bp_pack_value (&bp, fn->after_inlining, 1);
2273 bp_pack_value (&bp, fn->stdarg, 1);
2274 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
2275 bp_pack_value (&bp, fn->has_forced_label_in_static, 1);
2276 bp_pack_value (&bp, fn->calls_alloca, 1);
2277 bp_pack_value (&bp, fn->calls_setjmp, 1);
2278 bp_pack_value (&bp, fn->calls_eh_return, 1);
2279 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
2280 bp_pack_value (&bp, fn->has_simduid_loops, 1);
2281 bp_pack_value (&bp, fn->assume_function, 1);
2282 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
2283 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
2284 bp_pack_value (&bp, fn->last_clique, sizeof (short) * 8);
2286 /* Output the function start and end loci. */
2287 stream_output_location (ob, &bp, fn->function_start_locus);
2288 stream_output_location (ob, &bp, fn->function_end_locus);
2290 /* Save the instance discriminator if present. */
2291 int *instance_number_p = NULL;
2292 if (decl_to_instance_map)
2293 instance_number_p = decl_to_instance_map->get (fn->decl);
2294 bp_pack_value (&bp, !!instance_number_p, 1);
2295 if (instance_number_p)
2296 bp_pack_value (&bp, *instance_number_p, sizeof (int) * CHAR_BIT);
2298 streamer_write_bitpack (&bp);
2302 /* Collect all leaf BLOCKs beyond ROOT into LEAFS. */
2304 static void
2305 collect_block_tree_leafs (tree root, vec<tree> &leafs)
2307 for (root = BLOCK_SUBBLOCKS (root); root; root = BLOCK_CHAIN (root))
2308 if (! BLOCK_SUBBLOCKS (root))
2309 leafs.safe_push (root);
2310 else
2311 collect_block_tree_leafs (root, leafs);
2314 /* This performs function body modifications that are needed for streaming
2315 to work. */
2317 void
2318 lto_prepare_function_for_streaming (struct cgraph_node *node)
2320 struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
2321 basic_block bb;
2323 if (number_of_loops (fn))
2325 push_cfun (fn);
2326 loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
2327 loop_optimizer_finalize ();
2328 pop_cfun ();
2330 /* We will renumber the statements. The code that does this uses
2331 the same ordering that we use for serializing them so we can use
2332 the same code on the other end and not have to write out the
2333 statement numbers. We do not assign UIDs to PHIs here because
2334 virtual PHIs get re-computed on-the-fly which would make numbers
2335 inconsistent. */
2336 set_gimple_stmt_max_uid (fn, 0);
2337 FOR_ALL_BB_FN (bb, fn)
2339 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2340 gsi_next (&gsi))
2342 gphi *stmt = gsi.phi ();
2344 /* Virtual PHIs are not going to be streamed. */
2345 if (!virtual_operand_p (gimple_phi_result (stmt)))
2346 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2348 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
2349 gsi_next (&gsi))
2351 gimple *stmt = gsi_stmt (gsi);
2352 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2355 /* To avoid keeping duplicate gimple IDs in the statements, renumber
2356 virtual phis now. */
2357 FOR_ALL_BB_FN (bb, fn)
2359 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2360 gsi_next (&gsi))
2362 gphi *stmt = gsi.phi ();
2363 if (virtual_operand_p (gimple_phi_result (stmt)))
2364 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
2370 /* Emit the chain of tree nodes starting at T. OB is the output block
2371 to write to. REF_P is true if chain elements should be emitted
2372 as references. */
2374 static void
2375 streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
2377 while (t)
2379 /* We avoid outputting external vars or functions by reference
2380 to the global decls section as we do not want to have them
2381 enter decl merging. We should not need to do this anymore because
2382 free_lang_data removes them from block scopes. */
2383 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
2384 stream_write_tree (ob, t, ref_p);
2386 t = TREE_CHAIN (t);
2389 /* Write a sentinel to terminate the chain. */
2390 stream_write_tree (ob, NULL_TREE, ref_p);
2393 /* Output the body of function NODE->DECL. */
2395 static void
2396 output_function (struct cgraph_node *node)
2398 tree function;
2399 struct function *fn;
2400 basic_block bb;
2401 struct output_block *ob;
2403 if (streamer_dump_file)
2404 fprintf (streamer_dump_file, "\nStreaming body of %s\n",
2405 node->dump_name ());
2407 function = node->decl;
2408 fn = DECL_STRUCT_FUNCTION (function);
2409 ob = create_output_block (LTO_section_function_body);
2411 ob->symbol = node;
2413 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
2415 /* Make string 0 be a NULL string. */
2416 streamer_write_char_stream (ob->string_stream, 0);
2418 streamer_write_record_start (ob, LTO_function);
2420 /* Output decls for parameters and args. */
2421 stream_write_tree (ob, DECL_RESULT (function), true);
2422 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
2424 /* Output debug args if available. */
2425 vec<tree, va_gc> **debugargs = decl_debug_args_lookup (function);
2426 if (! debugargs)
2427 streamer_write_uhwi (ob, 0);
2428 else
2430 streamer_write_uhwi (ob, (*debugargs)->length ());
2431 for (unsigned i = 0; i < (*debugargs)->length (); ++i)
2432 stream_write_tree (ob, (**debugargs)[i], true);
2435 /* Output DECL_INITIAL for the function, which contains the tree of
2436 lexical scopes. */
2437 stream_write_tree (ob, DECL_INITIAL (function), true);
2438 /* As we do not recurse into BLOCK_SUBBLOCKS but only BLOCK_SUPERCONTEXT
2439 collect block tree leafs and stream those. */
2440 auto_vec<tree> block_tree_leafs;
2441 if (DECL_INITIAL (function) && DECL_INITIAL (function) != error_mark_node)
2442 collect_block_tree_leafs (DECL_INITIAL (function), block_tree_leafs);
2443 streamer_write_uhwi (ob, block_tree_leafs.length ());
2444 for (unsigned i = 0; i < block_tree_leafs.length (); ++i)
2445 stream_write_tree (ob, block_tree_leafs[i], true);
2447 /* We also stream abstract functions where we stream only stuff needed for
2448 debug info. */
2449 if (gimple_has_body_p (function))
2451 streamer_write_uhwi (ob, 1);
2452 output_struct_function_base (ob, fn);
2454 output_cfg (ob, fn);
2456 /* Output all the SSA names used in the function. */
2457 output_ssa_names (ob, fn);
2459 /* Output any exception handling regions. */
2460 output_eh_regions (ob, fn);
2462 /* Output the code for the function. */
2463 FOR_ALL_BB_FN (bb, fn)
2464 output_bb (ob, bb, fn);
2466 /* The terminator for this function. */
2467 streamer_write_record_start (ob, LTO_null);
2469 else
2470 streamer_write_uhwi (ob, 0);
2472 /* Create a section to hold the pickled output of this function. */
2473 produce_asm (ob, function);
2475 destroy_output_block (ob);
2476 if (streamer_dump_file)
2477 fprintf (streamer_dump_file, "Finished streaming %s\n",
2478 node->dump_name ());
2481 /* Output the body of function NODE->DECL. */
2483 static void
2484 output_constructor (struct varpool_node *node)
2486 tree var = node->decl;
2487 struct output_block *ob;
2489 if (streamer_dump_file)
2490 fprintf (streamer_dump_file, "\nStreaming constructor of %s\n",
2491 node->dump_name ());
2493 timevar_push (TV_IPA_LTO_CTORS_OUT);
2494 ob = create_output_block (LTO_section_function_body);
2496 ob->symbol = node;
2498 /* Make string 0 be a NULL string. */
2499 streamer_write_char_stream (ob->string_stream, 0);
2501 /* Output DECL_INITIAL for the function, which contains the tree of
2502 lexical scopes. */
2503 stream_write_tree (ob, DECL_INITIAL (var), true);
2505 /* Create a section to hold the pickled output of this function. */
2506 produce_asm (ob, var);
2508 destroy_output_block (ob);
2509 if (streamer_dump_file)
2510 fprintf (streamer_dump_file, "Finished streaming %s\n",
2511 node->dump_name ());
2512 timevar_pop (TV_IPA_LTO_CTORS_OUT);
2516 /* Emit toplevel asms. */
2518 void
2519 lto_output_toplevel_asms (void)
2521 struct output_block *ob;
2522 struct asm_node *can;
2523 char *section_name;
2524 struct lto_simple_header_with_strings header;
2526 if (!symtab->first_asm_symbol ())
2527 return;
2529 ob = create_output_block (LTO_section_asm);
2531 /* Make string 0 be a NULL string. */
2532 streamer_write_char_stream (ob->string_stream, 0);
2534 for (can = symtab->first_asm_symbol (); can; can = can->next)
2536 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
2537 streamer_write_hwi (ob, can->order);
2540 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
2542 section_name = lto_get_section_name (LTO_section_asm, NULL, 0, NULL);
2543 lto_begin_section (section_name, !flag_wpa);
2544 free (section_name);
2546 /* The entire header stream is computed here. */
2547 memset (&header, 0, sizeof (header));
2549 header.main_size = ob->main_stream->total_size;
2550 header.string_size = ob->string_stream->total_size;
2551 lto_write_data (&header, sizeof header);
2553 /* Put all of the gimple and the string table out the asm file as a
2554 block of text. */
2555 lto_write_stream (ob->main_stream);
2556 lto_write_stream (ob->string_stream);
2558 lto_end_section ();
2560 destroy_output_block (ob);
2564 /* Copy the function body or variable constructor of NODE without deserializing. */
2566 static void
2567 copy_function_or_variable (struct symtab_node *node)
2569 tree function = node->decl;
2570 struct lto_file_decl_data *file_data = node->lto_file_data;
2571 const char *data;
2572 size_t len;
2573 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
2574 char *section_name =
2575 lto_get_section_name (LTO_section_function_body, name, node->order, NULL);
2576 size_t i, j;
2577 struct lto_in_decl_state *in_state;
2578 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
2580 if (streamer_dump_file)
2581 fprintf (streamer_dump_file, "Copying section for %s\n", name);
2582 lto_begin_section (section_name, false);
2583 free (section_name);
2585 /* We may have renamed the declaration, e.g., a static function. */
2586 name = lto_get_decl_name_mapping (file_data, name);
2588 data = lto_get_raw_section_data (file_data, LTO_section_function_body,
2589 name, node->order - file_data->order_base,
2590 &len);
2591 gcc_assert (data);
2593 /* Do a bit copy of the function body. */
2594 lto_write_raw_data (data, len);
2596 /* Copy decls. */
2597 in_state =
2598 lto_get_function_in_decl_state (node->lto_file_data, function);
2599 out_state->compressed = in_state->compressed;
2600 gcc_assert (in_state);
2602 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2604 size_t n = vec_safe_length (in_state->streams[i]);
2605 vec<tree, va_gc> *trees = in_state->streams[i];
2606 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2608 /* The out state must have the same indices and the in state.
2609 So just copy the vector. All the encoders in the in state
2610 must be empty where we reach here. */
2611 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2612 encoder->trees.reserve_exact (n);
2613 for (j = 0; j < n; j++)
2614 encoder->trees.safe_push ((*trees)[j]);
2617 lto_free_raw_section_data (file_data, LTO_section_function_body, name,
2618 data, len);
2619 lto_end_section ();
2622 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2624 static tree
2625 wrap_refs (tree *tp, int *ws, void *)
2627 tree t = *tp;
2628 if (handled_component_p (t)
2629 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL
2630 && TREE_PUBLIC (TREE_OPERAND (t, 0)))
2632 tree decl = TREE_OPERAND (t, 0);
2633 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2634 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2635 build1 (ADDR_EXPR, ptrtype, decl),
2636 build_int_cst (ptrtype, 0));
2637 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2638 *ws = 0;
2640 else if (TREE_CODE (t) == CONSTRUCTOR)
2642 else if (!EXPR_P (t))
2643 *ws = 0;
2644 return NULL_TREE;
2647 /* Remove functions that are no longer used from offload_funcs, and mark the
2648 remaining ones with DECL_PRESERVE_P. */
2650 static void
2651 prune_offload_funcs (void)
2653 if (!offload_funcs)
2654 return;
2656 unsigned ix, ix2;
2657 tree *elem_ptr;
2658 VEC_ORDERED_REMOVE_IF (*offload_funcs, ix, ix2, elem_ptr,
2659 cgraph_node::get (*elem_ptr) == NULL);
2661 tree fn_decl;
2662 FOR_EACH_VEC_ELT (*offload_funcs, ix, fn_decl)
2663 DECL_PRESERVE_P (fn_decl) = 1;
2666 /* Produce LTO section that contains global information
2667 about LTO bytecode. */
2669 static void
2670 produce_lto_section ()
2672 /* Stream LTO meta section. */
2673 output_block *ob = create_output_block (LTO_section_lto);
2675 char * section_name = lto_get_section_name (LTO_section_lto, NULL, 0, NULL);
2676 lto_begin_section (section_name, false);
2677 free (section_name);
2679 #ifdef HAVE_ZSTD_H
2680 lto_compression compression = ZSTD;
2681 #else
2682 lto_compression compression = ZLIB;
2683 #endif
2685 bool slim_object = flag_generate_lto && !flag_fat_lto_objects;
2686 lto_section s
2687 = { LTO_major_version, LTO_minor_version, slim_object, 0, 0 };
2688 s.set_compression (compression);
2689 lto_write_data (&s, sizeof s);
2690 lto_end_section ();
2691 destroy_output_block (ob);
2694 /* Compare symbols to get them sorted by filename (to optimize streaming) */
2696 static int
2697 cmp_symbol_files (const void *pn1, const void *pn2, void *id_map_)
2699 const symtab_node *n1 = *(const symtab_node * const *)pn1;
2700 const symtab_node *n2 = *(const symtab_node * const *)pn2;
2701 hash_map<lto_file_decl_data *, int> *id_map
2702 = (hash_map<lto_file_decl_data *, int> *)id_map_;
2704 int file_order1 = n1->lto_file_data ? n1->lto_file_data->order : -1;
2705 int file_order2 = n2->lto_file_data ? n2->lto_file_data->order : -1;
2707 /* Order files same way as they appeared in the command line to reduce
2708 seeking while copying sections. */
2709 if (file_order1 != file_order2)
2710 return file_order1 - file_order2;
2712 /* Order within static library. */
2713 if (n1->lto_file_data && n1->lto_file_data->id != n2->lto_file_data->id)
2714 return *id_map->get (n1->lto_file_data) - *id_map->get (n2->lto_file_data);
2716 /* And finaly order by the definition order. */
2717 return n1->order - n2->order;
2720 /* Main entry point from the pass manager. */
2722 void
2723 lto_output (void)
2725 struct lto_out_decl_state *decl_state;
2726 bitmap output = NULL;
2727 bitmap_obstack output_obstack;
2728 unsigned int i, n_nodes;
2729 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
2730 auto_vec<symtab_node *> symbols_to_copy;
2732 prune_offload_funcs ();
2734 if (flag_checking)
2736 bitmap_obstack_initialize (&output_obstack);
2737 output = BITMAP_ALLOC (&output_obstack);
2740 /* Initialize the streamer. */
2741 lto_streamer_init ();
2743 produce_lto_section ();
2745 n_nodes = lto_symtab_encoder_size (encoder);
2746 /* Prepare vector of functions to output and then sort it to optimize
2747 section copying. */
2748 for (i = 0; i < n_nodes; i++)
2750 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
2751 if (snode->alias)
2752 continue;
2753 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
2755 if (lto_symtab_encoder_encode_body_p (encoder, node)
2756 && !node->clone_of)
2757 symbols_to_copy.safe_push (node);
2759 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
2761 /* Wrap symbol references inside the ctor in a type
2762 preserving MEM_REF. */
2763 tree ctor = DECL_INITIAL (node->decl);
2764 if (ctor && !in_lto_p)
2765 walk_tree (&ctor, wrap_refs, NULL, NULL);
2766 if (get_symbol_initial_value (encoder, node->decl) == error_mark_node
2767 && lto_symtab_encoder_encode_initializer_p (encoder, node))
2768 symbols_to_copy.safe_push (node);
2771 /* Map the section hash to an order it appears in symbols_to_copy
2772 since we want to sort same ID symbols next to each other but need
2773 to avoid making overall order depend on the actual hash value. */
2774 int order = 0;
2775 hash_map<lto_file_decl_data *, int> id_map;
2776 for (i = 0; i < symbols_to_copy.length (); ++i)
2778 symtab_node *snode = symbols_to_copy[i];
2779 if (snode->lto_file_data)
2781 bool existed_p = false;
2782 int &ord = id_map.get_or_insert (snode->lto_file_data, &existed_p);
2783 if (!existed_p)
2784 ord = order++;
2787 symbols_to_copy.sort (cmp_symbol_files, (void *)&id_map);
2788 for (i = 0; i < symbols_to_copy.length (); i++)
2790 symtab_node *snode = symbols_to_copy[i];
2791 cgraph_node *cnode;
2792 varpool_node *vnode;
2794 if (flag_checking)
2795 gcc_assert (bitmap_set_bit (output, DECL_UID (snode->decl)));
2797 decl_state = lto_new_out_decl_state ();
2798 lto_push_out_decl_state (decl_state);
2800 if ((cnode = dyn_cast <cgraph_node *> (snode))
2801 && (gimple_has_body_p (cnode->decl)
2802 || (!flag_wpa
2803 && flag_incremental_link != INCREMENTAL_LINK_LTO)
2804 /* Thunks have no body but they may be synthetized
2805 at WPA time. */
2806 || DECL_ARGUMENTS (cnode->decl)
2807 || cnode->declare_variant_alt))
2808 output_function (cnode);
2809 else if ((vnode = dyn_cast <varpool_node *> (snode))
2810 && (DECL_INITIAL (vnode->decl) != error_mark_node
2811 || (!flag_wpa
2812 && flag_incremental_link != INCREMENTAL_LINK_LTO)))
2813 output_constructor (vnode);
2814 else
2815 copy_function_or_variable (snode);
2816 gcc_assert (lto_get_out_decl_state () == decl_state);
2817 lto_pop_out_decl_state ();
2818 lto_record_function_out_decl_state (snode->decl, decl_state);
2821 /* Emit the callgraph after emitting function bodies. This needs to
2822 be done now to make sure that all the statements in every function
2823 have been renumbered so that edges can be associated with call
2824 statements using the statement UIDs. */
2825 output_symtab ();
2827 output_offload_tables ();
2829 if (flag_checking)
2831 BITMAP_FREE (output);
2832 bitmap_obstack_release (&output_obstack);
2836 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2837 from it and required for correct representation of its semantics.
2838 Each node in ENCODER must be a global declaration or a type. A node
2839 is written only once, even if it appears multiple times in the
2840 vector. Certain transitively-reachable nodes, such as those
2841 representing expressions, may be duplicated, but such nodes
2842 must not appear in ENCODER itself. */
2844 static void
2845 write_global_stream (struct output_block *ob,
2846 struct lto_tree_ref_encoder *encoder)
2848 tree t;
2849 size_t index;
2850 const size_t size = lto_tree_ref_encoder_size (encoder);
2852 for (index = 0; index < size; index++)
2854 t = lto_tree_ref_encoder_get_tree (encoder, index);
2855 if (streamer_dump_file)
2857 fprintf (streamer_dump_file, " %i:", (int)index);
2858 print_node_brief (streamer_dump_file, "", t, 4);
2859 fprintf (streamer_dump_file, "\n");
2861 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2862 stream_write_tree (ob, t, false);
2867 /* Write a sequence of indices into the globals vector corresponding
2868 to the trees in ENCODER. These are used by the reader to map the
2869 indices used to refer to global entities within function bodies to
2870 their referents. */
2872 static void
2873 write_global_references (struct output_block *ob,
2874 struct lto_tree_ref_encoder *encoder)
2876 tree t;
2877 uint32_t index;
2878 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2880 /* Write size and slot indexes as 32-bit unsigned numbers. */
2881 uint32_t *data = XNEWVEC (uint32_t, size + 1);
2882 data[0] = size;
2884 for (index = 0; index < size; index++)
2886 unsigned slot_num;
2888 t = lto_tree_ref_encoder_get_tree (encoder, index);
2889 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2890 gcc_assert (slot_num != (unsigned)-1);
2891 data[index + 1] = slot_num;
2894 lto_write_data (data, sizeof (int32_t) * (size + 1));
2895 free (data);
2899 /* Write all the streams in an lto_out_decl_state STATE using
2900 output block OB and output stream OUT_STREAM. */
2902 void
2903 lto_output_decl_state_streams (struct output_block *ob,
2904 struct lto_out_decl_state *state)
2906 int i;
2908 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2909 write_global_stream (ob, &state->streams[i]);
2913 /* Write all the references in an lto_out_decl_state STATE using
2914 output block OB and output stream OUT_STREAM. */
2916 void
2917 lto_output_decl_state_refs (struct output_block *ob,
2918 struct lto_out_decl_state *state)
2920 unsigned i;
2921 unsigned ref;
2922 tree decl;
2924 /* Write reference to FUNCTION_DECL. If there is not function,
2925 write reference to void_type_node. */
2926 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2927 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2928 gcc_assert (ref != (unsigned)-1);
2929 ref = ref * 2 + (state->compressed ? 1 : 0);
2930 lto_write_data (&ref, sizeof (uint32_t));
2932 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2933 write_global_references (ob, &state->streams[i]);
2937 /* Return the written size of STATE. */
2939 static size_t
2940 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2942 int i;
2943 size_t size;
2945 size = sizeof (int32_t); /* fn_ref. */
2946 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2948 size += sizeof (int32_t); /* vector size. */
2949 size += (lto_tree_ref_encoder_size (&state->streams[i])
2950 * sizeof (int32_t));
2952 return size;
2956 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2957 so far. */
2959 static void
2960 write_symbol (struct streamer_tree_cache_d *cache,
2961 tree t, hash_set<const char *> *seen, bool alias)
2963 const char *name;
2964 enum gcc_plugin_symbol_kind kind;
2965 enum gcc_plugin_symbol_visibility visibility = GCCPV_DEFAULT;
2966 unsigned slot_num;
2967 uint64_t size;
2968 const char *comdat;
2969 unsigned char c;
2971 gcc_assert (VAR_OR_FUNCTION_DECL_P (t));
2973 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2975 /* This behaves like assemble_name_raw in varasm.cc, performing the
2976 same name manipulations that ASM_OUTPUT_LABELREF does. */
2977 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2979 if (seen->add (name))
2980 return;
2982 streamer_tree_cache_lookup (cache, t, &slot_num);
2983 gcc_assert (slot_num != (unsigned)-1);
2985 if (DECL_EXTERNAL (t))
2987 if (DECL_WEAK (t))
2988 kind = GCCPK_WEAKUNDEF;
2989 else
2990 kind = GCCPK_UNDEF;
2992 else
2994 if (DECL_WEAK (t))
2995 kind = GCCPK_WEAKDEF;
2996 else if (DECL_COMMON (t))
2997 kind = GCCPK_COMMON;
2998 else
2999 kind = GCCPK_DEF;
3001 /* When something is defined, it should have node attached. */
3002 gcc_assert (alias || !VAR_P (t) || varpool_node::get (t)->definition);
3003 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
3004 || (cgraph_node::get (t)
3005 && cgraph_node::get (t)->definition));
3008 /* Imitate what default_elf_asm_output_external do.
3009 When symbol is external, we need to output it with DEFAULT visibility
3010 when compiling with -fvisibility=default, while with HIDDEN visibility
3011 when symbol has attribute (visibility("hidden")) specified.
3012 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
3013 right. */
3015 if (DECL_EXTERNAL (t)
3016 && !targetm.binds_local_p (t))
3017 visibility = GCCPV_DEFAULT;
3018 else
3019 switch (DECL_VISIBILITY (t))
3021 case VISIBILITY_DEFAULT:
3022 visibility = GCCPV_DEFAULT;
3023 break;
3024 case VISIBILITY_PROTECTED:
3025 visibility = GCCPV_PROTECTED;
3026 break;
3027 case VISIBILITY_HIDDEN:
3028 visibility = GCCPV_HIDDEN;
3029 break;
3030 case VISIBILITY_INTERNAL:
3031 visibility = GCCPV_INTERNAL;
3032 break;
3035 if (kind == GCCPK_COMMON
3036 && DECL_SIZE_UNIT (t)
3037 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
3038 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
3039 else
3040 size = 0;
3042 if (DECL_ONE_ONLY (t))
3043 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
3044 else
3045 comdat = "";
3047 lto_write_data (name, strlen (name) + 1);
3048 lto_write_data (comdat, strlen (comdat) + 1);
3049 c = (unsigned char) kind;
3050 lto_write_data (&c, 1);
3051 c = (unsigned char) visibility;
3052 lto_write_data (&c, 1);
3053 lto_write_data (&size, 8);
3054 lto_write_data (&slot_num, 4);
3057 /* Write extension information for symbols (symbol type, section flags). */
3059 static void
3060 write_symbol_extension_info (tree t)
3062 unsigned char c;
3063 c = ((unsigned char) TREE_CODE (t) == VAR_DECL
3064 ? GCCST_VARIABLE : GCCST_FUNCTION);
3065 lto_write_data (&c, 1);
3066 unsigned char section_kind = 0;
3067 if (TREE_CODE (t) == VAR_DECL)
3069 section *s = get_variable_section (t, false);
3070 if (s->common.flags & SECTION_BSS)
3071 section_kind |= GCCSSK_BSS;
3073 lto_write_data (&section_kind, 1);
3076 /* Write an IL symbol table to OB.
3077 SET and VSET are cgraph/varpool node sets we are outputting. */
3079 static unsigned int
3080 produce_symtab (struct output_block *ob)
3082 unsigned int streamed_symbols = 0;
3083 struct streamer_tree_cache_d *cache = ob->writer_cache;
3084 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, 0, NULL);
3085 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
3086 lto_symtab_encoder_iterator lsei;
3088 lto_begin_section (section_name, false);
3089 free (section_name);
3091 hash_set<const char *> seen;
3093 /* Write the symbol table.
3094 First write everything defined and then all declarations.
3095 This is necessary to handle cases where we have duplicated symbols. */
3096 for (lsei = lsei_start (encoder);
3097 !lsei_end_p (lsei); lsei_next (&lsei))
3099 symtab_node *node = lsei_node (lsei);
3101 if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
3102 continue;
3103 write_symbol (cache, node->decl, &seen, false);
3104 ++streamed_symbols;
3106 for (lsei = lsei_start (encoder);
3107 !lsei_end_p (lsei); lsei_next (&lsei))
3109 symtab_node *node = lsei_node (lsei);
3111 if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
3112 continue;
3113 write_symbol (cache, node->decl, &seen, false);
3114 ++streamed_symbols;
3117 lto_end_section ();
3119 return streamed_symbols;
3122 /* Symtab extension version. */
3123 #define LTO_SYMTAB_EXTENSION_VERSION 1
3125 /* Write an IL symbol table extension to OB.
3126 SET and VSET are cgraph/varpool node sets we are outputting. */
3128 static void
3129 produce_symtab_extension (struct output_block *ob,
3130 unsigned int previous_streamed_symbols)
3132 unsigned int streamed_symbols = 0;
3133 char *section_name = lto_get_section_name (LTO_section_symtab_extension,
3134 NULL, 0, NULL);
3135 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
3136 lto_symtab_encoder_iterator lsei;
3138 lto_begin_section (section_name, false);
3139 free (section_name);
3141 unsigned char version = LTO_SYMTAB_EXTENSION_VERSION;
3142 lto_write_data (&version, 1);
3144 /* Write the symbol table.
3145 First write everything defined and then all declarations.
3146 This is necessary to handle cases where we have duplicated symbols. */
3147 for (lsei = lsei_start (encoder);
3148 !lsei_end_p (lsei); lsei_next (&lsei))
3150 symtab_node *node = lsei_node (lsei);
3152 if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
3153 continue;
3154 write_symbol_extension_info (node->decl);
3155 ++streamed_symbols;
3157 for (lsei = lsei_start (encoder);
3158 !lsei_end_p (lsei); lsei_next (&lsei))
3160 symtab_node *node = lsei_node (lsei);
3162 if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ())
3163 continue;
3164 write_symbol_extension_info (node->decl);
3165 ++streamed_symbols;
3168 gcc_assert (previous_streamed_symbols == streamed_symbols);
3169 lto_end_section ();
3173 /* Init the streamer_mode_table for output, where we collect info on what
3174 machine_mode values have been streamed. */
3175 void
3176 lto_output_init_mode_table (void)
3178 memset (streamer_mode_table, '\0', MAX_MACHINE_MODE);
3182 /* Write the mode table. */
3183 static void
3184 lto_write_mode_table (void)
3186 struct output_block *ob;
3187 ob = create_output_block (LTO_section_mode_table);
3188 bitpack_d bp = bitpack_create (ob->main_stream);
3190 /* Ensure that for GET_MODE_INNER (m) != m we have
3191 also the inner mode marked. */
3192 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
3193 if (streamer_mode_table[i])
3195 machine_mode m = (machine_mode) i;
3196 machine_mode inner_m = GET_MODE_INNER (m);
3197 if (inner_m != m)
3198 streamer_mode_table[(int) inner_m] = 1;
3200 /* First stream modes that have GET_MODE_INNER (m) == m,
3201 so that we can refer to them afterwards. */
3202 for (int pass = 0; pass < 2; pass++)
3203 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
3204 if (streamer_mode_table[i] && i != (int) VOIDmode && i != (int) BLKmode)
3206 machine_mode m = (machine_mode) i;
3207 if ((GET_MODE_INNER (m) == m) ^ (pass == 0))
3208 continue;
3209 bp_pack_value (&bp, m, 8);
3210 bp_pack_enum (&bp, mode_class, MAX_MODE_CLASS, GET_MODE_CLASS (m));
3211 bp_pack_poly_value (&bp, GET_MODE_SIZE (m), 16);
3212 bp_pack_poly_value (&bp, GET_MODE_PRECISION (m), 16);
3213 bp_pack_value (&bp, GET_MODE_INNER (m), 8);
3214 bp_pack_poly_value (&bp, GET_MODE_NUNITS (m), 16);
3215 switch (GET_MODE_CLASS (m))
3217 case MODE_FRACT:
3218 case MODE_UFRACT:
3219 case MODE_ACCUM:
3220 case MODE_UACCUM:
3221 bp_pack_value (&bp, GET_MODE_IBIT (m), 8);
3222 bp_pack_value (&bp, GET_MODE_FBIT (m), 8);
3223 break;
3224 case MODE_FLOAT:
3225 case MODE_DECIMAL_FLOAT:
3226 bp_pack_string (ob, &bp, REAL_MODE_FORMAT (m)->name, true);
3227 break;
3228 default:
3229 break;
3231 bp_pack_string (ob, &bp, GET_MODE_NAME (m), true);
3233 bp_pack_value (&bp, VOIDmode, 8);
3235 streamer_write_bitpack (&bp);
3237 char *section_name
3238 = lto_get_section_name (LTO_section_mode_table, NULL, 0, NULL);
3239 lto_begin_section (section_name, !flag_wpa);
3240 free (section_name);
3242 /* The entire header stream is computed here. */
3243 struct lto_simple_header_with_strings header;
3244 memset (&header, 0, sizeof (header));
3246 header.main_size = ob->main_stream->total_size;
3247 header.string_size = ob->string_stream->total_size;
3248 lto_write_data (&header, sizeof header);
3250 /* Put all of the gimple and the string table out the asm file as a
3251 block of text. */
3252 lto_write_stream (ob->main_stream);
3253 lto_write_stream (ob->string_stream);
3255 lto_end_section ();
3256 destroy_output_block (ob);
3260 /* This pass is run after all of the functions are serialized and all
3261 of the IPA passes have written their serialized forms. This pass
3262 causes the vector of all of the global decls and types used from
3263 this file to be written in to a section that can then be read in to
3264 recover these on other side. */
3266 void
3267 produce_asm_for_decls (void)
3269 struct lto_out_decl_state *out_state;
3270 struct lto_out_decl_state *fn_out_state;
3271 struct lto_decl_header header;
3272 char *section_name;
3273 struct output_block *ob;
3274 unsigned idx, num_fns;
3275 size_t decl_state_size;
3276 int32_t num_decl_states;
3278 ob = create_output_block (LTO_section_decls);
3280 memset (&header, 0, sizeof (struct lto_decl_header));
3282 section_name = lto_get_section_name (LTO_section_decls, NULL, 0, NULL);
3283 lto_begin_section (section_name, !flag_wpa);
3284 free (section_name);
3286 /* Make string 0 be a NULL string. */
3287 streamer_write_char_stream (ob->string_stream, 0);
3289 gcc_assert (!alias_pairs);
3291 /* Get rid of the global decl state hash tables to save some memory. */
3292 out_state = lto_get_out_decl_state ();
3293 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
3294 if (out_state->streams[i].tree_hash_table)
3296 delete out_state->streams[i].tree_hash_table;
3297 out_state->streams[i].tree_hash_table = NULL;
3300 /* Write the global symbols. */
3301 if (streamer_dump_file)
3302 fprintf (streamer_dump_file, "Outputting global stream\n");
3303 lto_output_decl_state_streams (ob, out_state);
3304 num_fns = lto_function_decl_states.length ();
3305 for (idx = 0; idx < num_fns; idx++)
3307 fn_out_state =
3308 lto_function_decl_states[idx];
3309 if (streamer_dump_file)
3310 fprintf (streamer_dump_file, "Outputting stream for %s\n",
3311 IDENTIFIER_POINTER
3312 (DECL_ASSEMBLER_NAME (fn_out_state->fn_decl)));
3313 lto_output_decl_state_streams (ob, fn_out_state);
3316 /* Currently not used. This field would allow us to preallocate
3317 the globals vector, so that it need not be resized as it is extended. */
3318 header.num_nodes = -1;
3320 /* Compute the total size of all decl out states. */
3321 decl_state_size = sizeof (int32_t);
3322 decl_state_size += lto_out_decl_state_written_size (out_state);
3323 for (idx = 0; idx < num_fns; idx++)
3325 fn_out_state =
3326 lto_function_decl_states[idx];
3327 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
3329 header.decl_state_size = decl_state_size;
3331 header.main_size = ob->main_stream->total_size;
3332 header.string_size = ob->string_stream->total_size;
3334 lto_write_data (&header, sizeof header);
3336 /* Write the main out-decl state, followed by out-decl states of
3337 functions. */
3338 num_decl_states = num_fns + 1;
3339 lto_write_data (&num_decl_states, sizeof (num_decl_states));
3340 lto_output_decl_state_refs (ob, out_state);
3341 for (idx = 0; idx < num_fns; idx++)
3343 fn_out_state = lto_function_decl_states[idx];
3344 lto_output_decl_state_refs (ob, fn_out_state);
3347 lto_write_stream (ob->main_stream);
3348 lto_write_stream (ob->string_stream);
3350 lto_end_section ();
3352 /* Write the symbol table. It is used by linker to determine dependencies
3353 and thus we can skip it for WPA. */
3354 if (!flag_wpa)
3356 unsigned int streamed_symbols = produce_symtab (ob);
3357 produce_symtab_extension (ob, streamed_symbols);
3360 /* Write command line opts. */
3361 lto_write_options ();
3363 /* Deallocate memory and clean up. */
3364 for (idx = 0; idx < num_fns; idx++)
3366 fn_out_state =
3367 lto_function_decl_states[idx];
3368 lto_delete_out_decl_state (fn_out_state);
3370 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
3371 lto_function_decl_states.release ();
3372 destroy_output_block (ob);
3373 if (lto_stream_offload_p)
3374 lto_write_mode_table ();