LCOV - code coverage report
Current view: top level - gcc - lto-cgraph.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 87.5 % 1161 1016
Test Date: 2024-12-21 13:15:12 Functions: 94.2 % 52 49
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Write and read the cgraph to the memory mapped representation of a
       2                 :             :    .o file.
       3                 :             : 
       4                 :             :    Copyright (C) 2009-2024 Free Software Foundation, Inc.
       5                 :             :    Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
       6                 :             : 
       7                 :             : This file is part of GCC.
       8                 :             : 
       9                 :             : GCC is free software; you can redistribute it and/or modify it under
      10                 :             : the terms of the GNU General Public License as published by the Free
      11                 :             : Software Foundation; either version 3, or (at your option) any later
      12                 :             : version.
      13                 :             : 
      14                 :             : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      15                 :             : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      16                 :             : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      17                 :             : for more details.
      18                 :             : 
      19                 :             : You should have received a copy of the GNU General Public License
      20                 :             : along with GCC; see the file COPYING3.  If not see
      21                 :             : <http://www.gnu.org/licenses/>.  */
      22                 :             : 
      23                 :             : #include "config.h"
      24                 :             : #include "system.h"
      25                 :             : #include "coretypes.h"
      26                 :             : #include "backend.h"
      27                 :             : #include "rtl.h"
      28                 :             : #include "tree.h"
      29                 :             : #include "gimple.h"
      30                 :             : #include "predict.h"
      31                 :             : #include "stringpool.h"
      32                 :             : #include "tree-streamer.h"
      33                 :             : #include "cgraph.h"
      34                 :             : #include "tree-pass.h"
      35                 :             : #include "profile.h"
      36                 :             : #include "context.h"
      37                 :             : #include "pass_manager.h"
      38                 :             : #include "ipa-utils.h"
      39                 :             : #include "omp-offload.h"
      40                 :             : #include "omp-general.h"
      41                 :             : #include "stringpool.h"
      42                 :             : #include "attribs.h"
      43                 :             : #include "alloc-pool.h"
      44                 :             : #include "symbol-summary.h"
      45                 :             : #include "symtab-thunks.h"
      46                 :             : #include "symtab-clones.h"
      47                 :             : 
      48                 :             : /* True when asm nodes has been output.  */
      49                 :             : bool asm_nodes_output = false;
      50                 :             : 
      51                 :             : static void output_cgraph_opt_summary (void);
      52                 :             : static void input_cgraph_opt_summary (vec<symtab_node *>  nodes);
      53                 :             : 
      54                 :             : /* Number of LDPR values known to GCC.  */
      55                 :             : #define LDPR_NUM_KNOWN (LDPR_PREVAILING_DEF_IRONLY_EXP + 1)
      56                 :             : 
      57                 :             : /* Cgraph streaming is organized as set of record whose type
      58                 :             :    is indicated by a tag.  */
      59                 :             : enum LTO_symtab_tags
      60                 :             : {
      61                 :             :   /* Must leave 0 for the stopper.  */
      62                 :             : 
      63                 :             :   /* Cgraph node without body available.  */
      64                 :             :   LTO_symtab_unavail_node = 1,
      65                 :             :   /* Cgraph node with function body.  */
      66                 :             :   LTO_symtab_analyzed_node,
      67                 :             :   /* Cgraph edges.  */
      68                 :             :   LTO_symtab_edge,
      69                 :             :   LTO_symtab_indirect_edge,
      70                 :             :   LTO_symtab_variable,
      71                 :             :   LTO_symtab_indirect_function,
      72                 :             :   LTO_symtab_last_tag
      73                 :             : };
      74                 :             : 
      75                 :             : /* Create a new symtab encoder.
      76                 :             :    if FOR_INPUT, the encoder allocate only datastructures needed
      77                 :             :    to read the symtab.  */
      78                 :             : 
      79                 :             : lto_symtab_encoder_t
      80                 :       89602 : lto_symtab_encoder_new (bool for_input)
      81                 :             : {
      82                 :       89602 :   lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d);
      83                 :             : 
      84                 :       89602 :   if (!for_input)
      85                 :       66362 :     encoder->map = new hash_map<symtab_node *, size_t>;
      86                 :       89602 :   encoder->nodes.create (0);
      87                 :       89602 :   return encoder;
      88                 :             : }
      89                 :             : 
      90                 :             : 
      91                 :             : /* Delete ENCODER and its components.  */
      92                 :             : 
      93                 :             : void
      94                 :       89602 : lto_symtab_encoder_delete (lto_symtab_encoder_t encoder)
      95                 :             : {
      96                 :       89602 :    encoder->nodes.release ();
      97                 :       89602 :    if (encoder->map)
      98                 :       66362 :      delete encoder->map;
      99                 :       89602 :    if (encoder->order_remap)
     100                 :       33181 :      delete encoder->order_remap;
     101                 :       89602 :    free (encoder);
     102                 :       89602 : }
     103                 :             : 
     104                 :             : 
     105                 :             : /* Return the existing reference number of NODE in the symtab encoder in
     106                 :             :    output block OB.  Assign a new reference if this is the first time
     107                 :             :    NODE is encoded.  */
     108                 :             : 
     109                 :             : int
     110                 :     3112660 : lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
     111                 :             :                            symtab_node *node)
     112                 :             : {
     113                 :     3112660 :   int ref;
     114                 :             : 
     115                 :     3112660 :   if (!encoder->map)
     116                 :             :     {
     117                 :      260142 :       lto_encoder_entry entry (node);
     118                 :             : 
     119                 :      260142 :       ref = encoder->nodes.length ();
     120                 :      260142 :       encoder->nodes.safe_push (entry);
     121                 :      260142 :       return ref;
     122                 :             :     }
     123                 :             : 
     124                 :     2852518 :   size_t *slot = encoder->map->get (node);
     125                 :     2852518 :   if (!slot || !*slot)
     126                 :             :     {
     127                 :     1146658 :       lto_encoder_entry entry (node);
     128                 :     1146658 :       ref = encoder->nodes.length ();
     129                 :     1146658 :       if (!slot)
     130                 :     1146658 :         encoder->map->put (node, ref + 1);
     131                 :     1146658 :       encoder->nodes.safe_push (entry);
     132                 :     1146658 :     }
     133                 :             :   else
     134                 :     1705860 :     ref = *slot - 1;
     135                 :             : 
     136                 :             :   return ref;
     137                 :             : }
     138                 :             : 
     139                 :             : /* Remove NODE from encoder.  */
     140                 :             : 
     141                 :             : bool
     142                 :         224 : lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder,
     143                 :             :                                 symtab_node *node)
     144                 :             : {
     145                 :         224 :   int index;
     146                 :             : 
     147                 :         224 :   size_t *slot = encoder->map->get (node);
     148                 :         224 :   if (slot == NULL || !*slot)
     149                 :             :     return false;
     150                 :             : 
     151                 :         224 :   index = *slot - 1;
     152                 :         224 :   gcc_checking_assert (encoder->nodes[index].node == node);
     153                 :             : 
     154                 :             :   /* Remove from vector. We do this by swapping node with the last element
     155                 :             :      of the vector.  */
     156                 :         224 :   lto_encoder_entry last_node = encoder->nodes.pop ();
     157                 :         224 :   if (last_node.node != node)
     158                 :             :     {
     159                 :         223 :       bool existed = encoder->map->put (last_node.node, index + 1);
     160                 :         223 :       gcc_assert (existed);
     161                 :             : 
     162                 :             :       /* Move the last element to the original spot of NODE.  */
     163                 :         223 :       encoder->nodes[index] = last_node;
     164                 :             :     }
     165                 :             : 
     166                 :             :   /* Remove element from hash table.  */
     167                 :         224 :   encoder->map->remove (node);
     168                 :         224 :   return true;
     169                 :             : }
     170                 :             : 
     171                 :             : /* Return TRUE if the NODE and its clones are always inlined.  */
     172                 :             : 
     173                 :             : bool
     174                 :       10647 : lto_symtab_encoder_only_for_inlining_p (lto_symtab_encoder_t encoder,
     175                 :             :                                         struct cgraph_node *node)
     176                 :             : {
     177                 :       10647 :   int index = lto_symtab_encoder_lookup (encoder, node);
     178                 :       10647 :   return encoder->nodes[index].only_for_inlining;
     179                 :             : }
     180                 :             : 
     181                 :             : /* Return TRUE if we should encode the body of NODE (if any).  */
     182                 :             : 
     183                 :             : bool
     184                 :      450357 : lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t encoder,
     185                 :             :                                   struct cgraph_node *node)
     186                 :             : {
     187                 :      450357 :   int index = lto_symtab_encoder_lookup (encoder, node);
     188                 :      450357 :   return encoder->nodes[index].body;
     189                 :             : }
     190                 :             : 
     191                 :             : /* Return TRUE if we should encode initializer of NODE (if any).  */
     192                 :             : 
     193                 :             : bool
     194                 :      656821 : lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t encoder,
     195                 :             :                                          varpool_node *node)
     196                 :             : {
     197                 :      656821 :   int index = lto_symtab_encoder_lookup (encoder, node);
     198                 :      656821 :   if (index == LCC_NOT_FOUND)
     199                 :             :     return false;
     200                 :      656797 :   return encoder->nodes[index].initializer;
     201                 :             : }
     202                 :             : 
     203                 :             : /* Specify that we should encode initializer of NODE (if any).  */
     204                 :             : 
     205                 :             : static void
     206                 :      278794 : lto_set_symtab_encoder_encode_initializer (lto_symtab_encoder_t encoder,
     207                 :             :                                            varpool_node *node)
     208                 :             : {
     209                 :      278794 :   int index = lto_symtab_encoder_lookup (encoder, node);
     210                 :      278794 :   encoder->nodes[index].initializer = true;
     211                 :      278794 : }
     212                 :             : 
     213                 :             : /* Return TRUE if NODE is in this partition.  */
     214                 :             : 
     215                 :             : bool
     216                 :     8521504 : lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t encoder,
     217                 :             :                                    symtab_node *node)
     218                 :             : {
     219                 :     8521504 :   int index = lto_symtab_encoder_lookup (encoder, node);
     220                 :     8521504 :   if (index == LCC_NOT_FOUND)
     221                 :             :     return false;
     222                 :     8382296 :   return encoder->nodes[index].in_partition;
     223                 :             : }
     224                 :             : 
     225                 :             : /* Specify that NODE is in this partition.  */
     226                 :             : 
     227                 :             : void
     228                 :      896490 : lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t encoder,
     229                 :             :                                      symtab_node *node)
     230                 :             : {
     231                 :      896490 :   int index = lto_symtab_encoder_encode (encoder, node);
     232                 :      896490 :   encoder->nodes[index].in_partition = true;
     233                 :      896490 : }
     234                 :             : 
     235                 :             : /* Output the cgraph EDGE to OB using ENCODER.  */
     236                 :             : 
     237                 :             : static void
     238                 :      618925 : lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge,
     239                 :             :                  lto_symtab_encoder_t encoder)
     240                 :             : {
     241                 :      618925 :   unsigned int uid;
     242                 :      618925 :   intptr_t ref;
     243                 :      618925 :   struct bitpack_d bp;
     244                 :             : 
     245                 :      618925 :   if (edge->indirect_unknown_callee)
     246                 :        2480 :     streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
     247                 :             :                          LTO_symtab_indirect_edge);
     248                 :             :   else
     249                 :      616445 :     streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
     250                 :             :                          LTO_symtab_edge);
     251                 :             : 
     252                 :      618925 :   ref = lto_symtab_encoder_lookup (encoder, edge->caller);
     253                 :      618925 :   gcc_assert (ref != LCC_NOT_FOUND);
     254                 :      618925 :   streamer_write_hwi_stream (ob->main_stream, ref);
     255                 :             : 
     256                 :      618925 :   if (!edge->indirect_unknown_callee)
     257                 :             :     {
     258                 :      616445 :       ref = lto_symtab_encoder_lookup (encoder, edge->callee);
     259                 :      616445 :       gcc_assert (ref != LCC_NOT_FOUND);
     260                 :      616445 :       streamer_write_hwi_stream (ob->main_stream, ref);
     261                 :             :     }
     262                 :             : 
     263                 :      618925 :   edge->count.stream_out (ob->main_stream);
     264                 :             : 
     265                 :      618925 :   bp = bitpack_create (ob->main_stream);
     266                 :      618925 :   uid = !edge->call_stmt ? edge->lto_stmt_uid
     267                 :      379097 :                          : gimple_uid (edge->call_stmt) + 1;
     268                 :      618925 :   bp_pack_enum (&bp, cgraph_inline_failed_t,
     269                 :             :                 CIF_N_REASONS, edge->inline_failed);
     270                 :      618925 :   gcc_checking_assert (uid || edge->caller->thunk);
     271                 :      618925 :   bp_pack_var_len_unsigned (&bp, uid);
     272                 :      618925 :   bp_pack_value (&bp, edge->speculative_id, 16);
     273                 :      618925 :   bp_pack_value (&bp, edge->indirect_inlining_edge, 1);
     274                 :      618925 :   bp_pack_value (&bp, edge->speculative, 1);
     275                 :      618925 :   bp_pack_value (&bp, edge->call_stmt_cannot_inline_p, 1);
     276                 :      618925 :   gcc_assert (!edge->call_stmt_cannot_inline_p
     277                 :             :               || edge->inline_failed != CIF_BODY_NOT_AVAILABLE);
     278                 :      618925 :   bp_pack_value (&bp, edge->can_throw_external, 1);
     279                 :      618925 :   bp_pack_value (&bp, edge->in_polymorphic_cdtor, 1);
     280                 :      618925 :   if (edge->indirect_unknown_callee)
     281                 :             :     {
     282                 :        2480 :       int flags = edge->indirect_info->ecf_flags;
     283                 :        2480 :       bp_pack_value (&bp, (flags & ECF_CONST) != 0, 1);
     284                 :        2480 :       bp_pack_value (&bp, (flags & ECF_PURE) != 0, 1);
     285                 :        2480 :       bp_pack_value (&bp, (flags & ECF_NORETURN) != 0, 1);
     286                 :        2480 :       bp_pack_value (&bp, (flags & ECF_MALLOC) != 0, 1);
     287                 :        2480 :       bp_pack_value (&bp, (flags & ECF_NOTHROW) != 0, 1);
     288                 :        2480 :       bp_pack_value (&bp, (flags & ECF_RETURNS_TWICE) != 0, 1);
     289                 :             :       /* Flags that should not appear on indirect calls.  */
     290                 :        2480 :       gcc_assert (!(flags & (ECF_LOOPING_CONST_OR_PURE
     291                 :             :                              | ECF_MAY_BE_ALLOCA
     292                 :             :                              | ECF_SIBCALL
     293                 :             :                              | ECF_LEAF
     294                 :             :                              | ECF_NOVOPS)));
     295                 :             : 
     296                 :        2480 :       bp_pack_value (&bp, edge->indirect_info->num_speculative_call_targets,
     297                 :             :                      16);
     298                 :             :     }
     299                 :      618925 :   streamer_write_bitpack (&bp);
     300                 :      618925 : }
     301                 :             : 
     302                 :             : /* Return if NODE contain references from other partitions.  */
     303                 :             : 
     304                 :             : bool
     305                 :      413826 : referenced_from_other_partition_p (symtab_node *node, lto_symtab_encoder_t encoder)
     306                 :             : {
     307                 :      413826 :   int i;
     308                 :      413826 :   struct ipa_ref *ref = NULL;
     309                 :             : 
     310                 :      857683 :   for (i = 0; node->iterate_referring (i, ref); i++)
     311                 :             :     {
     312                 :             :       /* Ignore references from non-offloadable nodes while streaming NODE into
     313                 :             :          offload LTO section.  */
     314                 :      444156 :       if (!ref->referring->need_lto_streaming)
     315                 :           0 :         continue;
     316                 :             : 
     317                 :      444156 :       if (ref->referring->in_other_partition
     318                 :      444156 :           || !lto_symtab_encoder_in_partition_p (encoder, ref->referring))
     319                 :         299 :         return true;
     320                 :             :     }
     321                 :             :   return false;
     322                 :             : }
     323                 :             : 
     324                 :             : /* Return true when node is reachable from other partition.  */
     325                 :             : 
     326                 :             : bool
     327                 :      137681 : reachable_from_other_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder)
     328                 :             : {
     329                 :      137681 :   struct cgraph_edge *e;
     330                 :      137681 :   if (!node->definition)
     331                 :             :     return false;
     332                 :      137681 :   if (node->inlined_to)
     333                 :             :     return false;
     334                 :      401617 :   for (e = node->callers; e; e = e->next_caller)
     335                 :             :     {
     336                 :             :       /* Ignore references from non-offloadable nodes while streaming NODE into
     337                 :             :          offload LTO section.  */
     338                 :      264044 :       if (!e->caller->need_lto_streaming)
     339                 :           0 :         continue;
     340                 :             : 
     341                 :      264044 :       if (e->caller->in_other_partition
     342                 :      264044 :           || !lto_symtab_encoder_in_partition_p (encoder, e->caller))
     343                 :         108 :         return true;
     344                 :             :     }
     345                 :             :   return false;
     346                 :             : }
     347                 :             : 
     348                 :             : /* Return if NODE contain references from other partitions.  */
     349                 :             : 
     350                 :             : bool
     351                 :        5921 : referenced_from_this_partition_p (symtab_node *node,
     352                 :             :                                   lto_symtab_encoder_t encoder)
     353                 :             : {
     354                 :        5921 :   int i;
     355                 :        5921 :   struct ipa_ref *ref = NULL;
     356                 :             : 
     357                 :        5947 :   for (i = 0; node->iterate_referring (i, ref); i++)
     358                 :        4489 :     if (lto_symtab_encoder_in_partition_p (encoder, ref->referring))
     359                 :             :       return true;
     360                 :             :   return false;
     361                 :             : }
     362                 :             : 
     363                 :             : /* Return true when node is reachable from other partition.  */
     364                 :             : 
     365                 :             : bool
     366                 :        7968 : reachable_from_this_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder)
     367                 :             : {
     368                 :        7968 :   struct cgraph_edge *e;
     369                 :        7970 :   for (e = node->callers; e; e = e->next_caller)
     370                 :        5584 :     if (lto_symtab_encoder_in_partition_p (encoder, e->caller))
     371                 :             :       return true;
     372                 :             :   return false;
     373                 :             : }
     374                 :             : 
     375                 :             : /* Output the cgraph NODE to OB.  ENCODER is used to find the
     376                 :             :    reference number of NODE->inlined_to.  SET is the set of nodes we
     377                 :             :    are writing to the current file.  If NODE is not in SET, then NODE
     378                 :             :    is a boundary of a cgraph_node_set and we pretend NODE just has a
     379                 :             :    decl and no callees.  WRITTEN_DECLS is the set of FUNCTION_DECLs
     380                 :             :    that have had their callgraph node written so far.  This is used to
     381                 :             :    determine if NODE is a clone of a previously written node.  */
     382                 :             : 
     383                 :             : static void
     384                 :      416528 : lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
     385                 :             :                  lto_symtab_encoder_t encoder)
     386                 :             : {
     387                 :      416528 :   unsigned int tag;
     388                 :      416528 :   struct bitpack_d bp;
     389                 :      416528 :   bool boundary_p;
     390                 :      416528 :   intptr_t ref;
     391                 :      416528 :   bool in_other_partition = false;
     392                 :      416528 :   struct cgraph_node *clone_of, *ultimate_clone_of;
     393                 :      416528 :   ipa_opt_pass_d *pass;
     394                 :      416528 :   int i;
     395                 :      416528 :   const char *comdat;
     396                 :      416528 :   const char *section;
     397                 :      416528 :   tree group;
     398                 :             : 
     399                 :      416528 :   boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node);
     400                 :             : 
     401                 :      416528 :   if (node->analyzed && (!boundary_p || node->alias
     402                 :         217 :                          || (node->thunk && !node->inlined_to)))
     403                 :             :     tag = LTO_symtab_analyzed_node;
     404                 :             :   else
     405                 :      416528 :     tag = LTO_symtab_unavail_node;
     406                 :             : 
     407                 :      416528 :   streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
     408                 :             :                        tag);
     409                 :      416528 :   int output_order = *encoder->order_remap->get (node->order);
     410                 :      416528 :   streamer_write_hwi_stream (ob->main_stream, output_order);
     411                 :             : 
     412                 :             :   /* In WPA mode, we only output part of the call-graph.  Also, we
     413                 :             :      fake cgraph node attributes.  There are two cases that we care.
     414                 :             : 
     415                 :             :      Boundary nodes: There are nodes that are not part of SET but are
     416                 :             :      called from within SET.  We artificially make them look like
     417                 :             :      externally visible nodes with no function body.
     418                 :             : 
     419                 :             :      Cherry-picked nodes:  These are nodes we pulled from other
     420                 :             :      translation units into SET during IPA-inlining.  We make them as
     421                 :             :      local static nodes to prevent clashes with other local statics.  */
     422                 :      248284 :   if (boundary_p && node->analyzed
     423                 :      416765 :       && node->get_partitioning_class () == SYMBOL_PARTITION)
     424                 :             :     {
     425                 :             :       /* Inline clones cannot be part of boundary.
     426                 :             :          gcc_assert (!node->inlined_to);
     427                 :             : 
     428                 :             :          FIXME: At the moment they can be, when partition contains an inline
     429                 :             :          clone that is clone of inline clone from outside partition.  We can
     430                 :             :          reshape the clone tree and make other tree to be the root, but it
     431                 :             :          needs a bit extra work and will be promplty done by cgraph_remove_node
     432                 :             :          after reading back.  */
     433                 :             :       in_other_partition = 1;
     434                 :             :     }
     435                 :      416307 :   else if (UNLIKELY (lto_stream_offload_p
     436                 :             :                      && lookup_attribute ("omp target device_ancestor_host",
     437                 :             :                                           DECL_ATTRIBUTES (node->decl))))
     438                 :             :     /* This symbol is only used as argument to IFN_GOMP_TARGET_REV; this IFN
     439                 :             :        is ignored on ACCEL_COMPILER.  Thus, mark it as in_other_partition to silence
     440                 :             :        verify_node_partition diagnostic.  */
     441                 :             :     in_other_partition = 1;
     442                 :             : 
     443                 :      416528 :   clone_of = node->clone_of;
     444                 :      416528 :   while (clone_of
     445                 :      416528 :          && (ref = lto_symtab_encoder_lookup (encoder, clone_of)) == LCC_NOT_FOUND)
     446                 :           0 :     if (clone_of->prev_sibling_clone)
     447                 :             :       clone_of = clone_of->prev_sibling_clone;
     448                 :             :     else
     449                 :           0 :       clone_of = clone_of->clone_of;
     450                 :             : 
     451                 :             :   /* See if body of the master function is output.  If not, we are seeing only
     452                 :             :      an declaration and we do not need to pass down clone tree. */
     453                 :      416528 :   ultimate_clone_of = clone_of;
     454                 :      425352 :   while (ultimate_clone_of && ultimate_clone_of->clone_of)
     455                 :             :     ultimate_clone_of = ultimate_clone_of->clone_of;
     456                 :             : 
     457                 :      416528 :   if (clone_of && !lto_symtab_encoder_encode_body_p (encoder, ultimate_clone_of))
     458                 :             :     clone_of = NULL;
     459                 :             : 
     460                 :      416528 :   if (tag == LTO_symtab_analyzed_node)
     461                 :      168266 :     gcc_assert (clone_of || !node->clone_of);
     462                 :      394479 :   if (!clone_of)
     463                 :      394061 :     streamer_write_hwi_stream (ob->main_stream, LCC_NOT_FOUND);
     464                 :             :   else
     465                 :       22467 :     streamer_write_hwi_stream (ob->main_stream, ref);
     466                 :             : 
     467                 :             : 
     468                 :      416528 :   lto_output_fn_decl_ref (ob->decl_state, ob->main_stream, node->decl);
     469                 :      416528 :   node->count.stream_out (ob->main_stream);
     470                 :      416528 :   streamer_write_hwi_stream (ob->main_stream, node->count_materialization_scale);
     471                 :             : 
     472                 :      833056 :   streamer_write_hwi_stream (ob->main_stream,
     473                 :      416528 :                              node->ipa_transforms_to_apply.length ());
     474                 :      900047 :   FOR_EACH_VEC_ELT (node->ipa_transforms_to_apply, i, pass)
     475                 :       66991 :     streamer_write_hwi_stream (ob->main_stream, pass->static_pass_number);
     476                 :             : 
     477                 :      416528 :   if (tag == LTO_symtab_analyzed_node)
     478                 :             :     {
     479                 :      168266 :       if (node->inlined_to)
     480                 :             :         {
     481                 :       21692 :           ref = lto_symtab_encoder_lookup (encoder, node->inlined_to);
     482                 :       21692 :           gcc_assert (ref != LCC_NOT_FOUND);
     483                 :             :         }
     484                 :             :       else
     485                 :             :         ref = LCC_NOT_FOUND;
     486                 :             : 
     487                 :      168266 :       streamer_write_hwi_stream (ob->main_stream, ref);
     488                 :             :     }
     489                 :             : 
     490                 :      416528 :   group = node->get_comdat_group ();
     491                 :      416528 :   if (group)
     492                 :        8975 :     comdat = IDENTIFIER_POINTER (group);
     493                 :             :   else
     494                 :             :     comdat = "";
     495                 :      416528 :   streamer_write_data_stream (ob->main_stream, comdat, strlen (comdat) + 1);
     496                 :             : 
     497                 :      416528 :   if (group)
     498                 :             :     {
     499                 :        8975 :       if (node->same_comdat_group)
     500                 :             :         {
     501                 :             :           ref = LCC_NOT_FOUND;
     502                 :        4522 :           for (struct symtab_node *n = node->same_comdat_group;
     503                 :        9043 :                ref == LCC_NOT_FOUND && n != node; n = n->same_comdat_group)
     504                 :        4522 :             ref = lto_symtab_encoder_lookup (encoder, n);
     505                 :             :         }
     506                 :             :       else
     507                 :             :         ref = LCC_NOT_FOUND;
     508                 :        8975 :       streamer_write_hwi_stream (ob->main_stream, ref);
     509                 :             :     }
     510                 :             : 
     511                 :      416528 :   section = node->get_section ();
     512                 :         318 :   if (!section)
     513                 :      416210 :     section = "";
     514                 :             : 
     515                 :      416528 :   streamer_write_hwi_stream (ob->main_stream, node->tp_first_run);
     516                 :             : 
     517                 :      416528 :   bp = bitpack_create (ob->main_stream);
     518                 :      416528 :   bp_pack_value (&bp, node->local, 1);
     519                 :      416528 :   bp_pack_value (&bp, node->externally_visible, 1);
     520                 :      416528 :   bp_pack_value (&bp, node->no_reorder, 1);
     521                 :      416528 :   bp_pack_value (&bp, node->definition, 1);
     522                 :      416528 :   bp_pack_value (&bp, node->versionable, 1);
     523                 :      416528 :   bp_pack_value (&bp, node->can_change_signature, 1);
     524                 :      416528 :   bp_pack_value (&bp, node->redefined_extern_inline, 1);
     525                 :      416528 :   bp_pack_value (&bp, node->force_output, 1);
     526                 :      416528 :   bp_pack_value (&bp, node->forced_by_abi, 1);
     527                 :      416528 :   bp_pack_value (&bp, node->unique_name, 1);
     528                 :      416528 :   bp_pack_value (&bp, node->body_removed, 1);
     529                 :      416528 :   bp_pack_value (&bp, node->semantic_interposition, 1);
     530                 :      416528 :   bp_pack_value (&bp, node->implicit_section, 1);
     531                 :      416528 :   bp_pack_value (&bp, node->address_taken, 1);
     532                 :      416528 :   bp_pack_value (&bp, tag == LTO_symtab_analyzed_node
     533                 :      168266 :                  && node->get_partitioning_class () == SYMBOL_PARTITION
     534                 :      554209 :                  && (reachable_from_other_partition_p (node, encoder)
     535                 :      137573 :                      || referenced_from_other_partition_p (node, encoder)), 1);
     536                 :      416528 :   bp_pack_value (&bp, node->lowered, 1);
     537                 :      416528 :   bp_pack_value (&bp, in_other_partition, 1);
     538                 :      416528 :   bp_pack_value (&bp, node->alias, 1);
     539                 :      416528 :   bp_pack_value (&bp, node->transparent_alias, 1);
     540                 :      416528 :   bp_pack_value (&bp, node->weakref, 1);
     541                 :      416528 :   bp_pack_value (&bp, node->symver, 1);
     542                 :      416528 :   bp_pack_value (&bp, node->frequency, 2);
     543                 :      416528 :   bp_pack_value (&bp, node->only_called_at_startup, 1);
     544                 :      416528 :   bp_pack_value (&bp, node->only_called_at_exit, 1);
     545                 :      416528 :   bp_pack_value (&bp, node->tm_clone, 1);
     546                 :      416528 :   bp_pack_value (&bp, node->calls_comdat_local, 1);
     547                 :      416528 :   bp_pack_value (&bp, node->icf_merged, 1);
     548                 :      416528 :   bp_pack_value (&bp, node->nonfreeing_fn, 1);
     549                 :      416528 :   bp_pack_value (&bp, node->merged_comdat, 1);
     550                 :      416528 :   bp_pack_value (&bp, node->merged_extern_inline, 1);
     551                 :      416528 :   bp_pack_value (&bp, node->thunk, 1);
     552                 :      416528 :   bp_pack_value (&bp, node->parallelized_function, 1);
     553                 :      416528 :   bp_pack_value (&bp, node->declare_variant_alt, 1);
     554                 :      416528 :   bp_pack_value (&bp, node->calls_declare_variant_alt, 1);
     555                 :             : 
     556                 :             :   /* Stream thunk info always because we use it in
     557                 :             :      ipa_polymorphic_call_context::ipa_polymorphic_call_context
     558                 :             :      to properly interpret THIS pointers for thunks that has been converted
     559                 :             :      to Gimple.  */
     560                 :      416528 :   struct thunk_info *thunk = node->definition ? thunk_info::get (node) : NULL;
     561                 :             : 
     562                 :      416528 :   bp_pack_value (&bp, thunk != NULL, 1);
     563                 :             : 
     564                 :      416528 :   bp_pack_enum (&bp, ld_plugin_symbol_resolution,
     565                 :             :                 LDPR_NUM_KNOWN,
     566                 :             :                 /* When doing incremental link, we will get new resolution
     567                 :             :                    info next time we process the file.  */
     568                 :             :                 flag_incremental_link == INCREMENTAL_LINK_LTO
     569                 :             :                 ? LDPR_UNKNOWN : node->resolution);
     570                 :      416528 :   bp_pack_value (&bp, node->split_part, 1);
     571                 :      416528 :   streamer_write_bitpack (&bp);
     572                 :      416528 :   streamer_write_data_stream (ob->main_stream, section, strlen (section) + 1);
     573                 :             : 
     574                 :      416528 :   streamer_write_hwi_stream (ob->main_stream, node->profile_id);
     575                 :      416528 :   streamer_write_hwi_stream (ob->main_stream, node->unit_id);
     576                 :      416528 :   if (DECL_STATIC_CONSTRUCTOR (node->decl))
     577                 :         233 :     streamer_write_hwi_stream (ob->main_stream, node->get_init_priority ());
     578                 :      416528 :   if (DECL_STATIC_DESTRUCTOR (node->decl))
     579                 :          67 :     streamer_write_hwi_stream (ob->main_stream, node->get_fini_priority ());
     580                 :             : 
     581                 :      416528 :   if (thunk)
     582                 :         221 :     thunk_info::get (node)->stream_out (ob);
     583                 :      416528 : }
     584                 :             : 
     585                 :             : /* Output the varpool NODE to OB.
     586                 :             :    If NODE is not in SET, then NODE is a boundary.  */
     587                 :             : 
     588                 :             : static void
     589                 :      283014 : lto_output_varpool_node (struct lto_simple_output_block *ob, varpool_node *node,
     590                 :             :                          lto_symtab_encoder_t encoder)
     591                 :             : {
     592                 :      283014 :   bool boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node);
     593                 :      283014 :   bool encode_initializer_p
     594                 :      283014 :          = (node->definition
     595                 :      283014 :             && lto_symtab_encoder_encode_initializer_p (encoder, node));
     596                 :      278668 :   struct bitpack_d bp;
     597                 :      278668 :   int ref;
     598                 :      278668 :   const char *comdat;
     599                 :      278668 :   const char *section;
     600                 :      278668 :   tree group;
     601                 :             : 
     602                 :      278668 :   gcc_assert (!encode_initializer_p || node->definition);
     603                 :      283014 :   gcc_assert (boundary_p || encode_initializer_p);
     604                 :             : 
     605                 :      283014 :   streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
     606                 :             :                        LTO_symtab_variable);
     607                 :      283014 :   int output_order = *encoder->order_remap->get (node->order);
     608                 :      283014 :   streamer_write_hwi_stream (ob->main_stream, output_order);
     609                 :      283014 :   lto_output_var_decl_ref (ob->decl_state, ob->main_stream, node->decl);
     610                 :      283014 :   bp = bitpack_create (ob->main_stream);
     611                 :      283014 :   bp_pack_value (&bp, node->externally_visible, 1);
     612                 :      283014 :   bp_pack_value (&bp, node->no_reorder, 1);
     613                 :      283014 :   bp_pack_value (&bp, node->force_output, 1);
     614                 :      283014 :   bp_pack_value (&bp, node->forced_by_abi, 1);
     615                 :      283014 :   bp_pack_value (&bp, node->unique_name, 1);
     616                 :      283014 :   bp_pack_value (&bp,
     617                 :      283014 :                  node->body_removed
     618                 :      283014 :                  || (!encode_initializer_p && !node->alias && node->definition),
     619                 :             :                  1);
     620                 :      283014 :   bp_pack_value (&bp, node->semantic_interposition, 1);
     621                 :      283014 :   bp_pack_value (&bp, node->implicit_section, 1);
     622                 :      283014 :   bp_pack_value (&bp, node->writeonly, 1);
     623                 :      561683 :   bp_pack_value (&bp, node->definition && (encode_initializer_p || node->alias),
     624                 :             :                  1);
     625                 :      283014 :   bp_pack_value (&bp, node->alias, 1);
     626                 :      283014 :   bp_pack_value (&bp, node->transparent_alias, 1);
     627                 :      283014 :   bp_pack_value (&bp, node->weakref, 1);
     628                 :      283014 :   bp_pack_value (&bp, node->symver, 1);
     629                 :      561663 :   bp_pack_value (&bp, node->analyzed && (!boundary_p || node->alias), 1);
     630                 :      283014 :   gcc_assert (node->definition || !node->analyzed);
     631                 :             :   /* Constant pool initializers can be de-unified into individual ltrans units.
     632                 :             :      FIXME: Alternatively at -Os we may want to avoid generating for them the local
     633                 :             :      labels and share them across LTRANS partitions.  */
     634                 :      283014 :   if (node->get_partitioning_class () != SYMBOL_PARTITION)
     635                 :             :     {
     636                 :        6761 :       bp_pack_value (&bp, 0, 1);  /* used_from_other_parition.  */
     637                 :        6761 :       bp_pack_value (&bp, 0, 1);  /* in_other_partition.  */
     638                 :             :     }
     639                 :             :   else
     640                 :             :     {
     641                 :      276253 :       bp_pack_value (&bp, node->definition
     642                 :      276253 :                      && referenced_from_other_partition_p (node, encoder), 1);
     643                 :      276253 :       bp_pack_value (&bp, node->analyzed
     644                 :      276253 :                      && boundary_p && !DECL_EXTERNAL (node->decl), 1);
     645                 :             :           /* in_other_partition.  */
     646                 :             :     }
     647                 :      283014 :   bp_pack_value (&bp, node->tls_model, 3);
     648                 :      283014 :   bp_pack_value (&bp, node->used_by_single_function, 1);
     649                 :      283014 :   bp_pack_value (&bp, node->dynamically_initialized, 1);
     650                 :      283014 :   streamer_write_bitpack (&bp);
     651                 :             : 
     652                 :      283014 :   group = node->get_comdat_group ();
     653                 :      283014 :   if (group)
     654                 :        3211 :     comdat = IDENTIFIER_POINTER (group);
     655                 :             :   else
     656                 :             :     comdat = "";
     657                 :      283014 :   streamer_write_data_stream (ob->main_stream, comdat, strlen (comdat) + 1);
     658                 :             : 
     659                 :      283014 :   if (group)
     660                 :             :     {
     661                 :        3211 :       if (node->same_comdat_group)
     662                 :             :         {
     663                 :             :           ref = LCC_NOT_FOUND;
     664                 :         370 :           for (struct symtab_node *n = node->same_comdat_group;
     665                 :         740 :                ref == LCC_NOT_FOUND && n != node; n = n->same_comdat_group)
     666                 :         370 :             ref = lto_symtab_encoder_lookup (encoder, n);
     667                 :             :         }
     668                 :             :       else
     669                 :             :         ref = LCC_NOT_FOUND;
     670                 :        3211 :       streamer_write_hwi_stream (ob->main_stream, ref);
     671                 :             :     }
     672                 :             : 
     673                 :      283014 :   section = node->get_section ();
     674                 :        2344 :   if (!section)
     675                 :      280670 :     section = "";
     676                 :      283014 :   streamer_write_data_stream (ob->main_stream, section, strlen (section) + 1);
     677                 :             : 
     678                 :      283014 :   streamer_write_enum (ob->main_stream, ld_plugin_symbol_resolution,
     679                 :             :                        LDPR_NUM_KNOWN, node->resolution);
     680                 :      283014 : }
     681                 :             : 
     682                 :             : /* Output the varpool NODE to OB.
     683                 :             :    If NODE is not in SET, then NODE is a boundary.  */
     684                 :             : 
     685                 :             : static void
     686                 :      669346 : lto_output_ref (struct lto_simple_output_block *ob, struct ipa_ref *ref,
     687                 :             :                 lto_symtab_encoder_t encoder)
     688                 :             : {
     689                 :      669346 :   struct bitpack_d bp;
     690                 :      669346 :   int nref;
     691                 :      669346 :   int uid = !ref->stmt ? ref->lto_stmt_uid : gimple_uid (ref->stmt) + 1;
     692                 :      669346 :   struct cgraph_node *node;
     693                 :             : 
     694                 :      669346 :   bp = bitpack_create (ob->main_stream);
     695                 :      669346 :   bp_pack_value (&bp, ref->use, 3);
     696                 :      669346 :   bp_pack_value (&bp, ref->speculative, 1);
     697                 :      669346 :   streamer_write_bitpack (&bp);
     698                 :      669346 :   nref = lto_symtab_encoder_lookup (encoder, ref->referred);
     699                 :      669346 :   gcc_assert (nref != LCC_NOT_FOUND);
     700                 :      669346 :   streamer_write_hwi_stream (ob->main_stream, nref);
     701                 :             : 
     702                 :      669346 :   node = dyn_cast <cgraph_node *> (ref->referring);
     703                 :      444274 :   if (node)
     704                 :             :     {
     705                 :      444274 :       if (ref->stmt)
     706                 :      260257 :         uid = gimple_uid (ref->stmt) + 1;
     707                 :      444274 :       streamer_write_hwi_stream (ob->main_stream, uid);
     708                 :      444274 :       bp_pack_value (&bp, ref->speculative_id, 16);
     709                 :      444274 :       streamer_write_bitpack (&bp);
     710                 :             :     }
     711                 :      669346 : }
     712                 :             : 
     713                 :             : /* Stream out profile_summary to OB.  */
     714                 :             : 
     715                 :             : static void
     716                 :       33181 : output_profile_summary (struct lto_simple_output_block *ob)
     717                 :             : {
     718                 :       33181 :   if (profile_info)
     719                 :             :     {
     720                 :             :       /* We do not output num and run_max, they are not used by
     721                 :             :          GCC profile feedback and they are difficult to merge from multiple
     722                 :             :          units.  */
     723                 :          11 :       unsigned runs = (profile_info->runs);
     724                 :          11 :       streamer_write_uhwi_stream (ob->main_stream, runs);
     725                 :             : 
     726                 :             :       /* IPA-profile computes hot bb threshold based on cumulated
     727                 :             :          whole program profile.  We need to stream it down to ltrans.  */
     728                 :          11 :        if (flag_wpa)
     729                 :           4 :          streamer_write_gcov_count_stream (ob->main_stream,
     730                 :             :                                            get_hot_bb_threshold ());
     731                 :             :     }
     732                 :             :   else
     733                 :       33170 :     streamer_write_uhwi_stream (ob->main_stream, 0);
     734                 :       33181 : }
     735                 :             : 
     736                 :             : /* Output all callees or indirect outgoing edges.  EDGE must be the first such
     737                 :             :    edge.  */
     738                 :             : 
     739                 :             : static void
     740                 :      336496 : output_outgoing_cgraph_edges (struct cgraph_edge *edge,
     741                 :             :                               struct lto_simple_output_block *ob,
     742                 :             :                               lto_symtab_encoder_t encoder)
     743                 :             : {
     744                 :      336496 :   if (!edge)
     745                 :             :     return;
     746                 :             : 
     747                 :             :   /* Output edges in backward direction, so the reconstructed callgraph match
     748                 :             :      and it is easy to associate call sites in the IPA pass summaries.  */
     749                 :      618925 :   while (edge->next_callee)
     750                 :             :     edge = edge->next_callee;
     751                 :      725681 :   for (; edge; edge = edge->prev_callee)
     752                 :      618925 :     lto_output_edge (ob, edge, encoder);
     753                 :             : }
     754                 :             : 
     755                 :             : /* Output the part of the cgraph in SET.  */
     756                 :             : 
     757                 :             : static void
     758                 :       33181 : output_refs (lto_symtab_encoder_t encoder)
     759                 :             : {
     760                 :       33181 :   struct lto_simple_output_block *ob;
     761                 :       33181 :   int count;
     762                 :       33181 :   struct ipa_ref *ref;
     763                 :             : 
     764                 :       33181 :   ob = lto_create_simple_output_block (LTO_section_refs);
     765                 :             : 
     766                 :     1465208 :   for (int i = 0; i < lto_symtab_encoder_size (encoder); i++)
     767                 :             :     {
     768                 :      699542 :       symtab_node *node = lto_symtab_encoder_deref (encoder, i);
     769                 :             : 
     770                 :             :       /* IPA_REF_ALIAS references are always preserved
     771                 :             :          in the boundary.  Alias node can't have other references and
     772                 :             :          can be always handled as if it's not in the boundary.  */
     773                 :      699542 :       if (!node->alias && !lto_symtab_encoder_in_partition_p (encoder, node))
     774                 :      252589 :         continue;
     775                 :             : 
     776                 :      446953 :       count = node->ref_list.nreferences ();
     777                 :       68576 :       if (count)
     778                 :             :         {
     779                 :       68563 :           streamer_write_gcov_count_stream (ob->main_stream, count);
     780                 :      137126 :           streamer_write_uhwi_stream (ob->main_stream,
     781                 :       68563 :                                      lto_symtab_encoder_lookup (encoder, node));
     782                 :     1184862 :           for (int i = 0; node->iterate_reference (i, ref); i++)
     783                 :      669346 :             lto_output_ref (ob, ref, encoder);
     784                 :             :         }
     785                 :      867842 :       if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node))
     786                 :      168300 :         if (cnode->declare_variant_alt)
     787                 :           2 :           omp_lto_output_declare_variant_alt (ob, cnode, encoder);
     788                 :             :     }
     789                 :             : 
     790                 :       33181 :   streamer_write_uhwi_stream (ob->main_stream, 0);
     791                 :             : 
     792                 :       33181 :   lto_destroy_simple_output_block (ob);
     793                 :       33181 : }
     794                 :             : 
     795                 :             : /* Add NODE into encoder as well as nodes it is cloned from.
     796                 :             :    Do it in a way so clones appear first.  */
     797                 :             : 
     798                 :             : static void
     799                 :      758198 : add_node_to (lto_symtab_encoder_t encoder, struct cgraph_node *node,
     800                 :             :              bool include_body, bool not_inlined)
     801                 :             : {
     802                 :      758198 :   if (node->clone_of)
     803                 :       30879 :     add_node_to (encoder, node->clone_of, include_body, not_inlined);
     804                 :             : 
     805                 :      758198 :   int index = lto_symtab_encoder_encode (encoder, node);
     806                 :      758198 :   gcc_checking_assert (encoder->nodes[index].node == node);
     807                 :             : 
     808                 :      758198 :   if (include_body)
     809                 :      199117 :     encoder->nodes[index].body = true;
     810                 :      758198 :   if (not_inlined)
     811                 :      148523 :     encoder->nodes[index].only_for_inlining = false;
     812                 :      758198 : }
     813                 :             : 
     814                 :             : /* Add NODE into encoder as well as nodes it is cloned from.
     815                 :             :    Do it in a way so clones appear first.  */
     816                 :             : 
     817                 :             : static void
     818                 :      727319 : add_node_to (lto_symtab_encoder_t encoder, struct cgraph_node *node,
     819                 :             :              bool include_body)
     820                 :             : {
     821                 :     1308086 :   add_node_to (encoder, node, include_body, include_body && !node->inlined_to);
     822                 :      727319 : }
     823                 :             : 
     824                 :             : /* Add all references in NODE to encoders.  */
     825                 :             : 
     826                 :             : static void
     827                 :      459853 : create_references (lto_symtab_encoder_t encoder, symtab_node *node)
     828                 :             : {
     829                 :      459853 :   int i;
     830                 :      459853 :   struct ipa_ref *ref = NULL;
     831                 :     1142013 :   for (i = 0; node->iterate_reference (i, ref); i++)
     832                 :      682160 :     if (is_a <cgraph_node *> (ref->referred))
     833                 :      238918 :       add_node_to (encoder, dyn_cast <cgraph_node *> (ref->referred), false);
     834                 :             :     else
     835                 :      443242 :       lto_symtab_encoder_encode (encoder, ref->referred);
     836                 :      459853 : }
     837                 :             : 
     838                 :             : /* Select what needs to be streamed out.  In regular lto mode stream everything.
     839                 :             :    In offload lto mode stream only nodes marked as offloadable.  */
     840                 :             : void
     841                 :       32824 : select_what_to_stream (void)
     842                 :             : {
     843                 :       32824 :   struct symtab_node *snode;
     844                 :      731877 :   FOR_EACH_SYMBOL (snode)
     845                 :     1398106 :     snode->need_lto_streaming = !lto_stream_offload_p || snode->offloadable;
     846                 :       32824 : }
     847                 :             : 
     848                 :             : /* Find all symbols we want to stream into given partition and insert them
     849                 :             :    to encoders.
     850                 :             : 
     851                 :             :    The function actually replaces IN_ENCODER by new one.  The reason is that
     852                 :             :    streaming code needs clone's origin to be streamed before clone.  This
     853                 :             :    means that we need to insert the nodes in specific order.  This order is
     854                 :             :    ignored by the partitioning logic earlier.  */
     855                 :             : 
     856                 :             : lto_symtab_encoder_t
     857                 :       33181 : compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
     858                 :             : {
     859                 :       33181 :   struct cgraph_edge *edge;
     860                 :       33181 :   int i;
     861                 :       33181 :   lto_symtab_encoder_t encoder;
     862                 :       33181 :   lto_symtab_encoder_iterator lsei;
     863                 :       33181 :   hash_set<void *> reachable_call_targets;
     864                 :             : 
     865                 :       33181 :   encoder = lto_symtab_encoder_new (false);
     866                 :             : 
     867                 :             :   /* Go over all entries in the IN_ENCODER and duplicate them to
     868                 :             :      ENCODER. At the same time insert masters of clones so
     869                 :             :      every master appears before clone.  */
     870                 :       33181 :   for (lsei = lsei_start_function_in_partition (in_encoder);
     871                 :      201425 :        !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei))
     872                 :             :     {
     873                 :      168244 :       struct cgraph_node *node = lsei_cgraph_node (lsei);
     874                 :      168244 :       if (!node->need_lto_streaming)
     875                 :           0 :         continue;
     876                 :      168244 :       add_node_to (encoder, node, true);
     877                 :      168244 :       lto_set_symtab_encoder_in_partition (encoder, node);
     878                 :      168244 :       create_references (encoder, node);
     879                 :             :     }
     880                 :       33181 :   for (lsei = lsei_start_variable_in_partition (in_encoder);
     881                 :      623420 :        !lsei_end_p (lsei); lsei_next_variable_in_partition (&lsei))
     882                 :             :     {
     883                 :      278648 :       varpool_node *vnode = lsei_varpool_node (lsei);
     884                 :             : 
     885                 :      278648 :       if (!vnode->need_lto_streaming)
     886                 :           0 :         continue;
     887                 :      278648 :       lto_set_symtab_encoder_in_partition (encoder, vnode);
     888                 :      278648 :       lto_set_symtab_encoder_encode_initializer (encoder, vnode);
     889                 :      278648 :       create_references (encoder, vnode);
     890                 :             :     }
     891                 :             :   /* Pickle in also the initializer of all referenced readonly variables
     892                 :             :      to help folding.  Constant pool variables are not shared, so we must
     893                 :             :      pickle those too.  */
     894                 :     1377736 :   for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
     895                 :             :     {
     896                 :      655806 :       symtab_node *node = lto_symtab_encoder_deref (encoder, i);
     897                 :     1311612 :       if (varpool_node *vnode = dyn_cast <varpool_node *> (node))
     898                 :             :         {
     899                 :      283013 :           if (!lto_symtab_encoder_encode_initializer_p (encoder,
     900                 :             :                                                         vnode)
     901                 :      283013 :               && (((vnode->ctor_useable_for_folding_p ()
     902                 :         158 :                    && (!DECL_VIRTUAL_P (vnode->decl)
     903                 :         131 :                        || !flag_wpa
     904                 :          12 :                        || flag_ltrans_devirtualize)))))
     905                 :             :             {
     906                 :         146 :               lto_set_symtab_encoder_encode_initializer (encoder, vnode);
     907                 :         146 :               create_references (encoder, vnode);
     908                 :             :             }
     909                 :             :        }
     910                 :             :     }
     911                 :             : 
     912                 :             :   /* Go over all the nodes again to include callees that are not in
     913                 :             :      SET.  */
     914                 :       33181 :   for (lsei = lsei_start_function_in_partition (encoder);
     915                 :      402612 :        !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei))
     916                 :             :     {
     917                 :      168244 :       struct cgraph_node *node = lsei_cgraph_node (lsei);
     918                 :      784685 :       for (edge = node->callees; edge; edge = edge->next_callee)
     919                 :             :         {
     920                 :      616441 :           struct cgraph_node *callee = edge->callee;
     921                 :      616441 :           if (!lto_symtab_encoder_in_partition_p (encoder, callee))
     922                 :             :             {
     923                 :             :               /* We should have moved all the inlines.  */
     924                 :      319984 :               gcc_assert (!callee->inlined_to);
     925                 :      319984 :               add_node_to (encoder, callee, false);
     926                 :             :             }
     927                 :             :         }
     928                 :             :       /* Add all possible targets for late devirtualization.  */
     929                 :      168244 :       if (flag_ltrans_devirtualize || !flag_wpa)
     930                 :      105524 :         for (edge = node->indirect_calls; edge; edge = edge->next_callee)
     931                 :        1822 :           if (edge->indirect_info->polymorphic)
     932                 :             :             {
     933                 :         286 :               unsigned int i;
     934                 :         286 :               void *cache_token;
     935                 :         286 :               bool final;
     936                 :         286 :               vec <cgraph_node *>targets
     937                 :             :                 = possible_polymorphic_call_targets
     938                 :         286 :                     (edge, &final, &cache_token);
     939                 :         286 :               if (cache_token != NULL
     940                 :         286 :                   && !reachable_call_targets.add (cache_token))
     941                 :             :                 {
     942                 :         593 :                   for (i = 0; i < targets.length (); i++)
     943                 :             :                     {
     944                 :         307 :                       struct cgraph_node *callee = targets[i];
     945                 :             : 
     946                 :             :                       /* Adding an external declarations into the unit serves
     947                 :             :                          no purpose and just increases its boundary.  */
     948                 :         307 :                       if (callee->definition
     949                 :         513 :                           && !lto_symtab_encoder_in_partition_p
     950                 :         206 :                                (encoder, callee))
     951                 :             :                         {
     952                 :           0 :                           gcc_assert (!callee->inlined_to);
     953                 :           0 :                           add_node_to (encoder, callee, false);
     954                 :             :                         }
     955                 :             :                     }
     956                 :             :                 }
     957                 :             :             }
     958                 :             :     }
     959                 :             :   /* Be sure to also insert alias targert and thunk callees.  These needs
     960                 :             :      to stay to aid local calling conventions.  */
     961                 :     1465208 :   for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
     962                 :             :     {
     963                 :      699542 :       symtab_node *node = lto_symtab_encoder_deref (encoder, i);
     964                 :      699542 :       cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
     965                 :             : 
     966                 :      699542 :       if (node->alias && node->analyzed)
     967                 :       12815 :         create_references (encoder, node);
     968                 :      699542 :       if (cnode
     969                 :      416528 :           && cnode->thunk && !cnode->inlined_to)
     970                 :         166 :         add_node_to (encoder, cnode->callees->callee, false);
     971                 :      699549 :       while (node->transparent_alias && node->analyzed)
     972                 :             :         {
     973                 :           7 :           node = node->get_alias_target ();
     974                 :           7 :           if (is_a <cgraph_node *> (node))
     975                 :           7 :             add_node_to (encoder, dyn_cast <cgraph_node *> (node),
     976                 :             :                          false);
     977                 :             :           else
     978                 :           0 :             lto_symtab_encoder_encode (encoder, node);
     979                 :             :         }
     980                 :             :     }
     981                 :       33181 :   lto_symtab_encoder_delete (in_encoder);
     982                 :       33181 :   return encoder;
     983                 :       33181 : }
     984                 :             : 
     985                 :             : /* Output the part of the symtab in SET and VSET.  */
     986                 :             : 
     987                 :             : void
     988                 :       33181 : output_symtab (void)
     989                 :             : {
     990                 :       33181 :   struct cgraph_node *node;
     991                 :       33181 :   struct lto_simple_output_block *ob;
     992                 :       33181 :   int i, n_nodes;
     993                 :       33181 :   lto_symtab_encoder_t encoder;
     994                 :             : 
     995                 :       33181 :   if (flag_wpa)
     996                 :        9190 :     output_cgraph_opt_summary ();
     997                 :             : 
     998                 :       33181 :   ob = lto_create_simple_output_block (LTO_section_symtab_nodes);
     999                 :             : 
    1000                 :       33181 :   output_profile_summary (ob);
    1001                 :             : 
    1002                 :             :   /* An encoder for cgraph nodes should have been created by
    1003                 :             :      ipa_write_summaries_1.  */
    1004                 :       33181 :   gcc_assert (ob->decl_state->symtab_node_encoder);
    1005                 :       33181 :   encoder = ob->decl_state->symtab_node_encoder;
    1006                 :             : 
    1007                 :             :   /* Write out the nodes.  We must first output a node and then its clones,
    1008                 :             :      otherwise at a time reading back the node there would be nothing to clone
    1009                 :             :      from.  */
    1010                 :       33181 :   n_nodes = lto_symtab_encoder_size (encoder);
    1011                 :      732723 :   for (i = 0; i < n_nodes; i++)
    1012                 :             :     {
    1013                 :      699542 :       symtab_node *node = lto_symtab_encoder_deref (encoder, i);
    1014                 :      699542 :       if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node))
    1015                 :      416528 :         lto_output_node (ob, cnode, encoder);
    1016                 :             :       else
    1017                 :      566028 :         lto_output_varpool_node (ob, dyn_cast<varpool_node *> (node), encoder);
    1018                 :             :     }
    1019                 :             : 
    1020                 :             :   /* Go over the nodes in SET again to write edges.  */
    1021                 :     1465208 :   for (int i = 0; i < lto_symtab_encoder_size (encoder); i++)
    1022                 :             :     {
    1023                 :     1399084 :       node = dyn_cast <cgraph_node *> (lto_symtab_encoder_deref (encoder, i));
    1024                 :      416528 :       if (node
    1025                 :      416528 :           && ((node->thunk && !node->inlined_to)
    1026                 :      416362 :               || lto_symtab_encoder_in_partition_p (encoder, node)))
    1027                 :             :         {
    1028                 :      168248 :           output_outgoing_cgraph_edges (node->callees, ob, encoder);
    1029                 :      168248 :           output_outgoing_cgraph_edges (node->indirect_calls, ob, encoder);
    1030                 :             :         }
    1031                 :             :     }
    1032                 :             : 
    1033                 :       33181 :   streamer_write_uhwi_stream (ob->main_stream, 0);
    1034                 :             : 
    1035                 :       33181 :   lto_destroy_simple_output_block (ob);
    1036                 :             : 
    1037                 :             :   /* Emit toplevel asms.
    1038                 :             :      When doing WPA we must output every asm just once.  Since we do not partition asm
    1039                 :             :      nodes at all, output them to first output.  This is kind of hack, but should work
    1040                 :             :      well.  */
    1041                 :       33181 :   if (!asm_nodes_output && !lto_stream_offload_p)
    1042                 :             :     {
    1043                 :       32820 :       asm_nodes_output = true;
    1044                 :       32820 :       lto_output_toplevel_asms ();
    1045                 :             :     }
    1046                 :             : 
    1047                 :       33181 :   output_refs (encoder);
    1048                 :       33181 : }
    1049                 :             : 
    1050                 :             : /* Return identifier encoded in IB as a plain string.  */
    1051                 :             : 
    1052                 :             : static tree
    1053                 :      260142 : read_identifier (class lto_input_block *ib)
    1054                 :             : {
    1055                 :      260142 :   unsigned int len = strnlen (ib->data + ib->p, ib->len - ib->p - 1);
    1056                 :      260142 :   tree id;
    1057                 :             : 
    1058                 :      260142 :   if (ib->data[ib->p + len])
    1059                 :           0 :     lto_section_overrun (ib);
    1060                 :      260142 :   if (!len)
    1061                 :             :     {
    1062                 :      250182 :       ib->p++;
    1063                 :      250182 :       return NULL;
    1064                 :             :     }
    1065                 :        9960 :   id = get_identifier (ib->data + ib->p);
    1066                 :        9960 :   ib->p += len + 1;
    1067                 :        9960 :   return id;
    1068                 :             : }
    1069                 :             : 
    1070                 :             : /* Return string encoded in IB, NULL if string is empty.  */
    1071                 :             : 
    1072                 :             : static const char *
    1073                 :      260142 : read_string (class lto_input_block *ib)
    1074                 :             : {
    1075                 :      260142 :   unsigned int len = strnlen (ib->data + ib->p, ib->len - ib->p - 1);
    1076                 :      260142 :   const char *str;
    1077                 :             : 
    1078                 :      260142 :   if (ib->data[ib->p + len])
    1079                 :           0 :     lto_section_overrun (ib);
    1080                 :      260142 :   if (!len)
    1081                 :             :     {
    1082                 :      257640 :       ib->p++;
    1083                 :      257640 :       return NULL;
    1084                 :             :     }
    1085                 :        2502 :   str = ib->data + ib->p;
    1086                 :        2502 :   ib->p += len + 1;
    1087                 :        2502 :   return str;
    1088                 :             : }
    1089                 :             : 
    1090                 :             : /* Output function/variable tables that will allow libgomp to look up offload
    1091                 :             :    target code.
    1092                 :             :    OFFLOAD_FUNCS is filled in expand_omp_target, OFFLOAD_VARS is filled in
    1093                 :             :    varpool_node::get_create.  In WHOPR (partitioned) mode during the WPA stage
    1094                 :             :    both OFFLOAD_FUNCS and OFFLOAD_VARS are filled by input_offload_tables.  */
    1095                 :             : 
    1096                 :             : void
    1097                 :        8833 : output_offload_tables (void)
    1098                 :             : {
    1099                 :       17666 :   bool output_requires = (flag_openmp
    1100                 :        8833 :                           && (omp_requires_mask & OMP_REQUIRES_TARGET_USED) != 0);
    1101                 :        8833 :   if (vec_safe_is_empty (offload_funcs) && vec_safe_is_empty (offload_vars)
    1102                 :        8833 :       && !output_requires)
    1103                 :             :     return;
    1104                 :             : 
    1105                 :           0 :   struct lto_simple_output_block *ob
    1106                 :           0 :     = lto_create_simple_output_block (LTO_section_offload_table);
    1107                 :             : 
    1108                 :           0 :   for (unsigned i = 0; i < vec_safe_length (offload_funcs); i++)
    1109                 :             :     {
    1110                 :           0 :       symtab_node *node = symtab_node::get ((*offload_funcs)[i]);
    1111                 :           0 :       if (!node)
    1112                 :           0 :         continue;
    1113                 :           0 :       node->force_output = true;
    1114                 :           0 :       streamer_write_enum (ob->main_stream, LTO_symtab_tags,
    1115                 :             :                            LTO_symtab_last_tag, LTO_symtab_unavail_node);
    1116                 :           0 :       lto_output_fn_decl_ref (ob->decl_state, ob->main_stream,
    1117                 :           0 :                               (*offload_funcs)[i]);
    1118                 :             :     }
    1119                 :             : 
    1120                 :           0 :   for (unsigned i = 0; i < vec_safe_length (offload_vars); i++)
    1121                 :             :     {
    1122                 :           0 :       symtab_node *node = symtab_node::get ((*offload_vars)[i]);
    1123                 :           0 :       if (!node)
    1124                 :           0 :         continue;
    1125                 :           0 :       node->force_output = true;
    1126                 :           0 :       streamer_write_enum (ob->main_stream, LTO_symtab_tags,
    1127                 :             :                            LTO_symtab_last_tag, LTO_symtab_variable);
    1128                 :           0 :       lto_output_var_decl_ref (ob->decl_state, ob->main_stream,
    1129                 :           0 :                                (*offload_vars)[i]);
    1130                 :             :     }
    1131                 :             : 
    1132                 :           0 :   for (unsigned i = 0; i < vec_safe_length (offload_ind_funcs); i++)
    1133                 :             :     {
    1134                 :           0 :       symtab_node *node = symtab_node::get ((*offload_ind_funcs)[i]);
    1135                 :           0 :       if (!node)
    1136                 :           0 :         continue;
    1137                 :           0 :       node->force_output = true;
    1138                 :           0 :       streamer_write_enum (ob->main_stream, LTO_symtab_tags,
    1139                 :             :                            LTO_symtab_last_tag, LTO_symtab_indirect_function);
    1140                 :           0 :       lto_output_fn_decl_ref (ob->decl_state, ob->main_stream,
    1141                 :           0 :                               (*offload_ind_funcs)[i]);
    1142                 :             :     }
    1143                 :             : 
    1144                 :           0 :   if (output_requires)
    1145                 :             :     {
    1146                 :           0 :       HOST_WIDE_INT val = ((HOST_WIDE_INT) omp_requires_mask
    1147                 :             :                            & (OMP_REQUIRES_UNIFIED_ADDRESS
    1148                 :             :                               | OMP_REQUIRES_UNIFIED_SHARED_MEMORY
    1149                 :             :                               | OMP_REQUIRES_SELF_MAPS
    1150                 :             :                               | OMP_REQUIRES_REVERSE_OFFLOAD
    1151                 :             :                               | OMP_REQUIRES_TARGET_USED));
    1152                 :             :       /* (Mis)use LTO_symtab_edge for this variable.  */
    1153                 :           0 :       streamer_write_enum (ob->main_stream, LTO_symtab_tags,
    1154                 :             :                            LTO_symtab_last_tag, LTO_symtab_edge);
    1155                 :           0 :       streamer_write_hwi_stream (ob->main_stream, val);
    1156                 :             :     }
    1157                 :             : 
    1158                 :           0 :   streamer_write_uhwi_stream (ob->main_stream, 0);
    1159                 :           0 :   lto_destroy_simple_output_block (ob);
    1160                 :             : }
    1161                 :             : 
    1162                 :             : /* Verify the partitioning of NODE.  */
    1163                 :             : 
    1164                 :             : static inline void
    1165                 :      260142 : verify_node_partition (symtab_node *node)
    1166                 :             : {
    1167                 :      260142 :   if (flag_ltrans)
    1168                 :             :     return;
    1169                 :             : 
    1170                 :             : #ifdef ACCEL_COMPILER
    1171                 :             :   if (node->in_other_partition)
    1172                 :             :     {
    1173                 :             :       if (TREE_CODE (node->decl) == FUNCTION_DECL)
    1174                 :             :         {
    1175                 :             :           if (lookup_attribute ("omp target device_ancestor_host",
    1176                 :             :                                 DECL_ATTRIBUTES (node->decl)) != NULL)
    1177                 :             :             return;
    1178                 :             :           error_at (DECL_SOURCE_LOCATION (node->decl),
    1179                 :             :                     "function %qs has been referenced in offloaded code but"
    1180                 :             :                     " hasn%'t been marked to be included in the offloaded code",
    1181                 :             :                     node->name ());
    1182                 :             :         }
    1183                 :             :       else if (VAR_P (node->decl))
    1184                 :             :         error_at (DECL_SOURCE_LOCATION (node->decl),
    1185                 :             :                   "variable %qs has been referenced in offloaded code but"
    1186                 :             :                   " hasn%'t been marked to be included in the offloaded code",
    1187                 :             :                   node->name ());
    1188                 :             :       else
    1189                 :             :         gcc_unreachable ();
    1190                 :             :     }
    1191                 :             : #else
    1192                 :      154351 :   gcc_assert (!node->in_other_partition
    1193                 :             :               && !node->used_from_other_partition);
    1194                 :             : #endif
    1195                 :             : }
    1196                 :             : 
    1197                 :             : /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS,
    1198                 :             :    STACK_SIZE, SELF_TIME and SELF_SIZE.  This is called either to initialize
    1199                 :             :    NODE or to replace the values in it, for instance because the first
    1200                 :             :    time we saw it, the function body was not available but now it
    1201                 :             :    is.  BP is a bitpack with all the bitflags for NODE read from the
    1202                 :             :    stream.  Initialize HAS_THUNK_INFO to indicate if thunk info should
    1203                 :             :    be streamed in.  */
    1204                 :             : 
    1205                 :             : static void
    1206                 :      191645 : input_overwrite_node (struct lto_file_decl_data *file_data,
    1207                 :             :                       struct cgraph_node *node,
    1208                 :             :                       enum LTO_symtab_tags tag,
    1209                 :             :                       struct bitpack_d *bp, bool *has_thunk_info)
    1210                 :             : {
    1211                 :      191645 :   node->aux = (void *) tag;
    1212                 :      191645 :   node->lto_file_data = file_data;
    1213                 :             : 
    1214                 :      191645 :   node->local = bp_unpack_value (bp, 1);
    1215                 :      191645 :   node->externally_visible = bp_unpack_value (bp, 1);
    1216                 :      191645 :   node->no_reorder = bp_unpack_value (bp, 1);
    1217                 :      191645 :   node->definition = bp_unpack_value (bp, 1);
    1218                 :      191645 :   node->versionable = bp_unpack_value (bp, 1);
    1219                 :      191645 :   node->can_change_signature = bp_unpack_value (bp, 1);
    1220                 :      191645 :   node->redefined_extern_inline = bp_unpack_value (bp, 1);
    1221                 :      191645 :   node->force_output = bp_unpack_value (bp, 1);
    1222                 :      191645 :   node->forced_by_abi = bp_unpack_value (bp, 1);
    1223                 :      191645 :   node->unique_name = bp_unpack_value (bp, 1);
    1224                 :      191645 :   node->body_removed = bp_unpack_value (bp, 1);
    1225                 :      191645 :   node->semantic_interposition = bp_unpack_value (bp, 1);
    1226                 :      191645 :   node->implicit_section = bp_unpack_value (bp, 1);
    1227                 :      191645 :   node->address_taken = bp_unpack_value (bp, 1);
    1228                 :      191645 :   node->used_from_other_partition = bp_unpack_value (bp, 1);
    1229                 :      191645 :   node->lowered = bp_unpack_value (bp, 1);
    1230                 :      191645 :   node->analyzed = tag == LTO_symtab_analyzed_node;
    1231                 :      191645 :   node->in_other_partition = bp_unpack_value (bp, 1);
    1232                 :      191645 :   if (node->in_other_partition
    1233                 :             :       /* Avoid updating decl when we are seeing just inline clone.
    1234                 :             :          When inlining function that has functions already inlined into it,
    1235                 :             :          we produce clones of inline clones.
    1236                 :             : 
    1237                 :             :          WPA partitioning might put each clone into different unit and
    1238                 :             :          we might end up streaming inline clone from other partition
    1239                 :             :          to support clone we are interested in. */
    1240                 :         221 :       && (!node->clone_of
    1241                 :           0 :           || node->clone_of->decl != node->decl))
    1242                 :             :     {
    1243                 :         221 :       DECL_EXTERNAL (node->decl) = 1;
    1244                 :         221 :       TREE_STATIC (node->decl) = 0;
    1245                 :             :     }
    1246                 :      191645 :   node->alias = bp_unpack_value (bp, 1);
    1247                 :      191645 :   node->transparent_alias = bp_unpack_value (bp, 1);
    1248                 :      191645 :   node->weakref = bp_unpack_value (bp, 1);
    1249                 :      191645 :   node->symver = bp_unpack_value (bp, 1);
    1250                 :      191645 :   node->frequency = (enum node_frequency)bp_unpack_value (bp, 2);
    1251                 :      191645 :   node->only_called_at_startup = bp_unpack_value (bp, 1);
    1252                 :      191645 :   node->only_called_at_exit = bp_unpack_value (bp, 1);
    1253                 :      191645 :   node->tm_clone = bp_unpack_value (bp, 1);
    1254                 :      191645 :   node->calls_comdat_local = bp_unpack_value (bp, 1);
    1255                 :      191645 :   node->icf_merged = bp_unpack_value (bp, 1);
    1256                 :      191645 :   node->nonfreeing_fn = bp_unpack_value (bp, 1);
    1257                 :      191645 :   node->merged_comdat = bp_unpack_value (bp, 1);
    1258                 :      191645 :   node->merged_extern_inline = bp_unpack_value (bp, 1);
    1259                 :      191645 :   node->thunk = bp_unpack_value (bp, 1);
    1260                 :      191645 :   node->parallelized_function = bp_unpack_value (bp, 1);
    1261                 :      191645 :   node->declare_variant_alt = bp_unpack_value (bp, 1);
    1262                 :      191645 :   node->calls_declare_variant_alt = bp_unpack_value (bp, 1);
    1263                 :      191645 :   *has_thunk_info = bp_unpack_value (bp, 1);
    1264                 :      191645 :   node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution,
    1265                 :             :                                      LDPR_NUM_KNOWN);
    1266                 :      191645 :   node->split_part = bp_unpack_value (bp, 1);
    1267                 :      191645 :   verify_node_partition (node);
    1268                 :      191645 : }
    1269                 :             : 
    1270                 :             : /* Return string alias is alias of.  */
    1271                 :             : 
    1272                 :             : static tree
    1273                 :          24 : get_alias_symbol (tree decl)
    1274                 :             : {
    1275                 :          24 :   tree alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
    1276                 :          24 :   return get_identifier (TREE_STRING_POINTER
    1277                 :             :                           (TREE_VALUE (TREE_VALUE (alias))));
    1278                 :             : }
    1279                 :             : 
    1280                 :             : /* Read a node from input_block IB.  TAG is the node's tag just read.
    1281                 :             :    Return the node read or overwriten.  */
    1282                 :             : 
    1283                 :             : static struct cgraph_node *
    1284                 :      191645 : input_node (struct lto_file_decl_data *file_data,
    1285                 :             :             class lto_input_block *ib,
    1286                 :             :             enum LTO_symtab_tags tag,
    1287                 :             :             vec<symtab_node *> nodes)
    1288                 :             : {
    1289                 :      191645 :   gcc::pass_manager *passes = g->get_passes ();
    1290                 :      191645 :   tree fn_decl;
    1291                 :      191645 :   struct cgraph_node *node;
    1292                 :      191645 :   struct bitpack_d bp;
    1293                 :      191645 :   int ref = LCC_NOT_FOUND, ref2 = LCC_NOT_FOUND;
    1294                 :      191645 :   int clone_ref;
    1295                 :      191645 :   int order;
    1296                 :      191645 :   int i, count;
    1297                 :      191645 :   tree group;
    1298                 :      191645 :   const char *section;
    1299                 :      191645 :   order = streamer_read_hwi (ib) + file_data->order_base;
    1300                 :      191645 :   clone_ref = streamer_read_hwi (ib);
    1301                 :      191645 :   bool has_thunk_info;
    1302                 :             : 
    1303                 :      191645 :   fn_decl = lto_input_fn_decl_ref (ib, file_data);
    1304                 :             : 
    1305                 :      191645 :   if (clone_ref != LCC_NOT_FOUND)
    1306                 :             :     {
    1307                 :       44934 :       node = dyn_cast<cgraph_node *> (nodes[clone_ref])->create_clone (fn_decl,
    1308                 :             :         profile_count::uninitialized (), false,
    1309                 :             :         vNULL, false, NULL, NULL);
    1310                 :             :     }
    1311                 :             :   else
    1312                 :             :     {
    1313                 :             :       /* Declaration of functions can be already merged with a declaration
    1314                 :             :          from other input file.  We keep cgraph unmerged until after streaming
    1315                 :             :          of ipa passes is done.  Alays forcingly create a fresh node.  */
    1316                 :      169178 :       node = symtab->create_empty ();
    1317                 :      169178 :       node->decl = fn_decl;
    1318                 :      169178 :       if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (fn_decl)))
    1319                 :          19 :         node->ifunc_resolver = 1;
    1320                 :      169178 :       node->register_symbol ();
    1321                 :             :     }
    1322                 :             : 
    1323                 :      191645 :   node->order = order;
    1324                 :      191645 :   if (order >= symtab->order)
    1325                 :       13615 :     symtab->order = order + 1;
    1326                 :             : 
    1327                 :      191645 :   node->count = profile_count::stream_in (ib);
    1328                 :      191645 :   node->count_materialization_scale = streamer_read_hwi (ib);
    1329                 :             : 
    1330                 :      191645 :   count = streamer_read_hwi (ib);
    1331                 :      191645 :   node->ipa_transforms_to_apply = vNULL;
    1332                 :      258636 :   for (i = 0; i < count; i++)
    1333                 :             :     {
    1334                 :       66991 :       opt_pass *pass;
    1335                 :       66991 :       int pid = streamer_read_hwi (ib);
    1336                 :             : 
    1337                 :       66991 :       gcc_assert (pid < passes->passes_by_id_size);
    1338                 :       66991 :       pass = passes->passes_by_id[pid];
    1339                 :       66991 :       node->ipa_transforms_to_apply.safe_push ((ipa_opt_pass_d *) pass);
    1340                 :             :     }
    1341                 :             : 
    1342                 :      191645 :   if (tag == LTO_symtab_analyzed_node)
    1343                 :      151569 :     ref = streamer_read_hwi (ib);
    1344                 :             : 
    1345                 :      191645 :   group = read_identifier (ib);
    1346                 :      191645 :   if (group)
    1347                 :        7678 :     ref2 = streamer_read_hwi (ib);
    1348                 :             : 
    1349                 :             :   /* Make sure that we have not read this node before.  Nodes that
    1350                 :             :      have already been read will have their tag stored in the 'aux'
    1351                 :             :      field.  Since built-in functions can be referenced in multiple
    1352                 :             :      functions, they are expected to be read more than once.  */
    1353                 :      191645 :   if (node->aux && !fndecl_built_in_p (node->decl))
    1354                 :           0 :     internal_error ("bytecode stream: found multiple instances of cgraph "
    1355                 :             :                     "node with uid %d", node->get_uid ());
    1356                 :             : 
    1357                 :      191645 :   node->tp_first_run = streamer_read_uhwi (ib);
    1358                 :             : 
    1359                 :      191645 :   bp = streamer_read_bitpack (ib);
    1360                 :             : 
    1361                 :      191645 :   input_overwrite_node (file_data, node, tag, &bp, &has_thunk_info);
    1362                 :             : 
    1363                 :             :   /* Store a reference for now, and fix up later to be a pointer.  */
    1364                 :      191645 :   node->inlined_to = (cgraph_node *) (intptr_t) ref;
    1365                 :             : 
    1366                 :      191645 :   if (group)
    1367                 :             :     {
    1368                 :        7678 :       node->set_comdat_group (group);
    1369                 :             :       /* Store a reference for now, and fix up later to be a pointer.  */
    1370                 :        7678 :       node->same_comdat_group = (symtab_node *) (intptr_t) ref2;
    1371                 :             :     }
    1372                 :             :   else
    1373                 :      183967 :     node->same_comdat_group = (symtab_node *) (intptr_t) LCC_NOT_FOUND;
    1374                 :      191645 :   section = read_string (ib);
    1375                 :      191645 :   if (section)
    1376                 :         182 :     node->set_section_for_node (section);
    1377                 :             : 
    1378                 :      191645 :   if (node->alias && !node->analyzed && node->weakref)
    1379                 :          24 :     node->alias_target = get_alias_symbol (node->decl);
    1380                 :      191645 :   node->profile_id = streamer_read_hwi (ib);
    1381                 :      191645 :   node->unit_id = streamer_read_hwi (ib) + file_data->unit_base;
    1382                 :      191645 :   if (symtab->max_unit < node->unit_id)
    1383                 :       23238 :     symtab->max_unit = node->unit_id;
    1384                 :      191645 :   if (DECL_STATIC_CONSTRUCTOR (node->decl))
    1385                 :         130 :     node->set_init_priority (streamer_read_hwi (ib));
    1386                 :      191645 :   if (DECL_STATIC_DESTRUCTOR (node->decl))
    1387                 :          52 :     node->set_fini_priority (streamer_read_hwi (ib));
    1388                 :             : 
    1389                 :      191645 :   if (has_thunk_info)
    1390                 :         152 :     thunk_info::get_create (node)->stream_in (ib);
    1391                 :             : 
    1392                 :      191645 :   return node;
    1393                 :             : }
    1394                 :             : 
    1395                 :             : /* Read a node from input_block IB.  TAG is the node's tag just read.
    1396                 :             :    Return the node read or overwriten.  */
    1397                 :             : 
    1398                 :             : static varpool_node *
    1399                 :       68497 : input_varpool_node (struct lto_file_decl_data *file_data,
    1400                 :             :                     class lto_input_block *ib)
    1401                 :             : {
    1402                 :       68497 :   tree var_decl;
    1403                 :       68497 :   varpool_node *node;
    1404                 :       68497 :   struct bitpack_d bp;
    1405                 :       68497 :   int ref = LCC_NOT_FOUND;
    1406                 :       68497 :   int order;
    1407                 :       68497 :   tree group;
    1408                 :       68497 :   const char *section;
    1409                 :             : 
    1410                 :       68497 :   order = streamer_read_hwi (ib) + file_data->order_base;
    1411                 :       68497 :   var_decl = lto_input_var_decl_ref (ib, file_data);
    1412                 :             : 
    1413                 :             :   /* Declaration of functions can be already merged with a declaration
    1414                 :             :      from other input file.  We keep cgraph unmerged until after streaming
    1415                 :             :      of ipa passes is done.  Alays forcingly create a fresh node.  */
    1416                 :       68497 :   node = varpool_node::create_empty ();
    1417                 :       68497 :   node->decl = var_decl;
    1418                 :       68497 :   node->register_symbol ();
    1419                 :             : 
    1420                 :       68497 :   node->order = order;
    1421                 :       68497 :   if (order >= symtab->order)
    1422                 :        1498 :     symtab->order = order + 1;
    1423                 :       68497 :   node->lto_file_data = file_data;
    1424                 :             : 
    1425                 :       68497 :   bp = streamer_read_bitpack (ib);
    1426                 :       68497 :   node->externally_visible = bp_unpack_value (&bp, 1);
    1427                 :       68497 :   node->no_reorder = bp_unpack_value (&bp, 1);
    1428                 :       68497 :   node->force_output = bp_unpack_value (&bp, 1);
    1429                 :       68497 :   node->forced_by_abi = bp_unpack_value (&bp, 1);
    1430                 :       68497 :   node->unique_name = bp_unpack_value (&bp, 1);
    1431                 :       68497 :   node->body_removed = bp_unpack_value (&bp, 1);
    1432                 :       68497 :   node->semantic_interposition = bp_unpack_value (&bp, 1);
    1433                 :       68497 :   node->implicit_section = bp_unpack_value (&bp, 1);
    1434                 :       68497 :   node->writeonly = bp_unpack_value (&bp, 1);
    1435                 :       68497 :   node->definition = bp_unpack_value (&bp, 1);
    1436                 :       68497 :   node->alias = bp_unpack_value (&bp, 1);
    1437                 :       68497 :   node->transparent_alias = bp_unpack_value (&bp, 1);
    1438                 :       68497 :   node->weakref = bp_unpack_value (&bp, 1);
    1439                 :       68497 :   node->symver = bp_unpack_value (&bp, 1);
    1440                 :       68497 :   node->analyzed = bp_unpack_value (&bp, 1);
    1441                 :       68497 :   node->used_from_other_partition = bp_unpack_value (&bp, 1);
    1442                 :       68497 :   node->in_other_partition = bp_unpack_value (&bp, 1);
    1443                 :       68497 :   if (node->in_other_partition)
    1444                 :             :     {
    1445                 :         200 :       DECL_EXTERNAL (node->decl) = 1;
    1446                 :         200 :       TREE_STATIC (node->decl) = 0;
    1447                 :             :     }
    1448                 :       68497 :   if (node->alias && !node->analyzed && node->weakref)
    1449                 :           0 :     node->alias_target = get_alias_symbol (node->decl);
    1450                 :       68497 :   node->tls_model = (enum tls_model)bp_unpack_value (&bp, 3);
    1451                 :       68497 :   node->used_by_single_function = (enum tls_model)bp_unpack_value (&bp, 1);
    1452                 :       68497 :   node->dynamically_initialized = bp_unpack_value (&bp, 1);
    1453                 :       68497 :   group = read_identifier (ib);
    1454                 :       68497 :   if (group)
    1455                 :             :     {
    1456                 :        2282 :       node->set_comdat_group (group);
    1457                 :        2282 :       ref = streamer_read_hwi (ib);
    1458                 :             :       /* Store a reference for now, and fix up later to be a pointer.  */
    1459                 :        2282 :       node->same_comdat_group = (symtab_node *) (intptr_t) ref;
    1460                 :             :     }
    1461                 :             :   else
    1462                 :       66215 :     node->same_comdat_group = (symtab_node *) (intptr_t) LCC_NOT_FOUND;
    1463                 :       68497 :   section = read_string (ib);
    1464                 :       68497 :   if (section)
    1465                 :        2320 :     node->set_section_for_node (section);
    1466                 :       68497 :   node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution,
    1467                 :             :                                                 LDPR_NUM_KNOWN);
    1468                 :       68497 :   verify_node_partition (node);
    1469                 :       68497 :   return node;
    1470                 :             : }
    1471                 :             : 
    1472                 :             : /* Read a node from input_block IB.  TAG is the node's tag just read.
    1473                 :             :    Return the node read or overwriten.  */
    1474                 :             : 
    1475                 :             : static void
    1476                 :      441355 : input_ref (class lto_input_block *ib,
    1477                 :             :            symtab_node *referring_node,
    1478                 :             :            vec<symtab_node *> nodes)
    1479                 :             : {
    1480                 :      441355 :   symtab_node *node = NULL;
    1481                 :      441355 :   struct bitpack_d bp;
    1482                 :      441355 :   enum ipa_ref_use use;
    1483                 :      441355 :   bool speculative;
    1484                 :      441355 :   struct ipa_ref *ref;
    1485                 :             : 
    1486                 :      441355 :   bp = streamer_read_bitpack (ib);
    1487                 :      441355 :   use = (enum ipa_ref_use) bp_unpack_value (&bp, 3);
    1488                 :      441355 :   speculative = (enum ipa_ref_use) bp_unpack_value (&bp, 1);
    1489                 :      441355 :   node = nodes[streamer_read_hwi (ib)];
    1490                 :      441355 :   ref = referring_node->create_reference (node, use);
    1491                 :      441355 :   ref->speculative = speculative;
    1492                 :      441355 :   if (is_a <cgraph_node *> (referring_node))
    1493                 :             :     {
    1494                 :      421107 :       ref->lto_stmt_uid = streamer_read_hwi (ib);
    1495                 :      421107 :       bp = streamer_read_bitpack (ib);
    1496                 :      421107 :       ref->speculative_id = bp_unpack_value (&bp, 16);
    1497                 :             :     }
    1498                 :      441355 : }
    1499                 :             : 
    1500                 :             : /* Read an edge from IB.  NODES points to a vector of previously read nodes for
    1501                 :             :    decoding caller and callee of the edge to be read.  If INDIRECT is true, the
    1502                 :             :    edge being read is indirect (in the sense that it has
    1503                 :             :    indirect_unknown_callee set).  */
    1504                 :             : 
    1505                 :             : static void
    1506                 :      589269 : input_edge (class lto_input_block *ib, vec<symtab_node *> nodes,
    1507                 :             :             bool indirect)
    1508                 :             : {
    1509                 :      589269 :   struct cgraph_node *caller, *callee;
    1510                 :      589269 :   struct cgraph_edge *edge;
    1511                 :      589269 :   unsigned int stmt_id, speculative_id;
    1512                 :      589269 :   profile_count count;
    1513                 :      589269 :   cgraph_inline_failed_t inline_failed;
    1514                 :      589269 :   struct bitpack_d bp;
    1515                 :      589269 :   int ecf_flags = 0;
    1516                 :             : 
    1517                 :      589269 :   caller = dyn_cast<cgraph_node *> (nodes[streamer_read_hwi (ib)]);
    1518                 :      589269 :   if (caller == NULL || caller->decl == NULL_TREE)
    1519                 :           0 :     internal_error ("bytecode stream: no caller found while reading edge");
    1520                 :             : 
    1521                 :      589269 :   if (!indirect)
    1522                 :             :     {
    1523                 :      587206 :       callee = dyn_cast<cgraph_node *> (nodes[streamer_read_hwi (ib)]);
    1524                 :      587206 :       if (callee == NULL || callee->decl == NULL_TREE)
    1525                 :           0 :         internal_error ("bytecode stream: no callee found while reading edge");
    1526                 :             :     }
    1527                 :             :   else
    1528                 :             :     callee = NULL;
    1529                 :             : 
    1530                 :      589269 :   count = profile_count::stream_in (ib);
    1531                 :             : 
    1532                 :      589269 :   bp = streamer_read_bitpack (ib);
    1533                 :      589269 :   inline_failed = bp_unpack_enum (&bp, cgraph_inline_failed_t, CIF_N_REASONS);
    1534                 :      589269 :   stmt_id = bp_unpack_var_len_unsigned (&bp);
    1535                 :      589269 :   speculative_id = bp_unpack_value (&bp, 16);
    1536                 :             : 
    1537                 :      589269 :   if (indirect)
    1538                 :        2063 :     edge = caller->create_indirect_edge (NULL, 0, count);
    1539                 :             :   else
    1540                 :      587206 :     edge = caller->create_edge (callee, NULL, count);
    1541                 :             : 
    1542                 :      589269 :   edge->indirect_inlining_edge = bp_unpack_value (&bp, 1);
    1543                 :      589269 :   edge->speculative = bp_unpack_value (&bp, 1);
    1544                 :      589269 :   edge->lto_stmt_uid = stmt_id;
    1545                 :      589269 :   edge->speculative_id = speculative_id;
    1546                 :      589269 :   edge->inline_failed = inline_failed;
    1547                 :      589269 :   edge->call_stmt_cannot_inline_p = bp_unpack_value (&bp, 1);
    1548                 :      589269 :   edge->can_throw_external = bp_unpack_value (&bp, 1);
    1549                 :      589269 :   edge->in_polymorphic_cdtor = bp_unpack_value (&bp, 1);
    1550                 :      589269 :   if (indirect)
    1551                 :             :     {
    1552                 :        2063 :       if (bp_unpack_value (&bp, 1))
    1553                 :           0 :         ecf_flags |= ECF_CONST;
    1554                 :        2063 :       if (bp_unpack_value (&bp, 1))
    1555                 :           0 :         ecf_flags |= ECF_PURE;
    1556                 :        2063 :       if (bp_unpack_value (&bp, 1))
    1557                 :           0 :         ecf_flags |= ECF_NORETURN;
    1558                 :        2063 :       if (bp_unpack_value (&bp, 1))
    1559                 :           0 :         ecf_flags |= ECF_MALLOC;
    1560                 :        2063 :       if (bp_unpack_value (&bp, 1))
    1561                 :          88 :         ecf_flags |= ECF_NOTHROW;
    1562                 :        2063 :       if (bp_unpack_value (&bp, 1))
    1563                 :           0 :         ecf_flags |= ECF_RETURNS_TWICE;
    1564                 :        2063 :       edge->indirect_info->ecf_flags = ecf_flags;
    1565                 :             : 
    1566                 :        4126 :       edge->indirect_info->num_speculative_call_targets
    1567                 :        2063 :         = bp_unpack_value (&bp, 16);
    1568                 :             :     }
    1569                 :      589269 : }
    1570                 :             : 
    1571                 :             : 
    1572                 :             : /* Read a cgraph from IB using the info in FILE_DATA.  */
    1573                 :             : 
    1574                 :             : static vec<symtab_node *>
    1575                 :       23240 : input_cgraph_1 (struct lto_file_decl_data *file_data,
    1576                 :             :                 class lto_input_block *ib)
    1577                 :             : {
    1578                 :       23240 :   enum LTO_symtab_tags tag;
    1579                 :       23240 :   vec<symtab_node *> nodes = vNULL;
    1580                 :       23240 :   symtab_node *node;
    1581                 :       23240 :   unsigned i;
    1582                 :             : 
    1583                 :       23240 :   tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag);
    1584                 :       23240 :   file_data->order_base = symtab->order;
    1585                 :       23240 :   file_data->unit_base = symtab->max_unit + 1;
    1586                 :      872651 :   while (tag)
    1587                 :             :     {
    1588                 :      849411 :       if (tag == LTO_symtab_edge)
    1589                 :      587206 :         input_edge (ib, nodes, false);
    1590                 :      262205 :       else if (tag == LTO_symtab_indirect_edge)
    1591                 :        2063 :         input_edge (ib, nodes, true);
    1592                 :      260142 :       else if (tag == LTO_symtab_variable)
    1593                 :             :         {
    1594                 :       68497 :           node = input_varpool_node (file_data, ib);
    1595                 :       68497 :           nodes.safe_push (node);
    1596                 :       68497 :           lto_symtab_encoder_encode (file_data->symtab_node_encoder, node);
    1597                 :             :         }
    1598                 :             :       else
    1599                 :             :         {
    1600                 :      191645 :           node = input_node (file_data, ib, tag, nodes);
    1601                 :      191645 :           if (node == NULL || node->decl == NULL_TREE)
    1602                 :           0 :             internal_error ("bytecode stream: found empty cgraph node");
    1603                 :      191645 :           nodes.safe_push (node);
    1604                 :      191645 :           lto_symtab_encoder_encode (file_data->symtab_node_encoder, node);
    1605                 :             :         }
    1606                 :             : 
    1607                 :      849411 :       tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag);
    1608                 :             :     }
    1609                 :             : 
    1610                 :       23240 :   lto_input_toplevel_asms (file_data, file_data->order_base);
    1611                 :             : 
    1612                 :             :   /* AUX pointers should be all non-zero for function nodes read from the stream.  */
    1613                 :       23240 :   if (flag_checking)
    1614                 :             :     {
    1615                 :      283382 :       FOR_EACH_VEC_ELT (nodes, i, node)
    1616                 :      260142 :         gcc_assert (node->aux || !is_a <cgraph_node *> (node));
    1617                 :             :     }
    1618                 :      306622 :   FOR_EACH_VEC_ELT (nodes, i, node)
    1619                 :             :     {
    1620                 :      260142 :       int ref;
    1621                 :      260142 :       if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node))
    1622                 :             :         {
    1623                 :      191645 :           ref = (int) (intptr_t) cnode->inlined_to;
    1624                 :             : 
    1625                 :             :           /* We share declaration of builtins, so we may read same node twice.  */
    1626                 :      191645 :           if (!node->aux)
    1627                 :           0 :             continue;
    1628                 :      191645 :           node->aux = NULL;
    1629                 :             : 
    1630                 :             :           /* Fixup inlined_to from reference to pointer.  */
    1631                 :      191645 :           if (ref != LCC_NOT_FOUND)
    1632                 :       43384 :             dyn_cast<cgraph_node *> (node)->inlined_to
    1633                 :       43384 :               = dyn_cast<cgraph_node *> (nodes[ref]);
    1634                 :             :           else
    1635                 :      169953 :             cnode->inlined_to = NULL;
    1636                 :             :         }
    1637                 :             : 
    1638                 :      260142 :       ref = (int) (intptr_t) node->same_comdat_group;
    1639                 :             : 
    1640                 :             :       /* Fixup same_comdat_group from reference to pointer.  */
    1641                 :      260142 :       if (ref != LCC_NOT_FOUND)
    1642                 :        3977 :         node->same_comdat_group = nodes[ref];
    1643                 :             :       else
    1644                 :      256165 :         node->same_comdat_group = NULL;
    1645                 :             :     }
    1646                 :      283382 :   FOR_EACH_VEC_ELT (nodes, i, node)
    1647                 :      520284 :     node->aux = is_a <cgraph_node *> (node) ? (void *)1 : NULL;
    1648                 :       23240 :   return nodes;
    1649                 :             : }
    1650                 :             : 
    1651                 :             : /* Input ipa_refs.  */
    1652                 :             : 
    1653                 :             : static void
    1654                 :       23240 : input_refs (class lto_input_block *ib,
    1655                 :             :             vec<symtab_node *> nodes)
    1656                 :             : {
    1657                 :       85208 :   int count;
    1658                 :       85208 :   int idx;
    1659                 :       85208 :   while (true)
    1660                 :             :     {
    1661                 :       85208 :       symtab_node *node;
    1662                 :      170416 :       count = streamer_read_uhwi (ib);
    1663                 :       85208 :       if (!count)
    1664                 :             :         break;
    1665                 :       61968 :       idx = streamer_read_uhwi (ib);
    1666                 :       61968 :       node = nodes[idx];
    1667                 :      503323 :       while (count)
    1668                 :             :         {
    1669                 :      441355 :           input_ref (ib, node, nodes);
    1670                 :      441355 :           count--;
    1671                 :             :         }
    1672                 :      147176 :       if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node))
    1673                 :       54155 :         if (cnode->declare_variant_alt)
    1674                 :           2 :           omp_lto_input_declare_variant_alt (ib, cnode, nodes);
    1675                 :             :     }
    1676                 :       23240 : }
    1677                 :             : 
    1678                 :             : /* Input profile_info from IB.  */
    1679                 :             : static void
    1680                 :       23240 : input_profile_summary (class lto_input_block *ib,
    1681                 :             :                        struct lto_file_decl_data *file_data)
    1682                 :             : {
    1683                 :       23240 :   unsigned int runs = streamer_read_uhwi (ib);
    1684                 :       23240 :   if (runs)
    1685                 :             :     {
    1686                 :          11 :       file_data->profile_info.runs = runs;
    1687                 :             : 
    1688                 :             :       /* IPA-profile computes hot bb threshold based on cumulated
    1689                 :             :          whole program profile.  We need to stream it down to ltrans.  */
    1690                 :          11 :       if (flag_ltrans)
    1691                 :           4 :         set_hot_bb_threshold (streamer_read_gcov_count (ib));
    1692                 :             :     }
    1693                 :             : 
    1694                 :       23240 : }
    1695                 :             : 
    1696                 :             : /* Rescale profile summaries to the same number of runs in the whole unit.  */
    1697                 :             : 
    1698                 :             : static void
    1699                 :       22216 : merge_profile_summaries (struct lto_file_decl_data **file_data_vec)
    1700                 :             : {
    1701                 :       22216 :   struct lto_file_decl_data *file_data;
    1702                 :       22216 :   unsigned int j;
    1703                 :       22216 :   gcov_unsigned_t max_runs = 0;
    1704                 :       22216 :   struct cgraph_node *node;
    1705                 :       22216 :   struct cgraph_edge *edge;
    1706                 :             : 
    1707                 :             :   /* Find unit with maximal number of runs.  If we ever get serious about
    1708                 :             :      roundoff errors, we might also consider computing smallest common
    1709                 :             :      multiply.  */
    1710                 :       45456 :   for (j = 0; (file_data = file_data_vec[j]) != NULL; j++)
    1711                 :       23240 :     if (max_runs < file_data->profile_info.runs)
    1712                 :             :       max_runs = file_data->profile_info.runs;
    1713                 :             : 
    1714                 :       22216 :   if (!max_runs)
    1715                 :             :     return;
    1716                 :             : 
    1717                 :             :   /* Simple overflow check.  We probably don't need to support that many train
    1718                 :             :      runs. Such a large value probably imply data corruption anyway.  */
    1719                 :           8 :   if (max_runs > INT_MAX / REG_BR_PROB_BASE)
    1720                 :             :     {
    1721                 :           0 :       sorry ("At most %i profile runs is supported. Perhaps corrupted profile?",
    1722                 :             :              INT_MAX / REG_BR_PROB_BASE);
    1723                 :           0 :       return;
    1724                 :             :     }
    1725                 :             : 
    1726                 :           8 :   profile_info = XCNEW (gcov_summary);
    1727                 :           8 :   profile_info->runs = max_runs;
    1728                 :             : 
    1729                 :             :   /* If merging already happent at WPA time, we are done.  */
    1730                 :           8 :   if (flag_ltrans)
    1731                 :             :     return;
    1732                 :             : 
    1733                 :             :   /* Now compute count_materialization_scale of each node.
    1734                 :             :      During LTRANS we already have values of count_materialization_scale
    1735                 :             :      computed, so just update them.  */
    1736                 :          58 :   FOR_EACH_FUNCTION (node)
    1737                 :          25 :     if (node->lto_file_data
    1738                 :          25 :         && node->lto_file_data->profile_info.runs)
    1739                 :             :       {
    1740                 :          25 :         int scale;
    1741                 :             : 
    1742                 :          25 :         scale = RDIV (node->count_materialization_scale * max_runs,
    1743                 :             :                       node->lto_file_data->profile_info.runs);
    1744                 :          25 :         node->count_materialization_scale = scale;
    1745                 :          25 :         if (scale < 0)
    1746                 :           0 :           fatal_error (input_location, "Profile information in %s corrupted",
    1747                 :             :                        file_data->file_name);
    1748                 :             : 
    1749                 :          25 :         if (scale == REG_BR_PROB_BASE)
    1750                 :          25 :           continue;
    1751                 :           0 :         for (edge = node->callees; edge; edge = edge->next_callee)
    1752                 :           0 :           if (edge->count.ipa ().nonzero_p ())
    1753                 :           0 :             edge->count = edge->count.apply_scale (scale, REG_BR_PROB_BASE);
    1754                 :           0 :         for (edge = node->indirect_calls; edge; edge = edge->next_callee)
    1755                 :           0 :           if (edge->count.ipa ().nonzero_p ())
    1756                 :           0 :             edge->count = edge->count.apply_scale (scale, REG_BR_PROB_BASE);
    1757                 :           0 :         if (node->count.ipa ().nonzero_p ())
    1758                 :           0 :           node->count = node->count.apply_scale (scale, REG_BR_PROB_BASE);
    1759                 :             :       }
    1760                 :             : }
    1761                 :             : 
    1762                 :             : /* Input and merge the symtab from each of the .o files passed to
    1763                 :             :    lto1.  */
    1764                 :             : 
    1765                 :             : void
    1766                 :       22216 : input_symtab (void)
    1767                 :             : {
    1768                 :       22216 :   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
    1769                 :       22216 :   struct lto_file_decl_data *file_data;
    1770                 :       22216 :   unsigned int j = 0;
    1771                 :       22216 :   struct cgraph_node *node;
    1772                 :             : 
    1773                 :       67672 :   while ((file_data = file_data_vec[j++]))
    1774                 :             :     {
    1775                 :       23240 :       const char *data;
    1776                 :       23240 :       size_t len;
    1777                 :       23240 :       class lto_input_block *ib;
    1778                 :       23240 :       vec<symtab_node *> nodes;
    1779                 :             : 
    1780                 :       23240 :       ib = lto_create_simple_input_block (file_data, LTO_section_symtab_nodes,
    1781                 :             :                                           &data, &len);
    1782                 :       23240 :       if (!ib)
    1783                 :           0 :         fatal_error (input_location,
    1784                 :             :                      "cannot find LTO cgraph in %s", file_data->file_name);
    1785                 :       23240 :       input_profile_summary (ib, file_data);
    1786                 :       23240 :       file_data->symtab_node_encoder = lto_symtab_encoder_new (true);
    1787                 :       23240 :       nodes = input_cgraph_1 (file_data, ib);
    1788                 :       23240 :       lto_destroy_simple_input_block (file_data, LTO_section_symtab_nodes,
    1789                 :             :                                       ib, data, len);
    1790                 :             : 
    1791                 :       23240 :       ib = lto_create_simple_input_block (file_data, LTO_section_refs,
    1792                 :             :                                           &data, &len);
    1793                 :       23240 :       if (!ib)
    1794                 :           0 :         fatal_error (input_location, "cannot find LTO section refs in %s",
    1795                 :             :                      file_data->file_name);
    1796                 :       23240 :       input_refs (ib, nodes);
    1797                 :       23240 :       lto_destroy_simple_input_block (file_data, LTO_section_refs,
    1798                 :             :                                       ib, data, len);
    1799                 :       23240 :       if (flag_ltrans)
    1800                 :        9190 :         input_cgraph_opt_summary (nodes);
    1801                 :       23240 :       nodes.release ();
    1802                 :             :     }
    1803                 :             : 
    1804                 :       22216 :   merge_profile_summaries (file_data_vec);
    1805                 :             : 
    1806                 :             :   /* Clear out the aux field that was used to store enough state to
    1807                 :             :      tell which nodes should be overwritten.  */
    1808                 :      427722 :   FOR_EACH_FUNCTION (node)
    1809                 :             :     {
    1810                 :             :       /* Some nodes may have been created by cgraph_node.  This
    1811                 :             :          happens when the callgraph contains nested functions.  If the
    1812                 :             :          node for the parent function was never emitted to the gimple
    1813                 :             :          file, cgraph_node will create a node for it when setting the
    1814                 :             :          context of the nested function.  */
    1815                 :      191645 :       if (node->lto_file_data)
    1816                 :      191645 :         node->aux = NULL;
    1817                 :             :     }
    1818                 :       22216 : }
    1819                 :             : 
    1820                 :             : static void
    1821                 :           0 : omp_requires_to_name (char *buf, size_t size, HOST_WIDE_INT requires_mask)
    1822                 :             : {
    1823                 :           0 :   char *end = buf + size, *p = buf;
    1824                 :           0 :   if (requires_mask & GOMP_REQUIRES_UNIFIED_ADDRESS)
    1825                 :           0 :     p += snprintf (p, end - p, "unified_address");
    1826                 :           0 :   if (requires_mask & GOMP_REQUIRES_UNIFIED_SHARED_MEMORY)
    1827                 :           0 :     p += snprintf (p, end - p, "%sunified_shared_memory",
    1828                 :             :                    (p == buf ? "" : ", "));
    1829                 :           0 :   if (requires_mask & GOMP_REQUIRES_SELF_MAPS)
    1830                 :           0 :     p += snprintf (p, end - p, "%sself_maps",
    1831                 :             :                    (p == buf ? "" : ", "));
    1832                 :           0 :   if (requires_mask & GOMP_REQUIRES_REVERSE_OFFLOAD)
    1833                 :           0 :     p += snprintf (p, end - p, "%sreverse_offload",
    1834                 :             :                    (p == buf ? "" : ", "));
    1835                 :           0 : }
    1836                 :             : 
    1837                 :             : /* Input function/variable tables that will allow libgomp to look up offload
    1838                 :             :    target code, and store them into OFFLOAD_FUNCS and OFFLOAD_VARS.  */
    1839                 :             : 
    1840                 :             : void
    1841                 :       22216 : input_offload_tables (bool do_force_output)
    1842                 :             : {
    1843                 :       22216 :   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
    1844                 :       22216 :   struct lto_file_decl_data *file_data;
    1845                 :       22216 :   unsigned int j = 0;
    1846                 :       22216 :   const char *requires_fn = NULL;
    1847                 :       22216 :   tree requires_decl = NULL_TREE;
    1848                 :             : 
    1849                 :       22216 :   omp_requires_mask = (omp_requires) 0;
    1850                 :             : 
    1851                 :       45456 :   while ((file_data = file_data_vec[j++]))
    1852                 :             :     {
    1853                 :       23240 :       const char *data;
    1854                 :       23240 :       size_t len;
    1855                 :       23240 :       class lto_input_block *ib
    1856                 :       23240 :         = lto_create_simple_input_block (file_data, LTO_section_offload_table,
    1857                 :             :                                          &data, &len);
    1858                 :       23240 :       if (!ib)
    1859                 :       23240 :         continue;
    1860                 :             : 
    1861                 :           0 :       tree tmp_decl = NULL_TREE;
    1862                 :           0 :       enum LTO_symtab_tags tag
    1863                 :           0 :         = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag);
    1864                 :           0 :       while (tag)
    1865                 :             :         {
    1866                 :             :           if (tag == LTO_symtab_unavail_node)
    1867                 :             :             {
    1868                 :           0 :               tree fn_decl
    1869                 :           0 :                 = lto_input_fn_decl_ref (ib, file_data);
    1870                 :           0 :               vec_safe_push (offload_funcs, fn_decl);
    1871                 :             : 
    1872                 :             :               /* Prevent IPA from removing fn_decl as unreachable, since there
    1873                 :             :                  may be no refs from the parent function to child_fn in offload
    1874                 :             :                  LTO mode.  */
    1875                 :           0 :               if (do_force_output)
    1876                 :           0 :                 cgraph_node::get (fn_decl)->mark_force_output ();
    1877                 :           0 :               tmp_decl = fn_decl;
    1878                 :             :             }
    1879                 :             :           else if (tag == LTO_symtab_variable)
    1880                 :             :             {
    1881                 :           0 :               tree var_decl
    1882                 :           0 :                 = lto_input_var_decl_ref (ib, file_data);
    1883                 :           0 :               vec_safe_push (offload_vars, var_decl);
    1884                 :             : 
    1885                 :             :               /* Prevent IPA from removing var_decl as unused, since there
    1886                 :             :                  may be no refs to var_decl in offload LTO mode.  */
    1887                 :           0 :               if (do_force_output)
    1888                 :           0 :                 varpool_node::get (var_decl)->force_output = 1;
    1889                 :           0 :               tmp_decl = var_decl;
    1890                 :             :             }
    1891                 :             :           else if (tag == LTO_symtab_indirect_function)
    1892                 :             :             {
    1893                 :           0 :               tree fn_decl
    1894                 :           0 :                 = lto_input_fn_decl_ref (ib, file_data);
    1895                 :           0 :               vec_safe_push (offload_ind_funcs, fn_decl);
    1896                 :             : 
    1897                 :             :               /* Prevent IPA from removing fn_decl as unreachable, since there
    1898                 :             :                  may be no refs from the parent function to child_fn in offload
    1899                 :             :                  LTO mode.  */
    1900                 :           0 :               if (do_force_output)
    1901                 :           0 :                 cgraph_node::get (fn_decl)->mark_force_output ();
    1902                 :           0 :               tmp_decl = fn_decl;
    1903                 :             :             }
    1904                 :             :           else if (tag == LTO_symtab_edge)
    1905                 :             :             {
    1906                 :           0 :               static bool error_emitted = false;
    1907                 :           0 :               HOST_WIDE_INT val = streamer_read_hwi (ib);
    1908                 :             : 
    1909                 :           0 :               if (omp_requires_mask == 0)
    1910                 :             :                 {
    1911                 :           0 :                   omp_requires_mask = (omp_requires) val;
    1912                 :           0 :                   requires_decl = tmp_decl;
    1913                 :           0 :                   requires_fn = file_data->file_name;
    1914                 :             :                 }
    1915                 :           0 :               else if (omp_requires_mask != val && !error_emitted)
    1916                 :             :                 {
    1917                 :           0 :                   const char *fn1 = requires_fn;
    1918                 :           0 :                   if (requires_decl != NULL_TREE)
    1919                 :             :                     {
    1920                 :           0 :                       while (DECL_CONTEXT (requires_decl) != NULL_TREE
    1921                 :           0 :                              && TREE_CODE (requires_decl) != TRANSLATION_UNIT_DECL)
    1922                 :           0 :                         requires_decl = DECL_CONTEXT (requires_decl);
    1923                 :           0 :                       if (requires_decl != NULL_TREE)
    1924                 :           0 :                         fn1 = IDENTIFIER_POINTER (DECL_NAME (requires_decl));
    1925                 :             :                     }
    1926                 :             : 
    1927                 :           0 :                   const char *fn2 = file_data->file_name;
    1928                 :           0 :                   if (tmp_decl != NULL_TREE)
    1929                 :             :                     {
    1930                 :           0 :                       while (DECL_CONTEXT (tmp_decl) != NULL_TREE
    1931                 :           0 :                              && TREE_CODE (tmp_decl) != TRANSLATION_UNIT_DECL)
    1932                 :           0 :                         tmp_decl = DECL_CONTEXT (tmp_decl);
    1933                 :           0 :                       if (tmp_decl != NULL_TREE)
    1934                 :           0 :                         fn2 = IDENTIFIER_POINTER (DECL_NAME (tmp_decl));
    1935                 :             :                     }
    1936                 :           0 :                   if (fn1 == fn2)
    1937                 :             :                     {
    1938                 :           0 :                       fn1 = requires_fn;
    1939                 :           0 :                       fn2 = file_data->file_name;
    1940                 :             :                     }
    1941                 :             : 
    1942                 :           0 :                   char buf1[sizeof ("unified_address, unified_shared_memory, "
    1943                 :             :                                     "reverse_offload")];
    1944                 :           0 :                   char buf2[sizeof ("unified_address, unified_shared_memory, "
    1945                 :             :                                     "reverse_offload")];
    1946                 :           0 :                   omp_requires_to_name (buf2, sizeof (buf2),
    1947                 :             :                                         val != OMP_REQUIRES_TARGET_USED
    1948                 :             :                                         ? val
    1949                 :             :                                         : (HOST_WIDE_INT) omp_requires_mask);
    1950                 :           0 :                   if (val != OMP_REQUIRES_TARGET_USED
    1951                 :           0 :                       && omp_requires_mask != OMP_REQUIRES_TARGET_USED)
    1952                 :             :                     {
    1953                 :           0 :                       omp_requires_to_name (buf1, sizeof (buf1),
    1954                 :             :                                             omp_requires_mask);
    1955                 :           0 :                       error ("OpenMP %<requires%> directive with non-identical "
    1956                 :             :                              "clauses in multiple compilation units: %qs vs. "
    1957                 :             :                              "%qs", buf1, buf2);
    1958                 :           0 :                       inform (UNKNOWN_LOCATION, "%qs has %qs", fn1, buf1);
    1959                 :           0 :                       inform (UNKNOWN_LOCATION, "%qs has %qs", fn2, buf2);
    1960                 :             :                     }
    1961                 :             :                   else
    1962                 :             :                     {
    1963                 :           0 :                       error ("OpenMP %<requires%> directive with %qs specified "
    1964                 :             :                              "only in some compilation units", buf2);
    1965                 :           0 :                       inform (UNKNOWN_LOCATION, "%qs has %qs",
    1966                 :             :                               val != OMP_REQUIRES_TARGET_USED ? fn2 : fn1,
    1967                 :             :                               buf2);
    1968                 :           0 :                       inform (UNKNOWN_LOCATION, "but %qs has not",
    1969                 :             :                               val != OMP_REQUIRES_TARGET_USED ? fn1 : fn2);
    1970                 :             :                     }
    1971                 :           0 :                   error_emitted = true;
    1972                 :             :                 }
    1973                 :             :             }
    1974                 :             :           else
    1975                 :           0 :             fatal_error (input_location,
    1976                 :             :                          "invalid offload table in %s", file_data->file_name);
    1977                 :             : 
    1978                 :           0 :           tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag);
    1979                 :             :         }
    1980                 :             : 
    1981                 :           0 :       lto_destroy_simple_input_block (file_data, LTO_section_offload_table,
    1982                 :             :                                       ib, data, len);
    1983                 :             :     }
    1984                 :             : #ifdef ACCEL_COMPILER
    1985                 :             :   char *omp_requires_file = getenv ("GCC_OFFLOAD_OMP_REQUIRES_FILE");
    1986                 :             :   if (omp_requires_file == NULL || omp_requires_file[0] == '\0')
    1987                 :             :     fatal_error (input_location, "GCC_OFFLOAD_OMP_REQUIRES_FILE unset");
    1988                 :             :   FILE *f = fopen (omp_requires_file, "wb");
    1989                 :             :   if (!f)
    1990                 :             :     fatal_error (input_location, "Cannot open omp_requires file %qs",
    1991                 :             :                  omp_requires_file);
    1992                 :             :   uint32_t req_mask = omp_requires_mask;
    1993                 :             :   fwrite (&req_mask, sizeof (req_mask), 1, f);
    1994                 :             :   fclose (f);
    1995                 :             : #endif
    1996                 :       22216 : }
    1997                 :             : 
    1998                 :             : /* True when we need optimization summary for NODE.  */
    1999                 :             : 
    2000                 :             : static int
    2001                 :      163426 : output_cgraph_opt_summary_p (struct cgraph_node *node)
    2002                 :             : {
    2003                 :      163426 :   if (node->clone_of || node->former_clone_of)
    2004                 :             :     return true;
    2005                 :      118478 :   clone_info *info = clone_info::get (node);
    2006                 :      118478 :   return info && (info->tree_map || info->param_adjustments);
    2007                 :             : }
    2008                 :             : 
    2009                 :             : /* Output optimization summary for EDGE to OB.  */
    2010                 :             : static void
    2011                 :           0 : output_edge_opt_summary (struct output_block *ob ATTRIBUTE_UNUSED,
    2012                 :             :                          struct cgraph_edge *edge ATTRIBUTE_UNUSED)
    2013                 :             : {
    2014                 :           0 : }
    2015                 :             : 
    2016                 :             : /* Output optimization summary for NODE to OB.  */
    2017                 :             : 
    2018                 :             : static void
    2019                 :       22474 : output_node_opt_summary (struct output_block *ob,
    2020                 :             :                          struct cgraph_node *node,
    2021                 :             :                          lto_symtab_encoder_t encoder)
    2022                 :             : {
    2023                 :       22474 :   struct ipa_replace_map *map;
    2024                 :       22474 :   int i;
    2025                 :       22474 :   struct cgraph_edge *e;
    2026                 :             : 
    2027                 :             :   /* TODO: Should this code be moved to ipa-param-manipulation?  */
    2028                 :       22474 :   struct bitpack_d bp;
    2029                 :       22474 :   bp = bitpack_create (ob->main_stream);
    2030                 :       22474 :   clone_info *info = clone_info::get (node);
    2031                 :             : 
    2032                 :       41762 :   bp_pack_value (&bp, (info && info->param_adjustments != NULL), 1);
    2033                 :       22474 :   streamer_write_bitpack (&bp);
    2034                 :       45142 :   if (ipa_param_adjustments *adjustments
    2035                 :       22474 :                  = info ? info->param_adjustments : NULL)
    2036                 :             :     {
    2037                 :        3186 :       streamer_write_uhwi (ob, vec_safe_length (adjustments->m_adj_params));
    2038                 :        3186 :       ipa_adjusted_param *adj;
    2039                 :        8039 :       FOR_EACH_VEC_SAFE_ELT (adjustments->m_adj_params, i, adj)
    2040                 :             :         {
    2041                 :        1667 :           bp = bitpack_create (ob->main_stream);
    2042                 :        1667 :           bp_pack_value (&bp, adj->base_index, IPA_PARAM_MAX_INDEX_BITS);
    2043                 :        1667 :           bp_pack_value (&bp, adj->prev_clone_index, IPA_PARAM_MAX_INDEX_BITS);
    2044                 :        1667 :           bp_pack_value (&bp, adj->op, 2);
    2045                 :        1667 :           bp_pack_value (&bp, adj->param_prefix_index, 2);
    2046                 :        1667 :           bp_pack_value (&bp, adj->prev_clone_adjustment, 1);
    2047                 :        1667 :           bp_pack_value (&bp, adj->reverse, 1);
    2048                 :        1667 :           bp_pack_value (&bp, adj->user_flag, 1);
    2049                 :        1667 :           streamer_write_bitpack (&bp);
    2050                 :        1667 :           if (adj->op == IPA_PARAM_OP_SPLIT
    2051                 :        1667 :               || adj->op == IPA_PARAM_OP_NEW)
    2052                 :             :             {
    2053                 :         439 :               stream_write_tree (ob, adj->type, true);
    2054                 :         439 :               if (adj->op == IPA_PARAM_OP_SPLIT)
    2055                 :             :                 {
    2056                 :         439 :                   stream_write_tree (ob, adj->alias_ptr_type, true);
    2057                 :         439 :                   streamer_write_uhwi (ob, adj->unit_offset);
    2058                 :             :                 }
    2059                 :             :             }
    2060                 :             :         }
    2061                 :        3186 :       streamer_write_hwi (ob, adjustments->m_always_copy_start);
    2062                 :        3186 :       bp = bitpack_create (ob->main_stream);
    2063                 :        3186 :       bp_pack_value (&bp, info->param_adjustments->m_skip_return, 1);
    2064                 :        3186 :       streamer_write_bitpack (&bp);
    2065                 :             :     }
    2066                 :             : 
    2067                 :       24499 :   streamer_write_uhwi (ob, info ? vec_safe_length (info->tree_map) : 0);
    2068                 :       22474 :   if (info)
    2069                 :        6796 :     FOR_EACH_VEC_SAFE_ELT (info->tree_map, i, map)
    2070                 :             :       {
    2071                 :        3416 :         streamer_write_uhwi (ob, map->parm_num);
    2072                 :        3416 :         gcc_assert (EXPR_LOCATION (map->new_tree) == UNKNOWN_LOCATION);
    2073                 :        3416 :         stream_write_tree (ob, map->new_tree, true);
    2074                 :             :       }
    2075                 :             : 
    2076                 :       22474 :   if (lto_symtab_encoder_in_partition_p (encoder, node))
    2077                 :             :     {
    2078                 :             :       for (e = node->callees; e; e = e->next_callee)
    2079                 :             :         output_edge_opt_summary (ob, e);
    2080                 :             :       for (e = node->indirect_calls; e; e = e->next_callee)
    2081                 :             :         output_edge_opt_summary (ob, e);
    2082                 :             :     }
    2083                 :       22474 : }
    2084                 :             : 
    2085                 :             : /* Output optimization summaries stored in callgraph.
    2086                 :             :    At the moment it is the clone info structure.  */
    2087                 :             : 
    2088                 :             : static void
    2089                 :        9190 : output_cgraph_opt_summary (void)
    2090                 :             : {
    2091                 :        9190 :   int i, n_nodes;
    2092                 :        9190 :   lto_symtab_encoder_t encoder;
    2093                 :        9190 :   struct output_block *ob = create_output_block (LTO_section_cgraph_opt_sum);
    2094                 :        9190 :   unsigned count = 0;
    2095                 :             : 
    2096                 :        9190 :   ob->symbol = NULL;
    2097                 :        9190 :   encoder = ob->decl_state->symtab_node_encoder;
    2098                 :        9190 :   n_nodes = lto_symtab_encoder_size (encoder);
    2099                 :      114981 :   for (i = 0; i < n_nodes; i++)
    2100                 :             :     {
    2101                 :      105791 :       symtab_node *node = lto_symtab_encoder_deref (encoder, i);
    2102                 :      211582 :       cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
    2103                 :       81713 :       if (cnode && output_cgraph_opt_summary_p (cnode))
    2104                 :       22474 :         count++;
    2105                 :             :     }
    2106                 :        9190 :   streamer_write_uhwi (ob, count);
    2107                 :      114981 :   for (i = 0; i < n_nodes; i++)
    2108                 :             :     {
    2109                 :      105791 :       symtab_node *node = lto_symtab_encoder_deref (encoder, i);
    2110                 :      211582 :       cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
    2111                 :       81713 :       if (cnode && output_cgraph_opt_summary_p (cnode))
    2112                 :             :         {
    2113                 :       22474 :           streamer_write_uhwi (ob, i);
    2114                 :       22474 :           output_node_opt_summary (ob, cnode, encoder);
    2115                 :             :         }
    2116                 :             :     }
    2117                 :        9190 :   produce_asm (ob);
    2118                 :        9190 :   destroy_output_block (ob);
    2119                 :        9190 : }
    2120                 :             : 
    2121                 :             : /* Input optimisation summary of EDGE.  */
    2122                 :             : 
    2123                 :             : static void
    2124                 :           0 : input_edge_opt_summary (struct cgraph_edge *edge ATTRIBUTE_UNUSED,
    2125                 :             :                         class lto_input_block *ib_main ATTRIBUTE_UNUSED)
    2126                 :             : {
    2127                 :           0 : }
    2128                 :             : 
    2129                 :             : /* Input optimisation summary of NODE.  */
    2130                 :             : 
    2131                 :             : static void
    2132                 :       22474 : input_node_opt_summary (struct cgraph_node *node,
    2133                 :             :                         class lto_input_block *ib_main,
    2134                 :             :                         class data_in *data_in)
    2135                 :             : {
    2136                 :       22474 :   int i;
    2137                 :       22474 :   int count;
    2138                 :       22474 :   struct cgraph_edge *e;
    2139                 :             : 
    2140                 :             :   /* TODO: Should this code be moved to ipa-param-manipulation?  */
    2141                 :       22474 :   struct bitpack_d bp;
    2142                 :       22474 :   bp = streamer_read_bitpack (ib_main);
    2143                 :       22474 :   bool have_adjustments = bp_unpack_value (&bp, 1);
    2144                 :       22474 :   clone_info *info = clone_info::get_create (node);
    2145                 :             : 
    2146                 :       22474 :   if (have_adjustments)
    2147                 :             :     {
    2148                 :        3186 :       count = streamer_read_uhwi (ib_main);
    2149                 :        3186 :       vec<ipa_adjusted_param, va_gc> *new_params = NULL;
    2150                 :        4853 :       for (i = 0; i < count; i++)
    2151                 :             :         {
    2152                 :        1667 :           ipa_adjusted_param adj;
    2153                 :        1667 :           memset (&adj, 0, sizeof (adj));
    2154                 :        1667 :           bp = streamer_read_bitpack (ib_main);
    2155                 :        1667 :           adj.base_index = bp_unpack_value (&bp, IPA_PARAM_MAX_INDEX_BITS);
    2156                 :        1667 :           adj.prev_clone_index
    2157                 :        1667 :             = bp_unpack_value (&bp, IPA_PARAM_MAX_INDEX_BITS);
    2158                 :        1667 :           adj.op = (enum ipa_parm_op) bp_unpack_value (&bp, 2);
    2159                 :        1667 :           adj.param_prefix_index = bp_unpack_value (&bp, 2);
    2160                 :        1667 :           adj.prev_clone_adjustment = bp_unpack_value (&bp, 1);
    2161                 :        1667 :           adj.reverse = bp_unpack_value (&bp, 1);
    2162                 :        1667 :           adj.user_flag = bp_unpack_value (&bp, 1);
    2163                 :        1667 :           if (adj.op == IPA_PARAM_OP_SPLIT
    2164                 :        1667 :               || adj.op == IPA_PARAM_OP_NEW)
    2165                 :             :             {
    2166                 :         439 :               adj.type = stream_read_tree (ib_main, data_in);
    2167                 :         439 :               if (adj.op == IPA_PARAM_OP_SPLIT)
    2168                 :             :                 {
    2169                 :         439 :                   adj.alias_ptr_type = stream_read_tree (ib_main, data_in);
    2170                 :         439 :                   adj.unit_offset = streamer_read_uhwi (ib_main);
    2171                 :             :                 }
    2172                 :             :             }
    2173                 :        1667 :           vec_safe_push (new_params, adj);
    2174                 :             :         }
    2175                 :        3186 :       int always_copy_start = streamer_read_hwi (ib_main);
    2176                 :        3186 :       bp = streamer_read_bitpack (ib_main);
    2177                 :        3186 :       bool skip_return = bp_unpack_value (&bp, 1);
    2178                 :        3186 :       info->param_adjustments
    2179                 :        3186 :         = (new (ggc_alloc <ipa_param_adjustments> ())
    2180                 :        3186 :            ipa_param_adjustments (new_params, always_copy_start, skip_return));
    2181                 :             :     }
    2182                 :             : 
    2183                 :       22474 :   count = streamer_read_uhwi (ib_main);
    2184                 :       25890 :   for (i = 0; i < count; i++)
    2185                 :             :     {
    2186                 :        3416 :       struct ipa_replace_map *map = ggc_alloc<ipa_replace_map> ();
    2187                 :             : 
    2188                 :        3416 :       vec_safe_push (info->tree_map, map);
    2189                 :        3416 :       map->parm_num = streamer_read_uhwi (ib_main);
    2190                 :        3416 :       map->new_tree = stream_read_tree (ib_main, data_in);
    2191                 :             :     }
    2192                 :       22474 :   for (e = node->callees; e; e = e->next_callee)
    2193                 :             :     input_edge_opt_summary (e, ib_main);
    2194                 :       22474 :   for (e = node->indirect_calls; e; e = e->next_callee)
    2195                 :             :     input_edge_opt_summary (e, ib_main);
    2196                 :       22474 : }
    2197                 :             : 
    2198                 :             : /* Read section in file FILE_DATA of length LEN with data DATA.  */
    2199                 :             : 
    2200                 :             : static void
    2201                 :        9190 : input_cgraph_opt_section (struct lto_file_decl_data *file_data,
    2202                 :             :                           const char *data, size_t len,
    2203                 :             :                           vec<symtab_node *> nodes)
    2204                 :             : {
    2205                 :        9190 :   const struct lto_function_header *header =
    2206                 :             :     (const struct lto_function_header *) data;
    2207                 :        9190 :   const int cfg_offset = sizeof (struct lto_function_header);
    2208                 :        9190 :   const int main_offset = cfg_offset + header->cfg_size;
    2209                 :        9190 :   const int string_offset = main_offset + header->main_size;
    2210                 :        9190 :   class data_in *data_in;
    2211                 :        9190 :   unsigned int i;
    2212                 :        9190 :   unsigned int count;
    2213                 :             : 
    2214                 :        9190 :   lto_input_block ib_main ((const char *) data + main_offset,
    2215                 :        9190 :                            header->main_size, file_data);
    2216                 :             : 
    2217                 :        9190 :   data_in =
    2218                 :       18380 :     lto_data_in_create (file_data, (const char *) data + string_offset,
    2219                 :        9190 :                         header->string_size, vNULL);
    2220                 :        9190 :   count = streamer_read_uhwi (&ib_main);
    2221                 :             : 
    2222                 :       31664 :   for (i = 0; i < count; i++)
    2223                 :             :     {
    2224                 :       22474 :       int ref = streamer_read_uhwi (&ib_main);
    2225                 :       44948 :       input_node_opt_summary (dyn_cast<cgraph_node *> (nodes[ref]),
    2226                 :             :                               &ib_main, data_in);
    2227                 :             :     }
    2228                 :        9190 :   lto_free_section_data (file_data, LTO_section_cgraph_opt_sum, NULL, data,
    2229                 :             :                          len);
    2230                 :        9190 :   lto_data_in_delete (data_in);
    2231                 :        9190 : }
    2232                 :             : 
    2233                 :             : /* Input optimization summary of cgraph.  */
    2234                 :             : 
    2235                 :             : static void
    2236                 :        9190 : input_cgraph_opt_summary (vec<symtab_node *> nodes)
    2237                 :             : {
    2238                 :        9190 :   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
    2239                 :        9190 :   struct lto_file_decl_data *file_data;
    2240                 :        9190 :   unsigned int j = 0;
    2241                 :             : 
    2242                 :       27570 :   while ((file_data = file_data_vec[j++]))
    2243                 :             :     {
    2244                 :        9190 :       size_t len;
    2245                 :        9190 :       const char *data
    2246                 :        9190 :         = lto_get_summary_section_data (file_data, LTO_section_cgraph_opt_sum,
    2247                 :             :                                         &len);
    2248                 :        9190 :       if (data)
    2249                 :        9190 :         input_cgraph_opt_section (file_data, data, len, nodes);
    2250                 :             :     }
    2251                 :        9190 : }
        

Generated by: LCOV version 2.1-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.