xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/lto-streamer-in.c (revision fdd524d4ccd2bb0c6f67401e938dabf773eb0372)
1 /* Read the GIMPLE representation from a file stream.
2 
3    Copyright (C) 2009-2013 Free Software Foundation, Inc.
4    Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
5    Re-implemented by Diego Novillo <dnovillo@google.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 "basic-block.h"
35 #include "tree-flow.h"
36 #include "tree-pass.h"
37 #include "cgraph.h"
38 #include "function.h"
39 #include "ggc.h"
40 #include "diagnostic.h"
41 #include "except.h"
42 #include "debug.h"
43 #include "vec.h"
44 #include "ipa-utils.h"
45 #include "data-streamer.h"
46 #include "gimple-streamer.h"
47 #include "lto-streamer.h"
48 #include "tree-streamer.h"
49 #include "tree-pass.h"
50 #include "streamer-hooks.h"
51 
52 /* The table to hold the file names.  */
53 static htab_t file_name_hash_table;
54 
55 
56 /* Check that tag ACTUAL has one of the given values.  NUM_TAGS is the
57    number of valid tag values to check.  */
58 
59 void
60 lto_tag_check_set (enum LTO_tags actual, int ntags, ...)
61 {
62   va_list ap;
63   int i;
64 
65   va_start (ap, ntags);
66   for (i = 0; i < ntags; i++)
67     if ((unsigned) actual == va_arg (ap, unsigned))
68       {
69 	va_end (ap);
70 	return;
71       }
72 
73   va_end (ap);
74   internal_error ("bytecode stream: unexpected tag %s", lto_tag_name (actual));
75 }
76 
77 
78 /* Read LENGTH bytes from STREAM to ADDR.  */
79 
80 void
81 lto_input_data_block (struct lto_input_block *ib, void *addr, size_t length)
82 {
83   size_t i;
84   unsigned char *const buffer = (unsigned char *const) addr;
85 
86   for (i = 0; i < length; i++)
87     buffer[i] = streamer_read_uchar (ib);
88 }
89 
90 
91 /* Lookup STRING in file_name_hash_table.  If found, return the existing
92    string, otherwise insert STRING as the canonical version.  */
93 
94 static const char *
95 canon_file_name (const char *string)
96 {
97   void **slot;
98   struct string_slot s_slot;
99   size_t len = strlen (string);
100 
101   s_slot.s = string;
102   s_slot.len = len;
103 
104   slot = htab_find_slot (file_name_hash_table, &s_slot, INSERT);
105   if (*slot == NULL)
106     {
107       char *saved_string;
108       struct string_slot *new_slot;
109 
110       saved_string = (char *) xmalloc (len + 1);
111       new_slot = XCNEW (struct string_slot);
112       memcpy (saved_string, string, len + 1);
113       new_slot->s = saved_string;
114       new_slot->len = len;
115       *slot = new_slot;
116       return saved_string;
117     }
118   else
119     {
120       struct string_slot *old_slot = (struct string_slot *) *slot;
121       return old_slot->s;
122     }
123 }
124 
125 
126 /* Read a location bitpack from input block IB.  */
127 
128 location_t
129 lto_input_location (struct bitpack_d *bp, struct data_in *data_in)
130 {
131   static const char *current_file;
132   static int current_line;
133   static int current_col;
134   bool file_change, line_change, column_change;
135   unsigned len;
136   bool prev_file = current_file != NULL;
137 
138   if (bp_unpack_value (bp, 1))
139     return UNKNOWN_LOCATION;
140 
141   file_change = bp_unpack_value (bp, 1);
142   line_change = bp_unpack_value (bp, 1);
143   column_change = bp_unpack_value (bp, 1);
144 
145   if (file_change)
146     current_file = canon_file_name
147 		     (string_for_index (data_in,
148 					bp_unpack_var_len_unsigned (bp),
149 					&len));
150 
151   if (line_change)
152     current_line = bp_unpack_var_len_unsigned (bp);
153 
154   if (column_change)
155     current_col = bp_unpack_var_len_unsigned (bp);
156 
157   if (file_change)
158     {
159       if (prev_file)
160 	linemap_add (line_table, LC_LEAVE, false, NULL, 0);
161 
162       linemap_add (line_table, LC_ENTER, false, current_file, current_line);
163     }
164   else if (line_change)
165     linemap_line_start (line_table, current_line, current_col);
166 
167   return linemap_position_for_column (line_table, current_col);
168 }
169 
170 
171 /* Read a reference to a tree node from DATA_IN using input block IB.
172    TAG is the expected node that should be found in IB, if TAG belongs
173    to one of the indexable trees, expect to read a reference index to
174    be looked up in one of the symbol tables, otherwise read the pysical
175    representation of the tree using stream_read_tree.  FN is the
176    function scope for the read tree.  */
177 
178 tree
179 lto_input_tree_ref (struct lto_input_block *ib, struct data_in *data_in,
180 		    struct function *fn, enum LTO_tags tag)
181 {
182   unsigned HOST_WIDE_INT ix_u;
183   tree result = NULL_TREE;
184 
185   lto_tag_check_range (tag, LTO_field_decl_ref, LTO_global_decl_ref);
186 
187   switch (tag)
188     {
189     case LTO_type_ref:
190       ix_u = streamer_read_uhwi (ib);
191       result = lto_file_decl_data_get_type (data_in->file_data, ix_u);
192       break;
193 
194     case LTO_ssa_name_ref:
195       ix_u = streamer_read_uhwi (ib);
196       result = (*SSANAMES (fn))[ix_u];
197       break;
198 
199     case LTO_field_decl_ref:
200       ix_u = streamer_read_uhwi (ib);
201       result = lto_file_decl_data_get_field_decl (data_in->file_data, ix_u);
202       break;
203 
204     case LTO_function_decl_ref:
205       ix_u = streamer_read_uhwi (ib);
206       result = lto_file_decl_data_get_fn_decl (data_in->file_data, ix_u);
207       break;
208 
209     case LTO_type_decl_ref:
210       ix_u = streamer_read_uhwi (ib);
211       result = lto_file_decl_data_get_type_decl (data_in->file_data, ix_u);
212       break;
213 
214     case LTO_namespace_decl_ref:
215       ix_u = streamer_read_uhwi (ib);
216       result = lto_file_decl_data_get_namespace_decl (data_in->file_data, ix_u);
217       break;
218 
219     case LTO_global_decl_ref:
220     case LTO_result_decl_ref:
221     case LTO_const_decl_ref:
222     case LTO_imported_decl_ref:
223     case LTO_label_decl_ref:
224     case LTO_translation_unit_decl_ref:
225       ix_u = streamer_read_uhwi (ib);
226       result = lto_file_decl_data_get_var_decl (data_in->file_data, ix_u);
227       break;
228 
229     default:
230       gcc_unreachable ();
231     }
232 
233   gcc_assert (result);
234 
235   return result;
236 }
237 
238 
239 /* Read and return a double-linked list of catch handlers from input
240    block IB, using descriptors in DATA_IN.  */
241 
242 static struct eh_catch_d *
243 lto_input_eh_catch_list (struct lto_input_block *ib, struct data_in *data_in,
244 			 eh_catch *last_p)
245 {
246   eh_catch first;
247   enum LTO_tags tag;
248 
249   *last_p = first = NULL;
250   tag = streamer_read_record_start (ib);
251   while (tag)
252     {
253       tree list;
254       eh_catch n;
255 
256       lto_tag_check_range (tag, LTO_eh_catch, LTO_eh_catch);
257 
258       /* Read the catch node.  */
259       n = ggc_alloc_cleared_eh_catch_d ();
260       n->type_list = stream_read_tree (ib, data_in);
261       n->filter_list = stream_read_tree (ib, data_in);
262       n->label = stream_read_tree (ib, data_in);
263 
264       /* Register all the types in N->FILTER_LIST.  */
265       for (list = n->filter_list; list; list = TREE_CHAIN (list))
266 	add_type_for_runtime (TREE_VALUE (list));
267 
268       /* Chain N to the end of the list.  */
269       if (*last_p)
270 	(*last_p)->next_catch = n;
271       n->prev_catch = *last_p;
272       *last_p = n;
273 
274       /* Set the head of the list the first time through the loop.  */
275       if (first == NULL)
276 	first = n;
277 
278       tag = streamer_read_record_start (ib);
279     }
280 
281   return first;
282 }
283 
284 
285 /* Read and return EH region IX from input block IB, using descriptors
286    in DATA_IN.  */
287 
288 static eh_region
289 input_eh_region (struct lto_input_block *ib, struct data_in *data_in, int ix)
290 {
291   enum LTO_tags tag;
292   eh_region r;
293 
294   /* Read the region header.  */
295   tag = streamer_read_record_start (ib);
296   if (tag == LTO_null)
297     return NULL;
298 
299   r = ggc_alloc_cleared_eh_region_d ();
300   r->index = streamer_read_hwi (ib);
301 
302   gcc_assert (r->index == ix);
303 
304   /* Read all the region pointers as region numbers.  We'll fix up
305      the pointers once the whole array has been read.  */
306   r->outer = (eh_region) (intptr_t) streamer_read_hwi (ib);
307   r->inner = (eh_region) (intptr_t) streamer_read_hwi (ib);
308   r->next_peer = (eh_region) (intptr_t) streamer_read_hwi (ib);
309 
310   switch (tag)
311     {
312       case LTO_ert_cleanup:
313 	r->type = ERT_CLEANUP;
314 	break;
315 
316       case LTO_ert_try:
317 	{
318 	  struct eh_catch_d *last_catch;
319 	  r->type = ERT_TRY;
320 	  r->u.eh_try.first_catch = lto_input_eh_catch_list (ib, data_in,
321 							     &last_catch);
322 	  r->u.eh_try.last_catch = last_catch;
323 	  break;
324 	}
325 
326       case LTO_ert_allowed_exceptions:
327 	{
328 	  tree l;
329 
330 	  r->type = ERT_ALLOWED_EXCEPTIONS;
331 	  r->u.allowed.type_list = stream_read_tree (ib, data_in);
332 	  r->u.allowed.label = stream_read_tree (ib, data_in);
333 	  r->u.allowed.filter = streamer_read_uhwi (ib);
334 
335 	  for (l = r->u.allowed.type_list; l ; l = TREE_CHAIN (l))
336 	    add_type_for_runtime (TREE_VALUE (l));
337 	}
338 	break;
339 
340       case LTO_ert_must_not_throw:
341 	{
342 	  r->type = ERT_MUST_NOT_THROW;
343 	  r->u.must_not_throw.failure_decl = stream_read_tree (ib, data_in);
344 	  bitpack_d bp = streamer_read_bitpack (ib);
345 	  r->u.must_not_throw.failure_loc
346 	   = stream_input_location (&bp, data_in);
347 	}
348 	break;
349 
350       default:
351 	gcc_unreachable ();
352     }
353 
354   r->landing_pads = (eh_landing_pad) (intptr_t) streamer_read_hwi (ib);
355 
356   return r;
357 }
358 
359 
360 /* Read and return EH landing pad IX from input block IB, using descriptors
361    in DATA_IN.  */
362 
363 static eh_landing_pad
364 input_eh_lp (struct lto_input_block *ib, struct data_in *data_in, int ix)
365 {
366   enum LTO_tags tag;
367   eh_landing_pad lp;
368 
369   /* Read the landing pad header.  */
370   tag = streamer_read_record_start (ib);
371   if (tag == LTO_null)
372     return NULL;
373 
374   lto_tag_check_range (tag, LTO_eh_landing_pad, LTO_eh_landing_pad);
375 
376   lp = ggc_alloc_cleared_eh_landing_pad_d ();
377   lp->index = streamer_read_hwi (ib);
378   gcc_assert (lp->index == ix);
379   lp->next_lp = (eh_landing_pad) (intptr_t) streamer_read_hwi (ib);
380   lp->region = (eh_region) (intptr_t) streamer_read_hwi (ib);
381   lp->post_landing_pad = stream_read_tree (ib, data_in);
382 
383   return lp;
384 }
385 
386 
387 /* After reading the EH regions, pointers to peer and children regions
388    are region numbers.  This converts all these region numbers into
389    real pointers into the rematerialized regions for FN.  ROOT_REGION
390    is the region number for the root EH region in FN.  */
391 
392 static void
393 fixup_eh_region_pointers (struct function *fn, HOST_WIDE_INT root_region)
394 {
395   unsigned i;
396   vec<eh_region, va_gc> *eh_array = fn->eh->region_array;
397   vec<eh_landing_pad, va_gc> *lp_array = fn->eh->lp_array;
398   eh_region r;
399   eh_landing_pad lp;
400 
401   gcc_assert (eh_array && lp_array);
402 
403   gcc_assert (root_region >= 0);
404   fn->eh->region_tree = (*eh_array)[root_region];
405 
406 #define FIXUP_EH_REGION(r) (r) = (*eh_array)[(HOST_WIDE_INT) (intptr_t) (r)]
407 #define FIXUP_EH_LP(p) (p) = (*lp_array)[(HOST_WIDE_INT) (intptr_t) (p)]
408 
409   /* Convert all the index numbers stored in pointer fields into
410      pointers to the corresponding slots in the EH region array.  */
411   FOR_EACH_VEC_ELT (*eh_array, i, r)
412     {
413       /* The array may contain NULL regions.  */
414       if (r == NULL)
415 	continue;
416 
417       gcc_assert (i == (unsigned) r->index);
418       FIXUP_EH_REGION (r->outer);
419       FIXUP_EH_REGION (r->inner);
420       FIXUP_EH_REGION (r->next_peer);
421       FIXUP_EH_LP (r->landing_pads);
422     }
423 
424   /* Convert all the index numbers stored in pointer fields into
425      pointers to the corresponding slots in the EH landing pad array.  */
426   FOR_EACH_VEC_ELT (*lp_array, i, lp)
427     {
428       /* The array may contain NULL landing pads.  */
429       if (lp == NULL)
430 	continue;
431 
432       gcc_assert (i == (unsigned) lp->index);
433       FIXUP_EH_LP (lp->next_lp);
434       FIXUP_EH_REGION (lp->region);
435     }
436 
437 #undef FIXUP_EH_REGION
438 #undef FIXUP_EH_LP
439 }
440 
441 
442 /* Initialize EH support.  */
443 
444 void
445 lto_init_eh (void)
446 {
447   static bool eh_initialized_p = false;
448 
449   if (eh_initialized_p)
450     return;
451 
452   /* Contrary to most other FEs, we only initialize EH support when at
453      least one of the files in the set contains exception regions in
454      it.  Since this happens much later than the call to init_eh in
455      lang_dependent_init, we have to set flag_exceptions and call
456      init_eh again to initialize the EH tables.  */
457   flag_exceptions = 1;
458   init_eh ();
459 
460   eh_initialized_p = true;
461 }
462 
463 
464 /* Read the exception table for FN from IB using the data descriptors
465    in DATA_IN.  */
466 
467 static void
468 input_eh_regions (struct lto_input_block *ib, struct data_in *data_in,
469 		  struct function *fn)
470 {
471   HOST_WIDE_INT i, root_region, len;
472   enum LTO_tags tag;
473 
474   tag = streamer_read_record_start (ib);
475   if (tag == LTO_null)
476     return;
477 
478   lto_tag_check_range (tag, LTO_eh_table, LTO_eh_table);
479 
480   /* If the file contains EH regions, then it was compiled with
481      -fexceptions.  In that case, initialize the backend EH
482      machinery.  */
483   lto_init_eh ();
484 
485   gcc_assert (fn->eh);
486 
487   root_region = streamer_read_hwi (ib);
488   gcc_assert (root_region == (int) root_region);
489 
490   /* Read the EH region array.  */
491   len = streamer_read_hwi (ib);
492   gcc_assert (len == (int) len);
493   if (len > 0)
494     {
495       vec_safe_grow_cleared (fn->eh->region_array, len);
496       for (i = 0; i < len; i++)
497 	{
498 	  eh_region r = input_eh_region (ib, data_in, i);
499 	  (*fn->eh->region_array)[i] = r;
500 	}
501     }
502 
503   /* Read the landing pads.  */
504   len = streamer_read_hwi (ib);
505   gcc_assert (len == (int) len);
506   if (len > 0)
507     {
508       vec_safe_grow_cleared (fn->eh->lp_array, len);
509       for (i = 0; i < len; i++)
510 	{
511 	  eh_landing_pad lp = input_eh_lp (ib, data_in, i);
512 	  (*fn->eh->lp_array)[i] = lp;
513 	}
514     }
515 
516   /* Read the runtime type data.  */
517   len = streamer_read_hwi (ib);
518   gcc_assert (len == (int) len);
519   if (len > 0)
520     {
521       vec_safe_grow_cleared (fn->eh->ttype_data, len);
522       for (i = 0; i < len; i++)
523 	{
524 	  tree ttype = stream_read_tree (ib, data_in);
525 	  (*fn->eh->ttype_data)[i] = ttype;
526 	}
527     }
528 
529   /* Read the table of action chains.  */
530   len = streamer_read_hwi (ib);
531   gcc_assert (len == (int) len);
532   if (len > 0)
533     {
534       if (targetm.arm_eabi_unwinder)
535 	{
536 	  vec_safe_grow_cleared (fn->eh->ehspec_data.arm_eabi, len);
537 	  for (i = 0; i < len; i++)
538 	    {
539 	      tree t = stream_read_tree (ib, data_in);
540 	      (*fn->eh->ehspec_data.arm_eabi)[i] = t;
541 	    }
542 	}
543       else
544 	{
545 	  vec_safe_grow_cleared (fn->eh->ehspec_data.other, len);
546 	  for (i = 0; i < len; i++)
547 	    {
548 	      uchar c = streamer_read_uchar (ib);
549 	      (*fn->eh->ehspec_data.other)[i] = c;
550 	    }
551 	}
552     }
553 
554   /* Reconstruct the EH region tree by fixing up the peer/children
555      pointers.  */
556   fixup_eh_region_pointers (fn, root_region);
557 
558   tag = streamer_read_record_start (ib);
559   lto_tag_check_range (tag, LTO_null, LTO_null);
560 }
561 
562 
563 /* Make a new basic block with index INDEX in function FN.  */
564 
565 static basic_block
566 make_new_block (struct function *fn, unsigned int index)
567 {
568   basic_block bb = alloc_block ();
569   bb->index = index;
570   SET_BASIC_BLOCK_FOR_FUNCTION (fn, index, bb);
571   n_basic_blocks_for_function (fn)++;
572   return bb;
573 }
574 
575 
576 /* Read the CFG for function FN from input block IB.  */
577 
578 static void
579 input_cfg (struct lto_input_block *ib, struct function *fn,
580 	   int count_materialization_scale)
581 {
582   unsigned int bb_count;
583   basic_block p_bb;
584   unsigned int i;
585   int index;
586 
587   init_empty_tree_cfg_for_function (fn);
588   init_ssa_operands (fn);
589 
590   profile_status_for_function (fn) = streamer_read_enum (ib, profile_status_d,
591 							 PROFILE_LAST);
592 
593   bb_count = streamer_read_uhwi (ib);
594 
595   last_basic_block_for_function (fn) = bb_count;
596   if (bb_count > basic_block_info_for_function (fn)->length ())
597     vec_safe_grow_cleared (basic_block_info_for_function (fn), bb_count);
598 
599   if (bb_count > label_to_block_map_for_function (fn)->length ())
600     vec_safe_grow_cleared (label_to_block_map_for_function (fn), bb_count);
601 
602   index = streamer_read_hwi (ib);
603   while (index != -1)
604     {
605       basic_block bb = BASIC_BLOCK_FOR_FUNCTION (fn, index);
606       unsigned int edge_count;
607 
608       if (bb == NULL)
609 	bb = make_new_block (fn, index);
610 
611       edge_count = streamer_read_uhwi (ib);
612 
613       /* Connect up the CFG.  */
614       for (i = 0; i < edge_count; i++)
615 	{
616 	  unsigned int dest_index;
617 	  unsigned int edge_flags;
618 	  basic_block dest;
619 	  int probability;
620 	  gcov_type count;
621 	  edge e;
622 
623 	  dest_index = streamer_read_uhwi (ib);
624 	  probability = (int) streamer_read_hwi (ib);
625 	  count = ((gcov_type) streamer_read_hwi (ib) * count_materialization_scale
626 		   + REG_BR_PROB_BASE / 2) / REG_BR_PROB_BASE;
627 	  edge_flags = streamer_read_uhwi (ib);
628 
629 	  dest = BASIC_BLOCK_FOR_FUNCTION (fn, dest_index);
630 
631 	  if (dest == NULL)
632 	    dest = make_new_block (fn, dest_index);
633 
634 	  e = make_edge (bb, dest, edge_flags);
635 	  e->probability = probability;
636 	  e->count = count;
637 	}
638 
639       index = streamer_read_hwi (ib);
640     }
641 
642   p_bb = ENTRY_BLOCK_PTR_FOR_FUNCTION(fn);
643   index = streamer_read_hwi (ib);
644   while (index != -1)
645     {
646       basic_block bb = BASIC_BLOCK_FOR_FUNCTION (fn, index);
647       bb->prev_bb = p_bb;
648       p_bb->next_bb = bb;
649       p_bb = bb;
650       index = streamer_read_hwi (ib);
651     }
652 }
653 
654 
655 /* Read the SSA names array for function FN from DATA_IN using input
656    block IB.  */
657 
658 static void
659 input_ssa_names (struct lto_input_block *ib, struct data_in *data_in,
660 		 struct function *fn)
661 {
662   unsigned int i, size;
663 
664   size = streamer_read_uhwi (ib);
665   init_ssanames (fn, size);
666 
667   i = streamer_read_uhwi (ib);
668   while (i)
669     {
670       tree ssa_name, name;
671       bool is_default_def;
672 
673       /* Skip over the elements that had been freed.  */
674       while (SSANAMES (fn)->length () < i)
675 	SSANAMES (fn)->quick_push (NULL_TREE);
676 
677       is_default_def = (streamer_read_uchar (ib) != 0);
678       name = stream_read_tree (ib, data_in);
679       ssa_name = make_ssa_name_fn (fn, name, gimple_build_nop ());
680 
681       if (is_default_def)
682 	set_ssa_default_def (cfun, SSA_NAME_VAR (ssa_name), ssa_name);
683 
684       i = streamer_read_uhwi (ib);
685     }
686 }
687 
688 
689 /* Go through all NODE edges and fixup call_stmt pointers
690    so they point to STMTS.  */
691 
692 static void
693 fixup_call_stmt_edges_1 (struct cgraph_node *node, gimple *stmts)
694 {
695   struct cgraph_edge *cedge;
696   for (cedge = node->callees; cedge; cedge = cedge->next_callee)
697     cedge->call_stmt = stmts[cedge->lto_stmt_uid];
698   for (cedge = node->indirect_calls; cedge; cedge = cedge->next_callee)
699     cedge->call_stmt = stmts[cedge->lto_stmt_uid];
700 }
701 
702 /* Fixup call_stmt pointers in NODE and all clones.  */
703 
704 static void
705 fixup_call_stmt_edges (struct cgraph_node *orig, gimple *stmts)
706 {
707   struct cgraph_node *node;
708 
709   while (orig->clone_of)
710     orig = orig->clone_of;
711 
712   fixup_call_stmt_edges_1 (orig, stmts);
713   if (orig->clones)
714     for (node = orig->clones; node != orig;)
715       {
716 	fixup_call_stmt_edges_1 (node, stmts);
717 	if (node->clones)
718 	  node = node->clones;
719 	else if (node->next_sibling_clone)
720 	  node = node->next_sibling_clone;
721 	else
722 	  {
723 	    while (node != orig && !node->next_sibling_clone)
724 	      node = node->clone_of;
725 	    if (node != orig)
726 	      node = node->next_sibling_clone;
727 	  }
728       }
729 }
730 
731 
732 /* Input the base body of struct function FN from DATA_IN
733    using input block IB.  */
734 
735 static void
736 input_struct_function_base (struct function *fn, struct data_in *data_in,
737                             struct lto_input_block *ib)
738 {
739   struct bitpack_d bp;
740   int len;
741 
742   /* Read the static chain and non-local goto save area.  */
743   fn->static_chain_decl = stream_read_tree (ib, data_in);
744   fn->nonlocal_goto_save_area = stream_read_tree (ib, data_in);
745 
746   /* Read all the local symbols.  */
747   len = streamer_read_hwi (ib);
748   if (len > 0)
749     {
750       int i;
751       vec_safe_grow_cleared (fn->local_decls, len);
752       for (i = 0; i < len; i++)
753 	{
754 	  tree t = stream_read_tree (ib, data_in);
755 	  (*fn->local_decls)[i] = t;
756 	}
757     }
758 
759   /* Input the current IL state of the function.  */
760   fn->curr_properties = streamer_read_uhwi (ib);
761 
762   /* Read all the attributes for FN.  */
763   bp = streamer_read_bitpack (ib);
764   fn->is_thunk = bp_unpack_value (&bp, 1);
765   fn->has_local_explicit_reg_vars = bp_unpack_value (&bp, 1);
766   fn->returns_pcc_struct = bp_unpack_value (&bp, 1);
767   fn->returns_struct = bp_unpack_value (&bp, 1);
768   fn->can_throw_non_call_exceptions = bp_unpack_value (&bp, 1);
769   fn->can_delete_dead_exceptions = bp_unpack_value (&bp, 1);
770   fn->always_inline_functions_inlined = bp_unpack_value (&bp, 1);
771   fn->after_inlining = bp_unpack_value (&bp, 1);
772   fn->stdarg = bp_unpack_value (&bp, 1);
773   fn->has_nonlocal_label = bp_unpack_value (&bp, 1);
774   fn->calls_alloca = bp_unpack_value (&bp, 1);
775   fn->calls_setjmp = bp_unpack_value (&bp, 1);
776   fn->va_list_fpr_size = bp_unpack_value (&bp, 8);
777   fn->va_list_gpr_size = bp_unpack_value (&bp, 8);
778 
779   /* Input the function start and end loci.  */
780   fn->function_start_locus = stream_input_location (&bp, data_in);
781   fn->function_end_locus = stream_input_location (&bp, data_in);
782 }
783 
784 
785 /* Read the body of function FN_DECL from DATA_IN using input block IB.  */
786 
787 static void
788 input_function (tree fn_decl, struct data_in *data_in,
789 		struct lto_input_block *ib)
790 {
791   struct function *fn;
792   enum LTO_tags tag;
793   gimple *stmts;
794   basic_block bb;
795   struct cgraph_node *node;
796 
797   fn = DECL_STRUCT_FUNCTION (fn_decl);
798   tag = streamer_read_record_start (ib);
799 
800   gimple_register_cfg_hooks ();
801   lto_tag_check (tag, LTO_function);
802 
803   input_struct_function_base (fn, data_in, ib);
804 
805   /* Read all the SSA names.  */
806   input_ssa_names (ib, data_in, fn);
807 
808   /* Read the exception handling regions in the function.  */
809   input_eh_regions (ib, data_in, fn);
810 
811   /* Read the tree of lexical scopes for the function.  */
812   DECL_INITIAL (fn_decl) = stream_read_tree (ib, data_in);
813   gcc_assert (DECL_INITIAL (fn_decl));
814   DECL_SAVED_TREE (fn_decl) = NULL_TREE;
815   node = cgraph_get_create_node (fn_decl);
816 
817   /* Read all the basic blocks.  */
818   tag = streamer_read_record_start (ib);
819   while (tag)
820     {
821       input_bb (ib, tag, data_in, fn,
822 		node->count_materialization_scale);
823       tag = streamer_read_record_start (ib);
824     }
825 
826   /* Fix up the call statements that are mentioned in the callgraph
827      edges.  */
828   set_gimple_stmt_max_uid (cfun, 0);
829   FOR_ALL_BB (bb)
830     {
831       gimple_stmt_iterator gsi;
832       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
833 	{
834 	  gimple stmt = gsi_stmt (gsi);
835 	  gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
836 	}
837     }
838   stmts = (gimple *) xcalloc (gimple_stmt_max_uid (fn), sizeof (gimple));
839   FOR_ALL_BB (bb)
840     {
841       gimple_stmt_iterator bsi = gsi_start_bb (bb);
842       while (!gsi_end_p (bsi))
843 	{
844 	  gimple stmt = gsi_stmt (bsi);
845 	  /* If we're recompiling LTO objects with debug stmts but
846 	     we're not supposed to have debug stmts, remove them now.
847 	     We can't remove them earlier because this would cause uid
848 	     mismatches in fixups, but we can do it at this point, as
849 	     long as debug stmts don't require fixups.  */
850 	  if (!MAY_HAVE_DEBUG_STMTS && is_gimple_debug (stmt))
851 	    {
852 	      gimple_stmt_iterator gsi = bsi;
853 	      gsi_next (&bsi);
854 	      gsi_remove (&gsi, true);
855 	    }
856 	  else
857 	    {
858 	      gsi_next (&bsi);
859 	      stmts[gimple_uid (stmt)] = stmt;
860 	    }
861 	}
862     }
863 
864   /* Set the gimple body to the statement sequence in the entry
865      basic block.  FIXME lto, this is fairly hacky.  The existence
866      of a gimple body is used by the cgraph routines, but we should
867      really use the presence of the CFG.  */
868   {
869     edge_iterator ei = ei_start (ENTRY_BLOCK_PTR->succs);
870     gimple_set_body (fn_decl, bb_seq (ei_edge (ei)->dest));
871   }
872 
873   fixup_call_stmt_edges (node, stmts);
874   execute_all_ipa_stmt_fixups (node, stmts);
875 
876   update_ssa (TODO_update_ssa_only_virtuals);
877   free_dominance_info (CDI_DOMINATORS);
878   free_dominance_info (CDI_POST_DOMINATORS);
879   free (stmts);
880 }
881 
882 
883 /* Read the body from DATA for function FN_DECL and fill it in.
884    FILE_DATA are the global decls and types.  SECTION_TYPE is either
885    LTO_section_function_body or LTO_section_static_initializer.  If
886    section type is LTO_section_function_body, FN must be the decl for
887    that function.  */
888 
889 static void
890 lto_read_body (struct lto_file_decl_data *file_data, tree fn_decl,
891 	       const char *data, enum lto_section_type section_type)
892 {
893   const struct lto_function_header *header;
894   struct data_in *data_in;
895   int cfg_offset;
896   int main_offset;
897   int string_offset;
898   struct lto_input_block ib_cfg;
899   struct lto_input_block ib_main;
900 
901   header = (const struct lto_function_header *) data;
902   cfg_offset = sizeof (struct lto_function_header);
903   main_offset = cfg_offset + header->cfg_size;
904   string_offset = main_offset + header->main_size;
905 
906   LTO_INIT_INPUT_BLOCK (ib_cfg,
907 		        data + cfg_offset,
908 			0,
909 			header->cfg_size);
910 
911   LTO_INIT_INPUT_BLOCK (ib_main,
912 			data + main_offset,
913 			0,
914 			header->main_size);
915 
916   data_in = lto_data_in_create (file_data, data + string_offset,
917 			      header->string_size, vNULL);
918 
919   /* Make sure the file was generated by the exact same compiler.  */
920   lto_check_version (header->lto_header.major_version,
921 		     header->lto_header.minor_version);
922 
923   if (section_type == LTO_section_function_body)
924     {
925       struct function *fn = DECL_STRUCT_FUNCTION (fn_decl);
926       struct lto_in_decl_state *decl_state;
927       struct cgraph_node *node = cgraph_get_node (fn_decl);
928       unsigned from;
929 
930       gcc_checking_assert (node);
931       push_cfun (fn);
932       init_tree_ssa (fn);
933 
934       /* We input IL in SSA form.  */
935       cfun->gimple_df->in_ssa_p = true;
936 
937       /* Use the function's decl state. */
938       decl_state = lto_get_function_in_decl_state (file_data, fn_decl);
939       gcc_assert (decl_state);
940       file_data->current_decl_state = decl_state;
941 
942       input_cfg (&ib_cfg, fn, node->count_materialization_scale);
943 
944       /* Set up the struct function.  */
945       from = data_in->reader_cache->nodes.length ();
946       input_function (fn_decl, data_in, &ib_main);
947       /* And fixup types we streamed locally.  */
948 	{
949 	  struct streamer_tree_cache_d *cache = data_in->reader_cache;
950 	  unsigned len = cache->nodes.length ();
951 	  unsigned i;
952 	  for (i = len; i-- > from;)
953 	    {
954 	      tree t = cache->nodes[i];
955 	      if (t == NULL_TREE)
956 		continue;
957 
958 	      if (TYPE_P (t))
959 		{
960 		  gcc_assert (TYPE_CANONICAL (t) == NULL_TREE);
961 		  TYPE_CANONICAL (t) = TYPE_MAIN_VARIANT (t);
962 		  if (TYPE_MAIN_VARIANT (t) != t)
963 		    {
964 		      gcc_assert (TYPE_NEXT_VARIANT (t) == NULL_TREE);
965 		      TYPE_NEXT_VARIANT (t)
966 			= TYPE_NEXT_VARIANT (TYPE_MAIN_VARIANT (t));
967 		      TYPE_NEXT_VARIANT (TYPE_MAIN_VARIANT (t)) = t;
968 		    }
969 		}
970 	    }
971 	}
972 
973       /* Restore decl state */
974       file_data->current_decl_state = file_data->global_decl_state;
975 
976       pop_cfun ();
977     }
978 
979   lto_data_in_delete (data_in);
980 }
981 
982 
983 /* Read the body of FN_DECL using DATA.  FILE_DATA holds the global
984    decls and types.  */
985 
986 void
987 lto_input_function_body (struct lto_file_decl_data *file_data,
988 			 tree fn_decl, const char *data)
989 {
990   lto_read_body (file_data, fn_decl, data, LTO_section_function_body);
991 }
992 
993 
994 /* Read the physical representation of a tree node with tag TAG from
995    input block IB using the per-file context in DATA_IN.  */
996 
997 static tree
998 lto_read_tree (struct lto_input_block *ib, struct data_in *data_in,
999 	       enum LTO_tags tag)
1000 {
1001   /* Instantiate a new tree node.  */
1002   tree result = streamer_alloc_tree (ib, data_in, tag);
1003 
1004   /* Enter RESULT in the reader cache.  This will make RESULT
1005      available so that circular references in the rest of the tree
1006      structure can be resolved in subsequent calls to stream_read_tree.  */
1007   streamer_tree_cache_append (data_in->reader_cache, result);
1008 
1009   /* Read all the bitfield values in RESULT.  Note that for LTO, we
1010      only write language-independent bitfields, so no more unpacking is
1011      needed.  */
1012   streamer_read_tree_bitfields (ib, data_in, result);
1013 
1014   /* Read all the pointer fields in RESULT.  */
1015   streamer_read_tree_body (ib, data_in, result);
1016 
1017   /* Read any LTO-specific data not read by the tree streamer.  */
1018   if (DECL_P (result)
1019       && TREE_CODE (result) != FUNCTION_DECL
1020       && TREE_CODE (result) != TRANSLATION_UNIT_DECL)
1021     DECL_INITIAL (result) = stream_read_tree (ib, data_in);
1022 
1023   /* We should never try to instantiate an MD or NORMAL builtin here.  */
1024   if (TREE_CODE (result) == FUNCTION_DECL)
1025     gcc_assert (!streamer_handle_as_builtin_p (result));
1026 
1027   /* end_marker = */ streamer_read_uchar (ib);
1028 
1029 #ifdef LTO_STREAMER_DEBUG
1030   /* Remove the mapping to RESULT's original address set by
1031      streamer_alloc_tree.  */
1032   lto_orig_address_remove (result);
1033 #endif
1034 
1035   return result;
1036 }
1037 
1038 
1039 /* Read a tree from input block IB using the per-file context in
1040    DATA_IN.  This context is used, for example, to resolve references
1041    to previously read nodes.  */
1042 
1043 tree
1044 lto_input_tree (struct lto_input_block *ib, struct data_in *data_in)
1045 {
1046   enum LTO_tags tag;
1047   tree result;
1048 
1049   tag = streamer_read_record_start (ib);
1050   gcc_assert ((unsigned) tag < (unsigned) LTO_NUM_TAGS);
1051 
1052   if (tag == LTO_null)
1053     result = NULL_TREE;
1054   else if (tag >= LTO_field_decl_ref && tag <= LTO_global_decl_ref)
1055     {
1056       /* If TAG is a reference to an indexable tree, the next value
1057 	 in IB is the index into the table where we expect to find
1058 	 that tree.  */
1059       result = lto_input_tree_ref (ib, data_in, cfun, tag);
1060     }
1061   else if (tag == LTO_tree_pickle_reference)
1062     {
1063       /* If TAG is a reference to a previously read tree, look it up in
1064 	 the reader cache.  */
1065       result = streamer_get_pickled_tree (ib, data_in);
1066     }
1067   else if (tag == LTO_builtin_decl)
1068     {
1069       /* If we are going to read a built-in function, all we need is
1070 	 the code and class.  */
1071       result = streamer_get_builtin_tree (ib, data_in);
1072     }
1073   else if (tag == LTO_integer_cst)
1074     {
1075       /* For shared integer constants we only need the type and its hi/low
1076 	 words.  */
1077       result = streamer_read_integer_cst (ib, data_in);
1078     }
1079   else
1080     {
1081       /* Otherwise, materialize a new node from IB.  */
1082       result = lto_read_tree (ib, data_in, tag);
1083     }
1084 
1085   return result;
1086 }
1087 
1088 
1089 /* Input toplevel asms.  */
1090 
1091 void
1092 lto_input_toplevel_asms (struct lto_file_decl_data *file_data, int order_base)
1093 {
1094   size_t len;
1095   const char *data = lto_get_section_data (file_data, LTO_section_asm,
1096 					   NULL, &len);
1097   const struct lto_asm_header *header = (const struct lto_asm_header *) data;
1098   int string_offset;
1099   struct data_in *data_in;
1100   struct lto_input_block ib;
1101   tree str;
1102 
1103   if (! data)
1104     return;
1105 
1106   string_offset = sizeof (*header) + header->main_size;
1107 
1108   LTO_INIT_INPUT_BLOCK (ib,
1109 			data + sizeof (*header),
1110 			0,
1111 			header->main_size);
1112 
1113   data_in = lto_data_in_create (file_data, data + string_offset,
1114 			      header->string_size, vNULL);
1115 
1116   /* Make sure the file was generated by the exact same compiler.  */
1117   lto_check_version (header->lto_header.major_version,
1118 		     header->lto_header.minor_version);
1119 
1120   while ((str = streamer_read_string_cst (data_in, &ib)))
1121     {
1122       struct asm_node *node = add_asm_node (str);
1123       node->order = streamer_read_hwi (&ib) + order_base;
1124       if (node->order >= symtab_order)
1125 	symtab_order = node->order + 1;
1126     }
1127 
1128   lto_data_in_delete (data_in);
1129 
1130   lto_free_section_data (file_data, LTO_section_asm, NULL, data, len);
1131 }
1132 
1133 
1134 /* Initialization for the LTO reader.  */
1135 
1136 void
1137 lto_reader_init (void)
1138 {
1139   lto_streamer_init ();
1140   file_name_hash_table = htab_create (37, hash_string_slot_node,
1141 				      eq_string_slot_node, free);
1142 }
1143 
1144 
1145 /* Create a new data_in object for FILE_DATA. STRINGS is the string
1146    table to use with LEN strings.  RESOLUTIONS is the vector of linker
1147    resolutions (NULL if not using a linker plugin).  */
1148 
1149 struct data_in *
1150 lto_data_in_create (struct lto_file_decl_data *file_data, const char *strings,
1151 		    unsigned len,
1152 		    vec<ld_plugin_symbol_resolution_t> resolutions)
1153 {
1154   struct data_in *data_in = XCNEW (struct data_in);
1155   data_in->file_data = file_data;
1156   data_in->strings = strings;
1157   data_in->strings_len = len;
1158   data_in->globals_resolution = resolutions;
1159   data_in->reader_cache = streamer_tree_cache_create ();
1160 
1161   return data_in;
1162 }
1163 
1164 
1165 /* Remove DATA_IN.  */
1166 
1167 void
1168 lto_data_in_delete (struct data_in *data_in)
1169 {
1170   data_in->globals_resolution.release ();
1171   streamer_tree_cache_delete (data_in->reader_cache);
1172   free (data_in->labels);
1173   free (data_in);
1174 }
1175