Home | History | Annotate | Line # | Download | only in gcc
      1  1.1  mrg /* Read the GIMPLE representation from a file stream.
      2  1.1  mrg 
      3  1.1  mrg    Copyright (C) 2009-2022 Free Software Foundation, Inc.
      4  1.1  mrg    Contributed by Kenneth Zadeck <zadeck (at) naturalbridge.com>
      5  1.1  mrg    Re-implemented by Diego Novillo <dnovillo (at) google.com>
      6  1.1  mrg 
      7  1.1  mrg This file is part of GCC.
      8  1.1  mrg 
      9  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
     10  1.1  mrg the terms of the GNU General Public License as published by the Free
     11  1.1  mrg Software Foundation; either version 3, or (at your option) any later
     12  1.1  mrg version.
     13  1.1  mrg 
     14  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     15  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     16  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     17  1.1  mrg for more details.
     18  1.1  mrg 
     19  1.1  mrg You should have received a copy of the GNU General Public License
     20  1.1  mrg along with GCC; see the file COPYING3.  If not see
     21  1.1  mrg <http://www.gnu.org/licenses/>.  */
     22  1.1  mrg 
     23  1.1  mrg #include "config.h"
     24  1.1  mrg #include "system.h"
     25  1.1  mrg #include "coretypes.h"
     26  1.1  mrg #include "backend.h"
     27  1.1  mrg #include "target.h"
     28  1.1  mrg #include "rtl.h"
     29  1.1  mrg #include "tree.h"
     30  1.1  mrg #include "gimple.h"
     31  1.1  mrg #include "cfghooks.h"
     32  1.1  mrg #include "tree-pass.h"
     33  1.1  mrg #include "ssa.h"
     34  1.1  mrg #include "gimple-streamer.h"
     35  1.1  mrg #include "toplev.h"
     36  1.1  mrg #include "gimple-iterator.h"
     37  1.1  mrg #include "tree-cfg.h"
     38  1.1  mrg #include "tree-into-ssa.h"
     39  1.1  mrg #include "tree-dfa.h"
     40  1.1  mrg #include "tree-ssa.h"
     41  1.1  mrg #include "except.h"
     42  1.1  mrg #include "cgraph.h"
     43  1.1  mrg #include "cfgloop.h"
     44  1.1  mrg #include "debug.h"
     45  1.1  mrg #include "alloc-pool.h"
     46  1.1  mrg #include "toplev.h"
     47  1.1  mrg 
     48  1.1  mrg /* Allocator used to hold string slot entries for line map streaming.  */
     49  1.1  mrg static struct object_allocator<struct string_slot> *string_slot_allocator;
     50  1.1  mrg 
     51  1.1  mrg /* The table to hold the file names.  */
     52  1.1  mrg static hash_table<string_slot_hasher> *file_name_hash_table;
     53  1.1  mrg 
     54  1.1  mrg /* The table to hold the relative pathname prefixes.  */
     55  1.1  mrg 
     56  1.1  mrg /* This obstack holds file names used in locators. Line map datastructures
     57  1.1  mrg    points here and thus it needs to be kept allocated as long as linemaps
     58  1.1  mrg    exists.  */
     59  1.1  mrg static struct obstack file_name_obstack;
     60  1.1  mrg 
     61  1.1  mrg /* Map a pair of nul terminated strings where the first one can be
     62  1.1  mrg    pointer compared, but the second can't, to another string.  */
     63  1.1  mrg struct string_pair_map
     64  1.1  mrg {
     65  1.1  mrg   const char *str1;
     66  1.1  mrg   const char *str2;
     67  1.1  mrg   const char *str3;
     68  1.1  mrg   hashval_t hash;
     69  1.1  mrg   bool prefix;
     70  1.1  mrg };
     71  1.1  mrg 
     72  1.1  mrg /* Allocator used to hold string pair map entries for line map streaming.  */
     73  1.1  mrg static struct object_allocator<struct string_pair_map>
     74  1.1  mrg   *string_pair_map_allocator;
     75  1.1  mrg 
     76  1.1  mrg struct string_pair_map_hasher : nofree_ptr_hash <string_pair_map>
     77  1.1  mrg {
     78  1.1  mrg   static inline hashval_t hash (const string_pair_map *);
     79  1.1  mrg   static inline bool equal (const string_pair_map *, const string_pair_map *);
     80  1.1  mrg };
     81  1.1  mrg 
     82  1.1  mrg inline hashval_t
     83  1.1  mrg string_pair_map_hasher::hash (const string_pair_map *spm)
     84  1.1  mrg {
     85  1.1  mrg   return spm->hash;
     86  1.1  mrg }
     87  1.1  mrg 
     88  1.1  mrg inline bool
     89  1.1  mrg string_pair_map_hasher::equal (const string_pair_map *spm1,
     90  1.1  mrg 			       const string_pair_map *spm2)
     91  1.1  mrg {
     92  1.1  mrg   return (spm1->hash == spm2->hash
     93  1.1  mrg 	  && spm1->str1 == spm2->str1
     94  1.1  mrg 	  && spm1->prefix == spm2->prefix
     95  1.1  mrg 	  && strcmp (spm1->str2, spm2->str2) == 0);
     96  1.1  mrg }
     97  1.1  mrg 
     98  1.1  mrg /* The table to hold the pairs of pathnames and corresponding
     99  1.1  mrg    resulting pathname.  Used for both mapping of get_src_pwd ()
    100  1.1  mrg    and recorded source working directory to relative path prefix
    101  1.1  mrg    from current working directory to the recorded one, and for
    102  1.1  mrg    mapping of that relative path prefix and some relative path
    103  1.1  mrg    to those concatenated.  */
    104  1.1  mrg static hash_table<string_pair_map_hasher> *path_name_pair_hash_table;
    105  1.1  mrg 
    106  1.1  mrg 
    107  1.1  mrg /* Check that tag ACTUAL has one of the given values.  NUM_TAGS is the
    108  1.1  mrg    number of valid tag values to check.  */
    109  1.1  mrg 
    110  1.1  mrg void
    111  1.1  mrg lto_tag_check_set (enum LTO_tags actual, int ntags, ...)
    112  1.1  mrg {
    113  1.1  mrg   va_list ap;
    114  1.1  mrg   int i;
    115  1.1  mrg 
    116  1.1  mrg   va_start (ap, ntags);
    117  1.1  mrg   for (i = 0; i < ntags; i++)
    118  1.1  mrg     if ((unsigned) actual == va_arg (ap, unsigned))
    119  1.1  mrg       {
    120  1.1  mrg 	va_end (ap);
    121  1.1  mrg 	return;
    122  1.1  mrg       }
    123  1.1  mrg 
    124  1.1  mrg   va_end (ap);
    125  1.1  mrg   internal_error ("bytecode stream: unexpected tag %s", lto_tag_name (actual));
    126  1.1  mrg }
    127  1.1  mrg 
    128  1.1  mrg 
    129  1.1  mrg /* Read LENGTH bytes from STREAM to ADDR.  */
    130  1.1  mrg 
    131  1.1  mrg void
    132  1.1  mrg lto_input_data_block (class lto_input_block *ib, void *addr, size_t length)
    133  1.1  mrg {
    134  1.1  mrg   size_t i;
    135  1.1  mrg   unsigned char *const buffer = (unsigned char *) addr;
    136  1.1  mrg 
    137  1.1  mrg   for (i = 0; i < length; i++)
    138  1.1  mrg     buffer[i] = streamer_read_uchar (ib);
    139  1.1  mrg }
    140  1.1  mrg 
    141  1.1  mrg /* Compute the relative path to get to DATA_WD (absolute directory name)
    142  1.1  mrg    from CWD (another absolute directory name).  E.g. for
    143  1.1  mrg    DATA_WD of "/tmp/foo/bar" and CWD of "/tmp/baz/qux" return
    144  1.1  mrg    "../../foo/bar".  Returned string should be freed by the caller.
    145  1.1  mrg    Return NULL if absolute file name needs to be used.  */
    146  1.1  mrg 
    147  1.1  mrg static char *
    148  1.1  mrg relative_path_prefix (const char *data_wd, const char *cwd)
    149  1.1  mrg {
    150  1.1  mrg   const char *d = data_wd;
    151  1.1  mrg   const char *c = cwd;
    152  1.1  mrg #ifdef HAVE_DOS_BASED_FILE_SYSTEM
    153  1.1  mrg   if (d[1] == ':')
    154  1.1  mrg     {
    155  1.1  mrg       if (!IS_DIR_SEPARATOR (d[2]))
    156  1.1  mrg 	return NULL;
    157  1.1  mrg       if (c[0] == d[0] && c[1] == ':' && IS_DIR_SEPARATOR (c[2]))
    158  1.1  mrg 	{
    159  1.1  mrg 	  c += 3;
    160  1.1  mrg 	  d += 3;
    161  1.1  mrg 	}
    162  1.1  mrg       else
    163  1.1  mrg 	return NULL;
    164  1.1  mrg     }
    165  1.1  mrg   else if (c[1] == ':')
    166  1.1  mrg     return NULL;
    167  1.1  mrg #endif
    168  1.1  mrg   do
    169  1.1  mrg     {
    170  1.1  mrg       while (IS_DIR_SEPARATOR (*d))
    171  1.1  mrg 	d++;
    172  1.1  mrg       while (IS_DIR_SEPARATOR (*c))
    173  1.1  mrg 	c++;
    174  1.1  mrg       size_t i;
    175  1.1  mrg       for (i = 0; c[i] && !IS_DIR_SEPARATOR (c[i]) && c[i] == d[i]; i++)
    176  1.1  mrg 	;
    177  1.1  mrg       if ((c[i] == '\0' || IS_DIR_SEPARATOR (c[i]))
    178  1.1  mrg 	  && (d[i] == '\0' || IS_DIR_SEPARATOR (d[i])))
    179  1.1  mrg 	{
    180  1.1  mrg 	  c += i;
    181  1.1  mrg 	  d += i;
    182  1.1  mrg 	  if (*c == '\0' || *d == '\0')
    183  1.1  mrg 	    break;
    184  1.1  mrg 	}
    185  1.1  mrg       else
    186  1.1  mrg 	break;
    187  1.1  mrg     }
    188  1.1  mrg   while (1);
    189  1.1  mrg   size_t num_up = 0;
    190  1.1  mrg   do
    191  1.1  mrg     {
    192  1.1  mrg       while (IS_DIR_SEPARATOR (*c))
    193  1.1  mrg 	c++;
    194  1.1  mrg       if (*c == '\0')
    195  1.1  mrg 	break;
    196  1.1  mrg       num_up++;
    197  1.1  mrg       while (*c && !IS_DIR_SEPARATOR (*c))
    198  1.1  mrg 	c++;
    199  1.1  mrg     }
    200  1.1  mrg   while (1);
    201  1.1  mrg   while (IS_DIR_SEPARATOR (*d))
    202  1.1  mrg     d++;
    203  1.1  mrg   size_t len = strlen (d);
    204  1.1  mrg   if (len == 0 && num_up == 0)
    205  1.1  mrg     return xstrdup (".");
    206  1.1  mrg   char *ret = XNEWVEC (char, num_up * 3 + len + 1);
    207  1.1  mrg   char *p = ret;
    208  1.1  mrg   for (; num_up; num_up--)
    209  1.1  mrg     {
    210  1.1  mrg       const char dir_up[3] = { '.', '.', DIR_SEPARATOR };
    211  1.1  mrg       memcpy (p, dir_up, 3);
    212  1.1  mrg       p += 3;
    213  1.1  mrg     }
    214  1.1  mrg   memcpy (p, d, len + 1);
    215  1.1  mrg   return ret;
    216  1.1  mrg }
    217  1.1  mrg 
    218  1.1  mrg /* Look up DATA_WD in hash table of relative prefixes.  If found,
    219  1.1  mrg    return relative path from CWD to DATA_WD from the hash table,
    220  1.1  mrg    otherwise create it.  */
    221  1.1  mrg 
    222  1.1  mrg static const char *
    223  1.1  mrg canon_relative_path_prefix (const char *data_wd, const char *cwd)
    224  1.1  mrg {
    225  1.1  mrg   if (!IS_ABSOLUTE_PATH (data_wd) || !IS_ABSOLUTE_PATH (cwd))
    226  1.1  mrg     return NULL;
    227  1.1  mrg 
    228  1.1  mrg   if (!path_name_pair_hash_table)
    229  1.1  mrg     {
    230  1.1  mrg       path_name_pair_hash_table
    231  1.1  mrg 	= new hash_table<string_pair_map_hasher> (37);
    232  1.1  mrg       string_pair_map_allocator
    233  1.1  mrg 	= new object_allocator <struct string_pair_map>
    234  1.1  mrg 		("line map string pair map hash");
    235  1.1  mrg     }
    236  1.1  mrg 
    237  1.1  mrg   inchash::hash h;
    238  1.1  mrg   h.add_ptr (cwd);
    239  1.1  mrg   h.merge_hash (htab_hash_string (data_wd));
    240  1.1  mrg   h.add_int (true);
    241  1.1  mrg 
    242  1.1  mrg   string_pair_map s_slot;
    243  1.1  mrg   s_slot.str1 = cwd;
    244  1.1  mrg   s_slot.str2 = data_wd;
    245  1.1  mrg   s_slot.str3 = NULL;
    246  1.1  mrg   s_slot.hash = h.end ();
    247  1.1  mrg   s_slot.prefix = true;
    248  1.1  mrg 
    249  1.1  mrg   string_pair_map **slot
    250  1.1  mrg     = path_name_pair_hash_table->find_slot (&s_slot, INSERT);
    251  1.1  mrg   if (*slot == NULL)
    252  1.1  mrg     {
    253  1.1  mrg       /* Compute relative path from cwd directory to data_wd directory.
    254  1.1  mrg 	 E.g. if cwd is /tmp/foo/bar and data_wd is /tmp/baz/qux ,
    255  1.1  mrg 	 it will return ../../baz/qux .  */
    256  1.1  mrg       char *relative_path = relative_path_prefix (data_wd, cwd);
    257  1.1  mrg       const char *relative = relative_path ? relative_path : data_wd;
    258  1.1  mrg       size_t relative_len = strlen (relative);
    259  1.1  mrg       gcc_assert (relative_len);
    260  1.1  mrg 
    261  1.1  mrg       size_t data_wd_len = strlen (data_wd);
    262  1.1  mrg       bool add_separator = false;
    263  1.1  mrg       if (!IS_DIR_SEPARATOR (relative[relative_len - 1]))
    264  1.1  mrg 	add_separator = true;
    265  1.1  mrg 
    266  1.1  mrg       size_t len = relative_len + 1 + data_wd_len + 1 + add_separator;
    267  1.1  mrg 
    268  1.1  mrg       char *saved_string = XOBNEWVEC (&file_name_obstack, char, len);
    269  1.1  mrg       struct string_pair_map *new_slot
    270  1.1  mrg 	= string_pair_map_allocator->allocate ();
    271  1.1  mrg       memcpy (saved_string, data_wd, data_wd_len + 1);
    272  1.1  mrg       memcpy (saved_string + data_wd_len + 1, relative, relative_len);
    273  1.1  mrg       if (add_separator)
    274  1.1  mrg 	saved_string[len - 2] = DIR_SEPARATOR;
    275  1.1  mrg       saved_string[len - 1] = '\0';
    276  1.1  mrg       new_slot->str1 = cwd;
    277  1.1  mrg       new_slot->str2 = saved_string;
    278  1.1  mrg       new_slot->str3 = saved_string + data_wd_len + 1;
    279  1.1  mrg       if (relative_len == 1 && relative[0] == '.')
    280  1.1  mrg 	new_slot->str3 = NULL;
    281  1.1  mrg       new_slot->hash = s_slot.hash;
    282  1.1  mrg       new_slot->prefix = true;
    283  1.1  mrg       *slot = new_slot;
    284  1.1  mrg       free (relative_path);
    285  1.1  mrg       return new_slot->str3;
    286  1.1  mrg     }
    287  1.1  mrg   else
    288  1.1  mrg     {
    289  1.1  mrg       string_pair_map *old_slot = *slot;
    290  1.1  mrg       return old_slot->str3;
    291  1.1  mrg     }
    292  1.1  mrg }
    293  1.1  mrg 
    294  1.1  mrg /* Look up the pair of RELATIVE_PREFIX and STRING strings in a hash table.
    295  1.1  mrg    If found, return the concatenation of those from the hash table,
    296  1.1  mrg    otherwise concatenate them.  */
    297  1.1  mrg 
    298  1.1  mrg static const char *
    299  1.1  mrg canon_relative_file_name (const char *relative_prefix, const char *string)
    300  1.1  mrg {
    301  1.1  mrg   inchash::hash h;
    302  1.1  mrg   h.add_ptr (relative_prefix);
    303  1.1  mrg   h.merge_hash (htab_hash_string (string));
    304  1.1  mrg 
    305  1.1  mrg   string_pair_map s_slot;
    306  1.1  mrg   s_slot.str1 = relative_prefix;
    307  1.1  mrg   s_slot.str2 = string;
    308  1.1  mrg   s_slot.str3 = NULL;
    309  1.1  mrg   s_slot.hash = h.end ();
    310  1.1  mrg   s_slot.prefix = false;
    311  1.1  mrg 
    312  1.1  mrg   string_pair_map **slot
    313  1.1  mrg     = path_name_pair_hash_table->find_slot (&s_slot, INSERT);
    314  1.1  mrg   if (*slot == NULL)
    315  1.1  mrg     {
    316  1.1  mrg       size_t relative_prefix_len = strlen (relative_prefix);
    317  1.1  mrg       size_t string_len = strlen (string);
    318  1.1  mrg       size_t len = relative_prefix_len + string_len + 1;
    319  1.1  mrg 
    320  1.1  mrg       char *saved_string = XOBNEWVEC (&file_name_obstack, char, len);
    321  1.1  mrg       struct string_pair_map *new_slot
    322  1.1  mrg 	= string_pair_map_allocator->allocate ();
    323  1.1  mrg       memcpy (saved_string, relative_prefix, relative_prefix_len);
    324  1.1  mrg       memcpy (saved_string + relative_prefix_len, string, string_len + 1);
    325  1.1  mrg       new_slot->str1 = relative_prefix;
    326  1.1  mrg       new_slot->str2 = saved_string + relative_prefix_len;
    327  1.1  mrg       new_slot->str3 = saved_string;
    328  1.1  mrg       new_slot->hash = s_slot.hash;
    329  1.1  mrg       new_slot->prefix = false;
    330  1.1  mrg       *slot = new_slot;
    331  1.1  mrg       return new_slot->str3;
    332  1.1  mrg     }
    333  1.1  mrg   else
    334  1.1  mrg     {
    335  1.1  mrg       string_pair_map *old_slot = *slot;
    336  1.1  mrg       return old_slot->str3;
    337  1.1  mrg     }
    338  1.1  mrg }
    339  1.1  mrg 
    340  1.1  mrg /* Lookup STRING in file_name_hash_table.  If found, return the existing
    341  1.1  mrg    string, otherwise insert STRING as the canonical version.
    342  1.1  mrg    If STRING is a relative pathname and RELATIVE_PREFIX is non-NULL, use
    343  1.1  mrg    canon_relative_file_name instead.  */
    344  1.1  mrg 
    345  1.1  mrg static const char *
    346  1.1  mrg canon_file_name (const char *relative_prefix, const char *string)
    347  1.1  mrg {
    348  1.1  mrg   if (relative_prefix && !IS_ABSOLUTE_PATH (string))
    349  1.1  mrg     return canon_relative_file_name (relative_prefix, string);
    350  1.1  mrg 
    351  1.1  mrg   string_slot **slot;
    352  1.1  mrg   struct string_slot s_slot;
    353  1.1  mrg   size_t len = strlen (string);
    354  1.1  mrg 
    355  1.1  mrg   s_slot.s = string;
    356  1.1  mrg   s_slot.len = len;
    357  1.1  mrg 
    358  1.1  mrg   slot = file_name_hash_table->find_slot (&s_slot, INSERT);
    359  1.1  mrg   if (*slot == NULL)
    360  1.1  mrg     {
    361  1.1  mrg       char *saved_string;
    362  1.1  mrg       struct string_slot *new_slot;
    363  1.1  mrg 
    364  1.1  mrg       saved_string = XOBNEWVEC (&file_name_obstack, char, len + 1);
    365  1.1  mrg       new_slot = string_slot_allocator->allocate ();
    366  1.1  mrg       memcpy (saved_string, string, len + 1);
    367  1.1  mrg       new_slot->s = saved_string;
    368  1.1  mrg       new_slot->len = len;
    369  1.1  mrg       *slot = new_slot;
    370  1.1  mrg       return saved_string;
    371  1.1  mrg     }
    372  1.1  mrg   else
    373  1.1  mrg     {
    374  1.1  mrg       struct string_slot *old_slot = *slot;
    375  1.1  mrg       return old_slot->s;
    376  1.1  mrg     }
    377  1.1  mrg }
    378  1.1  mrg 
    379  1.1  mrg /* Pointer to currently alive instance of lto_location_cache.  */
    380  1.1  mrg 
    381  1.1  mrg lto_location_cache *lto_location_cache::current_cache;
    382  1.1  mrg 
    383  1.1  mrg /* Sort locations in source order. Start with file from last application.  */
    384  1.1  mrg 
    385  1.1  mrg int
    386  1.1  mrg lto_location_cache::cmp_loc (const void *pa, const void *pb)
    387  1.1  mrg {
    388  1.1  mrg   const cached_location *a = ((const cached_location *)pa);
    389  1.1  mrg   const cached_location *b = ((const cached_location *)pb);
    390  1.1  mrg   const char *current_file = current_cache->current_file;
    391  1.1  mrg   int current_line = current_cache->current_line;
    392  1.1  mrg 
    393  1.1  mrg   if (a->file == current_file && b->file != current_file)
    394  1.1  mrg     return -1;
    395  1.1  mrg   if (a->file != current_file && b->file == current_file)
    396  1.1  mrg     return 1;
    397  1.1  mrg   if (a->file == current_file && b->file == current_file)
    398  1.1  mrg     {
    399  1.1  mrg       if (a->line == current_line && b->line != current_line)
    400  1.1  mrg 	return -1;
    401  1.1  mrg       if (a->line != current_line && b->line == current_line)
    402  1.1  mrg 	return 1;
    403  1.1  mrg     }
    404  1.1  mrg   if (a->file != b->file)
    405  1.1  mrg     return strcmp (a->file, b->file);
    406  1.1  mrg   if (a->sysp != b->sysp)
    407  1.1  mrg     return a->sysp ? 1 : -1;
    408  1.1  mrg   if (a->line != b->line)
    409  1.1  mrg     return a->line - b->line;
    410  1.1  mrg   if (a->col != b->col)
    411  1.1  mrg     return a->col - b->col;
    412  1.1  mrg   if ((a->block == NULL_TREE) != (b->block == NULL_TREE))
    413  1.1  mrg     return a->block ? 1 : -1;
    414  1.1  mrg   if (a->block)
    415  1.1  mrg     {
    416  1.1  mrg       if (BLOCK_NUMBER (a->block) < BLOCK_NUMBER (b->block))
    417  1.1  mrg 	return -1;
    418  1.1  mrg       if (BLOCK_NUMBER (a->block) > BLOCK_NUMBER (b->block))
    419  1.1  mrg 	return 1;
    420  1.1  mrg     }
    421  1.1  mrg   return 0;
    422  1.1  mrg }
    423  1.1  mrg 
    424  1.1  mrg /* Apply all changes in location cache.  Add locations into linemap and patch
    425  1.1  mrg    trees.  */
    426  1.1  mrg 
    427  1.1  mrg bool
    428  1.1  mrg lto_location_cache::apply_location_cache ()
    429  1.1  mrg {
    430  1.1  mrg   static const char *prev_file;
    431  1.1  mrg   if (!loc_cache.length ())
    432  1.1  mrg     return false;
    433  1.1  mrg   if (loc_cache.length () > 1)
    434  1.1  mrg     loc_cache.qsort (cmp_loc);
    435  1.1  mrg 
    436  1.1  mrg   for (unsigned int i = 0; i < loc_cache.length (); i++)
    437  1.1  mrg     {
    438  1.1  mrg       struct cached_location loc = loc_cache[i];
    439  1.1  mrg 
    440  1.1  mrg       if (current_file != loc.file)
    441  1.1  mrg 	linemap_add (line_table, prev_file ? LC_RENAME : LC_ENTER,
    442  1.1  mrg 		     loc.sysp, loc.file, loc.line);
    443  1.1  mrg       else if (current_line != loc.line)
    444  1.1  mrg 	{
    445  1.1  mrg 	  int max = loc.col;
    446  1.1  mrg 
    447  1.1  mrg 	  for (unsigned int j = i + 1; j < loc_cache.length (); j++)
    448  1.1  mrg 	    if (loc.file != loc_cache[j].file
    449  1.1  mrg 		|| loc.line != loc_cache[j].line)
    450  1.1  mrg 	      break;
    451  1.1  mrg 	    else if (max < loc_cache[j].col)
    452  1.1  mrg 	      max = loc_cache[j].col;
    453  1.1  mrg 	  linemap_line_start (line_table, loc.line, max + 1);
    454  1.1  mrg 	}
    455  1.1  mrg       gcc_assert (*loc.loc == BUILTINS_LOCATION + 1);
    456  1.1  mrg       if (current_file != loc.file
    457  1.1  mrg 	  || current_line != loc.line
    458  1.1  mrg 	  || current_col != loc.col)
    459  1.1  mrg 	{
    460  1.1  mrg 	  current_loc = linemap_position_for_column (line_table, loc.col);
    461  1.1  mrg 	  if (loc.block)
    462  1.1  mrg 	    current_loc = set_block (current_loc, loc.block);
    463  1.1  mrg 	}
    464  1.1  mrg       else if (current_block != loc.block)
    465  1.1  mrg 	{
    466  1.1  mrg 	  if (loc.block)
    467  1.1  mrg 	    current_loc = set_block (current_loc, loc.block);
    468  1.1  mrg 	  else
    469  1.1  mrg 	    current_loc = LOCATION_LOCUS (current_loc);
    470  1.1  mrg 	}
    471  1.1  mrg       *loc.loc = current_loc;
    472  1.1  mrg       current_line = loc.line;
    473  1.1  mrg       prev_file = current_file = loc.file;
    474  1.1  mrg       current_col = loc.col;
    475  1.1  mrg       current_block = loc.block;
    476  1.1  mrg     }
    477  1.1  mrg   loc_cache.truncate (0);
    478  1.1  mrg   accepted_length = 0;
    479  1.1  mrg   return true;
    480  1.1  mrg }
    481  1.1  mrg 
    482  1.1  mrg /* Tree merging did not succeed; mark all changes in the cache as accepted.  */
    483  1.1  mrg 
    484  1.1  mrg void
    485  1.1  mrg lto_location_cache::accept_location_cache ()
    486  1.1  mrg {
    487  1.1  mrg   gcc_assert (current_cache == this);
    488  1.1  mrg   accepted_length = loc_cache.length ();
    489  1.1  mrg }
    490  1.1  mrg 
    491  1.1  mrg /* Tree merging did succeed; throw away recent changes.  */
    492  1.1  mrg 
    493  1.1  mrg void
    494  1.1  mrg lto_location_cache::revert_location_cache ()
    495  1.1  mrg {
    496  1.1  mrg   loc_cache.truncate (accepted_length);
    497  1.1  mrg }
    498  1.1  mrg 
    499  1.1  mrg /* Read a location bitpack from bit pack BP and either update *LOC directly
    500  1.1  mrg    or add it to the location cache.  If IB is non-NULL, stream in a block
    501  1.1  mrg    afterwards.
    502  1.1  mrg    It is neccesary to call apply_location_cache to get *LOC updated.  */
    503  1.1  mrg 
    504  1.1  mrg void
    505  1.1  mrg lto_location_cache::input_location_and_block (location_t *loc,
    506  1.1  mrg 					      struct bitpack_d *bp,
    507  1.1  mrg 					      class lto_input_block *ib,
    508  1.1  mrg 					      class data_in *data_in)
    509  1.1  mrg {
    510  1.1  mrg   static const char *stream_file;
    511  1.1  mrg   static int stream_line;
    512  1.1  mrg   static int stream_col;
    513  1.1  mrg   static bool stream_sysp;
    514  1.1  mrg   static tree stream_block;
    515  1.1  mrg   static const char *stream_relative_path_prefix;
    516  1.1  mrg 
    517  1.1  mrg   gcc_assert (current_cache == this);
    518  1.1  mrg 
    519  1.1  mrg   *loc = bp_unpack_int_in_range (bp, "location", 0,
    520  1.1  mrg 				 RESERVED_LOCATION_COUNT + 1);
    521  1.1  mrg 
    522  1.1  mrg   if (*loc < RESERVED_LOCATION_COUNT)
    523  1.1  mrg     {
    524  1.1  mrg       if (ib)
    525  1.1  mrg 	{
    526  1.1  mrg 	  bool block_change = bp_unpack_value (bp, 1);
    527  1.1  mrg 	  if (block_change)
    528  1.1  mrg 	    stream_block = stream_read_tree (ib, data_in);
    529  1.1  mrg 	  if (stream_block)
    530  1.1  mrg 	    *loc = set_block (*loc, stream_block);
    531  1.1  mrg 	}
    532  1.1  mrg       return;
    533  1.1  mrg     }
    534  1.1  mrg 
    535  1.1  mrg   bool file_change = (*loc == RESERVED_LOCATION_COUNT + 1);
    536  1.1  mrg   /* Keep value RESERVED_LOCATION_COUNT in *loc as linemap lookups will
    537  1.1  mrg      ICE on it.  */
    538  1.1  mrg   *loc = RESERVED_LOCATION_COUNT;
    539  1.1  mrg   bool line_change = bp_unpack_value (bp, 1);
    540  1.1  mrg   bool column_change = bp_unpack_value (bp, 1);
    541  1.1  mrg 
    542  1.1  mrg   if (file_change)
    543  1.1  mrg     {
    544  1.1  mrg       bool pwd_change = bp_unpack_value (bp, 1);
    545  1.1  mrg       if (pwd_change)
    546  1.1  mrg 	{
    547  1.1  mrg 	  const char *pwd = bp_unpack_string (data_in, bp);
    548  1.1  mrg 	  const char *src_pwd = get_src_pwd ();
    549  1.1  mrg 	  if (strcmp (pwd, src_pwd) == 0)
    550  1.1  mrg 	    stream_relative_path_prefix = NULL;
    551  1.1  mrg 	  else
    552  1.1  mrg 	    stream_relative_path_prefix
    553  1.1  mrg 	      = canon_relative_path_prefix (pwd, src_pwd);
    554  1.1  mrg 	}
    555  1.1  mrg       stream_file = canon_file_name (stream_relative_path_prefix,
    556  1.1  mrg 				     bp_unpack_string (data_in, bp));
    557  1.1  mrg       stream_sysp = bp_unpack_value (bp, 1);
    558  1.1  mrg     }
    559  1.1  mrg 
    560  1.1  mrg   if (line_change)
    561  1.1  mrg     stream_line = bp_unpack_var_len_unsigned (bp);
    562  1.1  mrg 
    563  1.1  mrg   if (column_change)
    564  1.1  mrg     stream_col = bp_unpack_var_len_unsigned (bp);
    565  1.1  mrg 
    566  1.1  mrg   tree block = NULL_TREE;
    567  1.1  mrg   if (ib)
    568  1.1  mrg     {
    569  1.1  mrg       bool block_change = bp_unpack_value (bp, 1);
    570  1.1  mrg       if (block_change)
    571  1.1  mrg 	stream_block = stream_read_tree (ib, data_in);
    572  1.1  mrg       block = stream_block;
    573  1.1  mrg     }
    574  1.1  mrg 
    575  1.1  mrg   /* This optimization saves location cache operations during gimple
    576  1.1  mrg      streaming.  */
    577  1.1  mrg 
    578  1.1  mrg   if (current_file == stream_file
    579  1.1  mrg       && current_line == stream_line
    580  1.1  mrg       && current_col == stream_col
    581  1.1  mrg       && current_sysp == stream_sysp)
    582  1.1  mrg     {
    583  1.1  mrg       if (current_block == block)
    584  1.1  mrg 	*loc = current_loc;
    585  1.1  mrg       else if (block)
    586  1.1  mrg 	*loc = set_block (current_loc, block);
    587  1.1  mrg       else
    588  1.1  mrg 	*loc = LOCATION_LOCUS (current_loc);
    589  1.1  mrg       return;
    590  1.1  mrg     }
    591  1.1  mrg 
    592  1.1  mrg   struct cached_location entry
    593  1.1  mrg     = {stream_file, loc, stream_line, stream_col, stream_sysp, block};
    594  1.1  mrg   loc_cache.safe_push (entry);
    595  1.1  mrg }
    596  1.1  mrg 
    597  1.1  mrg /* Read a location bitpack from bit pack BP and either update *LOC directly
    598  1.1  mrg    or add it to the location cache.
    599  1.1  mrg    It is neccesary to call apply_location_cache to get *LOC updated.  */
    600  1.1  mrg 
    601  1.1  mrg void
    602  1.1  mrg lto_location_cache::input_location (location_t *loc, struct bitpack_d *bp,
    603  1.1  mrg 				    class data_in *data_in)
    604  1.1  mrg {
    605  1.1  mrg   return input_location_and_block (loc, bp, NULL, data_in);
    606  1.1  mrg }
    607  1.1  mrg 
    608  1.1  mrg /* Read a location bitpack from input block IB and either update *LOC directly
    609  1.1  mrg    or add it to the location cache.
    610  1.1  mrg    It is neccesary to call apply_location_cache to get *LOC updated.  */
    611  1.1  mrg 
    612  1.1  mrg void
    613  1.1  mrg lto_input_location (location_t *loc, struct bitpack_d *bp,
    614  1.1  mrg 		    class data_in *data_in)
    615  1.1  mrg {
    616  1.1  mrg   data_in->location_cache.input_location (loc, bp, data_in);
    617  1.1  mrg }
    618  1.1  mrg 
    619  1.1  mrg /* Read a reference to a tree node from DATA_IN using input block IB.
    620  1.1  mrg    TAG is the expected node that should be found in IB, if TAG belongs
    621  1.1  mrg    to one of the indexable trees, expect to read a reference index to
    622  1.1  mrg    be looked up in one of the symbol tables, otherwise read the pysical
    623  1.1  mrg    representation of the tree using stream_read_tree.  FN is the
    624  1.1  mrg    function scope for the read tree.  */
    625  1.1  mrg 
    626  1.1  mrg tree
    627  1.1  mrg lto_input_tree_ref (class lto_input_block *ib, class data_in *data_in,
    628  1.1  mrg 		    struct function *fn, enum LTO_tags tag)
    629  1.1  mrg {
    630  1.1  mrg   unsigned HOST_WIDE_INT ix_u;
    631  1.1  mrg   tree result = NULL_TREE;
    632  1.1  mrg 
    633  1.1  mrg   if (tag == LTO_ssa_name_ref)
    634  1.1  mrg     {
    635  1.1  mrg       ix_u = streamer_read_uhwi (ib);
    636  1.1  mrg       result = (*SSANAMES (fn))[ix_u];
    637  1.1  mrg     }
    638  1.1  mrg   else
    639  1.1  mrg     {
    640  1.1  mrg       gcc_checking_assert (tag == LTO_global_stream_ref);
    641  1.1  mrg       ix_u = streamer_read_uhwi (ib);
    642  1.1  mrg       result = (*data_in->file_data->current_decl_state
    643  1.1  mrg 		->streams[LTO_DECL_STREAM])[ix_u];
    644  1.1  mrg     }
    645  1.1  mrg 
    646  1.1  mrg   gcc_assert (result);
    647  1.1  mrg 
    648  1.1  mrg   return result;
    649  1.1  mrg }
    650  1.1  mrg 
    651  1.1  mrg /* Read VAR_DECL reference to DATA from IB.  */
    652  1.1  mrg 
    653  1.1  mrg tree
    654  1.1  mrg lto_input_var_decl_ref (lto_input_block *ib, lto_file_decl_data *file_data)
    655  1.1  mrg {
    656  1.1  mrg   unsigned int ix_u = streamer_read_uhwi (ib);
    657  1.1  mrg   tree result = (*file_data->current_decl_state
    658  1.1  mrg 		 ->streams[LTO_DECL_STREAM])[ix_u];
    659  1.1  mrg   gcc_assert (TREE_CODE (result) == VAR_DECL);
    660  1.1  mrg   return result;
    661  1.1  mrg }
    662  1.1  mrg 
    663  1.1  mrg /* Read VAR_DECL reference to DATA from IB.  */
    664  1.1  mrg 
    665  1.1  mrg tree
    666  1.1  mrg lto_input_fn_decl_ref (lto_input_block *ib, lto_file_decl_data *file_data)
    667  1.1  mrg {
    668  1.1  mrg   unsigned int ix_u = streamer_read_uhwi (ib);
    669  1.1  mrg   tree result = (*file_data->current_decl_state
    670  1.1  mrg 		 ->streams[LTO_DECL_STREAM])[ix_u];
    671  1.1  mrg   gcc_assert (TREE_CODE (result) == FUNCTION_DECL);
    672  1.1  mrg   return result;
    673  1.1  mrg }
    674  1.1  mrg 
    675  1.1  mrg 
    676  1.1  mrg /* Read and return a double-linked list of catch handlers from input
    677  1.1  mrg    block IB, using descriptors in DATA_IN.  */
    678  1.1  mrg 
    679  1.1  mrg static struct eh_catch_d *
    680  1.1  mrg lto_input_eh_catch_list (class lto_input_block *ib, class data_in *data_in,
    681  1.1  mrg 			 eh_catch *last_p)
    682  1.1  mrg {
    683  1.1  mrg   eh_catch first;
    684  1.1  mrg   enum LTO_tags tag;
    685  1.1  mrg 
    686  1.1  mrg   *last_p = first = NULL;
    687  1.1  mrg   tag = streamer_read_record_start (ib);
    688  1.1  mrg   while (tag)
    689  1.1  mrg     {
    690  1.1  mrg       tree list;
    691  1.1  mrg       eh_catch n;
    692  1.1  mrg 
    693  1.1  mrg       lto_tag_check_range (tag, LTO_eh_catch, LTO_eh_catch);
    694  1.1  mrg 
    695  1.1  mrg       /* Read the catch node.  */
    696  1.1  mrg       n = ggc_cleared_alloc<eh_catch_d> ();
    697  1.1  mrg       n->type_list = stream_read_tree (ib, data_in);
    698  1.1  mrg       n->filter_list = stream_read_tree (ib, data_in);
    699  1.1  mrg       n->label = stream_read_tree (ib, data_in);
    700  1.1  mrg 
    701  1.1  mrg       /* Register all the types in N->FILTER_LIST.  */
    702  1.1  mrg       for (list = n->filter_list; list; list = TREE_CHAIN (list))
    703  1.1  mrg 	add_type_for_runtime (TREE_VALUE (list));
    704  1.1  mrg 
    705  1.1  mrg       /* Chain N to the end of the list.  */
    706  1.1  mrg       if (*last_p)
    707  1.1  mrg 	(*last_p)->next_catch = n;
    708  1.1  mrg       n->prev_catch = *last_p;
    709  1.1  mrg       *last_p = n;
    710  1.1  mrg 
    711  1.1  mrg       /* Set the head of the list the first time through the loop.  */
    712  1.1  mrg       if (first == NULL)
    713  1.1  mrg 	first = n;
    714  1.1  mrg 
    715  1.1  mrg       tag = streamer_read_record_start (ib);
    716  1.1  mrg     }
    717  1.1  mrg 
    718  1.1  mrg   return first;
    719  1.1  mrg }
    720  1.1  mrg 
    721  1.1  mrg 
    722  1.1  mrg /* Read and return EH region IX from input block IB, using descriptors
    723  1.1  mrg    in DATA_IN.  */
    724  1.1  mrg 
    725  1.1  mrg static eh_region
    726  1.1  mrg input_eh_region (class lto_input_block *ib, class data_in *data_in, int ix)
    727  1.1  mrg {
    728  1.1  mrg   enum LTO_tags tag;
    729  1.1  mrg   eh_region r;
    730  1.1  mrg 
    731  1.1  mrg   /* Read the region header.  */
    732  1.1  mrg   tag = streamer_read_record_start (ib);
    733  1.1  mrg   if (tag == LTO_null)
    734  1.1  mrg     return NULL;
    735  1.1  mrg 
    736  1.1  mrg   r = ggc_cleared_alloc<eh_region_d> ();
    737  1.1  mrg   r->index = streamer_read_hwi (ib);
    738  1.1  mrg 
    739  1.1  mrg   gcc_assert (r->index == ix);
    740  1.1  mrg 
    741  1.1  mrg   /* Read all the region pointers as region numbers.  We'll fix up
    742  1.1  mrg      the pointers once the whole array has been read.  */
    743  1.1  mrg   r->outer = (eh_region) (intptr_t) streamer_read_hwi (ib);
    744  1.1  mrg   r->inner = (eh_region) (intptr_t) streamer_read_hwi (ib);
    745  1.1  mrg   r->next_peer = (eh_region) (intptr_t) streamer_read_hwi (ib);
    746  1.1  mrg 
    747  1.1  mrg   switch (tag)
    748  1.1  mrg     {
    749  1.1  mrg       case LTO_ert_cleanup:
    750  1.1  mrg 	r->type = ERT_CLEANUP;
    751  1.1  mrg 	break;
    752  1.1  mrg 
    753  1.1  mrg       case LTO_ert_try:
    754  1.1  mrg 	{
    755  1.1  mrg 	  struct eh_catch_d *last_catch;
    756  1.1  mrg 	  r->type = ERT_TRY;
    757  1.1  mrg 	  r->u.eh_try.first_catch = lto_input_eh_catch_list (ib, data_in,
    758  1.1  mrg 							     &last_catch);
    759  1.1  mrg 	  r->u.eh_try.last_catch = last_catch;
    760  1.1  mrg 	  break;
    761  1.1  mrg 	}
    762  1.1  mrg 
    763  1.1  mrg       case LTO_ert_allowed_exceptions:
    764  1.1  mrg 	{
    765  1.1  mrg 	  tree l;
    766  1.1  mrg 
    767  1.1  mrg 	  r->type = ERT_ALLOWED_EXCEPTIONS;
    768  1.1  mrg 	  r->u.allowed.type_list = stream_read_tree (ib, data_in);
    769  1.1  mrg 	  r->u.allowed.label = stream_read_tree (ib, data_in);
    770  1.1  mrg 	  r->u.allowed.filter = streamer_read_uhwi (ib);
    771  1.1  mrg 
    772  1.1  mrg 	  for (l = r->u.allowed.type_list; l ; l = TREE_CHAIN (l))
    773  1.1  mrg 	    add_type_for_runtime (TREE_VALUE (l));
    774  1.1  mrg 	}
    775  1.1  mrg 	break;
    776  1.1  mrg 
    777  1.1  mrg       case LTO_ert_must_not_throw:
    778  1.1  mrg 	{
    779  1.1  mrg 	  r->type = ERT_MUST_NOT_THROW;
    780  1.1  mrg 	  r->u.must_not_throw.failure_decl = stream_read_tree (ib, data_in);
    781  1.1  mrg 	  bitpack_d bp = streamer_read_bitpack (ib);
    782  1.1  mrg 	  stream_input_location (&r->u.must_not_throw.failure_loc,
    783  1.1  mrg 	  			 &bp, data_in);
    784  1.1  mrg 	}
    785  1.1  mrg 	break;
    786  1.1  mrg 
    787  1.1  mrg       default:
    788  1.1  mrg 	gcc_unreachable ();
    789  1.1  mrg     }
    790  1.1  mrg 
    791  1.1  mrg   r->landing_pads = (eh_landing_pad) (intptr_t) streamer_read_hwi (ib);
    792  1.1  mrg 
    793  1.1  mrg   return r;
    794  1.1  mrg }
    795  1.1  mrg 
    796  1.1  mrg 
    797  1.1  mrg /* Read and return EH landing pad IX from input block IB, using descriptors
    798  1.1  mrg    in DATA_IN.  */
    799  1.1  mrg 
    800  1.1  mrg static eh_landing_pad
    801  1.1  mrg input_eh_lp (class lto_input_block *ib, class data_in *data_in, int ix)
    802  1.1  mrg {
    803  1.1  mrg   enum LTO_tags tag;
    804  1.1  mrg   eh_landing_pad lp;
    805  1.1  mrg 
    806  1.1  mrg   /* Read the landing pad header.  */
    807  1.1  mrg   tag = streamer_read_record_start (ib);
    808  1.1  mrg   if (tag == LTO_null)
    809  1.1  mrg     return NULL;
    810  1.1  mrg 
    811  1.1  mrg   lto_tag_check_range (tag, LTO_eh_landing_pad, LTO_eh_landing_pad);
    812  1.1  mrg 
    813  1.1  mrg   lp = ggc_cleared_alloc<eh_landing_pad_d> ();
    814  1.1  mrg   lp->index = streamer_read_hwi (ib);
    815  1.1  mrg   gcc_assert (lp->index == ix);
    816  1.1  mrg   lp->next_lp = (eh_landing_pad) (intptr_t) streamer_read_hwi (ib);
    817  1.1  mrg   lp->region = (eh_region) (intptr_t) streamer_read_hwi (ib);
    818  1.1  mrg   lp->post_landing_pad = stream_read_tree (ib, data_in);
    819  1.1  mrg 
    820  1.1  mrg   return lp;
    821  1.1  mrg }
    822  1.1  mrg 
    823  1.1  mrg 
    824  1.1  mrg /* After reading the EH regions, pointers to peer and children regions
    825  1.1  mrg    are region numbers.  This converts all these region numbers into
    826  1.1  mrg    real pointers into the rematerialized regions for FN.  ROOT_REGION
    827  1.1  mrg    is the region number for the root EH region in FN.  */
    828  1.1  mrg 
    829  1.1  mrg static void
    830  1.1  mrg fixup_eh_region_pointers (struct function *fn, HOST_WIDE_INT root_region)
    831  1.1  mrg {
    832  1.1  mrg   unsigned i;
    833  1.1  mrg   vec<eh_region, va_gc> *eh_array = fn->eh->region_array;
    834  1.1  mrg   vec<eh_landing_pad, va_gc> *lp_array = fn->eh->lp_array;
    835  1.1  mrg   eh_region r;
    836  1.1  mrg   eh_landing_pad lp;
    837  1.1  mrg 
    838  1.1  mrg   gcc_assert (eh_array && lp_array);
    839  1.1  mrg 
    840  1.1  mrg   gcc_assert (root_region >= 0);
    841  1.1  mrg   fn->eh->region_tree = (*eh_array)[root_region];
    842  1.1  mrg 
    843  1.1  mrg #define FIXUP_EH_REGION(r) (r) = (*eh_array)[(HOST_WIDE_INT) (intptr_t) (r)]
    844  1.1  mrg #define FIXUP_EH_LP(p) (p) = (*lp_array)[(HOST_WIDE_INT) (intptr_t) (p)]
    845  1.1  mrg 
    846  1.1  mrg   /* Convert all the index numbers stored in pointer fields into
    847  1.1  mrg      pointers to the corresponding slots in the EH region array.  */
    848  1.1  mrg   FOR_EACH_VEC_ELT (*eh_array, i, r)
    849  1.1  mrg     {
    850  1.1  mrg       /* The array may contain NULL regions.  */
    851  1.1  mrg       if (r == NULL)
    852  1.1  mrg 	continue;
    853  1.1  mrg 
    854  1.1  mrg       gcc_assert (i == (unsigned) r->index);
    855  1.1  mrg       FIXUP_EH_REGION (r->outer);
    856  1.1  mrg       FIXUP_EH_REGION (r->inner);
    857  1.1  mrg       FIXUP_EH_REGION (r->next_peer);
    858  1.1  mrg       FIXUP_EH_LP (r->landing_pads);
    859  1.1  mrg     }
    860  1.1  mrg 
    861  1.1  mrg   /* Convert all the index numbers stored in pointer fields into
    862  1.1  mrg      pointers to the corresponding slots in the EH landing pad array.  */
    863  1.1  mrg   FOR_EACH_VEC_ELT (*lp_array, i, lp)
    864  1.1  mrg     {
    865  1.1  mrg       /* The array may contain NULL landing pads.  */
    866  1.1  mrg       if (lp == NULL)
    867  1.1  mrg 	continue;
    868  1.1  mrg 
    869  1.1  mrg       gcc_assert (i == (unsigned) lp->index);
    870  1.1  mrg       FIXUP_EH_LP (lp->next_lp);
    871  1.1  mrg       FIXUP_EH_REGION (lp->region);
    872  1.1  mrg     }
    873  1.1  mrg 
    874  1.1  mrg #undef FIXUP_EH_REGION
    875  1.1  mrg #undef FIXUP_EH_LP
    876  1.1  mrg }
    877  1.1  mrg 
    878  1.1  mrg 
    879  1.1  mrg /* Initialize EH support.  */
    880  1.1  mrg 
    881  1.1  mrg void
    882  1.1  mrg lto_init_eh (void)
    883  1.1  mrg {
    884  1.1  mrg   static bool eh_initialized_p = false;
    885  1.1  mrg 
    886  1.1  mrg   if (eh_initialized_p)
    887  1.1  mrg     return;
    888  1.1  mrg 
    889  1.1  mrg   /* Contrary to most other FEs, we only initialize EH support when at
    890  1.1  mrg      least one of the files in the set contains exception regions in
    891  1.1  mrg      it.  Since this happens much later than the call to init_eh in
    892  1.1  mrg      lang_dependent_init, we have to set flag_exceptions and call
    893  1.1  mrg      init_eh again to initialize the EH tables.  */
    894  1.1  mrg   flag_exceptions = 1;
    895  1.1  mrg   init_eh ();
    896  1.1  mrg 
    897  1.1  mrg   eh_initialized_p = true;
    898  1.1  mrg }
    899  1.1  mrg 
    900  1.1  mrg 
    901  1.1  mrg /* Read the exception table for FN from IB using the data descriptors
    902  1.1  mrg    in DATA_IN.  */
    903  1.1  mrg 
    904  1.1  mrg static void
    905  1.1  mrg input_eh_regions (class lto_input_block *ib, class data_in *data_in,
    906  1.1  mrg 		  struct function *fn)
    907  1.1  mrg {
    908  1.1  mrg   HOST_WIDE_INT i, root_region, len;
    909  1.1  mrg   enum LTO_tags tag;
    910  1.1  mrg 
    911  1.1  mrg   tag = streamer_read_record_start (ib);
    912  1.1  mrg   if (tag == LTO_null)
    913  1.1  mrg     return;
    914  1.1  mrg 
    915  1.1  mrg   lto_tag_check_range (tag, LTO_eh_table, LTO_eh_table);
    916  1.1  mrg 
    917  1.1  mrg   gcc_assert (fn->eh);
    918  1.1  mrg 
    919  1.1  mrg   root_region = streamer_read_hwi (ib);
    920  1.1  mrg   gcc_assert (root_region == (int) root_region);
    921  1.1  mrg 
    922  1.1  mrg   /* Read the EH region array.  */
    923  1.1  mrg   len = streamer_read_hwi (ib);
    924  1.1  mrg   gcc_assert (len == (int) len);
    925  1.1  mrg   if (len > 0)
    926  1.1  mrg     {
    927  1.1  mrg       vec_safe_grow_cleared (fn->eh->region_array, len, true);
    928  1.1  mrg       for (i = 0; i < len; i++)
    929  1.1  mrg 	{
    930  1.1  mrg 	  eh_region r = input_eh_region (ib, data_in, i);
    931  1.1  mrg 	  (*fn->eh->region_array)[i] = r;
    932  1.1  mrg 	}
    933  1.1  mrg     }
    934  1.1  mrg 
    935  1.1  mrg   /* Read the landing pads.  */
    936  1.1  mrg   len = streamer_read_hwi (ib);
    937  1.1  mrg   gcc_assert (len == (int) len);
    938  1.1  mrg   if (len > 0)
    939  1.1  mrg     {
    940  1.1  mrg       vec_safe_grow_cleared (fn->eh->lp_array, len, true);
    941  1.1  mrg       for (i = 0; i < len; i++)
    942  1.1  mrg 	{
    943  1.1  mrg 	  eh_landing_pad lp = input_eh_lp (ib, data_in, i);
    944  1.1  mrg 	  (*fn->eh->lp_array)[i] = lp;
    945  1.1  mrg 	}
    946  1.1  mrg     }
    947  1.1  mrg 
    948  1.1  mrg   /* Read the runtime type data.  */
    949  1.1  mrg   len = streamer_read_hwi (ib);
    950  1.1  mrg   gcc_assert (len == (int) len);
    951  1.1  mrg   if (len > 0)
    952  1.1  mrg     {
    953  1.1  mrg       vec_safe_grow_cleared (fn->eh->ttype_data, len, true);
    954  1.1  mrg       for (i = 0; i < len; i++)
    955  1.1  mrg 	{
    956  1.1  mrg 	  tree ttype = stream_read_tree (ib, data_in);
    957  1.1  mrg 	  (*fn->eh->ttype_data)[i] = ttype;
    958  1.1  mrg 	}
    959  1.1  mrg     }
    960  1.1  mrg 
    961  1.1  mrg   /* Read the table of action chains.  */
    962  1.1  mrg   len = streamer_read_hwi (ib);
    963  1.1  mrg   gcc_assert (len == (int) len);
    964  1.1  mrg   if (len > 0)
    965  1.1  mrg     {
    966  1.1  mrg       if (targetm.arm_eabi_unwinder)
    967  1.1  mrg 	{
    968  1.1  mrg 	  vec_safe_grow_cleared (fn->eh->ehspec_data.arm_eabi, len, true);
    969  1.1  mrg 	  for (i = 0; i < len; i++)
    970  1.1  mrg 	    {
    971  1.1  mrg 	      tree t = stream_read_tree (ib, data_in);
    972  1.1  mrg 	      (*fn->eh->ehspec_data.arm_eabi)[i] = t;
    973  1.1  mrg 	    }
    974  1.1  mrg 	}
    975  1.1  mrg       else
    976  1.1  mrg 	{
    977  1.1  mrg 	  vec_safe_grow_cleared (fn->eh->ehspec_data.other, len, true);
    978  1.1  mrg 	  for (i = 0; i < len; i++)
    979  1.1  mrg 	    {
    980  1.1  mrg 	      uchar c = streamer_read_uchar (ib);
    981  1.1  mrg 	      (*fn->eh->ehspec_data.other)[i] = c;
    982  1.1  mrg 	    }
    983  1.1  mrg 	}
    984  1.1  mrg     }
    985  1.1  mrg 
    986  1.1  mrg   /* Reconstruct the EH region tree by fixing up the peer/children
    987  1.1  mrg      pointers.  */
    988  1.1  mrg   fixup_eh_region_pointers (fn, root_region);
    989  1.1  mrg 
    990  1.1  mrg   tag = streamer_read_record_start (ib);
    991  1.1  mrg   lto_tag_check_range (tag, LTO_null, LTO_null);
    992  1.1  mrg }
    993  1.1  mrg 
    994  1.1  mrg 
    995  1.1  mrg /* Make a new basic block with index INDEX in function FN.  */
    996  1.1  mrg 
    997  1.1  mrg static basic_block
    998  1.1  mrg make_new_block (struct function *fn, unsigned int index)
    999  1.1  mrg {
   1000  1.1  mrg   basic_block bb = alloc_block ();
   1001  1.1  mrg   bb->index = index;
   1002  1.1  mrg   SET_BASIC_BLOCK_FOR_FN (fn, index, bb);
   1003  1.1  mrg   n_basic_blocks_for_fn (fn)++;
   1004  1.1  mrg   return bb;
   1005  1.1  mrg }
   1006  1.1  mrg 
   1007  1.1  mrg 
   1008  1.1  mrg /* Read the CFG for function FN from input block IB.  */
   1009  1.1  mrg 
   1010  1.1  mrg static void
   1011  1.1  mrg input_cfg (class lto_input_block *ib, class data_in *data_in,
   1012  1.1  mrg 	   struct function *fn)
   1013  1.1  mrg {
   1014  1.1  mrg   unsigned int bb_count;
   1015  1.1  mrg   basic_block p_bb;
   1016  1.1  mrg   unsigned int i;
   1017  1.1  mrg   int index;
   1018  1.1  mrg 
   1019  1.1  mrg   init_empty_tree_cfg_for_function (fn);
   1020  1.1  mrg 
   1021  1.1  mrg   profile_status_for_fn (fn) = streamer_read_enum (ib, profile_status_d,
   1022  1.1  mrg 						   PROFILE_LAST);
   1023  1.1  mrg 
   1024  1.1  mrg   bb_count = streamer_read_uhwi (ib);
   1025  1.1  mrg 
   1026  1.1  mrg   last_basic_block_for_fn (fn) = bb_count;
   1027  1.1  mrg   if (bb_count > basic_block_info_for_fn (fn)->length ())
   1028  1.1  mrg     vec_safe_grow_cleared (basic_block_info_for_fn (fn), bb_count, true);
   1029  1.1  mrg 
   1030  1.1  mrg   if (bb_count > label_to_block_map_for_fn (fn)->length ())
   1031  1.1  mrg     vec_safe_grow_cleared (label_to_block_map_for_fn (fn), bb_count, true);
   1032  1.1  mrg 
   1033  1.1  mrg   index = streamer_read_hwi (ib);
   1034  1.1  mrg   while (index != -1)
   1035  1.1  mrg     {
   1036  1.1  mrg       basic_block bb = BASIC_BLOCK_FOR_FN (fn, index);
   1037  1.1  mrg       unsigned int edge_count;
   1038  1.1  mrg 
   1039  1.1  mrg       if (bb == NULL)
   1040  1.1  mrg 	bb = make_new_block (fn, index);
   1041  1.1  mrg 
   1042  1.1  mrg       edge_count = streamer_read_uhwi (ib);
   1043  1.1  mrg 
   1044  1.1  mrg       /* Connect up the CFG.  */
   1045  1.1  mrg       for (i = 0; i < edge_count; i++)
   1046  1.1  mrg 	{
   1047  1.1  mrg 	  bitpack_d bp = streamer_read_bitpack (ib);
   1048  1.1  mrg 	  unsigned int dest_index = bp_unpack_var_len_unsigned (&bp);
   1049  1.1  mrg 	  unsigned int edge_flags = bp_unpack_var_len_unsigned (&bp);
   1050  1.1  mrg 	  basic_block dest = BASIC_BLOCK_FOR_FN (fn, dest_index);
   1051  1.1  mrg 
   1052  1.1  mrg 	  if (dest == NULL)
   1053  1.1  mrg 	    dest = make_new_block (fn, dest_index);
   1054  1.1  mrg 
   1055  1.1  mrg 	  edge e = make_edge (bb, dest, edge_flags);
   1056  1.1  mrg 	  data_in->location_cache.input_location_and_block (&e->goto_locus,
   1057  1.1  mrg 							    &bp, ib, data_in);
   1058  1.1  mrg 	  e->probability = profile_probability::stream_in (ib);
   1059  1.1  mrg 
   1060  1.1  mrg 	}
   1061  1.1  mrg 
   1062  1.1  mrg       index = streamer_read_hwi (ib);
   1063  1.1  mrg     }
   1064  1.1  mrg 
   1065  1.1  mrg   p_bb = ENTRY_BLOCK_PTR_FOR_FN (fn);
   1066  1.1  mrg   index = streamer_read_hwi (ib);
   1067  1.1  mrg   while (index != -1)
   1068  1.1  mrg     {
   1069  1.1  mrg       basic_block bb = BASIC_BLOCK_FOR_FN (fn, index);
   1070  1.1  mrg       bb->prev_bb = p_bb;
   1071  1.1  mrg       p_bb->next_bb = bb;
   1072  1.1  mrg       p_bb = bb;
   1073  1.1  mrg       index = streamer_read_hwi (ib);
   1074  1.1  mrg     }
   1075  1.1  mrg 
   1076  1.1  mrg   /* ???  The cfgloop interface is tied to cfun.  */
   1077  1.1  mrg   gcc_assert (cfun == fn);
   1078  1.1  mrg 
   1079  1.1  mrg   /* Input the loop tree.  */
   1080  1.1  mrg   unsigned n_loops = streamer_read_uhwi (ib);
   1081  1.1  mrg   if (n_loops == 0)
   1082  1.1  mrg     return;
   1083  1.1  mrg 
   1084  1.1  mrg   struct loops *loops = ggc_cleared_alloc<struct loops> ();
   1085  1.1  mrg   init_loops_structure (fn, loops, n_loops);
   1086  1.1  mrg   set_loops_for_fn (fn, loops);
   1087  1.1  mrg 
   1088  1.1  mrg   /* Input each loop and associate it with its loop header so
   1089  1.1  mrg      flow_loops_find can rebuild the loop tree.  */
   1090  1.1  mrg   for (unsigned i = 1; i < n_loops; ++i)
   1091  1.1  mrg     {
   1092  1.1  mrg       int header_index = streamer_read_hwi (ib);
   1093  1.1  mrg       if (header_index == -1)
   1094  1.1  mrg 	{
   1095  1.1  mrg 	  loops->larray->quick_push (NULL);
   1096  1.1  mrg 	  continue;
   1097  1.1  mrg 	}
   1098  1.1  mrg 
   1099  1.1  mrg       class loop *loop = alloc_loop ();
   1100  1.1  mrg       loop->header = BASIC_BLOCK_FOR_FN (fn, header_index);
   1101  1.1  mrg       loop->header->loop_father = loop;
   1102  1.1  mrg 
   1103  1.1  mrg       /* Read everything copy_loop_info copies.  */
   1104  1.1  mrg       loop->estimate_state = streamer_read_enum (ib, loop_estimation, EST_LAST);
   1105  1.1  mrg       loop->any_upper_bound = streamer_read_hwi (ib);
   1106  1.1  mrg       if (loop->any_upper_bound)
   1107  1.1  mrg 	loop->nb_iterations_upper_bound = streamer_read_widest_int (ib);
   1108  1.1  mrg       loop->any_likely_upper_bound = streamer_read_hwi (ib);
   1109  1.1  mrg       if (loop->any_likely_upper_bound)
   1110  1.1  mrg 	loop->nb_iterations_likely_upper_bound = streamer_read_widest_int (ib);
   1111  1.1  mrg       loop->any_estimate = streamer_read_hwi (ib);
   1112  1.1  mrg       if (loop->any_estimate)
   1113  1.1  mrg 	loop->nb_iterations_estimate = streamer_read_widest_int (ib);
   1114  1.1  mrg 
   1115  1.1  mrg       /* Read OMP SIMD related info.  */
   1116  1.1  mrg       loop->safelen = streamer_read_hwi (ib);
   1117  1.1  mrg       loop->unroll = streamer_read_hwi (ib);
   1118  1.1  mrg       loop->owned_clique = streamer_read_hwi (ib);
   1119  1.1  mrg       loop->dont_vectorize = streamer_read_hwi (ib);
   1120  1.1  mrg       loop->force_vectorize = streamer_read_hwi (ib);
   1121  1.1  mrg       loop->finite_p = streamer_read_hwi (ib);
   1122  1.1  mrg       loop->simduid = stream_read_tree (ib, data_in);
   1123  1.1  mrg 
   1124  1.1  mrg       place_new_loop (fn, loop);
   1125  1.1  mrg 
   1126  1.1  mrg       /* flow_loops_find doesn't like loops not in the tree, hook them
   1127  1.1  mrg          all as siblings of the tree root temporarily.  */
   1128  1.1  mrg       flow_loop_tree_node_add (loops->tree_root, loop);
   1129  1.1  mrg     }
   1130  1.1  mrg 
   1131  1.1  mrg   /* Rebuild the loop tree.  */
   1132  1.1  mrg   flow_loops_find (loops);
   1133  1.1  mrg }
   1134  1.1  mrg 
   1135  1.1  mrg 
   1136  1.1  mrg /* Read the SSA names array for function FN from DATA_IN using input
   1137  1.1  mrg    block IB.  */
   1138  1.1  mrg 
   1139  1.1  mrg static void
   1140  1.1  mrg input_ssa_names (class lto_input_block *ib, class data_in *data_in,
   1141  1.1  mrg 		 struct function *fn)
   1142  1.1  mrg {
   1143  1.1  mrg   unsigned int i, size;
   1144  1.1  mrg 
   1145  1.1  mrg   size = streamer_read_uhwi (ib);
   1146  1.1  mrg   init_tree_ssa (fn, size);
   1147  1.1  mrg   cfun->gimple_df->in_ssa_p = true;
   1148  1.1  mrg   init_ssa_operands (fn);
   1149  1.1  mrg 
   1150  1.1  mrg   i = streamer_read_uhwi (ib);
   1151  1.1  mrg   while (i)
   1152  1.1  mrg     {
   1153  1.1  mrg       tree ssa_name, name;
   1154  1.1  mrg       bool is_default_def;
   1155  1.1  mrg 
   1156  1.1  mrg       /* Skip over the elements that had been freed.  */
   1157  1.1  mrg       while (SSANAMES (fn)->length () < i)
   1158  1.1  mrg 	SSANAMES (fn)->quick_push (NULL_TREE);
   1159  1.1  mrg 
   1160  1.1  mrg       is_default_def = (streamer_read_uchar (ib) != 0);
   1161  1.1  mrg       name = stream_read_tree (ib, data_in);
   1162  1.1  mrg       ssa_name = make_ssa_name_fn (fn, name, NULL);
   1163  1.1  mrg 
   1164  1.1  mrg       if (is_default_def)
   1165  1.1  mrg 	{
   1166  1.1  mrg 	  set_ssa_default_def (cfun, SSA_NAME_VAR (ssa_name), ssa_name);
   1167  1.1  mrg 	  SSA_NAME_DEF_STMT (ssa_name) = gimple_build_nop ();
   1168  1.1  mrg 	}
   1169  1.1  mrg 
   1170  1.1  mrg       i = streamer_read_uhwi (ib);
   1171  1.1  mrg     }
   1172  1.1  mrg }
   1173  1.1  mrg 
   1174  1.1  mrg 
   1175  1.1  mrg /* Go through all NODE edges and fixup call_stmt pointers
   1176  1.1  mrg    so they point to STMTS.  */
   1177  1.1  mrg 
   1178  1.1  mrg static void
   1179  1.1  mrg fixup_call_stmt_edges_1 (struct cgraph_node *node, gimple **stmts,
   1180  1.1  mrg 			 struct function *fn)
   1181  1.1  mrg {
   1182  1.1  mrg #define STMT_UID_NOT_IN_RANGE(uid) \
   1183  1.1  mrg   (gimple_stmt_max_uid (fn) < uid || uid == 0)
   1184  1.1  mrg 
   1185  1.1  mrg   struct cgraph_edge *cedge;
   1186  1.1  mrg   struct ipa_ref *ref = NULL;
   1187  1.1  mrg   unsigned int i;
   1188  1.1  mrg 
   1189  1.1  mrg   for (cedge = node->callees; cedge; cedge = cedge->next_callee)
   1190  1.1  mrg     {
   1191  1.1  mrg       if (STMT_UID_NOT_IN_RANGE (cedge->lto_stmt_uid))
   1192  1.1  mrg         fatal_error (input_location,
   1193  1.1  mrg 		     "Cgraph edge statement index out of range");
   1194  1.1  mrg       cedge->call_stmt = as_a <gcall *> (stmts[cedge->lto_stmt_uid - 1]);
   1195  1.1  mrg       cedge->lto_stmt_uid = 0;
   1196  1.1  mrg       if (!cedge->call_stmt)
   1197  1.1  mrg         fatal_error (input_location,
   1198  1.1  mrg 		     "Cgraph edge statement index not found");
   1199  1.1  mrg     }
   1200  1.1  mrg   for (cedge = node->indirect_calls; cedge; cedge = cedge->next_callee)
   1201  1.1  mrg     {
   1202  1.1  mrg       if (STMT_UID_NOT_IN_RANGE (cedge->lto_stmt_uid))
   1203  1.1  mrg         fatal_error (input_location,
   1204  1.1  mrg 		     "Cgraph edge statement index out of range");
   1205  1.1  mrg       cedge->call_stmt = as_a <gcall *> (stmts[cedge->lto_stmt_uid - 1]);
   1206  1.1  mrg       cedge->lto_stmt_uid = 0;
   1207  1.1  mrg       if (!cedge->call_stmt)
   1208  1.1  mrg         fatal_error (input_location, "Cgraph edge statement index not found");
   1209  1.1  mrg     }
   1210  1.1  mrg   for (i = 0; node->iterate_reference (i, ref); i++)
   1211  1.1  mrg     if (ref->lto_stmt_uid)
   1212  1.1  mrg       {
   1213  1.1  mrg 	if (STMT_UID_NOT_IN_RANGE (ref->lto_stmt_uid))
   1214  1.1  mrg 	  fatal_error (input_location,
   1215  1.1  mrg 		       "Reference statement index out of range");
   1216  1.1  mrg 	ref->stmt = stmts[ref->lto_stmt_uid - 1];
   1217  1.1  mrg 	ref->lto_stmt_uid = 0;
   1218  1.1  mrg 	if (!ref->stmt)
   1219  1.1  mrg 	  fatal_error (input_location, "Reference statement index not found");
   1220  1.1  mrg       }
   1221  1.1  mrg }
   1222  1.1  mrg 
   1223  1.1  mrg 
   1224  1.1  mrg /* Fixup call_stmt pointers in NODE and all clones.  */
   1225  1.1  mrg 
   1226  1.1  mrg static void
   1227  1.1  mrg fixup_call_stmt_edges (struct cgraph_node *orig, gimple **stmts)
   1228  1.1  mrg {
   1229  1.1  mrg   struct cgraph_node *node;
   1230  1.1  mrg   struct function *fn;
   1231  1.1  mrg 
   1232  1.1  mrg   while (orig->clone_of)
   1233  1.1  mrg     orig = orig->clone_of;
   1234  1.1  mrg   fn = DECL_STRUCT_FUNCTION (orig->decl);
   1235  1.1  mrg 
   1236  1.1  mrg   if (!orig->thunk)
   1237  1.1  mrg     fixup_call_stmt_edges_1 (orig, stmts, fn);
   1238  1.1  mrg   if (orig->clones)
   1239  1.1  mrg     for (node = orig->clones; node != orig;)
   1240  1.1  mrg       {
   1241  1.1  mrg 	if (!node->thunk)
   1242  1.1  mrg 	  fixup_call_stmt_edges_1 (node, stmts, fn);
   1243  1.1  mrg 	if (node->clones)
   1244  1.1  mrg 	  node = node->clones;
   1245  1.1  mrg 	else if (node->next_sibling_clone)
   1246  1.1  mrg 	  node = node->next_sibling_clone;
   1247  1.1  mrg 	else
   1248  1.1  mrg 	  {
   1249  1.1  mrg 	    while (node != orig && !node->next_sibling_clone)
   1250  1.1  mrg 	      node = node->clone_of;
   1251  1.1  mrg 	    if (node != orig)
   1252  1.1  mrg 	      node = node->next_sibling_clone;
   1253  1.1  mrg 	  }
   1254  1.1  mrg       }
   1255  1.1  mrg }
   1256  1.1  mrg 
   1257  1.1  mrg 
   1258  1.1  mrg /* Input the base body of struct function FN from DATA_IN
   1259  1.1  mrg    using input block IB.  */
   1260  1.1  mrg 
   1261  1.1  mrg static void
   1262  1.1  mrg input_struct_function_base (struct function *fn, class data_in *data_in,
   1263  1.1  mrg 	                    class lto_input_block *ib)
   1264  1.1  mrg {
   1265  1.1  mrg   struct bitpack_d bp;
   1266  1.1  mrg   int len;
   1267  1.1  mrg 
   1268  1.1  mrg   /* Read the static chain and non-local goto save area.  */
   1269  1.1  mrg   fn->static_chain_decl = stream_read_tree (ib, data_in);
   1270  1.1  mrg   fn->nonlocal_goto_save_area = stream_read_tree (ib, data_in);
   1271  1.1  mrg 
   1272  1.1  mrg   /* Read all the local symbols.  */
   1273  1.1  mrg   len = streamer_read_hwi (ib);
   1274  1.1  mrg   if (len > 0)
   1275  1.1  mrg     {
   1276  1.1  mrg       int i;
   1277  1.1  mrg       vec_safe_grow_cleared (fn->local_decls, len, true);
   1278  1.1  mrg       for (i = 0; i < len; i++)
   1279  1.1  mrg 	{
   1280  1.1  mrg 	  tree t = stream_read_tree (ib, data_in);
   1281  1.1  mrg 	  (*fn->local_decls)[i] = t;
   1282  1.1  mrg 	}
   1283  1.1  mrg     }
   1284  1.1  mrg 
   1285  1.1  mrg   /* Input the current IL state of the function.  */
   1286  1.1  mrg   fn->curr_properties = streamer_read_uhwi (ib);
   1287  1.1  mrg 
   1288  1.1  mrg   /* Read all the attributes for FN.  */
   1289  1.1  mrg   bp = streamer_read_bitpack (ib);
   1290  1.1  mrg   fn->is_thunk = bp_unpack_value (&bp, 1);
   1291  1.1  mrg   fn->has_local_explicit_reg_vars = bp_unpack_value (&bp, 1);
   1292  1.1  mrg   fn->returns_pcc_struct = bp_unpack_value (&bp, 1);
   1293  1.1  mrg   fn->returns_struct = bp_unpack_value (&bp, 1);
   1294  1.1  mrg   fn->can_throw_non_call_exceptions = bp_unpack_value (&bp, 1);
   1295  1.1  mrg   fn->can_delete_dead_exceptions = bp_unpack_value (&bp, 1);
   1296  1.1  mrg   fn->always_inline_functions_inlined = bp_unpack_value (&bp, 1);
   1297  1.1  mrg   fn->after_inlining = bp_unpack_value (&bp, 1);
   1298  1.1  mrg   fn->stdarg = bp_unpack_value (&bp, 1);
   1299  1.1  mrg   fn->has_nonlocal_label = bp_unpack_value (&bp, 1);
   1300  1.1  mrg   fn->has_forced_label_in_static = bp_unpack_value (&bp, 1);
   1301  1.1  mrg   fn->calls_alloca = bp_unpack_value (&bp, 1);
   1302  1.1  mrg   fn->calls_setjmp = bp_unpack_value (&bp, 1);
   1303  1.1  mrg   fn->calls_eh_return = bp_unpack_value (&bp, 1);
   1304  1.1  mrg   fn->has_force_vectorize_loops = bp_unpack_value (&bp, 1);
   1305  1.1  mrg   fn->has_simduid_loops = bp_unpack_value (&bp, 1);
   1306  1.1  mrg   fn->va_list_fpr_size = bp_unpack_value (&bp, 8);
   1307  1.1  mrg   fn->va_list_gpr_size = bp_unpack_value (&bp, 8);
   1308  1.1  mrg   fn->last_clique = bp_unpack_value (&bp, sizeof (short) * 8);
   1309  1.1  mrg 
   1310  1.1  mrg   /* Input the function start and end loci.  */
   1311  1.1  mrg   stream_input_location (&fn->function_start_locus, &bp, data_in);
   1312  1.1  mrg   stream_input_location (&fn->function_end_locus, &bp, data_in);
   1313  1.1  mrg 
   1314  1.1  mrg   /* Restore the instance discriminators if present.  */
   1315  1.1  mrg   int instance_number = bp_unpack_value (&bp, 1);
   1316  1.1  mrg   if (instance_number)
   1317  1.1  mrg     {
   1318  1.1  mrg       instance_number = bp_unpack_value (&bp, sizeof (int) * CHAR_BIT);
   1319  1.1  mrg       maybe_create_decl_to_instance_map ()->put (fn->decl, instance_number);
   1320  1.1  mrg     }
   1321  1.1  mrg }
   1322  1.1  mrg 
   1323  1.1  mrg /* Read a chain of tree nodes from input block IB.  DATA_IN contains
   1324  1.1  mrg    tables and descriptors for the file being read.  */
   1325  1.1  mrg 
   1326  1.1  mrg static tree
   1327  1.1  mrg streamer_read_chain (class lto_input_block *ib, class data_in *data_in)
   1328  1.1  mrg {
   1329  1.1  mrg   tree first, prev, curr;
   1330  1.1  mrg 
   1331  1.1  mrg   /* The chain is written as NULL terminated list of trees.  */
   1332  1.1  mrg   first = prev = NULL_TREE;
   1333  1.1  mrg   do
   1334  1.1  mrg     {
   1335  1.1  mrg       curr = stream_read_tree (ib, data_in);
   1336  1.1  mrg       if (prev)
   1337  1.1  mrg 	TREE_CHAIN (prev) = curr;
   1338  1.1  mrg       else
   1339  1.1  mrg 	first = curr;
   1340  1.1  mrg 
   1341  1.1  mrg       prev = curr;
   1342  1.1  mrg     }
   1343  1.1  mrg   while (curr);
   1344  1.1  mrg 
   1345  1.1  mrg   return first;
   1346  1.1  mrg }
   1347  1.1  mrg 
   1348  1.1  mrg /* Read the body of function FN_DECL from DATA_IN using input block IB.  */
   1349  1.1  mrg 
   1350  1.1  mrg static void
   1351  1.1  mrg input_function (tree fn_decl, class data_in *data_in,
   1352  1.1  mrg 		class lto_input_block *ib, class lto_input_block *ib_cfg,
   1353  1.1  mrg 		cgraph_node *node)
   1354  1.1  mrg {
   1355  1.1  mrg   struct function *fn;
   1356  1.1  mrg   enum LTO_tags tag;
   1357  1.1  mrg   gimple **stmts;
   1358  1.1  mrg   basic_block bb;
   1359  1.1  mrg 
   1360  1.1  mrg   tag = streamer_read_record_start (ib);
   1361  1.1  mrg   lto_tag_check (tag, LTO_function);
   1362  1.1  mrg 
   1363  1.1  mrg   /* Read decls for parameters and args.  */
   1364  1.1  mrg   DECL_RESULT (fn_decl) = stream_read_tree (ib, data_in);
   1365  1.1  mrg   DECL_ARGUMENTS (fn_decl) = streamer_read_chain (ib, data_in);
   1366  1.1  mrg 
   1367  1.1  mrg   /* Read debug args if available.  */
   1368  1.1  mrg   unsigned n_debugargs = streamer_read_uhwi (ib);
   1369  1.1  mrg   if (n_debugargs)
   1370  1.1  mrg     {
   1371  1.1  mrg       vec<tree, va_gc> **debugargs = decl_debug_args_insert (fn_decl);
   1372  1.1  mrg       vec_safe_grow (*debugargs, n_debugargs, true);
   1373  1.1  mrg       for (unsigned i = 0; i < n_debugargs; ++i)
   1374  1.1  mrg 	(**debugargs)[i] = stream_read_tree (ib, data_in);
   1375  1.1  mrg     }
   1376  1.1  mrg 
   1377  1.1  mrg   /* Read the tree of lexical scopes for the function.  */
   1378  1.1  mrg   DECL_INITIAL (fn_decl) = stream_read_tree (ib, data_in);
   1379  1.1  mrg   unsigned block_leaf_count = streamer_read_uhwi (ib);
   1380  1.1  mrg   while (block_leaf_count--)
   1381  1.1  mrg     stream_read_tree (ib, data_in);
   1382  1.1  mrg 
   1383  1.1  mrg   if (!streamer_read_uhwi (ib))
   1384  1.1  mrg     return;
   1385  1.1  mrg 
   1386  1.1  mrg   push_struct_function (fn_decl);
   1387  1.1  mrg   fn = DECL_STRUCT_FUNCTION (fn_decl);
   1388  1.1  mrg 
   1389  1.1  mrg   gimple_register_cfg_hooks ();
   1390  1.1  mrg 
   1391  1.1  mrg   input_struct_function_base (fn, data_in, ib);
   1392  1.1  mrg   input_cfg (ib_cfg, data_in, fn);
   1393  1.1  mrg 
   1394  1.1  mrg   /* Read all the SSA names.  */
   1395  1.1  mrg   input_ssa_names (ib, data_in, fn);
   1396  1.1  mrg 
   1397  1.1  mrg   /* Read the exception handling regions in the function.  */
   1398  1.1  mrg   input_eh_regions (ib, data_in, fn);
   1399  1.1  mrg 
   1400  1.1  mrg   gcc_assert (DECL_INITIAL (fn_decl));
   1401  1.1  mrg   DECL_SAVED_TREE (fn_decl) = NULL_TREE;
   1402  1.1  mrg 
   1403  1.1  mrg   /* Read all the basic blocks.  */
   1404  1.1  mrg   tag = streamer_read_record_start (ib);
   1405  1.1  mrg   while (tag)
   1406  1.1  mrg     {
   1407  1.1  mrg       input_bb (ib, tag, data_in, fn,
   1408  1.1  mrg 		node->count_materialization_scale);
   1409  1.1  mrg       tag = streamer_read_record_start (ib);
   1410  1.1  mrg     }
   1411  1.1  mrg 
   1412  1.1  mrg   /* Finalize gimple_location/gimple_block of stmts and phis.  */
   1413  1.1  mrg   data_in->location_cache.apply_location_cache ();
   1414  1.1  mrg 
   1415  1.1  mrg   /* Fix up the call statements that are mentioned in the callgraph
   1416  1.1  mrg      edges.  */
   1417  1.1  mrg   set_gimple_stmt_max_uid (cfun, 0);
   1418  1.1  mrg   FOR_ALL_BB_FN (bb, cfun)
   1419  1.1  mrg     {
   1420  1.1  mrg       gimple_stmt_iterator gsi;
   1421  1.1  mrg       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   1422  1.1  mrg 	{
   1423  1.1  mrg 	  gimple *stmt = gsi_stmt (gsi);
   1424  1.1  mrg 	  gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
   1425  1.1  mrg 	}
   1426  1.1  mrg       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   1427  1.1  mrg 	{
   1428  1.1  mrg 	  gimple *stmt = gsi_stmt (gsi);
   1429  1.1  mrg 	  gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
   1430  1.1  mrg 	}
   1431  1.1  mrg     }
   1432  1.1  mrg   stmts = (gimple **) xcalloc (gimple_stmt_max_uid (fn), sizeof (gimple *));
   1433  1.1  mrg   FOR_ALL_BB_FN (bb, cfun)
   1434  1.1  mrg     {
   1435  1.1  mrg       gimple_stmt_iterator bsi = gsi_start_phis (bb);
   1436  1.1  mrg       while (!gsi_end_p (bsi))
   1437  1.1  mrg 	{
   1438  1.1  mrg 	  gimple *stmt = gsi_stmt (bsi);
   1439  1.1  mrg 	  gsi_next (&bsi);
   1440  1.1  mrg 	  stmts[gimple_uid (stmt)] = stmt;
   1441  1.1  mrg 	}
   1442  1.1  mrg       bsi = gsi_start_bb (bb);
   1443  1.1  mrg       while (!gsi_end_p (bsi))
   1444  1.1  mrg 	{
   1445  1.1  mrg 	  gimple *stmt = gsi_stmt (bsi);
   1446  1.1  mrg 	  bool remove = false;
   1447  1.1  mrg 	  /* If we're recompiling LTO objects with debug stmts but
   1448  1.1  mrg 	     we're not supposed to have debug stmts, remove them now.
   1449  1.1  mrg 	     We can't remove them earlier because this would cause uid
   1450  1.1  mrg 	     mismatches in fixups, but we can do it at this point, as
   1451  1.1  mrg 	     long as debug stmts don't require fixups.
   1452  1.1  mrg 	     Similarly remove all IFN_*SAN_* internal calls   */
   1453  1.1  mrg 	  if (!flag_wpa)
   1454  1.1  mrg 	    {
   1455  1.1  mrg 	      if (is_gimple_debug (stmt)
   1456  1.1  mrg 		  && (gimple_debug_nonbind_marker_p (stmt)
   1457  1.1  mrg 		      ? !MAY_HAVE_DEBUG_MARKER_STMTS
   1458  1.1  mrg 		      : !MAY_HAVE_DEBUG_BIND_STMTS))
   1459  1.1  mrg 		remove = true;
   1460  1.1  mrg 	      /* In case the linemap overflows locations can be dropped
   1461  1.1  mrg 		 to zero.  Thus do not keep nonsensical inline entry markers
   1462  1.1  mrg 		 we'd later ICE on.  */
   1463  1.1  mrg 	      tree block;
   1464  1.1  mrg 	      if (gimple_debug_inline_entry_p (stmt)
   1465  1.1  mrg 		  && (((block = gimple_block (stmt))
   1466  1.1  mrg 		       && !inlined_function_outer_scope_p (block))
   1467  1.1  mrg 		      || !debug_inline_points))
   1468  1.1  mrg 		remove = true;
   1469  1.1  mrg 	      if (is_gimple_call (stmt)
   1470  1.1  mrg 		  && gimple_call_internal_p (stmt))
   1471  1.1  mrg 		{
   1472  1.1  mrg 		  bool replace = false;
   1473  1.1  mrg 		  switch (gimple_call_internal_fn (stmt))
   1474  1.1  mrg 		    {
   1475  1.1  mrg 		    case IFN_UBSAN_NULL:
   1476  1.1  mrg 		      if ((flag_sanitize
   1477  1.1  mrg 			  & (SANITIZE_NULL | SANITIZE_ALIGNMENT)) == 0)
   1478  1.1  mrg 			replace = true;
   1479  1.1  mrg 		      break;
   1480  1.1  mrg 		    case IFN_UBSAN_BOUNDS:
   1481  1.1  mrg 		      if ((flag_sanitize & SANITIZE_BOUNDS) == 0)
   1482  1.1  mrg 			replace = true;
   1483  1.1  mrg 		      break;
   1484  1.1  mrg 		    case IFN_UBSAN_VPTR:
   1485  1.1  mrg 		      if ((flag_sanitize & SANITIZE_VPTR) == 0)
   1486  1.1  mrg 			replace = true;
   1487  1.1  mrg 		      break;
   1488  1.1  mrg 		    case IFN_UBSAN_OBJECT_SIZE:
   1489  1.1  mrg 		      if ((flag_sanitize & SANITIZE_OBJECT_SIZE) == 0)
   1490  1.1  mrg 			replace = true;
   1491  1.1  mrg 		      break;
   1492  1.1  mrg 		    case IFN_UBSAN_PTR:
   1493  1.1  mrg 		      if ((flag_sanitize & SANITIZE_POINTER_OVERFLOW) == 0)
   1494  1.1  mrg 			replace = true;
   1495  1.1  mrg 		      break;
   1496  1.1  mrg 		    case IFN_ASAN_MARK:
   1497  1.1  mrg 		      if ((flag_sanitize & SANITIZE_ADDRESS) == 0)
   1498  1.1  mrg 			replace = true;
   1499  1.1  mrg 		      break;
   1500  1.1  mrg 		    case IFN_TSAN_FUNC_EXIT:
   1501  1.1  mrg 		      if ((flag_sanitize & SANITIZE_THREAD) == 0)
   1502  1.1  mrg 			replace = true;
   1503  1.1  mrg 		      break;
   1504  1.1  mrg 		    default:
   1505  1.1  mrg 		      break;
   1506  1.1  mrg 		    }
   1507  1.1  mrg 		  if (replace)
   1508  1.1  mrg 		    {
   1509  1.1  mrg 		      gimple_call_set_internal_fn (as_a <gcall *> (stmt),
   1510  1.1  mrg 						   IFN_NOP);
   1511  1.1  mrg 		      update_stmt (stmt);
   1512  1.1  mrg 		    }
   1513  1.1  mrg 		}
   1514  1.1  mrg 	    }
   1515  1.1  mrg 	  if (remove)
   1516  1.1  mrg 	    {
   1517  1.1  mrg 	      gimple_stmt_iterator gsi = bsi;
   1518  1.1  mrg 	      gsi_next (&bsi);
   1519  1.1  mrg 	      unlink_stmt_vdef (stmt);
   1520  1.1  mrg 	      release_defs (stmt);
   1521  1.1  mrg 	      gsi_remove (&gsi, true);
   1522  1.1  mrg 	    }
   1523  1.1  mrg 	  else
   1524  1.1  mrg 	    {
   1525  1.1  mrg 	      gsi_next (&bsi);
   1526  1.1  mrg 	      stmts[gimple_uid (stmt)] = stmt;
   1527  1.1  mrg 
   1528  1.1  mrg 	      /* Remember that the input function has begin stmt
   1529  1.1  mrg 		 markers, so that we know to expect them when emitting
   1530  1.1  mrg 		 debug info.  */
   1531  1.1  mrg 	      if (!cfun->debug_nonbind_markers
   1532  1.1  mrg 		  && gimple_debug_nonbind_marker_p (stmt))
   1533  1.1  mrg 		cfun->debug_nonbind_markers = true;
   1534  1.1  mrg 	    }
   1535  1.1  mrg 	}
   1536  1.1  mrg     }
   1537  1.1  mrg 
   1538  1.1  mrg   /* Set the gimple body to the statement sequence in the entry
   1539  1.1  mrg      basic block.  FIXME lto, this is fairly hacky.  The existence
   1540  1.1  mrg      of a gimple body is used by the cgraph routines, but we should
   1541  1.1  mrg      really use the presence of the CFG.  */
   1542  1.1  mrg   {
   1543  1.1  mrg     edge_iterator ei = ei_start (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs);
   1544  1.1  mrg     gimple_set_body (fn_decl, bb_seq (ei_edge (ei)->dest));
   1545  1.1  mrg   }
   1546  1.1  mrg 
   1547  1.1  mrg   update_max_bb_count ();
   1548  1.1  mrg   fixup_call_stmt_edges (node, stmts);
   1549  1.1  mrg   execute_all_ipa_stmt_fixups (node, stmts);
   1550  1.1  mrg 
   1551  1.1  mrg   free_dominance_info (CDI_DOMINATORS);
   1552  1.1  mrg   free_dominance_info (CDI_POST_DOMINATORS);
   1553  1.1  mrg   free (stmts);
   1554  1.1  mrg   pop_cfun ();
   1555  1.1  mrg }
   1556  1.1  mrg 
   1557  1.1  mrg /* Read the body of function FN_DECL from DATA_IN using input block IB.  */
   1558  1.1  mrg 
   1559  1.1  mrg static void
   1560  1.1  mrg input_constructor (tree var, class data_in *data_in,
   1561  1.1  mrg 		   class lto_input_block *ib)
   1562  1.1  mrg {
   1563  1.1  mrg   DECL_INITIAL (var) = stream_read_tree (ib, data_in);
   1564  1.1  mrg }
   1565  1.1  mrg 
   1566  1.1  mrg 
   1567  1.1  mrg /* Read the body from DATA for function NODE and fill it in.
   1568  1.1  mrg    FILE_DATA are the global decls and types.  SECTION_TYPE is either
   1569  1.1  mrg    LTO_section_function_body or LTO_section_static_initializer.  If
   1570  1.1  mrg    section type is LTO_section_function_body, FN must be the decl for
   1571  1.1  mrg    that function.  */
   1572  1.1  mrg 
   1573  1.1  mrg static void
   1574  1.1  mrg lto_read_body_or_constructor (struct lto_file_decl_data *file_data, struct symtab_node *node,
   1575  1.1  mrg 			      const char *data, enum lto_section_type section_type)
   1576  1.1  mrg {
   1577  1.1  mrg   const struct lto_function_header *header;
   1578  1.1  mrg   class data_in *data_in;
   1579  1.1  mrg   int cfg_offset;
   1580  1.1  mrg   int main_offset;
   1581  1.1  mrg   int string_offset;
   1582  1.1  mrg   tree fn_decl = node->decl;
   1583  1.1  mrg 
   1584  1.1  mrg   header = (const struct lto_function_header *) data;
   1585  1.1  mrg   if (TREE_CODE (node->decl) == FUNCTION_DECL)
   1586  1.1  mrg     {
   1587  1.1  mrg       cfg_offset = sizeof (struct lto_function_header);
   1588  1.1  mrg       main_offset = cfg_offset + header->cfg_size;
   1589  1.1  mrg       string_offset = main_offset + header->main_size;
   1590  1.1  mrg     }
   1591  1.1  mrg   else
   1592  1.1  mrg     {
   1593  1.1  mrg       main_offset = sizeof (struct lto_function_header);
   1594  1.1  mrg       string_offset = main_offset + header->main_size;
   1595  1.1  mrg     }
   1596  1.1  mrg 
   1597  1.1  mrg   data_in = lto_data_in_create (file_data, data + string_offset,
   1598  1.1  mrg 			      header->string_size, vNULL);
   1599  1.1  mrg 
   1600  1.1  mrg   if (section_type == LTO_section_function_body)
   1601  1.1  mrg     {
   1602  1.1  mrg       struct lto_in_decl_state *decl_state;
   1603  1.1  mrg       unsigned from;
   1604  1.1  mrg 
   1605  1.1  mrg       gcc_checking_assert (node);
   1606  1.1  mrg 
   1607  1.1  mrg       /* Use the function's decl state. */
   1608  1.1  mrg       decl_state = lto_get_function_in_decl_state (file_data, fn_decl);
   1609  1.1  mrg       gcc_assert (decl_state);
   1610  1.1  mrg       file_data->current_decl_state = decl_state;
   1611  1.1  mrg 
   1612  1.1  mrg 
   1613  1.1  mrg       /* Set up the struct function.  */
   1614  1.1  mrg       from = data_in->reader_cache->nodes.length ();
   1615  1.1  mrg       lto_input_block ib_main (data + main_offset, header->main_size,
   1616  1.1  mrg 			       file_data->mode_table);
   1617  1.1  mrg       if (TREE_CODE (node->decl) == FUNCTION_DECL)
   1618  1.1  mrg 	{
   1619  1.1  mrg 	  lto_input_block ib_cfg (data + cfg_offset, header->cfg_size,
   1620  1.1  mrg 				  file_data->mode_table);
   1621  1.1  mrg 	  input_function (fn_decl, data_in, &ib_main, &ib_cfg,
   1622  1.1  mrg 			  dyn_cast <cgraph_node *>(node));
   1623  1.1  mrg 	}
   1624  1.1  mrg       else
   1625  1.1  mrg         input_constructor (fn_decl, data_in, &ib_main);
   1626  1.1  mrg       data_in->location_cache.apply_location_cache ();
   1627  1.1  mrg       /* And fixup types we streamed locally.  */
   1628  1.1  mrg 	{
   1629  1.1  mrg 	  struct streamer_tree_cache_d *cache = data_in->reader_cache;
   1630  1.1  mrg 	  unsigned len = cache->nodes.length ();
   1631  1.1  mrg 	  unsigned i;
   1632  1.1  mrg 	  for (i = len; i-- > from;)
   1633  1.1  mrg 	    {
   1634  1.1  mrg 	      tree t = streamer_tree_cache_get_tree (cache, i);
   1635  1.1  mrg 	      if (t == NULL_TREE)
   1636  1.1  mrg 		continue;
   1637  1.1  mrg 
   1638  1.1  mrg 	      if (TYPE_P (t))
   1639  1.1  mrg 		{
   1640  1.1  mrg 		  gcc_assert (TYPE_CANONICAL (t) == NULL_TREE);
   1641  1.1  mrg 		  if (type_with_alias_set_p (t)
   1642  1.1  mrg 		      && canonical_type_used_p (t))
   1643  1.1  mrg 		    TYPE_CANONICAL (t) = TYPE_MAIN_VARIANT (t);
   1644  1.1  mrg 		  if (TYPE_MAIN_VARIANT (t) != t)
   1645  1.1  mrg 		    {
   1646  1.1  mrg 		      gcc_assert (TYPE_NEXT_VARIANT (t) == NULL_TREE);
   1647  1.1  mrg 		      TYPE_NEXT_VARIANT (t)
   1648  1.1  mrg 			= TYPE_NEXT_VARIANT (TYPE_MAIN_VARIANT (t));
   1649  1.1  mrg 		      TYPE_NEXT_VARIANT (TYPE_MAIN_VARIANT (t)) = t;
   1650  1.1  mrg 		    }
   1651  1.1  mrg 		}
   1652  1.1  mrg 	    }
   1653  1.1  mrg 	}
   1654  1.1  mrg 
   1655  1.1  mrg       /* Restore decl state */
   1656  1.1  mrg       file_data->current_decl_state = file_data->global_decl_state;
   1657  1.1  mrg     }
   1658  1.1  mrg 
   1659  1.1  mrg   lto_data_in_delete (data_in);
   1660  1.1  mrg }
   1661  1.1  mrg 
   1662  1.1  mrg 
   1663  1.1  mrg /* Read the body of NODE using DATA.  FILE_DATA holds the global
   1664  1.1  mrg    decls and types.  */
   1665  1.1  mrg 
   1666  1.1  mrg void
   1667  1.1  mrg lto_input_function_body (struct lto_file_decl_data *file_data,
   1668  1.1  mrg 			 struct cgraph_node *node, const char *data)
   1669  1.1  mrg {
   1670  1.1  mrg   lto_read_body_or_constructor (file_data, node, data, LTO_section_function_body);
   1671  1.1  mrg }
   1672  1.1  mrg 
   1673  1.1  mrg /* Read the body of NODE using DATA.  FILE_DATA holds the global
   1674  1.1  mrg    decls and types.  */
   1675  1.1  mrg 
   1676  1.1  mrg void
   1677  1.1  mrg lto_input_variable_constructor (struct lto_file_decl_data *file_data,
   1678  1.1  mrg 				struct varpool_node *node, const char *data)
   1679  1.1  mrg {
   1680  1.1  mrg   lto_read_body_or_constructor (file_data, node, data, LTO_section_function_body);
   1681  1.1  mrg }
   1682  1.1  mrg 
   1683  1.1  mrg 
   1684  1.1  mrg /* Queue of acummulated decl -> DIE mappings.  Similar to locations those
   1685  1.1  mrg    are only applied to prevailing tree nodes during tree merging.  */
   1686  1.1  mrg vec<dref_entry> dref_queue;
   1687  1.1  mrg 
   1688  1.1  mrg /* Read the physical representation of a tree node EXPR from
   1689  1.1  mrg    input block IB using the per-file context in DATA_IN.  */
   1690  1.1  mrg 
   1691  1.1  mrg static void
   1692  1.1  mrg lto_read_tree_1 (class lto_input_block *ib, class data_in *data_in, tree expr)
   1693  1.1  mrg {
   1694  1.1  mrg   /* Read all the bitfield values in EXPR.  Note that for LTO, we
   1695  1.1  mrg      only write language-independent bitfields, so no more unpacking is
   1696  1.1  mrg      needed.  */
   1697  1.1  mrg   streamer_read_tree_bitfields (ib, data_in, expr);
   1698  1.1  mrg 
   1699  1.1  mrg   /* Read all the pointer fields in EXPR.  */
   1700  1.1  mrg   streamer_read_tree_body (ib, data_in, expr);
   1701  1.1  mrg 
   1702  1.1  mrg   /* Read any LTO-specific data not read by the tree streamer.  Do not use
   1703  1.1  mrg      stream_read_tree here since that flushes the dref_queue in mids of
   1704  1.1  mrg      SCC reading.  */
   1705  1.1  mrg   if (DECL_P (expr)
   1706  1.1  mrg       && TREE_CODE (expr) != FUNCTION_DECL
   1707  1.1  mrg       && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
   1708  1.1  mrg     DECL_INITIAL (expr)
   1709  1.1  mrg       = lto_input_tree_1 (ib, data_in, streamer_read_record_start (ib), 0);
   1710  1.1  mrg 
   1711  1.1  mrg   /* Stream references to early generated DIEs.  Keep in sync with the
   1712  1.1  mrg      trees handled in dwarf2out_register_external_die.  */
   1713  1.1  mrg   if ((DECL_P (expr)
   1714  1.1  mrg        && TREE_CODE (expr) != FIELD_DECL
   1715  1.1  mrg        && TREE_CODE (expr) != DEBUG_EXPR_DECL
   1716  1.1  mrg        && TREE_CODE (expr) != TYPE_DECL)
   1717  1.1  mrg       || TREE_CODE (expr) == BLOCK)
   1718  1.1  mrg     {
   1719  1.1  mrg       const char *str = streamer_read_string (data_in, ib);
   1720  1.1  mrg       if (str)
   1721  1.1  mrg 	{
   1722  1.1  mrg 	  unsigned HOST_WIDE_INT off = streamer_read_uhwi (ib);
   1723  1.1  mrg 	  dref_entry e = { expr, str, off };
   1724  1.1  mrg 	  dref_queue.safe_push (e);
   1725  1.1  mrg 	}
   1726  1.1  mrg     }
   1727  1.1  mrg }
   1728  1.1  mrg 
   1729  1.1  mrg /* Read the physical representation of a tree node with tag TAG from
   1730  1.1  mrg    input block IB using the per-file context in DATA_IN.  */
   1731  1.1  mrg 
   1732  1.1  mrg static tree
   1733  1.1  mrg lto_read_tree (class lto_input_block *ib, class data_in *data_in,
   1734  1.1  mrg 	       enum LTO_tags tag, hashval_t hash)
   1735  1.1  mrg {
   1736  1.1  mrg   /* Instantiate a new tree node.  */
   1737  1.1  mrg   tree result = streamer_alloc_tree (ib, data_in, tag);
   1738  1.1  mrg 
   1739  1.1  mrg   /* Enter RESULT in the reader cache.  This will make RESULT
   1740  1.1  mrg      available so that circular references in the rest of the tree
   1741  1.1  mrg      structure can be resolved in subsequent calls to stream_read_tree.  */
   1742  1.1  mrg   streamer_tree_cache_append (data_in->reader_cache, result, hash);
   1743  1.1  mrg 
   1744  1.1  mrg   lto_read_tree_1 (ib, data_in, result);
   1745  1.1  mrg 
   1746  1.1  mrg   return result;
   1747  1.1  mrg }
   1748  1.1  mrg 
   1749  1.1  mrg 
   1750  1.1  mrg /* Populate the reader cache with trees materialized from the SCC
   1751  1.1  mrg    following in the IB, DATA_IN stream.
   1752  1.1  mrg    If SHARED_SCC is true we input LTO_tree_scc.  */
   1753  1.1  mrg 
   1754  1.1  mrg hashval_t
   1755  1.1  mrg lto_input_scc (class lto_input_block *ib, class data_in *data_in,
   1756  1.1  mrg 	       unsigned *len, unsigned *entry_len, bool shared_scc)
   1757  1.1  mrg {
   1758  1.1  mrg   unsigned size = streamer_read_uhwi (ib);
   1759  1.1  mrg   hashval_t scc_hash = 0;
   1760  1.1  mrg   unsigned scc_entry_len = 1;
   1761  1.1  mrg 
   1762  1.1  mrg   if (shared_scc)
   1763  1.1  mrg     {
   1764  1.1  mrg       if (size & 1)
   1765  1.1  mrg 	scc_entry_len = streamer_read_uhwi (ib);
   1766  1.1  mrg       size /= 2;
   1767  1.1  mrg       scc_hash = streamer_read_uhwi (ib);
   1768  1.1  mrg     }
   1769  1.1  mrg 
   1770  1.1  mrg   if (size == 1)
   1771  1.1  mrg     {
   1772  1.1  mrg       enum LTO_tags tag = streamer_read_record_start (ib);
   1773  1.1  mrg       lto_input_tree_1 (ib, data_in, tag, scc_hash);
   1774  1.1  mrg     }
   1775  1.1  mrg   else
   1776  1.1  mrg     {
   1777  1.1  mrg       unsigned int first = data_in->reader_cache->nodes.length ();
   1778  1.1  mrg       tree result;
   1779  1.1  mrg 
   1780  1.1  mrg       /* Materialize size trees by reading their headers.  */
   1781  1.1  mrg       for (unsigned i = 0; i < size; ++i)
   1782  1.1  mrg 	{
   1783  1.1  mrg 	  enum LTO_tags tag = streamer_read_record_start (ib);
   1784  1.1  mrg 	  if (tag == LTO_null
   1785  1.1  mrg 	      || tag == LTO_global_stream_ref
   1786  1.1  mrg 	      || tag == LTO_tree_pickle_reference
   1787  1.1  mrg 	      || tag == LTO_integer_cst
   1788  1.1  mrg 	      || tag == LTO_tree_scc
   1789  1.1  mrg 	      || tag == LTO_trees)
   1790  1.1  mrg 	    gcc_unreachable ();
   1791  1.1  mrg 
   1792  1.1  mrg 	  result = streamer_alloc_tree (ib, data_in, tag);
   1793  1.1  mrg 	  streamer_tree_cache_append (data_in->reader_cache, result, 0);
   1794  1.1  mrg 	}
   1795  1.1  mrg 
   1796  1.1  mrg       /* Read the tree bitpacks and references.  */
   1797  1.1  mrg       for (unsigned i = 0; i < size; ++i)
   1798  1.1  mrg 	{
   1799  1.1  mrg 	  result = streamer_tree_cache_get_tree (data_in->reader_cache,
   1800  1.1  mrg 						 first + i);
   1801  1.1  mrg 	  lto_read_tree_1 (ib, data_in, result);
   1802  1.1  mrg 	}
   1803  1.1  mrg     }
   1804  1.1  mrg 
   1805  1.1  mrg   *len = size;
   1806  1.1  mrg   *entry_len = scc_entry_len;
   1807  1.1  mrg   return scc_hash;
   1808  1.1  mrg }
   1809  1.1  mrg 
   1810  1.1  mrg /* Read reference to tree from IB and DATA_IN.
   1811  1.1  mrg    This is used for streaming tree bodies where we know that
   1812  1.1  mrg    the tree is already in cache or is indexable and
   1813  1.1  mrg    must be matched with stream_write_tree_ref.  */
   1814  1.1  mrg 
   1815  1.1  mrg tree
   1816  1.1  mrg stream_read_tree_ref (lto_input_block *ib, data_in *data_in)
   1817  1.1  mrg {
   1818  1.1  mrg   int ix = streamer_read_hwi (ib);
   1819  1.1  mrg   if (!ix)
   1820  1.1  mrg     return NULL_TREE;
   1821  1.1  mrg   if (ix > 0)
   1822  1.1  mrg     return streamer_tree_cache_get_tree (data_in->reader_cache, ix - 1);
   1823  1.1  mrg 
   1824  1.1  mrg   ix = -ix - 1;
   1825  1.1  mrg   int id = ix & 1;
   1826  1.1  mrg   ix /= 2;
   1827  1.1  mrg 
   1828  1.1  mrg   tree ret;
   1829  1.1  mrg   if (!id)
   1830  1.1  mrg     ret = (*data_in->file_data->current_decl_state
   1831  1.1  mrg 	   ->streams[LTO_DECL_STREAM])[ix];
   1832  1.1  mrg   else
   1833  1.1  mrg     ret = (*SSANAMES (cfun))[ix];
   1834  1.1  mrg   return ret;
   1835  1.1  mrg }
   1836  1.1  mrg 
   1837  1.1  mrg /* Read a tree from input block IB using the per-file context in
   1838  1.1  mrg    DATA_IN.  This context is used, for example, to resolve references
   1839  1.1  mrg    to previously read nodes.  */
   1840  1.1  mrg 
   1841  1.1  mrg tree
   1842  1.1  mrg lto_input_tree_1 (class lto_input_block *ib, class data_in *data_in,
   1843  1.1  mrg 		  enum LTO_tags tag, hashval_t hash)
   1844  1.1  mrg {
   1845  1.1  mrg   tree result;
   1846  1.1  mrg 
   1847  1.1  mrg   gcc_assert ((unsigned) tag < (unsigned) LTO_NUM_TAGS);
   1848  1.1  mrg 
   1849  1.1  mrg   if (tag == LTO_null)
   1850  1.1  mrg     result = NULL_TREE;
   1851  1.1  mrg   else if (tag == LTO_global_stream_ref || tag == LTO_ssa_name_ref)
   1852  1.1  mrg     {
   1853  1.1  mrg       /* If TAG is a reference to an indexable tree, the next value
   1854  1.1  mrg 	 in IB is the index into the table where we expect to find
   1855  1.1  mrg 	 that tree.  */
   1856  1.1  mrg       result = lto_input_tree_ref (ib, data_in, cfun, tag);
   1857  1.1  mrg     }
   1858  1.1  mrg   else if (tag == LTO_tree_pickle_reference)
   1859  1.1  mrg     {
   1860  1.1  mrg       /* If TAG is a reference to a previously read tree, look it up in
   1861  1.1  mrg 	 the reader cache.  */
   1862  1.1  mrg       result = streamer_get_pickled_tree (ib, data_in);
   1863  1.1  mrg     }
   1864  1.1  mrg   else if (tag == LTO_integer_cst)
   1865  1.1  mrg     {
   1866  1.1  mrg       /* For shared integer constants in singletons we can use the
   1867  1.1  mrg          existing tree integer constant merging code.  */
   1868  1.1  mrg       tree type = stream_read_tree_ref (ib, data_in);
   1869  1.1  mrg       unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib);
   1870  1.1  mrg       unsigned HOST_WIDE_INT i;
   1871  1.1  mrg       HOST_WIDE_INT a[WIDE_INT_MAX_ELTS];
   1872  1.1  mrg 
   1873  1.1  mrg       for (i = 0; i < len; i++)
   1874  1.1  mrg 	a[i] = streamer_read_hwi (ib);
   1875  1.1  mrg       gcc_assert (TYPE_PRECISION (type) <= MAX_BITSIZE_MODE_ANY_INT);
   1876  1.1  mrg       result = wide_int_to_tree (type, wide_int::from_array
   1877  1.1  mrg 				 (a, len, TYPE_PRECISION (type)));
   1878  1.1  mrg       streamer_tree_cache_append (data_in->reader_cache, result, hash);
   1879  1.1  mrg     }
   1880  1.1  mrg   else if (tag == LTO_tree_scc || tag == LTO_trees)
   1881  1.1  mrg     gcc_unreachable ();
   1882  1.1  mrg   else
   1883  1.1  mrg     {
   1884  1.1  mrg       /* Otherwise, materialize a new node from IB.  */
   1885  1.1  mrg       result = lto_read_tree (ib, data_in, tag, hash);
   1886  1.1  mrg     }
   1887  1.1  mrg 
   1888  1.1  mrg   return result;
   1889  1.1  mrg }
   1890  1.1  mrg 
   1891  1.1  mrg tree
   1892  1.1  mrg lto_input_tree (class lto_input_block *ib, class data_in *data_in)
   1893  1.1  mrg {
   1894  1.1  mrg   enum LTO_tags tag;
   1895  1.1  mrg 
   1896  1.1  mrg   /* Input pickled trees needed to stream in the reference.  */
   1897  1.1  mrg   while ((tag = streamer_read_record_start (ib)) == LTO_trees)
   1898  1.1  mrg     {
   1899  1.1  mrg       unsigned len, entry_len;
   1900  1.1  mrg       lto_input_scc (ib, data_in, &len, &entry_len, false);
   1901  1.1  mrg 
   1902  1.1  mrg       /* Register DECLs with the debuginfo machinery.  */
   1903  1.1  mrg       while (!dref_queue.is_empty ())
   1904  1.1  mrg 	{
   1905  1.1  mrg 	  dref_entry e = dref_queue.pop ();
   1906  1.1  mrg 	  debug_hooks->register_external_die (e.decl, e.sym, e.off);
   1907  1.1  mrg 	}
   1908  1.1  mrg     }
   1909  1.1  mrg   tree t = lto_input_tree_1 (ib, data_in, tag, 0);
   1910  1.1  mrg 
   1911  1.1  mrg   if (!dref_queue.is_empty ())
   1912  1.1  mrg     {
   1913  1.1  mrg       dref_entry e = dref_queue.pop ();
   1914  1.1  mrg       debug_hooks->register_external_die (e.decl, e.sym, e.off);
   1915  1.1  mrg       gcc_checking_assert (dref_queue.is_empty ());
   1916  1.1  mrg     }
   1917  1.1  mrg   return t;
   1918  1.1  mrg }
   1919  1.1  mrg 
   1920  1.1  mrg 
   1921  1.1  mrg /* Input toplevel asms.  */
   1922  1.1  mrg 
   1923  1.1  mrg void
   1924  1.1  mrg lto_input_toplevel_asms (struct lto_file_decl_data *file_data, int order_base)
   1925  1.1  mrg {
   1926  1.1  mrg   size_t len;
   1927  1.1  mrg   const char *data
   1928  1.1  mrg     = lto_get_summary_section_data (file_data, LTO_section_asm, &len);
   1929  1.1  mrg   const struct lto_simple_header_with_strings *header
   1930  1.1  mrg     = (const struct lto_simple_header_with_strings *) data;
   1931  1.1  mrg   int string_offset;
   1932  1.1  mrg   class data_in *data_in;
   1933  1.1  mrg   tree str;
   1934  1.1  mrg 
   1935  1.1  mrg   if (! data)
   1936  1.1  mrg     return;
   1937  1.1  mrg 
   1938  1.1  mrg   string_offset = sizeof (*header) + header->main_size;
   1939  1.1  mrg 
   1940  1.1  mrg   lto_input_block ib (data + sizeof (*header), header->main_size,
   1941  1.1  mrg 		      file_data->mode_table);
   1942  1.1  mrg 
   1943  1.1  mrg   data_in = lto_data_in_create (file_data, data + string_offset,
   1944  1.1  mrg 			      header->string_size, vNULL);
   1945  1.1  mrg 
   1946  1.1  mrg   while ((str = streamer_read_string_cst (data_in, &ib)))
   1947  1.1  mrg     {
   1948  1.1  mrg       asm_node *node = symtab->finalize_toplevel_asm (str);
   1949  1.1  mrg       node->order = streamer_read_hwi (&ib) + order_base;
   1950  1.1  mrg       if (node->order >= symtab->order)
   1951  1.1  mrg 	symtab->order = node->order + 1;
   1952  1.1  mrg     }
   1953  1.1  mrg 
   1954  1.1  mrg   lto_data_in_delete (data_in);
   1955  1.1  mrg 
   1956  1.1  mrg   lto_free_section_data (file_data, LTO_section_asm, NULL, data, len);
   1957  1.1  mrg }
   1958  1.1  mrg 
   1959  1.1  mrg 
   1960  1.1  mrg /* Input mode table.  */
   1961  1.1  mrg 
   1962  1.1  mrg void
   1963  1.1  mrg lto_input_mode_table (struct lto_file_decl_data *file_data)
   1964  1.1  mrg {
   1965  1.1  mrg   size_t len;
   1966  1.1  mrg   const char *data
   1967  1.1  mrg     = lto_get_summary_section_data (file_data, LTO_section_mode_table, &len);
   1968  1.1  mrg   if (! data)
   1969  1.1  mrg     internal_error ("cannot read LTO mode table from %s",
   1970  1.1  mrg 		    file_data->file_name);
   1971  1.1  mrg 
   1972  1.1  mrg   unsigned char *table = ggc_cleared_vec_alloc<unsigned char> (1 << 8);
   1973  1.1  mrg   file_data->mode_table = table;
   1974  1.1  mrg   const struct lto_simple_header_with_strings *header
   1975  1.1  mrg     = (const struct lto_simple_header_with_strings *) data;
   1976  1.1  mrg   int string_offset;
   1977  1.1  mrg   class data_in *data_in;
   1978  1.1  mrg   string_offset = sizeof (*header) + header->main_size;
   1979  1.1  mrg 
   1980  1.1  mrg   lto_input_block ib (data + sizeof (*header), header->main_size, NULL);
   1981  1.1  mrg   data_in = lto_data_in_create (file_data, data + string_offset,
   1982  1.1  mrg 				header->string_size, vNULL);
   1983  1.1  mrg   bitpack_d bp = streamer_read_bitpack (&ib);
   1984  1.1  mrg 
   1985  1.1  mrg   table[VOIDmode] = VOIDmode;
   1986  1.1  mrg   table[BLKmode] = BLKmode;
   1987  1.1  mrg   unsigned int m;
   1988  1.1  mrg   while ((m = bp_unpack_value (&bp, 8)) != VOIDmode)
   1989  1.1  mrg     {
   1990  1.1  mrg       enum mode_class mclass
   1991  1.1  mrg 	= bp_unpack_enum (&bp, mode_class, MAX_MODE_CLASS);
   1992  1.1  mrg       poly_uint16 size = bp_unpack_poly_value (&bp, 16);
   1993  1.1  mrg       poly_uint16 prec = bp_unpack_poly_value (&bp, 16);
   1994  1.1  mrg       machine_mode inner = (machine_mode) bp_unpack_value (&bp, 8);
   1995  1.1  mrg       poly_uint16 nunits = bp_unpack_poly_value (&bp, 16);
   1996  1.1  mrg       unsigned int ibit = 0, fbit = 0;
   1997  1.1  mrg       unsigned int real_fmt_len = 0;
   1998  1.1  mrg       const char *real_fmt_name = NULL;
   1999  1.1  mrg       switch (mclass)
   2000  1.1  mrg 	{
   2001  1.1  mrg 	case MODE_FRACT:
   2002  1.1  mrg 	case MODE_UFRACT:
   2003  1.1  mrg 	case MODE_ACCUM:
   2004  1.1  mrg 	case MODE_UACCUM:
   2005  1.1  mrg 	  ibit = bp_unpack_value (&bp, 8);
   2006  1.1  mrg 	  fbit = bp_unpack_value (&bp, 8);
   2007  1.1  mrg 	  break;
   2008  1.1  mrg 	case MODE_FLOAT:
   2009  1.1  mrg 	case MODE_DECIMAL_FLOAT:
   2010  1.1  mrg 	  real_fmt_name = bp_unpack_indexed_string (data_in, &bp,
   2011  1.1  mrg 						    &real_fmt_len);
   2012  1.1  mrg 	  break;
   2013  1.1  mrg 	default:
   2014  1.1  mrg 	  break;
   2015  1.1  mrg 	}
   2016  1.1  mrg       /* First search just the GET_CLASS_NARROWEST_MODE to wider modes,
   2017  1.1  mrg 	 if not found, fallback to all modes.  */
   2018  1.1  mrg       int pass;
   2019  1.1  mrg       for (pass = 0; pass < 2; pass++)
   2020  1.1  mrg 	for (machine_mode mr = pass ? VOIDmode
   2021  1.1  mrg 				    : GET_CLASS_NARROWEST_MODE (mclass);
   2022  1.1  mrg 	     pass ? mr < MAX_MACHINE_MODE : mr != VOIDmode;
   2023  1.1  mrg 	     pass ? mr = (machine_mode) (mr + 1)
   2024  1.1  mrg 		  : mr = GET_MODE_WIDER_MODE (mr).else_void ())
   2025  1.1  mrg 	  if (GET_MODE_CLASS (mr) != mclass
   2026  1.1  mrg 	      || maybe_ne (GET_MODE_SIZE (mr), size)
   2027  1.1  mrg 	      || maybe_ne (GET_MODE_PRECISION (mr), prec)
   2028  1.1  mrg 	      || (inner == m
   2029  1.1  mrg 		  ? GET_MODE_INNER (mr) != mr
   2030  1.1  mrg 		  : GET_MODE_INNER (mr) != table[(int) inner])
   2031  1.1  mrg 	      || GET_MODE_IBIT (mr) != ibit
   2032  1.1  mrg 	      || GET_MODE_FBIT (mr) != fbit
   2033  1.1  mrg 	      || maybe_ne (GET_MODE_NUNITS (mr), nunits))
   2034  1.1  mrg 	    continue;
   2035  1.1  mrg 	  else if ((mclass == MODE_FLOAT || mclass == MODE_DECIMAL_FLOAT)
   2036  1.1  mrg 		   && strcmp (REAL_MODE_FORMAT (mr)->name, real_fmt_name) != 0)
   2037  1.1  mrg 	    continue;
   2038  1.1  mrg 	  else
   2039  1.1  mrg 	    {
   2040  1.1  mrg 	      table[m] = mr;
   2041  1.1  mrg 	      pass = 2;
   2042  1.1  mrg 	      break;
   2043  1.1  mrg 	    }
   2044  1.1  mrg       unsigned int mname_len;
   2045  1.1  mrg       const char *mname = bp_unpack_indexed_string (data_in, &bp, &mname_len);
   2046  1.1  mrg       if (pass == 2)
   2047  1.1  mrg 	{
   2048  1.1  mrg 	  switch (mclass)
   2049  1.1  mrg 	    {
   2050  1.1  mrg 	    case MODE_VECTOR_BOOL:
   2051  1.1  mrg 	    case MODE_VECTOR_INT:
   2052  1.1  mrg 	    case MODE_VECTOR_FLOAT:
   2053  1.1  mrg 	    case MODE_VECTOR_FRACT:
   2054  1.1  mrg 	    case MODE_VECTOR_UFRACT:
   2055  1.1  mrg 	    case MODE_VECTOR_ACCUM:
   2056  1.1  mrg 	    case MODE_VECTOR_UACCUM:
   2057  1.1  mrg 	      /* For unsupported vector modes just use BLKmode,
   2058  1.1  mrg 		 if the scalar mode is supported.  */
   2059  1.1  mrg 	      if (table[(int) inner] != VOIDmode)
   2060  1.1  mrg 		{
   2061  1.1  mrg 		  table[m] = BLKmode;
   2062  1.1  mrg 		  break;
   2063  1.1  mrg 		}
   2064  1.1  mrg 	      /* FALLTHRU */
   2065  1.1  mrg 	    default:
   2066  1.1  mrg 	      /* This is only used for offloading-target compilations and
   2067  1.1  mrg 		 is a user-facing error.  Give a better error message for
   2068  1.1  mrg 		 the common modes; see also mode-classes.def.   */
   2069  1.1  mrg 	      if (mclass == MODE_FLOAT)
   2070  1.1  mrg 		fatal_error (UNKNOWN_LOCATION,
   2071  1.1  mrg 			     "%s - %u-bit-precision floating-point numbers "
   2072  1.1  mrg 			     "unsupported (mode %qs)", TARGET_MACHINE,
   2073  1.1  mrg 			     prec.to_constant (), mname);
   2074  1.1  mrg 	      else if (mclass == MODE_DECIMAL_FLOAT)
   2075  1.1  mrg 		fatal_error (UNKNOWN_LOCATION,
   2076  1.1  mrg 			     "%s - %u-bit-precision decimal floating-point "
   2077  1.1  mrg 			     "numbers unsupported (mode %qs)", TARGET_MACHINE,
   2078  1.1  mrg 			     prec.to_constant (), mname);
   2079  1.1  mrg 	      else if (mclass == MODE_COMPLEX_FLOAT)
   2080  1.1  mrg 		fatal_error (UNKNOWN_LOCATION,
   2081  1.1  mrg 			     "%s - %u-bit-precision complex floating-point "
   2082  1.1  mrg 			     "numbers unsupported (mode %qs)", TARGET_MACHINE,
   2083  1.1  mrg 			     prec.to_constant (), mname);
   2084  1.1  mrg 	      else if (mclass == MODE_INT)
   2085  1.1  mrg 		fatal_error (UNKNOWN_LOCATION,
   2086  1.1  mrg 			     "%s - %u-bit integer numbers unsupported (mode "
   2087  1.1  mrg 			     "%qs)", TARGET_MACHINE, prec.to_constant (), mname);
   2088  1.1  mrg 	      else
   2089  1.1  mrg 		fatal_error (UNKNOWN_LOCATION, "%s - unsupported mode %qs",
   2090  1.1  mrg 			     TARGET_MACHINE, mname);
   2091  1.1  mrg 	      break;
   2092  1.1  mrg 	    }
   2093  1.1  mrg 	}
   2094  1.1  mrg     }
   2095  1.1  mrg   lto_data_in_delete (data_in);
   2096  1.1  mrg 
   2097  1.1  mrg   lto_free_section_data (file_data, LTO_section_mode_table, NULL, data, len);
   2098  1.1  mrg }
   2099  1.1  mrg 
   2100  1.1  mrg 
   2101  1.1  mrg /* Initialization for the LTO reader.  */
   2102  1.1  mrg 
   2103  1.1  mrg void
   2104  1.1  mrg lto_reader_init (void)
   2105  1.1  mrg {
   2106  1.1  mrg   lto_streamer_init ();
   2107  1.1  mrg   file_name_hash_table
   2108  1.1  mrg     = new hash_table<string_slot_hasher> (37);
   2109  1.1  mrg   string_slot_allocator = new object_allocator <struct string_slot>
   2110  1.1  mrg 				("line map file name hash");
   2111  1.1  mrg   gcc_obstack_init (&file_name_obstack);
   2112  1.1  mrg }
   2113  1.1  mrg 
   2114  1.1  mrg /* Free hash table used to stream in location file names.  */
   2115  1.1  mrg 
   2116  1.1  mrg void
   2117  1.1  mrg lto_free_file_name_hash (void)
   2118  1.1  mrg {
   2119  1.1  mrg   delete file_name_hash_table;
   2120  1.1  mrg   file_name_hash_table = NULL;
   2121  1.1  mrg   delete string_slot_allocator;
   2122  1.1  mrg   string_slot_allocator = NULL;
   2123  1.1  mrg   delete path_name_pair_hash_table;
   2124  1.1  mrg   path_name_pair_hash_table = NULL;
   2125  1.1  mrg   delete string_pair_map_allocator;
   2126  1.1  mrg   string_pair_map_allocator = NULL;
   2127  1.1  mrg   /* file_name_obstack must stay allocated since it is referred to by
   2128  1.1  mrg      line map table.  */
   2129  1.1  mrg }
   2130  1.1  mrg 
   2131  1.1  mrg 
   2132  1.1  mrg /* Create a new data_in object for FILE_DATA. STRINGS is the string
   2133  1.1  mrg    table to use with LEN strings.  RESOLUTIONS is the vector of linker
   2134  1.1  mrg    resolutions (NULL if not using a linker plugin).  */
   2135  1.1  mrg 
   2136  1.1  mrg class data_in *
   2137  1.1  mrg lto_data_in_create (struct lto_file_decl_data *file_data, const char *strings,
   2138  1.1  mrg 		    unsigned len,
   2139  1.1  mrg 		    vec<ld_plugin_symbol_resolution_t> resolutions)
   2140  1.1  mrg {
   2141  1.1  mrg   class data_in *data_in = new (class data_in);
   2142  1.1  mrg   data_in->file_data = file_data;
   2143  1.1  mrg   data_in->strings = strings;
   2144  1.1  mrg   data_in->strings_len = len;
   2145  1.1  mrg   data_in->globals_resolution = resolutions;
   2146  1.1  mrg   data_in->reader_cache = streamer_tree_cache_create (false, false, true);
   2147  1.1  mrg   return data_in;
   2148  1.1  mrg }
   2149  1.1  mrg 
   2150  1.1  mrg 
   2151  1.1  mrg /* Remove DATA_IN.  */
   2152  1.1  mrg 
   2153  1.1  mrg void
   2154  1.1  mrg lto_data_in_delete (class data_in *data_in)
   2155  1.1  mrg {
   2156  1.1  mrg   data_in->globals_resolution.release ();
   2157  1.1  mrg   streamer_tree_cache_delete (data_in->reader_cache);
   2158  1.1  mrg   delete data_in;
   2159  1.1  mrg }
   2160