re PR lto/48538 (profiled LTO bootstrap failure with Ada)
[gcc.git] / gcc / lto-cgraph.c
1 /* Write and read the cgraph to the memory mapped representation of a
2 .o file.
3
4 Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
5 Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
6
7 This file is part of GCC.
8
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.
13
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.
18
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/>. */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
28 #include "expr.h"
29 #include "flags.h"
30 #include "params.h"
31 #include "input.h"
32 #include "hashtab.h"
33 #include "langhooks.h"
34 #include "basic-block.h"
35 #include "tree-flow.h"
36 #include "cgraph.h"
37 #include "function.h"
38 #include "ggc.h"
39 #include "diagnostic-core.h"
40 #include "except.h"
41 #include "vec.h"
42 #include "timevar.h"
43 #include "output.h"
44 #include "pointer-set.h"
45 #include "lto-streamer.h"
46 #include "gcov-io.h"
47
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);
51
52
53 /* Cgraph streaming is organized as set of record whose type
54 is indicated by a tag. */
55 enum LTO_cgraph_tags
56 {
57 /* Must leave 0 for the stopper. */
58
59 /* Cgraph node without body available. */
60 LTO_cgraph_unavail_node = 1,
61 /* Cgraph node with function body. */
62 LTO_cgraph_analyzed_node,
63 /* Cgraph edges. */
64 LTO_cgraph_edge,
65 LTO_cgraph_indirect_edge
66 };
67
68 /* Create a new cgraph encoder. */
69
70 lto_cgraph_encoder_t
71 lto_cgraph_encoder_new (void)
72 {
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 ();
77 return encoder;
78 }
79
80
81 /* Delete ENCODER and its components. */
82
83 void
84 lto_cgraph_encoder_delete (lto_cgraph_encoder_t encoder)
85 {
86 VEC_free (cgraph_node_ptr, heap, encoder->nodes);
87 pointer_map_destroy (encoder->map);
88 pointer_set_destroy (encoder->body);
89 free (encoder);
90 }
91
92
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
95 NODE is encoded. */
96
97 int
98 lto_cgraph_encoder_encode (lto_cgraph_encoder_t encoder,
99 struct cgraph_node *node)
100 {
101 int ref;
102 void **slot;
103
104 slot = pointer_map_contains (encoder->map, node);
105 if (!slot)
106 {
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);
111 }
112 else
113 ref = (int) (intptr_t) *slot;
114
115 return ref;
116 }
117
118 #define LCC_NOT_FOUND (-1)
119
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. */
122
123 int
124 lto_cgraph_encoder_lookup (lto_cgraph_encoder_t encoder,
125 struct cgraph_node *node)
126 {
127 void **slot = pointer_map_contains (encoder->map, node);
128 return (slot ? (int) (intptr_t) *slot : LCC_NOT_FOUND);
129 }
130
131
132 /* Return the cgraph node corresponding to REF using ENCODER. */
133
134 struct cgraph_node *
135 lto_cgraph_encoder_deref (lto_cgraph_encoder_t encoder, int ref)
136 {
137 if (ref == LCC_NOT_FOUND)
138 return NULL;
139
140 return VEC_index (cgraph_node_ptr, encoder->nodes, ref);
141 }
142
143
144 /* Return TRUE if we should encode initializer of NODE (if any). */
145
146 bool
147 lto_cgraph_encoder_encode_body_p (lto_cgraph_encoder_t encoder,
148 struct cgraph_node *node)
149 {
150 return pointer_set_contains (encoder->body, node);
151 }
152
153 /* Return TRUE if we should encode body of NODE (if any). */
154
155 static void
156 lto_set_cgraph_encoder_encode_body (lto_cgraph_encoder_t encoder,
157 struct cgraph_node *node)
158 {
159 pointer_set_insert (encoder->body, node);
160 }
161
162 /* Create a new varpool encoder. */
163
164 lto_varpool_encoder_t
165 lto_varpool_encoder_new (void)
166 {
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;
171 return encoder;
172 }
173
174
175 /* Delete ENCODER and its components. */
176
177 void
178 lto_varpool_encoder_delete (lto_varpool_encoder_t encoder)
179 {
180 VEC_free (varpool_node_ptr, heap, encoder->nodes);
181 pointer_map_destroy (encoder->map);
182 pointer_set_destroy (encoder->initializer);
183 free (encoder);
184 }
185
186
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
189 NODE is encoded. */
190
191 int
192 lto_varpool_encoder_encode (lto_varpool_encoder_t encoder,
193 struct varpool_node *node)
194 {
195 int ref;
196 void **slot;
197
198 slot = pointer_map_contains (encoder->map, node);
199 if (!slot)
200 {
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);
205 }
206 else
207 ref = (int) (intptr_t) *slot;
208
209 return ref;
210 }
211
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. */
214
215 int
216 lto_varpool_encoder_lookup (lto_varpool_encoder_t encoder,
217 struct varpool_node *node)
218 {
219 void **slot = pointer_map_contains (encoder->map, node);
220 return (slot ? (int) (intptr_t) *slot : LCC_NOT_FOUND);
221 }
222
223
224 /* Return the varpool node corresponding to REF using ENCODER. */
225
226 struct varpool_node *
227 lto_varpool_encoder_deref (lto_varpool_encoder_t encoder, int ref)
228 {
229 if (ref == LCC_NOT_FOUND)
230 return NULL;
231
232 return VEC_index (varpool_node_ptr, encoder->nodes, ref);
233 }
234
235
236 /* Return TRUE if we should encode initializer of NODE (if any). */
237
238 bool
239 lto_varpool_encoder_encode_initializer_p (lto_varpool_encoder_t encoder,
240 struct varpool_node *node)
241 {
242 return pointer_set_contains (encoder->initializer, node);
243 }
244
245 /* Return TRUE if we should encode initializer of NODE (if any). */
246
247 static void
248 lto_set_varpool_encoder_encode_initializer (lto_varpool_encoder_t encoder,
249 struct varpool_node *node)
250 {
251 pointer_set_insert (encoder->initializer, node);
252 }
253
254 /* Output the cgraph EDGE to OB using ENCODER. */
255
256 static void
257 lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge,
258 lto_cgraph_encoder_t encoder)
259 {
260 unsigned int uid;
261 intptr_t ref;
262 struct bitpack_d bp;
263
264 if (edge->indirect_unknown_callee)
265 lto_output_uleb128_stream (ob->main_stream, LTO_cgraph_indirect_edge);
266 else
267 lto_output_uleb128_stream (ob->main_stream, LTO_cgraph_edge);
268
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);
272
273 if (!edge->indirect_unknown_callee)
274 {
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);
278 }
279
280 lto_output_sleb128_stream (ob->main_stream, edge->count);
281
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)
295 {
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
305 | ECF_MAY_BE_ALLOCA
306 | ECF_SIBCALL
307 | ECF_LEAF
308 | ECF_NOVOPS)));
309 }
310 lto_output_bitpack (&bp);
311 }
312
313 /* Return if LIST contain references from other partitions. */
314
315 bool
316 referenced_from_other_partition_p (struct ipa_ref_list *list, cgraph_node_set set,
317 varpool_node_set vset)
318 {
319 int i;
320 struct ipa_ref *ref;
321 for (i = 0; ipa_ref_list_refering_iterate (list, i, ref); i++)
322 {
323 if (ref->refering_type == IPA_REF_CGRAPH)
324 {
325 if (ipa_ref_refering_node (ref)->in_other_partition
326 || !cgraph_node_in_set_p (ipa_ref_refering_node (ref), set))
327 return true;
328 }
329 else
330 {
331 if (ipa_ref_refering_varpool_node (ref)->in_other_partition
332 || !varpool_node_in_set_p (ipa_ref_refering_varpool_node (ref),
333 vset))
334 return true;
335 }
336 }
337 return false;
338 }
339
340 /* Return true when node is reachable from other partition. */
341
342 bool
343 reachable_from_other_partition_p (struct cgraph_node *node, cgraph_node_set set)
344 {
345 struct cgraph_edge *e;
346 if (!node->analyzed)
347 return false;
348 if (node->global.inlined_to)
349 return false;
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))
353 return true;
354 return false;
355 }
356
357 /* Return if LIST contain references from other partitions. */
358
359 bool
360 referenced_from_this_partition_p (struct ipa_ref_list *list, cgraph_node_set set,
361 varpool_node_set vset)
362 {
363 int i;
364 struct ipa_ref *ref;
365 for (i = 0; ipa_ref_list_refering_iterate (list, i, ref); i++)
366 {
367 if (ref->refering_type == IPA_REF_CGRAPH)
368 {
369 if (cgraph_node_in_set_p (ipa_ref_refering_node (ref), set))
370 return true;
371 }
372 else
373 {
374 if (varpool_node_in_set_p (ipa_ref_refering_varpool_node (ref),
375 vset))
376 return true;
377 }
378 }
379 return false;
380 }
381
382 /* Return true when node is reachable from other partition. */
383
384 bool
385 reachable_from_this_partition_p (struct cgraph_node *node, cgraph_node_set set)
386 {
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))
390 return true;
391 return false;
392 }
393
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. */
401
402 static void
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)
406 {
407 unsigned int tag;
408 struct bitpack_d bp;
409 bool boundary_p;
410 intptr_t ref;
411 bool in_other_partition = false;
412 struct cgraph_node *clone_of;
413
414 boundary_p = !cgraph_node_in_set_p (node, set);
415
416 if (node->analyzed && !boundary_p)
417 tag = LTO_cgraph_analyzed_node;
418 else
419 tag = LTO_cgraph_unavail_node;
420
421 lto_output_uleb128_stream (ob->main_stream, tag);
422
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.
425
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.
429
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)
434 {
435 /* Inline clones can not be part of boundary.
436 gcc_assert (!node->global.inlined_to);
437
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;
444 }
445
446 clone_of = node->clone_of;
447 while (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;
451 else
452 clone_of = clone_of->clone_of;
453
454 if (LTO_cgraph_analyzed_node)
455 gcc_assert (clone_of || !node->clone_of);
456 if (!clone_of)
457 lto_output_sleb128_stream (ob->main_stream, LCC_NOT_FOUND);
458 else
459 lto_output_sleb128_stream (ob->main_stream, ref);
460
461
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);
465
466 if (tag == LTO_cgraph_analyzed_node)
467 {
468 if (node->global.inlined_to)
469 {
470 ref = lto_cgraph_encoder_lookup (encoder, node->global.inlined_to);
471 gcc_assert (ref != LCC_NOT_FOUND);
472 }
473 else
474 ref = LCC_NOT_FOUND;
475
476 lto_output_sleb128_stream (ob->main_stream, ref);
477 }
478
479 if (node->same_comdat_group && !boundary_p)
480 {
481 ref = lto_cgraph_encoder_lookup (encoder, node->same_comdat_group);
482 gcc_assert (ref != LCC_NOT_FOUND);
483 }
484 else
485 ref = LCC_NOT_FOUND;
486 lto_output_sleb128_stream (ob->main_stream, ref);
487
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);
512
513 if (node->same_body)
514 {
515 struct cgraph_node *alias;
516 unsigned long alias_count = 1;
517 for (alias = node->same_body; alias->next; alias = alias->next)
518 alias_count++;
519 lto_output_uleb128_stream (ob->main_stream, alias_count);
520 do
521 {
522 lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
523 alias->decl);
524 if (alias->thunk.thunk_p)
525 {
526 lto_output_uleb128_stream
527 (ob->main_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,
535 alias->thunk.alias);
536 }
537 else
538 {
539 lto_output_uleb128_stream (ob->main_stream, 0);
540 lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
541 alias->thunk.alias);
542 }
543 gcc_assert (cgraph_get_node (alias->thunk.alias) == node);
544 lto_output_uleb128_stream (ob->main_stream, alias->resolution);
545 alias = alias->previous;
546 }
547 while (alias);
548 }
549 else
550 lto_output_uleb128_stream (ob->main_stream, 0);
551 }
552
553 /* Output the varpool NODE to OB.
554 If NODE is not in SET, then NODE is a boundary. */
555
556 static void
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)
560 {
561 bool boundary_p = !varpool_node_in_set_p (node, vset) && node->analyzed;
562 struct bitpack_d bp;
563 struct varpool_node *alias;
564 int count = 0;
565 int ref;
566
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))
581 {
582 bp_pack_value (&bp, 0, 1); /* used_from_other_parition. */
583 bp_pack_value (&bp, 0, 1); /* in_other_partition. */
584 }
585 else
586 {
587 bp_pack_value (&bp, node->analyzed
588 && referenced_from_other_partition_p (&node->ref_list,
589 set, vset), 1);
590 bp_pack_value (&bp, boundary_p, 1); /* in_other_partition. */
591 }
592 /* Also emit any extra name aliases. */
593 for (alias = node->extra_name; alias; alias = alias->next)
594 count++;
595 bp_pack_value (&bp, count != 0, 1);
596 lto_output_bitpack (&bp);
597 if (node->same_comdat_group && !boundary_p)
598 {
599 ref = lto_varpool_encoder_lookup (varpool_encoder, node->same_comdat_group);
600 gcc_assert (ref != LCC_NOT_FOUND);
601 }
602 else
603 ref = LCC_NOT_FOUND;
604 lto_output_sleb128_stream (ob->main_stream, ref);
605 lto_output_uleb128_stream (ob->main_stream, node->resolution);
606
607 if (count)
608 {
609 lto_output_uleb128_stream (ob->main_stream, count);
610 for (alias = node->extra_name; alias; alias = alias->next)
611 {
612 lto_output_var_decl_index (ob->decl_state, ob->main_stream, alias->decl);
613 lto_output_uleb128_stream (ob->main_stream, alias->resolution);
614 }
615 }
616 }
617
618 /* Output the varpool NODE to OB.
619 If NODE is not in SET, then NODE is a boundary. */
620
621 static void
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)
625 {
626 struct bitpack_d bp;
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)
632 {
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);
636 }
637 else
638 {
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);
643 }
644 }
645
646 /* Stream out profile_summary to OB. */
647
648 static void
649 output_profile_summary (struct lto_simple_output_block *ob)
650 {
651 if (profile_info)
652 {
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
655 units. */
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);
659 }
660 else
661 lto_output_uleb128_stream (ob->main_stream, 0);
662 }
663
664 /* Add NODE into encoder as well as nodes it is cloned from.
665 Do it in a way so clones appear first. */
666
667 static void
668 add_node_to (lto_cgraph_encoder_t encoder, struct cgraph_node *node,
669 bool include_body)
670 {
671 if (node->clone_of)
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);
676 }
677
678 /* Add all references in LIST to encoders. */
679
680 static void
681 add_references (lto_cgraph_encoder_t encoder,
682 lto_varpool_encoder_t varpool_encoder,
683 struct ipa_ref_list *list)
684 {
685 int i;
686 struct ipa_ref *ref;
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);
690 else
691 {
692 struct varpool_node *vnode = ipa_ref_varpool_node (ref);
693 lto_varpool_encoder_encode (varpool_encoder, vnode);
694 }
695 }
696
697 /* Output all callees or indirect outgoing edges. EDGE must be the first such
698 edge. */
699
700 static void
701 output_outgoing_cgraph_edges (struct cgraph_edge *edge,
702 struct lto_simple_output_block *ob,
703 lto_cgraph_encoder_t encoder)
704 {
705 if (!edge)
706 return;
707
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);
714 }
715
716 /* Output the part of the cgraph in SET. */
717
718 static void
719 output_refs (cgraph_node_set set, varpool_node_set vset,
720 lto_cgraph_encoder_t encoder,
721 lto_varpool_encoder_t varpool_encoder)
722 {
723 cgraph_node_set_iterator csi;
724 varpool_node_set_iterator vsi;
725 struct lto_simple_output_block *ob;
726 int count;
727 struct ipa_ref *ref;
728 int i;
729
730 ob = lto_create_simple_output_block (LTO_section_refs);
731
732 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
733 {
734 struct cgraph_node *node = csi_node (csi);
735
736 count = ipa_ref_list_nreferences (&node->ref_list);
737 if (count)
738 {
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);
744 }
745 }
746
747 lto_output_uleb128_stream (ob->main_stream, 0);
748
749 for (vsi = vsi_start (vset); !vsi_end_p (vsi); vsi_next (&vsi))
750 {
751 struct varpool_node *node = vsi_node (vsi);
752
753 count = ipa_ref_list_nreferences (&node->ref_list);
754 if (count)
755 {
756 lto_output_uleb128_stream (ob->main_stream, count);
757 lto_output_uleb128_stream (ob->main_stream,
758 lto_varpool_encoder_lookup (varpool_encoder,
759 node));
760 for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
761 lto_output_ref (ob, ref, encoder, varpool_encoder);
762 }
763 }
764
765 lto_output_uleb128_stream (ob->main_stream, 0);
766
767 lto_destroy_simple_output_block (ob);
768 }
769
770 /* Find out all cgraph and varpool nodes we want to encode in current unit
771 and insert them to encoders. */
772 void
773 compute_ltrans_boundary (struct lto_out_decl_state *state,
774 cgraph_node_set set, varpool_node_set vset)
775 {
776 struct cgraph_node *node;
777 cgraph_node_set_iterator csi;
778 varpool_node_set_iterator vsi;
779 struct cgraph_edge *edge;
780 int i;
781 lto_cgraph_encoder_t encoder;
782 lto_varpool_encoder_t varpool_encoder;
783
784 encoder = state->cgraph_node_encoder = lto_cgraph_encoder_new ();
785 varpool_encoder = state->varpool_node_encoder = lto_varpool_encoder_new ();
786
787 /* Go over all the nodes in SET and assign references. */
788 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
789 {
790 node = csi_node (csi);
791 add_node_to (encoder, node, true);
792 add_references (encoder, varpool_encoder, &node->ref_list);
793 }
794 for (vsi = vsi_start (vset); !vsi_end_p (vsi); vsi_next (&vsi))
795 {
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);
801 }
802 /* Pickle in also the initializer of all referenced readonly variables
803 to help folding. Constant pool variables are not shared, so we must
804 pickle those too. */
805 for (i = 0; i < lto_varpool_encoder_size (varpool_encoder); i++)
806 {
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,
810 vnode)
811 && const_value_known_p (vnode->decl))
812 {
813 lto_set_varpool_encoder_encode_initializer (varpool_encoder, vnode);
814 add_references (encoder, varpool_encoder, &vnode->ref_list);
815 }
816 }
817
818 /* Go over all the nodes again to include callees that are not in
819 SET. */
820 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
821 {
822 node = csi_node (csi);
823 for (edge = node->callees; edge; edge = edge->next_callee)
824 {
825 struct cgraph_node *callee = edge->callee;
826 if (!cgraph_node_in_set_p (callee, set))
827 {
828 /* We should have moved all the inlines. */
829 gcc_assert (!callee->global.inlined_to);
830 add_node_to (encoder, callee, false);
831 }
832 }
833 }
834 }
835
836 /* Output the part of the cgraph in SET. */
837
838 void
839 output_cgraph (cgraph_node_set set, varpool_node_set vset)
840 {
841 struct cgraph_node *node;
842 struct lto_simple_output_block *ob;
843 cgraph_node_set_iterator csi;
844 int i, n_nodes;
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;
849
850 if (flag_wpa)
851 output_cgraph_opt_summary (set);
852
853 ob = lto_create_simple_output_block (LTO_section_cgraph);
854
855 output_profile_summary (ob);
856
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;
863
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
866 from. */
867 n_nodes = lto_cgraph_encoder_size (encoder);
868 for (i = 0; i < n_nodes; i++)
869 {
870 node = lto_cgraph_encoder_deref (encoder, i);
871 lto_output_node (ob, node, encoder, set, vset);
872 }
873
874 /* Go over the nodes in SET again to write edges. */
875 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
876 {
877 node = csi_node (csi);
878 output_outgoing_cgraph_edges (node->callees, ob, encoder);
879 output_outgoing_cgraph_edges (node->indirect_calls, ob, encoder);
880 }
881
882 lto_output_uleb128_stream (ob->main_stream, 0);
883
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
887 well. */
888 if (!asm_nodes_output)
889 {
890 asm_nodes_output = true;
891 for (can = cgraph_asm_nodes; can; can = can->next)
892 {
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]);
898 }
899 }
900
901 lto_output_uleb128_stream (ob->main_stream, 0);
902
903 lto_destroy_simple_output_block (ob);
904 output_varpool (set, vset);
905 output_refs (set, vset, encoder, varpool_encoder);
906 }
907
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
913 stream. */
914
915 static void
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)
921 {
922 node->aux = (void *) tag;
923 node->local.lto_file_data = file_data;
924
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.
942
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. */
946 && (!node->clone_of
947 || node->clone_of->decl != node->decl))
948 {
949 DECL_EXTERNAL (node->decl) = 1;
950 TREE_STATIC (node->decl) = 0;
951 }
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;
958 }
959
960 /* Output the part of the cgraph in SET. */
961
962 static void
963 output_varpool (cgraph_node_set set, varpool_node_set vset)
964 {
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;
968
969 lto_output_uleb128_stream (ob->main_stream, len);
970
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
973 from. */
974 for (i = 0; i < len; i++)
975 {
976 lto_output_varpool_node (ob, lto_varpool_encoder_deref (varpool_encoder, i),
977 varpool_encoder,
978 set, vset);
979 }
980
981 lto_destroy_simple_output_block (ob);
982 }
983
984 /* Read a node from input_block IB. TAG is the node's tag just read.
985 Return the node read or overwriten. */
986
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)
992 {
993 tree fn_decl;
994 struct cgraph_node *node;
995 struct bitpack_d bp;
996 unsigned decl_index;
997 int ref = LCC_NOT_FOUND, ref2 = LCC_NOT_FOUND;
998 unsigned long same_body_count = 0;
999 int clone_ref;
1000 enum ld_plugin_symbol_resolution resolution;
1001
1002 clone_ref = lto_input_sleb128 (ib);
1003
1004 decl_index = lto_input_uleb128 (ib);
1005 fn_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
1006
1007 if (clone_ref != LCC_NOT_FOUND)
1008 {
1009 node = cgraph_clone_node (VEC_index (cgraph_node_ptr, nodes, clone_ref), fn_decl,
1010 0, CGRAPH_FREQ_BASE, 0, false, NULL);
1011 }
1012 else
1013 node = cgraph_get_create_node (fn_decl);
1014
1015 node->count = lto_input_sleb128 (ib);
1016 node->count_materialization_scale = lto_input_sleb128 (ib);
1017
1018 if (tag == LTO_cgraph_analyzed_node)
1019 ref = lto_input_sleb128 (ib);
1020
1021 ref2 = lto_input_sleb128 (ib);
1022
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);
1030
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);
1034
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;
1037
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;
1040
1041 same_body_count = lto_input_uleb128 (ib);
1042 while (same_body_count-- > 0)
1043 {
1044 tree alias_decl;
1045 int type;
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);
1050 if (!type)
1051 {
1052 tree real_alias;
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);
1056 }
1057 else
1058 {
1059 HOST_WIDE_INT fixed_offset = lto_input_uleb128 (ib);
1060 HOST_WIDE_INT virtual_value = lto_input_uleb128 (ib);
1061 tree real_alias;
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,
1065 virtual_value,
1066 (type & 4) ? size_int (virtual_value) : NULL_TREE,
1067 real_alias);
1068 }
1069 gcc_assert (alias);
1070 alias->resolution = (enum ld_plugin_symbol_resolution)lto_input_uleb128 (ib);
1071 }
1072 return node;
1073 }
1074
1075 /* Read a node from input_block IB. TAG is the node's tag just read.
1076 Return the node read or overwriten. */
1077
1078 static struct varpool_node *
1079 input_varpool_node (struct lto_file_decl_data *file_data,
1080 struct lto_input_block *ib)
1081 {
1082 int decl_index;
1083 tree var_decl;
1084 struct varpool_node *node;
1085 struct bitpack_d bp;
1086 bool aliases_p;
1087 int count;
1088 int ref = LCC_NOT_FOUND;
1089
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;
1094
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)
1104 {
1105 DECL_EXTERNAL (node->decl) = 1;
1106 TREE_STATIC (node->decl) = 0;
1107 }
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);
1115 if (aliases_p)
1116 {
1117 count = lto_input_uleb128 (ib);
1118 for (; count > 0; count --)
1119 {
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);
1125 }
1126 }
1127 return node;
1128 }
1129
1130 /* Read a node from input_block IB. TAG is the node's tag just read.
1131 Return the node read or overwriten. */
1132
1133 static void
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)
1139 {
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;
1145
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));
1151 else
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);
1155 }
1156
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). */
1161
1162 static void
1163 input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes,
1164 bool indirect)
1165 {
1166 struct cgraph_node *caller, *callee;
1167 struct cgraph_edge *edge;
1168 unsigned int stmt_id;
1169 gcov_type count;
1170 int freq;
1171 unsigned int nest;
1172 cgraph_inline_failed_t inline_failed;
1173 struct bitpack_d bp;
1174 int ecf_flags = 0;
1175 int call_stmt_time, call_stmt_size;
1176
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");
1180
1181 if (!indirect)
1182 {
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");
1186 }
1187 else
1188 callee = NULL;
1189
1190 count = (gcov_type) lto_input_sleb128 (ib);
1191
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,
1195 HOST_BITS_PER_INT);
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);
1200
1201 if (indirect)
1202 edge = cgraph_create_indirect_edge (caller, NULL, 0, count, freq, nest);
1203 else
1204 edge = cgraph_create_edge (caller, callee, NULL, count, freq, nest);
1205
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;
1213 if (indirect)
1214 {
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;
1228 }
1229 }
1230
1231
1232 /* Read a cgraph from IB using the info in FILE_DATA. */
1233
1234 static VEC(cgraph_node_ptr, heap) *
1235 input_cgraph_1 (struct lto_file_decl_data *file_data,
1236 struct lto_input_block *ib)
1237 {
1238 enum LTO_cgraph_tags tag;
1239 VEC(cgraph_node_ptr, heap) *nodes = NULL;
1240 struct cgraph_node *node;
1241 unsigned i;
1242 unsigned HOST_WIDE_INT len;
1243
1244 tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
1245 while (tag)
1246 {
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);
1251 else
1252 {
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);
1258 }
1259
1260 tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
1261 }
1262
1263 /* Input toplevel asms. */
1264 len = lto_input_uleb128 (ib);
1265 while (len)
1266 {
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));
1271 free (str);
1272
1273 len = lto_input_uleb128 (ib);
1274 }
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);
1279 #endif
1280 FOR_EACH_VEC_ELT (cgraph_node_ptr, nodes, i, node)
1281 {
1282 int ref = (int) (intptr_t) node->global.inlined_to;
1283
1284 /* We share declaration of builtins, so we may read same node twice. */
1285 if (!node->aux)
1286 continue;
1287 node->aux = NULL;
1288
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);
1292 else
1293 node->global.inlined_to = NULL;
1294
1295 ref = (int) (intptr_t) node->same_comdat_group;
1296
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);
1300 else
1301 node->same_comdat_group = NULL;
1302 }
1303 FOR_EACH_VEC_ELT (cgraph_node_ptr, nodes, i, node)
1304 node->aux = (void *)1;
1305 return nodes;
1306 }
1307
1308 /* Read a varpool from IB using the info in FILE_DATA. */
1309
1310 static VEC(varpool_node_ptr, heap) *
1311 input_varpool_1 (struct lto_file_decl_data *file_data,
1312 struct lto_input_block *ib)
1313 {
1314 unsigned HOST_WIDE_INT len;
1315 VEC(varpool_node_ptr, heap) *varpool = NULL;
1316 int i;
1317 struct varpool_node *node;
1318
1319 len = lto_input_uleb128 (ib);
1320 while (len)
1321 {
1322 VEC_safe_push (varpool_node_ptr, heap, varpool,
1323 input_varpool_node (file_data, ib));
1324 len--;
1325 }
1326 #ifdef ENABLE_CHECKING
1327 FOR_EACH_VEC_ELT (varpool_node_ptr, varpool, i, node)
1328 gcc_assert (!node->aux);
1329 #endif
1330 FOR_EACH_VEC_ELT (varpool_node_ptr, varpool, i, node)
1331 {
1332 int ref = (int) (intptr_t) node->same_comdat_group;
1333 /* We share declaration of builtins, so we may read same node twice. */
1334 if (node->aux)
1335 continue;
1336 node->aux = (void *)1;
1337
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);
1341 else
1342 node->same_comdat_group = NULL;
1343 }
1344 FOR_EACH_VEC_ELT (varpool_node_ptr, varpool, i, node)
1345 node->aux = NULL;
1346 return varpool;
1347 }
1348
1349 /* Input ipa_refs. */
1350
1351 static void
1352 input_refs (struct lto_input_block *ib,
1353 VEC(cgraph_node_ptr, heap) *nodes,
1354 VEC(varpool_node_ptr, heap) *varpool)
1355 {
1356 int count;
1357 int idx;
1358 while (true)
1359 {
1360 struct cgraph_node *node;
1361 count = lto_input_uleb128 (ib);
1362 if (!count)
1363 break;
1364 idx = lto_input_uleb128 (ib);
1365 node = VEC_index (cgraph_node_ptr, nodes, idx);
1366 while (count)
1367 {
1368 input_ref (ib, node, NULL, nodes, varpool);
1369 count--;
1370 }
1371 }
1372 while (true)
1373 {
1374 struct varpool_node *node;
1375 count = lto_input_uleb128 (ib);
1376 if (!count)
1377 break;
1378 node = VEC_index (varpool_node_ptr, varpool, lto_input_uleb128 (ib));
1379 while (count)
1380 {
1381 input_ref (ib, NULL, node, nodes, varpool);
1382 count--;
1383 }
1384 }
1385 }
1386
1387
1388 static struct gcov_ctr_summary lto_gcov_summary;
1389
1390 /* Input profile_info from IB. */
1391 static void
1392 input_profile_summary (struct lto_input_block *ib,
1393 struct lto_file_decl_data *file_data)
1394 {
1395 unsigned int runs = lto_input_uleb128 (ib);
1396 if (runs)
1397 {
1398 file_data->profile_info.runs = runs;
1399 file_data->profile_info.sum_max = lto_input_uleb128 (ib);
1400 }
1401
1402 }
1403
1404 /* Rescale profile summaries to the same number of runs in the whole unit. */
1405
1406 static void
1407 merge_profile_summaries (struct lto_file_decl_data **file_data_vec)
1408 {
1409 struct lto_file_decl_data *file_data;
1410 unsigned int j;
1411 gcov_unsigned_t max_runs = 0;
1412 struct cgraph_node *node;
1413 struct cgraph_edge *edge;
1414
1415 /* Find unit with maximal number of runs. If we ever get serious about
1416 roundoff errors, we might also consider computing smallest common
1417 multiply. */
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;
1421
1422 if (!max_runs)
1423 return;
1424
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)
1428 {
1429 sorry ("At most %i profile runs is supported. Perhaps corrupted profile?",
1430 INT_MAX / REG_BR_PROB_BASE);
1431 return;
1432 }
1433
1434 profile_info = &lto_gcov_summary;
1435 lto_gcov_summary.runs = max_runs;
1436 lto_gcov_summary.sum_max = 0;
1437
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)
1443 {
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
1449 * scale
1450 + REG_BR_PROB_BASE / 2)
1451 / REG_BR_PROB_BASE);
1452 }
1453
1454 /* Watch roundoff errors. */
1455 if (lto_gcov_summary.sum_max < max_runs)
1456 lto_gcov_summary.sum_max = max_runs;
1457
1458 /* If merging already happent at WPA time, we are done. */
1459 if (flag_ltrans)
1460 return;
1461
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)
1468 {
1469 int scale;
1470
1471 scale =
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;
1476 if (scale < 0)
1477 fatal_error ("Profile information in %s corrupted",
1478 file_data->file_name);
1479
1480 if (scale == REG_BR_PROB_BASE)
1481 continue;
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);
1487 }
1488 }
1489
1490 /* Input and merge the cgraph from each of the .o files passed to
1491 lto1. */
1492
1493 void
1494 input_cgraph (void)
1495 {
1496 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
1497 struct lto_file_decl_data *file_data;
1498 unsigned int j = 0;
1499 struct cgraph_node *node;
1500
1501 while ((file_data = file_data_vec[j++]))
1502 {
1503 const char *data;
1504 size_t len;
1505 struct lto_input_block *ib;
1506 VEC(cgraph_node_ptr, heap) *nodes;
1507 VEC(varpool_node_ptr, heap) *varpool;
1508
1509 ib = lto_create_simple_input_block (file_data, LTO_section_cgraph,
1510 &data, &len);
1511 if (!ib)
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,
1517 ib, data, len);
1518
1519 ib = lto_create_simple_input_block (file_data, LTO_section_varpool,
1520 &data, &len);
1521 if (!ib)
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,
1525 ib, data, len);
1526
1527 ib = lto_create_simple_input_block (file_data, LTO_section_refs,
1528 &data, &len);
1529 if (!ib)
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,
1533 ib, data, len);
1534 if (flag_ltrans)
1535 input_cgraph_opt_summary (nodes);
1536 VEC_free (cgraph_node_ptr, heap, nodes);
1537 VEC_free (varpool_node_ptr, heap, varpool);
1538 }
1539
1540 merge_profile_summaries (file_data_vec);
1541
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)
1545 {
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)
1552 node->aux = NULL;
1553 }
1554 }
1555
1556 /* True when we need optimization summary for NODE. */
1557
1558 static int
1559 output_cgraph_opt_summary_p (struct cgraph_node *node, cgraph_node_set set)
1560 {
1561 struct cgraph_edge *e;
1562
1563 if (cgraph_node_in_set_p (node, set))
1564 {
1565 for (e = node->callees; e; e = e->next_callee)
1566 if (e->indirect_info
1567 && e->indirect_info->thunk_delta != 0)
1568 return true;
1569
1570 for (e = node->indirect_calls; e; e = e->next_callee)
1571 if (e->indirect_info->thunk_delta != 0)
1572 return true;
1573 }
1574
1575 return (node->clone_of
1576 && (node->clone.tree_map
1577 || node->clone.args_to_skip
1578 || node->clone.combined_args_to_skip));
1579 }
1580
1581 /* Output optimization summary for EDGE to OB. */
1582 static void
1583 output_edge_opt_summary (struct output_block *ob,
1584 struct cgraph_edge *edge)
1585 {
1586 if (edge->indirect_info)
1587 lto_output_sleb128_stream (ob->main_stream,
1588 edge->indirect_info->thunk_delta);
1589 else
1590 lto_output_sleb128_stream (ob->main_stream, 0);
1591 }
1592
1593 /* Output optimization summary for NODE to OB. */
1594
1595 static void
1596 output_node_opt_summary (struct output_block *ob,
1597 struct cgraph_node *node,
1598 cgraph_node_set set)
1599 {
1600 unsigned int index;
1601 bitmap_iterator bi;
1602 struct ipa_replace_map *map;
1603 struct bitpack_d bp;
1604 int i;
1605 struct cgraph_edge *e;
1606
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)
1618 {
1619 int parm_num;
1620 tree parm;
1621
1622 for (parm_num = 0, parm = DECL_ARGUMENTS (node->decl); parm;
1623 parm = DECL_CHAIN (parm), parm_num++)
1624 if (map->old_tree == parm)
1625 break;
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. */
1628 gcc_assert (parm);
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);
1635 }
1636
1637 if (cgraph_node_in_set_p (node, set))
1638 {
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);
1643 }
1644 }
1645
1646 /* Output optimization summaries stored in callgraph.
1647 At the moment it is the clone info structure. */
1648
1649 static void
1650 output_cgraph_opt_summary (cgraph_node_set set)
1651 {
1652 struct cgraph_node *node;
1653 int i, n_nodes;
1654 lto_cgraph_encoder_t encoder;
1655 struct output_block *ob = create_output_block (LTO_section_cgraph_opt_sum);
1656 unsigned count = 0;
1657
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),
1663 set))
1664 count++;
1665 lto_output_uleb128_stream (ob->main_stream, count);
1666 for (i = 0; i < n_nodes; i++)
1667 {
1668 node = lto_cgraph_encoder_deref (encoder, i);
1669 if (output_cgraph_opt_summary_p (node, set))
1670 {
1671 lto_output_uleb128_stream (ob->main_stream, i);
1672 output_node_opt_summary (ob, node, set);
1673 }
1674 }
1675 produce_asm (ob, NULL);
1676 destroy_output_block (ob);
1677 }
1678
1679 /* Input optimisation summary of EDGE. */
1680
1681 static void
1682 input_edge_opt_summary (struct cgraph_edge *edge,
1683 struct lto_input_block *ib_main)
1684 {
1685 HOST_WIDE_INT thunk_delta;
1686 thunk_delta = lto_input_sleb128 (ib_main);
1687 if (thunk_delta != 0)
1688 {
1689 gcc_assert (!edge->indirect_info);
1690 edge->indirect_info = cgraph_allocate_init_indirect_info ();
1691 edge->indirect_info->thunk_delta = thunk_delta;
1692 }
1693 }
1694
1695 /* Input optimisation summary of NODE. */
1696
1697 static void
1698 input_node_opt_summary (struct cgraph_node *node,
1699 struct lto_input_block *ib_main,
1700 struct data_in *data_in)
1701 {
1702 int i;
1703 int count;
1704 int bit;
1705 struct bitpack_d bp;
1706 struct cgraph_edge *e;
1707
1708 count = lto_input_uleb128 (ib_main);
1709 if (count)
1710 node->clone.args_to_skip = BITMAP_GGC_ALLOC ();
1711 for (i = 0; i < count; i++)
1712 {
1713 bit = lto_input_uleb128 (ib_main);
1714 bitmap_set_bit (node->clone.args_to_skip, bit);
1715 }
1716 count = lto_input_uleb128 (ib_main);
1717 if (count)
1718 node->clone.combined_args_to_skip = BITMAP_GGC_ALLOC ();
1719 for (i = 0; i < count; i++)
1720 {
1721 bit = lto_input_uleb128 (ib_main);
1722 bitmap_set_bit (node->clone.combined_args_to_skip, bit);
1723 }
1724 count = lto_input_uleb128 (ib_main);
1725 for (i = 0; i < count; i++)
1726 {
1727 int parm_num;
1728 tree parm;
1729 struct ipa_replace_map *map = ggc_alloc_ipa_replace_map ();
1730
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))
1734 parm_num --;
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);
1741 }
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);
1746 }
1747
1748 /* Read section in file FILE_DATA of length LEN with data DATA. */
1749
1750 static void
1751 input_cgraph_opt_section (struct lto_file_decl_data *file_data,
1752 const char *data, size_t len, VEC (cgraph_node_ptr,
1753 heap) * nodes)
1754 {
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;
1762 unsigned int i;
1763 unsigned int count;
1764
1765 LTO_INIT_INPUT_BLOCK (ib_main, (const char *) data + main_offset, 0,
1766 header->main_size);
1767
1768 data_in =
1769 lto_data_in_create (file_data, (const char *) data + string_offset,
1770 header->string_size, NULL);
1771 count = lto_input_uleb128 (&ib_main);
1772
1773 for (i = 0; i < count; i++)
1774 {
1775 int ref = lto_input_uleb128 (&ib_main);
1776 input_node_opt_summary (VEC_index (cgraph_node_ptr, nodes, ref),
1777 &ib_main, data_in);
1778 }
1779 lto_free_section_data (file_data, LTO_section_cgraph_opt_sum, NULL, data,
1780 len);
1781 lto_data_in_delete (data_in);
1782 }
1783
1784 /* Input optimization summary of cgraph. */
1785
1786 static void
1787 input_cgraph_opt_summary (VEC (cgraph_node_ptr, heap) * nodes)
1788 {
1789 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
1790 struct lto_file_decl_data *file_data;
1791 unsigned int j = 0;
1792
1793 while ((file_data = file_data_vec[j++]))
1794 {
1795 size_t len;
1796 const char *data =
1797 lto_get_section_data (file_data, LTO_section_cgraph_opt_sum, NULL,
1798 &len);
1799
1800 if (data)
1801 input_cgraph_opt_section (file_data, data, len, nodes);
1802 }
1803 }