1 /* Write the GIMPLE representation to a file stream.
3 Copyright (C) 2009-2015 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"
30 #include "double-int.h"
37 #include "fold-const.h"
38 #include "stor-layout.h"
39 #include "stringpool.h"
41 #include "hard-reg-set.h"
45 #include "statistics.h"
47 #include "fixed-value.h"
48 #include "insn-config.h"
59 #include "dominance.h"
61 #include "basic-block.h"
62 #include "tree-ssa-alias.h"
63 #include "internal-fn.h"
64 #include "gimple-expr.h"
67 #include "gimple-iterator.h"
68 #include "gimple-ssa.h"
69 #include "tree-ssanames.h"
70 #include "tree-pass.h"
71 #include "diagnostic-core.h"
73 #include "lto-symtab.h"
75 #include "plugin-api.h"
78 #include "lto-streamer.h"
79 #include "data-streamer.h"
80 #include "gimple-streamer.h"
81 #include "tree-streamer.h"
82 #include "streamer-hooks.h"
85 #include "gomp-constants.h"
88 static void lto_write_tree (struct output_block
*, tree
, bool);
90 /* Clear the line info stored in DATA_IN. */
93 clear_line_info (struct output_block
*ob
)
95 ob
->current_file
= NULL
;
101 /* Create the output block and return it. SECTION_TYPE is
102 LTO_section_function_body or LTO_static_initializer. */
104 struct output_block
*
105 create_output_block (enum lto_section_type section_type
)
107 struct output_block
*ob
= XCNEW (struct output_block
);
109 ob
->section_type
= section_type
;
110 ob
->decl_state
= lto_get_out_decl_state ();
111 ob
->main_stream
= XCNEW (struct lto_output_stream
);
112 ob
->string_stream
= XCNEW (struct lto_output_stream
);
113 ob
->writer_cache
= streamer_tree_cache_create (!flag_wpa
, true, false);
115 if (section_type
== LTO_section_function_body
)
116 ob
->cfg_stream
= XCNEW (struct lto_output_stream
);
118 clear_line_info (ob
);
120 ob
->string_hash_table
= new hash_table
<string_slot_hasher
> (37);
121 gcc_obstack_init (&ob
->obstack
);
127 /* Destroy the output block OB. */
130 destroy_output_block (struct output_block
*ob
)
132 enum lto_section_type section_type
= ob
->section_type
;
134 delete ob
->string_hash_table
;
135 ob
->string_hash_table
= NULL
;
137 free (ob
->main_stream
);
138 free (ob
->string_stream
);
139 if (section_type
== LTO_section_function_body
)
140 free (ob
->cfg_stream
);
142 streamer_tree_cache_delete (ob
->writer_cache
);
143 obstack_free (&ob
->obstack
, NULL
);
149 /* Look up NODE in the type table and write the index for it to OB. */
152 output_type_ref (struct output_block
*ob
, tree node
)
154 streamer_write_record_start (ob
, LTO_type_ref
);
155 lto_output_type_ref_index (ob
->decl_state
, ob
->main_stream
, node
);
159 /* Return true if tree node T is written to various tables. For these
160 nodes, we sometimes want to write their phyiscal representation
161 (via lto_output_tree), and sometimes we need to emit an index
162 reference into a table (via lto_output_tree_ref). */
165 tree_is_indexable (tree t
)
167 /* Parameters and return values of functions of variably modified types
168 must go to global stream, because they may be used in the type
170 if ((TREE_CODE (t
) == PARM_DECL
|| TREE_CODE (t
) == RESULT_DECL
)
172 return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t
)), NULL_TREE
);
173 /* IMPORTED_DECL is put into BLOCK and thus it never can be shared. */
174 else if (TREE_CODE (t
) == IMPORTED_DECL
)
176 else if (((TREE_CODE (t
) == VAR_DECL
&& !TREE_STATIC (t
))
177 || TREE_CODE (t
) == TYPE_DECL
178 || TREE_CODE (t
) == CONST_DECL
179 || TREE_CODE (t
) == NAMELIST_DECL
)
180 && decl_function_context (t
))
182 else if (TREE_CODE (t
) == DEBUG_EXPR_DECL
)
184 /* Variably modified types need to be streamed alongside function
185 bodies because they can refer to local entities. Together with
186 them we have to localize their members as well.
187 ??? In theory that includes non-FIELD_DECLs as well. */
189 && variably_modified_type_p (t
, NULL_TREE
))
191 else if (TREE_CODE (t
) == FIELD_DECL
192 && variably_modified_type_p (DECL_CONTEXT (t
), NULL_TREE
))
195 return (TYPE_P (t
) || DECL_P (t
) || TREE_CODE (t
) == SSA_NAME
);
199 /* Output info about new location into bitpack BP.
200 After outputting bitpack, lto_output_location_data has
201 to be done to output actual data. */
204 lto_output_location (struct output_block
*ob
, struct bitpack_d
*bp
,
207 expanded_location xloc
;
209 loc
= LOCATION_LOCUS (loc
);
210 bp_pack_value (bp
, loc
== UNKNOWN_LOCATION
, 1);
211 if (loc
== UNKNOWN_LOCATION
)
214 xloc
= expand_location (loc
);
216 bp_pack_value (bp
, ob
->current_file
!= xloc
.file
, 1);
217 bp_pack_value (bp
, ob
->current_line
!= xloc
.line
, 1);
218 bp_pack_value (bp
, ob
->current_col
!= xloc
.column
, 1);
220 if (ob
->current_file
!= xloc
.file
)
221 bp_pack_string (ob
, bp
, xloc
.file
, true);
222 ob
->current_file
= xloc
.file
;
224 if (ob
->current_line
!= xloc
.line
)
225 bp_pack_var_len_unsigned (bp
, xloc
.line
);
226 ob
->current_line
= xloc
.line
;
228 if (ob
->current_col
!= xloc
.column
)
229 bp_pack_var_len_unsigned (bp
, xloc
.column
);
230 ob
->current_col
= xloc
.column
;
234 /* If EXPR is an indexable tree node, output a reference to it to
235 output block OB. Otherwise, output the physical representation of
239 lto_output_tree_ref (struct output_block
*ob
, tree expr
)
245 output_type_ref (ob
, expr
);
249 code
= TREE_CODE (expr
);
253 streamer_write_record_start (ob
, LTO_ssa_name_ref
);
254 streamer_write_uhwi (ob
, SSA_NAME_VERSION (expr
));
258 streamer_write_record_start (ob
, LTO_field_decl_ref
);
259 lto_output_field_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
263 streamer_write_record_start (ob
, LTO_function_decl_ref
);
264 lto_output_fn_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
268 case DEBUG_EXPR_DECL
:
269 gcc_assert (decl_function_context (expr
) == NULL
|| TREE_STATIC (expr
));
271 streamer_write_record_start (ob
, LTO_global_decl_ref
);
272 lto_output_var_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
276 streamer_write_record_start (ob
, LTO_const_decl_ref
);
277 lto_output_var_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
281 gcc_assert (decl_function_context (expr
) == NULL
);
282 streamer_write_record_start (ob
, LTO_imported_decl_ref
);
283 lto_output_var_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
287 streamer_write_record_start (ob
, LTO_type_decl_ref
);
288 lto_output_type_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
292 streamer_write_record_start (ob
, LTO_namelist_decl_ref
);
293 lto_output_var_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
297 streamer_write_record_start (ob
, LTO_namespace_decl_ref
);
298 lto_output_namespace_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
302 streamer_write_record_start (ob
, LTO_label_decl_ref
);
303 lto_output_var_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
307 streamer_write_record_start (ob
, LTO_result_decl_ref
);
308 lto_output_var_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
311 case TRANSLATION_UNIT_DECL
:
312 streamer_write_record_start (ob
, LTO_translation_unit_decl_ref
);
313 lto_output_var_decl_index (ob
->decl_state
, ob
->main_stream
, expr
);
317 /* No other node is indexable, so it should have been handled by
324 /* Return true if EXPR is a tree node that can be written to disk. */
327 lto_is_streamable (tree expr
)
329 enum tree_code code
= TREE_CODE (expr
);
331 /* Notice that we reject SSA_NAMEs as well. We only emit the SSA
332 name version in lto_output_tree_ref (see output_ssa_names). */
333 return !is_lang_specific (expr
)
337 && code
!= MODIFY_EXPR
339 && code
!= TARGET_EXPR
341 && code
!= WITH_CLEANUP_EXPR
342 && code
!= STATEMENT_LIST
343 && (code
== CASE_LABEL_EXPR
345 || TREE_CODE_CLASS (code
) != tcc_statement
);
349 /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */
352 get_symbol_initial_value (lto_symtab_encoder_t encoder
, tree expr
)
354 gcc_checking_assert (DECL_P (expr
)
355 && TREE_CODE (expr
) != FUNCTION_DECL
356 && TREE_CODE (expr
) != TRANSLATION_UNIT_DECL
);
358 /* Handle DECL_INITIAL for symbols. */
359 tree initial
= DECL_INITIAL (expr
);
360 if (TREE_CODE (expr
) == VAR_DECL
361 && (TREE_STATIC (expr
) || DECL_EXTERNAL (expr
))
362 && !DECL_IN_CONSTANT_POOL (expr
)
366 /* Extra section needs about 30 bytes; do not produce it for simple
368 if (TREE_CODE (DECL_INITIAL (expr
)) == CONSTRUCTOR
369 || !(vnode
= varpool_node::get (expr
))
370 || !lto_symtab_encoder_encode_initializer_p (encoder
, vnode
))
371 initial
= error_mark_node
;
378 /* Write a physical representation of tree node EXPR to output block
379 OB. If REF_P is true, the leaves of EXPR are emitted as references
380 via lto_output_tree_ref. IX is the index into the streamer cache
381 where EXPR is stored. */
384 lto_write_tree_1 (struct output_block
*ob
, tree expr
, bool ref_p
)
386 /* Pack all the non-pointer fields in EXPR into a bitpack and write
387 the resulting bitpack. */
388 streamer_write_tree_bitfields (ob
, expr
);
390 /* Write all the pointer fields in EXPR. */
391 streamer_write_tree_body (ob
, expr
, ref_p
);
393 /* Write any LTO-specific data to OB. */
395 && TREE_CODE (expr
) != FUNCTION_DECL
396 && TREE_CODE (expr
) != TRANSLATION_UNIT_DECL
)
398 /* Handle DECL_INITIAL for symbols. */
399 tree initial
= get_symbol_initial_value
400 (ob
->decl_state
->symtab_node_encoder
, expr
);
401 stream_write_tree (ob
, initial
, ref_p
);
405 /* Write a physical representation of tree node EXPR to output block
406 OB. If REF_P is true, the leaves of EXPR are emitted as references
407 via lto_output_tree_ref. IX is the index into the streamer cache
408 where EXPR is stored. */
411 lto_write_tree (struct output_block
*ob
, tree expr
, bool ref_p
)
413 if (!lto_is_streamable (expr
))
414 internal_error ("tree code %qs is not supported in LTO streams",
415 get_tree_code_name (TREE_CODE (expr
)));
417 /* Write the header, containing everything needed to materialize
418 EXPR on the reading side. */
419 streamer_write_tree_header (ob
, expr
);
421 lto_write_tree_1 (ob
, expr
, ref_p
);
423 /* Mark the end of EXPR. */
424 streamer_write_zero (ob
);
427 /* Emit the physical representation of tree node EXPR to output block
428 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
429 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
432 lto_output_tree_1 (struct output_block
*ob
, tree expr
, hashval_t hash
,
433 bool ref_p
, bool this_ref_p
)
437 gcc_checking_assert (expr
!= NULL_TREE
438 && !(this_ref_p
&& tree_is_indexable (expr
)));
440 bool exists_p
= streamer_tree_cache_insert (ob
->writer_cache
,
442 gcc_assert (!exists_p
);
443 if (streamer_handle_as_builtin_p (expr
))
445 /* MD and NORMAL builtins do not need to be written out
446 completely as they are always instantiated by the
447 compiler on startup. The only builtins that need to
448 be written out are BUILT_IN_FRONTEND. For all other
449 builtins, we simply write the class and code. */
450 streamer_write_builtin (ob
, expr
);
452 else if (TREE_CODE (expr
) == INTEGER_CST
453 && !TREE_OVERFLOW (expr
))
455 /* Shared INTEGER_CST nodes are special because they need their
456 original type to be materialized by the reader (to implement
457 TYPE_CACHED_VALUES). */
458 streamer_write_integer_cst (ob
, expr
, ref_p
);
462 /* This is the first time we see EXPR, write its fields
464 lto_write_tree (ob
, expr
, ref_p
);
471 DFS (struct output_block
*ob
, tree expr
, bool ref_p
, bool this_ref_p
,
480 vec
<scc_entry
> sccstack
;
497 static int scc_entry_compare (const void *, const void *);
499 void DFS_write_tree_body (struct output_block
*ob
,
500 tree expr
, sccs
*expr_state
, bool ref_p
);
502 void DFS_write_tree (struct output_block
*ob
, sccs
*from_state
,
503 tree expr
, bool ref_p
, bool this_ref_p
);
506 hash_scc (struct output_block
*ob
, unsigned first
, unsigned size
);
508 hash_map
<tree
, sccs
*> sccstate
;
509 vec
<worklist
> worklist_vec
;
510 struct obstack sccstate_obstack
;
513 DFS::DFS (struct output_block
*ob
, tree expr
, bool ref_p
, bool this_ref_p
,
516 unsigned int next_dfs_num
= 1;
518 gcc_obstack_init (&sccstate_obstack
);
519 worklist_vec
= vNULL
;
520 DFS_write_tree (ob
, NULL
, expr
, ref_p
, this_ref_p
);
521 while (!worklist_vec
.is_empty ())
523 worklist
&w
= worklist_vec
.last ();
525 sccs
*from_state
= w
.from_state
;
526 sccs
*cstate
= w
.cstate
;
528 this_ref_p
= w
.this_ref_p
;
531 sccs
**slot
= &sccstate
.get_or_insert (expr
);
535 gcc_checking_assert (from_state
);
536 if (cstate
->dfsnum
< from_state
->dfsnum
)
537 from_state
->low
= MIN (cstate
->dfsnum
, from_state
->low
);
542 scc_entry e
= { expr
, 0 };
543 /* Not yet visited. DFS recurse and push it onto the stack. */
544 *slot
= cstate
= XOBNEW (&sccstate_obstack
, struct sccs
);
545 sccstack
.safe_push (e
);
546 cstate
->dfsnum
= next_dfs_num
++;
547 cstate
->low
= cstate
->dfsnum
;
550 if (streamer_handle_as_builtin_p (expr
))
552 else if (TREE_CODE (expr
) == INTEGER_CST
553 && !TREE_OVERFLOW (expr
))
554 DFS_write_tree (ob
, cstate
, TREE_TYPE (expr
), ref_p
, ref_p
);
557 DFS_write_tree_body (ob
, expr
, cstate
, ref_p
);
559 /* Walk any LTO-specific edges. */
561 && TREE_CODE (expr
) != FUNCTION_DECL
562 && TREE_CODE (expr
) != TRANSLATION_UNIT_DECL
)
564 /* Handle DECL_INITIAL for symbols. */
566 = get_symbol_initial_value (ob
->decl_state
->symtab_node_encoder
,
568 DFS_write_tree (ob
, cstate
, initial
, ref_p
, ref_p
);
574 /* See if we found an SCC. */
575 if (cstate
->low
== cstate
->dfsnum
)
577 unsigned first
, size
;
580 /* If we are re-walking a single leaf-SCC just pop it,
581 let earlier worklist item access the sccstack. */
588 /* Pop the SCC and compute its size. */
589 first
= sccstack
.length ();
592 x
= sccstack
[--first
].t
;
595 size
= sccstack
.length () - first
;
597 /* No need to compute hashes for LTRANS units, we don't perform
598 any merging there. */
599 hashval_t scc_hash
= 0;
600 unsigned scc_entry_len
= 0;
603 scc_hash
= hash_scc (ob
, first
, size
);
605 /* Put the entries with the least number of collisions first. */
606 unsigned entry_start
= 0;
607 scc_entry_len
= size
+ 1;
608 for (unsigned i
= 0; i
< size
;)
611 for (i
= i
+ 1; i
< size
612 && (sccstack
[first
+ i
].hash
613 == sccstack
[first
+ from
].hash
); ++i
)
615 if (i
- from
< scc_entry_len
)
617 scc_entry_len
= i
- from
;
621 for (unsigned i
= 0; i
< scc_entry_len
; ++i
)
623 scc_entry tem
= sccstack
[first
+ i
];
624 sccstack
[first
+ i
] = sccstack
[first
+ entry_start
+ i
];
625 sccstack
[first
+ entry_start
+ i
] = tem
;
628 if (scc_entry_len
== 1)
629 ; /* We already sorted SCC deterministically in hash_scc. */
631 /* Check that we have only one SCC.
632 Naturally we may have conflicts if hash function is not
633 strong enough. Lets see how far this gets. */
635 #ifdef ENABLE_CHECKING
641 /* Write LTO_tree_scc. */
642 streamer_write_record_start (ob
, LTO_tree_scc
);
643 streamer_write_uhwi (ob
, size
);
644 streamer_write_uhwi (ob
, scc_hash
);
646 /* Write size-1 SCCs without wrapping them inside SCC bundles.
647 All INTEGER_CSTs need to be handled this way as we need
648 their type to materialize them. Also builtins are handled
650 ??? We still wrap these in LTO_tree_scc so at the
651 input side we can properly identify the tree we want
652 to ultimatively return. */
654 lto_output_tree_1 (ob
, expr
, scc_hash
, ref_p
, this_ref_p
);
657 /* Write the size of the SCC entry candidates. */
658 streamer_write_uhwi (ob
, scc_entry_len
);
660 /* Write all headers and populate the streamer cache. */
661 for (unsigned i
= 0; i
< size
; ++i
)
663 hashval_t hash
= sccstack
[first
+i
].hash
;
664 tree t
= sccstack
[first
+i
].t
;
665 bool exists_p
= streamer_tree_cache_insert (ob
->writer_cache
,
667 gcc_assert (!exists_p
);
669 if (!lto_is_streamable (t
))
670 internal_error ("tree code %qs is not supported "
672 get_tree_code_name (TREE_CODE (t
)));
674 gcc_checking_assert (!streamer_handle_as_builtin_p (t
));
676 /* Write the header, containing everything needed to
677 materialize EXPR on the reading side. */
678 streamer_write_tree_header (ob
, t
);
681 /* Write the bitpacks and tree references. */
682 for (unsigned i
= 0; i
< size
; ++i
)
684 lto_write_tree_1 (ob
, sccstack
[first
+i
].t
, ref_p
);
686 /* Mark the end of the tree. */
687 streamer_write_zero (ob
);
691 /* Finally truncate the vector. */
692 sccstack
.truncate (first
);
695 from_state
->low
= MIN (from_state
->low
, cstate
->low
);
700 gcc_checking_assert (from_state
);
701 from_state
->low
= MIN (from_state
->low
, cstate
->low
);
702 if (cstate
->dfsnum
< from_state
->dfsnum
)
703 from_state
->low
= MIN (cstate
->dfsnum
, from_state
->low
);
706 worklist_vec
.release ();
712 obstack_free (&sccstate_obstack
, NULL
);
715 /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and
716 DFS recurse for all tree edges originating from it. */
719 DFS::DFS_write_tree_body (struct output_block
*ob
,
720 tree expr
, sccs
*expr_state
, bool ref_p
)
722 #define DFS_follow_tree_edge(DEST) \
723 DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p)
727 code
= TREE_CODE (expr
);
729 if (CODE_CONTAINS_STRUCT (code
, TS_TYPED
))
731 if (TREE_CODE (expr
) != IDENTIFIER_NODE
)
732 DFS_follow_tree_edge (TREE_TYPE (expr
));
735 if (CODE_CONTAINS_STRUCT (code
, TS_VECTOR
))
737 for (unsigned i
= 0; i
< VECTOR_CST_NELTS (expr
); ++i
)
738 DFS_follow_tree_edge (VECTOR_CST_ELT (expr
, i
));
741 if (CODE_CONTAINS_STRUCT (code
, TS_COMPLEX
))
743 DFS_follow_tree_edge (TREE_REALPART (expr
));
744 DFS_follow_tree_edge (TREE_IMAGPART (expr
));
747 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_MINIMAL
))
749 /* Drop names that were created for anonymous entities. */
751 && TREE_CODE (DECL_NAME (expr
)) == IDENTIFIER_NODE
752 && ANON_AGGRNAME_P (DECL_NAME (expr
)))
755 DFS_follow_tree_edge (DECL_NAME (expr
));
756 DFS_follow_tree_edge (DECL_CONTEXT (expr
));
759 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_COMMON
))
761 DFS_follow_tree_edge (DECL_SIZE (expr
));
762 DFS_follow_tree_edge (DECL_SIZE_UNIT (expr
));
764 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
765 special handling in LTO, it must be handled by streamer hooks. */
767 DFS_follow_tree_edge (DECL_ATTRIBUTES (expr
));
769 /* Do not follow DECL_ABSTRACT_ORIGIN. We cannot handle debug information
770 for early inlining so drop it on the floor instead of ICEing in
773 if ((TREE_CODE (expr
) == VAR_DECL
774 || TREE_CODE (expr
) == PARM_DECL
)
775 && DECL_HAS_VALUE_EXPR_P (expr
))
776 DFS_follow_tree_edge (DECL_VALUE_EXPR (expr
));
777 if (TREE_CODE (expr
) == VAR_DECL
)
778 DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr
));
781 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_NON_COMMON
))
783 if (TREE_CODE (expr
) == TYPE_DECL
)
784 DFS_follow_tree_edge (DECL_ORIGINAL_TYPE (expr
));
787 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_WITH_VIS
))
789 /* Make sure we don't inadvertently set the assembler name. */
790 if (DECL_ASSEMBLER_NAME_SET_P (expr
))
791 DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr
));
794 if (CODE_CONTAINS_STRUCT (code
, TS_FIELD_DECL
))
796 DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr
));
797 DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr
));
798 DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr
));
799 DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr
));
800 DFS_follow_tree_edge (DECL_FCONTEXT (expr
));
803 if (CODE_CONTAINS_STRUCT (code
, TS_FUNCTION_DECL
))
805 DFS_follow_tree_edge (DECL_VINDEX (expr
));
806 DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr
));
807 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr
));
808 DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr
));
811 if (CODE_CONTAINS_STRUCT (code
, TS_TYPE_COMMON
))
813 DFS_follow_tree_edge (TYPE_SIZE (expr
));
814 DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr
));
815 DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr
));
816 DFS_follow_tree_edge (TYPE_NAME (expr
));
817 /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
818 reconstructed during fixup. */
819 /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists
821 DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr
));
822 DFS_follow_tree_edge (TYPE_CONTEXT (expr
));
823 /* TYPE_CANONICAL is re-computed during type merging, so no need
824 to follow it here. */
825 DFS_follow_tree_edge (TYPE_STUB_DECL (expr
));
828 if (CODE_CONTAINS_STRUCT (code
, TS_TYPE_NON_COMMON
))
830 if (TREE_CODE (expr
) == ENUMERAL_TYPE
)
831 DFS_follow_tree_edge (TYPE_VALUES (expr
));
832 else if (TREE_CODE (expr
) == ARRAY_TYPE
)
833 DFS_follow_tree_edge (TYPE_DOMAIN (expr
));
834 else if (RECORD_OR_UNION_TYPE_P (expr
))
835 for (tree t
= TYPE_FIELDS (expr
); t
; t
= TREE_CHAIN (t
))
836 DFS_follow_tree_edge (t
);
837 else if (TREE_CODE (expr
) == FUNCTION_TYPE
838 || TREE_CODE (expr
) == METHOD_TYPE
)
839 DFS_follow_tree_edge (TYPE_ARG_TYPES (expr
));
841 if (!POINTER_TYPE_P (expr
))
842 DFS_follow_tree_edge (TYPE_MINVAL (expr
));
843 DFS_follow_tree_edge (TYPE_MAXVAL (expr
));
844 if (RECORD_OR_UNION_TYPE_P (expr
))
845 DFS_follow_tree_edge (TYPE_BINFO (expr
));
848 if (CODE_CONTAINS_STRUCT (code
, TS_LIST
))
850 DFS_follow_tree_edge (TREE_PURPOSE (expr
));
851 DFS_follow_tree_edge (TREE_VALUE (expr
));
852 DFS_follow_tree_edge (TREE_CHAIN (expr
));
855 if (CODE_CONTAINS_STRUCT (code
, TS_VEC
))
857 for (int i
= 0; i
< TREE_VEC_LENGTH (expr
); i
++)
858 DFS_follow_tree_edge (TREE_VEC_ELT (expr
, i
));
861 if (CODE_CONTAINS_STRUCT (code
, TS_EXP
))
863 for (int i
= 0; i
< TREE_OPERAND_LENGTH (expr
); i
++)
864 DFS_follow_tree_edge (TREE_OPERAND (expr
, i
));
865 DFS_follow_tree_edge (TREE_BLOCK (expr
));
868 if (CODE_CONTAINS_STRUCT (code
, TS_BLOCK
))
870 for (tree t
= BLOCK_VARS (expr
); t
; t
= TREE_CHAIN (t
))
871 if (VAR_OR_FUNCTION_DECL_P (t
)
872 && DECL_EXTERNAL (t
))
873 /* We have to stream externals in the block chain as
874 non-references. See also
875 tree-streamer-out.c:streamer_write_chain. */
876 DFS_write_tree (ob
, expr_state
, t
, ref_p
, false);
878 DFS_follow_tree_edge (t
);
880 DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr
));
882 /* Follow BLOCK_ABSTRACT_ORIGIN for the limited cases we can
883 handle - those that represent inlined function scopes.
884 For the drop rest them on the floor instead of ICEing
886 if (inlined_function_outer_scope_p (expr
))
888 tree ultimate_origin
= block_ultimate_origin (expr
);
889 DFS_follow_tree_edge (ultimate_origin
);
891 /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug
892 information for early inlined BLOCKs so drop it on the floor instead
893 of ICEing in dwarf2out.c. */
895 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
898 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
899 list is re-constructed from BLOCK_SUPERCONTEXT. */
902 if (CODE_CONTAINS_STRUCT (code
, TS_BINFO
))
907 /* Note that the number of BINFO slots has already been emitted in
908 EXPR's header (see streamer_write_tree_header) because this length
909 is needed to build the empty BINFO node on the reader side. */
910 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr
), i
, t
)
911 DFS_follow_tree_edge (t
);
912 DFS_follow_tree_edge (BINFO_OFFSET (expr
));
913 DFS_follow_tree_edge (BINFO_VTABLE (expr
));
914 DFS_follow_tree_edge (BINFO_VPTR_FIELD (expr
));
916 /* The number of BINFO_BASE_ACCESSES has already been emitted in
917 EXPR's bitfield section. */
918 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr
), i
, t
)
919 DFS_follow_tree_edge (t
);
921 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
922 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
925 if (CODE_CONTAINS_STRUCT (code
, TS_CONSTRUCTOR
))
930 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr
), i
, index
, value
)
932 DFS_follow_tree_edge (index
);
933 DFS_follow_tree_edge (value
);
937 if (code
== OMP_CLAUSE
)
940 for (i
= 0; i
< omp_clause_num_ops
[OMP_CLAUSE_CODE (expr
)]; i
++)
941 DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr
, i
));
942 DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr
));
945 #undef DFS_follow_tree_edge
948 /* Return a hash value for the tree T.
949 CACHE holds hash values of trees outside current SCC. MAP, if non-NULL,
950 may hold hash values if trees inside current SCC. */
953 hash_tree (struct streamer_tree_cache_d
*cache
, hash_map
<tree
, hashval_t
> *map
, tree t
)
955 inchash::hash hstate
;
957 #define visit(SIBLING) \
961 hstate.add_int (0); \
962 else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \
963 hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \
965 hstate.add_int (*map->get (SIBLING)); \
967 hstate.add_int (1); \
971 enum tree_code code
= TREE_CODE (t
);
972 hstate
.add_int (code
);
975 hstate
.add_flag (TREE_SIDE_EFFECTS (t
));
976 hstate
.add_flag (TREE_CONSTANT (t
));
977 hstate
.add_flag (TREE_READONLY (t
));
978 hstate
.add_flag (TREE_PUBLIC (t
));
980 hstate
.add_flag (TREE_ADDRESSABLE (t
));
981 hstate
.add_flag (TREE_THIS_VOLATILE (t
));
983 hstate
.add_flag (DECL_UNSIGNED (t
));
985 hstate
.add_flag (TYPE_UNSIGNED (t
));
987 hstate
.add_flag (TYPE_ARTIFICIAL (t
));
989 hstate
.add_flag (TREE_NO_WARNING (t
));
990 hstate
.add_flag (TREE_NOTHROW (t
));
991 hstate
.add_flag (TREE_STATIC (t
));
992 hstate
.add_flag (TREE_PROTECTED (t
));
993 hstate
.add_flag (TREE_DEPRECATED (t
));
994 if (code
!= TREE_BINFO
)
995 hstate
.add_flag (TREE_PRIVATE (t
));
998 hstate
.add_flag (TYPE_SATURATING (t
));
999 hstate
.add_flag (TYPE_ADDR_SPACE (t
));
1001 else if (code
== SSA_NAME
)
1002 hstate
.add_flag (SSA_NAME_IS_DEFAULT_DEF (t
));
1003 hstate
.commit_flag ();
1005 if (CODE_CONTAINS_STRUCT (code
, TS_INT_CST
))
1008 hstate
.add_wide_int (TREE_INT_CST_NUNITS (t
));
1009 hstate
.add_wide_int (TREE_INT_CST_EXT_NUNITS (t
));
1010 for (i
= 0; i
< TREE_INT_CST_NUNITS (t
); i
++)
1011 hstate
.add_wide_int (TREE_INT_CST_ELT (t
, i
));
1014 if (CODE_CONTAINS_STRUCT (code
, TS_REAL_CST
))
1016 REAL_VALUE_TYPE r
= TREE_REAL_CST (t
);
1017 hstate
.add_flag (r
.cl
);
1018 hstate
.add_flag (r
.sign
);
1019 hstate
.add_flag (r
.signalling
);
1020 hstate
.add_flag (r
.canonical
);
1021 hstate
.commit_flag ();
1022 hstate
.add_int (r
.uexp
);
1023 hstate
.add (r
.sig
, sizeof (r
.sig
));
1026 if (CODE_CONTAINS_STRUCT (code
, TS_FIXED_CST
))
1028 FIXED_VALUE_TYPE f
= TREE_FIXED_CST (t
);
1029 hstate
.add_int (f
.mode
);
1030 hstate
.add_int (f
.data
.low
);
1031 hstate
.add_int (f
.data
.high
);
1034 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_COMMON
))
1036 hstate
.add_wide_int (DECL_MODE (t
));
1037 hstate
.add_flag (DECL_NONLOCAL (t
));
1038 hstate
.add_flag (DECL_VIRTUAL_P (t
));
1039 hstate
.add_flag (DECL_IGNORED_P (t
));
1040 hstate
.add_flag (DECL_ABSTRACT_P (t
));
1041 hstate
.add_flag (DECL_ARTIFICIAL (t
));
1042 hstate
.add_flag (DECL_USER_ALIGN (t
));
1043 hstate
.add_flag (DECL_PRESERVE_P (t
));
1044 hstate
.add_flag (DECL_EXTERNAL (t
));
1045 hstate
.add_flag (DECL_GIMPLE_REG_P (t
));
1046 hstate
.commit_flag ();
1047 hstate
.add_int (DECL_ALIGN (t
));
1048 if (code
== LABEL_DECL
)
1050 hstate
.add_int (EH_LANDING_PAD_NR (t
));
1051 hstate
.add_int (LABEL_DECL_UID (t
));
1053 else if (code
== FIELD_DECL
)
1055 hstate
.add_flag (DECL_PACKED (t
));
1056 hstate
.add_flag (DECL_NONADDRESSABLE_P (t
));
1057 hstate
.add_int (DECL_OFFSET_ALIGN (t
));
1059 else if (code
== VAR_DECL
)
1061 hstate
.add_flag (DECL_HAS_DEBUG_EXPR_P (t
));
1062 hstate
.add_flag (DECL_NONLOCAL_FRAME (t
));
1064 if (code
== RESULT_DECL
1065 || code
== PARM_DECL
1066 || code
== VAR_DECL
)
1068 hstate
.add_flag (DECL_BY_REFERENCE (t
));
1069 if (code
== VAR_DECL
1070 || code
== PARM_DECL
)
1071 hstate
.add_flag (DECL_HAS_VALUE_EXPR_P (t
));
1073 hstate
.commit_flag ();
1076 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_WRTL
))
1077 hstate
.add_int (DECL_REGISTER (t
));
1079 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_WITH_VIS
))
1081 hstate
.add_flag (DECL_COMMON (t
));
1082 hstate
.add_flag (DECL_DLLIMPORT_P (t
));
1083 hstate
.add_flag (DECL_WEAK (t
));
1084 hstate
.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t
));
1085 hstate
.add_flag (DECL_COMDAT (t
));
1086 hstate
.add_flag (DECL_VISIBILITY_SPECIFIED (t
));
1087 hstate
.add_int (DECL_VISIBILITY (t
));
1088 if (code
== VAR_DECL
)
1090 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
1091 hstate
.add_flag (DECL_HARD_REGISTER (t
));
1092 hstate
.add_flag (DECL_IN_CONSTANT_POOL (t
));
1094 if (TREE_CODE (t
) == FUNCTION_DECL
)
1096 hstate
.add_flag (DECL_FINAL_P (t
));
1097 hstate
.add_flag (DECL_CXX_CONSTRUCTOR_P (t
));
1098 hstate
.add_flag (DECL_CXX_DESTRUCTOR_P (t
));
1100 hstate
.commit_flag ();
1103 if (CODE_CONTAINS_STRUCT (code
, TS_FUNCTION_DECL
))
1105 hstate
.add_int (DECL_BUILT_IN_CLASS (t
));
1106 hstate
.add_flag (DECL_STATIC_CONSTRUCTOR (t
));
1107 hstate
.add_flag (DECL_STATIC_DESTRUCTOR (t
));
1108 hstate
.add_flag (DECL_UNINLINABLE (t
));
1109 hstate
.add_flag (DECL_POSSIBLY_INLINED (t
));
1110 hstate
.add_flag (DECL_IS_NOVOPS (t
));
1111 hstate
.add_flag (DECL_IS_RETURNS_TWICE (t
));
1112 hstate
.add_flag (DECL_IS_MALLOC (t
));
1113 hstate
.add_flag (DECL_IS_OPERATOR_NEW (t
));
1114 hstate
.add_flag (DECL_DECLARED_INLINE_P (t
));
1115 hstate
.add_flag (DECL_STATIC_CHAIN (t
));
1116 hstate
.add_flag (DECL_NO_INLINE_WARNING_P (t
));
1117 hstate
.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t
));
1118 hstate
.add_flag (DECL_NO_LIMIT_STACK (t
));
1119 hstate
.add_flag (DECL_DISREGARD_INLINE_LIMITS (t
));
1120 hstate
.add_flag (DECL_PURE_P (t
));
1121 hstate
.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t
));
1122 hstate
.commit_flag ();
1123 if (DECL_BUILT_IN_CLASS (t
) != NOT_BUILT_IN
)
1124 hstate
.add_int (DECL_FUNCTION_CODE (t
));
1127 if (CODE_CONTAINS_STRUCT (code
, TS_TYPE_COMMON
))
1129 hstate
.add_wide_int (TYPE_MODE (t
));
1130 hstate
.add_flag (TYPE_STRING_FLAG (t
));
1131 hstate
.add_flag (TYPE_NO_FORCE_BLK (t
));
1132 hstate
.add_flag (TYPE_NEEDS_CONSTRUCTING (t
));
1133 hstate
.add_flag (TYPE_PACKED (t
));
1134 hstate
.add_flag (TYPE_RESTRICT (t
));
1135 hstate
.add_flag (TYPE_USER_ALIGN (t
));
1136 hstate
.add_flag (TYPE_READONLY (t
));
1137 if (RECORD_OR_UNION_TYPE_P (t
))
1139 hstate
.add_flag (TYPE_TRANSPARENT_AGGR (t
));
1140 hstate
.add_flag (TYPE_FINAL_P (t
));
1142 else if (code
== ARRAY_TYPE
)
1143 hstate
.add_flag (TYPE_NONALIASED_COMPONENT (t
));
1144 hstate
.commit_flag ();
1145 hstate
.add_int (TYPE_PRECISION (t
));
1146 hstate
.add_int (TYPE_ALIGN (t
));
1147 hstate
.add_int ((TYPE_ALIAS_SET (t
) == 0
1149 && get_alias_set (t
) == 0))
1153 if (CODE_CONTAINS_STRUCT (code
, TS_TRANSLATION_UNIT_DECL
))
1154 hstate
.add (TRANSLATION_UNIT_LANGUAGE (t
),
1155 strlen (TRANSLATION_UNIT_LANGUAGE (t
)));
1157 if (CODE_CONTAINS_STRUCT (code
, TS_TARGET_OPTION
)
1158 /* We don't stream these when passing things to a different target. */
1159 && !lto_stream_offload_p
)
1160 hstate
.add_wide_int (cl_target_option_hash (TREE_TARGET_OPTION (t
)));
1162 if (CODE_CONTAINS_STRUCT (code
, TS_OPTIMIZATION
))
1163 hstate
.add_wide_int (cl_optimization_hash (TREE_OPTIMIZATION (t
)));
1165 if (CODE_CONTAINS_STRUCT (code
, TS_IDENTIFIER
))
1166 hstate
.merge_hash (IDENTIFIER_HASH_VALUE (t
));
1168 if (CODE_CONTAINS_STRUCT (code
, TS_STRING
))
1169 hstate
.add (TREE_STRING_POINTER (t
), TREE_STRING_LENGTH (t
));
1171 if (CODE_CONTAINS_STRUCT (code
, TS_TYPED
))
1173 if (code
!= IDENTIFIER_NODE
)
1174 visit (TREE_TYPE (t
));
1177 if (CODE_CONTAINS_STRUCT (code
, TS_VECTOR
))
1178 for (unsigned i
= 0; i
< VECTOR_CST_NELTS (t
); ++i
)
1179 visit (VECTOR_CST_ELT (t
, i
));
1181 if (CODE_CONTAINS_STRUCT (code
, TS_COMPLEX
))
1183 visit (TREE_REALPART (t
));
1184 visit (TREE_IMAGPART (t
));
1187 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_MINIMAL
))
1189 /* Drop names that were created for anonymous entities. */
1191 && TREE_CODE (DECL_NAME (t
)) == IDENTIFIER_NODE
1192 && ANON_AGGRNAME_P (DECL_NAME (t
)))
1195 visit (DECL_NAME (t
));
1196 if (DECL_FILE_SCOPE_P (t
))
1199 visit (DECL_CONTEXT (t
));
1202 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_COMMON
))
1204 visit (DECL_SIZE (t
));
1205 visit (DECL_SIZE_UNIT (t
));
1206 visit (DECL_ATTRIBUTES (t
));
1207 if ((code
== VAR_DECL
1208 || code
== PARM_DECL
)
1209 && DECL_HAS_VALUE_EXPR_P (t
))
1210 visit (DECL_VALUE_EXPR (t
));
1211 if (code
== VAR_DECL
1212 && DECL_HAS_DEBUG_EXPR_P (t
))
1213 visit (DECL_DEBUG_EXPR (t
));
1214 /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to
1215 be able to call get_symbol_initial_value. */
1218 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_NON_COMMON
))
1220 if (code
== TYPE_DECL
)
1221 visit (DECL_ORIGINAL_TYPE (t
));
1224 if (CODE_CONTAINS_STRUCT (code
, TS_DECL_WITH_VIS
))
1226 if (DECL_ASSEMBLER_NAME_SET_P (t
))
1227 visit (DECL_ASSEMBLER_NAME (t
));
1230 if (CODE_CONTAINS_STRUCT (code
, TS_FIELD_DECL
))
1232 visit (DECL_FIELD_OFFSET (t
));
1233 visit (DECL_BIT_FIELD_TYPE (t
));
1234 visit (DECL_BIT_FIELD_REPRESENTATIVE (t
));
1235 visit (DECL_FIELD_BIT_OFFSET (t
));
1236 visit (DECL_FCONTEXT (t
));
1239 if (CODE_CONTAINS_STRUCT (code
, TS_FUNCTION_DECL
))
1241 visit (DECL_VINDEX (t
));
1242 visit (DECL_FUNCTION_PERSONALITY (t
));
1243 visit (DECL_FUNCTION_SPECIFIC_TARGET (t
));
1244 visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t
));
1247 if (CODE_CONTAINS_STRUCT (code
, TS_TYPE_COMMON
))
1249 visit (TYPE_SIZE (t
));
1250 visit (TYPE_SIZE_UNIT (t
));
1251 visit (TYPE_ATTRIBUTES (t
));
1252 visit (TYPE_NAME (t
));
1253 visit (TYPE_MAIN_VARIANT (t
));
1254 if (TYPE_FILE_SCOPE_P (t
))
1257 visit (TYPE_CONTEXT (t
));
1258 visit (TYPE_STUB_DECL (t
));
1261 if (CODE_CONTAINS_STRUCT (code
, TS_TYPE_NON_COMMON
))
1263 if (code
== ENUMERAL_TYPE
)
1264 visit (TYPE_VALUES (t
));
1265 else if (code
== ARRAY_TYPE
)
1266 visit (TYPE_DOMAIN (t
));
1267 else if (RECORD_OR_UNION_TYPE_P (t
))
1268 for (tree f
= TYPE_FIELDS (t
); f
; f
= TREE_CHAIN (f
))
1270 else if (code
== FUNCTION_TYPE
1271 || code
== METHOD_TYPE
)
1272 visit (TYPE_ARG_TYPES (t
));
1273 if (!POINTER_TYPE_P (t
))
1274 visit (TYPE_MINVAL (t
));
1275 visit (TYPE_MAXVAL (t
));
1276 if (RECORD_OR_UNION_TYPE_P (t
))
1277 visit (TYPE_BINFO (t
));
1280 if (CODE_CONTAINS_STRUCT (code
, TS_LIST
))
1282 visit (TREE_PURPOSE (t
));
1283 visit (TREE_VALUE (t
));
1284 visit (TREE_CHAIN (t
));
1287 if (CODE_CONTAINS_STRUCT (code
, TS_VEC
))
1288 for (int i
= 0; i
< TREE_VEC_LENGTH (t
); ++i
)
1289 visit (TREE_VEC_ELT (t
, i
));
1291 if (CODE_CONTAINS_STRUCT (code
, TS_EXP
))
1293 hstate
.add_wide_int (TREE_OPERAND_LENGTH (t
));
1294 for (int i
= 0; i
< TREE_OPERAND_LENGTH (t
); ++i
)
1295 visit (TREE_OPERAND (t
, i
));
1298 if (CODE_CONTAINS_STRUCT (code
, TS_BINFO
))
1302 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t
), i
, b
)
1304 visit (BINFO_OFFSET (t
));
1305 visit (BINFO_VTABLE (t
));
1306 visit (BINFO_VPTR_FIELD (t
));
1307 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t
), i
, b
)
1309 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1310 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
1313 if (CODE_CONTAINS_STRUCT (code
, TS_CONSTRUCTOR
))
1317 hstate
.add_wide_int (CONSTRUCTOR_NELTS (t
));
1318 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t
), i
, index
, value
)
1325 if (code
== OMP_CLAUSE
)
1330 hstate
.add_wide_int (OMP_CLAUSE_CODE (t
));
1331 switch (OMP_CLAUSE_CODE (t
))
1333 case OMP_CLAUSE_DEFAULT
:
1334 val
= OMP_CLAUSE_DEFAULT_KIND (t
);
1336 case OMP_CLAUSE_SCHEDULE
:
1337 val
= OMP_CLAUSE_SCHEDULE_KIND (t
);
1339 case OMP_CLAUSE_DEPEND
:
1340 val
= OMP_CLAUSE_DEPEND_KIND (t
);
1342 case OMP_CLAUSE_MAP
:
1343 val
= OMP_CLAUSE_MAP_KIND (t
);
1345 case OMP_CLAUSE_PROC_BIND
:
1346 val
= OMP_CLAUSE_PROC_BIND_KIND (t
);
1348 case OMP_CLAUSE_REDUCTION
:
1349 val
= OMP_CLAUSE_REDUCTION_CODE (t
);
1355 hstate
.add_wide_int (val
);
1356 for (i
= 0; i
< omp_clause_num_ops
[OMP_CLAUSE_CODE (t
)]; i
++)
1357 visit (OMP_CLAUSE_OPERAND (t
, i
));
1358 visit (OMP_CLAUSE_CHAIN (t
));
1361 return hstate
.end ();
1366 /* Compare two SCC entries by their hash value for qsorting them. */
1369 DFS::scc_entry_compare (const void *p1_
, const void *p2_
)
1371 const scc_entry
*p1
= (const scc_entry
*) p1_
;
1372 const scc_entry
*p2
= (const scc_entry
*) p2_
;
1373 if (p1
->hash
< p2
->hash
)
1375 else if (p1
->hash
> p2
->hash
)
1380 /* Return a hash value for the SCC on the SCC stack from FIRST with
1384 DFS::hash_scc (struct output_block
*ob
,
1385 unsigned first
, unsigned size
)
1387 unsigned int last_classes
= 0, iterations
= 0;
1389 /* Compute hash values for the SCC members. */
1390 for (unsigned i
= 0; i
< size
; ++i
)
1391 sccstack
[first
+i
].hash
= hash_tree (ob
->writer_cache
, NULL
,
1392 sccstack
[first
+i
].t
);
1395 return sccstack
[first
].hash
;
1397 /* We aim to get unique hash for every tree within SCC and compute hash value
1398 of the whole SCC by combing all values together in an stable (entry point
1399 independent) order. This guarantees that the same SCC regions within
1400 different translation units will get the same hash values and therefore
1401 will be merged at WPA time.
1403 Often the hashes are already unique. In that case we compute scc hash
1404 by combining individual hash values in an increasing order.
1406 If thre are duplicates we seek at least one tree with unique hash (and
1407 pick one with minimal hash and this property). Then we obtain stable
1408 order by DFS walk starting from this unique tree and then use index
1409 within this order to make individual hash values unique.
1411 If there is no tree with unique hash, we iteratively propagate the hash
1412 values across the internal edges of SCC. This usually quickly leads
1413 to unique hashes. Consider, for example, an SCC containing two pointers
1414 that are identical except for type they point and assume that these
1415 types are also part of the SCC.
1416 The propagation will add the points-to type information into their hash
1420 /* Sort the SCC so we can easily see check for uniqueness. */
1421 qsort (&sccstack
[first
], size
, sizeof (scc_entry
), scc_entry_compare
);
1423 unsigned int classes
= 1;
1424 int firstunique
= -1;
1426 /* Find tree with lowest unique hash (if it exists) and compute
1427 number of equivalence classes. */
1428 if (sccstack
[first
].hash
!= sccstack
[first
+1].hash
)
1430 for (unsigned i
= 1; i
< size
; ++i
)
1431 if (sccstack
[first
+i
-1].hash
!= sccstack
[first
+i
].hash
)
1434 if (firstunique
== -1
1436 || sccstack
[first
+i
+1].hash
!= sccstack
[first
+i
].hash
))
1440 /* If we found tree with unique hash; stop the iteration. */
1441 if (firstunique
!= -1
1442 /* Also terminate if we run out of iterations or if the number of
1443 equivalence classes is no longer increasing.
1444 For example a cyclic list of trees that are all equivalent will
1445 never have unique entry point; we however do not build such SCCs
1447 || classes
<= last_classes
|| iterations
> 16)
1451 /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk
1452 starting from FIRSTUNIQUE to obstain stable order. */
1453 if (classes
!= size
&& firstunique
!= -1)
1455 hash_map
<tree
, hashval_t
> map(size
*2);
1457 /* Store hash values into a map, so we can associate them with
1459 for (unsigned i
= 0; i
< size
; ++i
)
1460 map
.put (sccstack
[first
+i
].t
, sccstack
[first
+i
].hash
);
1462 DFS
again (ob
, sccstack
[first
+firstunique
].t
, false, false, true);
1463 gcc_assert (again
.sccstack
.length () == size
);
1465 memcpy (sccstack
.address () + first
,
1466 again
.sccstack
.address (),
1467 sizeof (scc_entry
) * size
);
1469 /* Update hash values of individual members by hashing in the
1470 index within the stable order. This ensures uniqueness.
1471 Also compute the scc_hash by mixing in all hash values in the
1472 stable order we obtained. */
1473 sccstack
[first
].hash
= *map
.get (sccstack
[first
].t
);
1474 scc_hash
= sccstack
[first
].hash
;
1475 for (unsigned i
= 1; i
< size
; ++i
)
1477 sccstack
[first
+i
].hash
1478 = iterative_hash_hashval_t (i
,
1479 *map
.get (sccstack
[first
+i
].t
));
1480 scc_hash
= iterative_hash_hashval_t (scc_hash
,
1481 sccstack
[first
+i
].hash
);
1484 /* If we got unique hash values for each tree, then sort already
1485 ensured entry point independent order. Only compute the final
1488 If we failed to find the unique entry point, we go by the same
1489 route. We will eventually introduce unwanted hash conflicts. */
1492 scc_hash
= sccstack
[first
].hash
;
1493 for (unsigned i
= 1; i
< size
; ++i
)
1494 scc_hash
= iterative_hash_hashval_t (scc_hash
,
1495 sccstack
[first
+i
].hash
);
1496 /* We can not 100% guarantee that the hash will not conflict in
1497 in a way so the unique hash is not found. This however
1498 should be extremely rare situation. ICE for now so possible
1499 issues are found and evaulated. */
1500 gcc_checking_assert (classes
== size
);
1503 /* To avoid conflicts across SCCs iteratively hash the whole SCC
1504 hash into the hash of each of the elements. */
1505 for (unsigned i
= 0; i
< size
; ++i
)
1506 sccstack
[first
+i
].hash
1507 = iterative_hash_hashval_t (sccstack
[first
+i
].hash
, scc_hash
);
1511 last_classes
= classes
;
1514 /* We failed to identify the entry point; propagate hash values across
1517 hash_map
<tree
, hashval_t
> map(size
*2);
1518 for (unsigned i
= 0; i
< size
; ++i
)
1519 map
.put (sccstack
[first
+i
].t
, sccstack
[first
+i
].hash
);
1521 for (unsigned i
= 0; i
< size
; i
++)
1522 sccstack
[first
+i
].hash
= hash_tree (ob
->writer_cache
, &map
,
1523 sccstack
[first
+i
].t
);
1529 /* DFS walk EXPR and stream SCCs of tree bodies if they are not
1530 already in the streamer cache. Main routine called for
1531 each visit of EXPR. */
1534 DFS::DFS_write_tree (struct output_block
*ob
, sccs
*from_state
,
1535 tree expr
, bool ref_p
, bool this_ref_p
)
1537 /* Handle special cases. */
1538 if (expr
== NULL_TREE
)
1541 /* Do not DFS walk into indexable trees. */
1542 if (this_ref_p
&& tree_is_indexable (expr
))
1545 /* Check if we already streamed EXPR. */
1546 if (streamer_tree_cache_lookup (ob
->writer_cache
, expr
, NULL
))
1551 w
.from_state
= from_state
;
1554 w
.this_ref_p
= this_ref_p
;
1555 worklist_vec
.safe_push (w
);
1559 /* Emit the physical representation of tree node EXPR to output block
1560 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
1561 via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
1564 lto_output_tree (struct output_block
*ob
, tree expr
,
1565 bool ref_p
, bool this_ref_p
)
1570 if (expr
== NULL_TREE
)
1572 streamer_write_record_start (ob
, LTO_null
);
1576 if (this_ref_p
&& tree_is_indexable (expr
))
1578 lto_output_tree_ref (ob
, expr
);
1582 existed_p
= streamer_tree_cache_lookup (ob
->writer_cache
, expr
, &ix
);
1585 /* If a node has already been streamed out, make sure that
1586 we don't write it more than once. Otherwise, the reader
1587 will instantiate two different nodes for the same object. */
1588 streamer_write_record_start (ob
, LTO_tree_pickle_reference
);
1589 streamer_write_uhwi (ob
, ix
);
1590 streamer_write_enum (ob
->main_stream
, LTO_tags
, LTO_NUM_TAGS
,
1591 lto_tree_code_to_tag (TREE_CODE (expr
)));
1592 lto_stats
.num_pickle_refs_output
++;
1596 /* This is the first time we see EXPR, write all reachable
1598 static bool in_dfs_walk
;
1600 /* Protect against recursion which means disconnect between
1601 what tree edges we walk in the DFS walk and what edges
1603 gcc_assert (!in_dfs_walk
);
1605 /* Start the DFS walk. */
1606 /* Save ob state ... */
1609 DFS (ob
, expr
, ref_p
, this_ref_p
, false);
1610 in_dfs_walk
= false;
1612 /* Finally append a reference to the tree we were writing.
1613 ??? If expr ended up as a singleton we could have
1614 inlined it here and avoid outputting a reference. */
1615 existed_p
= streamer_tree_cache_lookup (ob
->writer_cache
, expr
, &ix
);
1616 gcc_assert (existed_p
);
1617 streamer_write_record_start (ob
, LTO_tree_pickle_reference
);
1618 streamer_write_uhwi (ob
, ix
);
1619 streamer_write_enum (ob
->main_stream
, LTO_tags
, LTO_NUM_TAGS
,
1620 lto_tree_code_to_tag (TREE_CODE (expr
)));
1621 lto_stats
.num_pickle_refs_output
++;
1626 /* Output to OB a list of try/catch handlers starting with FIRST. */
1629 output_eh_try_list (struct output_block
*ob
, eh_catch first
)
1633 for (n
= first
; n
; n
= n
->next_catch
)
1635 streamer_write_record_start (ob
, LTO_eh_catch
);
1636 stream_write_tree (ob
, n
->type_list
, true);
1637 stream_write_tree (ob
, n
->filter_list
, true);
1638 stream_write_tree (ob
, n
->label
, true);
1641 streamer_write_record_start (ob
, LTO_null
);
1645 /* Output EH region R in function FN to OB. CURR_RN is the slot index
1646 that is being emitted in FN->EH->REGION_ARRAY. This is used to
1647 detect EH region sharing. */
1650 output_eh_region (struct output_block
*ob
, eh_region r
)
1656 streamer_write_record_start (ob
, LTO_null
);
1660 if (r
->type
== ERT_CLEANUP
)
1661 tag
= LTO_ert_cleanup
;
1662 else if (r
->type
== ERT_TRY
)
1664 else if (r
->type
== ERT_ALLOWED_EXCEPTIONS
)
1665 tag
= LTO_ert_allowed_exceptions
;
1666 else if (r
->type
== ERT_MUST_NOT_THROW
)
1667 tag
= LTO_ert_must_not_throw
;
1671 streamer_write_record_start (ob
, tag
);
1672 streamer_write_hwi (ob
, r
->index
);
1675 streamer_write_hwi (ob
, r
->outer
->index
);
1677 streamer_write_zero (ob
);
1680 streamer_write_hwi (ob
, r
->inner
->index
);
1682 streamer_write_zero (ob
);
1685 streamer_write_hwi (ob
, r
->next_peer
->index
);
1687 streamer_write_zero (ob
);
1689 if (r
->type
== ERT_TRY
)
1691 output_eh_try_list (ob
, r
->u
.eh_try
.first_catch
);
1693 else if (r
->type
== ERT_ALLOWED_EXCEPTIONS
)
1695 stream_write_tree (ob
, r
->u
.allowed
.type_list
, true);
1696 stream_write_tree (ob
, r
->u
.allowed
.label
, true);
1697 streamer_write_uhwi (ob
, r
->u
.allowed
.filter
);
1699 else if (r
->type
== ERT_MUST_NOT_THROW
)
1701 stream_write_tree (ob
, r
->u
.must_not_throw
.failure_decl
, true);
1702 bitpack_d bp
= bitpack_create (ob
->main_stream
);
1703 stream_output_location (ob
, &bp
, r
->u
.must_not_throw
.failure_loc
);
1704 streamer_write_bitpack (&bp
);
1707 if (r
->landing_pads
)
1708 streamer_write_hwi (ob
, r
->landing_pads
->index
);
1710 streamer_write_zero (ob
);
1714 /* Output landing pad LP to OB. */
1717 output_eh_lp (struct output_block
*ob
, eh_landing_pad lp
)
1721 streamer_write_record_start (ob
, LTO_null
);
1725 streamer_write_record_start (ob
, LTO_eh_landing_pad
);
1726 streamer_write_hwi (ob
, lp
->index
);
1728 streamer_write_hwi (ob
, lp
->next_lp
->index
);
1730 streamer_write_zero (ob
);
1733 streamer_write_hwi (ob
, lp
->region
->index
);
1735 streamer_write_zero (ob
);
1737 stream_write_tree (ob
, lp
->post_landing_pad
, true);
1741 /* Output the existing eh_table to OB. */
1744 output_eh_regions (struct output_block
*ob
, struct function
*fn
)
1746 if (fn
->eh
&& fn
->eh
->region_tree
)
1753 streamer_write_record_start (ob
, LTO_eh_table
);
1755 /* Emit the index of the root of the EH region tree. */
1756 streamer_write_hwi (ob
, fn
->eh
->region_tree
->index
);
1758 /* Emit all the EH regions in the region array. */
1759 streamer_write_hwi (ob
, vec_safe_length (fn
->eh
->region_array
));
1760 FOR_EACH_VEC_SAFE_ELT (fn
->eh
->region_array
, i
, eh
)
1761 output_eh_region (ob
, eh
);
1763 /* Emit all landing pads. */
1764 streamer_write_hwi (ob
, vec_safe_length (fn
->eh
->lp_array
));
1765 FOR_EACH_VEC_SAFE_ELT (fn
->eh
->lp_array
, i
, lp
)
1766 output_eh_lp (ob
, lp
);
1768 /* Emit all the runtime type data. */
1769 streamer_write_hwi (ob
, vec_safe_length (fn
->eh
->ttype_data
));
1770 FOR_EACH_VEC_SAFE_ELT (fn
->eh
->ttype_data
, i
, ttype
)
1771 stream_write_tree (ob
, ttype
, true);
1773 /* Emit the table of action chains. */
1774 if (targetm
.arm_eabi_unwinder
)
1777 streamer_write_hwi (ob
, vec_safe_length (fn
->eh
->ehspec_data
.arm_eabi
));
1778 FOR_EACH_VEC_SAFE_ELT (fn
->eh
->ehspec_data
.arm_eabi
, i
, t
)
1779 stream_write_tree (ob
, t
, true);
1784 streamer_write_hwi (ob
, vec_safe_length (fn
->eh
->ehspec_data
.other
));
1785 FOR_EACH_VEC_SAFE_ELT (fn
->eh
->ehspec_data
.other
, i
, c
)
1786 streamer_write_char_stream (ob
->main_stream
, c
);
1790 /* The LTO_null either terminates the record or indicates that there
1791 are no eh_records at all. */
1792 streamer_write_record_start (ob
, LTO_null
);
1796 /* Output all of the active ssa names to the ssa_names stream. */
1799 output_ssa_names (struct output_block
*ob
, struct function
*fn
)
1801 unsigned int i
, len
;
1803 len
= vec_safe_length (SSANAMES (fn
));
1804 streamer_write_uhwi (ob
, len
);
1806 for (i
= 1; i
< len
; i
++)
1808 tree ptr
= (*SSANAMES (fn
))[i
];
1810 if (ptr
== NULL_TREE
1811 || SSA_NAME_IN_FREE_LIST (ptr
)
1812 || virtual_operand_p (ptr
))
1815 streamer_write_uhwi (ob
, i
);
1816 streamer_write_char_stream (ob
->main_stream
,
1817 SSA_NAME_IS_DEFAULT_DEF (ptr
));
1818 if (SSA_NAME_VAR (ptr
))
1819 stream_write_tree (ob
, SSA_NAME_VAR (ptr
), true);
1821 /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */
1822 stream_write_tree (ob
, TREE_TYPE (ptr
), true);
1825 streamer_write_zero (ob
);
1829 /* Output a wide-int. */
1832 streamer_write_wi (struct output_block
*ob
,
1833 const widest_int
&w
)
1835 int len
= w
.get_len ();
1837 streamer_write_uhwi (ob
, w
.get_precision ());
1838 streamer_write_uhwi (ob
, len
);
1839 for (int i
= 0; i
< len
; i
++)
1840 streamer_write_hwi (ob
, w
.elt (i
));
1844 /* Output the cfg. */
1847 output_cfg (struct output_block
*ob
, struct function
*fn
)
1849 struct lto_output_stream
*tmp_stream
= ob
->main_stream
;
1852 ob
->main_stream
= ob
->cfg_stream
;
1854 streamer_write_enum (ob
->main_stream
, profile_status_d
, PROFILE_LAST
,
1855 profile_status_for_fn (fn
));
1857 /* Output the number of the highest basic block. */
1858 streamer_write_uhwi (ob
, last_basic_block_for_fn (fn
));
1860 FOR_ALL_BB_FN (bb
, fn
)
1865 streamer_write_hwi (ob
, bb
->index
);
1867 /* Output the successors and the edge flags. */
1868 streamer_write_uhwi (ob
, EDGE_COUNT (bb
->succs
));
1869 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1871 streamer_write_uhwi (ob
, e
->dest
->index
);
1872 streamer_write_hwi (ob
, e
->probability
);
1873 streamer_write_gcov_count (ob
, e
->count
);
1874 streamer_write_uhwi (ob
, e
->flags
);
1878 streamer_write_hwi (ob
, -1);
1880 bb
= ENTRY_BLOCK_PTR_FOR_FN (cfun
);
1883 streamer_write_hwi (ob
, bb
->next_bb
->index
);
1887 streamer_write_hwi (ob
, -1);
1889 /* ??? The cfgloop interface is tied to cfun. */
1890 gcc_assert (cfun
== fn
);
1892 /* Output the number of loops. */
1893 streamer_write_uhwi (ob
, number_of_loops (fn
));
1895 /* Output each loop, skipping the tree root which has number zero. */
1896 for (unsigned i
= 1; i
< number_of_loops (fn
); ++i
)
1898 struct loop
*loop
= get_loop (fn
, i
);
1900 /* Write the index of the loop header. That's enough to rebuild
1901 the loop tree on the reader side. Stream -1 for an unused
1905 streamer_write_hwi (ob
, -1);
1909 streamer_write_hwi (ob
, loop
->header
->index
);
1911 /* Write everything copy_loop_info copies. */
1912 streamer_write_enum (ob
->main_stream
,
1913 loop_estimation
, EST_LAST
, loop
->estimate_state
);
1914 streamer_write_hwi (ob
, loop
->any_upper_bound
);
1915 if (loop
->any_upper_bound
)
1916 streamer_write_wi (ob
, loop
->nb_iterations_upper_bound
);
1917 streamer_write_hwi (ob
, loop
->any_estimate
);
1918 if (loop
->any_estimate
)
1919 streamer_write_wi (ob
, loop
->nb_iterations_estimate
);
1921 /* Write OMP SIMD related info. */
1922 streamer_write_hwi (ob
, loop
->safelen
);
1923 streamer_write_hwi (ob
, loop
->dont_vectorize
);
1924 streamer_write_hwi (ob
, loop
->force_vectorize
);
1925 stream_write_tree (ob
, loop
->simduid
, true);
1928 ob
->main_stream
= tmp_stream
;
1932 /* Create the header in the file using OB. If the section type is for
1933 a function, set FN to the decl for that function. */
1936 produce_asm (struct output_block
*ob
, tree fn
)
1938 enum lto_section_type section_type
= ob
->section_type
;
1939 struct lto_function_header header
;
1942 if (section_type
== LTO_section_function_body
)
1944 const char *name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn
));
1945 section_name
= lto_get_section_name (section_type
, name
, NULL
);
1948 section_name
= lto_get_section_name (section_type
, NULL
, NULL
);
1950 lto_begin_section (section_name
, !flag_wpa
);
1951 free (section_name
);
1953 /* The entire header is stream computed here. */
1954 memset (&header
, 0, sizeof (struct lto_function_header
));
1956 /* Write the header. */
1957 header
.major_version
= LTO_major_version
;
1958 header
.minor_version
= LTO_minor_version
;
1960 if (section_type
== LTO_section_function_body
)
1961 header
.cfg_size
= ob
->cfg_stream
->total_size
;
1962 header
.main_size
= ob
->main_stream
->total_size
;
1963 header
.string_size
= ob
->string_stream
->total_size
;
1964 lto_write_data (&header
, sizeof header
);
1966 /* Put all of the gimple and the string table out the asm file as a
1968 if (section_type
== LTO_section_function_body
)
1969 lto_write_stream (ob
->cfg_stream
);
1970 lto_write_stream (ob
->main_stream
);
1971 lto_write_stream (ob
->string_stream
);
1977 /* Output the base body of struct function FN using output block OB. */
1980 output_struct_function_base (struct output_block
*ob
, struct function
*fn
)
1982 struct bitpack_d bp
;
1986 /* Output the static chain and non-local goto save area. */
1987 stream_write_tree (ob
, fn
->static_chain_decl
, true);
1988 stream_write_tree (ob
, fn
->nonlocal_goto_save_area
, true);
1990 /* Output all the local variables in the function. */
1991 streamer_write_hwi (ob
, vec_safe_length (fn
->local_decls
));
1992 FOR_EACH_VEC_SAFE_ELT (fn
->local_decls
, i
, t
)
1993 stream_write_tree (ob
, t
, true);
1995 /* Output current IL state of the function. */
1996 streamer_write_uhwi (ob
, fn
->curr_properties
);
1998 /* Write all the attributes for FN. */
1999 bp
= bitpack_create (ob
->main_stream
);
2000 bp_pack_value (&bp
, fn
->is_thunk
, 1);
2001 bp_pack_value (&bp
, fn
->has_local_explicit_reg_vars
, 1);
2002 bp_pack_value (&bp
, fn
->returns_pcc_struct
, 1);
2003 bp_pack_value (&bp
, fn
->returns_struct
, 1);
2004 bp_pack_value (&bp
, fn
->can_throw_non_call_exceptions
, 1);
2005 bp_pack_value (&bp
, fn
->can_delete_dead_exceptions
, 1);
2006 bp_pack_value (&bp
, fn
->always_inline_functions_inlined
, 1);
2007 bp_pack_value (&bp
, fn
->after_inlining
, 1);
2008 bp_pack_value (&bp
, fn
->stdarg
, 1);
2009 bp_pack_value (&bp
, fn
->has_nonlocal_label
, 1);
2010 bp_pack_value (&bp
, fn
->calls_alloca
, 1);
2011 bp_pack_value (&bp
, fn
->calls_setjmp
, 1);
2012 bp_pack_value (&bp
, fn
->has_force_vectorize_loops
, 1);
2013 bp_pack_value (&bp
, fn
->has_simduid_loops
, 1);
2014 bp_pack_value (&bp
, fn
->va_list_fpr_size
, 8);
2015 bp_pack_value (&bp
, fn
->va_list_gpr_size
, 8);
2016 bp_pack_value (&bp
, fn
->last_clique
, sizeof (short) * 8);
2018 /* Output the function start and end loci. */
2019 stream_output_location (ob
, &bp
, fn
->function_start_locus
);
2020 stream_output_location (ob
, &bp
, fn
->function_end_locus
);
2022 streamer_write_bitpack (&bp
);
2026 /* Output the body of function NODE->DECL. */
2029 output_function (struct cgraph_node
*node
)
2032 struct function
*fn
;
2034 struct output_block
*ob
;
2036 function
= node
->decl
;
2037 fn
= DECL_STRUCT_FUNCTION (function
);
2038 ob
= create_output_block (LTO_section_function_body
);
2040 clear_line_info (ob
);
2043 gcc_assert (current_function_decl
== NULL_TREE
&& cfun
== NULL
);
2045 /* Set current_function_decl and cfun. */
2048 /* Make string 0 be a NULL string. */
2049 streamer_write_char_stream (ob
->string_stream
, 0);
2051 streamer_write_record_start (ob
, LTO_function
);
2053 /* Output decls for parameters and args. */
2054 stream_write_tree (ob
, DECL_RESULT (function
), true);
2055 streamer_write_chain (ob
, DECL_ARGUMENTS (function
), true);
2057 /* Output DECL_INITIAL for the function, which contains the tree of
2059 stream_write_tree (ob
, DECL_INITIAL (function
), true);
2061 /* We also stream abstract functions where we stream only stuff needed for
2063 if (gimple_has_body_p (function
))
2065 streamer_write_uhwi (ob
, 1);
2066 output_struct_function_base (ob
, fn
);
2068 /* Output all the SSA names used in the function. */
2069 output_ssa_names (ob
, fn
);
2071 /* Output any exception handling regions. */
2072 output_eh_regions (ob
, fn
);
2075 /* We will renumber the statements. The code that does this uses
2076 the same ordering that we use for serializing them so we can use
2077 the same code on the other end and not have to write out the
2078 statement numbers. We do not assign UIDs to PHIs here because
2079 virtual PHIs get re-computed on-the-fly which would make numbers
2081 set_gimple_stmt_max_uid (cfun
, 0);
2082 FOR_ALL_BB_FN (bb
, cfun
)
2084 for (gphi_iterator gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
);
2087 gphi
*stmt
= gsi
.phi ();
2089 /* Virtual PHIs are not going to be streamed. */
2090 if (!virtual_operand_p (gimple_phi_result (stmt
)))
2091 gimple_set_uid (stmt
, inc_gimple_stmt_max_uid (cfun
));
2093 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
);
2096 gimple stmt
= gsi_stmt (gsi
);
2097 gimple_set_uid (stmt
, inc_gimple_stmt_max_uid (cfun
));
2100 /* To avoid keeping duplicate gimple IDs in the statements, renumber
2101 virtual phis now. */
2102 FOR_ALL_BB_FN (bb
, cfun
)
2104 for (gphi_iterator gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
);
2107 gphi
*stmt
= gsi
.phi ();
2108 if (virtual_operand_p (gimple_phi_result (stmt
)))
2109 gimple_set_uid (stmt
, inc_gimple_stmt_max_uid (cfun
));
2113 /* Output the code for the function. */
2114 FOR_ALL_BB_FN (bb
, fn
)
2115 output_bb (ob
, bb
, fn
);
2117 /* The terminator for this function. */
2118 streamer_write_record_start (ob
, LTO_null
);
2120 output_cfg (ob
, fn
);
2125 streamer_write_uhwi (ob
, 0);
2127 /* Create a section to hold the pickled output of this function. */
2128 produce_asm (ob
, function
);
2130 destroy_output_block (ob
);
2133 /* Output the body of function NODE->DECL. */
2136 output_constructor (struct varpool_node
*node
)
2138 tree var
= node
->decl
;
2139 struct output_block
*ob
;
2141 ob
= create_output_block (LTO_section_function_body
);
2143 clear_line_info (ob
);
2146 /* Make string 0 be a NULL string. */
2147 streamer_write_char_stream (ob
->string_stream
, 0);
2149 /* Output DECL_INITIAL for the function, which contains the tree of
2151 stream_write_tree (ob
, DECL_INITIAL (var
), true);
2153 /* Create a section to hold the pickled output of this function. */
2154 produce_asm (ob
, var
);
2156 destroy_output_block (ob
);
2160 /* Emit toplevel asms. */
2163 lto_output_toplevel_asms (void)
2165 struct output_block
*ob
;
2166 struct asm_node
*can
;
2168 struct lto_simple_header_with_strings header
;
2170 if (!symtab
->first_asm_symbol ())
2173 ob
= create_output_block (LTO_section_asm
);
2175 /* Make string 0 be a NULL string. */
2176 streamer_write_char_stream (ob
->string_stream
, 0);
2178 for (can
= symtab
->first_asm_symbol (); can
; can
= can
->next
)
2180 streamer_write_string_cst (ob
, ob
->main_stream
, can
->asm_str
);
2181 streamer_write_hwi (ob
, can
->order
);
2184 streamer_write_string_cst (ob
, ob
->main_stream
, NULL_TREE
);
2186 section_name
= lto_get_section_name (LTO_section_asm
, NULL
, NULL
);
2187 lto_begin_section (section_name
, !flag_wpa
);
2188 free (section_name
);
2190 /* The entire header stream is computed here. */
2191 memset (&header
, 0, sizeof (header
));
2193 /* Write the header. */
2194 header
.major_version
= LTO_major_version
;
2195 header
.minor_version
= LTO_minor_version
;
2197 header
.main_size
= ob
->main_stream
->total_size
;
2198 header
.string_size
= ob
->string_stream
->total_size
;
2199 lto_write_data (&header
, sizeof header
);
2201 /* Put all of the gimple and the string table out the asm file as a
2203 lto_write_stream (ob
->main_stream
);
2204 lto_write_stream (ob
->string_stream
);
2208 destroy_output_block (ob
);
2212 /* Copy the function body or variable constructor of NODE without deserializing. */
2215 copy_function_or_variable (struct symtab_node
*node
)
2217 tree function
= node
->decl
;
2218 struct lto_file_decl_data
*file_data
= node
->lto_file_data
;
2221 const char *name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function
));
2222 char *section_name
=
2223 lto_get_section_name (LTO_section_function_body
, name
, NULL
);
2225 struct lto_in_decl_state
*in_state
;
2226 struct lto_out_decl_state
*out_state
= lto_get_out_decl_state ();
2228 lto_begin_section (section_name
, !flag_wpa
);
2229 free (section_name
);
2231 /* We may have renamed the declaration, e.g., a static function. */
2232 name
= lto_get_decl_name_mapping (file_data
, name
);
2234 data
= lto_get_section_data (file_data
, LTO_section_function_body
,
2238 /* Do a bit copy of the function body. */
2239 lto_write_data (data
, len
);
2243 lto_get_function_in_decl_state (node
->lto_file_data
, function
);
2244 gcc_assert (in_state
);
2246 for (i
= 0; i
< LTO_N_DECL_STREAMS
; i
++)
2248 size_t n
= vec_safe_length (in_state
->streams
[i
]);
2249 vec
<tree
, va_gc
> *trees
= in_state
->streams
[i
];
2250 struct lto_tree_ref_encoder
*encoder
= &(out_state
->streams
[i
]);
2252 /* The out state must have the same indices and the in state.
2253 So just copy the vector. All the encoders in the in state
2254 must be empty where we reach here. */
2255 gcc_assert (lto_tree_ref_encoder_size (encoder
) == 0);
2256 encoder
->trees
.reserve_exact (n
);
2257 for (j
= 0; j
< n
; j
++)
2258 encoder
->trees
.safe_push ((*trees
)[j
]);
2261 lto_free_section_data (file_data
, LTO_section_function_body
, name
,
2266 /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
2269 wrap_refs (tree
*tp
, int *ws
, void *)
2272 if (handled_component_p (t
)
2273 && TREE_CODE (TREE_OPERAND (t
, 0)) == VAR_DECL
)
2275 tree decl
= TREE_OPERAND (t
, 0);
2276 tree ptrtype
= build_pointer_type (TREE_TYPE (decl
));
2277 TREE_OPERAND (t
, 0) = build2 (MEM_REF
, TREE_TYPE (decl
),
2278 build1 (ADDR_EXPR
, ptrtype
, decl
),
2279 build_int_cst (ptrtype
, 0));
2280 TREE_THIS_VOLATILE (TREE_OPERAND (t
, 0)) = TREE_THIS_VOLATILE (decl
);
2283 else if (TREE_CODE (t
) == CONSTRUCTOR
)
2285 else if (!EXPR_P (t
))
2290 /* Main entry point from the pass manager. */
2295 struct lto_out_decl_state
*decl_state
;
2296 #ifdef ENABLE_CHECKING
2297 bitmap output
= lto_bitmap_alloc ();
2300 lto_symtab_encoder_t encoder
= lto_get_out_decl_state ()->symtab_node_encoder
;
2302 /* Initialize the streamer. */
2303 lto_streamer_init ();
2305 n_nodes
= lto_symtab_encoder_size (encoder
);
2306 /* Process only the functions with bodies. */
2307 for (i
= 0; i
< n_nodes
; i
++)
2309 symtab_node
*snode
= lto_symtab_encoder_deref (encoder
, i
);
2310 if (cgraph_node
*node
= dyn_cast
<cgraph_node
*> (snode
))
2312 if (lto_symtab_encoder_encode_body_p (encoder
, node
)
2315 #ifdef ENABLE_CHECKING
2316 gcc_assert (!bitmap_bit_p (output
, DECL_UID (node
->decl
)));
2317 bitmap_set_bit (output
, DECL_UID (node
->decl
));
2319 decl_state
= lto_new_out_decl_state ();
2320 lto_push_out_decl_state (decl_state
);
2321 if (gimple_has_body_p (node
->decl
) || !flag_wpa
2322 /* Thunks have no body but they may be synthetized
2324 || DECL_ARGUMENTS (node
->decl
))
2325 output_function (node
);
2327 copy_function_or_variable (node
);
2328 gcc_assert (lto_get_out_decl_state () == decl_state
);
2329 lto_pop_out_decl_state ();
2330 lto_record_function_out_decl_state (node
->decl
, decl_state
);
2333 else if (varpool_node
*node
= dyn_cast
<varpool_node
*> (snode
))
2335 /* Wrap symbol references inside the ctor in a type
2336 preserving MEM_REF. */
2337 tree ctor
= DECL_INITIAL (node
->decl
);
2338 if (ctor
&& !in_lto_p
)
2339 walk_tree (&ctor
, wrap_refs
, NULL
, NULL
);
2340 if (get_symbol_initial_value (encoder
, node
->decl
) == error_mark_node
2341 && lto_symtab_encoder_encode_initializer_p (encoder
, node
)
2344 timevar_push (TV_IPA_LTO_CTORS_OUT
);
2345 #ifdef ENABLE_CHECKING
2346 gcc_assert (!bitmap_bit_p (output
, DECL_UID (node
->decl
)));
2347 bitmap_set_bit (output
, DECL_UID (node
->decl
));
2349 decl_state
= lto_new_out_decl_state ();
2350 lto_push_out_decl_state (decl_state
);
2351 if (DECL_INITIAL (node
->decl
) != error_mark_node
2353 output_constructor (node
);
2355 copy_function_or_variable (node
);
2356 gcc_assert (lto_get_out_decl_state () == decl_state
);
2357 lto_pop_out_decl_state ();
2358 lto_record_function_out_decl_state (node
->decl
, decl_state
);
2359 timevar_pop (TV_IPA_LTO_CTORS_OUT
);
2364 /* Emit the callgraph after emitting function bodies. This needs to
2365 be done now to make sure that all the statements in every function
2366 have been renumbered so that edges can be associated with call
2367 statements using the statement UIDs. */
2370 output_offload_tables ();
2372 #ifdef ENABLE_CHECKING
2373 lto_bitmap_free (output
);
2377 /* Write each node in encoded by ENCODER to OB, as well as those reachable
2378 from it and required for correct representation of its semantics.
2379 Each node in ENCODER must be a global declaration or a type. A node
2380 is written only once, even if it appears multiple times in the
2381 vector. Certain transitively-reachable nodes, such as those
2382 representing expressions, may be duplicated, but such nodes
2383 must not appear in ENCODER itself. */
2386 write_global_stream (struct output_block
*ob
,
2387 struct lto_tree_ref_encoder
*encoder
)
2391 const size_t size
= lto_tree_ref_encoder_size (encoder
);
2393 for (index
= 0; index
< size
; index
++)
2395 t
= lto_tree_ref_encoder_get_tree (encoder
, index
);
2396 if (!streamer_tree_cache_lookup (ob
->writer_cache
, t
, NULL
))
2397 stream_write_tree (ob
, t
, false);
2402 /* Write a sequence of indices into the globals vector corresponding
2403 to the trees in ENCODER. These are used by the reader to map the
2404 indices used to refer to global entities within function bodies to
2408 write_global_references (struct output_block
*ob
,
2409 struct lto_tree_ref_encoder
*encoder
)
2413 const uint32_t size
= lto_tree_ref_encoder_size (encoder
);
2415 /* Write size and slot indexes as 32-bit unsigned numbers. */
2416 uint32_t *data
= XNEWVEC (uint32_t, size
+ 1);
2419 for (index
= 0; index
< size
; index
++)
2423 t
= lto_tree_ref_encoder_get_tree (encoder
, index
);
2424 streamer_tree_cache_lookup (ob
->writer_cache
, t
, &slot_num
);
2425 gcc_assert (slot_num
!= (unsigned)-1);
2426 data
[index
+ 1] = slot_num
;
2429 lto_write_data (data
, sizeof (int32_t) * (size
+ 1));
2434 /* Write all the streams in an lto_out_decl_state STATE using
2435 output block OB and output stream OUT_STREAM. */
2438 lto_output_decl_state_streams (struct output_block
*ob
,
2439 struct lto_out_decl_state
*state
)
2443 for (i
= 0; i
< LTO_N_DECL_STREAMS
; i
++)
2444 write_global_stream (ob
, &state
->streams
[i
]);
2448 /* Write all the references in an lto_out_decl_state STATE using
2449 output block OB and output stream OUT_STREAM. */
2452 lto_output_decl_state_refs (struct output_block
*ob
,
2453 struct lto_out_decl_state
*state
)
2459 /* Write reference to FUNCTION_DECL. If there is not function,
2460 write reference to void_type_node. */
2461 decl
= (state
->fn_decl
) ? state
->fn_decl
: void_type_node
;
2462 streamer_tree_cache_lookup (ob
->writer_cache
, decl
, &ref
);
2463 gcc_assert (ref
!= (unsigned)-1);
2464 lto_write_data (&ref
, sizeof (uint32_t));
2466 for (i
= 0; i
< LTO_N_DECL_STREAMS
; i
++)
2467 write_global_references (ob
, &state
->streams
[i
]);
2471 /* Return the written size of STATE. */
2474 lto_out_decl_state_written_size (struct lto_out_decl_state
*state
)
2479 size
= sizeof (int32_t); /* fn_ref. */
2480 for (i
= 0; i
< LTO_N_DECL_STREAMS
; i
++)
2482 size
+= sizeof (int32_t); /* vector size. */
2483 size
+= (lto_tree_ref_encoder_size (&state
->streams
[i
])
2484 * sizeof (int32_t));
2490 /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote
2494 write_symbol (struct streamer_tree_cache_d
*cache
,
2495 tree t
, hash_set
<const char *> *seen
, bool alias
)
2498 enum gcc_plugin_symbol_kind kind
;
2499 enum gcc_plugin_symbol_visibility visibility
= GCCPV_DEFAULT
;
2505 /* None of the following kinds of symbols are needed in the
2507 if (!TREE_PUBLIC (t
)
2508 || is_builtin_fn (t
)
2509 || DECL_ABSTRACT_P (t
)
2510 || (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
)))
2512 gcc_assert (TREE_CODE (t
) != RESULT_DECL
);
2514 gcc_assert (TREE_CODE (t
) == VAR_DECL
2515 || TREE_CODE (t
) == FUNCTION_DECL
);
2517 name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t
));
2519 /* This behaves like assemble_name_raw in varasm.c, performing the
2520 same name manipulations that ASM_OUTPUT_LABELREF does. */
2521 name
= IDENTIFIER_POINTER ((*targetm
.asm_out
.mangle_assembler_name
) (name
));
2523 if (seen
->add (name
))
2526 streamer_tree_cache_lookup (cache
, t
, &slot_num
);
2527 gcc_assert (slot_num
!= (unsigned)-1);
2529 if (DECL_EXTERNAL (t
))
2532 kind
= GCCPK_WEAKUNDEF
;
2539 kind
= GCCPK_WEAKDEF
;
2540 else if (DECL_COMMON (t
))
2541 kind
= GCCPK_COMMON
;
2545 /* When something is defined, it should have node attached. */
2546 gcc_assert (alias
|| TREE_CODE (t
) != VAR_DECL
2547 || varpool_node::get (t
)->definition
);
2548 gcc_assert (alias
|| TREE_CODE (t
) != FUNCTION_DECL
2549 || (cgraph_node::get (t
)
2550 && cgraph_node::get (t
)->definition
));
2553 /* Imitate what default_elf_asm_output_external do.
2554 When symbol is external, we need to output it with DEFAULT visibility
2555 when compiling with -fvisibility=default, while with HIDDEN visibility
2556 when symbol has attribute (visibility("hidden")) specified.
2557 targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this
2560 if (DECL_EXTERNAL (t
)
2561 && !targetm
.binds_local_p (t
))
2562 visibility
= GCCPV_DEFAULT
;
2564 switch (DECL_VISIBILITY (t
))
2566 case VISIBILITY_DEFAULT
:
2567 visibility
= GCCPV_DEFAULT
;
2569 case VISIBILITY_PROTECTED
:
2570 visibility
= GCCPV_PROTECTED
;
2572 case VISIBILITY_HIDDEN
:
2573 visibility
= GCCPV_HIDDEN
;
2575 case VISIBILITY_INTERNAL
:
2576 visibility
= GCCPV_INTERNAL
;
2580 if (kind
== GCCPK_COMMON
2581 && DECL_SIZE_UNIT (t
)
2582 && TREE_CODE (DECL_SIZE_UNIT (t
)) == INTEGER_CST
)
2583 size
= TREE_INT_CST_LOW (DECL_SIZE_UNIT (t
));
2587 if (DECL_ONE_ONLY (t
))
2588 comdat
= IDENTIFIER_POINTER (decl_comdat_group_id (t
));
2592 lto_write_data (name
, strlen (name
) + 1);
2593 lto_write_data (comdat
, strlen (comdat
) + 1);
2594 c
= (unsigned char) kind
;
2595 lto_write_data (&c
, 1);
2596 c
= (unsigned char) visibility
;
2597 lto_write_data (&c
, 1);
2598 lto_write_data (&size
, 8);
2599 lto_write_data (&slot_num
, 4);
2602 /* Return true if NODE should appear in the plugin symbol table. */
2605 output_symbol_p (symtab_node
*node
)
2607 struct cgraph_node
*cnode
;
2608 if (!node
->real_symbol_p ())
2610 /* We keep external functions in symtab for sake of inlining
2611 and devirtualization. We do not want to see them in symbol table as
2612 references unless they are really used. */
2613 cnode
= dyn_cast
<cgraph_node
*> (node
);
2614 if (cnode
&& (!node
->definition
|| DECL_EXTERNAL (cnode
->decl
))
2618 /* Ignore all references from external vars initializers - they are not really
2619 part of the compilation unit until they are used by folding. Some symbols,
2620 like references to external construction vtables can not be referred to at all.
2621 We decide this at can_refer_decl_in_current_unit_p. */
2622 if (!node
->definition
|| DECL_EXTERNAL (node
->decl
))
2625 struct ipa_ref
*ref
;
2626 for (i
= 0; node
->iterate_referring (i
, ref
); i
++)
2628 if (ref
->use
== IPA_REF_ALIAS
)
2630 if (is_a
<cgraph_node
*> (ref
->referring
))
2632 if (!DECL_EXTERNAL (ref
->referring
->decl
))
2641 /* Write an IL symbol table to OB.
2642 SET and VSET are cgraph/varpool node sets we are outputting. */
2645 produce_symtab (struct output_block
*ob
)
2647 struct streamer_tree_cache_d
*cache
= ob
->writer_cache
;
2648 char *section_name
= lto_get_section_name (LTO_section_symtab
, NULL
, NULL
);
2649 lto_symtab_encoder_t encoder
= ob
->decl_state
->symtab_node_encoder
;
2650 lto_symtab_encoder_iterator lsei
;
2652 lto_begin_section (section_name
, false);
2653 free (section_name
);
2655 hash_set
<const char *> seen
;
2657 /* Write the symbol table.
2658 First write everything defined and then all declarations.
2659 This is necessary to handle cases where we have duplicated symbols. */
2660 for (lsei
= lsei_start (encoder
);
2661 !lsei_end_p (lsei
); lsei_next (&lsei
))
2663 symtab_node
*node
= lsei_node (lsei
);
2665 if (!output_symbol_p (node
) || DECL_EXTERNAL (node
->decl
))
2667 write_symbol (cache
, node
->decl
, &seen
, false);
2669 for (lsei
= lsei_start (encoder
);
2670 !lsei_end_p (lsei
); lsei_next (&lsei
))
2672 symtab_node
*node
= lsei_node (lsei
);
2674 if (!output_symbol_p (node
) || !DECL_EXTERNAL (node
->decl
))
2676 write_symbol (cache
, node
->decl
, &seen
, false);
2683 /* Init the streamer_mode_table for output, where we collect info on what
2684 machine_mode values have been streamed. */
2686 lto_output_init_mode_table (void)
2688 memset (streamer_mode_table
, '\0', MAX_MACHINE_MODE
);
2692 /* Write the mode table. */
2694 lto_write_mode_table (void)
2696 struct output_block
*ob
;
2697 ob
= create_output_block (LTO_section_mode_table
);
2698 bitpack_d bp
= bitpack_create (ob
->main_stream
);
2700 /* Ensure that for GET_MODE_INNER (m) != VOIDmode we have
2701 also the inner mode marked. */
2702 for (int i
= 0; i
< (int) MAX_MACHINE_MODE
; i
++)
2703 if (streamer_mode_table
[i
])
2705 machine_mode m
= (machine_mode
) i
;
2706 if (GET_MODE_INNER (m
) != VOIDmode
)
2707 streamer_mode_table
[(int) GET_MODE_INNER (m
)] = 1;
2709 /* First stream modes that have GET_MODE_INNER (m) == VOIDmode,
2710 so that we can refer to them afterwards. */
2711 for (int pass
= 0; pass
< 2; pass
++)
2712 for (int i
= 0; i
< (int) MAX_MACHINE_MODE
; i
++)
2713 if (streamer_mode_table
[i
] && i
!= (int) VOIDmode
&& i
!= (int) BLKmode
)
2715 machine_mode m
= (machine_mode
) i
;
2716 if ((GET_MODE_INNER (m
) == VOIDmode
) ^ (pass
== 0))
2718 bp_pack_value (&bp
, m
, 8);
2719 bp_pack_enum (&bp
, mode_class
, MAX_MODE_CLASS
, GET_MODE_CLASS (m
));
2720 bp_pack_value (&bp
, GET_MODE_SIZE (m
), 8);
2721 bp_pack_value (&bp
, GET_MODE_PRECISION (m
), 16);
2722 bp_pack_value (&bp
, GET_MODE_INNER (m
), 8);
2723 bp_pack_value (&bp
, GET_MODE_NUNITS (m
), 8);
2724 switch (GET_MODE_CLASS (m
))
2730 bp_pack_value (&bp
, GET_MODE_IBIT (m
), 8);
2731 bp_pack_value (&bp
, GET_MODE_FBIT (m
), 8);
2734 case MODE_DECIMAL_FLOAT
:
2735 bp_pack_string (ob
, &bp
, REAL_MODE_FORMAT (m
)->name
, true);
2740 bp_pack_string (ob
, &bp
, GET_MODE_NAME (m
), true);
2742 bp_pack_value (&bp
, VOIDmode
, 8);
2744 streamer_write_bitpack (&bp
);
2747 = lto_get_section_name (LTO_section_mode_table
, NULL
, NULL
);
2748 lto_begin_section (section_name
, !flag_wpa
);
2749 free (section_name
);
2751 /* The entire header stream is computed here. */
2752 struct lto_simple_header_with_strings header
;
2753 memset (&header
, 0, sizeof (header
));
2755 /* Write the header. */
2756 header
.major_version
= LTO_major_version
;
2757 header
.minor_version
= LTO_minor_version
;
2759 header
.main_size
= ob
->main_stream
->total_size
;
2760 header
.string_size
= ob
->string_stream
->total_size
;
2761 lto_write_data (&header
, sizeof header
);
2763 /* Put all of the gimple and the string table out the asm file as a
2765 lto_write_stream (ob
->main_stream
);
2766 lto_write_stream (ob
->string_stream
);
2769 destroy_output_block (ob
);
2773 /* This pass is run after all of the functions are serialized and all
2774 of the IPA passes have written their serialized forms. This pass
2775 causes the vector of all of the global decls and types used from
2776 this file to be written in to a section that can then be read in to
2777 recover these on other side. */
2780 produce_asm_for_decls (void)
2782 struct lto_out_decl_state
*out_state
;
2783 struct lto_out_decl_state
*fn_out_state
;
2784 struct lto_decl_header header
;
2786 struct output_block
*ob
;
2787 unsigned idx
, num_fns
;
2788 size_t decl_state_size
;
2789 int32_t num_decl_states
;
2791 ob
= create_output_block (LTO_section_decls
);
2793 memset (&header
, 0, sizeof (struct lto_decl_header
));
2795 section_name
= lto_get_section_name (LTO_section_decls
, NULL
, NULL
);
2796 lto_begin_section (section_name
, !flag_wpa
);
2797 free (section_name
);
2799 /* Make string 0 be a NULL string. */
2800 streamer_write_char_stream (ob
->string_stream
, 0);
2802 gcc_assert (!alias_pairs
);
2804 /* Get rid of the global decl state hash tables to save some memory. */
2805 out_state
= lto_get_out_decl_state ();
2806 for (int i
= 0; i
< LTO_N_DECL_STREAMS
; i
++)
2807 if (out_state
->streams
[i
].tree_hash_table
)
2809 delete out_state
->streams
[i
].tree_hash_table
;
2810 out_state
->streams
[i
].tree_hash_table
= NULL
;
2813 /* Write the global symbols. */
2814 lto_output_decl_state_streams (ob
, out_state
);
2815 num_fns
= lto_function_decl_states
.length ();
2816 for (idx
= 0; idx
< num_fns
; idx
++)
2819 lto_function_decl_states
[idx
];
2820 lto_output_decl_state_streams (ob
, fn_out_state
);
2823 header
.major_version
= LTO_major_version
;
2824 header
.minor_version
= LTO_minor_version
;
2826 /* Currently not used. This field would allow us to preallocate
2827 the globals vector, so that it need not be resized as it is extended. */
2828 header
.num_nodes
= -1;
2830 /* Compute the total size of all decl out states. */
2831 decl_state_size
= sizeof (int32_t);
2832 decl_state_size
+= lto_out_decl_state_written_size (out_state
);
2833 for (idx
= 0; idx
< num_fns
; idx
++)
2836 lto_function_decl_states
[idx
];
2837 decl_state_size
+= lto_out_decl_state_written_size (fn_out_state
);
2839 header
.decl_state_size
= decl_state_size
;
2841 header
.main_size
= ob
->main_stream
->total_size
;
2842 header
.string_size
= ob
->string_stream
->total_size
;
2844 lto_write_data (&header
, sizeof header
);
2846 /* Write the main out-decl state, followed by out-decl states of
2848 num_decl_states
= num_fns
+ 1;
2849 lto_write_data (&num_decl_states
, sizeof (num_decl_states
));
2850 lto_output_decl_state_refs (ob
, out_state
);
2851 for (idx
= 0; idx
< num_fns
; idx
++)
2853 fn_out_state
= lto_function_decl_states
[idx
];
2854 lto_output_decl_state_refs (ob
, fn_out_state
);
2857 lto_write_stream (ob
->main_stream
);
2858 lto_write_stream (ob
->string_stream
);
2862 /* Write the symbol table. It is used by linker to determine dependencies
2863 and thus we can skip it for WPA. */
2865 produce_symtab (ob
);
2867 /* Write command line opts. */
2868 lto_write_options ();
2870 /* Deallocate memory and clean up. */
2871 for (idx
= 0; idx
< num_fns
; idx
++)
2874 lto_function_decl_states
[idx
];
2875 lto_delete_out_decl_state (fn_out_state
);
2877 lto_symtab_encoder_delete (ob
->decl_state
->symtab_node_encoder
);
2878 lto_function_decl_states
.release ();
2879 destroy_output_block (ob
);
2880 if (lto_stream_offload_p
)
2881 lto_write_mode_table ();