rebase
[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 "data-streamer.h"
47 #include "tree-streamer.h"
48 #include "gcov-io.h"
49
50 static void output_varpool (cgraph_node_set, varpool_node_set);
51 static void output_cgraph_opt_summary (cgraph_node_set set);
52 static void input_cgraph_opt_summary (VEC (cgraph_node_ptr, heap) * nodes);
53
54 /* Number of LDPR values known to GCC. */
55 #define LDPR_NUM_KNOWN (LDPR_RESOLVED_DYN + 1)
56
57 /* Cgraph streaming is organized as set of record whose type
58 is indicated by a tag. */
59 enum LTO_cgraph_tags
60 {
61 /* Must leave 0 for the stopper. */
62
63 /* Cgraph node without body available. */
64 LTO_cgraph_unavail_node = 1,
65 /* Cgraph node with function body. */
66 LTO_cgraph_analyzed_node,
67 /* Cgraph edges. */
68 LTO_cgraph_edge,
69 LTO_cgraph_indirect_edge,
70 LTO_cgraph_last_tag
71 };
72
73 /* Create a new cgraph encoder. */
74
75 lto_cgraph_encoder_t
76 lto_cgraph_encoder_new (void)
77 {
78 lto_cgraph_encoder_t encoder = XCNEW (struct lto_cgraph_encoder_d);
79 encoder->map = pointer_map_create ();
80 encoder->nodes = NULL;
81 encoder->body = pointer_set_create ();
82 return encoder;
83 }
84
85
86 /* Delete ENCODER and its components. */
87
88 void
89 lto_cgraph_encoder_delete (lto_cgraph_encoder_t encoder)
90 {
91 VEC_free (cgraph_node_ptr, heap, encoder->nodes);
92 pointer_map_destroy (encoder->map);
93 pointer_set_destroy (encoder->body);
94 free (encoder);
95 }
96
97
98 /* Return the existing reference number of NODE in the cgraph encoder in
99 output block OB. Assign a new reference if this is the first time
100 NODE is encoded. */
101
102 int
103 lto_cgraph_encoder_encode (lto_cgraph_encoder_t encoder,
104 struct cgraph_node *node)
105 {
106 int ref;
107 void **slot;
108
109 slot = pointer_map_contains (encoder->map, node);
110 if (!slot)
111 {
112 ref = VEC_length (cgraph_node_ptr, encoder->nodes);
113 slot = pointer_map_insert (encoder->map, node);
114 *slot = (void *) (intptr_t) ref;
115 VEC_safe_push (cgraph_node_ptr, heap, encoder->nodes, node);
116 }
117 else
118 ref = (int) (intptr_t) *slot;
119
120 return ref;
121 }
122
123 #define LCC_NOT_FOUND (-1)
124
125 /* Look up NODE in encoder. Return NODE's reference if it has been encoded
126 or LCC_NOT_FOUND if it is not there. */
127
128 int
129 lto_cgraph_encoder_lookup (lto_cgraph_encoder_t encoder,
130 struct cgraph_node *node)
131 {
132 void **slot = pointer_map_contains (encoder->map, node);
133 return (slot ? (int) (intptr_t) *slot : LCC_NOT_FOUND);
134 }
135
136
137 /* Return the cgraph node corresponding to REF using ENCODER. */
138
139 struct cgraph_node *
140 lto_cgraph_encoder_deref (lto_cgraph_encoder_t encoder, int ref)
141 {
142 if (ref == LCC_NOT_FOUND)
143 return NULL;
144
145 return VEC_index (cgraph_node_ptr, encoder->nodes, ref);
146 }
147
148
149 /* Return TRUE if we should encode initializer of NODE (if any). */
150
151 bool
152 lto_cgraph_encoder_encode_body_p (lto_cgraph_encoder_t encoder,
153 struct cgraph_node *node)
154 {
155 return pointer_set_contains (encoder->body, node);
156 }
157
158 /* Return TRUE if we should encode body of NODE (if any). */
159
160 static void
161 lto_set_cgraph_encoder_encode_body (lto_cgraph_encoder_t encoder,
162 struct cgraph_node *node)
163 {
164 pointer_set_insert (encoder->body, node);
165 }
166
167 /* Create a new varpool encoder. */
168
169 lto_varpool_encoder_t
170 lto_varpool_encoder_new (void)
171 {
172 lto_varpool_encoder_t encoder = XCNEW (struct lto_varpool_encoder_d);
173 encoder->map = pointer_map_create ();
174 encoder->initializer = pointer_set_create ();
175 encoder->nodes = NULL;
176 return encoder;
177 }
178
179
180 /* Delete ENCODER and its components. */
181
182 void
183 lto_varpool_encoder_delete (lto_varpool_encoder_t encoder)
184 {
185 VEC_free (varpool_node_ptr, heap, encoder->nodes);
186 pointer_map_destroy (encoder->map);
187 pointer_set_destroy (encoder->initializer);
188 free (encoder);
189 }
190
191
192 /* Return the existing reference number of NODE in the varpool encoder in
193 output block OB. Assign a new reference if this is the first time
194 NODE is encoded. */
195
196 int
197 lto_varpool_encoder_encode (lto_varpool_encoder_t encoder,
198 struct varpool_node *node)
199 {
200 int ref;
201 void **slot;
202
203 slot = pointer_map_contains (encoder->map, node);
204 if (!slot)
205 {
206 ref = VEC_length (varpool_node_ptr, encoder->nodes);
207 slot = pointer_map_insert (encoder->map, node);
208 *slot = (void *) (intptr_t) ref;
209 VEC_safe_push (varpool_node_ptr, heap, encoder->nodes, node);
210 }
211 else
212 ref = (int) (intptr_t) *slot;
213
214 return ref;
215 }
216
217 /* Look up NODE in encoder. Return NODE's reference if it has been encoded
218 or LCC_NOT_FOUND if it is not there. */
219
220 int
221 lto_varpool_encoder_lookup (lto_varpool_encoder_t encoder,
222 struct varpool_node *node)
223 {
224 void **slot = pointer_map_contains (encoder->map, node);
225 return (slot ? (int) (intptr_t) *slot : LCC_NOT_FOUND);
226 }
227
228
229 /* Return the varpool node corresponding to REF using ENCODER. */
230
231 struct varpool_node *
232 lto_varpool_encoder_deref (lto_varpool_encoder_t encoder, int ref)
233 {
234 if (ref == LCC_NOT_FOUND)
235 return NULL;
236
237 return VEC_index (varpool_node_ptr, encoder->nodes, ref);
238 }
239
240
241 /* Return TRUE if we should encode initializer of NODE (if any). */
242
243 bool
244 lto_varpool_encoder_encode_initializer_p (lto_varpool_encoder_t encoder,
245 struct varpool_node *node)
246 {
247 return pointer_set_contains (encoder->initializer, node);
248 }
249
250 /* Return TRUE if we should encode initializer of NODE (if any). */
251
252 static void
253 lto_set_varpool_encoder_encode_initializer (lto_varpool_encoder_t encoder,
254 struct varpool_node *node)
255 {
256 pointer_set_insert (encoder->initializer, node);
257 }
258
259 /* Output the cgraph EDGE to OB using ENCODER. */
260
261 static void
262 lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge,
263 lto_cgraph_encoder_t encoder)
264 {
265 unsigned int uid;
266 intptr_t ref;
267 struct bitpack_d bp;
268
269 if (edge->indirect_unknown_callee)
270 lto_output_enum (ob->main_stream, LTO_cgraph_tags, LTO_cgraph_last_tag,
271 LTO_cgraph_indirect_edge);
272 else
273 lto_output_enum (ob->main_stream, LTO_cgraph_tags, LTO_cgraph_last_tag,
274 LTO_cgraph_edge);
275
276 ref = lto_cgraph_encoder_lookup (encoder, edge->caller);
277 gcc_assert (ref != LCC_NOT_FOUND);
278 lto_output_sleb128_stream (ob->main_stream, ref);
279
280 if (!edge->indirect_unknown_callee)
281 {
282 ref = lto_cgraph_encoder_lookup (encoder, edge->callee);
283 gcc_assert (ref != LCC_NOT_FOUND);
284 lto_output_sleb128_stream (ob->main_stream, ref);
285 }
286
287 lto_output_sleb128_stream (ob->main_stream, edge->count);
288
289 bp = bitpack_create (ob->main_stream);
290 uid = (!gimple_has_body_p (edge->caller->decl)
291 ? edge->lto_stmt_uid : gimple_uid (edge->call_stmt));
292 bp_pack_enum (&bp, cgraph_inline_failed_enum,
293 CIF_N_REASONS, edge->inline_failed);
294 bp_pack_var_len_unsigned (&bp, uid);
295 bp_pack_var_len_unsigned (&bp, edge->frequency);
296 bp_pack_value (&bp, edge->indirect_inlining_edge, 1);
297 bp_pack_value (&bp, edge->call_stmt_cannot_inline_p, 1);
298 bp_pack_value (&bp, edge->can_throw_external, 1);
299 if (edge->indirect_unknown_callee)
300 {
301 int flags = edge->indirect_info->ecf_flags;
302 bp_pack_value (&bp, (flags & ECF_CONST) != 0, 1);
303 bp_pack_value (&bp, (flags & ECF_PURE) != 0, 1);
304 bp_pack_value (&bp, (flags & ECF_NORETURN) != 0, 1);
305 bp_pack_value (&bp, (flags & ECF_MALLOC) != 0, 1);
306 bp_pack_value (&bp, (flags & ECF_NOTHROW) != 0, 1);
307 bp_pack_value (&bp, (flags & ECF_RETURNS_TWICE) != 0, 1);
308 /* Flags that should not appear on indirect calls. */
309 gcc_assert (!(flags & (ECF_LOOPING_CONST_OR_PURE
310 | ECF_MAY_BE_ALLOCA
311 | ECF_SIBCALL
312 | ECF_LEAF
313 | ECF_NOVOPS)));
314 }
315 lto_output_bitpack (&bp);
316 }
317
318 /* Return if LIST contain references from other partitions. */
319
320 bool
321 referenced_from_other_partition_p (struct ipa_ref_list *list, cgraph_node_set set,
322 varpool_node_set vset)
323 {
324 int i;
325 struct ipa_ref *ref;
326 for (i = 0; ipa_ref_list_refering_iterate (list, i, ref); i++)
327 {
328 if (ref->refering_type == IPA_REF_CGRAPH)
329 {
330 if (ipa_ref_refering_node (ref)->in_other_partition
331 || !cgraph_node_in_set_p (ipa_ref_refering_node (ref), set))
332 return true;
333 }
334 else
335 {
336 if (ipa_ref_refering_varpool_node (ref)->in_other_partition
337 || !varpool_node_in_set_p (ipa_ref_refering_varpool_node (ref),
338 vset))
339 return true;
340 }
341 }
342 return false;
343 }
344
345 /* Return true when node is reachable from other partition. */
346
347 bool
348 reachable_from_other_partition_p (struct cgraph_node *node, cgraph_node_set set)
349 {
350 struct cgraph_edge *e;
351 if (!node->analyzed)
352 return false;
353 if (node->global.inlined_to)
354 return false;
355 for (e = node->callers; e; e = e->next_caller)
356 if (e->caller->in_other_partition
357 || !cgraph_node_in_set_p (e->caller, set))
358 return true;
359 return false;
360 }
361
362 /* Return if LIST contain references from other partitions. */
363
364 bool
365 referenced_from_this_partition_p (struct ipa_ref_list *list, cgraph_node_set set,
366 varpool_node_set vset)
367 {
368 int i;
369 struct ipa_ref *ref;
370 for (i = 0; ipa_ref_list_refering_iterate (list, i, ref); i++)
371 {
372 if (ref->refering_type == IPA_REF_CGRAPH)
373 {
374 if (cgraph_node_in_set_p (ipa_ref_refering_node (ref), set))
375 return true;
376 }
377 else
378 {
379 if (varpool_node_in_set_p (ipa_ref_refering_varpool_node (ref),
380 vset))
381 return true;
382 }
383 }
384 return false;
385 }
386
387 /* Return true when node is reachable from other partition. */
388
389 bool
390 reachable_from_this_partition_p (struct cgraph_node *node, cgraph_node_set set)
391 {
392 struct cgraph_edge *e;
393 for (e = node->callers; e; e = e->next_caller)
394 if (cgraph_node_in_set_p (e->caller, set))
395 return true;
396 return false;
397 }
398
399 /* Output the cgraph NODE to OB. ENCODER is used to find the
400 reference number of NODE->inlined_to. SET is the set of nodes we
401 are writing to the current file. If NODE is not in SET, then NODE
402 is a boundary of a cgraph_node_set and we pretend NODE just has a
403 decl and no callees. WRITTEN_DECLS is the set of FUNCTION_DECLs
404 that have had their callgraph node written so far. This is used to
405 determine if NODE is a clone of a previously written node. */
406
407 static void
408 lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
409 lto_cgraph_encoder_t encoder, cgraph_node_set set,
410 varpool_node_set vset)
411 {
412 unsigned int tag;
413 struct bitpack_d bp;
414 bool boundary_p;
415 intptr_t ref;
416 bool in_other_partition = false;
417 struct cgraph_node *clone_of;
418
419 boundary_p = !cgraph_node_in_set_p (node, set);
420
421 if (node->analyzed && !boundary_p)
422 tag = LTO_cgraph_analyzed_node;
423 else
424 tag = LTO_cgraph_unavail_node;
425
426 lto_output_enum (ob->main_stream, LTO_cgraph_tags, LTO_cgraph_last_tag, tag);
427
428 /* In WPA mode, we only output part of the call-graph. Also, we
429 fake cgraph node attributes. There are two cases that we care.
430
431 Boundary nodes: There are nodes that are not part of SET but are
432 called from within SET. We artificially make them look like
433 externally visible nodes with no function body.
434
435 Cherry-picked nodes: These are nodes we pulled from other
436 translation units into SET during IPA-inlining. We make them as
437 local static nodes to prevent clashes with other local statics. */
438 if (boundary_p && node->analyzed)
439 {
440 /* Inline clones can not be part of boundary.
441 gcc_assert (!node->global.inlined_to);
442
443 FIXME: At the moment they can be, when partition contains an inline
444 clone that is clone of inline clone from outside partition. We can
445 reshape the clone tree and make other tree to be the root, but it
446 needs a bit extra work and will be promplty done by cgraph_remove_node
447 after reading back. */
448 in_other_partition = 1;
449 }
450
451 clone_of = node->clone_of;
452 while (clone_of
453 && (ref = lto_cgraph_encoder_lookup (encoder, clone_of)) == LCC_NOT_FOUND)
454 if (clone_of->prev_sibling_clone)
455 clone_of = clone_of->prev_sibling_clone;
456 else
457 clone_of = clone_of->clone_of;
458
459 if (LTO_cgraph_analyzed_node)
460 gcc_assert (clone_of || !node->clone_of);
461 if (!clone_of)
462 lto_output_sleb128_stream (ob->main_stream, LCC_NOT_FOUND);
463 else
464 lto_output_sleb128_stream (ob->main_stream, ref);
465
466
467 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, node->decl);
468 lto_output_sleb128_stream (ob->main_stream, node->count);
469 lto_output_sleb128_stream (ob->main_stream, node->count_materialization_scale);
470
471 if (tag == LTO_cgraph_analyzed_node)
472 {
473 if (node->global.inlined_to)
474 {
475 ref = lto_cgraph_encoder_lookup (encoder, node->global.inlined_to);
476 gcc_assert (ref != LCC_NOT_FOUND);
477 }
478 else
479 ref = LCC_NOT_FOUND;
480
481 lto_output_sleb128_stream (ob->main_stream, ref);
482 }
483
484 if (node->same_comdat_group && !boundary_p)
485 {
486 ref = lto_cgraph_encoder_lookup (encoder, node->same_comdat_group);
487 gcc_assert (ref != LCC_NOT_FOUND);
488 }
489 else
490 ref = LCC_NOT_FOUND;
491 lto_output_sleb128_stream (ob->main_stream, ref);
492
493 bp = bitpack_create (ob->main_stream);
494 bp_pack_value (&bp, node->local.local, 1);
495 bp_pack_value (&bp, node->local.externally_visible, 1);
496 bp_pack_value (&bp, node->local.finalized, 1);
497 bp_pack_value (&bp, node->local.can_change_signature, 1);
498 bp_pack_value (&bp, node->local.redefined_extern_inline, 1);
499 bp_pack_value (&bp, node->needed, 1);
500 bp_pack_value (&bp, node->address_taken, 1);
501 bp_pack_value (&bp, node->abstract_and_needed, 1);
502 bp_pack_value (&bp, tag == LTO_cgraph_analyzed_node
503 && !DECL_EXTERNAL (node->decl)
504 && !DECL_COMDAT (node->decl)
505 && (reachable_from_other_partition_p (node, set)
506 || referenced_from_other_partition_p (&node->ref_list, set, vset)), 1);
507 bp_pack_value (&bp, node->lowered, 1);
508 bp_pack_value (&bp, in_other_partition, 1);
509 bp_pack_value (&bp, node->alias && !boundary_p, 1);
510 bp_pack_value (&bp, node->frequency, 2);
511 bp_pack_value (&bp, node->only_called_at_startup, 1);
512 bp_pack_value (&bp, node->only_called_at_exit, 1);
513 bp_pack_value (&bp, node->thunk.thunk_p && !boundary_p, 1);
514 bp_pack_enum (&bp, ld_plugin_symbol_resolution,
515 LDPR_NUM_KNOWN, node->resolution);
516 lto_output_bitpack (&bp);
517
518 if (node->thunk.thunk_p && !boundary_p)
519 {
520 lto_output_uleb128_stream
521 (ob->main_stream,
522 1 + (node->thunk.this_adjusting != 0) * 2
523 + (node->thunk.virtual_offset_p != 0) * 4);
524 lto_output_uleb128_stream (ob->main_stream,
525 node->thunk.fixed_offset);
526 lto_output_uleb128_stream (ob->main_stream,
527 node->thunk.virtual_value);
528 }
529 if ((node->alias || node->thunk.thunk_p) && !boundary_p)
530 {
531 lto_output_int_in_range (ob->main_stream, 0, 1,
532 node->thunk.alias != NULL);
533 if (node->thunk.alias != NULL)
534 lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
535 node->thunk.alias);
536 }
537 }
538
539 /* Output the varpool NODE to OB.
540 If NODE is not in SET, then NODE is a boundary. */
541
542 static void
543 lto_output_varpool_node (struct lto_simple_output_block *ob, struct varpool_node *node,
544 lto_varpool_encoder_t varpool_encoder,
545 cgraph_node_set set, varpool_node_set vset)
546 {
547 bool boundary_p = !varpool_node_in_set_p (node, vset) && node->analyzed;
548 struct bitpack_d bp;
549 int ref;
550
551 lto_output_var_decl_index (ob->decl_state, ob->main_stream, node->decl);
552 bp = bitpack_create (ob->main_stream);
553 bp_pack_value (&bp, node->externally_visible, 1);
554 bp_pack_value (&bp, node->force_output, 1);
555 bp_pack_value (&bp, node->finalized, 1);
556 bp_pack_value (&bp, node->alias, 1);
557 bp_pack_value (&bp, node->alias_of != NULL, 1);
558 gcc_assert (node->finalized || !node->analyzed);
559 gcc_assert (node->needed);
560 /* Constant pool initializers can be de-unified into individual ltrans units.
561 FIXME: Alternatively at -Os we may want to avoid generating for them the local
562 labels and share them across LTRANS partitions. */
563 if (DECL_IN_CONSTANT_POOL (node->decl)
564 && !DECL_COMDAT (node->decl))
565 {
566 bp_pack_value (&bp, 0, 1); /* used_from_other_parition. */
567 bp_pack_value (&bp, 0, 1); /* in_other_partition. */
568 }
569 else
570 {
571 bp_pack_value (&bp, node->analyzed
572 && referenced_from_other_partition_p (&node->ref_list,
573 set, vset), 1);
574 bp_pack_value (&bp, boundary_p, 1); /* in_other_partition. */
575 }
576 lto_output_bitpack (&bp);
577 if (node->alias_of)
578 lto_output_var_decl_index (ob->decl_state, ob->main_stream, node->alias_of);
579 if (node->same_comdat_group && !boundary_p)
580 {
581 ref = lto_varpool_encoder_lookup (varpool_encoder, node->same_comdat_group);
582 gcc_assert (ref != LCC_NOT_FOUND);
583 }
584 else
585 ref = LCC_NOT_FOUND;
586 lto_output_sleb128_stream (ob->main_stream, ref);
587 lto_output_enum (ob->main_stream, ld_plugin_symbol_resolution,
588 LDPR_NUM_KNOWN, node->resolution);
589 }
590
591 /* Output the varpool NODE to OB.
592 If NODE is not in SET, then NODE is a boundary. */
593
594 static void
595 lto_output_ref (struct lto_simple_output_block *ob, struct ipa_ref *ref,
596 lto_cgraph_encoder_t encoder,
597 lto_varpool_encoder_t varpool_encoder)
598 {
599 struct bitpack_d bp;
600 bp = bitpack_create (ob->main_stream);
601 bp_pack_value (&bp, ref->refered_type, 1);
602 bp_pack_value (&bp, ref->use, 2);
603 lto_output_bitpack (&bp);
604 if (ref->refered_type == IPA_REF_CGRAPH)
605 {
606 int nref = lto_cgraph_encoder_lookup (encoder, ipa_ref_node (ref));
607 gcc_assert (nref != LCC_NOT_FOUND);
608 lto_output_sleb128_stream (ob->main_stream, nref);
609 }
610 else
611 {
612 int nref = lto_varpool_encoder_lookup (varpool_encoder,
613 ipa_ref_varpool_node (ref));
614 gcc_assert (nref != LCC_NOT_FOUND);
615 lto_output_sleb128_stream (ob->main_stream, nref);
616 }
617 }
618
619 /* Stream out profile_summary to OB. */
620
621 static void
622 output_profile_summary (struct lto_simple_output_block *ob)
623 {
624 if (profile_info)
625 {
626 /* We do not output num, sum_all and run_max, they are not used by
627 GCC profile feedback and they are difficult to merge from multiple
628 units. */
629 gcc_assert (profile_info->runs);
630 lto_output_uleb128_stream (ob->main_stream, profile_info->runs);
631 lto_output_uleb128_stream (ob->main_stream, profile_info->sum_max);
632 }
633 else
634 lto_output_uleb128_stream (ob->main_stream, 0);
635 }
636
637 /* Add NODE into encoder as well as nodes it is cloned from.
638 Do it in a way so clones appear first. */
639
640 static void
641 add_node_to (lto_cgraph_encoder_t encoder, struct cgraph_node *node,
642 bool include_body)
643 {
644 if (node->clone_of)
645 add_node_to (encoder, node->clone_of, include_body);
646 else if (include_body)
647 lto_set_cgraph_encoder_encode_body (encoder, node);
648 lto_cgraph_encoder_encode (encoder, node);
649 }
650
651 /* Add all references in LIST to encoders. */
652
653 static void
654 add_references (lto_cgraph_encoder_t encoder,
655 lto_varpool_encoder_t varpool_encoder,
656 struct ipa_ref_list *list)
657 {
658 int i;
659 struct ipa_ref *ref;
660 for (i = 0; ipa_ref_list_reference_iterate (list, i, ref); i++)
661 if (ref->refered_type == IPA_REF_CGRAPH)
662 add_node_to (encoder, ipa_ref_node (ref), false);
663 else
664 {
665 struct varpool_node *vnode = ipa_ref_varpool_node (ref);
666 lto_varpool_encoder_encode (varpool_encoder, vnode);
667 }
668 }
669
670 /* Output all callees or indirect outgoing edges. EDGE must be the first such
671 edge. */
672
673 static void
674 output_outgoing_cgraph_edges (struct cgraph_edge *edge,
675 struct lto_simple_output_block *ob,
676 lto_cgraph_encoder_t encoder)
677 {
678 if (!edge)
679 return;
680
681 /* Output edges in backward direction, so the reconstructed callgraph match
682 and it is easy to associate call sites in the IPA pass summaries. */
683 while (edge->next_callee)
684 edge = edge->next_callee;
685 for (; edge; edge = edge->prev_callee)
686 lto_output_edge (ob, edge, encoder);
687 }
688
689 /* Output the part of the cgraph in SET. */
690
691 static void
692 output_refs (cgraph_node_set set, varpool_node_set vset,
693 lto_cgraph_encoder_t encoder,
694 lto_varpool_encoder_t varpool_encoder)
695 {
696 cgraph_node_set_iterator csi;
697 varpool_node_set_iterator vsi;
698 struct lto_simple_output_block *ob;
699 int count;
700 struct ipa_ref *ref;
701 int i;
702
703 ob = lto_create_simple_output_block (LTO_section_refs);
704
705 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
706 {
707 struct cgraph_node *node = csi_node (csi);
708
709 count = ipa_ref_list_nreferences (&node->ref_list);
710 if (count)
711 {
712 lto_output_uleb128_stream (ob->main_stream, count);
713 lto_output_uleb128_stream (ob->main_stream,
714 lto_cgraph_encoder_lookup (encoder, node));
715 for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
716 lto_output_ref (ob, ref, encoder, varpool_encoder);
717 }
718 }
719
720 lto_output_uleb128_stream (ob->main_stream, 0);
721
722 for (vsi = vsi_start (vset); !vsi_end_p (vsi); vsi_next (&vsi))
723 {
724 struct varpool_node *node = vsi_node (vsi);
725
726 count = ipa_ref_list_nreferences (&node->ref_list);
727 if (count)
728 {
729 lto_output_uleb128_stream (ob->main_stream, count);
730 lto_output_uleb128_stream (ob->main_stream,
731 lto_varpool_encoder_lookup (varpool_encoder,
732 node));
733 for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
734 lto_output_ref (ob, ref, encoder, varpool_encoder);
735 }
736 }
737
738 lto_output_uleb128_stream (ob->main_stream, 0);
739
740 lto_destroy_simple_output_block (ob);
741 }
742
743 /* Find out all cgraph and varpool nodes we want to encode in current unit
744 and insert them to encoders. */
745 void
746 compute_ltrans_boundary (struct lto_out_decl_state *state,
747 cgraph_node_set set, varpool_node_set vset)
748 {
749 struct cgraph_node *node;
750 cgraph_node_set_iterator csi;
751 varpool_node_set_iterator vsi;
752 struct cgraph_edge *edge;
753 int i;
754 lto_cgraph_encoder_t encoder;
755 lto_varpool_encoder_t varpool_encoder;
756
757 encoder = state->cgraph_node_encoder = lto_cgraph_encoder_new ();
758 varpool_encoder = state->varpool_node_encoder = lto_varpool_encoder_new ();
759
760 /* Go over all the nodes in SET and assign references. */
761 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
762 {
763 node = csi_node (csi);
764 add_node_to (encoder, node, true);
765 add_references (encoder, varpool_encoder, &node->ref_list);
766 }
767 for (vsi = vsi_start (vset); !vsi_end_p (vsi); vsi_next (&vsi))
768 {
769 struct varpool_node *vnode = vsi_node (vsi);
770 gcc_assert (!vnode->alias || vnode->alias_of);
771 lto_varpool_encoder_encode (varpool_encoder, vnode);
772 lto_set_varpool_encoder_encode_initializer (varpool_encoder, vnode);
773 add_references (encoder, varpool_encoder, &vnode->ref_list);
774 }
775 /* Pickle in also the initializer of all referenced readonly variables
776 to help folding. Constant pool variables are not shared, so we must
777 pickle those too. */
778 for (i = 0; i < lto_varpool_encoder_size (varpool_encoder); i++)
779 {
780 struct varpool_node *vnode = lto_varpool_encoder_deref (varpool_encoder, i);
781 if (DECL_INITIAL (vnode->decl)
782 && !lto_varpool_encoder_encode_initializer_p (varpool_encoder,
783 vnode)
784 && const_value_known_p (vnode->decl))
785 {
786 lto_set_varpool_encoder_encode_initializer (varpool_encoder, vnode);
787 add_references (encoder, varpool_encoder, &vnode->ref_list);
788 }
789 }
790
791 /* Go over all the nodes again to include callees that are not in
792 SET. */
793 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
794 {
795 node = csi_node (csi);
796 for (edge = node->callees; edge; edge = edge->next_callee)
797 {
798 struct cgraph_node *callee = edge->callee;
799 if (!cgraph_node_in_set_p (callee, set))
800 {
801 /* We should have moved all the inlines. */
802 gcc_assert (!callee->global.inlined_to);
803 add_node_to (encoder, callee, false);
804 }
805 }
806 }
807 }
808
809 /* Output the part of the cgraph in SET. */
810
811 void
812 output_cgraph (cgraph_node_set set, varpool_node_set vset)
813 {
814 struct cgraph_node *node;
815 struct lto_simple_output_block *ob;
816 cgraph_node_set_iterator csi;
817 int i, n_nodes;
818 lto_cgraph_encoder_t encoder;
819 lto_varpool_encoder_t varpool_encoder;
820 struct cgraph_asm_node *can;
821 static bool asm_nodes_output = false;
822
823 if (flag_wpa)
824 output_cgraph_opt_summary (set);
825
826 ob = lto_create_simple_output_block (LTO_section_cgraph);
827
828 output_profile_summary (ob);
829
830 /* An encoder for cgraph nodes should have been created by
831 ipa_write_summaries_1. */
832 gcc_assert (ob->decl_state->cgraph_node_encoder);
833 gcc_assert (ob->decl_state->varpool_node_encoder);
834 encoder = ob->decl_state->cgraph_node_encoder;
835 varpool_encoder = ob->decl_state->varpool_node_encoder;
836
837 /* Write out the nodes. We must first output a node and then its clones,
838 otherwise at a time reading back the node there would be nothing to clone
839 from. */
840 n_nodes = lto_cgraph_encoder_size (encoder);
841 for (i = 0; i < n_nodes; i++)
842 {
843 node = lto_cgraph_encoder_deref (encoder, i);
844 lto_output_node (ob, node, encoder, set, vset);
845 }
846
847 /* Go over the nodes in SET again to write edges. */
848 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
849 {
850 node = csi_node (csi);
851 output_outgoing_cgraph_edges (node->callees, ob, encoder);
852 output_outgoing_cgraph_edges (node->indirect_calls, ob, encoder);
853 }
854
855 lto_output_uleb128_stream (ob->main_stream, 0);
856
857 /* Emit toplevel asms.
858 When doing WPA we must output every asm just once. Since we do not partition asm
859 nodes at all, output them to first output. This is kind of hack, but should work
860 well. */
861 if (!asm_nodes_output)
862 {
863 asm_nodes_output = true;
864 for (can = cgraph_asm_nodes; can; can = can->next)
865 {
866 int len = TREE_STRING_LENGTH (can->asm_str);
867 lto_output_uleb128_stream (ob->main_stream, len);
868 for (i = 0; i < len; ++i)
869 lto_output_1_stream (ob->main_stream,
870 TREE_STRING_POINTER (can->asm_str)[i]);
871 }
872 }
873
874 lto_output_uleb128_stream (ob->main_stream, 0);
875
876 lto_destroy_simple_output_block (ob);
877 output_varpool (set, vset);
878 output_refs (set, vset, encoder, varpool_encoder);
879 }
880
881 /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS,
882 STACK_SIZE, SELF_TIME and SELF_SIZE. This is called either to initialize
883 NODE or to replace the values in it, for instance because the first
884 time we saw it, the function body was not available but now it
885 is. BP is a bitpack with all the bitflags for NODE read from the
886 stream. */
887
888 static void
889 input_overwrite_node (struct lto_file_decl_data *file_data,
890 struct cgraph_node *node,
891 enum LTO_cgraph_tags tag,
892 struct bitpack_d *bp)
893 {
894 node->aux = (void *) tag;
895 node->local.lto_file_data = file_data;
896
897 node->local.local = bp_unpack_value (bp, 1);
898 node->local.externally_visible = bp_unpack_value (bp, 1);
899 node->local.finalized = bp_unpack_value (bp, 1);
900 node->local.can_change_signature = bp_unpack_value (bp, 1);
901 node->local.redefined_extern_inline = bp_unpack_value (bp, 1);
902 node->needed = bp_unpack_value (bp, 1);
903 node->address_taken = bp_unpack_value (bp, 1);
904 node->abstract_and_needed = bp_unpack_value (bp, 1);
905 node->reachable_from_other_partition = bp_unpack_value (bp, 1);
906 node->lowered = bp_unpack_value (bp, 1);
907 node->analyzed = tag == LTO_cgraph_analyzed_node;
908 node->in_other_partition = bp_unpack_value (bp, 1);
909 if (node->in_other_partition
910 /* Avoid updating decl when we are seeing just inline clone.
911 When inlining function that has functions already inlined into it,
912 we produce clones of inline clones.
913
914 WPA partitioning might put each clone into different unit and
915 we might end up streaming inline clone from other partition
916 to support clone we are interested in. */
917 && (!node->clone_of
918 || node->clone_of->decl != node->decl))
919 {
920 DECL_EXTERNAL (node->decl) = 1;
921 TREE_STATIC (node->decl) = 0;
922 }
923 node->alias = bp_unpack_value (bp, 1);
924 node->frequency = (enum node_frequency)bp_unpack_value (bp, 2);
925 node->only_called_at_startup = bp_unpack_value (bp, 1);
926 node->only_called_at_exit = bp_unpack_value (bp, 1);
927 node->thunk.thunk_p = bp_unpack_value (bp, 1);
928 node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution,
929 LDPR_NUM_KNOWN);
930 }
931
932 /* Output the part of the cgraph in SET. */
933
934 static void
935 output_varpool (cgraph_node_set set, varpool_node_set vset)
936 {
937 struct lto_simple_output_block *ob = lto_create_simple_output_block (LTO_section_varpool);
938 lto_varpool_encoder_t varpool_encoder = ob->decl_state->varpool_node_encoder;
939 int len = lto_varpool_encoder_size (varpool_encoder), i;
940
941 lto_output_uleb128_stream (ob->main_stream, len);
942
943 /* Write out the nodes. We must first output a node and then its clones,
944 otherwise at a time reading back the node there would be nothing to clone
945 from. */
946 for (i = 0; i < len; i++)
947 {
948 lto_output_varpool_node (ob, lto_varpool_encoder_deref (varpool_encoder, i),
949 varpool_encoder,
950 set, vset);
951 }
952
953 lto_destroy_simple_output_block (ob);
954 }
955
956 /* Read a node from input_block IB. TAG is the node's tag just read.
957 Return the node read or overwriten. */
958
959 static struct cgraph_node *
960 input_node (struct lto_file_decl_data *file_data,
961 struct lto_input_block *ib,
962 enum LTO_cgraph_tags tag,
963 VEC(cgraph_node_ptr, heap) *nodes)
964 {
965 tree fn_decl;
966 struct cgraph_node *node;
967 struct bitpack_d bp;
968 unsigned decl_index;
969 int ref = LCC_NOT_FOUND, ref2 = LCC_NOT_FOUND;
970 int clone_ref;
971
972 clone_ref = lto_input_sleb128 (ib);
973
974 decl_index = lto_input_uleb128 (ib);
975 fn_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
976
977 if (clone_ref != LCC_NOT_FOUND)
978 {
979 node = cgraph_clone_node (VEC_index (cgraph_node_ptr, nodes, clone_ref), fn_decl,
980 0, CGRAPH_FREQ_BASE, false, NULL, false);
981 }
982 else
983 node = cgraph_get_create_node (fn_decl);
984
985 node->count = lto_input_sleb128 (ib);
986 node->count_materialization_scale = lto_input_sleb128 (ib);
987
988 if (tag == LTO_cgraph_analyzed_node)
989 ref = lto_input_sleb128 (ib);
990
991 ref2 = lto_input_sleb128 (ib);
992
993 /* Make sure that we have not read this node before. Nodes that
994 have already been read will have their tag stored in the 'aux'
995 field. Since built-in functions can be referenced in multiple
996 functions, they are expected to be read more than once. */
997 if (node->aux && !DECL_IS_BUILTIN (node->decl))
998 internal_error ("bytecode stream: found multiple instances of cgraph "
999 "node %d", node->uid);
1000
1001 bp = lto_input_bitpack (ib);
1002 input_overwrite_node (file_data, node, tag, &bp);
1003
1004 /* Store a reference for now, and fix up later to be a pointer. */
1005 node->global.inlined_to = (cgraph_node_ptr) (intptr_t) ref;
1006
1007 /* Store a reference for now, and fix up later to be a pointer. */
1008 node->same_comdat_group = (cgraph_node_ptr) (intptr_t) ref2;
1009
1010 if (node->thunk.thunk_p)
1011 {
1012 int type = lto_input_uleb128 (ib);
1013 HOST_WIDE_INT fixed_offset = lto_input_uleb128 (ib);
1014 HOST_WIDE_INT virtual_value = lto_input_uleb128 (ib);
1015
1016 node->thunk.fixed_offset = fixed_offset;
1017 node->thunk.this_adjusting = (type & 2);
1018 node->thunk.virtual_value = virtual_value;
1019 node->thunk.virtual_offset_p = (type & 4);
1020 }
1021 if (node->thunk.thunk_p || node->alias)
1022 {
1023 if (lto_input_int_in_range (ib, "alias nonzero flag", 0, 1))
1024 {
1025 decl_index = lto_input_uleb128 (ib);
1026 node->thunk.alias = lto_file_decl_data_get_fn_decl (file_data,
1027 decl_index);
1028 }
1029 }
1030 return node;
1031 }
1032
1033 /* Read a node from input_block IB. TAG is the node's tag just read.
1034 Return the node read or overwriten. */
1035
1036 static struct varpool_node *
1037 input_varpool_node (struct lto_file_decl_data *file_data,
1038 struct lto_input_block *ib)
1039 {
1040 int decl_index;
1041 tree var_decl;
1042 struct varpool_node *node;
1043 struct bitpack_d bp;
1044 int ref = LCC_NOT_FOUND;
1045 bool non_null_aliasof;
1046
1047 decl_index = lto_input_uleb128 (ib);
1048 var_decl = lto_file_decl_data_get_var_decl (file_data, decl_index);
1049 node = varpool_node (var_decl);
1050 node->lto_file_data = file_data;
1051
1052 bp = lto_input_bitpack (ib);
1053 node->externally_visible = bp_unpack_value (&bp, 1);
1054 node->force_output = bp_unpack_value (&bp, 1);
1055 node->finalized = bp_unpack_value (&bp, 1);
1056 node->alias = bp_unpack_value (&bp, 1);
1057 non_null_aliasof = bp_unpack_value (&bp, 1);
1058 node->analyzed = node->finalized;
1059 node->used_from_other_partition = bp_unpack_value (&bp, 1);
1060 node->in_other_partition = bp_unpack_value (&bp, 1);
1061 if (node->in_other_partition)
1062 {
1063 DECL_EXTERNAL (node->decl) = 1;
1064 TREE_STATIC (node->decl) = 0;
1065 }
1066 if (node->finalized)
1067 varpool_mark_needed_node (node);
1068 if (non_null_aliasof)
1069 {
1070 decl_index = lto_input_uleb128 (ib);
1071 node->alias_of = lto_file_decl_data_get_var_decl (file_data, decl_index);
1072 }
1073 ref = lto_input_sleb128 (ib);
1074 /* Store a reference for now, and fix up later to be a pointer. */
1075 node->same_comdat_group = (struct varpool_node *) (intptr_t) ref;
1076 node->resolution = lto_input_enum (ib, ld_plugin_symbol_resolution,
1077 LDPR_NUM_KNOWN);
1078
1079 return node;
1080 }
1081
1082 /* Read a node from input_block IB. TAG is the node's tag just read.
1083 Return the node read or overwriten. */
1084
1085 static void
1086 input_ref (struct lto_input_block *ib,
1087 struct cgraph_node *refering_node,
1088 struct varpool_node *refering_varpool_node,
1089 VEC(cgraph_node_ptr, heap) *nodes,
1090 VEC(varpool_node_ptr, heap) *varpool_nodes)
1091 {
1092 struct cgraph_node *node = NULL;
1093 struct varpool_node *varpool_node = NULL;
1094 struct bitpack_d bp;
1095 enum ipa_ref_type type;
1096 enum ipa_ref_use use;
1097
1098 bp = lto_input_bitpack (ib);
1099 type = (enum ipa_ref_type) bp_unpack_value (&bp, 1);
1100 use = (enum ipa_ref_use) bp_unpack_value (&bp, 2);
1101 if (type == IPA_REF_CGRAPH)
1102 node = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
1103 else
1104 varpool_node = VEC_index (varpool_node_ptr, varpool_nodes, lto_input_sleb128 (ib));
1105 ipa_record_reference (refering_node, refering_varpool_node,
1106 node, varpool_node, use, NULL);
1107 }
1108
1109 /* Read an edge from IB. NODES points to a vector of previously read nodes for
1110 decoding caller and callee of the edge to be read. If INDIRECT is true, the
1111 edge being read is indirect (in the sense that it has
1112 indirect_unknown_callee set). */
1113
1114 static void
1115 input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes,
1116 bool indirect)
1117 {
1118 struct cgraph_node *caller, *callee;
1119 struct cgraph_edge *edge;
1120 unsigned int stmt_id;
1121 gcov_type count;
1122 int freq;
1123 cgraph_inline_failed_t inline_failed;
1124 struct bitpack_d bp;
1125 int ecf_flags = 0;
1126
1127 caller = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
1128 if (caller == NULL || caller->decl == NULL_TREE)
1129 internal_error ("bytecode stream: no caller found while reading edge");
1130
1131 if (!indirect)
1132 {
1133 callee = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
1134 if (callee == NULL || callee->decl == NULL_TREE)
1135 internal_error ("bytecode stream: no callee found while reading edge");
1136 }
1137 else
1138 callee = NULL;
1139
1140 count = (gcov_type) lto_input_sleb128 (ib);
1141
1142 bp = lto_input_bitpack (ib);
1143 inline_failed = bp_unpack_enum (&bp, cgraph_inline_failed_enum, CIF_N_REASONS);
1144 stmt_id = bp_unpack_var_len_unsigned (&bp);
1145 freq = (int) bp_unpack_var_len_unsigned (&bp);
1146
1147 if (indirect)
1148 edge = cgraph_create_indirect_edge (caller, NULL, 0, count, freq);
1149 else
1150 edge = cgraph_create_edge (caller, callee, NULL, count, freq);
1151
1152 edge->indirect_inlining_edge = bp_unpack_value (&bp, 1);
1153 edge->lto_stmt_uid = stmt_id;
1154 edge->inline_failed = inline_failed;
1155 edge->call_stmt_cannot_inline_p = bp_unpack_value (&bp, 1);
1156 edge->can_throw_external = bp_unpack_value (&bp, 1);
1157 if (indirect)
1158 {
1159 if (bp_unpack_value (&bp, 1))
1160 ecf_flags |= ECF_CONST;
1161 if (bp_unpack_value (&bp, 1))
1162 ecf_flags |= ECF_PURE;
1163 if (bp_unpack_value (&bp, 1))
1164 ecf_flags |= ECF_NORETURN;
1165 if (bp_unpack_value (&bp, 1))
1166 ecf_flags |= ECF_MALLOC;
1167 if (bp_unpack_value (&bp, 1))
1168 ecf_flags |= ECF_NOTHROW;
1169 if (bp_unpack_value (&bp, 1))
1170 ecf_flags |= ECF_RETURNS_TWICE;
1171 edge->indirect_info->ecf_flags = ecf_flags;
1172 }
1173 }
1174
1175
1176 /* Read a cgraph from IB using the info in FILE_DATA. */
1177
1178 static VEC(cgraph_node_ptr, heap) *
1179 input_cgraph_1 (struct lto_file_decl_data *file_data,
1180 struct lto_input_block *ib)
1181 {
1182 enum LTO_cgraph_tags tag;
1183 VEC(cgraph_node_ptr, heap) *nodes = NULL;
1184 struct cgraph_node *node;
1185 unsigned i;
1186 unsigned HOST_WIDE_INT len;
1187
1188 tag = lto_input_enum (ib, LTO_cgraph_tags, LTO_cgraph_last_tag);
1189 while (tag)
1190 {
1191 if (tag == LTO_cgraph_edge)
1192 input_edge (ib, nodes, false);
1193 else if (tag == LTO_cgraph_indirect_edge)
1194 input_edge (ib, nodes, true);
1195 else
1196 {
1197 node = input_node (file_data, ib, tag,nodes);
1198 if (node == NULL || node->decl == NULL_TREE)
1199 internal_error ("bytecode stream: found empty cgraph node");
1200 VEC_safe_push (cgraph_node_ptr, heap, nodes, node);
1201 lto_cgraph_encoder_encode (file_data->cgraph_node_encoder, node);
1202 }
1203
1204 tag = lto_input_enum (ib, LTO_cgraph_tags, LTO_cgraph_last_tag);
1205 }
1206
1207 /* Input toplevel asms. */
1208 len = lto_input_uleb128 (ib);
1209 while (len)
1210 {
1211 char *str = (char *)xmalloc (len + 1);
1212 for (i = 0; i < len; ++i)
1213 str[i] = lto_input_1_unsigned (ib);
1214 cgraph_add_asm_node (build_string (len, str));
1215 free (str);
1216
1217 len = lto_input_uleb128 (ib);
1218 }
1219 /* AUX pointers should be all non-zero for nodes read from the stream. */
1220 #ifdef ENABLE_CHECKING
1221 FOR_EACH_VEC_ELT (cgraph_node_ptr, nodes, i, node)
1222 gcc_assert (node->aux);
1223 #endif
1224 FOR_EACH_VEC_ELT (cgraph_node_ptr, nodes, i, node)
1225 {
1226 int ref = (int) (intptr_t) node->global.inlined_to;
1227
1228 /* We share declaration of builtins, so we may read same node twice. */
1229 if (!node->aux)
1230 continue;
1231 node->aux = NULL;
1232
1233 /* Fixup inlined_to from reference to pointer. */
1234 if (ref != LCC_NOT_FOUND)
1235 node->global.inlined_to = VEC_index (cgraph_node_ptr, nodes, ref);
1236 else
1237 node->global.inlined_to = NULL;
1238
1239 ref = (int) (intptr_t) node->same_comdat_group;
1240
1241 /* Fixup same_comdat_group from reference to pointer. */
1242 if (ref != LCC_NOT_FOUND)
1243 node->same_comdat_group = VEC_index (cgraph_node_ptr, nodes, ref);
1244 else
1245 node->same_comdat_group = NULL;
1246 }
1247 FOR_EACH_VEC_ELT (cgraph_node_ptr, nodes, i, node)
1248 node->aux = (void *)1;
1249 return nodes;
1250 }
1251
1252 /* Read a varpool from IB using the info in FILE_DATA. */
1253
1254 static VEC(varpool_node_ptr, heap) *
1255 input_varpool_1 (struct lto_file_decl_data *file_data,
1256 struct lto_input_block *ib)
1257 {
1258 unsigned HOST_WIDE_INT len;
1259 VEC(varpool_node_ptr, heap) *varpool = NULL;
1260 int i;
1261 struct varpool_node *node;
1262
1263 len = lto_input_uleb128 (ib);
1264 while (len)
1265 {
1266 VEC_safe_push (varpool_node_ptr, heap, varpool,
1267 input_varpool_node (file_data, ib));
1268 len--;
1269 }
1270 #ifdef ENABLE_CHECKING
1271 FOR_EACH_VEC_ELT (varpool_node_ptr, varpool, i, node)
1272 gcc_assert (!node->aux);
1273 #endif
1274 FOR_EACH_VEC_ELT (varpool_node_ptr, varpool, i, node)
1275 {
1276 int ref = (int) (intptr_t) node->same_comdat_group;
1277 /* We share declaration of builtins, so we may read same node twice. */
1278 if (node->aux)
1279 continue;
1280 node->aux = (void *)1;
1281
1282 /* Fixup same_comdat_group from reference to pointer. */
1283 if (ref != LCC_NOT_FOUND)
1284 node->same_comdat_group = VEC_index (varpool_node_ptr, varpool, ref);
1285 else
1286 node->same_comdat_group = NULL;
1287 }
1288 FOR_EACH_VEC_ELT (varpool_node_ptr, varpool, i, node)
1289 node->aux = NULL;
1290 return varpool;
1291 }
1292
1293 /* Input ipa_refs. */
1294
1295 static void
1296 input_refs (struct lto_input_block *ib,
1297 VEC(cgraph_node_ptr, heap) *nodes,
1298 VEC(varpool_node_ptr, heap) *varpool)
1299 {
1300 int count;
1301 int idx;
1302 while (true)
1303 {
1304 struct cgraph_node *node;
1305 count = lto_input_uleb128 (ib);
1306 if (!count)
1307 break;
1308 idx = lto_input_uleb128 (ib);
1309 node = VEC_index (cgraph_node_ptr, nodes, idx);
1310 while (count)
1311 {
1312 input_ref (ib, node, NULL, nodes, varpool);
1313 count--;
1314 }
1315 }
1316 while (true)
1317 {
1318 struct varpool_node *node;
1319 count = lto_input_uleb128 (ib);
1320 if (!count)
1321 break;
1322 node = VEC_index (varpool_node_ptr, varpool, lto_input_uleb128 (ib));
1323 while (count)
1324 {
1325 input_ref (ib, NULL, node, nodes, varpool);
1326 count--;
1327 }
1328 }
1329 }
1330
1331
1332 static struct gcov_ctr_summary lto_gcov_summary;
1333
1334 /* Input profile_info from IB. */
1335 static void
1336 input_profile_summary (struct lto_input_block *ib,
1337 struct lto_file_decl_data *file_data)
1338 {
1339 unsigned int runs = lto_input_uleb128 (ib);
1340 if (runs)
1341 {
1342 file_data->profile_info.runs = runs;
1343 file_data->profile_info.sum_max = lto_input_uleb128 (ib);
1344 }
1345
1346 }
1347
1348 /* Rescale profile summaries to the same number of runs in the whole unit. */
1349
1350 static void
1351 merge_profile_summaries (struct lto_file_decl_data **file_data_vec)
1352 {
1353 struct lto_file_decl_data *file_data;
1354 unsigned int j;
1355 gcov_unsigned_t max_runs = 0;
1356 struct cgraph_node *node;
1357 struct cgraph_edge *edge;
1358
1359 /* Find unit with maximal number of runs. If we ever get serious about
1360 roundoff errors, we might also consider computing smallest common
1361 multiply. */
1362 for (j = 0; (file_data = file_data_vec[j]) != NULL; j++)
1363 if (max_runs < file_data->profile_info.runs)
1364 max_runs = file_data->profile_info.runs;
1365
1366 if (!max_runs)
1367 return;
1368
1369 /* Simple overflow check. We probably don't need to support that many train
1370 runs. Such a large value probably imply data corruption anyway. */
1371 if (max_runs > INT_MAX / REG_BR_PROB_BASE)
1372 {
1373 sorry ("At most %i profile runs is supported. Perhaps corrupted profile?",
1374 INT_MAX / REG_BR_PROB_BASE);
1375 return;
1376 }
1377
1378 profile_info = &lto_gcov_summary;
1379 lto_gcov_summary.runs = max_runs;
1380 lto_gcov_summary.sum_max = 0;
1381
1382 /* Rescale all units to the maximal number of runs.
1383 sum_max can not be easily merged, as we have no idea what files come from
1384 the same run. We do not use the info anyway, so leave it 0. */
1385 for (j = 0; (file_data = file_data_vec[j]) != NULL; j++)
1386 if (file_data->profile_info.runs)
1387 {
1388 int scale = ((REG_BR_PROB_BASE * max_runs
1389 + file_data->profile_info.runs / 2)
1390 / file_data->profile_info.runs);
1391 lto_gcov_summary.sum_max = MAX (lto_gcov_summary.sum_max,
1392 (file_data->profile_info.sum_max
1393 * scale
1394 + REG_BR_PROB_BASE / 2)
1395 / REG_BR_PROB_BASE);
1396 }
1397
1398 /* Watch roundoff errors. */
1399 if (lto_gcov_summary.sum_max < max_runs)
1400 lto_gcov_summary.sum_max = max_runs;
1401
1402 /* If merging already happent at WPA time, we are done. */
1403 if (flag_ltrans)
1404 return;
1405
1406 /* Now compute count_materialization_scale of each node.
1407 During LTRANS we already have values of count_materialization_scale
1408 computed, so just update them. */
1409 for (node = cgraph_nodes; node; node = node->next)
1410 if (node->local.lto_file_data
1411 && node->local.lto_file_data->profile_info.runs)
1412 {
1413 int scale;
1414
1415 scale =
1416 ((node->count_materialization_scale * max_runs
1417 + node->local.lto_file_data->profile_info.runs / 2)
1418 / node->local.lto_file_data->profile_info.runs);
1419 node->count_materialization_scale = scale;
1420 if (scale < 0)
1421 fatal_error ("Profile information in %s corrupted",
1422 file_data->file_name);
1423
1424 if (scale == REG_BR_PROB_BASE)
1425 continue;
1426 for (edge = node->callees; edge; edge = edge->next_callee)
1427 edge->count = ((edge->count * scale + REG_BR_PROB_BASE / 2)
1428 / REG_BR_PROB_BASE);
1429 node->count = ((node->count * scale + REG_BR_PROB_BASE / 2)
1430 / REG_BR_PROB_BASE);
1431 }
1432 }
1433
1434 /* Input and merge the cgraph from each of the .o files passed to
1435 lto1. */
1436
1437 void
1438 input_cgraph (void)
1439 {
1440 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
1441 struct lto_file_decl_data *file_data;
1442 unsigned int j = 0;
1443 struct cgraph_node *node;
1444
1445 while ((file_data = file_data_vec[j++]))
1446 {
1447 const char *data;
1448 size_t len;
1449 struct lto_input_block *ib;
1450 VEC(cgraph_node_ptr, heap) *nodes;
1451 VEC(varpool_node_ptr, heap) *varpool;
1452
1453 ib = lto_create_simple_input_block (file_data, LTO_section_cgraph,
1454 &data, &len);
1455 if (!ib)
1456 fatal_error ("cannot find LTO cgraph in %s", file_data->file_name);
1457 input_profile_summary (ib, file_data);
1458 file_data->cgraph_node_encoder = lto_cgraph_encoder_new ();
1459 nodes = input_cgraph_1 (file_data, ib);
1460 lto_destroy_simple_input_block (file_data, LTO_section_cgraph,
1461 ib, data, len);
1462
1463 ib = lto_create_simple_input_block (file_data, LTO_section_varpool,
1464 &data, &len);
1465 if (!ib)
1466 fatal_error ("cannot find LTO varpool in %s", file_data->file_name);
1467 varpool = input_varpool_1 (file_data, ib);
1468 lto_destroy_simple_input_block (file_data, LTO_section_varpool,
1469 ib, data, len);
1470
1471 ib = lto_create_simple_input_block (file_data, LTO_section_refs,
1472 &data, &len);
1473 if (!ib)
1474 fatal_error("cannot find LTO section refs in %s", file_data->file_name);
1475 input_refs (ib, nodes, varpool);
1476 lto_destroy_simple_input_block (file_data, LTO_section_refs,
1477 ib, data, len);
1478 if (flag_ltrans)
1479 input_cgraph_opt_summary (nodes);
1480 VEC_free (cgraph_node_ptr, heap, nodes);
1481 VEC_free (varpool_node_ptr, heap, varpool);
1482 }
1483
1484 merge_profile_summaries (file_data_vec);
1485
1486 /* Clear out the aux field that was used to store enough state to
1487 tell which nodes should be overwritten. */
1488 for (node = cgraph_nodes; node; node = node->next)
1489 {
1490 /* Some nodes may have been created by cgraph_node. This
1491 happens when the callgraph contains nested functions. If the
1492 node for the parent function was never emitted to the gimple
1493 file, cgraph_node will create a node for it when setting the
1494 context of the nested function. */
1495 if (node->local.lto_file_data)
1496 node->aux = NULL;
1497 }
1498 }
1499
1500 /* True when we need optimization summary for NODE. */
1501
1502 static int
1503 output_cgraph_opt_summary_p (struct cgraph_node *node, cgraph_node_set set)
1504 {
1505 struct cgraph_edge *e;
1506
1507 if (cgraph_node_in_set_p (node, set))
1508 {
1509 for (e = node->callees; e; e = e->next_callee)
1510 if (e->indirect_info
1511 && e->indirect_info->thunk_delta != 0)
1512 return true;
1513
1514 for (e = node->indirect_calls; e; e = e->next_callee)
1515 if (e->indirect_info->thunk_delta != 0)
1516 return true;
1517 }
1518
1519 return (node->clone_of
1520 && (node->clone.tree_map
1521 || node->clone.args_to_skip
1522 || node->clone.combined_args_to_skip));
1523 }
1524
1525 /* Output optimization summary for EDGE to OB. */
1526 static void
1527 output_edge_opt_summary (struct output_block *ob,
1528 struct cgraph_edge *edge)
1529 {
1530 if (edge->indirect_info)
1531 lto_output_sleb128_stream (ob->main_stream,
1532 edge->indirect_info->thunk_delta);
1533 else
1534 lto_output_sleb128_stream (ob->main_stream, 0);
1535 }
1536
1537 /* Output optimization summary for NODE to OB. */
1538
1539 static void
1540 output_node_opt_summary (struct output_block *ob,
1541 struct cgraph_node *node,
1542 cgraph_node_set set)
1543 {
1544 unsigned int index;
1545 bitmap_iterator bi;
1546 struct ipa_replace_map *map;
1547 struct bitpack_d bp;
1548 int i;
1549 struct cgraph_edge *e;
1550
1551 if (node->clone.args_to_skip)
1552 {
1553 lto_output_uleb128_stream (ob->main_stream,
1554 bitmap_count_bits (node->clone.args_to_skip));
1555 EXECUTE_IF_SET_IN_BITMAP (node->clone.args_to_skip, 0, index, bi)
1556 lto_output_uleb128_stream (ob->main_stream, index);
1557 }
1558 else
1559 lto_output_uleb128_stream (ob->main_stream, 0);
1560 if (node->clone.combined_args_to_skip)
1561 {
1562 lto_output_uleb128_stream (ob->main_stream,
1563 bitmap_count_bits (node->clone.combined_args_to_skip));
1564 EXECUTE_IF_SET_IN_BITMAP (node->clone.combined_args_to_skip, 0, index, bi)
1565 lto_output_uleb128_stream (ob->main_stream, index);
1566 }
1567 else
1568 lto_output_uleb128_stream (ob->main_stream, 0);
1569 lto_output_uleb128_stream (ob->main_stream,
1570 VEC_length (ipa_replace_map_p, node->clone.tree_map));
1571 FOR_EACH_VEC_ELT (ipa_replace_map_p, node->clone.tree_map, i, map)
1572 {
1573 int parm_num;
1574 tree parm;
1575
1576 for (parm_num = 0, parm = DECL_ARGUMENTS (node->decl); parm;
1577 parm = DECL_CHAIN (parm), parm_num++)
1578 if (map->old_tree == parm)
1579 break;
1580 /* At the moment we assume all old trees to be PARM_DECLs, because we have no
1581 mechanism to store function local declarations into summaries. */
1582 gcc_assert (parm);
1583 lto_output_uleb128_stream (ob->main_stream, parm_num);
1584 lto_output_tree (ob, map->new_tree, true);
1585 bp = bitpack_create (ob->main_stream);
1586 bp_pack_value (&bp, map->replace_p, 1);
1587 bp_pack_value (&bp, map->ref_p, 1);
1588 lto_output_bitpack (&bp);
1589 }
1590
1591 if (cgraph_node_in_set_p (node, set))
1592 {
1593 for (e = node->callees; e; e = e->next_callee)
1594 output_edge_opt_summary (ob, e);
1595 for (e = node->indirect_calls; e; e = e->next_callee)
1596 output_edge_opt_summary (ob, e);
1597 }
1598 }
1599
1600 /* Output optimization summaries stored in callgraph.
1601 At the moment it is the clone info structure. */
1602
1603 static void
1604 output_cgraph_opt_summary (cgraph_node_set set)
1605 {
1606 struct cgraph_node *node;
1607 int i, n_nodes;
1608 lto_cgraph_encoder_t encoder;
1609 struct output_block *ob = create_output_block (LTO_section_cgraph_opt_sum);
1610 unsigned count = 0;
1611
1612 ob->cgraph_node = NULL;
1613 encoder = ob->decl_state->cgraph_node_encoder;
1614 n_nodes = lto_cgraph_encoder_size (encoder);
1615 for (i = 0; i < n_nodes; i++)
1616 if (output_cgraph_opt_summary_p (lto_cgraph_encoder_deref (encoder, i),
1617 set))
1618 count++;
1619 lto_output_uleb128_stream (ob->main_stream, count);
1620 for (i = 0; i < n_nodes; i++)
1621 {
1622 node = lto_cgraph_encoder_deref (encoder, i);
1623 if (output_cgraph_opt_summary_p (node, set))
1624 {
1625 lto_output_uleb128_stream (ob->main_stream, i);
1626 output_node_opt_summary (ob, node, set);
1627 }
1628 }
1629 produce_asm (ob, NULL);
1630 destroy_output_block (ob);
1631 }
1632
1633 /* Input optimisation summary of EDGE. */
1634
1635 static void
1636 input_edge_opt_summary (struct cgraph_edge *edge,
1637 struct lto_input_block *ib_main)
1638 {
1639 HOST_WIDE_INT thunk_delta;
1640 thunk_delta = lto_input_sleb128 (ib_main);
1641 if (thunk_delta != 0)
1642 {
1643 gcc_assert (!edge->indirect_info);
1644 edge->indirect_info = cgraph_allocate_init_indirect_info ();
1645 edge->indirect_info->thunk_delta = thunk_delta;
1646 }
1647 }
1648
1649 /* Input optimisation summary of NODE. */
1650
1651 static void
1652 input_node_opt_summary (struct cgraph_node *node,
1653 struct lto_input_block *ib_main,
1654 struct data_in *data_in)
1655 {
1656 int i;
1657 int count;
1658 int bit;
1659 struct bitpack_d bp;
1660 struct cgraph_edge *e;
1661
1662 count = lto_input_uleb128 (ib_main);
1663 if (count)
1664 node->clone.args_to_skip = BITMAP_GGC_ALLOC ();
1665 for (i = 0; i < count; i++)
1666 {
1667 bit = lto_input_uleb128 (ib_main);
1668 bitmap_set_bit (node->clone.args_to_skip, bit);
1669 }
1670 count = lto_input_uleb128 (ib_main);
1671 if (count)
1672 node->clone.combined_args_to_skip = BITMAP_GGC_ALLOC ();
1673 for (i = 0; i < count; i++)
1674 {
1675 bit = lto_input_uleb128 (ib_main);
1676 bitmap_set_bit (node->clone.combined_args_to_skip, bit);
1677 }
1678 count = lto_input_uleb128 (ib_main);
1679 for (i = 0; i < count; i++)
1680 {
1681 int parm_num;
1682 tree parm;
1683 struct ipa_replace_map *map = ggc_alloc_ipa_replace_map ();
1684
1685 VEC_safe_push (ipa_replace_map_p, gc, node->clone.tree_map, map);
1686 for (parm_num = 0, parm = DECL_ARGUMENTS (node->decl); parm_num;
1687 parm = DECL_CHAIN (parm))
1688 parm_num --;
1689 map->parm_num = lto_input_uleb128 (ib_main);
1690 map->old_tree = NULL;
1691 map->new_tree = lto_input_tree (ib_main, data_in);
1692 bp = lto_input_bitpack (ib_main);
1693 map->replace_p = bp_unpack_value (&bp, 1);
1694 map->ref_p = bp_unpack_value (&bp, 1);
1695 }
1696 for (e = node->callees; e; e = e->next_callee)
1697 input_edge_opt_summary (e, ib_main);
1698 for (e = node->indirect_calls; e; e = e->next_callee)
1699 input_edge_opt_summary (e, ib_main);
1700 }
1701
1702 /* Read section in file FILE_DATA of length LEN with data DATA. */
1703
1704 static void
1705 input_cgraph_opt_section (struct lto_file_decl_data *file_data,
1706 const char *data, size_t len, VEC (cgraph_node_ptr,
1707 heap) * nodes)
1708 {
1709 const struct lto_function_header *header =
1710 (const struct lto_function_header *) data;
1711 const int32_t cfg_offset = sizeof (struct lto_function_header);
1712 const int32_t main_offset = cfg_offset + header->cfg_size;
1713 const int32_t string_offset = main_offset + header->main_size;
1714 struct data_in *data_in;
1715 struct lto_input_block ib_main;
1716 unsigned int i;
1717 unsigned int count;
1718
1719 LTO_INIT_INPUT_BLOCK (ib_main, (const char *) data + main_offset, 0,
1720 header->main_size);
1721
1722 data_in =
1723 lto_data_in_create (file_data, (const char *) data + string_offset,
1724 header->string_size, NULL);
1725 count = lto_input_uleb128 (&ib_main);
1726
1727 for (i = 0; i < count; i++)
1728 {
1729 int ref = lto_input_uleb128 (&ib_main);
1730 input_node_opt_summary (VEC_index (cgraph_node_ptr, nodes, ref),
1731 &ib_main, data_in);
1732 }
1733 lto_free_section_data (file_data, LTO_section_cgraph_opt_sum, NULL, data,
1734 len);
1735 lto_data_in_delete (data_in);
1736 }
1737
1738 /* Input optimization summary of cgraph. */
1739
1740 static void
1741 input_cgraph_opt_summary (VEC (cgraph_node_ptr, heap) * nodes)
1742 {
1743 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
1744 struct lto_file_decl_data *file_data;
1745 unsigned int j = 0;
1746
1747 while ((file_data = file_data_vec[j++]))
1748 {
1749 size_t len;
1750 const char *data =
1751 lto_get_section_data (file_data, LTO_section_cgraph_opt_sum, NULL,
1752 &len);
1753
1754 if (data)
1755 input_cgraph_opt_section (file_data, data, len, nodes);
1756 }
1757 }