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