cgraph.c (same_body_alias_1): Break out of
[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
168 /* Output the cgraph NODE to OB. ENCODER is used to find the
169 reference number of NODE->inlined_to. SET is the set of nodes we
170 are writing to the current file. If NODE is not in SET, then NODE
171 is a boundary of a cgraph_node_set and we pretend NODE just has a
172 decl and no callees. WRITTEN_DECLS is the set of FUNCTION_DECLs
173 that have had their callgraph node written so far. This is used to
174 determine if NODE is a clone of a previously written node. */
175
176 static void
177 lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
178 lto_cgraph_encoder_t encoder, cgraph_node_set set,
179 bitmap written_decls)
180 {
181 unsigned int tag;
182 struct bitpack_d *bp;
183 unsigned local, externally_visible, inlinable, analyzed;
184 bool boundary_p, wrote_decl_p;
185 intptr_t ref;
186
187 boundary_p = !cgraph_node_in_set_p (node, set);
188 wrote_decl_p = bitmap_bit_p (written_decls, DECL_UID (node->decl));
189
190 switch (cgraph_function_body_availability (node))
191 {
192 case AVAIL_NOT_AVAILABLE:
193 tag = LTO_cgraph_unavail_node;
194 break;
195
196 case AVAIL_AVAILABLE:
197 case AVAIL_LOCAL:
198 tag = LTO_cgraph_avail_node;
199 break;
200
201 case AVAIL_OVERWRITABLE:
202 tag = LTO_cgraph_overwritable_node;
203 break;
204
205 default:
206 gcc_unreachable ();
207 }
208
209 if (boundary_p)
210 tag = LTO_cgraph_unavail_node;
211
212 lto_output_uleb128_stream (ob->main_stream, tag);
213
214 local = node->local.local;
215 externally_visible = node->local.externally_visible;
216 inlinable = node->local.inlinable;
217 analyzed = node->analyzed;
218
219 /* In WPA mode, we only output part of the call-graph. Also, we
220 fake cgraph node attributes. There are two cases that we care.
221
222 Boundary nodes: There are nodes that are not part of SET but are
223 called from within SET. We artificially make them look like
224 externally visible nodes with no function body.
225
226 Cherry-picked nodes: These are nodes we pulled from other
227 translation units into SET during IPA-inlining. We make them as
228 local static nodes to prevent clashes with other local statics. */
229 if (boundary_p)
230 {
231 /* Inline clones can not be part of boundary. */
232 gcc_assert (!node->global.inlined_to);
233 local = 0;
234 externally_visible = 1;
235 inlinable = 0;
236 analyzed = 0;
237 }
238 else if (lto_forced_extern_inline_p (node->decl))
239 {
240 local = 1;
241 externally_visible = 0;
242 inlinable = 1;
243 }
244
245 lto_output_uleb128_stream (ob->main_stream, wrote_decl_p);
246
247 if (!wrote_decl_p)
248 bitmap_set_bit (written_decls, DECL_UID (node->decl));
249
250 lto_output_fn_decl_index (ob->decl_state, ob->main_stream, node->decl);
251 lto_output_sleb128_stream (ob->main_stream, node->count);
252
253 bp = bitpack_create ();
254 bp_pack_value (bp, local, 1);
255 bp_pack_value (bp, externally_visible, 1);
256 bp_pack_value (bp, node->local.finalized, 1);
257 bp_pack_value (bp, inlinable, 1);
258 bp_pack_value (bp, node->local.disregard_inline_limits, 1);
259 bp_pack_value (bp, node->local.redefined_extern_inline, 1);
260 bp_pack_value (bp, node->local.for_functions_valid, 1);
261 bp_pack_value (bp, node->local.vtable_method, 1);
262 bp_pack_value (bp, node->needed, 1);
263 bp_pack_value (bp, node->address_taken, 1);
264 bp_pack_value (bp, node->abstract_and_needed, 1);
265 bp_pack_value (bp, node->reachable, 1);
266 bp_pack_value (bp, node->lowered, 1);
267 bp_pack_value (bp, analyzed, 1);
268 bp_pack_value (bp, node->process, 1);
269 bp_pack_value (bp, node->alias, 1);
270 bp_pack_value (bp, node->finalized_by_frontend, 1);
271 lto_output_bitpack (ob->main_stream, bp);
272 bitpack_delete (bp);
273
274 if (tag != LTO_cgraph_unavail_node)
275 {
276 lto_output_sleb128_stream (ob->main_stream,
277 node->local.inline_summary.estimated_self_stack_size);
278 lto_output_sleb128_stream (ob->main_stream,
279 node->local.inline_summary.self_size);
280 lto_output_sleb128_stream (ob->main_stream,
281 node->local.inline_summary.size_inlining_benefit);
282 lto_output_sleb128_stream (ob->main_stream,
283 node->local.inline_summary.self_time);
284 lto_output_sleb128_stream (ob->main_stream,
285 node->local.inline_summary.time_inlining_benefit);
286 }
287
288 /* FIXME lto: Outputting global info is not neccesary until after
289 inliner was run. Global structure holds results of propagation
290 done by inliner. */
291 lto_output_sleb128_stream (ob->main_stream,
292 node->global.estimated_stack_size);
293 lto_output_sleb128_stream (ob->main_stream,
294 node->global.stack_frame_offset);
295 if (node->global.inlined_to && !boundary_p)
296 {
297 ref = lto_cgraph_encoder_lookup (encoder, node->global.inlined_to);
298 gcc_assert (ref != LCC_NOT_FOUND);
299 }
300 else
301 ref = LCC_NOT_FOUND;
302 lto_output_sleb128_stream (ob->main_stream, ref);
303
304 lto_output_sleb128_stream (ob->main_stream, node->global.time);
305 lto_output_sleb128_stream (ob->main_stream, node->global.size);
306 lto_output_sleb128_stream (ob->main_stream,
307 node->global.estimated_growth);
308 lto_output_uleb128_stream (ob->main_stream, node->global.inlined);
309 if (node->same_body)
310 {
311 struct cgraph_node *alias;
312 unsigned long alias_count = 1;
313 for (alias = node->same_body; alias->next; alias = alias->next)
314 alias_count++;
315 lto_output_uleb128_stream (ob->main_stream, alias_count);
316 do
317 {
318 lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
319 alias->decl);
320 if (alias->thunk.thunk_p)
321 {
322 lto_output_uleb128_stream
323 (ob->main_stream,
324 1 + (alias->thunk.this_adjusting != 0) * 2
325 + (alias->thunk.virtual_offset_p != 0) * 4);
326 lto_output_uleb128_stream (ob->main_stream,
327 alias->thunk.fixed_offset);
328 lto_output_uleb128_stream (ob->main_stream,
329 alias->thunk.virtual_value);
330 lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
331 alias->thunk.alias);
332 }
333 else
334 lto_output_uleb128_stream (ob->main_stream, 0);
335 alias = alias->previous;
336 }
337 while (alias);
338 }
339 else
340 lto_output_uleb128_stream (ob->main_stream, 0);
341 }
342
343 /* Stream out profile_summary to OB. */
344
345 static void
346 output_profile_summary (struct lto_simple_output_block *ob)
347 {
348 if (profile_info)
349 {
350 /* We do not output num, it is not terribly useful. */
351 gcc_assert (profile_info->runs);
352 lto_output_uleb128_stream (ob->main_stream, profile_info->runs);
353 lto_output_sleb128_stream (ob->main_stream, profile_info->sum_all);
354 lto_output_sleb128_stream (ob->main_stream, profile_info->run_max);
355 lto_output_sleb128_stream (ob->main_stream, profile_info->sum_max);
356 }
357 else
358 lto_output_uleb128_stream (ob->main_stream, 0);
359 }
360
361
362 /* Output the part of the cgraph in SET. */
363
364 void
365 output_cgraph (cgraph_node_set set)
366 {
367 struct cgraph_node *node;
368 struct lto_simple_output_block *ob;
369 cgraph_node_set_iterator csi;
370 struct cgraph_edge *edge;
371 int i, n_nodes;
372 bitmap written_decls;
373 lto_cgraph_encoder_t encoder;
374 struct cgraph_asm_node *can;
375
376 ob = lto_create_simple_output_block (LTO_section_cgraph);
377
378 output_profile_summary (ob);
379
380 /* An encoder for cgraph nodes should have been created by
381 ipa_write_summaries_1. */
382 gcc_assert (ob->decl_state->cgraph_node_encoder);
383 encoder = ob->decl_state->cgraph_node_encoder;
384
385 /* The FUNCTION_DECLs for which we have written a node. The first
386 node found is written as the "original" node, the remaining nodes
387 are considered its clones. */
388 written_decls = lto_bitmap_alloc ();
389
390 /* Go over all the nodes in SET and assign references. */
391 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
392 {
393 node = csi_node (csi);
394 lto_cgraph_encoder_encode (encoder, node);
395 }
396
397 /* Go over all the nodes again to include callees that are not in
398 SET. */
399 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
400 {
401 node = csi_node (csi);
402 for (edge = node->callees; edge; edge = edge->next_callee)
403 {
404 struct cgraph_node *callee = edge->callee;
405 if (!cgraph_node_in_set_p (callee, set))
406 {
407 /* We should have moved all the inlines. */
408 gcc_assert (!callee->global.inlined_to);
409 lto_cgraph_encoder_encode (encoder, callee);
410 }
411 }
412 }
413
414 /* Write out the nodes. */
415 n_nodes = lto_cgraph_encoder_size (encoder);
416 for (i = 0; i < n_nodes; i++)
417 {
418 node = lto_cgraph_encoder_deref (encoder, i);
419 lto_output_node (ob, node, encoder, set, written_decls);
420 }
421
422 lto_bitmap_free (written_decls);
423
424 /* Go over the nodes in SET again to write edges. */
425 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
426 {
427 node = csi_node (csi);
428 if (node->callees)
429 {
430 /* Output edges in backward direction, so the reconstructed callgraph
431 match and it is easy to associate call sites in the IPA pass summaries. */
432 edge = node->callees;
433 while (edge->next_callee)
434 edge = edge->next_callee;
435 for (; edge; edge = edge->prev_callee)
436 lto_output_edge (ob, edge, encoder);
437 }
438 }
439
440 lto_output_uleb128_stream (ob->main_stream, 0);
441
442 /* Emit toplevel asms. */
443 for (can = cgraph_asm_nodes; can; can = can->next)
444 {
445 int len = TREE_STRING_LENGTH (can->asm_str);
446 lto_output_uleb128_stream (ob->main_stream, len);
447 for (i = 0; i < len; ++i)
448 lto_output_1_stream (ob->main_stream,
449 TREE_STRING_POINTER (can->asm_str)[i]);
450 }
451
452 lto_output_uleb128_stream (ob->main_stream, 0);
453
454 lto_destroy_simple_output_block (ob);
455 }
456
457
458 /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS,
459 STACK_SIZE, SELF_TIME and SELF_SIZE. This is called either to initialize
460 NODE or to replace the values in it, for instance because the first
461 time we saw it, the function body was not available but now it
462 is. BP is a bitpack with all the bitflags for NODE read from the
463 stream. */
464
465 static void
466 input_overwrite_node (struct lto_file_decl_data *file_data,
467 struct cgraph_node *node,
468 enum LTO_cgraph_tags tag,
469 struct bitpack_d *bp,
470 unsigned int stack_size,
471 unsigned int self_time,
472 unsigned int time_inlining_benefit,
473 unsigned int self_size,
474 unsigned int size_inlining_benefit)
475 {
476 node->aux = (void *) tag;
477 node->local.inline_summary.estimated_self_stack_size = stack_size;
478 node->local.inline_summary.self_time = self_time;
479 node->local.inline_summary.time_inlining_benefit = time_inlining_benefit;
480 node->local.inline_summary.self_size = self_size;
481 node->local.inline_summary.size_inlining_benefit = size_inlining_benefit;
482 node->global.time = self_time;
483 node->global.size = self_size;
484 node->local.lto_file_data = file_data;
485
486 node->local.local = bp_unpack_value (bp, 1);
487 node->local.externally_visible = bp_unpack_value (bp, 1);
488 node->local.finalized = bp_unpack_value (bp, 1);
489 node->local.inlinable = bp_unpack_value (bp, 1);
490 node->local.disregard_inline_limits = bp_unpack_value (bp, 1);
491 node->local.redefined_extern_inline = bp_unpack_value (bp, 1);
492 node->local.for_functions_valid = bp_unpack_value (bp, 1);
493 node->local.vtable_method = bp_unpack_value (bp, 1);
494 node->needed = bp_unpack_value (bp, 1);
495 node->address_taken = bp_unpack_value (bp, 1);
496 node->abstract_and_needed = bp_unpack_value (bp, 1);
497 node->reachable = bp_unpack_value (bp, 1);
498 node->lowered = bp_unpack_value (bp, 1);
499 node->analyzed = bp_unpack_value (bp, 1);
500 node->process = bp_unpack_value (bp, 1);
501 node->alias = bp_unpack_value (bp, 1);
502 node->finalized_by_frontend = bp_unpack_value (bp, 1);
503 }
504
505
506 /* Read a node from input_block IB. TAG is the node's tag just read.
507 Return the node read or overwriten. */
508
509 static struct cgraph_node *
510 input_node (struct lto_file_decl_data *file_data,
511 struct lto_input_block *ib,
512 enum LTO_cgraph_tags tag)
513 {
514 tree fn_decl;
515 struct cgraph_node *node;
516 struct bitpack_d *bp;
517 int stack_size = 0;
518 unsigned decl_index;
519 bool clone_p;
520 int estimated_stack_size = 0;
521 int stack_frame_offset = 0;
522 int ref = LCC_NOT_FOUND;
523 int estimated_growth = 0;
524 int time = 0;
525 int size = 0;
526 int self_time = 0;
527 int self_size = 0;
528 int time_inlining_benefit = 0;
529 int size_inlining_benefit = 0;
530 unsigned long same_body_count = 0;
531 bool inlined = false;
532
533 clone_p = (lto_input_uleb128 (ib) != 0);
534
535 decl_index = lto_input_uleb128 (ib);
536 fn_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
537
538 if (clone_p)
539 node = cgraph_clone_node (cgraph_node (fn_decl), 0,
540 CGRAPH_FREQ_BASE, 0, false, NULL);
541
542 else
543 node = cgraph_node (fn_decl);
544
545 node->count = lto_input_sleb128 (ib);
546 bp = lto_input_bitpack (ib);
547
548 if (tag != LTO_cgraph_unavail_node)
549 {
550 stack_size = lto_input_sleb128 (ib);
551 self_size = lto_input_sleb128 (ib);
552 size_inlining_benefit = lto_input_sleb128 (ib);
553 self_time = lto_input_sleb128 (ib);
554 time_inlining_benefit = lto_input_sleb128 (ib);
555 }
556
557 estimated_stack_size = lto_input_sleb128 (ib);
558 stack_frame_offset = lto_input_sleb128 (ib);
559 ref = lto_input_sleb128 (ib);
560 time = lto_input_sleb128 (ib);
561 size = lto_input_sleb128 (ib);
562 estimated_growth = lto_input_sleb128 (ib);
563 inlined = lto_input_uleb128 (ib);
564 same_body_count = lto_input_uleb128 (ib);
565
566 /* Make sure that we have not read this node before. Nodes that
567 have already been read will have their tag stored in the 'aux'
568 field. Since built-in functions can be referenced in multiple
569 functions, they are expected to be read more than once. */
570 if (node->aux && !DECL_IS_BUILTIN (node->decl))
571 internal_error ("bytecode stream: found multiple instances of cgraph "
572 "node %d", node->uid);
573
574 input_overwrite_node (file_data, node, tag, bp, stack_size, self_time,
575 time_inlining_benefit, self_size,
576 size_inlining_benefit);
577 bitpack_delete (bp);
578
579 node->global.estimated_stack_size = estimated_stack_size;
580 node->global.stack_frame_offset = stack_frame_offset;
581 node->global.time = time;
582 node->global.size = size;
583
584 /* Store a reference for now, and fix up later to be a pointer. */
585 node->global.inlined_to = (cgraph_node_ptr) (intptr_t) ref;
586
587 node->global.estimated_growth = estimated_growth;
588 node->global.inlined = inlined;
589
590 while (same_body_count-- > 0)
591 {
592 tree alias_decl;
593 int type;
594 decl_index = lto_input_uleb128 (ib);
595 alias_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
596 type = lto_input_uleb128 (ib);
597 if (!type)
598 cgraph_same_body_alias (alias_decl, fn_decl);
599 else
600 {
601 HOST_WIDE_INT fixed_offset = lto_input_uleb128 (ib);
602 HOST_WIDE_INT virtual_value = lto_input_uleb128 (ib);
603 tree real_alias;
604 decl_index = lto_input_uleb128 (ib);
605 real_alias = lto_file_decl_data_get_fn_decl (file_data, decl_index);
606 cgraph_add_thunk (alias_decl, fn_decl, type & 2, fixed_offset,
607 virtual_value,
608 (type & 4) ? size_int (virtual_value) : NULL_TREE,
609 real_alias);
610 }
611 }
612 return node;
613 }
614
615
616 /* Read an edge from IB. NODES points to a vector of previously read
617 nodes for decoding caller and callee of the edge to be read. */
618
619 static void
620 input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes)
621 {
622 struct cgraph_node *caller, *callee;
623 struct cgraph_edge *edge;
624 unsigned int stmt_id;
625 gcov_type count;
626 int freq;
627 unsigned int nest;
628 cgraph_inline_failed_t inline_failed;
629 struct bitpack_d *bp;
630 enum ld_plugin_symbol_resolution caller_resolution;
631
632 caller = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
633 if (caller == NULL || caller->decl == NULL_TREE)
634 internal_error ("bytecode stream: no caller found while reading edge");
635
636 callee = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
637 if (callee == NULL || callee->decl == NULL_TREE)
638 internal_error ("bytecode stream: no callee found while reading edge");
639
640 count = (gcov_type) lto_input_sleb128 (ib);
641
642 bp = lto_input_bitpack (ib);
643 stmt_id = (unsigned int) bp_unpack_value (bp, HOST_BITS_PER_INT);
644 inline_failed = (cgraph_inline_failed_t) bp_unpack_value (bp,
645 HOST_BITS_PER_INT);
646 freq = (int) bp_unpack_value (bp, HOST_BITS_PER_INT);
647 nest = (unsigned) bp_unpack_value (bp, 30);
648
649 /* If the caller was preempted, don't create the edge.
650 ??? Should we ever have edges from a preempted caller? */
651 caller_resolution = lto_symtab_get_resolution (caller->decl);
652 if (caller_resolution == LDPR_PREEMPTED_REG
653 || caller_resolution == LDPR_PREEMPTED_IR)
654 return;
655
656 edge = cgraph_create_edge (caller, callee, NULL, count, freq, nest);
657 edge->lto_stmt_uid = stmt_id;
658 edge->inline_failed = inline_failed;
659 edge->indirect_call = bp_unpack_value (bp, 1);
660 edge->call_stmt_cannot_inline_p = bp_unpack_value (bp, 1);
661 edge->can_throw_external = bp_unpack_value (bp, 1);
662 bitpack_delete (bp);
663 }
664
665
666 /* Read a cgraph from IB using the info in FILE_DATA. */
667
668 static void
669 input_cgraph_1 (struct lto_file_decl_data *file_data,
670 struct lto_input_block *ib)
671 {
672 enum LTO_cgraph_tags tag;
673 VEC(cgraph_node_ptr, heap) *nodes = NULL;
674 struct cgraph_node *node;
675 unsigned i;
676 unsigned HOST_WIDE_INT len;
677
678 tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
679 while (tag)
680 {
681 if (tag == LTO_cgraph_edge)
682 input_edge (ib, nodes);
683 else
684 {
685 node = input_node (file_data, ib, tag);
686 if (node == NULL || node->decl == NULL_TREE)
687 internal_error ("bytecode stream: found empty cgraph node");
688 VEC_safe_push (cgraph_node_ptr, heap, nodes, node);
689 lto_cgraph_encoder_encode (file_data->cgraph_node_encoder, node);
690 }
691
692 tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
693 }
694
695 /* Input toplevel asms. */
696 len = lto_input_uleb128 (ib);
697 while (len)
698 {
699 char *str = (char *)xmalloc (len + 1);
700 for (i = 0; i < len; ++i)
701 str[i] = lto_input_1_unsigned (ib);
702 cgraph_add_asm_node (build_string (len, str));
703 free (str);
704
705 len = lto_input_uleb128 (ib);
706 }
707
708 for (i = 0; VEC_iterate (cgraph_node_ptr, nodes, i, node); i++)
709 {
710 const int ref = (int) (intptr_t) node->global.inlined_to;
711
712 /* Fixup inlined_to from reference to pointer. */
713 if (ref != LCC_NOT_FOUND)
714 node->global.inlined_to = VEC_index (cgraph_node_ptr, nodes, ref);
715 else
716 node->global.inlined_to = NULL;
717 }
718
719 VEC_free (cgraph_node_ptr, heap, nodes);
720 }
721
722 static struct gcov_ctr_summary lto_gcov_summary;
723
724 /* Input profile_info from IB. */
725 static void
726 input_profile_summary (struct lto_input_block *ib)
727 {
728 unsigned int runs = lto_input_uleb128 (ib);
729 if (runs)
730 {
731 if (!profile_info)
732 {
733 profile_info = &lto_gcov_summary;
734 lto_gcov_summary.runs = runs;
735 lto_gcov_summary.sum_all = lto_input_sleb128 (ib);
736 lto_gcov_summary.run_max = lto_input_sleb128 (ib);
737 lto_gcov_summary.sum_max = lto_input_sleb128 (ib);
738 }
739 /* We can support this by scaling all counts to nearest common multiple
740 of all different runs, but it is perhaps not worth the effort. */
741 else if (profile_info->runs != runs
742 || profile_info->sum_all != lto_input_sleb128 (ib)
743 || profile_info->run_max != lto_input_sleb128 (ib)
744 || profile_info->sum_max != lto_input_sleb128 (ib))
745 sorry ("Combining units with different profiles is not supported.");
746 /* We allow some units to have profile and other to not have one. This will
747 just make unprofiled units to be size optimized that is sane. */
748 }
749
750 }
751
752 /* Input and merge the cgraph from each of the .o files passed to
753 lto1. */
754
755 void
756 input_cgraph (void)
757 {
758 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
759 struct lto_file_decl_data *file_data;
760 unsigned int j = 0;
761 struct cgraph_node *node;
762
763 while ((file_data = file_data_vec[j++]))
764 {
765 const char *data;
766 size_t len;
767 struct lto_input_block *ib;
768
769 ib = lto_create_simple_input_block (file_data, LTO_section_cgraph,
770 &data, &len);
771 input_profile_summary (ib);
772 file_data->cgraph_node_encoder = lto_cgraph_encoder_new ();
773 input_cgraph_1 (file_data, ib);
774 lto_destroy_simple_input_block (file_data, LTO_section_cgraph,
775 ib, data, len);
776
777 /* Assume that every file read needs to be processed by LTRANS. */
778 if (flag_wpa)
779 lto_mark_file_for_ltrans (file_data);
780 }
781
782 /* Clear out the aux field that was used to store enough state to
783 tell which nodes should be overwritten. */
784 for (node = cgraph_nodes; node; node = node->next)
785 {
786 /* Some nodes may have been created by cgraph_node. This
787 happens when the callgraph contains nested functions. If the
788 node for the parent function was never emitted to the gimple
789 file, cgraph_node will create a node for it when setting the
790 context of the nested function. */
791 if (node->local.lto_file_data)
792 node->aux = NULL;
793 }
794 }