1 /* Write and read the cgraph to the memory mapped representation of a
4 Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
5 Contributed by Kenneth Zadeck <zadeck@naturalbridge.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"
33 #include "langhooks.h"
34 #include "basic-block.h"
35 #include "tree-flow.h"
39 #include "diagnostic-core.h"
44 #include "pointer-set.h"
45 #include "lto-streamer.h"
48 static void output_varpool (cgraph_node_set
, varpool_node_set
);
49 static void output_cgraph_opt_summary (cgraph_node_set set
);
50 static void input_cgraph_opt_summary (VEC (cgraph_node_ptr
, heap
) * nodes
);
53 /* Cgraph streaming is organized as set of record whose type
54 is indicated by a tag. */
57 /* Must leave 0 for the stopper. */
59 /* Cgraph node without body available. */
60 LTO_cgraph_unavail_node
= 1,
61 /* Cgraph node with function body. */
62 LTO_cgraph_analyzed_node
,
65 LTO_cgraph_indirect_edge
68 /* Create a new cgraph encoder. */
71 lto_cgraph_encoder_new (void)
73 lto_cgraph_encoder_t encoder
= XCNEW (struct lto_cgraph_encoder_d
);
74 encoder
->map
= pointer_map_create ();
75 encoder
->nodes
= NULL
;
76 encoder
->body
= pointer_set_create ();
81 /* Delete ENCODER and its components. */
84 lto_cgraph_encoder_delete (lto_cgraph_encoder_t encoder
)
86 VEC_free (cgraph_node_ptr
, heap
, encoder
->nodes
);
87 pointer_map_destroy (encoder
->map
);
88 pointer_set_destroy (encoder
->body
);
93 /* Return the existing reference number of NODE in the cgraph encoder in
94 output block OB. Assign a new reference if this is the first time
98 lto_cgraph_encoder_encode (lto_cgraph_encoder_t encoder
,
99 struct cgraph_node
*node
)
104 slot
= pointer_map_contains (encoder
->map
, node
);
107 ref
= VEC_length (cgraph_node_ptr
, encoder
->nodes
);
108 slot
= pointer_map_insert (encoder
->map
, node
);
109 *slot
= (void *) (intptr_t) ref
;
110 VEC_safe_push (cgraph_node_ptr
, heap
, encoder
->nodes
, node
);
113 ref
= (int) (intptr_t) *slot
;
118 #define LCC_NOT_FOUND (-1)
120 /* Look up NODE in encoder. Return NODE's reference if it has been encoded
121 or LCC_NOT_FOUND if it is not there. */
124 lto_cgraph_encoder_lookup (lto_cgraph_encoder_t encoder
,
125 struct cgraph_node
*node
)
127 void **slot
= pointer_map_contains (encoder
->map
, node
);
128 return (slot
? (int) (intptr_t) *slot
: LCC_NOT_FOUND
);
132 /* Return the cgraph node corresponding to REF using ENCODER. */
135 lto_cgraph_encoder_deref (lto_cgraph_encoder_t encoder
, int ref
)
137 if (ref
== LCC_NOT_FOUND
)
140 return VEC_index (cgraph_node_ptr
, encoder
->nodes
, ref
);
144 /* Return TRUE if we should encode initializer of NODE (if any). */
147 lto_cgraph_encoder_encode_body_p (lto_cgraph_encoder_t encoder
,
148 struct cgraph_node
*node
)
150 return pointer_set_contains (encoder
->body
, node
);
153 /* Return TRUE if we should encode body of NODE (if any). */
156 lto_set_cgraph_encoder_encode_body (lto_cgraph_encoder_t encoder
,
157 struct cgraph_node
*node
)
159 pointer_set_insert (encoder
->body
, node
);
162 /* Create a new varpool encoder. */
164 lto_varpool_encoder_t
165 lto_varpool_encoder_new (void)
167 lto_varpool_encoder_t encoder
= XCNEW (struct lto_varpool_encoder_d
);
168 encoder
->map
= pointer_map_create ();
169 encoder
->initializer
= pointer_set_create ();
170 encoder
->nodes
= NULL
;
175 /* Delete ENCODER and its components. */
178 lto_varpool_encoder_delete (lto_varpool_encoder_t encoder
)
180 VEC_free (varpool_node_ptr
, heap
, encoder
->nodes
);
181 pointer_map_destroy (encoder
->map
);
182 pointer_set_destroy (encoder
->initializer
);
187 /* Return the existing reference number of NODE in the varpool encoder in
188 output block OB. Assign a new reference if this is the first time
192 lto_varpool_encoder_encode (lto_varpool_encoder_t encoder
,
193 struct varpool_node
*node
)
198 slot
= pointer_map_contains (encoder
->map
, node
);
201 ref
= VEC_length (varpool_node_ptr
, encoder
->nodes
);
202 slot
= pointer_map_insert (encoder
->map
, node
);
203 *slot
= (void *) (intptr_t) ref
;
204 VEC_safe_push (varpool_node_ptr
, heap
, encoder
->nodes
, node
);
207 ref
= (int) (intptr_t) *slot
;
212 /* Look up NODE in encoder. Return NODE's reference if it has been encoded
213 or LCC_NOT_FOUND if it is not there. */
216 lto_varpool_encoder_lookup (lto_varpool_encoder_t encoder
,
217 struct varpool_node
*node
)
219 void **slot
= pointer_map_contains (encoder
->map
, node
);
220 return (slot
? (int) (intptr_t) *slot
: LCC_NOT_FOUND
);
224 /* Return the varpool node corresponding to REF using ENCODER. */
226 struct varpool_node
*
227 lto_varpool_encoder_deref (lto_varpool_encoder_t encoder
, int ref
)
229 if (ref
== LCC_NOT_FOUND
)
232 return VEC_index (varpool_node_ptr
, encoder
->nodes
, ref
);
236 /* Return TRUE if we should encode initializer of NODE (if any). */
239 lto_varpool_encoder_encode_initializer_p (lto_varpool_encoder_t encoder
,
240 struct varpool_node
*node
)
242 return pointer_set_contains (encoder
->initializer
, node
);
245 /* Return TRUE if we should encode initializer of NODE (if any). */
248 lto_set_varpool_encoder_encode_initializer (lto_varpool_encoder_t encoder
,
249 struct varpool_node
*node
)
251 pointer_set_insert (encoder
->initializer
, node
);
254 /* Output the cgraph EDGE to OB using ENCODER. */
257 lto_output_edge (struct lto_simple_output_block
*ob
, struct cgraph_edge
*edge
,
258 lto_cgraph_encoder_t encoder
)
264 if (edge
->indirect_unknown_callee
)
265 lto_output_uleb128_stream (ob
->main_stream
, LTO_cgraph_indirect_edge
);
267 lto_output_uleb128_stream (ob
->main_stream
, LTO_cgraph_edge
);
269 ref
= lto_cgraph_encoder_lookup (encoder
, edge
->caller
);
270 gcc_assert (ref
!= LCC_NOT_FOUND
);
271 lto_output_sleb128_stream (ob
->main_stream
, ref
);
273 if (!edge
->indirect_unknown_callee
)
275 ref
= lto_cgraph_encoder_lookup (encoder
, edge
->callee
);
276 gcc_assert (ref
!= LCC_NOT_FOUND
);
277 lto_output_sleb128_stream (ob
->main_stream
, ref
);
280 lto_output_sleb128_stream (ob
->main_stream
, edge
->count
);
282 bp
= bitpack_create (ob
->main_stream
);
283 uid
= (!gimple_has_body_p (edge
->caller
->decl
)
284 ? edge
->lto_stmt_uid
: gimple_uid (edge
->call_stmt
));
285 bp_pack_value (&bp
, uid
, HOST_BITS_PER_INT
);
286 bp_pack_value (&bp
, edge
->inline_failed
, HOST_BITS_PER_INT
);
287 bp_pack_value (&bp
, edge
->frequency
, HOST_BITS_PER_INT
);
288 bp_pack_value (&bp
, edge
->call_stmt_size
, HOST_BITS_PER_INT
);
289 bp_pack_value (&bp
, edge
->call_stmt_time
, HOST_BITS_PER_INT
);
290 bp_pack_value (&bp
, edge
->loop_nest
, 30);
291 bp_pack_value (&bp
, edge
->indirect_inlining_edge
, 1);
292 bp_pack_value (&bp
, edge
->call_stmt_cannot_inline_p
, 1);
293 bp_pack_value (&bp
, edge
->can_throw_external
, 1);
294 if (edge
->indirect_unknown_callee
)
296 int flags
= edge
->indirect_info
->ecf_flags
;
297 bp_pack_value (&bp
, (flags
& ECF_CONST
) != 0, 1);
298 bp_pack_value (&bp
, (flags
& ECF_PURE
) != 0, 1);
299 bp_pack_value (&bp
, (flags
& ECF_NORETURN
) != 0, 1);
300 bp_pack_value (&bp
, (flags
& ECF_MALLOC
) != 0, 1);
301 bp_pack_value (&bp
, (flags
& ECF_NOTHROW
) != 0, 1);
302 bp_pack_value (&bp
, (flags
& ECF_RETURNS_TWICE
) != 0, 1);
303 /* Flags that should not appear on indirect calls. */
304 gcc_assert (!(flags
& (ECF_LOOPING_CONST_OR_PURE
310 lto_output_bitpack (&bp
);
313 /* Return if LIST contain references from other partitions. */
316 referenced_from_other_partition_p (struct ipa_ref_list
*list
, cgraph_node_set set
,
317 varpool_node_set vset
)
321 for (i
= 0; ipa_ref_list_refering_iterate (list
, i
, ref
); i
++)
323 if (ref
->refering_type
== IPA_REF_CGRAPH
)
325 if (ipa_ref_refering_node (ref
)->in_other_partition
326 || !cgraph_node_in_set_p (ipa_ref_refering_node (ref
), set
))
331 if (ipa_ref_refering_varpool_node (ref
)->in_other_partition
332 || !varpool_node_in_set_p (ipa_ref_refering_varpool_node (ref
),
340 /* Return true when node is reachable from other partition. */
343 reachable_from_other_partition_p (struct cgraph_node
*node
, cgraph_node_set set
)
345 struct cgraph_edge
*e
;
348 if (node
->global
.inlined_to
)
350 for (e
= node
->callers
; e
; e
= e
->next_caller
)
351 if (e
->caller
->in_other_partition
352 || !cgraph_node_in_set_p (e
->caller
, set
))
357 /* Return if LIST contain references from other partitions. */
360 referenced_from_this_partition_p (struct ipa_ref_list
*list
, cgraph_node_set set
,
361 varpool_node_set vset
)
365 for (i
= 0; ipa_ref_list_refering_iterate (list
, i
, ref
); i
++)
367 if (ref
->refering_type
== IPA_REF_CGRAPH
)
369 if (cgraph_node_in_set_p (ipa_ref_refering_node (ref
), set
))
374 if (varpool_node_in_set_p (ipa_ref_refering_varpool_node (ref
),
382 /* Return true when node is reachable from other partition. */
385 reachable_from_this_partition_p (struct cgraph_node
*node
, cgraph_node_set set
)
387 struct cgraph_edge
*e
;
388 for (e
= node
->callers
; e
; e
= e
->next_caller
)
389 if (cgraph_node_in_set_p (e
->caller
, set
))
394 /* Output the cgraph NODE to OB. ENCODER is used to find the
395 reference number of NODE->inlined_to. SET is the set of nodes we
396 are writing to the current file. If NODE is not in SET, then NODE
397 is a boundary of a cgraph_node_set and we pretend NODE just has a
398 decl and no callees. WRITTEN_DECLS is the set of FUNCTION_DECLs
399 that have had their callgraph node written so far. This is used to
400 determine if NODE is a clone of a previously written node. */
403 lto_output_node (struct lto_simple_output_block
*ob
, struct cgraph_node
*node
,
404 lto_cgraph_encoder_t encoder
, cgraph_node_set set
,
405 varpool_node_set vset
)
411 bool in_other_partition
= false;
412 struct cgraph_node
*clone_of
;
414 boundary_p
= !cgraph_node_in_set_p (node
, set
);
416 if (node
->analyzed
&& !boundary_p
)
417 tag
= LTO_cgraph_analyzed_node
;
419 tag
= LTO_cgraph_unavail_node
;
421 lto_output_uleb128_stream (ob
->main_stream
, tag
);
423 /* In WPA mode, we only output part of the call-graph. Also, we
424 fake cgraph node attributes. There are two cases that we care.
426 Boundary nodes: There are nodes that are not part of SET but are
427 called from within SET. We artificially make them look like
428 externally visible nodes with no function body.
430 Cherry-picked nodes: These are nodes we pulled from other
431 translation units into SET during IPA-inlining. We make them as
432 local static nodes to prevent clashes with other local statics. */
433 if (boundary_p
&& node
->analyzed
)
435 /* Inline clones can not be part of boundary.
436 gcc_assert (!node->global.inlined_to);
438 FIXME: At the moment they can be, when partition contains an inline
439 clone that is clone of inline clone from outside partition. We can
440 reshape the clone tree and make other tree to be the root, but it
441 needs a bit extra work and will be promplty done by cgraph_remove_node
442 after reading back. */
443 in_other_partition
= 1;
446 clone_of
= node
->clone_of
;
448 && (ref
= lto_cgraph_encoder_lookup (encoder
, clone_of
)) == LCC_NOT_FOUND
)
449 if (clone_of
->prev_sibling_clone
)
450 clone_of
= clone_of
->prev_sibling_clone
;
452 clone_of
= clone_of
->clone_of
;
454 if (LTO_cgraph_analyzed_node
)
455 gcc_assert (clone_of
|| !node
->clone_of
);
457 lto_output_sleb128_stream (ob
->main_stream
, LCC_NOT_FOUND
);
459 lto_output_sleb128_stream (ob
->main_stream
, ref
);
462 lto_output_fn_decl_index (ob
->decl_state
, ob
->main_stream
, node
->decl
);
463 lto_output_sleb128_stream (ob
->main_stream
, node
->count
);
464 lto_output_sleb128_stream (ob
->main_stream
, node
->count_materialization_scale
);
466 if (tag
== LTO_cgraph_analyzed_node
)
468 if (node
->global
.inlined_to
)
470 ref
= lto_cgraph_encoder_lookup (encoder
, node
->global
.inlined_to
);
471 gcc_assert (ref
!= LCC_NOT_FOUND
);
476 lto_output_sleb128_stream (ob
->main_stream
, ref
);
479 if (node
->same_comdat_group
&& !boundary_p
)
481 ref
= lto_cgraph_encoder_lookup (encoder
, node
->same_comdat_group
);
482 gcc_assert (ref
!= LCC_NOT_FOUND
);
486 lto_output_sleb128_stream (ob
->main_stream
, ref
);
488 bp
= bitpack_create (ob
->main_stream
);
489 bp_pack_value (&bp
, node
->local
.local
, 1);
490 bp_pack_value (&bp
, node
->local
.externally_visible
, 1);
491 bp_pack_value (&bp
, node
->local
.finalized
, 1);
492 bp_pack_value (&bp
, node
->local
.can_change_signature
, 1);
493 bp_pack_value (&bp
, node
->local
.redefined_extern_inline
, 1);
494 bp_pack_value (&bp
, node
->local
.vtable_method
, 1);
495 bp_pack_value (&bp
, node
->needed
, 1);
496 bp_pack_value (&bp
, node
->address_taken
, 1);
497 bp_pack_value (&bp
, node
->abstract_and_needed
, 1);
498 bp_pack_value (&bp
, tag
== LTO_cgraph_analyzed_node
499 && !DECL_EXTERNAL (node
->decl
)
500 && !DECL_COMDAT (node
->decl
)
501 && (reachable_from_other_partition_p (node
, set
)
502 || referenced_from_other_partition_p (&node
->ref_list
, set
, vset
)), 1);
503 bp_pack_value (&bp
, node
->lowered
, 1);
504 bp_pack_value (&bp
, in_other_partition
, 1);
505 bp_pack_value (&bp
, node
->alias
, 1);
506 bp_pack_value (&bp
, node
->finalized_by_frontend
, 1);
507 bp_pack_value (&bp
, node
->frequency
, 2);
508 bp_pack_value (&bp
, node
->only_called_at_startup
, 1);
509 bp_pack_value (&bp
, node
->only_called_at_exit
, 1);
510 lto_output_bitpack (&bp
);
511 lto_output_uleb128_stream (ob
->main_stream
, node
->resolution
);
515 struct cgraph_node
*alias
;
516 unsigned long alias_count
= 1;
517 for (alias
= node
->same_body
; alias
->next
; alias
= alias
->next
)
519 lto_output_uleb128_stream (ob
->main_stream
, alias_count
);
522 lto_output_fn_decl_index (ob
->decl_state
, ob
->main_stream
,
524 if (alias
->thunk
.thunk_p
)
526 lto_output_uleb128_stream
528 1 + (alias
->thunk
.this_adjusting
!= 0) * 2
529 + (alias
->thunk
.virtual_offset_p
!= 0) * 4);
530 lto_output_uleb128_stream (ob
->main_stream
,
531 alias
->thunk
.fixed_offset
);
532 lto_output_uleb128_stream (ob
->main_stream
,
533 alias
->thunk
.virtual_value
);
534 lto_output_fn_decl_index (ob
->decl_state
, ob
->main_stream
,
539 lto_output_uleb128_stream (ob
->main_stream
, 0);
540 lto_output_fn_decl_index (ob
->decl_state
, ob
->main_stream
,
543 gcc_assert (cgraph_get_node (alias
->thunk
.alias
) == node
);
544 lto_output_uleb128_stream (ob
->main_stream
, alias
->resolution
);
545 alias
= alias
->previous
;
550 lto_output_uleb128_stream (ob
->main_stream
, 0);
553 /* Output the varpool NODE to OB.
554 If NODE is not in SET, then NODE is a boundary. */
557 lto_output_varpool_node (struct lto_simple_output_block
*ob
, struct varpool_node
*node
,
558 lto_varpool_encoder_t varpool_encoder
,
559 cgraph_node_set set
, varpool_node_set vset
)
561 bool boundary_p
= !varpool_node_in_set_p (node
, vset
) && node
->analyzed
;
563 struct varpool_node
*alias
;
567 lto_output_var_decl_index (ob
->decl_state
, ob
->main_stream
, node
->decl
);
568 bp
= bitpack_create (ob
->main_stream
);
569 bp_pack_value (&bp
, node
->externally_visible
, 1);
570 bp_pack_value (&bp
, node
->force_output
, 1);
571 bp_pack_value (&bp
, node
->finalized
, 1);
572 bp_pack_value (&bp
, node
->alias
, 1);
573 gcc_assert (!node
->alias
|| !node
->extra_name
);
574 gcc_assert (node
->finalized
|| !node
->analyzed
);
575 gcc_assert (node
->needed
);
576 /* Constant pool initializers can be de-unified into individual ltrans units.
577 FIXME: Alternatively at -Os we may want to avoid generating for them the local
578 labels and share them across LTRANS partitions. */
579 if (DECL_IN_CONSTANT_POOL (node
->decl
)
580 && !DECL_COMDAT (node
->decl
))
582 bp_pack_value (&bp
, 0, 1); /* used_from_other_parition. */
583 bp_pack_value (&bp
, 0, 1); /* in_other_partition. */
587 bp_pack_value (&bp
, node
->analyzed
588 && referenced_from_other_partition_p (&node
->ref_list
,
590 bp_pack_value (&bp
, boundary_p
, 1); /* in_other_partition. */
592 /* Also emit any extra name aliases. */
593 for (alias
= node
->extra_name
; alias
; alias
= alias
->next
)
595 bp_pack_value (&bp
, count
!= 0, 1);
596 lto_output_bitpack (&bp
);
597 if (node
->same_comdat_group
&& !boundary_p
)
599 ref
= lto_varpool_encoder_lookup (varpool_encoder
, node
->same_comdat_group
);
600 gcc_assert (ref
!= LCC_NOT_FOUND
);
604 lto_output_sleb128_stream (ob
->main_stream
, ref
);
605 lto_output_uleb128_stream (ob
->main_stream
, node
->resolution
);
609 lto_output_uleb128_stream (ob
->main_stream
, count
);
610 for (alias
= node
->extra_name
; alias
; alias
= alias
->next
)
612 lto_output_var_decl_index (ob
->decl_state
, ob
->main_stream
, alias
->decl
);
613 lto_output_uleb128_stream (ob
->main_stream
, alias
->resolution
);
618 /* Output the varpool NODE to OB.
619 If NODE is not in SET, then NODE is a boundary. */
622 lto_output_ref (struct lto_simple_output_block
*ob
, struct ipa_ref
*ref
,
623 lto_cgraph_encoder_t encoder
,
624 lto_varpool_encoder_t varpool_encoder
)
627 bp
= bitpack_create (ob
->main_stream
);
628 bp_pack_value (&bp
, ref
->refered_type
, 1);
629 bp_pack_value (&bp
, ref
->use
, 2);
630 lto_output_bitpack (&bp
);
631 if (ref
->refered_type
== IPA_REF_CGRAPH
)
633 int nref
= lto_cgraph_encoder_lookup (encoder
, ipa_ref_node (ref
));
634 gcc_assert (nref
!= LCC_NOT_FOUND
);
635 lto_output_sleb128_stream (ob
->main_stream
, nref
);
639 int nref
= lto_varpool_encoder_lookup (varpool_encoder
,
640 ipa_ref_varpool_node (ref
));
641 gcc_assert (nref
!= LCC_NOT_FOUND
);
642 lto_output_sleb128_stream (ob
->main_stream
, nref
);
646 /* Stream out profile_summary to OB. */
649 output_profile_summary (struct lto_simple_output_block
*ob
)
653 /* We do not output num, sum_all and run_max, they are not used by
654 GCC profile feedback and they are difficult to merge from multiple
656 gcc_assert (profile_info
->runs
);
657 lto_output_uleb128_stream (ob
->main_stream
, profile_info
->runs
);
658 lto_output_uleb128_stream (ob
->main_stream
, profile_info
->sum_max
);
661 lto_output_uleb128_stream (ob
->main_stream
, 0);
664 /* Add NODE into encoder as well as nodes it is cloned from.
665 Do it in a way so clones appear first. */
668 add_node_to (lto_cgraph_encoder_t encoder
, struct cgraph_node
*node
,
672 add_node_to (encoder
, node
->clone_of
, include_body
);
673 else if (include_body
)
674 lto_set_cgraph_encoder_encode_body (encoder
, node
);
675 lto_cgraph_encoder_encode (encoder
, node
);
678 /* Add all references in LIST to encoders. */
681 add_references (lto_cgraph_encoder_t encoder
,
682 lto_varpool_encoder_t varpool_encoder
,
683 struct ipa_ref_list
*list
)
687 for (i
= 0; ipa_ref_list_reference_iterate (list
, i
, ref
); i
++)
688 if (ref
->refered_type
== IPA_REF_CGRAPH
)
689 add_node_to (encoder
, ipa_ref_node (ref
), false);
692 struct varpool_node
*vnode
= ipa_ref_varpool_node (ref
);
693 lto_varpool_encoder_encode (varpool_encoder
, vnode
);
697 /* Output all callees or indirect outgoing edges. EDGE must be the first such
701 output_outgoing_cgraph_edges (struct cgraph_edge
*edge
,
702 struct lto_simple_output_block
*ob
,
703 lto_cgraph_encoder_t encoder
)
708 /* Output edges in backward direction, so the reconstructed callgraph match
709 and it is easy to associate call sites in the IPA pass summaries. */
710 while (edge
->next_callee
)
711 edge
= edge
->next_callee
;
712 for (; edge
; edge
= edge
->prev_callee
)
713 lto_output_edge (ob
, edge
, encoder
);
716 /* Output the part of the cgraph in SET. */
719 output_refs (cgraph_node_set set
, varpool_node_set vset
,
720 lto_cgraph_encoder_t encoder
,
721 lto_varpool_encoder_t varpool_encoder
)
723 cgraph_node_set_iterator csi
;
724 varpool_node_set_iterator vsi
;
725 struct lto_simple_output_block
*ob
;
730 ob
= lto_create_simple_output_block (LTO_section_refs
);
732 for (csi
= csi_start (set
); !csi_end_p (csi
); csi_next (&csi
))
734 struct cgraph_node
*node
= csi_node (csi
);
736 count
= ipa_ref_list_nreferences (&node
->ref_list
);
739 lto_output_uleb128_stream (ob
->main_stream
, count
);
740 lto_output_uleb128_stream (ob
->main_stream
,
741 lto_cgraph_encoder_lookup (encoder
, node
));
742 for (i
= 0; ipa_ref_list_reference_iterate (&node
->ref_list
, i
, ref
); i
++)
743 lto_output_ref (ob
, ref
, encoder
, varpool_encoder
);
747 lto_output_uleb128_stream (ob
->main_stream
, 0);
749 for (vsi
= vsi_start (vset
); !vsi_end_p (vsi
); vsi_next (&vsi
))
751 struct varpool_node
*node
= vsi_node (vsi
);
753 count
= ipa_ref_list_nreferences (&node
->ref_list
);
756 lto_output_uleb128_stream (ob
->main_stream
, count
);
757 lto_output_uleb128_stream (ob
->main_stream
,
758 lto_varpool_encoder_lookup (varpool_encoder
,
760 for (i
= 0; ipa_ref_list_reference_iterate (&node
->ref_list
, i
, ref
); i
++)
761 lto_output_ref (ob
, ref
, encoder
, varpool_encoder
);
765 lto_output_uleb128_stream (ob
->main_stream
, 0);
767 lto_destroy_simple_output_block (ob
);
770 /* Find out all cgraph and varpool nodes we want to encode in current unit
771 and insert them to encoders. */
773 compute_ltrans_boundary (struct lto_out_decl_state
*state
,
774 cgraph_node_set set
, varpool_node_set vset
)
776 struct cgraph_node
*node
;
777 cgraph_node_set_iterator csi
;
778 varpool_node_set_iterator vsi
;
779 struct cgraph_edge
*edge
;
781 lto_cgraph_encoder_t encoder
;
782 lto_varpool_encoder_t varpool_encoder
;
784 encoder
= state
->cgraph_node_encoder
= lto_cgraph_encoder_new ();
785 varpool_encoder
= state
->varpool_node_encoder
= lto_varpool_encoder_new ();
787 /* Go over all the nodes in SET and assign references. */
788 for (csi
= csi_start (set
); !csi_end_p (csi
); csi_next (&csi
))
790 node
= csi_node (csi
);
791 add_node_to (encoder
, node
, true);
792 add_references (encoder
, varpool_encoder
, &node
->ref_list
);
794 for (vsi
= vsi_start (vset
); !vsi_end_p (vsi
); vsi_next (&vsi
))
796 struct varpool_node
*vnode
= vsi_node (vsi
);
797 gcc_assert (!vnode
->alias
);
798 lto_varpool_encoder_encode (varpool_encoder
, vnode
);
799 lto_set_varpool_encoder_encode_initializer (varpool_encoder
, vnode
);
800 add_references (encoder
, varpool_encoder
, &vnode
->ref_list
);
802 /* Pickle in also the initializer of all referenced readonly variables
803 to help folding. Constant pool variables are not shared, so we must
805 for (i
= 0; i
< lto_varpool_encoder_size (varpool_encoder
); i
++)
807 struct varpool_node
*vnode
= lto_varpool_encoder_deref (varpool_encoder
, i
);
808 if (DECL_INITIAL (vnode
->decl
)
809 && !lto_varpool_encoder_encode_initializer_p (varpool_encoder
,
811 && const_value_known_p (vnode
->decl
))
813 lto_set_varpool_encoder_encode_initializer (varpool_encoder
, vnode
);
814 add_references (encoder
, varpool_encoder
, &vnode
->ref_list
);
818 /* Go over all the nodes again to include callees that are not in
820 for (csi
= csi_start (set
); !csi_end_p (csi
); csi_next (&csi
))
822 node
= csi_node (csi
);
823 for (edge
= node
->callees
; edge
; edge
= edge
->next_callee
)
825 struct cgraph_node
*callee
= edge
->callee
;
826 if (!cgraph_node_in_set_p (callee
, set
))
828 /* We should have moved all the inlines. */
829 gcc_assert (!callee
->global
.inlined_to
);
830 add_node_to (encoder
, callee
, false);
836 /* Output the part of the cgraph in SET. */
839 output_cgraph (cgraph_node_set set
, varpool_node_set vset
)
841 struct cgraph_node
*node
;
842 struct lto_simple_output_block
*ob
;
843 cgraph_node_set_iterator csi
;
845 lto_cgraph_encoder_t encoder
;
846 lto_varpool_encoder_t varpool_encoder
;
847 struct cgraph_asm_node
*can
;
848 static bool asm_nodes_output
= false;
851 output_cgraph_opt_summary (set
);
853 ob
= lto_create_simple_output_block (LTO_section_cgraph
);
855 output_profile_summary (ob
);
857 /* An encoder for cgraph nodes should have been created by
858 ipa_write_summaries_1. */
859 gcc_assert (ob
->decl_state
->cgraph_node_encoder
);
860 gcc_assert (ob
->decl_state
->varpool_node_encoder
);
861 encoder
= ob
->decl_state
->cgraph_node_encoder
;
862 varpool_encoder
= ob
->decl_state
->varpool_node_encoder
;
864 /* Write out the nodes. We must first output a node and then its clones,
865 otherwise at a time reading back the node there would be nothing to clone
867 n_nodes
= lto_cgraph_encoder_size (encoder
);
868 for (i
= 0; i
< n_nodes
; i
++)
870 node
= lto_cgraph_encoder_deref (encoder
, i
);
871 lto_output_node (ob
, node
, encoder
, set
, vset
);
874 /* Go over the nodes in SET again to write edges. */
875 for (csi
= csi_start (set
); !csi_end_p (csi
); csi_next (&csi
))
877 node
= csi_node (csi
);
878 output_outgoing_cgraph_edges (node
->callees
, ob
, encoder
);
879 output_outgoing_cgraph_edges (node
->indirect_calls
, ob
, encoder
);
882 lto_output_uleb128_stream (ob
->main_stream
, 0);
884 /* Emit toplevel asms.
885 When doing WPA we must output every asm just once. Since we do not partition asm
886 nodes at all, output them to first output. This is kind of hack, but should work
888 if (!asm_nodes_output
)
890 asm_nodes_output
= true;
891 for (can
= cgraph_asm_nodes
; can
; can
= can
->next
)
893 int len
= TREE_STRING_LENGTH (can
->asm_str
);
894 lto_output_uleb128_stream (ob
->main_stream
, len
);
895 for (i
= 0; i
< len
; ++i
)
896 lto_output_1_stream (ob
->main_stream
,
897 TREE_STRING_POINTER (can
->asm_str
)[i
]);
901 lto_output_uleb128_stream (ob
->main_stream
, 0);
903 lto_destroy_simple_output_block (ob
);
904 output_varpool (set
, vset
);
905 output_refs (set
, vset
, encoder
, varpool_encoder
);
908 /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS,
909 STACK_SIZE, SELF_TIME and SELF_SIZE. This is called either to initialize
910 NODE or to replace the values in it, for instance because the first
911 time we saw it, the function body was not available but now it
912 is. BP is a bitpack with all the bitflags for NODE read from the
916 input_overwrite_node (struct lto_file_decl_data
*file_data
,
917 struct cgraph_node
*node
,
918 enum LTO_cgraph_tags tag
,
919 struct bitpack_d
*bp
,
920 enum ld_plugin_symbol_resolution resolution
)
922 node
->aux
= (void *) tag
;
923 node
->local
.lto_file_data
= file_data
;
925 node
->local
.local
= bp_unpack_value (bp
, 1);
926 node
->local
.externally_visible
= bp_unpack_value (bp
, 1);
927 node
->local
.finalized
= bp_unpack_value (bp
, 1);
928 node
->local
.can_change_signature
= bp_unpack_value (bp
, 1);
929 node
->local
.redefined_extern_inline
= bp_unpack_value (bp
, 1);
930 node
->local
.vtable_method
= bp_unpack_value (bp
, 1);
931 node
->needed
= bp_unpack_value (bp
, 1);
932 node
->address_taken
= bp_unpack_value (bp
, 1);
933 node
->abstract_and_needed
= bp_unpack_value (bp
, 1);
934 node
->reachable_from_other_partition
= bp_unpack_value (bp
, 1);
935 node
->lowered
= bp_unpack_value (bp
, 1);
936 node
->analyzed
= tag
== LTO_cgraph_analyzed_node
;
937 node
->in_other_partition
= bp_unpack_value (bp
, 1);
938 if (node
->in_other_partition
939 /* Avoid updating decl when we are seeing just inline clone.
940 When inlining function that has functions already inlined into it,
941 we produce clones of inline clones.
943 WPA partitioning might put each clone into different unit and
944 we might end up streaming inline clone from other partition
945 to support clone we are interested in. */
947 || node
->clone_of
->decl
!= node
->decl
))
949 DECL_EXTERNAL (node
->decl
) = 1;
950 TREE_STATIC (node
->decl
) = 0;
952 node
->alias
= bp_unpack_value (bp
, 1);
953 node
->finalized_by_frontend
= bp_unpack_value (bp
, 1);
954 node
->frequency
= (enum node_frequency
)bp_unpack_value (bp
, 2);
955 node
->only_called_at_startup
= bp_unpack_value (bp
, 1);
956 node
->only_called_at_exit
= bp_unpack_value (bp
, 1);
957 node
->resolution
= resolution
;
960 /* Output the part of the cgraph in SET. */
963 output_varpool (cgraph_node_set set
, varpool_node_set vset
)
965 struct lto_simple_output_block
*ob
= lto_create_simple_output_block (LTO_section_varpool
);
966 lto_varpool_encoder_t varpool_encoder
= ob
->decl_state
->varpool_node_encoder
;
967 int len
= lto_varpool_encoder_size (varpool_encoder
), i
;
969 lto_output_uleb128_stream (ob
->main_stream
, len
);
971 /* Write out the nodes. We must first output a node and then its clones,
972 otherwise at a time reading back the node there would be nothing to clone
974 for (i
= 0; i
< len
; i
++)
976 lto_output_varpool_node (ob
, lto_varpool_encoder_deref (varpool_encoder
, i
),
981 lto_destroy_simple_output_block (ob
);
984 /* Read a node from input_block IB. TAG is the node's tag just read.
985 Return the node read or overwriten. */
987 static struct cgraph_node
*
988 input_node (struct lto_file_decl_data
*file_data
,
989 struct lto_input_block
*ib
,
990 enum LTO_cgraph_tags tag
,
991 VEC(cgraph_node_ptr
, heap
) *nodes
)
994 struct cgraph_node
*node
;
997 int ref
= LCC_NOT_FOUND
, ref2
= LCC_NOT_FOUND
;
998 unsigned long same_body_count
= 0;
1000 enum ld_plugin_symbol_resolution resolution
;
1002 clone_ref
= lto_input_sleb128 (ib
);
1004 decl_index
= lto_input_uleb128 (ib
);
1005 fn_decl
= lto_file_decl_data_get_fn_decl (file_data
, decl_index
);
1007 if (clone_ref
!= LCC_NOT_FOUND
)
1009 node
= cgraph_clone_node (VEC_index (cgraph_node_ptr
, nodes
, clone_ref
), fn_decl
,
1010 0, CGRAPH_FREQ_BASE
, 0, false, NULL
);
1013 node
= cgraph_get_create_node (fn_decl
);
1015 node
->count
= lto_input_sleb128 (ib
);
1016 node
->count_materialization_scale
= lto_input_sleb128 (ib
);
1018 if (tag
== LTO_cgraph_analyzed_node
)
1019 ref
= lto_input_sleb128 (ib
);
1021 ref2
= lto_input_sleb128 (ib
);
1023 /* Make sure that we have not read this node before. Nodes that
1024 have already been read will have their tag stored in the 'aux'
1025 field. Since built-in functions can be referenced in multiple
1026 functions, they are expected to be read more than once. */
1027 if (node
->aux
&& !DECL_IS_BUILTIN (node
->decl
))
1028 internal_error ("bytecode stream: found multiple instances of cgraph "
1029 "node %d", node
->uid
);
1031 bp
= lto_input_bitpack (ib
);
1032 resolution
= (enum ld_plugin_symbol_resolution
)lto_input_uleb128 (ib
);
1033 input_overwrite_node (file_data
, node
, tag
, &bp
, resolution
);
1035 /* Store a reference for now, and fix up later to be a pointer. */
1036 node
->global
.inlined_to
= (cgraph_node_ptr
) (intptr_t) ref
;
1038 /* Store a reference for now, and fix up later to be a pointer. */
1039 node
->same_comdat_group
= (cgraph_node_ptr
) (intptr_t) ref2
;
1041 same_body_count
= lto_input_uleb128 (ib
);
1042 while (same_body_count
-- > 0)
1046 struct cgraph_node
*alias
;
1047 decl_index
= lto_input_uleb128 (ib
);
1048 alias_decl
= lto_file_decl_data_get_fn_decl (file_data
, decl_index
);
1049 type
= lto_input_uleb128 (ib
);
1053 decl_index
= lto_input_uleb128 (ib
);
1054 real_alias
= lto_file_decl_data_get_fn_decl (file_data
, decl_index
);
1055 alias
= cgraph_same_body_alias (node
, alias_decl
, real_alias
);
1059 HOST_WIDE_INT fixed_offset
= lto_input_uleb128 (ib
);
1060 HOST_WIDE_INT virtual_value
= lto_input_uleb128 (ib
);
1062 decl_index
= lto_input_uleb128 (ib
);
1063 real_alias
= lto_file_decl_data_get_fn_decl (file_data
, decl_index
);
1064 alias
= cgraph_add_thunk (node
, alias_decl
, fn_decl
, type
& 2, fixed_offset
,
1066 (type
& 4) ? size_int (virtual_value
) : NULL_TREE
,
1070 alias
->resolution
= (enum ld_plugin_symbol_resolution
)lto_input_uleb128 (ib
);
1075 /* Read a node from input_block IB. TAG is the node's tag just read.
1076 Return the node read or overwriten. */
1078 static struct varpool_node
*
1079 input_varpool_node (struct lto_file_decl_data
*file_data
,
1080 struct lto_input_block
*ib
)
1084 struct varpool_node
*node
;
1085 struct bitpack_d bp
;
1088 int ref
= LCC_NOT_FOUND
;
1090 decl_index
= lto_input_uleb128 (ib
);
1091 var_decl
= lto_file_decl_data_get_var_decl (file_data
, decl_index
);
1092 node
= varpool_node (var_decl
);
1093 node
->lto_file_data
= file_data
;
1095 bp
= lto_input_bitpack (ib
);
1096 node
->externally_visible
= bp_unpack_value (&bp
, 1);
1097 node
->force_output
= bp_unpack_value (&bp
, 1);
1098 node
->finalized
= bp_unpack_value (&bp
, 1);
1099 node
->alias
= bp_unpack_value (&bp
, 1);
1100 node
->analyzed
= node
->finalized
;
1101 node
->used_from_other_partition
= bp_unpack_value (&bp
, 1);
1102 node
->in_other_partition
= bp_unpack_value (&bp
, 1);
1103 if (node
->in_other_partition
)
1105 DECL_EXTERNAL (node
->decl
) = 1;
1106 TREE_STATIC (node
->decl
) = 0;
1108 aliases_p
= bp_unpack_value (&bp
, 1);
1109 if (node
->finalized
)
1110 varpool_mark_needed_node (node
);
1111 ref
= lto_input_sleb128 (ib
);
1112 /* Store a reference for now, and fix up later to be a pointer. */
1113 node
->same_comdat_group
= (struct varpool_node
*) (intptr_t) ref
;
1114 node
->resolution
= (enum ld_plugin_symbol_resolution
)lto_input_uleb128 (ib
);
1117 count
= lto_input_uleb128 (ib
);
1118 for (; count
> 0; count
--)
1120 tree decl
= lto_file_decl_data_get_var_decl (file_data
,
1121 lto_input_uleb128 (ib
));
1122 struct varpool_node
*alias
;
1123 alias
= varpool_extra_name_alias (decl
, var_decl
);
1124 alias
->resolution
= (enum ld_plugin_symbol_resolution
)lto_input_uleb128 (ib
);
1130 /* Read a node from input_block IB. TAG is the node's tag just read.
1131 Return the node read or overwriten. */
1134 input_ref (struct lto_input_block
*ib
,
1135 struct cgraph_node
*refering_node
,
1136 struct varpool_node
*refering_varpool_node
,
1137 VEC(cgraph_node_ptr
, heap
) *nodes
,
1138 VEC(varpool_node_ptr
, heap
) *varpool_nodes
)
1140 struct cgraph_node
*node
= NULL
;
1141 struct varpool_node
*varpool_node
= NULL
;
1142 struct bitpack_d bp
;
1143 enum ipa_ref_type type
;
1144 enum ipa_ref_use use
;
1146 bp
= lto_input_bitpack (ib
);
1147 type
= (enum ipa_ref_type
) bp_unpack_value (&bp
, 1);
1148 use
= (enum ipa_ref_use
) bp_unpack_value (&bp
, 2);
1149 if (type
== IPA_REF_CGRAPH
)
1150 node
= VEC_index (cgraph_node_ptr
, nodes
, lto_input_sleb128 (ib
));
1152 varpool_node
= VEC_index (varpool_node_ptr
, varpool_nodes
, lto_input_sleb128 (ib
));
1153 ipa_record_reference (refering_node
, refering_varpool_node
,
1154 node
, varpool_node
, use
, NULL
);
1157 /* Read an edge from IB. NODES points to a vector of previously read nodes for
1158 decoding caller and callee of the edge to be read. If INDIRECT is true, the
1159 edge being read is indirect (in the sense that it has
1160 indirect_unknown_callee set). */
1163 input_edge (struct lto_input_block
*ib
, VEC(cgraph_node_ptr
, heap
) *nodes
,
1166 struct cgraph_node
*caller
, *callee
;
1167 struct cgraph_edge
*edge
;
1168 unsigned int stmt_id
;
1172 cgraph_inline_failed_t inline_failed
;
1173 struct bitpack_d bp
;
1175 int call_stmt_time
, call_stmt_size
;
1177 caller
= VEC_index (cgraph_node_ptr
, nodes
, lto_input_sleb128 (ib
));
1178 if (caller
== NULL
|| caller
->decl
== NULL_TREE
)
1179 internal_error ("bytecode stream: no caller found while reading edge");
1183 callee
= VEC_index (cgraph_node_ptr
, nodes
, lto_input_sleb128 (ib
));
1184 if (callee
== NULL
|| callee
->decl
== NULL_TREE
)
1185 internal_error ("bytecode stream: no callee found while reading edge");
1190 count
= (gcov_type
) lto_input_sleb128 (ib
);
1192 bp
= lto_input_bitpack (ib
);
1193 stmt_id
= (unsigned int) bp_unpack_value (&bp
, HOST_BITS_PER_INT
);
1194 inline_failed
= (cgraph_inline_failed_t
) bp_unpack_value (&bp
,
1196 freq
= (int) bp_unpack_value (&bp
, HOST_BITS_PER_INT
);
1197 call_stmt_size
= (int) bp_unpack_value (&bp
, HOST_BITS_PER_INT
);
1198 call_stmt_time
= (int) bp_unpack_value (&bp
, HOST_BITS_PER_INT
);
1199 nest
= (unsigned) bp_unpack_value (&bp
, 30);
1202 edge
= cgraph_create_indirect_edge (caller
, NULL
, 0, count
, freq
, nest
);
1204 edge
= cgraph_create_edge (caller
, callee
, NULL
, count
, freq
, nest
);
1206 edge
->indirect_inlining_edge
= bp_unpack_value (&bp
, 1);
1207 edge
->lto_stmt_uid
= stmt_id
;
1208 edge
->inline_failed
= inline_failed
;
1209 edge
->call_stmt_cannot_inline_p
= bp_unpack_value (&bp
, 1);
1210 edge
->can_throw_external
= bp_unpack_value (&bp
, 1);
1211 edge
->call_stmt_size
= call_stmt_size
;
1212 edge
->call_stmt_time
= call_stmt_time
;
1215 if (bp_unpack_value (&bp
, 1))
1216 ecf_flags
|= ECF_CONST
;
1217 if (bp_unpack_value (&bp
, 1))
1218 ecf_flags
|= ECF_PURE
;
1219 if (bp_unpack_value (&bp
, 1))
1220 ecf_flags
|= ECF_NORETURN
;
1221 if (bp_unpack_value (&bp
, 1))
1222 ecf_flags
|= ECF_MALLOC
;
1223 if (bp_unpack_value (&bp
, 1))
1224 ecf_flags
|= ECF_NOTHROW
;
1225 if (bp_unpack_value (&bp
, 1))
1226 ecf_flags
|= ECF_RETURNS_TWICE
;
1227 edge
->indirect_info
->ecf_flags
= ecf_flags
;
1232 /* Read a cgraph from IB using the info in FILE_DATA. */
1234 static VEC(cgraph_node_ptr
, heap
) *
1235 input_cgraph_1 (struct lto_file_decl_data
*file_data
,
1236 struct lto_input_block
*ib
)
1238 enum LTO_cgraph_tags tag
;
1239 VEC(cgraph_node_ptr
, heap
) *nodes
= NULL
;
1240 struct cgraph_node
*node
;
1242 unsigned HOST_WIDE_INT len
;
1244 tag
= (enum LTO_cgraph_tags
) lto_input_uleb128 (ib
);
1247 if (tag
== LTO_cgraph_edge
)
1248 input_edge (ib
, nodes
, false);
1249 else if (tag
== LTO_cgraph_indirect_edge
)
1250 input_edge (ib
, nodes
, true);
1253 node
= input_node (file_data
, ib
, tag
,nodes
);
1254 if (node
== NULL
|| node
->decl
== NULL_TREE
)
1255 internal_error ("bytecode stream: found empty cgraph node");
1256 VEC_safe_push (cgraph_node_ptr
, heap
, nodes
, node
);
1257 lto_cgraph_encoder_encode (file_data
->cgraph_node_encoder
, node
);
1260 tag
= (enum LTO_cgraph_tags
) lto_input_uleb128 (ib
);
1263 /* Input toplevel asms. */
1264 len
= lto_input_uleb128 (ib
);
1267 char *str
= (char *)xmalloc (len
+ 1);
1268 for (i
= 0; i
< len
; ++i
)
1269 str
[i
] = lto_input_1_unsigned (ib
);
1270 cgraph_add_asm_node (build_string (len
, str
));
1273 len
= lto_input_uleb128 (ib
);
1275 /* AUX pointers should be all non-zero for nodes read from the stream. */
1276 #ifdef ENABLE_CHECKING
1277 FOR_EACH_VEC_ELT (cgraph_node_ptr
, nodes
, i
, node
)
1278 gcc_assert (node
->aux
);
1280 FOR_EACH_VEC_ELT (cgraph_node_ptr
, nodes
, i
, node
)
1282 int ref
= (int) (intptr_t) node
->global
.inlined_to
;
1284 /* We share declaration of builtins, so we may read same node twice. */
1289 /* Fixup inlined_to from reference to pointer. */
1290 if (ref
!= LCC_NOT_FOUND
)
1291 node
->global
.inlined_to
= VEC_index (cgraph_node_ptr
, nodes
, ref
);
1293 node
->global
.inlined_to
= NULL
;
1295 ref
= (int) (intptr_t) node
->same_comdat_group
;
1297 /* Fixup same_comdat_group from reference to pointer. */
1298 if (ref
!= LCC_NOT_FOUND
)
1299 node
->same_comdat_group
= VEC_index (cgraph_node_ptr
, nodes
, ref
);
1301 node
->same_comdat_group
= NULL
;
1303 FOR_EACH_VEC_ELT (cgraph_node_ptr
, nodes
, i
, node
)
1304 node
->aux
= (void *)1;
1308 /* Read a varpool from IB using the info in FILE_DATA. */
1310 static VEC(varpool_node_ptr
, heap
) *
1311 input_varpool_1 (struct lto_file_decl_data
*file_data
,
1312 struct lto_input_block
*ib
)
1314 unsigned HOST_WIDE_INT len
;
1315 VEC(varpool_node_ptr
, heap
) *varpool
= NULL
;
1317 struct varpool_node
*node
;
1319 len
= lto_input_uleb128 (ib
);
1322 VEC_safe_push (varpool_node_ptr
, heap
, varpool
,
1323 input_varpool_node (file_data
, ib
));
1326 #ifdef ENABLE_CHECKING
1327 FOR_EACH_VEC_ELT (varpool_node_ptr
, varpool
, i
, node
)
1328 gcc_assert (!node
->aux
);
1330 FOR_EACH_VEC_ELT (varpool_node_ptr
, varpool
, i
, node
)
1332 int ref
= (int) (intptr_t) node
->same_comdat_group
;
1333 /* We share declaration of builtins, so we may read same node twice. */
1336 node
->aux
= (void *)1;
1338 /* Fixup same_comdat_group from reference to pointer. */
1339 if (ref
!= LCC_NOT_FOUND
)
1340 node
->same_comdat_group
= VEC_index (varpool_node_ptr
, varpool
, ref
);
1342 node
->same_comdat_group
= NULL
;
1344 FOR_EACH_VEC_ELT (varpool_node_ptr
, varpool
, i
, node
)
1349 /* Input ipa_refs. */
1352 input_refs (struct lto_input_block
*ib
,
1353 VEC(cgraph_node_ptr
, heap
) *nodes
,
1354 VEC(varpool_node_ptr
, heap
) *varpool
)
1360 struct cgraph_node
*node
;
1361 count
= lto_input_uleb128 (ib
);
1364 idx
= lto_input_uleb128 (ib
);
1365 node
= VEC_index (cgraph_node_ptr
, nodes
, idx
);
1368 input_ref (ib
, node
, NULL
, nodes
, varpool
);
1374 struct varpool_node
*node
;
1375 count
= lto_input_uleb128 (ib
);
1378 node
= VEC_index (varpool_node_ptr
, varpool
, lto_input_uleb128 (ib
));
1381 input_ref (ib
, NULL
, node
, nodes
, varpool
);
1388 static struct gcov_ctr_summary lto_gcov_summary
;
1390 /* Input profile_info from IB. */
1392 input_profile_summary (struct lto_input_block
*ib
,
1393 struct lto_file_decl_data
*file_data
)
1395 unsigned int runs
= lto_input_uleb128 (ib
);
1398 file_data
->profile_info
.runs
= runs
;
1399 file_data
->profile_info
.sum_max
= lto_input_uleb128 (ib
);
1404 /* Rescale profile summaries to the same number of runs in the whole unit. */
1407 merge_profile_summaries (struct lto_file_decl_data
**file_data_vec
)
1409 struct lto_file_decl_data
*file_data
;
1411 gcov_unsigned_t max_runs
= 0;
1412 struct cgraph_node
*node
;
1413 struct cgraph_edge
*edge
;
1415 /* Find unit with maximal number of runs. If we ever get serious about
1416 roundoff errors, we might also consider computing smallest common
1418 for (j
= 0; (file_data
= file_data_vec
[j
]) != NULL
; j
++)
1419 if (max_runs
< file_data
->profile_info
.runs
)
1420 max_runs
= file_data
->profile_info
.runs
;
1425 /* Simple overflow check. We probably don't need to support that many train
1426 runs. Such a large value probably imply data corruption anyway. */
1427 if (max_runs
> INT_MAX
/ REG_BR_PROB_BASE
)
1429 sorry ("At most %i profile runs is supported. Perhaps corrupted profile?",
1430 INT_MAX
/ REG_BR_PROB_BASE
);
1434 profile_info
= <o_gcov_summary
;
1435 lto_gcov_summary
.runs
= max_runs
;
1436 lto_gcov_summary
.sum_max
= 0;
1438 /* Rescale all units to the maximal number of runs.
1439 sum_max can not be easily merged, as we have no idea what files come from
1440 the same run. We do not use the info anyway, so leave it 0. */
1441 for (j
= 0; (file_data
= file_data_vec
[j
]) != NULL
; j
++)
1442 if (file_data
->profile_info
.runs
)
1444 int scale
= ((REG_BR_PROB_BASE
* max_runs
1445 + file_data
->profile_info
.runs
/ 2)
1446 / file_data
->profile_info
.runs
);
1447 lto_gcov_summary
.sum_max
= MAX (lto_gcov_summary
.sum_max
,
1448 (file_data
->profile_info
.sum_max
1450 + REG_BR_PROB_BASE
/ 2)
1451 / REG_BR_PROB_BASE
);
1454 /* Watch roundoff errors. */
1455 if (lto_gcov_summary
.sum_max
< max_runs
)
1456 lto_gcov_summary
.sum_max
= max_runs
;
1458 /* If merging already happent at WPA time, we are done. */
1462 /* Now compute count_materialization_scale of each node.
1463 During LTRANS we already have values of count_materialization_scale
1464 computed, so just update them. */
1465 for (node
= cgraph_nodes
; node
; node
= node
->next
)
1466 if (node
->local
.lto_file_data
1467 && node
->local
.lto_file_data
->profile_info
.runs
)
1472 ((node
->count_materialization_scale
* max_runs
1473 + node
->local
.lto_file_data
->profile_info
.runs
/ 2)
1474 / node
->local
.lto_file_data
->profile_info
.runs
);
1475 node
->count_materialization_scale
= scale
;
1477 fatal_error ("Profile information in %s corrupted",
1478 file_data
->file_name
);
1480 if (scale
== REG_BR_PROB_BASE
)
1482 for (edge
= node
->callees
; edge
; edge
= edge
->next_callee
)
1483 edge
->count
= ((edge
->count
* scale
+ REG_BR_PROB_BASE
/ 2)
1484 / REG_BR_PROB_BASE
);
1485 node
->count
= ((node
->count
* scale
+ REG_BR_PROB_BASE
/ 2)
1486 / REG_BR_PROB_BASE
);
1490 /* Input and merge the cgraph from each of the .o files passed to
1496 struct lto_file_decl_data
**file_data_vec
= lto_get_file_decl_data ();
1497 struct lto_file_decl_data
*file_data
;
1499 struct cgraph_node
*node
;
1501 while ((file_data
= file_data_vec
[j
++]))
1505 struct lto_input_block
*ib
;
1506 VEC(cgraph_node_ptr
, heap
) *nodes
;
1507 VEC(varpool_node_ptr
, heap
) *varpool
;
1509 ib
= lto_create_simple_input_block (file_data
, LTO_section_cgraph
,
1512 fatal_error ("cannot find LTO cgraph in %s", file_data
->file_name
);
1513 input_profile_summary (ib
, file_data
);
1514 file_data
->cgraph_node_encoder
= lto_cgraph_encoder_new ();
1515 nodes
= input_cgraph_1 (file_data
, ib
);
1516 lto_destroy_simple_input_block (file_data
, LTO_section_cgraph
,
1519 ib
= lto_create_simple_input_block (file_data
, LTO_section_varpool
,
1522 fatal_error ("cannot find LTO varpool in %s", file_data
->file_name
);
1523 varpool
= input_varpool_1 (file_data
, ib
);
1524 lto_destroy_simple_input_block (file_data
, LTO_section_varpool
,
1527 ib
= lto_create_simple_input_block (file_data
, LTO_section_refs
,
1530 fatal_error("cannot find LTO section refs in %s", file_data
->file_name
);
1531 input_refs (ib
, nodes
, varpool
);
1532 lto_destroy_simple_input_block (file_data
, LTO_section_refs
,
1535 input_cgraph_opt_summary (nodes
);
1536 VEC_free (cgraph_node_ptr
, heap
, nodes
);
1537 VEC_free (varpool_node_ptr
, heap
, varpool
);
1540 merge_profile_summaries (file_data_vec
);
1542 /* Clear out the aux field that was used to store enough state to
1543 tell which nodes should be overwritten. */
1544 for (node
= cgraph_nodes
; node
; node
= node
->next
)
1546 /* Some nodes may have been created by cgraph_node. This
1547 happens when the callgraph contains nested functions. If the
1548 node for the parent function was never emitted to the gimple
1549 file, cgraph_node will create a node for it when setting the
1550 context of the nested function. */
1551 if (node
->local
.lto_file_data
)
1556 /* True when we need optimization summary for NODE. */
1559 output_cgraph_opt_summary_p (struct cgraph_node
*node
, cgraph_node_set set
)
1561 struct cgraph_edge
*e
;
1563 if (cgraph_node_in_set_p (node
, set
))
1565 for (e
= node
->callees
; e
; e
= e
->next_callee
)
1566 if (e
->indirect_info
1567 && e
->indirect_info
->thunk_delta
!= 0)
1570 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
1571 if (e
->indirect_info
->thunk_delta
!= 0)
1575 return (node
->clone_of
1576 && (node
->clone
.tree_map
1577 || node
->clone
.args_to_skip
1578 || node
->clone
.combined_args_to_skip
));
1581 /* Output optimization summary for EDGE to OB. */
1583 output_edge_opt_summary (struct output_block
*ob
,
1584 struct cgraph_edge
*edge
)
1586 if (edge
->indirect_info
)
1587 lto_output_sleb128_stream (ob
->main_stream
,
1588 edge
->indirect_info
->thunk_delta
);
1590 lto_output_sleb128_stream (ob
->main_stream
, 0);
1593 /* Output optimization summary for NODE to OB. */
1596 output_node_opt_summary (struct output_block
*ob
,
1597 struct cgraph_node
*node
,
1598 cgraph_node_set set
)
1602 struct ipa_replace_map
*map
;
1603 struct bitpack_d bp
;
1605 struct cgraph_edge
*e
;
1607 lto_output_uleb128_stream (ob
->main_stream
,
1608 bitmap_count_bits (node
->clone
.args_to_skip
));
1609 EXECUTE_IF_SET_IN_BITMAP (node
->clone
.args_to_skip
, 0, index
, bi
)
1610 lto_output_uleb128_stream (ob
->main_stream
, index
);
1611 lto_output_uleb128_stream (ob
->main_stream
,
1612 bitmap_count_bits (node
->clone
.combined_args_to_skip
));
1613 EXECUTE_IF_SET_IN_BITMAP (node
->clone
.combined_args_to_skip
, 0, index
, bi
)
1614 lto_output_uleb128_stream (ob
->main_stream
, index
);
1615 lto_output_uleb128_stream (ob
->main_stream
,
1616 VEC_length (ipa_replace_map_p
, node
->clone
.tree_map
));
1617 FOR_EACH_VEC_ELT (ipa_replace_map_p
, node
->clone
.tree_map
, i
, map
)
1622 for (parm_num
= 0, parm
= DECL_ARGUMENTS (node
->decl
); parm
;
1623 parm
= DECL_CHAIN (parm
), parm_num
++)
1624 if (map
->old_tree
== parm
)
1626 /* At the moment we assume all old trees to be PARM_DECLs, because we have no
1627 mechanism to store function local declarations into summaries. */
1629 lto_output_uleb128_stream (ob
->main_stream
, parm_num
);
1630 lto_output_tree (ob
, map
->new_tree
, true);
1631 bp
= bitpack_create (ob
->main_stream
);
1632 bp_pack_value (&bp
, map
->replace_p
, 1);
1633 bp_pack_value (&bp
, map
->ref_p
, 1);
1634 lto_output_bitpack (&bp
);
1637 if (cgraph_node_in_set_p (node
, set
))
1639 for (e
= node
->callees
; e
; e
= e
->next_callee
)
1640 output_edge_opt_summary (ob
, e
);
1641 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
1642 output_edge_opt_summary (ob
, e
);
1646 /* Output optimization summaries stored in callgraph.
1647 At the moment it is the clone info structure. */
1650 output_cgraph_opt_summary (cgraph_node_set set
)
1652 struct cgraph_node
*node
;
1654 lto_cgraph_encoder_t encoder
;
1655 struct output_block
*ob
= create_output_block (LTO_section_cgraph_opt_sum
);
1658 ob
->cgraph_node
= NULL
;
1659 encoder
= ob
->decl_state
->cgraph_node_encoder
;
1660 n_nodes
= lto_cgraph_encoder_size (encoder
);
1661 for (i
= 0; i
< n_nodes
; i
++)
1662 if (output_cgraph_opt_summary_p (lto_cgraph_encoder_deref (encoder
, i
),
1665 lto_output_uleb128_stream (ob
->main_stream
, count
);
1666 for (i
= 0; i
< n_nodes
; i
++)
1668 node
= lto_cgraph_encoder_deref (encoder
, i
);
1669 if (output_cgraph_opt_summary_p (node
, set
))
1671 lto_output_uleb128_stream (ob
->main_stream
, i
);
1672 output_node_opt_summary (ob
, node
, set
);
1675 produce_asm (ob
, NULL
);
1676 destroy_output_block (ob
);
1679 /* Input optimisation summary of EDGE. */
1682 input_edge_opt_summary (struct cgraph_edge
*edge
,
1683 struct lto_input_block
*ib_main
)
1685 HOST_WIDE_INT thunk_delta
;
1686 thunk_delta
= lto_input_sleb128 (ib_main
);
1687 if (thunk_delta
!= 0)
1689 gcc_assert (!edge
->indirect_info
);
1690 edge
->indirect_info
= cgraph_allocate_init_indirect_info ();
1691 edge
->indirect_info
->thunk_delta
= thunk_delta
;
1695 /* Input optimisation summary of NODE. */
1698 input_node_opt_summary (struct cgraph_node
*node
,
1699 struct lto_input_block
*ib_main
,
1700 struct data_in
*data_in
)
1705 struct bitpack_d bp
;
1706 struct cgraph_edge
*e
;
1708 count
= lto_input_uleb128 (ib_main
);
1710 node
->clone
.args_to_skip
= BITMAP_GGC_ALLOC ();
1711 for (i
= 0; i
< count
; i
++)
1713 bit
= lto_input_uleb128 (ib_main
);
1714 bitmap_set_bit (node
->clone
.args_to_skip
, bit
);
1716 count
= lto_input_uleb128 (ib_main
);
1718 node
->clone
.combined_args_to_skip
= BITMAP_GGC_ALLOC ();
1719 for (i
= 0; i
< count
; i
++)
1721 bit
= lto_input_uleb128 (ib_main
);
1722 bitmap_set_bit (node
->clone
.combined_args_to_skip
, bit
);
1724 count
= lto_input_uleb128 (ib_main
);
1725 for (i
= 0; i
< count
; i
++)
1729 struct ipa_replace_map
*map
= ggc_alloc_ipa_replace_map ();
1731 VEC_safe_push (ipa_replace_map_p
, gc
, node
->clone
.tree_map
, map
);
1732 for (parm_num
= 0, parm
= DECL_ARGUMENTS (node
->decl
); parm_num
;
1733 parm
= DECL_CHAIN (parm
))
1735 map
->parm_num
= lto_input_uleb128 (ib_main
);
1736 map
->old_tree
= NULL
;
1737 map
->new_tree
= lto_input_tree (ib_main
, data_in
);
1738 bp
= lto_input_bitpack (ib_main
);
1739 map
->replace_p
= bp_unpack_value (&bp
, 1);
1740 map
->ref_p
= bp_unpack_value (&bp
, 1);
1742 for (e
= node
->callees
; e
; e
= e
->next_callee
)
1743 input_edge_opt_summary (e
, ib_main
);
1744 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
1745 input_edge_opt_summary (e
, ib_main
);
1748 /* Read section in file FILE_DATA of length LEN with data DATA. */
1751 input_cgraph_opt_section (struct lto_file_decl_data
*file_data
,
1752 const char *data
, size_t len
, VEC (cgraph_node_ptr
,
1755 const struct lto_function_header
*header
=
1756 (const struct lto_function_header
*) data
;
1757 const int32_t cfg_offset
= sizeof (struct lto_function_header
);
1758 const int32_t main_offset
= cfg_offset
+ header
->cfg_size
;
1759 const int32_t string_offset
= main_offset
+ header
->main_size
;
1760 struct data_in
*data_in
;
1761 struct lto_input_block ib_main
;
1765 LTO_INIT_INPUT_BLOCK (ib_main
, (const char *) data
+ main_offset
, 0,
1769 lto_data_in_create (file_data
, (const char *) data
+ string_offset
,
1770 header
->string_size
, NULL
);
1771 count
= lto_input_uleb128 (&ib_main
);
1773 for (i
= 0; i
< count
; i
++)
1775 int ref
= lto_input_uleb128 (&ib_main
);
1776 input_node_opt_summary (VEC_index (cgraph_node_ptr
, nodes
, ref
),
1779 lto_free_section_data (file_data
, LTO_section_cgraph_opt_sum
, NULL
, data
,
1781 lto_data_in_delete (data_in
);
1784 /* Input optimization summary of cgraph. */
1787 input_cgraph_opt_summary (VEC (cgraph_node_ptr
, heap
) * nodes
)
1789 struct lto_file_decl_data
**file_data_vec
= lto_get_file_decl_data ();
1790 struct lto_file_decl_data
*file_data
;
1793 while ((file_data
= file_data_vec
[j
++]))
1797 lto_get_section_data (file_data
, LTO_section_cgraph_opt_sum
, NULL
,
1801 input_cgraph_opt_section (file_data
, data
, len
, nodes
);