Remove a trivial assert (missed in previous checkin)
[official-gcc.git] / gcc / lto-streamer-out.c
blobdfcd135717939919d8da5a8a62b5b4787ee899e6
1 /* Write the GIMPLE representation to a file stream.
3 Copyright (C) 2009-2013 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 "expr.h"
29 #include "flags.h"
30 #include "params.h"
31 #include "input.h"
32 #include "hashtab.h"
33 #include "basic-block.h"
34 #include "tree-flow.h"
35 #include "tree-pass.h"
36 #include "cgraph.h"
37 #include "function.h"
38 #include "ggc.h"
39 #include "diagnostic-core.h"
40 #include "except.h"
41 #include "vec.h"
42 #include "lto-symtab.h"
43 #include "lto-streamer.h"
44 #include "data-streamer.h"
45 #include "gimple-streamer.h"
46 #include "tree-streamer.h"
47 #include "streamer-hooks.h"
48 #include "cfgloop.h"
51 /* Clear the line info stored in DATA_IN. */
53 static void
54 clear_line_info (struct output_block *ob)
56 ob->current_file = NULL;
57 ob->current_line = 0;
58 ob->current_col = 0;
62 /* Create the output block and return it. SECTION_TYPE is
63 LTO_section_function_body or LTO_static_initializer. */
65 struct output_block *
66 create_output_block (enum lto_section_type section_type)
68 struct output_block *ob = XCNEW (struct output_block);
70 ob->section_type = section_type;
71 ob->decl_state = lto_get_out_decl_state ();
72 ob->main_stream = XCNEW (struct lto_output_stream);
73 ob->string_stream = XCNEW (struct lto_output_stream);
74 ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true);
76 if (section_type == LTO_section_function_body)
77 ob->cfg_stream = XCNEW (struct lto_output_stream);
79 clear_line_info (ob);
81 ob->string_hash_table.create (37);
82 gcc_obstack_init (&ob->obstack);
84 return ob;
88 /* Destroy the output block OB. */
90 void
91 destroy_output_block (struct output_block *ob)
93 enum lto_section_type section_type = ob->section_type;
95 ob->string_hash_table.dispose ();
97 free (ob->main_stream);
98 free (ob->string_stream);
99 if (section_type == LTO_section_function_body)
100 free (ob->cfg_stream);
102 streamer_tree_cache_delete (ob->writer_cache);
103 obstack_free (&ob->obstack, NULL);
105 free (ob);
109 /* Look up NODE in the type table and write the index for it to OB. */
111 static void
112 output_type_ref (struct output_block *ob, tree node)
114 streamer_write_record_start (ob, LTO_type_ref);
115 lto_output_type_ref_index (ob->decl_state, ob->main_stream, node);
119 /* Return true if tree node T is written to various tables. For these
120 nodes, we sometimes want to write their phyiscal representation
121 (via lto_output_tree), and sometimes we need to emit an index
122 reference into a table (via lto_output_tree_ref). */
124 static bool
125 tree_is_indexable (tree t)
127 if (TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
128 return false;
129 else if (TREE_CODE (t) == VAR_DECL && decl_function_context (t)
130 && !TREE_STATIC (t))
131 return false;
132 else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
133 return false;
134 /* Variably modified types need to be streamed alongside function
135 bodies because they can refer to local entities. Together with
136 them we have to localize their members as well.
137 ??? In theory that includes non-FIELD_DECLs as well. */
138 else if (TYPE_P (t)
139 && variably_modified_type_p (t, NULL_TREE))
140 return false;
141 else if (TREE_CODE (t) == FIELD_DECL
142 && variably_modified_type_p (DECL_CONTEXT (t), NULL_TREE))
143 return false;
144 else
145 return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
149 /* Output info about new location into bitpack BP.
150 After outputting bitpack, lto_output_location_data has
151 to be done to output actual data. */
153 void
154 lto_output_location (struct output_block *ob, struct bitpack_d *bp,
155 location_t loc)
157 expanded_location xloc;
159 loc = LOCATION_LOCUS (loc);
160 bp_pack_value (bp, loc == UNKNOWN_LOCATION, 1);
161 if (loc == UNKNOWN_LOCATION)
162 return;
164 xloc = expand_location (loc);
166 bp_pack_value (bp, ob->current_file != xloc.file, 1);
167 bp_pack_value (bp, ob->current_line != xloc.line, 1);
168 bp_pack_value (bp, ob->current_col != xloc.column, 1);
170 if (ob->current_file != xloc.file)
171 bp_pack_var_len_unsigned (bp,
172 streamer_string_index (ob, xloc.file,
173 strlen (xloc.file) + 1,
174 true));
175 ob->current_file = xloc.file;
177 if (ob->current_line != xloc.line)
178 bp_pack_var_len_unsigned (bp, xloc.line);
179 ob->current_line = xloc.line;
181 if (ob->current_col != xloc.column)
182 bp_pack_var_len_unsigned (bp, xloc.column);
183 ob->current_col = xloc.column;
187 /* If EXPR is an indexable tree node, output a reference to it to
188 output block OB. Otherwise, output the physical representation of
189 EXPR to OB. */
191 static void
192 lto_output_tree_ref (struct output_block *ob, tree expr)
194 enum tree_code code;
196 if (TYPE_P (expr))
198 output_type_ref (ob, expr);
199 return;
202 code = TREE_CODE (expr);
203 switch (code)
205 case SSA_NAME:
206 streamer_write_record_start (ob, LTO_ssa_name_ref);
207 streamer_write_uhwi (ob, SSA_NAME_VERSION (expr));
208 break;
210 case FIELD_DECL:
211 streamer_write_record_start (ob, LTO_field_decl_ref);
212 lto_output_field_decl_index (ob->decl_state, ob->main_stream, expr);
213 break;
215 case FUNCTION_DECL:
216 streamer_write_record_start (ob, LTO_function_decl_ref);
217 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, expr);
218 break;
220 case VAR_DECL:
221 case DEBUG_EXPR_DECL:
222 gcc_assert (decl_function_context (expr) == NULL || TREE_STATIC (expr));
223 case PARM_DECL:
224 streamer_write_record_start (ob, LTO_global_decl_ref);
225 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
226 break;
228 case CONST_DECL:
229 streamer_write_record_start (ob, LTO_const_decl_ref);
230 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
231 break;
233 case IMPORTED_DECL:
234 gcc_assert (decl_function_context (expr) == NULL);
235 streamer_write_record_start (ob, LTO_imported_decl_ref);
236 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
237 break;
239 case TYPE_DECL:
240 streamer_write_record_start (ob, LTO_type_decl_ref);
241 lto_output_type_decl_index (ob->decl_state, ob->main_stream, expr);
242 break;
244 case NAMESPACE_DECL:
245 streamer_write_record_start (ob, LTO_namespace_decl_ref);
246 lto_output_namespace_decl_index (ob->decl_state, ob->main_stream, expr);
247 break;
249 case LABEL_DECL:
250 streamer_write_record_start (ob, LTO_label_decl_ref);
251 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
252 break;
254 case RESULT_DECL:
255 streamer_write_record_start (ob, LTO_result_decl_ref);
256 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
257 break;
259 case TRANSLATION_UNIT_DECL:
260 streamer_write_record_start (ob, LTO_translation_unit_decl_ref);
261 lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
262 break;
264 default:
265 /* No other node is indexable, so it should have been handled by
266 lto_output_tree. */
267 gcc_unreachable ();
272 /* Return true if EXPR is a tree node that can be written to disk. */
274 static inline bool
275 lto_is_streamable (tree expr)
277 enum tree_code code = TREE_CODE (expr);
279 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
280 name version in lto_output_tree_ref (see output_ssa_names). */
281 return !is_lang_specific (expr)
282 && code != SSA_NAME
283 && code != CALL_EXPR
284 && code != LANG_TYPE
285 && code != MODIFY_EXPR
286 && code != INIT_EXPR
287 && code != TARGET_EXPR
288 && code != BIND_EXPR
289 && code != WITH_CLEANUP_EXPR
290 && code != STATEMENT_LIST
291 && code != OMP_CLAUSE
292 && (code == CASE_LABEL_EXPR
293 || code == DECL_EXPR
294 || TREE_CODE_CLASS (code) != tcc_statement);
298 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
300 static tree
301 get_symbol_initial_value (struct output_block *ob, tree expr)
303 gcc_checking_assert (DECL_P (expr)
304 && TREE_CODE (expr) != FUNCTION_DECL
305 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL);
307 /* Handle DECL_INITIAL for symbols. */
308 tree initial = DECL_INITIAL (expr);
309 if (TREE_CODE (expr) == VAR_DECL
310 && (TREE_STATIC (expr) || DECL_EXTERNAL (expr))
311 && !DECL_IN_CONSTANT_POOL (expr)
312 && initial)
314 lto_symtab_encoder_t encoder;
315 struct varpool_node *vnode;
317 encoder = ob->decl_state->symtab_node_encoder;
318 vnode = varpool_get_node (expr);
319 if (!vnode
320 || !lto_symtab_encoder_encode_initializer_p (encoder,
321 vnode))
322 initial = error_mark_node;
325 return initial;
329 /* Write a physical representation of tree node EXPR to output block
330 OB. If REF_P is true, the leaves of EXPR are emitted as references
331 via lto_output_tree_ref. IX is the index into the streamer cache
332 where EXPR is stored. */
334 static void
335 lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p)
337 /* Pack all the non-pointer fields in EXPR into a bitpack and write
338 the resulting bitpack. */
339 bitpack_d bp = bitpack_create (ob->main_stream);
340 streamer_pack_tree_bitfields (ob, &bp, expr);
341 streamer_write_bitpack (&bp);
343 /* Write all the pointer fields in EXPR. */
344 streamer_write_tree_body (ob, expr, ref_p);
346 /* Write any LTO-specific data to OB. */
347 if (DECL_P (expr)
348 && TREE_CODE (expr) != FUNCTION_DECL
349 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
351 /* Handle DECL_INITIAL for symbols. */
352 tree initial = get_symbol_initial_value (ob, expr);
353 stream_write_tree (ob, initial, ref_p);
357 /* Write a physical representation of tree node EXPR to output block
358 OB. If REF_P is true, the leaves of EXPR are emitted as references
359 via lto_output_tree_ref. IX is the index into the streamer cache
360 where EXPR is stored. */
362 static void
363 lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
365 if (!lto_is_streamable (expr))
366 internal_error ("tree code %qs is not supported in LTO streams",
367 tree_code_name[TREE_CODE (expr)]);
369 /* Write the header, containing everything needed to materialize
370 EXPR on the reading side. */
371 streamer_write_tree_header (ob, expr);
373 lto_write_tree_1 (ob, expr, ref_p);
375 /* Mark the end of EXPR. */
376 streamer_write_zero (ob);
379 /* Emit the physical representation of tree node EXPR to output block
380 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
381 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
383 static void
384 lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
385 bool ref_p, bool this_ref_p)
387 unsigned ix;
389 gcc_checking_assert (expr != NULL_TREE
390 && !(this_ref_p && tree_is_indexable (expr)));
392 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
393 expr, hash, &ix);
394 gcc_assert (!exists_p);
395 if (streamer_handle_as_builtin_p (expr))
397 /* MD and NORMAL builtins do not need to be written out
398 completely as they are always instantiated by the
399 compiler on startup. The only builtins that need to
400 be written out are BUILT_IN_FRONTEND. For all other
401 builtins, we simply write the class and code. */
402 streamer_write_builtin (ob, expr);
404 else if (TREE_CODE (expr) == INTEGER_CST
405 && !TREE_OVERFLOW (expr))
407 /* Shared INTEGER_CST nodes are special because they need their
408 original type to be materialized by the reader (to implement
409 TYPE_CACHED_VALUES). */
410 streamer_write_integer_cst (ob, expr, ref_p);
412 else
414 /* This is the first time we see EXPR, write its fields
415 to OB. */
416 lto_write_tree (ob, expr, ref_p);
420 struct sccs
422 unsigned int dfsnum;
423 unsigned int low;
426 struct scc_entry
428 tree t;
429 hashval_t hash;
432 static unsigned int next_dfs_num;
433 static vec<scc_entry> sccstack;
434 static struct pointer_map_t *sccstate;
435 static struct obstack sccstate_obstack;
437 static void
438 DFS_write_tree (struct output_block *ob, sccs *from_state,
439 tree expr, bool ref_p, bool this_ref_p);
441 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
442 DFS recurse for all tree edges originating from it. */
444 static void
445 DFS_write_tree_body (struct output_block *ob,
446 tree expr, sccs *expr_state, bool ref_p)
448 #define DFS_follow_tree_edge(DEST) \
449 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
451 enum tree_code code;
453 code = TREE_CODE (expr);
455 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
457 if (TREE_CODE (expr) != IDENTIFIER_NODE)
458 DFS_follow_tree_edge (TREE_TYPE (expr));
461 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
463 for (unsigned i = 0; i < VECTOR_CST_NELTS (expr); ++i)
464 DFS_follow_tree_edge (VECTOR_CST_ELT (expr, i));
467 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
469 DFS_follow_tree_edge (TREE_REALPART (expr));
470 DFS_follow_tree_edge (TREE_IMAGPART (expr));
473 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
475 /* Drop names that were created for anonymous entities. */
476 if (DECL_NAME (expr)
477 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
478 && ANON_AGGRNAME_P (DECL_NAME (expr)))
480 else
481 DFS_follow_tree_edge (DECL_NAME (expr));
482 DFS_follow_tree_edge (DECL_CONTEXT (expr));
485 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
487 DFS_follow_tree_edge (DECL_SIZE (expr));
488 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr));
490 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
491 special handling in LTO, it must be handled by streamer hooks. */
493 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr));
495 /* Do not follow DECL_ABSTRACT_ORIGIN. We cannot handle debug information
496 for early inlining so drop it on the floor instead of ICEing in
497 dwarf2out.c. */
499 if ((TREE_CODE (expr) == VAR_DECL
500 || TREE_CODE (expr) == PARM_DECL)
501 && DECL_HAS_VALUE_EXPR_P (expr))
502 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr));
503 if (TREE_CODE (expr) == VAR_DECL)
504 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
507 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
509 if (TREE_CODE (expr) == TYPE_DECL)
510 DFS_follow_tree_edge (DECL_ORIGINAL_TYPE (expr));
511 DFS_follow_tree_edge (DECL_VINDEX (expr));
514 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
516 /* Make sure we don't inadvertently set the assembler name. */
517 if (DECL_ASSEMBLER_NAME_SET_P (expr))
518 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr));
519 DFS_follow_tree_edge (DECL_SECTION_NAME (expr));
520 DFS_follow_tree_edge (DECL_COMDAT_GROUP (expr));
523 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
525 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr));
526 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr));
527 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr));
528 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr));
529 DFS_follow_tree_edge (DECL_FCONTEXT (expr));
532 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
534 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
535 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr));
536 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
539 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
541 DFS_follow_tree_edge (TYPE_SIZE (expr));
542 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr));
543 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr));
544 DFS_follow_tree_edge (TYPE_NAME (expr));
545 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
546 reconstructed during fixup. */
547 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
548 during fixup. */
549 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr));
550 DFS_follow_tree_edge (TYPE_CONTEXT (expr));
551 /* TYPE_CANONICAL is re-computed during type merging, so no need
552 to follow it here. */
553 DFS_follow_tree_edge (TYPE_STUB_DECL (expr));
556 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
558 if (TREE_CODE (expr) == ENUMERAL_TYPE)
559 DFS_follow_tree_edge (TYPE_VALUES (expr));
560 else if (TREE_CODE (expr) == ARRAY_TYPE)
561 DFS_follow_tree_edge (TYPE_DOMAIN (expr));
562 else if (RECORD_OR_UNION_TYPE_P (expr))
563 for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t))
564 DFS_follow_tree_edge (t);
565 else if (TREE_CODE (expr) == FUNCTION_TYPE
566 || TREE_CODE (expr) == METHOD_TYPE)
567 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr));
569 if (!POINTER_TYPE_P (expr))
570 DFS_follow_tree_edge (TYPE_MINVAL (expr));
571 DFS_follow_tree_edge (TYPE_MAXVAL (expr));
572 if (RECORD_OR_UNION_TYPE_P (expr))
573 DFS_follow_tree_edge (TYPE_BINFO (expr));
576 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
578 DFS_follow_tree_edge (TREE_PURPOSE (expr));
579 DFS_follow_tree_edge (TREE_VALUE (expr));
580 DFS_follow_tree_edge (TREE_CHAIN (expr));
583 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
585 for (int i = 0; i < TREE_VEC_LENGTH (expr); i++)
586 DFS_follow_tree_edge (TREE_VEC_ELT (expr, i));
589 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
591 for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
592 DFS_follow_tree_edge (TREE_OPERAND (expr, i));
593 DFS_follow_tree_edge (TREE_BLOCK (expr));
596 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
598 for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
599 /* ??? FIXME. See also streamer_write_chain. */
600 if (!(VAR_OR_FUNCTION_DECL_P (t)
601 && DECL_EXTERNAL (t)))
602 DFS_follow_tree_edge (t);
604 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
606 /* Follow BLOCK_ABSTRACT_ORIGIN for the limited cases we can
607 handle - those that represent inlined function scopes.
608 For the drop rest them on the floor instead of ICEing
609 in dwarf2out.c. */
610 if (inlined_function_outer_scope_p (expr))
612 tree ultimate_origin = block_ultimate_origin (expr);
613 DFS_follow_tree_edge (ultimate_origin);
615 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
616 information for early inlined BLOCKs so drop it on the floor instead
617 of ICEing in dwarf2out.c. */
619 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
620 streaming time. */
622 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
623 list is re-constructed from BLOCK_SUPERCONTEXT. */
626 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
628 unsigned i;
629 tree t;
631 /* Note that the number of BINFO slots has already been emitted in
632 EXPR's header (see streamer_write_tree_header) because this length
633 is needed to build the empty BINFO node on the reader side. */
634 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
635 DFS_follow_tree_edge (t);
636 DFS_follow_tree_edge (BINFO_OFFSET (expr));
637 DFS_follow_tree_edge (BINFO_VTABLE (expr));
638 DFS_follow_tree_edge (BINFO_VPTR_FIELD (expr));
640 /* The number of BINFO_BASE_ACCESSES has already been emitted in
641 EXPR's bitfield section. */
642 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
643 DFS_follow_tree_edge (t);
645 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
646 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
649 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
651 unsigned i;
652 tree index, value;
654 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
656 DFS_follow_tree_edge (index);
657 DFS_follow_tree_edge (value);
661 #undef DFS_follow_tree_edge
664 /* Return a hash value for the tree T. */
666 static hashval_t
667 hash_tree (struct streamer_tree_cache_d *cache, tree t)
669 #define visit(SIBLING) \
670 do { \
671 unsigned ix; \
672 if (SIBLING && streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
673 v = iterative_hash_hashval_t (streamer_tree_cache_get_hash (cache, ix), v); \
674 } while (0)
676 /* Hash TS_BASE. */
677 enum tree_code code = TREE_CODE (t);
678 hashval_t v = iterative_hash_host_wide_int (code, 0);
679 if (!TYPE_P (t))
681 v = iterative_hash_host_wide_int (TREE_SIDE_EFFECTS (t)
682 | (TREE_CONSTANT (t) << 1)
683 | (TREE_READONLY (t) << 2)
684 | (TREE_PUBLIC (t) << 3), v);
686 v = iterative_hash_host_wide_int (TREE_ADDRESSABLE (t)
687 | (TREE_THIS_VOLATILE (t) << 1), v);
688 if (DECL_P (t))
689 v = iterative_hash_host_wide_int (DECL_UNSIGNED (t), v);
690 else if (TYPE_P (t))
691 v = iterative_hash_host_wide_int (TYPE_UNSIGNED (t), v);
692 if (TYPE_P (t))
693 v = iterative_hash_host_wide_int (TYPE_ARTIFICIAL (t), v);
694 else
695 v = iterative_hash_host_wide_int (TREE_NO_WARNING (t), v);
696 v = iterative_hash_host_wide_int (TREE_NOTHROW (t)
697 | (TREE_STATIC (t) << 1)
698 | (TREE_PROTECTED (t) << 2)
699 | (TREE_DEPRECATED (t) << 3), v);
700 if (code != TREE_BINFO)
701 v = iterative_hash_host_wide_int (TREE_PRIVATE (t), v);
702 if (TYPE_P (t))
703 v = iterative_hash_host_wide_int (TYPE_SATURATING (t)
704 | (TYPE_ADDR_SPACE (t) << 1), v);
705 else if (code == SSA_NAME)
706 v = iterative_hash_host_wide_int (SSA_NAME_IS_DEFAULT_DEF (t), v);
708 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
710 v = iterative_hash_host_wide_int (TREE_INT_CST_LOW (t), v);
711 v = iterative_hash_host_wide_int (TREE_INT_CST_HIGH (t), v);
714 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
716 REAL_VALUE_TYPE r = TREE_REAL_CST (t);
717 v = iterative_hash_host_wide_int (r.cl, v);
718 v = iterative_hash_host_wide_int (r.decimal
719 | (r.sign << 1)
720 | (r.signalling << 2)
721 | (r.canonical << 3), v);
722 v = iterative_hash_host_wide_int (r.uexp, v);
723 for (unsigned i = 0; i < SIGSZ; ++i)
724 v = iterative_hash_host_wide_int (r.sig[i], v);
727 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
729 FIXED_VALUE_TYPE f = TREE_FIXED_CST (t);
730 v = iterative_hash_host_wide_int (f.mode, v);
731 v = iterative_hash_host_wide_int (f.data.low, v);
732 v = iterative_hash_host_wide_int (f.data.high, v);
735 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
737 v = iterative_hash_host_wide_int (DECL_MODE (t), v);
738 v = iterative_hash_host_wide_int (DECL_NONLOCAL (t)
739 | (DECL_VIRTUAL_P (t) << 1)
740 | (DECL_IGNORED_P (t) << 2)
741 | (DECL_ABSTRACT (t) << 3)
742 | (DECL_ARTIFICIAL (t) << 4)
743 | (DECL_USER_ALIGN (t) << 5)
744 | (DECL_PRESERVE_P (t) << 6)
745 | (DECL_EXTERNAL (t) << 7)
746 | (DECL_GIMPLE_REG_P (t) << 8), v);
747 v = iterative_hash_host_wide_int (DECL_ALIGN (t), v);
748 if (code == LABEL_DECL)
750 v = iterative_hash_host_wide_int (EH_LANDING_PAD_NR (t), v);
751 v = iterative_hash_host_wide_int (LABEL_DECL_UID (t), v);
753 else if (code == FIELD_DECL)
755 v = iterative_hash_host_wide_int (DECL_PACKED (t)
756 | (DECL_NONADDRESSABLE_P (t) << 1),
758 v = iterative_hash_host_wide_int (DECL_OFFSET_ALIGN (t), v);
760 else if (code == VAR_DECL)
762 v = iterative_hash_host_wide_int (DECL_HAS_DEBUG_EXPR_P (t)
763 | (DECL_NONLOCAL_FRAME (t) << 1),
766 if (code == RESULT_DECL
767 || code == PARM_DECL
768 || code == VAR_DECL)
770 v = iterative_hash_host_wide_int (DECL_BY_REFERENCE (t), v);
771 if (code == VAR_DECL
772 || code == PARM_DECL)
773 v = iterative_hash_host_wide_int (DECL_HAS_VALUE_EXPR_P (t), v);
777 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
778 v = iterative_hash_host_wide_int (DECL_REGISTER (t), v);
780 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
782 v = iterative_hash_host_wide_int ((DECL_COMMON (t))
783 | (DECL_DLLIMPORT_P (t) << 1)
784 | (DECL_WEAK (t) << 2)
785 | (DECL_SEEN_IN_BIND_EXPR_P (t) << 3)
786 | (DECL_COMDAT (t) << 4)
787 | (DECL_VISIBILITY_SPECIFIED (t) << 6),
789 v = iterative_hash_host_wide_int (DECL_VISIBILITY (t), v);
790 if (code == VAR_DECL)
792 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
793 v = iterative_hash_host_wide_int (DECL_HARD_REGISTER (t)
794 | (DECL_IN_CONSTANT_POOL (t) << 1),
796 v = iterative_hash_host_wide_int (DECL_TLS_MODEL (t), v);
798 if (TREE_CODE (t) == FUNCTION_DECL)
799 v = iterative_hash_host_wide_int (DECL_FINAL_P (t)
800 | (DECL_CXX_CONSTRUCTOR_P (t) << 1)
801 | (DECL_CXX_DESTRUCTOR_P (t) << 2),
803 if (VAR_OR_FUNCTION_DECL_P (t))
804 v = iterative_hash_host_wide_int (DECL_INIT_PRIORITY (t), v);
807 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
809 v = iterative_hash_host_wide_int (DECL_BUILT_IN_CLASS (t), v);
810 v = iterative_hash_host_wide_int (DECL_STATIC_CONSTRUCTOR (t)
811 | (DECL_STATIC_DESTRUCTOR (t) << 1)
812 | (DECL_UNINLINABLE (t) << 2)
813 | (DECL_POSSIBLY_INLINED (t) << 3)
814 | (DECL_IS_NOVOPS (t) << 4)
815 | (DECL_IS_RETURNS_TWICE (t) << 5)
816 | (DECL_IS_MALLOC (t) << 6)
817 | (DECL_IS_OPERATOR_NEW (t) << 7)
818 | (DECL_DECLARED_INLINE_P (t) << 8)
819 | (DECL_STATIC_CHAIN (t) << 9)
820 | (DECL_NO_INLINE_WARNING_P (t) << 10)
821 | (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t) << 11)
822 | (DECL_NO_LIMIT_STACK (t) << 12)
823 | (DECL_DISREGARD_INLINE_LIMITS (t) << 13)
824 | (DECL_PURE_P (t) << 14)
825 | (DECL_LOOPING_CONST_OR_PURE_P (t) << 15), v);
826 if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
827 v = iterative_hash_host_wide_int (DECL_FUNCTION_CODE (t), v);
828 if (DECL_STATIC_DESTRUCTOR (t))
829 v = iterative_hash_host_wide_int (DECL_FINI_PRIORITY (t), v);
832 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
834 v = iterative_hash_host_wide_int (TYPE_MODE (t), v);
835 v = iterative_hash_host_wide_int (TYPE_STRING_FLAG (t)
836 | (TYPE_NO_FORCE_BLK (t) << 1)
837 | (TYPE_NEEDS_CONSTRUCTING (t) << 2)
838 | (TYPE_PACKED (t) << 3)
839 | (TYPE_RESTRICT (t) << 4)
840 | (TYPE_USER_ALIGN (t) << 5)
841 | (TYPE_READONLY (t) << 6), v);
842 if (RECORD_OR_UNION_TYPE_P (t))
844 v = iterative_hash_host_wide_int (TYPE_TRANSPARENT_AGGR (t)
845 | (TYPE_FINAL_P (t) << 1), v);
847 else if (code == ARRAY_TYPE)
848 v = iterative_hash_host_wide_int (TYPE_NONALIASED_COMPONENT (t), v);
849 v = iterative_hash_host_wide_int (TYPE_PRECISION (t), v);
850 v = iterative_hash_host_wide_int (TYPE_ALIGN (t), v);
851 v = iterative_hash_host_wide_int ((TYPE_ALIAS_SET (t) == 0
852 || (!in_lto_p
853 && get_alias_set (t) == 0))
854 ? 0 : -1, v);
857 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
858 v = iterative_hash (TRANSLATION_UNIT_LANGUAGE (t),
859 strlen (TRANSLATION_UNIT_LANGUAGE (t)), v);
861 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
862 v = iterative_hash (t, sizeof (struct cl_target_option), v);
864 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
865 v = iterative_hash (t, sizeof (struct cl_optimization), v);
867 if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
868 v = iterative_hash_host_wide_int (IDENTIFIER_HASH_VALUE (t), v);
870 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
871 v = iterative_hash (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t), v);
873 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
875 if (POINTER_TYPE_P (t))
877 /* For pointers factor in the pointed-to type recursively as
878 we cannot recurse through only pointers.
879 ??? We can generalize this by keeping track of the
880 in-SCC edges for each tree (or arbitrarily the first
881 such edge) and hashing that in in a second stage
882 (instead of the quadratic mixing of the SCC we do now). */
883 hashval_t x;
884 unsigned ix;
885 if (streamer_tree_cache_lookup (cache, TREE_TYPE (t), &ix))
886 x = streamer_tree_cache_get_hash (cache, ix);
887 else
888 x = hash_tree (cache, TREE_TYPE (t));
889 v = iterative_hash_hashval_t (x, v);
891 else if (code != IDENTIFIER_NODE)
892 visit (TREE_TYPE (t));
895 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
896 for (unsigned i = 0; i < VECTOR_CST_NELTS (t); ++i)
897 visit (VECTOR_CST_ELT (t, i));
899 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
901 visit (TREE_REALPART (t));
902 visit (TREE_IMAGPART (t));
905 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
907 /* Drop names that were created for anonymous entities. */
908 if (DECL_NAME (t)
909 && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE
910 && ANON_AGGRNAME_P (DECL_NAME (t)))
912 else
913 visit (DECL_NAME (t));
914 if (DECL_FILE_SCOPE_P (t))
916 else
917 visit (DECL_CONTEXT (t));
920 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
922 visit (DECL_SIZE (t));
923 visit (DECL_SIZE_UNIT (t));
924 visit (DECL_ATTRIBUTES (t));
925 if ((code == VAR_DECL
926 || code == PARM_DECL)
927 && DECL_HAS_VALUE_EXPR_P (t))
928 visit (DECL_VALUE_EXPR (t));
929 if (code == VAR_DECL
930 && DECL_HAS_DEBUG_EXPR_P (t))
931 visit (DECL_DEBUG_EXPR (t));
932 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
933 be able to call get_symbol_initial_value. */
936 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
938 if (code == TYPE_DECL)
939 visit (DECL_ORIGINAL_TYPE (t));
940 visit (DECL_VINDEX (t));
943 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
945 if (DECL_ASSEMBLER_NAME_SET_P (t))
946 visit (DECL_ASSEMBLER_NAME (t));
947 visit (DECL_SECTION_NAME (t));
948 visit (DECL_COMDAT_GROUP (t));
951 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
953 visit (DECL_FIELD_OFFSET (t));
954 visit (DECL_BIT_FIELD_TYPE (t));
955 visit (DECL_BIT_FIELD_REPRESENTATIVE (t));
956 visit (DECL_FIELD_BIT_OFFSET (t));
957 visit (DECL_FCONTEXT (t));
960 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
962 visit (DECL_FUNCTION_PERSONALITY (t));
963 visit (DECL_FUNCTION_SPECIFIC_TARGET (t));
964 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
967 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
969 visit (TYPE_SIZE (t));
970 visit (TYPE_SIZE_UNIT (t));
971 visit (TYPE_ATTRIBUTES (t));
972 visit (TYPE_NAME (t));
973 visit (TYPE_MAIN_VARIANT (t));
974 if (TYPE_FILE_SCOPE_P (t))
976 else
977 visit (TYPE_CONTEXT (t));
978 visit (TYPE_STUB_DECL (t));
981 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
983 if (code == ENUMERAL_TYPE)
984 visit (TYPE_VALUES (t));
985 else if (code == ARRAY_TYPE)
986 visit (TYPE_DOMAIN (t));
987 else if (RECORD_OR_UNION_TYPE_P (t))
988 for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
989 visit (f);
990 else if (code == FUNCTION_TYPE
991 || code == METHOD_TYPE)
992 visit (TYPE_ARG_TYPES (t));
993 if (!POINTER_TYPE_P (t))
994 visit (TYPE_MINVAL (t));
995 visit (TYPE_MAXVAL (t));
996 if (RECORD_OR_UNION_TYPE_P (t))
997 visit (TYPE_BINFO (t));
1000 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1002 visit (TREE_PURPOSE (t));
1003 visit (TREE_VALUE (t));
1004 visit (TREE_CHAIN (t));
1007 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1008 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
1009 visit (TREE_VEC_ELT (t, i));
1011 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1013 v = iterative_hash_host_wide_int (TREE_OPERAND_LENGTH (t), v);
1014 for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i)
1015 visit (TREE_OPERAND (t, i));
1018 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1020 unsigned i;
1021 tree b;
1022 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b)
1023 visit (b);
1024 visit (BINFO_OFFSET (t));
1025 visit (BINFO_VTABLE (t));
1026 visit (BINFO_VPTR_FIELD (t));
1027 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t), i, b)
1028 visit (b);
1029 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1030 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
1033 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1035 unsigned i;
1036 tree index, value;
1037 v = iterative_hash_host_wide_int (CONSTRUCTOR_NELTS (t), v);
1038 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
1040 visit (index);
1041 visit (value);
1045 return v;
1047 #undef visit
1050 /* Compare two SCC entries by their hash value for qsorting them. */
1052 static int
1053 scc_entry_compare (const void *p1_, const void *p2_)
1055 const scc_entry *p1 = (const scc_entry *) p1_;
1056 const scc_entry *p2 = (const scc_entry *) p2_;
1057 if (p1->hash < p2->hash)
1058 return -1;
1059 else if (p1->hash > p2->hash)
1060 return 1;
1061 return 0;
1064 /* Return a hash value for the SCC on the SCC stack from FIRST with
1065 size SIZE. */
1067 static hashval_t
1068 hash_scc (struct streamer_tree_cache_d *cache, unsigned first, unsigned size)
1070 /* Compute hash values for the SCC members. */
1071 for (unsigned i = 0; i < size; ++i)
1072 sccstack[first+i].hash = hash_tree (cache, sccstack[first+i].t);
1074 if (size == 1)
1075 return sccstack[first].hash;
1077 /* Sort the SCC of type, hash pairs so that when we mix in
1078 all members of the SCC the hash value becomes independent on
1079 the order we visited the SCC. Disregard hashes equal to
1080 the hash of the tree we mix into because we cannot guarantee
1081 a stable sort for those across different TUs. */
1082 qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare);
1083 hashval_t *tem = XALLOCAVEC (hashval_t, size);
1084 for (unsigned i = 0; i < size; ++i)
1086 hashval_t hash = sccstack[first+i].hash;
1087 hashval_t orig_hash = hash;
1088 unsigned j;
1089 /* Skip same hashes. */
1090 for (j = i + 1;
1091 j < size && sccstack[first+j].hash == orig_hash; ++j)
1093 for (; j < size; ++j)
1094 hash = iterative_hash_hashval_t (sccstack[first+j].hash, hash);
1095 for (j = 0; sccstack[first+j].hash != orig_hash; ++j)
1096 hash = iterative_hash_hashval_t (sccstack[first+j].hash, hash);
1097 tem[i] = hash;
1099 hashval_t scc_hash = 0;
1100 for (unsigned i = 0; i < size; ++i)
1102 sccstack[first+i].hash = tem[i];
1103 scc_hash = iterative_hash_hashval_t (tem[i], scc_hash);
1105 return scc_hash;
1108 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1109 already in the streamer cache. Main routine called for
1110 each visit of EXPR. */
1112 static void
1113 DFS_write_tree (struct output_block *ob, sccs *from_state,
1114 tree expr, bool ref_p, bool this_ref_p)
1116 unsigned ix;
1117 sccs **slot;
1119 /* Handle special cases. */
1120 if (expr == NULL_TREE)
1121 return;
1123 /* Do not DFS walk into indexable trees. */
1124 if (this_ref_p && tree_is_indexable (expr))
1125 return;
1127 /* Check if we already streamed EXPR. */
1128 if (streamer_tree_cache_lookup (ob->writer_cache, expr, &ix))
1129 return;
1131 slot = (sccs **)pointer_map_insert (sccstate, expr);
1132 sccs *cstate = *slot;
1133 if (!cstate)
1135 scc_entry e = { expr, 0 };
1136 /* Not yet visited. DFS recurse and push it onto the stack. */
1137 *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs);
1138 sccstack.safe_push (e);
1139 cstate->dfsnum = next_dfs_num++;
1140 cstate->low = cstate->dfsnum;
1142 if (streamer_handle_as_builtin_p (expr))
1144 else if (TREE_CODE (expr) == INTEGER_CST
1145 && !TREE_OVERFLOW (expr))
1146 DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
1147 else
1149 DFS_write_tree_body (ob, expr, cstate, ref_p);
1151 /* Walk any LTO-specific edges. */
1152 if (DECL_P (expr)
1153 && TREE_CODE (expr) != FUNCTION_DECL
1154 && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
1156 /* Handle DECL_INITIAL for symbols. */
1157 tree initial = get_symbol_initial_value (ob, expr);
1158 DFS_write_tree (ob, cstate, initial, ref_p, ref_p);
1162 /* See if we found an SCC. */
1163 if (cstate->low == cstate->dfsnum)
1165 unsigned first, size;
1166 tree x;
1168 /* Pop the SCC and compute its size. */
1169 first = sccstack.length ();
1172 x = sccstack[--first].t;
1174 while (x != expr);
1175 size = sccstack.length () - first;
1177 /* No need to compute hashes for LTRANS units, we don't perform
1178 any merging there. */
1179 hashval_t scc_hash = 0;
1180 unsigned scc_entry_len = 0;
1181 if (!flag_wpa)
1183 scc_hash = hash_scc (ob->writer_cache, first, size);
1185 /* Put the entries with the least number of collisions first. */
1186 unsigned entry_start = 0;
1187 scc_entry_len = size + 1;
1188 for (unsigned i = 0; i < size;)
1190 unsigned from = i;
1191 for (i = i + 1; i < size
1192 && (sccstack[first + i].hash
1193 == sccstack[first + from].hash); ++i)
1195 if (i - from < scc_entry_len)
1197 scc_entry_len = i - from;
1198 entry_start = from;
1201 for (unsigned i = 0; i < scc_entry_len; ++i)
1203 scc_entry tem = sccstack[first + i];
1204 sccstack[first + i] = sccstack[first + entry_start + i];
1205 sccstack[first + entry_start + i] = tem;
1209 /* Write LTO_tree_scc. */
1210 streamer_write_record_start (ob, LTO_tree_scc);
1211 streamer_write_uhwi (ob, size);
1212 streamer_write_uhwi (ob, scc_hash);
1214 /* Write size-1 SCCs without wrapping them inside SCC bundles.
1215 All INTEGER_CSTs need to be handled this way as we need
1216 their type to materialize them. Also builtins are handled
1217 this way.
1218 ??? We still wrap these in LTO_tree_scc so at the
1219 input side we can properly identify the tree we want
1220 to ultimatively return. */
1221 size_t old_len = ob->writer_cache->nodes.length ();
1222 if (size == 1)
1223 lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p);
1224 else
1226 /* Write the size of the SCC entry candidates. */
1227 streamer_write_uhwi (ob, scc_entry_len);
1229 /* Write all headers and populate the streamer cache. */
1230 for (unsigned i = 0; i < size; ++i)
1232 hashval_t hash = sccstack[first+i].hash;
1233 tree t = sccstack[first+i].t;
1234 bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
1235 t, hash, &ix);
1236 gcc_assert (!exists_p);
1238 if (!lto_is_streamable (t))
1239 internal_error ("tree code %qs is not supported "
1240 "in LTO streams",
1241 tree_code_name[TREE_CODE (t)]);
1243 gcc_checking_assert (!streamer_handle_as_builtin_p (t));
1245 /* Write the header, containing everything needed to
1246 materialize EXPR on the reading side. */
1247 streamer_write_tree_header (ob, t);
1250 /* Write the bitpacks and tree references. */
1251 for (unsigned i = 0; i < size; ++i)
1253 lto_write_tree_1 (ob, sccstack[first+i].t, ref_p);
1255 /* Mark the end of the tree. */
1256 streamer_write_zero (ob);
1259 gcc_assert (old_len + size == ob->writer_cache->nodes.length ());
1261 /* Finally truncate the vector. */
1262 sccstack.truncate (first);
1264 if (from_state)
1265 from_state->low = MIN (from_state->low, cstate->low);
1266 return;
1269 if (from_state)
1270 from_state->low = MIN (from_state->low, cstate->low);
1272 gcc_checking_assert (from_state);
1273 if (cstate->dfsnum < from_state->dfsnum)
1274 from_state->low = MIN (cstate->dfsnum, from_state->low);
1278 /* Emit the physical representation of tree node EXPR to output block
1279 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
1280 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1282 void
1283 lto_output_tree (struct output_block *ob, tree expr,
1284 bool ref_p, bool this_ref_p)
1286 unsigned ix;
1287 bool existed_p;
1289 if (expr == NULL_TREE)
1291 streamer_write_record_start (ob, LTO_null);
1292 return;
1295 if (this_ref_p && tree_is_indexable (expr))
1297 lto_output_tree_ref (ob, expr);
1298 return;
1301 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1302 if (existed_p)
1304 /* If a node has already been streamed out, make sure that
1305 we don't write it more than once. Otherwise, the reader
1306 will instantiate two different nodes for the same object. */
1307 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1308 streamer_write_uhwi (ob, ix);
1309 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1310 lto_tree_code_to_tag (TREE_CODE (expr)));
1311 lto_stats.num_pickle_refs_output++;
1313 else
1315 /* This is the first time we see EXPR, write all reachable
1316 trees to OB. */
1317 static bool in_dfs_walk;
1319 /* Protect against recursion which means disconnect between
1320 what tree edges we walk in the DFS walk and what edges
1321 we stream out. */
1322 gcc_assert (!in_dfs_walk);
1324 /* Start the DFS walk. */
1325 /* Save ob state ... */
1326 /* let's see ... */
1327 in_dfs_walk = true;
1328 sccstate = pointer_map_create ();
1329 gcc_obstack_init (&sccstate_obstack);
1330 next_dfs_num = 1;
1331 DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p);
1332 sccstack.release ();
1333 pointer_map_destroy (sccstate);
1334 obstack_free (&sccstate_obstack, NULL);
1335 in_dfs_walk = false;
1337 /* Finally append a reference to the tree we were writing.
1338 ??? If expr ended up as a singleton we could have
1339 inlined it here and avoid outputting a reference. */
1340 existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix);
1341 gcc_assert (existed_p);
1342 streamer_write_record_start (ob, LTO_tree_pickle_reference);
1343 streamer_write_uhwi (ob, ix);
1344 streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS,
1345 lto_tree_code_to_tag (TREE_CODE (expr)));
1346 lto_stats.num_pickle_refs_output++;
1351 /* Output to OB a list of try/catch handlers starting with FIRST. */
1353 static void
1354 output_eh_try_list (struct output_block *ob, eh_catch first)
1356 eh_catch n;
1358 for (n = first; n; n = n->next_catch)
1360 streamer_write_record_start (ob, LTO_eh_catch);
1361 stream_write_tree (ob, n->type_list, true);
1362 stream_write_tree (ob, n->filter_list, true);
1363 stream_write_tree (ob, n->label, true);
1366 streamer_write_record_start (ob, LTO_null);
1370 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1371 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1372 detect EH region sharing. */
1374 static void
1375 output_eh_region (struct output_block *ob, eh_region r)
1377 enum LTO_tags tag;
1379 if (r == NULL)
1381 streamer_write_record_start (ob, LTO_null);
1382 return;
1385 if (r->type == ERT_CLEANUP)
1386 tag = LTO_ert_cleanup;
1387 else if (r->type == ERT_TRY)
1388 tag = LTO_ert_try;
1389 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1390 tag = LTO_ert_allowed_exceptions;
1391 else if (r->type == ERT_MUST_NOT_THROW)
1392 tag = LTO_ert_must_not_throw;
1393 else
1394 gcc_unreachable ();
1396 streamer_write_record_start (ob, tag);
1397 streamer_write_hwi (ob, r->index);
1399 if (r->outer)
1400 streamer_write_hwi (ob, r->outer->index);
1401 else
1402 streamer_write_zero (ob);
1404 if (r->inner)
1405 streamer_write_hwi (ob, r->inner->index);
1406 else
1407 streamer_write_zero (ob);
1409 if (r->next_peer)
1410 streamer_write_hwi (ob, r->next_peer->index);
1411 else
1412 streamer_write_zero (ob);
1414 if (r->type == ERT_TRY)
1416 output_eh_try_list (ob, r->u.eh_try.first_catch);
1418 else if (r->type == ERT_ALLOWED_EXCEPTIONS)
1420 stream_write_tree (ob, r->u.allowed.type_list, true);
1421 stream_write_tree (ob, r->u.allowed.label, true);
1422 streamer_write_uhwi (ob, r->u.allowed.filter);
1424 else if (r->type == ERT_MUST_NOT_THROW)
1426 stream_write_tree (ob, r->u.must_not_throw.failure_decl, true);
1427 bitpack_d bp = bitpack_create (ob->main_stream);
1428 stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc);
1429 streamer_write_bitpack (&bp);
1432 if (r->landing_pads)
1433 streamer_write_hwi (ob, r->landing_pads->index);
1434 else
1435 streamer_write_zero (ob);
1439 /* Output landing pad LP to OB. */
1441 static void
1442 output_eh_lp (struct output_block *ob, eh_landing_pad lp)
1444 if (lp == NULL)
1446 streamer_write_record_start (ob, LTO_null);
1447 return;
1450 streamer_write_record_start (ob, LTO_eh_landing_pad);
1451 streamer_write_hwi (ob, lp->index);
1452 if (lp->next_lp)
1453 streamer_write_hwi (ob, lp->next_lp->index);
1454 else
1455 streamer_write_zero (ob);
1457 if (lp->region)
1458 streamer_write_hwi (ob, lp->region->index);
1459 else
1460 streamer_write_zero (ob);
1462 stream_write_tree (ob, lp->post_landing_pad, true);
1466 /* Output the existing eh_table to OB. */
1468 static void
1469 output_eh_regions (struct output_block *ob, struct function *fn)
1471 if (fn->eh && fn->eh->region_tree)
1473 unsigned i;
1474 eh_region eh;
1475 eh_landing_pad lp;
1476 tree ttype;
1478 streamer_write_record_start (ob, LTO_eh_table);
1480 /* Emit the index of the root of the EH region tree. */
1481 streamer_write_hwi (ob, fn->eh->region_tree->index);
1483 /* Emit all the EH regions in the region array. */
1484 streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array));
1485 FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh)
1486 output_eh_region (ob, eh);
1488 /* Emit all landing pads. */
1489 streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array));
1490 FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp)
1491 output_eh_lp (ob, lp);
1493 /* Emit all the runtime type data. */
1494 streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data));
1495 FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype)
1496 stream_write_tree (ob, ttype, true);
1498 /* Emit the table of action chains. */
1499 if (targetm.arm_eabi_unwinder)
1501 tree t;
1502 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi));
1503 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t)
1504 stream_write_tree (ob, t, true);
1506 else
1508 uchar c;
1509 streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other));
1510 FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c)
1511 streamer_write_char_stream (ob->main_stream, c);
1515 /* The LTO_null either terminates the record or indicates that there
1516 are no eh_records at all. */
1517 streamer_write_record_start (ob, LTO_null);
1521 /* Output all of the active ssa names to the ssa_names stream. */
1523 static void
1524 output_ssa_names (struct output_block *ob, struct function *fn)
1526 unsigned int i, len;
1528 len = vec_safe_length (SSANAMES (fn));
1529 streamer_write_uhwi (ob, len);
1531 for (i = 1; i < len; i++)
1533 tree ptr = (*SSANAMES (fn))[i];
1535 if (ptr == NULL_TREE
1536 || SSA_NAME_IN_FREE_LIST (ptr)
1537 || virtual_operand_p (ptr))
1538 continue;
1540 streamer_write_uhwi (ob, i);
1541 streamer_write_char_stream (ob->main_stream,
1542 SSA_NAME_IS_DEFAULT_DEF (ptr));
1543 if (SSA_NAME_VAR (ptr))
1544 stream_write_tree (ob, SSA_NAME_VAR (ptr), true);
1545 else
1546 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1547 stream_write_tree (ob, TREE_TYPE (ptr), true);
1550 streamer_write_zero (ob);
1554 /* Output the cfg. */
1556 static void
1557 output_cfg (struct output_block *ob, struct function *fn)
1559 struct lto_output_stream *tmp_stream = ob->main_stream;
1560 basic_block bb;
1562 ob->main_stream = ob->cfg_stream;
1564 streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST,
1565 profile_status_for_function (fn));
1567 /* Output the number of the highest basic block. */
1568 streamer_write_uhwi (ob, last_basic_block_for_function (fn));
1570 FOR_ALL_BB_FN (bb, fn)
1572 edge_iterator ei;
1573 edge e;
1575 streamer_write_hwi (ob, bb->index);
1577 /* Output the successors and the edge flags. */
1578 streamer_write_uhwi (ob, EDGE_COUNT (bb->succs));
1579 FOR_EACH_EDGE (e, ei, bb->succs)
1581 streamer_write_uhwi (ob, e->dest->index);
1582 streamer_write_hwi (ob, e->probability);
1583 streamer_write_gcov_count (ob, e->count);
1584 streamer_write_uhwi (ob, e->flags);
1588 streamer_write_hwi (ob, -1);
1590 bb = ENTRY_BLOCK_PTR;
1591 while (bb->next_bb)
1593 streamer_write_hwi (ob, bb->next_bb->index);
1594 bb = bb->next_bb;
1597 streamer_write_hwi (ob, -1);
1599 /* ??? The cfgloop interface is tied to cfun. */
1600 gcc_assert (cfun == fn);
1602 /* Output the number of loops. */
1603 streamer_write_uhwi (ob, number_of_loops (fn));
1605 /* Output each loop, skipping the tree root which has number zero. */
1606 for (unsigned i = 1; i < number_of_loops (fn); ++i)
1608 struct loop *loop = get_loop (fn, i);
1610 /* Write the index of the loop header. That's enough to rebuild
1611 the loop tree on the reader side. Stream -1 for an unused
1612 loop entry. */
1613 if (!loop)
1615 streamer_write_hwi (ob, -1);
1616 continue;
1618 else
1619 streamer_write_hwi (ob, loop->header->index);
1621 /* Write everything copy_loop_info copies. */
1622 streamer_write_enum (ob->main_stream,
1623 loop_estimation, EST_LAST, loop->estimate_state);
1624 streamer_write_hwi (ob, loop->any_upper_bound);
1625 if (loop->any_upper_bound)
1627 streamer_write_uhwi (ob, loop->nb_iterations_upper_bound.low);
1628 streamer_write_hwi (ob, loop->nb_iterations_upper_bound.high);
1630 streamer_write_hwi (ob, loop->any_estimate);
1631 if (loop->any_estimate)
1633 streamer_write_uhwi (ob, loop->nb_iterations_estimate.low);
1634 streamer_write_hwi (ob, loop->nb_iterations_estimate.high);
1638 ob->main_stream = tmp_stream;
1642 /* Create the header in the file using OB. If the section type is for
1643 a function, set FN to the decl for that function. */
1645 void
1646 produce_asm (struct output_block *ob, tree fn)
1648 enum lto_section_type section_type = ob->section_type;
1649 struct lto_function_header header;
1650 char *section_name;
1651 struct lto_output_stream *header_stream;
1653 if (section_type == LTO_section_function_body)
1655 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn));
1656 section_name = lto_get_section_name (section_type, name, NULL);
1658 else
1659 section_name = lto_get_section_name (section_type, NULL, NULL);
1661 lto_begin_section (section_name, !flag_wpa);
1662 free (section_name);
1664 /* The entire header is stream computed here. */
1665 memset (&header, 0, sizeof (struct lto_function_header));
1667 /* Write the header. */
1668 header.lto_header.major_version = LTO_major_version;
1669 header.lto_header.minor_version = LTO_minor_version;
1671 header.compressed_size = 0;
1673 if (section_type == LTO_section_function_body)
1674 header.cfg_size = ob->cfg_stream->total_size;
1675 header.main_size = ob->main_stream->total_size;
1676 header.string_size = ob->string_stream->total_size;
1678 header_stream = XCNEW (struct lto_output_stream);
1679 lto_output_data_stream (header_stream, &header, sizeof header);
1680 lto_write_stream (header_stream);
1681 free (header_stream);
1683 /* Put all of the gimple and the string table out the asm file as a
1684 block of text. */
1685 if (section_type == LTO_section_function_body)
1686 lto_write_stream (ob->cfg_stream);
1687 lto_write_stream (ob->main_stream);
1688 lto_write_stream (ob->string_stream);
1690 lto_end_section ();
1694 /* Output the base body of struct function FN using output block OB. */
1696 static void
1697 output_struct_function_base (struct output_block *ob, struct function *fn)
1699 struct bitpack_d bp;
1700 unsigned i;
1701 tree t;
1703 /* Output the static chain and non-local goto save area. */
1704 stream_write_tree (ob, fn->static_chain_decl, true);
1705 stream_write_tree (ob, fn->nonlocal_goto_save_area, true);
1707 /* Output all the local variables in the function. */
1708 streamer_write_hwi (ob, vec_safe_length (fn->local_decls));
1709 FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t)
1710 stream_write_tree (ob, t, true);
1712 /* Output current IL state of the function. */
1713 streamer_write_uhwi (ob, fn->curr_properties);
1715 /* Write all the attributes for FN. */
1716 bp = bitpack_create (ob->main_stream);
1717 bp_pack_value (&bp, fn->is_thunk, 1);
1718 bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1);
1719 bp_pack_value (&bp, fn->returns_pcc_struct, 1);
1720 bp_pack_value (&bp, fn->returns_struct, 1);
1721 bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1);
1722 bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1);
1723 bp_pack_value (&bp, fn->always_inline_functions_inlined, 1);
1724 bp_pack_value (&bp, fn->after_inlining, 1);
1725 bp_pack_value (&bp, fn->stdarg, 1);
1726 bp_pack_value (&bp, fn->has_nonlocal_label, 1);
1727 bp_pack_value (&bp, fn->calls_alloca, 1);
1728 bp_pack_value (&bp, fn->calls_setjmp, 1);
1729 bp_pack_value (&bp, fn->va_list_fpr_size, 8);
1730 bp_pack_value (&bp, fn->va_list_gpr_size, 8);
1732 /* Output the function start and end loci. */
1733 stream_output_location (ob, &bp, fn->function_start_locus);
1734 stream_output_location (ob, &bp, fn->function_end_locus);
1736 streamer_write_bitpack (&bp);
1740 /* Output the body of function NODE->DECL. */
1742 static void
1743 output_function (struct cgraph_node *node)
1745 tree function;
1746 struct function *fn;
1747 basic_block bb;
1748 struct output_block *ob;
1750 function = node->symbol.decl;
1751 fn = DECL_STRUCT_FUNCTION (function);
1752 ob = create_output_block (LTO_section_function_body);
1754 clear_line_info (ob);
1755 ob->cgraph_node = node;
1757 gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
1759 /* Set current_function_decl and cfun. */
1760 push_cfun (fn);
1762 /* Make string 0 be a NULL string. */
1763 streamer_write_char_stream (ob->string_stream, 0);
1765 streamer_write_record_start (ob, LTO_function);
1767 /* Output decls for parameters and args. */
1768 stream_write_tree (ob, DECL_RESULT (function), true);
1769 streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
1771 /* Output DECL_INITIAL for the function, which contains the tree of
1772 lexical scopes. */
1773 stream_write_tree (ob, DECL_INITIAL (function), true);
1775 /* We also stream abstract functions where we stream only stuff needed for
1776 debug info. */
1777 if (gimple_has_body_p (function))
1779 streamer_write_uhwi (ob, 1);
1780 output_struct_function_base (ob, fn);
1782 /* Output all the SSA names used in the function. */
1783 output_ssa_names (ob, fn);
1785 /* Output any exception handling regions. */
1786 output_eh_regions (ob, fn);
1789 /* We will renumber the statements. The code that does this uses
1790 the same ordering that we use for serializing them so we can use
1791 the same code on the other end and not have to write out the
1792 statement numbers. We do not assign UIDs to PHIs here because
1793 virtual PHIs get re-computed on-the-fly which would make numbers
1794 inconsistent. */
1795 set_gimple_stmt_max_uid (cfun, 0);
1796 FOR_ALL_BB (bb)
1798 gimple_stmt_iterator gsi;
1799 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1801 gimple stmt = gsi_stmt (gsi);
1803 /* Virtual PHIs are not going to be streamed. */
1804 if (!virtual_operand_p (gimple_phi_result (stmt)))
1805 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1807 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1809 gimple stmt = gsi_stmt (gsi);
1810 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1813 /* To avoid keeping duplicate gimple IDs in the statements, renumber
1814 virtual phis now. */
1815 FOR_ALL_BB (bb)
1817 gimple_stmt_iterator gsi;
1818 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1820 gimple stmt = gsi_stmt (gsi);
1821 if (virtual_operand_p (gimple_phi_result (stmt)))
1822 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
1826 /* Output the code for the function. */
1827 FOR_ALL_BB_FN (bb, fn)
1828 output_bb (ob, bb, fn);
1830 /* The terminator for this function. */
1831 streamer_write_record_start (ob, LTO_null);
1833 output_cfg (ob, fn);
1835 pop_cfun ();
1837 else
1838 streamer_write_uhwi (ob, 0);
1840 /* Create a section to hold the pickled output of this function. */
1841 produce_asm (ob, function);
1843 destroy_output_block (ob);
1847 /* Emit toplevel asms. */
1849 void
1850 lto_output_toplevel_asms (void)
1852 struct output_block *ob;
1853 struct asm_node *can;
1854 char *section_name;
1855 struct lto_output_stream *header_stream;
1856 struct lto_asm_header header;
1858 if (! asm_nodes)
1859 return;
1861 ob = create_output_block (LTO_section_asm);
1863 /* Make string 0 be a NULL string. */
1864 streamer_write_char_stream (ob->string_stream, 0);
1866 for (can = asm_nodes; can; can = can->next)
1868 streamer_write_string_cst (ob, ob->main_stream, can->asm_str);
1869 streamer_write_hwi (ob, can->order);
1872 streamer_write_string_cst (ob, ob->main_stream, NULL_TREE);
1874 section_name = lto_get_section_name (LTO_section_asm, NULL, NULL);
1875 lto_begin_section (section_name, !flag_wpa);
1876 free (section_name);
1878 /* The entire header stream is computed here. */
1879 memset (&header, 0, sizeof (header));
1881 /* Write the header. */
1882 header.lto_header.major_version = LTO_major_version;
1883 header.lto_header.minor_version = LTO_minor_version;
1885 header.main_size = ob->main_stream->total_size;
1886 header.string_size = ob->string_stream->total_size;
1888 header_stream = XCNEW (struct lto_output_stream);
1889 lto_output_data_stream (header_stream, &header, sizeof (header));
1890 lto_write_stream (header_stream);
1891 free (header_stream);
1893 /* Put all of the gimple and the string table out the asm file as a
1894 block of text. */
1895 lto_write_stream (ob->main_stream);
1896 lto_write_stream (ob->string_stream);
1898 lto_end_section ();
1900 destroy_output_block (ob);
1904 /* Copy the function body of NODE without deserializing. */
1906 static void
1907 copy_function (struct cgraph_node *node)
1909 tree function = node->symbol.decl;
1910 struct lto_file_decl_data *file_data = node->symbol.lto_file_data;
1911 struct lto_output_stream *output_stream = XCNEW (struct lto_output_stream);
1912 const char *data;
1913 size_t len;
1914 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function));
1915 char *section_name =
1916 lto_get_section_name (LTO_section_function_body, name, NULL);
1917 size_t i, j;
1918 struct lto_in_decl_state *in_state;
1919 struct lto_out_decl_state *out_state = lto_get_out_decl_state ();
1921 lto_begin_section (section_name, !flag_wpa);
1922 free (section_name);
1924 /* We may have renamed the declaration, e.g., a static function. */
1925 name = lto_get_decl_name_mapping (file_data, name);
1927 data = lto_get_section_data (file_data, LTO_section_function_body,
1928 name, &len);
1929 gcc_assert (data);
1931 /* Do a bit copy of the function body. */
1932 lto_output_data_stream (output_stream, data, len);
1933 lto_write_stream (output_stream);
1935 /* Copy decls. */
1936 in_state =
1937 lto_get_function_in_decl_state (node->symbol.lto_file_data, function);
1938 gcc_assert (in_state);
1940 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
1942 size_t n = in_state->streams[i].size;
1943 tree *trees = in_state->streams[i].trees;
1944 struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]);
1946 /* The out state must have the same indices and the in state.
1947 So just copy the vector. All the encoders in the in state
1948 must be empty where we reach here. */
1949 gcc_assert (lto_tree_ref_encoder_size (encoder) == 0);
1950 encoder->trees.reserve_exact (n);
1951 for (j = 0; j < n; j++)
1952 encoder->trees.safe_push (trees[j]);
1955 lto_free_section_data (file_data, LTO_section_function_body, name,
1956 data, len);
1957 free (output_stream);
1958 lto_end_section ();
1962 /* Main entry point from the pass manager. */
1964 static void
1965 lto_output (void)
1967 struct lto_out_decl_state *decl_state;
1968 #ifdef ENABLE_CHECKING
1969 bitmap output = lto_bitmap_alloc ();
1970 #endif
1971 int i, n_nodes;
1972 lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder;
1974 /* Initialize the streamer. */
1975 lto_streamer_init ();
1977 n_nodes = lto_symtab_encoder_size (encoder);
1978 /* Process only the functions with bodies. */
1979 for (i = 0; i < n_nodes; i++)
1981 symtab_node snode = lto_symtab_encoder_deref (encoder, i);
1982 cgraph_node *node = dyn_cast <cgraph_node> (snode);
1983 if (node
1984 && lto_symtab_encoder_encode_body_p (encoder, node)
1985 && !node->symbol.alias
1986 && !node->thunk.thunk_p)
1988 #ifdef ENABLE_CHECKING
1989 gcc_assert (!bitmap_bit_p (output, DECL_UID (node->symbol.decl)));
1990 bitmap_set_bit (output, DECL_UID (node->symbol.decl));
1991 #endif
1992 decl_state = lto_new_out_decl_state ();
1993 lto_push_out_decl_state (decl_state);
1994 if (gimple_has_body_p (node->symbol.decl) || !flag_wpa)
1995 output_function (node);
1996 else
1997 copy_function (node);
1998 gcc_assert (lto_get_out_decl_state () == decl_state);
1999 lto_pop_out_decl_state ();
2000 lto_record_function_out_decl_state (node->symbol.decl, decl_state);
2004 /* Emit the callgraph after emitting function bodies. This needs to
2005 be done now to make sure that all the statements in every function
2006 have been renumbered so that edges can be associated with call
2007 statements using the statement UIDs. */
2008 output_symtab ();
2010 #ifdef ENABLE_CHECKING
2011 lto_bitmap_free (output);
2012 #endif
2015 namespace {
2017 const pass_data pass_data_ipa_lto_gimple_out =
2019 IPA_PASS, /* type */
2020 "lto_gimple_out", /* name */
2021 OPTGROUP_NONE, /* optinfo_flags */
2022 true, /* has_gate */
2023 false, /* has_execute */
2024 TV_IPA_LTO_GIMPLE_OUT, /* tv_id */
2025 0, /* properties_required */
2026 0, /* properties_provided */
2027 0, /* properties_destroyed */
2028 0, /* todo_flags_start */
2029 0, /* todo_flags_finish */
2032 class pass_ipa_lto_gimple_out : public ipa_opt_pass_d
2034 public:
2035 pass_ipa_lto_gimple_out(gcc::context *ctxt)
2036 : ipa_opt_pass_d(pass_data_ipa_lto_gimple_out, ctxt,
2037 NULL, /* generate_summary */
2038 lto_output, /* write_summary */
2039 NULL, /* read_summary */
2040 lto_output, /* write_optimization_summary */
2041 NULL, /* read_optimization_summary */
2042 NULL, /* stmt_fixup */
2043 0, /* function_transform_todo_flags_start */
2044 NULL, /* function_transform */
2045 NULL) /* variable_transform */
2048 /* opt_pass methods: */
2049 bool gate () { return gate_lto_out (); }
2051 }; // class pass_ipa_lto_gimple_out
2053 } // anon namespace
2055 ipa_opt_pass_d *
2056 make_pass_ipa_lto_gimple_out (gcc::context *ctxt)
2058 return new pass_ipa_lto_gimple_out (ctxt);
2062 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2063 from it and required for correct representation of its semantics.
2064 Each node in ENCODER must be a global declaration or a type. A node
2065 is written only once, even if it appears multiple times in the
2066 vector. Certain transitively-reachable nodes, such as those
2067 representing expressions, may be duplicated, but such nodes
2068 must not appear in ENCODER itself. */
2070 static void
2071 write_global_stream (struct output_block *ob,
2072 struct lto_tree_ref_encoder *encoder)
2074 tree t;
2075 size_t index;
2076 const size_t size = lto_tree_ref_encoder_size (encoder);
2078 for (index = 0; index < size; index++)
2080 t = lto_tree_ref_encoder_get_tree (encoder, index);
2081 if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL))
2082 stream_write_tree (ob, t, false);
2087 /* Write a sequence of indices into the globals vector corresponding
2088 to the trees in ENCODER. These are used by the reader to map the
2089 indices used to refer to global entities within function bodies to
2090 their referents. */
2092 static void
2093 write_global_references (struct output_block *ob,
2094 struct lto_output_stream *ref_stream,
2095 struct lto_tree_ref_encoder *encoder)
2097 tree t;
2098 uint32_t index;
2099 const uint32_t size = lto_tree_ref_encoder_size (encoder);
2101 /* Write size as 32-bit unsigned. */
2102 lto_output_data_stream (ref_stream, &size, sizeof (int32_t));
2104 for (index = 0; index < size; index++)
2106 uint32_t slot_num;
2108 t = lto_tree_ref_encoder_get_tree (encoder, index);
2109 streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num);
2110 gcc_assert (slot_num != (unsigned)-1);
2111 lto_output_data_stream (ref_stream, &slot_num, sizeof slot_num);
2116 /* Write all the streams in an lto_out_decl_state STATE using
2117 output block OB and output stream OUT_STREAM. */
2119 void
2120 lto_output_decl_state_streams (struct output_block *ob,
2121 struct lto_out_decl_state *state)
2123 int i;
2125 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2126 write_global_stream (ob, &state->streams[i]);
2130 /* Write all the references in an lto_out_decl_state STATE using
2131 output block OB and output stream OUT_STREAM. */
2133 void
2134 lto_output_decl_state_refs (struct output_block *ob,
2135 struct lto_output_stream *out_stream,
2136 struct lto_out_decl_state *state)
2138 unsigned i;
2139 uint32_t ref;
2140 tree decl;
2142 /* Write reference to FUNCTION_DECL. If there is not function,
2143 write reference to void_type_node. */
2144 decl = (state->fn_decl) ? state->fn_decl : void_type_node;
2145 streamer_tree_cache_lookup (ob->writer_cache, decl, &ref);
2146 gcc_assert (ref != (unsigned)-1);
2147 lto_output_data_stream (out_stream, &ref, sizeof (uint32_t));
2149 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2150 write_global_references (ob, out_stream, &state->streams[i]);
2154 /* Return the written size of STATE. */
2156 static size_t
2157 lto_out_decl_state_written_size (struct lto_out_decl_state *state)
2159 int i;
2160 size_t size;
2162 size = sizeof (int32_t); /* fn_ref. */
2163 for (i = 0; i < LTO_N_DECL_STREAMS; i++)
2165 size += sizeof (int32_t); /* vector size. */
2166 size += (lto_tree_ref_encoder_size (&state->streams[i])
2167 * sizeof (int32_t));
2169 return size;
2173 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2174 so far. */
2176 static void
2177 write_symbol (struct streamer_tree_cache_d *cache,
2178 struct lto_output_stream *stream,
2179 tree t, struct pointer_set_t *seen, bool alias)
2181 const char *name;
2182 enum gcc_plugin_symbol_kind kind;
2183 enum gcc_plugin_symbol_visibility visibility;
2184 unsigned slot_num;
2185 unsigned HOST_WIDEST_INT size;
2186 const char *comdat;
2187 unsigned char c;
2189 /* None of the following kinds of symbols are needed in the
2190 symbol table. */
2191 if (!TREE_PUBLIC (t)
2192 || is_builtin_fn (t)
2193 || DECL_ABSTRACT (t)
2194 || (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)))
2195 return;
2196 gcc_assert (TREE_CODE (t) != RESULT_DECL);
2198 gcc_assert (TREE_CODE (t) == VAR_DECL
2199 || TREE_CODE (t) == FUNCTION_DECL);
2201 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t));
2203 /* This behaves like assemble_name_raw in varasm.c, performing the
2204 same name manipulations that ASM_OUTPUT_LABELREF does. */
2205 name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name));
2207 if (pointer_set_contains (seen, name))
2208 return;
2209 pointer_set_insert (seen, name);
2211 streamer_tree_cache_lookup (cache, t, &slot_num);
2212 gcc_assert (slot_num != (unsigned)-1);
2214 if (DECL_EXTERNAL (t))
2216 if (DECL_WEAK (t))
2217 kind = GCCPK_WEAKUNDEF;
2218 else
2219 kind = GCCPK_UNDEF;
2221 else
2223 if (DECL_WEAK (t))
2224 kind = GCCPK_WEAKDEF;
2225 else if (DECL_COMMON (t))
2226 kind = GCCPK_COMMON;
2227 else
2228 kind = GCCPK_DEF;
2230 /* When something is defined, it should have node attached. */
2231 gcc_assert (alias || TREE_CODE (t) != VAR_DECL
2232 || varpool_get_node (t)->symbol.definition);
2233 gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
2234 || (cgraph_get_node (t)
2235 && cgraph_get_node (t)->symbol.definition));
2238 /* Imitate what default_elf_asm_output_external do.
2239 When symbol is external, we need to output it with DEFAULT visibility
2240 when compiling with -fvisibility=default, while with HIDDEN visibility
2241 when symbol has attribute (visibility("hidden")) specified.
2242 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2243 right. */
2245 if (DECL_EXTERNAL (t)
2246 && !targetm.binds_local_p (t))
2247 visibility = GCCPV_DEFAULT;
2248 else
2249 switch (DECL_VISIBILITY(t))
2251 case VISIBILITY_DEFAULT:
2252 visibility = GCCPV_DEFAULT;
2253 break;
2254 case VISIBILITY_PROTECTED:
2255 visibility = GCCPV_PROTECTED;
2256 break;
2257 case VISIBILITY_HIDDEN:
2258 visibility = GCCPV_HIDDEN;
2259 break;
2260 case VISIBILITY_INTERNAL:
2261 visibility = GCCPV_INTERNAL;
2262 break;
2265 if (kind == GCCPK_COMMON
2266 && DECL_SIZE_UNIT (t)
2267 && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST)
2268 size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t));
2269 else
2270 size = 0;
2272 if (DECL_ONE_ONLY (t))
2273 comdat = IDENTIFIER_POINTER (DECL_COMDAT_GROUP (t));
2274 else
2275 comdat = "";
2277 lto_output_data_stream (stream, name, strlen (name) + 1);
2278 lto_output_data_stream (stream, comdat, strlen (comdat) + 1);
2279 c = (unsigned char) kind;
2280 lto_output_data_stream (stream, &c, 1);
2281 c = (unsigned char) visibility;
2282 lto_output_data_stream (stream, &c, 1);
2283 lto_output_data_stream (stream, &size, 8);
2284 lto_output_data_stream (stream, &slot_num, 4);
2287 /* Return true if NODE should appear in the plugin symbol table. */
2289 bool
2290 output_symbol_p (symtab_node node)
2292 struct cgraph_node *cnode;
2293 if (!symtab_real_symbol_p (node))
2294 return false;
2295 /* We keep external functions in symtab for sake of inlining
2296 and devirtualization. We do not want to see them in symbol table as
2297 references unless they are really used. */
2298 cnode = dyn_cast <cgraph_node> (node);
2299 if (cnode && (!node->symbol.definition || DECL_EXTERNAL (cnode->symbol.decl))
2300 && cnode->callers)
2301 return true;
2303 /* Ignore all references from external vars initializers - they are not really
2304 part of the compilation unit until they are used by folding. Some symbols,
2305 like references to external construction vtables can not be referred to at all.
2306 We decide this at can_refer_decl_in_current_unit_p. */
2307 if (!node->symbol.definition || DECL_EXTERNAL (node->symbol.decl))
2309 int i;
2310 struct ipa_ref *ref;
2311 for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list,
2312 i, ref); i++)
2314 if (ref->use == IPA_REF_ALIAS)
2315 continue;
2316 if (is_a <cgraph_node> (ref->referring))
2317 return true;
2318 if (!DECL_EXTERNAL (ref->referring->symbol.decl))
2319 return true;
2321 return false;
2323 return true;
2327 /* Write an IL symbol table to OB.
2328 SET and VSET are cgraph/varpool node sets we are outputting. */
2330 static void
2331 produce_symtab (struct output_block *ob)
2333 struct streamer_tree_cache_d *cache = ob->writer_cache;
2334 char *section_name = lto_get_section_name (LTO_section_symtab, NULL, NULL);
2335 struct pointer_set_t *seen;
2336 struct lto_output_stream stream;
2337 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2338 lto_symtab_encoder_iterator lsei;
2340 lto_begin_section (section_name, false);
2341 free (section_name);
2343 seen = pointer_set_create ();
2344 memset (&stream, 0, sizeof (stream));
2346 /* Write the symbol table.
2347 First write everything defined and then all declarations.
2348 This is necessary to handle cases where we have duplicated symbols. */
2349 for (lsei = lsei_start (encoder);
2350 !lsei_end_p (lsei); lsei_next (&lsei))
2352 symtab_node node = lsei_node (lsei);
2354 if (!output_symbol_p (node) || DECL_EXTERNAL (node->symbol.decl))
2355 continue;
2356 write_symbol (cache, &stream, node->symbol.decl, seen, false);
2358 for (lsei = lsei_start (encoder);
2359 !lsei_end_p (lsei); lsei_next (&lsei))
2361 symtab_node node = lsei_node (lsei);
2363 if (!output_symbol_p (node) || !DECL_EXTERNAL (node->symbol.decl))
2364 continue;
2365 write_symbol (cache, &stream, node->symbol.decl, seen, false);
2368 lto_write_stream (&stream);
2369 pointer_set_destroy (seen);
2371 lto_end_section ();
2375 /* This pass is run after all of the functions are serialized and all
2376 of the IPA passes have written their serialized forms. This pass
2377 causes the vector of all of the global decls and types used from
2378 this file to be written in to a section that can then be read in to
2379 recover these on other side. */
2381 static void
2382 produce_asm_for_decls (void)
2384 struct lto_out_decl_state *out_state;
2385 struct lto_out_decl_state *fn_out_state;
2386 struct lto_decl_header header;
2387 char *section_name;
2388 struct output_block *ob;
2389 struct lto_output_stream *header_stream, *decl_state_stream;
2390 unsigned idx, num_fns;
2391 size_t decl_state_size;
2392 int32_t num_decl_states;
2394 ob = create_output_block (LTO_section_decls);
2395 ob->global = true;
2397 memset (&header, 0, sizeof (struct lto_decl_header));
2399 section_name = lto_get_section_name (LTO_section_decls, NULL, NULL);
2400 lto_begin_section (section_name, !flag_wpa);
2401 free (section_name);
2403 /* Make string 0 be a NULL string. */
2404 streamer_write_char_stream (ob->string_stream, 0);
2406 gcc_assert (!alias_pairs);
2408 /* Write the global symbols. */
2409 out_state = lto_get_out_decl_state ();
2410 num_fns = lto_function_decl_states.length ();
2411 lto_output_decl_state_streams (ob, out_state);
2412 for (idx = 0; idx < num_fns; idx++)
2414 fn_out_state =
2415 lto_function_decl_states[idx];
2416 lto_output_decl_state_streams (ob, fn_out_state);
2419 header.lto_header.major_version = LTO_major_version;
2420 header.lto_header.minor_version = LTO_minor_version;
2422 /* Currently not used. This field would allow us to preallocate
2423 the globals vector, so that it need not be resized as it is extended. */
2424 header.num_nodes = -1;
2426 /* Compute the total size of all decl out states. */
2427 decl_state_size = sizeof (int32_t);
2428 decl_state_size += lto_out_decl_state_written_size (out_state);
2429 for (idx = 0; idx < num_fns; idx++)
2431 fn_out_state =
2432 lto_function_decl_states[idx];
2433 decl_state_size += lto_out_decl_state_written_size (fn_out_state);
2435 header.decl_state_size = decl_state_size;
2437 header.main_size = ob->main_stream->total_size;
2438 header.string_size = ob->string_stream->total_size;
2440 header_stream = XCNEW (struct lto_output_stream);
2441 lto_output_data_stream (header_stream, &header, sizeof header);
2442 lto_write_stream (header_stream);
2443 free (header_stream);
2445 /* Write the main out-decl state, followed by out-decl states of
2446 functions. */
2447 decl_state_stream = XCNEW (struct lto_output_stream);
2448 num_decl_states = num_fns + 1;
2449 lto_output_data_stream (decl_state_stream, &num_decl_states,
2450 sizeof (num_decl_states));
2451 lto_output_decl_state_refs (ob, decl_state_stream, out_state);
2452 for (idx = 0; idx < num_fns; idx++)
2454 fn_out_state =
2455 lto_function_decl_states[idx];
2456 lto_output_decl_state_refs (ob, decl_state_stream, fn_out_state);
2458 lto_write_stream (decl_state_stream);
2459 free(decl_state_stream);
2461 lto_write_stream (ob->main_stream);
2462 lto_write_stream (ob->string_stream);
2464 lto_end_section ();
2466 /* Write the symbol table. It is used by linker to determine dependencies
2467 and thus we can skip it for WPA. */
2468 if (!flag_wpa)
2469 produce_symtab (ob);
2471 /* Write command line opts. */
2472 lto_write_options ();
2474 /* Deallocate memory and clean up. */
2475 for (idx = 0; idx < num_fns; idx++)
2477 fn_out_state =
2478 lto_function_decl_states[idx];
2479 lto_delete_out_decl_state (fn_out_state);
2481 lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder);
2482 lto_function_decl_states.release ();
2483 destroy_output_block (ob);
2487 namespace {
2489 const pass_data pass_data_ipa_lto_finish_out =
2491 IPA_PASS, /* type */
2492 "lto_decls_out", /* name */
2493 OPTGROUP_NONE, /* optinfo_flags */
2494 true, /* has_gate */
2495 false, /* has_execute */
2496 TV_IPA_LTO_DECL_OUT, /* tv_id */
2497 0, /* properties_required */
2498 0, /* properties_provided */
2499 0, /* properties_destroyed */
2500 0, /* todo_flags_start */
2501 0, /* todo_flags_finish */
2504 class pass_ipa_lto_finish_out : public ipa_opt_pass_d
2506 public:
2507 pass_ipa_lto_finish_out(gcc::context *ctxt)
2508 : ipa_opt_pass_d(pass_data_ipa_lto_finish_out, ctxt,
2509 NULL, /* generate_summary */
2510 produce_asm_for_decls, /* write_summary */
2511 NULL, /* read_summary */
2512 produce_asm_for_decls, /* write_optimization_summary */
2513 NULL, /* read_optimization_summary */
2514 NULL, /* stmt_fixup */
2515 0, /* function_transform_todo_flags_start */
2516 NULL, /* function_transform */
2517 NULL) /* variable_transform */
2520 /* opt_pass methods: */
2521 bool gate () { return gate_lto_out (); }
2523 }; // class pass_ipa_lto_finish_out
2525 } // anon namespace
2527 ipa_opt_pass_d *
2528 make_pass_ipa_lto_finish_out (gcc::context *ctxt)
2530 return new pass_ipa_lto_finish_out (ctxt);