Home | History | Annotate | Line # | Download | only in gcc
      1  1.1  mrg /* Routines for emitting trees to a file stream.
      2  1.1  mrg 
      3  1.1  mrg    Copyright (C) 2011-2022 Free Software Foundation, Inc.
      4  1.1  mrg    Contributed by Diego Novillo <dnovillo (at) google.com>
      5  1.1  mrg 
      6  1.1  mrg This file is part of GCC.
      7  1.1  mrg 
      8  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      9  1.1  mrg the terms of the GNU General Public License as published by the Free
     10  1.1  mrg Software Foundation; either version 3, or (at your option) any later
     11  1.1  mrg version.
     12  1.1  mrg 
     13  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     14  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     15  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     16  1.1  mrg for more details.
     17  1.1  mrg 
     18  1.1  mrg You should have received a copy of the GNU General Public License
     19  1.1  mrg along with GCC; see the file COPYING3.  If not see
     20  1.1  mrg <http://www.gnu.org/licenses/>.  */
     21  1.1  mrg 
     22  1.1  mrg #include "config.h"
     23  1.1  mrg #include "system.h"
     24  1.1  mrg #include "coretypes.h"
     25  1.1  mrg #include "backend.h"
     26  1.1  mrg #include "target.h"
     27  1.1  mrg #include "tree.h"
     28  1.1  mrg #include "gimple.h"
     29  1.1  mrg #include "tree-streamer.h"
     30  1.1  mrg #include "cgraph.h"
     31  1.1  mrg #include "alias.h"
     32  1.1  mrg #include "stor-layout.h"
     33  1.1  mrg #include "gomp-constants.h"
     34  1.1  mrg #include "print-tree.h"
     35  1.1  mrg 
     36  1.1  mrg 
     37  1.1  mrg /* Output the STRING constant to the string
     38  1.1  mrg    table in OB.  Then put the index onto the INDEX_STREAM.  */
     39  1.1  mrg 
     40  1.1  mrg void
     41  1.1  mrg streamer_write_string_cst (struct output_block *ob,
     42  1.1  mrg 			   struct lto_output_stream *index_stream,
     43  1.1  mrg 			   tree string)
     44  1.1  mrg {
     45  1.1  mrg   streamer_write_string_with_length (ob, index_stream,
     46  1.1  mrg 				     string ? TREE_STRING_POINTER (string)
     47  1.1  mrg 					    : NULL,
     48  1.1  mrg 				     string ? TREE_STRING_LENGTH (string) : 0,
     49  1.1  mrg 				     true);
     50  1.1  mrg }
     51  1.1  mrg 
     52  1.1  mrg 
     53  1.1  mrg /* Output the identifier ID to the string
     54  1.1  mrg    table in OB.  Then put the index onto the INDEX_STREAM.  */
     55  1.1  mrg 
     56  1.1  mrg static void
     57  1.1  mrg write_identifier (struct output_block *ob,
     58  1.1  mrg 		   struct lto_output_stream *index_stream,
     59  1.1  mrg 		   tree id)
     60  1.1  mrg {
     61  1.1  mrg   streamer_write_string_with_length (ob, index_stream,
     62  1.1  mrg 				     IDENTIFIER_POINTER (id),
     63  1.1  mrg 				     IDENTIFIER_LENGTH (id),
     64  1.1  mrg 				     true);
     65  1.1  mrg }
     66  1.1  mrg 
     67  1.1  mrg 
     68  1.1  mrg /* Pack all the non-pointer fields of the TS_BASE structure of
     69  1.1  mrg    expression EXPR into bitpack BP.  */
     70  1.1  mrg 
     71  1.1  mrg static inline void
     72  1.1  mrg pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
     73  1.1  mrg {
     74  1.1  mrg   if (streamer_debugging)
     75  1.1  mrg     bp_pack_value (bp, TREE_CODE (expr), 16);
     76  1.1  mrg   if (!TYPE_P (expr))
     77  1.1  mrg     {
     78  1.1  mrg       bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
     79  1.1  mrg       bp_pack_value (bp, TREE_CONSTANT (expr), 1);
     80  1.1  mrg       bp_pack_value (bp, TREE_READONLY (expr), 1);
     81  1.1  mrg 
     82  1.1  mrg       /* TREE_PUBLIC is used on types to indicate that the type
     83  1.1  mrg 	 has a TYPE_CACHED_VALUES vector.  This is not streamed out,
     84  1.1  mrg 	 so we skip it here.  */
     85  1.1  mrg       bp_pack_value (bp, TREE_PUBLIC (expr), 1);
     86  1.1  mrg     }
     87  1.1  mrg   else
     88  1.1  mrg     bp_pack_value (bp, 0, 4);
     89  1.1  mrg   bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
     90  1.1  mrg   bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
     91  1.1  mrg   if (DECL_P (expr))
     92  1.1  mrg     {
     93  1.1  mrg       bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
     94  1.1  mrg       bp_pack_value (bp, DECL_NAMELESS (expr), 1);
     95  1.1  mrg     }
     96  1.1  mrg   else if (TYPE_P (expr))
     97  1.1  mrg     bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
     98  1.1  mrg   else
     99  1.1  mrg     bp_pack_value (bp, 0, 1);
    100  1.1  mrg   /* We write debug info two times, do not confuse the second one.
    101  1.1  mrg      The only relevant TREE_ASM_WRITTEN use is on SSA names.  */
    102  1.1  mrg   bp_pack_value (bp, (TREE_CODE (expr) != SSA_NAME
    103  1.1  mrg 		      ? 0 : TREE_ASM_WRITTEN (expr)), 1);
    104  1.1  mrg   if (TYPE_P (expr))
    105  1.1  mrg     bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
    106  1.1  mrg   else
    107  1.1  mrg     bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
    108  1.1  mrg   bp_pack_value (bp, TREE_NOTHROW (expr), 1);
    109  1.1  mrg   bp_pack_value (bp, TREE_STATIC (expr), 1);
    110  1.1  mrg   if (TREE_CODE (expr) != TREE_BINFO)
    111  1.1  mrg     bp_pack_value (bp, TREE_PRIVATE (expr), 1);
    112  1.1  mrg   else
    113  1.1  mrg     bp_pack_value (bp, 0, 1);
    114  1.1  mrg   bp_pack_value (bp, TREE_PROTECTED (expr), 1);
    115  1.1  mrg   bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
    116  1.1  mrg   if (TYPE_P (expr))
    117  1.1  mrg     {
    118  1.1  mrg       if (AGGREGATE_TYPE_P (expr))
    119  1.1  mrg 	bp_pack_value (bp, TYPE_REVERSE_STORAGE_ORDER (expr), 1);
    120  1.1  mrg       else
    121  1.1  mrg 	bp_pack_value (bp, TYPE_SATURATING (expr), 1);
    122  1.1  mrg       if (lto_stream_offload_p)
    123  1.1  mrg 	/* Host and offload targets have no common meaning of address
    124  1.1  mrg 	   spaces.  */
    125  1.1  mrg 	;
    126  1.1  mrg       else
    127  1.1  mrg 	bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8);
    128  1.1  mrg     }
    129  1.1  mrg   else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
    130  1.1  mrg     {
    131  1.1  mrg       bp_pack_value (bp, REF_REVERSE_STORAGE_ORDER (expr), 1);
    132  1.1  mrg       bp_pack_value (bp, 0, 8);
    133  1.1  mrg     }
    134  1.1  mrg   else if (TREE_CODE (expr) == SSA_NAME)
    135  1.1  mrg     {
    136  1.1  mrg       bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
    137  1.1  mrg       bp_pack_value (bp, 0, 8);
    138  1.1  mrg     }
    139  1.1  mrg   else if (TREE_CODE (expr) == CALL_EXPR)
    140  1.1  mrg     {
    141  1.1  mrg       bp_pack_value (bp, CALL_EXPR_BY_DESCRIPTOR (expr), 1);
    142  1.1  mrg       bp_pack_value (bp, 0, 8);
    143  1.1  mrg     }
    144  1.1  mrg   else
    145  1.1  mrg     bp_pack_value (bp, 0, 9);
    146  1.1  mrg }
    147  1.1  mrg 
    148  1.1  mrg 
    149  1.1  mrg /* Pack all the non-pointer fields of the TS_INTEGER_CST structure of
    150  1.1  mrg    expression EXPR into bitpack BP.  */
    151  1.1  mrg 
    152  1.1  mrg static void
    153  1.1  mrg pack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
    154  1.1  mrg {
    155  1.1  mrg   int i;
    156  1.1  mrg   /* Note that the number of elements has already been written out in
    157  1.1  mrg      streamer_write_tree_header.  */
    158  1.1  mrg   for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
    159  1.1  mrg     bp_pack_var_len_int (bp, TREE_INT_CST_ELT (expr, i));
    160  1.1  mrg }
    161  1.1  mrg 
    162  1.1  mrg 
    163  1.1  mrg /* Pack all the non-pointer fields of the TS_REAL_CST structure of
    164  1.1  mrg    expression EXPR into bitpack BP.  */
    165  1.1  mrg 
    166  1.1  mrg static void
    167  1.1  mrg pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
    168  1.1  mrg {
    169  1.1  mrg   unsigned i;
    170  1.1  mrg   REAL_VALUE_TYPE r;
    171  1.1  mrg 
    172  1.1  mrg   r = TREE_REAL_CST (expr);
    173  1.1  mrg   bp_pack_value (bp, r.cl, 2);
    174  1.1  mrg   bp_pack_value (bp, r.decimal, 1);
    175  1.1  mrg   bp_pack_value (bp, r.sign, 1);
    176  1.1  mrg   bp_pack_value (bp, r.signalling, 1);
    177  1.1  mrg   bp_pack_value (bp, r.canonical, 1);
    178  1.1  mrg   bp_pack_value (bp, r.uexp, EXP_BITS);
    179  1.1  mrg   for (i = 0; i < SIGSZ; i++)
    180  1.1  mrg     bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
    181  1.1  mrg }
    182  1.1  mrg 
    183  1.1  mrg 
    184  1.1  mrg /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
    185  1.1  mrg    expression EXPR into bitpack BP.  */
    186  1.1  mrg 
    187  1.1  mrg static void
    188  1.1  mrg pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
    189  1.1  mrg {
    190  1.1  mrg   struct fixed_value fv = TREE_FIXED_CST (expr);
    191  1.1  mrg   bp_pack_machine_mode (bp, fv.mode);
    192  1.1  mrg   bp_pack_var_len_int (bp, fv.data.low);
    193  1.1  mrg   bp_pack_var_len_int (bp, fv.data.high);
    194  1.1  mrg }
    195  1.1  mrg 
    196  1.1  mrg /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
    197  1.1  mrg    of expression EXPR into bitpack BP.  */
    198  1.1  mrg 
    199  1.1  mrg static void
    200  1.1  mrg pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
    201  1.1  mrg {
    202  1.1  mrg   bp_pack_machine_mode (bp, DECL_MODE (expr));
    203  1.1  mrg   bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
    204  1.1  mrg   bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
    205  1.1  mrg   bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
    206  1.1  mrg   bp_pack_value (bp, DECL_ABSTRACT_P (expr), 1);
    207  1.1  mrg   bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
    208  1.1  mrg   bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
    209  1.1  mrg   bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
    210  1.1  mrg   bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
    211  1.1  mrg   bp_pack_value (bp, DECL_NOT_GIMPLE_REG_P (expr), 1);
    212  1.1  mrg   bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
    213  1.1  mrg 
    214  1.1  mrg   if (TREE_CODE (expr) == LABEL_DECL)
    215  1.1  mrg     {
    216  1.1  mrg       /* Note that we do not write LABEL_DECL_UID.  The reader will
    217  1.1  mrg 	 always assume an initial value of -1 so that the
    218  1.1  mrg 	 label_to_block_map is recreated by gimple_set_bb.  */
    219  1.1  mrg       bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
    220  1.1  mrg     }
    221  1.1  mrg 
    222  1.1  mrg   else if (TREE_CODE (expr) == FIELD_DECL)
    223  1.1  mrg     {
    224  1.1  mrg       bp_pack_value (bp, DECL_PACKED (expr), 1);
    225  1.1  mrg       bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
    226  1.1  mrg       bp_pack_value (bp, DECL_PADDING_P (expr), 1);
    227  1.1  mrg       if (DECL_BIT_FIELD (expr))
    228  1.1  mrg 	bp_pack_value (bp, DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (expr), 1);
    229  1.1  mrg       else
    230  1.1  mrg 	bp_pack_value (bp, DECL_FIELD_ABI_IGNORED (expr), 1);
    231  1.1  mrg       bp_pack_value (bp, expr->decl_common.off_align, 8);
    232  1.1  mrg     }
    233  1.1  mrg 
    234  1.1  mrg   else if (VAR_P (expr))
    235  1.1  mrg     {
    236  1.1  mrg       bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
    237  1.1  mrg       bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
    238  1.1  mrg     }
    239  1.1  mrg 
    240  1.1  mrg   else if (TREE_CODE (expr) == PARM_DECL)
    241  1.1  mrg     bp_pack_value (bp, DECL_HIDDEN_STRING_LENGTH (expr), 1);
    242  1.1  mrg 
    243  1.1  mrg   if (TREE_CODE (expr) == RESULT_DECL
    244  1.1  mrg       || TREE_CODE (expr) == PARM_DECL
    245  1.1  mrg       || VAR_P (expr))
    246  1.1  mrg     {
    247  1.1  mrg       bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
    248  1.1  mrg       if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
    249  1.1  mrg 	bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
    250  1.1  mrg     }
    251  1.1  mrg }
    252  1.1  mrg 
    253  1.1  mrg 
    254  1.1  mrg /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
    255  1.1  mrg    of expression EXPR into bitpack BP.  */
    256  1.1  mrg 
    257  1.1  mrg static void
    258  1.1  mrg pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
    259  1.1  mrg {
    260  1.1  mrg   bp_pack_value (bp, DECL_REGISTER (expr), 1);
    261  1.1  mrg }
    262  1.1  mrg 
    263  1.1  mrg 
    264  1.1  mrg /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
    265  1.1  mrg    of expression EXPR into bitpack BP.  */
    266  1.1  mrg 
    267  1.1  mrg static void
    268  1.1  mrg pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
    269  1.1  mrg {
    270  1.1  mrg   bp_pack_value (bp, DECL_COMMON (expr), 1);
    271  1.1  mrg   bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
    272  1.1  mrg   bp_pack_value (bp, DECL_WEAK (expr), 1);
    273  1.1  mrg   bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr),  1);
    274  1.1  mrg   bp_pack_value (bp, DECL_COMDAT (expr),  1);
    275  1.1  mrg   bp_pack_value (bp, DECL_VISIBILITY (expr),  2);
    276  1.1  mrg   bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr),  1);
    277  1.1  mrg 
    278  1.1  mrg   if (VAR_P (expr))
    279  1.1  mrg     {
    280  1.1  mrg       bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
    281  1.1  mrg       /* DECL_IN_TEXT_SECTION is set during final asm output only. */
    282  1.1  mrg       bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
    283  1.1  mrg     }
    284  1.1  mrg 
    285  1.1  mrg   if (TREE_CODE (expr) == FUNCTION_DECL)
    286  1.1  mrg     {
    287  1.1  mrg       bp_pack_value (bp, DECL_FINAL_P (expr), 1);
    288  1.1  mrg       bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1);
    289  1.1  mrg       bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1);
    290  1.1  mrg     }
    291  1.1  mrg }
    292  1.1  mrg 
    293  1.1  mrg 
    294  1.1  mrg /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
    295  1.1  mrg    of expression EXPR into bitpack BP.  */
    296  1.1  mrg 
    297  1.1  mrg static void
    298  1.1  mrg pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
    299  1.1  mrg {
    300  1.1  mrg   bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
    301  1.1  mrg 		DECL_BUILT_IN_CLASS (expr));
    302  1.1  mrg   bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
    303  1.1  mrg   bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
    304  1.1  mrg   bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
    305  1.1  mrg   bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
    306  1.1  mrg   bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
    307  1.1  mrg   bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
    308  1.1  mrg   bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
    309  1.1  mrg   bp_pack_value (bp, FUNCTION_DECL_DECL_TYPE (expr), 2);
    310  1.1  mrg   bp_pack_value (bp, DECL_IS_OPERATOR_DELETE_P (expr), 1);
    311  1.1  mrg   bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
    312  1.1  mrg   bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
    313  1.1  mrg   bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
    314  1.1  mrg   bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
    315  1.1  mrg   bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
    316  1.1  mrg   bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
    317  1.1  mrg   bp_pack_value (bp, DECL_PURE_P (expr), 1);
    318  1.1  mrg   bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
    319  1.1  mrg   bp_pack_value (bp, DECL_IS_REPLACEABLE_OPERATOR (expr), 1);
    320  1.1  mrg   if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
    321  1.1  mrg     bp_pack_value (bp, DECL_UNCHECKED_FUNCTION_CODE (expr), 32);
    322  1.1  mrg }
    323  1.1  mrg 
    324  1.1  mrg 
    325  1.1  mrg /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
    326  1.1  mrg    of expression EXPR into bitpack BP.  */
    327  1.1  mrg 
    328  1.1  mrg static void
    329  1.1  mrg pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
    330  1.1  mrg {
    331  1.1  mrg   /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags
    332  1.1  mrg      not necessary valid in a global context.
    333  1.1  mrg      Use the raw value previously set by layout_type.  */
    334  1.1  mrg   bp_pack_machine_mode (bp, TYPE_MODE_RAW (expr));
    335  1.1  mrg   /* TYPE_NO_FORCE_BLK is private to stor-layout and need
    336  1.1  mrg      no streaming.  */
    337  1.1  mrg   bp_pack_value (bp, TYPE_PACKED (expr), 1);
    338  1.1  mrg   bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
    339  1.1  mrg   bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
    340  1.1  mrg   bp_pack_value (bp, TYPE_READONLY (expr), 1);
    341  1.1  mrg   unsigned vla_p;
    342  1.1  mrg   if (in_lto_p)
    343  1.1  mrg     vla_p = TYPE_LANG_FLAG_0 (TYPE_MAIN_VARIANT (expr));
    344  1.1  mrg   else
    345  1.1  mrg     vla_p = variably_modified_type_p (expr, NULL_TREE);
    346  1.1  mrg   bp_pack_value (bp, vla_p, 1);
    347  1.1  mrg   /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark
    348  1.1  mrg      types that are opaque for TBAA.  This however did not work as intended,
    349  1.1  mrg      because TYPE_ALIAS_SET == 0 was regularly lost in type merging.  */
    350  1.1  mrg   if (RECORD_OR_UNION_TYPE_P (expr))
    351  1.1  mrg     {
    352  1.1  mrg       bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
    353  1.1  mrg       bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
    354  1.1  mrg       /* alias_ptr_types_compatible_p relies on fact that during LTO
    355  1.1  mrg          types do not get refined from WPA time to ltrans.  */
    356  1.1  mrg       bp_pack_value (bp, flag_wpa && TYPE_CANONICAL (expr)
    357  1.1  mrg 			 ? TYPE_CXX_ODR_P (TYPE_CANONICAL (expr))
    358  1.1  mrg 			 : TYPE_CXX_ODR_P (expr), 1);
    359  1.1  mrg     }
    360  1.1  mrg   else if (TREE_CODE (expr) == ARRAY_TYPE)
    361  1.1  mrg     bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
    362  1.1  mrg   if (TREE_CODE (expr) == ARRAY_TYPE || TREE_CODE (expr) == INTEGER_TYPE)
    363  1.1  mrg     bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
    364  1.1  mrg   if (AGGREGATE_TYPE_P (expr))
    365  1.1  mrg     bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1);
    366  1.1  mrg   bp_pack_value (bp, TYPE_EMPTY_P (expr), 1);
    367  1.1  mrg   bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
    368  1.1  mrg   bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
    369  1.1  mrg }
    370  1.1  mrg 
    371  1.1  mrg 
    372  1.1  mrg /* Pack all the non-pointer fields of the TS_BLOCK structure
    373  1.1  mrg    of expression EXPR into bitpack BP.  */
    374  1.1  mrg 
    375  1.1  mrg static void
    376  1.1  mrg pack_ts_block_value_fields (struct output_block *ob,
    377  1.1  mrg 			    struct bitpack_d *bp, tree expr)
    378  1.1  mrg {
    379  1.1  mrg   /* BLOCK_NUMBER is recomputed.  */
    380  1.1  mrg   /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
    381  1.1  mrg      that represent inlined function scopes.
    382  1.1  mrg      For the rest them on the floor instead of ICEing in dwarf2out.cc.  */
    383  1.1  mrg   if (inlined_function_outer_scope_p (expr))
    384  1.1  mrg     stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
    385  1.1  mrg   else
    386  1.1  mrg     stream_output_location (ob, bp, UNKNOWN_LOCATION);
    387  1.1  mrg }
    388  1.1  mrg 
    389  1.1  mrg /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
    390  1.1  mrg    of expression EXPR into bitpack BP.  */
    391  1.1  mrg 
    392  1.1  mrg static void
    393  1.1  mrg pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
    394  1.1  mrg 					    struct bitpack_d *bp, tree expr)
    395  1.1  mrg {
    396  1.1  mrg   bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
    397  1.1  mrg }
    398  1.1  mrg 
    399  1.1  mrg 
    400  1.1  mrg /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
    401  1.1  mrg    of expression EXPR into bitpack BP.  */
    402  1.1  mrg 
    403  1.1  mrg static void
    404  1.1  mrg pack_ts_omp_clause_value_fields (struct output_block *ob,
    405  1.1  mrg 				 struct bitpack_d *bp, tree expr)
    406  1.1  mrg {
    407  1.1  mrg   stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
    408  1.1  mrg   switch (OMP_CLAUSE_CODE (expr))
    409  1.1  mrg     {
    410  1.1  mrg     case OMP_CLAUSE_DEFAULT:
    411  1.1  mrg       bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
    412  1.1  mrg 		    OMP_CLAUSE_DEFAULT_KIND (expr));
    413  1.1  mrg       break;
    414  1.1  mrg     case OMP_CLAUSE_SCHEDULE:
    415  1.1  mrg       bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
    416  1.1  mrg 		    OMP_CLAUSE_SCHEDULE_KIND (expr));
    417  1.1  mrg       break;
    418  1.1  mrg     case OMP_CLAUSE_DEPEND:
    419  1.1  mrg       bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
    420  1.1  mrg 		    OMP_CLAUSE_DEPEND_KIND (expr));
    421  1.1  mrg       break;
    422  1.1  mrg     case OMP_CLAUSE_MAP:
    423  1.1  mrg       bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
    424  1.1  mrg 		    OMP_CLAUSE_MAP_KIND (expr));
    425  1.1  mrg       break;
    426  1.1  mrg     case OMP_CLAUSE_PROC_BIND:
    427  1.1  mrg       bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
    428  1.1  mrg 		    OMP_CLAUSE_PROC_BIND_KIND (expr));
    429  1.1  mrg       break;
    430  1.1  mrg     case OMP_CLAUSE_REDUCTION:
    431  1.1  mrg     case OMP_CLAUSE_TASK_REDUCTION:
    432  1.1  mrg     case OMP_CLAUSE_IN_REDUCTION:
    433  1.1  mrg       bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
    434  1.1  mrg 		    OMP_CLAUSE_REDUCTION_CODE (expr));
    435  1.1  mrg       break;
    436  1.1  mrg     default:
    437  1.1  mrg       break;
    438  1.1  mrg     }
    439  1.1  mrg }
    440  1.1  mrg 
    441  1.1  mrg 
    442  1.1  mrg /* Pack all the bitfields in EXPR into a bit pack.  */
    443  1.1  mrg 
    444  1.1  mrg void
    445  1.1  mrg streamer_write_tree_bitfields (struct output_block *ob, tree expr)
    446  1.1  mrg {
    447  1.1  mrg   bitpack_d bp = bitpack_create (ob->main_stream);
    448  1.1  mrg   enum tree_code code;
    449  1.1  mrg 
    450  1.1  mrg   code = TREE_CODE (expr);
    451  1.1  mrg 
    452  1.1  mrg   /* Note that all these functions are highly sensitive to changes in
    453  1.1  mrg      the types and sizes of each of the fields being packed.  */
    454  1.1  mrg   pack_ts_base_value_fields (&bp, expr);
    455  1.1  mrg 
    456  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
    457  1.1  mrg     pack_ts_int_cst_value_fields (&bp, expr);
    458  1.1  mrg 
    459  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
    460  1.1  mrg     pack_ts_real_cst_value_fields (&bp, expr);
    461  1.1  mrg 
    462  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
    463  1.1  mrg     pack_ts_fixed_cst_value_fields (&bp, expr);
    464  1.1  mrg 
    465  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
    466  1.1  mrg     stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr));
    467  1.1  mrg 
    468  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
    469  1.1  mrg     pack_ts_decl_common_value_fields (&bp, expr);
    470  1.1  mrg 
    471  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
    472  1.1  mrg     pack_ts_decl_wrtl_value_fields (&bp, expr);
    473  1.1  mrg 
    474  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
    475  1.1  mrg     pack_ts_decl_with_vis_value_fields (&bp, expr);
    476  1.1  mrg 
    477  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
    478  1.1  mrg     pack_ts_function_decl_value_fields (&bp, expr);
    479  1.1  mrg 
    480  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
    481  1.1  mrg     pack_ts_type_common_value_fields (&bp, expr);
    482  1.1  mrg 
    483  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
    484  1.1  mrg     {
    485  1.1  mrg       stream_output_location (ob, &bp, EXPR_LOCATION (expr));
    486  1.1  mrg       if (code == MEM_REF
    487  1.1  mrg 	  || code == TARGET_MEM_REF)
    488  1.1  mrg 	{
    489  1.1  mrg 	  bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
    490  1.1  mrg 	  if (MR_DEPENDENCE_CLIQUE (expr) != 0)
    491  1.1  mrg 	    bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
    492  1.1  mrg 	}
    493  1.1  mrg       else if (code == CALL_EXPR)
    494  1.1  mrg 	bp_pack_enum (&bp, internal_fn, IFN_LAST, CALL_EXPR_IFN (expr));
    495  1.1  mrg     }
    496  1.1  mrg 
    497  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
    498  1.1  mrg     pack_ts_block_value_fields (ob, &bp, expr);
    499  1.1  mrg 
    500  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
    501  1.1  mrg     pack_ts_translation_unit_decl_value_fields (ob, &bp, expr);
    502  1.1  mrg 
    503  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
    504  1.1  mrg     cl_optimization_stream_out (ob, &bp, TREE_OPTIMIZATION (expr));
    505  1.1  mrg 
    506  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
    507  1.1  mrg     {
    508  1.1  mrg       bp_pack_enum (&bp, clobber_kind, CLOBBER_LAST, CLOBBER_KIND (expr));
    509  1.1  mrg       bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr));
    510  1.1  mrg     }
    511  1.1  mrg 
    512  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
    513  1.1  mrg       /* Don't stream these when passing things to a different target.  */
    514  1.1  mrg       && !lto_stream_offload_p)
    515  1.1  mrg     cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr));
    516  1.1  mrg 
    517  1.1  mrg   if (code == OMP_CLAUSE)
    518  1.1  mrg     pack_ts_omp_clause_value_fields (ob, &bp, expr);
    519  1.1  mrg 
    520  1.1  mrg   streamer_write_bitpack (&bp);
    521  1.1  mrg }
    522  1.1  mrg 
    523  1.1  mrg 
    524  1.1  mrg /* Emit the chain of tree nodes starting at T.  OB is the output block
    525  1.1  mrg    to write to.  REF_P is true if chain elements should be emitted
    526  1.1  mrg    as references.  */
    527  1.1  mrg 
    528  1.1  mrg static void
    529  1.1  mrg streamer_write_chain (struct output_block *ob, tree t)
    530  1.1  mrg {
    531  1.1  mrg   while (t)
    532  1.1  mrg     {
    533  1.1  mrg       /* We avoid outputting external vars or functions by reference
    534  1.1  mrg 	 to the global decls section as we do not want to have them
    535  1.1  mrg 	 enter decl merging.  We should not need to do this anymore because
    536  1.1  mrg 	 free_lang_data removes them from block scopes.  */
    537  1.1  mrg       gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
    538  1.1  mrg       stream_write_tree_ref (ob, t);
    539  1.1  mrg 
    540  1.1  mrg       t = TREE_CHAIN (t);
    541  1.1  mrg     }
    542  1.1  mrg 
    543  1.1  mrg   /* Write a sentinel to terminate the chain.  */
    544  1.1  mrg   stream_write_tree_ref (ob, NULL_TREE);
    545  1.1  mrg }
    546  1.1  mrg 
    547  1.1  mrg 
    548  1.1  mrg /* Write all pointer fields in the TS_COMMON structure of EXPR to output
    549  1.1  mrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
    550  1.1  mrg    fields.  */
    551  1.1  mrg 
    552  1.1  mrg static void
    553  1.1  mrg write_ts_common_tree_pointers (struct output_block *ob, tree expr)
    554  1.1  mrg {
    555  1.1  mrg   if (TREE_CODE (expr) != IDENTIFIER_NODE)
    556  1.1  mrg     stream_write_tree_ref (ob, TREE_TYPE (expr));
    557  1.1  mrg }
    558  1.1  mrg 
    559  1.1  mrg 
    560  1.1  mrg /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
    561  1.1  mrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
    562  1.1  mrg    fields.  */
    563  1.1  mrg 
    564  1.1  mrg static void
    565  1.1  mrg write_ts_vector_tree_pointers (struct output_block *ob, tree expr)
    566  1.1  mrg {
    567  1.1  mrg   /* Note that the number of elements for EXPR has already been emitted
    568  1.1  mrg      in EXPR's header (see streamer_write_tree_header).  */
    569  1.1  mrg   unsigned int count = vector_cst_encoded_nelts (expr);
    570  1.1  mrg   for (unsigned int i = 0; i < count; ++i)
    571  1.1  mrg     stream_write_tree_ref (ob, VECTOR_CST_ENCODED_ELT (expr, i));
    572  1.1  mrg }
    573  1.1  mrg 
    574  1.1  mrg 
    575  1.1  mrg /* Write all pointer fields in the TS_POLY_INT_CST structure of EXPR to
    576  1.1  mrg    output block OB.  If REF_P is true, write a reference to EXPR's pointer
    577  1.1  mrg    fields.  */
    578  1.1  mrg 
    579  1.1  mrg static void
    580  1.1  mrg write_ts_poly_tree_pointers (struct output_block *ob, tree expr)
    581  1.1  mrg {
    582  1.1  mrg   for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
    583  1.1  mrg     stream_write_tree_ref (ob, POLY_INT_CST_COEFF (expr, i));
    584  1.1  mrg }
    585  1.1  mrg 
    586  1.1  mrg 
    587  1.1  mrg /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
    588  1.1  mrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
    589  1.1  mrg    fields.  */
    590  1.1  mrg 
    591  1.1  mrg static void
    592  1.1  mrg write_ts_complex_tree_pointers (struct output_block *ob, tree expr)
    593  1.1  mrg {
    594  1.1  mrg   stream_write_tree_ref (ob, TREE_REALPART (expr));
    595  1.1  mrg   stream_write_tree_ref (ob, TREE_IMAGPART (expr));
    596  1.1  mrg }
    597  1.1  mrg 
    598  1.1  mrg 
    599  1.1  mrg /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
    600  1.1  mrg    to output block OB.  If REF_P is true, write a reference to EXPR's
    601  1.1  mrg    pointer fields.  */
    602  1.1  mrg 
    603  1.1  mrg static void
    604  1.1  mrg write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr)
    605  1.1  mrg {
    606  1.1  mrg   /* Drop names that were created for anonymous entities.  */
    607  1.1  mrg   if (DECL_NAME (expr)
    608  1.1  mrg       && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
    609  1.1  mrg       && IDENTIFIER_ANON_P (DECL_NAME (expr)))
    610  1.1  mrg     stream_write_tree_ref (ob, NULL_TREE);
    611  1.1  mrg   else
    612  1.1  mrg     stream_write_tree_ref (ob, DECL_NAME (expr));
    613  1.1  mrg   if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
    614  1.1  mrg       && ! DECL_CONTEXT (expr))
    615  1.1  mrg     stream_write_tree_ref (ob, (*all_translation_units)[0]);
    616  1.1  mrg   else
    617  1.1  mrg     stream_write_tree_ref (ob, DECL_CONTEXT (expr));
    618  1.1  mrg }
    619  1.1  mrg 
    620  1.1  mrg 
    621  1.1  mrg /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
    622  1.1  mrg    output block OB.  If REF_P is true, write a reference to EXPR's
    623  1.1  mrg    pointer fields.  */
    624  1.1  mrg 
    625  1.1  mrg static void
    626  1.1  mrg write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr)
    627  1.1  mrg {
    628  1.1  mrg   stream_write_tree_ref (ob, DECL_SIZE (expr));
    629  1.1  mrg   stream_write_tree_ref (ob, DECL_SIZE_UNIT (expr));
    630  1.1  mrg 
    631  1.1  mrg   /* Note, DECL_INITIAL is not handled here.  Since DECL_INITIAL needs
    632  1.1  mrg      special handling in LTO, it must be handled by streamer hooks.  */
    633  1.1  mrg 
    634  1.1  mrg   stream_write_tree_ref (ob, DECL_ATTRIBUTES (expr));
    635  1.1  mrg 
    636  1.1  mrg   /* On non-early-LTO enabled targets we claim we compiled with -g0
    637  1.1  mrg      but dwarf2out still did its set_decl_origin_self game fooling
    638  1.1  mrg      itself late.  Und that here since we won't have access to the
    639  1.1  mrg      early generated abstract DIEs.  */
    640  1.1  mrg   tree ao = DECL_ABSTRACT_ORIGIN (expr);
    641  1.1  mrg   if (debug_info_level == DINFO_LEVEL_NONE
    642  1.1  mrg       && ao == expr)
    643  1.1  mrg     ao = NULL_TREE;
    644  1.1  mrg   stream_write_tree_ref (ob, ao);
    645  1.1  mrg 
    646  1.1  mrg   if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
    647  1.1  mrg       && DECL_HAS_VALUE_EXPR_P (expr))
    648  1.1  mrg     stream_write_tree_ref (ob, DECL_VALUE_EXPR (expr));
    649  1.1  mrg 
    650  1.1  mrg   if (VAR_P (expr)
    651  1.1  mrg       && DECL_HAS_DEBUG_EXPR_P (expr))
    652  1.1  mrg     stream_write_tree_ref (ob, DECL_DEBUG_EXPR (expr));
    653  1.1  mrg }
    654  1.1  mrg 
    655  1.1  mrg 
    656  1.1  mrg /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
    657  1.1  mrg    EXPR to output block OB.  If REF_P is true, write a reference to EXPR's
    658  1.1  mrg    pointer fields.  */
    659  1.1  mrg 
    660  1.1  mrg static void
    661  1.1  mrg write_ts_decl_non_common_tree_pointers (struct output_block *, tree)
    662  1.1  mrg {
    663  1.1  mrg }
    664  1.1  mrg 
    665  1.1  mrg 
    666  1.1  mrg /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
    667  1.1  mrg    to output block OB.  If REF_P is true, write a reference to EXPR's
    668  1.1  mrg    pointer fields.  */
    669  1.1  mrg 
    670  1.1  mrg static void
    671  1.1  mrg write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr)
    672  1.1  mrg {
    673  1.1  mrg   /* Make sure we don't inadvertently set the assembler name.  */
    674  1.1  mrg   if (DECL_ASSEMBLER_NAME_SET_P (expr))
    675  1.1  mrg     stream_write_tree_ref (ob, DECL_ASSEMBLER_NAME (expr));
    676  1.1  mrg   else
    677  1.1  mrg     stream_write_tree_ref (ob, NULL_TREE);
    678  1.1  mrg }
    679  1.1  mrg 
    680  1.1  mrg 
    681  1.1  mrg /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
    682  1.1  mrg    output block OB.  If REF_P is true, write a reference to EXPR's
    683  1.1  mrg    pointer fields.  */
    684  1.1  mrg 
    685  1.1  mrg static void
    686  1.1  mrg write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr)
    687  1.1  mrg {
    688  1.1  mrg   stream_write_tree_ref (ob, DECL_FIELD_OFFSET (expr));
    689  1.1  mrg   stream_write_tree_ref (ob, DECL_BIT_FIELD_TYPE (expr));
    690  1.1  mrg   stream_write_tree_ref (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr));
    691  1.1  mrg   stream_write_tree_ref (ob, DECL_FIELD_BIT_OFFSET (expr));
    692  1.1  mrg }
    693  1.1  mrg 
    694  1.1  mrg 
    695  1.1  mrg /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
    696  1.1  mrg    to output block OB.  If REF_P is true, write a reference to EXPR's
    697  1.1  mrg    pointer fields.  */
    698  1.1  mrg 
    699  1.1  mrg static void
    700  1.1  mrg write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr)
    701  1.1  mrg {
    702  1.1  mrg   /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  */
    703  1.1  mrg   stream_write_tree_ref (ob, DECL_FUNCTION_PERSONALITY (expr));
    704  1.1  mrg   /* Don't stream these when passing things to a different target.  */
    705  1.1  mrg   if (!lto_stream_offload_p)
    706  1.1  mrg     stream_write_tree_ref (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr));
    707  1.1  mrg   stream_write_tree_ref (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
    708  1.1  mrg }
    709  1.1  mrg 
    710  1.1  mrg 
    711  1.1  mrg /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
    712  1.1  mrg    output block OB.  If REF_P is true, write a reference to EXPR's
    713  1.1  mrg    pointer fields.  */
    714  1.1  mrg 
    715  1.1  mrg static void
    716  1.1  mrg write_ts_type_common_tree_pointers (struct output_block *ob, tree expr)
    717  1.1  mrg {
    718  1.1  mrg   stream_write_tree_ref (ob, TYPE_SIZE (expr));
    719  1.1  mrg   stream_write_tree_ref (ob, TYPE_SIZE_UNIT (expr));
    720  1.1  mrg   stream_write_tree_ref (ob, TYPE_ATTRIBUTES (expr));
    721  1.1  mrg   stream_write_tree_ref (ob, TYPE_NAME (expr));
    722  1.1  mrg   /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO.  They will be
    723  1.1  mrg      reconstructed during fixup.  */
    724  1.1  mrg   /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
    725  1.1  mrg      during fixup.  */
    726  1.1  mrg   stream_write_tree_ref (ob, TYPE_MAIN_VARIANT (expr));
    727  1.1  mrg   stream_write_tree_ref (ob, TYPE_CONTEXT (expr));
    728  1.1  mrg   /* TYPE_CANONICAL is re-computed during type merging, so no need
    729  1.1  mrg      to stream it here.  */
    730  1.1  mrg   /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
    731  1.1  mrg      it cannot be freed by free_lang_data without triggering ICEs in
    732  1.1  mrg      langhooks.  */
    733  1.1  mrg }
    734  1.1  mrg 
    735  1.1  mrg /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
    736  1.1  mrg    to output block OB.  If REF_P is true, write a reference to EXPR's
    737  1.1  mrg    pointer fields.  */
    738  1.1  mrg 
    739  1.1  mrg static void
    740  1.1  mrg write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr)
    741  1.1  mrg {
    742  1.1  mrg   if (TREE_CODE (expr) == ARRAY_TYPE)
    743  1.1  mrg     stream_write_tree_ref (ob, TYPE_DOMAIN (expr));
    744  1.1  mrg   else if (RECORD_OR_UNION_TYPE_P (expr))
    745  1.1  mrg     streamer_write_chain (ob, TYPE_FIELDS (expr));
    746  1.1  mrg   else if (TREE_CODE (expr) == FUNCTION_TYPE
    747  1.1  mrg 	   || TREE_CODE (expr) == METHOD_TYPE)
    748  1.1  mrg     stream_write_tree_ref (ob, TYPE_ARG_TYPES (expr));
    749  1.1  mrg 
    750  1.1  mrg   if (!POINTER_TYPE_P (expr))
    751  1.1  mrg     stream_write_tree_ref (ob, TYPE_MIN_VALUE_RAW (expr));
    752  1.1  mrg   stream_write_tree_ref (ob, TYPE_MAX_VALUE_RAW (expr));
    753  1.1  mrg }
    754  1.1  mrg 
    755  1.1  mrg 
    756  1.1  mrg /* Write all pointer fields in the TS_LIST structure of EXPR to output
    757  1.1  mrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
    758  1.1  mrg    fields.  */
    759  1.1  mrg 
    760  1.1  mrg static void
    761  1.1  mrg write_ts_list_tree_pointers (struct output_block *ob, tree expr)
    762  1.1  mrg {
    763  1.1  mrg   stream_write_tree_ref (ob, TREE_PURPOSE (expr));
    764  1.1  mrg   stream_write_tree_ref (ob, TREE_VALUE (expr));
    765  1.1  mrg   stream_write_tree_ref (ob, TREE_CHAIN (expr));
    766  1.1  mrg }
    767  1.1  mrg 
    768  1.1  mrg 
    769  1.1  mrg /* Write all pointer fields in the TS_VEC structure of EXPR to output
    770  1.1  mrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
    771  1.1  mrg    fields.  */
    772  1.1  mrg 
    773  1.1  mrg static void
    774  1.1  mrg write_ts_vec_tree_pointers (struct output_block *ob, tree expr)
    775  1.1  mrg {
    776  1.1  mrg   int i;
    777  1.1  mrg 
    778  1.1  mrg   /* Note that the number of slots for EXPR has already been emitted
    779  1.1  mrg      in EXPR's header (see streamer_write_tree_header).  */
    780  1.1  mrg   for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
    781  1.1  mrg     stream_write_tree_ref (ob, TREE_VEC_ELT (expr, i));
    782  1.1  mrg }
    783  1.1  mrg 
    784  1.1  mrg 
    785  1.1  mrg /* Write all pointer fields in the TS_EXP structure of EXPR to output
    786  1.1  mrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
    787  1.1  mrg    fields.  */
    788  1.1  mrg 
    789  1.1  mrg static void
    790  1.1  mrg write_ts_exp_tree_pointers (struct output_block *ob, tree expr)
    791  1.1  mrg {
    792  1.1  mrg   int i;
    793  1.1  mrg 
    794  1.1  mrg   for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
    795  1.1  mrg     stream_write_tree_ref (ob, TREE_OPERAND (expr, i));
    796  1.1  mrg   stream_write_tree_ref (ob, TREE_BLOCK (expr));
    797  1.1  mrg }
    798  1.1  mrg 
    799  1.1  mrg 
    800  1.1  mrg /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
    801  1.1  mrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
    802  1.1  mrg    fields.  */
    803  1.1  mrg 
    804  1.1  mrg static void
    805  1.1  mrg write_ts_block_tree_pointers (struct output_block *ob, tree expr)
    806  1.1  mrg {
    807  1.1  mrg   streamer_write_chain (ob, BLOCK_VARS (expr));
    808  1.1  mrg 
    809  1.1  mrg   stream_write_tree_ref (ob, BLOCK_SUPERCONTEXT (expr));
    810  1.1  mrg   stream_write_tree_ref (ob, BLOCK_ABSTRACT_ORIGIN (expr));
    811  1.1  mrg 
    812  1.1  mrg   /* Do not stream BLOCK_NONLOCALIZED_VARS.  We cannot handle debug information
    813  1.1  mrg      for early inlined BLOCKs so drop it on the floor instead of ICEing in
    814  1.1  mrg      dwarf2out.cc.  */
    815  1.1  mrg 
    816  1.1  mrg   /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
    817  1.1  mrg      streaming time.  */
    818  1.1  mrg 
    819  1.1  mrg   /* Do not output BLOCK_SUBBLOCKS.  Instead on streaming-in this
    820  1.1  mrg      list is re-constructed from BLOCK_SUPERCONTEXT.  */
    821  1.1  mrg }
    822  1.1  mrg 
    823  1.1  mrg 
    824  1.1  mrg /* Write all pointer fields in the TS_BINFO structure of EXPR to output
    825  1.1  mrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
    826  1.1  mrg    fields.  */
    827  1.1  mrg 
    828  1.1  mrg static void
    829  1.1  mrg write_ts_binfo_tree_pointers (struct output_block *ob, tree expr)
    830  1.1  mrg {
    831  1.1  mrg   unsigned i;
    832  1.1  mrg   tree t;
    833  1.1  mrg 
    834  1.1  mrg   /* Note that the number of BINFO slots has already been emitted in
    835  1.1  mrg      EXPR's header (see streamer_write_tree_header) because this length
    836  1.1  mrg      is needed to build the empty BINFO node on the reader side.  */
    837  1.1  mrg   FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
    838  1.1  mrg     stream_write_tree_ref (ob, t);
    839  1.1  mrg   stream_write_tree_ref (ob, NULL_TREE);
    840  1.1  mrg 
    841  1.1  mrg   stream_write_tree_ref (ob, BINFO_OFFSET (expr));
    842  1.1  mrg   stream_write_tree_ref (ob, BINFO_VTABLE (expr));
    843  1.1  mrg 
    844  1.1  mrg   /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
    845  1.1  mrg      BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
    846  1.1  mrg }
    847  1.1  mrg 
    848  1.1  mrg 
    849  1.1  mrg /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
    850  1.1  mrg    output block OB.  If REF_P is true, write a reference to EXPR's
    851  1.1  mrg    pointer fields.  */
    852  1.1  mrg 
    853  1.1  mrg static void
    854  1.1  mrg write_ts_constructor_tree_pointers (struct output_block *ob, tree expr)
    855  1.1  mrg {
    856  1.1  mrg   unsigned i;
    857  1.1  mrg   tree index, value;
    858  1.1  mrg 
    859  1.1  mrg   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
    860  1.1  mrg     {
    861  1.1  mrg       stream_write_tree_ref (ob, index);
    862  1.1  mrg       stream_write_tree_ref (ob, value);
    863  1.1  mrg     }
    864  1.1  mrg }
    865  1.1  mrg 
    866  1.1  mrg 
    867  1.1  mrg /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
    868  1.1  mrg    to output block OB.  If REF_P is true, write a reference to EXPR's
    869  1.1  mrg    pointer fields.  */
    870  1.1  mrg 
    871  1.1  mrg static void
    872  1.1  mrg write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr)
    873  1.1  mrg {
    874  1.1  mrg   int i;
    875  1.1  mrg   for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
    876  1.1  mrg     stream_write_tree_ref (ob, OMP_CLAUSE_OPERAND (expr, i));
    877  1.1  mrg   switch (OMP_CLAUSE_CODE (expr))
    878  1.1  mrg     {
    879  1.1  mrg     case OMP_CLAUSE_REDUCTION:
    880  1.1  mrg     case OMP_CLAUSE_TASK_REDUCTION:
    881  1.1  mrg     case OMP_CLAUSE_IN_REDUCTION:
    882  1.1  mrg       /* We don't stream these right now, handle it if streaming
    883  1.1  mrg 	 of them is needed.  */
    884  1.1  mrg       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
    885  1.1  mrg       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
    886  1.1  mrg       break;
    887  1.1  mrg     default:
    888  1.1  mrg       break;
    889  1.1  mrg     }
    890  1.1  mrg   stream_write_tree_ref (ob, OMP_CLAUSE_CHAIN (expr));
    891  1.1  mrg }
    892  1.1  mrg 
    893  1.1  mrg 
    894  1.1  mrg /* Write all pointer fields in EXPR to output block OB.  If REF_P is true,
    895  1.1  mrg    the leaves of EXPR are emitted as references.  */
    896  1.1  mrg 
    897  1.1  mrg void
    898  1.1  mrg streamer_write_tree_body (struct output_block *ob, tree expr)
    899  1.1  mrg {
    900  1.1  mrg   enum tree_code code;
    901  1.1  mrg 
    902  1.1  mrg   lto_stats.num_tree_bodies_output++;
    903  1.1  mrg 
    904  1.1  mrg   code = TREE_CODE (expr);
    905  1.1  mrg 
    906  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
    907  1.1  mrg     write_ts_common_tree_pointers (ob, expr);
    908  1.1  mrg 
    909  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
    910  1.1  mrg     write_ts_vector_tree_pointers (ob, expr);
    911  1.1  mrg 
    912  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
    913  1.1  mrg     write_ts_poly_tree_pointers (ob, expr);
    914  1.1  mrg 
    915  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
    916  1.1  mrg     write_ts_complex_tree_pointers (ob, expr);
    917  1.1  mrg 
    918  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
    919  1.1  mrg     write_ts_decl_minimal_tree_pointers (ob, expr);
    920  1.1  mrg 
    921  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
    922  1.1  mrg     write_ts_decl_common_tree_pointers (ob, expr);
    923  1.1  mrg 
    924  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
    925  1.1  mrg     write_ts_decl_non_common_tree_pointers (ob, expr);
    926  1.1  mrg 
    927  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
    928  1.1  mrg     write_ts_decl_with_vis_tree_pointers (ob, expr);
    929  1.1  mrg 
    930  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
    931  1.1  mrg     write_ts_field_decl_tree_pointers (ob, expr);
    932  1.1  mrg 
    933  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
    934  1.1  mrg     write_ts_function_decl_tree_pointers (ob, expr);
    935  1.1  mrg 
    936  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
    937  1.1  mrg     write_ts_type_common_tree_pointers (ob, expr);
    938  1.1  mrg 
    939  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
    940  1.1  mrg     write_ts_type_non_common_tree_pointers (ob, expr);
    941  1.1  mrg 
    942  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_LIST))
    943  1.1  mrg     write_ts_list_tree_pointers (ob, expr);
    944  1.1  mrg 
    945  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_VEC))
    946  1.1  mrg     write_ts_vec_tree_pointers (ob, expr);
    947  1.1  mrg 
    948  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
    949  1.1  mrg     write_ts_exp_tree_pointers (ob, expr);
    950  1.1  mrg 
    951  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
    952  1.1  mrg     write_ts_block_tree_pointers (ob, expr);
    953  1.1  mrg 
    954  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
    955  1.1  mrg     write_ts_binfo_tree_pointers (ob, expr);
    956  1.1  mrg 
    957  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
    958  1.1  mrg     write_ts_constructor_tree_pointers (ob, expr);
    959  1.1  mrg 
    960  1.1  mrg   if (code == OMP_CLAUSE)
    961  1.1  mrg     write_ts_omp_clause_tree_pointers (ob, expr);
    962  1.1  mrg }
    963  1.1  mrg 
    964  1.1  mrg 
    965  1.1  mrg /* Emit header information for tree EXPR to output block OB.  The header
    966  1.1  mrg    contains everything needed to instantiate an empty skeleton for
    967  1.1  mrg    EXPR on the reading side.  IX is the index into the streamer cache
    968  1.1  mrg    where EXPR is stored.  */
    969  1.1  mrg 
    970  1.1  mrg void
    971  1.1  mrg streamer_write_tree_header (struct output_block *ob, tree expr)
    972  1.1  mrg {
    973  1.1  mrg   enum LTO_tags tag;
    974  1.1  mrg   enum tree_code code;
    975  1.1  mrg 
    976  1.1  mrg   if (streamer_dump_file)
    977  1.1  mrg     {
    978  1.1  mrg       print_node_brief (streamer_dump_file, "     Streaming header of ",
    979  1.1  mrg 	 		expr, 4);
    980  1.1  mrg       fprintf (streamer_dump_file, "  to %s\n",
    981  1.1  mrg 	       lto_section_name[ob->section_type]);
    982  1.1  mrg     }
    983  1.1  mrg 
    984  1.1  mrg   /* We should not see any tree nodes not handled by the streamer.  */
    985  1.1  mrg   code = TREE_CODE (expr);
    986  1.1  mrg 
    987  1.1  mrg   /* The header of a tree node consists of its tag, the size of
    988  1.1  mrg      the node, and any other information needed to instantiate
    989  1.1  mrg      EXPR on the reading side (such as the number of slots in
    990  1.1  mrg      variable sized nodes).  */
    991  1.1  mrg   tag = lto_tree_code_to_tag (code);
    992  1.1  mrg   streamer_write_record_start (ob, tag);
    993  1.1  mrg 
    994  1.1  mrg   /* The text in strings and identifiers are completely emitted in
    995  1.1  mrg      the header.  */
    996  1.1  mrg   if (CODE_CONTAINS_STRUCT (code, TS_STRING))
    997  1.1  mrg     streamer_write_string_cst (ob, ob->main_stream, expr);
    998  1.1  mrg   else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
    999  1.1  mrg     write_identifier (ob, ob->main_stream, expr);
   1000  1.1  mrg   else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
   1001  1.1  mrg     {
   1002  1.1  mrg       bitpack_d bp = bitpack_create (ob->main_stream);
   1003  1.1  mrg       bp_pack_value (&bp, VECTOR_CST_LOG2_NPATTERNS (expr), 8);
   1004  1.1  mrg       bp_pack_value (&bp, VECTOR_CST_NELTS_PER_PATTERN (expr), 8);
   1005  1.1  mrg       streamer_write_bitpack (&bp);
   1006  1.1  mrg     }
   1007  1.1  mrg   else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
   1008  1.1  mrg     streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
   1009  1.1  mrg   else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
   1010  1.1  mrg     streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
   1011  1.1  mrg   else if (TREE_CODE (expr) == CALL_EXPR)
   1012  1.1  mrg     streamer_write_uhwi (ob, call_expr_nargs (expr));
   1013  1.1  mrg   else if (TREE_CODE (expr) == OMP_CLAUSE)
   1014  1.1  mrg     streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
   1015  1.1  mrg   else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
   1016  1.1  mrg     {
   1017  1.1  mrg       gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
   1018  1.1  mrg       streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
   1019  1.1  mrg       streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
   1020  1.1  mrg     }
   1021  1.1  mrg }
   1022  1.1  mrg 
   1023  1.1  mrg 
   1024  1.1  mrg /* Emit the integer constant CST to output block OB.  If REF_P is true,
   1025  1.1  mrg    CST's type will be emitted as a reference.  */
   1026  1.1  mrg 
   1027  1.1  mrg void
   1028  1.1  mrg streamer_write_integer_cst (struct output_block *ob, tree cst)
   1029  1.1  mrg {
   1030  1.1  mrg   int i;
   1031  1.1  mrg   int len = TREE_INT_CST_NUNITS (cst);
   1032  1.1  mrg   gcc_assert (!TREE_OVERFLOW (cst));
   1033  1.1  mrg   if (streamer_dump_file)
   1034  1.1  mrg     {
   1035  1.1  mrg       print_node_brief (streamer_dump_file, "     Streaming integer ",
   1036  1.1  mrg 			cst, 4);
   1037  1.1  mrg       fprintf (streamer_dump_file, "\n");
   1038  1.1  mrg     }
   1039  1.1  mrg   streamer_write_record_start (ob, LTO_integer_cst);
   1040  1.1  mrg   stream_write_tree_ref (ob, TREE_TYPE (cst));
   1041  1.1  mrg   /* We're effectively streaming a non-sign-extended wide_int here,
   1042  1.1  mrg      so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
   1043  1.1  mrg      array members beyond LEN.  We'll recreate the tree from the
   1044  1.1  mrg      wide_int and the type.  */
   1045  1.1  mrg   streamer_write_uhwi (ob, len);
   1046  1.1  mrg   for (i = 0; i < len; i++)
   1047  1.1  mrg     streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));
   1048  1.1  mrg }
   1049