OSDN Git Service

* cgraphbuild.c (record_reference_ctx): Add varpool_node.
[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 "hashtab.h"
34 #include "langhooks.h"
35 #include "basic-block.h"
36 #include "tree-flow.h"
37 #include "cgraph.h"
38 #include "function.h"
39 #include "ggc.h"
40 #include "diagnostic.h"
41 #include "except.h"
42 #include "vec.h"
43 #include "timevar.h"
44 #include "output.h"
45 #include "pointer-set.h"
46 #include "lto-streamer.h"
47 #include "gcov-io.h"
48
49 static void output_varpool (cgraph_node_set, varpool_node_set);
50
51 /* Cgraph streaming is organized as set of record whose type
52    is indicated by a tag.  */
53 enum LTO_cgraph_tags
54 {
55   /* Must leave 0 for the stopper.  */
56
57   /* Cgraph node without body available.  */
58   LTO_cgraph_unavail_node = 1,
59   /* Cgraph node with function body.  */
60   LTO_cgraph_analyzed_node,
61   /* Cgraph edges.  */
62   LTO_cgraph_edge,
63   LTO_cgraph_indirect_edge
64 };
65
66 /* Create a new cgraph encoder.  */
67
68 lto_cgraph_encoder_t
69 lto_cgraph_encoder_new (void)
70 {
71   lto_cgraph_encoder_t encoder = XCNEW (struct lto_cgraph_encoder_d);
72   encoder->map = pointer_map_create ();
73   encoder->nodes = NULL;
74   return encoder;
75 }
76
77
78 /* Delete ENCODER and its components.  */
79
80 void
81 lto_cgraph_encoder_delete (lto_cgraph_encoder_t encoder)
82 {
83    VEC_free (cgraph_node_ptr, heap, encoder->nodes);
84    pointer_map_destroy (encoder->map);
85    free (encoder);
86 }
87
88
89 /* Return the existing reference number of NODE in the cgraph encoder in
90    output block OB.  Assign a new reference if this is the first time
91    NODE is encoded.  */
92
93 int
94 lto_cgraph_encoder_encode (lto_cgraph_encoder_t encoder,
95                            struct cgraph_node *node)
96 {
97   int ref;
98   void **slot;
99
100   slot = pointer_map_contains (encoder->map, node);
101   if (!slot)
102     {
103       ref = VEC_length (cgraph_node_ptr, encoder->nodes);
104       slot = pointer_map_insert (encoder->map, node);
105       *slot = (void *) (intptr_t) ref;
106       VEC_safe_push (cgraph_node_ptr, heap, encoder->nodes, node);
107     }
108   else
109     ref = (int) (intptr_t) *slot;
110
111   return ref;
112 }
113
114 #define LCC_NOT_FOUND   (-1)
115
116 /* Look up NODE in encoder.  Return NODE's reference if it has been encoded
117    or LCC_NOT_FOUND if it is not there.  */
118
119 int
120 lto_cgraph_encoder_lookup (lto_cgraph_encoder_t encoder,
121                            struct cgraph_node *node)
122 {
123   void **slot = pointer_map_contains (encoder->map, node);
124   return (slot ? (int) (intptr_t) *slot : LCC_NOT_FOUND);
125 }
126
127
128 /* Return the cgraph node corresponding to REF using ENCODER.  */
129
130 struct cgraph_node *
131 lto_cgraph_encoder_deref (lto_cgraph_encoder_t encoder, int ref)
132 {
133   if (ref == LCC_NOT_FOUND)
134     return NULL;
135
136   return VEC_index (cgraph_node_ptr, encoder->nodes, ref);
137 }
138
139
140 /* Return number of encoded nodes in ENCODER.  */
141
142 static int
143 lto_cgraph_encoder_size (lto_cgraph_encoder_t encoder)
144 {
145   return VEC_length (cgraph_node_ptr, encoder->nodes);
146 }
147
148 /* Create a new varpool encoder.  */
149
150 lto_varpool_encoder_t
151 lto_varpool_encoder_new (void)
152 {
153   lto_varpool_encoder_t encoder = XCNEW (struct lto_varpool_encoder_d);
154   encoder->map = pointer_map_create ();
155   encoder->initializer = pointer_set_create ();
156   encoder->nodes = NULL;
157   return encoder;
158 }
159
160
161 /* Delete ENCODER and its components.  */
162
163 void
164 lto_varpool_encoder_delete (lto_varpool_encoder_t encoder)
165 {
166    VEC_free (varpool_node_ptr, heap, encoder->nodes);
167    pointer_map_destroy (encoder->map);
168    pointer_set_destroy (encoder->initializer);
169    free (encoder);
170 }
171
172
173 /* Return the existing reference number of NODE in the varpool encoder in
174    output block OB.  Assign a new reference if this is the first time
175    NODE is encoded.  */
176
177 int
178 lto_varpool_encoder_encode (lto_varpool_encoder_t encoder,
179                            struct varpool_node *node)
180 {
181   int ref;
182   void **slot;
183
184   slot = pointer_map_contains (encoder->map, node);
185   if (!slot)
186     {
187       ref = VEC_length (varpool_node_ptr, encoder->nodes);
188       slot = pointer_map_insert (encoder->map, node);
189       *slot = (void *) (intptr_t) ref;
190       VEC_safe_push (varpool_node_ptr, heap, encoder->nodes, node);
191     }
192   else
193     ref = (int) (intptr_t) *slot;
194
195   return ref;
196 }
197
198 /* Look up NODE in encoder.  Return NODE's reference if it has been encoded
199    or LCC_NOT_FOUND if it is not there.  */
200
201 int
202 lto_varpool_encoder_lookup (lto_varpool_encoder_t encoder,
203                            struct varpool_node *node)
204 {
205   void **slot = pointer_map_contains (encoder->map, node);
206   return (slot ? (int) (intptr_t) *slot : LCC_NOT_FOUND);
207 }
208
209
210 /* Return the varpool node corresponding to REF using ENCODER.  */
211
212 struct varpool_node *
213 lto_varpool_encoder_deref (lto_varpool_encoder_t encoder, int ref)
214 {
215   if (ref == LCC_NOT_FOUND)
216     return NULL;
217
218   return VEC_index (varpool_node_ptr, encoder->nodes, ref);
219 }
220
221
222 /* Return number of encoded nodes in ENCODER.  */
223
224 static int
225 lto_varpool_encoder_size (lto_varpool_encoder_t encoder)
226 {
227   return VEC_length (varpool_node_ptr, encoder->nodes);
228 }
229
230 /* Return TRUE if we should encode initializer of NODE (if any).  */
231
232 bool
233 lto_varpool_encoder_encode_initializer_p (lto_varpool_encoder_t encoder,
234                                           struct varpool_node *node)
235 {
236   return pointer_set_contains (encoder->initializer, node);
237 }
238
239 /* Return TRUE if we should encode initializer of NODE (if any).  */
240
241 static void
242 lto_set_varpool_encoder_encode_initializer (lto_varpool_encoder_t encoder,
243                                             struct varpool_node *node)
244 {
245   pointer_set_insert (encoder->initializer, node);
246 }
247
248 /* Output the cgraph EDGE to OB using ENCODER.  */
249
250 static void
251 lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge,
252                  lto_cgraph_encoder_t encoder)
253 {
254   unsigned int uid;
255   intptr_t ref;
256   struct bitpack_d *bp;
257
258   if (edge->indirect_unknown_callee)
259     lto_output_uleb128_stream (ob->main_stream, LTO_cgraph_indirect_edge);
260   else
261     lto_output_uleb128_stream (ob->main_stream, LTO_cgraph_edge);
262
263   ref = lto_cgraph_encoder_lookup (encoder, edge->caller);
264   gcc_assert (ref != LCC_NOT_FOUND);
265   lto_output_sleb128_stream (ob->main_stream, ref);
266
267   if (!edge->indirect_unknown_callee)
268     {
269       ref = lto_cgraph_encoder_lookup (encoder, edge->callee);
270       gcc_assert (ref != LCC_NOT_FOUND);
271       lto_output_sleb128_stream (ob->main_stream, ref);
272     }
273
274   lto_output_sleb128_stream (ob->main_stream, edge->count);
275
276   bp = bitpack_create ();
277   uid = flag_wpa ? edge->lto_stmt_uid : gimple_uid (edge->call_stmt);
278   bp_pack_value (bp, uid, HOST_BITS_PER_INT);
279   bp_pack_value (bp, edge->inline_failed, HOST_BITS_PER_INT);
280   bp_pack_value (bp, edge->frequency, HOST_BITS_PER_INT);
281   bp_pack_value (bp, edge->loop_nest, 30);
282   bp_pack_value (bp, edge->indirect_inlining_edge, 1);
283   bp_pack_value (bp, edge->call_stmt_cannot_inline_p, 1);
284   bp_pack_value (bp, edge->can_throw_external, 1);
285   lto_output_bitpack (ob->main_stream, bp);
286   bitpack_delete (bp);
287 }
288
289 /* Return if LIST contain references from other partitions.  */
290 bool
291 referenced_from_other_partition_p (struct ipa_ref_list *list, cgraph_node_set set,
292                                    varpool_node_set vset)
293 {
294   int i;
295   struct ipa_ref *ref;
296   for (i = 0; ipa_ref_list_refering_iterate (list, i, ref); i++)
297     {
298       if (ref->refering_type == IPA_REF_CGRAPH)
299         {
300           if (!cgraph_node_in_set_p (ipa_ref_refering_node (ref), set))
301             return true;
302         }
303       else
304         {
305           if (!varpool_node_in_set_p (ipa_ref_refering_varpool_node (ref),
306                                       vset))
307             return true;
308         }
309     }
310   return false;
311 }
312
313 /* Return true when node is reachable from other partition.  */
314
315 static bool
316 reachable_from_other_partition_p (struct cgraph_node *node, cgraph_node_set set)
317 {
318   struct cgraph_edge *e;
319   if (node->needed)
320     return true;
321   if (!node->analyzed)
322     return false;
323   if (node->global.inlined_to)
324     return false;
325   for (e = node->callers; e; e = e->next_caller)
326     if (!cgraph_node_in_set_p (e->caller, set))
327       return true;
328   return false;
329 }
330
331 /* Output the cgraph NODE to OB.  ENCODER is used to find the
332    reference number of NODE->inlined_to.  SET is the set of nodes we
333    are writing to the current file.  If NODE is not in SET, then NODE
334    is a boundary of a cgraph_node_set and we pretend NODE just has a
335    decl and no callees.  WRITTEN_DECLS is the set of FUNCTION_DECLs
336    that have had their callgraph node written so far.  This is used to
337    determine if NODE is a clone of a previously written node.  */
338
339 static void
340 lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
341                  lto_cgraph_encoder_t encoder, cgraph_node_set set,
342                  bitmap written_decls)
343 {
344   unsigned int tag;
345   struct bitpack_d *bp;
346   bool boundary_p, wrote_decl_p;
347   intptr_t ref;
348   bool in_other_partition = false;
349
350   boundary_p = !cgraph_node_in_set_p (node, set);
351   wrote_decl_p = bitmap_bit_p (written_decls, DECL_UID (node->decl));
352
353   if (node->analyzed && !boundary_p)
354     tag = LTO_cgraph_analyzed_node;
355   else
356     tag = LTO_cgraph_unavail_node;
357
358   lto_output_uleb128_stream (ob->main_stream, tag);
359
360   /* In WPA mode, we only output part of the call-graph.  Also, we
361      fake cgraph node attributes.  There are two cases that we care.
362
363      Boundary nodes: There are nodes that are not part of SET but are
364      called from within SET.  We artificially make them look like
365      externally visible nodes with no function body.
366
367      Cherry-picked nodes:  These are nodes we pulled from other
368      translation units into SET during IPA-inlining.  We make them as
369      local static nodes to prevent clashes with other local statics.  */
370   if (boundary_p && node->analyzed)
371     {
372       /* Inline clones can not be part of boundary.  
373          gcc_assert (!node->global.inlined_to);  
374
375          FIXME: At the moment they can be, when partition contains an inline
376          clone that is clone of inline clone from outside partition.  We can
377          reshape the clone tree and make other tree to be the root, but it
378          needs a bit extra work and will be promplty done by cgraph_remove_node
379          after reading back.  */
380       in_other_partition = 1;
381     }
382
383   lto_output_uleb128_stream (ob->main_stream, wrote_decl_p);
384
385   if (!wrote_decl_p)
386     bitmap_set_bit (written_decls, DECL_UID (node->decl));
387
388   lto_output_fn_decl_index (ob->decl_state, ob->main_stream, node->decl);
389   lto_output_sleb128_stream (ob->main_stream, node->count);
390
391   bp = bitpack_create ();
392   bp_pack_value (bp, node->local.local, 1);
393   bp_pack_value (bp, node->local.externally_visible, 1);
394   bp_pack_value (bp, node->local.finalized, 1);
395   bp_pack_value (bp, node->local.inlinable, 1);
396   bp_pack_value (bp, node->local.disregard_inline_limits, 1);
397   bp_pack_value (bp, node->local.redefined_extern_inline, 1);
398   bp_pack_value (bp, node->local.vtable_method, 1);
399   bp_pack_value (bp, node->needed, 1);
400   bp_pack_value (bp, node->address_taken, 1);
401   bp_pack_value (bp, node->abstract_and_needed, 1);
402   bp_pack_value (bp, tag == LTO_cgraph_analyzed_node
403                  && reachable_from_other_partition_p (node, set), 1);
404   bp_pack_value (bp, node->lowered, 1);
405   bp_pack_value (bp, in_other_partition, 1);
406   bp_pack_value (bp, node->alias, 1);
407   bp_pack_value (bp, node->finalized_by_frontend, 1);
408   bp_pack_value (bp, node->frequency, 2);
409   lto_output_bitpack (ob->main_stream, bp);
410   bitpack_delete (bp);
411
412   if (tag == LTO_cgraph_analyzed_node)
413     {
414       lto_output_sleb128_stream (ob->main_stream,
415                                  node->local.inline_summary.estimated_self_stack_size);
416       lto_output_sleb128_stream (ob->main_stream,
417                                  node->local.inline_summary.self_size);
418       lto_output_sleb128_stream (ob->main_stream,
419                                  node->local.inline_summary.size_inlining_benefit);
420       lto_output_sleb128_stream (ob->main_stream,
421                                  node->local.inline_summary.self_time);
422       lto_output_sleb128_stream (ob->main_stream,
423                                  node->local.inline_summary.time_inlining_benefit);
424       if (node->global.inlined_to)
425         {
426           ref = lto_cgraph_encoder_lookup (encoder, node->global.inlined_to);
427           gcc_assert (ref != LCC_NOT_FOUND);
428         }
429       else
430         ref = LCC_NOT_FOUND;
431
432       lto_output_sleb128_stream (ob->main_stream, ref);
433     }
434
435   if (node->same_comdat_group && !boundary_p)
436     {
437       ref = lto_cgraph_encoder_lookup (encoder, node->same_comdat_group);
438       gcc_assert (ref != LCC_NOT_FOUND);
439     }
440   else
441     ref = LCC_NOT_FOUND;
442   lto_output_sleb128_stream (ob->main_stream, ref);
443
444   if (node->same_body)
445     {
446       struct cgraph_node *alias;
447       unsigned long alias_count = 1;
448       for (alias = node->same_body; alias->next; alias = alias->next)
449         alias_count++;
450       lto_output_uleb128_stream (ob->main_stream, alias_count);
451       do
452         {
453           lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
454                                     alias->decl);
455           if (alias->thunk.thunk_p)
456             {
457               lto_output_uleb128_stream
458                  (ob->main_stream,
459                   1 + (alias->thunk.this_adjusting != 0) * 2
460                   + (alias->thunk.virtual_offset_p != 0) * 4);
461               lto_output_uleb128_stream (ob->main_stream,
462                                          alias->thunk.fixed_offset);
463               lto_output_uleb128_stream (ob->main_stream,
464                                          alias->thunk.virtual_value);
465               lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
466                                         alias->thunk.alias);
467             }
468           else
469             {
470               lto_output_uleb128_stream (ob->main_stream, 0);
471               lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
472                                         alias->thunk.alias);
473             }
474           alias = alias->previous;
475         }
476       while (alias);
477     }
478   else
479     lto_output_uleb128_stream (ob->main_stream, 0);
480 }
481
482 /* Output the varpool NODE to OB. 
483    If NODE is not in SET, then NODE is a boundary.  */
484
485 static void
486 lto_output_varpool_node (struct lto_simple_output_block *ob, struct varpool_node *node,
487                          cgraph_node_set set, varpool_node_set vset)
488 {
489   bool boundary_p = !varpool_node_in_set_p (node, vset) && node->analyzed;
490   struct bitpack_d *bp;
491   struct varpool_node *alias;
492   int count = 0;
493
494   lto_output_var_decl_index (ob->decl_state, ob->main_stream, node->decl);
495   bp = bitpack_create ();
496   bp_pack_value (bp, node->externally_visible, 1);
497   bp_pack_value (bp, node->force_output, 1);
498   bp_pack_value (bp, node->finalized, 1);
499   bp_pack_value (bp, node->alias, 1);
500   gcc_assert (!node->alias || !node->extra_name);
501   gcc_assert (node->finalized || !node->analyzed);
502   gcc_assert (node->needed);
503   /* Constant pool initializers can be de-unified into individual ltrans units.
504      FIXME: Alternatively at -Os we may want to avoid generating for them the local
505      labels and share them across LTRANS partitions.  */
506   if (DECL_IN_CONSTANT_POOL (node->decl))
507     {
508       bp_pack_value (bp, 0, 1);  /* used_from_other_parition.  */
509       bp_pack_value (bp, 0, 1);  /* in_other_partition.  */
510     }
511   else
512     {
513       bp_pack_value (bp, node->analyzed
514                      && referenced_from_other_partition_p (&node->ref_list,
515                                                            set, vset), 1);
516       bp_pack_value (bp, boundary_p, 1);  /* in_other_partition.  */
517     }
518   /* Also emit any extra name aliases.  */
519   for (alias = node->extra_name; alias; alias = alias->next)
520     count++;
521   bp_pack_value (bp, count != 0, 1);
522   lto_output_bitpack (ob->main_stream, bp);
523   bitpack_delete (bp);
524
525   if (count)
526     {
527       lto_output_uleb128_stream (ob->main_stream, count);
528       for (alias = node->extra_name; alias; alias = alias->next)
529         lto_output_var_decl_index (ob->decl_state, ob->main_stream, alias->decl);
530     }
531 }
532
533 /* Output the varpool NODE to OB. 
534    If NODE is not in SET, then NODE is a boundary.  */
535
536 static void
537 lto_output_ref (struct lto_simple_output_block *ob, struct ipa_ref *ref,
538                 lto_cgraph_encoder_t encoder,
539                 lto_varpool_encoder_t varpool_encoder)
540 {
541   struct bitpack_d *bp = bitpack_create ();
542   bp_pack_value (bp, ref->refered_type, 1);
543   bp_pack_value (bp, ref->use, 2);
544   lto_output_bitpack (ob->main_stream, bp);
545   bitpack_delete (bp);
546   if (ref->refered_type == IPA_REF_CGRAPH)
547     {
548       int nref = lto_cgraph_encoder_lookup (encoder, ipa_ref_node (ref));
549       gcc_assert (nref != LCC_NOT_FOUND);
550       lto_output_sleb128_stream (ob->main_stream, nref);
551     }
552   else
553     {
554       int nref = lto_varpool_encoder_lookup (varpool_encoder,
555                                              ipa_ref_varpool_node (ref));
556       gcc_assert (nref != LCC_NOT_FOUND);
557       lto_output_sleb128_stream (ob->main_stream, nref);
558     }
559 }
560
561 /* Stream out profile_summary to OB.  */
562
563 static void
564 output_profile_summary (struct lto_simple_output_block *ob)
565 {
566   if (profile_info)
567     {
568       /* We do not output num, it is not terribly useful.  */
569       gcc_assert (profile_info->runs);
570       lto_output_uleb128_stream (ob->main_stream, profile_info->runs);
571       lto_output_sleb128_stream (ob->main_stream, profile_info->sum_all);
572       lto_output_sleb128_stream (ob->main_stream, profile_info->run_max);
573       lto_output_sleb128_stream (ob->main_stream, profile_info->sum_max);
574     }
575   else
576     lto_output_uleb128_stream (ob->main_stream, 0);
577 }
578
579 /* Add NODE into encoder as well as nodes it is cloned from.
580    Do it in a way so clones appear first.  */
581 static void
582 add_node_to (lto_cgraph_encoder_t encoder, struct cgraph_node *node)
583 {
584   if (node->clone_of)
585     add_node_to (encoder, node->clone_of);
586   lto_cgraph_encoder_encode (encoder, node);
587 }
588
589 /* Add all references in LIST to encoders.  */
590
591 static void
592 add_references (lto_cgraph_encoder_t encoder,
593                 lto_varpool_encoder_t varpool_encoder,
594                 struct ipa_ref_list *list)
595 {
596   int i;
597   struct ipa_ref *ref;
598   for (i = 0; ipa_ref_list_reference_iterate (list, i, ref); i++)
599     if (ref->refered_type == IPA_REF_CGRAPH)
600       add_node_to (encoder, ipa_ref_node (ref));
601     else
602       {
603         struct varpool_node *vnode = ipa_ref_varpool_node (ref);
604         lto_varpool_encoder_encode (varpool_encoder, vnode);
605       }
606 }
607
608 /* Output all callees or indirect outgoing edges.  EDGE must be the first such
609    edge.  */
610
611 static void
612 output_outgoing_cgraph_edges (struct cgraph_edge *edge,
613                               struct lto_simple_output_block *ob,
614                               lto_cgraph_encoder_t encoder)
615 {
616   if (!edge)
617     return;
618
619   /* Output edges in backward direction, so the reconstructed callgraph match
620      and it is easy to associate call sites in the IPA pass summaries.  */
621   while (edge->next_callee)
622     edge = edge->next_callee;
623   for (; edge; edge = edge->prev_callee)
624     lto_output_edge (ob, edge, encoder);
625 }
626
627 /* Output the part of the cgraph in SET.  */
628
629 static void
630 output_refs (cgraph_node_set set, varpool_node_set vset,
631              lto_cgraph_encoder_t encoder,
632              lto_varpool_encoder_t varpool_encoder)
633 {
634   cgraph_node_set_iterator csi;
635   varpool_node_set_iterator vsi;
636   struct lto_simple_output_block *ob;
637   int count;
638   struct ipa_ref *ref;
639   int i;
640
641   ob = lto_create_simple_output_block (LTO_section_refs);
642
643   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
644     {
645       struct cgraph_node *node = csi_node (csi);
646
647       count = ipa_ref_list_nreferences (&node->ref_list);
648       if (count)
649         {
650           lto_output_uleb128_stream (ob->main_stream, count);
651           lto_output_uleb128_stream (ob->main_stream,
652                                      lto_cgraph_encoder_lookup (encoder, node));
653           for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
654             lto_output_ref (ob, ref, encoder, varpool_encoder);
655         }
656     }
657
658   lto_output_uleb128_stream (ob->main_stream, 0);
659
660   for (vsi = vsi_start (vset); !vsi_end_p (vsi); vsi_next (&vsi))
661     {
662       struct varpool_node *node = vsi_node (vsi);
663
664       count = ipa_ref_list_nreferences (&node->ref_list);
665       if (count)
666         {
667           lto_output_uleb128_stream (ob->main_stream, count);
668           lto_output_uleb128_stream (ob->main_stream,
669                                      lto_varpool_encoder_lookup (varpool_encoder,
670                                                                  node));
671           for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
672             lto_output_ref (ob, ref, encoder, varpool_encoder);
673         }
674     }
675
676   lto_output_uleb128_stream (ob->main_stream, 0);
677
678   lto_destroy_simple_output_block (ob);
679 }
680
681
682 /* Output the part of the cgraph in SET.  */
683
684 void
685 output_cgraph (cgraph_node_set set, varpool_node_set vset)
686 {
687   struct cgraph_node *node;
688   struct lto_simple_output_block *ob;
689   cgraph_node_set_iterator csi;
690   varpool_node_set_iterator vsi;
691   struct cgraph_edge *edge;
692   int i, n_nodes;
693   bitmap written_decls;
694   lto_cgraph_encoder_t encoder;
695   lto_varpool_encoder_t varpool_encoder;
696   struct cgraph_asm_node *can;
697   struct varpool_node *vnode;
698
699   ob = lto_create_simple_output_block (LTO_section_cgraph);
700
701   output_profile_summary (ob);
702
703   /* An encoder for cgraph nodes should have been created by
704      ipa_write_summaries_1.  */
705   gcc_assert (ob->decl_state->cgraph_node_encoder);
706   gcc_assert (ob->decl_state->varpool_node_encoder);
707   encoder = ob->decl_state->cgraph_node_encoder;
708   varpool_encoder = ob->decl_state->varpool_node_encoder;
709
710   /* The FUNCTION_DECLs for which we have written a node.  The first
711      node found is written as the "original" node, the remaining nodes
712      are considered its clones.  */
713   written_decls = lto_bitmap_alloc ();
714
715   /* Go over all the nodes in SET and assign references.  */
716   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
717     {
718       node = csi_node (csi);
719       add_node_to (encoder, node);
720       add_references (encoder, varpool_encoder, &node->ref_list);
721     }
722   for (vsi = vsi_start (vset); !vsi_end_p (vsi); vsi_next (&vsi))
723     {
724       struct varpool_node *vnode = vsi_node (vsi);
725       gcc_assert (!vnode->alias);
726       lto_varpool_encoder_encode (varpool_encoder, vnode);
727       lto_set_varpool_encoder_encode_initializer (varpool_encoder, vnode);
728       add_references (encoder, varpool_encoder, &vnode->ref_list);
729     }
730   /* FIXME: We can not currenlty remove any varpool nodes or we get ICE merging
731      binfos.  */
732   for (vnode = varpool_nodes; vnode; vnode = vnode->next)
733     if (vnode->needed)
734       lto_varpool_encoder_encode (varpool_encoder, vnode);
735   /* Pickle in also the initializer of all referenced readonly variables
736      to help folding.  Constant pool variables are not shared, so we must
737      pickle those too.  */
738   for (i = 0; i < lto_varpool_encoder_size (varpool_encoder); i++)
739     {
740       struct varpool_node *vnode = lto_varpool_encoder_deref (varpool_encoder, i);
741       if (DECL_INITIAL (vnode->decl)
742           && !lto_varpool_encoder_encode_initializer_p (varpool_encoder,
743                                                         vnode)
744           && (DECL_IN_CONSTANT_POOL (vnode->decl)
745               ||  TREE_READONLY (vnode->decl)))
746         {
747           lto_set_varpool_encoder_encode_initializer (varpool_encoder, vnode);
748           add_references (encoder, varpool_encoder, &vnode->ref_list);
749         }
750     }
751
752   /* Go over all the nodes again to include callees that are not in
753      SET.  */
754   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
755     {
756       node = csi_node (csi);
757       for (edge = node->callees; edge; edge = edge->next_callee)
758         {
759           struct cgraph_node *callee = edge->callee;
760           if (!cgraph_node_in_set_p (callee, set))
761             {
762               /* We should have moved all the inlines.  */
763               gcc_assert (!callee->global.inlined_to);
764               add_node_to (encoder, callee);
765             }
766         }
767     }
768
769   /* Write out the nodes.  We must first output a node and then its clones,
770      otherwise at a time reading back the node there would be nothing to clone
771      from.  */
772   n_nodes = lto_cgraph_encoder_size (encoder);
773   for (i = 0; i < n_nodes; i++)
774     {
775       node = lto_cgraph_encoder_deref (encoder, i);
776       lto_output_node (ob, node, encoder, set, written_decls);
777     }
778
779   lto_bitmap_free (written_decls);
780
781   /* Go over the nodes in SET again to write edges.  */
782   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
783     {
784       node = csi_node (csi);
785       output_outgoing_cgraph_edges (node->callees, ob, encoder);
786       output_outgoing_cgraph_edges (node->indirect_calls, ob, encoder);
787     }
788
789   lto_output_uleb128_stream (ob->main_stream, 0);
790
791   /* Emit toplevel asms.  */
792   for (can = cgraph_asm_nodes; can; can = can->next)
793     {
794       int len = TREE_STRING_LENGTH (can->asm_str);
795       lto_output_uleb128_stream (ob->main_stream, len);
796       for (i = 0; i < len; ++i)
797         lto_output_1_stream (ob->main_stream,
798                              TREE_STRING_POINTER (can->asm_str)[i]);
799     }
800
801   lto_output_uleb128_stream (ob->main_stream, 0);
802
803   lto_destroy_simple_output_block (ob);
804   output_varpool (set, vset);
805   output_refs (set, vset, encoder, varpool_encoder);
806 }
807
808 /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS,
809    STACK_SIZE, SELF_TIME and SELF_SIZE.  This is called either to initialize
810    NODE or to replace the values in it, for instance because the first
811    time we saw it, the function body was not available but now it
812    is.  BP is a bitpack with all the bitflags for NODE read from the
813    stream.  */
814
815 static void
816 input_overwrite_node (struct lto_file_decl_data *file_data,
817                       struct cgraph_node *node,
818                       enum LTO_cgraph_tags tag,
819                       struct bitpack_d *bp,
820                       unsigned int stack_size,
821                       unsigned int self_time,
822                       unsigned int time_inlining_benefit,
823                       unsigned int self_size,
824                       unsigned int size_inlining_benefit)
825 {
826   node->aux = (void *) tag;
827   node->local.inline_summary.estimated_self_stack_size = stack_size;
828   node->local.inline_summary.self_time = self_time;
829   node->local.inline_summary.time_inlining_benefit = time_inlining_benefit;
830   node->local.inline_summary.self_size = self_size;
831   node->local.inline_summary.size_inlining_benefit = size_inlining_benefit;
832   node->global.time = self_time;
833   node->global.size = self_size;
834   node->global.estimated_stack_size = stack_size;
835   node->global.estimated_growth = INT_MIN;
836   node->local.lto_file_data = file_data;
837
838   node->local.local = bp_unpack_value (bp, 1);
839   node->local.externally_visible = bp_unpack_value (bp, 1);
840   node->local.finalized = bp_unpack_value (bp, 1);
841   node->local.inlinable = bp_unpack_value (bp, 1);
842   node->local.disregard_inline_limits = bp_unpack_value (bp, 1);
843   node->local.redefined_extern_inline = bp_unpack_value (bp, 1);
844   node->local.vtable_method = bp_unpack_value (bp, 1);
845   node->needed = bp_unpack_value (bp, 1);
846   node->address_taken = bp_unpack_value (bp, 1);
847   node->abstract_and_needed = bp_unpack_value (bp, 1);
848   node->reachable_from_other_partition = bp_unpack_value (bp, 1);
849   node->lowered = bp_unpack_value (bp, 1);
850   node->analyzed = tag == LTO_cgraph_analyzed_node;
851   node->in_other_partition = bp_unpack_value (bp, 1);
852   node->alias = bp_unpack_value (bp, 1);
853   node->finalized_by_frontend = bp_unpack_value (bp, 1);
854   node->frequency = (enum node_frequency)bp_unpack_value (bp, 2);
855 }
856
857 /* Output the part of the cgraph in SET.  */
858
859 static void
860 output_varpool (cgraph_node_set set, varpool_node_set vset)
861 {
862   struct lto_simple_output_block *ob = lto_create_simple_output_block (LTO_section_varpool);
863   lto_varpool_encoder_t varpool_encoder = ob->decl_state->varpool_node_encoder;
864   int len = lto_varpool_encoder_size (varpool_encoder), i;
865
866   lto_output_uleb128_stream (ob->main_stream, len);
867
868   /* Write out the nodes.  We must first output a node and then its clones,
869      otherwise at a time reading back the node there would be nothing to clone
870      from.  */
871   for (i = 0; i < len; i++)
872     {
873       lto_output_varpool_node (ob, lto_varpool_encoder_deref (varpool_encoder, i),
874                                set, vset);
875     }
876
877   lto_destroy_simple_output_block (ob);
878 }
879
880 /* Read a node from input_block IB.  TAG is the node's tag just read.
881    Return the node read or overwriten.  */
882
883 static struct cgraph_node *
884 input_node (struct lto_file_decl_data *file_data,
885             struct lto_input_block *ib,
886             enum LTO_cgraph_tags tag)
887 {
888   tree fn_decl;
889   struct cgraph_node *node;
890   struct bitpack_d *bp;
891   int stack_size = 0;
892   unsigned decl_index;
893   bool clone_p;
894   int ref = LCC_NOT_FOUND, ref2 = LCC_NOT_FOUND;
895   int self_time = 0;
896   int self_size = 0;
897   int time_inlining_benefit = 0;
898   int size_inlining_benefit = 0;
899   unsigned long same_body_count = 0;
900
901   clone_p = (lto_input_uleb128 (ib) != 0);
902
903   decl_index = lto_input_uleb128 (ib);
904   fn_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
905
906   if (clone_p)
907     node = cgraph_clone_node (cgraph_node (fn_decl), 0,
908                               CGRAPH_FREQ_BASE, 0, false, NULL);
909
910   else
911     node = cgraph_node (fn_decl);
912
913   node->count = lto_input_sleb128 (ib);
914   bp = lto_input_bitpack (ib);
915
916   if (tag == LTO_cgraph_analyzed_node)
917     {
918       stack_size = lto_input_sleb128 (ib);
919       self_size = lto_input_sleb128 (ib);
920       size_inlining_benefit = lto_input_sleb128 (ib);
921       self_time = lto_input_sleb128 (ib);
922       time_inlining_benefit = lto_input_sleb128 (ib);
923
924       ref = lto_input_sleb128 (ib);
925     }
926
927   ref2 = lto_input_sleb128 (ib);
928   same_body_count = lto_input_uleb128 (ib);
929
930   /* Make sure that we have not read this node before.  Nodes that
931      have already been read will have their tag stored in the 'aux'
932      field.  Since built-in functions can be referenced in multiple
933      functions, they are expected to be read more than once.  */
934   if (node->aux && !DECL_IS_BUILTIN (node->decl))
935     internal_error ("bytecode stream: found multiple instances of cgraph "
936                     "node %d", node->uid);
937
938   input_overwrite_node (file_data, node, tag, bp, stack_size, self_time,
939                         time_inlining_benefit, self_size,
940                         size_inlining_benefit);
941   bitpack_delete (bp);
942
943   /* Store a reference for now, and fix up later to be a pointer.  */
944   node->global.inlined_to = (cgraph_node_ptr) (intptr_t) ref;
945
946   /* Store a reference for now, and fix up later to be a pointer.  */
947   node->same_comdat_group = (cgraph_node_ptr) (intptr_t) ref2;
948
949   while (same_body_count-- > 0)
950     {
951       tree alias_decl;
952       int type;
953       decl_index = lto_input_uleb128 (ib);
954       alias_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index);
955       type = lto_input_uleb128 (ib);
956       if (!type)
957         {
958           tree real_alias;
959           decl_index = lto_input_uleb128 (ib);
960           real_alias = lto_file_decl_data_get_fn_decl (file_data, decl_index);
961           cgraph_same_body_alias (alias_decl, real_alias);
962         }
963       else
964         {
965           HOST_WIDE_INT fixed_offset = lto_input_uleb128 (ib);
966           HOST_WIDE_INT virtual_value = lto_input_uleb128 (ib);
967           tree real_alias;
968           decl_index = lto_input_uleb128 (ib);
969           real_alias = lto_file_decl_data_get_fn_decl (file_data, decl_index);
970           cgraph_add_thunk (alias_decl, fn_decl, type & 2, fixed_offset,
971                             virtual_value,
972                             (type & 4) ? size_int (virtual_value) : NULL_TREE,
973                             real_alias);
974         }
975     }
976   return node;
977 }
978
979 /* Read a node from input_block IB.  TAG is the node's tag just read.
980    Return the node read or overwriten.  */
981
982 static struct varpool_node *
983 input_varpool_node (struct lto_file_decl_data *file_data,
984                     struct lto_input_block *ib)
985 {
986   int decl_index;
987   tree var_decl;
988   struct varpool_node *node;
989   struct bitpack_d *bp;
990   bool aliases_p;
991   int count;
992
993   decl_index = lto_input_uleb128 (ib);
994   var_decl = lto_file_decl_data_get_var_decl (file_data, decl_index);
995   node = varpool_node (var_decl);
996
997   bp = lto_input_bitpack (ib);
998   node->externally_visible = bp_unpack_value (bp, 1);
999   node->force_output = bp_unpack_value (bp, 1);
1000   node->finalized = bp_unpack_value (bp, 1);
1001   node->alias = bp_unpack_value (bp, 1);
1002   node->analyzed = node->finalized; 
1003   node->used_from_other_partition = bp_unpack_value (bp, 1);
1004   node->in_other_partition = bp_unpack_value (bp, 1);
1005   aliases_p = bp_unpack_value (bp, 1);
1006   if (node->finalized)
1007     varpool_mark_needed_node (node);
1008   bitpack_delete (bp);
1009   if (aliases_p)
1010     {
1011       count = lto_input_uleb128 (ib);
1012       for (; count > 0; count --)
1013         {
1014           tree decl = lto_file_decl_data_get_var_decl (file_data,
1015                                                        lto_input_uleb128 (ib));
1016           varpool_extra_name_alias (decl, var_decl);
1017         }
1018     }
1019   return node;
1020 }
1021
1022 /* Read a node from input_block IB.  TAG is the node's tag just read.
1023    Return the node read or overwriten.  */
1024
1025 static void
1026 input_ref (struct lto_input_block *ib,
1027            struct cgraph_node *refering_node,
1028            struct varpool_node *refering_varpool_node,
1029            VEC(cgraph_node_ptr, heap) *nodes,
1030            VEC(varpool_node_ptr, heap) *varpool_nodes)
1031 {
1032   struct cgraph_node *node = NULL;
1033   struct varpool_node *varpool_node = NULL;
1034   struct bitpack_d *bp;
1035   enum ipa_ref_type type;
1036   enum ipa_ref_use use;
1037
1038   bp = lto_input_bitpack (ib);
1039   type = (enum ipa_ref_type) bp_unpack_value (bp, 1);
1040   use = (enum ipa_ref_use) bp_unpack_value (bp, 2);
1041   bitpack_delete (bp);
1042   if (type == IPA_REF_CGRAPH)
1043     node = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
1044   else
1045     varpool_node = VEC_index (varpool_node_ptr, varpool_nodes, lto_input_sleb128 (ib));
1046   ipa_record_reference (refering_node, refering_varpool_node,
1047                         node, varpool_node, use, NULL);
1048 }
1049
1050 /* Read an edge from IB.  NODES points to a vector of previously read nodes for
1051    decoding caller and callee of the edge to be read.  If INDIRECT is true, the
1052    edge being read is indirect (in the sense that it has
1053    indirect_unknown_callee set).  */
1054
1055 static void
1056 input_edge (struct lto_input_block *ib, VEC(cgraph_node_ptr, heap) *nodes,
1057             bool indirect)
1058 {
1059   struct cgraph_node *caller, *callee;
1060   struct cgraph_edge *edge;
1061   unsigned int stmt_id;
1062   gcov_type count;
1063   int freq;
1064   unsigned int nest;
1065   cgraph_inline_failed_t inline_failed;
1066   struct bitpack_d *bp;
1067   enum ld_plugin_symbol_resolution caller_resolution;
1068
1069   caller = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
1070   if (caller == NULL || caller->decl == NULL_TREE)
1071     internal_error ("bytecode stream: no caller found while reading edge");
1072
1073   if (!indirect)
1074     {
1075       callee = VEC_index (cgraph_node_ptr, nodes, lto_input_sleb128 (ib));
1076       if (callee == NULL || callee->decl == NULL_TREE)
1077         internal_error ("bytecode stream: no callee found while reading edge");
1078     }
1079   else
1080     callee = NULL;
1081
1082   count = (gcov_type) lto_input_sleb128 (ib);
1083
1084   bp = lto_input_bitpack (ib);
1085   stmt_id = (unsigned int) bp_unpack_value (bp, HOST_BITS_PER_INT);
1086   inline_failed = (cgraph_inline_failed_t) bp_unpack_value (bp,
1087                                                             HOST_BITS_PER_INT);
1088   freq = (int) bp_unpack_value (bp, HOST_BITS_PER_INT);
1089   nest = (unsigned) bp_unpack_value (bp, 30);
1090
1091   /* If the caller was preempted, don't create the edge.
1092      ???  Should we ever have edges from a preempted caller?  */
1093   caller_resolution = lto_symtab_get_resolution (caller->decl);
1094   if (caller_resolution == LDPR_PREEMPTED_REG
1095       || caller_resolution == LDPR_PREEMPTED_IR)
1096     return;
1097
1098   if (indirect)
1099     edge = cgraph_create_indirect_edge (caller, NULL, count, freq, nest);
1100   else
1101     edge = cgraph_create_edge (caller, callee, NULL, count, freq, nest);
1102
1103   edge->indirect_inlining_edge = bp_unpack_value (bp, 1);
1104   edge->lto_stmt_uid = stmt_id;
1105   edge->inline_failed = inline_failed;
1106   edge->call_stmt_cannot_inline_p = bp_unpack_value (bp, 1);
1107   edge->can_throw_external = bp_unpack_value (bp, 1);
1108   bitpack_delete (bp);
1109 }
1110
1111
1112 /* Read a cgraph from IB using the info in FILE_DATA.  */
1113
1114 static VEC(cgraph_node_ptr, heap) *
1115 input_cgraph_1 (struct lto_file_decl_data *file_data,
1116                 struct lto_input_block *ib)
1117 {
1118   enum LTO_cgraph_tags tag;
1119   VEC(cgraph_node_ptr, heap) *nodes = NULL;
1120   struct cgraph_node *node;
1121   unsigned i;
1122   unsigned HOST_WIDE_INT len;
1123
1124   tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
1125   while (tag)
1126     {
1127       if (tag == LTO_cgraph_edge)
1128         input_edge (ib, nodes, false);
1129       else if (tag == LTO_cgraph_indirect_edge)
1130         input_edge (ib, nodes, true);
1131       else
1132         {
1133           node = input_node (file_data, ib, tag);
1134           if (node == NULL || node->decl == NULL_TREE)
1135             internal_error ("bytecode stream: found empty cgraph node");
1136           VEC_safe_push (cgraph_node_ptr, heap, nodes, node);
1137           lto_cgraph_encoder_encode (file_data->cgraph_node_encoder, node);
1138         }
1139
1140       tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
1141     }
1142
1143   /* Input toplevel asms.  */
1144   len = lto_input_uleb128 (ib);
1145   while (len)
1146     {
1147       char *str = (char *)xmalloc (len + 1);
1148       for (i = 0; i < len; ++i)
1149         str[i] = lto_input_1_unsigned (ib);
1150       cgraph_add_asm_node (build_string (len, str));
1151       free (str);
1152
1153       len = lto_input_uleb128 (ib);
1154     }
1155
1156   for (i = 0; VEC_iterate (cgraph_node_ptr, nodes, i, node); i++)
1157     {
1158       int ref = (int) (intptr_t) node->global.inlined_to;
1159
1160       /* Fixup inlined_to from reference to pointer.  */
1161       if (ref != LCC_NOT_FOUND)
1162         node->global.inlined_to = VEC_index (cgraph_node_ptr, nodes, ref);
1163       else
1164         node->global.inlined_to = NULL;
1165
1166       ref = (int) (intptr_t) node->same_comdat_group;
1167
1168       /* Fixup same_comdat_group from reference to pointer.  */
1169       if (ref != LCC_NOT_FOUND)
1170         node->same_comdat_group = VEC_index (cgraph_node_ptr, nodes, ref);
1171       else
1172         node->same_comdat_group = NULL;
1173     }
1174   return nodes;
1175 }
1176
1177 /* Read a varpool from IB using the info in FILE_DATA.  */
1178
1179 static VEC(varpool_node_ptr, heap) *
1180 input_varpool_1 (struct lto_file_decl_data *file_data,
1181                 struct lto_input_block *ib)
1182 {
1183   unsigned HOST_WIDE_INT len;
1184   VEC(varpool_node_ptr, heap) *varpool = NULL;
1185
1186   len = lto_input_uleb128 (ib);
1187   while (len)
1188     {
1189       VEC_safe_push (varpool_node_ptr, heap, varpool,
1190                      input_varpool_node (file_data, ib));
1191       len--;
1192     }
1193   return varpool;
1194 }
1195
1196 /* Input ipa_refs.  */
1197
1198 static void
1199 input_refs (struct lto_input_block *ib,
1200             VEC(cgraph_node_ptr, heap) *nodes,
1201             VEC(varpool_node_ptr, heap) *varpool)
1202 {
1203   int count;
1204   int idx;
1205   while (true)
1206     {
1207       struct cgraph_node *node;
1208       count = lto_input_uleb128 (ib);
1209       if (!count)
1210         break;
1211       idx = lto_input_uleb128 (ib);
1212       node = VEC_index (cgraph_node_ptr, nodes, idx);
1213       while (count)
1214         {
1215           input_ref (ib, node, NULL, nodes, varpool);
1216           count--;
1217         }
1218     }
1219   while (true)
1220     {
1221       struct varpool_node *node;
1222       count = lto_input_uleb128 (ib);
1223       if (!count)
1224         break;
1225       node = VEC_index (varpool_node_ptr, varpool, lto_input_uleb128 (ib));
1226       while (count)
1227         {
1228           input_ref (ib, NULL, node, nodes, varpool);
1229           count--;
1230         }
1231     }
1232 }
1233             
1234
1235 static struct gcov_ctr_summary lto_gcov_summary;
1236
1237 /* Input profile_info from IB.  */
1238 static void
1239 input_profile_summary (struct lto_input_block *ib)
1240 {
1241   unsigned int runs = lto_input_uleb128 (ib);
1242   if (runs)
1243     {
1244       if (!profile_info)
1245         {
1246           profile_info = &lto_gcov_summary;
1247           lto_gcov_summary.runs = runs;
1248           lto_gcov_summary.sum_all = lto_input_sleb128 (ib);
1249           lto_gcov_summary.run_max = lto_input_sleb128 (ib);
1250           lto_gcov_summary.sum_max = lto_input_sleb128 (ib);
1251         }
1252       /* We can support this by scaling all counts to nearest common multiple
1253          of all different runs, but it is perhaps not worth the effort.  */
1254       else if (profile_info->runs != runs
1255                || profile_info->sum_all != lto_input_sleb128 (ib)
1256                || profile_info->run_max != lto_input_sleb128 (ib)
1257                || profile_info->sum_max != lto_input_sleb128 (ib))
1258         sorry ("Combining units with different profiles is not supported.");
1259       /* We allow some units to have profile and other to not have one.  This will
1260          just make unprofiled units to be size optimized that is sane.  */
1261     }
1262
1263 }
1264
1265 /* Input and merge the cgraph from each of the .o files passed to
1266    lto1.  */
1267
1268 void
1269 input_cgraph (void)
1270 {
1271   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
1272   struct lto_file_decl_data *file_data;
1273   unsigned int j = 0;
1274   struct cgraph_node *node;
1275
1276   while ((file_data = file_data_vec[j++]))
1277     {
1278       const char *data;
1279       size_t len;
1280       struct lto_input_block *ib;
1281       VEC(cgraph_node_ptr, heap) *nodes;
1282       VEC(varpool_node_ptr, heap) *varpool;
1283
1284       ib = lto_create_simple_input_block (file_data, LTO_section_cgraph,
1285                                           &data, &len);
1286       input_profile_summary (ib);
1287       file_data->cgraph_node_encoder = lto_cgraph_encoder_new ();
1288       nodes = input_cgraph_1 (file_data, ib);
1289       lto_destroy_simple_input_block (file_data, LTO_section_cgraph,
1290                                       ib, data, len);
1291
1292       ib = lto_create_simple_input_block (file_data, LTO_section_varpool,
1293                                           &data, &len);
1294       varpool = input_varpool_1 (file_data, ib);
1295       lto_destroy_simple_input_block (file_data, LTO_section_varpool,
1296                                       ib, data, len);
1297
1298       ib = lto_create_simple_input_block (file_data, LTO_section_refs,
1299                                           &data, &len);
1300       input_refs (ib, nodes, varpool);
1301       lto_destroy_simple_input_block (file_data, LTO_section_refs,
1302                                       ib, data, len);
1303       VEC_free (cgraph_node_ptr, heap, nodes);
1304       VEC_free (varpool_node_ptr, heap, varpool);
1305     }
1306
1307   /* Clear out the aux field that was used to store enough state to
1308      tell which nodes should be overwritten.  */
1309   for (node = cgraph_nodes; node; node = node->next)
1310     {
1311       /* Some nodes may have been created by cgraph_node.  This
1312          happens when the callgraph contains nested functions.  If the
1313          node for the parent function was never emitted to the gimple
1314          file, cgraph_node will create a node for it when setting the
1315          context of the nested function.  */
1316       if (node->local.lto_file_data)
1317         node->aux = NULL;
1318     }
1319 }