Daily bump.
[official-gcc.git] / gcc / lto-streamer-out.c
blob2a022dee66695c6b7a79fba81282f86bdbca799f
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"
57 static void lto_write_tree (struct output_block*, tree, bool);
59 /* Clear the line info stored in DATA_IN. */
61 static void
62 clear_line_info (struct output_block *ob)
64 ob->current_file = NULL;
65 ob->current_line = 0;
66 ob->current_col = 0;
70 /* Create the output block and return it. SECTION_TYPE is
71 LTO_section_function_body or LTO_static_initializer. */
73 struct output_block *
74 create_output_block (enum lto_section_type section_type)
76 struct output_block *ob = XCNEW (struct output_block);
78 ob->section_type = section_type;
79 ob->decl_state = lto_get_out_decl_state ();
80 ob->main_stream = XCNEW (struct lto_output_stream);
81 ob->string_stream = XCNEW (struct lto_output_stream);
82 ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true, false);
84 if (section_type == LTO_section_function_body)
85 ob->cfg_stream = XCNEW (struct lto_output_stream);
87 clear_line_info (ob);
89 ob->string_hash_table.create (37);
90 gcc_obstack_init (&ob->obstack);
92 return ob;
96 /* Destroy the output block OB. */
98 void
99 destroy_output_block (struct output_block *ob)
101 enum lto_section_type section_type = ob->section_type;
103 ob->string_hash_table.dispose ();
105 free (ob->main_stream);
106 free (ob->string_stream);
107 if (section_type == LTO_section_function_body)
108 free (ob->cfg_stream);
110 streamer_tree_cache_delete (ob->writer_cache);
111 obstack_free (&ob->obstack, NULL);
113 free (ob);
117 /* Look up NODE in the type table and write the index for it to OB. */
119 static void
120 output_type_ref (struct output_block *ob, tree node)
122 streamer_write_record_start (ob, LTO_type_ref);
123 lto_output_type_ref_index (ob->decl_state, ob->main_stream, node);
127 /* Return true if tree node T is written to various tables. For these
128 nodes, we sometimes want to write their phyiscal representation
129 (via lto_output_tree), and sometimes we need to emit an index
130 reference into a table (via lto_output_tree_ref). */
132 static bool
133 tree_is_indexable (tree t)
135 /* Parameters and return values of functions of variably modified types
136 must go to global stream, because they may be used in the type
137 definition. */
138 if ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
139 && DECL_CONTEXT (t))
140 return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)), NULL_TREE);
141 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared. */
142 else if (TREE_CODE (t) == IMPORTED_DECL)
143 return false;
144 else if (((TREE_CODE (t) == VAR_DECL && !TREE_STATIC (t))
145 || TREE_CODE (t) == TYPE_DECL
146 || TREE_CODE (t) == CONST_DECL
147 || TREE_CODE (t) == NAMELIST_DECL)
148 && decl_function_context (t))
149 return false;
150 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
151 return false;
152 /* Variably modified types need to be streamed alongside function
153 bodies because they can refer to local entities. Together with
154 them we have to localize their members as well.
155 ??? In theory that includes non-FIELD_DECLs as well. */
156 else if (TYPE_P (t)
157 && variably_modified_type_p (t, NULL_TREE))
158 return false;
159 else if (TREE_CODE (t) == FIELD_DECL
160 && variably_modified_type_p (DECL_CONTEXT (t), NULL_TREE))
161 return false;
162 else
163 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
167 /* Output info about new location into bitpack BP.
168 After outputting bitpack, lto_output_location_data has
169 to be done to output actual data. */
171 void
172 lto_output_location (struct output_block *ob, struct bitpack_d *bp,
173 location_t loc)
175 expanded_location xloc;
177 loc = LOCATION_LOCUS (loc);
178 bp_pack_value (bp, loc == UNKNOWN_LOCATION, 1);
179 if (loc == UNKNOWN_LOCATION)
180 return;
182 xloc = expand_location (loc);
184 bp_pack_value (bp, ob->current_file != xloc.file, 1);
185 bp_pack_value (bp, ob->current_line != xloc.line, 1);
186 bp_pack_value (bp, ob->current_col != xloc.column, 1);
188 if (ob->current_file != xloc.file)
189 bp_pack_var_len_unsigned (bp,
190 streamer_string_index (ob, xloc.file,
191 strlen (xloc.file) + 1,
192 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 (struct output_block *ob, 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 lto_symtab_encoder_t encoder;
337 varpool_node *vnode;
339 encoder = ob->decl_state->symtab_node_encoder;
340 vnode = varpool_get_node (expr);
341 if (!vnode
342 || !lto_symtab_encoder_encode_initializer_p (encoder,
343 vnode))
344 initial = error_mark_node;
347 return initial;
351 /* Write a physical representation of tree node EXPR to output block
352 OB. If REF_P is true, the leaves of EXPR are emitted as references
353 via lto_output_tree_ref. IX is the index into the streamer cache
354 where EXPR is stored. */
356 static void
357 lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
359 /* Pack all the non-pointer fields in EXPR into a bitpack and write
360 the resulting bitpack. */
361 bitpack_d bp = bitpack_create (ob->main_stream);
362 streamer_pack_tree_bitfields (ob, &bp, expr);
363 streamer_write_bitpack (&bp);
365 /* Write all the pointer fields in EXPR. */
366 streamer_write_tree_body (ob, expr, ref_p);
368 /* Write any LTO-specific data to OB. */
369 if (DECL_P (expr)
370 && TREE_CODE (expr) != FUNCTION_DECL
371 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
373 /* Handle DECL_INITIAL for symbols. */
374 tree initial = get_symbol_initial_value (ob, 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));
533 DFS_follow_tree_edge (DECL_VINDEX (expr));
536 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
538 /* Make sure we don't inadvertently set the assembler name. */
539 if (DECL_ASSEMBLER_NAME_SET_P (expr))
540 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
541 DFS_follow_tree_edge (DECL_SECTION_NAME (expr));
542 DFS_follow_tree_edge (DECL_COMDAT_GROUP (expr));
545 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
547 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
548 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
549 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
550 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
551 DFS_follow_tree_edge (DECL_FCONTEXT (expr));
554 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
556 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
557 /* Do not DECL_FUNCTION_SPECIFIC_TARGET. They will be regenerated. */
558 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
561 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
563 DFS_follow_tree_edge (TYPE_SIZE (expr));
564 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
565 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
566 DFS_follow_tree_edge (TYPE_NAME (expr));
567 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
568 reconstructed during fixup. */
569 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
570 during fixup. */
571 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
572 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
573 /* TYPE_CANONICAL is re-computed during type merging, so no need
574 to follow it here. */
575 DFS_follow_tree_edge (TYPE_STUB_DECL (expr));
578 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
580 if (TREE_CODE (expr) == ENUMERAL_TYPE)
581 DFS_follow_tree_edge (TYPE_VALUES (expr));
582 else if (TREE_CODE (expr) == ARRAY_TYPE)
583 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
584 else if (RECORD_OR_UNION_TYPE_P (expr))
585 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
586 DFS_follow_tree_edge (t);
587 else if (TREE_CODE (expr) == FUNCTION_TYPE
588 || TREE_CODE (expr) == METHOD_TYPE)
589 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
591 if (!POINTER_TYPE_P (expr))
592 DFS_follow_tree_edge (TYPE_MINVAL (expr));
593 DFS_follow_tree_edge (TYPE_MAXVAL (expr));
594 if (RECORD_OR_UNION_TYPE_P (expr))
595 DFS_follow_tree_edge (TYPE_BINFO (expr));
598 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
600 DFS_follow_tree_edge (TREE_PURPOSE (expr));
601 DFS_follow_tree_edge (TREE_VALUE (expr));
602 DFS_follow_tree_edge (TREE_CHAIN (expr));
605 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
607 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
608 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
611 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
613 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
614 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
615 DFS_follow_tree_edge (TREE_BLOCK (expr));
618 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
620 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
621 /* ??? FIXME. See also streamer_write_chain. */
622 if (!(VAR_OR_FUNCTION_DECL_P (t)
623 && DECL_EXTERNAL (t)))
624 DFS_follow_tree_edge (t);
626 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
628 /* Follow BLOCK_ABSTRACT_ORIGIN for the limited cases we can
629 handle - those that represent inlined function scopes.
630 For the drop rest them on the floor instead of ICEing
631 in dwarf2out.c. */
632 if (inlined_function_outer_scope_p (expr))
634 tree ultimate_origin = block_ultimate_origin (expr);
635 DFS_follow_tree_edge (ultimate_origin);
637 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
638 information for early inlined BLOCKs so drop it on the floor instead
639 of ICEing in dwarf2out.c. */
641 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
642 streaming time. */
644 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
645 list is re-constructed from BLOCK_SUPERCONTEXT. */
648 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
650 unsigned i;
651 tree t;
653 /* Note that the number of BINFO slots has already been emitted in
654 EXPR's header (see streamer_write_tree_header) because this length
655 is needed to build the empty BINFO node on the reader side. */
656 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
657 DFS_follow_tree_edge (t);
658 DFS_follow_tree_edge (BINFO_OFFSET (expr));
659 DFS_follow_tree_edge (BINFO_VTABLE (expr));
660 DFS_follow_tree_edge (BINFO_VPTR_FIELD (expr));
662 /* The number of BINFO_BASE_ACCESSES has already been emitted in
663 EXPR's bitfield section. */
664 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
665 DFS_follow_tree_edge (t);
667 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
668 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
671 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
673 unsigned i;
674 tree index, value;
676 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
678 DFS_follow_tree_edge (index);
679 DFS_follow_tree_edge (value);
683 if (code == OMP_CLAUSE)
685 int i;
686 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
687 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
688 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
691 #undef DFS_follow_tree_edge
694 /* Return a hash value for the tree T. */
696 static hashval_t
697 hash_tree (struct streamer_tree_cache_d *cache, tree t)
699 #define visit(SIBLING) \
700 do { \
701 unsigned ix; \
702 if (SIBLING && streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
703 v = iterative_hash_hashval_t (streamer_tree_cache_get_hash (cache, ix), v); \
704 } while (0)
706 /* Hash TS_BASE. */
707 enum tree_code code = TREE_CODE (t);
708 hashval_t v = iterative_hash_host_wide_int (code, 0);
709 if (!TYPE_P (t))
711 v = iterative_hash_host_wide_int (TREE_SIDE_EFFECTS (t)
712 | (TREE_CONSTANT (t) << 1)
713 | (TREE_READONLY (t) << 2)
714 | (TREE_PUBLIC (t) << 3), v);
716 v = iterative_hash_host_wide_int (TREE_ADDRESSABLE (t)
717 | (TREE_THIS_VOLATILE (t) << 1), v);
718 if (DECL_P (t))
719 v = iterative_hash_host_wide_int (DECL_UNSIGNED (t), v);
720 else if (TYPE_P (t))
721 v = iterative_hash_host_wide_int (TYPE_UNSIGNED (t), v);
722 if (TYPE_P (t))
723 v = iterative_hash_host_wide_int (TYPE_ARTIFICIAL (t), v);
724 else
725 v = iterative_hash_host_wide_int (TREE_NO_WARNING (t), v);
726 v = iterative_hash_host_wide_int (TREE_NOTHROW (t)
727 | (TREE_STATIC (t) << 1)
728 | (TREE_PROTECTED (t) << 2)
729 | (TREE_DEPRECATED (t) << 3), v);
730 if (code != TREE_BINFO)
731 v = iterative_hash_host_wide_int (TREE_PRIVATE (t), v);
732 if (TYPE_P (t))
733 v = iterative_hash_host_wide_int (TYPE_SATURATING (t)
734 | (TYPE_ADDR_SPACE (t) << 1), v);
735 else if (code == SSA_NAME)
736 v = iterative_hash_host_wide_int (SSA_NAME_IS_DEFAULT_DEF (t), v);
738 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
740 v = iterative_hash_host_wide_int (TREE_INT_CST_LOW (t), v);
741 v = iterative_hash_host_wide_int (TREE_INT_CST_HIGH (t), v);
744 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
746 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
747 v = iterative_hash_host_wide_int (r.cl, v);
748 v = iterative_hash_host_wide_int (r.decimal
749 | (r.sign << 1)
750 | (r.signalling << 2)
751 | (r.canonical << 3), v);
752 v = iterative_hash_host_wide_int (r.uexp, v);
753 for (unsigned i = 0; i < SIGSZ; ++i)
754 v = iterative_hash_host_wide_int (r.sig[i], v);
757 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
759 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
760 v = iterative_hash_host_wide_int (f.mode, v);
761 v = iterative_hash_host_wide_int (f.data.low, v);
762 v = iterative_hash_host_wide_int (f.data.high, v);
765 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
767 v = iterative_hash_host_wide_int (DECL_MODE (t), v);
768 v = iterative_hash_host_wide_int (DECL_NONLOCAL (t)
769 | (DECL_VIRTUAL_P (t) << 1)
770 | (DECL_IGNORED_P (t) << 2)
771 | (DECL_ABSTRACT (t) << 3)
772 | (DECL_ARTIFICIAL (t) << 4)
773 | (DECL_USER_ALIGN (t) << 5)
774 | (DECL_PRESERVE_P (t) << 6)
775 | (DECL_EXTERNAL (t) << 7)
776 | (DECL_GIMPLE_REG_P (t) << 8), v);
777 v = iterative_hash_host_wide_int (DECL_ALIGN (t), v);
778 if (code == LABEL_DECL)
780 v = iterative_hash_host_wide_int (EH_LANDING_PAD_NR (t), v);
781 v = iterative_hash_host_wide_int (LABEL_DECL_UID (t), v);
783 else if (code == FIELD_DECL)
785 v = iterative_hash_host_wide_int (DECL_PACKED (t)
786 | (DECL_NONADDRESSABLE_P (t) << 1),
788 v = iterative_hash_host_wide_int (DECL_OFFSET_ALIGN (t), v);
790 else if (code == VAR_DECL)
792 v = iterative_hash_host_wide_int (DECL_HAS_DEBUG_EXPR_P (t)
793 | (DECL_NONLOCAL_FRAME (t) << 1),
796 if (code == RESULT_DECL
797 || code == PARM_DECL
798 || code == VAR_DECL)
800 v = iterative_hash_host_wide_int (DECL_BY_REFERENCE (t), v);
801 if (code == VAR_DECL
802 || code == PARM_DECL)
803 v = iterative_hash_host_wide_int (DECL_HAS_VALUE_EXPR_P (t), v);
807 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
808 v = iterative_hash_host_wide_int (DECL_REGISTER (t), v);
810 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
812 v = iterative_hash_host_wide_int ((DECL_COMMON (t))
813 | (DECL_DLLIMPORT_P (t) << 1)
814 | (DECL_WEAK (t) << 2)
815 | (DECL_SEEN_IN_BIND_EXPR_P (t) << 3)
816 | (DECL_COMDAT (t) << 4)
817 | (DECL_VISIBILITY_SPECIFIED (t) << 6),
819 v = iterative_hash_host_wide_int (DECL_VISIBILITY (t), v);
820 if (code == VAR_DECL)
822 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
823 v = iterative_hash_host_wide_int (DECL_HARD_REGISTER (t)
824 | (DECL_IN_CONSTANT_POOL (t) << 1),
826 v = iterative_hash_host_wide_int (DECL_TLS_MODEL (t), v);
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),
833 if (VAR_OR_FUNCTION_DECL_P (t))
834 v = iterative_hash_host_wide_int (DECL_INIT_PRIORITY (t), v);
837 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
839 v = iterative_hash_host_wide_int (DECL_BUILT_IN_CLASS (t), v);
840 v = iterative_hash_host_wide_int (DECL_STATIC_CONSTRUCTOR (t)
841 | (DECL_STATIC_DESTRUCTOR (t) << 1)
842 | (DECL_UNINLINABLE (t) << 2)
843 | (DECL_POSSIBLY_INLINED (t) << 3)
844 | (DECL_IS_NOVOPS (t) << 4)
845 | (DECL_IS_RETURNS_TWICE (t) << 5)
846 | (DECL_IS_MALLOC (t) << 6)
847 | (DECL_IS_OPERATOR_NEW (t) << 7)
848 | (DECL_DECLARED_INLINE_P (t) << 8)
849 | (DECL_STATIC_CHAIN (t) << 9)
850 | (DECL_NO_INLINE_WARNING_P (t) << 10)
851 | (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t) << 11)
852 | (DECL_NO_LIMIT_STACK (t) << 12)
853 | (DECL_DISREGARD_INLINE_LIMITS (t) << 13)
854 | (DECL_PURE_P (t) << 14)
855 | (DECL_LOOPING_CONST_OR_PURE_P (t) << 15), v);
856 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
857 v = iterative_hash_host_wide_int (DECL_FUNCTION_CODE (t), v);
858 if (DECL_STATIC_DESTRUCTOR (t))
859 v = iterative_hash_host_wide_int (DECL_FINI_PRIORITY (t), v);
862 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
864 v = iterative_hash_host_wide_int (TYPE_MODE (t), v);
865 v = iterative_hash_host_wide_int (TYPE_STRING_FLAG (t)
866 | (TYPE_NO_FORCE_BLK (t) << 1)
867 | (TYPE_NEEDS_CONSTRUCTING (t) << 2)
868 | (TYPE_PACKED (t) << 3)
869 | (TYPE_RESTRICT (t) << 4)
870 | (TYPE_USER_ALIGN (t) << 5)
871 | (TYPE_READONLY (t) << 6), v);
872 if (RECORD_OR_UNION_TYPE_P (t))
874 v = iterative_hash_host_wide_int (TYPE_TRANSPARENT_AGGR (t)
875 | (TYPE_FINAL_P (t) << 1), v);
877 else if (code == ARRAY_TYPE)
878 v = iterative_hash_host_wide_int (TYPE_NONALIASED_COMPONENT (t), v);
879 v = iterative_hash_host_wide_int (TYPE_PRECISION (t), v);
880 v = iterative_hash_host_wide_int (TYPE_ALIGN (t), v);
881 v = iterative_hash_host_wide_int ((TYPE_ALIAS_SET (t) == 0
882 || (!in_lto_p
883 && get_alias_set (t) == 0))
884 ? 0 : -1, v);
887 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
888 v = iterative_hash (TRANSLATION_UNIT_LANGUAGE (t),
889 strlen (TRANSLATION_UNIT_LANGUAGE (t)), v);
891 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
892 gcc_unreachable ();
894 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
895 v = iterative_hash (t, sizeof (struct cl_optimization), v);
897 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
898 v = iterative_hash_host_wide_int (IDENTIFIER_HASH_VALUE (t), v);
900 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
901 v = iterative_hash (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t), v);
903 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
905 if (POINTER_TYPE_P (t))
907 /* For pointers factor in the pointed-to type recursively as
908 we cannot recurse through only pointers.
909 ??? We can generalize this by keeping track of the
910 in-SCC edges for each tree (or arbitrarily the first
911 such edge) and hashing that in in a second stage
912 (instead of the quadratic mixing of the SCC we do now). */
913 hashval_t x;
914 unsigned ix;
915 if (streamer_tree_cache_lookup (cache, TREE_TYPE (t), &ix))
916 x = streamer_tree_cache_get_hash (cache, ix);
917 else
918 x = hash_tree (cache, TREE_TYPE (t));
919 v = iterative_hash_hashval_t (x, v);
921 else if (code != IDENTIFIER_NODE)
922 visit (TREE_TYPE (t));
925 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
926 for (unsigned i = 0; i < VECTOR_CST_NELTS (t); ++i)
927 visit (VECTOR_CST_ELT (t, i));
929 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
931 visit (TREE_REALPART (t));
932 visit (TREE_IMAGPART (t));
935 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
937 /* Drop names that were created for anonymous entities. */
938 if (DECL_NAME (t)
939 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
940 && ANON_AGGRNAME_P (DECL_NAME (t)))
942 else
943 visit (DECL_NAME (t));
944 if (DECL_FILE_SCOPE_P (t))
946 else
947 visit (DECL_CONTEXT (t));
950 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
952 visit (DECL_SIZE (t));
953 visit (DECL_SIZE_UNIT (t));
954 visit (DECL_ATTRIBUTES (t));
955 if ((code == VAR_DECL
956 || code == PARM_DECL)
957 && DECL_HAS_VALUE_EXPR_P (t))
958 visit (DECL_VALUE_EXPR (t));
959 if (code == VAR_DECL
960 && DECL_HAS_DEBUG_EXPR_P (t))
961 visit (DECL_DEBUG_EXPR (t));
962 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
963 be able to call get_symbol_initial_value. */
966 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
968 if (code == TYPE_DECL)
969 visit (DECL_ORIGINAL_TYPE (t));
970 visit (DECL_VINDEX (t));
973 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
975 if (DECL_ASSEMBLER_NAME_SET_P (t))
976 visit (DECL_ASSEMBLER_NAME (t));
977 visit (DECL_SECTION_NAME (t));
978 visit (DECL_COMDAT_GROUP (t));
981 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
983 visit (DECL_FIELD_OFFSET (t));
984 visit (DECL_BIT_FIELD_TYPE (t));
985 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
986 visit (DECL_FIELD_BIT_OFFSET (t));
987 visit (DECL_FCONTEXT (t));
990 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
992 visit (DECL_FUNCTION_PERSONALITY (t));
993 /* Do not follow DECL_FUNCTION_SPECIFIC_TARGET. */
994 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
997 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
999 visit (TYPE_SIZE (t));
1000 visit (TYPE_SIZE_UNIT (t));
1001 visit (TYPE_ATTRIBUTES (t));
1002 visit (TYPE_NAME (t));
1003 visit (TYPE_MAIN_VARIANT (t));
1004 if (TYPE_FILE_SCOPE_P (t))
1006 else
1007 visit (TYPE_CONTEXT (t));
1008 visit (TYPE_STUB_DECL (t));
1011 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1013 if (code == ENUMERAL_TYPE)
1014 visit (TYPE_VALUES (t));
1015 else if (code == ARRAY_TYPE)
1016 visit (TYPE_DOMAIN (t));
1017 else if (RECORD_OR_UNION_TYPE_P (t))
1018 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1019 visit (f);
1020 else if (code == FUNCTION_TYPE
1021 || code == METHOD_TYPE)
1022 visit (TYPE_ARG_TYPES (t));
1023 if (!POINTER_TYPE_P (t))
1024 visit (TYPE_MINVAL (t));
1025 visit (TYPE_MAXVAL (t));
1026 if (RECORD_OR_UNION_TYPE_P (t))
1027 visit (TYPE_BINFO (t));
1030 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1032 visit (TREE_PURPOSE (t));
1033 visit (TREE_VALUE (t));
1034 visit (TREE_CHAIN (t));
1037 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1038 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1039 visit (TREE_VEC_ELT (t, i));
1041 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1043 v = iterative_hash_host_wide_int (TREE_OPERAND_LENGTH (t), v);
1044 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1045 visit (TREE_OPERAND (t, i));
1048 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1050 unsigned i;
1051 tree b;
1052 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1053 visit (b);
1054 visit (BINFO_OFFSET (t));
1055 visit (BINFO_VTABLE (t));
1056 visit (BINFO_VPTR_FIELD (t));
1057 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t), i, b)
1058 visit (b);
1059 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1060 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
1063 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1065 unsigned i;
1066 tree index, value;
1067 v = iterative_hash_host_wide_int (CONSTRUCTOR_NELTS (t), v);
1068 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1070 visit (index);
1071 visit (value);
1075 if (code == OMP_CLAUSE)
1077 int i;
1079 v = iterative_hash_host_wide_int (OMP_CLAUSE_CODE (t), v);
1080 switch (OMP_CLAUSE_CODE (t))
1082 case OMP_CLAUSE_DEFAULT:
1083 v = iterative_hash_host_wide_int (OMP_CLAUSE_DEFAULT_KIND (t), v);
1084 break;
1085 case OMP_CLAUSE_SCHEDULE:
1086 v = iterative_hash_host_wide_int (OMP_CLAUSE_SCHEDULE_KIND (t), v);
1087 break;
1088 case OMP_CLAUSE_DEPEND:
1089 v = iterative_hash_host_wide_int (OMP_CLAUSE_DEPEND_KIND (t), v);
1090 break;
1091 case OMP_CLAUSE_MAP:
1092 v = iterative_hash_host_wide_int (OMP_CLAUSE_MAP_KIND (t), v);
1093 break;
1094 case OMP_CLAUSE_PROC_BIND:
1095 v = iterative_hash_host_wide_int (OMP_CLAUSE_PROC_BIND_KIND (t), v);
1096 break;
1097 case OMP_CLAUSE_REDUCTION:
1098 v = iterative_hash_host_wide_int (OMP_CLAUSE_REDUCTION_CODE (t), v);
1099 break;
1100 default:
1101 break;
1103 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1104 visit (OMP_CLAUSE_OPERAND (t, i));
1105 visit (OMP_CLAUSE_CHAIN (t));
1108 return v;
1110 #undef visit
1113 /* Compare two SCC entries by their hash value for qsorting them. */
1115 static int
1116 scc_entry_compare (const void *p1_, const void *p2_)
1118 const scc_entry *p1 = (const scc_entry *) p1_;
1119 const scc_entry *p2 = (const scc_entry *) p2_;
1120 if (p1->hash < p2->hash)
1121 return -1;
1122 else if (p1->hash > p2->hash)
1123 return 1;
1124 return 0;
1127 /* Return a hash value for the SCC on the SCC stack from FIRST with
1128 size SIZE. */
1130 static hashval_t
1131 hash_scc (struct streamer_tree_cache_d *cache, unsigned first, unsigned size)
1133 /* Compute hash values for the SCC members. */
1134 for (unsigned i = 0; i < size; ++i)
1135 sccstack[first+i].hash = hash_tree (cache, sccstack[first+i].t);
1137 if (size == 1)
1138 return sccstack[first].hash;
1140 /* Sort the SCC of type, hash pairs so that when we mix in
1141 all members of the SCC the hash value becomes independent on
1142 the order we visited the SCC. Disregard hashes equal to
1143 the hash of the tree we mix into because we cannot guarantee
1144 a stable sort for those across different TUs. */
1145 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1146 hashval_t *tem = XALLOCAVEC (hashval_t, size);
1147 for (unsigned i = 0; i < size; ++i)
1149 hashval_t hash = sccstack[first+i].hash;
1150 hashval_t orig_hash = hash;
1151 unsigned j;
1152 /* Skip same hashes. */
1153 for (j = i + 1;
1154 j < size && sccstack[first+j].hash == orig_hash; ++j)
1156 for (; j < size; ++j)
1157 hash = iterative_hash_hashval_t (sccstack[first+j].hash, hash);
1158 for (j = 0; sccstack[first+j].hash != orig_hash; ++j)
1159 hash = iterative_hash_hashval_t (sccstack[first+j].hash, hash);
1160 tem[i] = hash;
1162 hashval_t scc_hash = 0;
1163 for (unsigned i = 0; i < size; ++i)
1165 sccstack[first+i].hash = tem[i];
1166 scc_hash = iterative_hash_hashval_t (tem[i], scc_hash);
1168 return scc_hash;
1171 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1172 already in the streamer cache. Main routine called for
1173 each visit of EXPR. */
1175 static void
1176 DFS_write_tree (struct output_block *ob, sccs *from_state,
1177 tree expr, bool ref_p, bool this_ref_p)
1179 unsigned ix;
1180 sccs **slot;
1182 /* Handle special cases. */
1183 if (expr == NULL_TREE)
1184 return;
1186 /* Do not DFS walk into indexable trees. */
1187 if (this_ref_p && tree_is_indexable (expr))
1188 return;
1190 /* Check if we already streamed EXPR. */
1191 if (streamer_tree_cache_lookup (ob->writer_cache, expr, &ix))
1192 return;
1194 slot = (sccs **)pointer_map_insert (sccstate, expr);
1195 sccs *cstate = *slot;
1196 if (!cstate)
1198 scc_entry e = { expr, 0 };
1199 /* Not yet visited. DFS recurse and push it onto the stack. */
1200 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
1201 sccstack.safe_push (e);
1202 cstate->dfsnum = next_dfs_num++;
1203 cstate->low = cstate->dfsnum;
1205 if (streamer_handle_as_builtin_p (expr))
1207 else if (TREE_CODE (expr) == INTEGER_CST
1208 && !TREE_OVERFLOW (expr))
1209 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
1210 else
1212 DFS_write_tree_body (ob, expr, cstate, ref_p);
1214 /* Walk any LTO-specific edges. */
1215 if (DECL_P (expr)
1216 && TREE_CODE (expr) != FUNCTION_DECL
1217 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1219 /* Handle DECL_INITIAL for symbols. */
1220 tree initial = get_symbol_initial_value (ob, expr);
1221 DFS_write_tree (ob, cstate, initial, ref_p, ref_p);
1225 /* See if we found an SCC. */
1226 if (cstate->low == cstate->dfsnum)
1228 unsigned first, size;
1229 tree x;
1231 /* Pop the SCC and compute its size. */
1232 first = sccstack.length ();
1235 x = sccstack[--first].t;
1237 while (x != expr);
1238 size = sccstack.length () - first;
1240 /* No need to compute hashes for LTRANS units, we don't perform
1241 any merging there. */
1242 hashval_t scc_hash = 0;
1243 unsigned scc_entry_len = 0;
1244 if (!flag_wpa)
1246 scc_hash = hash_scc (ob->writer_cache, first, size);
1248 /* Put the entries with the least number of collisions first. */
1249 unsigned entry_start = 0;
1250 scc_entry_len = size + 1;
1251 for (unsigned i = 0; i < size;)
1253 unsigned from = i;
1254 for (i = i + 1; i < size
1255 && (sccstack[first + i].hash
1256 == sccstack[first + from].hash); ++i)
1258 if (i - from < scc_entry_len)
1260 scc_entry_len = i - from;
1261 entry_start = from;
1264 for (unsigned i = 0; i < scc_entry_len; ++i)
1266 scc_entry tem = sccstack[first + i];
1267 sccstack[first + i] = sccstack[first + entry_start + i];
1268 sccstack[first + entry_start + i] = tem;
1272 /* Write LTO_tree_scc. */
1273 streamer_write_record_start (ob, LTO_tree_scc);
1274 streamer_write_uhwi (ob, size);
1275 streamer_write_uhwi (ob, scc_hash);
1277 /* Write size-1 SCCs without wrapping them inside SCC bundles.
1278 All INTEGER_CSTs need to be handled this way as we need
1279 their type to materialize them. Also builtins are handled
1280 this way.
1281 ??? We still wrap these in LTO_tree_scc so at the
1282 input side we can properly identify the tree we want
1283 to ultimatively return. */
1284 if (size == 1)
1285 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
1286 else
1288 /* Write the size of the SCC entry candidates. */
1289 streamer_write_uhwi (ob, scc_entry_len);
1291 /* Write all headers and populate the streamer cache. */
1292 for (unsigned i = 0; i < size; ++i)
1294 hashval_t hash = sccstack[first+i].hash;
1295 tree t = sccstack[first+i].t;
1296 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
1297 t, hash, &ix);
1298 gcc_assert (!exists_p);
1300 if (!lto_is_streamable (t))
1301 internal_error ("tree code %qs is not supported "
1302 "in LTO streams",
1303 get_tree_code_name (TREE_CODE (t)));
1305 gcc_checking_assert (!streamer_handle_as_builtin_p (t));
1307 /* Write the header, containing everything needed to
1308 materialize EXPR on the reading side. */
1309 streamer_write_tree_header (ob, t);
1312 /* Write the bitpacks and tree references. */
1313 for (unsigned i = 0; i < size; ++i)
1315 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
1317 /* Mark the end of the tree. */
1318 streamer_write_zero (ob);
1322 /* Finally truncate the vector. */
1323 sccstack.truncate (first);
1325 if (from_state)
1326 from_state->low = MIN (from_state->low, cstate->low);
1327 return;
1330 if (from_state)
1331 from_state->low = MIN (from_state->low, cstate->low);
1333 gcc_checking_assert (from_state);
1334 if (cstate->dfsnum < from_state->dfsnum)
1335 from_state->low = MIN (cstate->dfsnum, from_state->low);
1339 /* Emit the physical representation of tree node EXPR to output block
1340 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
1341 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1343 void
1344 lto_output_tree (struct output_block *ob, tree expr,
1345 bool ref_p, bool this_ref_p)
1347 unsigned ix;
1348 bool existed_p;
1350 if (expr == NULL_TREE)
1352 streamer_write_record_start (ob, LTO_null);
1353 return;
1356 if (this_ref_p && tree_is_indexable (expr))
1358 lto_output_tree_ref (ob, expr);
1359 return;
1362 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1363 if (existed_p)
1365 /* If a node has already been streamed out, make sure that
1366 we don't write it more than once. Otherwise, the reader
1367 will instantiate two different nodes for the same object. */
1368 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1369 streamer_write_uhwi (ob, ix);
1370 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1371 lto_tree_code_to_tag (TREE_CODE (expr)));
1372 lto_stats.num_pickle_refs_output++;
1374 else
1376 /* This is the first time we see EXPR, write all reachable
1377 trees to OB. */
1378 static bool in_dfs_walk;
1380 /* Protect against recursion which means disconnect between
1381 what tree edges we walk in the DFS walk and what edges
1382 we stream out. */
1383 gcc_assert (!in_dfs_walk);
1385 /* Start the DFS walk. */
1386 /* Save ob state ... */
1387 /* let's see ... */
1388 in_dfs_walk = true;
1389 sccstate = pointer_map_create ();
1390 gcc_obstack_init (&sccstate_obstack);
1391 next_dfs_num = 1;
1392 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p);
1393 sccstack.release ();
1394 pointer_map_destroy (sccstate);
1395 obstack_free (&sccstate_obstack, NULL);
1396 in_dfs_walk = false;
1398 /* Finally append a reference to the tree we were writing.
1399 ??? If expr ended up as a singleton we could have
1400 inlined it here and avoid outputting a reference. */
1401 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1402 gcc_assert (existed_p);
1403 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1404 streamer_write_uhwi (ob, ix);
1405 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1406 lto_tree_code_to_tag (TREE_CODE (expr)));
1407 lto_stats.num_pickle_refs_output++;
1412 /* Output to OB a list of try/catch handlers starting with FIRST. */
1414 static void
1415 output_eh_try_list (struct output_block *ob, eh_catch first)
1417 eh_catch n;
1419 for (n = first; n; n = n->next_catch)
1421 streamer_write_record_start (ob, LTO_eh_catch);
1422 stream_write_tree (ob, n->type_list, true);
1423 stream_write_tree (ob, n->filter_list, true);
1424 stream_write_tree (ob, n->label, true);
1427 streamer_write_record_start (ob, LTO_null);
1431 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1432 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1433 detect EH region sharing. */
1435 static void
1436 output_eh_region (struct output_block *ob, eh_region r)
1438 enum LTO_tags tag;
1440 if (r == NULL)
1442 streamer_write_record_start (ob, LTO_null);
1443 return;
1446 if (r->type == ERT_CLEANUP)
1447 tag = LTO_ert_cleanup;
1448 else if (r->type == ERT_TRY)
1449 tag = LTO_ert_try;
1450 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1451 tag = LTO_ert_allowed_exceptions;
1452 else if (r->type == ERT_MUST_NOT_THROW)
1453 tag = LTO_ert_must_not_throw;
1454 else
1455 gcc_unreachable ();
1457 streamer_write_record_start (ob, tag);
1458 streamer_write_hwi (ob, r->index);
1460 if (r->outer)
1461 streamer_write_hwi (ob, r->outer->index);
1462 else
1463 streamer_write_zero (ob);
1465 if (r->inner)
1466 streamer_write_hwi (ob, r->inner->index);
1467 else
1468 streamer_write_zero (ob);
1470 if (r->next_peer)
1471 streamer_write_hwi (ob, r->next_peer->index);
1472 else
1473 streamer_write_zero (ob);
1475 if (r->type == ERT_TRY)
1477 output_eh_try_list (ob, r->u.eh_try.first_catch);
1479 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1481 stream_write_tree (ob, r->u.allowed.type_list, true);
1482 stream_write_tree (ob, r->u.allowed.label, true);
1483 streamer_write_uhwi (ob, r->u.allowed.filter);
1485 else if (r->type == ERT_MUST_NOT_THROW)
1487 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1488 bitpack_d bp = bitpack_create (ob->main_stream);
1489 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1490 streamer_write_bitpack (&bp);
1493 if (r->landing_pads)
1494 streamer_write_hwi (ob, r->landing_pads->index);
1495 else
1496 streamer_write_zero (ob);
1500 /* Output landing pad LP to OB. */
1502 static void
1503 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1505 if (lp == NULL)
1507 streamer_write_record_start (ob, LTO_null);
1508 return;
1511 streamer_write_record_start (ob, LTO_eh_landing_pad);
1512 streamer_write_hwi (ob, lp->index);
1513 if (lp->next_lp)
1514 streamer_write_hwi (ob, lp->next_lp->index);
1515 else
1516 streamer_write_zero (ob);
1518 if (lp->region)
1519 streamer_write_hwi (ob, lp->region->index);
1520 else
1521 streamer_write_zero (ob);
1523 stream_write_tree (ob, lp->post_landing_pad, true);
1527 /* Output the existing eh_table to OB. */
1529 static void
1530 output_eh_regions (struct output_block *ob, struct function *fn)
1532 if (fn->eh && fn->eh->region_tree)
1534 unsigned i;
1535 eh_region eh;
1536 eh_landing_pad lp;
1537 tree ttype;
1539 streamer_write_record_start (ob, LTO_eh_table);
1541 /* Emit the index of the root of the EH region tree. */
1542 streamer_write_hwi (ob, fn->eh->region_tree->index);
1544 /* Emit all the EH regions in the region array. */
1545 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
1546 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
1547 output_eh_region (ob, eh);
1549 /* Emit all landing pads. */
1550 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
1551 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
1552 output_eh_lp (ob, lp);
1554 /* Emit all the runtime type data. */
1555 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
1556 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
1557 stream_write_tree (ob, ttype, true);
1559 /* Emit the table of action chains. */
1560 if (targetm.arm_eabi_unwinder)
1562 tree t;
1563 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
1564 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
1565 stream_write_tree (ob, t, true);
1567 else
1569 uchar c;
1570 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
1571 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
1572 streamer_write_char_stream (ob->main_stream, c);
1576 /* The LTO_null either terminates the record or indicates that there
1577 are no eh_records at all. */
1578 streamer_write_record_start (ob, LTO_null);
1582 /* Output all of the active ssa names to the ssa_names stream. */
1584 static void
1585 output_ssa_names (struct output_block *ob, struct function *fn)
1587 unsigned int i, len;
1589 len = vec_safe_length (SSANAMES (fn));
1590 streamer_write_uhwi (ob, len);
1592 for (i = 1; i < len; i++)
1594 tree ptr = (*SSANAMES (fn))[i];
1596 if (ptr == NULL_TREE
1597 || SSA_NAME_IN_FREE_LIST (ptr)
1598 || virtual_operand_p (ptr))
1599 continue;
1601 streamer_write_uhwi (ob, i);
1602 streamer_write_char_stream (ob->main_stream,
1603 SSA_NAME_IS_DEFAULT_DEF (ptr));
1604 if (SSA_NAME_VAR (ptr))
1605 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
1606 else
1607 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1608 stream_write_tree (ob, TREE_TYPE (ptr), true);
1611 streamer_write_zero (ob);
1615 /* Output the cfg. */
1617 static void
1618 output_cfg (struct output_block *ob, struct function *fn)
1620 struct lto_output_stream *tmp_stream = ob->main_stream;
1621 basic_block bb;
1623 ob->main_stream = ob->cfg_stream;
1625 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1626 profile_status_for_fn (fn));
1628 /* Output the number of the highest basic block. */
1629 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
1631 FOR_ALL_BB_FN (bb, fn)
1633 edge_iterator ei;
1634 edge e;
1636 streamer_write_hwi (ob, bb->index);
1638 /* Output the successors and the edge flags. */
1639 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
1640 FOR_EACH_EDGE (e, ei, bb->succs)
1642 streamer_write_uhwi (ob, e->dest->index);
1643 streamer_write_hwi (ob, e->probability);
1644 streamer_write_gcov_count (ob, e->count);
1645 streamer_write_uhwi (ob, e->flags);
1649 streamer_write_hwi (ob, -1);
1651 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1652 while (bb->next_bb)
1654 streamer_write_hwi (ob, bb->next_bb->index);
1655 bb = bb->next_bb;
1658 streamer_write_hwi (ob, -1);
1660 /* ??? The cfgloop interface is tied to cfun. */
1661 gcc_assert (cfun == fn);
1663 /* Output the number of loops. */
1664 streamer_write_uhwi (ob, number_of_loops (fn));
1666 /* Output each loop, skipping the tree root which has number zero. */
1667 for (unsigned i = 1; i < number_of_loops (fn); ++i)
1669 struct loop *loop = get_loop (fn, i);
1671 /* Write the index of the loop header. That's enough to rebuild
1672 the loop tree on the reader side. Stream -1 for an unused
1673 loop entry. */
1674 if (!loop)
1676 streamer_write_hwi (ob, -1);
1677 continue;
1679 else
1680 streamer_write_hwi (ob, loop->header->index);
1682 /* Write everything copy_loop_info copies. */
1683 streamer_write_enum (ob->main_stream,
1684 loop_estimation, EST_LAST, loop->estimate_state);
1685 streamer_write_hwi (ob, loop->any_upper_bound);
1686 if (loop->any_upper_bound)
1688 streamer_write_uhwi (ob, loop->nb_iterations_upper_bound.low);
1689 streamer_write_hwi (ob, loop->nb_iterations_upper_bound.high);
1691 streamer_write_hwi (ob, loop->any_estimate);
1692 if (loop->any_estimate)
1694 streamer_write_uhwi (ob, loop->nb_iterations_estimate.low);
1695 streamer_write_hwi (ob, loop->nb_iterations_estimate.high);
1698 /* Write OMP SIMD related info. */
1699 streamer_write_hwi (ob, loop->safelen);
1700 streamer_write_hwi (ob, loop->force_vect);
1701 stream_write_tree (ob, loop->simduid, true);
1704 ob->main_stream = tmp_stream;
1708 /* Create the header in the file using OB. If the section type is for
1709 a function, set FN to the decl for that function. */
1711 void
1712 produce_asm (struct output_block *ob, tree fn)
1714 enum lto_section_type section_type = ob->section_type;
1715 struct lto_function_header header;
1716 char *section_name;
1717 struct lto_output_stream *header_stream;
1719 if (section_type == LTO_section_function_body)
1721 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1722 section_name = lto_get_section_name (section_type, name, NULL);
1724 else
1725 section_name = lto_get_section_name (section_type, NULL, NULL);
1727 lto_begin_section (section_name, !flag_wpa);
1728 free (section_name);
1730 /* The entire header is stream computed here. */
1731 memset (&header, 0, sizeof (struct lto_function_header));
1733 /* Write the header. */
1734 header.lto_header.major_version = LTO_major_version;
1735 header.lto_header.minor_version = LTO_minor_version;
1737 header.compressed_size = 0;
1739 if (section_type == LTO_section_function_body)
1740 header.cfg_size = ob->cfg_stream->total_size;
1741 header.main_size = ob->main_stream->total_size;
1742 header.string_size = ob->string_stream->total_size;
1744 header_stream = XCNEW (struct lto_output_stream);
1745 lto_output_data_stream (header_stream, &header, sizeof header);
1746 lto_write_stream (header_stream);
1747 free (header_stream);
1749 /* Put all of the gimple and the string table out the asm file as a
1750 block of text. */
1751 if (section_type == LTO_section_function_body)
1752 lto_write_stream (ob->cfg_stream);
1753 lto_write_stream (ob->main_stream);
1754 lto_write_stream (ob->string_stream);
1756 lto_end_section ();
1760 /* Output the base body of struct function FN using output block OB. */
1762 static void
1763 output_struct_function_base (struct output_block *ob, struct function *fn)
1765 struct bitpack_d bp;
1766 unsigned i;
1767 tree t;
1769 /* Output the static chain and non-local goto save area. */
1770 stream_write_tree (ob, fn->static_chain_decl, true);
1771 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
1773 /* Output all the local variables in the function. */
1774 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
1775 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
1776 stream_write_tree (ob, t, true);
1778 /* Output current IL state of the function. */
1779 streamer_write_uhwi (ob, fn->curr_properties);
1781 /* Write all the attributes for FN. */
1782 bp = bitpack_create (ob->main_stream);
1783 bp_pack_value (&bp, fn->is_thunk, 1);
1784 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
1785 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
1786 bp_pack_value (&bp, fn->returns_struct, 1);
1787 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
1788 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
1789 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
1790 bp_pack_value (&bp, fn->after_inlining, 1);
1791 bp_pack_value (&bp, fn->stdarg, 1);
1792 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
1793 bp_pack_value (&bp, fn->calls_alloca, 1);
1794 bp_pack_value (&bp, fn->calls_setjmp, 1);
1795 bp_pack_value (&bp, fn->has_force_vect_loops, 1);
1796 bp_pack_value (&bp, fn->has_simduid_loops, 1);
1797 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
1798 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
1800 /* Output the function start and end loci. */
1801 stream_output_location (ob, &bp, fn->function_start_locus);
1802 stream_output_location (ob, &bp, fn->function_end_locus);
1804 streamer_write_bitpack (&bp);
1808 /* Output the body of function NODE->DECL. */
1810 static void
1811 output_function (struct cgraph_node *node)
1813 tree function;
1814 struct function *fn;
1815 basic_block bb;
1816 struct output_block *ob;
1818 function = node->decl;
1819 fn = DECL_STRUCT_FUNCTION (function);
1820 ob = create_output_block (LTO_section_function_body);
1822 clear_line_info (ob);
1823 ob->cgraph_node = node;
1825 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
1827 /* Set current_function_decl and cfun. */
1828 push_cfun (fn);
1830 /* Make string 0 be a NULL string. */
1831 streamer_write_char_stream (ob->string_stream, 0);
1833 streamer_write_record_start (ob, LTO_function);
1835 /* Output decls for parameters and args. */
1836 stream_write_tree (ob, DECL_RESULT (function), true);
1837 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
1839 /* Output DECL_INITIAL for the function, which contains the tree of
1840 lexical scopes. */
1841 stream_write_tree (ob, DECL_INITIAL (function), true);
1843 /* We also stream abstract functions where we stream only stuff needed for
1844 debug info. */
1845 if (gimple_has_body_p (function))
1847 streamer_write_uhwi (ob, 1);
1848 output_struct_function_base (ob, fn);
1850 /* Output all the SSA names used in the function. */
1851 output_ssa_names (ob, fn);
1853 /* Output any exception handling regions. */
1854 output_eh_regions (ob, fn);
1857 /* We will renumber the statements. The code that does this uses
1858 the same ordering that we use for serializing them so we can use
1859 the same code on the other end and not have to write out the
1860 statement numbers. We do not assign UIDs to PHIs here because
1861 virtual PHIs get re-computed on-the-fly which would make numbers
1862 inconsistent. */
1863 set_gimple_stmt_max_uid (cfun, 0);
1864 FOR_ALL_BB_FN (bb, cfun)
1866 gimple_stmt_iterator gsi;
1867 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1869 gimple stmt = gsi_stmt (gsi);
1871 /* Virtual PHIs are not going to be streamed. */
1872 if (!virtual_operand_p (gimple_phi_result (stmt)))
1873 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1875 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1877 gimple stmt = gsi_stmt (gsi);
1878 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1881 /* To avoid keeping duplicate gimple IDs in the statements, renumber
1882 virtual phis now. */
1883 FOR_ALL_BB_FN (bb, cfun)
1885 gimple_stmt_iterator gsi;
1886 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1888 gimple stmt = gsi_stmt (gsi);
1889 if (virtual_operand_p (gimple_phi_result (stmt)))
1890 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1894 /* Output the code for the function. */
1895 FOR_ALL_BB_FN (bb, fn)
1896 output_bb (ob, bb, fn);
1898 /* The terminator for this function. */
1899 streamer_write_record_start (ob, LTO_null);
1901 output_cfg (ob, fn);
1903 pop_cfun ();
1905 else
1906 streamer_write_uhwi (ob, 0);
1908 /* Create a section to hold the pickled output of this function. */
1909 produce_asm (ob, function);
1911 destroy_output_block (ob);
1915 /* Emit toplevel asms. */
1917 void
1918 lto_output_toplevel_asms (void)
1920 struct output_block *ob;
1921 struct asm_node *can;
1922 char *section_name;
1923 struct lto_output_stream *header_stream;
1924 struct lto_asm_header header;
1926 if (! asm_nodes)
1927 return;
1929 ob = create_output_block (LTO_section_asm);
1931 /* Make string 0 be a NULL string. */
1932 streamer_write_char_stream (ob->string_stream, 0);
1934 for (can = asm_nodes; can; can = can->next)
1936 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
1937 streamer_write_hwi (ob, can->order);
1940 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
1942 section_name = lto_get_section_name (LTO_section_asm, NULL, NULL);
1943 lto_begin_section (section_name, !flag_wpa);
1944 free (section_name);
1946 /* The entire header stream is computed here. */
1947 memset (&header, 0, sizeof (header));
1949 /* Write the header. */
1950 header.lto_header.major_version = LTO_major_version;
1951 header.lto_header.minor_version = LTO_minor_version;
1953 header.main_size = ob->main_stream->total_size;
1954 header.string_size = ob->string_stream->total_size;
1956 header_stream = XCNEW (struct lto_output_stream);
1957 lto_output_data_stream (header_stream, &header, sizeof (header));
1958 lto_write_stream (header_stream);
1959 free (header_stream);
1961 /* Put all of the gimple and the string table out the asm file as a
1962 block of text. */
1963 lto_write_stream (ob->main_stream);
1964 lto_write_stream (ob->string_stream);
1966 lto_end_section ();
1968 destroy_output_block (ob);
1972 /* Copy the function body of NODE without deserializing. */
1974 static void
1975 copy_function (struct cgraph_node *node)
1977 tree function = node->decl;
1978 struct lto_file_decl_data *file_data = node->lto_file_data;
1979 struct lto_output_stream *output_stream = XCNEW (struct lto_output_stream);
1980 const char *data;
1981 size_t len;
1982 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
1983 char *section_name =
1984 lto_get_section_name (LTO_section_function_body, name, NULL);
1985 size_t i, j;
1986 struct lto_in_decl_state *in_state;
1987 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
1989 lto_begin_section (section_name, !flag_wpa);
1990 free (section_name);
1992 /* We may have renamed the declaration, e.g., a static function. */
1993 name = lto_get_decl_name_mapping (file_data, name);
1995 data = lto_get_section_data (file_data, LTO_section_function_body,
1996 name, &len);
1997 gcc_assert (data);
1999 /* Do a bit copy of the function body. */
2000 lto_output_data_stream (output_stream, data, len);
2001 lto_write_stream (output_stream);
2003 /* Copy decls. */
2004 in_state =
2005 lto_get_function_in_decl_state (node->lto_file_data, function);
2006 gcc_assert (in_state);
2008 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2010 size_t n = in_state->streams[i].size;
2011 tree *trees = in_state->streams[i].trees;
2012 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2014 /* The out state must have the same indices and the in state.
2015 So just copy the vector. All the encoders in the in state
2016 must be empty where we reach here. */
2017 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2018 encoder->trees.reserve_exact (n);
2019 for (j = 0; j < n; j++)
2020 encoder->trees.safe_push (trees[j]);
2023 lto_free_section_data (file_data, LTO_section_function_body, name,
2024 data, len);
2025 free (output_stream);
2026 lto_end_section ();
2029 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2031 static tree
2032 wrap_refs (tree *tp, int *ws, void *)
2034 tree t = *tp;
2035 if (handled_component_p (t)
2036 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL)
2038 tree decl = TREE_OPERAND (t, 0);
2039 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2040 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2041 build1 (ADDR_EXPR, ptrtype, decl),
2042 build_int_cst (ptrtype, 0));
2043 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2044 *ws = 0;
2046 else if (TREE_CODE (t) == CONSTRUCTOR)
2048 else if (!EXPR_P (t))
2049 *ws = 0;
2050 return NULL_TREE;
2053 /* Main entry point from the pass manager. */
2055 void
2056 lto_output (void)
2058 struct lto_out_decl_state *decl_state;
2059 #ifdef ENABLE_CHECKING
2060 bitmap output = lto_bitmap_alloc ();
2061 #endif
2062 int i, n_nodes;
2063 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
2065 /* Initialize the streamer. */
2066 lto_streamer_init ();
2068 n_nodes = lto_symtab_encoder_size (encoder);
2069 /* Process only the functions with bodies. */
2070 for (i = 0; i < n_nodes; i++)
2072 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
2073 if (cgraph_node *node = dyn_cast <cgraph_node> (snode))
2075 if (lto_symtab_encoder_encode_body_p (encoder, node)
2076 && !node->alias)
2078 #ifdef ENABLE_CHECKING
2079 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2080 bitmap_set_bit (output, DECL_UID (node->decl));
2081 #endif
2082 decl_state = lto_new_out_decl_state ();
2083 lto_push_out_decl_state (decl_state);
2084 if (gimple_has_body_p (node->decl) || !flag_wpa
2085 /* Thunks have no body but they may be synthetized
2086 at WPA time. */
2087 || DECL_ARGUMENTS (node->decl))
2088 output_function (node);
2089 else
2090 copy_function (node);
2091 gcc_assert (lto_get_out_decl_state () == decl_state);
2092 lto_pop_out_decl_state ();
2093 lto_record_function_out_decl_state (node->decl, decl_state);
2096 else if (varpool_node *node = dyn_cast <varpool_node> (snode))
2098 /* Wrap symbol references inside the ctor in a type
2099 preserving MEM_REF. */
2100 tree ctor = DECL_INITIAL (node->decl);
2101 if (ctor && !in_lto_p)
2102 walk_tree (&ctor, wrap_refs, NULL, NULL);
2106 /* Emit the callgraph after emitting function bodies. This needs to
2107 be done now to make sure that all the statements in every function
2108 have been renumbered so that edges can be associated with call
2109 statements using the statement UIDs. */
2110 output_symtab ();
2112 #ifdef ENABLE_CHECKING
2113 lto_bitmap_free (output);
2114 #endif
2117 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2118 from it and required for correct representation of its semantics.
2119 Each node in ENCODER must be a global declaration or a type. A node
2120 is written only once, even if it appears multiple times in the
2121 vector. Certain transitively-reachable nodes, such as those
2122 representing expressions, may be duplicated, but such nodes
2123 must not appear in ENCODER itself. */
2125 static void
2126 write_global_stream (struct output_block *ob,
2127 struct lto_tree_ref_encoder *encoder)
2129 tree t;
2130 size_t index;
2131 const size_t size = lto_tree_ref_encoder_size (encoder);
2133 for (index = 0; index < size; index++)
2135 t = lto_tree_ref_encoder_get_tree (encoder, index);
2136 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2137 stream_write_tree (ob, t, false);
2142 /* Write a sequence of indices into the globals vector corresponding
2143 to the trees in ENCODER. These are used by the reader to map the
2144 indices used to refer to global entities within function bodies to
2145 their referents. */
2147 static void
2148 write_global_references (struct output_block *ob,
2149 struct lto_output_stream *ref_stream,
2150 struct lto_tree_ref_encoder *encoder)
2152 tree t;
2153 uint32_t index;
2154 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2156 /* Write size as 32-bit unsigned. */
2157 lto_output_data_stream (ref_stream, &size, sizeof (int32_t));
2159 for (index = 0; index < size; index++)
2161 uint32_t slot_num;
2163 t = lto_tree_ref_encoder_get_tree (encoder, index);
2164 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2165 gcc_assert (slot_num != (unsigned)-1);
2166 lto_output_data_stream (ref_stream, &slot_num, sizeof slot_num);
2171 /* Write all the streams in an lto_out_decl_state STATE using
2172 output block OB and output stream OUT_STREAM. */
2174 void
2175 lto_output_decl_state_streams (struct output_block *ob,
2176 struct lto_out_decl_state *state)
2178 int i;
2180 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2181 write_global_stream (ob, &state->streams[i]);
2185 /* Write all the references in an lto_out_decl_state STATE using
2186 output block OB and output stream OUT_STREAM. */
2188 void
2189 lto_output_decl_state_refs (struct output_block *ob,
2190 struct lto_output_stream *out_stream,
2191 struct lto_out_decl_state *state)
2193 unsigned i;
2194 uint32_t ref;
2195 tree decl;
2197 /* Write reference to FUNCTION_DECL. If there is not function,
2198 write reference to void_type_node. */
2199 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2200 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2201 gcc_assert (ref != (unsigned)-1);
2202 lto_output_data_stream (out_stream, &ref, sizeof (uint32_t));
2204 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2205 write_global_references (ob, out_stream, &state->streams[i]);
2209 /* Return the written size of STATE. */
2211 static size_t
2212 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2214 int i;
2215 size_t size;
2217 size = sizeof (int32_t); /* fn_ref. */
2218 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2220 size += sizeof (int32_t); /* vector size. */
2221 size += (lto_tree_ref_encoder_size (&state->streams[i])
2222 * sizeof (int32_t));
2224 return size;
2228 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2229 so far. */
2231 static void
2232 write_symbol (struct streamer_tree_cache_d *cache,
2233 struct lto_output_stream *stream,
2234 tree t, struct pointer_set_t *seen, bool alias)
2236 const char *name;
2237 enum gcc_plugin_symbol_kind kind;
2238 enum gcc_plugin_symbol_visibility visibility;
2239 unsigned slot_num;
2240 unsigned HOST_WIDEST_INT size;
2241 const char *comdat;
2242 unsigned char c;
2244 /* None of the following kinds of symbols are needed in the
2245 symbol table. */
2246 if (!TREE_PUBLIC (t)
2247 || is_builtin_fn (t)
2248 || DECL_ABSTRACT (t)
2249 || (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)))
2250 return;
2251 gcc_assert (TREE_CODE (t) != RESULT_DECL);
2253 gcc_assert (TREE_CODE (t) == VAR_DECL
2254 || TREE_CODE (t) == FUNCTION_DECL);
2256 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2258 /* This behaves like assemble_name_raw in varasm.c, performing the
2259 same name manipulations that ASM_OUTPUT_LABELREF does. */
2260 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2262 if (pointer_set_contains (seen, name))
2263 return;
2264 pointer_set_insert (seen, name);
2266 streamer_tree_cache_lookup (cache, t, &slot_num);
2267 gcc_assert (slot_num != (unsigned)-1);
2269 if (DECL_EXTERNAL (t))
2271 if (DECL_WEAK (t))
2272 kind = GCCPK_WEAKUNDEF;
2273 else
2274 kind = GCCPK_UNDEF;
2276 else
2278 if (DECL_WEAK (t))
2279 kind = GCCPK_WEAKDEF;
2280 else if (DECL_COMMON (t))
2281 kind = GCCPK_COMMON;
2282 else
2283 kind = GCCPK_DEF;
2285 /* When something is defined, it should have node attached. */
2286 gcc_assert (alias || TREE_CODE (t) != VAR_DECL
2287 || varpool_get_node (t)->definition);
2288 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2289 || (cgraph_get_node (t)
2290 && cgraph_get_node (t)->definition));
2293 /* Imitate what default_elf_asm_output_external do.
2294 When symbol is external, we need to output it with DEFAULT visibility
2295 when compiling with -fvisibility=default, while with HIDDEN visibility
2296 when symbol has attribute (visibility("hidden")) specified.
2297 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2298 right. */
2300 if (DECL_EXTERNAL (t)
2301 && !targetm.binds_local_p (t))
2302 visibility = GCCPV_DEFAULT;
2303 else
2304 switch (DECL_VISIBILITY (t))
2306 case VISIBILITY_DEFAULT:
2307 visibility = GCCPV_DEFAULT;
2308 break;
2309 case VISIBILITY_PROTECTED:
2310 visibility = GCCPV_PROTECTED;
2311 break;
2312 case VISIBILITY_HIDDEN:
2313 visibility = GCCPV_HIDDEN;
2314 break;
2315 case VISIBILITY_INTERNAL:
2316 visibility = GCCPV_INTERNAL;
2317 break;
2320 if (kind == GCCPK_COMMON
2321 && DECL_SIZE_UNIT (t)
2322 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
2323 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2324 else
2325 size = 0;
2327 if (DECL_ONE_ONLY (t))
2328 comdat = IDENTIFIER_POINTER (DECL_COMDAT_GROUP (t));
2329 else
2330 comdat = "";
2332 lto_output_data_stream (stream, name, strlen (name) + 1);
2333 lto_output_data_stream (stream, comdat, strlen (comdat) + 1);
2334 c = (unsigned char) kind;
2335 lto_output_data_stream (stream, &c, 1);
2336 c = (unsigned char) visibility;
2337 lto_output_data_stream (stream, &c, 1);
2338 lto_output_data_stream (stream, &size, 8);
2339 lto_output_data_stream (stream, &slot_num, 4);
2342 /* Return true if NODE should appear in the plugin symbol table. */
2344 bool
2345 output_symbol_p (symtab_node *node)
2347 struct cgraph_node *cnode;
2348 if (!symtab_real_symbol_p (node))
2349 return false;
2350 /* We keep external functions in symtab for sake of inlining
2351 and devirtualization. We do not want to see them in symbol table as
2352 references unless they are really used. */
2353 cnode = dyn_cast <cgraph_node> (node);
2354 if (cnode && (!node->definition || DECL_EXTERNAL (cnode->decl))
2355 && cnode->callers)
2356 return true;
2358 /* Ignore all references from external vars initializers - they are not really
2359 part of the compilation unit until they are used by folding. Some symbols,
2360 like references to external construction vtables can not be referred to at all.
2361 We decide this at can_refer_decl_in_current_unit_p. */
2362 if (!node->definition || DECL_EXTERNAL (node->decl))
2364 int i;
2365 struct ipa_ref *ref;
2366 for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list,
2367 i, ref); i++)
2369 if (ref->use == IPA_REF_ALIAS)
2370 continue;
2371 if (is_a <cgraph_node> (ref->referring))
2372 return true;
2373 if (!DECL_EXTERNAL (ref->referring->decl))
2374 return true;
2376 return false;
2378 return true;
2382 /* Write an IL symbol table to OB.
2383 SET and VSET are cgraph/varpool node sets we are outputting. */
2385 static void
2386 produce_symtab (struct output_block *ob)
2388 struct streamer_tree_cache_d *cache = ob->writer_cache;
2389 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
2390 struct pointer_set_t *seen;
2391 struct lto_output_stream stream;
2392 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2393 lto_symtab_encoder_iterator lsei;
2395 lto_begin_section (section_name, false);
2396 free (section_name);
2398 seen = pointer_set_create ();
2399 memset (&stream, 0, sizeof (stream));
2401 /* Write the symbol table.
2402 First write everything defined and then all declarations.
2403 This is necessary to handle cases where we have duplicated symbols. */
2404 for (lsei = lsei_start (encoder);
2405 !lsei_end_p (lsei); lsei_next (&lsei))
2407 symtab_node *node = lsei_node (lsei);
2409 if (!output_symbol_p (node) || DECL_EXTERNAL (node->decl))
2410 continue;
2411 write_symbol (cache, &stream, node->decl, seen, false);
2413 for (lsei = lsei_start (encoder);
2414 !lsei_end_p (lsei); lsei_next (&lsei))
2416 symtab_node *node = lsei_node (lsei);
2418 if (!output_symbol_p (node) || !DECL_EXTERNAL (node->decl))
2419 continue;
2420 write_symbol (cache, &stream, node->decl, seen, false);
2423 lto_write_stream (&stream);
2424 pointer_set_destroy (seen);
2426 lto_end_section ();
2430 /* This pass is run after all of the functions are serialized and all
2431 of the IPA passes have written their serialized forms. This pass
2432 causes the vector of all of the global decls and types used from
2433 this file to be written in to a section that can then be read in to
2434 recover these on other side. */
2436 void
2437 produce_asm_for_decls (void)
2439 struct lto_out_decl_state *out_state;
2440 struct lto_out_decl_state *fn_out_state;
2441 struct lto_decl_header header;
2442 char *section_name;
2443 struct output_block *ob;
2444 struct lto_output_stream *header_stream, *decl_state_stream;
2445 unsigned idx, num_fns;
2446 size_t decl_state_size;
2447 int32_t num_decl_states;
2449 ob = create_output_block (LTO_section_decls);
2450 ob->global = true;
2452 memset (&header, 0, sizeof (struct lto_decl_header));
2454 section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
2455 lto_begin_section (section_name, !flag_wpa);
2456 free (section_name);
2458 /* Make string 0 be a NULL string. */
2459 streamer_write_char_stream (ob->string_stream, 0);
2461 gcc_assert (!alias_pairs);
2463 /* Get rid of the global decl state hash tables to save some memory. */
2464 out_state = lto_get_out_decl_state ();
2465 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
2466 if (out_state->streams[i].tree_hash_table)
2468 delete out_state->streams[i].tree_hash_table;
2469 out_state->streams[i].tree_hash_table = NULL;
2472 /* Write the global symbols. */
2473 lto_output_decl_state_streams (ob, out_state);
2474 num_fns = lto_function_decl_states.length ();
2475 for (idx = 0; idx < num_fns; idx++)
2477 fn_out_state =
2478 lto_function_decl_states[idx];
2479 lto_output_decl_state_streams (ob, fn_out_state);
2482 header.lto_header.major_version = LTO_major_version;
2483 header.lto_header.minor_version = LTO_minor_version;
2485 /* Currently not used. This field would allow us to preallocate
2486 the globals vector, so that it need not be resized as it is extended. */
2487 header.num_nodes = -1;
2489 /* Compute the total size of all decl out states. */
2490 decl_state_size = sizeof (int32_t);
2491 decl_state_size += lto_out_decl_state_written_size (out_state);
2492 for (idx = 0; idx < num_fns; idx++)
2494 fn_out_state =
2495 lto_function_decl_states[idx];
2496 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2498 header.decl_state_size = decl_state_size;
2500 header.main_size = ob->main_stream->total_size;
2501 header.string_size = ob->string_stream->total_size;
2503 header_stream = XCNEW (struct lto_output_stream);
2504 lto_output_data_stream (header_stream, &header, sizeof header);
2505 lto_write_stream (header_stream);
2506 free (header_stream);
2508 /* Write the main out-decl state, followed by out-decl states of
2509 functions. */
2510 decl_state_stream = XCNEW (struct lto_output_stream);
2511 num_decl_states = num_fns + 1;
2512 lto_output_data_stream (decl_state_stream, &num_decl_states,
2513 sizeof (num_decl_states));
2514 lto_output_decl_state_refs (ob, decl_state_stream, out_state);
2515 for (idx = 0; idx < num_fns; idx++)
2517 fn_out_state =
2518 lto_function_decl_states[idx];
2519 lto_output_decl_state_refs (ob, decl_state_stream, fn_out_state);
2521 lto_write_stream (decl_state_stream);
2522 free (decl_state_stream);
2524 lto_write_stream (ob->main_stream);
2525 lto_write_stream (ob->string_stream);
2527 lto_end_section ();
2529 /* Write the symbol table. It is used by linker to determine dependencies
2530 and thus we can skip it for WPA. */
2531 if (!flag_wpa)
2532 produce_symtab (ob);
2534 /* Write command line opts. */
2535 lto_write_options ();
2537 /* Deallocate memory and clean up. */
2538 for (idx = 0; idx < num_fns; idx++)
2540 fn_out_state =
2541 lto_function_decl_states[idx];
2542 lto_delete_out_decl_state (fn_out_state);
2544 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
2545 lto_function_decl_states.release ();
2546 destroy_output_block (ob);