gcc/
[official-gcc.git] / gcc / lto-streamer-out.c
blobbd289090bae046f5816c1db769febd2abc4260bf
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 else if (((TREE_CODE (t) == VAR_DECL && !TREE_STATIC (t))
143 || TREE_CODE (t) == TYPE_DECL
144 || TREE_CODE (t) == CONST_DECL
145 || TREE_CODE (t) == NAMELIST_DECL)
146 && decl_function_context (t))
147 return false;
148 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
149 return false;
150 /* Variably modified types need to be streamed alongside function
151 bodies because they can refer to local entities. Together with
152 them we have to localize their members as well.
153 ??? In theory that includes non-FIELD_DECLs as well. */
154 else if (TYPE_P (t)
155 && variably_modified_type_p (t, NULL_TREE))
156 return false;
157 else if (TREE_CODE (t) == FIELD_DECL
158 && variably_modified_type_p (DECL_CONTEXT (t), NULL_TREE))
159 return false;
160 else
161 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
165 /* Output info about new location into bitpack BP.
166 After outputting bitpack, lto_output_location_data has
167 to be done to output actual data. */
169 void
170 lto_output_location (struct output_block *ob, struct bitpack_d *bp,
171 location_t loc)
173 expanded_location xloc;
175 loc = LOCATION_LOCUS (loc);
176 bp_pack_value (bp, loc == UNKNOWN_LOCATION, 1);
177 if (loc == UNKNOWN_LOCATION)
178 return;
180 xloc = expand_location (loc);
182 bp_pack_value (bp, ob->current_file != xloc.file, 1);
183 bp_pack_value (bp, ob->current_line != xloc.line, 1);
184 bp_pack_value (bp, ob->current_col != xloc.column, 1);
186 if (ob->current_file != xloc.file)
187 bp_pack_var_len_unsigned (bp,
188 streamer_string_index (ob, xloc.file,
189 strlen (xloc.file) + 1,
190 true));
191 ob->current_file = xloc.file;
193 if (ob->current_line != xloc.line)
194 bp_pack_var_len_unsigned (bp, xloc.line);
195 ob->current_line = xloc.line;
197 if (ob->current_col != xloc.column)
198 bp_pack_var_len_unsigned (bp, xloc.column);
199 ob->current_col = xloc.column;
203 /* If EXPR is an indexable tree node, output a reference to it to
204 output block OB. Otherwise, output the physical representation of
205 EXPR to OB. */
207 static void
208 lto_output_tree_ref (struct output_block *ob, tree expr)
210 enum tree_code code;
212 if (TYPE_P (expr))
214 output_type_ref (ob, expr);
215 return;
218 code = TREE_CODE (expr);
219 switch (code)
221 case SSA_NAME:
222 streamer_write_record_start (ob, LTO_ssa_name_ref);
223 streamer_write_uhwi (ob, SSA_NAME_VERSION (expr));
224 break;
226 case FIELD_DECL:
227 streamer_write_record_start (ob, LTO_field_decl_ref);
228 lto_output_field_decl_index (ob->decl_state, ob->main_stream, expr);
229 break;
231 case FUNCTION_DECL:
232 streamer_write_record_start (ob, LTO_function_decl_ref);
233 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, expr);
234 break;
236 case VAR_DECL:
237 case DEBUG_EXPR_DECL:
238 gcc_assert (decl_function_context (expr) == NULL || TREE_STATIC (expr));
239 case PARM_DECL:
240 streamer_write_record_start (ob, LTO_global_decl_ref);
241 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
242 break;
244 case CONST_DECL:
245 streamer_write_record_start (ob, LTO_const_decl_ref);
246 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
247 break;
249 case IMPORTED_DECL:
250 gcc_assert (decl_function_context (expr) == NULL);
251 streamer_write_record_start (ob, LTO_imported_decl_ref);
252 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
253 break;
255 case TYPE_DECL:
256 streamer_write_record_start (ob, LTO_type_decl_ref);
257 lto_output_type_decl_index (ob->decl_state, ob->main_stream, expr);
258 break;
260 case NAMELIST_DECL:
261 streamer_write_record_start (ob, LTO_namelist_decl_ref);
262 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
263 break;
265 case NAMESPACE_DECL:
266 streamer_write_record_start (ob, LTO_namespace_decl_ref);
267 lto_output_namespace_decl_index (ob->decl_state, ob->main_stream, expr);
268 break;
270 case LABEL_DECL:
271 streamer_write_record_start (ob, LTO_label_decl_ref);
272 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
273 break;
275 case RESULT_DECL:
276 streamer_write_record_start (ob, LTO_result_decl_ref);
277 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
278 break;
280 case TRANSLATION_UNIT_DECL:
281 streamer_write_record_start (ob, LTO_translation_unit_decl_ref);
282 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
283 break;
285 default:
286 /* No other node is indexable, so it should have been handled by
287 lto_output_tree. */
288 gcc_unreachable ();
293 /* Return true if EXPR is a tree node that can be written to disk. */
295 static inline bool
296 lto_is_streamable (tree expr)
298 enum tree_code code = TREE_CODE (expr);
300 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
301 name version in lto_output_tree_ref (see output_ssa_names). */
302 return !is_lang_specific (expr)
303 && code != SSA_NAME
304 && code != CALL_EXPR
305 && code != LANG_TYPE
306 && code != MODIFY_EXPR
307 && code != INIT_EXPR
308 && code != TARGET_EXPR
309 && code != BIND_EXPR
310 && code != WITH_CLEANUP_EXPR
311 && code != STATEMENT_LIST
312 && (code == CASE_LABEL_EXPR
313 || code == DECL_EXPR
314 || TREE_CODE_CLASS (code) != tcc_statement);
318 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
320 static tree
321 get_symbol_initial_value (struct output_block *ob, tree expr)
323 gcc_checking_assert (DECL_P (expr)
324 && TREE_CODE (expr) != FUNCTION_DECL
325 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL);
327 /* Handle DECL_INITIAL for symbols. */
328 tree initial = DECL_INITIAL (expr);
329 if (TREE_CODE (expr) == VAR_DECL
330 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
331 && !DECL_IN_CONSTANT_POOL (expr)
332 && initial)
334 lto_symtab_encoder_t encoder;
335 varpool_node *vnode;
337 encoder = ob->decl_state->symtab_node_encoder;
338 vnode = varpool_get_node (expr);
339 if (!vnode
340 || !lto_symtab_encoder_encode_initializer_p (encoder,
341 vnode))
342 initial = error_mark_node;
345 return initial;
349 /* Write a physical representation of tree node EXPR to output block
350 OB. If REF_P is true, the leaves of EXPR are emitted as references
351 via lto_output_tree_ref. IX is the index into the streamer cache
352 where EXPR is stored. */
354 static void
355 lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
357 /* Pack all the non-pointer fields in EXPR into a bitpack and write
358 the resulting bitpack. */
359 bitpack_d bp = bitpack_create (ob->main_stream);
360 streamer_pack_tree_bitfields (ob, &bp, expr);
361 streamer_write_bitpack (&bp);
363 /* Write all the pointer fields in EXPR. */
364 streamer_write_tree_body (ob, expr, ref_p);
366 /* Write any LTO-specific data to OB. */
367 if (DECL_P (expr)
368 && TREE_CODE (expr) != FUNCTION_DECL
369 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
371 /* Handle DECL_INITIAL for symbols. */
372 tree initial = get_symbol_initial_value (ob, expr);
373 stream_write_tree (ob, initial, ref_p);
377 /* Write a physical representation of tree node EXPR to output block
378 OB. If REF_P is true, the leaves of EXPR are emitted as references
379 via lto_output_tree_ref. IX is the index into the streamer cache
380 where EXPR is stored. */
382 static void
383 lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
385 if (!lto_is_streamable (expr))
386 internal_error ("tree code %qs is not supported in LTO streams",
387 get_tree_code_name (TREE_CODE (expr)));
389 /* Write the header, containing everything needed to materialize
390 EXPR on the reading side. */
391 streamer_write_tree_header (ob, expr);
393 lto_write_tree_1 (ob, expr, ref_p);
395 /* Mark the end of EXPR. */
396 streamer_write_zero (ob);
399 /* Emit the physical representation of tree node EXPR to output block
400 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
401 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
403 static void
404 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
405 bool ref_p, bool this_ref_p)
407 unsigned ix;
409 gcc_checking_assert (expr != NULL_TREE
410 && !(this_ref_p && tree_is_indexable (expr)));
412 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
413 expr, hash, &ix);
414 gcc_assert (!exists_p);
415 if (streamer_handle_as_builtin_p (expr))
417 /* MD and NORMAL builtins do not need to be written out
418 completely as they are always instantiated by the
419 compiler on startup. The only builtins that need to
420 be written out are BUILT_IN_FRONTEND. For all other
421 builtins, we simply write the class and code. */
422 streamer_write_builtin (ob, expr);
424 else if (TREE_CODE (expr) == INTEGER_CST
425 && !TREE_OVERFLOW (expr))
427 /* Shared INTEGER_CST nodes are special because they need their
428 original type to be materialized by the reader (to implement
429 TYPE_CACHED_VALUES). */
430 streamer_write_integer_cst (ob, expr, ref_p);
432 else
434 /* This is the first time we see EXPR, write its fields
435 to OB. */
436 lto_write_tree (ob, expr, ref_p);
440 struct sccs
442 unsigned int dfsnum;
443 unsigned int low;
446 struct scc_entry
448 tree t;
449 hashval_t hash;
452 static unsigned int next_dfs_num;
453 static vec<scc_entry> sccstack;
454 static struct pointer_map_t *sccstate;
455 static struct obstack sccstate_obstack;
457 static void
458 DFS_write_tree (struct output_block *ob, sccs *from_state,
459 tree expr, bool ref_p, bool this_ref_p);
461 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
462 DFS recurse for all tree edges originating from it. */
464 static void
465 DFS_write_tree_body (struct output_block *ob,
466 tree expr, sccs *expr_state, bool ref_p)
468 #define DFS_follow_tree_edge(DEST) \
469 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
471 enum tree_code code;
473 code = TREE_CODE (expr);
475 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
477 if (TREE_CODE (expr) != IDENTIFIER_NODE)
478 DFS_follow_tree_edge (TREE_TYPE (expr));
481 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
483 for (unsigned i = 0; i < VECTOR_CST_NELTS (expr); ++i)
484 DFS_follow_tree_edge (VECTOR_CST_ELT (expr, i));
487 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
489 DFS_follow_tree_edge (TREE_REALPART (expr));
490 DFS_follow_tree_edge (TREE_IMAGPART (expr));
493 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
495 /* Drop names that were created for anonymous entities. */
496 if (DECL_NAME (expr)
497 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
498 && ANON_AGGRNAME_P (DECL_NAME (expr)))
500 else
501 DFS_follow_tree_edge (DECL_NAME (expr));
502 DFS_follow_tree_edge (DECL_CONTEXT (expr));
505 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
507 DFS_follow_tree_edge (DECL_SIZE (expr));
508 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
510 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
511 special handling in LTO, it must be handled by streamer hooks. */
513 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
515 /* Do not follow DECL_ABSTRACT_ORIGIN. We cannot handle debug information
516 for early inlining so drop it on the floor instead of ICEing in
517 dwarf2out.c. */
519 if ((TREE_CODE (expr) == VAR_DECL
520 || TREE_CODE (expr) == PARM_DECL)
521 && DECL_HAS_VALUE_EXPR_P (expr))
522 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
523 if (TREE_CODE (expr) == VAR_DECL)
524 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
527 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
529 if (TREE_CODE (expr) == TYPE_DECL)
530 DFS_follow_tree_edge (DECL_ORIGINAL_TYPE (expr));
533 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
535 /* Make sure we don't inadvertently set the assembler name. */
536 if (DECL_ASSEMBLER_NAME_SET_P (expr))
537 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
540 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
542 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
543 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
544 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
545 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
546 DFS_follow_tree_edge (DECL_FCONTEXT (expr));
549 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
551 DFS_follow_tree_edge (DECL_VINDEX (expr));
552 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
553 /* Do not DECL_FUNCTION_SPECIFIC_TARGET. They will be regenerated. */
554 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
557 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
559 DFS_follow_tree_edge (TYPE_SIZE (expr));
560 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
561 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
562 DFS_follow_tree_edge (TYPE_NAME (expr));
563 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
564 reconstructed during fixup. */
565 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
566 during fixup. */
567 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
568 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
569 /* TYPE_CANONICAL is re-computed during type merging, so no need
570 to follow it here. */
571 DFS_follow_tree_edge (TYPE_STUB_DECL (expr));
574 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
576 if (TREE_CODE (expr) == ENUMERAL_TYPE)
577 DFS_follow_tree_edge (TYPE_VALUES (expr));
578 else if (TREE_CODE (expr) == ARRAY_TYPE)
579 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
580 else if (RECORD_OR_UNION_TYPE_P (expr))
581 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
582 DFS_follow_tree_edge (t);
583 else if (TREE_CODE (expr) == FUNCTION_TYPE
584 || TREE_CODE (expr) == METHOD_TYPE)
585 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
587 if (!POINTER_TYPE_P (expr))
588 DFS_follow_tree_edge (TYPE_MINVAL (expr));
589 DFS_follow_tree_edge (TYPE_MAXVAL (expr));
590 if (RECORD_OR_UNION_TYPE_P (expr))
591 DFS_follow_tree_edge (TYPE_BINFO (expr));
594 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
596 DFS_follow_tree_edge (TREE_PURPOSE (expr));
597 DFS_follow_tree_edge (TREE_VALUE (expr));
598 DFS_follow_tree_edge (TREE_CHAIN (expr));
601 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
603 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
604 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
607 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
609 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
610 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
611 DFS_follow_tree_edge (TREE_BLOCK (expr));
614 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
616 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
617 /* ??? FIXME. See also streamer_write_chain. */
618 if (!(VAR_OR_FUNCTION_DECL_P (t)
619 && DECL_EXTERNAL (t)))
620 DFS_follow_tree_edge (t);
622 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
624 /* Follow BLOCK_ABSTRACT_ORIGIN for the limited cases we can
625 handle - those that represent inlined function scopes.
626 For the drop rest them on the floor instead of ICEing
627 in dwarf2out.c. */
628 if (inlined_function_outer_scope_p (expr))
630 tree ultimate_origin = block_ultimate_origin (expr);
631 DFS_follow_tree_edge (ultimate_origin);
633 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
634 information for early inlined BLOCKs so drop it on the floor instead
635 of ICEing in dwarf2out.c. */
637 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
638 streaming time. */
640 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
641 list is re-constructed from BLOCK_SUPERCONTEXT. */
644 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
646 unsigned i;
647 tree t;
649 /* Note that the number of BINFO slots has already been emitted in
650 EXPR's header (see streamer_write_tree_header) because this length
651 is needed to build the empty BINFO node on the reader side. */
652 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
653 DFS_follow_tree_edge (t);
654 DFS_follow_tree_edge (BINFO_OFFSET (expr));
655 DFS_follow_tree_edge (BINFO_VTABLE (expr));
656 DFS_follow_tree_edge (BINFO_VPTR_FIELD (expr));
658 /* The number of BINFO_BASE_ACCESSES has already been emitted in
659 EXPR's bitfield section. */
660 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
661 DFS_follow_tree_edge (t);
663 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
664 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
667 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
669 unsigned i;
670 tree index, value;
672 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
674 DFS_follow_tree_edge (index);
675 DFS_follow_tree_edge (value);
679 if (code == OMP_CLAUSE)
681 int i;
682 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
683 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i));
684 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr));
687 #undef DFS_follow_tree_edge
690 /* Return a hash value for the tree T. */
692 static hashval_t
693 hash_tree (struct streamer_tree_cache_d *cache, tree t)
695 #define visit(SIBLING) \
696 do { \
697 unsigned ix; \
698 if (SIBLING && streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
699 v = iterative_hash_hashval_t (streamer_tree_cache_get_hash (cache, ix), v); \
700 } while (0)
702 /* Hash TS_BASE. */
703 enum tree_code code = TREE_CODE (t);
704 hashval_t v = iterative_hash_host_wide_int (code, 0);
705 if (!TYPE_P (t))
707 v = iterative_hash_host_wide_int (TREE_SIDE_EFFECTS (t)
708 | (TREE_CONSTANT (t) << 1)
709 | (TREE_READONLY (t) << 2)
710 | (TREE_PUBLIC (t) << 3), v);
712 v = iterative_hash_host_wide_int (TREE_ADDRESSABLE (t)
713 | (TREE_THIS_VOLATILE (t) << 1), v);
714 if (DECL_P (t))
715 v = iterative_hash_host_wide_int (DECL_UNSIGNED (t), v);
716 else if (TYPE_P (t))
717 v = iterative_hash_host_wide_int (TYPE_UNSIGNED (t), v);
718 if (TYPE_P (t))
719 v = iterative_hash_host_wide_int (TYPE_ARTIFICIAL (t), v);
720 else
721 v = iterative_hash_host_wide_int (TREE_NO_WARNING (t), v);
722 v = iterative_hash_host_wide_int (TREE_NOTHROW (t)
723 | (TREE_STATIC (t) << 1)
724 | (TREE_PROTECTED (t) << 2)
725 | (TREE_DEPRECATED (t) << 3), v);
726 if (code != TREE_BINFO)
727 v = iterative_hash_host_wide_int (TREE_PRIVATE (t), v);
728 if (TYPE_P (t))
729 v = iterative_hash_host_wide_int (TYPE_SATURATING (t)
730 | (TYPE_ADDR_SPACE (t) << 1), v);
731 else if (code == SSA_NAME)
732 v = iterative_hash_host_wide_int (SSA_NAME_IS_DEFAULT_DEF (t), v);
734 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
736 int i;
737 v = iterative_hash_host_wide_int (TREE_INT_CST_NUNITS (t), v);
738 v = iterative_hash_host_wide_int (TREE_INT_CST_EXT_NUNITS (t), v);
739 for (i = 0; i < TREE_INT_CST_NUNITS (t); i++)
740 v = iterative_hash_host_wide_int (TREE_INT_CST_ELT (t, i), v);
743 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
745 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
746 v = iterative_hash_host_wide_int (r.cl, v);
747 v = iterative_hash_host_wide_int (r.decimal
748 | (r.sign << 1)
749 | (r.signalling << 2)
750 | (r.canonical << 3), v);
751 v = iterative_hash_host_wide_int (r.uexp, v);
752 for (unsigned i = 0; i < SIGSZ; ++i)
753 v = iterative_hash_host_wide_int (r.sig[i], v);
756 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
758 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
759 v = iterative_hash_host_wide_int (f.mode, v);
760 v = iterative_hash_host_wide_int (f.data.low, v);
761 v = iterative_hash_host_wide_int (f.data.high, v);
764 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
766 v = iterative_hash_host_wide_int (DECL_MODE (t), v);
767 v = iterative_hash_host_wide_int (DECL_NONLOCAL (t)
768 | (DECL_VIRTUAL_P (t) << 1)
769 | (DECL_IGNORED_P (t) << 2)
770 | (DECL_ABSTRACT (t) << 3)
771 | (DECL_ARTIFICIAL (t) << 4)
772 | (DECL_USER_ALIGN (t) << 5)
773 | (DECL_PRESERVE_P (t) << 6)
774 | (DECL_EXTERNAL (t) << 7)
775 | (DECL_GIMPLE_REG_P (t) << 8), v);
776 v = iterative_hash_host_wide_int (DECL_ALIGN (t), v);
777 if (code == LABEL_DECL)
779 v = iterative_hash_host_wide_int (EH_LANDING_PAD_NR (t), v);
780 v = iterative_hash_host_wide_int (LABEL_DECL_UID (t), v);
782 else if (code == FIELD_DECL)
784 v = iterative_hash_host_wide_int (DECL_PACKED (t)
785 | (DECL_NONADDRESSABLE_P (t) << 1),
787 v = iterative_hash_host_wide_int (DECL_OFFSET_ALIGN (t), v);
789 else if (code == VAR_DECL)
791 v = iterative_hash_host_wide_int (DECL_HAS_DEBUG_EXPR_P (t)
792 | (DECL_NONLOCAL_FRAME (t) << 1),
795 if (code == RESULT_DECL
796 || code == PARM_DECL
797 || code == VAR_DECL)
799 v = iterative_hash_host_wide_int (DECL_BY_REFERENCE (t), v);
800 if (code == VAR_DECL
801 || code == PARM_DECL)
802 v = iterative_hash_host_wide_int (DECL_HAS_VALUE_EXPR_P (t), v);
806 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
807 v = iterative_hash_host_wide_int (DECL_REGISTER (t), v);
809 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
811 v = iterative_hash_host_wide_int ((DECL_COMMON (t))
812 | (DECL_DLLIMPORT_P (t) << 1)
813 | (DECL_WEAK (t) << 2)
814 | (DECL_SEEN_IN_BIND_EXPR_P (t) << 3)
815 | (DECL_COMDAT (t) << 4)
816 | (DECL_VISIBILITY_SPECIFIED (t) << 6),
818 v = iterative_hash_host_wide_int (DECL_VISIBILITY (t), v);
819 if (code == VAR_DECL)
821 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
822 v = iterative_hash_host_wide_int (DECL_HARD_REGISTER (t)
823 | (DECL_IN_CONSTANT_POOL (t) << 1),
826 if (TREE_CODE (t) == FUNCTION_DECL)
827 v = iterative_hash_host_wide_int (DECL_FINAL_P (t)
828 | (DECL_CXX_CONSTRUCTOR_P (t) << 1)
829 | (DECL_CXX_DESTRUCTOR_P (t) << 2),
833 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
835 v = iterative_hash_host_wide_int (DECL_BUILT_IN_CLASS (t), v);
836 v = iterative_hash_host_wide_int (DECL_STATIC_CONSTRUCTOR (t)
837 | (DECL_STATIC_DESTRUCTOR (t) << 1)
838 | (DECL_UNINLINABLE (t) << 2)
839 | (DECL_POSSIBLY_INLINED (t) << 3)
840 | (DECL_IS_NOVOPS (t) << 4)
841 | (DECL_IS_RETURNS_TWICE (t) << 5)
842 | (DECL_IS_MALLOC (t) << 6)
843 | (DECL_IS_OPERATOR_NEW (t) << 7)
844 | (DECL_DECLARED_INLINE_P (t) << 8)
845 | (DECL_STATIC_CHAIN (t) << 9)
846 | (DECL_NO_INLINE_WARNING_P (t) << 10)
847 | (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t) << 11)
848 | (DECL_NO_LIMIT_STACK (t) << 12)
849 | (DECL_DISREGARD_INLINE_LIMITS (t) << 13)
850 | (DECL_PURE_P (t) << 14)
851 | (DECL_LOOPING_CONST_OR_PURE_P (t) << 15), v);
852 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
853 v = iterative_hash_host_wide_int (DECL_FUNCTION_CODE (t), v);
856 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
858 v = iterative_hash_host_wide_int (TYPE_MODE (t), v);
859 v = iterative_hash_host_wide_int (TYPE_STRING_FLAG (t)
860 | (TYPE_NO_FORCE_BLK (t) << 1)
861 | (TYPE_NEEDS_CONSTRUCTING (t) << 2)
862 | (TYPE_PACKED (t) << 3)
863 | (TYPE_RESTRICT (t) << 4)
864 | (TYPE_USER_ALIGN (t) << 5)
865 | (TYPE_READONLY (t) << 6), v);
866 if (RECORD_OR_UNION_TYPE_P (t))
868 v = iterative_hash_host_wide_int (TYPE_TRANSPARENT_AGGR (t)
869 | (TYPE_FINAL_P (t) << 1), v);
871 else if (code == ARRAY_TYPE)
872 v = iterative_hash_host_wide_int (TYPE_NONALIASED_COMPONENT (t), v);
873 v = iterative_hash_host_wide_int (TYPE_PRECISION (t), v);
874 v = iterative_hash_host_wide_int (TYPE_ALIGN (t), v);
875 v = iterative_hash_host_wide_int ((TYPE_ALIAS_SET (t) == 0
876 || (!in_lto_p
877 && get_alias_set (t) == 0))
878 ? 0 : -1, v);
881 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
882 v = iterative_hash (TRANSLATION_UNIT_LANGUAGE (t),
883 strlen (TRANSLATION_UNIT_LANGUAGE (t)), v);
885 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
886 gcc_unreachable ();
888 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
889 v = iterative_hash (t, sizeof (struct cl_optimization), v);
891 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
892 v = iterative_hash_host_wide_int (IDENTIFIER_HASH_VALUE (t), v);
894 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
895 v = iterative_hash (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t), v);
897 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
899 if (POINTER_TYPE_P (t))
901 /* For pointers factor in the pointed-to type recursively as
902 we cannot recurse through only pointers.
903 ??? We can generalize this by keeping track of the
904 in-SCC edges for each tree (or arbitrarily the first
905 such edge) and hashing that in in a second stage
906 (instead of the quadratic mixing of the SCC we do now). */
907 hashval_t x;
908 unsigned ix;
909 if (streamer_tree_cache_lookup (cache, TREE_TYPE (t), &ix))
910 x = streamer_tree_cache_get_hash (cache, ix);
911 else
912 x = hash_tree (cache, TREE_TYPE (t));
913 v = iterative_hash_hashval_t (x, v);
915 else if (code != IDENTIFIER_NODE)
916 visit (TREE_TYPE (t));
919 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
920 for (unsigned i = 0; i < VECTOR_CST_NELTS (t); ++i)
921 visit (VECTOR_CST_ELT (t, i));
923 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
925 visit (TREE_REALPART (t));
926 visit (TREE_IMAGPART (t));
929 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
931 /* Drop names that were created for anonymous entities. */
932 if (DECL_NAME (t)
933 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
934 && ANON_AGGRNAME_P (DECL_NAME (t)))
936 else
937 visit (DECL_NAME (t));
938 if (DECL_FILE_SCOPE_P (t))
940 else
941 visit (DECL_CONTEXT (t));
944 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
946 visit (DECL_SIZE (t));
947 visit (DECL_SIZE_UNIT (t));
948 visit (DECL_ATTRIBUTES (t));
949 if ((code == VAR_DECL
950 || code == PARM_DECL)
951 && DECL_HAS_VALUE_EXPR_P (t))
952 visit (DECL_VALUE_EXPR (t));
953 if (code == VAR_DECL
954 && DECL_HAS_DEBUG_EXPR_P (t))
955 visit (DECL_DEBUG_EXPR (t));
956 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
957 be able to call get_symbol_initial_value. */
960 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
962 if (code == TYPE_DECL)
963 visit (DECL_ORIGINAL_TYPE (t));
966 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
968 if (DECL_ASSEMBLER_NAME_SET_P (t))
969 visit (DECL_ASSEMBLER_NAME (t));
972 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
974 visit (DECL_FIELD_OFFSET (t));
975 visit (DECL_BIT_FIELD_TYPE (t));
976 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
977 visit (DECL_FIELD_BIT_OFFSET (t));
978 visit (DECL_FCONTEXT (t));
981 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
983 visit (DECL_VINDEX (t));
984 visit (DECL_FUNCTION_PERSONALITY (t));
985 /* Do not follow DECL_FUNCTION_SPECIFIC_TARGET. */
986 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
989 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
991 visit (TYPE_SIZE (t));
992 visit (TYPE_SIZE_UNIT (t));
993 visit (TYPE_ATTRIBUTES (t));
994 visit (TYPE_NAME (t));
995 visit (TYPE_MAIN_VARIANT (t));
996 if (TYPE_FILE_SCOPE_P (t))
998 else
999 visit (TYPE_CONTEXT (t));
1000 visit (TYPE_STUB_DECL (t));
1003 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1005 if (code == ENUMERAL_TYPE)
1006 visit (TYPE_VALUES (t));
1007 else if (code == ARRAY_TYPE)
1008 visit (TYPE_DOMAIN (t));
1009 else if (RECORD_OR_UNION_TYPE_P (t))
1010 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
1011 visit (f);
1012 else if (code == FUNCTION_TYPE
1013 || code == METHOD_TYPE)
1014 visit (TYPE_ARG_TYPES (t));
1015 if (!POINTER_TYPE_P (t))
1016 visit (TYPE_MINVAL (t));
1017 visit (TYPE_MAXVAL (t));
1018 if (RECORD_OR_UNION_TYPE_P (t))
1019 visit (TYPE_BINFO (t));
1022 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1024 visit (TREE_PURPOSE (t));
1025 visit (TREE_VALUE (t));
1026 visit (TREE_CHAIN (t));
1029 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1030 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1031 visit (TREE_VEC_ELT (t, i));
1033 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1035 v = iterative_hash_host_wide_int (TREE_OPERAND_LENGTH (t), v);
1036 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1037 visit (TREE_OPERAND (t, i));
1040 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1042 unsigned i;
1043 tree b;
1044 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1045 visit (b);
1046 visit (BINFO_OFFSET (t));
1047 visit (BINFO_VTABLE (t));
1048 visit (BINFO_VPTR_FIELD (t));
1049 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t), i, b)
1050 visit (b);
1051 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1052 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
1055 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1057 unsigned i;
1058 tree index, value;
1059 v = iterative_hash_host_wide_int (CONSTRUCTOR_NELTS (t), v);
1060 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1062 visit (index);
1063 visit (value);
1067 if (code == OMP_CLAUSE)
1069 int i;
1071 v = iterative_hash_host_wide_int (OMP_CLAUSE_CODE (t), v);
1072 switch (OMP_CLAUSE_CODE (t))
1074 case OMP_CLAUSE_DEFAULT:
1075 v = iterative_hash_host_wide_int (OMP_CLAUSE_DEFAULT_KIND (t), v);
1076 break;
1077 case OMP_CLAUSE_SCHEDULE:
1078 v = iterative_hash_host_wide_int (OMP_CLAUSE_SCHEDULE_KIND (t), v);
1079 break;
1080 case OMP_CLAUSE_DEPEND:
1081 v = iterative_hash_host_wide_int (OMP_CLAUSE_DEPEND_KIND (t), v);
1082 break;
1083 case OMP_CLAUSE_MAP:
1084 v = iterative_hash_host_wide_int (OMP_CLAUSE_MAP_KIND (t), v);
1085 break;
1086 case OMP_CLAUSE_PROC_BIND:
1087 v = iterative_hash_host_wide_int (OMP_CLAUSE_PROC_BIND_KIND (t), v);
1088 break;
1089 case OMP_CLAUSE_REDUCTION:
1090 v = iterative_hash_host_wide_int (OMP_CLAUSE_REDUCTION_CODE (t), v);
1091 break;
1092 default:
1093 break;
1095 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
1096 visit (OMP_CLAUSE_OPERAND (t, i));
1097 visit (OMP_CLAUSE_CHAIN (t));
1100 return v;
1102 #undef visit
1105 /* Compare two SCC entries by their hash value for qsorting them. */
1107 static int
1108 scc_entry_compare (const void *p1_, const void *p2_)
1110 const scc_entry *p1 = (const scc_entry *) p1_;
1111 const scc_entry *p2 = (const scc_entry *) p2_;
1112 if (p1->hash < p2->hash)
1113 return -1;
1114 else if (p1->hash > p2->hash)
1115 return 1;
1116 return 0;
1119 /* Return a hash value for the SCC on the SCC stack from FIRST with
1120 size SIZE. */
1122 static hashval_t
1123 hash_scc (struct streamer_tree_cache_d *cache, unsigned first, unsigned size)
1125 /* Compute hash values for the SCC members. */
1126 for (unsigned i = 0; i < size; ++i)
1127 sccstack[first+i].hash = hash_tree (cache, sccstack[first+i].t);
1129 if (size == 1)
1130 return sccstack[first].hash;
1132 /* Sort the SCC of type, hash pairs so that when we mix in
1133 all members of the SCC the hash value becomes independent on
1134 the order we visited the SCC. Produce hash of the whole SCC as
1135 combination of hashes of individual elements. Then combine that hash into
1136 hash of each element, so othewise identically looking elements from two
1137 different SCCs are distinguished. */
1138 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1140 hashval_t scc_hash = sccstack[first].hash;
1141 for (unsigned i = 1; i < size; ++i)
1142 scc_hash = iterative_hash_hashval_t (scc_hash,
1143 sccstack[first+i].hash);
1144 for (unsigned i = 0; i < size; ++i)
1145 sccstack[first+i].hash = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash);
1146 return scc_hash;
1149 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1150 already in the streamer cache. Main routine called for
1151 each visit of EXPR. */
1153 static void
1154 DFS_write_tree (struct output_block *ob, sccs *from_state,
1155 tree expr, bool ref_p, bool this_ref_p)
1157 unsigned ix;
1158 sccs **slot;
1160 /* Handle special cases. */
1161 if (expr == NULL_TREE)
1162 return;
1164 /* Do not DFS walk into indexable trees. */
1165 if (this_ref_p && tree_is_indexable (expr))
1166 return;
1168 /* Check if we already streamed EXPR. */
1169 if (streamer_tree_cache_lookup (ob->writer_cache, expr, &ix))
1170 return;
1172 slot = (sccs **)pointer_map_insert (sccstate, expr);
1173 sccs *cstate = *slot;
1174 if (!cstate)
1176 scc_entry e = { expr, 0 };
1177 /* Not yet visited. DFS recurse and push it onto the stack. */
1178 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
1179 sccstack.safe_push (e);
1180 cstate->dfsnum = next_dfs_num++;
1181 cstate->low = cstate->dfsnum;
1183 if (streamer_handle_as_builtin_p (expr))
1185 else if (TREE_CODE (expr) == INTEGER_CST
1186 && !TREE_OVERFLOW (expr))
1187 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
1188 else
1190 DFS_write_tree_body (ob, expr, cstate, ref_p);
1192 /* Walk any LTO-specific edges. */
1193 if (DECL_P (expr)
1194 && TREE_CODE (expr) != FUNCTION_DECL
1195 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1197 /* Handle DECL_INITIAL for symbols. */
1198 tree initial = get_symbol_initial_value (ob, expr);
1199 DFS_write_tree (ob, cstate, initial, ref_p, ref_p);
1203 /* See if we found an SCC. */
1204 if (cstate->low == cstate->dfsnum)
1206 unsigned first, size;
1207 tree x;
1209 /* Pop the SCC and compute its size. */
1210 first = sccstack.length ();
1213 x = sccstack[--first].t;
1215 while (x != expr);
1216 size = sccstack.length () - first;
1218 /* No need to compute hashes for LTRANS units, we don't perform
1219 any merging there. */
1220 hashval_t scc_hash = 0;
1221 unsigned scc_entry_len = 0;
1222 if (!flag_wpa)
1224 scc_hash = hash_scc (ob->writer_cache, first, size);
1226 /* Put the entries with the least number of collisions first. */
1227 unsigned entry_start = 0;
1228 scc_entry_len = size + 1;
1229 for (unsigned i = 0; i < size;)
1231 unsigned from = i;
1232 for (i = i + 1; i < size
1233 && (sccstack[first + i].hash
1234 == sccstack[first + from].hash); ++i)
1236 if (i - from < scc_entry_len)
1238 scc_entry_len = i - from;
1239 entry_start = from;
1242 for (unsigned i = 0; i < scc_entry_len; ++i)
1244 scc_entry tem = sccstack[first + i];
1245 sccstack[first + i] = sccstack[first + entry_start + i];
1246 sccstack[first + entry_start + i] = tem;
1250 /* Write LTO_tree_scc. */
1251 streamer_write_record_start (ob, LTO_tree_scc);
1252 streamer_write_uhwi (ob, size);
1253 streamer_write_uhwi (ob, scc_hash);
1255 /* Write size-1 SCCs without wrapping them inside SCC bundles.
1256 All INTEGER_CSTs need to be handled this way as we need
1257 their type to materialize them. Also builtins are handled
1258 this way.
1259 ??? We still wrap these in LTO_tree_scc so at the
1260 input side we can properly identify the tree we want
1261 to ultimatively return. */
1262 if (size == 1)
1263 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
1264 else
1266 /* Write the size of the SCC entry candidates. */
1267 streamer_write_uhwi (ob, scc_entry_len);
1269 /* Write all headers and populate the streamer cache. */
1270 for (unsigned i = 0; i < size; ++i)
1272 hashval_t hash = sccstack[first+i].hash;
1273 tree t = sccstack[first+i].t;
1274 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
1275 t, hash, &ix);
1276 gcc_assert (!exists_p);
1278 if (!lto_is_streamable (t))
1279 internal_error ("tree code %qs is not supported "
1280 "in LTO streams",
1281 get_tree_code_name (TREE_CODE (t)));
1283 gcc_checking_assert (!streamer_handle_as_builtin_p (t));
1285 /* Write the header, containing everything needed to
1286 materialize EXPR on the reading side. */
1287 streamer_write_tree_header (ob, t);
1290 /* Write the bitpacks and tree references. */
1291 for (unsigned i = 0; i < size; ++i)
1293 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
1295 /* Mark the end of the tree. */
1296 streamer_write_zero (ob);
1300 /* Finally truncate the vector. */
1301 sccstack.truncate (first);
1303 if (from_state)
1304 from_state->low = MIN (from_state->low, cstate->low);
1305 return;
1308 if (from_state)
1309 from_state->low = MIN (from_state->low, cstate->low);
1311 gcc_checking_assert (from_state);
1312 if (cstate->dfsnum < from_state->dfsnum)
1313 from_state->low = MIN (cstate->dfsnum, from_state->low);
1317 /* Emit the physical representation of tree node EXPR to output block
1318 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
1319 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1321 void
1322 lto_output_tree (struct output_block *ob, tree expr,
1323 bool ref_p, bool this_ref_p)
1325 unsigned ix;
1326 bool existed_p;
1328 if (expr == NULL_TREE)
1330 streamer_write_record_start (ob, LTO_null);
1331 return;
1334 if (this_ref_p && tree_is_indexable (expr))
1336 lto_output_tree_ref (ob, expr);
1337 return;
1340 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1341 if (existed_p)
1343 /* If a node has already been streamed out, make sure that
1344 we don't write it more than once. Otherwise, the reader
1345 will instantiate two different nodes for the same object. */
1346 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1347 streamer_write_uhwi (ob, ix);
1348 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1349 lto_tree_code_to_tag (TREE_CODE (expr)));
1350 lto_stats.num_pickle_refs_output++;
1352 else
1354 /* This is the first time we see EXPR, write all reachable
1355 trees to OB. */
1356 static bool in_dfs_walk;
1358 /* Protect against recursion which means disconnect between
1359 what tree edges we walk in the DFS walk and what edges
1360 we stream out. */
1361 gcc_assert (!in_dfs_walk);
1363 /* Start the DFS walk. */
1364 /* Save ob state ... */
1365 /* let's see ... */
1366 in_dfs_walk = true;
1367 sccstate = pointer_map_create ();
1368 gcc_obstack_init (&sccstate_obstack);
1369 next_dfs_num = 1;
1370 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p);
1371 sccstack.release ();
1372 pointer_map_destroy (sccstate);
1373 obstack_free (&sccstate_obstack, NULL);
1374 in_dfs_walk = false;
1376 /* Finally append a reference to the tree we were writing.
1377 ??? If expr ended up as a singleton we could have
1378 inlined it here and avoid outputting a reference. */
1379 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1380 gcc_assert (existed_p);
1381 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1382 streamer_write_uhwi (ob, ix);
1383 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1384 lto_tree_code_to_tag (TREE_CODE (expr)));
1385 lto_stats.num_pickle_refs_output++;
1390 /* Output to OB a list of try/catch handlers starting with FIRST. */
1392 static void
1393 output_eh_try_list (struct output_block *ob, eh_catch first)
1395 eh_catch n;
1397 for (n = first; n; n = n->next_catch)
1399 streamer_write_record_start (ob, LTO_eh_catch);
1400 stream_write_tree (ob, n->type_list, true);
1401 stream_write_tree (ob, n->filter_list, true);
1402 stream_write_tree (ob, n->label, true);
1405 streamer_write_record_start (ob, LTO_null);
1409 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1410 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1411 detect EH region sharing. */
1413 static void
1414 output_eh_region (struct output_block *ob, eh_region r)
1416 enum LTO_tags tag;
1418 if (r == NULL)
1420 streamer_write_record_start (ob, LTO_null);
1421 return;
1424 if (r->type == ERT_CLEANUP)
1425 tag = LTO_ert_cleanup;
1426 else if (r->type == ERT_TRY)
1427 tag = LTO_ert_try;
1428 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1429 tag = LTO_ert_allowed_exceptions;
1430 else if (r->type == ERT_MUST_NOT_THROW)
1431 tag = LTO_ert_must_not_throw;
1432 else
1433 gcc_unreachable ();
1435 streamer_write_record_start (ob, tag);
1436 streamer_write_hwi (ob, r->index);
1438 if (r->outer)
1439 streamer_write_hwi (ob, r->outer->index);
1440 else
1441 streamer_write_zero (ob);
1443 if (r->inner)
1444 streamer_write_hwi (ob, r->inner->index);
1445 else
1446 streamer_write_zero (ob);
1448 if (r->next_peer)
1449 streamer_write_hwi (ob, r->next_peer->index);
1450 else
1451 streamer_write_zero (ob);
1453 if (r->type == ERT_TRY)
1455 output_eh_try_list (ob, r->u.eh_try.first_catch);
1457 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1459 stream_write_tree (ob, r->u.allowed.type_list, true);
1460 stream_write_tree (ob, r->u.allowed.label, true);
1461 streamer_write_uhwi (ob, r->u.allowed.filter);
1463 else if (r->type == ERT_MUST_NOT_THROW)
1465 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1466 bitpack_d bp = bitpack_create (ob->main_stream);
1467 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1468 streamer_write_bitpack (&bp);
1471 if (r->landing_pads)
1472 streamer_write_hwi (ob, r->landing_pads->index);
1473 else
1474 streamer_write_zero (ob);
1478 /* Output landing pad LP to OB. */
1480 static void
1481 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1483 if (lp == NULL)
1485 streamer_write_record_start (ob, LTO_null);
1486 return;
1489 streamer_write_record_start (ob, LTO_eh_landing_pad);
1490 streamer_write_hwi (ob, lp->index);
1491 if (lp->next_lp)
1492 streamer_write_hwi (ob, lp->next_lp->index);
1493 else
1494 streamer_write_zero (ob);
1496 if (lp->region)
1497 streamer_write_hwi (ob, lp->region->index);
1498 else
1499 streamer_write_zero (ob);
1501 stream_write_tree (ob, lp->post_landing_pad, true);
1505 /* Output the existing eh_table to OB. */
1507 static void
1508 output_eh_regions (struct output_block *ob, struct function *fn)
1510 if (fn->eh && fn->eh->region_tree)
1512 unsigned i;
1513 eh_region eh;
1514 eh_landing_pad lp;
1515 tree ttype;
1517 streamer_write_record_start (ob, LTO_eh_table);
1519 /* Emit the index of the root of the EH region tree. */
1520 streamer_write_hwi (ob, fn->eh->region_tree->index);
1522 /* Emit all the EH regions in the region array. */
1523 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
1524 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
1525 output_eh_region (ob, eh);
1527 /* Emit all landing pads. */
1528 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
1529 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
1530 output_eh_lp (ob, lp);
1532 /* Emit all the runtime type data. */
1533 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
1534 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
1535 stream_write_tree (ob, ttype, true);
1537 /* Emit the table of action chains. */
1538 if (targetm.arm_eabi_unwinder)
1540 tree t;
1541 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
1542 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
1543 stream_write_tree (ob, t, true);
1545 else
1547 uchar c;
1548 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
1549 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
1550 streamer_write_char_stream (ob->main_stream, c);
1554 /* The LTO_null either terminates the record or indicates that there
1555 are no eh_records at all. */
1556 streamer_write_record_start (ob, LTO_null);
1560 /* Output all of the active ssa names to the ssa_names stream. */
1562 static void
1563 output_ssa_names (struct output_block *ob, struct function *fn)
1565 unsigned int i, len;
1567 len = vec_safe_length (SSANAMES (fn));
1568 streamer_write_uhwi (ob, len);
1570 for (i = 1; i < len; i++)
1572 tree ptr = (*SSANAMES (fn))[i];
1574 if (ptr == NULL_TREE
1575 || SSA_NAME_IN_FREE_LIST (ptr)
1576 || virtual_operand_p (ptr))
1577 continue;
1579 streamer_write_uhwi (ob, i);
1580 streamer_write_char_stream (ob->main_stream,
1581 SSA_NAME_IS_DEFAULT_DEF (ptr));
1582 if (SSA_NAME_VAR (ptr))
1583 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
1584 else
1585 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1586 stream_write_tree (ob, TREE_TYPE (ptr), true);
1589 streamer_write_zero (ob);
1593 /* Output a wide-int. */
1595 static void
1596 streamer_write_wi (struct output_block *ob,
1597 const widest_int &w)
1599 int len = w.get_len ();
1601 streamer_write_uhwi (ob, w.get_precision ());
1602 streamer_write_uhwi (ob, len);
1603 for (int i = 0; i < len; i++)
1604 streamer_write_hwi (ob, w.elt (i));
1608 /* Output the cfg. */
1610 static void
1611 output_cfg (struct output_block *ob, struct function *fn)
1613 struct lto_output_stream *tmp_stream = ob->main_stream;
1614 basic_block bb;
1616 ob->main_stream = ob->cfg_stream;
1618 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1619 profile_status_for_fn (fn));
1621 /* Output the number of the highest basic block. */
1622 streamer_write_uhwi (ob, last_basic_block_for_fn (fn));
1624 FOR_ALL_BB_FN (bb, fn)
1626 edge_iterator ei;
1627 edge e;
1629 streamer_write_hwi (ob, bb->index);
1631 /* Output the successors and the edge flags. */
1632 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
1633 FOR_EACH_EDGE (e, ei, bb->succs)
1635 streamer_write_uhwi (ob, e->dest->index);
1636 streamer_write_hwi (ob, e->probability);
1637 streamer_write_gcov_count (ob, e->count);
1638 streamer_write_uhwi (ob, e->flags);
1642 streamer_write_hwi (ob, -1);
1644 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1645 while (bb->next_bb)
1647 streamer_write_hwi (ob, bb->next_bb->index);
1648 bb = bb->next_bb;
1651 streamer_write_hwi (ob, -1);
1653 /* ??? The cfgloop interface is tied to cfun. */
1654 gcc_assert (cfun == fn);
1656 /* Output the number of loops. */
1657 streamer_write_uhwi (ob, number_of_loops (fn));
1659 /* Output each loop, skipping the tree root which has number zero. */
1660 for (unsigned i = 1; i < number_of_loops (fn); ++i)
1662 struct loop *loop = get_loop (fn, i);
1664 /* Write the index of the loop header. That's enough to rebuild
1665 the loop tree on the reader side. Stream -1 for an unused
1666 loop entry. */
1667 if (!loop)
1669 streamer_write_hwi (ob, -1);
1670 continue;
1672 else
1673 streamer_write_hwi (ob, loop->header->index);
1675 /* Write everything copy_loop_info copies. */
1676 streamer_write_enum (ob->main_stream,
1677 loop_estimation, EST_LAST, loop->estimate_state);
1678 streamer_write_hwi (ob, loop->any_upper_bound);
1679 if (loop->any_upper_bound)
1680 streamer_write_wi (ob, loop->nb_iterations_upper_bound);
1681 streamer_write_hwi (ob, loop->any_estimate);
1682 if (loop->any_estimate)
1683 streamer_write_wi (ob, loop->nb_iterations_estimate);
1685 /* Write OMP SIMD related info. */
1686 streamer_write_hwi (ob, loop->safelen);
1687 streamer_write_hwi (ob, loop->dont_vectorize);
1688 streamer_write_hwi (ob, loop->force_vectorize);
1689 stream_write_tree (ob, loop->simduid, true);
1692 ob->main_stream = tmp_stream;
1696 /* Create the header in the file using OB. If the section type is for
1697 a function, set FN to the decl for that function. */
1699 void
1700 produce_asm (struct output_block *ob, tree fn)
1702 enum lto_section_type section_type = ob->section_type;
1703 struct lto_function_header header;
1704 char *section_name;
1705 struct lto_output_stream *header_stream;
1707 if (section_type == LTO_section_function_body)
1709 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1710 section_name = lto_get_section_name (section_type, name, NULL);
1712 else
1713 section_name = lto_get_section_name (section_type, NULL, NULL);
1715 lto_begin_section (section_name, !flag_wpa);
1716 free (section_name);
1718 /* The entire header is stream computed here. */
1719 memset (&header, 0, sizeof (struct lto_function_header));
1721 /* Write the header. */
1722 header.lto_header.major_version = LTO_major_version;
1723 header.lto_header.minor_version = LTO_minor_version;
1725 header.compressed_size = 0;
1727 if (section_type == LTO_section_function_body)
1728 header.cfg_size = ob->cfg_stream->total_size;
1729 header.main_size = ob->main_stream->total_size;
1730 header.string_size = ob->string_stream->total_size;
1732 header_stream = XCNEW (struct lto_output_stream);
1733 lto_output_data_stream (header_stream, &header, sizeof header);
1734 lto_write_stream (header_stream);
1735 free (header_stream);
1737 /* Put all of the gimple and the string table out the asm file as a
1738 block of text. */
1739 if (section_type == LTO_section_function_body)
1740 lto_write_stream (ob->cfg_stream);
1741 lto_write_stream (ob->main_stream);
1742 lto_write_stream (ob->string_stream);
1744 lto_end_section ();
1748 /* Output the base body of struct function FN using output block OB. */
1750 static void
1751 output_struct_function_base (struct output_block *ob, struct function *fn)
1753 struct bitpack_d bp;
1754 unsigned i;
1755 tree t;
1757 /* Output the static chain and non-local goto save area. */
1758 stream_write_tree (ob, fn->static_chain_decl, true);
1759 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
1761 /* Output all the local variables in the function. */
1762 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
1763 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
1764 stream_write_tree (ob, t, true);
1766 /* Output current IL state of the function. */
1767 streamer_write_uhwi (ob, fn->curr_properties);
1769 /* Write all the attributes for FN. */
1770 bp = bitpack_create (ob->main_stream);
1771 bp_pack_value (&bp, fn->is_thunk, 1);
1772 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
1773 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
1774 bp_pack_value (&bp, fn->returns_struct, 1);
1775 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
1776 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
1777 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
1778 bp_pack_value (&bp, fn->after_inlining, 1);
1779 bp_pack_value (&bp, fn->stdarg, 1);
1780 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
1781 bp_pack_value (&bp, fn->calls_alloca, 1);
1782 bp_pack_value (&bp, fn->calls_setjmp, 1);
1783 bp_pack_value (&bp, fn->has_force_vectorize_loops, 1);
1784 bp_pack_value (&bp, fn->has_simduid_loops, 1);
1785 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
1786 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
1788 /* Output the function start and end loci. */
1789 stream_output_location (ob, &bp, fn->function_start_locus);
1790 stream_output_location (ob, &bp, fn->function_end_locus);
1792 streamer_write_bitpack (&bp);
1796 /* Output the body of function NODE->DECL. */
1798 static void
1799 output_function (struct cgraph_node *node)
1801 tree function;
1802 struct function *fn;
1803 basic_block bb;
1804 struct output_block *ob;
1806 function = node->decl;
1807 fn = DECL_STRUCT_FUNCTION (function);
1808 ob = create_output_block (LTO_section_function_body);
1810 clear_line_info (ob);
1811 ob->cgraph_node = node;
1813 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
1815 /* Set current_function_decl and cfun. */
1816 push_cfun (fn);
1818 /* Make string 0 be a NULL string. */
1819 streamer_write_char_stream (ob->string_stream, 0);
1821 streamer_write_record_start (ob, LTO_function);
1823 /* Output decls for parameters and args. */
1824 stream_write_tree (ob, DECL_RESULT (function), true);
1825 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
1827 /* Output DECL_INITIAL for the function, which contains the tree of
1828 lexical scopes. */
1829 stream_write_tree (ob, DECL_INITIAL (function), true);
1831 /* We also stream abstract functions where we stream only stuff needed for
1832 debug info. */
1833 if (gimple_has_body_p (function))
1835 streamer_write_uhwi (ob, 1);
1836 output_struct_function_base (ob, fn);
1838 /* Output all the SSA names used in the function. */
1839 output_ssa_names (ob, fn);
1841 /* Output any exception handling regions. */
1842 output_eh_regions (ob, fn);
1845 /* We will renumber the statements. The code that does this uses
1846 the same ordering that we use for serializing them so we can use
1847 the same code on the other end and not have to write out the
1848 statement numbers. We do not assign UIDs to PHIs here because
1849 virtual PHIs get re-computed on-the-fly which would make numbers
1850 inconsistent. */
1851 set_gimple_stmt_max_uid (cfun, 0);
1852 FOR_ALL_BB_FN (bb, cfun)
1854 gimple_stmt_iterator gsi;
1855 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1857 gimple stmt = gsi_stmt (gsi);
1859 /* Virtual PHIs are not going to be streamed. */
1860 if (!virtual_operand_p (gimple_phi_result (stmt)))
1861 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1863 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1865 gimple stmt = gsi_stmt (gsi);
1866 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1869 /* To avoid keeping duplicate gimple IDs in the statements, renumber
1870 virtual phis now. */
1871 FOR_ALL_BB_FN (bb, cfun)
1873 gimple_stmt_iterator gsi;
1874 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1876 gimple stmt = gsi_stmt (gsi);
1877 if (virtual_operand_p (gimple_phi_result (stmt)))
1878 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1882 /* Output the code for the function. */
1883 FOR_ALL_BB_FN (bb, fn)
1884 output_bb (ob, bb, fn);
1886 /* The terminator for this function. */
1887 streamer_write_record_start (ob, LTO_null);
1889 output_cfg (ob, fn);
1891 pop_cfun ();
1893 else
1894 streamer_write_uhwi (ob, 0);
1896 /* Create a section to hold the pickled output of this function. */
1897 produce_asm (ob, function);
1899 destroy_output_block (ob);
1903 /* Emit toplevel asms. */
1905 void
1906 lto_output_toplevel_asms (void)
1908 struct output_block *ob;
1909 struct asm_node *can;
1910 char *section_name;
1911 struct lto_output_stream *header_stream;
1912 struct lto_asm_header header;
1914 if (! asm_nodes)
1915 return;
1917 ob = create_output_block (LTO_section_asm);
1919 /* Make string 0 be a NULL string. */
1920 streamer_write_char_stream (ob->string_stream, 0);
1922 for (can = asm_nodes; can; can = can->next)
1924 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
1925 streamer_write_hwi (ob, can->order);
1928 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
1930 section_name = lto_get_section_name (LTO_section_asm, NULL, NULL);
1931 lto_begin_section (section_name, !flag_wpa);
1932 free (section_name);
1934 /* The entire header stream is computed here. */
1935 memset (&header, 0, sizeof (header));
1937 /* Write the header. */
1938 header.lto_header.major_version = LTO_major_version;
1939 header.lto_header.minor_version = LTO_minor_version;
1941 header.main_size = ob->main_stream->total_size;
1942 header.string_size = ob->string_stream->total_size;
1944 header_stream = XCNEW (struct lto_output_stream);
1945 lto_output_data_stream (header_stream, &header, sizeof (header));
1946 lto_write_stream (header_stream);
1947 free (header_stream);
1949 /* Put all of the gimple and the string table out the asm file as a
1950 block of text. */
1951 lto_write_stream (ob->main_stream);
1952 lto_write_stream (ob->string_stream);
1954 lto_end_section ();
1956 destroy_output_block (ob);
1960 /* Copy the function body of NODE without deserializing. */
1962 static void
1963 copy_function (struct cgraph_node *node)
1965 tree function = node->decl;
1966 struct lto_file_decl_data *file_data = node->lto_file_data;
1967 struct lto_output_stream *output_stream = XCNEW (struct lto_output_stream);
1968 const char *data;
1969 size_t len;
1970 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
1971 char *section_name =
1972 lto_get_section_name (LTO_section_function_body, name, NULL);
1973 size_t i, j;
1974 struct lto_in_decl_state *in_state;
1975 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
1977 lto_begin_section (section_name, !flag_wpa);
1978 free (section_name);
1980 /* We may have renamed the declaration, e.g., a static function. */
1981 name = lto_get_decl_name_mapping (file_data, name);
1983 data = lto_get_section_data (file_data, LTO_section_function_body,
1984 name, &len);
1985 gcc_assert (data);
1987 /* Do a bit copy of the function body. */
1988 lto_output_data_stream (output_stream, data, len);
1989 lto_write_stream (output_stream);
1991 /* Copy decls. */
1992 in_state =
1993 lto_get_function_in_decl_state (node->lto_file_data, function);
1994 gcc_assert (in_state);
1996 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
1998 size_t n = in_state->streams[i].size;
1999 tree *trees = in_state->streams[i].trees;
2000 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
2002 /* The out state must have the same indices and the in state.
2003 So just copy the vector. All the encoders in the in state
2004 must be empty where we reach here. */
2005 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
2006 encoder->trees.reserve_exact (n);
2007 for (j = 0; j < n; j++)
2008 encoder->trees.safe_push (trees[j]);
2011 lto_free_section_data (file_data, LTO_section_function_body, name,
2012 data, len);
2013 free (output_stream);
2014 lto_end_section ();
2017 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2019 static tree
2020 wrap_refs (tree *tp, int *ws, void *)
2022 tree t = *tp;
2023 if (handled_component_p (t)
2024 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL)
2026 tree decl = TREE_OPERAND (t, 0);
2027 tree ptrtype = build_pointer_type (TREE_TYPE (decl));
2028 TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
2029 build1 (ADDR_EXPR, ptrtype, decl),
2030 build_int_cst (ptrtype, 0));
2031 TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
2032 *ws = 0;
2034 else if (TREE_CODE (t) == CONSTRUCTOR)
2036 else if (!EXPR_P (t))
2037 *ws = 0;
2038 return NULL_TREE;
2041 /* Main entry point from the pass manager. */
2043 void
2044 lto_output (void)
2046 struct lto_out_decl_state *decl_state;
2047 #ifdef ENABLE_CHECKING
2048 bitmap output = lto_bitmap_alloc ();
2049 #endif
2050 int i, n_nodes;
2051 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
2053 /* Initialize the streamer. */
2054 lto_streamer_init ();
2056 n_nodes = lto_symtab_encoder_size (encoder);
2057 /* Process only the functions with bodies. */
2058 for (i = 0; i < n_nodes; i++)
2060 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
2061 if (cgraph_node *node = dyn_cast <cgraph_node *> (snode))
2063 if (lto_symtab_encoder_encode_body_p (encoder, node)
2064 && !node->alias)
2066 #ifdef ENABLE_CHECKING
2067 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
2068 bitmap_set_bit (output, DECL_UID (node->decl));
2069 #endif
2070 decl_state = lto_new_out_decl_state ();
2071 lto_push_out_decl_state (decl_state);
2072 if (gimple_has_body_p (node->decl) || !flag_wpa)
2073 output_function (node);
2074 else
2075 copy_function (node);
2076 gcc_assert (lto_get_out_decl_state () == decl_state);
2077 lto_pop_out_decl_state ();
2078 lto_record_function_out_decl_state (node->decl, decl_state);
2081 else if (varpool_node *node = dyn_cast <varpool_node *> (snode))
2083 /* Wrap symbol references inside the ctor in a type
2084 preserving MEM_REF. */
2085 tree ctor = DECL_INITIAL (node->decl);
2086 if (ctor && !in_lto_p)
2087 walk_tree (&ctor, wrap_refs, NULL, NULL);
2091 /* Emit the callgraph after emitting function bodies. This needs to
2092 be done now to make sure that all the statements in every function
2093 have been renumbered so that edges can be associated with call
2094 statements using the statement UIDs. */
2095 output_symtab ();
2097 #ifdef ENABLE_CHECKING
2098 lto_bitmap_free (output);
2099 #endif
2102 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2103 from it and required for correct representation of its semantics.
2104 Each node in ENCODER must be a global declaration or a type. A node
2105 is written only once, even if it appears multiple times in the
2106 vector. Certain transitively-reachable nodes, such as those
2107 representing expressions, may be duplicated, but such nodes
2108 must not appear in ENCODER itself. */
2110 static void
2111 write_global_stream (struct output_block *ob,
2112 struct lto_tree_ref_encoder *encoder)
2114 tree t;
2115 size_t index;
2116 const size_t size = lto_tree_ref_encoder_size (encoder);
2118 for (index = 0; index < size; index++)
2120 t = lto_tree_ref_encoder_get_tree (encoder, index);
2121 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2122 stream_write_tree (ob, t, false);
2127 /* Write a sequence of indices into the globals vector corresponding
2128 to the trees in ENCODER. These are used by the reader to map the
2129 indices used to refer to global entities within function bodies to
2130 their referents. */
2132 static void
2133 write_global_references (struct output_block *ob,
2134 struct lto_output_stream *ref_stream,
2135 struct lto_tree_ref_encoder *encoder)
2137 tree t;
2138 uint32_t index;
2139 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2141 /* Write size as 32-bit unsigned. */
2142 lto_output_data_stream (ref_stream, &size, sizeof (int32_t));
2144 for (index = 0; index < size; index++)
2146 uint32_t slot_num;
2148 t = lto_tree_ref_encoder_get_tree (encoder, index);
2149 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2150 gcc_assert (slot_num != (unsigned)-1);
2151 lto_output_data_stream (ref_stream, &slot_num, sizeof slot_num);
2156 /* Write all the streams in an lto_out_decl_state STATE using
2157 output block OB and output stream OUT_STREAM. */
2159 void
2160 lto_output_decl_state_streams (struct output_block *ob,
2161 struct lto_out_decl_state *state)
2163 int i;
2165 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2166 write_global_stream (ob, &state->streams[i]);
2170 /* Write all the references in an lto_out_decl_state STATE using
2171 output block OB and output stream OUT_STREAM. */
2173 void
2174 lto_output_decl_state_refs (struct output_block *ob,
2175 struct lto_output_stream *out_stream,
2176 struct lto_out_decl_state *state)
2178 unsigned i;
2179 uint32_t ref;
2180 tree decl;
2182 /* Write reference to FUNCTION_DECL. If there is not function,
2183 write reference to void_type_node. */
2184 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2185 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2186 gcc_assert (ref != (unsigned)-1);
2187 lto_output_data_stream (out_stream, &ref, sizeof (uint32_t));
2189 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2190 write_global_references (ob, out_stream, &state->streams[i]);
2194 /* Return the written size of STATE. */
2196 static size_t
2197 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2199 int i;
2200 size_t size;
2202 size = sizeof (int32_t); /* fn_ref. */
2203 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2205 size += sizeof (int32_t); /* vector size. */
2206 size += (lto_tree_ref_encoder_size (&state->streams[i])
2207 * sizeof (int32_t));
2209 return size;
2213 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2214 so far. */
2216 static void
2217 write_symbol (struct streamer_tree_cache_d *cache,
2218 struct lto_output_stream *stream,
2219 tree t, struct pointer_set_t *seen, bool alias)
2221 const char *name;
2222 enum gcc_plugin_symbol_kind kind;
2223 enum gcc_plugin_symbol_visibility visibility;
2224 unsigned slot_num;
2225 uint64_t size;
2226 const char *comdat;
2227 unsigned char c;
2229 /* None of the following kinds of symbols are needed in the
2230 symbol table. */
2231 if (!TREE_PUBLIC (t)
2232 || is_builtin_fn (t)
2233 || DECL_ABSTRACT (t)
2234 || (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)))
2235 return;
2236 gcc_assert (TREE_CODE (t) != RESULT_DECL);
2238 gcc_assert (TREE_CODE (t) == VAR_DECL
2239 || TREE_CODE (t) == FUNCTION_DECL);
2241 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2243 /* This behaves like assemble_name_raw in varasm.c, performing the
2244 same name manipulations that ASM_OUTPUT_LABELREF does. */
2245 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2247 if (pointer_set_contains (seen, name))
2248 return;
2249 pointer_set_insert (seen, name);
2251 streamer_tree_cache_lookup (cache, t, &slot_num);
2252 gcc_assert (slot_num != (unsigned)-1);
2254 if (DECL_EXTERNAL (t))
2256 if (DECL_WEAK (t))
2257 kind = GCCPK_WEAKUNDEF;
2258 else
2259 kind = GCCPK_UNDEF;
2261 else
2263 if (DECL_WEAK (t))
2264 kind = GCCPK_WEAKDEF;
2265 else if (DECL_COMMON (t))
2266 kind = GCCPK_COMMON;
2267 else
2268 kind = GCCPK_DEF;
2270 /* When something is defined, it should have node attached. */
2271 gcc_assert (alias || TREE_CODE (t) != VAR_DECL
2272 || varpool_get_node (t)->definition);
2273 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2274 || (cgraph_get_node (t)
2275 && cgraph_get_node (t)->definition));
2278 /* Imitate what default_elf_asm_output_external do.
2279 When symbol is external, we need to output it with DEFAULT visibility
2280 when compiling with -fvisibility=default, while with HIDDEN visibility
2281 when symbol has attribute (visibility("hidden")) specified.
2282 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2283 right. */
2285 if (DECL_EXTERNAL (t)
2286 && !targetm.binds_local_p (t))
2287 visibility = GCCPV_DEFAULT;
2288 else
2289 switch (DECL_VISIBILITY (t))
2291 case VISIBILITY_DEFAULT:
2292 visibility = GCCPV_DEFAULT;
2293 break;
2294 case VISIBILITY_PROTECTED:
2295 visibility = GCCPV_PROTECTED;
2296 break;
2297 case VISIBILITY_HIDDEN:
2298 visibility = GCCPV_HIDDEN;
2299 break;
2300 case VISIBILITY_INTERNAL:
2301 visibility = GCCPV_INTERNAL;
2302 break;
2305 if (kind == GCCPK_COMMON
2306 && DECL_SIZE_UNIT (t)
2307 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
2308 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2309 else
2310 size = 0;
2312 if (DECL_ONE_ONLY (t))
2313 comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
2314 else
2315 comdat = "";
2317 lto_output_data_stream (stream, name, strlen (name) + 1);
2318 lto_output_data_stream (stream, comdat, strlen (comdat) + 1);
2319 c = (unsigned char) kind;
2320 lto_output_data_stream (stream, &c, 1);
2321 c = (unsigned char) visibility;
2322 lto_output_data_stream (stream, &c, 1);
2323 lto_output_data_stream (stream, &size, 8);
2324 lto_output_data_stream (stream, &slot_num, 4);
2327 /* Return true if NODE should appear in the plugin symbol table. */
2329 bool
2330 output_symbol_p (symtab_node *node)
2332 struct cgraph_node *cnode;
2333 if (!symtab_real_symbol_p (node))
2334 return false;
2335 /* We keep external functions in symtab for sake of inlining
2336 and devirtualization. We do not want to see them in symbol table as
2337 references unless they are really used. */
2338 cnode = dyn_cast <cgraph_node *> (node);
2339 if (cnode && (!node->definition || DECL_EXTERNAL (cnode->decl))
2340 && cnode->callers)
2341 return true;
2343 /* Ignore all references from external vars initializers - they are not really
2344 part of the compilation unit until they are used by folding. Some symbols,
2345 like references to external construction vtables can not be referred to at all.
2346 We decide this at can_refer_decl_in_current_unit_p. */
2347 if (!node->definition || DECL_EXTERNAL (node->decl))
2349 int i;
2350 struct ipa_ref *ref;
2351 for (i = 0; node->iterate_referring (i, ref); i++)
2353 if (ref->use == IPA_REF_ALIAS)
2354 continue;
2355 if (is_a <cgraph_node *> (ref->referring))
2356 return true;
2357 if (!DECL_EXTERNAL (ref->referring->decl))
2358 return true;
2360 return false;
2362 return true;
2366 /* Write an IL symbol table to OB.
2367 SET and VSET are cgraph/varpool node sets we are outputting. */
2369 static void
2370 produce_symtab (struct output_block *ob)
2372 struct streamer_tree_cache_d *cache = ob->writer_cache;
2373 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
2374 struct pointer_set_t *seen;
2375 struct lto_output_stream stream;
2376 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2377 lto_symtab_encoder_iterator lsei;
2379 lto_begin_section (section_name, false);
2380 free (section_name);
2382 seen = pointer_set_create ();
2383 memset (&stream, 0, sizeof (stream));
2385 /* Write the symbol table.
2386 First write everything defined and then all declarations.
2387 This is necessary to handle cases where we have duplicated symbols. */
2388 for (lsei = lsei_start (encoder);
2389 !lsei_end_p (lsei); lsei_next (&lsei))
2391 symtab_node *node = lsei_node (lsei);
2393 if (!output_symbol_p (node) || DECL_EXTERNAL (node->decl))
2394 continue;
2395 write_symbol (cache, &stream, node->decl, seen, false);
2397 for (lsei = lsei_start (encoder);
2398 !lsei_end_p (lsei); lsei_next (&lsei))
2400 symtab_node *node = lsei_node (lsei);
2402 if (!output_symbol_p (node) || !DECL_EXTERNAL (node->decl))
2403 continue;
2404 write_symbol (cache, &stream, node->decl, seen, false);
2407 lto_write_stream (&stream);
2408 pointer_set_destroy (seen);
2410 lto_end_section ();
2414 /* This pass is run after all of the functions are serialized and all
2415 of the IPA passes have written their serialized forms. This pass
2416 causes the vector of all of the global decls and types used from
2417 this file to be written in to a section that can then be read in to
2418 recover these on other side. */
2420 void
2421 produce_asm_for_decls (void)
2423 struct lto_out_decl_state *out_state;
2424 struct lto_out_decl_state *fn_out_state;
2425 struct lto_decl_header header;
2426 char *section_name;
2427 struct output_block *ob;
2428 struct lto_output_stream *header_stream, *decl_state_stream;
2429 unsigned idx, num_fns;
2430 size_t decl_state_size;
2431 int32_t num_decl_states;
2433 ob = create_output_block (LTO_section_decls);
2434 ob->global = true;
2436 memset (&header, 0, sizeof (struct lto_decl_header));
2438 section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
2439 lto_begin_section (section_name, !flag_wpa);
2440 free (section_name);
2442 /* Make string 0 be a NULL string. */
2443 streamer_write_char_stream (ob->string_stream, 0);
2445 gcc_assert (!alias_pairs);
2447 /* Get rid of the global decl state hash tables to save some memory. */
2448 out_state = lto_get_out_decl_state ();
2449 for (int i = 0; i < LTO_N_DECL_STREAMS; i++)
2450 if (out_state->streams[i].tree_hash_table)
2452 delete out_state->streams[i].tree_hash_table;
2453 out_state->streams[i].tree_hash_table = NULL;
2456 /* Write the global symbols. */
2457 lto_output_decl_state_streams (ob, out_state);
2458 num_fns = lto_function_decl_states.length ();
2459 for (idx = 0; idx < num_fns; idx++)
2461 fn_out_state =
2462 lto_function_decl_states[idx];
2463 lto_output_decl_state_streams (ob, fn_out_state);
2466 header.lto_header.major_version = LTO_major_version;
2467 header.lto_header.minor_version = LTO_minor_version;
2469 /* Currently not used. This field would allow us to preallocate
2470 the globals vector, so that it need not be resized as it is extended. */
2471 header.num_nodes = -1;
2473 /* Compute the total size of all decl out states. */
2474 decl_state_size = sizeof (int32_t);
2475 decl_state_size += lto_out_decl_state_written_size (out_state);
2476 for (idx = 0; idx < num_fns; idx++)
2478 fn_out_state =
2479 lto_function_decl_states[idx];
2480 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2482 header.decl_state_size = decl_state_size;
2484 header.main_size = ob->main_stream->total_size;
2485 header.string_size = ob->string_stream->total_size;
2487 header_stream = XCNEW (struct lto_output_stream);
2488 lto_output_data_stream (header_stream, &header, sizeof header);
2489 lto_write_stream (header_stream);
2490 free (header_stream);
2492 /* Write the main out-decl state, followed by out-decl states of
2493 functions. */
2494 decl_state_stream = XCNEW (struct lto_output_stream);
2495 num_decl_states = num_fns + 1;
2496 lto_output_data_stream (decl_state_stream, &num_decl_states,
2497 sizeof (num_decl_states));
2498 lto_output_decl_state_refs (ob, decl_state_stream, out_state);
2499 for (idx = 0; idx < num_fns; idx++)
2501 fn_out_state =
2502 lto_function_decl_states[idx];
2503 lto_output_decl_state_refs (ob, decl_state_stream, fn_out_state);
2505 lto_write_stream (decl_state_stream);
2506 free (decl_state_stream);
2508 lto_write_stream (ob->main_stream);
2509 lto_write_stream (ob->string_stream);
2511 lto_end_section ();
2513 /* Write the symbol table. It is used by linker to determine dependencies
2514 and thus we can skip it for WPA. */
2515 if (!flag_wpa)
2516 produce_symtab (ob);
2518 /* Write command line opts. */
2519 lto_write_options ();
2521 /* Deallocate memory and clean up. */
2522 for (idx = 0; idx < num_fns; idx++)
2524 fn_out_state =
2525 lto_function_decl_states[idx];
2526 lto_delete_out_decl_state (fn_out_state);
2528 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
2529 lto_function_decl_states.release ();
2530 destroy_output_block (ob);