1 /* Write the GIMPLE representation to a file stream.
3 Copyright (C) 2009-2023 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
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
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/>. */
25 #include "coretypes.h"
31 #include "tree-pass.h"
33 #include "gimple-streamer.h"
35 #include "stor-layout.h"
36 #include "gimple-iterator.h"
38 #include "lto-symtab.h"
42 #include "gomp-constants.h"
44 #include "omp-offload.h"
45 #include "print-tree.h"
47 #include "file-prefix-map.h" /* remap_debug_filename() */
49 #include "ipa-utils.h"
53 static void lto_write_tree (struct output_block
*, tree
, bool);
55 /* Clear the line info stored in DATA_IN. */
58 clear_line_info (struct output_block
*ob
)
60 ob
->current_file
= NULL
;
63 ob
->current_sysp
= false;
64 ob
->reset_locus
= true;
66 /* Initialize to something that will never appear as block,
67 so that the first location with block in a function etc.
68 always streams a change_block bit and the first block. */
69 ob
->current_block
= void_node
;
70 ob
->current_discr
= UINT_MAX
;
74 /* Create the output block and return it. SECTION_TYPE is
75 LTO_section_function_body or LTO_static_initializer. */
78 create_output_block (enum lto_section_type section_type
)
80 struct output_block
*ob
= XCNEW (struct output_block
);
81 if (streamer_dump_file
)
82 fprintf (streamer_dump_file
, "Creating output block for %s\n",
83 lto_section_name
[section_type
]);
85 ob
->section_type
= section_type
;
86 ob
->decl_state
= lto_get_out_decl_state ();
87 /* Only global decl stream in non-wpa will ever be considered by tree
89 if (!flag_wpa
&& section_type
== LTO_section_decls
)
90 ob
->local_trees
= new (hash_set
<tree
>);
91 ob
->main_stream
= XCNEW (struct lto_output_stream
);
92 ob
->string_stream
= XCNEW (struct lto_output_stream
);
93 ob
->writer_cache
= streamer_tree_cache_create (!flag_wpa
, true, false);
95 if (section_type
== LTO_section_function_body
)
96 ob
->cfg_stream
= XCNEW (struct lto_output_stream
);
100 ob
->string_hash_table
= new hash_table
<string_slot_hasher
> (37);
101 gcc_obstack_init (&ob
->obstack
);
107 /* Destroy the output block OB. */
110 destroy_output_block (struct output_block
*ob
)
112 enum lto_section_type section_type
= ob
->section_type
;
114 delete ob
->string_hash_table
;
115 ob
->string_hash_table
= NULL
;
116 delete ob
->local_trees
;
118 free (ob
->main_stream
);
119 free (ob
->string_stream
);
120 if (section_type
== LTO_section_function_body
)
121 free (ob
->cfg_stream
);
123 streamer_tree_cache_delete (ob
->writer_cache
);
124 obstack_free (&ob
->obstack
, NULL
);
130 /* Wrapper around variably_modified_type_p avoiding type modification
131 during WPA streaming. */
134 lto_variably_modified_type_p (tree type
)
137 ? TYPE_LANG_FLAG_0 (TYPE_MAIN_VARIANT (type
))
138 : variably_modified_type_p (type
, NULL_TREE
));
142 /* Return true if tree node T is written to various tables. For these
143 nodes, we sometimes want to write their phyiscal representation
144 (via lto_output_tree), and sometimes we need to emit an index
145 reference into a table (via lto_output_tree_ref). */
148 tree_is_indexable (tree t
)
150 /* Parameters and return values of functions of variably modified types
151 must go to global stream, because they may be used in the type
153 if ((TREE_CODE (t
) == PARM_DECL
|| TREE_CODE (t
) == RESULT_DECL
)
155 return lto_variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t
)));
156 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared.
157 We should no longer need to stream it. */
158 else if (TREE_CODE (t
) == IMPORTED_DECL
)
160 else if (TREE_CODE (t
) == LABEL_DECL
)
161 return FORCED_LABEL (t
) || DECL_NONLOCAL (t
);
162 else if (((VAR_P (t
) && !TREE_STATIC (t
))
163 || TREE_CODE (t
) == TYPE_DECL
164 || TREE_CODE (t
) == CONST_DECL
165 || TREE_CODE (t
) == NAMELIST_DECL
)
166 && decl_function_context (t
))
168 else if (TREE_CODE (t
) == DEBUG_EXPR_DECL
)
170 /* Variably modified types need to be streamed alongside function
171 bodies because they can refer to local entities. Together with
172 them we have to localize their members as well.
173 ??? In theory that includes non-FIELD_DECLs as well. */
175 && lto_variably_modified_type_p (t
))
177 else if (TREE_CODE (t
) == FIELD_DECL
178 && lto_variably_modified_type_p (DECL_CONTEXT (t
)))
181 return (IS_TYPE_OR_DECL_P (t
) || TREE_CODE (t
) == SSA_NAME
);
185 /* Output info about new location into bitpack BP.
186 After outputting bitpack, lto_output_location_data has
187 to be done to output actual data. */
190 lto_output_location_1 (struct output_block
*ob
, struct bitpack_d
*bp
,
191 location_t orig_loc
, bool block_p
)
193 location_t loc
= LOCATION_LOCUS (orig_loc
);
195 if (loc
>= RESERVED_LOCATION_COUNT
)
197 expanded_location xloc
= expand_location (loc
);
198 unsigned discr
= get_discriminator_from_loc (orig_loc
);
202 if (xloc
.file
== NULL
)
203 ob
->current_file
= "";
205 ob
->current_line
= 1;
206 if (xloc
.column
== 0)
208 ob
->reset_locus
= false;
211 /* As RESERVED_LOCATION_COUNT is 2, we can use the spare value of
212 3 without wasting additional bits to signalize file change.
213 If RESERVED_LOCATION_COUNT changes, reconsider this. */
214 gcc_checking_assert (RESERVED_LOCATION_COUNT
== 2);
215 bp_pack_int_in_range (bp
, 0, RESERVED_LOCATION_COUNT
+ 1,
216 RESERVED_LOCATION_COUNT
217 + (ob
->current_file
!= xloc
.file
));
219 bp_pack_value (bp
, ob
->current_line
!= xloc
.line
, 1);
220 bp_pack_value (bp
, ob
->current_col
!= xloc
.column
, 1);
221 bp_pack_value (bp
, ob
->current_discr
!= discr
, 1);
223 if (ob
->current_file
!= xloc
.file
)
225 bool stream_pwd
= false;
226 const char *remapped
= remap_debug_filename (xloc
.file
);
227 if (ob
->emit_pwd
&& remapped
&& !IS_ABSOLUTE_PATH (remapped
))
230 ob
->emit_pwd
= false;
232 bp_pack_value (bp
, stream_pwd
, 1);
234 bp_pack_string (ob
, bp
, get_src_pwd (), true);
235 bp_pack_string (ob
, bp
, remapped
, true);
236 bp_pack_value (bp
, xloc
.sysp
, 1);
238 ob
->current_file
= xloc
.file
;
239 ob
->current_sysp
= xloc
.sysp
;
241 if (ob
->current_line
!= xloc
.line
)
242 bp_pack_var_len_unsigned (bp
, xloc
.line
);
243 ob
->current_line
= xloc
.line
;
245 if (ob
->current_col
!= xloc
.column
)
246 bp_pack_var_len_unsigned (bp
, xloc
.column
);
247 ob
->current_col
= xloc
.column
;
249 if (ob
->current_discr
!= discr
)
250 bp_pack_var_len_unsigned (bp
, discr
);
251 ob
->current_discr
= discr
;
254 bp_pack_int_in_range (bp
, 0, RESERVED_LOCATION_COUNT
+ 1, loc
);
258 tree block
= LOCATION_BLOCK (orig_loc
);
259 bp_pack_value (bp
, ob
->current_block
!= block
, 1);
260 streamer_write_bitpack (bp
);
261 if (ob
->current_block
!= block
)
262 lto_output_tree (ob
, block
, true, true);
263 ob
->current_block
= block
;
267 /* Output info about new location into bitpack BP.
268 After outputting bitpack, lto_output_location_data has
269 to be done to output actual data. */
272 lto_output_location (struct output_block
*ob
, struct bitpack_d
*bp
,
275 lto_output_location_1 (ob
, bp
, loc
, false);
278 /* Output info about new location into bitpack BP.
279 After outputting bitpack, lto_output_location_data has
280 to be done to output actual data. Like lto_output_location, but
281 additionally output LOCATION_BLOCK info too and write the BP bitpack. */
284 lto_output_location_and_block (struct output_block
*ob
, struct bitpack_d
*bp
,
287 lto_output_location_1 (ob
, bp
, loc
, true);
291 /* Lookup NAME in ENCODER. If NAME is not found, create a new entry in
292 ENCODER for NAME with the next available index of ENCODER, then
293 print the index to OBS.
298 lto_get_index (struct lto_tree_ref_encoder
*encoder
, tree t
)
303 = encoder
->tree_hash_table
->get_or_insert (t
, &existed_p
);
306 index
= encoder
->trees
.length ();
307 if (streamer_dump_file
)
309 print_node_brief (streamer_dump_file
, " Encoding indexable ",
311 fprintf (streamer_dump_file
, " as %i \n", index
);
313 encoder
->trees
.safe_push (t
);
320 /* If EXPR is an indexable tree node, output a reference to it to
321 output block OB. Otherwise, output the physical representation of
325 lto_indexable_tree_ref (struct output_block
*ob
, tree expr
,
326 enum LTO_tags
*tag
, unsigned *index
)
328 gcc_checking_assert (tree_is_indexable (expr
));
330 if (TREE_CODE (expr
) == SSA_NAME
)
332 *tag
= LTO_ssa_name_ref
;
333 *index
= SSA_NAME_VERSION (expr
);
337 *tag
= LTO_global_stream_ref
;
338 *index
= lto_get_index (&ob
->decl_state
->streams
[LTO_DECL_STREAM
], expr
);
343 /* Output a static or extern var DECL to OBS. */
346 lto_output_var_decl_ref (struct lto_out_decl_state
*decl_state
,
347 struct lto_output_stream
* obs
, tree decl
)
349 gcc_checking_assert (VAR_P (decl
));
350 streamer_write_uhwi_stream
351 (obs
, lto_get_index (&decl_state
->streams
[LTO_DECL_STREAM
],
356 /* Output a static or extern var DECL to OBS. */
359 lto_output_fn_decl_ref (struct lto_out_decl_state
*decl_state
,
360 struct lto_output_stream
* obs
, tree decl
)
362 gcc_checking_assert (TREE_CODE (decl
) == FUNCTION_DECL
);
363 streamer_write_uhwi_stream
364 (obs
, lto_get_index (&decl_state
->streams
[LTO_DECL_STREAM
], decl
));
367 /* Return true if EXPR is a tree node that can be written to disk. */
370 lto_is_streamable (tree expr
)
372 enum tree_code code
= TREE_CODE (expr
);
374 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
375 name version in lto_output_tree_ref (see output_ssa_names). */
376 return !is_lang_specific (expr
)
379 && code
!= MODIFY_EXPR
381 && code
!= TARGET_EXPR
383 && code
!= WITH_CLEANUP_EXPR
384 && code
!= STATEMENT_LIST
385 && (code
== CASE_LABEL_EXPR
387 || TREE_CODE_CLASS (code
) != tcc_statement
);
390 /* Very rough estimate of streaming size of the initializer. If we ignored
391 presence of strings, we could simply just count number of non-indexable
392 tree nodes and number of references to indexable nodes. Strings however
393 may be very large and we do not want to dump them int othe global stream.
395 Count the size of initializer until the size in DATA is positive. */
398 subtract_estimated_size (tree
*tp
, int *ws
, void *data
)
400 long *sum
= (long *)data
;
401 if (tree_is_indexable (*tp
))
403 /* Indexable tree is one reference to global stream.
404 Guess it may be about 4 bytes. */
408 /* String table entry + base of tree node needs to be streamed. */
409 if (TREE_CODE (*tp
) == STRING_CST
)
410 *sum
-= TREE_STRING_LENGTH (*tp
) + 8;
413 /* Identifiers are also variable length but should not appear
414 naked in constructor. */
415 gcc_checking_assert (TREE_CODE (*tp
) != IDENTIFIER_NODE
);
416 /* We do not really make attempt to work out size of pickled tree, as
417 it is very variable. Make it bigger than the reference. */
426 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
429 get_symbol_initial_value (lto_symtab_encoder_t encoder
, tree expr
)
431 gcc_checking_assert (DECL_P (expr
)
432 && TREE_CODE (expr
) != FUNCTION_DECL
433 && TREE_CODE (expr
) != TRANSLATION_UNIT_DECL
);
435 /* Handle DECL_INITIAL for symbols. */
436 tree initial
= DECL_INITIAL (expr
);
438 && (TREE_STATIC (expr
) || DECL_EXTERNAL (expr
))
439 && !DECL_IN_CONSTANT_POOL (expr
)
443 /* Extra section needs about 30 bytes; do not produce it for simple
445 if (!(vnode
= varpool_node::get (expr
))
446 || !lto_symtab_encoder_encode_initializer_p (encoder
, vnode
))
447 initial
= error_mark_node
;
448 if (initial
!= error_mark_node
)
451 if (walk_tree (&initial
, subtract_estimated_size
, (void *)&max_size
,
453 initial
= error_mark_node
;
461 /* Output reference to tree T to the stream.
462 Assume that T is already in encoder cache.
463 This is used to stream tree bodies where we know the DFS walk arranged
464 everything to cache. Must be matched with stream_read_tree_ref. */
467 stream_write_tree_ref (struct output_block
*ob
, tree t
)
470 streamer_write_zero (ob
);
474 bool existed_p
= streamer_tree_cache_lookup (ob
->writer_cache
, t
, &ix
);
476 streamer_write_hwi (ob
, ix
+ 1);
483 lto_indexable_tree_ref (ob
, t
, &tag
, &ix
);
484 if (tag
== LTO_ssa_name_ref
)
487 gcc_checking_assert (tag
== LTO_global_stream_ref
);
488 streamer_write_hwi (ob
, -(int)(ix
* 2 + id
+ 1));
490 if (streamer_debugging
)
491 streamer_write_uhwi (ob
, TREE_CODE (t
));
497 /* Write a physical representation of tree node EXPR to output block
498 OB. If REF_P is true, the leaves of EXPR are emitted as references
499 via lto_output_tree_ref. IX is the index into the streamer cache
500 where EXPR is stored. */
503 lto_write_tree_1 (struct output_block
*ob
, tree expr
, bool ref_p
)
505 if (streamer_dump_file
)
507 print_node_brief (streamer_dump_file
, " Streaming body of ",
509 fprintf (streamer_dump_file
, " to %s\n",
510 lto_section_name
[ob
->section_type
]);
513 /* Pack all the non-pointer fields in EXPR into a bitpack and write
514 the resulting bitpack. */
515 streamer_write_tree_bitfields (ob
, expr
);
517 /* Write all the pointer fields in EXPR. */
518 streamer_write_tree_body (ob
, expr
);
520 /* Write any LTO-specific data to OB. */
522 && TREE_CODE (expr
) != FUNCTION_DECL
523 && TREE_CODE (expr
) != TRANSLATION_UNIT_DECL
)
525 /* Handle DECL_INITIAL for symbols. */
526 tree initial
= get_symbol_initial_value
527 (ob
->decl_state
->symtab_node_encoder
, expr
);
528 stream_write_tree (ob
, initial
, ref_p
);
531 /* Stream references to early generated DIEs. Keep in sync with the
532 trees handled in dwarf2out_die_ref_for_decl. */
534 && TREE_CODE (expr
) != FIELD_DECL
535 && TREE_CODE (expr
) != DEBUG_EXPR_DECL
536 && TREE_CODE (expr
) != TYPE_DECL
)
537 || TREE_CODE (expr
) == BLOCK
)
540 unsigned HOST_WIDE_INT off
;
541 if (debug_info_level
> DINFO_LEVEL_NONE
542 && debug_hooks
->die_ref_for_decl (expr
, &sym
, &off
))
544 streamer_write_string (ob
, ob
->main_stream
, sym
, true);
545 streamer_write_uhwi (ob
, off
);
548 streamer_write_string (ob
, ob
->main_stream
, NULL
, true);
552 /* Write a physical representation of tree node EXPR to output block
553 OB. If REF_P is true, the leaves of EXPR are emitted as references
554 via lto_output_tree_ref. IX is the index into the streamer cache
555 where EXPR is stored. */
558 lto_write_tree (struct output_block
*ob
, tree expr
, bool ref_p
)
560 if (!lto_is_streamable (expr
))
561 internal_error ("tree code %qs is not supported in LTO streams",
562 get_tree_code_name (TREE_CODE (expr
)));
564 /* Write the header, containing everything needed to materialize
565 EXPR on the reading side. */
566 streamer_write_tree_header (ob
, expr
);
568 lto_write_tree_1 (ob
, expr
, ref_p
);
571 /* Emit the physical representation of tree node EXPR to output block OB,
572 If THIS_REF_P is true, the leaves of EXPR are emitted as references via
573 lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
576 lto_output_tree_1 (struct output_block
*ob
, tree expr
, hashval_t hash
,
577 bool ref_p
, bool this_ref_p
)
581 gcc_checking_assert (expr
!= NULL_TREE
582 && !(this_ref_p
&& tree_is_indexable (expr
)));
584 bool exists_p
= streamer_tree_cache_insert (ob
->writer_cache
,
586 gcc_assert (!exists_p
);
587 if (TREE_CODE (expr
) == INTEGER_CST
588 && !TREE_OVERFLOW (expr
))
590 /* Shared INTEGER_CST nodes are special because they need their
591 original type to be materialized by the reader (to implement
592 TYPE_CACHED_VALUES). */
593 streamer_write_integer_cst (ob
, expr
);
597 /* This is the first time we see EXPR, write its fields
599 lto_write_tree (ob
, expr
, ref_p
);
606 DFS (struct output_block
*ob
, tree expr
, bool ref_p
, bool this_ref_p
,
615 auto_vec
<scc_entry
,32> sccstack
;
631 /* Maximum index of scc stack containing a local tree. */
634 static int scc_entry_compare (const void *, const void *);
636 void DFS_write_tree_body (struct output_block
*ob
,
637 tree expr
, sccs
*expr_state
, bool ref_p
);
639 void DFS_write_tree (struct output_block
*ob
, sccs
*from_state
,
640 tree expr
, bool ref_p
, bool this_ref_p
);
643 hash_scc (struct output_block
*ob
, unsigned first
, unsigned size
,
644 bool ref_p
, bool this_ref_p
);
646 hash_map
<tree
, sccs
*> sccstate
;
647 auto_vec
<worklist
, 32> worklist_vec
;
648 struct obstack sccstate_obstack
;
651 /* Return true if type can not be merged with structurally same tree in
652 other translation unit. During stream out this information is propagated
653 to all trees referring to T and they are not streamed with additional
654 information needed by the tree merging in lto-common.cc (in particular,
655 scc hash codes are not streamed).
657 TRANSLATION_UNIT_DECL is handled specially since references to it does
658 not make other trees local as well. */
661 local_tree_p (tree t
)
663 switch (TREE_CODE (t
))
668 return !DECL_NAME (t
);
671 return !TREE_PUBLIC (t
) && !DECL_EXTERNAL (t
);
675 /* Anonymous namespace types are local.
676 Only work hard for main variants;
677 variant types will inherit locality. */
678 return TYPE_MAIN_VARIANT (t
) == t
679 && odr_type_p (t
) && type_with_linkage_p (t
)
680 && type_in_anonymous_namespace_p (t
);
686 /* Emit the physical representation of tree node EXPR to output block OB,
687 using depth-first search on the subgraph. If THIS_REF_P is true, the
688 leaves of EXPR are emitted as references via lto_output_tree_ref.
689 REF_P is used for streaming siblings of EXPR. If SINGLE_P is true,
690 this is for a rewalk of a single leaf SCC. */
692 DFS::DFS (struct output_block
*ob
, tree expr
, bool ref_p
, bool this_ref_p
,
695 unsigned int next_dfs_num
= 1;
697 max_local_entry
= -1;
698 gcc_obstack_init (&sccstate_obstack
);
699 DFS_write_tree (ob
, NULL
, expr
, ref_p
, this_ref_p
);
700 while (!worklist_vec
.is_empty ())
702 worklist
&w
= worklist_vec
.last ();
704 sccs
*from_state
= w
.from_state
;
705 sccs
*cstate
= w
.cstate
;
707 this_ref_p
= w
.this_ref_p
;
710 sccs
**slot
= &sccstate
.get_or_insert (expr
);
714 gcc_checking_assert (from_state
);
715 if (cstate
->dfsnum
< from_state
->dfsnum
)
716 from_state
->low
= MIN (cstate
->dfsnum
, from_state
->low
);
721 scc_entry e
= { expr
, 0 };
722 /* Not yet visited. DFS recurse and push it onto the stack. */
723 *slot
= cstate
= XOBNEW (&sccstate_obstack
, struct sccs
);
724 if (ob
->local_trees
&& local_tree_p (expr
))
725 max_local_entry
= sccstack
.length ();
726 sccstack
.safe_push (e
);
727 cstate
->dfsnum
= next_dfs_num
++;
728 cstate
->low
= cstate
->dfsnum
;
731 if (TREE_CODE (expr
) == INTEGER_CST
732 && !TREE_OVERFLOW (expr
))
733 DFS_write_tree (ob
, cstate
, TREE_TYPE (expr
), ref_p
, ref_p
);
736 DFS_write_tree_body (ob
, expr
, cstate
, ref_p
);
738 /* Walk any LTO-specific edges. */
740 && TREE_CODE (expr
) != FUNCTION_DECL
741 && TREE_CODE (expr
) != TRANSLATION_UNIT_DECL
)
743 /* Handle DECL_INITIAL for symbols. */
745 = get_symbol_initial_value (ob
->decl_state
->symtab_node_encoder
,
747 DFS_write_tree (ob
, cstate
, initial
, ref_p
, ref_p
);
753 /* See if we found an SCC. */
754 if (cstate
->low
== cstate
->dfsnum
)
756 unsigned first
, size
;
759 /* If we are re-walking a single leaf SCC just pop it,
760 let earlier worklist item access the sccstack. */
767 /* Pop the SCC and compute its size. */
768 first
= sccstack
.length ();
771 x
= sccstack
[--first
].t
;
774 size
= sccstack
.length () - first
;
776 /* No need to compute hashes for LTRANS units, we don't perform
777 any merging there. */
778 hashval_t scc_hash
= 0;
779 unsigned scc_entry_len
= 0;
780 bool local_to_unit
= !ob
->local_trees
781 || max_local_entry
>= (int)first
;
783 /* Remember that trees are local so info gets propagated to other
785 if (local_to_unit
&& ob
->local_trees
)
787 for (unsigned i
= 0; i
< size
; ++i
)
788 ob
->local_trees
->add (sccstack
[first
+ i
].t
);
791 /* As a special case do not stream TRANSLATION_UNIT_DECL as shared
792 tree. We can not mark it local because references to it does not
793 make other trees local (all global decls reffer to it via
796 && TREE_CODE (sccstack
[first
].t
) == TRANSLATION_UNIT_DECL
)
797 local_to_unit
= true;
801 scc_hash
= hash_scc (ob
, first
, size
, ref_p
, this_ref_p
);
803 /* Put the entries with the least number of collisions first. */
804 unsigned entry_start
= 0;
805 scc_entry_len
= size
+ 1;
806 for (unsigned i
= 0; i
< size
;)
809 for (i
= i
+ 1; i
< size
810 && (sccstack
[first
+ i
].hash
811 == sccstack
[first
+ from
].hash
); ++i
)
813 if (i
- from
< scc_entry_len
)
815 scc_entry_len
= i
- from
;
819 for (unsigned i
= 0; i
< scc_entry_len
; ++i
)
820 std::swap (sccstack
[first
+ i
],
821 sccstack
[first
+ entry_start
+ i
]);
823 /* We already sorted SCC deterministically in hash_scc. */
825 /* Check that we have only one SCC.
826 Naturally we may have conflicts if hash function is not
827 strong enough. Lets see how far this gets. */
828 gcc_checking_assert (scc_entry_len
== 1);
833 unsigned int prev_size
= ob
->main_stream
->total_size
;
835 /* Only global decl sections are considered by tree merging. */
836 if (ob
->section_type
!= LTO_section_decls
)
838 /* If this is the original tree we stream and it forms SCC
839 by itself then we do not need to stream SCC at all. */
840 if (worklist_vec
.is_empty () && first
== 0 && size
== 1)
842 if (streamer_dump_file
)
844 fprintf (streamer_dump_file
,
845 " Start of LTO_trees of size %i\n", size
);
847 streamer_write_record_start (ob
, LTO_trees
);
848 streamer_write_uhwi (ob
, size
);
850 /* Write LTO_tree_scc if tree merging is going to be performed. */
851 else if (!local_to_unit
852 /* These are special since sharing is not done by tree
853 merging machinery. We can not special case them earlier
854 because we still need to compute hash for further sharing
855 of trees referring to them. */
857 || (TREE_CODE (sccstack
[first
].t
) != IDENTIFIER_NODE
858 && (TREE_CODE (sccstack
[first
].t
) != INTEGER_CST
859 || TREE_OVERFLOW (sccstack
[first
].t
)))))
862 gcc_checking_assert (ob
->section_type
== LTO_section_decls
);
863 if (streamer_dump_file
)
865 fprintf (streamer_dump_file
,
866 " Start of LTO_tree_scc of size %i\n", size
);
868 streamer_write_record_start (ob
, LTO_tree_scc
);
869 /* In wast majority of cases scc_entry_len is 1 and size is small
870 integer. Use extra bit of size to stream info about
872 streamer_write_uhwi (ob
, size
* 2 + (scc_entry_len
!= 1));
873 if (scc_entry_len
!= 1)
874 streamer_write_uhwi (ob
, scc_entry_len
);
875 streamer_write_uhwi (ob
, scc_hash
);
877 /* Non-trivial SCCs must be packed to trees blocks so forward
878 references work correctly. */
881 if (streamer_dump_file
)
883 fprintf (streamer_dump_file
,
884 " Start of LTO_trees of size %i\n", size
);
886 streamer_write_record_start (ob
, LTO_trees
);
887 streamer_write_uhwi (ob
, size
);
889 else if (streamer_dump_file
)
891 fprintf (streamer_dump_file
, " Streaming single tree\n");
894 /* Write size-1 SCCs without wrapping them inside SCC bundles.
895 All INTEGER_CSTs need to be handled this way as we need
896 their type to materialize them. Also builtins are handled
899 lto_output_tree_1 (ob
, expr
, scc_hash
, ref_p
, this_ref_p
);
903 /* Write all headers and populate the streamer cache. */
904 for (unsigned i
= 0; i
< size
; ++i
)
906 hashval_t hash
= sccstack
[first
+i
].hash
;
907 tree t
= sccstack
[first
+i
].t
;
908 bool exists_p
= streamer_tree_cache_insert (ob
->writer_cache
,
910 gcc_assert (!exists_p
);
912 if (!lto_is_streamable (t
))
913 internal_error ("tree code %qs is not supported "
915 get_tree_code_name (TREE_CODE (t
)));
917 /* Write the header, containing everything needed to
918 materialize EXPR on the reading side. */
919 streamer_write_tree_header (ob
, t
);
922 /* Write the bitpacks and tree references. */
923 for (unsigned i
= 0; i
< size
; ++i
)
924 lto_write_tree_1 (ob
, sccstack
[first
+i
].t
, ref_p
);
926 if (streamer_dump_file
)
927 fprintf (streamer_dump_file
, " %u bytes\n",
928 ob
->main_stream
->total_size
- prev_size
);
930 /* Finally truncate the vector. */
931 sccstack
.truncate (first
);
932 if ((int)first
<= max_local_entry
)
933 max_local_entry
= first
- 1;
936 from_state
->low
= MIN (from_state
->low
, cstate
->low
);
940 gcc_checking_assert (from_state
);
941 from_state
->low
= MIN (from_state
->low
, cstate
->low
);
942 if (cstate
->dfsnum
< from_state
->dfsnum
)
943 from_state
->low
= MIN (cstate
->dfsnum
, from_state
->low
);
950 obstack_free (&sccstate_obstack
, NULL
);
953 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
954 DFS recurse for all tree edges originating from it. */
957 DFS::DFS_write_tree_body (struct output_block
*ob
,
958 tree expr
, sccs
*expr_state
, bool ref_p
)
960 #define DFS_follow_tree_edge(DEST) \
961 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
965 code
= TREE_CODE (expr
);
967 if (CODE_CONTAINS_STRUCT (code
, TS_TYPED
))
969 if (TREE_CODE (expr
) != IDENTIFIER_NODE
)
970 DFS_follow_tree_edge (TREE_TYPE (expr
));
973 if (CODE_CONTAINS_STRUCT (code
, TS_VECTOR
))
975 unsigned int count
= vector_cst_encoded_nelts (expr
);
976 for (unsigned int i
= 0; i
< count
; ++i
)
977 DFS_follow_tree_edge (VECTOR_CST_ENCODED_ELT (expr
, i
));
980 if (CODE_CONTAINS_STRUCT (code
, TS_POLY_INT_CST
))
981 for (unsigned int i
= 0; i
< NUM_POLY_INT_COEFFS
; ++i
)
982 DFS_follow_tree_edge (POLY_INT_CST_COEFF (expr
, i
));
984 if (CODE_CONTAINS_STRUCT (code
, TS_COMPLEX
))
986 DFS_follow_tree_edge (TREE_REALPART (expr
));
987 DFS_follow_tree_edge (TREE_IMAGPART (expr
));
990 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_MINIMAL
))
992 /* Drop names that were created for anonymous entities. */
994 && TREE_CODE (DECL_NAME (expr
)) == IDENTIFIER_NODE
995 && IDENTIFIER_ANON_P (DECL_NAME (expr
)))
998 DFS_follow_tree_edge (DECL_NAME (expr
));
999 if (TREE_CODE (expr
) != TRANSLATION_UNIT_DECL
1000 && ! DECL_CONTEXT (expr
))
1001 DFS_follow_tree_edge ((*all_translation_units
)[0]);
1003 DFS_follow_tree_edge (DECL_CONTEXT (expr
));
1006 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_COMMON
))
1008 DFS_follow_tree_edge (DECL_SIZE (expr
));
1009 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr
));
1011 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
1012 special handling in LTO, it must be handled by streamer hooks. */
1014 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr
));
1016 /* We use DECL_ABSTRACT_ORIGIN == error_mark_node to mark
1017 declarations which should be eliminated by decl merging. Be sure none
1018 leaks to this point. */
1019 gcc_assert (DECL_ABSTRACT_ORIGIN (expr
) != error_mark_node
);
1020 DFS_follow_tree_edge (DECL_ABSTRACT_ORIGIN (expr
));
1023 || TREE_CODE (expr
) == PARM_DECL
)
1024 && DECL_HAS_VALUE_EXPR_P (expr
))
1025 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr
));
1027 && DECL_HAS_DEBUG_EXPR_P (expr
))
1028 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr
));
1031 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_WITH_VIS
))
1033 /* Make sure we don't inadvertently set the assembler name. */
1034 if (DECL_ASSEMBLER_NAME_SET_P (expr
))
1035 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr
));
1038 if (CODE_CONTAINS_STRUCT (code
, TS_FIELD_DECL
))
1040 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr
));
1041 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr
));
1042 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr
));
1043 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr
));
1044 gcc_checking_assert (!DECL_FCONTEXT (expr
));
1047 if (CODE_CONTAINS_STRUCT (code
, TS_FUNCTION_DECL
))
1049 gcc_checking_assert (DECL_VINDEX (expr
) == NULL
);
1050 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr
));
1051 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr
));
1052 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr
));
1055 if (CODE_CONTAINS_STRUCT (code
, TS_TYPE_COMMON
))
1057 DFS_follow_tree_edge (TYPE_SIZE (expr
));
1058 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr
));
1059 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr
));
1060 DFS_follow_tree_edge (TYPE_NAME (expr
));
1061 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
1062 reconstructed during fixup. */
1063 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
1065 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr
));
1066 DFS_follow_tree_edge (TYPE_CONTEXT (expr
));
1067 /* TYPE_CANONICAL is re-computed during type merging, so no need
1068 to follow it here. */
1069 /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
1070 it cannot be freed by free_lang_data without triggering ICEs in
1074 if (CODE_CONTAINS_STRUCT (code
, TS_TYPE_NON_COMMON
))
1076 if (TREE_CODE (expr
) == ARRAY_TYPE
)
1077 DFS_follow_tree_edge (TYPE_DOMAIN (expr
));
1078 else if (RECORD_OR_UNION_TYPE_P (expr
))
1079 for (tree t
= TYPE_FIELDS (expr
); t
; t
= TREE_CHAIN (t
))
1080 DFS_follow_tree_edge (t
);
1081 else if (FUNC_OR_METHOD_TYPE_P (expr
))
1082 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr
));
1084 if (!POINTER_TYPE_P (expr
))
1085 DFS_follow_tree_edge (TYPE_MIN_VALUE_RAW (expr
));
1086 DFS_follow_tree_edge (TYPE_MAX_VALUE_RAW (expr
));
1089 if (CODE_CONTAINS_STRUCT (code
, TS_LIST
))
1091 DFS_follow_tree_edge (TREE_PURPOSE (expr
));
1092 DFS_follow_tree_edge (TREE_VALUE (expr
));
1093 DFS_follow_tree_edge (TREE_CHAIN (expr
));
1096 if (CODE_CONTAINS_STRUCT (code
, TS_VEC
))
1098 for (int i
= 0; i
< TREE_VEC_LENGTH (expr
); i
++)
1099 DFS_follow_tree_edge (TREE_VEC_ELT (expr
, i
));
1102 if (CODE_CONTAINS_STRUCT (code
, TS_EXP
))
1104 for (int i
= 0; i
< TREE_OPERAND_LENGTH (expr
); i
++)
1105 DFS_follow_tree_edge (TREE_OPERAND (expr
, i
));
1106 DFS_follow_tree_edge (TREE_BLOCK (expr
));
1109 if (CODE_CONTAINS_STRUCT (code
, TS_BLOCK
))
1111 for (tree t
= BLOCK_VARS (expr
); t
; t
= TREE_CHAIN (t
))
1113 /* We would have to stream externals in the block chain as
1114 non-references but we should have dropped them in
1116 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t
) || !DECL_EXTERNAL (t
));
1117 DFS_follow_tree_edge (t
);
1120 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr
));
1121 DFS_follow_tree_edge (BLOCK_ABSTRACT_ORIGIN (expr
));
1123 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
1124 information for early inlined BLOCKs so drop it on the floor instead
1125 of ICEing in dwarf2out.cc. */
1127 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
1130 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
1131 list is re-constructed from BLOCK_SUPERCONTEXT. */
1134 if (CODE_CONTAINS_STRUCT (code
, TS_BINFO
))
1139 /* Note that the number of BINFO slots has already been emitted in
1140 EXPR's header (see streamer_write_tree_header) because this length
1141 is needed to build the empty BINFO node on the reader side. */
1142 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr
), i
, t
)
1143 DFS_follow_tree_edge (t
);
1144 DFS_follow_tree_edge (BINFO_OFFSET (expr
));
1145 DFS_follow_tree_edge (BINFO_VTABLE (expr
));
1147 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
1148 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
1152 if (CODE_CONTAINS_STRUCT (code
, TS_CONSTRUCTOR
))
1157 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr
), i
, index
, value
)
1159 DFS_follow_tree_edge (index
);
1160 DFS_follow_tree_edge (value
);
1164 if (code
== OMP_CLAUSE
)
1167 for (i
= 0; i
< omp_clause_num_ops
[OMP_CLAUSE_CODE (expr
)]; i
++)
1168 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr
, i
));
1169 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr
));
1172 #undef DFS_follow_tree_edge
1175 /* Return a hash value for the tree T.
1176 CACHE holds hash values of trees outside current SCC. MAP, if non-NULL,
1177 may hold hash values if trees inside current SCC. */
1180 hash_tree (struct streamer_tree_cache_d
*cache
, hash_map
<tree
, hashval_t
> *map
, tree t
)
1182 inchash::hash hstate
;
1184 #define visit(SIBLING) \
1188 hstate.add_int (0); \
1189 else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
1190 hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \
1192 hstate.add_int (*map->get (SIBLING)); \
1194 hstate.add_int (1); \
1198 enum tree_code code
= TREE_CODE (t
);
1199 hstate
.add_int (code
);
1202 hstate
.add_flag (TREE_SIDE_EFFECTS (t
));
1203 hstate
.add_flag (TREE_CONSTANT (t
));
1204 hstate
.add_flag (TREE_READONLY (t
));
1205 hstate
.add_flag (TREE_PUBLIC (t
));
1207 hstate
.add_flag (TREE_ADDRESSABLE (t
));
1208 hstate
.add_flag (TREE_THIS_VOLATILE (t
));
1210 hstate
.add_flag (DECL_UNSIGNED (t
));
1211 else if (TYPE_P (t
))
1212 hstate
.add_flag (TYPE_UNSIGNED (t
));
1214 hstate
.add_flag (TYPE_ARTIFICIAL (t
));
1216 hstate
.add_flag (TREE_NO_WARNING (t
));
1217 hstate
.add_flag (TREE_NOTHROW (t
));
1218 hstate
.add_flag (TREE_STATIC (t
));
1219 hstate
.add_flag (TREE_PROTECTED (t
));
1220 hstate
.add_flag (TREE_DEPRECATED (t
));
1221 if (code
!= TREE_BINFO
)
1222 hstate
.add_flag (TREE_PRIVATE (t
));
1225 hstate
.add_flag (AGGREGATE_TYPE_P (t
)
1226 ? TYPE_REVERSE_STORAGE_ORDER (t
) : TYPE_SATURATING (t
));
1227 hstate
.add_flag (TYPE_ADDR_SPACE (t
));
1229 else if (code
== SSA_NAME
)
1230 hstate
.add_flag (SSA_NAME_IS_DEFAULT_DEF (t
));
1231 hstate
.commit_flag ();
1233 if (CODE_CONTAINS_STRUCT (code
, TS_INT_CST
))
1234 hstate
.add_wide_int (wi::to_widest (t
));
1236 if (CODE_CONTAINS_STRUCT (code
, TS_REAL_CST
))
1238 REAL_VALUE_TYPE r
= TREE_REAL_CST (t
);
1239 hstate
.add_flag (r
.cl
);
1240 hstate
.add_flag (r
.sign
);
1241 hstate
.add_flag (r
.signalling
);
1242 hstate
.add_flag (r
.canonical
);
1243 hstate
.commit_flag ();
1244 hstate
.add_int (r
.uexp
);
1245 hstate
.add (r
.sig
, sizeof (r
.sig
));
1248 if (CODE_CONTAINS_STRUCT (code
, TS_FIXED_CST
))
1250 FIXED_VALUE_TYPE f
= TREE_FIXED_CST (t
);
1251 hstate
.add_int (f
.mode
);
1252 hstate
.add_int (f
.data
.low
);
1253 hstate
.add_int (f
.data
.high
);
1256 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_COMMON
))
1258 hstate
.add_hwi (DECL_MODE (t
));
1259 hstate
.add_flag (DECL_NONLOCAL (t
));
1260 hstate
.add_flag (DECL_VIRTUAL_P (t
));
1261 hstate
.add_flag (DECL_IGNORED_P (t
));
1262 hstate
.add_flag (DECL_ABSTRACT_P (t
));
1263 hstate
.add_flag (DECL_ARTIFICIAL (t
));
1264 hstate
.add_flag (DECL_USER_ALIGN (t
));
1265 hstate
.add_flag (DECL_PRESERVE_P (t
));
1266 hstate
.add_flag (DECL_EXTERNAL (t
));
1267 hstate
.add_flag (DECL_NOT_GIMPLE_REG_P (t
));
1268 hstate
.commit_flag ();
1269 hstate
.add_int (DECL_ALIGN (t
));
1270 if (code
== LABEL_DECL
)
1272 hstate
.add_int (EH_LANDING_PAD_NR (t
));
1273 hstate
.add_int (LABEL_DECL_UID (t
));
1275 else if (code
== FIELD_DECL
)
1277 hstate
.add_flag (DECL_PACKED (t
));
1278 hstate
.add_flag (DECL_NONADDRESSABLE_P (t
));
1279 hstate
.add_flag (DECL_PADDING_P (t
));
1280 if (DECL_BIT_FIELD (t
))
1281 hstate
.add_flag (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (t
));
1283 hstate
.add_flag (DECL_FIELD_ABI_IGNORED (t
));
1284 hstate
.add_int (DECL_OFFSET_ALIGN (t
));
1286 else if (code
== VAR_DECL
)
1288 hstate
.add_flag (DECL_HAS_DEBUG_EXPR_P (t
));
1289 hstate
.add_flag (DECL_NONLOCAL_FRAME (t
));
1291 if (code
== RESULT_DECL
1292 || code
== PARM_DECL
1293 || code
== VAR_DECL
)
1295 hstate
.add_flag (DECL_BY_REFERENCE (t
));
1296 if (code
== VAR_DECL
1297 || code
== PARM_DECL
)
1298 hstate
.add_flag (DECL_HAS_VALUE_EXPR_P (t
));
1300 hstate
.commit_flag ();
1303 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_WRTL
))
1304 hstate
.add_int (DECL_REGISTER (t
));
1306 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_WITH_VIS
))
1308 hstate
.add_flag (DECL_COMMON (t
));
1309 hstate
.add_flag (DECL_DLLIMPORT_P (t
));
1310 hstate
.add_flag (DECL_WEAK (t
));
1311 hstate
.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t
));
1312 hstate
.add_flag (DECL_COMDAT (t
));
1313 hstate
.add_flag (DECL_VISIBILITY_SPECIFIED (t
));
1314 hstate
.add_int (DECL_VISIBILITY (t
));
1315 if (code
== VAR_DECL
)
1317 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
1318 hstate
.add_flag (DECL_HARD_REGISTER (t
));
1319 hstate
.add_flag (DECL_IN_CONSTANT_POOL (t
));
1321 if (TREE_CODE (t
) == FUNCTION_DECL
)
1323 hstate
.add_flag (DECL_FINAL_P (t
));
1324 hstate
.add_flag (DECL_CXX_CONSTRUCTOR_P (t
));
1325 hstate
.add_flag (DECL_CXX_DESTRUCTOR_P (t
));
1327 hstate
.commit_flag ();
1330 if (CODE_CONTAINS_STRUCT (code
, TS_FUNCTION_DECL
))
1332 hstate
.add_int (DECL_BUILT_IN_CLASS (t
));
1333 hstate
.add_flag (DECL_STATIC_CONSTRUCTOR (t
));
1334 hstate
.add_flag (DECL_STATIC_DESTRUCTOR (t
));
1335 hstate
.add_flag (FUNCTION_DECL_DECL_TYPE (t
));
1336 hstate
.add_flag (DECL_UNINLINABLE (t
));
1337 hstate
.add_flag (DECL_POSSIBLY_INLINED (t
));
1338 hstate
.add_flag (DECL_IS_NOVOPS (t
));
1339 hstate
.add_flag (DECL_IS_RETURNS_TWICE (t
));
1340 hstate
.add_flag (DECL_IS_MALLOC (t
));
1341 hstate
.add_flag (DECL_DECLARED_INLINE_P (t
));
1342 hstate
.add_flag (DECL_STATIC_CHAIN (t
));
1343 hstate
.add_flag (DECL_NO_INLINE_WARNING_P (t
));
1344 hstate
.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t
));
1345 hstate
.add_flag (DECL_NO_LIMIT_STACK (t
));
1346 hstate
.add_flag (DECL_DISREGARD_INLINE_LIMITS (t
));
1347 hstate
.add_flag (DECL_PURE_P (t
));
1348 hstate
.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t
));
1349 hstate
.commit_flag ();
1350 if (DECL_BUILT_IN_CLASS (t
) != NOT_BUILT_IN
)
1351 hstate
.add_int (DECL_UNCHECKED_FUNCTION_CODE (t
));
1354 if (CODE_CONTAINS_STRUCT (code
, TS_TYPE_COMMON
))
1356 hstate
.add_hwi (TYPE_MODE (t
));
1357 /* TYPE_NO_FORCE_BLK is private to stor-layout and need
1359 hstate
.add_flag (TYPE_PACKED (t
));
1360 hstate
.add_flag (TYPE_RESTRICT (t
));
1361 hstate
.add_flag (TYPE_USER_ALIGN (t
));
1362 hstate
.add_flag (TYPE_READONLY (t
));
1363 if (RECORD_OR_UNION_TYPE_P (t
))
1365 hstate
.add_flag (TYPE_TRANSPARENT_AGGR (t
));
1366 hstate
.add_flag (TYPE_FINAL_P (t
));
1367 hstate
.add_flag (TYPE_CXX_ODR_P (t
));
1369 else if (code
== ARRAY_TYPE
)
1370 hstate
.add_flag (TYPE_NONALIASED_COMPONENT (t
));
1371 if (code
== ARRAY_TYPE
|| code
== INTEGER_TYPE
)
1372 hstate
.add_flag (TYPE_STRING_FLAG (t
));
1373 if (AGGREGATE_TYPE_P (t
))
1374 hstate
.add_flag (TYPE_TYPELESS_STORAGE (t
));
1375 hstate
.commit_flag ();
1376 hstate
.add_int (TYPE_PRECISION (t
));
1377 hstate
.add_int (TYPE_ALIGN (t
));
1378 hstate
.add_int (TYPE_EMPTY_P (t
));
1381 if (CODE_CONTAINS_STRUCT (code
, TS_TRANSLATION_UNIT_DECL
))
1382 hstate
.add (TRANSLATION_UNIT_LANGUAGE (t
),
1383 strlen (TRANSLATION_UNIT_LANGUAGE (t
)));
1385 if (CODE_CONTAINS_STRUCT (code
, TS_TARGET_OPTION
)
1386 /* We don't stream these when passing things to a different target. */
1387 && !lto_stream_offload_p
)
1388 hstate
.add_hwi (cl_target_option_hash (TREE_TARGET_OPTION (t
)));
1390 if (CODE_CONTAINS_STRUCT (code
, TS_OPTIMIZATION
))
1391 hstate
.add_hwi (cl_optimization_hash (TREE_OPTIMIZATION (t
)));
1393 if (CODE_CONTAINS_STRUCT (code
, TS_IDENTIFIER
))
1394 hstate
.merge_hash (IDENTIFIER_HASH_VALUE (t
));
1396 if (CODE_CONTAINS_STRUCT (code
, TS_STRING
))
1397 hstate
.add (TREE_STRING_POINTER (t
), TREE_STRING_LENGTH (t
));
1399 if (CODE_CONTAINS_STRUCT (code
, TS_TYPED
))
1401 if (code
!= IDENTIFIER_NODE
)
1402 visit (TREE_TYPE (t
));
1405 if (CODE_CONTAINS_STRUCT (code
, TS_VECTOR
))
1407 unsigned int count
= vector_cst_encoded_nelts (t
);
1408 for (unsigned int i
= 0; i
< count
; ++i
)
1409 visit (VECTOR_CST_ENCODED_ELT (t
, i
));
1412 if (CODE_CONTAINS_STRUCT (code
, TS_POLY_INT_CST
))
1413 for (unsigned int i
= 0; i
< NUM_POLY_INT_COEFFS
; ++i
)
1414 visit (POLY_INT_CST_COEFF (t
, i
));
1416 if (CODE_CONTAINS_STRUCT (code
, TS_COMPLEX
))
1418 visit (TREE_REALPART (t
));
1419 visit (TREE_IMAGPART (t
));
1422 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_MINIMAL
))
1424 /* Drop names that were created for anonymous entities. */
1426 && TREE_CODE (DECL_NAME (t
)) == IDENTIFIER_NODE
1427 && IDENTIFIER_ANON_P (DECL_NAME (t
)))
1430 visit (DECL_NAME (t
));
1431 if (DECL_FILE_SCOPE_P (t
))
1434 visit (DECL_CONTEXT (t
));
1437 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_COMMON
))
1439 visit (DECL_SIZE (t
));
1440 visit (DECL_SIZE_UNIT (t
));
1441 visit (DECL_ATTRIBUTES (t
));
1442 if ((code
== VAR_DECL
1443 || code
== PARM_DECL
)
1444 && DECL_HAS_VALUE_EXPR_P (t
))
1445 visit (DECL_VALUE_EXPR (t
));
1446 if (code
== VAR_DECL
1447 && DECL_HAS_DEBUG_EXPR_P (t
))
1448 visit (DECL_DEBUG_EXPR (t
));
1449 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
1450 be able to call get_symbol_initial_value. */
1453 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_WITH_VIS
))
1455 if (DECL_ASSEMBLER_NAME_SET_P (t
))
1456 visit (DECL_ASSEMBLER_NAME (t
));
1459 if (CODE_CONTAINS_STRUCT (code
, TS_FIELD_DECL
))
1461 visit (DECL_FIELD_OFFSET (t
));
1462 visit (DECL_BIT_FIELD_TYPE (t
));
1463 visit (DECL_BIT_FIELD_REPRESENTATIVE (t
));
1464 visit (DECL_FIELD_BIT_OFFSET (t
));
1467 if (CODE_CONTAINS_STRUCT (code
, TS_FUNCTION_DECL
))
1469 visit (DECL_FUNCTION_PERSONALITY (t
));
1470 visit (DECL_FUNCTION_SPECIFIC_TARGET (t
));
1471 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t
));
1474 if (CODE_CONTAINS_STRUCT (code
, TS_TYPE_COMMON
))
1476 visit (TYPE_SIZE (t
));
1477 visit (TYPE_SIZE_UNIT (t
));
1478 visit (TYPE_ATTRIBUTES (t
));
1479 visit (TYPE_NAME (t
));
1480 visit (TYPE_MAIN_VARIANT (t
));
1481 if (TYPE_FILE_SCOPE_P (t
))
1484 visit (TYPE_CONTEXT (t
));
1487 if (CODE_CONTAINS_STRUCT (code
, TS_TYPE_NON_COMMON
))
1489 if (code
== ARRAY_TYPE
)
1490 visit (TYPE_DOMAIN (t
));
1491 else if (RECORD_OR_UNION_TYPE_P (t
))
1492 for (tree f
= TYPE_FIELDS (t
); f
; f
= TREE_CHAIN (f
))
1494 else if (code
== FUNCTION_TYPE
1495 || code
== METHOD_TYPE
)
1496 visit (TYPE_ARG_TYPES (t
));
1497 if (!POINTER_TYPE_P (t
))
1498 visit (TYPE_MIN_VALUE_RAW (t
));
1499 visit (TYPE_MAX_VALUE_RAW (t
));
1502 if (CODE_CONTAINS_STRUCT (code
, TS_LIST
))
1504 visit (TREE_PURPOSE (t
));
1505 visit (TREE_VALUE (t
));
1506 visit (TREE_CHAIN (t
));
1509 if (CODE_CONTAINS_STRUCT (code
, TS_VEC
))
1510 for (int i
= 0; i
< TREE_VEC_LENGTH (t
); ++i
)
1511 visit (TREE_VEC_ELT (t
, i
));
1513 if (CODE_CONTAINS_STRUCT (code
, TS_EXP
))
1515 hstate
.add_hwi (TREE_OPERAND_LENGTH (t
));
1516 for (int i
= 0; i
< TREE_OPERAND_LENGTH (t
); ++i
)
1517 visit (TREE_OPERAND (t
, i
));
1520 if (CODE_CONTAINS_STRUCT (code
, TS_BINFO
))
1524 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t
), i
, b
)
1526 visit (BINFO_OFFSET (t
));
1527 visit (BINFO_VTABLE (t
));
1528 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1529 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used
1533 if (CODE_CONTAINS_STRUCT (code
, TS_CONSTRUCTOR
))
1537 hstate
.add_hwi (CONSTRUCTOR_NELTS (t
));
1538 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t
), i
, index
, value
)
1545 if (code
== OMP_CLAUSE
)
1550 hstate
.add_hwi (OMP_CLAUSE_CODE (t
));
1551 switch (OMP_CLAUSE_CODE (t
))
1553 case OMP_CLAUSE_DEFAULT
:
1554 val
= OMP_CLAUSE_DEFAULT_KIND (t
);
1556 case OMP_CLAUSE_SCHEDULE
:
1557 val
= OMP_CLAUSE_SCHEDULE_KIND (t
);
1559 case OMP_CLAUSE_DEPEND
:
1560 val
= OMP_CLAUSE_DEPEND_KIND (t
);
1562 case OMP_CLAUSE_DOACROSS
:
1563 val
= OMP_CLAUSE_DOACROSS_KIND (t
);
1565 case OMP_CLAUSE_MAP
:
1566 val
= OMP_CLAUSE_MAP_KIND (t
);
1568 case OMP_CLAUSE_PROC_BIND
:
1569 val
= OMP_CLAUSE_PROC_BIND_KIND (t
);
1571 case OMP_CLAUSE_REDUCTION
:
1572 case OMP_CLAUSE_TASK_REDUCTION
:
1573 case OMP_CLAUSE_IN_REDUCTION
:
1574 val
= OMP_CLAUSE_REDUCTION_CODE (t
);
1580 hstate
.add_hwi (val
);
1581 for (i
= 0; i
< omp_clause_num_ops
[OMP_CLAUSE_CODE (t
)]; i
++)
1582 visit (OMP_CLAUSE_OPERAND (t
, i
));
1583 visit (OMP_CLAUSE_CHAIN (t
));
1586 return hstate
.end ();
1591 /* Compare two SCC entries by their hash value for qsorting them. */
1594 DFS::scc_entry_compare (const void *p1_
, const void *p2_
)
1596 const scc_entry
*p1
= (const scc_entry
*) p1_
;
1597 const scc_entry
*p2
= (const scc_entry
*) p2_
;
1598 if (p1
->hash
< p2
->hash
)
1600 else if (p1
->hash
> p2
->hash
)
1605 /* Return a hash value for the SCC on the SCC stack from FIRST with SIZE.
1606 THIS_REF_P and REF_P are as passed to lto_output_tree for FIRST. */
1609 DFS::hash_scc (struct output_block
*ob
, unsigned first
, unsigned size
,
1610 bool ref_p
, bool this_ref_p
)
1612 unsigned int last_classes
= 0, iterations
= 0;
1614 /* Compute hash values for the SCC members. */
1615 for (unsigned i
= 0; i
< size
; ++i
)
1616 sccstack
[first
+i
].hash
1617 = hash_tree (ob
->writer_cache
, NULL
, sccstack
[first
+i
].t
);
1620 return sccstack
[first
].hash
;
1622 /* We aim to get unique hash for every tree within SCC and compute hash value
1623 of the whole SCC by combining all values together in a stable (entry-point
1624 independent) order. This guarantees that the same SCC regions within
1625 different translation units will get the same hash values and therefore
1626 will be merged at WPA time.
1628 Often the hashes are already unique. In that case we compute the SCC hash
1629 by combining individual hash values in an increasing order.
1631 If there are duplicates, we seek at least one tree with unique hash (and
1632 pick one with minimal hash and this property). Then we obtain a stable
1633 order by DFS walk starting from this unique tree and then use the index
1634 within this order to make individual hash values unique.
1636 If there is no tree with unique hash, we iteratively propagate the hash
1637 values across the internal edges of SCC. This usually quickly leads
1638 to unique hashes. Consider, for example, an SCC containing two pointers
1639 that are identical except for the types they point to and assume that
1640 these types are also part of the SCC. The propagation will add the
1641 points-to type information into their hash values. */
1644 /* Sort the SCC so we can easily check for uniqueness. */
1645 qsort (&sccstack
[first
], size
, sizeof (scc_entry
), scc_entry_compare
);
1647 unsigned int classes
= 1;
1648 int firstunique
= -1;
1650 /* Find the tree with lowest unique hash (if it exists) and compute
1651 the number of equivalence classes. */
1652 if (sccstack
[first
].hash
!= sccstack
[first
+1].hash
)
1654 for (unsigned i
= 1; i
< size
; ++i
)
1655 if (sccstack
[first
+i
-1].hash
!= sccstack
[first
+i
].hash
)
1658 if (firstunique
== -1
1660 || sccstack
[first
+i
+1].hash
!= sccstack
[first
+i
].hash
))
1664 /* If we found a tree with unique hash, stop the iteration. */
1665 if (firstunique
!= -1
1666 /* Also terminate if we run out of iterations or if the number of
1667 equivalence classes is no longer increasing.
1668 For example a cyclic list of trees that are all equivalent will
1669 never have unique entry point; we however do not build such SCCs
1671 || classes
<= last_classes
|| iterations
> 16)
1675 /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk
1676 starting from FIRSTUNIQUE to obtain a stable order. */
1677 if (classes
!= size
&& firstunique
!= -1)
1679 hash_map
<tree
, hashval_t
> map(size
*2);
1681 /* Store hash values into a map, so we can associate them with
1682 the reordered SCC. */
1683 for (unsigned i
= 0; i
< size
; ++i
)
1684 map
.put (sccstack
[first
+i
].t
, sccstack
[first
+i
].hash
);
1686 DFS
again (ob
, sccstack
[first
+firstunique
].t
, ref_p
, this_ref_p
,
1688 gcc_assert (again
.sccstack
.length () == size
);
1690 memcpy (sccstack
.address () + first
,
1691 again
.sccstack
.address (),
1692 sizeof (scc_entry
) * size
);
1694 /* Update hash values of individual members by hashing in the
1695 index within the stable order. This ensures uniqueness.
1696 Also compute the SCC hash by mixing in all hash values in
1697 the stable order we obtained. */
1698 sccstack
[first
].hash
= *map
.get (sccstack
[first
].t
);
1699 scc_hash
= sccstack
[first
].hash
;
1700 for (unsigned i
= 1; i
< size
; ++i
)
1702 sccstack
[first
+i
].hash
1703 = iterative_hash_hashval_t (i
,
1704 *map
.get (sccstack
[first
+i
].t
));
1706 = iterative_hash_hashval_t (scc_hash
,
1707 sccstack
[first
+i
].hash
);
1710 /* If we got a unique hash value for each tree, then sort already
1711 ensured entry-point independent order. Only compute the final
1714 If we failed to find the unique entry point, we go by the same
1715 route. We will eventually introduce unwanted hash conflicts. */
1718 scc_hash
= sccstack
[first
].hash
;
1719 for (unsigned i
= 1; i
< size
; ++i
)
1721 = iterative_hash_hashval_t (scc_hash
, sccstack
[first
+i
].hash
);
1723 /* We cannot 100% guarantee that the hash won't conflict so as
1724 to make it impossible to find a unique hash. This however
1725 should be an extremely rare case. ICE for now so possible
1726 issues are found and evaluated. */
1727 gcc_checking_assert (classes
== size
);
1730 /* To avoid conflicts across SCCs, iteratively hash the whole SCC
1731 hash into the hash of each element. */
1732 for (unsigned i
= 0; i
< size
; ++i
)
1733 sccstack
[first
+i
].hash
1734 = iterative_hash_hashval_t (sccstack
[first
+i
].hash
, scc_hash
);
1738 last_classes
= classes
;
1741 /* We failed to identify the entry point; propagate hash values across
1743 hash_map
<tree
, hashval_t
> map(size
*2);
1745 for (unsigned i
= 0; i
< size
; ++i
)
1746 map
.put (sccstack
[first
+i
].t
, sccstack
[first
+i
].hash
);
1748 for (unsigned i
= 0; i
< size
; i
++)
1749 sccstack
[first
+i
].hash
1750 = hash_tree (ob
->writer_cache
, &map
, sccstack
[first
+i
].t
);
1755 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1756 already in the streamer cache. Main routine called for
1757 each visit of EXPR. */
1760 DFS::DFS_write_tree (struct output_block
*ob
, sccs
*from_state
,
1761 tree expr
, bool ref_p
, bool this_ref_p
)
1763 /* Handle special cases. */
1764 if (expr
== NULL_TREE
)
1767 /* Do not DFS walk into indexable trees. */
1768 if (this_ref_p
&& tree_is_indexable (expr
))
1771 /* Check if we already streamed EXPR. */
1772 if (streamer_tree_cache_lookup (ob
->writer_cache
, expr
, NULL
))
1774 /* Reference to a local tree makes entry also local. We always process
1775 top of stack entry, so set max to number of entries in stack - 1. */
1777 && ob
->local_trees
->contains (expr
))
1778 max_local_entry
= sccstack
.length () - 1;
1784 w
.from_state
= from_state
;
1787 w
.this_ref_p
= this_ref_p
;
1788 worklist_vec
.safe_push (w
);
1792 /* Emit the physical representation of tree node EXPR to output block OB.
1793 If THIS_REF_P is true, the leaves of EXPR are emitted as references via
1794 lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1797 lto_output_tree (struct output_block
*ob
, tree expr
,
1798 bool ref_p
, bool this_ref_p
)
1802 unsigned int size
= ob
->main_stream
->total_size
;
1803 /* This is the first time we see EXPR, write all reachable
1805 static bool in_dfs_walk
;
1807 if (expr
== NULL_TREE
)
1809 streamer_write_record_start (ob
, LTO_null
);
1813 if (this_ref_p
&& tree_is_indexable (expr
))
1818 lto_indexable_tree_ref (ob
, expr
, &tag
, &ix
);
1819 streamer_write_record_start (ob
, tag
);
1820 streamer_write_uhwi (ob
, ix
);
1824 existed_p
= streamer_tree_cache_lookup (ob
->writer_cache
, expr
, &ix
);
1827 if (streamer_dump_file
)
1830 print_node_brief (streamer_dump_file
, " Streaming ref to ",
1833 print_node_brief (streamer_dump_file
, " Streaming ref to ",
1835 fprintf (streamer_dump_file
, "\n");
1837 /* If a node has already been streamed out, make sure that
1838 we don't write it more than once. Otherwise, the reader
1839 will instantiate two different nodes for the same object. */
1840 streamer_write_record_start (ob
, LTO_tree_pickle_reference
);
1841 streamer_write_uhwi (ob
, ix
);
1842 if (streamer_debugging
)
1843 streamer_write_enum (ob
->main_stream
, LTO_tags
, LTO_NUM_TAGS
,
1844 lto_tree_code_to_tag (TREE_CODE (expr
)));
1845 lto_stats
.num_pickle_refs_output
++;
1849 /* Protect against recursion which means disconnect between
1850 what tree edges we walk in the DFS walk and what edges
1852 gcc_assert (!in_dfs_walk
);
1854 if (streamer_dump_file
)
1856 print_node_brief (streamer_dump_file
, " Streaming tree ",
1858 fprintf (streamer_dump_file
, "\n");
1861 /* Start the DFS walk. */
1862 /* Save ob state ... */
1865 DFS (ob
, expr
, ref_p
, this_ref_p
, false);
1867 /* Finally append a reference to the tree we were writing. */
1868 existed_p
= streamer_tree_cache_lookup (ob
->writer_cache
, expr
, &ix
);
1870 /* DFS walk above possibly skipped streaming EXPR itself to let us inline
1873 lto_output_tree_1 (ob
, expr
, 0, ref_p
, this_ref_p
);
1874 else if (this_ref_p
)
1876 if (streamer_dump_file
)
1878 print_node_brief (streamer_dump_file
,
1879 " Streaming final ref to ",
1881 fprintf (streamer_dump_file
, "\n");
1883 streamer_write_record_start (ob
, LTO_tree_pickle_reference
);
1884 streamer_write_uhwi (ob
, ix
);
1885 if (streamer_debugging
)
1886 streamer_write_enum (ob
->main_stream
, LTO_tags
, LTO_NUM_TAGS
,
1887 lto_tree_code_to_tag (TREE_CODE (expr
)));
1889 in_dfs_walk
= false;
1890 lto_stats
.num_pickle_refs_output
++;
1892 if (streamer_dump_file
&& !in_dfs_walk
)
1893 fprintf (streamer_dump_file
, " %u bytes\n",
1894 ob
->main_stream
->total_size
- size
);
1898 /* Output to OB a list of try/catch handlers starting with FIRST. */
1901 output_eh_try_list (struct output_block
*ob
, eh_catch first
)
1905 for (n
= first
; n
; n
= n
->next_catch
)
1907 streamer_write_record_start (ob
, LTO_eh_catch
);
1908 stream_write_tree (ob
, n
->type_list
, true);
1909 stream_write_tree (ob
, n
->filter_list
, true);
1910 stream_write_tree (ob
, n
->label
, true);
1913 streamer_write_record_start (ob
, LTO_null
);
1917 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1918 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1919 detect EH region sharing. */
1922 output_eh_region (struct output_block
*ob
, eh_region r
)
1928 streamer_write_record_start (ob
, LTO_null
);
1932 if (r
->type
== ERT_CLEANUP
)
1933 tag
= LTO_ert_cleanup
;
1934 else if (r
->type
== ERT_TRY
)
1936 else if (r
->type
== ERT_ALLOWED_EXCEPTIONS
)
1937 tag
= LTO_ert_allowed_exceptions
;
1938 else if (r
->type
== ERT_MUST_NOT_THROW
)
1939 tag
= LTO_ert_must_not_throw
;
1943 streamer_write_record_start (ob
, tag
);
1944 streamer_write_hwi (ob
, r
->index
);
1947 streamer_write_hwi (ob
, r
->outer
->index
);
1949 streamer_write_zero (ob
);
1952 streamer_write_hwi (ob
, r
->inner
->index
);
1954 streamer_write_zero (ob
);
1957 streamer_write_hwi (ob
, r
->next_peer
->index
);
1959 streamer_write_zero (ob
);
1961 if (r
->type
== ERT_TRY
)
1963 output_eh_try_list (ob
, r
->u
.eh_try
.first_catch
);
1965 else if (r
->type
== ERT_ALLOWED_EXCEPTIONS
)
1967 stream_write_tree (ob
, r
->u
.allowed
.type_list
, true);
1968 stream_write_tree (ob
, r
->u
.allowed
.label
, true);
1969 streamer_write_uhwi (ob
, r
->u
.allowed
.filter
);
1971 else if (r
->type
== ERT_MUST_NOT_THROW
)
1973 stream_write_tree (ob
, r
->u
.must_not_throw
.failure_decl
, true);
1974 bitpack_d bp
= bitpack_create (ob
->main_stream
);
1975 stream_output_location (ob
, &bp
, r
->u
.must_not_throw
.failure_loc
);
1976 streamer_write_bitpack (&bp
);
1979 if (r
->landing_pads
)
1980 streamer_write_hwi (ob
, r
->landing_pads
->index
);
1982 streamer_write_zero (ob
);
1986 /* Output landing pad LP to OB. */
1989 output_eh_lp (struct output_block
*ob
, eh_landing_pad lp
)
1993 streamer_write_record_start (ob
, LTO_null
);
1997 streamer_write_record_start (ob
, LTO_eh_landing_pad
);
1998 streamer_write_hwi (ob
, lp
->index
);
2000 streamer_write_hwi (ob
, lp
->next_lp
->index
);
2002 streamer_write_zero (ob
);
2005 streamer_write_hwi (ob
, lp
->region
->index
);
2007 streamer_write_zero (ob
);
2009 stream_write_tree (ob
, lp
->post_landing_pad
, true);
2013 /* Output the existing eh_table to OB. */
2016 output_eh_regions (struct output_block
*ob
, struct function
*fn
)
2018 if (fn
->eh
&& fn
->eh
->region_tree
)
2025 streamer_write_record_start (ob
, LTO_eh_table
);
2027 /* Emit the index of the root of the EH region tree. */
2028 streamer_write_hwi (ob
, fn
->eh
->region_tree
->index
);
2030 /* Emit all the EH regions in the region array. */
2031 streamer_write_hwi (ob
, vec_safe_length (fn
->eh
->region_array
));
2032 FOR_EACH_VEC_SAFE_ELT (fn
->eh
->region_array
, i
, eh
)
2033 output_eh_region (ob
, eh
);
2035 /* Emit all landing pads. */
2036 streamer_write_hwi (ob
, vec_safe_length (fn
->eh
->lp_array
));
2037 FOR_EACH_VEC_SAFE_ELT (fn
->eh
->lp_array
, i
, lp
)
2038 output_eh_lp (ob
, lp
);
2040 /* Emit all the runtime type data. */
2041 streamer_write_hwi (ob
, vec_safe_length (fn
->eh
->ttype_data
));
2042 FOR_EACH_VEC_SAFE_ELT (fn
->eh
->ttype_data
, i
, ttype
)
2043 stream_write_tree (ob
, ttype
, true);
2045 /* Emit the table of action chains. */
2046 if (targetm
.arm_eabi_unwinder
)
2049 streamer_write_hwi (ob
, vec_safe_length (fn
->eh
->ehspec_data
.arm_eabi
));
2050 FOR_EACH_VEC_SAFE_ELT (fn
->eh
->ehspec_data
.arm_eabi
, i
, t
)
2051 stream_write_tree (ob
, t
, true);
2056 streamer_write_hwi (ob
, vec_safe_length (fn
->eh
->ehspec_data
.other
));
2057 FOR_EACH_VEC_SAFE_ELT (fn
->eh
->ehspec_data
.other
, i
, c
)
2058 streamer_write_char_stream (ob
->main_stream
, c
);
2062 /* The LTO_null either terminates the record or indicates that there
2063 are no eh_records at all. */
2064 streamer_write_record_start (ob
, LTO_null
);
2068 /* Output all of the active ssa names to the ssa_names stream. */
2071 output_ssa_names (struct output_block
*ob
, struct function
*fn
)
2073 unsigned int i
, len
;
2075 len
= vec_safe_length (SSANAMES (fn
));
2076 streamer_write_uhwi (ob
, len
);
2078 for (i
= 1; i
< len
; i
++)
2080 tree ptr
= (*SSANAMES (fn
))[i
];
2082 if (ptr
== NULL_TREE
2083 || SSA_NAME_IN_FREE_LIST (ptr
)
2084 || virtual_operand_p (ptr
)
2085 /* Simply skip unreleased SSA names. */
2086 || (! SSA_NAME_IS_DEFAULT_DEF (ptr
)
2087 && (! SSA_NAME_DEF_STMT (ptr
)
2088 || ! gimple_bb (SSA_NAME_DEF_STMT (ptr
)))))
2091 streamer_write_uhwi (ob
, i
);
2092 streamer_write_char_stream (ob
->main_stream
,
2093 SSA_NAME_IS_DEFAULT_DEF (ptr
));
2094 if (SSA_NAME_VAR (ptr
))
2095 stream_write_tree (ob
, SSA_NAME_VAR (ptr
), true);
2097 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
2098 stream_write_tree (ob
, TREE_TYPE (ptr
), true);
2101 streamer_write_zero (ob
);
2106 /* Output the cfg. */
2109 output_cfg (struct output_block
*ob
, struct function
*fn
)
2111 struct lto_output_stream
*tmp_stream
= ob
->main_stream
;
2114 ob
->main_stream
= ob
->cfg_stream
;
2116 streamer_write_enum (ob
->main_stream
, profile_status_d
, PROFILE_LAST
,
2117 profile_status_for_fn (fn
));
2119 /* Output the number of the highest basic block. */
2120 streamer_write_uhwi (ob
, last_basic_block_for_fn (fn
));
2122 FOR_ALL_BB_FN (bb
, fn
)
2127 streamer_write_hwi (ob
, bb
->index
);
2129 /* Output the successors and the edge flags. */
2130 streamer_write_uhwi (ob
, EDGE_COUNT (bb
->succs
));
2131 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2133 bitpack_d bp
= bitpack_create (ob
->main_stream
);
2134 bp_pack_var_len_unsigned (&bp
, e
->dest
->index
);
2135 bp_pack_var_len_unsigned (&bp
, e
->flags
);
2136 stream_output_location_and_block (ob
, &bp
, e
->goto_locus
);
2137 e
->probability
.stream_out (ob
);
2141 streamer_write_hwi (ob
, -1);
2143 bb
= ENTRY_BLOCK_PTR_FOR_FN (fn
);
2146 streamer_write_hwi (ob
, bb
->next_bb
->index
);
2150 streamer_write_hwi (ob
, -1);
2152 /* Output the number of loops. */
2153 streamer_write_uhwi (ob
, number_of_loops (fn
));
2155 /* Output each loop, skipping the tree root which has number zero. */
2156 for (unsigned i
= 1; i
< number_of_loops (fn
); ++i
)
2158 class loop
*loop
= get_loop (fn
, i
);
2160 /* Write the index of the loop header. That's enough to rebuild
2161 the loop tree on the reader side. Stream -1 for an unused
2165 streamer_write_hwi (ob
, -1);
2169 streamer_write_hwi (ob
, loop
->header
->index
);
2171 /* Write everything copy_loop_info copies. */
2172 streamer_write_enum (ob
->main_stream
,
2173 loop_estimation
, EST_LAST
, loop
->estimate_state
);
2174 streamer_write_hwi (ob
, loop
->any_upper_bound
);
2175 if (loop
->any_upper_bound
)
2176 streamer_write_widest_int (ob
, loop
->nb_iterations_upper_bound
);
2177 streamer_write_hwi (ob
, loop
->any_likely_upper_bound
);
2178 if (loop
->any_likely_upper_bound
)
2179 streamer_write_widest_int (ob
, loop
->nb_iterations_likely_upper_bound
);
2180 streamer_write_hwi (ob
, loop
->any_estimate
);
2181 if (loop
->any_estimate
)
2182 streamer_write_widest_int (ob
, loop
->nb_iterations_estimate
);
2184 /* Write OMP SIMD related info. */
2185 streamer_write_hwi (ob
, loop
->safelen
);
2186 streamer_write_hwi (ob
, loop
->unroll
);
2187 streamer_write_hwi (ob
, loop
->owned_clique
);
2188 streamer_write_hwi (ob
, loop
->dont_vectorize
);
2189 streamer_write_hwi (ob
, loop
->force_vectorize
);
2190 streamer_write_hwi (ob
, loop
->finite_p
);
2191 stream_write_tree (ob
, loop
->simduid
, true);
2194 ob
->main_stream
= tmp_stream
;
2198 /* Create the header in the file using OB. If the section type is for
2199 a function, set FN to the decl for that function. */
2202 produce_asm (struct output_block
*ob
, tree fn
)
2204 enum lto_section_type section_type
= ob
->section_type
;
2205 struct lto_function_header header
;
2208 if (section_type
== LTO_section_function_body
)
2210 const char *name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn
));
2211 section_name
= lto_get_section_name (section_type
, name
,
2212 symtab_node::get (fn
)->order
,
2216 section_name
= lto_get_section_name (section_type
, NULL
, 0, NULL
);
2218 lto_begin_section (section_name
, !flag_wpa
);
2219 free (section_name
);
2221 /* The entire header is stream computed here. */
2222 memset (&header
, 0, sizeof (struct lto_function_header
));
2224 if (section_type
== LTO_section_function_body
)
2225 header
.cfg_size
= ob
->cfg_stream
->total_size
;
2226 header
.main_size
= ob
->main_stream
->total_size
;
2227 header
.string_size
= ob
->string_stream
->total_size
;
2228 lto_write_data (&header
, sizeof header
);
2230 /* Put all of the gimple and the string table out the asm file as a
2232 if (section_type
== LTO_section_function_body
)
2233 lto_write_stream (ob
->cfg_stream
);
2234 lto_write_stream (ob
->main_stream
);
2235 lto_write_stream (ob
->string_stream
);
2241 /* Output the base body of struct function FN using output block OB. */
2244 output_struct_function_base (struct output_block
*ob
, struct function
*fn
)
2246 struct bitpack_d bp
;
2250 /* Output the static chain and non-local goto save area. */
2251 stream_write_tree (ob
, fn
->static_chain_decl
, true);
2252 stream_write_tree (ob
, fn
->nonlocal_goto_save_area
, true);
2254 /* Output all the local variables in the function. */
2255 streamer_write_hwi (ob
, vec_safe_length (fn
->local_decls
));
2256 FOR_EACH_VEC_SAFE_ELT (fn
->local_decls
, i
, t
)
2257 stream_write_tree (ob
, t
, true);
2259 /* Output current IL state of the function. */
2260 streamer_write_uhwi (ob
, fn
->curr_properties
);
2262 /* Write all the attributes for FN. */
2263 bp
= bitpack_create (ob
->main_stream
);
2264 bp_pack_value (&bp
, fn
->is_thunk
, 1);
2265 bp_pack_value (&bp
, fn
->has_local_explicit_reg_vars
, 1);
2266 bp_pack_value (&bp
, fn
->returns_pcc_struct
, 1);
2267 bp_pack_value (&bp
, fn
->returns_struct
, 1);
2268 bp_pack_value (&bp
, fn
->can_throw_non_call_exceptions
, 1);
2269 bp_pack_value (&bp
, fn
->can_delete_dead_exceptions
, 1);
2270 bp_pack_value (&bp
, fn
->always_inline_functions_inlined
, 1);
2271 bp_pack_value (&bp
, fn
->after_inlining
, 1);
2272 bp_pack_value (&bp
, fn
->stdarg
, 1);
2273 bp_pack_value (&bp
, fn
->has_nonlocal_label
, 1);
2274 bp_pack_value (&bp
, fn
->has_forced_label_in_static
, 1);
2275 bp_pack_value (&bp
, fn
->calls_alloca
, 1);
2276 bp_pack_value (&bp
, fn
->calls_setjmp
, 1);
2277 bp_pack_value (&bp
, fn
->calls_eh_return
, 1);
2278 bp_pack_value (&bp
, fn
->has_force_vectorize_loops
, 1);
2279 bp_pack_value (&bp
, fn
->has_simduid_loops
, 1);
2280 bp_pack_value (&bp
, fn
->assume_function
, 1);
2281 bp_pack_value (&bp
, fn
->va_list_fpr_size
, 8);
2282 bp_pack_value (&bp
, fn
->va_list_gpr_size
, 8);
2283 bp_pack_value (&bp
, fn
->last_clique
, sizeof (short) * 8);
2285 /* Output the function start and end loci. */
2286 stream_output_location (ob
, &bp
, fn
->function_start_locus
);
2287 stream_output_location (ob
, &bp
, fn
->function_end_locus
);
2289 /* Save the instance discriminator if present. */
2290 int *instance_number_p
= NULL
;
2291 if (decl_to_instance_map
)
2292 instance_number_p
= decl_to_instance_map
->get (fn
->decl
);
2293 bp_pack_value (&bp
, !!instance_number_p
, 1);
2294 if (instance_number_p
)
2295 bp_pack_value (&bp
, *instance_number_p
, sizeof (int) * CHAR_BIT
);
2297 streamer_write_bitpack (&bp
);
2301 /* Collect all leaf BLOCKs beyond ROOT into LEAFS. */
2304 collect_block_tree_leafs (tree root
, vec
<tree
> &leafs
)
2306 for (root
= BLOCK_SUBBLOCKS (root
); root
; root
= BLOCK_CHAIN (root
))
2307 if (! BLOCK_SUBBLOCKS (root
))
2308 leafs
.safe_push (root
);
2310 collect_block_tree_leafs (root
, leafs
);
2313 /* This performs function body modifications that are needed for streaming
2317 lto_prepare_function_for_streaming (struct cgraph_node
*node
)
2319 struct function
*fn
= DECL_STRUCT_FUNCTION (node
->decl
);
2322 if (number_of_loops (fn
))
2325 loop_optimizer_init (AVOID_CFG_MODIFICATIONS
);
2326 loop_optimizer_finalize ();
2329 /* We will renumber the statements. The code that does this uses
2330 the same ordering that we use for serializing them so we can use
2331 the same code on the other end and not have to write out the
2332 statement numbers. We do not assign UIDs to PHIs here because
2333 virtual PHIs get re-computed on-the-fly which would make numbers
2335 set_gimple_stmt_max_uid (fn
, 0);
2336 FOR_ALL_BB_FN (bb
, fn
)
2338 for (gphi_iterator gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
);
2341 gphi
*stmt
= gsi
.phi ();
2343 /* Virtual PHIs are not going to be streamed. */
2344 if (!virtual_operand_p (gimple_phi_result (stmt
)))
2345 gimple_set_uid (stmt
, inc_gimple_stmt_max_uid (fn
));
2347 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
);
2350 gimple
*stmt
= gsi_stmt (gsi
);
2351 gimple_set_uid (stmt
, inc_gimple_stmt_max_uid (fn
));
2354 /* To avoid keeping duplicate gimple IDs in the statements, renumber
2355 virtual phis now. */
2356 FOR_ALL_BB_FN (bb
, fn
)
2358 for (gphi_iterator gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
);
2361 gphi
*stmt
= gsi
.phi ();
2362 if (virtual_operand_p (gimple_phi_result (stmt
)))
2363 gimple_set_uid (stmt
, inc_gimple_stmt_max_uid (fn
));
2369 /* Emit the chain of tree nodes starting at T. OB is the output block
2370 to write to. REF_P is true if chain elements should be emitted
2374 streamer_write_chain (struct output_block
*ob
, tree t
, bool ref_p
)
2378 /* We avoid outputting external vars or functions by reference
2379 to the global decls section as we do not want to have them
2380 enter decl merging. We should not need to do this anymore because
2381 free_lang_data removes them from block scopes. */
2382 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t
) || !DECL_EXTERNAL (t
));
2383 stream_write_tree (ob
, t
, ref_p
);
2388 /* Write a sentinel to terminate the chain. */
2389 stream_write_tree (ob
, NULL_TREE
, ref_p
);
2392 /* Output the body of function NODE->DECL. */
2395 output_function (struct cgraph_node
*node
)
2398 struct function
*fn
;
2400 struct output_block
*ob
;
2402 if (streamer_dump_file
)
2403 fprintf (streamer_dump_file
, "\nStreaming body of %s\n",
2404 node
->dump_name ());
2406 function
= node
->decl
;
2407 fn
= DECL_STRUCT_FUNCTION (function
);
2408 ob
= create_output_block (LTO_section_function_body
);
2412 gcc_assert (current_function_decl
== NULL_TREE
&& cfun
== NULL
);
2414 /* Make string 0 be a NULL string. */
2415 streamer_write_char_stream (ob
->string_stream
, 0);
2417 streamer_write_record_start (ob
, LTO_function
);
2419 /* Output decls for parameters and args. */
2420 stream_write_tree (ob
, DECL_RESULT (function
), true);
2421 streamer_write_chain (ob
, DECL_ARGUMENTS (function
), true);
2423 /* Output debug args if available. */
2424 vec
<tree
, va_gc
> **debugargs
= decl_debug_args_lookup (function
);
2426 streamer_write_uhwi (ob
, 0);
2429 streamer_write_uhwi (ob
, (*debugargs
)->length ());
2430 for (unsigned i
= 0; i
< (*debugargs
)->length (); ++i
)
2431 stream_write_tree (ob
, (**debugargs
)[i
], true);
2434 /* Output DECL_INITIAL for the function, which contains the tree of
2436 stream_write_tree (ob
, DECL_INITIAL (function
), true);
2437 /* As we do not recurse into BLOCK_SUBBLOCKS but only BLOCK_SUPERCONTEXT
2438 collect block tree leafs and stream those. */
2439 auto_vec
<tree
> block_tree_leafs
;
2440 if (DECL_INITIAL (function
) && DECL_INITIAL (function
) != error_mark_node
)
2441 collect_block_tree_leafs (DECL_INITIAL (function
), block_tree_leafs
);
2442 streamer_write_uhwi (ob
, block_tree_leafs
.length ());
2443 for (unsigned i
= 0; i
< block_tree_leafs
.length (); ++i
)
2444 stream_write_tree (ob
, block_tree_leafs
[i
], true);
2446 /* We also stream abstract functions where we stream only stuff needed for
2448 if (gimple_has_body_p (function
))
2450 streamer_write_uhwi (ob
, 1);
2451 output_struct_function_base (ob
, fn
);
2453 output_cfg (ob
, fn
);
2455 /* Output all the SSA names used in the function. */
2456 output_ssa_names (ob
, fn
);
2458 /* Output any exception handling regions. */
2459 output_eh_regions (ob
, fn
);
2461 /* Output the code for the function. */
2462 FOR_ALL_BB_FN (bb
, fn
)
2463 output_bb (ob
, bb
, fn
);
2465 /* The terminator for this function. */
2466 streamer_write_record_start (ob
, LTO_null
);
2469 streamer_write_uhwi (ob
, 0);
2471 /* Create a section to hold the pickled output of this function. */
2472 produce_asm (ob
, function
);
2474 destroy_output_block (ob
);
2475 if (streamer_dump_file
)
2476 fprintf (streamer_dump_file
, "Finished streaming %s\n",
2477 node
->dump_name ());
2480 /* Output the body of function NODE->DECL. */
2483 output_constructor (struct varpool_node
*node
)
2485 tree var
= node
->decl
;
2486 struct output_block
*ob
;
2488 if (streamer_dump_file
)
2489 fprintf (streamer_dump_file
, "\nStreaming constructor of %s\n",
2490 node
->dump_name ());
2492 timevar_push (TV_IPA_LTO_CTORS_OUT
);
2493 ob
= create_output_block (LTO_section_function_body
);
2497 /* Make string 0 be a NULL string. */
2498 streamer_write_char_stream (ob
->string_stream
, 0);
2500 /* Output DECL_INITIAL for the function, which contains the tree of
2502 stream_write_tree (ob
, DECL_INITIAL (var
), true);
2504 /* Create a section to hold the pickled output of this function. */
2505 produce_asm (ob
, var
);
2507 destroy_output_block (ob
);
2508 if (streamer_dump_file
)
2509 fprintf (streamer_dump_file
, "Finished streaming %s\n",
2510 node
->dump_name ());
2511 timevar_pop (TV_IPA_LTO_CTORS_OUT
);
2515 /* Emit toplevel asms. */
2518 lto_output_toplevel_asms (void)
2520 struct output_block
*ob
;
2521 struct asm_node
*can
;
2523 struct lto_simple_header_with_strings header
;
2525 if (!symtab
->first_asm_symbol ())
2528 ob
= create_output_block (LTO_section_asm
);
2530 /* Make string 0 be a NULL string. */
2531 streamer_write_char_stream (ob
->string_stream
, 0);
2533 for (can
= symtab
->first_asm_symbol (); can
; can
= can
->next
)
2535 streamer_write_string_cst (ob
, ob
->main_stream
, can
->asm_str
);
2536 streamer_write_hwi (ob
, can
->order
);
2539 streamer_write_string_cst (ob
, ob
->main_stream
, NULL_TREE
);
2541 section_name
= lto_get_section_name (LTO_section_asm
, NULL
, 0, NULL
);
2542 lto_begin_section (section_name
, !flag_wpa
);
2543 free (section_name
);
2545 /* The entire header stream is computed here. */
2546 memset (&header
, 0, sizeof (header
));
2548 header
.main_size
= ob
->main_stream
->total_size
;
2549 header
.string_size
= ob
->string_stream
->total_size
;
2550 lto_write_data (&header
, sizeof header
);
2552 /* Put all of the gimple and the string table out the asm file as a
2554 lto_write_stream (ob
->main_stream
);
2555 lto_write_stream (ob
->string_stream
);
2559 destroy_output_block (ob
);
2563 /* Copy the function body or variable constructor of NODE without deserializing. */
2566 copy_function_or_variable (struct symtab_node
*node
)
2568 tree function
= node
->decl
;
2569 struct lto_file_decl_data
*file_data
= node
->lto_file_data
;
2572 const char *name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function
));
2573 char *section_name
=
2574 lto_get_section_name (LTO_section_function_body
, name
, node
->order
, NULL
);
2576 struct lto_in_decl_state
*in_state
;
2577 struct lto_out_decl_state
*out_state
= lto_get_out_decl_state ();
2579 if (streamer_dump_file
)
2580 fprintf (streamer_dump_file
, "Copying section for %s\n", name
);
2581 lto_begin_section (section_name
, false);
2582 free (section_name
);
2584 /* We may have renamed the declaration, e.g., a static function. */
2585 name
= lto_get_decl_name_mapping (file_data
, name
);
2587 data
= lto_get_raw_section_data (file_data
, LTO_section_function_body
,
2588 name
, node
->order
- file_data
->order_base
,
2592 /* Do a bit copy of the function body. */
2593 lto_write_raw_data (data
, len
);
2597 lto_get_function_in_decl_state (node
->lto_file_data
, function
);
2598 out_state
->compressed
= in_state
->compressed
;
2599 gcc_assert (in_state
);
2601 for (i
= 0; i
< LTO_N_DECL_STREAMS
; i
++)
2603 size_t n
= vec_safe_length (in_state
->streams
[i
]);
2604 vec
<tree
, va_gc
> *trees
= in_state
->streams
[i
];
2605 struct lto_tree_ref_encoder
*encoder
= &(out_state
->streams
[i
]);
2607 /* The out state must have the same indices and the in state.
2608 So just copy the vector. All the encoders in the in state
2609 must be empty where we reach here. */
2610 gcc_assert (lto_tree_ref_encoder_size (encoder
) == 0);
2611 encoder
->trees
.reserve_exact (n
);
2612 for (j
= 0; j
< n
; j
++)
2613 encoder
->trees
.safe_push ((*trees
)[j
]);
2616 lto_free_raw_section_data (file_data
, LTO_section_function_body
, name
,
2621 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2624 wrap_refs (tree
*tp
, int *ws
, void *)
2627 if (handled_component_p (t
)
2628 && VAR_P (TREE_OPERAND (t
, 0))
2629 && TREE_PUBLIC (TREE_OPERAND (t
, 0)))
2631 tree decl
= TREE_OPERAND (t
, 0);
2632 tree ptrtype
= build_pointer_type (TREE_TYPE (decl
));
2633 TREE_OPERAND (t
, 0) = build2 (MEM_REF
, TREE_TYPE (decl
),
2634 build1 (ADDR_EXPR
, ptrtype
, decl
),
2635 build_int_cst (ptrtype
, 0));
2636 TREE_THIS_VOLATILE (TREE_OPERAND (t
, 0)) = TREE_THIS_VOLATILE (decl
);
2639 else if (TREE_CODE (t
) == CONSTRUCTOR
)
2641 else if (!EXPR_P (t
))
2646 /* Remove functions that are no longer used from offload_funcs, and mark the
2647 remaining ones with DECL_PRESERVE_P. */
2650 prune_offload_funcs (void)
2657 VEC_ORDERED_REMOVE_IF (*offload_funcs
, ix
, ix2
, elem_ptr
,
2658 cgraph_node::get (*elem_ptr
) == NULL
);
2661 FOR_EACH_VEC_ELT (*offload_funcs
, ix
, fn_decl
)
2662 DECL_PRESERVE_P (fn_decl
) = 1;
2665 /* Produce LTO section that contains global information
2666 about LTO bytecode. */
2669 produce_lto_section ()
2671 /* Stream LTO meta section. */
2672 output_block
*ob
= create_output_block (LTO_section_lto
);
2674 char * section_name
= lto_get_section_name (LTO_section_lto
, NULL
, 0, NULL
);
2675 lto_begin_section (section_name
, false);
2676 free (section_name
);
2679 lto_compression compression
= ZSTD
;
2681 lto_compression compression
= ZLIB
;
2684 bool slim_object
= flag_generate_lto
&& !flag_fat_lto_objects
;
2686 = { LTO_major_version
, LTO_minor_version
, slim_object
, 0, 0 };
2687 s
.set_compression (compression
);
2688 lto_write_data (&s
, sizeof s
);
2690 destroy_output_block (ob
);
2693 /* Compare symbols to get them sorted by filename (to optimize streaming) */
2696 cmp_symbol_files (const void *pn1
, const void *pn2
, void *id_map_
)
2698 const symtab_node
*n1
= *(const symtab_node
* const *)pn1
;
2699 const symtab_node
*n2
= *(const symtab_node
* const *)pn2
;
2700 hash_map
<lto_file_decl_data
*, int> *id_map
2701 = (hash_map
<lto_file_decl_data
*, int> *)id_map_
;
2703 int file_order1
= n1
->lto_file_data
? n1
->lto_file_data
->order
: -1;
2704 int file_order2
= n2
->lto_file_data
? n2
->lto_file_data
->order
: -1;
2706 /* Order files same way as they appeared in the command line to reduce
2707 seeking while copying sections. */
2708 if (file_order1
!= file_order2
)
2709 return file_order1
- file_order2
;
2711 /* Order within static library. */
2712 if (n1
->lto_file_data
&& n1
->lto_file_data
->id
!= n2
->lto_file_data
->id
)
2713 return *id_map
->get (n1
->lto_file_data
) - *id_map
->get (n2
->lto_file_data
);
2715 /* And finaly order by the definition order. */
2716 return n1
->order
- n2
->order
;
2719 /* Main entry point from the pass manager. */
2724 struct lto_out_decl_state
*decl_state
;
2725 bitmap output
= NULL
;
2726 bitmap_obstack output_obstack
;
2727 unsigned int i
, n_nodes
;
2728 lto_symtab_encoder_t encoder
= lto_get_out_decl_state ()->symtab_node_encoder
;
2729 auto_vec
<symtab_node
*> symbols_to_copy
;
2731 prune_offload_funcs ();
2735 bitmap_obstack_initialize (&output_obstack
);
2736 output
= BITMAP_ALLOC (&output_obstack
);
2739 /* Initialize the streamer. */
2740 lto_streamer_init ();
2742 produce_lto_section ();
2744 n_nodes
= lto_symtab_encoder_size (encoder
);
2745 /* Prepare vector of functions to output and then sort it to optimize
2747 for (i
= 0; i
< n_nodes
; i
++)
2749 symtab_node
*snode
= lto_symtab_encoder_deref (encoder
, i
);
2752 if (cgraph_node
*node
= dyn_cast
<cgraph_node
*> (snode
))
2754 if (lto_symtab_encoder_encode_body_p (encoder
, node
)
2756 symbols_to_copy
.safe_push (node
);
2758 else if (varpool_node
*node
= dyn_cast
<varpool_node
*> (snode
))
2760 /* Wrap symbol references inside the ctor in a type
2761 preserving MEM_REF. */
2762 tree ctor
= DECL_INITIAL (node
->decl
);
2763 if (ctor
&& !in_lto_p
)
2764 walk_tree (&ctor
, wrap_refs
, NULL
, NULL
);
2765 if (get_symbol_initial_value (encoder
, node
->decl
) == error_mark_node
2766 && lto_symtab_encoder_encode_initializer_p (encoder
, node
))
2767 symbols_to_copy
.safe_push (node
);
2770 /* Map the section hash to an order it appears in symbols_to_copy
2771 since we want to sort same ID symbols next to each other but need
2772 to avoid making overall order depend on the actual hash value. */
2774 hash_map
<lto_file_decl_data
*, int> id_map
;
2775 for (i
= 0; i
< symbols_to_copy
.length (); ++i
)
2777 symtab_node
*snode
= symbols_to_copy
[i
];
2778 if (snode
->lto_file_data
)
2780 bool existed_p
= false;
2781 int &ord
= id_map
.get_or_insert (snode
->lto_file_data
, &existed_p
);
2786 symbols_to_copy
.sort (cmp_symbol_files
, (void *)&id_map
);
2787 for (i
= 0; i
< symbols_to_copy
.length (); i
++)
2789 symtab_node
*snode
= symbols_to_copy
[i
];
2791 varpool_node
*vnode
;
2794 gcc_assert (bitmap_set_bit (output
, DECL_UID (snode
->decl
)));
2796 decl_state
= lto_new_out_decl_state ();
2797 lto_push_out_decl_state (decl_state
);
2799 if ((cnode
= dyn_cast
<cgraph_node
*> (snode
))
2800 && (gimple_has_body_p (cnode
->decl
)
2802 && flag_incremental_link
!= INCREMENTAL_LINK_LTO
)
2803 /* Thunks have no body but they may be synthetized
2805 || DECL_ARGUMENTS (cnode
->decl
)
2806 || cnode
->declare_variant_alt
))
2807 output_function (cnode
);
2808 else if ((vnode
= dyn_cast
<varpool_node
*> (snode
))
2809 && (DECL_INITIAL (vnode
->decl
) != error_mark_node
2811 && flag_incremental_link
!= INCREMENTAL_LINK_LTO
)))
2812 output_constructor (vnode
);
2814 copy_function_or_variable (snode
);
2815 gcc_assert (lto_get_out_decl_state () == decl_state
);
2816 lto_pop_out_decl_state ();
2817 lto_record_function_out_decl_state (snode
->decl
, decl_state
);
2820 /* Emit the callgraph after emitting function bodies. This needs to
2821 be done now to make sure that all the statements in every function
2822 have been renumbered so that edges can be associated with call
2823 statements using the statement UIDs. */
2826 output_offload_tables ();
2830 BITMAP_FREE (output
);
2831 bitmap_obstack_release (&output_obstack
);
2835 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2836 from it and required for correct representation of its semantics.
2837 Each node in ENCODER must be a global declaration or a type. A node
2838 is written only once, even if it appears multiple times in the
2839 vector. Certain transitively-reachable nodes, such as those
2840 representing expressions, may be duplicated, but such nodes
2841 must not appear in ENCODER itself. */
2844 write_global_stream (struct output_block
*ob
,
2845 struct lto_tree_ref_encoder
*encoder
)
2849 const size_t size
= lto_tree_ref_encoder_size (encoder
);
2851 for (index
= 0; index
< size
; index
++)
2853 t
= lto_tree_ref_encoder_get_tree (encoder
, index
);
2854 if (streamer_dump_file
)
2856 fprintf (streamer_dump_file
, " %i:", (int)index
);
2857 print_node_brief (streamer_dump_file
, "", t
, 4);
2858 fprintf (streamer_dump_file
, "\n");
2860 if (!streamer_tree_cache_lookup (ob
->writer_cache
, t
, NULL
))
2861 stream_write_tree (ob
, t
, false);
2866 /* Write a sequence of indices into the globals vector corresponding
2867 to the trees in ENCODER. These are used by the reader to map the
2868 indices used to refer to global entities within function bodies to
2872 write_global_references (struct output_block
*ob
,
2873 struct lto_tree_ref_encoder
*encoder
)
2877 const uint32_t size
= lto_tree_ref_encoder_size (encoder
);
2879 /* Write size and slot indexes as 32-bit unsigned numbers. */
2880 uint32_t *data
= XNEWVEC (uint32_t, size
+ 1);
2883 for (index
= 0; index
< size
; index
++)
2887 t
= lto_tree_ref_encoder_get_tree (encoder
, index
);
2888 streamer_tree_cache_lookup (ob
->writer_cache
, t
, &slot_num
);
2889 gcc_assert (slot_num
!= (unsigned)-1);
2890 data
[index
+ 1] = slot_num
;
2893 lto_write_data (data
, sizeof (int32_t) * (size
+ 1));
2898 /* Write all the streams in an lto_out_decl_state STATE using
2899 output block OB and output stream OUT_STREAM. */
2902 lto_output_decl_state_streams (struct output_block
*ob
,
2903 struct lto_out_decl_state
*state
)
2907 for (i
= 0; i
< LTO_N_DECL_STREAMS
; i
++)
2908 write_global_stream (ob
, &state
->streams
[i
]);
2912 /* Write all the references in an lto_out_decl_state STATE using
2913 output block OB and output stream OUT_STREAM. */
2916 lto_output_decl_state_refs (struct output_block
*ob
,
2917 struct lto_out_decl_state
*state
)
2923 /* Write reference to FUNCTION_DECL. If there is not function,
2924 write reference to void_type_node. */
2925 decl
= (state
->fn_decl
) ? state
->fn_decl
: void_type_node
;
2926 streamer_tree_cache_lookup (ob
->writer_cache
, decl
, &ref
);
2927 gcc_assert (ref
!= (unsigned)-1);
2928 ref
= ref
* 2 + (state
->compressed
? 1 : 0);
2929 lto_write_data (&ref
, sizeof (uint32_t));
2931 for (i
= 0; i
< LTO_N_DECL_STREAMS
; i
++)
2932 write_global_references (ob
, &state
->streams
[i
]);
2936 /* Return the written size of STATE. */
2939 lto_out_decl_state_written_size (struct lto_out_decl_state
*state
)
2944 size
= sizeof (int32_t); /* fn_ref. */
2945 for (i
= 0; i
< LTO_N_DECL_STREAMS
; i
++)
2947 size
+= sizeof (int32_t); /* vector size. */
2948 size
+= (lto_tree_ref_encoder_size (&state
->streams
[i
])
2949 * sizeof (int32_t));
2955 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2959 write_symbol (struct streamer_tree_cache_d
*cache
,
2960 tree t
, hash_set
<const char *> *seen
, bool alias
)
2963 enum gcc_plugin_symbol_kind kind
;
2964 enum gcc_plugin_symbol_visibility visibility
= GCCPV_DEFAULT
;
2970 gcc_assert (VAR_OR_FUNCTION_DECL_P (t
));
2972 name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t
));
2974 /* This behaves like assemble_name_raw in varasm.cc, performing the
2975 same name manipulations that ASM_OUTPUT_LABELREF does. */
2976 name
= IDENTIFIER_POINTER ((*targetm
.asm_out
.mangle_assembler_name
) (name
));
2978 if (seen
->add (name
))
2981 streamer_tree_cache_lookup (cache
, t
, &slot_num
);
2982 gcc_assert (slot_num
!= (unsigned)-1);
2984 if (DECL_EXTERNAL (t
))
2987 kind
= GCCPK_WEAKUNDEF
;
2994 kind
= GCCPK_WEAKDEF
;
2995 else if (DECL_COMMON (t
))
2996 kind
= GCCPK_COMMON
;
3000 /* When something is defined, it should have node attached. */
3001 gcc_assert (alias
|| !VAR_P (t
) || varpool_node::get (t
)->definition
);
3002 gcc_assert (alias
|| TREE_CODE (t
) != FUNCTION_DECL
3003 || (cgraph_node::get (t
)
3004 && cgraph_node::get (t
)->definition
));
3007 /* Imitate what default_elf_asm_output_external do.
3008 When symbol is external, we need to output it with DEFAULT visibility
3009 when compiling with -fvisibility=default, while with HIDDEN visibility
3010 when symbol has attribute (visibility("hidden")) specified.
3011 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
3014 if (DECL_EXTERNAL (t
)
3015 && !targetm
.binds_local_p (t
))
3016 visibility
= GCCPV_DEFAULT
;
3018 switch (DECL_VISIBILITY (t
))
3020 case VISIBILITY_DEFAULT
:
3021 visibility
= GCCPV_DEFAULT
;
3023 case VISIBILITY_PROTECTED
:
3024 visibility
= GCCPV_PROTECTED
;
3026 case VISIBILITY_HIDDEN
:
3027 visibility
= GCCPV_HIDDEN
;
3029 case VISIBILITY_INTERNAL
:
3030 visibility
= GCCPV_INTERNAL
;
3034 if (kind
== GCCPK_COMMON
3035 && DECL_SIZE_UNIT (t
)
3036 && TREE_CODE (DECL_SIZE_UNIT (t
)) == INTEGER_CST
)
3037 size
= TREE_INT_CST_LOW (DECL_SIZE_UNIT (t
));
3041 if (DECL_ONE_ONLY (t
))
3042 comdat
= IDENTIFIER_POINTER (decl_comdat_group_id (t
));
3046 lto_write_data (name
, strlen (name
) + 1);
3047 lto_write_data (comdat
, strlen (comdat
) + 1);
3048 c
= (unsigned char) kind
;
3049 lto_write_data (&c
, 1);
3050 c
= (unsigned char) visibility
;
3051 lto_write_data (&c
, 1);
3052 lto_write_data (&size
, 8);
3053 lto_write_data (&slot_num
, 4);
3056 /* Write extension information for symbols (symbol type, section flags). */
3059 write_symbol_extension_info (tree t
)
3062 c
= ((unsigned char) TREE_CODE (t
) == VAR_DECL
3063 ? GCCST_VARIABLE
: GCCST_FUNCTION
);
3064 lto_write_data (&c
, 1);
3065 unsigned char section_kind
= 0;
3068 section
*s
= get_variable_section (t
, false);
3069 if (s
->common
.flags
& SECTION_BSS
)
3070 section_kind
|= GCCSSK_BSS
;
3072 lto_write_data (§ion_kind
, 1);
3075 /* Write an IL symbol table to OB.
3076 SET and VSET are cgraph/varpool node sets we are outputting. */
3079 produce_symtab (struct output_block
*ob
)
3081 unsigned int streamed_symbols
= 0;
3082 struct streamer_tree_cache_d
*cache
= ob
->writer_cache
;
3083 char *section_name
= lto_get_section_name (LTO_section_symtab
, NULL
, 0, NULL
);
3084 lto_symtab_encoder_t encoder
= ob
->decl_state
->symtab_node_encoder
;
3085 lto_symtab_encoder_iterator lsei
;
3087 lto_begin_section (section_name
, false);
3088 free (section_name
);
3090 hash_set
<const char *> seen
;
3092 /* Write the symbol table.
3093 First write everything defined and then all declarations.
3094 This is necessary to handle cases where we have duplicated symbols. */
3095 for (lsei
= lsei_start (encoder
);
3096 !lsei_end_p (lsei
); lsei_next (&lsei
))
3098 symtab_node
*node
= lsei_node (lsei
);
3100 if (DECL_EXTERNAL (node
->decl
) || !node
->output_to_lto_symbol_table_p ())
3102 write_symbol (cache
, node
->decl
, &seen
, false);
3105 for (lsei
= lsei_start (encoder
);
3106 !lsei_end_p (lsei
); lsei_next (&lsei
))
3108 symtab_node
*node
= lsei_node (lsei
);
3110 if (!DECL_EXTERNAL (node
->decl
) || !node
->output_to_lto_symbol_table_p ())
3112 write_symbol (cache
, node
->decl
, &seen
, false);
3118 return streamed_symbols
;
3121 /* Symtab extension version. */
3122 #define LTO_SYMTAB_EXTENSION_VERSION 1
3124 /* Write an IL symbol table extension to OB.
3125 SET and VSET are cgraph/varpool node sets we are outputting. */
3128 produce_symtab_extension (struct output_block
*ob
,
3129 unsigned int previous_streamed_symbols
)
3131 unsigned int streamed_symbols
= 0;
3132 char *section_name
= lto_get_section_name (LTO_section_symtab_extension
,
3134 lto_symtab_encoder_t encoder
= ob
->decl_state
->symtab_node_encoder
;
3135 lto_symtab_encoder_iterator lsei
;
3137 lto_begin_section (section_name
, false);
3138 free (section_name
);
3140 unsigned char version
= LTO_SYMTAB_EXTENSION_VERSION
;
3141 lto_write_data (&version
, 1);
3143 /* Write the symbol table.
3144 First write everything defined and then all declarations.
3145 This is necessary to handle cases where we have duplicated symbols. */
3146 for (lsei
= lsei_start (encoder
);
3147 !lsei_end_p (lsei
); lsei_next (&lsei
))
3149 symtab_node
*node
= lsei_node (lsei
);
3151 if (DECL_EXTERNAL (node
->decl
) || !node
->output_to_lto_symbol_table_p ())
3153 write_symbol_extension_info (node
->decl
);
3156 for (lsei
= lsei_start (encoder
);
3157 !lsei_end_p (lsei
); lsei_next (&lsei
))
3159 symtab_node
*node
= lsei_node (lsei
);
3161 if (!DECL_EXTERNAL (node
->decl
) || !node
->output_to_lto_symbol_table_p ())
3163 write_symbol_extension_info (node
->decl
);
3167 gcc_assert (previous_streamed_symbols
== streamed_symbols
);
3172 /* Init the streamer_mode_table for output, where we collect info on what
3173 machine_mode values have been streamed. */
3175 lto_output_init_mode_table (void)
3177 memset (streamer_mode_table
, '\0', MAX_MACHINE_MODE
);
3181 /* Write the mode table. */
3183 lto_write_mode_table (void)
3185 struct output_block
*ob
;
3186 ob
= create_output_block (LTO_section_mode_table
);
3187 bitpack_d bp
= bitpack_create (ob
->main_stream
);
3189 /* Ensure that for GET_MODE_INNER (m) != m we have
3190 also the inner mode marked. */
3191 for (int i
= 0; i
< (int) MAX_MACHINE_MODE
; i
++)
3192 if (streamer_mode_table
[i
])
3194 machine_mode m
= (machine_mode
) i
;
3195 machine_mode inner_m
= GET_MODE_INNER (m
);
3197 streamer_mode_table
[(int) inner_m
] = 1;
3199 /* First stream modes that have GET_MODE_INNER (m) == m,
3200 so that we can refer to them afterwards. */
3201 for (int pass
= 0; pass
< 2; pass
++)
3202 for (int i
= 0; i
< (int) MAX_MACHINE_MODE
; i
++)
3203 if (streamer_mode_table
[i
] && i
!= (int) VOIDmode
&& i
!= (int) BLKmode
)
3205 machine_mode m
= (machine_mode
) i
;
3206 if ((GET_MODE_INNER (m
) == m
) ^ (pass
== 0))
3208 bp_pack_value (&bp
, m
, 8);
3209 bp_pack_enum (&bp
, mode_class
, MAX_MODE_CLASS
, GET_MODE_CLASS (m
));
3210 bp_pack_poly_value (&bp
, GET_MODE_SIZE (m
), 16);
3211 bp_pack_poly_value (&bp
, GET_MODE_PRECISION (m
), 16);
3212 bp_pack_value (&bp
, GET_MODE_INNER (m
), 8);
3213 bp_pack_poly_value (&bp
, GET_MODE_NUNITS (m
), 16);
3214 switch (GET_MODE_CLASS (m
))
3220 bp_pack_value (&bp
, GET_MODE_IBIT (m
), 8);
3221 bp_pack_value (&bp
, GET_MODE_FBIT (m
), 8);
3224 case MODE_DECIMAL_FLOAT
:
3225 bp_pack_string (ob
, &bp
, REAL_MODE_FORMAT (m
)->name
, true);
3230 bp_pack_string (ob
, &bp
, GET_MODE_NAME (m
), true);
3232 bp_pack_value (&bp
, VOIDmode
, 8);
3234 streamer_write_bitpack (&bp
);
3237 = lto_get_section_name (LTO_section_mode_table
, NULL
, 0, NULL
);
3238 lto_begin_section (section_name
, !flag_wpa
);
3239 free (section_name
);
3241 /* The entire header stream is computed here. */
3242 struct lto_simple_header_with_strings header
;
3243 memset (&header
, 0, sizeof (header
));
3245 header
.main_size
= ob
->main_stream
->total_size
;
3246 header
.string_size
= ob
->string_stream
->total_size
;
3247 lto_write_data (&header
, sizeof header
);
3249 /* Put all of the gimple and the string table out the asm file as a
3251 lto_write_stream (ob
->main_stream
);
3252 lto_write_stream (ob
->string_stream
);
3255 destroy_output_block (ob
);
3259 /* This pass is run after all of the functions are serialized and all
3260 of the IPA passes have written their serialized forms. This pass
3261 causes the vector of all of the global decls and types used from
3262 this file to be written in to a section that can then be read in to
3263 recover these on other side. */
3266 produce_asm_for_decls (void)
3268 struct lto_out_decl_state
*out_state
;
3269 struct lto_out_decl_state
*fn_out_state
;
3270 struct lto_decl_header header
;
3272 struct output_block
*ob
;
3273 unsigned idx
, num_fns
;
3274 size_t decl_state_size
;
3275 int32_t num_decl_states
;
3277 ob
= create_output_block (LTO_section_decls
);
3279 memset (&header
, 0, sizeof (struct lto_decl_header
));
3281 section_name
= lto_get_section_name (LTO_section_decls
, NULL
, 0, NULL
);
3282 lto_begin_section (section_name
, !flag_wpa
);
3283 free (section_name
);
3285 /* Make string 0 be a NULL string. */
3286 streamer_write_char_stream (ob
->string_stream
, 0);
3288 gcc_assert (!alias_pairs
);
3290 /* Get rid of the global decl state hash tables to save some memory. */
3291 out_state
= lto_get_out_decl_state ();
3292 for (int i
= 0; i
< LTO_N_DECL_STREAMS
; i
++)
3293 if (out_state
->streams
[i
].tree_hash_table
)
3295 delete out_state
->streams
[i
].tree_hash_table
;
3296 out_state
->streams
[i
].tree_hash_table
= NULL
;
3299 /* Write the global symbols. */
3300 if (streamer_dump_file
)
3301 fprintf (streamer_dump_file
, "Outputting global stream\n");
3302 lto_output_decl_state_streams (ob
, out_state
);
3303 num_fns
= lto_function_decl_states
.length ();
3304 for (idx
= 0; idx
< num_fns
; idx
++)
3307 lto_function_decl_states
[idx
];
3308 if (streamer_dump_file
)
3309 fprintf (streamer_dump_file
, "Outputting stream for %s\n",
3311 (DECL_ASSEMBLER_NAME (fn_out_state
->fn_decl
)));
3312 lto_output_decl_state_streams (ob
, fn_out_state
);
3315 /* Currently not used. This field would allow us to preallocate
3316 the globals vector, so that it need not be resized as it is extended. */
3317 header
.num_nodes
= -1;
3319 /* Compute the total size of all decl out states. */
3320 decl_state_size
= sizeof (int32_t);
3321 decl_state_size
+= lto_out_decl_state_written_size (out_state
);
3322 for (idx
= 0; idx
< num_fns
; idx
++)
3325 lto_function_decl_states
[idx
];
3326 decl_state_size
+= lto_out_decl_state_written_size (fn_out_state
);
3328 header
.decl_state_size
= decl_state_size
;
3330 header
.main_size
= ob
->main_stream
->total_size
;
3331 header
.string_size
= ob
->string_stream
->total_size
;
3333 lto_write_data (&header
, sizeof header
);
3335 /* Write the main out-decl state, followed by out-decl states of
3337 num_decl_states
= num_fns
+ 1;
3338 lto_write_data (&num_decl_states
, sizeof (num_decl_states
));
3339 lto_output_decl_state_refs (ob
, out_state
);
3340 for (idx
= 0; idx
< num_fns
; idx
++)
3342 fn_out_state
= lto_function_decl_states
[idx
];
3343 lto_output_decl_state_refs (ob
, fn_out_state
);
3346 lto_write_stream (ob
->main_stream
);
3347 lto_write_stream (ob
->string_stream
);
3351 /* Write the symbol table. It is used by linker to determine dependencies
3352 and thus we can skip it for WPA. */
3355 unsigned int streamed_symbols
= produce_symtab (ob
);
3356 produce_symtab_extension (ob
, streamed_symbols
);
3359 /* Write command line opts. */
3360 lto_write_options ();
3362 /* Deallocate memory and clean up. */
3363 for (idx
= 0; idx
< num_fns
; idx
++)
3366 lto_function_decl_states
[idx
];
3367 lto_delete_out_decl_state (fn_out_state
);
3369 lto_symtab_encoder_delete (ob
->decl_state
->symtab_node_encoder
);
3370 lto_function_decl_states
.release ();
3371 destroy_output_block (ob
);
3372 if (lto_stream_offload_p
)
3373 lto_write_mode_table ();