LCOV - code coverage report
Current view: top level - gcc - lto-streamer-in.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 76.1 % 1096 834
Test Date: 2026-02-28 14:20:25 Functions: 87.2 % 47 41
Legend: Lines:     hit not hit

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

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.