svn merge -r 219425:219681 svn+ssh://gcc.gnu.org/svn/gcc/trunk
[official-gcc.git] / gcc / lto-streamer-out.c
blobcced43b97131de2245837731d0911fd4f9110b76
1 /* Write the GIMPLE representation to a file stream.
3 Copyright (C) 2009-2015 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 "tm.h"
27 #include "hash-set.h"
28 #include "machmode.h"
29 #include "vec.h"
30 #include "double-int.h"
31 #include "input.h"
32 #include "alias.h"
33 #include "symtab.h"
34 #include "wide-int.h"
35 #include "inchash.h"
36 #include "tree.h"
37 #include "fold-const.h"
38 #include "stor-layout.h"
39 #include "stringpool.h"
40 #include "hashtab.h"
41 #include "hard-reg-set.h"
42 #include "function.h"
43 #include "rtl.h"
44 #include "flags.h"
45 #include "statistics.h"
46 #include "real.h"
47 #include "fixed-value.h"
48 #include "insn-config.h"
49 #include "expmed.h"
50 #include "dojump.h"
51 #include "explow.h"
52 #include "calls.h"
53 #include "emit-rtl.h"
54 #include "varasm.h"
55 #include "stmt.h"
56 #include "expr.h"
57 #include "params.h"
58 #include "predict.h"
59 #include "dominance.h"
60 #include "cfg.h"
61 #include "basic-block.h"
62 #include "tree-ssa-alias.h"
63 #include "internal-fn.h"
64 #include "gimple-expr.h"
65 #include "is-a.h"
66 #include "gimple.h"
67 #include "gimple-iterator.h"
68 #include "gimple-ssa.h"
69 #include "tree-ssanames.h"
70 #include "tree-pass.h"
71 #include "diagnostic-core.h"
72 #include "except.h"
73 #include "lto-symtab.h"
74 #include "hash-map.h"
75 #include "plugin-api.h"
76 #include "ipa-ref.h"
77 #include "cgraph.h"
78 #include "lto-streamer.h"
79 #include "data-streamer.h"
80 #include "gimple-streamer.h"
81 #include "tree-streamer.h"
82 #include "streamer-hooks.h"
83 #include "cfgloop.h"
84 #include "builtins.h"
85 #include "gomp-constants.h"
88 static void lto_write_tree (struct output_block*, tree, bool);
90 /* Clear the line info stored in DATA_IN. */
92 static void
93 clear_line_info (struct output_block *ob)
95 ob->current_file = NULL;
96 ob->current_line = 0;
97 ob->current_col = 0;
101 /* Create the output block and return it. SECTION_TYPE is
102 LTO_section_function_body or LTO_static_initializer. */
104 struct output_block *
105 create_output_block (enum lto_section_type section_type)
107 struct output_block *ob = XCNEW (struct output_block);
109 ob->section_type = section_type;
110 ob->decl_state = lto_get_out_decl_state ();
111 ob->main_stream = XCNEW (struct lto_output_stream);
112 ob->string_stream = XCNEW (struct lto_output_stream);
113 ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true, false);
115 if (section_type == LTO_section_function_body)
116 ob->cfg_stream = XCNEW (struct lto_output_stream);
118 clear_line_info (ob);
120 ob->string_hash_table = new hash_table<string_slot_hasher> (37);
121 gcc_obstack_init (&ob->obstack);
123 return ob;
127 /* Destroy the output block OB. */
129 void
130 destroy_output_block (struct output_block *ob)
132 enum lto_section_type section_type = ob->section_type;
134 delete ob->string_hash_table;
135 ob->string_hash_table = NULL;
137 free (ob->main_stream);
138 free (ob->string_stream);
139 if (section_type == LTO_section_function_body)
140 free (ob->cfg_stream);
142 streamer_tree_cache_delete (ob->writer_cache);
143 obstack_free (&ob->obstack, NULL);
145 free (ob);
149 /* Look up NODE in the type table and write the index for it to OB. */
151 static void
152 output_type_ref (struct output_block *ob, tree node)
154 streamer_write_record_start (ob, LTO_type_ref);
155 lto_output_type_ref_index (ob->decl_state, ob->main_stream, node);
159 /* Return true if tree node T is written to various tables. For these
160 nodes, we sometimes want to write their phyiscal representation
161 (via lto_output_tree), and sometimes we need to emit an index
162 reference into a table (via lto_output_tree_ref). */
164 static bool
165 tree_is_indexable (tree t)
167 /* Parameters and return values of functions of variably modified types
168 must go to global stream, because they may be used in the type
169 definition. */
170 if ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
171 && DECL_CONTEXT (t))
172 return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)), NULL_TREE);
173 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared. */
174 else if (TREE_CODE (t) == IMPORTED_DECL)
175 return false;
176 else if (((TREE_CODE (t) == VAR_DECL && !TREE_STATIC (t))
177 || TREE_CODE (t) == TYPE_DECL
178 || TREE_CODE (t) == CONST_DECL
179 || TREE_CODE (t) == NAMELIST_DECL)
180 && decl_function_context (t))
181 return false;
182 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
183 return false;
184 /* Variably modified types need to be streamed alongside function
185 bodies because they can refer to local entities. Together with
186 them we have to localize their members as well.
187 ??? In theory that includes non-FIELD_DECLs as well. */
188 else if (TYPE_P (t)
189 && variably_modified_type_p (t, NULL_TREE))
190 return false;
191 else if (TREE_CODE (t) == FIELD_DECL
192 && variably_modified_type_p (DECL_CONTEXT (t), NULL_TREE))
193 return false;
194 else
195 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
199 /* Output info about new location into bitpack BP.
200 After outputting bitpack, lto_output_location_data has
201 to be done to output actual data. */
203 void
204 lto_output_location (struct output_block *ob, struct bitpack_d *bp,
205 location_t loc)
207 expanded_location xloc;
209 loc = LOCATION_LOCUS (loc);
210 bp_pack_value (bp, loc == UNKNOWN_LOCATION, 1);
211 if (loc == UNKNOWN_LOCATION)
212 return;
214 xloc = expand_location (loc);
216 bp_pack_value (bp, ob->current_file != xloc.file, 1);
217 bp_pack_value (bp, ob->current_line != xloc.line, 1);
218 bp_pack_value (bp, ob->current_col != xloc.column, 1);
220 if (ob->current_file != xloc.file)
221 bp_pack_string (ob, bp, xloc.file, true);
222 ob->current_file = xloc.file;
224 if (ob->current_line != xloc.line)
225 bp_pack_var_len_unsigned (bp, xloc.line);
226 ob->current_line = xloc.line;
228 if (ob->current_col != xloc.column)
229 bp_pack_var_len_unsigned (bp, xloc.column);
230 ob->current_col = xloc.column;
234 /* If EXPR is an indexable tree node, output a reference to it to
235 output block OB. Otherwise, output the physical representation of
236 EXPR to OB. */
238 static void
239 lto_output_tree_ref (struct output_block *ob, tree expr)
241 enum tree_code code;
243 if (TYPE_P (expr))
245 output_type_ref (ob, expr);
246 return;
249 code = TREE_CODE (expr);
250 switch (code)
252 case SSA_NAME:
253 streamer_write_record_start (ob, LTO_ssa_name_ref);
254 streamer_write_uhwi (ob, SSA_NAME_VERSION (expr));
255 break;
257 case FIELD_DECL:
258 streamer_write_record_start (ob, LTO_field_decl_ref);
259 lto_output_field_decl_index (ob->decl_state, ob->main_stream, expr);
260 break;
262 case FUNCTION_DECL:
263 streamer_write_record_start (ob, LTO_function_decl_ref);
264 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, expr);
265 break;
267 case VAR_DECL:
268 case DEBUG_EXPR_DECL:
269 gcc_assert (decl_function_context (expr) == NULL || TREE_STATIC (expr));
270 case PARM_DECL:
271 streamer_write_record_start (ob, LTO_global_decl_ref);
272 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
273 break;
275 case CONST_DECL:
276 streamer_write_record_start (ob, LTO_const_decl_ref);
277 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
278 break;
280 case IMPORTED_DECL:
281 gcc_assert (decl_function_context (expr) == NULL);
282 streamer_write_record_start (ob, LTO_imported_decl_ref);
283 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
284 break;
286 case TYPE_DECL:
287 streamer_write_record_start (ob, LTO_type_decl_ref);
288 lto_output_type_decl_index (ob->decl_state, ob->main_stream, expr);
289 break;
291 case NAMELIST_DECL:
292 streamer_write_record_start (ob, LTO_namelist_decl_ref);
293 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
294 break;
296 case NAMESPACE_DECL:
297 streamer_write_record_start (ob, LTO_namespace_decl_ref);
298 lto_output_namespace_decl_index (ob->decl_state, ob->main_stream, expr);
299 break;
301 case LABEL_DECL:
302 streamer_write_record_start (ob, LTO_label_decl_ref);
303 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
304 break;
306 case RESULT_DECL:
307 streamer_write_record_start (ob, LTO_result_decl_ref);
308 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
309 break;
311 case TRANSLATION_UNIT_DECL:
312 streamer_write_record_start (ob, LTO_translation_unit_decl_ref);
313 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
314 break;
316 default:
317 /* No other node is indexable, so it should have been handled by
318 lto_output_tree. */
319 gcc_unreachable ();
324 /* Return true if EXPR is a tree node that can be written to disk. */
326 static inline bool
327 lto_is_streamable (tree expr)
329 enum tree_code code = TREE_CODE (expr);
331 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
332 name version in lto_output_tree_ref (see output_ssa_names). */
333 return !is_lang_specific (expr)
334 && code != SSA_NAME
335 && code != CALL_EXPR
336 && code != LANG_TYPE
337 && code != MODIFY_EXPR
338 && code != INIT_EXPR
339 && code != TARGET_EXPR
340 && code != BIND_EXPR
341 && code != WITH_CLEANUP_EXPR
342 && code != STATEMENT_LIST
343 && (code == CASE_LABEL_EXPR
344 || code == DECL_EXPR
345 || TREE_CODE_CLASS (code) != tcc_statement);
349 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
351 static tree
352 get_symbol_initial_value (lto_symtab_encoder_t encoder, tree expr)
354 gcc_checking_assert (DECL_P (expr)
355 && TREE_CODE (expr) != FUNCTION_DECL
356 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL);
358 /* Handle DECL_INITIAL for symbols. */
359 tree initial = DECL_INITIAL (expr);
360 if (TREE_CODE (expr) == VAR_DECL
361 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
362 && !DECL_IN_CONSTANT_POOL (expr)
363 && initial)
365 varpool_node *vnode;
366 /* Extra section needs about 30 bytes; do not produce it for simple
367 scalar values. */
368 if (TREE_CODE (DECL_INITIAL (expr)) == CONSTRUCTOR
369 || !(vnode = varpool_node::get (expr))
370 || !lto_symtab_encoder_encode_initializer_p (encoder, vnode))
371 initial = error_mark_node;
374 return initial;
378 /* Write a physical representation of tree node EXPR to output block
379 OB. If REF_P is true, the leaves of EXPR are emitted as references
380 via lto_output_tree_ref. IX is the index into the streamer cache
381 where EXPR is stored. */
383 static void
384 lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
386 /* Pack all the non-pointer fields in EXPR into a bitpack and write
387 the resulting bitpack. */
388 bitpack_d bp = bitpack_create (ob->main_stream);
389 streamer_pack_tree_bitfields (ob, &bp, expr);
390 streamer_write_bitpack (&bp);
392 /* Write all the pointer fields in EXPR. */
393 streamer_write_tree_body (ob, expr, ref_p);
395 /* Write any LTO-specific data to OB. */
396 if (DECL_P (expr)
397 && TREE_CODE (expr) != FUNCTION_DECL
398 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
400 /* Handle DECL_INITIAL for symbols. */
401 tree initial = get_symbol_initial_value
402 (ob->decl_state->symtab_node_encoder, expr);
403 stream_write_tree (ob, initial, ref_p);
407 /* Write a physical representation of tree node EXPR to output block
408 OB. If REF_P is true, the leaves of EXPR are emitted as references
409 via lto_output_tree_ref. IX is the index into the streamer cache
410 where EXPR is stored. */
412 static void
413 lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
415 if (!lto_is_streamable (expr))
416 internal_error ("tree code %qs is not supported in LTO streams",
417 get_tree_code_name (TREE_CODE (expr)));
419 /* Write the header, containing everything needed to materialize
420 EXPR on the reading side. */
421 streamer_write_tree_header (ob, expr);
423 lto_write_tree_1 (ob, expr, ref_p);
425 /* Mark the end of EXPR. */
426 streamer_write_zero (ob);
429 /* Emit the physical representation of tree node EXPR to output block
430 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
431 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
433 static void
434 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
435 bool ref_p, bool this_ref_p)
437 unsigned ix;
439 gcc_checking_assert (expr != NULL_TREE
440 && !(this_ref_p && tree_is_indexable (expr)));
442 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
443 expr, hash, &ix);
444 gcc_assert (!exists_p);
445 if (streamer_handle_as_builtin_p (expr))
447 /* MD and NORMAL builtins do not need to be written out
448 completely as they are always instantiated by the
449 compiler on startup. The only builtins that need to
450 be written out are BUILT_IN_FRONTEND. For all other
451 builtins, we simply write the class and code. */
452 streamer_write_builtin (ob, expr);
454 else if (TREE_CODE (expr) == INTEGER_CST
455 && !TREE_OVERFLOW (expr))
457 /* Shared INTEGER_CST nodes are special because they need their
458 original type to be materialized by the reader (to implement
459 TYPE_CACHED_VALUES). */
460 streamer_write_integer_cst (ob, expr, ref_p);
462 else
464 /* This is the first time we see EXPR, write its fields
465 to OB. */
466 lto_write_tree (ob, expr, ref_p);
470 class DFS
472 public:
473 DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
474 bool single_p);
475 ~DFS ();
477 struct scc_entry
479 tree t;
480 hashval_t hash;
482 vec<scc_entry> sccstack;
484 private:
485 struct sccs
487 unsigned int dfsnum;
488 unsigned int low;
491 static int scc_entry_compare (const void *, const void *);
493 void DFS_write_tree_body (struct output_block *ob,
494 tree expr, sccs *expr_state, bool ref_p,
495 bool single_p);
497 void DFS_write_tree (struct output_block *ob, sccs *from_state,
498 tree expr, bool ref_p, bool this_ref_p,
499 bool single_p);
500 hashval_t
501 hash_scc (struct output_block *ob, unsigned first, unsigned size);
503 unsigned int next_dfs_num;
504 hash_map<tree, sccs *> sccstate;
505 struct obstack sccstate_obstack;
508 DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
509 bool single_p)
511 sccstack.create (0);
512 gcc_obstack_init (&sccstate_obstack);
513 next_dfs_num = 1;
514 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p, single_p);
517 DFS::~DFS ()
519 sccstack.release ();
520 obstack_free (&sccstate_obstack, NULL);
523 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
524 DFS recurse for all tree edges originating from it. */
526 void
527 DFS::DFS_write_tree_body (struct output_block *ob,
528 tree expr, sccs *expr_state, bool ref_p,
529 bool single_p)
531 #define DFS_follow_tree_edge(DEST) \
532 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p, single_p)
534 enum tree_code code;
536 code = TREE_CODE (expr);
538 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
540 if (TREE_CODE (expr) != IDENTIFIER_NODE)
541 DFS_follow_tree_edge (TREE_TYPE (expr));
544 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
546 for (unsigned i = 0; i < VECTOR_CST_NELTS (expr); ++i)
547 DFS_follow_tree_edge (VECTOR_CST_ELT (expr, i));
550 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
552 DFS_follow_tree_edge (TREE_REALPART (expr));
553 DFS_follow_tree_edge (TREE_IMAGPART (expr));
556 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
558 /* Drop names that were created for anonymous entities. */
559 if (DECL_NAME (expr)
560 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
561 && ANON_AGGRNAME_P (DECL_NAME (expr)))
563 else
564 DFS_follow_tree_edge (DECL_NAME (expr));
565 DFS_follow_tree_edge (DECL_CONTEXT (expr));
568 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
570 DFS_follow_tree_edge (DECL_SIZE (expr));
571 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
573 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
574 special handling in LTO, it must be handled by streamer hooks. */
576 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
578 /* Do not follow DECL_ABSTRACT_ORIGIN. We cannot handle debug information
579 for early inlining so drop it on the floor instead of ICEing in
580 dwarf2out.c. */
582 if ((TREE_CODE (expr) == VAR_DECL
583 || TREE_CODE (expr) == PARM_DECL)
584 && DECL_HAS_VALUE_EXPR_P (expr))
585 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
586 if (TREE_CODE (expr) == VAR_DECL)
587 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
590 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
592 if (TREE_CODE (expr) == TYPE_DECL)
593 DFS_follow_tree_edge (DECL_ORIGINAL_TYPE (expr));
596 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
598 /* Make sure we don't inadvertently set the assembler name. */
599 if (DECL_ASSEMBLER_NAME_SET_P (expr))
600 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
603 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
605 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
606 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
607 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
608 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
609 DFS_follow_tree_edge (DECL_FCONTEXT (expr));
612 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
614 DFS_follow_tree_edge (DECL_VINDEX (expr));
615 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
616 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr));
617 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
620 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
622 DFS_follow_tree_edge (TYPE_SIZE (expr));
623 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
624 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
625 DFS_follow_tree_edge (TYPE_NAME (expr));
626 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
627 reconstructed during fixup. */
628 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
629 during fixup. */
630 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
631 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
632 /* TYPE_CANONICAL is re-computed during type merging, so no need
633 to follow it here. */
634 DFS_follow_tree_edge (TYPE_STUB_DECL (expr));
637 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
639 if (TREE_CODE (expr) == ENUMERAL_TYPE)
640 DFS_follow_tree_edge (TYPE_VALUES (expr));
641 else if (TREE_CODE (expr) == ARRAY_TYPE)
642 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
643 else if (RECORD_OR_UNION_TYPE_P (expr))
644 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
645 DFS_follow_tree_edge (t);
646 else if (TREE_CODE (expr) == FUNCTION_TYPE
647 || TREE_CODE (expr) == METHOD_TYPE)
648 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
650 if (!POINTER_TYPE_P (expr))
651 DFS_follow_tree_edge (TYPE_MINVAL (expr));
652 DFS_follow_tree_edge (TYPE_MAXVAL (expr));
653 if (RECORD_OR_UNION_TYPE_P (expr))
654 DFS_follow_tree_edge (TYPE_BINFO (expr));
657 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
659 DFS_follow_tree_edge (TREE_PURPOSE (expr));
660 DFS_follow_tree_edge (TREE_VALUE (expr));
661 DFS_follow_tree_edge (TREE_CHAIN (expr));
664 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
666 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
667 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
670 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
672 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
673 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
674 DFS_follow_tree_edge (TREE_BLOCK (expr));
677 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
679 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
680 if (VAR_OR_FUNCTION_DECL_P (t)
681 && DECL_EXTERNAL (t))
682 /* We have to stream externals in the block chain as
683 non-references. See also
684 tree-streamer-out.c:streamer_write_chain. */
685 DFS_write_tree (ob, expr_state, t, ref_p, false, single_p);
686 else
687 DFS_follow_tree_edge (t);
689 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
691 /* Follow BLOCK_ABSTRACT_ORIGIN for the limited cases we can
692 handle - those that represent inlined function scopes.
693 For the drop rest them on the floor instead of ICEing
694 in dwarf2out.c. */
695 if (inlined_function_outer_scope_p (expr))
697 tree ultimate_origin = block_ultimate_origin (expr);
698 DFS_follow_tree_edge (ultimate_origin);
700 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
701 information for early inlined BLOCKs so drop it on the floor instead
702 of ICEing in dwarf2out.c. */
704 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
705 streaming time. */
707 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
708 list is re-constructed from BLOCK_SUPERCONTEXT. */
711 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
713 unsigned i;
714 tree t;
716 /* Note that the number of BINFO slots has already been emitted in
717 EXPR's header (see streamer_write_tree_header) because this length
718 is needed to build the empty BINFO node on the reader side. */
719 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
720 DFS_follow_tree_edge (t);
721 DFS_follow_tree_edge (BINFO_OFFSET (expr));
722 DFS_follow_tree_edge (BINFO_VTABLE (expr));
723 DFS_follow_tree_edge (BINFO_VPTR_FIELD (expr));
725 /* The number of BINFO_BASE_ACCESSES has already been emitted in
726 EXPR's bitfield section. */
727 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
728 DFS_follow_tree_edge (t);
730 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
731 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
734 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
736 unsigned i;
737 tree index, value;
739 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
741 DFS_follow_tree_edge (index);
742 DFS_follow_tree_edge (value);
746 if (code == OMP_CLAUSE)
748 int i;
749 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
750 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
751 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
754 #undef DFS_follow_tree_edge
757 /* Return a hash value for the tree T.
758 CACHE holds hash values of trees outside current SCC. MAP, if non-NULL,
759 may hold hash values if trees inside current SCC. */
761 static hashval_t
762 hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map, tree t)
764 inchash::hash hstate;
766 #define visit(SIBLING) \
767 do { \
768 unsigned ix; \
769 if (!SIBLING) \
770 hstate.add_int (0); \
771 else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
772 hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \
773 else if (map) \
774 hstate.add_int (*map->get (SIBLING)); \
775 else \
776 hstate.add_int (1); \
777 } while (0)
779 /* Hash TS_BASE. */
780 enum tree_code code = TREE_CODE (t);
781 hstate.add_int (code);
782 if (!TYPE_P (t))
784 hstate.add_flag (TREE_SIDE_EFFECTS (t));
785 hstate.add_flag (TREE_CONSTANT (t));
786 hstate.add_flag (TREE_READONLY (t));
787 hstate.add_flag (TREE_PUBLIC (t));
789 hstate.add_flag (TREE_ADDRESSABLE (t));
790 hstate.add_flag (TREE_THIS_VOLATILE (t));
791 if (DECL_P (t))
792 hstate.add_flag (DECL_UNSIGNED (t));
793 else if (TYPE_P (t))
794 hstate.add_flag (TYPE_UNSIGNED (t));
795 if (TYPE_P (t))
796 hstate.add_flag (TYPE_ARTIFICIAL (t));
797 else
798 hstate.add_flag (TREE_NO_WARNING (t));
799 hstate.add_flag (TREE_NOTHROW (t));
800 hstate.add_flag (TREE_STATIC (t));
801 hstate.add_flag (TREE_PROTECTED (t));
802 hstate.add_flag (TREE_DEPRECATED (t));
803 if (code != TREE_BINFO)
804 hstate.add_flag (TREE_PRIVATE (t));
805 if (TYPE_P (t))
807 hstate.add_flag (TYPE_SATURATING (t));
808 hstate.add_flag (TYPE_ADDR_SPACE (t));
810 else if (code == SSA_NAME)
811 hstate.add_flag (SSA_NAME_IS_DEFAULT_DEF (t));
812 hstate.commit_flag ();
814 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
816 int i;
817 hstate.add_wide_int (TREE_INT_CST_NUNITS (t));
818 hstate.add_wide_int (TREE_INT_CST_EXT_NUNITS (t));
819 for (i = 0; i < TREE_INT_CST_NUNITS (t); i++)
820 hstate.add_wide_int (TREE_INT_CST_ELT (t, i));
823 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
825 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
826 hstate.add_flag (r.cl);
827 hstate.add_flag (r.sign);
828 hstate.add_flag (r.signalling);
829 hstate.add_flag (r.canonical);
830 hstate.commit_flag ();
831 hstate.add_int (r.uexp);
832 hstate.add (r.sig, sizeof (r.sig));
835 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
837 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
838 hstate.add_int (f.mode);
839 hstate.add_int (f.data.low);
840 hstate.add_int (f.data.high);
843 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
845 hstate.add_wide_int (DECL_MODE (t));
846 hstate.add_flag (DECL_NONLOCAL (t));
847 hstate.add_flag (DECL_VIRTUAL_P (t));
848 hstate.add_flag (DECL_IGNORED_P (t));
849 hstate.add_flag (DECL_ABSTRACT_P (t));
850 hstate.add_flag (DECL_ARTIFICIAL (t));
851 hstate.add_flag (DECL_USER_ALIGN (t));
852 hstate.add_flag (DECL_PRESERVE_P (t));
853 hstate.add_flag (DECL_EXTERNAL (t));
854 hstate.add_flag (DECL_GIMPLE_REG_P (t));
855 hstate.commit_flag ();
856 hstate.add_int (DECL_ALIGN (t));
857 if (code == LABEL_DECL)
859 hstate.add_int (EH_LANDING_PAD_NR (t));
860 hstate.add_int (LABEL_DECL_UID (t));
862 else if (code == FIELD_DECL)
864 hstate.add_flag (DECL_PACKED (t));
865 hstate.add_flag (DECL_NONADDRESSABLE_P (t));
866 hstate.add_int (DECL_OFFSET_ALIGN (t));
868 else if (code == VAR_DECL)
870 hstate.add_flag (DECL_HAS_DEBUG_EXPR_P (t));
871 hstate.add_flag (DECL_NONLOCAL_FRAME (t));
873 if (code == RESULT_DECL
874 || code == PARM_DECL
875 || code == VAR_DECL)
877 hstate.add_flag (DECL_BY_REFERENCE (t));
878 if (code == VAR_DECL
879 || code == PARM_DECL)
880 hstate.add_flag (DECL_HAS_VALUE_EXPR_P (t));
882 hstate.commit_flag ();
885 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
886 hstate.add_int (DECL_REGISTER (t));
888 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
890 hstate.add_flag (DECL_COMMON (t));
891 hstate.add_flag (DECL_DLLIMPORT_P (t));
892 hstate.add_flag (DECL_WEAK (t));
893 hstate.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t));
894 hstate.add_flag (DECL_COMDAT (t));
895 hstate.add_flag (DECL_VISIBILITY_SPECIFIED (t));
896 hstate.add_int (DECL_VISIBILITY (t));
897 if (code == VAR_DECL)
899 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
900 hstate.add_flag (DECL_HARD_REGISTER (t));
901 hstate.add_flag (DECL_IN_CONSTANT_POOL (t));
903 if (TREE_CODE (t) == FUNCTION_DECL)
905 hstate.add_flag (DECL_FINAL_P (t));
906 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (t));
907 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (t));
909 hstate.commit_flag ();
912 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
914 hstate.add_int (DECL_BUILT_IN_CLASS (t));
915 hstate.add_flag (DECL_STATIC_CONSTRUCTOR (t));
916 hstate.add_flag (DECL_STATIC_DESTRUCTOR (t));
917 hstate.add_flag (DECL_UNINLINABLE (t));
918 hstate.add_flag (DECL_POSSIBLY_INLINED (t));
919 hstate.add_flag (DECL_IS_NOVOPS (t));
920 hstate.add_flag (DECL_IS_RETURNS_TWICE (t));
921 hstate.add_flag (DECL_IS_MALLOC (t));
922 hstate.add_flag (DECL_IS_OPERATOR_NEW (t));
923 hstate.add_flag (DECL_DECLARED_INLINE_P (t));
924 hstate.add_flag (DECL_STATIC_CHAIN (t));
925 hstate.add_flag (DECL_NO_INLINE_WARNING_P (t));
926 hstate.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t));
927 hstate.add_flag (DECL_NO_LIMIT_STACK (t));
928 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (t));
929 hstate.add_flag (DECL_PURE_P (t));
930 hstate.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t));
931 hstate.commit_flag ();
932 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
933 hstate.add_int (DECL_FUNCTION_CODE (t));
936 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
938 hstate.add_wide_int (TYPE_MODE (t));
939 hstate.add_flag (TYPE_STRING_FLAG (t));
940 hstate.add_flag (TYPE_NO_FORCE_BLK (t));
941 hstate.add_flag (TYPE_NEEDS_CONSTRUCTING (t));
942 hstate.add_flag (TYPE_PACKED (t));
943 hstate.add_flag (TYPE_RESTRICT (t));
944 hstate.add_flag (TYPE_USER_ALIGN (t));
945 hstate.add_flag (TYPE_READONLY (t));
946 if (RECORD_OR_UNION_TYPE_P (t))
948 hstate.add_flag (TYPE_TRANSPARENT_AGGR (t));
949 hstate.add_flag (TYPE_FINAL_P (t));
951 else if (code == ARRAY_TYPE)
952 hstate.add_flag (TYPE_NONALIASED_COMPONENT (t));
953 hstate.commit_flag ();
954 hstate.add_int (TYPE_PRECISION (t));
955 hstate.add_int (TYPE_ALIGN (t));
956 hstate.add_int ((TYPE_ALIAS_SET (t) == 0
957 || (!in_lto_p
958 && get_alias_set (t) == 0))
959 ? 0 : -1);
962 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
963 hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
964 strlen (TRANSLATION_UNIT_LANGUAGE (t)));
966 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
967 /* We don't stream these when passing things to a different target. */
968 && !lto_stream_offload_p)
969 hstate.add_wide_int (cl_target_option_hash (TREE_TARGET_OPTION (t)));
971 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
972 hstate.add_wide_int (cl_optimization_hash (TREE_OPTIMIZATION (t)));
974 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
975 hstate.merge_hash (IDENTIFIER_HASH_VALUE (t));
977 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
978 hstate.add (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t));
980 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
982 if (code != IDENTIFIER_NODE)
983 visit (TREE_TYPE (t));
986 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
987 for (unsigned i = 0; i < VECTOR_CST_NELTS (t); ++i)
988 visit (VECTOR_CST_ELT (t, i));
990 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
992 visit (TREE_REALPART (t));
993 visit (TREE_IMAGPART (t));
996 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
998 /* Drop names that were created for anonymous entities. */
999 if (DECL_NAME (t)
1000 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
1001 && ANON_AGGRNAME_P (DECL_NAME (t)))
1003 else
1004 visit (DECL_NAME (t));
1005 if (DECL_FILE_SCOPE_P (t))
1007 else
1008 visit (DECL_CONTEXT (t));
1011 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1013 visit (DECL_SIZE (t));
1014 visit (DECL_SIZE_UNIT (t));
1015 visit (DECL_ATTRIBUTES (t));
1016 if ((code == VAR_DECL
1017 || code == PARM_DECL)
1018 && DECL_HAS_VALUE_EXPR_P (t))
1019 visit (DECL_VALUE_EXPR (t));
1020 if (code == VAR_DECL
1021 && DECL_HAS_DEBUG_EXPR_P (t))
1022 visit (DECL_DEBUG_EXPR (t));
1023 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
1024 be able to call get_symbol_initial_value. */
1027 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
1029 if (code == TYPE_DECL)
1030 visit (DECL_ORIGINAL_TYPE (t));
1033 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1035 if (DECL_ASSEMBLER_NAME_SET_P (t))
1036 visit (DECL_ASSEMBLER_NAME (t));
1039 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1041 visit (DECL_FIELD_OFFSET (t));
1042 visit (DECL_BIT_FIELD_TYPE (t));
1043 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
1044 visit (DECL_FIELD_BIT_OFFSET (t));
1045 visit (DECL_FCONTEXT (t));
1048 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1050 visit (DECL_VINDEX (t));
1051 visit (DECL_FUNCTION_PERSONALITY (t));
1052 visit (DECL_FUNCTION_SPECIFIC_TARGET (t));
1053 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
1056 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1058 visit (TYPE_SIZE (t));
1059 visit (TYPE_SIZE_UNIT (t));
1060 visit (TYPE_ATTRIBUTES (t));
1061 visit (TYPE_NAME (t));
1062 visit (TYPE_MAIN_VARIANT (t));
1063 if (TYPE_FILE_SCOPE_P (t))
1065 else
1066 visit (TYPE_CONTEXT (t));
1067 visit (TYPE_STUB_DECL (t));
1070 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1072 if (code == ENUMERAL_TYPE)
1073 visit (TYPE_VALUES (t));
1074 else if (code == ARRAY_TYPE)
1075 visit (TYPE_DOMAIN (t));
1076 else if (RECORD_OR_UNION_TYPE_P (t))
1077 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1078 visit (f);
1079 else if (code == FUNCTION_TYPE
1080 || code == METHOD_TYPE)
1081 visit (TYPE_ARG_TYPES (t));
1082 if (!POINTER_TYPE_P (t))
1083 visit (TYPE_MINVAL (t));
1084 visit (TYPE_MAXVAL (t));
1085 if (RECORD_OR_UNION_TYPE_P (t))
1086 visit (TYPE_BINFO (t));
1089 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1091 visit (TREE_PURPOSE (t));
1092 visit (TREE_VALUE (t));
1093 visit (TREE_CHAIN (t));
1096 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1097 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1098 visit (TREE_VEC_ELT (t, i));
1100 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1102 hstate.add_wide_int (TREE_OPERAND_LENGTH (t));
1103 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1104 visit (TREE_OPERAND (t, i));
1107 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1109 unsigned i;
1110 tree b;
1111 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1112 visit (b);
1113 visit (BINFO_OFFSET (t));
1114 visit (BINFO_VTABLE (t));
1115 visit (BINFO_VPTR_FIELD (t));
1116 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t), i, b)
1117 visit (b);
1118 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1119 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
1122 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1124 unsigned i;
1125 tree index, value;
1126 hstate.add_wide_int (CONSTRUCTOR_NELTS (t));
1127 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1129 visit (index);
1130 visit (value);
1134 if (code == OMP_CLAUSE)
1136 int i;
1137 HOST_WIDE_INT val;
1139 hstate.add_wide_int (OMP_CLAUSE_CODE (t));
1140 switch (OMP_CLAUSE_CODE (t))
1142 case OMP_CLAUSE_DEFAULT:
1143 val = OMP_CLAUSE_DEFAULT_KIND (t);
1144 break;
1145 case OMP_CLAUSE_SCHEDULE:
1146 val = OMP_CLAUSE_SCHEDULE_KIND (t);
1147 break;
1148 case OMP_CLAUSE_DEPEND:
1149 val = OMP_CLAUSE_DEPEND_KIND (t);
1150 break;
1151 case OMP_CLAUSE_MAP:
1152 val = OMP_CLAUSE_MAP_KIND (t);
1153 break;
1154 case OMP_CLAUSE_PROC_BIND:
1155 val = OMP_CLAUSE_PROC_BIND_KIND (t);
1156 break;
1157 case OMP_CLAUSE_REDUCTION:
1158 val = OMP_CLAUSE_REDUCTION_CODE (t);
1159 break;
1160 default:
1161 val = 0;
1162 break;
1164 hstate.add_wide_int (val);
1165 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1166 visit (OMP_CLAUSE_OPERAND (t, i));
1167 visit (OMP_CLAUSE_CHAIN (t));
1170 return hstate.end ();
1172 #undef visit
1175 /* Compare two SCC entries by their hash value for qsorting them. */
1178 DFS::scc_entry_compare (const void *p1_, const void *p2_)
1180 const scc_entry *p1 = (const scc_entry *) p1_;
1181 const scc_entry *p2 = (const scc_entry *) p2_;
1182 if (p1->hash < p2->hash)
1183 return -1;
1184 else if (p1->hash > p2->hash)
1185 return 1;
1186 return 0;
1189 /* Return a hash value for the SCC on the SCC stack from FIRST with
1190 size SIZE. */
1192 hashval_t
1193 DFS::hash_scc (struct output_block *ob,
1194 unsigned first, unsigned size)
1196 unsigned int last_classes = 0, iterations = 0;
1198 /* Compute hash values for the SCC members. */
1199 for (unsigned i = 0; i < size; ++i)
1200 sccstack[first+i].hash = hash_tree (ob->writer_cache, NULL,
1201 sccstack[first+i].t);
1203 if (size == 1)
1204 return sccstack[first].hash;
1206 /* We aim to get unique hash for every tree within SCC and compute hash value
1207 of the whole SCC by combing all values together in an stable (entry point
1208 independent) order. This guarantees that the same SCC regions within
1209 different translation units will get the same hash values and therefore
1210 will be merged at WPA time.
1212 Often the hashes are already unique. In that case we compute scc hash
1213 by combining individual hash values in an increasing order.
1215 If thre are duplicates we seek at least one tree with unique hash (and
1216 pick one with minimal hash and this property). Then we obtain stable
1217 order by DFS walk starting from this unique tree and then use index
1218 within this order to make individual hash values unique.
1220 If there is no tree with unique hash, we iteratively propagate the hash
1221 values across the internal edges of SCC. This usually quickly leads
1222 to unique hashes. Consider, for example, an SCC containing two pointers
1223 that are identical except for type they point and assume that these
1224 types are also part of the SCC.
1225 The propagation will add the points-to type information into their hash
1226 values. */
1229 /* Sort the SCC so we can easily see check for uniqueness. */
1230 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1232 unsigned int classes = 1;
1233 int firstunique = -1;
1235 /* Find tree with lowest unique hash (if it exists) and compute
1236 number of equivalence classes. */
1237 if (sccstack[first].hash != sccstack[first+1].hash)
1238 firstunique = 0;
1239 for (unsigned i = 1; i < size; ++i)
1240 if (sccstack[first+i-1].hash != sccstack[first+i].hash)
1242 classes++;
1243 if (firstunique == -1
1244 && (i == size - 1
1245 || sccstack[first+i+1].hash != sccstack[first+i].hash))
1246 firstunique = i;
1249 /* If we found tree with unique hash; stop the iteration. */
1250 if (firstunique != -1
1251 /* Also terminate if we run out of iterations or if the number of
1252 equivalence classes is no longer increasing.
1253 For example a cyclic list of trees that are all equivalent will
1254 never have unique entry point; we however do not build such SCCs
1255 in our IL. */
1256 || classes <= last_classes || iterations > 16)
1258 hashval_t scc_hash;
1260 /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk
1261 starting from FIRSTUNIQUE to obstain stable order. */
1262 if (classes != size && firstunique != -1)
1264 hash_map <tree, hashval_t> map(size*2);
1266 /* Store hash values into a map, so we can associate them with
1267 reordered SCC. */
1268 for (unsigned i = 0; i < size; ++i)
1269 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1271 DFS again (ob, sccstack[first+firstunique].t, false, false, true);
1272 gcc_assert (again.sccstack.length () == size);
1274 memcpy (sccstack.address () + first,
1275 again.sccstack.address (),
1276 sizeof (scc_entry) * size);
1278 /* Update hash values of individual members by hashing in the
1279 index within the stable order. This ensures uniqueness.
1280 Also compute the scc_hash by mixing in all hash values in the
1281 stable order we obtained. */
1282 sccstack[first].hash = *map.get (sccstack[first].t);
1283 scc_hash = sccstack[first].hash;
1284 for (unsigned i = 1; i < size; ++i)
1286 sccstack[first+i].hash
1287 = iterative_hash_hashval_t (i,
1288 *map.get (sccstack[first+i].t));
1289 scc_hash = iterative_hash_hashval_t (scc_hash,
1290 sccstack[first+i].hash);
1293 /* If we got unique hash values for each tree, then sort already
1294 ensured entry point independent order. Only compute the final
1295 scc hash.
1297 If we failed to find the unique entry point, we go by the same
1298 route. We will eventually introduce unwanted hash conflicts. */
1299 else
1301 scc_hash = sccstack[first].hash;
1302 for (unsigned i = 1; i < size; ++i)
1303 scc_hash = iterative_hash_hashval_t (scc_hash,
1304 sccstack[first+i].hash);
1305 /* We can not 100% guarantee that the hash will not conflict in
1306 in a way so the unique hash is not found. This however
1307 should be extremely rare situation. ICE for now so possible
1308 issues are found and evaulated. */
1309 gcc_checking_assert (classes == size);
1312 /* To avoid conflicts across SCCs iteratively hash the whole SCC
1313 hash into the hash of each of the elements. */
1314 for (unsigned i = 0; i < size; ++i)
1315 sccstack[first+i].hash
1316 = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
1317 return scc_hash;
1320 last_classes = classes;
1321 iterations++;
1323 /* We failed to identify the entry point; propagate hash values across
1324 the edges. */
1326 hash_map <tree, hashval_t> map(size*2);
1327 for (unsigned i = 0; i < size; ++i)
1328 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1330 for (unsigned i = 0; i < size; i++)
1331 sccstack[first+i].hash = hash_tree (ob->writer_cache, &map,
1332 sccstack[first+i].t);
1335 while (true);
1338 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1339 already in the streamer cache. Main routine called for
1340 each visit of EXPR. */
1342 void
1343 DFS::DFS_write_tree (struct output_block *ob, sccs *from_state,
1344 tree expr, bool ref_p, bool this_ref_p, bool single_p)
1346 unsigned ix;
1348 /* Handle special cases. */
1349 if (expr == NULL_TREE)
1350 return;
1352 /* Do not DFS walk into indexable trees. */
1353 if (this_ref_p && tree_is_indexable (expr))
1354 return;
1356 /* Check if we already streamed EXPR. */
1357 if (streamer_tree_cache_lookup (ob->writer_cache, expr, &ix))
1358 return;
1360 sccs **slot = &sccstate.get_or_insert (expr);
1361 sccs *cstate = *slot;
1362 if (!cstate)
1364 scc_entry e = { expr, 0 };
1365 /* Not yet visited. DFS recurse and push it onto the stack. */
1366 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
1367 sccstack.safe_push (e);
1368 cstate->dfsnum = next_dfs_num++;
1369 cstate->low = cstate->dfsnum;
1371 if (streamer_handle_as_builtin_p (expr))
1373 else if (TREE_CODE (expr) == INTEGER_CST
1374 && !TREE_OVERFLOW (expr))
1375 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p, single_p);
1376 else
1378 DFS_write_tree_body (ob, expr, cstate, ref_p, single_p);
1380 /* Walk any LTO-specific edges. */
1381 if (DECL_P (expr)
1382 && TREE_CODE (expr) != FUNCTION_DECL
1383 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1385 /* Handle DECL_INITIAL for symbols. */
1386 tree initial = get_symbol_initial_value (ob->decl_state->symtab_node_encoder,
1387 expr);
1388 DFS_write_tree (ob, cstate, initial, ref_p, ref_p, single_p);
1392 /* See if we found an SCC. */
1393 if (cstate->low == cstate->dfsnum)
1395 unsigned first, size;
1396 tree x;
1398 /* If we are re-walking a single leaf-SCC just return and
1399 let the caller access the sccstack. */
1400 if (single_p)
1401 return;
1403 /* Pop the SCC and compute its size. */
1404 first = sccstack.length ();
1407 x = sccstack[--first].t;
1409 while (x != expr);
1410 size = sccstack.length () - first;
1412 /* No need to compute hashes for LTRANS units, we don't perform
1413 any merging there. */
1414 hashval_t scc_hash = 0;
1415 unsigned scc_entry_len = 0;
1416 if (!flag_wpa)
1418 scc_hash = hash_scc (ob, first, size);
1420 /* Put the entries with the least number of collisions first. */
1421 unsigned entry_start = 0;
1422 scc_entry_len = size + 1;
1423 for (unsigned i = 0; i < size;)
1425 unsigned from = i;
1426 for (i = i + 1; i < size
1427 && (sccstack[first + i].hash
1428 == sccstack[first + from].hash); ++i)
1430 if (i - from < scc_entry_len)
1432 scc_entry_len = i - from;
1433 entry_start = from;
1436 for (unsigned i = 0; i < scc_entry_len; ++i)
1438 scc_entry tem = sccstack[first + i];
1439 sccstack[first + i] = sccstack[first + entry_start + i];
1440 sccstack[first + entry_start + i] = tem;
1443 if (scc_entry_len == 1)
1444 ; /* We already sorted SCC deterministically in hash_scc. */
1445 else
1446 /* Check that we have only one SCC.
1447 Naturally we may have conflicts if hash function is not
1448 strong enough. Lets see how far this gets. */
1450 #ifdef ENABLE_CHECKING
1451 gcc_unreachable ();
1452 #endif
1456 /* Write LTO_tree_scc. */
1457 streamer_write_record_start (ob, LTO_tree_scc);
1458 streamer_write_uhwi (ob, size);
1459 streamer_write_uhwi (ob, scc_hash);
1461 /* Write size-1 SCCs without wrapping them inside SCC bundles.
1462 All INTEGER_CSTs need to be handled this way as we need
1463 their type to materialize them. Also builtins are handled
1464 this way.
1465 ??? We still wrap these in LTO_tree_scc so at the
1466 input side we can properly identify the tree we want
1467 to ultimatively return. */
1468 if (size == 1)
1469 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
1470 else
1472 /* Write the size of the SCC entry candidates. */
1473 streamer_write_uhwi (ob, scc_entry_len);
1475 /* Write all headers and populate the streamer cache. */
1476 for (unsigned i = 0; i < size; ++i)
1478 hashval_t hash = sccstack[first+i].hash;
1479 tree t = sccstack[first+i].t;
1480 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
1481 t, hash, &ix);
1482 gcc_assert (!exists_p);
1484 if (!lto_is_streamable (t))
1485 internal_error ("tree code %qs is not supported "
1486 "in LTO streams",
1487 get_tree_code_name (TREE_CODE (t)));
1489 gcc_checking_assert (!streamer_handle_as_builtin_p (t));
1491 /* Write the header, containing everything needed to
1492 materialize EXPR on the reading side. */
1493 streamer_write_tree_header (ob, t);
1496 /* Write the bitpacks and tree references. */
1497 for (unsigned i = 0; i < size; ++i)
1499 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
1501 /* Mark the end of the tree. */
1502 streamer_write_zero (ob);
1506 /* Finally truncate the vector. */
1507 sccstack.truncate (first);
1509 if (from_state)
1510 from_state->low = MIN (from_state->low, cstate->low);
1511 return;
1514 if (from_state)
1515 from_state->low = MIN (from_state->low, cstate->low);
1517 gcc_checking_assert (from_state);
1518 if (cstate->dfsnum < from_state->dfsnum)
1519 from_state->low = MIN (cstate->dfsnum, from_state->low);
1523 /* Emit the physical representation of tree node EXPR to output block
1524 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
1525 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1527 void
1528 lto_output_tree (struct output_block *ob, tree expr,
1529 bool ref_p, bool this_ref_p)
1531 unsigned ix;
1532 bool existed_p;
1534 if (expr == NULL_TREE)
1536 streamer_write_record_start (ob, LTO_null);
1537 return;
1540 if (this_ref_p && tree_is_indexable (expr))
1542 lto_output_tree_ref (ob, expr);
1543 return;
1546 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1547 if (existed_p)
1549 /* If a node has already been streamed out, make sure that
1550 we don't write it more than once. Otherwise, the reader
1551 will instantiate two different nodes for the same object. */
1552 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1553 streamer_write_uhwi (ob, ix);
1554 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1555 lto_tree_code_to_tag (TREE_CODE (expr)));
1556 lto_stats.num_pickle_refs_output++;
1558 else
1560 /* This is the first time we see EXPR, write all reachable
1561 trees to OB. */
1562 static bool in_dfs_walk;
1564 /* Protect against recursion which means disconnect between
1565 what tree edges we walk in the DFS walk and what edges
1566 we stream out. */
1567 gcc_assert (!in_dfs_walk);
1569 /* Start the DFS walk. */
1570 /* Save ob state ... */
1571 /* let's see ... */
1572 in_dfs_walk = true;
1573 DFS (ob, expr, ref_p, this_ref_p, false);
1574 in_dfs_walk = false;
1576 /* Finally append a reference to the tree we were writing.
1577 ??? If expr ended up as a singleton we could have
1578 inlined it here and avoid outputting a reference. */
1579 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1580 gcc_assert (existed_p);
1581 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1582 streamer_write_uhwi (ob, ix);
1583 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1584 lto_tree_code_to_tag (TREE_CODE (expr)));
1585 lto_stats.num_pickle_refs_output++;
1590 /* Output to OB a list of try/catch handlers starting with FIRST. */
1592 static void
1593 output_eh_try_list (struct output_block *ob, eh_catch first)
1595 eh_catch n;
1597 for (n = first; n; n = n->next_catch)
1599 streamer_write_record_start (ob, LTO_eh_catch);
1600 stream_write_tree (ob, n->type_list, true);
1601 stream_write_tree (ob, n->filter_list, true);
1602 stream_write_tree (ob, n->label, true);
1605 streamer_write_record_start (ob, LTO_null);
1609 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1610 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1611 detect EH region sharing. */
1613 static void
1614 output_eh_region (struct output_block *ob, eh_region r)
1616 enum LTO_tags tag;
1618 if (r == NULL)
1620 streamer_write_record_start (ob, LTO_null);
1621 return;
1624 if (r->type == ERT_CLEANUP)
1625 tag = LTO_ert_cleanup;
1626 else if (r->type == ERT_TRY)
1627 tag = LTO_ert_try;
1628 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1629 tag = LTO_ert_allowed_exceptions;
1630 else if (r->type == ERT_MUST_NOT_THROW)
1631 tag = LTO_ert_must_not_throw;
1632 else
1633 gcc_unreachable ();
1635 streamer_write_record_start (ob, tag);
1636 streamer_write_hwi (ob, r->index);
1638 if (r->outer)
1639 streamer_write_hwi (ob, r->outer->index);
1640 else
1641 streamer_write_zero (ob);
1643 if (r->inner)
1644 streamer_write_hwi (ob, r->inner->index);
1645 else
1646 streamer_write_zero (ob);
1648 if (r->next_peer)
1649 streamer_write_hwi (ob, r->next_peer->index);
1650 else
1651 streamer_write_zero (ob);
1653 if (r->type == ERT_TRY)
1655 output_eh_try_list (ob, r->u.eh_try.first_catch);
1657 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1659 stream_write_tree (ob, r->u.allowed.type_list, true);
1660 stream_write_tree (ob, r->u.allowed.label, true);
1661 streamer_write_uhwi (ob, r->u.allowed.filter);
1663 else if (r->type == ERT_MUST_NOT_THROW)
1665 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1666 bitpack_d bp = bitpack_create (ob->main_stream);
1667 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1668 streamer_write_bitpack (&bp);
1671 if (r->landing_pads)
1672 streamer_write_hwi (ob, r->landing_pads->index);
1673 else
1674 streamer_write_zero (ob);
1678 /* Output landing pad LP to OB. */
1680 static void
1681 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1683 if (lp == NULL)
1685 streamer_write_record_start (ob, LTO_null);
1686 return;
1689 streamer_write_record_start (ob, LTO_eh_landing_pad);
1690 streamer_write_hwi (ob, lp->index);
1691 if (lp->next_lp)
1692 streamer_write_hwi (ob, lp->next_lp->index);
1693 else
1694 streamer_write_zero (ob);
1696 if (lp->region)
1697 streamer_write_hwi (ob, lp->region->index);
1698 else
1699 streamer_write_zero (ob);
1701 stream_write_tree (ob, lp->post_landing_pad, true);
1705 /* Output the existing eh_table to OB. */
1707 static void
1708 output_eh_regions (struct output_block *ob, struct function *fn)
1710 if (fn->eh && fn->eh->region_tree)
1712 unsigned i;
1713 eh_region eh;
1714 eh_landing_pad lp;
1715 tree ttype;
1717 streamer_write_record_start (ob, LTO_eh_table);
1719 /* Emit the index of the root of the EH region tree. */
1720 streamer_write_hwi (ob, fn->eh->region_tree->index);
1722 /* Emit all the EH regions in the region array. */
1723 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
1724 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
1725 output_eh_region (ob, eh);
1727 /* Emit all landing pads. */
1728 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
1729 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
1730 output_eh_lp (ob, lp);
1732 /* Emit all the runtime type data. */
1733 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
1734 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
1735 stream_write_tree (ob, ttype, true);
1737 /* Emit the table of action chains. */
1738 if (targetm.arm_eabi_unwinder)
1740 tree t;
1741 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
1742 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
1743 stream_write_tree (ob, t, true);
1745 else
1747 uchar c;
1748 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
1749 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
1750 streamer_write_char_stream (ob->main_stream, c);
1754 /* The LTO_null either terminates the record or indicates that there
1755 are no eh_records at all. */
1756 streamer_write_record_start (ob, LTO_null);
1760 /* Output all of the active ssa names to the ssa_names stream. */
1762 static void
1763 output_ssa_names (struct output_block *ob, struct function *fn)
1765 unsigned int i, len;
1767 len = vec_safe_length (SSANAMES (fn));
1768 streamer_write_uhwi (ob, len);
1770 for (i = 1; i < len; i++)
1772 tree ptr = (*SSANAMES (fn))[i];
1774 if (ptr == NULL_TREE
1775 || SSA_NAME_IN_FREE_LIST (ptr)
1776 || virtual_operand_p (ptr))
1777 continue;
1779 streamer_write_uhwi (ob, i);
1780 streamer_write_char_stream (ob->main_stream,
1781 SSA_NAME_IS_DEFAULT_DEF (ptr));
1782 if (SSA_NAME_VAR (ptr))
1783 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
1784 else
1785 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1786 stream_write_tree (ob, TREE_TYPE (ptr), true);
1789 streamer_write_zero (ob);
1793 /* Output a wide-int. */
1795 static void
1796 streamer_write_wi (struct output_block *ob,
1797 const widest_int &w)
1799 int len = w.get_len ();
1801 streamer_write_uhwi (ob, w.get_precision ());
1802 streamer_write_uhwi (ob, len);
1803 for (int i = 0; i < len; i++)
1804 streamer_write_hwi (ob, w.elt (i));
1808 /* Output the cfg. */
1810 static void
1811 output_cfg (struct output_block *ob, struct function *fn)
1813 struct lto_output_stream *tmp_stream = ob->main_stream;
1814 basic_block bb;
1816 ob->main_stream = ob->cfg_stream;
1818 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1819 profile_status_for_fn (fn));
1821 /* Output the number of the highest basic block. */
1822 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
1824 FOR_ALL_BB_FN (bb, fn)
1826 edge_iterator ei;
1827 edge e;
1829 streamer_write_hwi (ob, bb->index);
1831 /* Output the successors and the edge flags. */
1832 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
1833 FOR_EACH_EDGE (e, ei, bb->succs)
1835 streamer_write_uhwi (ob, e->dest->index);
1836 streamer_write_hwi (ob, e->probability);
1837 streamer_write_gcov_count (ob, e->count);
1838 streamer_write_uhwi (ob, e->flags);
1842 streamer_write_hwi (ob, -1);
1844 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1845 while (bb->next_bb)
1847 streamer_write_hwi (ob, bb->next_bb->index);
1848 bb = bb->next_bb;
1851 streamer_write_hwi (ob, -1);
1853 /* ??? The cfgloop interface is tied to cfun. */
1854 gcc_assert (cfun == fn);
1856 /* Output the number of loops. */
1857 streamer_write_uhwi (ob, number_of_loops (fn));
1859 /* Output each loop, skipping the tree root which has number zero. */
1860 for (unsigned i = 1; i < number_of_loops (fn); ++i)
1862 struct loop *loop = get_loop (fn, i);
1864 /* Write the index of the loop header. That's enough to rebuild
1865 the loop tree on the reader side. Stream -1 for an unused
1866 loop entry. */
1867 if (!loop)
1869 streamer_write_hwi (ob, -1);
1870 continue;
1872 else
1873 streamer_write_hwi (ob, loop->header->index);
1875 /* Write everything copy_loop_info copies. */
1876 streamer_write_enum (ob->main_stream,
1877 loop_estimation, EST_LAST, loop->estimate_state);
1878 streamer_write_hwi (ob, loop->any_upper_bound);
1879 if (loop->any_upper_bound)
1880 streamer_write_wi (ob, loop->nb_iterations_upper_bound);
1881 streamer_write_hwi (ob, loop->any_estimate);
1882 if (loop->any_estimate)
1883 streamer_write_wi (ob, loop->nb_iterations_estimate);
1885 /* Write OMP SIMD related info. */
1886 streamer_write_hwi (ob, loop->safelen);
1887 streamer_write_hwi (ob, loop->dont_vectorize);
1888 streamer_write_hwi (ob, loop->force_vectorize);
1889 stream_write_tree (ob, loop->simduid, true);
1892 ob->main_stream = tmp_stream;
1896 /* Create the header in the file using OB. If the section type is for
1897 a function, set FN to the decl for that function. */
1899 void
1900 produce_asm (struct output_block *ob, tree fn)
1902 enum lto_section_type section_type = ob->section_type;
1903 struct lto_function_header header;
1904 char *section_name;
1906 if (section_type == LTO_section_function_body)
1908 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1909 section_name = lto_get_section_name (section_type, name, NULL);
1911 else
1912 section_name = lto_get_section_name (section_type, NULL, NULL);
1914 lto_begin_section (section_name, !flag_wpa);
1915 free (section_name);
1917 /* The entire header is stream computed here. */
1918 memset (&header, 0, sizeof (struct lto_function_header));
1920 /* Write the header. */
1921 header.major_version = LTO_major_version;
1922 header.minor_version = LTO_minor_version;
1924 if (section_type == LTO_section_function_body)
1925 header.cfg_size = ob->cfg_stream->total_size;
1926 header.main_size = ob->main_stream->total_size;
1927 header.string_size = ob->string_stream->total_size;
1928 lto_write_data (&header, sizeof header);
1930 /* Put all of the gimple and the string table out the asm file as a
1931 block of text. */
1932 if (section_type == LTO_section_function_body)
1933 lto_write_stream (ob->cfg_stream);
1934 lto_write_stream (ob->main_stream);
1935 lto_write_stream (ob->string_stream);
1937 lto_end_section ();
1941 /* Output the base body of struct function FN using output block OB. */
1943 static void
1944 output_struct_function_base (struct output_block *ob, struct function *fn)
1946 struct bitpack_d bp;
1947 unsigned i;
1948 tree t;
1950 /* Output the static chain and non-local goto save area. */
1951 stream_write_tree (ob, fn->static_chain_decl, true);
1952 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
1954 /* Output all the local variables in the function. */
1955 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
1956 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
1957 stream_write_tree (ob, t, true);
1959 /* Output current IL state of the function. */
1960 streamer_write_uhwi (ob, fn->curr_properties);
1962 /* Write all the attributes for FN. */
1963 bp = bitpack_create (ob->main_stream);
1964 bp_pack_value (&bp, fn->is_thunk, 1);
1965 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
1966 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
1967 bp_pack_value (&bp, fn->returns_struct, 1);
1968 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
1969 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
1970 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
1971 bp_pack_value (&bp, fn->after_inlining, 1);
1972 bp_pack_value (&bp, fn->stdarg, 1);
1973 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
1974 bp_pack_value (&bp, fn->calls_alloca, 1);
1975 bp_pack_value (&bp, fn->calls_setjmp, 1);
1976 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
1977 bp_pack_value (&bp, fn->has_simduid_loops, 1);
1978 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
1979 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
1980 bp_pack_value (&bp, fn->last_clique, sizeof (short) * 8);
1982 /* Output the function start and end loci. */
1983 stream_output_location (ob, &bp, fn->function_start_locus);
1984 stream_output_location (ob, &bp, fn->function_end_locus);
1986 streamer_write_bitpack (&bp);
1990 /* Output the body of function NODE->DECL. */
1992 static void
1993 output_function (struct cgraph_node *node)
1995 tree function;
1996 struct function *fn;
1997 basic_block bb;
1998 struct output_block *ob;
2000 function = node->decl;
2001 fn = DECL_STRUCT_FUNCTION (function);
2002 ob = create_output_block (LTO_section_function_body);
2004 clear_line_info (ob);
2005 ob->symbol = node;
2007 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
2009 /* Set current_function_decl and cfun. */
2010 push_cfun (fn);
2012 /* Make string 0 be a NULL string. */
2013 streamer_write_char_stream (ob->string_stream, 0);
2015 streamer_write_record_start (ob, LTO_function);
2017 /* Output decls for parameters and args. */
2018 stream_write_tree (ob, DECL_RESULT (function), true);
2019 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
2021 /* Output DECL_INITIAL for the function, which contains the tree of
2022 lexical scopes. */
2023 stream_write_tree (ob, DECL_INITIAL (function), true);
2025 /* We also stream abstract functions where we stream only stuff needed for
2026 debug info. */
2027 if (gimple_has_body_p (function))
2029 streamer_write_uhwi (ob, 1);
2030 output_struct_function_base (ob, fn);
2032 /* Output all the SSA names used in the function. */
2033 output_ssa_names (ob, fn);
2035 /* Output any exception handling regions. */
2036 output_eh_regions (ob, fn);
2039 /* We will renumber the statements. The code that does this uses
2040 the same ordering that we use for serializing them so we can use
2041 the same code on the other end and not have to write out the
2042 statement numbers. We do not assign UIDs to PHIs here because
2043 virtual PHIs get re-computed on-the-fly which would make numbers
2044 inconsistent. */
2045 set_gimple_stmt_max_uid (cfun, 0);
2046 FOR_ALL_BB_FN (bb, cfun)
2048 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2049 gsi_next (&gsi))
2051 gphi *stmt = gsi.phi ();
2053 /* Virtual PHIs are not going to be streamed. */
2054 if (!virtual_operand_p (gimple_phi_result (stmt)))
2055 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
2057 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
2058 gsi_next (&gsi))
2060 gimple stmt = gsi_stmt (gsi);
2061 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
2064 /* To avoid keeping duplicate gimple IDs in the statements, renumber
2065 virtual phis now. */
2066 FOR_ALL_BB_FN (bb, cfun)
2068 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2069 gsi_next (&gsi))
2071 gphi *stmt = gsi.phi ();
2072 if (virtual_operand_p (gimple_phi_result (stmt)))
2073 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
2077 /* Output the code for the function. */
2078 FOR_ALL_BB_FN (bb, fn)
2079 output_bb (ob, bb, fn);
2081 /* The terminator for this function. */
2082 streamer_write_record_start (ob, LTO_null);
2084 output_cfg (ob, fn);
2086 pop_cfun ();
2088 else
2089 streamer_write_uhwi (ob, 0);
2091 /* Create a section to hold the pickled output of this function. */
2092 produce_asm (ob, function);
2094 destroy_output_block (ob);
2097 /* Output the body of function NODE->DECL. */
2099 static void
2100 output_constructor (struct varpool_node *node)
2102 tree var = node->decl;
2103 struct output_block *ob;
2105 ob = create_output_block (LTO_section_function_body);
2107 clear_line_info (ob);
2108 ob->symbol = node;
2110 /* Make string 0 be a NULL string. */
2111 streamer_write_char_stream (ob->string_stream, 0);
2113 /* Output DECL_INITIAL for the function, which contains the tree of
2114 lexical scopes. */
2115 stream_write_tree (ob, DECL_INITIAL (var), true);
2117 /* Create a section to hold the pickled output of this function. */
2118 produce_asm (ob, var);
2120 destroy_output_block (ob);
2124 /* Emit toplevel asms. */
2126 void
2127 lto_output_toplevel_asms (void)
2129 struct output_block *ob;
2130 struct asm_node *can;
2131 char *section_name;
2132 struct lto_simple_header_with_strings header;
2134 if (!symtab->first_asm_symbol ())
2135 return;
2137 ob = create_output_block (LTO_section_asm);
2139 /* Make string 0 be a NULL string. */
2140 streamer_write_char_stream (ob->string_stream, 0);
2142 for (can = symtab->first_asm_symbol (); can; can = can->next)
2144 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
2145 streamer_write_hwi (ob, can->order);
2148 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
2150 section_name = lto_get_section_name (LTO_section_asm, NULL, NULL);
2151 lto_begin_section (section_name, !flag_wpa);
2152 free (section_name);
2154 /* The entire header stream is computed here. */
2155 memset (&header, 0, sizeof (header));
2157 /* Write the header. */
2158 header.major_version = LTO_major_version;
2159 header.minor_version = LTO_minor_version;
2161 header.main_size = ob->main_stream->total_size;
2162 header.string_size = ob->string_stream->total_size;
2163 lto_write_data (&header, sizeof header);
2165 /* Put all of the gimple and the string table out the asm file as a
2166 block of text. */
2167 lto_write_stream (ob->main_stream);
2168 lto_write_stream (ob->string_stream);
2170 lto_end_section ();
2172 destroy_output_block (ob);
2176 /* Copy the function body or variable constructor of NODE without deserializing. */
2178 static void
2179 copy_function_or_variable (struct symtab_node *node)
2181 tree function = node->decl;
2182 struct lto_file_decl_data *file_data = node->lto_file_data;
2183 const char *data;
2184 size_t len;
2185 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
2186 char *section_name =
2187 lto_get_section_name (LTO_section_function_body, name, NULL);
2188 size_t i, j;
2189 struct lto_in_decl_state *in_state;
2190 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
2192 lto_begin_section (section_name, !flag_wpa);
2193 free (section_name);
2195 /* We may have renamed the declaration, e.g., a static function. */
2196 name = lto_get_decl_name_mapping (file_data, name);
2198 data = lto_get_section_data (file_data, LTO_section_function_body,
2199 name, &len);
2200 gcc_assert (data);
2202 /* Do a bit copy of the function body. */
2203 lto_write_data (data, len);
2205 /* Copy decls. */
2206 in_state =
2207 lto_get_function_in_decl_state (node->lto_file_data, function);
2208 gcc_assert (in_state);
2210 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2212 size_t n = vec_safe_length (in_state->streams[i]);
2213 vec<tree, va_gc> *trees = in_state->streams[i];
2214 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2216 /* The out state must have the same indices and the in state.
2217 So just copy the vector. All the encoders in the in state
2218 must be empty where we reach here. */
2219 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2220 encoder->trees.reserve_exact (n);
2221 for (j = 0; j < n; j++)
2222 encoder->trees.safe_push ((*trees)[j]);
2225 lto_free_section_data (file_data, LTO_section_function_body, name,
2226 data, len);
2227 lto_end_section ();
2230 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2232 static tree
2233 wrap_refs (tree *tp, int *ws, void *)
2235 tree t = *tp;
2236 if (handled_component_p (t)
2237 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL)
2239 tree decl = TREE_OPERAND (t, 0);
2240 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2241 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2242 build1 (ADDR_EXPR, ptrtype, decl),
2243 build_int_cst (ptrtype, 0));
2244 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2245 *ws = 0;
2247 else if (TREE_CODE (t) == CONSTRUCTOR)
2249 else if (!EXPR_P (t))
2250 *ws = 0;
2251 return NULL_TREE;
2254 /* Main entry point from the pass manager. */
2256 void
2257 lto_output (void)
2259 struct lto_out_decl_state *decl_state;
2260 #ifdef ENABLE_CHECKING
2261 bitmap output = lto_bitmap_alloc ();
2262 #endif
2263 int i, n_nodes;
2264 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
2266 /* Initialize the streamer. */
2267 lto_streamer_init ();
2269 n_nodes = lto_symtab_encoder_size (encoder);
2270 /* Process only the functions with bodies. */
2271 for (i = 0; i < n_nodes; i++)
2273 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
2274 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
2276 if (lto_symtab_encoder_encode_body_p (encoder, node)
2277 && !node->alias)
2279 #ifdef ENABLE_CHECKING
2280 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2281 bitmap_set_bit (output, DECL_UID (node->decl));
2282 #endif
2283 decl_state = lto_new_out_decl_state ();
2284 lto_push_out_decl_state (decl_state);
2285 if (gimple_has_body_p (node->decl) || !flag_wpa
2286 /* Thunks have no body but they may be synthetized
2287 at WPA time. */
2288 || DECL_ARGUMENTS (node->decl))
2289 output_function (node);
2290 else
2291 copy_function_or_variable (node);
2292 gcc_assert (lto_get_out_decl_state () == decl_state);
2293 lto_pop_out_decl_state ();
2294 lto_record_function_out_decl_state (node->decl, decl_state);
2297 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
2299 /* Wrap symbol references inside the ctor in a type
2300 preserving MEM_REF. */
2301 tree ctor = DECL_INITIAL (node->decl);
2302 if (ctor && !in_lto_p)
2303 walk_tree (&ctor, wrap_refs, NULL, NULL);
2304 if (get_symbol_initial_value (encoder, node->decl) == error_mark_node
2305 && lto_symtab_encoder_encode_initializer_p (encoder, node)
2306 && !node->alias)
2308 timevar_push (TV_IPA_LTO_CTORS_OUT);
2309 #ifdef ENABLE_CHECKING
2310 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2311 bitmap_set_bit (output, DECL_UID (node->decl));
2312 #endif
2313 decl_state = lto_new_out_decl_state ();
2314 lto_push_out_decl_state (decl_state);
2315 if (DECL_INITIAL (node->decl) != error_mark_node
2316 || !flag_wpa)
2317 output_constructor (node);
2318 else
2319 copy_function_or_variable (node);
2320 gcc_assert (lto_get_out_decl_state () == decl_state);
2321 lto_pop_out_decl_state ();
2322 lto_record_function_out_decl_state (node->decl, decl_state);
2323 timevar_pop (TV_IPA_LTO_CTORS_OUT);
2328 /* Emit the callgraph after emitting function bodies. This needs to
2329 be done now to make sure that all the statements in every function
2330 have been renumbered so that edges can be associated with call
2331 statements using the statement UIDs. */
2332 output_symtab ();
2334 output_offload_tables ();
2336 #ifdef ENABLE_CHECKING
2337 lto_bitmap_free (output);
2338 #endif
2341 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2342 from it and required for correct representation of its semantics.
2343 Each node in ENCODER must be a global declaration or a type. A node
2344 is written only once, even if it appears multiple times in the
2345 vector. Certain transitively-reachable nodes, such as those
2346 representing expressions, may be duplicated, but such nodes
2347 must not appear in ENCODER itself. */
2349 static void
2350 write_global_stream (struct output_block *ob,
2351 struct lto_tree_ref_encoder *encoder)
2353 tree t;
2354 size_t index;
2355 const size_t size = lto_tree_ref_encoder_size (encoder);
2357 for (index = 0; index < size; index++)
2359 t = lto_tree_ref_encoder_get_tree (encoder, index);
2360 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2361 stream_write_tree (ob, t, false);
2366 /* Write a sequence of indices into the globals vector corresponding
2367 to the trees in ENCODER. These are used by the reader to map the
2368 indices used to refer to global entities within function bodies to
2369 their referents. */
2371 static void
2372 write_global_references (struct output_block *ob,
2373 struct lto_tree_ref_encoder *encoder)
2375 tree t;
2376 uint32_t index;
2377 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2379 /* Write size and slot indexes as 32-bit unsigned numbers. */
2380 uint32_t *data = XNEWVEC (uint32_t, size + 1);
2381 data[0] = size;
2383 for (index = 0; index < size; index++)
2385 uint32_t slot_num;
2387 t = lto_tree_ref_encoder_get_tree (encoder, index);
2388 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2389 gcc_assert (slot_num != (unsigned)-1);
2390 data[index + 1] = slot_num;
2393 lto_write_data (data, sizeof (int32_t) * (size + 1));
2394 free (data);
2398 /* Write all the streams in an lto_out_decl_state STATE using
2399 output block OB and output stream OUT_STREAM. */
2401 void
2402 lto_output_decl_state_streams (struct output_block *ob,
2403 struct lto_out_decl_state *state)
2405 int i;
2407 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2408 write_global_stream (ob, &state->streams[i]);
2412 /* Write all the references in an lto_out_decl_state STATE using
2413 output block OB and output stream OUT_STREAM. */
2415 void
2416 lto_output_decl_state_refs (struct output_block *ob,
2417 struct lto_out_decl_state *state)
2419 unsigned i;
2420 uint32_t ref;
2421 tree decl;
2423 /* Write reference to FUNCTION_DECL. If there is not function,
2424 write reference to void_type_node. */
2425 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2426 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2427 gcc_assert (ref != (unsigned)-1);
2428 lto_write_data (&ref, sizeof (uint32_t));
2430 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2431 write_global_references (ob, &state->streams[i]);
2435 /* Return the written size of STATE. */
2437 static size_t
2438 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2440 int i;
2441 size_t size;
2443 size = sizeof (int32_t); /* fn_ref. */
2444 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2446 size += sizeof (int32_t); /* vector size. */
2447 size += (lto_tree_ref_encoder_size (&state->streams[i])
2448 * sizeof (int32_t));
2450 return size;
2454 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2455 so far. */
2457 static void
2458 write_symbol (struct streamer_tree_cache_d *cache,
2459 tree t, hash_set<const char *> *seen, bool alias)
2461 const char *name;
2462 enum gcc_plugin_symbol_kind kind;
2463 enum gcc_plugin_symbol_visibility visibility = GCCPV_DEFAULT;
2464 unsigned slot_num;
2465 uint64_t size;
2466 const char *comdat;
2467 unsigned char c;
2469 /* None of the following kinds of symbols are needed in the
2470 symbol table. */
2471 if (!TREE_PUBLIC (t)
2472 || is_builtin_fn (t)
2473 || DECL_ABSTRACT_P (t)
2474 || (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)))
2475 return;
2476 gcc_assert (TREE_CODE (t) != RESULT_DECL);
2478 gcc_assert (TREE_CODE (t) == VAR_DECL
2479 || TREE_CODE (t) == FUNCTION_DECL);
2481 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2483 /* This behaves like assemble_name_raw in varasm.c, performing the
2484 same name manipulations that ASM_OUTPUT_LABELREF does. */
2485 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2487 if (seen->add (name))
2488 return;
2490 streamer_tree_cache_lookup (cache, t, &slot_num);
2491 gcc_assert (slot_num != (unsigned)-1);
2493 if (DECL_EXTERNAL (t))
2495 if (DECL_WEAK (t))
2496 kind = GCCPK_WEAKUNDEF;
2497 else
2498 kind = GCCPK_UNDEF;
2500 else
2502 if (DECL_WEAK (t))
2503 kind = GCCPK_WEAKDEF;
2504 else if (DECL_COMMON (t))
2505 kind = GCCPK_COMMON;
2506 else
2507 kind = GCCPK_DEF;
2509 /* When something is defined, it should have node attached. */
2510 gcc_assert (alias || TREE_CODE (t) != VAR_DECL
2511 || varpool_node::get (t)->definition);
2512 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2513 || (cgraph_node::get (t)
2514 && cgraph_node::get (t)->definition));
2517 /* Imitate what default_elf_asm_output_external do.
2518 When symbol is external, we need to output it with DEFAULT visibility
2519 when compiling with -fvisibility=default, while with HIDDEN visibility
2520 when symbol has attribute (visibility("hidden")) specified.
2521 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2522 right. */
2524 if (DECL_EXTERNAL (t)
2525 && !targetm.binds_local_p (t))
2526 visibility = GCCPV_DEFAULT;
2527 else
2528 switch (DECL_VISIBILITY (t))
2530 case VISIBILITY_DEFAULT:
2531 visibility = GCCPV_DEFAULT;
2532 break;
2533 case VISIBILITY_PROTECTED:
2534 visibility = GCCPV_PROTECTED;
2535 break;
2536 case VISIBILITY_HIDDEN:
2537 visibility = GCCPV_HIDDEN;
2538 break;
2539 case VISIBILITY_INTERNAL:
2540 visibility = GCCPV_INTERNAL;
2541 break;
2544 if (kind == GCCPK_COMMON
2545 && DECL_SIZE_UNIT (t)
2546 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
2547 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2548 else
2549 size = 0;
2551 if (DECL_ONE_ONLY (t))
2552 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
2553 else
2554 comdat = "";
2556 lto_write_data (name, strlen (name) + 1);
2557 lto_write_data (comdat, strlen (comdat) + 1);
2558 c = (unsigned char) kind;
2559 lto_write_data (&c, 1);
2560 c = (unsigned char) visibility;
2561 lto_write_data (&c, 1);
2562 lto_write_data (&size, 8);
2563 lto_write_data (&slot_num, 4);
2566 /* Return true if NODE should appear in the plugin symbol table. */
2568 bool
2569 output_symbol_p (symtab_node *node)
2571 struct cgraph_node *cnode;
2572 if (!node->real_symbol_p ())
2573 return false;
2574 /* We keep external functions in symtab for sake of inlining
2575 and devirtualization. We do not want to see them in symbol table as
2576 references unless they are really used. */
2577 cnode = dyn_cast <cgraph_node *> (node);
2578 if (cnode && (!node->definition || DECL_EXTERNAL (cnode->decl))
2579 && cnode->callers)
2580 return true;
2582 /* Ignore all references from external vars initializers - they are not really
2583 part of the compilation unit until they are used by folding. Some symbols,
2584 like references to external construction vtables can not be referred to at all.
2585 We decide this at can_refer_decl_in_current_unit_p. */
2586 if (!node->definition || DECL_EXTERNAL (node->decl))
2588 int i;
2589 struct ipa_ref *ref;
2590 for (i = 0; node->iterate_referring (i, ref); i++)
2592 if (ref->use == IPA_REF_ALIAS)
2593 continue;
2594 if (is_a <cgraph_node *> (ref->referring))
2595 return true;
2596 if (!DECL_EXTERNAL (ref->referring->decl))
2597 return true;
2599 return false;
2601 return true;
2605 /* Write an IL symbol table to OB.
2606 SET and VSET are cgraph/varpool node sets we are outputting. */
2608 static void
2609 produce_symtab (struct output_block *ob)
2611 struct streamer_tree_cache_d *cache = ob->writer_cache;
2612 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
2613 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2614 lto_symtab_encoder_iterator lsei;
2616 lto_begin_section (section_name, false);
2617 free (section_name);
2619 hash_set<const char *> seen;
2621 /* Write the symbol table.
2622 First write everything defined and then all declarations.
2623 This is necessary to handle cases where we have duplicated symbols. */
2624 for (lsei = lsei_start (encoder);
2625 !lsei_end_p (lsei); lsei_next (&lsei))
2627 symtab_node *node = lsei_node (lsei);
2629 if (!output_symbol_p (node) || DECL_EXTERNAL (node->decl))
2630 continue;
2631 write_symbol (cache, node->decl, &seen, false);
2633 for (lsei = lsei_start (encoder);
2634 !lsei_end_p (lsei); lsei_next (&lsei))
2636 symtab_node *node = lsei_node (lsei);
2638 if (!output_symbol_p (node) || !DECL_EXTERNAL (node->decl))
2639 continue;
2640 write_symbol (cache, node->decl, &seen, false);
2643 lto_end_section ();
2647 /* This pass is run after all of the functions are serialized and all
2648 of the IPA passes have written their serialized forms. This pass
2649 causes the vector of all of the global decls and types used from
2650 this file to be written in to a section that can then be read in to
2651 recover these on other side. */
2653 void
2654 produce_asm_for_decls (void)
2656 struct lto_out_decl_state *out_state;
2657 struct lto_out_decl_state *fn_out_state;
2658 struct lto_decl_header header;
2659 char *section_name;
2660 struct output_block *ob;
2661 unsigned idx, num_fns;
2662 size_t decl_state_size;
2663 int32_t num_decl_states;
2665 ob = create_output_block (LTO_section_decls);
2667 memset (&header, 0, sizeof (struct lto_decl_header));
2669 section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
2670 lto_begin_section (section_name, !flag_wpa);
2671 free (section_name);
2673 /* Make string 0 be a NULL string. */
2674 streamer_write_char_stream (ob->string_stream, 0);
2676 gcc_assert (!alias_pairs);
2678 /* Get rid of the global decl state hash tables to save some memory. */
2679 out_state = lto_get_out_decl_state ();
2680 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
2681 if (out_state->streams[i].tree_hash_table)
2683 delete out_state->streams[i].tree_hash_table;
2684 out_state->streams[i].tree_hash_table = NULL;
2687 /* Write the global symbols. */
2688 lto_output_decl_state_streams (ob, out_state);
2689 num_fns = lto_function_decl_states.length ();
2690 for (idx = 0; idx < num_fns; idx++)
2692 fn_out_state =
2693 lto_function_decl_states[idx];
2694 lto_output_decl_state_streams (ob, fn_out_state);
2697 header.major_version = LTO_major_version;
2698 header.minor_version = LTO_minor_version;
2700 /* Currently not used. This field would allow us to preallocate
2701 the globals vector, so that it need not be resized as it is extended. */
2702 header.num_nodes = -1;
2704 /* Compute the total size of all decl out states. */
2705 decl_state_size = sizeof (int32_t);
2706 decl_state_size += lto_out_decl_state_written_size (out_state);
2707 for (idx = 0; idx < num_fns; idx++)
2709 fn_out_state =
2710 lto_function_decl_states[idx];
2711 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2713 header.decl_state_size = decl_state_size;
2715 header.main_size = ob->main_stream->total_size;
2716 header.string_size = ob->string_stream->total_size;
2718 lto_write_data (&header, sizeof header);
2720 /* Write the main out-decl state, followed by out-decl states of
2721 functions. */
2722 num_decl_states = num_fns + 1;
2723 lto_write_data (&num_decl_states, sizeof (num_decl_states));
2724 lto_output_decl_state_refs (ob, out_state);
2725 for (idx = 0; idx < num_fns; idx++)
2727 fn_out_state = lto_function_decl_states[idx];
2728 lto_output_decl_state_refs (ob, fn_out_state);
2731 lto_write_stream (ob->main_stream);
2732 lto_write_stream (ob->string_stream);
2734 lto_end_section ();
2736 /* Write the symbol table. It is used by linker to determine dependencies
2737 and thus we can skip it for WPA. */
2738 if (!flag_wpa)
2739 produce_symtab (ob);
2741 /* Write command line opts. */
2742 lto_write_options ();
2744 /* Deallocate memory and clean up. */
2745 for (idx = 0; idx < num_fns; idx++)
2747 fn_out_state =
2748 lto_function_decl_states[idx];
2749 lto_delete_out_decl_state (fn_out_state);
2751 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
2752 lto_function_decl_states.release ();
2753 destroy_output_block (ob);