cgraph.c (cgraph_remove_node): Kill bodies in other partitoin.
[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 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 "toplev.h"
28 #include "tree.h"
29 #include "expr.h"
30 #include "flags.h"
31 #include "params.h"
32 #include "input.h"
33 #include "varray.h"
34 #include "hashtab.h"
35 #include "langhooks.h"
36 #include "basic-block.h"
37 #include "tree-flow.h"
38 #include "cgraph.h"
39 #include "function.h"
40 #include "ggc.h"
41 #include "diagnostic.h"
42 #include "except.h"
43 #include "vec.h"
44 #include "timevar.h"
45 #include "output.h"
46 #include "pointer-set.h"
47 #include "lto-streamer.h"
48 #include "gcov-io.h"
49
50 /* Create a new cgraph encoder. */
51
52 lto_cgraph_encoder_t
53 lto_cgraph_encoder_new (void)
54 {
55 lto_cgraph_encoder_t encoder = XCNEW (struct lto_cgraph_encoder_d);
56 encoder->map = pointer_map_create ();
57 encoder->nodes = NULL;
58 return encoder;
59 }
60
61
62 /* Delete ENCODER and its components. */
63
64 void
65 lto_cgraph_encoder_delete (lto_cgraph_encoder_t encoder)
66 {
67 VEC_free (cgraph_node_ptr, heap, encoder->nodes);
68 pointer_map_destroy (encoder->map);
69 free (encoder);
70 }
71
72
73 /* Return the existing reference number of NODE in the cgraph encoder in
74 output block OB. Assign a new reference if this is the first time
75 NODE is encoded. */
76
77 int
78 lto_cgraph_encoder_encode (lto_cgraph_encoder_t encoder,
79 struct cgraph_node *node)
80 {
81 int ref;
82 void **slot;
83
84 slot = pointer_map_contains (encoder->map, node);
85 if (!slot)
86 {
87 ref = VEC_length (cgraph_node_ptr, encoder->nodes);
88 slot = pointer_map_insert (encoder->map, node);
89 *slot = (void *) (intptr_t) ref;
90 VEC_safe_push (cgraph_node_ptr, heap, encoder->nodes, node);
91 }
92 else
93 ref = (int) (intptr_t) *slot;
94
95 return ref;
96 }
97
98
99 /* Look up NODE in encoder. Return NODE's reference if it has been encoded
100 or LCC_NOT_FOUND if it is not there. */
101
102 int
103 lto_cgraph_encoder_lookup (lto_cgraph_encoder_t encoder,
104 struct cgraph_node *node)
105 {
106 void **slot = pointer_map_contains (encoder->map, node);
107 return (slot ? (int) (intptr_t) *slot : LCC_NOT_FOUND);
108 }
109
110
111 /* Return the cgraph node corresponding to REF using ENCODER. */
112
113 struct cgraph_node *
114 lto_cgraph_encoder_deref (lto_cgraph_encoder_t encoder, int ref)
115 {
116 if (ref == LCC_NOT_FOUND)
117 return NULL;
118
119 return VEC_index (cgraph_node_ptr, encoder->nodes, ref);
120 }
121
122
123 /* Return number of encoded nodes in ENCODER. */
124
125 static int
126 lto_cgraph_encoder_size (lto_cgraph_encoder_t encoder)
127 {
128 return VEC_length (cgraph_node_ptr, encoder->nodes);
129 }
130
131
132 /* Output the cgraph EDGE to OB using ENCODER. */
133
134 static void
135 lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge,
136 lto_cgraph_encoder_t encoder)
137 {
138 unsigned int uid;
139 intptr_t ref;
140 struct bitpack_d *bp;
141
142 lto_output_uleb128_stream (ob->main_stream, LTO_cgraph_edge);
143
144 ref = lto_cgraph_encoder_lookup (encoder, edge->caller);
145 gcc_assert (ref != LCC_NOT_FOUND);
146 lto_output_sleb128_stream (ob->main_stream, ref);
147
148 ref = lto_cgraph_encoder_lookup (encoder, edge->callee);
149 gcc_assert (ref != LCC_NOT_FOUND);
150 lto_output_sleb128_stream (ob->main_stream, ref);
151
152 lto_output_sleb128_stream (ob->main_stream, edge->count);
153
154 bp = bitpack_create ();
155 uid = flag_wpa ? edge->lto_stmt_uid : gimple_uid (edge->call_stmt);
156 bp_pack_value (bp, uid, HOST_BITS_PER_INT);
157 bp_pack_value (bp, edge->inline_failed, HOST_BITS_PER_INT);
158 bp_pack_value (bp, edge->frequency, HOST_BITS_PER_INT);
159 bp_pack_value (bp, edge->loop_nest, 30);
160 bp_pack_value (bp, edge->indirect_call, 1);
161 bp_pack_value (bp, edge->call_stmt_cannot_inline_p, 1);
162 bp_pack_value (bp, edge->can_throw_external, 1);
163 lto_output_bitpack (ob->main_stream, bp);
164 bitpack_delete (bp);
165 }
166
167 /* Return true when node is reachable from other partition. */
168
169 static bool
170 reachable_from_other_partition_p (struct cgraph_node *node, cgraph_node_set set)
171 {
172 struct cgraph_edge *e;
173 if (node->needed)
174 return true;
175 if (!node->analyzed)
176 return false;
177 if (node->global.inlined_to)
178 return false;
179 for (e = node->callers; e; e = e->next_caller)
180 if (!cgraph_node_in_set_p (e->caller, set))
181 return true;
182 return false;
183 }
184
185 /* Output the cgraph NODE to OB. ENCODER is used to find the
186 reference number of NODE->inlined_to. SET is the set of nodes we
187 are writing to the current file. If NODE is not in SET, then NODE
188 is a boundary of a cgraph_node_set and we pretend NODE just has a
189 decl and no callees. WRITTEN_DECLS is the set of FUNCTION_DECLs
190 that have had their callgraph node written so far. This is used to
191 determine if NODE is a clone of a previously written node. */
192
193 static void
194 lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
195 lto_cgraph_encoder_t encoder, cgraph_node_set set,
196 bitmap written_decls)
197 {
198 unsigned int tag;
199 struct bitpack_d *bp;
200 unsigned local, externally_visible, inlinable, analyzed;
201 bool boundary_p, wrote_decl_p;
202 intptr_t ref;
203 bool in_other_partition = false;
204
205 boundary_p = !cgraph_node_in_set_p (node, set);
206 wrote_decl_p = bitmap_bit_p (written_decls, DECL_UID (node->decl));
207
208 switch (cgraph_function_body_availability (node))
209 {
210 case AVAIL_NOT_AVAILABLE:
211 tag = LTO_cgraph_unavail_node;
212 break;
213
214 case AVAIL_AVAILABLE:
215 case AVAIL_LOCAL:
216 tag = LTO_cgraph_avail_node;
217 break;
218
219 case AVAIL_OVERWRITABLE:
220 tag = LTO_cgraph_overwritable_node;
221 break;
222
223 default:
224 gcc_unreachable ();
225 }
226
227 if (boundary_p)
228 tag = LTO_cgraph_unavail_node;
229
230 lto_output_uleb128_stream (ob->main_stream, tag);
231
232 local = node->local.local;
233 externally_visible = node->local.externally_visible;
234 inlinable = node->local.inlinable;
235 analyzed = node->analyzed;
236
237 /* In WPA mode, we only output part of the call-graph. Also, we
238 fake cgraph node attributes. There are two cases that we care.
239
240 Boundary nodes: There are nodes that are not part of SET but are
241 called from within SET. We artificially make them look like
242 externally visible nodes with no function body.
243
244 Cherry-picked nodes: These are nodes we pulled from other
245 translation units into SET during IPA-inlining. We make them as
246 local static nodes to prevent clashes with other local statics. */
247 if (boundary_p)
248 {
249 /* Inline clones can not be part of boundary.
250 gcc_assert (!node->global.inlined_to);
251
252 FIXME: At the moment they can be, when partition contains an inline
253 clone that is clone of inline clone from outside partition. We can
254 reshape the clone tree and make other tree to be the root, but it
255 needs a bit extra work and will be promplty done by cgraph_remove_node
256 after reading back. */
257 in_other_partition = 1;
258 analyzed = 0;
259 }
260
261 lto_output_uleb128_stream (ob->main_stream, wrote_decl_p);
262
263 if (!wrote_decl_p)
264 bitmap_set_bit (written_decls, DECL_UID (node->decl));
265
266 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, node->decl);
267 lto_output_sleb128_stream (ob->main_stream, node->count);
268
269 bp = bitpack_create ();
270 bp_pack_value (bp, local, 1);
271 bp_pack_value (bp, externally_visible, 1);
272 bp_pack_value (bp, node->local.finalized, 1);
273 bp_pack_value (bp, inlinable, 1);
274 bp_pack_value (bp, node->local.disregard_inline_limits, 1);
275 bp_pack_value (bp, node->local.redefined_extern_inline, 1);
276 bp_pack_value (bp, node->local.for_functions_valid, 1);
277 bp_pack_value (bp, node->local.vtable_method, 1);
278 bp_pack_value (bp, node->needed, 1);
279 bp_pack_value (bp, node->address_taken, 1);
280 bp_pack_value (bp, node->abstract_and_needed, 1);
281 bp_pack_value (bp, node->reachable, 1);
282 bp_pack_value (bp, analyzed && reachable_from_other_partition_p (node, set), 1);
283 bp_pack_value (bp, node->lowered, 1);
284 bp_pack_value (bp, analyzed, 1);
285 bp_pack_value (bp, in_other_partition, 1);
286 bp_pack_value (bp, node->process, 1);
287 bp_pack_value (bp, node->alias, 1);
288 bp_pack_value (bp, node->finalized_by_frontend, 1);
289 lto_output_bitpack (ob->main_stream, bp);
290 bitpack_delete (bp);
291
292 if (tag != LTO_cgraph_unavail_node)
293 {
294 lto_output_sleb128_stream (ob->main_stream,
295 node->local.inline_summary.estimated_self_stack_size);
296 lto_output_sleb128_stream (ob->main_stream,
297 node->local.inline_summary.self_size);
298 lto_output_sleb128_stream (ob->main_stream,
299 node->local.inline_summary.size_inlining_benefit);
300 lto_output_sleb128_stream (ob->main_stream,
301 node->local.inline_summary.self_time);
302 lto_output_sleb128_stream (ob->main_stream,
303 node->local.inline_summary.time_inlining_benefit);
304 }
305
306 /* FIXME lto: Outputting global info is not neccesary until after
307 inliner was run. Global structure holds results of propagation
308 done by inliner. */
309 lto_output_sleb128_stream (ob->main_stream,
310 node->global.estimated_stack_size);
311 lto_output_sleb128_stream (ob->main_stream,
312 node->global.stack_frame_offset);
313 if (node->global.inlined_to && !boundary_p)
314 {
315 ref = lto_cgraph_encoder_lookup (encoder, node->global.inlined_to);
316 gcc_assert (ref != LCC_NOT_FOUND);
317 }
318 else
319 ref = LCC_NOT_FOUND;
320 lto_output_sleb128_stream (ob->main_stream, ref);
321
322 lto_output_sleb128_stream (ob->main_stream, node->global.time);
323 lto_output_sleb128_stream (ob->main_stream, node->global.size);
324 lto_output_sleb128_stream (ob->main_stream,
325 node->global.estimated_growth);
326 lto_output_uleb128_stream (ob->main_stream, node->global.inlined);
327 if (node->same_comdat_group)
328 {
329 ref = lto_cgraph_encoder_lookup (encoder, node->same_comdat_group);
330 gcc_assert (ref != LCC_NOT_FOUND);
331 }
332 else
333 ref = LCC_NOT_FOUND;
334 lto_output_sleb128_stream (ob->main_stream, ref);
335
336 if (node->same_body)
337 {
338 struct cgraph_node *alias;
339 unsigned long alias_count = 1;
340 for (alias = node->same_body; alias->next; alias = alias->next)
341 alias_count++;
342 lto_output_uleb128_stream (ob->main_stream, alias_count);
343 do
344 {
345 lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
346 alias->decl);
347 if (alias->thunk.thunk_p)
348 {
349 lto_output_uleb128_stream
350 (ob->main_stream,
351 1 + (alias->thunk.this_adjusting != 0) * 2
352 + (alias->thunk.virtual_offset_p != 0) * 4);
353 lto_output_uleb128_stream (ob->main_stream,
354 alias->thunk.fixed_offset);
355 lto_output_uleb128_stream (ob->main_stream,
356 alias->thunk.virtual_value);
357 lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
358 alias->thunk.alias);
359 }
360 else
361 {
362 lto_output_uleb128_stream (ob->main_stream, 0);
363 lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
364 alias->thunk.alias);
365 }
366 alias = alias->previous;
367 }
368 while (alias);
369 }
370 else
371 lto_output_uleb128_stream (ob->main_stream, 0);
372 }
373
374 /* Stream out profile_summary to OB. */
375
376 static void
377 output_profile_summary (struct lto_simple_output_block *ob)
378 {
379 if (profile_info)
380 {
381 /* We do not output num, it is not terribly useful. */
382 gcc_assert (profile_info->runs);
383 lto_output_uleb128_stream (ob->main_stream, profile_info->runs);
384 lto_output_sleb128_stream (ob->main_stream, profile_info->sum_all);
385 lto_output_sleb128_stream (ob->main_stream, profile_info->run_max);
386 lto_output_sleb128_stream (ob->main_stream, profile_info->sum_max);
387 }
388 else
389 lto_output_uleb128_stream (ob->main_stream, 0);
390 }
391
392 /* Add NODE into encoder as well as nodes it is cloned from.
393 Do it in a way so clones appear first. */
394 static void
395 add_node_to (lto_cgraph_encoder_t encoder, struct cgraph_node *node)
396 {
397 if (node->clone_of)
398 add_node_to (encoder, node->clone_of);
399 lto_cgraph_encoder_encode (encoder, node);
400 }
401
402 /* Output the part of the cgraph in SET. */
403
404 void
405 output_cgraph (cgraph_node_set set)
406 {
407 struct cgraph_node *node;
408 struct lto_simple_output_block *ob;
409 cgraph_node_set_iterator csi;
410 struct cgraph_edge *edge;
411 int i, n_nodes;
412 bitmap written_decls;
413 lto_cgraph_encoder_t encoder;
414 struct cgraph_asm_node *can;
415
416 ob = lto_create_simple_output_block (LTO_section_cgraph);
417
418 output_profile_summary (ob);
419
420 /* An encoder for cgraph nodes should have been created by
421 ipa_write_summaries_1. */
422 gcc_assert (ob->decl_state->cgraph_node_encoder);
423 encoder = ob->decl_state->cgraph_node_encoder;
424
425 /* The FUNCTION_DECLs for which we have written a node. The first
426 node found is written as the "original" node, the remaining nodes
427 are considered its clones. */
428 written_decls = lto_bitmap_alloc ();
429
430 /* Go over all the nodes in SET and assign references. */
431 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
432 {
433 node = csi_node (csi);
434 add_node_to (encoder, node);
435 }
436
437 /* Go over all the nodes again to include callees that are not in
438 SET. */
439 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
440 {
441 node = csi_node (csi);
442 for (edge = node->callees; edge; edge = edge->next_callee)
443 {
444 struct cgraph_node *callee = edge->callee;
445 if (!cgraph_node_in_set_p (callee, set))
446 {
447 /* We should have moved all the inlines. */
448 gcc_assert (!callee->global.inlined_to);
449 add_node_to (encoder, callee);
450 /* Also with each included function include all other functions
451 in the same comdat group. */
452 if (callee->same_comdat_group)
453 {
454 struct cgraph_node *next;
455 for (next = callee->same_comdat_group;
456 next != callee;
457 next = next->same_comdat_group)
458 if (!cgraph_node_in_set_p (next, set))
459 add_node_to (encoder, next);
460 }
461 }
462 }
463 /* Also with each included function include all other functions
464 in the same comdat group. */
465 if (node->same_comdat_group)
466 {
467 struct cgraph_node *next;
468 for (next = node->same_comdat_group;
469 next != node;
470 next = next->same_comdat_group)
471 if (!cgraph_node_in_set_p (next, set))
472 add_node_to (encoder, next);
473 }
474 }
475
476 /* Write out the nodes. We must first output a node and then its clones,
477 otherwise at a time reading back the node there would be nothing to clone
478 from. */
479 n_nodes = lto_cgraph_encoder_size (encoder);
480 for (i = 0; i < n_nodes; i++)
481 {
482 node = lto_cgraph_encoder_deref (encoder, i);
483 lto_output_node (ob, node, encoder, set, written_decls);
484 }
485
486 lto_bitmap_free (written_decls);
487
488 /* Go over the nodes in SET again to write edges. */
489 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
490 {
491 node = csi_node (csi);
492 if (node->callees)
493 {
494 /* Output edges in backward direction, so the reconstructed callgraph
495 match and it is easy to associate call sites in the IPA pass summaries. */
496 edge = node->callees;
497 while (edge->next_callee)
498 edge = edge->next_callee;
499 for (; edge; edge = edge->prev_callee)
500 lto_output_edge (ob, edge, encoder);
501 }
502 }
503
504 lto_output_uleb128_stream (ob->main_stream, 0);
505
506 /* Emit toplevel asms. */
507 for (can = cgraph_asm_nodes; can; can = can->next)
508 {
509 int len = TREE_STRING_LENGTH (can->asm_str);
510 lto_output_uleb128_stream (ob->main_stream, len);
511 for (i = 0; i < len; ++i)
512 lto_output_1_stream (ob->main_stream,
513 TREE_STRING_POINTER (can->asm_str)[i]);
514 }
515
516 lto_output_uleb128_stream (ob->main_stream, 0);
517
518 lto_destroy_simple_output_block (ob);
519 }
520
521
522 /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS,
523 STACK_SIZE, SELF_TIME and SELF_SIZE. This is called either to initialize
524 NODE or to replace the values in it, for instance because the first
525 time we saw it, the function body was not available but now it
526 is. BP is a bitpack with all the bitflags for NODE read from the
527 stream. */
528
529 static void
530 input_overwrite_node (struct lto_file_decl_data *file_data,
531 struct cgraph_node *node,
532 enum LTO_cgraph_tags tag,
533 struct bitpack_d *bp,
534 unsigned int stack_size,
535 unsigned int self_time,
536 unsigned int time_inlining_benefit,
537 unsigned int self_size,
538 unsigned int size_inlining_benefit)
539 {
540 node->aux = (void *) tag;
541 node->local.inline_summary.estimated_self_stack_size = stack_size;
542 node->local.inline_summary.self_time = self_time;
543 node->local.inline_summary.time_inlining_benefit = time_inlining_benefit;
544 node->local.inline_summary.self_size = self_size;
545 node->local.inline_summary.size_inlining_benefit = size_inlining_benefit;
546 node->global.time = self_time;
547 node->global.size = self_size;
548 node->local.lto_file_data = file_data;
549
550 node->local.local = bp_unpack_value (bp, 1);
551 node->local.externally_visible = bp_unpack_value (bp, 1);
552 node->local.finalized = bp_unpack_value (bp, 1);
553 node->local.inlinable = bp_unpack_value (bp, 1);
554 node->local.disregard_inline_limits = bp_unpack_value (bp, 1);
555 node->local.redefined_extern_inline = bp_unpack_value (bp, 1);
556 node->local.for_functions_valid = bp_unpack_value (bp, 1);
557 node->local.vtable_method = bp_unpack_value (bp, 1);
558 node->needed = bp_unpack_value (bp, 1);
559 node->address_taken = bp_unpack_value (bp, 1);
560 node->abstract_and_needed = bp_unpack_value (bp, 1);
561 node->reachable = bp_unpack_value (bp, 1);
562 node->reachable_from_other_partition = bp_unpack_value (bp, 1);
563 node->lowered = bp_unpack_value (bp, 1);
564 node->analyzed = bp_unpack_value (bp, 1);
565 node->in_other_partition = bp_unpack_value (bp, 1);
566 node->process = bp_unpack_value (bp, 1);
567 node->alias = bp_unpack_value (bp, 1);
568 node->finalized_by_frontend = bp_unpack_value (bp, 1);
569 }
570
571
572 /* Read a node from input_block IB. TAG is the node's tag just read.
573 Return the node read or overwriten. */
574
575 static struct cgraph_node *
576 input_node (struct lto_file_decl_data *file_data,
577 struct lto_input_block *ib,
578 enum LTO_cgraph_tags tag)
579 {
580 tree fn_decl;
581 struct cgraph_node *node;
582 struct bitpack_d *bp;
583 int stack_size = 0;
584 unsigned decl_index;
585 bool clone_p;
586 int estimated_stack_size = 0;
587 int stack_frame_offset = 0;
588 int ref = LCC_NOT_FOUND, ref2 = LCC_NOT_FOUND;
589 int estimated_growth = 0;
590 int time = 0;
591 int size = 0;
592 int self_time = 0;
593 int self_size = 0;
594 int time_inlining_benefit = 0;
595 int size_inlining_benefit = 0;
596 unsigned long same_body_count = 0;
597 bool inlined = false;
598
599 clone_p = (lto_input_uleb128 (ib) != 0);
600
601 decl_index = lto_input_uleb128 (ib);
602 fn_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
603
604 if (clone_p)
605 node = cgraph_clone_node (cgraph_node (fn_decl), 0,
606 CGRAPH_FREQ_BASE, 0, false, NULL);
607
608 else
609 node = cgraph_node (fn_decl);
610
611 node->count = lto_input_sleb128 (ib);
612 bp = lto_input_bitpack (ib);
613
614 if (tag != LTO_cgraph_unavail_node)
615 {
616 stack_size = lto_input_sleb128 (ib);
617 self_size = lto_input_sleb128 (ib);
618 size_inlining_benefit = lto_input_sleb128 (ib);
619 self_time = lto_input_sleb128 (ib);
620 time_inlining_benefit = lto_input_sleb128 (ib);
621 }
622
623 estimated_stack_size = lto_input_sleb128 (ib);
624 stack_frame_offset = lto_input_sleb128 (ib);
625 ref = lto_input_sleb128 (ib);
626 time = lto_input_sleb128 (ib);
627 size = lto_input_sleb128 (ib);
628 estimated_growth = lto_input_sleb128 (ib);
629 inlined = lto_input_uleb128 (ib);
630 ref2 = lto_input_sleb128 (ib);
631 same_body_count = lto_input_uleb128 (ib);
632
633 /* Make sure that we have not read this node before. Nodes that
634 have already been read will have their tag stored in the 'aux'
635 field. Since built-in functions can be referenced in multiple
636 functions, they are expected to be read more than once. */
637 if (node->aux && !DECL_IS_BUILTIN (node->decl))
638 internal_error ("bytecode stream: found multiple instances of cgraph "
639 "node %d", node->uid);
640
641 input_overwrite_node (file_data, node, tag, bp, stack_size, self_time,
642 time_inlining_benefit, self_size,
643 size_inlining_benefit);
644 bitpack_delete (bp);
645
646 node->global.estimated_stack_size = estimated_stack_size;
647 node->global.stack_frame_offset = stack_frame_offset;
648 node->global.time = time;
649 node->global.size = size;
650
651 /* Store a reference for now, and fix up later to be a pointer. */
652 node->global.inlined_to = (cgraph_node_ptr) (intptr_t) ref;
653
654 node->global.estimated_growth = estimated_growth;
655 node->global.inlined = inlined;
656
657 /* Store a reference for now, and fix up later to be a pointer. */
658 node->same_comdat_group = (cgraph_node_ptr) (intptr_t) ref2;
659
660 while (same_body_count-- > 0)
661 {
662 tree alias_decl;
663 int type;
664 decl_index = lto_input_uleb128 (ib);
665 alias_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
666 type = lto_input_uleb128 (ib);
667 if (!type)
668 {
669 tree real_alias;
670 decl_index = lto_input_uleb128 (ib);
671 real_alias = lto_file_decl_data_get_fn_decl (file_data, decl_index);
672 cgraph_same_body_alias (alias_decl, real_alias);
673 }
674 else
675 {
676 HOST_WIDE_INT fixed_offset = lto_input_uleb128 (ib);
677 HOST_WIDE_INT virtual_value = lto_input_uleb128 (ib);
678 tree real_alias;
679 decl_index = lto_input_uleb128 (ib);
680 real_alias = lto_file_decl_data_get_fn_decl (file_data, decl_index);
681 cgraph_add_thunk (alias_decl, fn_decl, type & 2, fixed_offset,
682 virtual_value,
683 (type & 4) ? size_int (virtual_value) : NULL_TREE,
684 real_alias);
685 }
686 }
687 return node;
688 }
689
690
691 /* Read an edge from IB. NODES points to a vector of previously read
692 nodes for decoding caller and callee of the edge to be read. */
693
694 static void
695 input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes)
696 {
697 struct cgraph_node *caller, *callee;
698 struct cgraph_edge *edge;
699 unsigned int stmt_id;
700 gcov_type count;
701 int freq;
702 unsigned int nest;
703 cgraph_inline_failed_t inline_failed;
704 struct bitpack_d *bp;
705 enum ld_plugin_symbol_resolution caller_resolution;
706
707 caller = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
708 if (caller == NULL || caller->decl == NULL_TREE)
709 internal_error ("bytecode stream: no caller found while reading edge");
710
711 callee = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
712 if (callee == NULL || callee->decl == NULL_TREE)
713 internal_error ("bytecode stream: no callee found while reading edge");
714
715 count = (gcov_type) lto_input_sleb128 (ib);
716
717 bp = lto_input_bitpack (ib);
718 stmt_id = (unsigned int) bp_unpack_value (bp, HOST_BITS_PER_INT);
719 inline_failed = (cgraph_inline_failed_t) bp_unpack_value (bp,
720 HOST_BITS_PER_INT);
721 freq = (int) bp_unpack_value (bp, HOST_BITS_PER_INT);
722 nest = (unsigned) bp_unpack_value (bp, 30);
723
724 /* If the caller was preempted, don't create the edge.
725 ??? Should we ever have edges from a preempted caller? */
726 caller_resolution = lto_symtab_get_resolution (caller->decl);
727 if (caller_resolution == LDPR_PREEMPTED_REG
728 || caller_resolution == LDPR_PREEMPTED_IR)
729 return;
730
731 edge = cgraph_create_edge (caller, callee, NULL, count, freq, nest);
732 edge->lto_stmt_uid = stmt_id;
733 edge->inline_failed = inline_failed;
734 edge->indirect_call = bp_unpack_value (bp, 1);
735 edge->call_stmt_cannot_inline_p = bp_unpack_value (bp, 1);
736 edge->can_throw_external = bp_unpack_value (bp, 1);
737 bitpack_delete (bp);
738 }
739
740
741 /* Read a cgraph from IB using the info in FILE_DATA. */
742
743 static void
744 input_cgraph_1 (struct lto_file_decl_data *file_data,
745 struct lto_input_block *ib)
746 {
747 enum LTO_cgraph_tags tag;
748 VEC(cgraph_node_ptr, heap) *nodes = NULL;
749 struct cgraph_node *node;
750 unsigned i;
751 unsigned HOST_WIDE_INT len;
752
753 tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
754 while (tag)
755 {
756 if (tag == LTO_cgraph_edge)
757 input_edge (ib, nodes);
758 else
759 {
760 node = input_node (file_data, ib, tag);
761 if (node == NULL || node->decl == NULL_TREE)
762 internal_error ("bytecode stream: found empty cgraph node");
763 VEC_safe_push (cgraph_node_ptr, heap, nodes, node);
764 lto_cgraph_encoder_encode (file_data->cgraph_node_encoder, node);
765 }
766
767 tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
768 }
769
770 /* Input toplevel asms. */
771 len = lto_input_uleb128 (ib);
772 while (len)
773 {
774 char *str = (char *)xmalloc (len + 1);
775 for (i = 0; i < len; ++i)
776 str[i] = lto_input_1_unsigned (ib);
777 cgraph_add_asm_node (build_string (len, str));
778 free (str);
779
780 len = lto_input_uleb128 (ib);
781 }
782
783 for (i = 0; VEC_iterate (cgraph_node_ptr, nodes, i, node); i++)
784 {
785 int ref = (int) (intptr_t) node->global.inlined_to;
786
787 /* Fixup inlined_to from reference to pointer. */
788 if (ref != LCC_NOT_FOUND)
789 node->global.inlined_to = VEC_index (cgraph_node_ptr, nodes, ref);
790 else
791 node->global.inlined_to = NULL;
792
793 ref = (int) (intptr_t) node->same_comdat_group;
794
795 /* Fixup same_comdat_group from reference to pointer. */
796 if (ref != LCC_NOT_FOUND)
797 node->same_comdat_group = VEC_index (cgraph_node_ptr, nodes, ref);
798 else
799 node->same_comdat_group = NULL;
800 }
801
802 VEC_free (cgraph_node_ptr, heap, nodes);
803 }
804
805 static struct gcov_ctr_summary lto_gcov_summary;
806
807 /* Input profile_info from IB. */
808 static void
809 input_profile_summary (struct lto_input_block *ib)
810 {
811 unsigned int runs = lto_input_uleb128 (ib);
812 if (runs)
813 {
814 if (!profile_info)
815 {
816 profile_info = &lto_gcov_summary;
817 lto_gcov_summary.runs = runs;
818 lto_gcov_summary.sum_all = lto_input_sleb128 (ib);
819 lto_gcov_summary.run_max = lto_input_sleb128 (ib);
820 lto_gcov_summary.sum_max = lto_input_sleb128 (ib);
821 }
822 /* We can support this by scaling all counts to nearest common multiple
823 of all different runs, but it is perhaps not worth the effort. */
824 else if (profile_info->runs != runs
825 || profile_info->sum_all != lto_input_sleb128 (ib)
826 || profile_info->run_max != lto_input_sleb128 (ib)
827 || profile_info->sum_max != lto_input_sleb128 (ib))
828 sorry ("Combining units with different profiles is not supported.");
829 /* We allow some units to have profile and other to not have one. This will
830 just make unprofiled units to be size optimized that is sane. */
831 }
832
833 }
834
835 /* Input and merge the cgraph from each of the .o files passed to
836 lto1. */
837
838 void
839 input_cgraph (void)
840 {
841 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
842 struct lto_file_decl_data *file_data;
843 unsigned int j = 0;
844 struct cgraph_node *node;
845
846 while ((file_data = file_data_vec[j++]))
847 {
848 const char *data;
849 size_t len;
850 struct lto_input_block *ib;
851
852 ib = lto_create_simple_input_block (file_data, LTO_section_cgraph,
853 &data, &len);
854 input_profile_summary (ib);
855 file_data->cgraph_node_encoder = lto_cgraph_encoder_new ();
856 input_cgraph_1 (file_data, ib);
857 lto_destroy_simple_input_block (file_data, LTO_section_cgraph,
858 ib, data, len);
859
860 /* Assume that every file read needs to be processed by LTRANS. */
861 if (flag_wpa)
862 lto_mark_file_for_ltrans (file_data);
863 }
864
865 /* Clear out the aux field that was used to store enough state to
866 tell which nodes should be overwritten. */
867 for (node = cgraph_nodes; node; node = node->next)
868 {
869 /* Some nodes may have been created by cgraph_node. This
870 happens when the callgraph contains nested functions. If the
871 node for the parent function was never emitted to the gimple
872 file, cgraph_node will create a node for it when setting the
873 context of the nested function. */
874 if (node->local.lto_file_data)
875 node->aux = NULL;
876 }
877 }