[AArch64] Wire up vqdmullh_laneq_s16 and vqdmullh_laneq_s32
[official-gcc.git] / gcc / lto-cgraph.c
blob0584946d5b0edf4f70c1639b8a61c0422b46557a
1 /* Write and read the cgraph to the memory mapped representation of a
2 .o file.
4 Copyright (C) 2009-2014 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
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
28 #include "stringpool.h"
29 #include "basic-block.h"
30 #include "tree-ssa-alias.h"
31 #include "internal-fn.h"
32 #include "gimple-expr.h"
33 #include "is-a.h"
34 #include "gimple.h"
35 #include "expr.h"
36 #include "flags.h"
37 #include "params.h"
38 #include "input.h"
39 #include "hashtab.h"
40 #include "hash-set.h"
41 #include "langhooks.h"
42 #include "bitmap.h"
43 #include "function.h"
44 #include "diagnostic-core.h"
45 #include "except.h"
46 #include "timevar.h"
47 #include "lto-streamer.h"
48 #include "data-streamer.h"
49 #include "tree-streamer.h"
50 #include "gcov-io.h"
51 #include "tree-pass.h"
52 #include "profile.h"
53 #include "context.h"
54 #include "pass_manager.h"
55 #include "ipa-utils.h"
57 /* True when asm nodes has been output. */
58 bool asm_nodes_output = false;
60 static void output_cgraph_opt_summary (void);
61 static void input_cgraph_opt_summary (vec<symtab_node *> nodes);
63 /* Number of LDPR values known to GCC. */
64 #define LDPR_NUM_KNOWN (LDPR_PREVAILING_DEF_IRONLY_EXP + 1)
66 /* All node orders are ofsetted by ORDER_BASE. */
67 static int order_base;
69 /* Cgraph streaming is organized as set of record whose type
70 is indicated by a tag. */
71 enum LTO_symtab_tags
73 /* Must leave 0 for the stopper. */
75 /* Cgraph node without body available. */
76 LTO_symtab_unavail_node = 1,
77 /* Cgraph node with function body. */
78 LTO_symtab_analyzed_node,
79 /* Cgraph edges. */
80 LTO_symtab_edge,
81 LTO_symtab_indirect_edge,
82 LTO_symtab_variable,
83 LTO_symtab_last_tag
86 /* Create a new symtab encoder.
87 if FOR_INPUT, the encoder allocate only datastructures needed
88 to read the symtab. */
90 lto_symtab_encoder_t
91 lto_symtab_encoder_new (bool for_input)
93 lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d);
95 if (!for_input)
96 encoder->map = new hash_map<symtab_node *, size_t>;
97 encoder->nodes.create (0);
98 return encoder;
102 /* Delete ENCODER and its components. */
104 void
105 lto_symtab_encoder_delete (lto_symtab_encoder_t encoder)
107 encoder->nodes.release ();
108 if (encoder->map)
109 delete encoder->map;
110 free (encoder);
114 /* Return the existing reference number of NODE in the symtab encoder in
115 output block OB. Assign a new reference if this is the first time
116 NODE is encoded. */
119 lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
120 symtab_node *node)
122 int ref;
124 if (!encoder->map)
126 lto_encoder_entry entry = {node, false, false, false};
128 ref = encoder->nodes.length ();
129 encoder->nodes.safe_push (entry);
130 return ref;
133 size_t *slot = encoder->map->get (node);
134 if (!slot || !*slot)
136 lto_encoder_entry entry = {node, false, false, false};
137 ref = encoder->nodes.length ();
138 if (!slot)
139 encoder->map->put (node, ref + 1);
140 encoder->nodes.safe_push (entry);
142 else
143 ref = *slot - 1;
145 return ref;
148 /* Remove NODE from encoder. */
150 bool
151 lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder,
152 symtab_node *node)
154 int index;
155 lto_encoder_entry last_node;
157 size_t *slot = encoder->map->get (node);
158 if (slot == NULL || !*slot)
159 return false;
161 index = *slot - 1;
162 gcc_checking_assert (encoder->nodes[index].node == node);
164 /* Remove from vector. We do this by swapping node with the last element
165 of the vector. */
166 last_node = encoder->nodes.pop ();
167 if (last_node.node != node)
169 gcc_assert (encoder->map->put (last_node.node, index + 1));
171 /* Move the last element to the original spot of NODE. */
172 encoder->nodes[index] = last_node;
175 /* Remove element from hash table. */
176 encoder->map->remove (node);
177 return true;
181 /* Return TRUE if we should encode initializer of NODE (if any). */
183 bool
184 lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t encoder,
185 struct cgraph_node *node)
187 int index = lto_symtab_encoder_lookup (encoder, node);
188 return encoder->nodes[index].body;
191 /* Return TRUE if we should encode body of NODE (if any). */
193 static void
194 lto_set_symtab_encoder_encode_body (lto_symtab_encoder_t encoder,
195 struct cgraph_node *node)
197 int index = lto_symtab_encoder_encode (encoder, node);
198 gcc_checking_assert (encoder->nodes[index].node == node);
199 encoder->nodes[index].body = true;
202 /* Return TRUE if we should encode initializer of NODE (if any). */
204 bool
205 lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t encoder,
206 varpool_node *node)
208 int index = lto_symtab_encoder_lookup (encoder, node);
209 if (index == LCC_NOT_FOUND)
210 return false;
211 return encoder->nodes[index].initializer;
214 /* Return TRUE if we should encode initializer of NODE (if any). */
216 static void
217 lto_set_symtab_encoder_encode_initializer (lto_symtab_encoder_t encoder,
218 varpool_node *node)
220 int index = lto_symtab_encoder_lookup (encoder, node);
221 encoder->nodes[index].initializer = true;
224 /* Return TRUE if we should encode initializer of NODE (if any). */
226 bool
227 lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t encoder,
228 symtab_node *node)
230 int index = lto_symtab_encoder_lookup (encoder, node);
231 if (index == LCC_NOT_FOUND)
232 return false;
233 return encoder->nodes[index].in_partition;
236 /* Return TRUE if we should encode body of NODE (if any). */
238 void
239 lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t encoder,
240 symtab_node *node)
242 int index = lto_symtab_encoder_encode (encoder, node);
243 encoder->nodes[index].in_partition = true;
246 /* Output the cgraph EDGE to OB using ENCODER. */
248 static void
249 lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge,
250 lto_symtab_encoder_t encoder)
252 unsigned int uid;
253 intptr_t ref;
254 struct bitpack_d bp;
256 if (edge->indirect_unknown_callee)
257 streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
258 LTO_symtab_indirect_edge);
259 else
260 streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
261 LTO_symtab_edge);
263 ref = lto_symtab_encoder_lookup (encoder, edge->caller);
264 gcc_assert (ref != LCC_NOT_FOUND);
265 streamer_write_hwi_stream (ob->main_stream, ref);
267 if (!edge->indirect_unknown_callee)
269 ref = lto_symtab_encoder_lookup (encoder, edge->callee);
270 gcc_assert (ref != LCC_NOT_FOUND);
271 streamer_write_hwi_stream (ob->main_stream, ref);
274 streamer_write_gcov_count_stream (ob->main_stream, edge->count);
276 bp = bitpack_create (ob->main_stream);
277 uid = (!gimple_has_body_p (edge->caller->decl)
278 ? edge->lto_stmt_uid : gimple_uid (edge->call_stmt) + 1);
279 bp_pack_enum (&bp, cgraph_inline_failed_t,
280 CIF_N_REASONS, edge->inline_failed);
281 bp_pack_var_len_unsigned (&bp, uid);
282 bp_pack_var_len_unsigned (&bp, edge->frequency);
283 bp_pack_value (&bp, edge->indirect_inlining_edge, 1);
284 bp_pack_value (&bp, edge->speculative, 1);
285 bp_pack_value (&bp, edge->call_stmt_cannot_inline_p, 1);
286 bp_pack_value (&bp, edge->can_throw_external, 1);
287 if (edge->indirect_unknown_callee)
289 int flags = edge->indirect_info->ecf_flags;
290 bp_pack_value (&bp, (flags & ECF_CONST) != 0, 1);
291 bp_pack_value (&bp, (flags & ECF_PURE) != 0, 1);
292 bp_pack_value (&bp, (flags & ECF_NORETURN) != 0, 1);
293 bp_pack_value (&bp, (flags & ECF_MALLOC) != 0, 1);
294 bp_pack_value (&bp, (flags & ECF_NOTHROW) != 0, 1);
295 bp_pack_value (&bp, (flags & ECF_RETURNS_TWICE) != 0, 1);
296 /* Flags that should not appear on indirect calls. */
297 gcc_assert (!(flags & (ECF_LOOPING_CONST_OR_PURE
298 | ECF_MAY_BE_ALLOCA
299 | ECF_SIBCALL
300 | ECF_LEAF
301 | ECF_NOVOPS)));
303 streamer_write_bitpack (&bp);
304 if (edge->indirect_unknown_callee)
306 streamer_write_hwi_stream (ob->main_stream,
307 edge->indirect_info->common_target_id);
308 if (edge->indirect_info->common_target_id)
309 streamer_write_hwi_stream
310 (ob->main_stream, edge->indirect_info->common_target_probability);
314 /* Return if NODE contain references from other partitions. */
316 bool
317 referenced_from_other_partition_p (symtab_node *node, lto_symtab_encoder_t encoder)
319 int i;
320 struct ipa_ref *ref = NULL;
322 for (i = 0; node->iterate_referring (i, ref); i++)
324 if (ref->referring->in_other_partition
325 || !lto_symtab_encoder_in_partition_p (encoder, ref->referring))
326 return true;
328 return false;
331 /* Return true when node is reachable from other partition. */
333 bool
334 reachable_from_other_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder)
336 struct cgraph_edge *e;
337 if (!node->definition)
338 return false;
339 if (node->global.inlined_to)
340 return false;
341 for (e = node->callers; e; e = e->next_caller)
342 if (e->caller->in_other_partition
343 || !lto_symtab_encoder_in_partition_p (encoder, e->caller))
344 return true;
345 return false;
348 /* Return if NODE contain references from other partitions. */
350 bool
351 referenced_from_this_partition_p (symtab_node *node,
352 lto_symtab_encoder_t encoder)
354 int i;
355 struct ipa_ref *ref = NULL;
357 for (i = 0; node->iterate_referring (i, ref); i++)
358 if (lto_symtab_encoder_in_partition_p (encoder, ref->referring))
359 return true;
360 return false;
363 /* Return true when node is reachable from other partition. */
365 bool
366 reachable_from_this_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder)
368 struct cgraph_edge *e;
369 for (e = node->callers; e; e = e->next_caller)
370 if (lto_symtab_encoder_in_partition_p (encoder, e->caller))
371 return true;
372 return false;
375 /* Output the cgraph NODE to OB. ENCODER is used to find the
376 reference number of NODE->inlined_to. SET is the set of nodes we
377 are writing to the current file. If NODE is not in SET, then NODE
378 is a boundary of a cgraph_node_set and we pretend NODE just has a
379 decl and no callees. WRITTEN_DECLS is the set of FUNCTION_DECLs
380 that have had their callgraph node written so far. This is used to
381 determine if NODE is a clone of a previously written node. */
383 static void
384 lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
385 lto_symtab_encoder_t encoder)
387 unsigned int tag;
388 struct bitpack_d bp;
389 bool boundary_p;
390 intptr_t ref;
391 bool in_other_partition = false;
392 struct cgraph_node *clone_of, *ultimate_clone_of;
393 ipa_opt_pass_d *pass;
394 int i;
395 bool alias_p;
396 const char *comdat;
397 const char *section;
398 tree group;
400 boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node);
402 if (node->analyzed && !boundary_p)
403 tag = LTO_symtab_analyzed_node;
404 else
405 tag = LTO_symtab_unavail_node;
407 streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
408 tag);
409 streamer_write_hwi_stream (ob->main_stream, node->order);
411 /* In WPA mode, we only output part of the call-graph. Also, we
412 fake cgraph node attributes. There are two cases that we care.
414 Boundary nodes: There are nodes that are not part of SET but are
415 called from within SET. We artificially make them look like
416 externally visible nodes with no function body.
418 Cherry-picked nodes: These are nodes we pulled from other
419 translation units into SET during IPA-inlining. We make them as
420 local static nodes to prevent clashes with other local statics. */
421 if (boundary_p && node->analyzed
422 && node->get_partitioning_class () == SYMBOL_PARTITION)
424 /* Inline clones can not be part of boundary.
425 gcc_assert (!node->global.inlined_to);
427 FIXME: At the moment they can be, when partition contains an inline
428 clone that is clone of inline clone from outside partition. We can
429 reshape the clone tree and make other tree to be the root, but it
430 needs a bit extra work and will be promplty done by cgraph_remove_node
431 after reading back. */
432 in_other_partition = 1;
435 clone_of = node->clone_of;
436 while (clone_of
437 && (ref = lto_symtab_encoder_lookup (encoder, clone_of)) == LCC_NOT_FOUND)
438 if (clone_of->prev_sibling_clone)
439 clone_of = clone_of->prev_sibling_clone;
440 else
441 clone_of = clone_of->clone_of;
443 /* See if body of the master function is output. If not, we are seeing only
444 an declaration and we do not need to pass down clone tree. */
445 ultimate_clone_of = clone_of;
446 while (ultimate_clone_of && ultimate_clone_of->clone_of)
447 ultimate_clone_of = ultimate_clone_of->clone_of;
449 if (clone_of && !lto_symtab_encoder_encode_body_p (encoder, ultimate_clone_of))
450 clone_of = NULL;
452 if (tag == LTO_symtab_analyzed_node)
453 gcc_assert (clone_of || !node->clone_of);
454 if (!clone_of)
455 streamer_write_hwi_stream (ob->main_stream, LCC_NOT_FOUND);
456 else
457 streamer_write_hwi_stream (ob->main_stream, ref);
460 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, node->decl);
461 streamer_write_gcov_count_stream (ob->main_stream, node->count);
462 streamer_write_hwi_stream (ob->main_stream, node->count_materialization_scale);
464 streamer_write_hwi_stream (ob->main_stream,
465 node->ipa_transforms_to_apply.length ());
466 FOR_EACH_VEC_ELT (node->ipa_transforms_to_apply, i, pass)
467 streamer_write_hwi_stream (ob->main_stream, pass->static_pass_number);
469 if (tag == LTO_symtab_analyzed_node)
471 if (node->global.inlined_to)
473 ref = lto_symtab_encoder_lookup (encoder, node->global.inlined_to);
474 gcc_assert (ref != LCC_NOT_FOUND);
476 else
477 ref = LCC_NOT_FOUND;
479 streamer_write_hwi_stream (ob->main_stream, ref);
482 group = node->get_comdat_group ();
483 if (group)
484 comdat = IDENTIFIER_POINTER (group);
485 else
486 comdat = "";
487 streamer_write_data_stream (ob->main_stream, comdat, strlen (comdat) + 1);
489 if (group)
491 if (node->same_comdat_group && !boundary_p)
493 ref = lto_symtab_encoder_lookup (encoder,
494 node->same_comdat_group);
495 gcc_assert (ref != LCC_NOT_FOUND);
497 else
498 ref = LCC_NOT_FOUND;
499 streamer_write_hwi_stream (ob->main_stream, ref);
502 section = node->get_section ();
503 if (!section)
504 section = "";
506 streamer_write_hwi_stream (ob->main_stream, node->tp_first_run);
508 bp = bitpack_create (ob->main_stream);
509 bp_pack_value (&bp, node->local.local, 1);
510 bp_pack_value (&bp, node->externally_visible, 1);
511 bp_pack_value (&bp, node->no_reorder, 1);
512 bp_pack_value (&bp, node->definition, 1);
513 bp_pack_value (&bp, node->local.versionable, 1);
514 bp_pack_value (&bp, node->local.can_change_signature, 1);
515 bp_pack_value (&bp, node->local.redefined_extern_inline, 1);
516 bp_pack_value (&bp, node->force_output, 1);
517 bp_pack_value (&bp, node->forced_by_abi, 1);
518 bp_pack_value (&bp, node->unique_name, 1);
519 bp_pack_value (&bp, node->body_removed, 1);
520 bp_pack_value (&bp, node->implicit_section, 1);
521 bp_pack_value (&bp, node->address_taken, 1);
522 bp_pack_value (&bp, tag == LTO_symtab_analyzed_node
523 && node->get_partitioning_class () == SYMBOL_PARTITION
524 && (reachable_from_other_partition_p (node, encoder)
525 || referenced_from_other_partition_p (node, encoder)), 1);
526 bp_pack_value (&bp, node->lowered, 1);
527 bp_pack_value (&bp, in_other_partition, 1);
528 /* Real aliases in a boundary become non-aliases. However we still stream
529 alias info on weakrefs.
530 TODO: We lose a bit of information here - when we know that variable is
531 defined in other unit, we may use the info on aliases to resolve
532 symbol1 != symbol2 type tests that we can do only for locally defined objects
533 otherwise. */
534 alias_p = node->alias && (!boundary_p || node->weakref);
535 bp_pack_value (&bp, alias_p, 1);
536 bp_pack_value (&bp, node->weakref, 1);
537 bp_pack_value (&bp, node->frequency, 2);
538 bp_pack_value (&bp, node->only_called_at_startup, 1);
539 bp_pack_value (&bp, node->only_called_at_exit, 1);
540 bp_pack_value (&bp, node->tm_clone, 1);
541 bp_pack_value (&bp, node->calls_comdat_local, 1);
542 bp_pack_value (&bp, node->thunk.thunk_p && !boundary_p, 1);
543 bp_pack_enum (&bp, ld_plugin_symbol_resolution,
544 LDPR_NUM_KNOWN, node->resolution);
545 streamer_write_bitpack (&bp);
546 streamer_write_data_stream (ob->main_stream, section, strlen (section) + 1);
548 if (node->thunk.thunk_p && !boundary_p)
550 streamer_write_uhwi_stream
551 (ob->main_stream,
552 1 + (node->thunk.this_adjusting != 0) * 2
553 + (node->thunk.virtual_offset_p != 0) * 4);
554 streamer_write_uhwi_stream (ob->main_stream, node->thunk.fixed_offset);
555 streamer_write_uhwi_stream (ob->main_stream, node->thunk.virtual_value);
557 streamer_write_hwi_stream (ob->main_stream, node->profile_id);
558 if (DECL_STATIC_CONSTRUCTOR (node->decl))
559 streamer_write_hwi_stream (ob->main_stream, node->get_init_priority ());
560 if (DECL_STATIC_DESTRUCTOR (node->decl))
561 streamer_write_hwi_stream (ob->main_stream, node->get_fini_priority ());
564 /* Output the varpool NODE to OB.
565 If NODE is not in SET, then NODE is a boundary. */
567 static void
568 lto_output_varpool_node (struct lto_simple_output_block *ob, varpool_node *node,
569 lto_symtab_encoder_t encoder)
571 bool boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node);
572 struct bitpack_d bp;
573 int ref;
574 bool alias_p;
575 const char *comdat;
576 const char *section;
577 tree group;
579 streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
580 LTO_symtab_variable);
581 streamer_write_hwi_stream (ob->main_stream, node->order);
582 lto_output_var_decl_index (ob->decl_state, ob->main_stream, node->decl);
583 bp = bitpack_create (ob->main_stream);
584 bp_pack_value (&bp, node->externally_visible, 1);
585 bp_pack_value (&bp, node->no_reorder, 1);
586 bp_pack_value (&bp, node->force_output, 1);
587 bp_pack_value (&bp, node->forced_by_abi, 1);
588 bp_pack_value (&bp, node->unique_name, 1);
589 bp_pack_value (&bp, node->body_removed, 1);
590 bp_pack_value (&bp, node->implicit_section, 1);
591 bp_pack_value (&bp, node->writeonly, 1);
592 bp_pack_value (&bp, node->definition, 1);
593 alias_p = node->alias && (!boundary_p || node->weakref);
594 bp_pack_value (&bp, alias_p, 1);
595 bp_pack_value (&bp, node->weakref, 1);
596 bp_pack_value (&bp, node->analyzed && !boundary_p, 1);
597 gcc_assert (node->definition || !node->analyzed);
598 /* Constant pool initializers can be de-unified into individual ltrans units.
599 FIXME: Alternatively at -Os we may want to avoid generating for them the local
600 labels and share them across LTRANS partitions. */
601 if (node->get_partitioning_class () != SYMBOL_PARTITION)
603 bp_pack_value (&bp, 0, 1); /* used_from_other_parition. */
604 bp_pack_value (&bp, 0, 1); /* in_other_partition. */
606 else
608 bp_pack_value (&bp, node->definition
609 && referenced_from_other_partition_p (node, encoder), 1);
610 bp_pack_value (&bp, node->analyzed
611 && boundary_p && !DECL_EXTERNAL (node->decl), 1);
612 /* in_other_partition. */
614 bp_pack_value (&bp, node->tls_model, 3);
615 bp_pack_value (&bp, node->used_by_single_function, 1);
616 streamer_write_bitpack (&bp);
618 group = node->get_comdat_group ();
619 if (group)
620 comdat = IDENTIFIER_POINTER (group);
621 else
622 comdat = "";
623 streamer_write_data_stream (ob->main_stream, comdat, strlen (comdat) + 1);
625 if (group)
627 if (node->same_comdat_group && !boundary_p)
629 ref = lto_symtab_encoder_lookup (encoder,
630 node->same_comdat_group);
631 gcc_assert (ref != LCC_NOT_FOUND);
633 else
634 ref = LCC_NOT_FOUND;
635 streamer_write_hwi_stream (ob->main_stream, ref);
638 section = node->get_section ();
639 if (!section)
640 section = "";
641 streamer_write_data_stream (ob->main_stream, section, strlen (section) + 1);
643 streamer_write_enum (ob->main_stream, ld_plugin_symbol_resolution,
644 LDPR_NUM_KNOWN, node->resolution);
647 /* Output the varpool NODE to OB.
648 If NODE is not in SET, then NODE is a boundary. */
650 static void
651 lto_output_ref (struct lto_simple_output_block *ob, struct ipa_ref *ref,
652 lto_symtab_encoder_t encoder)
654 struct bitpack_d bp;
655 int nref;
656 int uid = ref->lto_stmt_uid;
657 struct cgraph_node *node;
659 bp = bitpack_create (ob->main_stream);
660 bp_pack_value (&bp, ref->use, 2);
661 bp_pack_value (&bp, ref->speculative, 1);
662 streamer_write_bitpack (&bp);
663 nref = lto_symtab_encoder_lookup (encoder, ref->referred);
664 gcc_assert (nref != LCC_NOT_FOUND);
665 streamer_write_hwi_stream (ob->main_stream, nref);
667 node = dyn_cast <cgraph_node *> (ref->referring);
668 if (node)
670 if (ref->stmt)
671 uid = gimple_uid (ref->stmt) + 1;
672 streamer_write_hwi_stream (ob->main_stream, uid);
676 /* Stream out profile_summary to OB. */
678 static void
679 output_profile_summary (struct lto_simple_output_block *ob)
681 unsigned h_ix;
682 struct bitpack_d bp;
684 if (profile_info)
686 /* We do not output num and run_max, they are not used by
687 GCC profile feedback and they are difficult to merge from multiple
688 units. */
689 gcc_assert (profile_info->runs);
690 streamer_write_uhwi_stream (ob->main_stream, profile_info->runs);
691 streamer_write_gcov_count_stream (ob->main_stream, profile_info->sum_max);
693 /* sum_all is needed for computing the working set with the
694 histogram. */
695 streamer_write_gcov_count_stream (ob->main_stream, profile_info->sum_all);
697 /* Create and output a bitpack of non-zero histogram entries indices. */
698 bp = bitpack_create (ob->main_stream);
699 for (h_ix = 0; h_ix < GCOV_HISTOGRAM_SIZE; h_ix++)
700 bp_pack_value (&bp, profile_info->histogram[h_ix].num_counters > 0, 1);
701 streamer_write_bitpack (&bp);
702 /* Now stream out only those non-zero entries. */
703 for (h_ix = 0; h_ix < GCOV_HISTOGRAM_SIZE; h_ix++)
705 if (!profile_info->histogram[h_ix].num_counters)
706 continue;
707 streamer_write_gcov_count_stream (ob->main_stream,
708 profile_info->histogram[h_ix].num_counters);
709 streamer_write_gcov_count_stream (ob->main_stream,
710 profile_info->histogram[h_ix].min_value);
711 streamer_write_gcov_count_stream (ob->main_stream,
712 profile_info->histogram[h_ix].cum_value);
714 /* IPA-profile computes hot bb threshold based on cumulated
715 whole program profile. We need to stream it down to ltrans. */
716 if (flag_wpa)
717 streamer_write_gcov_count_stream (ob->main_stream,
718 get_hot_bb_threshold ());
720 else
721 streamer_write_uhwi_stream (ob->main_stream, 0);
724 /* Output all callees or indirect outgoing edges. EDGE must be the first such
725 edge. */
727 static void
728 output_outgoing_cgraph_edges (struct cgraph_edge *edge,
729 struct lto_simple_output_block *ob,
730 lto_symtab_encoder_t encoder)
732 if (!edge)
733 return;
735 /* Output edges in backward direction, so the reconstructed callgraph match
736 and it is easy to associate call sites in the IPA pass summaries. */
737 while (edge->next_callee)
738 edge = edge->next_callee;
739 for (; edge; edge = edge->prev_callee)
740 lto_output_edge (ob, edge, encoder);
743 /* Output the part of the cgraph in SET. */
745 static void
746 output_refs (lto_symtab_encoder_t encoder)
748 lto_symtab_encoder_iterator lsei;
749 struct lto_simple_output_block *ob;
750 int count;
751 struct ipa_ref *ref;
752 int i;
754 ob = lto_create_simple_output_block (LTO_section_refs);
756 for (lsei = lsei_start_in_partition (encoder); !lsei_end_p (lsei);
757 lsei_next_in_partition (&lsei))
759 symtab_node *node = lsei_node (lsei);
761 count = node->ref_list.nreferences ();
762 if (count)
764 streamer_write_gcov_count_stream (ob->main_stream, count);
765 streamer_write_uhwi_stream (ob->main_stream,
766 lto_symtab_encoder_lookup (encoder, node));
767 for (i = 0; node->iterate_reference (i, ref); i++)
768 lto_output_ref (ob, ref, encoder);
772 streamer_write_uhwi_stream (ob->main_stream, 0);
774 lto_destroy_simple_output_block (ob);
777 /* Add NODE into encoder as well as nodes it is cloned from.
778 Do it in a way so clones appear first. */
780 static void
781 add_node_to (lto_symtab_encoder_t encoder, struct cgraph_node *node,
782 bool include_body)
784 if (node->clone_of)
785 add_node_to (encoder, node->clone_of, include_body);
786 else if (include_body)
787 lto_set_symtab_encoder_encode_body (encoder, node);
788 lto_symtab_encoder_encode (encoder, node);
791 /* Add all references in NODE to encoders. */
793 static void
794 create_references (lto_symtab_encoder_t encoder, symtab_node *node)
796 int i;
797 struct ipa_ref *ref = NULL;
798 for (i = 0; node->iterate_reference (i, ref); i++)
799 if (is_a <cgraph_node *> (ref->referred))
800 add_node_to (encoder, dyn_cast <cgraph_node *> (ref->referred), false);
801 else
802 lto_symtab_encoder_encode (encoder, ref->referred);
805 /* Find all symbols we want to stream into given partition and insert them
806 to encoders.
808 The function actually replaces IN_ENCODER by new one. The reason is that
809 streaming code needs clone's origin to be streamed before clone. This
810 means that we need to insert the nodes in specific order. This order is
811 ignored by the partitioning logic earlier. */
813 lto_symtab_encoder_t
814 compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
816 struct cgraph_edge *edge;
817 int i;
818 lto_symtab_encoder_t encoder;
819 lto_symtab_encoder_iterator lsei;
820 hash_set<void *> reachable_call_targets;
822 encoder = lto_symtab_encoder_new (false);
824 /* Go over all entries in the IN_ENCODER and duplicate them to
825 ENCODER. At the same time insert masters of clones so
826 every master appears before clone. */
827 for (lsei = lsei_start_function_in_partition (in_encoder);
828 !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei))
830 struct cgraph_node *node = lsei_cgraph_node (lsei);
831 add_node_to (encoder, node, true);
832 lto_set_symtab_encoder_in_partition (encoder, node);
833 create_references (encoder, node);
834 /* For proper debug info, we need to ship the origins, too. */
835 if (DECL_ABSTRACT_ORIGIN (node->decl))
837 struct cgraph_node *origin_node
838 = cgraph_node::get (DECL_ABSTRACT_ORIGIN (node->decl));
839 add_node_to (encoder, origin_node, true);
842 for (lsei = lsei_start_variable_in_partition (in_encoder);
843 !lsei_end_p (lsei); lsei_next_variable_in_partition (&lsei))
845 varpool_node *vnode = lsei_varpool_node (lsei);
847 lto_set_symtab_encoder_in_partition (encoder, vnode);
848 lto_set_symtab_encoder_encode_initializer (encoder, vnode);
849 create_references (encoder, vnode);
850 /* For proper debug info, we need to ship the origins, too. */
851 if (DECL_ABSTRACT_ORIGIN (vnode->decl))
853 varpool_node *origin_node
854 = varpool_node::get (DECL_ABSTRACT_ORIGIN (vnode->decl));
855 lto_set_symtab_encoder_in_partition (encoder, origin_node);
858 /* Pickle in also the initializer of all referenced readonly variables
859 to help folding. Constant pool variables are not shared, so we must
860 pickle those too. */
861 for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
863 symtab_node *node = lto_symtab_encoder_deref (encoder, i);
864 if (varpool_node *vnode = dyn_cast <varpool_node *> (node))
866 if (!lto_symtab_encoder_encode_initializer_p (encoder,
867 vnode)
868 && vnode->ctor_useable_for_folding_p ())
870 lto_set_symtab_encoder_encode_initializer (encoder, vnode);
871 create_references (encoder, vnode);
876 /* Go over all the nodes again to include callees that are not in
877 SET. */
878 for (lsei = lsei_start_function_in_partition (encoder);
879 !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei))
881 struct cgraph_node *node = lsei_cgraph_node (lsei);
882 for (edge = node->callees; edge; edge = edge->next_callee)
884 struct cgraph_node *callee = edge->callee;
885 if (!lto_symtab_encoder_in_partition_p (encoder, callee))
887 /* We should have moved all the inlines. */
888 gcc_assert (!callee->global.inlined_to);
889 add_node_to (encoder, callee, false);
892 /* Add all possible targets for late devirtualization. */
893 if (flag_devirtualize)
894 for (edge = node->indirect_calls; edge; edge = edge->next_callee)
895 if (edge->indirect_info->polymorphic)
897 unsigned int i;
898 void *cache_token;
899 bool final;
900 vec <cgraph_node *>targets
901 = possible_polymorphic_call_targets
902 (edge, &final, &cache_token);
903 if (!reachable_call_targets.add (cache_token))
905 for (i = 0; i < targets.length (); i++)
907 struct cgraph_node *callee = targets[i];
909 /* Adding an external declarations into the unit serves
910 no purpose and just increases its boundary. */
911 if (callee->definition
912 && !lto_symtab_encoder_in_partition_p
913 (encoder, callee))
915 gcc_assert (!callee->global.inlined_to);
916 add_node_to (encoder, callee, false);
922 lto_symtab_encoder_delete (in_encoder);
923 return encoder;
926 /* Output the part of the symtab in SET and VSET. */
928 void
929 output_symtab (void)
931 struct cgraph_node *node;
932 struct lto_simple_output_block *ob;
933 lto_symtab_encoder_iterator lsei;
934 int i, n_nodes;
935 lto_symtab_encoder_t encoder;
937 if (flag_wpa)
938 output_cgraph_opt_summary ();
940 ob = lto_create_simple_output_block (LTO_section_symtab_nodes);
942 output_profile_summary (ob);
944 /* An encoder for cgraph nodes should have been created by
945 ipa_write_summaries_1. */
946 gcc_assert (ob->decl_state->symtab_node_encoder);
947 encoder = ob->decl_state->symtab_node_encoder;
949 /* Write out the nodes. We must first output a node and then its clones,
950 otherwise at a time reading back the node there would be nothing to clone
951 from. */
952 n_nodes = lto_symtab_encoder_size (encoder);
953 for (i = 0; i < n_nodes; i++)
955 symtab_node *node = lto_symtab_encoder_deref (encoder, i);
956 if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node))
957 lto_output_node (ob, cnode, encoder);
958 else
959 lto_output_varpool_node (ob, dyn_cast<varpool_node *> (node), encoder);
962 /* Go over the nodes in SET again to write edges. */
963 for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
964 lsei_next_function_in_partition (&lsei))
966 node = lsei_cgraph_node (lsei);
967 output_outgoing_cgraph_edges (node->callees, ob, encoder);
968 output_outgoing_cgraph_edges (node->indirect_calls, ob, encoder);
971 streamer_write_uhwi_stream (ob->main_stream, 0);
973 lto_destroy_simple_output_block (ob);
975 /* Emit toplevel asms.
976 When doing WPA we must output every asm just once. Since we do not partition asm
977 nodes at all, output them to first output. This is kind of hack, but should work
978 well. */
979 if (!asm_nodes_output)
981 asm_nodes_output = true;
982 lto_output_toplevel_asms ();
985 output_refs (encoder);
988 /* Return identifier encoded in IB as a plain string. */
990 static tree
991 read_identifier (struct lto_input_block *ib)
993 unsigned int len = strnlen (ib->data + ib->p, ib->len - ib->p - 1);
994 tree id;
996 if (ib->data[ib->p + len])
997 lto_section_overrun (ib);
998 if (!len)
1000 ib->p++;
1001 return NULL;
1003 id = get_identifier (ib->data + ib->p);
1004 ib->p += len + 1;
1005 return id;
1008 /* Return string encoded in IB, NULL if string is empty. */
1010 static const char *
1011 read_string (struct lto_input_block *ib)
1013 unsigned int len = strnlen (ib->data + ib->p, ib->len - ib->p - 1);
1014 const char *str;
1016 if (ib->data[ib->p + len])
1017 lto_section_overrun (ib);
1018 if (!len)
1020 ib->p++;
1021 return NULL;
1023 str = ib->data + ib->p;
1024 ib->p += len + 1;
1025 return str;
1028 /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS,
1029 STACK_SIZE, SELF_TIME and SELF_SIZE. This is called either to initialize
1030 NODE or to replace the values in it, for instance because the first
1031 time we saw it, the function body was not available but now it
1032 is. BP is a bitpack with all the bitflags for NODE read from the
1033 stream. */
1035 static void
1036 input_overwrite_node (struct lto_file_decl_data *file_data,
1037 struct cgraph_node *node,
1038 enum LTO_symtab_tags tag,
1039 struct bitpack_d *bp)
1041 node->aux = (void *) tag;
1042 node->lto_file_data = file_data;
1044 node->local.local = bp_unpack_value (bp, 1);
1045 node->externally_visible = bp_unpack_value (bp, 1);
1046 node->no_reorder = bp_unpack_value (bp, 1);
1047 node->definition = bp_unpack_value (bp, 1);
1048 node->local.versionable = bp_unpack_value (bp, 1);
1049 node->local.can_change_signature = bp_unpack_value (bp, 1);
1050 node->local.redefined_extern_inline = bp_unpack_value (bp, 1);
1051 node->force_output = bp_unpack_value (bp, 1);
1052 node->forced_by_abi = bp_unpack_value (bp, 1);
1053 node->unique_name = bp_unpack_value (bp, 1);
1054 node->body_removed = bp_unpack_value (bp, 1);
1055 node->implicit_section = bp_unpack_value (bp, 1);
1056 node->address_taken = bp_unpack_value (bp, 1);
1057 node->used_from_other_partition = bp_unpack_value (bp, 1);
1058 node->lowered = bp_unpack_value (bp, 1);
1059 node->analyzed = tag == LTO_symtab_analyzed_node;
1060 node->in_other_partition = bp_unpack_value (bp, 1);
1061 if (node->in_other_partition
1062 /* Avoid updating decl when we are seeing just inline clone.
1063 When inlining function that has functions already inlined into it,
1064 we produce clones of inline clones.
1066 WPA partitioning might put each clone into different unit and
1067 we might end up streaming inline clone from other partition
1068 to support clone we are interested in. */
1069 && (!node->clone_of
1070 || node->clone_of->decl != node->decl))
1072 DECL_EXTERNAL (node->decl) = 1;
1073 TREE_STATIC (node->decl) = 0;
1075 node->alias = bp_unpack_value (bp, 1);
1076 node->weakref = bp_unpack_value (bp, 1);
1077 node->frequency = (enum node_frequency)bp_unpack_value (bp, 2);
1078 node->only_called_at_startup = bp_unpack_value (bp, 1);
1079 node->only_called_at_exit = bp_unpack_value (bp, 1);
1080 node->tm_clone = bp_unpack_value (bp, 1);
1081 node->calls_comdat_local = bp_unpack_value (bp, 1);
1082 node->thunk.thunk_p = bp_unpack_value (bp, 1);
1083 node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution,
1084 LDPR_NUM_KNOWN);
1085 gcc_assert (flag_ltrans
1086 || (!node->in_other_partition
1087 && !node->used_from_other_partition));
1090 /* Return string alias is alias of. */
1092 static tree
1093 get_alias_symbol (tree decl)
1095 tree alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
1096 return get_identifier (TREE_STRING_POINTER
1097 (TREE_VALUE (TREE_VALUE (alias))));
1100 /* Read a node from input_block IB. TAG is the node's tag just read.
1101 Return the node read or overwriten. */
1103 static struct cgraph_node *
1104 input_node (struct lto_file_decl_data *file_data,
1105 struct lto_input_block *ib,
1106 enum LTO_symtab_tags tag,
1107 vec<symtab_node *> nodes)
1109 gcc::pass_manager *passes = g->get_passes ();
1110 tree fn_decl;
1111 struct cgraph_node *node;
1112 struct bitpack_d bp;
1113 unsigned decl_index;
1114 int ref = LCC_NOT_FOUND, ref2 = LCC_NOT_FOUND;
1115 int clone_ref;
1116 int order;
1117 int i, count;
1118 tree group;
1119 const char *section;
1120 order = streamer_read_hwi (ib) + order_base;
1121 clone_ref = streamer_read_hwi (ib);
1123 decl_index = streamer_read_uhwi (ib);
1124 fn_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
1126 if (clone_ref != LCC_NOT_FOUND)
1128 node = dyn_cast<cgraph_node *> (nodes[clone_ref])->create_clone (fn_decl,
1129 0, CGRAPH_FREQ_BASE, false,
1130 vNULL, false, NULL, NULL);
1132 else
1134 /* Declaration of functions can be already merged with a declaration
1135 from other input file. We keep cgraph unmerged until after streaming
1136 of ipa passes is done. Alays forcingly create a fresh node. */
1137 node = symtab->create_empty ();
1138 node->decl = fn_decl;
1139 node->register_symbol ();
1142 node->order = order;
1143 if (order >= symtab->order)
1144 symtab->order = order + 1;
1146 node->count = streamer_read_gcov_count (ib);
1147 node->count_materialization_scale = streamer_read_hwi (ib);
1149 count = streamer_read_hwi (ib);
1150 node->ipa_transforms_to_apply = vNULL;
1151 for (i = 0; i < count; i++)
1153 opt_pass *pass;
1154 int pid = streamer_read_hwi (ib);
1156 gcc_assert (pid < passes->passes_by_id_size);
1157 pass = passes->passes_by_id[pid];
1158 node->ipa_transforms_to_apply.safe_push ((ipa_opt_pass_d *) pass);
1161 if (tag == LTO_symtab_analyzed_node)
1162 ref = streamer_read_hwi (ib);
1164 group = read_identifier (ib);
1165 if (group)
1166 ref2 = streamer_read_hwi (ib);
1168 /* Make sure that we have not read this node before. Nodes that
1169 have already been read will have their tag stored in the 'aux'
1170 field. Since built-in functions can be referenced in multiple
1171 functions, they are expected to be read more than once. */
1172 if (node->aux && !DECL_BUILT_IN (node->decl))
1173 internal_error ("bytecode stream: found multiple instances of cgraph "
1174 "node with uid %d", node->uid);
1176 node->tp_first_run = streamer_read_uhwi (ib);
1178 bp = streamer_read_bitpack (ib);
1180 input_overwrite_node (file_data, node, tag, &bp);
1182 /* Store a reference for now, and fix up later to be a pointer. */
1183 node->global.inlined_to = (cgraph_node *) (intptr_t) ref;
1185 if (group)
1187 node->set_comdat_group (group);
1188 /* Store a reference for now, and fix up later to be a pointer. */
1189 node->same_comdat_group = (symtab_node *) (intptr_t) ref2;
1191 else
1192 node->same_comdat_group = (symtab_node *) (intptr_t) LCC_NOT_FOUND;
1193 section = read_string (ib);
1194 if (section)
1195 node->set_section_for_node (section);
1197 if (node->thunk.thunk_p)
1199 int type = streamer_read_uhwi (ib);
1200 HOST_WIDE_INT fixed_offset = streamer_read_uhwi (ib);
1201 HOST_WIDE_INT virtual_value = streamer_read_uhwi (ib);
1203 node->thunk.fixed_offset = fixed_offset;
1204 node->thunk.this_adjusting = (type & 2);
1205 node->thunk.virtual_value = virtual_value;
1206 node->thunk.virtual_offset_p = (type & 4);
1208 if (node->alias && !node->analyzed && node->weakref)
1209 node->alias_target = get_alias_symbol (node->decl);
1210 node->profile_id = streamer_read_hwi (ib);
1211 if (DECL_STATIC_CONSTRUCTOR (node->decl))
1212 node->set_init_priority (streamer_read_hwi (ib));
1213 if (DECL_STATIC_DESTRUCTOR (node->decl))
1214 node->set_fini_priority (streamer_read_hwi (ib));
1215 return node;
1218 /* Read a node from input_block IB. TAG is the node's tag just read.
1219 Return the node read or overwriten. */
1221 static varpool_node *
1222 input_varpool_node (struct lto_file_decl_data *file_data,
1223 struct lto_input_block *ib)
1225 int decl_index;
1226 tree var_decl;
1227 varpool_node *node;
1228 struct bitpack_d bp;
1229 int ref = LCC_NOT_FOUND;
1230 int order;
1231 tree group;
1232 const char *section;
1234 order = streamer_read_hwi (ib) + order_base;
1235 decl_index = streamer_read_uhwi (ib);
1236 var_decl = lto_file_decl_data_get_var_decl (file_data, decl_index);
1238 /* Declaration of functions can be already merged with a declaration
1239 from other input file. We keep cgraph unmerged until after streaming
1240 of ipa passes is done. Alays forcingly create a fresh node. */
1241 node = varpool_node::create_empty ();
1242 node->decl = var_decl;
1243 node->register_symbol ();
1245 node->order = order;
1246 if (order >= symtab->order)
1247 symtab->order = order + 1;
1248 node->lto_file_data = file_data;
1250 bp = streamer_read_bitpack (ib);
1251 node->externally_visible = bp_unpack_value (&bp, 1);
1252 node->no_reorder = bp_unpack_value (&bp, 1);
1253 node->force_output = bp_unpack_value (&bp, 1);
1254 node->forced_by_abi = bp_unpack_value (&bp, 1);
1255 node->unique_name = bp_unpack_value (&bp, 1);
1256 node->body_removed = bp_unpack_value (&bp, 1);
1257 node->implicit_section = bp_unpack_value (&bp, 1);
1258 node->writeonly = bp_unpack_value (&bp, 1);
1259 node->definition = bp_unpack_value (&bp, 1);
1260 node->alias = bp_unpack_value (&bp, 1);
1261 node->weakref = bp_unpack_value (&bp, 1);
1262 node->analyzed = bp_unpack_value (&bp, 1);
1263 node->used_from_other_partition = bp_unpack_value (&bp, 1);
1264 node->in_other_partition = bp_unpack_value (&bp, 1);
1265 if (node->in_other_partition)
1267 DECL_EXTERNAL (node->decl) = 1;
1268 TREE_STATIC (node->decl) = 0;
1270 if (node->alias && !node->analyzed && node->weakref)
1271 node->alias_target = get_alias_symbol (node->decl);
1272 node->tls_model = (enum tls_model)bp_unpack_value (&bp, 3);
1273 node->used_by_single_function = (enum tls_model)bp_unpack_value (&bp, 1);
1274 group = read_identifier (ib);
1275 if (group)
1277 node->set_comdat_group (group);
1278 ref = streamer_read_hwi (ib);
1279 /* Store a reference for now, and fix up later to be a pointer. */
1280 node->same_comdat_group = (symtab_node *) (intptr_t) ref;
1282 else
1283 node->same_comdat_group = (symtab_node *) (intptr_t) LCC_NOT_FOUND;
1284 section = read_string (ib);
1285 if (section)
1286 node->set_section_for_node (section);
1287 node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution,
1288 LDPR_NUM_KNOWN);
1289 gcc_assert (flag_ltrans
1290 || (!node->in_other_partition
1291 && !node->used_from_other_partition));
1293 return node;
1296 /* Read a node from input_block IB. TAG is the node's tag just read.
1297 Return the node read or overwriten. */
1299 static void
1300 input_ref (struct lto_input_block *ib,
1301 symtab_node *referring_node,
1302 vec<symtab_node *> nodes)
1304 symtab_node *node = NULL;
1305 struct bitpack_d bp;
1306 enum ipa_ref_use use;
1307 bool speculative;
1308 struct ipa_ref *ref;
1310 bp = streamer_read_bitpack (ib);
1311 use = (enum ipa_ref_use) bp_unpack_value (&bp, 2);
1312 speculative = (enum ipa_ref_use) bp_unpack_value (&bp, 1);
1313 node = nodes[streamer_read_hwi (ib)];
1314 ref = referring_node->create_reference (node, use);
1315 ref->speculative = speculative;
1316 if (is_a <cgraph_node *> (referring_node))
1317 ref->lto_stmt_uid = streamer_read_hwi (ib);
1320 /* Read an edge from IB. NODES points to a vector of previously read nodes for
1321 decoding caller and callee of the edge to be read. If INDIRECT is true, the
1322 edge being read is indirect (in the sense that it has
1323 indirect_unknown_callee set). */
1325 static void
1326 input_edge (struct lto_input_block *ib, vec<symtab_node *> nodes,
1327 bool indirect)
1329 struct cgraph_node *caller, *callee;
1330 struct cgraph_edge *edge;
1331 unsigned int stmt_id;
1332 gcov_type count;
1333 int freq;
1334 cgraph_inline_failed_t inline_failed;
1335 struct bitpack_d bp;
1336 int ecf_flags = 0;
1338 caller = dyn_cast<cgraph_node *> (nodes[streamer_read_hwi (ib)]);
1339 if (caller == NULL || caller->decl == NULL_TREE)
1340 internal_error ("bytecode stream: no caller found while reading edge");
1342 if (!indirect)
1344 callee = dyn_cast<cgraph_node *> (nodes[streamer_read_hwi (ib)]);
1345 if (callee == NULL || callee->decl == NULL_TREE)
1346 internal_error ("bytecode stream: no callee found while reading edge");
1348 else
1349 callee = NULL;
1351 count = streamer_read_gcov_count (ib);
1353 bp = streamer_read_bitpack (ib);
1354 inline_failed = bp_unpack_enum (&bp, cgraph_inline_failed_t, CIF_N_REASONS);
1355 stmt_id = bp_unpack_var_len_unsigned (&bp);
1356 freq = (int) bp_unpack_var_len_unsigned (&bp);
1358 if (indirect)
1359 edge = caller->create_indirect_edge (NULL, 0, count, freq);
1360 else
1361 edge = caller->create_edge (callee, NULL, count, freq);
1363 edge->indirect_inlining_edge = bp_unpack_value (&bp, 1);
1364 edge->speculative = bp_unpack_value (&bp, 1);
1365 edge->lto_stmt_uid = stmt_id;
1366 edge->inline_failed = inline_failed;
1367 edge->call_stmt_cannot_inline_p = bp_unpack_value (&bp, 1);
1368 edge->can_throw_external = bp_unpack_value (&bp, 1);
1369 if (indirect)
1371 if (bp_unpack_value (&bp, 1))
1372 ecf_flags |= ECF_CONST;
1373 if (bp_unpack_value (&bp, 1))
1374 ecf_flags |= ECF_PURE;
1375 if (bp_unpack_value (&bp, 1))
1376 ecf_flags |= ECF_NORETURN;
1377 if (bp_unpack_value (&bp, 1))
1378 ecf_flags |= ECF_MALLOC;
1379 if (bp_unpack_value (&bp, 1))
1380 ecf_flags |= ECF_NOTHROW;
1381 if (bp_unpack_value (&bp, 1))
1382 ecf_flags |= ECF_RETURNS_TWICE;
1383 edge->indirect_info->ecf_flags = ecf_flags;
1384 edge->indirect_info->common_target_id = streamer_read_hwi (ib);
1385 if (edge->indirect_info->common_target_id)
1386 edge->indirect_info->common_target_probability = streamer_read_hwi (ib);
1391 /* Read a cgraph from IB using the info in FILE_DATA. */
1393 static vec<symtab_node *>
1394 input_cgraph_1 (struct lto_file_decl_data *file_data,
1395 struct lto_input_block *ib)
1397 enum LTO_symtab_tags tag;
1398 vec<symtab_node *> nodes = vNULL;
1399 symtab_node *node;
1400 unsigned i;
1402 tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag);
1403 order_base = symtab->order;
1404 while (tag)
1406 if (tag == LTO_symtab_edge)
1407 input_edge (ib, nodes, false);
1408 else if (tag == LTO_symtab_indirect_edge)
1409 input_edge (ib, nodes, true);
1410 else if (tag == LTO_symtab_variable)
1412 node = input_varpool_node (file_data, ib);
1413 nodes.safe_push (node);
1414 lto_symtab_encoder_encode (file_data->symtab_node_encoder, node);
1416 else
1418 node = input_node (file_data, ib, tag, nodes);
1419 if (node == NULL || node->decl == NULL_TREE)
1420 internal_error ("bytecode stream: found empty cgraph node");
1421 nodes.safe_push (node);
1422 lto_symtab_encoder_encode (file_data->symtab_node_encoder, node);
1425 tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag);
1428 lto_input_toplevel_asms (file_data, order_base);
1430 /* AUX pointers should be all non-zero for function nodes read from the stream. */
1431 #ifdef ENABLE_CHECKING
1432 FOR_EACH_VEC_ELT (nodes, i, node)
1433 gcc_assert (node->aux || !is_a <cgraph_node *> (node));
1434 #endif
1435 FOR_EACH_VEC_ELT (nodes, i, node)
1437 int ref;
1438 if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node))
1440 ref = (int) (intptr_t) cnode->global.inlined_to;
1442 /* We share declaration of builtins, so we may read same node twice. */
1443 if (!node->aux)
1444 continue;
1445 node->aux = NULL;
1447 /* Fixup inlined_to from reference to pointer. */
1448 if (ref != LCC_NOT_FOUND)
1449 dyn_cast<cgraph_node *> (node)->global.inlined_to
1450 = dyn_cast<cgraph_node *> (nodes[ref]);
1451 else
1452 cnode->global.inlined_to = NULL;
1455 ref = (int) (intptr_t) node->same_comdat_group;
1457 /* Fixup same_comdat_group from reference to pointer. */
1458 if (ref != LCC_NOT_FOUND)
1459 node->same_comdat_group = nodes[ref];
1460 else
1461 node->same_comdat_group = NULL;
1463 FOR_EACH_VEC_ELT (nodes, i, node)
1464 node->aux = is_a <cgraph_node *> (node) ? (void *)1 : NULL;
1465 return nodes;
1468 /* Input ipa_refs. */
1470 static void
1471 input_refs (struct lto_input_block *ib,
1472 vec<symtab_node *> nodes)
1474 int count;
1475 int idx;
1476 while (true)
1478 symtab_node *node;
1479 count = streamer_read_uhwi (ib);
1480 if (!count)
1481 break;
1482 idx = streamer_read_uhwi (ib);
1483 node = nodes[idx];
1484 while (count)
1486 input_ref (ib, node, nodes);
1487 count--;
1493 static struct gcov_ctr_summary lto_gcov_summary;
1495 /* Input profile_info from IB. */
1496 static void
1497 input_profile_summary (struct lto_input_block *ib,
1498 struct lto_file_decl_data *file_data)
1500 unsigned h_ix;
1501 struct bitpack_d bp;
1502 unsigned int runs = streamer_read_uhwi (ib);
1503 if (runs)
1505 file_data->profile_info.runs = runs;
1506 file_data->profile_info.sum_max = streamer_read_gcov_count (ib);
1507 file_data->profile_info.sum_all = streamer_read_gcov_count (ib);
1509 memset (file_data->profile_info.histogram, 0,
1510 sizeof (gcov_bucket_type) * GCOV_HISTOGRAM_SIZE);
1511 /* Input the bitpack of non-zero histogram indices. */
1512 bp = streamer_read_bitpack (ib);
1513 /* Read in and unpack the full bitpack, flagging non-zero
1514 histogram entries by setting the num_counters non-zero. */
1515 for (h_ix = 0; h_ix < GCOV_HISTOGRAM_SIZE; h_ix++)
1517 file_data->profile_info.histogram[h_ix].num_counters
1518 = bp_unpack_value (&bp, 1);
1520 for (h_ix = 0; h_ix < GCOV_HISTOGRAM_SIZE; h_ix++)
1522 if (!file_data->profile_info.histogram[h_ix].num_counters)
1523 continue;
1525 file_data->profile_info.histogram[h_ix].num_counters
1526 = streamer_read_gcov_count (ib);
1527 file_data->profile_info.histogram[h_ix].min_value
1528 = streamer_read_gcov_count (ib);
1529 file_data->profile_info.histogram[h_ix].cum_value
1530 = streamer_read_gcov_count (ib);
1532 /* IPA-profile computes hot bb threshold based on cumulated
1533 whole program profile. We need to stream it down to ltrans. */
1534 if (flag_ltrans)
1535 set_hot_bb_threshold (streamer_read_gcov_count (ib));
1540 /* Rescale profile summaries to the same number of runs in the whole unit. */
1542 static void
1543 merge_profile_summaries (struct lto_file_decl_data **file_data_vec)
1545 struct lto_file_decl_data *file_data;
1546 unsigned int j, h_ix;
1547 gcov_unsigned_t max_runs = 0;
1548 struct cgraph_node *node;
1549 struct cgraph_edge *edge;
1550 gcov_type saved_sum_all = 0;
1551 gcov_ctr_summary *saved_profile_info = 0;
1552 int saved_scale = 0;
1554 /* Find unit with maximal number of runs. If we ever get serious about
1555 roundoff errors, we might also consider computing smallest common
1556 multiply. */
1557 for (j = 0; (file_data = file_data_vec[j]) != NULL; j++)
1558 if (max_runs < file_data->profile_info.runs)
1559 max_runs = file_data->profile_info.runs;
1561 if (!max_runs)
1562 return;
1564 /* Simple overflow check. We probably don't need to support that many train
1565 runs. Such a large value probably imply data corruption anyway. */
1566 if (max_runs > INT_MAX / REG_BR_PROB_BASE)
1568 sorry ("At most %i profile runs is supported. Perhaps corrupted profile?",
1569 INT_MAX / REG_BR_PROB_BASE);
1570 return;
1573 profile_info = &lto_gcov_summary;
1574 lto_gcov_summary.runs = max_runs;
1575 lto_gcov_summary.sum_max = 0;
1576 memset (lto_gcov_summary.histogram, 0,
1577 sizeof (gcov_bucket_type) * GCOV_HISTOGRAM_SIZE);
1579 /* Rescale all units to the maximal number of runs.
1580 sum_max can not be easily merged, as we have no idea what files come from
1581 the same run. We do not use the info anyway, so leave it 0. */
1582 for (j = 0; (file_data = file_data_vec[j]) != NULL; j++)
1583 if (file_data->profile_info.runs)
1585 int scale = GCOV_COMPUTE_SCALE (max_runs,
1586 file_data->profile_info.runs);
1587 lto_gcov_summary.sum_max
1588 = MAX (lto_gcov_summary.sum_max,
1589 apply_scale (file_data->profile_info.sum_max, scale));
1590 lto_gcov_summary.sum_all
1591 = MAX (lto_gcov_summary.sum_all,
1592 apply_scale (file_data->profile_info.sum_all, scale));
1593 /* Save a pointer to the profile_info with the largest
1594 scaled sum_all and the scale for use in merging the
1595 histogram. */
1596 if (!saved_profile_info
1597 || lto_gcov_summary.sum_all > saved_sum_all)
1599 saved_profile_info = &file_data->profile_info;
1600 saved_sum_all = lto_gcov_summary.sum_all;
1601 saved_scale = scale;
1605 gcc_assert (saved_profile_info);
1607 /* Scale up the histogram from the profile that had the largest
1608 scaled sum_all above. */
1609 for (h_ix = 0; h_ix < GCOV_HISTOGRAM_SIZE; h_ix++)
1611 /* Scale up the min value as we did the corresponding sum_all
1612 above. Use that to find the new histogram index. */
1613 gcov_type scaled_min
1614 = apply_scale (saved_profile_info->histogram[h_ix].min_value,
1615 saved_scale);
1616 /* The new index may be shared with another scaled histogram entry,
1617 so we need to account for a non-zero histogram entry at new_ix. */
1618 unsigned new_ix = gcov_histo_index (scaled_min);
1619 lto_gcov_summary.histogram[new_ix].min_value
1620 = (lto_gcov_summary.histogram[new_ix].num_counters
1621 ? MIN (lto_gcov_summary.histogram[new_ix].min_value, scaled_min)
1622 : scaled_min);
1623 /* Some of the scaled counter values would ostensibly need to be placed
1624 into different (larger) histogram buckets, but we keep things simple
1625 here and place the scaled cumulative counter value in the bucket
1626 corresponding to the scaled minimum counter value. */
1627 lto_gcov_summary.histogram[new_ix].cum_value
1628 += apply_scale (saved_profile_info->histogram[h_ix].cum_value,
1629 saved_scale);
1630 lto_gcov_summary.histogram[new_ix].num_counters
1631 += saved_profile_info->histogram[h_ix].num_counters;
1634 /* Watch roundoff errors. */
1635 if (lto_gcov_summary.sum_max < max_runs)
1636 lto_gcov_summary.sum_max = max_runs;
1638 /* If merging already happent at WPA time, we are done. */
1639 if (flag_ltrans)
1640 return;
1642 /* Now compute count_materialization_scale of each node.
1643 During LTRANS we already have values of count_materialization_scale
1644 computed, so just update them. */
1645 FOR_EACH_FUNCTION (node)
1646 if (node->lto_file_data
1647 && node->lto_file_data->profile_info.runs)
1649 int scale;
1651 scale = RDIV (node->count_materialization_scale * max_runs,
1652 node->lto_file_data->profile_info.runs);
1653 node->count_materialization_scale = scale;
1654 if (scale < 0)
1655 fatal_error ("Profile information in %s corrupted",
1656 file_data->file_name);
1658 if (scale == REG_BR_PROB_BASE)
1659 continue;
1660 for (edge = node->callees; edge; edge = edge->next_callee)
1661 edge->count = apply_scale (edge->count, scale);
1662 node->count = apply_scale (node->count, scale);
1666 /* Input and merge the symtab from each of the .o files passed to
1667 lto1. */
1669 void
1670 input_symtab (void)
1672 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
1673 struct lto_file_decl_data *file_data;
1674 unsigned int j = 0;
1675 struct cgraph_node *node;
1677 while ((file_data = file_data_vec[j++]))
1679 const char *data;
1680 size_t len;
1681 struct lto_input_block *ib;
1682 vec<symtab_node *> nodes;
1684 ib = lto_create_simple_input_block (file_data, LTO_section_symtab_nodes,
1685 &data, &len);
1686 if (!ib)
1687 fatal_error ("cannot find LTO cgraph in %s", file_data->file_name);
1688 input_profile_summary (ib, file_data);
1689 file_data->symtab_node_encoder = lto_symtab_encoder_new (true);
1690 nodes = input_cgraph_1 (file_data, ib);
1691 lto_destroy_simple_input_block (file_data, LTO_section_symtab_nodes,
1692 ib, data, len);
1694 ib = lto_create_simple_input_block (file_data, LTO_section_refs,
1695 &data, &len);
1696 if (!ib)
1697 fatal_error ("cannot find LTO section refs in %s",
1698 file_data->file_name);
1699 input_refs (ib, nodes);
1700 lto_destroy_simple_input_block (file_data, LTO_section_refs,
1701 ib, data, len);
1702 if (flag_ltrans)
1703 input_cgraph_opt_summary (nodes);
1704 nodes.release ();
1707 merge_profile_summaries (file_data_vec);
1708 get_working_sets ();
1711 /* Clear out the aux field that was used to store enough state to
1712 tell which nodes should be overwritten. */
1713 FOR_EACH_FUNCTION (node)
1715 /* Some nodes may have been created by cgraph_node. This
1716 happens when the callgraph contains nested functions. If the
1717 node for the parent function was never emitted to the gimple
1718 file, cgraph_node will create a node for it when setting the
1719 context of the nested function. */
1720 if (node->lto_file_data)
1721 node->aux = NULL;
1725 /* True when we need optimization summary for NODE. */
1727 static int
1728 output_cgraph_opt_summary_p (struct cgraph_node *node)
1730 return (node->clone_of
1731 && (node->clone.tree_map
1732 || node->clone.args_to_skip
1733 || node->clone.combined_args_to_skip));
1736 /* Output optimization summary for EDGE to OB. */
1737 static void
1738 output_edge_opt_summary (struct output_block *ob ATTRIBUTE_UNUSED,
1739 struct cgraph_edge *edge ATTRIBUTE_UNUSED)
1743 /* Output optimization summary for NODE to OB. */
1745 static void
1746 output_node_opt_summary (struct output_block *ob,
1747 struct cgraph_node *node,
1748 lto_symtab_encoder_t encoder)
1750 unsigned int index;
1751 bitmap_iterator bi;
1752 struct ipa_replace_map *map;
1753 struct bitpack_d bp;
1754 int i;
1755 struct cgraph_edge *e;
1757 if (node->clone.args_to_skip)
1759 streamer_write_uhwi (ob, bitmap_count_bits (node->clone.args_to_skip));
1760 EXECUTE_IF_SET_IN_BITMAP (node->clone.args_to_skip, 0, index, bi)
1761 streamer_write_uhwi (ob, index);
1763 else
1764 streamer_write_uhwi (ob, 0);
1765 if (node->clone.combined_args_to_skip)
1767 streamer_write_uhwi (ob, bitmap_count_bits (node->clone.combined_args_to_skip));
1768 EXECUTE_IF_SET_IN_BITMAP (node->clone.combined_args_to_skip, 0, index, bi)
1769 streamer_write_uhwi (ob, index);
1771 else
1772 streamer_write_uhwi (ob, 0);
1773 streamer_write_uhwi (ob, vec_safe_length (node->clone.tree_map));
1774 FOR_EACH_VEC_SAFE_ELT (node->clone.tree_map, i, map)
1776 /* At the moment we assume all old trees to be PARM_DECLs, because we have no
1777 mechanism to store function local declarations into summaries. */
1778 gcc_assert (!map->old_tree);
1779 streamer_write_uhwi (ob, map->parm_num);
1780 gcc_assert (EXPR_LOCATION (map->new_tree) == UNKNOWN_LOCATION);
1781 stream_write_tree (ob, map->new_tree, true);
1782 bp = bitpack_create (ob->main_stream);
1783 bp_pack_value (&bp, map->replace_p, 1);
1784 bp_pack_value (&bp, map->ref_p, 1);
1785 streamer_write_bitpack (&bp);
1788 if (lto_symtab_encoder_in_partition_p (encoder, node))
1790 for (e = node->callees; e; e = e->next_callee)
1791 output_edge_opt_summary (ob, e);
1792 for (e = node->indirect_calls; e; e = e->next_callee)
1793 output_edge_opt_summary (ob, e);
1797 /* Output optimization summaries stored in callgraph.
1798 At the moment it is the clone info structure. */
1800 static void
1801 output_cgraph_opt_summary (void)
1803 int i, n_nodes;
1804 lto_symtab_encoder_t encoder;
1805 struct output_block *ob = create_output_block (LTO_section_cgraph_opt_sum);
1806 unsigned count = 0;
1808 ob->symbol = NULL;
1809 encoder = ob->decl_state->symtab_node_encoder;
1810 n_nodes = lto_symtab_encoder_size (encoder);
1811 for (i = 0; i < n_nodes; i++)
1813 symtab_node *node = lto_symtab_encoder_deref (encoder, i);
1814 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1815 if (cnode && output_cgraph_opt_summary_p (cnode))
1816 count++;
1818 streamer_write_uhwi (ob, count);
1819 for (i = 0; i < n_nodes; i++)
1821 symtab_node *node = lto_symtab_encoder_deref (encoder, i);
1822 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1823 if (cnode && output_cgraph_opt_summary_p (cnode))
1825 streamer_write_uhwi (ob, i);
1826 output_node_opt_summary (ob, cnode, encoder);
1829 produce_asm (ob, NULL);
1830 destroy_output_block (ob);
1833 /* Input optimisation summary of EDGE. */
1835 static void
1836 input_edge_opt_summary (struct cgraph_edge *edge ATTRIBUTE_UNUSED,
1837 struct lto_input_block *ib_main ATTRIBUTE_UNUSED)
1841 /* Input optimisation summary of NODE. */
1843 static void
1844 input_node_opt_summary (struct cgraph_node *node,
1845 struct lto_input_block *ib_main,
1846 struct data_in *data_in)
1848 int i;
1849 int count;
1850 int bit;
1851 struct bitpack_d bp;
1852 struct cgraph_edge *e;
1854 count = streamer_read_uhwi (ib_main);
1855 if (count)
1856 node->clone.args_to_skip = BITMAP_GGC_ALLOC ();
1857 for (i = 0; i < count; i++)
1859 bit = streamer_read_uhwi (ib_main);
1860 bitmap_set_bit (node->clone.args_to_skip, bit);
1862 count = streamer_read_uhwi (ib_main);
1863 if (count)
1864 node->clone.combined_args_to_skip = BITMAP_GGC_ALLOC ();
1865 for (i = 0; i < count; i++)
1867 bit = streamer_read_uhwi (ib_main);
1868 bitmap_set_bit (node->clone.combined_args_to_skip, bit);
1870 count = streamer_read_uhwi (ib_main);
1871 for (i = 0; i < count; i++)
1873 struct ipa_replace_map *map = ggc_alloc<ipa_replace_map> ();
1875 vec_safe_push (node->clone.tree_map, map);
1876 map->parm_num = streamer_read_uhwi (ib_main);
1877 map->old_tree = NULL;
1878 map->new_tree = stream_read_tree (ib_main, data_in);
1879 bp = streamer_read_bitpack (ib_main);
1880 map->replace_p = bp_unpack_value (&bp, 1);
1881 map->ref_p = bp_unpack_value (&bp, 1);
1883 for (e = node->callees; e; e = e->next_callee)
1884 input_edge_opt_summary (e, ib_main);
1885 for (e = node->indirect_calls; e; e = e->next_callee)
1886 input_edge_opt_summary (e, ib_main);
1889 /* Read section in file FILE_DATA of length LEN with data DATA. */
1891 static void
1892 input_cgraph_opt_section (struct lto_file_decl_data *file_data,
1893 const char *data, size_t len,
1894 vec<symtab_node *> nodes)
1896 const struct lto_function_header *header =
1897 (const struct lto_function_header *) data;
1898 const int cfg_offset = sizeof (struct lto_function_header);
1899 const int main_offset = cfg_offset + header->cfg_size;
1900 const int string_offset = main_offset + header->main_size;
1901 struct data_in *data_in;
1902 unsigned int i;
1903 unsigned int count;
1905 lto_input_block ib_main ((const char *) data + main_offset,
1906 header->main_size);
1908 data_in =
1909 lto_data_in_create (file_data, (const char *) data + string_offset,
1910 header->string_size, vNULL);
1911 count = streamer_read_uhwi (&ib_main);
1913 for (i = 0; i < count; i++)
1915 int ref = streamer_read_uhwi (&ib_main);
1916 input_node_opt_summary (dyn_cast<cgraph_node *> (nodes[ref]),
1917 &ib_main, data_in);
1919 lto_free_section_data (file_data, LTO_section_cgraph_opt_sum, NULL, data,
1920 len);
1921 lto_data_in_delete (data_in);
1924 /* Input optimization summary of cgraph. */
1926 static void
1927 input_cgraph_opt_summary (vec<symtab_node *> nodes)
1929 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
1930 struct lto_file_decl_data *file_data;
1931 unsigned int j = 0;
1933 while ((file_data = file_data_vec[j++]))
1935 size_t len;
1936 const char *data =
1937 lto_get_section_data (file_data, LTO_section_cgraph_opt_sum, NULL,
1938 &len);
1940 if (data)
1941 input_cgraph_opt_section (file_data, data, len, nodes);