2014-08-15 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / lto-streamer-out.c
blob1dc37efc2b89ce77452a14d3189da886a99441f8
1 /* Write the GIMPLE representation to a file stream.
3 Copyright (C) 2009-2014 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 "tree.h"
28 #include "stor-layout.h"
29 #include "stringpool.h"
30 #include "expr.h"
31 #include "flags.h"
32 #include "params.h"
33 #include "input.h"
34 #include "hashtab.h"
35 #include "hash-set.h"
36 #include "basic-block.h"
37 #include "tree-ssa-alias.h"
38 #include "internal-fn.h"
39 #include "gimple-expr.h"
40 #include "is-a.h"
41 #include "gimple.h"
42 #include "gimple-iterator.h"
43 #include "gimple-ssa.h"
44 #include "tree-ssanames.h"
45 #include "tree-pass.h"
46 #include "function.h"
47 #include "diagnostic-core.h"
48 #include "inchash.h"
49 #include "except.h"
50 #include "lto-symtab.h"
51 #include "lto-streamer.h"
52 #include "data-streamer.h"
53 #include "gimple-streamer.h"
54 #include "tree-streamer.h"
55 #include "streamer-hooks.h"
56 #include "cfgloop.h"
57 #include "builtins.h"
60 static void lto_write_tree (struct output_block*, tree, bool);
62 /* Clear the line info stored in DATA_IN. */
64 static void
65 clear_line_info (struct output_block *ob)
67 ob->current_file = NULL;
68 ob->current_line = 0;
69 ob->current_col = 0;
73 /* Create the output block and return it. SECTION_TYPE is
74 LTO_section_function_body or LTO_static_initializer. */
76 struct output_block *
77 create_output_block (enum lto_section_type section_type)
79 struct output_block *ob = XCNEW (struct output_block);
81 ob->section_type = section_type;
82 ob->decl_state = lto_get_out_decl_state ();
83 ob->main_stream = XCNEW (struct lto_output_stream);
84 ob->string_stream = XCNEW (struct lto_output_stream);
85 ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true, false);
87 if (section_type == LTO_section_function_body)
88 ob->cfg_stream = XCNEW (struct lto_output_stream);
90 clear_line_info (ob);
92 ob->string_hash_table = new hash_table<string_slot_hasher> (37);
93 gcc_obstack_init (&ob->obstack);
95 return ob;
99 /* Destroy the output block OB. */
101 void
102 destroy_output_block (struct output_block *ob)
104 enum lto_section_type section_type = ob->section_type;
106 delete ob->string_hash_table;
107 ob->string_hash_table = NULL;
109 free (ob->main_stream);
110 free (ob->string_stream);
111 if (section_type == LTO_section_function_body)
112 free (ob->cfg_stream);
114 streamer_tree_cache_delete (ob->writer_cache);
115 obstack_free (&ob->obstack, NULL);
117 free (ob);
121 /* Look up NODE in the type table and write the index for it to OB. */
123 static void
124 output_type_ref (struct output_block *ob, tree node)
126 streamer_write_record_start (ob, LTO_type_ref);
127 lto_output_type_ref_index (ob->decl_state, ob->main_stream, node);
131 /* Return true if tree node T is written to various tables. For these
132 nodes, we sometimes want to write their phyiscal representation
133 (via lto_output_tree), and sometimes we need to emit an index
134 reference into a table (via lto_output_tree_ref). */
136 static bool
137 tree_is_indexable (tree t)
139 /* Parameters and return values of functions of variably modified types
140 must go to global stream, because they may be used in the type
141 definition. */
142 if (TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
143 return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)), NULL_TREE);
144 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared. */
145 else if (TREE_CODE (t) == IMPORTED_DECL)
146 return false;
147 else if (((TREE_CODE (t) == VAR_DECL && !TREE_STATIC (t))
148 || TREE_CODE (t) == TYPE_DECL
149 || TREE_CODE (t) == CONST_DECL
150 || TREE_CODE (t) == NAMELIST_DECL)
151 && decl_function_context (t))
152 return false;
153 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
154 return false;
155 /* Variably modified types need to be streamed alongside function
156 bodies because they can refer to local entities. Together with
157 them we have to localize their members as well.
158 ??? In theory that includes non-FIELD_DECLs as well. */
159 else if (TYPE_P (t)
160 && variably_modified_type_p (t, NULL_TREE))
161 return false;
162 else if (TREE_CODE (t) == FIELD_DECL
163 && variably_modified_type_p (DECL_CONTEXT (t), NULL_TREE))
164 return false;
165 else
166 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
170 /* Output info about new location into bitpack BP.
171 After outputting bitpack, lto_output_location_data has
172 to be done to output actual data. */
174 void
175 lto_output_location (struct output_block *ob, struct bitpack_d *bp,
176 location_t loc)
178 expanded_location xloc;
180 loc = LOCATION_LOCUS (loc);
181 bp_pack_value (bp, loc == UNKNOWN_LOCATION, 1);
182 if (loc == UNKNOWN_LOCATION)
183 return;
185 xloc = expand_location (loc);
187 bp_pack_value (bp, ob->current_file != xloc.file, 1);
188 bp_pack_value (bp, ob->current_line != xloc.line, 1);
189 bp_pack_value (bp, ob->current_col != xloc.column, 1);
191 if (ob->current_file != xloc.file)
192 bp_pack_string (ob, bp, xloc.file, true);
193 ob->current_file = xloc.file;
195 if (ob->current_line != xloc.line)
196 bp_pack_var_len_unsigned (bp, xloc.line);
197 ob->current_line = xloc.line;
199 if (ob->current_col != xloc.column)
200 bp_pack_var_len_unsigned (bp, xloc.column);
201 ob->current_col = xloc.column;
205 /* If EXPR is an indexable tree node, output a reference to it to
206 output block OB. Otherwise, output the physical representation of
207 EXPR to OB. */
209 static void
210 lto_output_tree_ref (struct output_block *ob, tree expr)
212 enum tree_code code;
214 if (TYPE_P (expr))
216 output_type_ref (ob, expr);
217 return;
220 code = TREE_CODE (expr);
221 switch (code)
223 case SSA_NAME:
224 streamer_write_record_start (ob, LTO_ssa_name_ref);
225 streamer_write_uhwi (ob, SSA_NAME_VERSION (expr));
226 break;
228 case FIELD_DECL:
229 streamer_write_record_start (ob, LTO_field_decl_ref);
230 lto_output_field_decl_index (ob->decl_state, ob->main_stream, expr);
231 break;
233 case FUNCTION_DECL:
234 streamer_write_record_start (ob, LTO_function_decl_ref);
235 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, expr);
236 break;
238 case VAR_DECL:
239 case DEBUG_EXPR_DECL:
240 gcc_assert (decl_function_context (expr) == NULL || TREE_STATIC (expr));
241 case PARM_DECL:
242 streamer_write_record_start (ob, LTO_global_decl_ref);
243 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
244 break;
246 case CONST_DECL:
247 streamer_write_record_start (ob, LTO_const_decl_ref);
248 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
249 break;
251 case IMPORTED_DECL:
252 gcc_assert (decl_function_context (expr) == NULL);
253 streamer_write_record_start (ob, LTO_imported_decl_ref);
254 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
255 break;
257 case TYPE_DECL:
258 streamer_write_record_start (ob, LTO_type_decl_ref);
259 lto_output_type_decl_index (ob->decl_state, ob->main_stream, expr);
260 break;
262 case NAMELIST_DECL:
263 streamer_write_record_start (ob, LTO_namelist_decl_ref);
264 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
265 break;
267 case NAMESPACE_DECL:
268 streamer_write_record_start (ob, LTO_namespace_decl_ref);
269 lto_output_namespace_decl_index (ob->decl_state, ob->main_stream, expr);
270 break;
272 case LABEL_DECL:
273 streamer_write_record_start (ob, LTO_label_decl_ref);
274 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
275 break;
277 case RESULT_DECL:
278 streamer_write_record_start (ob, LTO_result_decl_ref);
279 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
280 break;
282 case TRANSLATION_UNIT_DECL:
283 streamer_write_record_start (ob, LTO_translation_unit_decl_ref);
284 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
285 break;
287 default:
288 /* No other node is indexable, so it should have been handled by
289 lto_output_tree. */
290 gcc_unreachable ();
295 /* Return true if EXPR is a tree node that can be written to disk. */
297 static inline bool
298 lto_is_streamable (tree expr)
300 enum tree_code code = TREE_CODE (expr);
302 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
303 name version in lto_output_tree_ref (see output_ssa_names). */
304 return !is_lang_specific (expr)
305 && code != SSA_NAME
306 && code != CALL_EXPR
307 && code != LANG_TYPE
308 && code != MODIFY_EXPR
309 && code != INIT_EXPR
310 && code != TARGET_EXPR
311 && code != BIND_EXPR
312 && code != WITH_CLEANUP_EXPR
313 && code != STATEMENT_LIST
314 && (code == CASE_LABEL_EXPR
315 || code == DECL_EXPR
316 || TREE_CODE_CLASS (code) != tcc_statement);
320 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
322 static tree
323 get_symbol_initial_value (lto_symtab_encoder_t encoder, tree expr)
325 gcc_checking_assert (DECL_P (expr)
326 && TREE_CODE (expr) != FUNCTION_DECL
327 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL);
329 /* Handle DECL_INITIAL for symbols. */
330 tree initial = DECL_INITIAL (expr);
331 if (TREE_CODE (expr) == VAR_DECL
332 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
333 && !DECL_IN_CONSTANT_POOL (expr)
334 && initial)
336 varpool_node *vnode;
337 /* Extra section needs about 30 bytes; do not produce it for simple
338 scalar values. */
339 if (TREE_CODE (DECL_INITIAL (expr)) == CONSTRUCTOR
340 || !(vnode = varpool_node::get (expr))
341 || !lto_symtab_encoder_encode_initializer_p (encoder, vnode))
342 initial = error_mark_node;
345 return initial;
349 /* Write a physical representation of tree node EXPR to output block
350 OB. If REF_P is true, the leaves of EXPR are emitted as references
351 via lto_output_tree_ref. IX is the index into the streamer cache
352 where EXPR is stored. */
354 static void
355 lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
357 /* Pack all the non-pointer fields in EXPR into a bitpack and write
358 the resulting bitpack. */
359 bitpack_d bp = bitpack_create (ob->main_stream);
360 streamer_pack_tree_bitfields (ob, &bp, expr);
361 streamer_write_bitpack (&bp);
363 /* Write all the pointer fields in EXPR. */
364 streamer_write_tree_body (ob, expr, ref_p);
366 /* Write any LTO-specific data to OB. */
367 if (DECL_P (expr)
368 && TREE_CODE (expr) != FUNCTION_DECL
369 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
371 /* Handle DECL_INITIAL for symbols. */
372 tree initial = get_symbol_initial_value
373 (ob->decl_state->symtab_node_encoder, expr);
374 stream_write_tree (ob, initial, ref_p);
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 (struct output_block *ob, tree expr, bool ref_p)
386 if (!lto_is_streamable (expr))
387 internal_error ("tree code %qs is not supported in LTO streams",
388 get_tree_code_name (TREE_CODE (expr)));
390 /* Write the header, containing everything needed to materialize
391 EXPR on the reading side. */
392 streamer_write_tree_header (ob, expr);
394 lto_write_tree_1 (ob, expr, ref_p);
396 /* Mark the end of EXPR. */
397 streamer_write_zero (ob);
400 /* Emit the physical representation of tree node EXPR to output block
401 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
402 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
404 static void
405 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
406 bool ref_p, bool this_ref_p)
408 unsigned ix;
410 gcc_checking_assert (expr != NULL_TREE
411 && !(this_ref_p && tree_is_indexable (expr)));
413 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
414 expr, hash, &ix);
415 gcc_assert (!exists_p);
416 if (streamer_handle_as_builtin_p (expr))
418 /* MD and NORMAL builtins do not need to be written out
419 completely as they are always instantiated by the
420 compiler on startup. The only builtins that need to
421 be written out are BUILT_IN_FRONTEND. For all other
422 builtins, we simply write the class and code. */
423 streamer_write_builtin (ob, expr);
425 else if (TREE_CODE (expr) == INTEGER_CST
426 && !TREE_OVERFLOW (expr))
428 /* Shared INTEGER_CST nodes are special because they need their
429 original type to be materialized by the reader (to implement
430 TYPE_CACHED_VALUES). */
431 streamer_write_integer_cst (ob, expr, ref_p);
433 else
435 /* This is the first time we see EXPR, write its fields
436 to OB. */
437 lto_write_tree (ob, expr, ref_p);
441 class DFS
443 public:
444 DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
445 bool single_p);
446 ~DFS ();
448 struct scc_entry
450 tree t;
451 hashval_t hash;
453 vec<scc_entry> sccstack;
455 private:
456 struct sccs
458 unsigned int dfsnum;
459 unsigned int low;
462 static int scc_entry_compare (const void *, const void *);
464 void DFS_write_tree_body (struct output_block *ob,
465 tree expr, sccs *expr_state, bool ref_p,
466 bool single_p);
468 void DFS_write_tree (struct output_block *ob, sccs *from_state,
469 tree expr, bool ref_p, bool this_ref_p,
470 bool single_p);
471 hashval_t
472 hash_scc (struct output_block *ob, unsigned first, unsigned size);
474 unsigned int next_dfs_num;
475 hash_map<tree, sccs *> sccstate;
476 struct obstack sccstate_obstack;
479 DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
480 bool single_p)
482 sccstack.create (0);
483 gcc_obstack_init (&sccstate_obstack);
484 next_dfs_num = 1;
485 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p, single_p);
488 DFS::~DFS ()
490 sccstack.release ();
491 obstack_free (&sccstate_obstack, NULL);
494 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
495 DFS recurse for all tree edges originating from it. */
497 void
498 DFS::DFS_write_tree_body (struct output_block *ob,
499 tree expr, sccs *expr_state, bool ref_p,
500 bool single_p)
502 #define DFS_follow_tree_edge(DEST) \
503 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p, single_p)
505 enum tree_code code;
507 code = TREE_CODE (expr);
509 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
511 if (TREE_CODE (expr) != IDENTIFIER_NODE)
512 DFS_follow_tree_edge (TREE_TYPE (expr));
515 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
517 for (unsigned i = 0; i < VECTOR_CST_NELTS (expr); ++i)
518 DFS_follow_tree_edge (VECTOR_CST_ELT (expr, i));
521 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
523 DFS_follow_tree_edge (TREE_REALPART (expr));
524 DFS_follow_tree_edge (TREE_IMAGPART (expr));
527 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
529 /* Drop names that were created for anonymous entities. */
530 if (DECL_NAME (expr)
531 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
532 && ANON_AGGRNAME_P (DECL_NAME (expr)))
534 else
535 DFS_follow_tree_edge (DECL_NAME (expr));
536 DFS_follow_tree_edge (DECL_CONTEXT (expr));
539 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
541 DFS_follow_tree_edge (DECL_SIZE (expr));
542 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
544 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
545 special handling in LTO, it must be handled by streamer hooks. */
547 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
549 /* Do not follow DECL_ABSTRACT_ORIGIN. We cannot handle debug information
550 for early inlining so drop it on the floor instead of ICEing in
551 dwarf2out.c. */
553 if ((TREE_CODE (expr) == VAR_DECL
554 || TREE_CODE (expr) == PARM_DECL)
555 && DECL_HAS_VALUE_EXPR_P (expr))
556 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
557 if (TREE_CODE (expr) == VAR_DECL)
558 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
561 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
563 if (TREE_CODE (expr) == TYPE_DECL)
564 DFS_follow_tree_edge (DECL_ORIGINAL_TYPE (expr));
567 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
569 /* Make sure we don't inadvertently set the assembler name. */
570 if (DECL_ASSEMBLER_NAME_SET_P (expr))
571 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
574 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
576 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
577 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
578 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
579 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
580 DFS_follow_tree_edge (DECL_FCONTEXT (expr));
583 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
585 DFS_follow_tree_edge (DECL_VINDEX (expr));
586 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
587 /* Do not DECL_FUNCTION_SPECIFIC_TARGET. They will be regenerated. */
588 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
591 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
593 DFS_follow_tree_edge (TYPE_SIZE (expr));
594 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
595 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
596 DFS_follow_tree_edge (TYPE_NAME (expr));
597 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
598 reconstructed during fixup. */
599 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
600 during fixup. */
601 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
602 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
603 /* TYPE_CANONICAL is re-computed during type merging, so no need
604 to follow it here. */
605 DFS_follow_tree_edge (TYPE_STUB_DECL (expr));
608 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
610 if (TREE_CODE (expr) == ENUMERAL_TYPE)
611 DFS_follow_tree_edge (TYPE_VALUES (expr));
612 else if (TREE_CODE (expr) == ARRAY_TYPE)
613 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
614 else if (RECORD_OR_UNION_TYPE_P (expr))
615 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
616 DFS_follow_tree_edge (t);
617 else if (TREE_CODE (expr) == FUNCTION_TYPE
618 || TREE_CODE (expr) == METHOD_TYPE)
619 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
621 if (!POINTER_TYPE_P (expr))
622 DFS_follow_tree_edge (TYPE_MINVAL (expr));
623 DFS_follow_tree_edge (TYPE_MAXVAL (expr));
624 if (RECORD_OR_UNION_TYPE_P (expr))
625 DFS_follow_tree_edge (TYPE_BINFO (expr));
628 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
630 DFS_follow_tree_edge (TREE_PURPOSE (expr));
631 DFS_follow_tree_edge (TREE_VALUE (expr));
632 DFS_follow_tree_edge (TREE_CHAIN (expr));
635 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
637 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
638 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
641 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
643 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
644 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
645 DFS_follow_tree_edge (TREE_BLOCK (expr));
648 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
650 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
651 /* ??? FIXME. See also streamer_write_chain. */
652 if (!(VAR_OR_FUNCTION_DECL_P (t)
653 && DECL_EXTERNAL (t)))
654 DFS_follow_tree_edge (t);
656 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
658 /* Follow BLOCK_ABSTRACT_ORIGIN for the limited cases we can
659 handle - those that represent inlined function scopes.
660 For the drop rest them on the floor instead of ICEing
661 in dwarf2out.c. */
662 if (inlined_function_outer_scope_p (expr))
664 tree ultimate_origin = block_ultimate_origin (expr);
665 DFS_follow_tree_edge (ultimate_origin);
667 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
668 information for early inlined BLOCKs so drop it on the floor instead
669 of ICEing in dwarf2out.c. */
671 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
672 streaming time. */
674 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
675 list is re-constructed from BLOCK_SUPERCONTEXT. */
678 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
680 unsigned i;
681 tree t;
683 /* Note that the number of BINFO slots has already been emitted in
684 EXPR's header (see streamer_write_tree_header) because this length
685 is needed to build the empty BINFO node on the reader side. */
686 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
687 DFS_follow_tree_edge (t);
688 DFS_follow_tree_edge (BINFO_OFFSET (expr));
689 DFS_follow_tree_edge (BINFO_VTABLE (expr));
690 DFS_follow_tree_edge (BINFO_VPTR_FIELD (expr));
692 /* The number of BINFO_BASE_ACCESSES has already been emitted in
693 EXPR's bitfield section. */
694 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
695 DFS_follow_tree_edge (t);
697 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
698 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
701 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
703 unsigned i;
704 tree index, value;
706 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
708 DFS_follow_tree_edge (index);
709 DFS_follow_tree_edge (value);
713 if (code == OMP_CLAUSE)
715 int i;
716 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
717 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
718 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
721 #undef DFS_follow_tree_edge
724 /* Return a hash value for the tree T.
725 CACHE holds hash values of trees outside current SCC. MAP, if non-NULL,
726 may hold hash values if trees inside current SCC. */
728 static hashval_t
729 hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map, tree t)
731 inchash::hash hstate;
733 #define visit(SIBLING) \
734 do { \
735 unsigned ix; \
736 if (!SIBLING) \
737 hstate.add_int (0); \
738 else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
739 hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \
740 else if (map) \
741 hstate.add_int (*map->get (SIBLING)); \
742 else \
743 hstate.add_int (1); \
744 } while (0)
746 /* Hash TS_BASE. */
747 enum tree_code code = TREE_CODE (t);
748 hstate.add_int (code);
749 if (!TYPE_P (t))
751 hstate.add_flag (TREE_SIDE_EFFECTS (t));
752 hstate.add_flag (TREE_CONSTANT (t));
753 hstate.add_flag (TREE_READONLY (t));
754 hstate.add_flag (TREE_PUBLIC (t));
756 hstate.add_flag (TREE_ADDRESSABLE (t));
757 hstate.add_flag (TREE_THIS_VOLATILE (t));
758 if (DECL_P (t))
759 hstate.add_flag (DECL_UNSIGNED (t));
760 else if (TYPE_P (t))
761 hstate.add_flag (TYPE_UNSIGNED (t));
762 if (TYPE_P (t))
763 hstate.add_flag (TYPE_ARTIFICIAL (t));
764 else
765 hstate.add_flag (TREE_NO_WARNING (t));
766 hstate.add_flag (TREE_NOTHROW (t));
767 hstate.add_flag (TREE_STATIC (t));
768 hstate.add_flag (TREE_PROTECTED (t));
769 hstate.add_flag (TREE_DEPRECATED (t));
770 if (code != TREE_BINFO)
771 hstate.add_flag (TREE_PRIVATE (t));
772 if (TYPE_P (t))
774 hstate.add_flag (TYPE_SATURATING (t));
775 hstate.add_flag (TYPE_ADDR_SPACE (t));
777 else if (code == SSA_NAME)
778 hstate.add_flag (SSA_NAME_IS_DEFAULT_DEF (t));
779 hstate.commit_flag ();
781 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
783 int i;
784 hstate.add_wide_int (TREE_INT_CST_NUNITS (t));
785 hstate.add_wide_int (TREE_INT_CST_EXT_NUNITS (t));
786 for (i = 0; i < TREE_INT_CST_NUNITS (t); i++)
787 hstate.add_wide_int (TREE_INT_CST_ELT (t, i));
790 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
792 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
793 hstate.add_flag (r.cl);
794 hstate.add_flag (r.sign);
795 hstate.add_flag (r.signalling);
796 hstate.add_flag (r.canonical);
797 hstate.commit_flag ();
798 hstate.add_int (r.uexp);
799 hstate.add (r.sig, sizeof (r.sig));
802 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
804 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
805 hstate.add_int (f.mode);
806 hstate.add_int (f.data.low);
807 hstate.add_int (f.data.high);
810 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
812 hstate.add_wide_int (DECL_MODE (t));
813 hstate.add_flag (DECL_NONLOCAL (t));
814 hstate.add_flag (DECL_VIRTUAL_P (t));
815 hstate.add_flag (DECL_IGNORED_P (t));
816 hstate.add_flag (DECL_ABSTRACT (t));
817 hstate.add_flag (DECL_ARTIFICIAL (t));
818 hstate.add_flag (DECL_USER_ALIGN (t));
819 hstate.add_flag (DECL_PRESERVE_P (t));
820 hstate.add_flag (DECL_EXTERNAL (t));
821 hstate.add_flag (DECL_GIMPLE_REG_P (t));
822 hstate.commit_flag ();
823 hstate.add_int (DECL_ALIGN (t));
824 if (code == LABEL_DECL)
826 hstate.add_int (EH_LANDING_PAD_NR (t));
827 hstate.add_int (LABEL_DECL_UID (t));
829 else if (code == FIELD_DECL)
831 hstate.add_flag (DECL_PACKED (t));
832 hstate.add_flag (DECL_NONADDRESSABLE_P (t));
833 hstate.add_int (DECL_OFFSET_ALIGN (t));
835 else if (code == VAR_DECL)
837 hstate.add_flag (DECL_HAS_DEBUG_EXPR_P (t));
838 hstate.add_flag (DECL_NONLOCAL_FRAME (t));
840 if (code == RESULT_DECL
841 || code == PARM_DECL
842 || code == VAR_DECL)
844 hstate.add_flag (DECL_BY_REFERENCE (t));
845 if (code == VAR_DECL
846 || code == PARM_DECL)
847 hstate.add_flag (DECL_HAS_VALUE_EXPR_P (t));
849 hstate.commit_flag ();
852 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
853 hstate.add_int (DECL_REGISTER (t));
855 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
857 hstate.add_flag (DECL_COMMON (t));
858 hstate.add_flag (DECL_DLLIMPORT_P (t));
859 hstate.add_flag (DECL_WEAK (t));
860 hstate.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t));
861 hstate.add_flag (DECL_COMDAT (t));
862 hstate.add_flag (DECL_VISIBILITY_SPECIFIED (t));
863 hstate.add_int (DECL_VISIBILITY (t));
864 if (code == VAR_DECL)
866 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
867 hstate.add_flag (DECL_HARD_REGISTER (t));
868 hstate.add_flag (DECL_IN_CONSTANT_POOL (t));
870 if (TREE_CODE (t) == FUNCTION_DECL)
872 hstate.add_flag (DECL_FINAL_P (t));
873 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (t));
874 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (t));
876 hstate.commit_flag ();
879 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
881 hstate.add_int (DECL_BUILT_IN_CLASS (t));
882 hstate.add_flag (DECL_STATIC_CONSTRUCTOR (t));
883 hstate.add_flag (DECL_STATIC_DESTRUCTOR (t));
884 hstate.add_flag (DECL_UNINLINABLE (t));
885 hstate.add_flag (DECL_POSSIBLY_INLINED (t));
886 hstate.add_flag (DECL_IS_NOVOPS (t));
887 hstate.add_flag (DECL_IS_RETURNS_TWICE (t));
888 hstate.add_flag (DECL_IS_MALLOC (t));
889 hstate.add_flag (DECL_IS_OPERATOR_NEW (t));
890 hstate.add_flag (DECL_DECLARED_INLINE_P (t));
891 hstate.add_flag (DECL_STATIC_CHAIN (t));
892 hstate.add_flag (DECL_NO_INLINE_WARNING_P (t));
893 hstate.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t));
894 hstate.add_flag (DECL_NO_LIMIT_STACK (t));
895 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (t));
896 hstate.add_flag (DECL_PURE_P (t));
897 hstate.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t));
898 hstate.commit_flag ();
899 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
900 hstate.add_int (DECL_FUNCTION_CODE (t));
903 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
905 hstate.add_wide_int (TYPE_MODE (t));
906 hstate.add_flag (TYPE_STRING_FLAG (t));
907 hstate.add_flag (TYPE_NO_FORCE_BLK (t));
908 hstate.add_flag (TYPE_NEEDS_CONSTRUCTING (t));
909 hstate.add_flag (TYPE_PACKED (t));
910 hstate.add_flag (TYPE_RESTRICT (t));
911 hstate.add_flag (TYPE_USER_ALIGN (t));
912 hstate.add_flag (TYPE_READONLY (t));
913 if (RECORD_OR_UNION_TYPE_P (t))
915 hstate.add_flag (TYPE_TRANSPARENT_AGGR (t));
916 hstate.add_flag (TYPE_FINAL_P (t));
918 else if (code == ARRAY_TYPE)
919 hstate.add_flag (TYPE_NONALIASED_COMPONENT (t));
920 hstate.commit_flag ();
921 hstate.add_int (TYPE_PRECISION (t));
922 hstate.add_int (TYPE_ALIGN (t));
923 hstate.add_int ((TYPE_ALIAS_SET (t) == 0
924 || (!in_lto_p
925 && get_alias_set (t) == 0))
926 ? 0 : -1);
929 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
930 hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
931 strlen (TRANSLATION_UNIT_LANGUAGE (t)));
933 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
934 gcc_unreachable ();
936 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
937 hstate.add (t, sizeof (struct cl_optimization));
939 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
940 hstate.merge_hash (IDENTIFIER_HASH_VALUE (t));
942 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
943 hstate.add (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t));
945 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
947 if (code != IDENTIFIER_NODE)
948 visit (TREE_TYPE (t));
951 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
952 for (unsigned i = 0; i < VECTOR_CST_NELTS (t); ++i)
953 visit (VECTOR_CST_ELT (t, i));
955 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
957 visit (TREE_REALPART (t));
958 visit (TREE_IMAGPART (t));
961 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
963 /* Drop names that were created for anonymous entities. */
964 if (DECL_NAME (t)
965 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
966 && ANON_AGGRNAME_P (DECL_NAME (t)))
968 else
969 visit (DECL_NAME (t));
970 if (DECL_FILE_SCOPE_P (t))
972 else
973 visit (DECL_CONTEXT (t));
976 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
978 visit (DECL_SIZE (t));
979 visit (DECL_SIZE_UNIT (t));
980 visit (DECL_ATTRIBUTES (t));
981 if ((code == VAR_DECL
982 || code == PARM_DECL)
983 && DECL_HAS_VALUE_EXPR_P (t))
984 visit (DECL_VALUE_EXPR (t));
985 if (code == VAR_DECL
986 && DECL_HAS_DEBUG_EXPR_P (t))
987 visit (DECL_DEBUG_EXPR (t));
988 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
989 be able to call get_symbol_initial_value. */
992 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
994 if (code == TYPE_DECL)
995 visit (DECL_ORIGINAL_TYPE (t));
998 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1000 if (DECL_ASSEMBLER_NAME_SET_P (t))
1001 visit (DECL_ASSEMBLER_NAME (t));
1004 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1006 visit (DECL_FIELD_OFFSET (t));
1007 visit (DECL_BIT_FIELD_TYPE (t));
1008 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
1009 visit (DECL_FIELD_BIT_OFFSET (t));
1010 visit (DECL_FCONTEXT (t));
1013 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1015 visit (DECL_VINDEX (t));
1016 visit (DECL_FUNCTION_PERSONALITY (t));
1017 /* Do not follow DECL_FUNCTION_SPECIFIC_TARGET. */
1018 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
1021 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1023 visit (TYPE_SIZE (t));
1024 visit (TYPE_SIZE_UNIT (t));
1025 visit (TYPE_ATTRIBUTES (t));
1026 visit (TYPE_NAME (t));
1027 visit (TYPE_MAIN_VARIANT (t));
1028 if (TYPE_FILE_SCOPE_P (t))
1030 else
1031 visit (TYPE_CONTEXT (t));
1032 visit (TYPE_STUB_DECL (t));
1035 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1037 if (code == ENUMERAL_TYPE)
1038 visit (TYPE_VALUES (t));
1039 else if (code == ARRAY_TYPE)
1040 visit (TYPE_DOMAIN (t));
1041 else if (RECORD_OR_UNION_TYPE_P (t))
1042 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1043 visit (f);
1044 else if (code == FUNCTION_TYPE
1045 || code == METHOD_TYPE)
1046 visit (TYPE_ARG_TYPES (t));
1047 if (!POINTER_TYPE_P (t))
1048 visit (TYPE_MINVAL (t));
1049 visit (TYPE_MAXVAL (t));
1050 if (RECORD_OR_UNION_TYPE_P (t))
1051 visit (TYPE_BINFO (t));
1054 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1056 visit (TREE_PURPOSE (t));
1057 visit (TREE_VALUE (t));
1058 visit (TREE_CHAIN (t));
1061 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1062 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1063 visit (TREE_VEC_ELT (t, i));
1065 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1067 hstate.add_wide_int (TREE_OPERAND_LENGTH (t));
1068 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1069 visit (TREE_OPERAND (t, i));
1072 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1074 unsigned i;
1075 tree b;
1076 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1077 visit (b);
1078 visit (BINFO_OFFSET (t));
1079 visit (BINFO_VTABLE (t));
1080 visit (BINFO_VPTR_FIELD (t));
1081 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t), i, b)
1082 visit (b);
1083 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1084 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
1087 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1089 unsigned i;
1090 tree index, value;
1091 hstate.add_wide_int (CONSTRUCTOR_NELTS (t));
1092 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1094 visit (index);
1095 visit (value);
1099 if (code == OMP_CLAUSE)
1101 int i;
1102 HOST_WIDE_INT val;
1104 hstate.add_wide_int (OMP_CLAUSE_CODE (t));
1105 switch (OMP_CLAUSE_CODE (t))
1107 case OMP_CLAUSE_DEFAULT:
1108 val = OMP_CLAUSE_DEFAULT_KIND (t);
1109 break;
1110 case OMP_CLAUSE_SCHEDULE:
1111 val = OMP_CLAUSE_SCHEDULE_KIND (t);
1112 break;
1113 case OMP_CLAUSE_DEPEND:
1114 val = OMP_CLAUSE_DEPEND_KIND (t);
1115 break;
1116 case OMP_CLAUSE_MAP:
1117 val = OMP_CLAUSE_MAP_KIND (t);
1118 break;
1119 case OMP_CLAUSE_PROC_BIND:
1120 val = OMP_CLAUSE_PROC_BIND_KIND (t);
1121 break;
1122 case OMP_CLAUSE_REDUCTION:
1123 val = OMP_CLAUSE_REDUCTION_CODE (t);
1124 break;
1125 default:
1126 val = 0;
1127 break;
1129 hstate.add_wide_int (val);
1130 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1131 visit (OMP_CLAUSE_OPERAND (t, i));
1132 visit (OMP_CLAUSE_CHAIN (t));
1135 return hstate.end ();
1137 #undef visit
1140 /* Compare two SCC entries by their hash value for qsorting them. */
1143 DFS::scc_entry_compare (const void *p1_, const void *p2_)
1145 const scc_entry *p1 = (const scc_entry *) p1_;
1146 const scc_entry *p2 = (const scc_entry *) p2_;
1147 if (p1->hash < p2->hash)
1148 return -1;
1149 else if (p1->hash > p2->hash)
1150 return 1;
1151 return 0;
1154 /* Return a hash value for the SCC on the SCC stack from FIRST with
1155 size SIZE. */
1157 hashval_t
1158 DFS::hash_scc (struct output_block *ob,
1159 unsigned first, unsigned size)
1161 unsigned int last_classes = 0, iterations = 0;
1163 /* Compute hash values for the SCC members. */
1164 for (unsigned i = 0; i < size; ++i)
1165 sccstack[first+i].hash = hash_tree (ob->writer_cache, NULL,
1166 sccstack[first+i].t);
1168 if (size == 1)
1169 return sccstack[first].hash;
1171 /* We aim to get unique hash for every tree within SCC and compute hash value
1172 of the whole SCC by combing all values together in an stable (entry point
1173 independent) order. This guarantees that the same SCC regions within
1174 different translation units will get the same hash values and therefore
1175 will be merged at WPA time.
1177 Often the hashes are already unique. In that case we compute scc hash
1178 by combining individual hash values in an increasing order.
1180 If thre are duplicates we seek at least one tree with unique hash (and
1181 pick one with minimal hash and this property). Then we obtain stable
1182 order by DFS walk starting from this unique tree and then use index
1183 within this order to make individual hash values unique.
1185 If there is no tree with unique hash, we iteratively propagate the hash
1186 values across the internal edges of SCC. This usually quickly leads
1187 to unique hashes. Consider, for example, an SCC containing two pointers
1188 that are identical except for type they point and assume that these
1189 types are also part of the SCC.
1190 The propagation will add the points-to type information into their hash
1191 values. */
1194 /* Sort the SCC so we can easily see check for uniqueness. */
1195 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1197 unsigned int classes = 1;
1198 int firstunique = -1;
1200 /* Find tree with lowest unique hash (if it exists) and compute
1201 number of equivalence classes. */
1202 if (sccstack[first].hash != sccstack[first+1].hash)
1203 firstunique = 0;
1204 for (unsigned i = 1; i < size; ++i)
1205 if (sccstack[first+i-1].hash != sccstack[first+i].hash)
1207 classes++;
1208 if (firstunique == -1
1209 && (i == size - 1
1210 || sccstack[first+i+1].hash != sccstack[first+i].hash))
1211 firstunique = i;
1214 /* If we found tree with unique hash; stop the iteration. */
1215 if (firstunique != -1
1216 /* Also terminate if we run out of iterations or if the number of
1217 equivalence classes is no longer increasing.
1218 For example a cyclic list of trees that are all equivalent will
1219 never have unique entry point; we however do not build such SCCs
1220 in our IL. */
1221 || classes <= last_classes || iterations > 16)
1223 hashval_t scc_hash;
1225 /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk
1226 starting from FIRSTUNIQUE to obstain stable order. */
1227 if (classes != size && firstunique != -1)
1229 hash_map <tree, hashval_t> map(size*2);
1231 /* Store hash values into a map, so we can associate them with
1232 reordered SCC. */
1233 for (unsigned i = 0; i < size; ++i)
1234 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1236 DFS again (ob, sccstack[first+firstunique].t, false, false, true);
1237 gcc_assert (again.sccstack.length () == size);
1239 memcpy (sccstack.address () + first,
1240 again.sccstack.address (),
1241 sizeof (scc_entry) * size);
1243 /* Update hash values of individual members by hashing in the
1244 index within the stable order. This ensures uniqueness.
1245 Also compute the scc_hash by mixing in all hash values in the
1246 stable order we obtained. */
1247 sccstack[first].hash = *map.get (sccstack[first].t);
1248 scc_hash = sccstack[first].hash;
1249 for (unsigned i = 1; i < size; ++i)
1251 sccstack[first+i].hash
1252 = iterative_hash_hashval_t (i,
1253 *map.get (sccstack[first+i].t));
1254 scc_hash = iterative_hash_hashval_t (scc_hash,
1255 sccstack[first+i].hash);
1258 /* If we got unique hash values for each tree, then sort already
1259 ensured entry point independent order. Only compute the final
1260 scc hash.
1262 If we failed to find the unique entry point, we go by the same
1263 route. We will eventually introduce unwanted hash conflicts. */
1264 else
1266 scc_hash = sccstack[first].hash;
1267 for (unsigned i = 1; i < size; ++i)
1268 scc_hash = iterative_hash_hashval_t (scc_hash,
1269 sccstack[first+i].hash);
1270 /* We can not 100% guarantee that the hash will not conflict in
1271 in a way so the unique hash is not found. This however
1272 should be extremely rare situation. ICE for now so possible
1273 issues are found and evaulated. */
1274 gcc_checking_assert (classes == size);
1277 /* To avoid conflicts across SCCs iteratively hash the whole SCC
1278 hash into the hash of each of the elements. */
1279 for (unsigned i = 0; i < size; ++i)
1280 sccstack[first+i].hash
1281 = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
1282 return scc_hash;
1285 last_classes = classes;
1286 iterations++;
1288 /* We failed to identify the entry point; propagate hash values across
1289 the edges. */
1291 hash_map <tree, hashval_t> map(size*2);
1292 for (unsigned i = 0; i < size; ++i)
1293 map.put (sccstack[first+i].t, sccstack[first+i].hash);
1295 for (unsigned i = 0; i < size; i++)
1296 sccstack[first+i].hash = hash_tree (ob->writer_cache, &map,
1297 sccstack[first+i].t);
1300 while (true);
1303 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1304 already in the streamer cache. Main routine called for
1305 each visit of EXPR. */
1307 void
1308 DFS::DFS_write_tree (struct output_block *ob, sccs *from_state,
1309 tree expr, bool ref_p, bool this_ref_p, bool single_p)
1311 unsigned ix;
1313 /* Handle special cases. */
1314 if (expr == NULL_TREE)
1315 return;
1317 /* Do not DFS walk into indexable trees. */
1318 if (this_ref_p && tree_is_indexable (expr))
1319 return;
1321 /* Check if we already streamed EXPR. */
1322 if (streamer_tree_cache_lookup (ob->writer_cache, expr, &ix))
1323 return;
1325 sccs **slot = &sccstate.get_or_insert (expr);
1326 sccs *cstate = *slot;
1327 if (!cstate)
1329 scc_entry e = { expr, 0 };
1330 /* Not yet visited. DFS recurse and push it onto the stack. */
1331 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
1332 sccstack.safe_push (e);
1333 cstate->dfsnum = next_dfs_num++;
1334 cstate->low = cstate->dfsnum;
1336 if (streamer_handle_as_builtin_p (expr))
1338 else if (TREE_CODE (expr) == INTEGER_CST
1339 && !TREE_OVERFLOW (expr))
1340 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p, single_p);
1341 else
1343 DFS_write_tree_body (ob, expr, cstate, ref_p, single_p);
1345 /* Walk any LTO-specific edges. */
1346 if (DECL_P (expr)
1347 && TREE_CODE (expr) != FUNCTION_DECL
1348 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1350 /* Handle DECL_INITIAL for symbols. */
1351 tree initial = get_symbol_initial_value (ob->decl_state->symtab_node_encoder,
1352 expr);
1353 DFS_write_tree (ob, cstate, initial, ref_p, ref_p, single_p);
1357 /* See if we found an SCC. */
1358 if (cstate->low == cstate->dfsnum)
1360 unsigned first, size;
1361 tree x;
1363 /* If we are re-walking a single leaf-SCC just return and
1364 let the caller access the sccstack. */
1365 if (single_p)
1366 return;
1368 /* Pop the SCC and compute its size. */
1369 first = sccstack.length ();
1372 x = sccstack[--first].t;
1374 while (x != expr);
1375 size = sccstack.length () - first;
1377 /* No need to compute hashes for LTRANS units, we don't perform
1378 any merging there. */
1379 hashval_t scc_hash = 0;
1380 unsigned scc_entry_len = 0;
1381 if (!flag_wpa)
1383 scc_hash = hash_scc (ob, first, size);
1385 /* Put the entries with the least number of collisions first. */
1386 unsigned entry_start = 0;
1387 scc_entry_len = size + 1;
1388 for (unsigned i = 0; i < size;)
1390 unsigned from = i;
1391 for (i = i + 1; i < size
1392 && (sccstack[first + i].hash
1393 == sccstack[first + from].hash); ++i)
1395 if (i - from < scc_entry_len)
1397 scc_entry_len = i - from;
1398 entry_start = from;
1401 for (unsigned i = 0; i < scc_entry_len; ++i)
1403 scc_entry tem = sccstack[first + i];
1404 sccstack[first + i] = sccstack[first + entry_start + i];
1405 sccstack[first + entry_start + i] = tem;
1408 if (scc_entry_len == 1)
1409 ; /* We already sorted SCC deterministically in hash_scc. */
1410 else
1411 /* Check that we have only one SCC.
1412 Naturally we may have conflicts if hash function is not
1413 strong enough. Lets see how far this gets. */
1415 #ifdef ENABLE_CHECKING
1416 gcc_unreachable ();
1417 #endif
1421 /* Write LTO_tree_scc. */
1422 streamer_write_record_start (ob, LTO_tree_scc);
1423 streamer_write_uhwi (ob, size);
1424 streamer_write_uhwi (ob, scc_hash);
1426 /* Write size-1 SCCs without wrapping them inside SCC bundles.
1427 All INTEGER_CSTs need to be handled this way as we need
1428 their type to materialize them. Also builtins are handled
1429 this way.
1430 ??? We still wrap these in LTO_tree_scc so at the
1431 input side we can properly identify the tree we want
1432 to ultimatively return. */
1433 if (size == 1)
1434 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
1435 else
1437 /* Write the size of the SCC entry candidates. */
1438 streamer_write_uhwi (ob, scc_entry_len);
1440 /* Write all headers and populate the streamer cache. */
1441 for (unsigned i = 0; i < size; ++i)
1443 hashval_t hash = sccstack[first+i].hash;
1444 tree t = sccstack[first+i].t;
1445 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
1446 t, hash, &ix);
1447 gcc_assert (!exists_p);
1449 if (!lto_is_streamable (t))
1450 internal_error ("tree code %qs is not supported "
1451 "in LTO streams",
1452 get_tree_code_name (TREE_CODE (t)));
1454 gcc_checking_assert (!streamer_handle_as_builtin_p (t));
1456 /* Write the header, containing everything needed to
1457 materialize EXPR on the reading side. */
1458 streamer_write_tree_header (ob, t);
1461 /* Write the bitpacks and tree references. */
1462 for (unsigned i = 0; i < size; ++i)
1464 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
1466 /* Mark the end of the tree. */
1467 streamer_write_zero (ob);
1471 /* Finally truncate the vector. */
1472 sccstack.truncate (first);
1474 if (from_state)
1475 from_state->low = MIN (from_state->low, cstate->low);
1476 return;
1479 if (from_state)
1480 from_state->low = MIN (from_state->low, cstate->low);
1482 gcc_checking_assert (from_state);
1483 if (cstate->dfsnum < from_state->dfsnum)
1484 from_state->low = MIN (cstate->dfsnum, from_state->low);
1488 /* Emit the physical representation of tree node EXPR to output block
1489 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
1490 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1492 void
1493 lto_output_tree (struct output_block *ob, tree expr,
1494 bool ref_p, bool this_ref_p)
1496 unsigned ix;
1497 bool existed_p;
1499 if (expr == NULL_TREE)
1501 streamer_write_record_start (ob, LTO_null);
1502 return;
1505 if (this_ref_p && tree_is_indexable (expr))
1507 lto_output_tree_ref (ob, expr);
1508 return;
1511 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1512 if (existed_p)
1514 /* If a node has already been streamed out, make sure that
1515 we don't write it more than once. Otherwise, the reader
1516 will instantiate two different nodes for the same object. */
1517 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1518 streamer_write_uhwi (ob, ix);
1519 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1520 lto_tree_code_to_tag (TREE_CODE (expr)));
1521 lto_stats.num_pickle_refs_output++;
1523 else
1525 /* This is the first time we see EXPR, write all reachable
1526 trees to OB. */
1527 static bool in_dfs_walk;
1529 /* Protect against recursion which means disconnect between
1530 what tree edges we walk in the DFS walk and what edges
1531 we stream out. */
1532 gcc_assert (!in_dfs_walk);
1534 /* Start the DFS walk. */
1535 /* Save ob state ... */
1536 /* let's see ... */
1537 in_dfs_walk = true;
1538 DFS (ob, expr, ref_p, this_ref_p, false);
1539 in_dfs_walk = false;
1541 /* Finally append a reference to the tree we were writing.
1542 ??? If expr ended up as a singleton we could have
1543 inlined it here and avoid outputting a reference. */
1544 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1545 gcc_assert (existed_p);
1546 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1547 streamer_write_uhwi (ob, ix);
1548 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1549 lto_tree_code_to_tag (TREE_CODE (expr)));
1550 lto_stats.num_pickle_refs_output++;
1555 /* Output to OB a list of try/catch handlers starting with FIRST. */
1557 static void
1558 output_eh_try_list (struct output_block *ob, eh_catch first)
1560 eh_catch n;
1562 for (n = first; n; n = n->next_catch)
1564 streamer_write_record_start (ob, LTO_eh_catch);
1565 stream_write_tree (ob, n->type_list, true);
1566 stream_write_tree (ob, n->filter_list, true);
1567 stream_write_tree (ob, n->label, true);
1570 streamer_write_record_start (ob, LTO_null);
1574 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1575 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1576 detect EH region sharing. */
1578 static void
1579 output_eh_region (struct output_block *ob, eh_region r)
1581 enum LTO_tags tag;
1583 if (r == NULL)
1585 streamer_write_record_start (ob, LTO_null);
1586 return;
1589 if (r->type == ERT_CLEANUP)
1590 tag = LTO_ert_cleanup;
1591 else if (r->type == ERT_TRY)
1592 tag = LTO_ert_try;
1593 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1594 tag = LTO_ert_allowed_exceptions;
1595 else if (r->type == ERT_MUST_NOT_THROW)
1596 tag = LTO_ert_must_not_throw;
1597 else
1598 gcc_unreachable ();
1600 streamer_write_record_start (ob, tag);
1601 streamer_write_hwi (ob, r->index);
1603 if (r->outer)
1604 streamer_write_hwi (ob, r->outer->index);
1605 else
1606 streamer_write_zero (ob);
1608 if (r->inner)
1609 streamer_write_hwi (ob, r->inner->index);
1610 else
1611 streamer_write_zero (ob);
1613 if (r->next_peer)
1614 streamer_write_hwi (ob, r->next_peer->index);
1615 else
1616 streamer_write_zero (ob);
1618 if (r->type == ERT_TRY)
1620 output_eh_try_list (ob, r->u.eh_try.first_catch);
1622 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1624 stream_write_tree (ob, r->u.allowed.type_list, true);
1625 stream_write_tree (ob, r->u.allowed.label, true);
1626 streamer_write_uhwi (ob, r->u.allowed.filter);
1628 else if (r->type == ERT_MUST_NOT_THROW)
1630 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1631 bitpack_d bp = bitpack_create (ob->main_stream);
1632 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1633 streamer_write_bitpack (&bp);
1636 if (r->landing_pads)
1637 streamer_write_hwi (ob, r->landing_pads->index);
1638 else
1639 streamer_write_zero (ob);
1643 /* Output landing pad LP to OB. */
1645 static void
1646 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1648 if (lp == NULL)
1650 streamer_write_record_start (ob, LTO_null);
1651 return;
1654 streamer_write_record_start (ob, LTO_eh_landing_pad);
1655 streamer_write_hwi (ob, lp->index);
1656 if (lp->next_lp)
1657 streamer_write_hwi (ob, lp->next_lp->index);
1658 else
1659 streamer_write_zero (ob);
1661 if (lp->region)
1662 streamer_write_hwi (ob, lp->region->index);
1663 else
1664 streamer_write_zero (ob);
1666 stream_write_tree (ob, lp->post_landing_pad, true);
1670 /* Output the existing eh_table to OB. */
1672 static void
1673 output_eh_regions (struct output_block *ob, struct function *fn)
1675 if (fn->eh && fn->eh->region_tree)
1677 unsigned i;
1678 eh_region eh;
1679 eh_landing_pad lp;
1680 tree ttype;
1682 streamer_write_record_start (ob, LTO_eh_table);
1684 /* Emit the index of the root of the EH region tree. */
1685 streamer_write_hwi (ob, fn->eh->region_tree->index);
1687 /* Emit all the EH regions in the region array. */
1688 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
1689 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
1690 output_eh_region (ob, eh);
1692 /* Emit all landing pads. */
1693 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
1694 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
1695 output_eh_lp (ob, lp);
1697 /* Emit all the runtime type data. */
1698 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
1699 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
1700 stream_write_tree (ob, ttype, true);
1702 /* Emit the table of action chains. */
1703 if (targetm.arm_eabi_unwinder)
1705 tree t;
1706 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
1707 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
1708 stream_write_tree (ob, t, true);
1710 else
1712 uchar c;
1713 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
1714 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
1715 streamer_write_char_stream (ob->main_stream, c);
1719 /* The LTO_null either terminates the record or indicates that there
1720 are no eh_records at all. */
1721 streamer_write_record_start (ob, LTO_null);
1725 /* Output all of the active ssa names to the ssa_names stream. */
1727 static void
1728 output_ssa_names (struct output_block *ob, struct function *fn)
1730 unsigned int i, len;
1732 len = vec_safe_length (SSANAMES (fn));
1733 streamer_write_uhwi (ob, len);
1735 for (i = 1; i < len; i++)
1737 tree ptr = (*SSANAMES (fn))[i];
1739 if (ptr == NULL_TREE
1740 || SSA_NAME_IN_FREE_LIST (ptr)
1741 || virtual_operand_p (ptr))
1742 continue;
1744 streamer_write_uhwi (ob, i);
1745 streamer_write_char_stream (ob->main_stream,
1746 SSA_NAME_IS_DEFAULT_DEF (ptr));
1747 if (SSA_NAME_VAR (ptr))
1748 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
1749 else
1750 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1751 stream_write_tree (ob, TREE_TYPE (ptr), true);
1754 streamer_write_zero (ob);
1758 /* Output a wide-int. */
1760 static void
1761 streamer_write_wi (struct output_block *ob,
1762 const widest_int &w)
1764 int len = w.get_len ();
1766 streamer_write_uhwi (ob, w.get_precision ());
1767 streamer_write_uhwi (ob, len);
1768 for (int i = 0; i < len; i++)
1769 streamer_write_hwi (ob, w.elt (i));
1773 /* Output the cfg. */
1775 static void
1776 output_cfg (struct output_block *ob, struct function *fn)
1778 struct lto_output_stream *tmp_stream = ob->main_stream;
1779 basic_block bb;
1781 ob->main_stream = ob->cfg_stream;
1783 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1784 profile_status_for_fn (fn));
1786 /* Output the number of the highest basic block. */
1787 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
1789 FOR_ALL_BB_FN (bb, fn)
1791 edge_iterator ei;
1792 edge e;
1794 streamer_write_hwi (ob, bb->index);
1796 /* Output the successors and the edge flags. */
1797 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
1798 FOR_EACH_EDGE (e, ei, bb->succs)
1800 streamer_write_uhwi (ob, e->dest->index);
1801 streamer_write_hwi (ob, e->probability);
1802 streamer_write_gcov_count (ob, e->count);
1803 streamer_write_uhwi (ob, e->flags);
1807 streamer_write_hwi (ob, -1);
1809 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1810 while (bb->next_bb)
1812 streamer_write_hwi (ob, bb->next_bb->index);
1813 bb = bb->next_bb;
1816 streamer_write_hwi (ob, -1);
1818 /* ??? The cfgloop interface is tied to cfun. */
1819 gcc_assert (cfun == fn);
1821 /* Output the number of loops. */
1822 streamer_write_uhwi (ob, number_of_loops (fn));
1824 /* Output each loop, skipping the tree root which has number zero. */
1825 for (unsigned i = 1; i < number_of_loops (fn); ++i)
1827 struct loop *loop = get_loop (fn, i);
1829 /* Write the index of the loop header. That's enough to rebuild
1830 the loop tree on the reader side. Stream -1 for an unused
1831 loop entry. */
1832 if (!loop)
1834 streamer_write_hwi (ob, -1);
1835 continue;
1837 else
1838 streamer_write_hwi (ob, loop->header->index);
1840 /* Write everything copy_loop_info copies. */
1841 streamer_write_enum (ob->main_stream,
1842 loop_estimation, EST_LAST, loop->estimate_state);
1843 streamer_write_hwi (ob, loop->any_upper_bound);
1844 if (loop->any_upper_bound)
1845 streamer_write_wi (ob, loop->nb_iterations_upper_bound);
1846 streamer_write_hwi (ob, loop->any_estimate);
1847 if (loop->any_estimate)
1848 streamer_write_wi (ob, loop->nb_iterations_estimate);
1850 /* Write OMP SIMD related info. */
1851 streamer_write_hwi (ob, loop->safelen);
1852 streamer_write_hwi (ob, loop->dont_vectorize);
1853 streamer_write_hwi (ob, loop->force_vectorize);
1854 stream_write_tree (ob, loop->simduid, true);
1857 ob->main_stream = tmp_stream;
1861 /* Create the header in the file using OB. If the section type is for
1862 a function, set FN to the decl for that function. */
1864 void
1865 produce_asm (struct output_block *ob, tree fn)
1867 enum lto_section_type section_type = ob->section_type;
1868 struct lto_function_header header;
1869 char *section_name;
1871 if (section_type == LTO_section_function_body)
1873 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1874 section_name = lto_get_section_name (section_type, name, NULL);
1876 else
1877 section_name = lto_get_section_name (section_type, NULL, NULL);
1879 lto_begin_section (section_name, !flag_wpa);
1880 free (section_name);
1882 /* The entire header is stream computed here. */
1883 memset (&header, 0, sizeof (struct lto_function_header));
1885 /* Write the header. */
1886 header.major_version = LTO_major_version;
1887 header.minor_version = LTO_minor_version;
1889 if (section_type == LTO_section_function_body)
1890 header.cfg_size = ob->cfg_stream->total_size;
1891 header.main_size = ob->main_stream->total_size;
1892 header.string_size = ob->string_stream->total_size;
1893 lto_write_data (&header, sizeof header);
1895 /* Put all of the gimple and the string table out the asm file as a
1896 block of text. */
1897 if (section_type == LTO_section_function_body)
1898 lto_write_stream (ob->cfg_stream);
1899 lto_write_stream (ob->main_stream);
1900 lto_write_stream (ob->string_stream);
1902 lto_end_section ();
1906 /* Output the base body of struct function FN using output block OB. */
1908 static void
1909 output_struct_function_base (struct output_block *ob, struct function *fn)
1911 struct bitpack_d bp;
1912 unsigned i;
1913 tree t;
1915 /* Output the static chain and non-local goto save area. */
1916 stream_write_tree (ob, fn->static_chain_decl, true);
1917 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
1919 /* Output all the local variables in the function. */
1920 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
1921 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
1922 stream_write_tree (ob, t, true);
1924 /* Output current IL state of the function. */
1925 streamer_write_uhwi (ob, fn->curr_properties);
1927 /* Write all the attributes for FN. */
1928 bp = bitpack_create (ob->main_stream);
1929 bp_pack_value (&bp, fn->is_thunk, 1);
1930 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
1931 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
1932 bp_pack_value (&bp, fn->returns_struct, 1);
1933 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
1934 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
1935 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
1936 bp_pack_value (&bp, fn->after_inlining, 1);
1937 bp_pack_value (&bp, fn->stdarg, 1);
1938 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
1939 bp_pack_value (&bp, fn->calls_alloca, 1);
1940 bp_pack_value (&bp, fn->calls_setjmp, 1);
1941 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
1942 bp_pack_value (&bp, fn->has_simduid_loops, 1);
1943 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
1944 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
1946 /* Output the function start and end loci. */
1947 stream_output_location (ob, &bp, fn->function_start_locus);
1948 stream_output_location (ob, &bp, fn->function_end_locus);
1950 streamer_write_bitpack (&bp);
1954 /* Output the body of function NODE->DECL. */
1956 static void
1957 output_function (struct cgraph_node *node)
1959 tree function;
1960 struct function *fn;
1961 basic_block bb;
1962 struct output_block *ob;
1964 function = node->decl;
1965 fn = DECL_STRUCT_FUNCTION (function);
1966 ob = create_output_block (LTO_section_function_body);
1968 clear_line_info (ob);
1969 ob->symbol = node;
1971 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
1973 /* Set current_function_decl and cfun. */
1974 push_cfun (fn);
1976 /* Make string 0 be a NULL string. */
1977 streamer_write_char_stream (ob->string_stream, 0);
1979 streamer_write_record_start (ob, LTO_function);
1981 /* Output decls for parameters and args. */
1982 stream_write_tree (ob, DECL_RESULT (function), true);
1983 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
1985 /* Output DECL_INITIAL for the function, which contains the tree of
1986 lexical scopes. */
1987 stream_write_tree (ob, DECL_INITIAL (function), true);
1989 /* We also stream abstract functions where we stream only stuff needed for
1990 debug info. */
1991 if (gimple_has_body_p (function))
1993 streamer_write_uhwi (ob, 1);
1994 output_struct_function_base (ob, fn);
1996 /* Output all the SSA names used in the function. */
1997 output_ssa_names (ob, fn);
1999 /* Output any exception handling regions. */
2000 output_eh_regions (ob, fn);
2003 /* We will renumber the statements. The code that does this uses
2004 the same ordering that we use for serializing them so we can use
2005 the same code on the other end and not have to write out the
2006 statement numbers. We do not assign UIDs to PHIs here because
2007 virtual PHIs get re-computed on-the-fly which would make numbers
2008 inconsistent. */
2009 set_gimple_stmt_max_uid (cfun, 0);
2010 FOR_ALL_BB_FN (bb, cfun)
2012 gimple_stmt_iterator gsi;
2013 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2015 gimple stmt = gsi_stmt (gsi);
2017 /* Virtual PHIs are not going to be streamed. */
2018 if (!virtual_operand_p (gimple_phi_result (stmt)))
2019 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
2021 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2023 gimple stmt = gsi_stmt (gsi);
2024 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
2027 /* To avoid keeping duplicate gimple IDs in the statements, renumber
2028 virtual phis now. */
2029 FOR_ALL_BB_FN (bb, cfun)
2031 gimple_stmt_iterator gsi;
2032 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2034 gimple stmt = gsi_stmt (gsi);
2035 if (virtual_operand_p (gimple_phi_result (stmt)))
2036 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
2040 /* Output the code for the function. */
2041 FOR_ALL_BB_FN (bb, fn)
2042 output_bb (ob, bb, fn);
2044 /* The terminator for this function. */
2045 streamer_write_record_start (ob, LTO_null);
2047 output_cfg (ob, fn);
2049 pop_cfun ();
2051 else
2052 streamer_write_uhwi (ob, 0);
2054 /* Create a section to hold the pickled output of this function. */
2055 produce_asm (ob, function);
2057 destroy_output_block (ob);
2060 /* Output the body of function NODE->DECL. */
2062 static void
2063 output_constructor (struct varpool_node *node)
2065 tree var = node->decl;
2066 struct output_block *ob;
2068 ob = create_output_block (LTO_section_function_body);
2070 clear_line_info (ob);
2071 ob->symbol = node;
2073 /* Make string 0 be a NULL string. */
2074 streamer_write_char_stream (ob->string_stream, 0);
2076 /* Output DECL_INITIAL for the function, which contains the tree of
2077 lexical scopes. */
2078 stream_write_tree (ob, DECL_INITIAL (var), true);
2080 /* Create a section to hold the pickled output of this function. */
2081 produce_asm (ob, var);
2083 destroy_output_block (ob);
2087 /* Emit toplevel asms. */
2089 void
2090 lto_output_toplevel_asms (void)
2092 struct output_block *ob;
2093 struct asm_node *can;
2094 char *section_name;
2095 struct lto_simple_header_with_strings header;
2097 if (! asm_nodes)
2098 return;
2100 ob = create_output_block (LTO_section_asm);
2102 /* Make string 0 be a NULL string. */
2103 streamer_write_char_stream (ob->string_stream, 0);
2105 for (can = asm_nodes; can; can = can->next)
2107 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
2108 streamer_write_hwi (ob, can->order);
2111 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
2113 section_name = lto_get_section_name (LTO_section_asm, NULL, NULL);
2114 lto_begin_section (section_name, !flag_wpa);
2115 free (section_name);
2117 /* The entire header stream is computed here. */
2118 memset (&header, 0, sizeof (header));
2120 /* Write the header. */
2121 header.major_version = LTO_major_version;
2122 header.minor_version = LTO_minor_version;
2124 header.main_size = ob->main_stream->total_size;
2125 header.string_size = ob->string_stream->total_size;
2126 lto_write_data (&header, sizeof header);
2128 /* Put all of the gimple and the string table out the asm file as a
2129 block of text. */
2130 lto_write_stream (ob->main_stream);
2131 lto_write_stream (ob->string_stream);
2133 lto_end_section ();
2135 destroy_output_block (ob);
2139 /* Copy the function body or variable constructor of NODE without deserializing. */
2141 static void
2142 copy_function_or_variable (struct symtab_node *node)
2144 tree function = node->decl;
2145 struct lto_file_decl_data *file_data = node->lto_file_data;
2146 const char *data;
2147 size_t len;
2148 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
2149 char *section_name =
2150 lto_get_section_name (LTO_section_function_body, name, NULL);
2151 size_t i, j;
2152 struct lto_in_decl_state *in_state;
2153 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
2155 lto_begin_section (section_name, !flag_wpa);
2156 free (section_name);
2158 /* We may have renamed the declaration, e.g., a static function. */
2159 name = lto_get_decl_name_mapping (file_data, name);
2161 data = lto_get_section_data (file_data, LTO_section_function_body,
2162 name, &len);
2163 gcc_assert (data);
2165 /* Do a bit copy of the function body. */
2166 lto_write_data (data, len);
2168 /* Copy decls. */
2169 in_state =
2170 lto_get_function_in_decl_state (node->lto_file_data, function);
2171 gcc_assert (in_state);
2173 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2175 size_t n = in_state->streams[i].size;
2176 tree *trees = in_state->streams[i].trees;
2177 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2179 /* The out state must have the same indices and the in state.
2180 So just copy the vector. All the encoders in the in state
2181 must be empty where we reach here. */
2182 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2183 encoder->trees.reserve_exact (n);
2184 for (j = 0; j < n; j++)
2185 encoder->trees.safe_push (trees[j]);
2188 lto_free_section_data (file_data, LTO_section_function_body, name,
2189 data, len);
2190 lto_end_section ();
2193 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2195 static tree
2196 wrap_refs (tree *tp, int *ws, void *)
2198 tree t = *tp;
2199 if (handled_component_p (t)
2200 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL)
2202 tree decl = TREE_OPERAND (t, 0);
2203 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2204 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2205 build1 (ADDR_EXPR, ptrtype, decl),
2206 build_int_cst (ptrtype, 0));
2207 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2208 *ws = 0;
2210 else if (TREE_CODE (t) == CONSTRUCTOR)
2212 else if (!EXPR_P (t))
2213 *ws = 0;
2214 return NULL_TREE;
2217 /* Main entry point from the pass manager. */
2219 void
2220 lto_output (void)
2222 struct lto_out_decl_state *decl_state;
2223 #ifdef ENABLE_CHECKING
2224 bitmap output = lto_bitmap_alloc ();
2225 #endif
2226 int i, n_nodes;
2227 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
2229 /* Initialize the streamer. */
2230 lto_streamer_init ();
2232 n_nodes = lto_symtab_encoder_size (encoder);
2233 /* Process only the functions with bodies. */
2234 for (i = 0; i < n_nodes; i++)
2236 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
2237 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
2239 if (lto_symtab_encoder_encode_body_p (encoder, node)
2240 && !node->alias)
2242 #ifdef ENABLE_CHECKING
2243 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2244 bitmap_set_bit (output, DECL_UID (node->decl));
2245 #endif
2246 decl_state = lto_new_out_decl_state ();
2247 lto_push_out_decl_state (decl_state);
2248 if (gimple_has_body_p (node->decl) || !flag_wpa)
2249 output_function (node);
2250 else
2251 copy_function_or_variable (node);
2252 gcc_assert (lto_get_out_decl_state () == decl_state);
2253 lto_pop_out_decl_state ();
2254 lto_record_function_out_decl_state (node->decl, decl_state);
2257 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
2259 /* Wrap symbol references inside the ctor in a type
2260 preserving MEM_REF. */
2261 tree ctor = DECL_INITIAL (node->decl);
2262 if (ctor && !in_lto_p)
2263 walk_tree (&ctor, wrap_refs, NULL, NULL);
2264 if (get_symbol_initial_value (encoder, node->decl) == error_mark_node
2265 && lto_symtab_encoder_encode_initializer_p (encoder, node)
2266 && !node->alias)
2268 timevar_push (TV_IPA_LTO_CTORS_OUT);
2269 #ifdef ENABLE_CHECKING
2270 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2271 bitmap_set_bit (output, DECL_UID (node->decl));
2272 #endif
2273 decl_state = lto_new_out_decl_state ();
2274 lto_push_out_decl_state (decl_state);
2275 if (DECL_INITIAL (node->decl) != error_mark_node
2276 || !flag_wpa)
2277 output_constructor (node);
2278 else
2279 copy_function_or_variable (node);
2280 gcc_assert (lto_get_out_decl_state () == decl_state);
2281 lto_pop_out_decl_state ();
2282 lto_record_function_out_decl_state (node->decl, decl_state);
2283 timevar_pop (TV_IPA_LTO_CTORS_OUT);
2288 /* Emit the callgraph after emitting function bodies. This needs to
2289 be done now to make sure that all the statements in every function
2290 have been renumbered so that edges can be associated with call
2291 statements using the statement UIDs. */
2292 output_symtab ();
2294 #ifdef ENABLE_CHECKING
2295 lto_bitmap_free (output);
2296 #endif
2299 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2300 from it and required for correct representation of its semantics.
2301 Each node in ENCODER must be a global declaration or a type. A node
2302 is written only once, even if it appears multiple times in the
2303 vector. Certain transitively-reachable nodes, such as those
2304 representing expressions, may be duplicated, but such nodes
2305 must not appear in ENCODER itself. */
2307 static void
2308 write_global_stream (struct output_block *ob,
2309 struct lto_tree_ref_encoder *encoder)
2311 tree t;
2312 size_t index;
2313 const size_t size = lto_tree_ref_encoder_size (encoder);
2315 for (index = 0; index < size; index++)
2317 t = lto_tree_ref_encoder_get_tree (encoder, index);
2318 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2319 stream_write_tree (ob, t, false);
2324 /* Write a sequence of indices into the globals vector corresponding
2325 to the trees in ENCODER. These are used by the reader to map the
2326 indices used to refer to global entities within function bodies to
2327 their referents. */
2329 static void
2330 write_global_references (struct output_block *ob,
2331 struct lto_tree_ref_encoder *encoder)
2333 tree t;
2334 uint32_t index;
2335 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2337 /* Write size and slot indexes as 32-bit unsigned numbers. */
2338 uint32_t *data = XNEWVEC (uint32_t, size + 1);
2339 data[0] = size;
2341 for (index = 0; index < size; index++)
2343 uint32_t slot_num;
2345 t = lto_tree_ref_encoder_get_tree (encoder, index);
2346 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2347 gcc_assert (slot_num != (unsigned)-1);
2348 data[index + 1] = slot_num;
2351 lto_write_data (data, sizeof (int32_t) * (size + 1));
2352 free (data);
2356 /* Write all the streams in an lto_out_decl_state STATE using
2357 output block OB and output stream OUT_STREAM. */
2359 void
2360 lto_output_decl_state_streams (struct output_block *ob,
2361 struct lto_out_decl_state *state)
2363 int i;
2365 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2366 write_global_stream (ob, &state->streams[i]);
2370 /* Write all the references in an lto_out_decl_state STATE using
2371 output block OB and output stream OUT_STREAM. */
2373 void
2374 lto_output_decl_state_refs (struct output_block *ob,
2375 struct lto_out_decl_state *state)
2377 unsigned i;
2378 uint32_t ref;
2379 tree decl;
2381 /* Write reference to FUNCTION_DECL. If there is not function,
2382 write reference to void_type_node. */
2383 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2384 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2385 gcc_assert (ref != (unsigned)-1);
2386 lto_write_data (&ref, sizeof (uint32_t));
2388 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2389 write_global_references (ob, &state->streams[i]);
2393 /* Return the written size of STATE. */
2395 static size_t
2396 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2398 int i;
2399 size_t size;
2401 size = sizeof (int32_t); /* fn_ref. */
2402 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2404 size += sizeof (int32_t); /* vector size. */
2405 size += (lto_tree_ref_encoder_size (&state->streams[i])
2406 * sizeof (int32_t));
2408 return size;
2412 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2413 so far. */
2415 static void
2416 write_symbol (struct streamer_tree_cache_d *cache,
2417 tree t, hash_set<const char *> *seen, bool alias)
2419 const char *name;
2420 enum gcc_plugin_symbol_kind kind;
2421 enum gcc_plugin_symbol_visibility visibility;
2422 unsigned slot_num;
2423 uint64_t size;
2424 const char *comdat;
2425 unsigned char c;
2427 /* None of the following kinds of symbols are needed in the
2428 symbol table. */
2429 if (!TREE_PUBLIC (t)
2430 || is_builtin_fn (t)
2431 || DECL_ABSTRACT (t)
2432 || (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)))
2433 return;
2434 gcc_assert (TREE_CODE (t) != RESULT_DECL);
2436 gcc_assert (TREE_CODE (t) == VAR_DECL
2437 || TREE_CODE (t) == FUNCTION_DECL);
2439 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2441 /* This behaves like assemble_name_raw in varasm.c, performing the
2442 same name manipulations that ASM_OUTPUT_LABELREF does. */
2443 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2445 if (seen->add (name))
2446 return;
2448 streamer_tree_cache_lookup (cache, t, &slot_num);
2449 gcc_assert (slot_num != (unsigned)-1);
2451 if (DECL_EXTERNAL (t))
2453 if (DECL_WEAK (t))
2454 kind = GCCPK_WEAKUNDEF;
2455 else
2456 kind = GCCPK_UNDEF;
2458 else
2460 if (DECL_WEAK (t))
2461 kind = GCCPK_WEAKDEF;
2462 else if (DECL_COMMON (t))
2463 kind = GCCPK_COMMON;
2464 else
2465 kind = GCCPK_DEF;
2467 /* When something is defined, it should have node attached. */
2468 gcc_assert (alias || TREE_CODE (t) != VAR_DECL
2469 || varpool_node::get (t)->definition);
2470 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2471 || (cgraph_node::get (t)
2472 && cgraph_node::get (t)->definition));
2475 /* Imitate what default_elf_asm_output_external do.
2476 When symbol is external, we need to output it with DEFAULT visibility
2477 when compiling with -fvisibility=default, while with HIDDEN visibility
2478 when symbol has attribute (visibility("hidden")) specified.
2479 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2480 right. */
2482 if (DECL_EXTERNAL (t)
2483 && !targetm.binds_local_p (t))
2484 visibility = GCCPV_DEFAULT;
2485 else
2486 switch (DECL_VISIBILITY (t))
2488 case VISIBILITY_DEFAULT:
2489 visibility = GCCPV_DEFAULT;
2490 break;
2491 case VISIBILITY_PROTECTED:
2492 visibility = GCCPV_PROTECTED;
2493 break;
2494 case VISIBILITY_HIDDEN:
2495 visibility = GCCPV_HIDDEN;
2496 break;
2497 case VISIBILITY_INTERNAL:
2498 visibility = GCCPV_INTERNAL;
2499 break;
2502 if (kind == GCCPK_COMMON
2503 && DECL_SIZE_UNIT (t)
2504 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
2505 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2506 else
2507 size = 0;
2509 if (DECL_ONE_ONLY (t))
2510 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
2511 else
2512 comdat = "";
2514 lto_write_data (name, strlen (name) + 1);
2515 lto_write_data (comdat, strlen (comdat) + 1);
2516 c = (unsigned char) kind;
2517 lto_write_data (&c, 1);
2518 c = (unsigned char) visibility;
2519 lto_write_data (&c, 1);
2520 lto_write_data (&size, 8);
2521 lto_write_data (&slot_num, 4);
2524 /* Return true if NODE should appear in the plugin symbol table. */
2526 bool
2527 output_symbol_p (symtab_node *node)
2529 struct cgraph_node *cnode;
2530 if (!node->real_symbol_p ())
2531 return false;
2532 /* We keep external functions in symtab for sake of inlining
2533 and devirtualization. We do not want to see them in symbol table as
2534 references unless they are really used. */
2535 cnode = dyn_cast <cgraph_node *> (node);
2536 if (cnode && (!node->definition || DECL_EXTERNAL (cnode->decl))
2537 && cnode->callers)
2538 return true;
2540 /* Ignore all references from external vars initializers - they are not really
2541 part of the compilation unit until they are used by folding. Some symbols,
2542 like references to external construction vtables can not be referred to at all.
2543 We decide this at can_refer_decl_in_current_unit_p. */
2544 if (!node->definition || DECL_EXTERNAL (node->decl))
2546 int i;
2547 struct ipa_ref *ref;
2548 for (i = 0; node->iterate_referring (i, ref); i++)
2550 if (ref->use == IPA_REF_ALIAS)
2551 continue;
2552 if (is_a <cgraph_node *> (ref->referring))
2553 return true;
2554 if (!DECL_EXTERNAL (ref->referring->decl))
2555 return true;
2557 return false;
2559 return true;
2563 /* Write an IL symbol table to OB.
2564 SET and VSET are cgraph/varpool node sets we are outputting. */
2566 static void
2567 produce_symtab (struct output_block *ob)
2569 struct streamer_tree_cache_d *cache = ob->writer_cache;
2570 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
2571 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2572 lto_symtab_encoder_iterator lsei;
2574 lto_begin_section (section_name, false);
2575 free (section_name);
2577 hash_set<const char *> seen;
2579 /* Write the symbol table.
2580 First write everything defined and then all declarations.
2581 This is necessary to handle cases where we have duplicated symbols. */
2582 for (lsei = lsei_start (encoder);
2583 !lsei_end_p (lsei); lsei_next (&lsei))
2585 symtab_node *node = lsei_node (lsei);
2587 if (!output_symbol_p (node) || DECL_EXTERNAL (node->decl))
2588 continue;
2589 write_symbol (cache, node->decl, &seen, false);
2591 for (lsei = lsei_start (encoder);
2592 !lsei_end_p (lsei); lsei_next (&lsei))
2594 symtab_node *node = lsei_node (lsei);
2596 if (!output_symbol_p (node) || !DECL_EXTERNAL (node->decl))
2597 continue;
2598 write_symbol (cache, node->decl, &seen, false);
2601 lto_end_section ();
2605 /* This pass is run after all of the functions are serialized and all
2606 of the IPA passes have written their serialized forms. This pass
2607 causes the vector of all of the global decls and types used from
2608 this file to be written in to a section that can then be read in to
2609 recover these on other side. */
2611 void
2612 produce_asm_for_decls (void)
2614 struct lto_out_decl_state *out_state;
2615 struct lto_out_decl_state *fn_out_state;
2616 struct lto_decl_header header;
2617 char *section_name;
2618 struct output_block *ob;
2619 unsigned idx, num_fns;
2620 size_t decl_state_size;
2621 int32_t num_decl_states;
2623 ob = create_output_block (LTO_section_decls);
2625 memset (&header, 0, sizeof (struct lto_decl_header));
2627 section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
2628 lto_begin_section (section_name, !flag_wpa);
2629 free (section_name);
2631 /* Make string 0 be a NULL string. */
2632 streamer_write_char_stream (ob->string_stream, 0);
2634 gcc_assert (!alias_pairs);
2636 /* Get rid of the global decl state hash tables to save some memory. */
2637 out_state = lto_get_out_decl_state ();
2638 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
2639 if (out_state->streams[i].tree_hash_table)
2641 delete out_state->streams[i].tree_hash_table;
2642 out_state->streams[i].tree_hash_table = NULL;
2645 /* Write the global symbols. */
2646 lto_output_decl_state_streams (ob, out_state);
2647 num_fns = lto_function_decl_states.length ();
2648 for (idx = 0; idx < num_fns; idx++)
2650 fn_out_state =
2651 lto_function_decl_states[idx];
2652 lto_output_decl_state_streams (ob, fn_out_state);
2655 header.major_version = LTO_major_version;
2656 header.minor_version = LTO_minor_version;
2658 /* Currently not used. This field would allow us to preallocate
2659 the globals vector, so that it need not be resized as it is extended. */
2660 header.num_nodes = -1;
2662 /* Compute the total size of all decl out states. */
2663 decl_state_size = sizeof (int32_t);
2664 decl_state_size += lto_out_decl_state_written_size (out_state);
2665 for (idx = 0; idx < num_fns; idx++)
2667 fn_out_state =
2668 lto_function_decl_states[idx];
2669 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2671 header.decl_state_size = decl_state_size;
2673 header.main_size = ob->main_stream->total_size;
2674 header.string_size = ob->string_stream->total_size;
2676 lto_write_data (&header, sizeof header);
2678 /* Write the main out-decl state, followed by out-decl states of
2679 functions. */
2680 num_decl_states = num_fns + 1;
2681 lto_write_data (&num_decl_states, sizeof (num_decl_states));
2682 lto_output_decl_state_refs (ob, out_state);
2683 for (idx = 0; idx < num_fns; idx++)
2685 fn_out_state = lto_function_decl_states[idx];
2686 lto_output_decl_state_refs (ob, fn_out_state);
2689 lto_write_stream (ob->main_stream);
2690 lto_write_stream (ob->string_stream);
2692 lto_end_section ();
2694 /* Write the symbol table. It is used by linker to determine dependencies
2695 and thus we can skip it for WPA. */
2696 if (!flag_wpa)
2697 produce_symtab (ob);
2699 /* Write command line opts. */
2700 lto_write_options ();
2702 /* Deallocate memory and clean up. */
2703 for (idx = 0; idx < num_fns; idx++)
2705 fn_out_state =
2706 lto_function_decl_states[idx];
2707 lto_delete_out_decl_state (fn_out_state);
2709 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
2710 lto_function_decl_states.release ();
2711 destroy_output_block (ob);