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