OSDN Git Service

PR target/43067
[pf3gnuchains/gcc-fork.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_comdat_group)
310     {
311       ref = lto_cgraph_encoder_lookup (encoder, node->same_comdat_group);
312       gcc_assert (ref != LCC_NOT_FOUND);
313     }
314   else
315     ref = LCC_NOT_FOUND;
316   lto_output_sleb128_stream (ob->main_stream, ref);
317
318   if (node->same_body)
319     {
320       struct cgraph_node *alias;
321       unsigned long alias_count = 1;
322       for (alias = node->same_body; alias->next; alias = alias->next)
323         alias_count++;
324       lto_output_uleb128_stream (ob->main_stream, alias_count);
325       do
326         {
327           lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
328                                     alias->decl);
329           if (alias->thunk.thunk_p)
330             {
331               lto_output_uleb128_stream
332                  (ob->main_stream,
333                   1 + (alias->thunk.this_adjusting != 0) * 2
334                   + (alias->thunk.virtual_offset_p != 0) * 4);
335               lto_output_uleb128_stream (ob->main_stream,
336                                          alias->thunk.fixed_offset);
337               lto_output_uleb128_stream (ob->main_stream,
338                                          alias->thunk.virtual_value);
339               lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
340                                         alias->thunk.alias);
341             }
342           else
343             {
344               lto_output_uleb128_stream (ob->main_stream, 0);
345               lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
346                                         alias->thunk.alias);
347             }
348           alias = alias->previous;
349         }
350       while (alias);
351     }
352   else
353     lto_output_uleb128_stream (ob->main_stream, 0);
354 }
355
356 /* Stream out profile_summary to OB.  */
357
358 static void
359 output_profile_summary (struct lto_simple_output_block *ob)
360 {
361   if (profile_info)
362     {
363       /* We do not output num, it is not terribly useful.  */
364       gcc_assert (profile_info->runs);
365       lto_output_uleb128_stream (ob->main_stream, profile_info->runs);
366       lto_output_sleb128_stream (ob->main_stream, profile_info->sum_all);
367       lto_output_sleb128_stream (ob->main_stream, profile_info->run_max);
368       lto_output_sleb128_stream (ob->main_stream, profile_info->sum_max);
369     }
370   else
371     lto_output_uleb128_stream (ob->main_stream, 0);
372 }
373
374
375 /* Output the part of the cgraph in SET.  */
376
377 void
378 output_cgraph (cgraph_node_set set)
379 {
380   struct cgraph_node *node;
381   struct lto_simple_output_block *ob;
382   cgraph_node_set_iterator csi;
383   struct cgraph_edge *edge;
384   int i, n_nodes;
385   bitmap written_decls;
386   lto_cgraph_encoder_t encoder;
387   struct cgraph_asm_node *can;
388
389   ob = lto_create_simple_output_block (LTO_section_cgraph);
390
391   output_profile_summary (ob);
392
393   /* An encoder for cgraph nodes should have been created by
394      ipa_write_summaries_1.  */
395   gcc_assert (ob->decl_state->cgraph_node_encoder);
396   encoder = ob->decl_state->cgraph_node_encoder;
397
398   /* The FUNCTION_DECLs for which we have written a node.  The first
399      node found is written as the "original" node, the remaining nodes
400      are considered its clones.  */
401   written_decls = lto_bitmap_alloc ();
402
403   /* Go over all the nodes in SET and assign references.  */
404   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
405     {
406       node = csi_node (csi);
407       lto_cgraph_encoder_encode (encoder, node);
408     }
409
410   /* Go over all the nodes again to include callees that are not in
411      SET.  */
412   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
413     {
414       node = csi_node (csi);
415       for (edge = node->callees; edge; edge = edge->next_callee)
416         {
417           struct cgraph_node *callee = edge->callee;
418           if (!cgraph_node_in_set_p (callee, set))
419             {
420               /* We should have moved all the inlines.  */
421               gcc_assert (!callee->global.inlined_to);
422               lto_cgraph_encoder_encode (encoder, callee);
423               /* Also with each included function include all other functions
424                  in the same comdat group.  */
425               if (callee->same_comdat_group)
426                 {
427                   struct cgraph_node *next;
428                   for (next = callee->same_comdat_group;
429                        next != callee;
430                        next = next->same_comdat_group)
431                     if (!cgraph_node_in_set_p (next, set))
432                       lto_cgraph_encoder_encode (encoder, next);
433                 }
434             }
435         }
436       /* Also with each included function include all other functions
437          in the same comdat group.  */
438       if (node->same_comdat_group)
439         {
440           struct cgraph_node *next;
441           for (next = node->same_comdat_group;
442                next != node;
443                next = next->same_comdat_group)
444             if (!cgraph_node_in_set_p (next, set))
445               lto_cgraph_encoder_encode (encoder, next);
446         }
447     }
448
449   /* Write out the nodes.  */
450   n_nodes = lto_cgraph_encoder_size (encoder);
451   for (i = 0; i < n_nodes; i++)
452     {
453       node = lto_cgraph_encoder_deref (encoder, i);
454       lto_output_node (ob, node, encoder, set, written_decls);
455     }
456
457   lto_bitmap_free (written_decls);
458
459   /* Go over the nodes in SET again to write edges.  */
460   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
461     {
462       node = csi_node (csi);
463       if (node->callees)
464         {
465           /* Output edges in backward direction, so the reconstructed callgraph
466              match and it is easy to associate call sites in the IPA pass summaries.  */
467           edge = node->callees;
468           while (edge->next_callee)
469             edge = edge->next_callee;
470           for (; edge; edge = edge->prev_callee)
471             lto_output_edge (ob, edge, encoder);
472         }
473     }
474
475   lto_output_uleb128_stream (ob->main_stream, 0);
476
477   /* Emit toplevel asms.  */
478   for (can = cgraph_asm_nodes; can; can = can->next)
479     {
480       int len = TREE_STRING_LENGTH (can->asm_str);
481       lto_output_uleb128_stream (ob->main_stream, len);
482       for (i = 0; i < len; ++i)
483         lto_output_1_stream (ob->main_stream,
484                              TREE_STRING_POINTER (can->asm_str)[i]);
485     }
486
487   lto_output_uleb128_stream (ob->main_stream, 0);
488
489   lto_destroy_simple_output_block (ob);
490 }
491
492
493 /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS,
494    STACK_SIZE, SELF_TIME and SELF_SIZE.  This is called either to initialize
495    NODE or to replace the values in it, for instance because the first
496    time we saw it, the function body was not available but now it
497    is.  BP is a bitpack with all the bitflags for NODE read from the
498    stream.  */
499
500 static void
501 input_overwrite_node (struct lto_file_decl_data *file_data,
502                       struct cgraph_node *node,
503                       enum LTO_cgraph_tags tag,
504                       struct bitpack_d *bp,
505                       unsigned int stack_size,
506                       unsigned int self_time,
507                       unsigned int time_inlining_benefit,
508                       unsigned int self_size,
509                       unsigned int size_inlining_benefit)
510 {
511   node->aux = (void *) tag;
512   node->local.inline_summary.estimated_self_stack_size = stack_size;
513   node->local.inline_summary.self_time = self_time;
514   node->local.inline_summary.time_inlining_benefit = time_inlining_benefit;
515   node->local.inline_summary.self_size = self_size;
516   node->local.inline_summary.size_inlining_benefit = size_inlining_benefit;
517   node->global.time = self_time;
518   node->global.size = self_size;
519   node->local.lto_file_data = file_data;
520
521   node->local.local = bp_unpack_value (bp, 1);
522   node->local.externally_visible = bp_unpack_value (bp, 1);
523   node->local.finalized = bp_unpack_value (bp, 1);
524   node->local.inlinable = bp_unpack_value (bp, 1);
525   node->local.disregard_inline_limits = bp_unpack_value (bp, 1);
526   node->local.redefined_extern_inline = bp_unpack_value (bp, 1);
527   node->local.for_functions_valid = bp_unpack_value (bp, 1);
528   node->local.vtable_method = bp_unpack_value (bp, 1);
529   node->needed = bp_unpack_value (bp, 1);
530   node->address_taken = bp_unpack_value (bp, 1);
531   node->abstract_and_needed = bp_unpack_value (bp, 1);
532   node->reachable = bp_unpack_value (bp, 1);
533   node->lowered = bp_unpack_value (bp, 1);
534   node->analyzed = bp_unpack_value (bp, 1);
535   node->process = bp_unpack_value (bp, 1);
536   node->alias = bp_unpack_value (bp, 1);
537   node->finalized_by_frontend = bp_unpack_value (bp, 1);
538 }
539
540
541 /* Read a node from input_block IB.  TAG is the node's tag just read.
542    Return the node read or overwriten.  */
543
544 static struct cgraph_node *
545 input_node (struct lto_file_decl_data *file_data,
546             struct lto_input_block *ib,
547             enum LTO_cgraph_tags tag)
548 {
549   tree fn_decl;
550   struct cgraph_node *node;
551   struct bitpack_d *bp;
552   int stack_size = 0;
553   unsigned decl_index;
554   bool clone_p;
555   int estimated_stack_size = 0;
556   int stack_frame_offset = 0;
557   int ref = LCC_NOT_FOUND, ref2 = LCC_NOT_FOUND;
558   int estimated_growth = 0;
559   int time = 0;
560   int size = 0;
561   int self_time = 0;
562   int self_size = 0;
563   int time_inlining_benefit = 0;
564   int size_inlining_benefit = 0;
565   unsigned long same_body_count = 0;
566   bool inlined = false;
567
568   clone_p = (lto_input_uleb128 (ib) != 0);
569
570   decl_index = lto_input_uleb128 (ib);
571   fn_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
572
573   if (clone_p)
574     node = cgraph_clone_node (cgraph_node (fn_decl), 0,
575                               CGRAPH_FREQ_BASE, 0, false, NULL);
576
577   else
578     node = cgraph_node (fn_decl);
579
580   node->count = lto_input_sleb128 (ib);
581   bp = lto_input_bitpack (ib);
582
583   if (tag != LTO_cgraph_unavail_node)
584     {
585       stack_size = lto_input_sleb128 (ib);
586       self_size = lto_input_sleb128 (ib);
587       size_inlining_benefit = lto_input_sleb128 (ib);
588       self_time = lto_input_sleb128 (ib);
589       time_inlining_benefit = lto_input_sleb128 (ib);
590     }
591
592   estimated_stack_size = lto_input_sleb128 (ib);
593   stack_frame_offset = lto_input_sleb128 (ib);
594   ref = lto_input_sleb128 (ib);
595   time = lto_input_sleb128 (ib);
596   size = lto_input_sleb128 (ib);
597   estimated_growth = lto_input_sleb128 (ib);
598   inlined = lto_input_uleb128 (ib);
599   ref2 = lto_input_sleb128 (ib);
600   same_body_count = lto_input_uleb128 (ib);
601
602   /* Make sure that we have not read this node before.  Nodes that
603      have already been read will have their tag stored in the 'aux'
604      field.  Since built-in functions can be referenced in multiple
605      functions, they are expected to be read more than once.  */
606   if (node->aux && !DECL_IS_BUILTIN (node->decl))
607     internal_error ("bytecode stream: found multiple instances of cgraph "
608                     "node %d", node->uid);
609
610   input_overwrite_node (file_data, node, tag, bp, stack_size, self_time,
611                         time_inlining_benefit, self_size,
612                         size_inlining_benefit);
613   bitpack_delete (bp);
614
615   node->global.estimated_stack_size = estimated_stack_size;
616   node->global.stack_frame_offset = stack_frame_offset;
617   node->global.time = time;
618   node->global.size = size;
619
620   /* Store a reference for now, and fix up later to be a pointer.  */
621   node->global.inlined_to = (cgraph_node_ptr) (intptr_t) ref;
622
623   node->global.estimated_growth = estimated_growth;
624   node->global.inlined = inlined;
625
626   /* Store a reference for now, and fix up later to be a pointer.  */
627   node->same_comdat_group = (cgraph_node_ptr) (intptr_t) ref2;
628
629   while (same_body_count-- > 0)
630     {
631       tree alias_decl;
632       int type;
633       decl_index = lto_input_uleb128 (ib);
634       alias_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
635       type = lto_input_uleb128 (ib);
636       if (!type)
637         {
638           tree real_alias;
639           decl_index = lto_input_uleb128 (ib);
640           real_alias = lto_file_decl_data_get_fn_decl (file_data, decl_index);
641           cgraph_same_body_alias (alias_decl, real_alias);
642         }
643       else
644         {
645           HOST_WIDE_INT fixed_offset = lto_input_uleb128 (ib);
646           HOST_WIDE_INT virtual_value = lto_input_uleb128 (ib);
647           tree real_alias;
648           decl_index = lto_input_uleb128 (ib);
649           real_alias = lto_file_decl_data_get_fn_decl (file_data, decl_index);
650           cgraph_add_thunk (alias_decl, fn_decl, type & 2, fixed_offset,
651                             virtual_value,
652                             (type & 4) ? size_int (virtual_value) : NULL_TREE,
653                             real_alias);
654         }
655     }
656   return node;
657 }
658
659
660 /* Read an edge from IB.  NODES points to a vector of previously read
661    nodes for decoding caller and callee of the edge to be read.  */
662
663 static void
664 input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes)
665 {
666   struct cgraph_node *caller, *callee;
667   struct cgraph_edge *edge;
668   unsigned int stmt_id;
669   gcov_type count;
670   int freq;
671   unsigned int nest;
672   cgraph_inline_failed_t inline_failed;
673   struct bitpack_d *bp;
674   enum ld_plugin_symbol_resolution caller_resolution;
675
676   caller = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
677   if (caller == NULL || caller->decl == NULL_TREE)
678     internal_error ("bytecode stream: no caller found while reading edge");
679
680   callee = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
681   if (callee == NULL || callee->decl == NULL_TREE)
682     internal_error ("bytecode stream: no callee found while reading edge");
683
684   count = (gcov_type) lto_input_sleb128 (ib);
685
686   bp = lto_input_bitpack (ib);
687   stmt_id = (unsigned int) bp_unpack_value (bp, HOST_BITS_PER_INT);
688   inline_failed = (cgraph_inline_failed_t) bp_unpack_value (bp,
689                                                             HOST_BITS_PER_INT);
690   freq = (int) bp_unpack_value (bp, HOST_BITS_PER_INT);
691   nest = (unsigned) bp_unpack_value (bp, 30);
692
693   /* If the caller was preempted, don't create the edge.
694      ???  Should we ever have edges from a preempted caller?  */
695   caller_resolution = lto_symtab_get_resolution (caller->decl);
696   if (caller_resolution == LDPR_PREEMPTED_REG
697       || caller_resolution == LDPR_PREEMPTED_IR)
698     return;
699
700   edge = cgraph_create_edge (caller, callee, NULL, count, freq, nest);
701   edge->lto_stmt_uid = stmt_id;
702   edge->inline_failed = inline_failed;
703   edge->indirect_call = bp_unpack_value (bp, 1);
704   edge->call_stmt_cannot_inline_p = bp_unpack_value (bp, 1);
705   edge->can_throw_external = bp_unpack_value (bp, 1);
706   bitpack_delete (bp);
707 }
708
709
710 /* Read a cgraph from IB using the info in FILE_DATA.  */
711
712 static void
713 input_cgraph_1 (struct lto_file_decl_data *file_data,
714                 struct lto_input_block *ib)
715 {
716   enum LTO_cgraph_tags tag;
717   VEC(cgraph_node_ptr, heap) *nodes = NULL;
718   struct cgraph_node *node;
719   unsigned i;
720   unsigned HOST_WIDE_INT len;
721
722   tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
723   while (tag)
724     {
725       if (tag == LTO_cgraph_edge)
726         input_edge (ib, nodes);
727       else
728         {
729           node = input_node (file_data, ib, tag);
730           if (node == NULL || node->decl == NULL_TREE)
731             internal_error ("bytecode stream: found empty cgraph node");
732           VEC_safe_push (cgraph_node_ptr, heap, nodes, node);
733           lto_cgraph_encoder_encode (file_data->cgraph_node_encoder, node);
734         }
735
736       tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
737     }
738
739   /* Input toplevel asms.  */
740   len = lto_input_uleb128 (ib);
741   while (len)
742     {
743       char *str = (char *)xmalloc (len + 1);
744       for (i = 0; i < len; ++i)
745         str[i] = lto_input_1_unsigned (ib);
746       cgraph_add_asm_node (build_string (len, str));
747       free (str);
748
749       len = lto_input_uleb128 (ib);
750     }
751
752   for (i = 0; VEC_iterate (cgraph_node_ptr, nodes, i, node); i++)
753     {
754       int ref = (int) (intptr_t) node->global.inlined_to;
755
756       /* Fixup inlined_to from reference to pointer.  */
757       if (ref != LCC_NOT_FOUND)
758         node->global.inlined_to = VEC_index (cgraph_node_ptr, nodes, ref);
759       else
760         node->global.inlined_to = NULL;
761
762       ref = (int) (intptr_t) node->same_comdat_group;
763
764       /* Fixup same_comdat_group from reference to pointer.  */
765       if (ref != LCC_NOT_FOUND)
766         node->same_comdat_group = VEC_index (cgraph_node_ptr, nodes, ref);
767       else
768         node->same_comdat_group = NULL;
769     }
770
771   VEC_free (cgraph_node_ptr, heap, nodes);
772 }
773
774 static struct gcov_ctr_summary lto_gcov_summary;
775
776 /* Input profile_info from IB.  */
777 static void
778 input_profile_summary (struct lto_input_block *ib)
779 {
780   unsigned int runs = lto_input_uleb128 (ib);
781   if (runs)
782     {
783       if (!profile_info)
784         {
785           profile_info = &lto_gcov_summary;
786           lto_gcov_summary.runs = runs;
787           lto_gcov_summary.sum_all = lto_input_sleb128 (ib);
788           lto_gcov_summary.run_max = lto_input_sleb128 (ib);
789           lto_gcov_summary.sum_max = lto_input_sleb128 (ib);
790         }
791       /* We can support this by scaling all counts to nearest common multiple
792          of all different runs, but it is perhaps not worth the effort.  */
793       else if (profile_info->runs != runs
794                || profile_info->sum_all != lto_input_sleb128 (ib)
795                || profile_info->run_max != lto_input_sleb128 (ib)
796                || profile_info->sum_max != lto_input_sleb128 (ib))
797         sorry ("Combining units with different profiles is not supported.");
798       /* We allow some units to have profile and other to not have one.  This will
799          just make unprofiled units to be size optimized that is sane.  */
800     }
801
802 }
803
804 /* Input and merge the cgraph from each of the .o files passed to
805    lto1.  */
806
807 void
808 input_cgraph (void)
809 {
810   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
811   struct lto_file_decl_data *file_data;
812   unsigned int j = 0;
813   struct cgraph_node *node;
814
815   while ((file_data = file_data_vec[j++]))
816     {
817       const char *data;
818       size_t len;
819       struct lto_input_block *ib;
820
821       ib = lto_create_simple_input_block (file_data, LTO_section_cgraph,
822                                           &data, &len);
823       input_profile_summary (ib);
824       file_data->cgraph_node_encoder = lto_cgraph_encoder_new ();
825       input_cgraph_1 (file_data, ib);
826       lto_destroy_simple_input_block (file_data, LTO_section_cgraph,
827                                       ib, data, len);
828
829       /* Assume that every file read needs to be processed by LTRANS.  */
830       if (flag_wpa)
831         lto_mark_file_for_ltrans (file_data);
832     }
833
834   /* Clear out the aux field that was used to store enough state to
835      tell which nodes should be overwritten.  */
836   for (node = cgraph_nodes; node; node = node->next)
837     {
838       /* Some nodes may have been created by cgraph_node.  This
839          happens when the callgraph contains nested functions.  If the
840          node for the parent function was never emitted to the gimple
841          file, cgraph_node will create a node for it when setting the
842          context of the nested function.  */
843       if (node->local.lto_file_data)
844         node->aux = NULL;
845     }
846 }