* lto-streamer-out.c (tree_is_indexable): Consider IMPORTED_DECL
[official-gcc.git] / gcc / lto-streamer-out.c
blob355ceeaaf08a0b37cd555d65eb6c46056fff5870
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 "basic-block.h"
36 #include "tree-ssa-alias.h"
37 #include "internal-fn.h"
38 #include "gimple-expr.h"
39 #include "is-a.h"
40 #include "gimple.h"
41 #include "gimple-iterator.h"
42 #include "gimple-ssa.h"
43 #include "tree-ssanames.h"
44 #include "tree-pass.h"
45 #include "function.h"
46 #include "diagnostic-core.h"
47 #include "except.h"
48 #include "lto-symtab.h"
49 #include "lto-streamer.h"
50 #include "data-streamer.h"
51 #include "gimple-streamer.h"
52 #include "tree-streamer.h"
53 #include "streamer-hooks.h"
54 #include "cfgloop.h"
55 #include "builtins.h"
58 static void lto_write_tree (struct output_block*, tree, bool);
60 /* Clear the line info stored in DATA_IN. */
62 static void
63 clear_line_info (struct output_block *ob)
65 ob->current_file = NULL;
66 ob->current_line = 0;
67 ob->current_col = 0;
71 /* Create the output block and return it. SECTION_TYPE is
72 LTO_section_function_body or LTO_static_initializer. */
74 struct output_block *
75 create_output_block (enum lto_section_type section_type)
77 struct output_block *ob = XCNEW (struct output_block);
79 ob->section_type = section_type;
80 ob->decl_state = lto_get_out_decl_state ();
81 ob->main_stream = XCNEW (struct lto_output_stream);
82 ob->string_stream = XCNEW (struct lto_output_stream);
83 ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true, false);
85 if (section_type == LTO_section_function_body)
86 ob->cfg_stream = XCNEW (struct lto_output_stream);
88 clear_line_info (ob);
90 ob->string_hash_table = new hash_table<string_slot_hasher> (37);
91 gcc_obstack_init (&ob->obstack);
93 return ob;
97 /* Destroy the output block OB. */
99 void
100 destroy_output_block (struct output_block *ob)
102 enum lto_section_type section_type = ob->section_type;
104 delete ob->string_hash_table;
105 ob->string_hash_table = NULL;
107 free (ob->main_stream);
108 free (ob->string_stream);
109 if (section_type == LTO_section_function_body)
110 free (ob->cfg_stream);
112 streamer_tree_cache_delete (ob->writer_cache);
113 obstack_free (&ob->obstack, NULL);
115 free (ob);
119 /* Look up NODE in the type table and write the index for it to OB. */
121 static void
122 output_type_ref (struct output_block *ob, tree node)
124 streamer_write_record_start (ob, LTO_type_ref);
125 lto_output_type_ref_index (ob->decl_state, ob->main_stream, node);
129 /* Return true if tree node T is written to various tables. For these
130 nodes, we sometimes want to write their phyiscal representation
131 (via lto_output_tree), and sometimes we need to emit an index
132 reference into a table (via lto_output_tree_ref). */
134 static bool
135 tree_is_indexable (tree t)
137 /* Parameters and return values of functions of variably modified types
138 must go to global stream, because they may be used in the type
139 definition. */
140 if (TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
141 return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)), NULL_TREE);
142 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared. */
143 else if (TREE_CODE (t) == IMPORTED_DECL)
144 return false;
145 else if (((TREE_CODE (t) == VAR_DECL && !TREE_STATIC (t))
146 || TREE_CODE (t) == TYPE_DECL
147 || TREE_CODE (t) == CONST_DECL
148 || TREE_CODE (t) == NAMELIST_DECL)
149 && decl_function_context (t))
150 return false;
151 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
152 return false;
153 /* Variably modified types need to be streamed alongside function
154 bodies because they can refer to local entities. Together with
155 them we have to localize their members as well.
156 ??? In theory that includes non-FIELD_DECLs as well. */
157 else if (TYPE_P (t)
158 && variably_modified_type_p (t, NULL_TREE))
159 return false;
160 else if (TREE_CODE (t) == FIELD_DECL
161 && variably_modified_type_p (DECL_CONTEXT (t), NULL_TREE))
162 return false;
163 else
164 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
168 /* Output info about new location into bitpack BP.
169 After outputting bitpack, lto_output_location_data has
170 to be done to output actual data. */
172 void
173 lto_output_location (struct output_block *ob, struct bitpack_d *bp,
174 location_t loc)
176 expanded_location xloc;
178 loc = LOCATION_LOCUS (loc);
179 bp_pack_value (bp, loc == UNKNOWN_LOCATION, 1);
180 if (loc == UNKNOWN_LOCATION)
181 return;
183 xloc = expand_location (loc);
185 bp_pack_value (bp, ob->current_file != xloc.file, 1);
186 bp_pack_value (bp, ob->current_line != xloc.line, 1);
187 bp_pack_value (bp, ob->current_col != xloc.column, 1);
189 if (ob->current_file != xloc.file)
190 bp_pack_var_len_unsigned (bp,
191 streamer_string_index (ob, xloc.file,
192 strlen (xloc.file) + 1,
193 true));
194 ob->current_file = xloc.file;
196 if (ob->current_line != xloc.line)
197 bp_pack_var_len_unsigned (bp, xloc.line);
198 ob->current_line = xloc.line;
200 if (ob->current_col != xloc.column)
201 bp_pack_var_len_unsigned (bp, xloc.column);
202 ob->current_col = xloc.column;
206 /* If EXPR is an indexable tree node, output a reference to it to
207 output block OB. Otherwise, output the physical representation of
208 EXPR to OB. */
210 static void
211 lto_output_tree_ref (struct output_block *ob, tree expr)
213 enum tree_code code;
215 if (TYPE_P (expr))
217 output_type_ref (ob, expr);
218 return;
221 code = TREE_CODE (expr);
222 switch (code)
224 case SSA_NAME:
225 streamer_write_record_start (ob, LTO_ssa_name_ref);
226 streamer_write_uhwi (ob, SSA_NAME_VERSION (expr));
227 break;
229 case FIELD_DECL:
230 streamer_write_record_start (ob, LTO_field_decl_ref);
231 lto_output_field_decl_index (ob->decl_state, ob->main_stream, expr);
232 break;
234 case FUNCTION_DECL:
235 streamer_write_record_start (ob, LTO_function_decl_ref);
236 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, expr);
237 break;
239 case VAR_DECL:
240 case DEBUG_EXPR_DECL:
241 gcc_assert (decl_function_context (expr) == NULL || TREE_STATIC (expr));
242 case PARM_DECL:
243 streamer_write_record_start (ob, LTO_global_decl_ref);
244 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
245 break;
247 case CONST_DECL:
248 streamer_write_record_start (ob, LTO_const_decl_ref);
249 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
250 break;
252 case IMPORTED_DECL:
253 gcc_assert (decl_function_context (expr) == NULL);
254 streamer_write_record_start (ob, LTO_imported_decl_ref);
255 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
256 break;
258 case TYPE_DECL:
259 streamer_write_record_start (ob, LTO_type_decl_ref);
260 lto_output_type_decl_index (ob->decl_state, ob->main_stream, expr);
261 break;
263 case NAMELIST_DECL:
264 streamer_write_record_start (ob, LTO_namelist_decl_ref);
265 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
266 break;
268 case NAMESPACE_DECL:
269 streamer_write_record_start (ob, LTO_namespace_decl_ref);
270 lto_output_namespace_decl_index (ob->decl_state, ob->main_stream, expr);
271 break;
273 case LABEL_DECL:
274 streamer_write_record_start (ob, LTO_label_decl_ref);
275 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
276 break;
278 case RESULT_DECL:
279 streamer_write_record_start (ob, LTO_result_decl_ref);
280 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
281 break;
283 case TRANSLATION_UNIT_DECL:
284 streamer_write_record_start (ob, LTO_translation_unit_decl_ref);
285 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
286 break;
288 default:
289 /* No other node is indexable, so it should have been handled by
290 lto_output_tree. */
291 gcc_unreachable ();
296 /* Return true if EXPR is a tree node that can be written to disk. */
298 static inline bool
299 lto_is_streamable (tree expr)
301 enum tree_code code = TREE_CODE (expr);
303 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
304 name version in lto_output_tree_ref (see output_ssa_names). */
305 return !is_lang_specific (expr)
306 && code != SSA_NAME
307 && code != CALL_EXPR
308 && code != LANG_TYPE
309 && code != MODIFY_EXPR
310 && code != INIT_EXPR
311 && code != TARGET_EXPR
312 && code != BIND_EXPR
313 && code != WITH_CLEANUP_EXPR
314 && code != STATEMENT_LIST
315 && (code == CASE_LABEL_EXPR
316 || code == DECL_EXPR
317 || TREE_CODE_CLASS (code) != tcc_statement);
321 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
323 static tree
324 get_symbol_initial_value (lto_symtab_encoder_t encoder, tree expr)
326 gcc_checking_assert (DECL_P (expr)
327 && TREE_CODE (expr) != FUNCTION_DECL
328 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL);
330 /* Handle DECL_INITIAL for symbols. */
331 tree initial = DECL_INITIAL (expr);
332 if (TREE_CODE (expr) == VAR_DECL
333 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
334 && !DECL_IN_CONSTANT_POOL (expr)
335 && initial)
337 varpool_node *vnode;
338 /* Extra section needs about 30 bytes; do not produce it for simple
339 scalar values. */
340 if (TREE_CODE (DECL_INITIAL (expr)) == CONSTRUCTOR
341 || !(vnode = varpool_node::get (expr))
342 || !lto_symtab_encoder_encode_initializer_p (encoder, vnode))
343 initial = error_mark_node;
346 return initial;
350 /* Write a physical representation of tree node EXPR to output block
351 OB. If REF_P is true, the leaves of EXPR are emitted as references
352 via lto_output_tree_ref. IX is the index into the streamer cache
353 where EXPR is stored. */
355 static void
356 lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
358 /* Pack all the non-pointer fields in EXPR into a bitpack and write
359 the resulting bitpack. */
360 bitpack_d bp = bitpack_create (ob->main_stream);
361 streamer_pack_tree_bitfields (ob, &bp, expr);
362 streamer_write_bitpack (&bp);
364 /* Write all the pointer fields in EXPR. */
365 streamer_write_tree_body (ob, expr, ref_p);
367 /* Write any LTO-specific data to OB. */
368 if (DECL_P (expr)
369 && TREE_CODE (expr) != FUNCTION_DECL
370 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
372 /* Handle DECL_INITIAL for symbols. */
373 tree initial = get_symbol_initial_value
374 (ob->decl_state->symtab_node_encoder, expr);
375 stream_write_tree (ob, initial, ref_p);
379 /* Write a physical representation of tree node EXPR to output block
380 OB. If REF_P is true, the leaves of EXPR are emitted as references
381 via lto_output_tree_ref. IX is the index into the streamer cache
382 where EXPR is stored. */
384 static void
385 lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
387 if (!lto_is_streamable (expr))
388 internal_error ("tree code %qs is not supported in LTO streams",
389 get_tree_code_name (TREE_CODE (expr)));
391 /* Write the header, containing everything needed to materialize
392 EXPR on the reading side. */
393 streamer_write_tree_header (ob, expr);
395 lto_write_tree_1 (ob, expr, ref_p);
397 /* Mark the end of EXPR. */
398 streamer_write_zero (ob);
401 /* Emit the physical representation of tree node EXPR to output block
402 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
403 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
405 static void
406 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
407 bool ref_p, bool this_ref_p)
409 unsigned ix;
411 gcc_checking_assert (expr != NULL_TREE
412 && !(this_ref_p && tree_is_indexable (expr)));
414 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
415 expr, hash, &ix);
416 gcc_assert (!exists_p);
417 if (streamer_handle_as_builtin_p (expr))
419 /* MD and NORMAL builtins do not need to be written out
420 completely as they are always instantiated by the
421 compiler on startup. The only builtins that need to
422 be written out are BUILT_IN_FRONTEND. For all other
423 builtins, we simply write the class and code. */
424 streamer_write_builtin (ob, expr);
426 else if (TREE_CODE (expr) == INTEGER_CST
427 && !TREE_OVERFLOW (expr))
429 /* Shared INTEGER_CST nodes are special because they need their
430 original type to be materialized by the reader (to implement
431 TYPE_CACHED_VALUES). */
432 streamer_write_integer_cst (ob, expr, ref_p);
434 else
436 /* This is the first time we see EXPR, write its fields
437 to OB. */
438 lto_write_tree (ob, expr, ref_p);
442 struct sccs
444 unsigned int dfsnum;
445 unsigned int low;
448 struct scc_entry
450 tree t;
451 hashval_t hash;
454 static unsigned int next_dfs_num;
455 static vec<scc_entry> sccstack;
456 static struct pointer_map_t *sccstate;
457 static struct obstack sccstate_obstack;
459 static void
460 DFS_write_tree (struct output_block *ob, sccs *from_state,
461 tree expr, bool ref_p, bool this_ref_p);
463 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
464 DFS recurse for all tree edges originating from it. */
466 static void
467 DFS_write_tree_body (struct output_block *ob,
468 tree expr, sccs *expr_state, bool ref_p)
470 #define DFS_follow_tree_edge(DEST) \
471 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
473 enum tree_code code;
475 code = TREE_CODE (expr);
477 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
479 if (TREE_CODE (expr) != IDENTIFIER_NODE)
480 DFS_follow_tree_edge (TREE_TYPE (expr));
483 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
485 for (unsigned i = 0; i < VECTOR_CST_NELTS (expr); ++i)
486 DFS_follow_tree_edge (VECTOR_CST_ELT (expr, i));
489 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
491 DFS_follow_tree_edge (TREE_REALPART (expr));
492 DFS_follow_tree_edge (TREE_IMAGPART (expr));
495 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
497 /* Drop names that were created for anonymous entities. */
498 if (DECL_NAME (expr)
499 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
500 && ANON_AGGRNAME_P (DECL_NAME (expr)))
502 else
503 DFS_follow_tree_edge (DECL_NAME (expr));
504 DFS_follow_tree_edge (DECL_CONTEXT (expr));
507 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
509 DFS_follow_tree_edge (DECL_SIZE (expr));
510 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
512 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
513 special handling in LTO, it must be handled by streamer hooks. */
515 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
517 /* Do not follow DECL_ABSTRACT_ORIGIN. We cannot handle debug information
518 for early inlining so drop it on the floor instead of ICEing in
519 dwarf2out.c. */
521 if ((TREE_CODE (expr) == VAR_DECL
522 || TREE_CODE (expr) == PARM_DECL)
523 && DECL_HAS_VALUE_EXPR_P (expr))
524 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
525 if (TREE_CODE (expr) == VAR_DECL)
526 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
529 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
531 if (TREE_CODE (expr) == TYPE_DECL)
532 DFS_follow_tree_edge (DECL_ORIGINAL_TYPE (expr));
535 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
537 /* Make sure we don't inadvertently set the assembler name. */
538 if (DECL_ASSEMBLER_NAME_SET_P (expr))
539 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
542 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
544 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
545 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
546 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
547 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
548 DFS_follow_tree_edge (DECL_FCONTEXT (expr));
551 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
553 DFS_follow_tree_edge (DECL_VINDEX (expr));
554 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
555 /* Do not DECL_FUNCTION_SPECIFIC_TARGET. They will be regenerated. */
556 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
559 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
561 DFS_follow_tree_edge (TYPE_SIZE (expr));
562 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
563 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
564 DFS_follow_tree_edge (TYPE_NAME (expr));
565 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
566 reconstructed during fixup. */
567 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
568 during fixup. */
569 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
570 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
571 /* TYPE_CANONICAL is re-computed during type merging, so no need
572 to follow it here. */
573 DFS_follow_tree_edge (TYPE_STUB_DECL (expr));
576 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
578 if (TREE_CODE (expr) == ENUMERAL_TYPE)
579 DFS_follow_tree_edge (TYPE_VALUES (expr));
580 else if (TREE_CODE (expr) == ARRAY_TYPE)
581 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
582 else if (RECORD_OR_UNION_TYPE_P (expr))
583 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
584 DFS_follow_tree_edge (t);
585 else if (TREE_CODE (expr) == FUNCTION_TYPE
586 || TREE_CODE (expr) == METHOD_TYPE)
587 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
589 if (!POINTER_TYPE_P (expr))
590 DFS_follow_tree_edge (TYPE_MINVAL (expr));
591 DFS_follow_tree_edge (TYPE_MAXVAL (expr));
592 if (RECORD_OR_UNION_TYPE_P (expr))
593 DFS_follow_tree_edge (TYPE_BINFO (expr));
596 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
598 DFS_follow_tree_edge (TREE_PURPOSE (expr));
599 DFS_follow_tree_edge (TREE_VALUE (expr));
600 DFS_follow_tree_edge (TREE_CHAIN (expr));
603 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
605 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
606 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
609 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
611 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
612 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
613 DFS_follow_tree_edge (TREE_BLOCK (expr));
616 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
618 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
619 /* ??? FIXME. See also streamer_write_chain. */
620 if (!(VAR_OR_FUNCTION_DECL_P (t)
621 && DECL_EXTERNAL (t)))
622 DFS_follow_tree_edge (t);
624 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
626 /* Follow BLOCK_ABSTRACT_ORIGIN for the limited cases we can
627 handle - those that represent inlined function scopes.
628 For the drop rest them on the floor instead of ICEing
629 in dwarf2out.c. */
630 if (inlined_function_outer_scope_p (expr))
632 tree ultimate_origin = block_ultimate_origin (expr);
633 DFS_follow_tree_edge (ultimate_origin);
635 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
636 information for early inlined BLOCKs so drop it on the floor instead
637 of ICEing in dwarf2out.c. */
639 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
640 streaming time. */
642 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
643 list is re-constructed from BLOCK_SUPERCONTEXT. */
646 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
648 unsigned i;
649 tree t;
651 /* Note that the number of BINFO slots has already been emitted in
652 EXPR's header (see streamer_write_tree_header) because this length
653 is needed to build the empty BINFO node on the reader side. */
654 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
655 DFS_follow_tree_edge (t);
656 DFS_follow_tree_edge (BINFO_OFFSET (expr));
657 DFS_follow_tree_edge (BINFO_VTABLE (expr));
658 DFS_follow_tree_edge (BINFO_VPTR_FIELD (expr));
660 /* The number of BINFO_BASE_ACCESSES has already been emitted in
661 EXPR's bitfield section. */
662 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
663 DFS_follow_tree_edge (t);
665 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
666 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
669 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
671 unsigned i;
672 tree index, value;
674 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
676 DFS_follow_tree_edge (index);
677 DFS_follow_tree_edge (value);
681 if (code == OMP_CLAUSE)
683 int i;
684 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
685 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
686 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
689 #undef DFS_follow_tree_edge
692 /* Return a hash value for the tree T. */
694 static hashval_t
695 hash_tree (struct streamer_tree_cache_d *cache, tree t)
697 #define visit(SIBLING) \
698 do { \
699 unsigned ix; \
700 if (SIBLING && streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
701 v = iterative_hash_hashval_t (streamer_tree_cache_get_hash (cache, ix), v); \
702 } while (0)
704 /* Hash TS_BASE. */
705 enum tree_code code = TREE_CODE (t);
706 hashval_t v = iterative_hash_host_wide_int (code, 0);
707 if (!TYPE_P (t))
709 v = iterative_hash_host_wide_int (TREE_SIDE_EFFECTS (t)
710 | (TREE_CONSTANT (t) << 1)
711 | (TREE_READONLY (t) << 2)
712 | (TREE_PUBLIC (t) << 3), v);
714 v = iterative_hash_host_wide_int (TREE_ADDRESSABLE (t)
715 | (TREE_THIS_VOLATILE (t) << 1), v);
716 if (DECL_P (t))
717 v = iterative_hash_host_wide_int (DECL_UNSIGNED (t), v);
718 else if (TYPE_P (t))
719 v = iterative_hash_host_wide_int (TYPE_UNSIGNED (t), v);
720 if (TYPE_P (t))
721 v = iterative_hash_host_wide_int (TYPE_ARTIFICIAL (t), v);
722 else
723 v = iterative_hash_host_wide_int (TREE_NO_WARNING (t), v);
724 v = iterative_hash_host_wide_int (TREE_NOTHROW (t)
725 | (TREE_STATIC (t) << 1)
726 | (TREE_PROTECTED (t) << 2)
727 | (TREE_DEPRECATED (t) << 3), v);
728 if (code != TREE_BINFO)
729 v = iterative_hash_host_wide_int (TREE_PRIVATE (t), v);
730 if (TYPE_P (t))
731 v = iterative_hash_host_wide_int (TYPE_SATURATING (t)
732 | (TYPE_ADDR_SPACE (t) << 1), v);
733 else if (code == SSA_NAME)
734 v = iterative_hash_host_wide_int (SSA_NAME_IS_DEFAULT_DEF (t), v);
736 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
738 int i;
739 v = iterative_hash_host_wide_int (TREE_INT_CST_NUNITS (t), v);
740 v = iterative_hash_host_wide_int (TREE_INT_CST_EXT_NUNITS (t), v);
741 for (i = 0; i < TREE_INT_CST_NUNITS (t); i++)
742 v = iterative_hash_host_wide_int (TREE_INT_CST_ELT (t, i), v);
745 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
747 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
748 v = iterative_hash_host_wide_int (r.cl, v);
749 v = iterative_hash_host_wide_int (r.decimal
750 | (r.sign << 1)
751 | (r.signalling << 2)
752 | (r.canonical << 3), v);
753 v = iterative_hash_host_wide_int (r.uexp, v);
754 for (unsigned i = 0; i < SIGSZ; ++i)
755 v = iterative_hash_host_wide_int (r.sig[i], v);
758 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
760 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
761 v = iterative_hash_host_wide_int (f.mode, v);
762 v = iterative_hash_host_wide_int (f.data.low, v);
763 v = iterative_hash_host_wide_int (f.data.high, v);
766 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
768 v = iterative_hash_host_wide_int (DECL_MODE (t), v);
769 v = iterative_hash_host_wide_int (DECL_NONLOCAL (t)
770 | (DECL_VIRTUAL_P (t) << 1)
771 | (DECL_IGNORED_P (t) << 2)
772 | (DECL_ABSTRACT (t) << 3)
773 | (DECL_ARTIFICIAL (t) << 4)
774 | (DECL_USER_ALIGN (t) << 5)
775 | (DECL_PRESERVE_P (t) << 6)
776 | (DECL_EXTERNAL (t) << 7)
777 | (DECL_GIMPLE_REG_P (t) << 8), v);
778 v = iterative_hash_host_wide_int (DECL_ALIGN (t), v);
779 if (code == LABEL_DECL)
781 v = iterative_hash_host_wide_int (EH_LANDING_PAD_NR (t), v);
782 v = iterative_hash_host_wide_int (LABEL_DECL_UID (t), v);
784 else if (code == FIELD_DECL)
786 v = iterative_hash_host_wide_int (DECL_PACKED (t)
787 | (DECL_NONADDRESSABLE_P (t) << 1),
789 v = iterative_hash_host_wide_int (DECL_OFFSET_ALIGN (t), v);
791 else if (code == VAR_DECL)
793 v = iterative_hash_host_wide_int (DECL_HAS_DEBUG_EXPR_P (t)
794 | (DECL_NONLOCAL_FRAME (t) << 1),
797 if (code == RESULT_DECL
798 || code == PARM_DECL
799 || code == VAR_DECL)
801 v = iterative_hash_host_wide_int (DECL_BY_REFERENCE (t), v);
802 if (code == VAR_DECL
803 || code == PARM_DECL)
804 v = iterative_hash_host_wide_int (DECL_HAS_VALUE_EXPR_P (t), v);
808 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
809 v = iterative_hash_host_wide_int (DECL_REGISTER (t), v);
811 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
813 v = iterative_hash_host_wide_int ((DECL_COMMON (t))
814 | (DECL_DLLIMPORT_P (t) << 1)
815 | (DECL_WEAK (t) << 2)
816 | (DECL_SEEN_IN_BIND_EXPR_P (t) << 3)
817 | (DECL_COMDAT (t) << 4)
818 | (DECL_VISIBILITY_SPECIFIED (t) << 6),
820 v = iterative_hash_host_wide_int (DECL_VISIBILITY (t), v);
821 if (code == VAR_DECL)
823 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
824 v = iterative_hash_host_wide_int (DECL_HARD_REGISTER (t)
825 | (DECL_IN_CONSTANT_POOL (t) << 1),
828 if (TREE_CODE (t) == FUNCTION_DECL)
829 v = iterative_hash_host_wide_int (DECL_FINAL_P (t)
830 | (DECL_CXX_CONSTRUCTOR_P (t) << 1)
831 | (DECL_CXX_DESTRUCTOR_P (t) << 2),
835 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
837 v = iterative_hash_host_wide_int (DECL_BUILT_IN_CLASS (t), v);
838 v = iterative_hash_host_wide_int (DECL_STATIC_CONSTRUCTOR (t)
839 | (DECL_STATIC_DESTRUCTOR (t) << 1)
840 | (DECL_UNINLINABLE (t) << 2)
841 | (DECL_POSSIBLY_INLINED (t) << 3)
842 | (DECL_IS_NOVOPS (t) << 4)
843 | (DECL_IS_RETURNS_TWICE (t) << 5)
844 | (DECL_IS_MALLOC (t) << 6)
845 | (DECL_IS_OPERATOR_NEW (t) << 7)
846 | (DECL_DECLARED_INLINE_P (t) << 8)
847 | (DECL_STATIC_CHAIN (t) << 9)
848 | (DECL_NO_INLINE_WARNING_P (t) << 10)
849 | (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t) << 11)
850 | (DECL_NO_LIMIT_STACK (t) << 12)
851 | (DECL_DISREGARD_INLINE_LIMITS (t) << 13)
852 | (DECL_PURE_P (t) << 14)
853 | (DECL_LOOPING_CONST_OR_PURE_P (t) << 15), v);
854 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
855 v = iterative_hash_host_wide_int (DECL_FUNCTION_CODE (t), v);
858 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
860 v = iterative_hash_host_wide_int (TYPE_MODE (t), v);
861 v = iterative_hash_host_wide_int (TYPE_STRING_FLAG (t)
862 | (TYPE_NO_FORCE_BLK (t) << 1)
863 | (TYPE_NEEDS_CONSTRUCTING (t) << 2)
864 | (TYPE_PACKED (t) << 3)
865 | (TYPE_RESTRICT (t) << 4)
866 | (TYPE_USER_ALIGN (t) << 5)
867 | (TYPE_READONLY (t) << 6), v);
868 if (RECORD_OR_UNION_TYPE_P (t))
870 v = iterative_hash_host_wide_int (TYPE_TRANSPARENT_AGGR (t)
871 | (TYPE_FINAL_P (t) << 1), v);
873 else if (code == ARRAY_TYPE)
874 v = iterative_hash_host_wide_int (TYPE_NONALIASED_COMPONENT (t), v);
875 v = iterative_hash_host_wide_int (TYPE_PRECISION (t), v);
876 v = iterative_hash_host_wide_int (TYPE_ALIGN (t), v);
877 v = iterative_hash_host_wide_int ((TYPE_ALIAS_SET (t) == 0
878 || (!in_lto_p
879 && get_alias_set (t) == 0))
880 ? 0 : -1, v);
883 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
884 v = iterative_hash (TRANSLATION_UNIT_LANGUAGE (t),
885 strlen (TRANSLATION_UNIT_LANGUAGE (t)), v);
887 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
888 gcc_unreachable ();
890 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
891 v = iterative_hash (t, sizeof (struct cl_optimization), v);
893 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
894 v = iterative_hash_host_wide_int (IDENTIFIER_HASH_VALUE (t), v);
896 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
897 v = iterative_hash (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t), v);
899 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
901 if (POINTER_TYPE_P (t))
903 /* For pointers factor in the pointed-to type recursively as
904 we cannot recurse through only pointers.
905 ??? We can generalize this by keeping track of the
906 in-SCC edges for each tree (or arbitrarily the first
907 such edge) and hashing that in in a second stage
908 (instead of the quadratic mixing of the SCC we do now). */
909 hashval_t x;
910 unsigned ix;
911 if (streamer_tree_cache_lookup (cache, TREE_TYPE (t), &ix))
912 x = streamer_tree_cache_get_hash (cache, ix);
913 else
914 x = hash_tree (cache, TREE_TYPE (t));
915 v = iterative_hash_hashval_t (x, v);
917 else if (code != IDENTIFIER_NODE)
918 visit (TREE_TYPE (t));
921 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
922 for (unsigned i = 0; i < VECTOR_CST_NELTS (t); ++i)
923 visit (VECTOR_CST_ELT (t, i));
925 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
927 visit (TREE_REALPART (t));
928 visit (TREE_IMAGPART (t));
931 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
933 /* Drop names that were created for anonymous entities. */
934 if (DECL_NAME (t)
935 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
936 && ANON_AGGRNAME_P (DECL_NAME (t)))
938 else
939 visit (DECL_NAME (t));
940 if (DECL_FILE_SCOPE_P (t))
942 else
943 visit (DECL_CONTEXT (t));
946 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
948 visit (DECL_SIZE (t));
949 visit (DECL_SIZE_UNIT (t));
950 visit (DECL_ATTRIBUTES (t));
951 if ((code == VAR_DECL
952 || code == PARM_DECL)
953 && DECL_HAS_VALUE_EXPR_P (t))
954 visit (DECL_VALUE_EXPR (t));
955 if (code == VAR_DECL
956 && DECL_HAS_DEBUG_EXPR_P (t))
957 visit (DECL_DEBUG_EXPR (t));
958 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
959 be able to call get_symbol_initial_value. */
962 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
964 if (code == TYPE_DECL)
965 visit (DECL_ORIGINAL_TYPE (t));
968 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
970 if (DECL_ASSEMBLER_NAME_SET_P (t))
971 visit (DECL_ASSEMBLER_NAME (t));
974 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
976 visit (DECL_FIELD_OFFSET (t));
977 visit (DECL_BIT_FIELD_TYPE (t));
978 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
979 visit (DECL_FIELD_BIT_OFFSET (t));
980 visit (DECL_FCONTEXT (t));
983 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
985 visit (DECL_VINDEX (t));
986 visit (DECL_FUNCTION_PERSONALITY (t));
987 /* Do not follow DECL_FUNCTION_SPECIFIC_TARGET. */
988 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
991 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
993 visit (TYPE_SIZE (t));
994 visit (TYPE_SIZE_UNIT (t));
995 visit (TYPE_ATTRIBUTES (t));
996 visit (TYPE_NAME (t));
997 visit (TYPE_MAIN_VARIANT (t));
998 if (TYPE_FILE_SCOPE_P (t))
1000 else
1001 visit (TYPE_CONTEXT (t));
1002 visit (TYPE_STUB_DECL (t));
1005 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1007 if (code == ENUMERAL_TYPE)
1008 visit (TYPE_VALUES (t));
1009 else if (code == ARRAY_TYPE)
1010 visit (TYPE_DOMAIN (t));
1011 else if (RECORD_OR_UNION_TYPE_P (t))
1012 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1013 visit (f);
1014 else if (code == FUNCTION_TYPE
1015 || code == METHOD_TYPE)
1016 visit (TYPE_ARG_TYPES (t));
1017 if (!POINTER_TYPE_P (t))
1018 visit (TYPE_MINVAL (t));
1019 visit (TYPE_MAXVAL (t));
1020 if (RECORD_OR_UNION_TYPE_P (t))
1021 visit (TYPE_BINFO (t));
1024 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1026 visit (TREE_PURPOSE (t));
1027 visit (TREE_VALUE (t));
1028 visit (TREE_CHAIN (t));
1031 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1032 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1033 visit (TREE_VEC_ELT (t, i));
1035 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1037 v = iterative_hash_host_wide_int (TREE_OPERAND_LENGTH (t), v);
1038 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1039 visit (TREE_OPERAND (t, i));
1042 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1044 unsigned i;
1045 tree b;
1046 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1047 visit (b);
1048 visit (BINFO_OFFSET (t));
1049 visit (BINFO_VTABLE (t));
1050 visit (BINFO_VPTR_FIELD (t));
1051 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t), i, b)
1052 visit (b);
1053 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1054 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
1057 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1059 unsigned i;
1060 tree index, value;
1061 v = iterative_hash_host_wide_int (CONSTRUCTOR_NELTS (t), v);
1062 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1064 visit (index);
1065 visit (value);
1069 if (code == OMP_CLAUSE)
1071 int i;
1073 v = iterative_hash_host_wide_int (OMP_CLAUSE_CODE (t), v);
1074 switch (OMP_CLAUSE_CODE (t))
1076 case OMP_CLAUSE_DEFAULT:
1077 v = iterative_hash_host_wide_int (OMP_CLAUSE_DEFAULT_KIND (t), v);
1078 break;
1079 case OMP_CLAUSE_SCHEDULE:
1080 v = iterative_hash_host_wide_int (OMP_CLAUSE_SCHEDULE_KIND (t), v);
1081 break;
1082 case OMP_CLAUSE_DEPEND:
1083 v = iterative_hash_host_wide_int (OMP_CLAUSE_DEPEND_KIND (t), v);
1084 break;
1085 case OMP_CLAUSE_MAP:
1086 v = iterative_hash_host_wide_int (OMP_CLAUSE_MAP_KIND (t), v);
1087 break;
1088 case OMP_CLAUSE_PROC_BIND:
1089 v = iterative_hash_host_wide_int (OMP_CLAUSE_PROC_BIND_KIND (t), v);
1090 break;
1091 case OMP_CLAUSE_REDUCTION:
1092 v = iterative_hash_host_wide_int (OMP_CLAUSE_REDUCTION_CODE (t), v);
1093 break;
1094 default:
1095 break;
1097 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1098 visit (OMP_CLAUSE_OPERAND (t, i));
1099 visit (OMP_CLAUSE_CHAIN (t));
1102 return v;
1104 #undef visit
1107 /* Compare two SCC entries by their hash value for qsorting them. */
1109 static int
1110 scc_entry_compare (const void *p1_, const void *p2_)
1112 const scc_entry *p1 = (const scc_entry *) p1_;
1113 const scc_entry *p2 = (const scc_entry *) p2_;
1114 if (p1->hash < p2->hash)
1115 return -1;
1116 else if (p1->hash > p2->hash)
1117 return 1;
1118 return 0;
1121 /* Return a hash value for the SCC on the SCC stack from FIRST with
1122 size SIZE. */
1124 static hashval_t
1125 hash_scc (struct streamer_tree_cache_d *cache, unsigned first, unsigned size)
1127 /* Compute hash values for the SCC members. */
1128 for (unsigned i = 0; i < size; ++i)
1129 sccstack[first+i].hash = hash_tree (cache, sccstack[first+i].t);
1131 if (size == 1)
1132 return sccstack[first].hash;
1134 /* Sort the SCC of type, hash pairs so that when we mix in
1135 all members of the SCC the hash value becomes independent on
1136 the order we visited the SCC. Produce hash of the whole SCC as
1137 combination of hashes of individual elements. Then combine that hash into
1138 hash of each element, so othewise identically looking elements from two
1139 different SCCs are distinguished. */
1140 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1142 hashval_t scc_hash = sccstack[first].hash;
1143 for (unsigned i = 1; i < size; ++i)
1144 scc_hash = iterative_hash_hashval_t (scc_hash,
1145 sccstack[first+i].hash);
1146 for (unsigned i = 0; i < size; ++i)
1147 sccstack[first+i].hash = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
1148 return scc_hash;
1151 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1152 already in the streamer cache. Main routine called for
1153 each visit of EXPR. */
1155 static void
1156 DFS_write_tree (struct output_block *ob, sccs *from_state,
1157 tree expr, bool ref_p, bool this_ref_p)
1159 unsigned ix;
1160 sccs **slot;
1162 /* Handle special cases. */
1163 if (expr == NULL_TREE)
1164 return;
1166 /* Do not DFS walk into indexable trees. */
1167 if (this_ref_p && tree_is_indexable (expr))
1168 return;
1170 /* Check if we already streamed EXPR. */
1171 if (streamer_tree_cache_lookup (ob->writer_cache, expr, &ix))
1172 return;
1174 slot = (sccs **)pointer_map_insert (sccstate, expr);
1175 sccs *cstate = *slot;
1176 if (!cstate)
1178 scc_entry e = { expr, 0 };
1179 /* Not yet visited. DFS recurse and push it onto the stack. */
1180 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
1181 sccstack.safe_push (e);
1182 cstate->dfsnum = next_dfs_num++;
1183 cstate->low = cstate->dfsnum;
1185 if (streamer_handle_as_builtin_p (expr))
1187 else if (TREE_CODE (expr) == INTEGER_CST
1188 && !TREE_OVERFLOW (expr))
1189 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
1190 else
1192 DFS_write_tree_body (ob, expr, cstate, ref_p);
1194 /* Walk any LTO-specific edges. */
1195 if (DECL_P (expr)
1196 && TREE_CODE (expr) != FUNCTION_DECL
1197 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1199 /* Handle DECL_INITIAL for symbols. */
1200 tree initial = get_symbol_initial_value (ob->decl_state->symtab_node_encoder,
1201 expr);
1202 DFS_write_tree (ob, cstate, initial, ref_p, ref_p);
1206 /* See if we found an SCC. */
1207 if (cstate->low == cstate->dfsnum)
1209 unsigned first, size;
1210 tree x;
1212 /* Pop the SCC and compute its size. */
1213 first = sccstack.length ();
1216 x = sccstack[--first].t;
1218 while (x != expr);
1219 size = sccstack.length () - first;
1221 /* No need to compute hashes for LTRANS units, we don't perform
1222 any merging there. */
1223 hashval_t scc_hash = 0;
1224 unsigned scc_entry_len = 0;
1225 if (!flag_wpa)
1227 scc_hash = hash_scc (ob->writer_cache, first, size);
1229 /* Put the entries with the least number of collisions first. */
1230 unsigned entry_start = 0;
1231 scc_entry_len = size + 1;
1232 for (unsigned i = 0; i < size;)
1234 unsigned from = i;
1235 for (i = i + 1; i < size
1236 && (sccstack[first + i].hash
1237 == sccstack[first + from].hash); ++i)
1239 if (i - from < scc_entry_len)
1241 scc_entry_len = i - from;
1242 entry_start = from;
1245 for (unsigned i = 0; i < scc_entry_len; ++i)
1247 scc_entry tem = sccstack[first + i];
1248 sccstack[first + i] = sccstack[first + entry_start + i];
1249 sccstack[first + entry_start + i] = tem;
1253 /* Write LTO_tree_scc. */
1254 streamer_write_record_start (ob, LTO_tree_scc);
1255 streamer_write_uhwi (ob, size);
1256 streamer_write_uhwi (ob, scc_hash);
1258 /* Write size-1 SCCs without wrapping them inside SCC bundles.
1259 All INTEGER_CSTs need to be handled this way as we need
1260 their type to materialize them. Also builtins are handled
1261 this way.
1262 ??? We still wrap these in LTO_tree_scc so at the
1263 input side we can properly identify the tree we want
1264 to ultimatively return. */
1265 if (size == 1)
1266 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
1267 else
1269 /* Write the size of the SCC entry candidates. */
1270 streamer_write_uhwi (ob, scc_entry_len);
1272 /* Write all headers and populate the streamer cache. */
1273 for (unsigned i = 0; i < size; ++i)
1275 hashval_t hash = sccstack[first+i].hash;
1276 tree t = sccstack[first+i].t;
1277 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
1278 t, hash, &ix);
1279 gcc_assert (!exists_p);
1281 if (!lto_is_streamable (t))
1282 internal_error ("tree code %qs is not supported "
1283 "in LTO streams",
1284 get_tree_code_name (TREE_CODE (t)));
1286 gcc_checking_assert (!streamer_handle_as_builtin_p (t));
1288 /* Write the header, containing everything needed to
1289 materialize EXPR on the reading side. */
1290 streamer_write_tree_header (ob, t);
1293 /* Write the bitpacks and tree references. */
1294 for (unsigned i = 0; i < size; ++i)
1296 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
1298 /* Mark the end of the tree. */
1299 streamer_write_zero (ob);
1303 /* Finally truncate the vector. */
1304 sccstack.truncate (first);
1306 if (from_state)
1307 from_state->low = MIN (from_state->low, cstate->low);
1308 return;
1311 if (from_state)
1312 from_state->low = MIN (from_state->low, cstate->low);
1314 gcc_checking_assert (from_state);
1315 if (cstate->dfsnum < from_state->dfsnum)
1316 from_state->low = MIN (cstate->dfsnum, from_state->low);
1320 /* Emit the physical representation of tree node EXPR to output block
1321 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
1322 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1324 void
1325 lto_output_tree (struct output_block *ob, tree expr,
1326 bool ref_p, bool this_ref_p)
1328 unsigned ix;
1329 bool existed_p;
1331 if (expr == NULL_TREE)
1333 streamer_write_record_start (ob, LTO_null);
1334 return;
1337 if (this_ref_p && tree_is_indexable (expr))
1339 lto_output_tree_ref (ob, expr);
1340 return;
1343 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1344 if (existed_p)
1346 /* If a node has already been streamed out, make sure that
1347 we don't write it more than once. Otherwise, the reader
1348 will instantiate two different nodes for the same object. */
1349 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1350 streamer_write_uhwi (ob, ix);
1351 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1352 lto_tree_code_to_tag (TREE_CODE (expr)));
1353 lto_stats.num_pickle_refs_output++;
1355 else
1357 /* This is the first time we see EXPR, write all reachable
1358 trees to OB. */
1359 static bool in_dfs_walk;
1361 /* Protect against recursion which means disconnect between
1362 what tree edges we walk in the DFS walk and what edges
1363 we stream out. */
1364 gcc_assert (!in_dfs_walk);
1366 /* Start the DFS walk. */
1367 /* Save ob state ... */
1368 /* let's see ... */
1369 in_dfs_walk = true;
1370 sccstate = pointer_map_create ();
1371 gcc_obstack_init (&sccstate_obstack);
1372 next_dfs_num = 1;
1373 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p);
1374 sccstack.release ();
1375 pointer_map_destroy (sccstate);
1376 obstack_free (&sccstate_obstack, NULL);
1377 in_dfs_walk = false;
1379 /* Finally append a reference to the tree we were writing.
1380 ??? If expr ended up as a singleton we could have
1381 inlined it here and avoid outputting a reference. */
1382 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1383 gcc_assert (existed_p);
1384 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1385 streamer_write_uhwi (ob, ix);
1386 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1387 lto_tree_code_to_tag (TREE_CODE (expr)));
1388 lto_stats.num_pickle_refs_output++;
1393 /* Output to OB a list of try/catch handlers starting with FIRST. */
1395 static void
1396 output_eh_try_list (struct output_block *ob, eh_catch first)
1398 eh_catch n;
1400 for (n = first; n; n = n->next_catch)
1402 streamer_write_record_start (ob, LTO_eh_catch);
1403 stream_write_tree (ob, n->type_list, true);
1404 stream_write_tree (ob, n->filter_list, true);
1405 stream_write_tree (ob, n->label, true);
1408 streamer_write_record_start (ob, LTO_null);
1412 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1413 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1414 detect EH region sharing. */
1416 static void
1417 output_eh_region (struct output_block *ob, eh_region r)
1419 enum LTO_tags tag;
1421 if (r == NULL)
1423 streamer_write_record_start (ob, LTO_null);
1424 return;
1427 if (r->type == ERT_CLEANUP)
1428 tag = LTO_ert_cleanup;
1429 else if (r->type == ERT_TRY)
1430 tag = LTO_ert_try;
1431 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1432 tag = LTO_ert_allowed_exceptions;
1433 else if (r->type == ERT_MUST_NOT_THROW)
1434 tag = LTO_ert_must_not_throw;
1435 else
1436 gcc_unreachable ();
1438 streamer_write_record_start (ob, tag);
1439 streamer_write_hwi (ob, r->index);
1441 if (r->outer)
1442 streamer_write_hwi (ob, r->outer->index);
1443 else
1444 streamer_write_zero (ob);
1446 if (r->inner)
1447 streamer_write_hwi (ob, r->inner->index);
1448 else
1449 streamer_write_zero (ob);
1451 if (r->next_peer)
1452 streamer_write_hwi (ob, r->next_peer->index);
1453 else
1454 streamer_write_zero (ob);
1456 if (r->type == ERT_TRY)
1458 output_eh_try_list (ob, r->u.eh_try.first_catch);
1460 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1462 stream_write_tree (ob, r->u.allowed.type_list, true);
1463 stream_write_tree (ob, r->u.allowed.label, true);
1464 streamer_write_uhwi (ob, r->u.allowed.filter);
1466 else if (r->type == ERT_MUST_NOT_THROW)
1468 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1469 bitpack_d bp = bitpack_create (ob->main_stream);
1470 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1471 streamer_write_bitpack (&bp);
1474 if (r->landing_pads)
1475 streamer_write_hwi (ob, r->landing_pads->index);
1476 else
1477 streamer_write_zero (ob);
1481 /* Output landing pad LP to OB. */
1483 static void
1484 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1486 if (lp == NULL)
1488 streamer_write_record_start (ob, LTO_null);
1489 return;
1492 streamer_write_record_start (ob, LTO_eh_landing_pad);
1493 streamer_write_hwi (ob, lp->index);
1494 if (lp->next_lp)
1495 streamer_write_hwi (ob, lp->next_lp->index);
1496 else
1497 streamer_write_zero (ob);
1499 if (lp->region)
1500 streamer_write_hwi (ob, lp->region->index);
1501 else
1502 streamer_write_zero (ob);
1504 stream_write_tree (ob, lp->post_landing_pad, true);
1508 /* Output the existing eh_table to OB. */
1510 static void
1511 output_eh_regions (struct output_block *ob, struct function *fn)
1513 if (fn->eh && fn->eh->region_tree)
1515 unsigned i;
1516 eh_region eh;
1517 eh_landing_pad lp;
1518 tree ttype;
1520 streamer_write_record_start (ob, LTO_eh_table);
1522 /* Emit the index of the root of the EH region tree. */
1523 streamer_write_hwi (ob, fn->eh->region_tree->index);
1525 /* Emit all the EH regions in the region array. */
1526 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
1527 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
1528 output_eh_region (ob, eh);
1530 /* Emit all landing pads. */
1531 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
1532 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
1533 output_eh_lp (ob, lp);
1535 /* Emit all the runtime type data. */
1536 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
1537 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
1538 stream_write_tree (ob, ttype, true);
1540 /* Emit the table of action chains. */
1541 if (targetm.arm_eabi_unwinder)
1543 tree t;
1544 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
1545 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
1546 stream_write_tree (ob, t, true);
1548 else
1550 uchar c;
1551 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
1552 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
1553 streamer_write_char_stream (ob->main_stream, c);
1557 /* The LTO_null either terminates the record or indicates that there
1558 are no eh_records at all. */
1559 streamer_write_record_start (ob, LTO_null);
1563 /* Output all of the active ssa names to the ssa_names stream. */
1565 static void
1566 output_ssa_names (struct output_block *ob, struct function *fn)
1568 unsigned int i, len;
1570 len = vec_safe_length (SSANAMES (fn));
1571 streamer_write_uhwi (ob, len);
1573 for (i = 1; i < len; i++)
1575 tree ptr = (*SSANAMES (fn))[i];
1577 if (ptr == NULL_TREE
1578 || SSA_NAME_IN_FREE_LIST (ptr)
1579 || virtual_operand_p (ptr))
1580 continue;
1582 streamer_write_uhwi (ob, i);
1583 streamer_write_char_stream (ob->main_stream,
1584 SSA_NAME_IS_DEFAULT_DEF (ptr));
1585 if (SSA_NAME_VAR (ptr))
1586 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
1587 else
1588 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1589 stream_write_tree (ob, TREE_TYPE (ptr), true);
1592 streamer_write_zero (ob);
1596 /* Output a wide-int. */
1598 static void
1599 streamer_write_wi (struct output_block *ob,
1600 const widest_int &w)
1602 int len = w.get_len ();
1604 streamer_write_uhwi (ob, w.get_precision ());
1605 streamer_write_uhwi (ob, len);
1606 for (int i = 0; i < len; i++)
1607 streamer_write_hwi (ob, w.elt (i));
1611 /* Output the cfg. */
1613 static void
1614 output_cfg (struct output_block *ob, struct function *fn)
1616 struct lto_output_stream *tmp_stream = ob->main_stream;
1617 basic_block bb;
1619 ob->main_stream = ob->cfg_stream;
1621 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1622 profile_status_for_fn (fn));
1624 /* Output the number of the highest basic block. */
1625 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
1627 FOR_ALL_BB_FN (bb, fn)
1629 edge_iterator ei;
1630 edge e;
1632 streamer_write_hwi (ob, bb->index);
1634 /* Output the successors and the edge flags. */
1635 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
1636 FOR_EACH_EDGE (e, ei, bb->succs)
1638 streamer_write_uhwi (ob, e->dest->index);
1639 streamer_write_hwi (ob, e->probability);
1640 streamer_write_gcov_count (ob, e->count);
1641 streamer_write_uhwi (ob, e->flags);
1645 streamer_write_hwi (ob, -1);
1647 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1648 while (bb->next_bb)
1650 streamer_write_hwi (ob, bb->next_bb->index);
1651 bb = bb->next_bb;
1654 streamer_write_hwi (ob, -1);
1656 /* ??? The cfgloop interface is tied to cfun. */
1657 gcc_assert (cfun == fn);
1659 /* Output the number of loops. */
1660 streamer_write_uhwi (ob, number_of_loops (fn));
1662 /* Output each loop, skipping the tree root which has number zero. */
1663 for (unsigned i = 1; i < number_of_loops (fn); ++i)
1665 struct loop *loop = get_loop (fn, i);
1667 /* Write the index of the loop header. That's enough to rebuild
1668 the loop tree on the reader side. Stream -1 for an unused
1669 loop entry. */
1670 if (!loop)
1672 streamer_write_hwi (ob, -1);
1673 continue;
1675 else
1676 streamer_write_hwi (ob, loop->header->index);
1678 /* Write everything copy_loop_info copies. */
1679 streamer_write_enum (ob->main_stream,
1680 loop_estimation, EST_LAST, loop->estimate_state);
1681 streamer_write_hwi (ob, loop->any_upper_bound);
1682 if (loop->any_upper_bound)
1683 streamer_write_wi (ob, loop->nb_iterations_upper_bound);
1684 streamer_write_hwi (ob, loop->any_estimate);
1685 if (loop->any_estimate)
1686 streamer_write_wi (ob, loop->nb_iterations_estimate);
1688 /* Write OMP SIMD related info. */
1689 streamer_write_hwi (ob, loop->safelen);
1690 streamer_write_hwi (ob, loop->dont_vectorize);
1691 streamer_write_hwi (ob, loop->force_vectorize);
1692 stream_write_tree (ob, loop->simduid, true);
1695 ob->main_stream = tmp_stream;
1699 /* Create the header in the file using OB. If the section type is for
1700 a function, set FN to the decl for that function. */
1702 void
1703 produce_asm (struct output_block *ob, tree fn)
1705 enum lto_section_type section_type = ob->section_type;
1706 struct lto_function_header header;
1707 char *section_name;
1708 struct lto_output_stream *header_stream;
1710 if (section_type == LTO_section_function_body)
1712 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1713 section_name = lto_get_section_name (section_type, name, NULL);
1715 else
1716 section_name = lto_get_section_name (section_type, NULL, NULL);
1718 lto_begin_section (section_name, !flag_wpa);
1719 free (section_name);
1721 /* The entire header is stream computed here. */
1722 memset (&header, 0, sizeof (struct lto_function_header));
1724 /* Write the header. */
1725 header.lto_header.major_version = LTO_major_version;
1726 header.lto_header.minor_version = LTO_minor_version;
1728 header.compressed_size = 0;
1730 if (section_type == LTO_section_function_body)
1731 header.cfg_size = ob->cfg_stream->total_size;
1732 header.main_size = ob->main_stream->total_size;
1733 header.string_size = ob->string_stream->total_size;
1735 header_stream = XCNEW (struct lto_output_stream);
1736 lto_output_data_stream (header_stream, &header, sizeof header);
1737 lto_write_stream (header_stream);
1738 free (header_stream);
1740 /* Put all of the gimple and the string table out the asm file as a
1741 block of text. */
1742 if (section_type == LTO_section_function_body)
1743 lto_write_stream (ob->cfg_stream);
1744 lto_write_stream (ob->main_stream);
1745 lto_write_stream (ob->string_stream);
1747 lto_end_section ();
1751 /* Output the base body of struct function FN using output block OB. */
1753 static void
1754 output_struct_function_base (struct output_block *ob, struct function *fn)
1756 struct bitpack_d bp;
1757 unsigned i;
1758 tree t;
1760 /* Output the static chain and non-local goto save area. */
1761 stream_write_tree (ob, fn->static_chain_decl, true);
1762 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
1764 /* Output all the local variables in the function. */
1765 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
1766 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
1767 stream_write_tree (ob, t, true);
1769 /* Output current IL state of the function. */
1770 streamer_write_uhwi (ob, fn->curr_properties);
1772 /* Write all the attributes for FN. */
1773 bp = bitpack_create (ob->main_stream);
1774 bp_pack_value (&bp, fn->is_thunk, 1);
1775 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
1776 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
1777 bp_pack_value (&bp, fn->returns_struct, 1);
1778 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
1779 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
1780 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
1781 bp_pack_value (&bp, fn->after_inlining, 1);
1782 bp_pack_value (&bp, fn->stdarg, 1);
1783 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
1784 bp_pack_value (&bp, fn->calls_alloca, 1);
1785 bp_pack_value (&bp, fn->calls_setjmp, 1);
1786 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
1787 bp_pack_value (&bp, fn->has_simduid_loops, 1);
1788 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
1789 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
1791 /* Output the function start and end loci. */
1792 stream_output_location (ob, &bp, fn->function_start_locus);
1793 stream_output_location (ob, &bp, fn->function_end_locus);
1795 streamer_write_bitpack (&bp);
1799 /* Output the body of function NODE->DECL. */
1801 static void
1802 output_function (struct cgraph_node *node)
1804 tree function;
1805 struct function *fn;
1806 basic_block bb;
1807 struct output_block *ob;
1809 function = node->decl;
1810 fn = DECL_STRUCT_FUNCTION (function);
1811 ob = create_output_block (LTO_section_function_body);
1813 clear_line_info (ob);
1814 ob->symbol = node;
1816 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
1818 /* Set current_function_decl and cfun. */
1819 push_cfun (fn);
1821 /* Make string 0 be a NULL string. */
1822 streamer_write_char_stream (ob->string_stream, 0);
1824 streamer_write_record_start (ob, LTO_function);
1826 /* Output decls for parameters and args. */
1827 stream_write_tree (ob, DECL_RESULT (function), true);
1828 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
1830 /* Output DECL_INITIAL for the function, which contains the tree of
1831 lexical scopes. */
1832 stream_write_tree (ob, DECL_INITIAL (function), true);
1834 /* We also stream abstract functions where we stream only stuff needed for
1835 debug info. */
1836 if (gimple_has_body_p (function))
1838 streamer_write_uhwi (ob, 1);
1839 output_struct_function_base (ob, fn);
1841 /* Output all the SSA names used in the function. */
1842 output_ssa_names (ob, fn);
1844 /* Output any exception handling regions. */
1845 output_eh_regions (ob, fn);
1848 /* We will renumber the statements. The code that does this uses
1849 the same ordering that we use for serializing them so we can use
1850 the same code on the other end and not have to write out the
1851 statement numbers. We do not assign UIDs to PHIs here because
1852 virtual PHIs get re-computed on-the-fly which would make numbers
1853 inconsistent. */
1854 set_gimple_stmt_max_uid (cfun, 0);
1855 FOR_ALL_BB_FN (bb, cfun)
1857 gimple_stmt_iterator gsi;
1858 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1860 gimple stmt = gsi_stmt (gsi);
1862 /* Virtual PHIs are not going to be streamed. */
1863 if (!virtual_operand_p (gimple_phi_result (stmt)))
1864 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1866 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1868 gimple stmt = gsi_stmt (gsi);
1869 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1872 /* To avoid keeping duplicate gimple IDs in the statements, renumber
1873 virtual phis now. */
1874 FOR_ALL_BB_FN (bb, cfun)
1876 gimple_stmt_iterator gsi;
1877 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1879 gimple stmt = gsi_stmt (gsi);
1880 if (virtual_operand_p (gimple_phi_result (stmt)))
1881 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1885 /* Output the code for the function. */
1886 FOR_ALL_BB_FN (bb, fn)
1887 output_bb (ob, bb, fn);
1889 /* The terminator for this function. */
1890 streamer_write_record_start (ob, LTO_null);
1892 output_cfg (ob, fn);
1894 pop_cfun ();
1896 else
1897 streamer_write_uhwi (ob, 0);
1899 /* Create a section to hold the pickled output of this function. */
1900 produce_asm (ob, function);
1902 destroy_output_block (ob);
1905 /* Output the body of function NODE->DECL. */
1907 static void
1908 output_constructor (struct varpool_node *node)
1910 tree var = node->decl;
1911 struct output_block *ob;
1913 ob = create_output_block (LTO_section_function_body);
1915 clear_line_info (ob);
1916 ob->symbol = node;
1918 /* Make string 0 be a NULL string. */
1919 streamer_write_char_stream (ob->string_stream, 0);
1921 /* Output DECL_INITIAL for the function, which contains the tree of
1922 lexical scopes. */
1923 stream_write_tree (ob, DECL_INITIAL (var), true);
1925 /* Create a section to hold the pickled output of this function. */
1926 produce_asm (ob, var);
1928 destroy_output_block (ob);
1932 /* Emit toplevel asms. */
1934 void
1935 lto_output_toplevel_asms (void)
1937 struct output_block *ob;
1938 struct asm_node *can;
1939 char *section_name;
1940 struct lto_output_stream *header_stream;
1941 struct lto_asm_header header;
1943 if (! asm_nodes)
1944 return;
1946 ob = create_output_block (LTO_section_asm);
1948 /* Make string 0 be a NULL string. */
1949 streamer_write_char_stream (ob->string_stream, 0);
1951 for (can = asm_nodes; can; can = can->next)
1953 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
1954 streamer_write_hwi (ob, can->order);
1957 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
1959 section_name = lto_get_section_name (LTO_section_asm, NULL, NULL);
1960 lto_begin_section (section_name, !flag_wpa);
1961 free (section_name);
1963 /* The entire header stream is computed here. */
1964 memset (&header, 0, sizeof (header));
1966 /* Write the header. */
1967 header.lto_header.major_version = LTO_major_version;
1968 header.lto_header.minor_version = LTO_minor_version;
1970 header.main_size = ob->main_stream->total_size;
1971 header.string_size = ob->string_stream->total_size;
1973 header_stream = XCNEW (struct lto_output_stream);
1974 lto_output_data_stream (header_stream, &header, sizeof (header));
1975 lto_write_stream (header_stream);
1976 free (header_stream);
1978 /* Put all of the gimple and the string table out the asm file as a
1979 block of text. */
1980 lto_write_stream (ob->main_stream);
1981 lto_write_stream (ob->string_stream);
1983 lto_end_section ();
1985 destroy_output_block (ob);
1989 /* Copy the function body or variable constructor of NODE without deserializing. */
1991 static void
1992 copy_function_or_variable (struct symtab_node *node)
1994 tree function = node->decl;
1995 struct lto_file_decl_data *file_data = node->lto_file_data;
1996 struct lto_output_stream *output_stream = XCNEW (struct lto_output_stream);
1997 const char *data;
1998 size_t len;
1999 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
2000 char *section_name =
2001 lto_get_section_name (LTO_section_function_body, name, NULL);
2002 size_t i, j;
2003 struct lto_in_decl_state *in_state;
2004 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
2006 lto_begin_section (section_name, !flag_wpa);
2007 free (section_name);
2009 /* We may have renamed the declaration, e.g., a static function. */
2010 name = lto_get_decl_name_mapping (file_data, name);
2012 data = lto_get_section_data (file_data, LTO_section_function_body,
2013 name, &len);
2014 gcc_assert (data);
2016 /* Do a bit copy of the function body. */
2017 lto_output_data_stream (output_stream, data, len);
2018 lto_write_stream (output_stream);
2020 /* Copy decls. */
2021 in_state =
2022 lto_get_function_in_decl_state (node->lto_file_data, function);
2023 gcc_assert (in_state);
2025 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2027 size_t n = in_state->streams[i].size;
2028 tree *trees = in_state->streams[i].trees;
2029 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2031 /* The out state must have the same indices and the in state.
2032 So just copy the vector. All the encoders in the in state
2033 must be empty where we reach here. */
2034 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2035 encoder->trees.reserve_exact (n);
2036 for (j = 0; j < n; j++)
2037 encoder->trees.safe_push (trees[j]);
2040 lto_free_section_data (file_data, LTO_section_function_body, name,
2041 data, len);
2042 free (output_stream);
2043 lto_end_section ();
2046 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2048 static tree
2049 wrap_refs (tree *tp, int *ws, void *)
2051 tree t = *tp;
2052 if (handled_component_p (t)
2053 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL)
2055 tree decl = TREE_OPERAND (t, 0);
2056 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2057 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2058 build1 (ADDR_EXPR, ptrtype, decl),
2059 build_int_cst (ptrtype, 0));
2060 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2061 *ws = 0;
2063 else if (TREE_CODE (t) == CONSTRUCTOR)
2065 else if (!EXPR_P (t))
2066 *ws = 0;
2067 return NULL_TREE;
2070 /* Main entry point from the pass manager. */
2072 void
2073 lto_output (void)
2075 struct lto_out_decl_state *decl_state;
2076 #ifdef ENABLE_CHECKING
2077 bitmap output = lto_bitmap_alloc ();
2078 #endif
2079 int i, n_nodes;
2080 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
2082 /* Initialize the streamer. */
2083 lto_streamer_init ();
2085 n_nodes = lto_symtab_encoder_size (encoder);
2086 /* Process only the functions with bodies. */
2087 for (i = 0; i < n_nodes; i++)
2089 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
2090 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
2092 if (lto_symtab_encoder_encode_body_p (encoder, node)
2093 && !node->alias)
2095 #ifdef ENABLE_CHECKING
2096 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2097 bitmap_set_bit (output, DECL_UID (node->decl));
2098 #endif
2099 decl_state = lto_new_out_decl_state ();
2100 lto_push_out_decl_state (decl_state);
2101 if (gimple_has_body_p (node->decl) || !flag_wpa)
2102 output_function (node);
2103 else
2104 copy_function_or_variable (node);
2105 gcc_assert (lto_get_out_decl_state () == decl_state);
2106 lto_pop_out_decl_state ();
2107 lto_record_function_out_decl_state (node->decl, decl_state);
2110 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
2112 /* Wrap symbol references inside the ctor in a type
2113 preserving MEM_REF. */
2114 tree ctor = DECL_INITIAL (node->decl);
2115 if (ctor && !in_lto_p)
2116 walk_tree (&ctor, wrap_refs, NULL, NULL);
2117 if (get_symbol_initial_value (encoder, node->decl) == error_mark_node
2118 && lto_symtab_encoder_encode_initializer_p (encoder, node)
2119 && !node->alias)
2121 timevar_push (TV_IPA_LTO_CTORS_OUT);
2122 #ifdef ENABLE_CHECKING
2123 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2124 bitmap_set_bit (output, DECL_UID (node->decl));
2125 #endif
2126 decl_state = lto_new_out_decl_state ();
2127 lto_push_out_decl_state (decl_state);
2128 if (DECL_INITIAL (node->decl) != error_mark_node
2129 || !flag_wpa)
2130 output_constructor (node);
2131 else
2132 copy_function_or_variable (node);
2133 gcc_assert (lto_get_out_decl_state () == decl_state);
2134 lto_pop_out_decl_state ();
2135 lto_record_function_out_decl_state (node->decl, decl_state);
2136 timevar_pop (TV_IPA_LTO_CTORS_OUT);
2141 /* Emit the callgraph after emitting function bodies. This needs to
2142 be done now to make sure that all the statements in every function
2143 have been renumbered so that edges can be associated with call
2144 statements using the statement UIDs. */
2145 output_symtab ();
2147 #ifdef ENABLE_CHECKING
2148 lto_bitmap_free (output);
2149 #endif
2152 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2153 from it and required for correct representation of its semantics.
2154 Each node in ENCODER must be a global declaration or a type. A node
2155 is written only once, even if it appears multiple times in the
2156 vector. Certain transitively-reachable nodes, such as those
2157 representing expressions, may be duplicated, but such nodes
2158 must not appear in ENCODER itself. */
2160 static void
2161 write_global_stream (struct output_block *ob,
2162 struct lto_tree_ref_encoder *encoder)
2164 tree t;
2165 size_t index;
2166 const size_t size = lto_tree_ref_encoder_size (encoder);
2168 for (index = 0; index < size; index++)
2170 t = lto_tree_ref_encoder_get_tree (encoder, index);
2171 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2172 stream_write_tree (ob, t, false);
2177 /* Write a sequence of indices into the globals vector corresponding
2178 to the trees in ENCODER. These are used by the reader to map the
2179 indices used to refer to global entities within function bodies to
2180 their referents. */
2182 static void
2183 write_global_references (struct output_block *ob,
2184 struct lto_output_stream *ref_stream,
2185 struct lto_tree_ref_encoder *encoder)
2187 tree t;
2188 uint32_t index;
2189 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2191 /* Write size as 32-bit unsigned. */
2192 lto_output_data_stream (ref_stream, &size, sizeof (int32_t));
2194 for (index = 0; index < size; index++)
2196 uint32_t slot_num;
2198 t = lto_tree_ref_encoder_get_tree (encoder, index);
2199 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2200 gcc_assert (slot_num != (unsigned)-1);
2201 lto_output_data_stream (ref_stream, &slot_num, sizeof slot_num);
2206 /* Write all the streams in an lto_out_decl_state STATE using
2207 output block OB and output stream OUT_STREAM. */
2209 void
2210 lto_output_decl_state_streams (struct output_block *ob,
2211 struct lto_out_decl_state *state)
2213 int i;
2215 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2216 write_global_stream (ob, &state->streams[i]);
2220 /* Write all the references in an lto_out_decl_state STATE using
2221 output block OB and output stream OUT_STREAM. */
2223 void
2224 lto_output_decl_state_refs (struct output_block *ob,
2225 struct lto_output_stream *out_stream,
2226 struct lto_out_decl_state *state)
2228 unsigned i;
2229 uint32_t ref;
2230 tree decl;
2232 /* Write reference to FUNCTION_DECL. If there is not function,
2233 write reference to void_type_node. */
2234 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2235 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2236 gcc_assert (ref != (unsigned)-1);
2237 lto_output_data_stream (out_stream, &ref, sizeof (uint32_t));
2239 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2240 write_global_references (ob, out_stream, &state->streams[i]);
2244 /* Return the written size of STATE. */
2246 static size_t
2247 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2249 int i;
2250 size_t size;
2252 size = sizeof (int32_t); /* fn_ref. */
2253 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2255 size += sizeof (int32_t); /* vector size. */
2256 size += (lto_tree_ref_encoder_size (&state->streams[i])
2257 * sizeof (int32_t));
2259 return size;
2263 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2264 so far. */
2266 static void
2267 write_symbol (struct streamer_tree_cache_d *cache,
2268 struct lto_output_stream *stream,
2269 tree t, struct pointer_set_t *seen, bool alias)
2271 const char *name;
2272 enum gcc_plugin_symbol_kind kind;
2273 enum gcc_plugin_symbol_visibility visibility;
2274 unsigned slot_num;
2275 uint64_t size;
2276 const char *comdat;
2277 unsigned char c;
2279 /* None of the following kinds of symbols are needed in the
2280 symbol table. */
2281 if (!TREE_PUBLIC (t)
2282 || is_builtin_fn (t)
2283 || DECL_ABSTRACT (t)
2284 || (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)))
2285 return;
2286 gcc_assert (TREE_CODE (t) != RESULT_DECL);
2288 gcc_assert (TREE_CODE (t) == VAR_DECL
2289 || TREE_CODE (t) == FUNCTION_DECL);
2291 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2293 /* This behaves like assemble_name_raw in varasm.c, performing the
2294 same name manipulations that ASM_OUTPUT_LABELREF does. */
2295 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2297 if (pointer_set_contains (seen, name))
2298 return;
2299 pointer_set_insert (seen, name);
2301 streamer_tree_cache_lookup (cache, t, &slot_num);
2302 gcc_assert (slot_num != (unsigned)-1);
2304 if (DECL_EXTERNAL (t))
2306 if (DECL_WEAK (t))
2307 kind = GCCPK_WEAKUNDEF;
2308 else
2309 kind = GCCPK_UNDEF;
2311 else
2313 if (DECL_WEAK (t))
2314 kind = GCCPK_WEAKDEF;
2315 else if (DECL_COMMON (t))
2316 kind = GCCPK_COMMON;
2317 else
2318 kind = GCCPK_DEF;
2320 /* When something is defined, it should have node attached. */
2321 gcc_assert (alias || TREE_CODE (t) != VAR_DECL
2322 || varpool_node::get (t)->definition);
2323 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2324 || (cgraph_node::get (t)
2325 && cgraph_node::get (t)->definition));
2328 /* Imitate what default_elf_asm_output_external do.
2329 When symbol is external, we need to output it with DEFAULT visibility
2330 when compiling with -fvisibility=default, while with HIDDEN visibility
2331 when symbol has attribute (visibility("hidden")) specified.
2332 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2333 right. */
2335 if (DECL_EXTERNAL (t)
2336 && !targetm.binds_local_p (t))
2337 visibility = GCCPV_DEFAULT;
2338 else
2339 switch (DECL_VISIBILITY (t))
2341 case VISIBILITY_DEFAULT:
2342 visibility = GCCPV_DEFAULT;
2343 break;
2344 case VISIBILITY_PROTECTED:
2345 visibility = GCCPV_PROTECTED;
2346 break;
2347 case VISIBILITY_HIDDEN:
2348 visibility = GCCPV_HIDDEN;
2349 break;
2350 case VISIBILITY_INTERNAL:
2351 visibility = GCCPV_INTERNAL;
2352 break;
2355 if (kind == GCCPK_COMMON
2356 && DECL_SIZE_UNIT (t)
2357 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
2358 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2359 else
2360 size = 0;
2362 if (DECL_ONE_ONLY (t))
2363 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
2364 else
2365 comdat = "";
2367 lto_output_data_stream (stream, name, strlen (name) + 1);
2368 lto_output_data_stream (stream, comdat, strlen (comdat) + 1);
2369 c = (unsigned char) kind;
2370 lto_output_data_stream (stream, &c, 1);
2371 c = (unsigned char) visibility;
2372 lto_output_data_stream (stream, &c, 1);
2373 lto_output_data_stream (stream, &size, 8);
2374 lto_output_data_stream (stream, &slot_num, 4);
2377 /* Return true if NODE should appear in the plugin symbol table. */
2379 bool
2380 output_symbol_p (symtab_node *node)
2382 struct cgraph_node *cnode;
2383 if (!node->real_symbol_p ())
2384 return false;
2385 /* We keep external functions in symtab for sake of inlining
2386 and devirtualization. We do not want to see them in symbol table as
2387 references unless they are really used. */
2388 cnode = dyn_cast <cgraph_node *> (node);
2389 if (cnode && (!node->definition || DECL_EXTERNAL (cnode->decl))
2390 && cnode->callers)
2391 return true;
2393 /* Ignore all references from external vars initializers - they are not really
2394 part of the compilation unit until they are used by folding. Some symbols,
2395 like references to external construction vtables can not be referred to at all.
2396 We decide this at can_refer_decl_in_current_unit_p. */
2397 if (!node->definition || DECL_EXTERNAL (node->decl))
2399 int i;
2400 struct ipa_ref *ref;
2401 for (i = 0; node->iterate_referring (i, ref); i++)
2403 if (ref->use == IPA_REF_ALIAS)
2404 continue;
2405 if (is_a <cgraph_node *> (ref->referring))
2406 return true;
2407 if (!DECL_EXTERNAL (ref->referring->decl))
2408 return true;
2410 return false;
2412 return true;
2416 /* Write an IL symbol table to OB.
2417 SET and VSET are cgraph/varpool node sets we are outputting. */
2419 static void
2420 produce_symtab (struct output_block *ob)
2422 struct streamer_tree_cache_d *cache = ob->writer_cache;
2423 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
2424 struct pointer_set_t *seen;
2425 struct lto_output_stream stream;
2426 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2427 lto_symtab_encoder_iterator lsei;
2429 lto_begin_section (section_name, false);
2430 free (section_name);
2432 seen = pointer_set_create ();
2433 memset (&stream, 0, sizeof (stream));
2435 /* Write the symbol table.
2436 First write everything defined and then all declarations.
2437 This is necessary to handle cases where we have duplicated symbols. */
2438 for (lsei = lsei_start (encoder);
2439 !lsei_end_p (lsei); lsei_next (&lsei))
2441 symtab_node *node = lsei_node (lsei);
2443 if (!output_symbol_p (node) || DECL_EXTERNAL (node->decl))
2444 continue;
2445 write_symbol (cache, &stream, node->decl, seen, false);
2447 for (lsei = lsei_start (encoder);
2448 !lsei_end_p (lsei); lsei_next (&lsei))
2450 symtab_node *node = lsei_node (lsei);
2452 if (!output_symbol_p (node) || !DECL_EXTERNAL (node->decl))
2453 continue;
2454 write_symbol (cache, &stream, node->decl, seen, false);
2457 lto_write_stream (&stream);
2458 pointer_set_destroy (seen);
2460 lto_end_section ();
2464 /* This pass is run after all of the functions are serialized and all
2465 of the IPA passes have written their serialized forms. This pass
2466 causes the vector of all of the global decls and types used from
2467 this file to be written in to a section that can then be read in to
2468 recover these on other side. */
2470 void
2471 produce_asm_for_decls (void)
2473 struct lto_out_decl_state *out_state;
2474 struct lto_out_decl_state *fn_out_state;
2475 struct lto_decl_header header;
2476 char *section_name;
2477 struct output_block *ob;
2478 struct lto_output_stream *header_stream, *decl_state_stream;
2479 unsigned idx, num_fns;
2480 size_t decl_state_size;
2481 int32_t num_decl_states;
2483 ob = create_output_block (LTO_section_decls);
2484 ob->global = true;
2486 memset (&header, 0, sizeof (struct lto_decl_header));
2488 section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
2489 lto_begin_section (section_name, !flag_wpa);
2490 free (section_name);
2492 /* Make string 0 be a NULL string. */
2493 streamer_write_char_stream (ob->string_stream, 0);
2495 gcc_assert (!alias_pairs);
2497 /* Get rid of the global decl state hash tables to save some memory. */
2498 out_state = lto_get_out_decl_state ();
2499 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
2500 if (out_state->streams[i].tree_hash_table)
2502 delete out_state->streams[i].tree_hash_table;
2503 out_state->streams[i].tree_hash_table = NULL;
2506 /* Write the global symbols. */
2507 lto_output_decl_state_streams (ob, out_state);
2508 num_fns = lto_function_decl_states.length ();
2509 for (idx = 0; idx < num_fns; idx++)
2511 fn_out_state =
2512 lto_function_decl_states[idx];
2513 lto_output_decl_state_streams (ob, fn_out_state);
2516 header.lto_header.major_version = LTO_major_version;
2517 header.lto_header.minor_version = LTO_minor_version;
2519 /* Currently not used. This field would allow us to preallocate
2520 the globals vector, so that it need not be resized as it is extended. */
2521 header.num_nodes = -1;
2523 /* Compute the total size of all decl out states. */
2524 decl_state_size = sizeof (int32_t);
2525 decl_state_size += lto_out_decl_state_written_size (out_state);
2526 for (idx = 0; idx < num_fns; idx++)
2528 fn_out_state =
2529 lto_function_decl_states[idx];
2530 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2532 header.decl_state_size = decl_state_size;
2534 header.main_size = ob->main_stream->total_size;
2535 header.string_size = ob->string_stream->total_size;
2537 header_stream = XCNEW (struct lto_output_stream);
2538 lto_output_data_stream (header_stream, &header, sizeof header);
2539 lto_write_stream (header_stream);
2540 free (header_stream);
2542 /* Write the main out-decl state, followed by out-decl states of
2543 functions. */
2544 decl_state_stream = XCNEW (struct lto_output_stream);
2545 num_decl_states = num_fns + 1;
2546 lto_output_data_stream (decl_state_stream, &num_decl_states,
2547 sizeof (num_decl_states));
2548 lto_output_decl_state_refs (ob, decl_state_stream, out_state);
2549 for (idx = 0; idx < num_fns; idx++)
2551 fn_out_state =
2552 lto_function_decl_states[idx];
2553 lto_output_decl_state_refs (ob, decl_state_stream, fn_out_state);
2555 lto_write_stream (decl_state_stream);
2556 free (decl_state_stream);
2558 lto_write_stream (ob->main_stream);
2559 lto_write_stream (ob->string_stream);
2561 lto_end_section ();
2563 /* Write the symbol table. It is used by linker to determine dependencies
2564 and thus we can skip it for WPA. */
2565 if (!flag_wpa)
2566 produce_symtab (ob);
2568 /* Write command line opts. */
2569 lto_write_options ();
2571 /* Deallocate memory and clean up. */
2572 for (idx = 0; idx < num_fns; idx++)
2574 fn_out_state =
2575 lto_function_decl_states[idx];
2576 lto_delete_out_decl_state (fn_out_state);
2578 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
2579 lto_function_decl_states.release ();
2580 destroy_output_block (ob);