compiler: Do not declare type switch variable outside case statements.
[official-gcc.git] / gcc / lto-streamer-out.c
blob671bac3806bbda94cb7c3390b96ebe468976ef74
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 streamer_write_tree_bitfields (ob, expr);
390 /* Write all the pointer fields in EXPR. */
391 streamer_write_tree_body (ob, expr, ref_p);
393 /* Write any LTO-specific data to OB. */
394 if (DECL_P (expr)
395 && TREE_CODE (expr) != FUNCTION_DECL
396 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
398 /* Handle DECL_INITIAL for symbols. */
399 tree initial = get_symbol_initial_value
400 (ob->decl_state->symtab_node_encoder, expr);
401 stream_write_tree (ob, initial, ref_p);
405 /* Write a physical representation of tree node EXPR to output block
406 OB. If REF_P is true, the leaves of EXPR are emitted as references
407 via lto_output_tree_ref. IX is the index into the streamer cache
408 where EXPR is stored. */
410 static void
411 lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
413 if (!lto_is_streamable (expr))
414 internal_error ("tree code %qs is not supported in LTO streams",
415 get_tree_code_name (TREE_CODE (expr)));
417 /* Write the header, containing everything needed to materialize
418 EXPR on the reading side. */
419 streamer_write_tree_header (ob, expr);
421 lto_write_tree_1 (ob, expr, ref_p);
423 /* Mark the end of EXPR. */
424 streamer_write_zero (ob);
427 /* Emit the physical representation of tree node EXPR to output block
428 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
429 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
431 static void
432 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
433 bool ref_p, bool this_ref_p)
435 unsigned ix;
437 gcc_checking_assert (expr != NULL_TREE
438 && !(this_ref_p && tree_is_indexable (expr)));
440 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
441 expr, hash, &ix);
442 gcc_assert (!exists_p);
443 if (streamer_handle_as_builtin_p (expr))
445 /* MD and NORMAL builtins do not need to be written out
446 completely as they are always instantiated by the
447 compiler on startup. The only builtins that need to
448 be written out are BUILT_IN_FRONTEND. For all other
449 builtins, we simply write the class and code. */
450 streamer_write_builtin (ob, expr);
452 else if (TREE_CODE (expr) == INTEGER_CST
453 && !TREE_OVERFLOW (expr))
455 /* Shared INTEGER_CST nodes are special because they need their
456 original type to be materialized by the reader (to implement
457 TYPE_CACHED_VALUES). */
458 streamer_write_integer_cst (ob, expr, ref_p);
460 else
462 /* This is the first time we see EXPR, write its fields
463 to OB. */
464 lto_write_tree (ob, expr, ref_p);
468 class DFS
470 public:
471 DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
472 bool single_p);
473 ~DFS ();
475 struct scc_entry
477 tree t;
478 hashval_t hash;
480 vec<scc_entry> sccstack;
482 private:
483 struct sccs
485 unsigned int dfsnum;
486 unsigned int low;
489 static int scc_entry_compare (const void *, const void *);
491 void DFS_write_tree_body (struct output_block *ob,
492 tree expr, sccs *expr_state, bool ref_p,
493 bool single_p);
495 void DFS_write_tree (struct output_block *ob, sccs *from_state,
496 tree expr, bool ref_p, bool this_ref_p,
497 bool single_p);
498 hashval_t
499 hash_scc (struct output_block *ob, unsigned first, unsigned size);
501 unsigned int next_dfs_num;
502 hash_map<tree, sccs *> sccstate;
503 struct obstack sccstate_obstack;
506 DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
507 bool single_p)
509 sccstack.create (0);
510 gcc_obstack_init (&sccstate_obstack);
511 next_dfs_num = 1;
512 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p, single_p);
515 DFS::~DFS ()
517 sccstack.release ();
518 obstack_free (&sccstate_obstack, NULL);
521 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
522 DFS recurse for all tree edges originating from it. */
524 void
525 DFS::DFS_write_tree_body (struct output_block *ob,
526 tree expr, sccs *expr_state, bool ref_p,
527 bool single_p)
529 #define DFS_follow_tree_edge(DEST) \
530 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p, single_p)
532 enum tree_code code;
534 code = TREE_CODE (expr);
536 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
538 if (TREE_CODE (expr) != IDENTIFIER_NODE)
539 DFS_follow_tree_edge (TREE_TYPE (expr));
542 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
544 for (unsigned i = 0; i < VECTOR_CST_NELTS (expr); ++i)
545 DFS_follow_tree_edge (VECTOR_CST_ELT (expr, i));
548 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
550 DFS_follow_tree_edge (TREE_REALPART (expr));
551 DFS_follow_tree_edge (TREE_IMAGPART (expr));
554 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
556 /* Drop names that were created for anonymous entities. */
557 if (DECL_NAME (expr)
558 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
559 && ANON_AGGRNAME_P (DECL_NAME (expr)))
561 else
562 DFS_follow_tree_edge (DECL_NAME (expr));
563 DFS_follow_tree_edge (DECL_CONTEXT (expr));
566 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
568 DFS_follow_tree_edge (DECL_SIZE (expr));
569 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
571 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
572 special handling in LTO, it must be handled by streamer hooks. */
574 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
576 /* Do not follow DECL_ABSTRACT_ORIGIN. We cannot handle debug information
577 for early inlining so drop it on the floor instead of ICEing in
578 dwarf2out.c. */
580 if ((TREE_CODE (expr) == VAR_DECL
581 || TREE_CODE (expr) == PARM_DECL)
582 && DECL_HAS_VALUE_EXPR_P (expr))
583 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
584 if (TREE_CODE (expr) == VAR_DECL)
585 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
588 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
590 if (TREE_CODE (expr) == TYPE_DECL)
591 DFS_follow_tree_edge (DECL_ORIGINAL_TYPE (expr));
594 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
596 /* Make sure we don't inadvertently set the assembler name. */
597 if (DECL_ASSEMBLER_NAME_SET_P (expr))
598 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
601 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
603 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
604 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
605 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
606 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
607 DFS_follow_tree_edge (DECL_FCONTEXT (expr));
610 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
612 DFS_follow_tree_edge (DECL_VINDEX (expr));
613 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
614 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr));
615 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
618 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
620 DFS_follow_tree_edge (TYPE_SIZE (expr));
621 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
622 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
623 DFS_follow_tree_edge (TYPE_NAME (expr));
624 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
625 reconstructed during fixup. */
626 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
627 during fixup. */
628 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
629 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
630 /* TYPE_CANONICAL is re-computed during type merging, so no need
631 to follow it here. */
632 DFS_follow_tree_edge (TYPE_STUB_DECL (expr));
635 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
637 if (TREE_CODE (expr) == ENUMERAL_TYPE)
638 DFS_follow_tree_edge (TYPE_VALUES (expr));
639 else if (TREE_CODE (expr) == ARRAY_TYPE)
640 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
641 else if (RECORD_OR_UNION_TYPE_P (expr))
642 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
643 DFS_follow_tree_edge (t);
644 else if (TREE_CODE (expr) == FUNCTION_TYPE
645 || TREE_CODE (expr) == METHOD_TYPE)
646 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
648 if (!POINTER_TYPE_P (expr))
649 DFS_follow_tree_edge (TYPE_MINVAL (expr));
650 DFS_follow_tree_edge (TYPE_MAXVAL (expr));
651 if (RECORD_OR_UNION_TYPE_P (expr))
652 DFS_follow_tree_edge (TYPE_BINFO (expr));
655 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
657 DFS_follow_tree_edge (TREE_PURPOSE (expr));
658 DFS_follow_tree_edge (TREE_VALUE (expr));
659 DFS_follow_tree_edge (TREE_CHAIN (expr));
662 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
664 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
665 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
668 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
670 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
671 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
672 DFS_follow_tree_edge (TREE_BLOCK (expr));
675 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
677 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
678 if (VAR_OR_FUNCTION_DECL_P (t)
679 && DECL_EXTERNAL (t))
680 /* We have to stream externals in the block chain as
681 non-references. See also
682 tree-streamer-out.c:streamer_write_chain. */
683 DFS_write_tree (ob, expr_state, t, ref_p, false, single_p);
684 else
685 DFS_follow_tree_edge (t);
687 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
689 /* Follow BLOCK_ABSTRACT_ORIGIN for the limited cases we can
690 handle - those that represent inlined function scopes.
691 For the drop rest them on the floor instead of ICEing
692 in dwarf2out.c. */
693 if (inlined_function_outer_scope_p (expr))
695 tree ultimate_origin = block_ultimate_origin (expr);
696 DFS_follow_tree_edge (ultimate_origin);
698 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
699 information for early inlined BLOCKs so drop it on the floor instead
700 of ICEing in dwarf2out.c. */
702 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
703 streaming time. */
705 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
706 list is re-constructed from BLOCK_SUPERCONTEXT. */
709 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
711 unsigned i;
712 tree t;
714 /* Note that the number of BINFO slots has already been emitted in
715 EXPR's header (see streamer_write_tree_header) because this length
716 is needed to build the empty BINFO node on the reader side. */
717 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
718 DFS_follow_tree_edge (t);
719 DFS_follow_tree_edge (BINFO_OFFSET (expr));
720 DFS_follow_tree_edge (BINFO_VTABLE (expr));
721 DFS_follow_tree_edge (BINFO_VPTR_FIELD (expr));
723 /* The number of BINFO_BASE_ACCESSES has already been emitted in
724 EXPR's bitfield section. */
725 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
726 DFS_follow_tree_edge (t);
728 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
729 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
732 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
734 unsigned i;
735 tree index, value;
737 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
739 DFS_follow_tree_edge (index);
740 DFS_follow_tree_edge (value);
744 if (code == OMP_CLAUSE)
746 int i;
747 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
748 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
749 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
752 #undef DFS_follow_tree_edge
755 /* Return a hash value for the tree T.
756 CACHE holds hash values of trees outside current SCC. MAP, if non-NULL,
757 may hold hash values if trees inside current SCC. */
759 static hashval_t
760 hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map, tree t)
762 inchash::hash hstate;
764 #define visit(SIBLING) \
765 do { \
766 unsigned ix; \
767 if (!SIBLING) \
768 hstate.add_int (0); \
769 else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
770 hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \
771 else if (map) \
772 hstate.add_int (*map->get (SIBLING)); \
773 else \
774 hstate.add_int (1); \
775 } while (0)
777 /* Hash TS_BASE. */
778 enum tree_code code = TREE_CODE (t);
779 hstate.add_int (code);
780 if (!TYPE_P (t))
782 hstate.add_flag (TREE_SIDE_EFFECTS (t));
783 hstate.add_flag (TREE_CONSTANT (t));
784 hstate.add_flag (TREE_READONLY (t));
785 hstate.add_flag (TREE_PUBLIC (t));
787 hstate.add_flag (TREE_ADDRESSABLE (t));
788 hstate.add_flag (TREE_THIS_VOLATILE (t));
789 if (DECL_P (t))
790 hstate.add_flag (DECL_UNSIGNED (t));
791 else if (TYPE_P (t))
792 hstate.add_flag (TYPE_UNSIGNED (t));
793 if (TYPE_P (t))
794 hstate.add_flag (TYPE_ARTIFICIAL (t));
795 else
796 hstate.add_flag (TREE_NO_WARNING (t));
797 hstate.add_flag (TREE_NOTHROW (t));
798 hstate.add_flag (TREE_STATIC (t));
799 hstate.add_flag (TREE_PROTECTED (t));
800 hstate.add_flag (TREE_DEPRECATED (t));
801 if (code != TREE_BINFO)
802 hstate.add_flag (TREE_PRIVATE (t));
803 if (TYPE_P (t))
805 hstate.add_flag (TYPE_SATURATING (t));
806 hstate.add_flag (TYPE_ADDR_SPACE (t));
808 else if (code == SSA_NAME)
809 hstate.add_flag (SSA_NAME_IS_DEFAULT_DEF (t));
810 hstate.commit_flag ();
812 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
814 int i;
815 hstate.add_wide_int (TREE_INT_CST_NUNITS (t));
816 hstate.add_wide_int (TREE_INT_CST_EXT_NUNITS (t));
817 for (i = 0; i < TREE_INT_CST_NUNITS (t); i++)
818 hstate.add_wide_int (TREE_INT_CST_ELT (t, i));
821 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
823 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
824 hstate.add_flag (r.cl);
825 hstate.add_flag (r.sign);
826 hstate.add_flag (r.signalling);
827 hstate.add_flag (r.canonical);
828 hstate.commit_flag ();
829 hstate.add_int (r.uexp);
830 hstate.add (r.sig, sizeof (r.sig));
833 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
835 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
836 hstate.add_int (f.mode);
837 hstate.add_int (f.data.low);
838 hstate.add_int (f.data.high);
841 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
843 hstate.add_wide_int (DECL_MODE (t));
844 hstate.add_flag (DECL_NONLOCAL (t));
845 hstate.add_flag (DECL_VIRTUAL_P (t));
846 hstate.add_flag (DECL_IGNORED_P (t));
847 hstate.add_flag (DECL_ABSTRACT_P (t));
848 hstate.add_flag (DECL_ARTIFICIAL (t));
849 hstate.add_flag (DECL_USER_ALIGN (t));
850 hstate.add_flag (DECL_PRESERVE_P (t));
851 hstate.add_flag (DECL_EXTERNAL (t));
852 hstate.add_flag (DECL_GIMPLE_REG_P (t));
853 hstate.commit_flag ();
854 hstate.add_int (DECL_ALIGN (t));
855 if (code == LABEL_DECL)
857 hstate.add_int (EH_LANDING_PAD_NR (t));
858 hstate.add_int (LABEL_DECL_UID (t));
860 else if (code == FIELD_DECL)
862 hstate.add_flag (DECL_PACKED (t));
863 hstate.add_flag (DECL_NONADDRESSABLE_P (t));
864 hstate.add_int (DECL_OFFSET_ALIGN (t));
866 else if (code == VAR_DECL)
868 hstate.add_flag (DECL_HAS_DEBUG_EXPR_P (t));
869 hstate.add_flag (DECL_NONLOCAL_FRAME (t));
871 if (code == RESULT_DECL
872 || code == PARM_DECL
873 || code == VAR_DECL)
875 hstate.add_flag (DECL_BY_REFERENCE (t));
876 if (code == VAR_DECL
877 || code == PARM_DECL)
878 hstate.add_flag (DECL_HAS_VALUE_EXPR_P (t));
880 hstate.commit_flag ();
883 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
884 hstate.add_int (DECL_REGISTER (t));
886 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
888 hstate.add_flag (DECL_COMMON (t));
889 hstate.add_flag (DECL_DLLIMPORT_P (t));
890 hstate.add_flag (DECL_WEAK (t));
891 hstate.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t));
892 hstate.add_flag (DECL_COMDAT (t));
893 hstate.add_flag (DECL_VISIBILITY_SPECIFIED (t));
894 hstate.add_int (DECL_VISIBILITY (t));
895 if (code == VAR_DECL)
897 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
898 hstate.add_flag (DECL_HARD_REGISTER (t));
899 hstate.add_flag (DECL_IN_CONSTANT_POOL (t));
901 if (TREE_CODE (t) == FUNCTION_DECL)
903 hstate.add_flag (DECL_FINAL_P (t));
904 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (t));
905 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (t));
907 hstate.commit_flag ();
910 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
912 hstate.add_int (DECL_BUILT_IN_CLASS (t));
913 hstate.add_flag (DECL_STATIC_CONSTRUCTOR (t));
914 hstate.add_flag (DECL_STATIC_DESTRUCTOR (t));
915 hstate.add_flag (DECL_UNINLINABLE (t));
916 hstate.add_flag (DECL_POSSIBLY_INLINED (t));
917 hstate.add_flag (DECL_IS_NOVOPS (t));
918 hstate.add_flag (DECL_IS_RETURNS_TWICE (t));
919 hstate.add_flag (DECL_IS_MALLOC (t));
920 hstate.add_flag (DECL_IS_OPERATOR_NEW (t));
921 hstate.add_flag (DECL_DECLARED_INLINE_P (t));
922 hstate.add_flag (DECL_STATIC_CHAIN (t));
923 hstate.add_flag (DECL_NO_INLINE_WARNING_P (t));
924 hstate.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t));
925 hstate.add_flag (DECL_NO_LIMIT_STACK (t));
926 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (t));
927 hstate.add_flag (DECL_PURE_P (t));
928 hstate.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t));
929 hstate.commit_flag ();
930 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
931 hstate.add_int (DECL_FUNCTION_CODE (t));
934 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
936 hstate.add_wide_int (TYPE_MODE (t));
937 hstate.add_flag (TYPE_STRING_FLAG (t));
938 hstate.add_flag (TYPE_NO_FORCE_BLK (t));
939 hstate.add_flag (TYPE_NEEDS_CONSTRUCTING (t));
940 hstate.add_flag (TYPE_PACKED (t));
941 hstate.add_flag (TYPE_RESTRICT (t));
942 hstate.add_flag (TYPE_USER_ALIGN (t));
943 hstate.add_flag (TYPE_READONLY (t));
944 if (RECORD_OR_UNION_TYPE_P (t))
946 hstate.add_flag (TYPE_TRANSPARENT_AGGR (t));
947 hstate.add_flag (TYPE_FINAL_P (t));
949 else if (code == ARRAY_TYPE)
950 hstate.add_flag (TYPE_NONALIASED_COMPONENT (t));
951 hstate.commit_flag ();
952 hstate.add_int (TYPE_PRECISION (t));
953 hstate.add_int (TYPE_ALIGN (t));
954 hstate.add_int ((TYPE_ALIAS_SET (t) == 0
955 || (!in_lto_p
956 && get_alias_set (t) == 0))
957 ? 0 : -1);
960 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
961 hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
962 strlen (TRANSLATION_UNIT_LANGUAGE (t)));
964 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
965 /* We don't stream these when passing things to a different target. */
966 && !lto_stream_offload_p)
967 hstate.add_wide_int (cl_target_option_hash (TREE_TARGET_OPTION (t)));
969 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
970 hstate.add_wide_int (cl_optimization_hash (TREE_OPTIMIZATION (t)));
972 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
973 hstate.merge_hash (IDENTIFIER_HASH_VALUE (t));
975 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
976 hstate.add (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t));
978 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
980 if (code != IDENTIFIER_NODE)
981 visit (TREE_TYPE (t));
984 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
985 for (unsigned i = 0; i < VECTOR_CST_NELTS (t); ++i)
986 visit (VECTOR_CST_ELT (t, i));
988 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
990 visit (TREE_REALPART (t));
991 visit (TREE_IMAGPART (t));
994 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
996 /* Drop names that were created for anonymous entities. */
997 if (DECL_NAME (t)
998 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
999 && ANON_AGGRNAME_P (DECL_NAME (t)))
1001 else
1002 visit (DECL_NAME (t));
1003 if (DECL_FILE_SCOPE_P (t))
1005 else
1006 visit (DECL_CONTEXT (t));
1009 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1011 visit (DECL_SIZE (t));
1012 visit (DECL_SIZE_UNIT (t));
1013 visit (DECL_ATTRIBUTES (t));
1014 if ((code == VAR_DECL
1015 || code == PARM_DECL)
1016 && DECL_HAS_VALUE_EXPR_P (t))
1017 visit (DECL_VALUE_EXPR (t));
1018 if (code == VAR_DECL
1019 && DECL_HAS_DEBUG_EXPR_P (t))
1020 visit (DECL_DEBUG_EXPR (t));
1021 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
1022 be able to call get_symbol_initial_value. */
1025 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
1027 if (code == TYPE_DECL)
1028 visit (DECL_ORIGINAL_TYPE (t));
1031 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1033 if (DECL_ASSEMBLER_NAME_SET_P (t))
1034 visit (DECL_ASSEMBLER_NAME (t));
1037 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1039 visit (DECL_FIELD_OFFSET (t));
1040 visit (DECL_BIT_FIELD_TYPE (t));
1041 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
1042 visit (DECL_FIELD_BIT_OFFSET (t));
1043 visit (DECL_FCONTEXT (t));
1046 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1048 visit (DECL_VINDEX (t));
1049 visit (DECL_FUNCTION_PERSONALITY (t));
1050 visit (DECL_FUNCTION_SPECIFIC_TARGET (t));
1051 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
1054 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1056 visit (TYPE_SIZE (t));
1057 visit (TYPE_SIZE_UNIT (t));
1058 visit (TYPE_ATTRIBUTES (t));
1059 visit (TYPE_NAME (t));
1060 visit (TYPE_MAIN_VARIANT (t));
1061 if (TYPE_FILE_SCOPE_P (t))
1063 else
1064 visit (TYPE_CONTEXT (t));
1065 visit (TYPE_STUB_DECL (t));
1068 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1070 if (code == ENUMERAL_TYPE)
1071 visit (TYPE_VALUES (t));
1072 else if (code == ARRAY_TYPE)
1073 visit (TYPE_DOMAIN (t));
1074 else if (RECORD_OR_UNION_TYPE_P (t))
1075 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1076 visit (f);
1077 else if (code == FUNCTION_TYPE
1078 || code == METHOD_TYPE)
1079 visit (TYPE_ARG_TYPES (t));
1080 if (!POINTER_TYPE_P (t))
1081 visit (TYPE_MINVAL (t));
1082 visit (TYPE_MAXVAL (t));
1083 if (RECORD_OR_UNION_TYPE_P (t))
1084 visit (TYPE_BINFO (t));
1087 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1089 visit (TREE_PURPOSE (t));
1090 visit (TREE_VALUE (t));
1091 visit (TREE_CHAIN (t));
1094 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1095 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1096 visit (TREE_VEC_ELT (t, i));
1098 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1100 hstate.add_wide_int (TREE_OPERAND_LENGTH (t));
1101 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1102 visit (TREE_OPERAND (t, i));
1105 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1107 unsigned i;
1108 tree b;
1109 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1110 visit (b);
1111 visit (BINFO_OFFSET (t));
1112 visit (BINFO_VTABLE (t));
1113 visit (BINFO_VPTR_FIELD (t));
1114 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t), i, b)
1115 visit (b);
1116 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1117 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
1120 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1122 unsigned i;
1123 tree index, value;
1124 hstate.add_wide_int (CONSTRUCTOR_NELTS (t));
1125 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1127 visit (index);
1128 visit (value);
1132 if (code == OMP_CLAUSE)
1134 int i;
1135 HOST_WIDE_INT val;
1137 hstate.add_wide_int (OMP_CLAUSE_CODE (t));
1138 switch (OMP_CLAUSE_CODE (t))
1140 case OMP_CLAUSE_DEFAULT:
1141 val = OMP_CLAUSE_DEFAULT_KIND (t);
1142 break;
1143 case OMP_CLAUSE_SCHEDULE:
1144 val = OMP_CLAUSE_SCHEDULE_KIND (t);
1145 break;
1146 case OMP_CLAUSE_DEPEND:
1147 val = OMP_CLAUSE_DEPEND_KIND (t);
1148 break;
1149 case OMP_CLAUSE_MAP:
1150 val = OMP_CLAUSE_MAP_KIND (t);
1151 break;
1152 case OMP_CLAUSE_PROC_BIND:
1153 val = OMP_CLAUSE_PROC_BIND_KIND (t);
1154 break;
1155 case OMP_CLAUSE_REDUCTION:
1156 val = OMP_CLAUSE_REDUCTION_CODE (t);
1157 break;
1158 default:
1159 val = 0;
1160 break;
1162 hstate.add_wide_int (val);
1163 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1164 visit (OMP_CLAUSE_OPERAND (t, i));
1165 visit (OMP_CLAUSE_CHAIN (t));
1168 return hstate.end ();
1170 #undef visit
1173 /* Compare two SCC entries by their hash value for qsorting them. */
1176 DFS::scc_entry_compare (const void *p1_, const void *p2_)
1178 const scc_entry *p1 = (const scc_entry *) p1_;
1179 const scc_entry *p2 = (const scc_entry *) p2_;
1180 if (p1->hash < p2->hash)
1181 return -1;
1182 else if (p1->hash > p2->hash)
1183 return 1;
1184 return 0;
1187 /* Return a hash value for the SCC on the SCC stack from FIRST with
1188 size SIZE. */
1190 hashval_t
1191 DFS::hash_scc (struct output_block *ob,
1192 unsigned first, unsigned size)
1194 unsigned int last_classes = 0, iterations = 0;
1196 /* Compute hash values for the SCC members. */
1197 for (unsigned i = 0; i < size; ++i)
1198 sccstack[first+i].hash = hash_tree (ob->writer_cache, NULL,
1199 sccstack[first+i].t);
1201 if (size == 1)
1202 return sccstack[first].hash;
1204 /* We aim to get unique hash for every tree within SCC and compute hash value
1205 of the whole SCC by combing all values together in an stable (entry point
1206 independent) order. This guarantees that the same SCC regions within
1207 different translation units will get the same hash values and therefore
1208 will be merged at WPA time.
1210 Often the hashes are already unique. In that case we compute scc hash
1211 by combining individual hash values in an increasing order.
1213 If thre are duplicates we seek at least one tree with unique hash (and
1214 pick one with minimal hash and this property). Then we obtain stable
1215 order by DFS walk starting from this unique tree and then use index
1216 within this order to make individual hash values unique.
1218 If there is no tree with unique hash, we iteratively propagate the hash
1219 values across the internal edges of SCC. This usually quickly leads
1220 to unique hashes. Consider, for example, an SCC containing two pointers
1221 that are identical except for type they point and assume that these
1222 types are also part of the SCC.
1223 The propagation will add the points-to type information into their hash
1224 values. */
1227 /* Sort the SCC so we can easily see check for uniqueness. */
1228 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1230 unsigned int classes = 1;
1231 int firstunique = -1;
1233 /* Find tree with lowest unique hash (if it exists) and compute
1234 number of equivalence classes. */
1235 if (sccstack[first].hash != sccstack[first+1].hash)
1236 firstunique = 0;
1237 for (unsigned i = 1; i < size; ++i)
1238 if (sccstack[first+i-1].hash != sccstack[first+i].hash)
1240 classes++;
1241 if (firstunique == -1
1242 && (i == size - 1
1243 || sccstack[first+i+1].hash != sccstack[first+i].hash))
1244 firstunique = i;
1247 /* If we found tree with unique hash; stop the iteration. */
1248 if (firstunique != -1
1249 /* Also terminate if we run out of iterations or if the number of
1250 equivalence classes is no longer increasing.
1251 For example a cyclic list of trees that are all equivalent will
1252 never have unique entry point; we however do not build such SCCs
1253 in our IL. */
1254 || classes <= last_classes || iterations > 16)
1256 hashval_t scc_hash;
1258 /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk
1259 starting from FIRSTUNIQUE to obstain stable order. */
1260 if (classes != size && firstunique != -1)
1262 hash_map <tree, hashval_t> map(size*2);
1264 /* Store hash values into a map, so we can associate them with
1265 reordered SCC. */
1266 for (unsigned i = 0; i < size; ++i)
1267 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1269 DFS again (ob, sccstack[first+firstunique].t, false, false, true);
1270 gcc_assert (again.sccstack.length () == size);
1272 memcpy (sccstack.address () + first,
1273 again.sccstack.address (),
1274 sizeof (scc_entry) * size);
1276 /* Update hash values of individual members by hashing in the
1277 index within the stable order. This ensures uniqueness.
1278 Also compute the scc_hash by mixing in all hash values in the
1279 stable order we obtained. */
1280 sccstack[first].hash = *map.get (sccstack[first].t);
1281 scc_hash = sccstack[first].hash;
1282 for (unsigned i = 1; i < size; ++i)
1284 sccstack[first+i].hash
1285 = iterative_hash_hashval_t (i,
1286 *map.get (sccstack[first+i].t));
1287 scc_hash = iterative_hash_hashval_t (scc_hash,
1288 sccstack[first+i].hash);
1291 /* If we got unique hash values for each tree, then sort already
1292 ensured entry point independent order. Only compute the final
1293 scc hash.
1295 If we failed to find the unique entry point, we go by the same
1296 route. We will eventually introduce unwanted hash conflicts. */
1297 else
1299 scc_hash = sccstack[first].hash;
1300 for (unsigned i = 1; i < size; ++i)
1301 scc_hash = iterative_hash_hashval_t (scc_hash,
1302 sccstack[first+i].hash);
1303 /* We can not 100% guarantee that the hash will not conflict in
1304 in a way so the unique hash is not found. This however
1305 should be extremely rare situation. ICE for now so possible
1306 issues are found and evaulated. */
1307 gcc_checking_assert (classes == size);
1310 /* To avoid conflicts across SCCs iteratively hash the whole SCC
1311 hash into the hash of each of the elements. */
1312 for (unsigned i = 0; i < size; ++i)
1313 sccstack[first+i].hash
1314 = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
1315 return scc_hash;
1318 last_classes = classes;
1319 iterations++;
1321 /* We failed to identify the entry point; propagate hash values across
1322 the edges. */
1324 hash_map <tree, hashval_t> map(size*2);
1325 for (unsigned i = 0; i < size; ++i)
1326 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1328 for (unsigned i = 0; i < size; i++)
1329 sccstack[first+i].hash = hash_tree (ob->writer_cache, &map,
1330 sccstack[first+i].t);
1333 while (true);
1336 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1337 already in the streamer cache. Main routine called for
1338 each visit of EXPR. */
1340 void
1341 DFS::DFS_write_tree (struct output_block *ob, sccs *from_state,
1342 tree expr, bool ref_p, bool this_ref_p, bool single_p)
1344 unsigned ix;
1346 /* Handle special cases. */
1347 if (expr == NULL_TREE)
1348 return;
1350 /* Do not DFS walk into indexable trees. */
1351 if (this_ref_p && tree_is_indexable (expr))
1352 return;
1354 /* Check if we already streamed EXPR. */
1355 if (streamer_tree_cache_lookup (ob->writer_cache, expr, &ix))
1356 return;
1358 sccs **slot = &sccstate.get_or_insert (expr);
1359 sccs *cstate = *slot;
1360 if (!cstate)
1362 scc_entry e = { expr, 0 };
1363 /* Not yet visited. DFS recurse and push it onto the stack. */
1364 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
1365 sccstack.safe_push (e);
1366 cstate->dfsnum = next_dfs_num++;
1367 cstate->low = cstate->dfsnum;
1369 if (streamer_handle_as_builtin_p (expr))
1371 else if (TREE_CODE (expr) == INTEGER_CST
1372 && !TREE_OVERFLOW (expr))
1373 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p, single_p);
1374 else
1376 DFS_write_tree_body (ob, expr, cstate, ref_p, single_p);
1378 /* Walk any LTO-specific edges. */
1379 if (DECL_P (expr)
1380 && TREE_CODE (expr) != FUNCTION_DECL
1381 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1383 /* Handle DECL_INITIAL for symbols. */
1384 tree initial = get_symbol_initial_value (ob->decl_state->symtab_node_encoder,
1385 expr);
1386 DFS_write_tree (ob, cstate, initial, ref_p, ref_p, single_p);
1390 /* See if we found an SCC. */
1391 if (cstate->low == cstate->dfsnum)
1393 unsigned first, size;
1394 tree x;
1396 /* If we are re-walking a single leaf-SCC just return and
1397 let the caller access the sccstack. */
1398 if (single_p)
1399 return;
1401 /* Pop the SCC and compute its size. */
1402 first = sccstack.length ();
1405 x = sccstack[--first].t;
1407 while (x != expr);
1408 size = sccstack.length () - first;
1410 /* No need to compute hashes for LTRANS units, we don't perform
1411 any merging there. */
1412 hashval_t scc_hash = 0;
1413 unsigned scc_entry_len = 0;
1414 if (!flag_wpa)
1416 scc_hash = hash_scc (ob, first, size);
1418 /* Put the entries with the least number of collisions first. */
1419 unsigned entry_start = 0;
1420 scc_entry_len = size + 1;
1421 for (unsigned i = 0; i < size;)
1423 unsigned from = i;
1424 for (i = i + 1; i < size
1425 && (sccstack[first + i].hash
1426 == sccstack[first + from].hash); ++i)
1428 if (i - from < scc_entry_len)
1430 scc_entry_len = i - from;
1431 entry_start = from;
1434 for (unsigned i = 0; i < scc_entry_len; ++i)
1436 scc_entry tem = sccstack[first + i];
1437 sccstack[first + i] = sccstack[first + entry_start + i];
1438 sccstack[first + entry_start + i] = tem;
1441 if (scc_entry_len == 1)
1442 ; /* We already sorted SCC deterministically in hash_scc. */
1443 else
1444 /* Check that we have only one SCC.
1445 Naturally we may have conflicts if hash function is not
1446 strong enough. Lets see how far this gets. */
1448 #ifdef ENABLE_CHECKING
1449 gcc_unreachable ();
1450 #endif
1454 /* Write LTO_tree_scc. */
1455 streamer_write_record_start (ob, LTO_tree_scc);
1456 streamer_write_uhwi (ob, size);
1457 streamer_write_uhwi (ob, scc_hash);
1459 /* Write size-1 SCCs without wrapping them inside SCC bundles.
1460 All INTEGER_CSTs need to be handled this way as we need
1461 their type to materialize them. Also builtins are handled
1462 this way.
1463 ??? We still wrap these in LTO_tree_scc so at the
1464 input side we can properly identify the tree we want
1465 to ultimatively return. */
1466 if (size == 1)
1467 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
1468 else
1470 /* Write the size of the SCC entry candidates. */
1471 streamer_write_uhwi (ob, scc_entry_len);
1473 /* Write all headers and populate the streamer cache. */
1474 for (unsigned i = 0; i < size; ++i)
1476 hashval_t hash = sccstack[first+i].hash;
1477 tree t = sccstack[first+i].t;
1478 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
1479 t, hash, &ix);
1480 gcc_assert (!exists_p);
1482 if (!lto_is_streamable (t))
1483 internal_error ("tree code %qs is not supported "
1484 "in LTO streams",
1485 get_tree_code_name (TREE_CODE (t)));
1487 gcc_checking_assert (!streamer_handle_as_builtin_p (t));
1489 /* Write the header, containing everything needed to
1490 materialize EXPR on the reading side. */
1491 streamer_write_tree_header (ob, t);
1494 /* Write the bitpacks and tree references. */
1495 for (unsigned i = 0; i < size; ++i)
1497 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
1499 /* Mark the end of the tree. */
1500 streamer_write_zero (ob);
1504 /* Finally truncate the vector. */
1505 sccstack.truncate (first);
1507 if (from_state)
1508 from_state->low = MIN (from_state->low, cstate->low);
1509 return;
1512 if (from_state)
1513 from_state->low = MIN (from_state->low, cstate->low);
1515 gcc_checking_assert (from_state);
1516 if (cstate->dfsnum < from_state->dfsnum)
1517 from_state->low = MIN (cstate->dfsnum, from_state->low);
1521 /* Emit the physical representation of tree node EXPR to output block
1522 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
1523 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1525 void
1526 lto_output_tree (struct output_block *ob, tree expr,
1527 bool ref_p, bool this_ref_p)
1529 unsigned ix;
1530 bool existed_p;
1532 if (expr == NULL_TREE)
1534 streamer_write_record_start (ob, LTO_null);
1535 return;
1538 if (this_ref_p && tree_is_indexable (expr))
1540 lto_output_tree_ref (ob, expr);
1541 return;
1544 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1545 if (existed_p)
1547 /* If a node has already been streamed out, make sure that
1548 we don't write it more than once. Otherwise, the reader
1549 will instantiate two different nodes for the same object. */
1550 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1551 streamer_write_uhwi (ob, ix);
1552 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1553 lto_tree_code_to_tag (TREE_CODE (expr)));
1554 lto_stats.num_pickle_refs_output++;
1556 else
1558 /* This is the first time we see EXPR, write all reachable
1559 trees to OB. */
1560 static bool in_dfs_walk;
1562 /* Protect against recursion which means disconnect between
1563 what tree edges we walk in the DFS walk and what edges
1564 we stream out. */
1565 gcc_assert (!in_dfs_walk);
1567 /* Start the DFS walk. */
1568 /* Save ob state ... */
1569 /* let's see ... */
1570 in_dfs_walk = true;
1571 DFS (ob, expr, ref_p, this_ref_p, false);
1572 in_dfs_walk = false;
1574 /* Finally append a reference to the tree we were writing.
1575 ??? If expr ended up as a singleton we could have
1576 inlined it here and avoid outputting a reference. */
1577 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1578 gcc_assert (existed_p);
1579 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1580 streamer_write_uhwi (ob, ix);
1581 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1582 lto_tree_code_to_tag (TREE_CODE (expr)));
1583 lto_stats.num_pickle_refs_output++;
1588 /* Output to OB a list of try/catch handlers starting with FIRST. */
1590 static void
1591 output_eh_try_list (struct output_block *ob, eh_catch first)
1593 eh_catch n;
1595 for (n = first; n; n = n->next_catch)
1597 streamer_write_record_start (ob, LTO_eh_catch);
1598 stream_write_tree (ob, n->type_list, true);
1599 stream_write_tree (ob, n->filter_list, true);
1600 stream_write_tree (ob, n->label, true);
1603 streamer_write_record_start (ob, LTO_null);
1607 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1608 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1609 detect EH region sharing. */
1611 static void
1612 output_eh_region (struct output_block *ob, eh_region r)
1614 enum LTO_tags tag;
1616 if (r == NULL)
1618 streamer_write_record_start (ob, LTO_null);
1619 return;
1622 if (r->type == ERT_CLEANUP)
1623 tag = LTO_ert_cleanup;
1624 else if (r->type == ERT_TRY)
1625 tag = LTO_ert_try;
1626 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1627 tag = LTO_ert_allowed_exceptions;
1628 else if (r->type == ERT_MUST_NOT_THROW)
1629 tag = LTO_ert_must_not_throw;
1630 else
1631 gcc_unreachable ();
1633 streamer_write_record_start (ob, tag);
1634 streamer_write_hwi (ob, r->index);
1636 if (r->outer)
1637 streamer_write_hwi (ob, r->outer->index);
1638 else
1639 streamer_write_zero (ob);
1641 if (r->inner)
1642 streamer_write_hwi (ob, r->inner->index);
1643 else
1644 streamer_write_zero (ob);
1646 if (r->next_peer)
1647 streamer_write_hwi (ob, r->next_peer->index);
1648 else
1649 streamer_write_zero (ob);
1651 if (r->type == ERT_TRY)
1653 output_eh_try_list (ob, r->u.eh_try.first_catch);
1655 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1657 stream_write_tree (ob, r->u.allowed.type_list, true);
1658 stream_write_tree (ob, r->u.allowed.label, true);
1659 streamer_write_uhwi (ob, r->u.allowed.filter);
1661 else if (r->type == ERT_MUST_NOT_THROW)
1663 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1664 bitpack_d bp = bitpack_create (ob->main_stream);
1665 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1666 streamer_write_bitpack (&bp);
1669 if (r->landing_pads)
1670 streamer_write_hwi (ob, r->landing_pads->index);
1671 else
1672 streamer_write_zero (ob);
1676 /* Output landing pad LP to OB. */
1678 static void
1679 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1681 if (lp == NULL)
1683 streamer_write_record_start (ob, LTO_null);
1684 return;
1687 streamer_write_record_start (ob, LTO_eh_landing_pad);
1688 streamer_write_hwi (ob, lp->index);
1689 if (lp->next_lp)
1690 streamer_write_hwi (ob, lp->next_lp->index);
1691 else
1692 streamer_write_zero (ob);
1694 if (lp->region)
1695 streamer_write_hwi (ob, lp->region->index);
1696 else
1697 streamer_write_zero (ob);
1699 stream_write_tree (ob, lp->post_landing_pad, true);
1703 /* Output the existing eh_table to OB. */
1705 static void
1706 output_eh_regions (struct output_block *ob, struct function *fn)
1708 if (fn->eh && fn->eh->region_tree)
1710 unsigned i;
1711 eh_region eh;
1712 eh_landing_pad lp;
1713 tree ttype;
1715 streamer_write_record_start (ob, LTO_eh_table);
1717 /* Emit the index of the root of the EH region tree. */
1718 streamer_write_hwi (ob, fn->eh->region_tree->index);
1720 /* Emit all the EH regions in the region array. */
1721 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
1722 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
1723 output_eh_region (ob, eh);
1725 /* Emit all landing pads. */
1726 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
1727 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
1728 output_eh_lp (ob, lp);
1730 /* Emit all the runtime type data. */
1731 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
1732 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
1733 stream_write_tree (ob, ttype, true);
1735 /* Emit the table of action chains. */
1736 if (targetm.arm_eabi_unwinder)
1738 tree t;
1739 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
1740 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
1741 stream_write_tree (ob, t, true);
1743 else
1745 uchar c;
1746 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
1747 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
1748 streamer_write_char_stream (ob->main_stream, c);
1752 /* The LTO_null either terminates the record or indicates that there
1753 are no eh_records at all. */
1754 streamer_write_record_start (ob, LTO_null);
1758 /* Output all of the active ssa names to the ssa_names stream. */
1760 static void
1761 output_ssa_names (struct output_block *ob, struct function *fn)
1763 unsigned int i, len;
1765 len = vec_safe_length (SSANAMES (fn));
1766 streamer_write_uhwi (ob, len);
1768 for (i = 1; i < len; i++)
1770 tree ptr = (*SSANAMES (fn))[i];
1772 if (ptr == NULL_TREE
1773 || SSA_NAME_IN_FREE_LIST (ptr)
1774 || virtual_operand_p (ptr))
1775 continue;
1777 streamer_write_uhwi (ob, i);
1778 streamer_write_char_stream (ob->main_stream,
1779 SSA_NAME_IS_DEFAULT_DEF (ptr));
1780 if (SSA_NAME_VAR (ptr))
1781 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
1782 else
1783 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1784 stream_write_tree (ob, TREE_TYPE (ptr), true);
1787 streamer_write_zero (ob);
1791 /* Output a wide-int. */
1793 static void
1794 streamer_write_wi (struct output_block *ob,
1795 const widest_int &w)
1797 int len = w.get_len ();
1799 streamer_write_uhwi (ob, w.get_precision ());
1800 streamer_write_uhwi (ob, len);
1801 for (int i = 0; i < len; i++)
1802 streamer_write_hwi (ob, w.elt (i));
1806 /* Output the cfg. */
1808 static void
1809 output_cfg (struct output_block *ob, struct function *fn)
1811 struct lto_output_stream *tmp_stream = ob->main_stream;
1812 basic_block bb;
1814 ob->main_stream = ob->cfg_stream;
1816 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1817 profile_status_for_fn (fn));
1819 /* Output the number of the highest basic block. */
1820 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
1822 FOR_ALL_BB_FN (bb, fn)
1824 edge_iterator ei;
1825 edge e;
1827 streamer_write_hwi (ob, bb->index);
1829 /* Output the successors and the edge flags. */
1830 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
1831 FOR_EACH_EDGE (e, ei, bb->succs)
1833 streamer_write_uhwi (ob, e->dest->index);
1834 streamer_write_hwi (ob, e->probability);
1835 streamer_write_gcov_count (ob, e->count);
1836 streamer_write_uhwi (ob, e->flags);
1840 streamer_write_hwi (ob, -1);
1842 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1843 while (bb->next_bb)
1845 streamer_write_hwi (ob, bb->next_bb->index);
1846 bb = bb->next_bb;
1849 streamer_write_hwi (ob, -1);
1851 /* ??? The cfgloop interface is tied to cfun. */
1852 gcc_assert (cfun == fn);
1854 /* Output the number of loops. */
1855 streamer_write_uhwi (ob, number_of_loops (fn));
1857 /* Output each loop, skipping the tree root which has number zero. */
1858 for (unsigned i = 1; i < number_of_loops (fn); ++i)
1860 struct loop *loop = get_loop (fn, i);
1862 /* Write the index of the loop header. That's enough to rebuild
1863 the loop tree on the reader side. Stream -1 for an unused
1864 loop entry. */
1865 if (!loop)
1867 streamer_write_hwi (ob, -1);
1868 continue;
1870 else
1871 streamer_write_hwi (ob, loop->header->index);
1873 /* Write everything copy_loop_info copies. */
1874 streamer_write_enum (ob->main_stream,
1875 loop_estimation, EST_LAST, loop->estimate_state);
1876 streamer_write_hwi (ob, loop->any_upper_bound);
1877 if (loop->any_upper_bound)
1878 streamer_write_wi (ob, loop->nb_iterations_upper_bound);
1879 streamer_write_hwi (ob, loop->any_estimate);
1880 if (loop->any_estimate)
1881 streamer_write_wi (ob, loop->nb_iterations_estimate);
1883 /* Write OMP SIMD related info. */
1884 streamer_write_hwi (ob, loop->safelen);
1885 streamer_write_hwi (ob, loop->dont_vectorize);
1886 streamer_write_hwi (ob, loop->force_vectorize);
1887 stream_write_tree (ob, loop->simduid, true);
1890 ob->main_stream = tmp_stream;
1894 /* Create the header in the file using OB. If the section type is for
1895 a function, set FN to the decl for that function. */
1897 void
1898 produce_asm (struct output_block *ob, tree fn)
1900 enum lto_section_type section_type = ob->section_type;
1901 struct lto_function_header header;
1902 char *section_name;
1904 if (section_type == LTO_section_function_body)
1906 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1907 section_name = lto_get_section_name (section_type, name, NULL);
1909 else
1910 section_name = lto_get_section_name (section_type, NULL, NULL);
1912 lto_begin_section (section_name, !flag_wpa);
1913 free (section_name);
1915 /* The entire header is stream computed here. */
1916 memset (&header, 0, sizeof (struct lto_function_header));
1918 /* Write the header. */
1919 header.major_version = LTO_major_version;
1920 header.minor_version = LTO_minor_version;
1922 if (section_type == LTO_section_function_body)
1923 header.cfg_size = ob->cfg_stream->total_size;
1924 header.main_size = ob->main_stream->total_size;
1925 header.string_size = ob->string_stream->total_size;
1926 lto_write_data (&header, sizeof header);
1928 /* Put all of the gimple and the string table out the asm file as a
1929 block of text. */
1930 if (section_type == LTO_section_function_body)
1931 lto_write_stream (ob->cfg_stream);
1932 lto_write_stream (ob->main_stream);
1933 lto_write_stream (ob->string_stream);
1935 lto_end_section ();
1939 /* Output the base body of struct function FN using output block OB. */
1941 static void
1942 output_struct_function_base (struct output_block *ob, struct function *fn)
1944 struct bitpack_d bp;
1945 unsigned i;
1946 tree t;
1948 /* Output the static chain and non-local goto save area. */
1949 stream_write_tree (ob, fn->static_chain_decl, true);
1950 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
1952 /* Output all the local variables in the function. */
1953 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
1954 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
1955 stream_write_tree (ob, t, true);
1957 /* Output current IL state of the function. */
1958 streamer_write_uhwi (ob, fn->curr_properties);
1960 /* Write all the attributes for FN. */
1961 bp = bitpack_create (ob->main_stream);
1962 bp_pack_value (&bp, fn->is_thunk, 1);
1963 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
1964 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
1965 bp_pack_value (&bp, fn->returns_struct, 1);
1966 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
1967 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
1968 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
1969 bp_pack_value (&bp, fn->after_inlining, 1);
1970 bp_pack_value (&bp, fn->stdarg, 1);
1971 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
1972 bp_pack_value (&bp, fn->calls_alloca, 1);
1973 bp_pack_value (&bp, fn->calls_setjmp, 1);
1974 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
1975 bp_pack_value (&bp, fn->has_simduid_loops, 1);
1976 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
1977 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
1978 bp_pack_value (&bp, fn->last_clique, sizeof (short) * 8);
1980 /* Output the function start and end loci. */
1981 stream_output_location (ob, &bp, fn->function_start_locus);
1982 stream_output_location (ob, &bp, fn->function_end_locus);
1984 streamer_write_bitpack (&bp);
1988 /* Output the body of function NODE->DECL. */
1990 static void
1991 output_function (struct cgraph_node *node)
1993 tree function;
1994 struct function *fn;
1995 basic_block bb;
1996 struct output_block *ob;
1998 function = node->decl;
1999 fn = DECL_STRUCT_FUNCTION (function);
2000 ob = create_output_block (LTO_section_function_body);
2002 clear_line_info (ob);
2003 ob->symbol = node;
2005 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
2007 /* Set current_function_decl and cfun. */
2008 push_cfun (fn);
2010 /* Make string 0 be a NULL string. */
2011 streamer_write_char_stream (ob->string_stream, 0);
2013 streamer_write_record_start (ob, LTO_function);
2015 /* Output decls for parameters and args. */
2016 stream_write_tree (ob, DECL_RESULT (function), true);
2017 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
2019 /* Output DECL_INITIAL for the function, which contains the tree of
2020 lexical scopes. */
2021 stream_write_tree (ob, DECL_INITIAL (function), true);
2023 /* We also stream abstract functions where we stream only stuff needed for
2024 debug info. */
2025 if (gimple_has_body_p (function))
2027 streamer_write_uhwi (ob, 1);
2028 output_struct_function_base (ob, fn);
2030 /* Output all the SSA names used in the function. */
2031 output_ssa_names (ob, fn);
2033 /* Output any exception handling regions. */
2034 output_eh_regions (ob, fn);
2037 /* We will renumber the statements. The code that does this uses
2038 the same ordering that we use for serializing them so we can use
2039 the same code on the other end and not have to write out the
2040 statement numbers. We do not assign UIDs to PHIs here because
2041 virtual PHIs get re-computed on-the-fly which would make numbers
2042 inconsistent. */
2043 set_gimple_stmt_max_uid (cfun, 0);
2044 FOR_ALL_BB_FN (bb, cfun)
2046 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2047 gsi_next (&gsi))
2049 gphi *stmt = gsi.phi ();
2051 /* Virtual PHIs are not going to be streamed. */
2052 if (!virtual_operand_p (gimple_phi_result (stmt)))
2053 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
2055 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
2056 gsi_next (&gsi))
2058 gimple stmt = gsi_stmt (gsi);
2059 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
2062 /* To avoid keeping duplicate gimple IDs in the statements, renumber
2063 virtual phis now. */
2064 FOR_ALL_BB_FN (bb, cfun)
2066 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
2067 gsi_next (&gsi))
2069 gphi *stmt = gsi.phi ();
2070 if (virtual_operand_p (gimple_phi_result (stmt)))
2071 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
2075 /* Output the code for the function. */
2076 FOR_ALL_BB_FN (bb, fn)
2077 output_bb (ob, bb, fn);
2079 /* The terminator for this function. */
2080 streamer_write_record_start (ob, LTO_null);
2082 output_cfg (ob, fn);
2084 pop_cfun ();
2086 else
2087 streamer_write_uhwi (ob, 0);
2089 /* Create a section to hold the pickled output of this function. */
2090 produce_asm (ob, function);
2092 destroy_output_block (ob);
2095 /* Output the body of function NODE->DECL. */
2097 static void
2098 output_constructor (struct varpool_node *node)
2100 tree var = node->decl;
2101 struct output_block *ob;
2103 ob = create_output_block (LTO_section_function_body);
2105 clear_line_info (ob);
2106 ob->symbol = node;
2108 /* Make string 0 be a NULL string. */
2109 streamer_write_char_stream (ob->string_stream, 0);
2111 /* Output DECL_INITIAL for the function, which contains the tree of
2112 lexical scopes. */
2113 stream_write_tree (ob, DECL_INITIAL (var), true);
2115 /* Create a section to hold the pickled output of this function. */
2116 produce_asm (ob, var);
2118 destroy_output_block (ob);
2122 /* Emit toplevel asms. */
2124 void
2125 lto_output_toplevel_asms (void)
2127 struct output_block *ob;
2128 struct asm_node *can;
2129 char *section_name;
2130 struct lto_simple_header_with_strings header;
2132 if (!symtab->first_asm_symbol ())
2133 return;
2135 ob = create_output_block (LTO_section_asm);
2137 /* Make string 0 be a NULL string. */
2138 streamer_write_char_stream (ob->string_stream, 0);
2140 for (can = symtab->first_asm_symbol (); can; can = can->next)
2142 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
2143 streamer_write_hwi (ob, can->order);
2146 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
2148 section_name = lto_get_section_name (LTO_section_asm, NULL, NULL);
2149 lto_begin_section (section_name, !flag_wpa);
2150 free (section_name);
2152 /* The entire header stream is computed here. */
2153 memset (&header, 0, sizeof (header));
2155 /* Write the header. */
2156 header.major_version = LTO_major_version;
2157 header.minor_version = LTO_minor_version;
2159 header.main_size = ob->main_stream->total_size;
2160 header.string_size = ob->string_stream->total_size;
2161 lto_write_data (&header, sizeof header);
2163 /* Put all of the gimple and the string table out the asm file as a
2164 block of text. */
2165 lto_write_stream (ob->main_stream);
2166 lto_write_stream (ob->string_stream);
2168 lto_end_section ();
2170 destroy_output_block (ob);
2174 /* Copy the function body or variable constructor of NODE without deserializing. */
2176 static void
2177 copy_function_or_variable (struct symtab_node *node)
2179 tree function = node->decl;
2180 struct lto_file_decl_data *file_data = node->lto_file_data;
2181 const char *data;
2182 size_t len;
2183 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
2184 char *section_name =
2185 lto_get_section_name (LTO_section_function_body, name, NULL);
2186 size_t i, j;
2187 struct lto_in_decl_state *in_state;
2188 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
2190 lto_begin_section (section_name, !flag_wpa);
2191 free (section_name);
2193 /* We may have renamed the declaration, e.g., a static function. */
2194 name = lto_get_decl_name_mapping (file_data, name);
2196 data = lto_get_section_data (file_data, LTO_section_function_body,
2197 name, &len);
2198 gcc_assert (data);
2200 /* Do a bit copy of the function body. */
2201 lto_write_data (data, len);
2203 /* Copy decls. */
2204 in_state =
2205 lto_get_function_in_decl_state (node->lto_file_data, function);
2206 gcc_assert (in_state);
2208 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2210 size_t n = vec_safe_length (in_state->streams[i]);
2211 vec<tree, va_gc> *trees = in_state->streams[i];
2212 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2214 /* The out state must have the same indices and the in state.
2215 So just copy the vector. All the encoders in the in state
2216 must be empty where we reach here. */
2217 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2218 encoder->trees.reserve_exact (n);
2219 for (j = 0; j < n; j++)
2220 encoder->trees.safe_push ((*trees)[j]);
2223 lto_free_section_data (file_data, LTO_section_function_body, name,
2224 data, len);
2225 lto_end_section ();
2228 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2230 static tree
2231 wrap_refs (tree *tp, int *ws, void *)
2233 tree t = *tp;
2234 if (handled_component_p (t)
2235 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL)
2237 tree decl = TREE_OPERAND (t, 0);
2238 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2239 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2240 build1 (ADDR_EXPR, ptrtype, decl),
2241 build_int_cst (ptrtype, 0));
2242 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2243 *ws = 0;
2245 else if (TREE_CODE (t) == CONSTRUCTOR)
2247 else if (!EXPR_P (t))
2248 *ws = 0;
2249 return NULL_TREE;
2252 /* Main entry point from the pass manager. */
2254 void
2255 lto_output (void)
2257 struct lto_out_decl_state *decl_state;
2258 #ifdef ENABLE_CHECKING
2259 bitmap output = lto_bitmap_alloc ();
2260 #endif
2261 int i, n_nodes;
2262 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
2264 /* Initialize the streamer. */
2265 lto_streamer_init ();
2267 n_nodes = lto_symtab_encoder_size (encoder);
2268 /* Process only the functions with bodies. */
2269 for (i = 0; i < n_nodes; i++)
2271 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
2272 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
2274 if (lto_symtab_encoder_encode_body_p (encoder, node)
2275 && !node->alias)
2277 #ifdef ENABLE_CHECKING
2278 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2279 bitmap_set_bit (output, DECL_UID (node->decl));
2280 #endif
2281 decl_state = lto_new_out_decl_state ();
2282 lto_push_out_decl_state (decl_state);
2283 if (gimple_has_body_p (node->decl) || !flag_wpa
2284 /* Thunks have no body but they may be synthetized
2285 at WPA time. */
2286 || DECL_ARGUMENTS (node->decl))
2287 output_function (node);
2288 else
2289 copy_function_or_variable (node);
2290 gcc_assert (lto_get_out_decl_state () == decl_state);
2291 lto_pop_out_decl_state ();
2292 lto_record_function_out_decl_state (node->decl, decl_state);
2295 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
2297 /* Wrap symbol references inside the ctor in a type
2298 preserving MEM_REF. */
2299 tree ctor = DECL_INITIAL (node->decl);
2300 if (ctor && !in_lto_p)
2301 walk_tree (&ctor, wrap_refs, NULL, NULL);
2302 if (get_symbol_initial_value (encoder, node->decl) == error_mark_node
2303 && lto_symtab_encoder_encode_initializer_p (encoder, node)
2304 && !node->alias)
2306 timevar_push (TV_IPA_LTO_CTORS_OUT);
2307 #ifdef ENABLE_CHECKING
2308 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2309 bitmap_set_bit (output, DECL_UID (node->decl));
2310 #endif
2311 decl_state = lto_new_out_decl_state ();
2312 lto_push_out_decl_state (decl_state);
2313 if (DECL_INITIAL (node->decl) != error_mark_node
2314 || !flag_wpa)
2315 output_constructor (node);
2316 else
2317 copy_function_or_variable (node);
2318 gcc_assert (lto_get_out_decl_state () == decl_state);
2319 lto_pop_out_decl_state ();
2320 lto_record_function_out_decl_state (node->decl, decl_state);
2321 timevar_pop (TV_IPA_LTO_CTORS_OUT);
2326 /* Emit the callgraph after emitting function bodies. This needs to
2327 be done now to make sure that all the statements in every function
2328 have been renumbered so that edges can be associated with call
2329 statements using the statement UIDs. */
2330 output_symtab ();
2332 output_offload_tables ();
2334 #ifdef ENABLE_CHECKING
2335 lto_bitmap_free (output);
2336 #endif
2339 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2340 from it and required for correct representation of its semantics.
2341 Each node in ENCODER must be a global declaration or a type. A node
2342 is written only once, even if it appears multiple times in the
2343 vector. Certain transitively-reachable nodes, such as those
2344 representing expressions, may be duplicated, but such nodes
2345 must not appear in ENCODER itself. */
2347 static void
2348 write_global_stream (struct output_block *ob,
2349 struct lto_tree_ref_encoder *encoder)
2351 tree t;
2352 size_t index;
2353 const size_t size = lto_tree_ref_encoder_size (encoder);
2355 for (index = 0; index < size; index++)
2357 t = lto_tree_ref_encoder_get_tree (encoder, index);
2358 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2359 stream_write_tree (ob, t, false);
2364 /* Write a sequence of indices into the globals vector corresponding
2365 to the trees in ENCODER. These are used by the reader to map the
2366 indices used to refer to global entities within function bodies to
2367 their referents. */
2369 static void
2370 write_global_references (struct output_block *ob,
2371 struct lto_tree_ref_encoder *encoder)
2373 tree t;
2374 uint32_t index;
2375 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2377 /* Write size and slot indexes as 32-bit unsigned numbers. */
2378 uint32_t *data = XNEWVEC (uint32_t, size + 1);
2379 data[0] = size;
2381 for (index = 0; index < size; index++)
2383 uint32_t slot_num;
2385 t = lto_tree_ref_encoder_get_tree (encoder, index);
2386 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2387 gcc_assert (slot_num != (unsigned)-1);
2388 data[index + 1] = slot_num;
2391 lto_write_data (data, sizeof (int32_t) * (size + 1));
2392 free (data);
2396 /* Write all the streams in an lto_out_decl_state STATE using
2397 output block OB and output stream OUT_STREAM. */
2399 void
2400 lto_output_decl_state_streams (struct output_block *ob,
2401 struct lto_out_decl_state *state)
2403 int i;
2405 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2406 write_global_stream (ob, &state->streams[i]);
2410 /* Write all the references in an lto_out_decl_state STATE using
2411 output block OB and output stream OUT_STREAM. */
2413 void
2414 lto_output_decl_state_refs (struct output_block *ob,
2415 struct lto_out_decl_state *state)
2417 unsigned i;
2418 uint32_t ref;
2419 tree decl;
2421 /* Write reference to FUNCTION_DECL. If there is not function,
2422 write reference to void_type_node. */
2423 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2424 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2425 gcc_assert (ref != (unsigned)-1);
2426 lto_write_data (&ref, sizeof (uint32_t));
2428 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2429 write_global_references (ob, &state->streams[i]);
2433 /* Return the written size of STATE. */
2435 static size_t
2436 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2438 int i;
2439 size_t size;
2441 size = sizeof (int32_t); /* fn_ref. */
2442 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2444 size += sizeof (int32_t); /* vector size. */
2445 size += (lto_tree_ref_encoder_size (&state->streams[i])
2446 * sizeof (int32_t));
2448 return size;
2452 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2453 so far. */
2455 static void
2456 write_symbol (struct streamer_tree_cache_d *cache,
2457 tree t, hash_set<const char *> *seen, bool alias)
2459 const char *name;
2460 enum gcc_plugin_symbol_kind kind;
2461 enum gcc_plugin_symbol_visibility visibility = GCCPV_DEFAULT;
2462 unsigned slot_num;
2463 uint64_t size;
2464 const char *comdat;
2465 unsigned char c;
2467 /* None of the following kinds of symbols are needed in the
2468 symbol table. */
2469 if (!TREE_PUBLIC (t)
2470 || is_builtin_fn (t)
2471 || DECL_ABSTRACT_P (t)
2472 || (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)))
2473 return;
2474 gcc_assert (TREE_CODE (t) != RESULT_DECL);
2476 gcc_assert (TREE_CODE (t) == VAR_DECL
2477 || TREE_CODE (t) == FUNCTION_DECL);
2479 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2481 /* This behaves like assemble_name_raw in varasm.c, performing the
2482 same name manipulations that ASM_OUTPUT_LABELREF does. */
2483 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2485 if (seen->add (name))
2486 return;
2488 streamer_tree_cache_lookup (cache, t, &slot_num);
2489 gcc_assert (slot_num != (unsigned)-1);
2491 if (DECL_EXTERNAL (t))
2493 if (DECL_WEAK (t))
2494 kind = GCCPK_WEAKUNDEF;
2495 else
2496 kind = GCCPK_UNDEF;
2498 else
2500 if (DECL_WEAK (t))
2501 kind = GCCPK_WEAKDEF;
2502 else if (DECL_COMMON (t))
2503 kind = GCCPK_COMMON;
2504 else
2505 kind = GCCPK_DEF;
2507 /* When something is defined, it should have node attached. */
2508 gcc_assert (alias || TREE_CODE (t) != VAR_DECL
2509 || varpool_node::get (t)->definition);
2510 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2511 || (cgraph_node::get (t)
2512 && cgraph_node::get (t)->definition));
2515 /* Imitate what default_elf_asm_output_external do.
2516 When symbol is external, we need to output it with DEFAULT visibility
2517 when compiling with -fvisibility=default, while with HIDDEN visibility
2518 when symbol has attribute (visibility("hidden")) specified.
2519 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2520 right. */
2522 if (DECL_EXTERNAL (t)
2523 && !targetm.binds_local_p (t))
2524 visibility = GCCPV_DEFAULT;
2525 else
2526 switch (DECL_VISIBILITY (t))
2528 case VISIBILITY_DEFAULT:
2529 visibility = GCCPV_DEFAULT;
2530 break;
2531 case VISIBILITY_PROTECTED:
2532 visibility = GCCPV_PROTECTED;
2533 break;
2534 case VISIBILITY_HIDDEN:
2535 visibility = GCCPV_HIDDEN;
2536 break;
2537 case VISIBILITY_INTERNAL:
2538 visibility = GCCPV_INTERNAL;
2539 break;
2542 if (kind == GCCPK_COMMON
2543 && DECL_SIZE_UNIT (t)
2544 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
2545 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2546 else
2547 size = 0;
2549 if (DECL_ONE_ONLY (t))
2550 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
2551 else
2552 comdat = "";
2554 lto_write_data (name, strlen (name) + 1);
2555 lto_write_data (comdat, strlen (comdat) + 1);
2556 c = (unsigned char) kind;
2557 lto_write_data (&c, 1);
2558 c = (unsigned char) visibility;
2559 lto_write_data (&c, 1);
2560 lto_write_data (&size, 8);
2561 lto_write_data (&slot_num, 4);
2564 /* Return true if NODE should appear in the plugin symbol table. */
2566 bool
2567 output_symbol_p (symtab_node *node)
2569 struct cgraph_node *cnode;
2570 if (!node->real_symbol_p ())
2571 return false;
2572 /* We keep external functions in symtab for sake of inlining
2573 and devirtualization. We do not want to see them in symbol table as
2574 references unless they are really used. */
2575 cnode = dyn_cast <cgraph_node *> (node);
2576 if (cnode && (!node->definition || DECL_EXTERNAL (cnode->decl))
2577 && cnode->callers)
2578 return true;
2580 /* Ignore all references from external vars initializers - they are not really
2581 part of the compilation unit until they are used by folding. Some symbols,
2582 like references to external construction vtables can not be referred to at all.
2583 We decide this at can_refer_decl_in_current_unit_p. */
2584 if (!node->definition || DECL_EXTERNAL (node->decl))
2586 int i;
2587 struct ipa_ref *ref;
2588 for (i = 0; node->iterate_referring (i, ref); i++)
2590 if (ref->use == IPA_REF_ALIAS)
2591 continue;
2592 if (is_a <cgraph_node *> (ref->referring))
2593 return true;
2594 if (!DECL_EXTERNAL (ref->referring->decl))
2595 return true;
2597 return false;
2599 return true;
2603 /* Write an IL symbol table to OB.
2604 SET and VSET are cgraph/varpool node sets we are outputting. */
2606 static void
2607 produce_symtab (struct output_block *ob)
2609 struct streamer_tree_cache_d *cache = ob->writer_cache;
2610 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
2611 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2612 lto_symtab_encoder_iterator lsei;
2614 lto_begin_section (section_name, false);
2615 free (section_name);
2617 hash_set<const char *> seen;
2619 /* Write the symbol table.
2620 First write everything defined and then all declarations.
2621 This is necessary to handle cases where we have duplicated symbols. */
2622 for (lsei = lsei_start (encoder);
2623 !lsei_end_p (lsei); lsei_next (&lsei))
2625 symtab_node *node = lsei_node (lsei);
2627 if (!output_symbol_p (node) || DECL_EXTERNAL (node->decl))
2628 continue;
2629 write_symbol (cache, node->decl, &seen, false);
2631 for (lsei = lsei_start (encoder);
2632 !lsei_end_p (lsei); lsei_next (&lsei))
2634 symtab_node *node = lsei_node (lsei);
2636 if (!output_symbol_p (node) || !DECL_EXTERNAL (node->decl))
2637 continue;
2638 write_symbol (cache, node->decl, &seen, false);
2641 lto_end_section ();
2645 /* Init the streamer_mode_table for output, where we collect info on what
2646 machine_mode values have been streamed. */
2647 void
2648 lto_output_init_mode_table (void)
2650 memset (streamer_mode_table, '\0', MAX_MACHINE_MODE);
2654 /* Write the mode table. */
2655 static void
2656 lto_write_mode_table (void)
2658 struct output_block *ob;
2659 ob = create_output_block (LTO_section_mode_table);
2660 bitpack_d bp = bitpack_create (ob->main_stream);
2662 /* Ensure that for GET_MODE_INNER (m) != VOIDmode we have
2663 also the inner mode marked. */
2664 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
2665 if (streamer_mode_table[i])
2667 machine_mode m = (machine_mode) i;
2668 if (GET_MODE_INNER (m) != VOIDmode)
2669 streamer_mode_table[(int) GET_MODE_INNER (m)] = 1;
2671 /* First stream modes that have GET_MODE_INNER (m) == VOIDmode,
2672 so that we can refer to them afterwards. */
2673 for (int pass = 0; pass < 2; pass++)
2674 for (int i = 0; i < (int) MAX_MACHINE_MODE; i++)
2675 if (streamer_mode_table[i] && i != (int) VOIDmode && i != (int) BLKmode)
2677 machine_mode m = (machine_mode) i;
2678 if ((GET_MODE_INNER (m) == VOIDmode) ^ (pass == 0))
2679 continue;
2680 bp_pack_value (&bp, m, 8);
2681 bp_pack_enum (&bp, mode_class, MAX_MODE_CLASS, GET_MODE_CLASS (m));
2682 bp_pack_value (&bp, GET_MODE_SIZE (m), 8);
2683 bp_pack_value (&bp, GET_MODE_PRECISION (m), 16);
2684 bp_pack_value (&bp, GET_MODE_INNER (m), 8);
2685 bp_pack_value (&bp, GET_MODE_NUNITS (m), 8);
2686 switch (GET_MODE_CLASS (m))
2688 case MODE_FRACT:
2689 case MODE_UFRACT:
2690 case MODE_ACCUM:
2691 case MODE_UACCUM:
2692 bp_pack_value (&bp, GET_MODE_IBIT (m), 8);
2693 bp_pack_value (&bp, GET_MODE_FBIT (m), 8);
2694 break;
2695 case MODE_FLOAT:
2696 case MODE_DECIMAL_FLOAT:
2697 bp_pack_string (ob, &bp, REAL_MODE_FORMAT (m)->name, true);
2698 break;
2699 default:
2700 break;
2702 bp_pack_string (ob, &bp, GET_MODE_NAME (m), true);
2704 bp_pack_value (&bp, VOIDmode, 8);
2706 streamer_write_bitpack (&bp);
2708 char *section_name
2709 = lto_get_section_name (LTO_section_mode_table, NULL, NULL);
2710 lto_begin_section (section_name, !flag_wpa);
2711 free (section_name);
2713 /* The entire header stream is computed here. */
2714 struct lto_simple_header_with_strings header;
2715 memset (&header, 0, sizeof (header));
2717 /* Write the header. */
2718 header.major_version = LTO_major_version;
2719 header.minor_version = LTO_minor_version;
2721 header.main_size = ob->main_stream->total_size;
2722 header.string_size = ob->string_stream->total_size;
2723 lto_write_data (&header, sizeof header);
2725 /* Put all of the gimple and the string table out the asm file as a
2726 block of text. */
2727 lto_write_stream (ob->main_stream);
2728 lto_write_stream (ob->string_stream);
2730 lto_end_section ();
2731 destroy_output_block (ob);
2735 /* This pass is run after all of the functions are serialized and all
2736 of the IPA passes have written their serialized forms. This pass
2737 causes the vector of all of the global decls and types used from
2738 this file to be written in to a section that can then be read in to
2739 recover these on other side. */
2741 void
2742 produce_asm_for_decls (void)
2744 struct lto_out_decl_state *out_state;
2745 struct lto_out_decl_state *fn_out_state;
2746 struct lto_decl_header header;
2747 char *section_name;
2748 struct output_block *ob;
2749 unsigned idx, num_fns;
2750 size_t decl_state_size;
2751 int32_t num_decl_states;
2753 ob = create_output_block (LTO_section_decls);
2755 memset (&header, 0, sizeof (struct lto_decl_header));
2757 section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
2758 lto_begin_section (section_name, !flag_wpa);
2759 free (section_name);
2761 /* Make string 0 be a NULL string. */
2762 streamer_write_char_stream (ob->string_stream, 0);
2764 gcc_assert (!alias_pairs);
2766 /* Get rid of the global decl state hash tables to save some memory. */
2767 out_state = lto_get_out_decl_state ();
2768 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
2769 if (out_state->streams[i].tree_hash_table)
2771 delete out_state->streams[i].tree_hash_table;
2772 out_state->streams[i].tree_hash_table = NULL;
2775 /* Write the global symbols. */
2776 lto_output_decl_state_streams (ob, out_state);
2777 num_fns = lto_function_decl_states.length ();
2778 for (idx = 0; idx < num_fns; idx++)
2780 fn_out_state =
2781 lto_function_decl_states[idx];
2782 lto_output_decl_state_streams (ob, fn_out_state);
2785 header.major_version = LTO_major_version;
2786 header.minor_version = LTO_minor_version;
2788 /* Currently not used. This field would allow us to preallocate
2789 the globals vector, so that it need not be resized as it is extended. */
2790 header.num_nodes = -1;
2792 /* Compute the total size of all decl out states. */
2793 decl_state_size = sizeof (int32_t);
2794 decl_state_size += lto_out_decl_state_written_size (out_state);
2795 for (idx = 0; idx < num_fns; idx++)
2797 fn_out_state =
2798 lto_function_decl_states[idx];
2799 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2801 header.decl_state_size = decl_state_size;
2803 header.main_size = ob->main_stream->total_size;
2804 header.string_size = ob->string_stream->total_size;
2806 lto_write_data (&header, sizeof header);
2808 /* Write the main out-decl state, followed by out-decl states of
2809 functions. */
2810 num_decl_states = num_fns + 1;
2811 lto_write_data (&num_decl_states, sizeof (num_decl_states));
2812 lto_output_decl_state_refs (ob, out_state);
2813 for (idx = 0; idx < num_fns; idx++)
2815 fn_out_state = lto_function_decl_states[idx];
2816 lto_output_decl_state_refs (ob, fn_out_state);
2819 lto_write_stream (ob->main_stream);
2820 lto_write_stream (ob->string_stream);
2822 lto_end_section ();
2824 /* Write the symbol table. It is used by linker to determine dependencies
2825 and thus we can skip it for WPA. */
2826 if (!flag_wpa)
2827 produce_symtab (ob);
2829 /* Write command line opts. */
2830 lto_write_options ();
2832 /* Deallocate memory and clean up. */
2833 for (idx = 0; idx < num_fns; idx++)
2835 fn_out_state =
2836 lto_function_decl_states[idx];
2837 lto_delete_out_decl_state (fn_out_state);
2839 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
2840 lto_function_decl_states.release ();
2841 destroy_output_block (ob);
2842 if (lto_stream_offload_p)
2843 lto_write_mode_table ();