xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-streamer-out.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg /* Routines for emitting trees to a file stream.
21debfc3dSmrg 
3*8feb0f0bSmrg    Copyright (C) 2011-2020 Free Software Foundation, Inc.
41debfc3dSmrg    Contributed by Diego Novillo <dnovillo@google.com>
51debfc3dSmrg 
61debfc3dSmrg This file is part of GCC.
71debfc3dSmrg 
81debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under
91debfc3dSmrg the terms of the GNU General Public License as published by the Free
101debfc3dSmrg Software Foundation; either version 3, or (at your option) any later
111debfc3dSmrg version.
121debfc3dSmrg 
131debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
141debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
151debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
161debfc3dSmrg for more details.
171debfc3dSmrg 
181debfc3dSmrg You should have received a copy of the GNU General Public License
191debfc3dSmrg along with GCC; see the file COPYING3.  If not see
201debfc3dSmrg <http://www.gnu.org/licenses/>.  */
211debfc3dSmrg 
221debfc3dSmrg #include "config.h"
231debfc3dSmrg #include "system.h"
241debfc3dSmrg #include "coretypes.h"
251debfc3dSmrg #include "backend.h"
261debfc3dSmrg #include "target.h"
271debfc3dSmrg #include "tree.h"
281debfc3dSmrg #include "gimple.h"
291debfc3dSmrg #include "tree-streamer.h"
301debfc3dSmrg #include "cgraph.h"
311debfc3dSmrg #include "alias.h"
321debfc3dSmrg #include "stor-layout.h"
331debfc3dSmrg #include "gomp-constants.h"
341debfc3dSmrg 
351debfc3dSmrg 
361debfc3dSmrg /* Output the STRING constant to the string
371debfc3dSmrg    table in OB.  Then put the index onto the INDEX_STREAM.  */
381debfc3dSmrg 
391debfc3dSmrg void
streamer_write_string_cst(struct output_block * ob,struct lto_output_stream * index_stream,tree string)401debfc3dSmrg streamer_write_string_cst (struct output_block *ob,
411debfc3dSmrg 			   struct lto_output_stream *index_stream,
421debfc3dSmrg 			   tree string)
431debfc3dSmrg {
441debfc3dSmrg   streamer_write_string_with_length (ob, index_stream,
451debfc3dSmrg 				     string ? TREE_STRING_POINTER (string)
461debfc3dSmrg 					    : NULL,
471debfc3dSmrg 				     string ? TREE_STRING_LENGTH (string) : 0,
481debfc3dSmrg 				     true);
491debfc3dSmrg }
501debfc3dSmrg 
511debfc3dSmrg 
521debfc3dSmrg /* Output the identifier ID to the string
531debfc3dSmrg    table in OB.  Then put the index onto the INDEX_STREAM.  */
541debfc3dSmrg 
551debfc3dSmrg static void
write_identifier(struct output_block * ob,struct lto_output_stream * index_stream,tree id)561debfc3dSmrg write_identifier (struct output_block *ob,
571debfc3dSmrg 		   struct lto_output_stream *index_stream,
581debfc3dSmrg 		   tree id)
591debfc3dSmrg {
601debfc3dSmrg   streamer_write_string_with_length (ob, index_stream,
611debfc3dSmrg 				     IDENTIFIER_POINTER (id),
621debfc3dSmrg 				     IDENTIFIER_LENGTH (id),
631debfc3dSmrg 				     true);
641debfc3dSmrg }
651debfc3dSmrg 
661debfc3dSmrg 
671debfc3dSmrg /* Pack all the non-pointer fields of the TS_BASE structure of
681debfc3dSmrg    expression EXPR into bitpack BP.  */
691debfc3dSmrg 
701debfc3dSmrg static inline void
pack_ts_base_value_fields(struct bitpack_d * bp,tree expr)711debfc3dSmrg pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
721debfc3dSmrg {
73*8feb0f0bSmrg   if (streamer_debugging)
741debfc3dSmrg     bp_pack_value (bp, TREE_CODE (expr), 16);
751debfc3dSmrg   if (!TYPE_P (expr))
761debfc3dSmrg     {
771debfc3dSmrg       bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
781debfc3dSmrg       bp_pack_value (bp, TREE_CONSTANT (expr), 1);
791debfc3dSmrg       bp_pack_value (bp, TREE_READONLY (expr), 1);
801debfc3dSmrg 
811debfc3dSmrg       /* TREE_PUBLIC is used on types to indicate that the type
821debfc3dSmrg 	 has a TYPE_CACHED_VALUES vector.  This is not streamed out,
831debfc3dSmrg 	 so we skip it here.  */
841debfc3dSmrg       bp_pack_value (bp, TREE_PUBLIC (expr), 1);
851debfc3dSmrg     }
861debfc3dSmrg   else
871debfc3dSmrg     bp_pack_value (bp, 0, 4);
881debfc3dSmrg   bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
891debfc3dSmrg   bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
901debfc3dSmrg   if (DECL_P (expr))
911debfc3dSmrg     {
921debfc3dSmrg       bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
931debfc3dSmrg       bp_pack_value (bp, DECL_NAMELESS (expr), 1);
941debfc3dSmrg     }
951debfc3dSmrg   else if (TYPE_P (expr))
961debfc3dSmrg     bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
971debfc3dSmrg   else
981debfc3dSmrg     bp_pack_value (bp, 0, 1);
991debfc3dSmrg   /* We write debug info two times, do not confuse the second one.
1001debfc3dSmrg      The only relevant TREE_ASM_WRITTEN use is on SSA names.  */
1011debfc3dSmrg   bp_pack_value (bp, (TREE_CODE (expr) != SSA_NAME
1021debfc3dSmrg 		      ? 0 : TREE_ASM_WRITTEN (expr)), 1);
1031debfc3dSmrg   if (TYPE_P (expr))
1041debfc3dSmrg     bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
1051debfc3dSmrg   else
1061debfc3dSmrg     bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
1071debfc3dSmrg   bp_pack_value (bp, TREE_NOTHROW (expr), 1);
1081debfc3dSmrg   bp_pack_value (bp, TREE_STATIC (expr), 1);
1091debfc3dSmrg   if (TREE_CODE (expr) != TREE_BINFO)
1101debfc3dSmrg     bp_pack_value (bp, TREE_PRIVATE (expr), 1);
1111debfc3dSmrg   else
1121debfc3dSmrg     bp_pack_value (bp, 0, 1);
1131debfc3dSmrg   bp_pack_value (bp, TREE_PROTECTED (expr), 1);
1141debfc3dSmrg   bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
1151debfc3dSmrg   if (TYPE_P (expr))
1161debfc3dSmrg     {
1171debfc3dSmrg       if (AGGREGATE_TYPE_P (expr))
1181debfc3dSmrg 	bp_pack_value (bp, TYPE_REVERSE_STORAGE_ORDER (expr), 1);
1191debfc3dSmrg       else
1201debfc3dSmrg 	bp_pack_value (bp, TYPE_SATURATING (expr), 1);
1211debfc3dSmrg       bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8);
1221debfc3dSmrg     }
1231debfc3dSmrg   else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
1241debfc3dSmrg     {
1251debfc3dSmrg       bp_pack_value (bp, REF_REVERSE_STORAGE_ORDER (expr), 1);
1261debfc3dSmrg       bp_pack_value (bp, 0, 8);
1271debfc3dSmrg     }
1281debfc3dSmrg   else if (TREE_CODE (expr) == SSA_NAME)
1291debfc3dSmrg     {
1301debfc3dSmrg       bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
1311debfc3dSmrg       bp_pack_value (bp, 0, 8);
1321debfc3dSmrg     }
133a2dc1f3fSmrg   else if (TREE_CODE (expr) == CALL_EXPR)
134a2dc1f3fSmrg     {
135a2dc1f3fSmrg       bp_pack_value (bp, CALL_EXPR_BY_DESCRIPTOR (expr), 1);
136a2dc1f3fSmrg       bp_pack_value (bp, 0, 8);
137a2dc1f3fSmrg     }
1381debfc3dSmrg   else
1391debfc3dSmrg     bp_pack_value (bp, 0, 9);
1401debfc3dSmrg }
1411debfc3dSmrg 
1421debfc3dSmrg 
1431debfc3dSmrg /* Pack all the non-pointer fields of the TS_INTEGER_CST structure of
1441debfc3dSmrg    expression EXPR into bitpack BP.  */
1451debfc3dSmrg 
1461debfc3dSmrg static void
pack_ts_int_cst_value_fields(struct bitpack_d * bp,tree expr)1471debfc3dSmrg pack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
1481debfc3dSmrg {
1491debfc3dSmrg   int i;
1501debfc3dSmrg   /* Note that the number of elements has already been written out in
1511debfc3dSmrg      streamer_write_tree_header.  */
1521debfc3dSmrg   for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
1531debfc3dSmrg     bp_pack_var_len_int (bp, TREE_INT_CST_ELT (expr, i));
1541debfc3dSmrg }
1551debfc3dSmrg 
1561debfc3dSmrg 
1571debfc3dSmrg /* Pack all the non-pointer fields of the TS_REAL_CST structure of
1581debfc3dSmrg    expression EXPR into bitpack BP.  */
1591debfc3dSmrg 
1601debfc3dSmrg static void
pack_ts_real_cst_value_fields(struct bitpack_d * bp,tree expr)1611debfc3dSmrg pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
1621debfc3dSmrg {
1631debfc3dSmrg   unsigned i;
1641debfc3dSmrg   REAL_VALUE_TYPE r;
1651debfc3dSmrg 
1661debfc3dSmrg   r = TREE_REAL_CST (expr);
1671debfc3dSmrg   bp_pack_value (bp, r.cl, 2);
1681debfc3dSmrg   bp_pack_value (bp, r.decimal, 1);
1691debfc3dSmrg   bp_pack_value (bp, r.sign, 1);
1701debfc3dSmrg   bp_pack_value (bp, r.signalling, 1);
1711debfc3dSmrg   bp_pack_value (bp, r.canonical, 1);
1721debfc3dSmrg   bp_pack_value (bp, r.uexp, EXP_BITS);
1731debfc3dSmrg   for (i = 0; i < SIGSZ; i++)
1741debfc3dSmrg     bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
1751debfc3dSmrg }
1761debfc3dSmrg 
1771debfc3dSmrg 
1781debfc3dSmrg /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
1791debfc3dSmrg    expression EXPR into bitpack BP.  */
1801debfc3dSmrg 
1811debfc3dSmrg static void
pack_ts_fixed_cst_value_fields(struct bitpack_d * bp,tree expr)1821debfc3dSmrg pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
1831debfc3dSmrg {
1841debfc3dSmrg   struct fixed_value fv = TREE_FIXED_CST (expr);
1851debfc3dSmrg   bp_pack_machine_mode (bp, fv.mode);
1861debfc3dSmrg   bp_pack_var_len_int (bp, fv.data.low);
1871debfc3dSmrg   bp_pack_var_len_int (bp, fv.data.high);
1881debfc3dSmrg }
1891debfc3dSmrg 
1901debfc3dSmrg /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
1911debfc3dSmrg    of expression EXPR into bitpack BP.  */
1921debfc3dSmrg 
1931debfc3dSmrg static void
pack_ts_decl_common_value_fields(struct bitpack_d * bp,tree expr)1941debfc3dSmrg pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
1951debfc3dSmrg {
1961debfc3dSmrg   bp_pack_machine_mode (bp, DECL_MODE (expr));
1971debfc3dSmrg   bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
1981debfc3dSmrg   bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
1991debfc3dSmrg   bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
2001debfc3dSmrg   bp_pack_value (bp, DECL_ABSTRACT_P (expr), 1);
2011debfc3dSmrg   bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
2021debfc3dSmrg   bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
2031debfc3dSmrg   bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
2041debfc3dSmrg   bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
2051debfc3dSmrg   bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1);
2061debfc3dSmrg   bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
2071debfc3dSmrg 
2081debfc3dSmrg   if (TREE_CODE (expr) == LABEL_DECL)
2091debfc3dSmrg     {
2101debfc3dSmrg       /* Note that we do not write LABEL_DECL_UID.  The reader will
2111debfc3dSmrg 	 always assume an initial value of -1 so that the
2121debfc3dSmrg 	 label_to_block_map is recreated by gimple_set_bb.  */
2131debfc3dSmrg       bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
2141debfc3dSmrg     }
2151debfc3dSmrg 
216a05ac97eSmrg   else if (TREE_CODE (expr) == FIELD_DECL)
2171debfc3dSmrg     {
2181debfc3dSmrg       bp_pack_value (bp, DECL_PACKED (expr), 1);
2191debfc3dSmrg       bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
220a2dc1f3fSmrg       bp_pack_value (bp, DECL_PADDING_P (expr), 1);
221*8feb0f0bSmrg       bp_pack_value (bp, DECL_FIELD_ABI_IGNORED (expr), 1);
2221debfc3dSmrg       bp_pack_value (bp, expr->decl_common.off_align, 8);
2231debfc3dSmrg     }
2241debfc3dSmrg 
225a05ac97eSmrg   else if (VAR_P (expr))
2261debfc3dSmrg     {
2271debfc3dSmrg       bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
2281debfc3dSmrg       bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
2291debfc3dSmrg     }
2301debfc3dSmrg 
231a05ac97eSmrg   else if (TREE_CODE (expr) == PARM_DECL)
232a05ac97eSmrg     bp_pack_value (bp, DECL_HIDDEN_STRING_LENGTH (expr), 1);
233a05ac97eSmrg 
2341debfc3dSmrg   if (TREE_CODE (expr) == RESULT_DECL
2351debfc3dSmrg       || TREE_CODE (expr) == PARM_DECL
2361debfc3dSmrg       || VAR_P (expr))
2371debfc3dSmrg     {
2381debfc3dSmrg       bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
2391debfc3dSmrg       if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
2401debfc3dSmrg 	bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
2411debfc3dSmrg     }
2421debfc3dSmrg }
2431debfc3dSmrg 
2441debfc3dSmrg 
2451debfc3dSmrg /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
2461debfc3dSmrg    of expression EXPR into bitpack BP.  */
2471debfc3dSmrg 
2481debfc3dSmrg static void
pack_ts_decl_wrtl_value_fields(struct bitpack_d * bp,tree expr)2491debfc3dSmrg pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
2501debfc3dSmrg {
2511debfc3dSmrg   bp_pack_value (bp, DECL_REGISTER (expr), 1);
2521debfc3dSmrg }
2531debfc3dSmrg 
2541debfc3dSmrg 
2551debfc3dSmrg /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
2561debfc3dSmrg    of expression EXPR into bitpack BP.  */
2571debfc3dSmrg 
2581debfc3dSmrg static void
pack_ts_decl_with_vis_value_fields(struct bitpack_d * bp,tree expr)2591debfc3dSmrg pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
2601debfc3dSmrg {
2611debfc3dSmrg   bp_pack_value (bp, DECL_COMMON (expr), 1);
2621debfc3dSmrg   bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
2631debfc3dSmrg   bp_pack_value (bp, DECL_WEAK (expr), 1);
2641debfc3dSmrg   bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr),  1);
2651debfc3dSmrg   bp_pack_value (bp, DECL_COMDAT (expr),  1);
2661debfc3dSmrg   bp_pack_value (bp, DECL_VISIBILITY (expr),  2);
2671debfc3dSmrg   bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr),  1);
2681debfc3dSmrg 
2691debfc3dSmrg   if (VAR_P (expr))
2701debfc3dSmrg     {
2711debfc3dSmrg       bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
2721debfc3dSmrg       /* DECL_IN_TEXT_SECTION is set during final asm output only. */
2731debfc3dSmrg       bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
2741debfc3dSmrg     }
2751debfc3dSmrg 
2761debfc3dSmrg   if (TREE_CODE (expr) == FUNCTION_DECL)
2771debfc3dSmrg     {
2781debfc3dSmrg       bp_pack_value (bp, DECL_FINAL_P (expr), 1);
2791debfc3dSmrg       bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1);
2801debfc3dSmrg       bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1);
2811debfc3dSmrg     }
2821debfc3dSmrg }
2831debfc3dSmrg 
2841debfc3dSmrg 
2851debfc3dSmrg /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
2861debfc3dSmrg    of expression EXPR into bitpack BP.  */
2871debfc3dSmrg 
2881debfc3dSmrg static void
pack_ts_function_decl_value_fields(struct bitpack_d * bp,tree expr)2891debfc3dSmrg pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
2901debfc3dSmrg {
2911debfc3dSmrg   bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
2921debfc3dSmrg 		DECL_BUILT_IN_CLASS (expr));
2931debfc3dSmrg   bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
2941debfc3dSmrg   bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
2951debfc3dSmrg   bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
2961debfc3dSmrg   bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
2971debfc3dSmrg   bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
2981debfc3dSmrg   bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
2991debfc3dSmrg   bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
300*8feb0f0bSmrg   bp_pack_value (bp, DECL_IS_OPERATOR_NEW_P (expr), 1);
301*8feb0f0bSmrg   bp_pack_value (bp, DECL_IS_OPERATOR_DELETE_P (expr), 1);
3021debfc3dSmrg   bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
3031debfc3dSmrg   bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
3041debfc3dSmrg   bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
3051debfc3dSmrg   bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
3061debfc3dSmrg   bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
3071debfc3dSmrg   bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
3081debfc3dSmrg   bp_pack_value (bp, DECL_PURE_P (expr), 1);
3091debfc3dSmrg   bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
310*8feb0f0bSmrg   bp_pack_value (bp, DECL_IS_REPLACEABLE_OPERATOR (expr), 1);
3111debfc3dSmrg   if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
312*8feb0f0bSmrg     bp_pack_value (bp, DECL_UNCHECKED_FUNCTION_CODE (expr), 32);
3131debfc3dSmrg }
3141debfc3dSmrg 
3151debfc3dSmrg 
3161debfc3dSmrg /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
3171debfc3dSmrg    of expression EXPR into bitpack BP.  */
3181debfc3dSmrg 
3191debfc3dSmrg static void
pack_ts_type_common_value_fields(struct bitpack_d * bp,tree expr)3201debfc3dSmrg pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
3211debfc3dSmrg {
3221debfc3dSmrg   /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags
3231debfc3dSmrg      not necessary valid in a global context.
3241debfc3dSmrg      Use the raw value previously set by layout_type.  */
3251debfc3dSmrg   bp_pack_machine_mode (bp, TYPE_MODE_RAW (expr));
3261debfc3dSmrg   /* TYPE_NO_FORCE_BLK is private to stor-layout and need
3271debfc3dSmrg      no streaming.  */
3281debfc3dSmrg   bp_pack_value (bp, TYPE_PACKED (expr), 1);
3291debfc3dSmrg   bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
3301debfc3dSmrg   bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
3311debfc3dSmrg   bp_pack_value (bp, TYPE_READONLY (expr), 1);
332*8feb0f0bSmrg   unsigned vla_p;
333*8feb0f0bSmrg   if (in_lto_p)
334*8feb0f0bSmrg     vla_p = TYPE_LANG_FLAG_0 (TYPE_MAIN_VARIANT (expr));
335*8feb0f0bSmrg   else
336*8feb0f0bSmrg     vla_p = variably_modified_type_p (expr, NULL_TREE);
337*8feb0f0bSmrg   bp_pack_value (bp, vla_p, 1);
3381debfc3dSmrg   /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark
3391debfc3dSmrg      types that are opaque for TBAA.  This however did not work as intended,
3401debfc3dSmrg      because TYPE_ALIAS_SET == 0 was regularly lost in type merging.  */
3411debfc3dSmrg   if (RECORD_OR_UNION_TYPE_P (expr))
3421debfc3dSmrg     {
3431debfc3dSmrg       bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
3441debfc3dSmrg       bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
345*8feb0f0bSmrg       bp_pack_value (bp, TYPE_CXX_ODR_P (expr), 1);
3461debfc3dSmrg     }
3471debfc3dSmrg   else if (TREE_CODE (expr) == ARRAY_TYPE)
3481debfc3dSmrg     bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
349*8feb0f0bSmrg   if (TREE_CODE (expr) == ARRAY_TYPE || TREE_CODE (expr) == INTEGER_TYPE)
350*8feb0f0bSmrg     bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
3511debfc3dSmrg   if (AGGREGATE_TYPE_P (expr))
3521debfc3dSmrg     bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1);
353a2dc1f3fSmrg   bp_pack_value (bp, TYPE_EMPTY_P (expr), 1);
3541debfc3dSmrg   bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
3551debfc3dSmrg   bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
3561debfc3dSmrg }
3571debfc3dSmrg 
3581debfc3dSmrg 
3591debfc3dSmrg /* Pack all the non-pointer fields of the TS_BLOCK structure
3601debfc3dSmrg    of expression EXPR into bitpack BP.  */
3611debfc3dSmrg 
3621debfc3dSmrg static void
pack_ts_block_value_fields(struct output_block * ob,struct bitpack_d * bp,tree expr)3631debfc3dSmrg pack_ts_block_value_fields (struct output_block *ob,
3641debfc3dSmrg 			    struct bitpack_d *bp, tree expr)
3651debfc3dSmrg {
3661debfc3dSmrg   /* BLOCK_NUMBER is recomputed.  */
3671debfc3dSmrg   /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
3681debfc3dSmrg      that represent inlined function scopes.
3691debfc3dSmrg      For the rest them on the floor instead of ICEing in dwarf2out.c.  */
3701debfc3dSmrg   if (inlined_function_outer_scope_p (expr))
3711debfc3dSmrg     stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
3721debfc3dSmrg   else
3731debfc3dSmrg     stream_output_location (ob, bp, UNKNOWN_LOCATION);
3741debfc3dSmrg }
3751debfc3dSmrg 
3761debfc3dSmrg /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
3771debfc3dSmrg    of expression EXPR into bitpack BP.  */
3781debfc3dSmrg 
3791debfc3dSmrg static void
pack_ts_translation_unit_decl_value_fields(struct output_block * ob,struct bitpack_d * bp,tree expr)3801debfc3dSmrg pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
3811debfc3dSmrg 					    struct bitpack_d *bp, tree expr)
3821debfc3dSmrg {
3831debfc3dSmrg   bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
3841debfc3dSmrg }
3851debfc3dSmrg 
3861debfc3dSmrg 
3871debfc3dSmrg /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
3881debfc3dSmrg    of expression EXPR into bitpack BP.  */
3891debfc3dSmrg 
3901debfc3dSmrg static void
pack_ts_omp_clause_value_fields(struct output_block * ob,struct bitpack_d * bp,tree expr)3911debfc3dSmrg pack_ts_omp_clause_value_fields (struct output_block *ob,
3921debfc3dSmrg 				 struct bitpack_d *bp, tree expr)
3931debfc3dSmrg {
3941debfc3dSmrg   stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
3951debfc3dSmrg   switch (OMP_CLAUSE_CODE (expr))
3961debfc3dSmrg     {
3971debfc3dSmrg     case OMP_CLAUSE_DEFAULT:
3981debfc3dSmrg       bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
3991debfc3dSmrg 		    OMP_CLAUSE_DEFAULT_KIND (expr));
4001debfc3dSmrg       break;
4011debfc3dSmrg     case OMP_CLAUSE_SCHEDULE:
4021debfc3dSmrg       bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
4031debfc3dSmrg 		    OMP_CLAUSE_SCHEDULE_KIND (expr));
4041debfc3dSmrg       break;
4051debfc3dSmrg     case OMP_CLAUSE_DEPEND:
4061debfc3dSmrg       bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
4071debfc3dSmrg 		    OMP_CLAUSE_DEPEND_KIND (expr));
4081debfc3dSmrg       break;
4091debfc3dSmrg     case OMP_CLAUSE_MAP:
4101debfc3dSmrg       bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
4111debfc3dSmrg 		    OMP_CLAUSE_MAP_KIND (expr));
4121debfc3dSmrg       break;
4131debfc3dSmrg     case OMP_CLAUSE_PROC_BIND:
4141debfc3dSmrg       bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
4151debfc3dSmrg 		    OMP_CLAUSE_PROC_BIND_KIND (expr));
4161debfc3dSmrg       break;
4171debfc3dSmrg     case OMP_CLAUSE_REDUCTION:
418c0a68be4Smrg     case OMP_CLAUSE_TASK_REDUCTION:
419c0a68be4Smrg     case OMP_CLAUSE_IN_REDUCTION:
4201debfc3dSmrg       bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
4211debfc3dSmrg 		    OMP_CLAUSE_REDUCTION_CODE (expr));
4221debfc3dSmrg       break;
4231debfc3dSmrg     default:
4241debfc3dSmrg       break;
4251debfc3dSmrg     }
4261debfc3dSmrg }
4271debfc3dSmrg 
4281debfc3dSmrg 
4291debfc3dSmrg /* Pack all the bitfields in EXPR into a bit pack.  */
4301debfc3dSmrg 
4311debfc3dSmrg void
streamer_write_tree_bitfields(struct output_block * ob,tree expr)4321debfc3dSmrg streamer_write_tree_bitfields (struct output_block *ob, tree expr)
4331debfc3dSmrg {
4341debfc3dSmrg   bitpack_d bp = bitpack_create (ob->main_stream);
4351debfc3dSmrg   enum tree_code code;
4361debfc3dSmrg 
4371debfc3dSmrg   code = TREE_CODE (expr);
4381debfc3dSmrg 
4391debfc3dSmrg   /* Note that all these functions are highly sensitive to changes in
4401debfc3dSmrg      the types and sizes of each of the fields being packed.  */
4411debfc3dSmrg   pack_ts_base_value_fields (&bp, expr);
4421debfc3dSmrg 
4431debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
4441debfc3dSmrg     pack_ts_int_cst_value_fields (&bp, expr);
4451debfc3dSmrg 
4461debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
4471debfc3dSmrg     pack_ts_real_cst_value_fields (&bp, expr);
4481debfc3dSmrg 
4491debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
4501debfc3dSmrg     pack_ts_fixed_cst_value_fields (&bp, expr);
4511debfc3dSmrg 
4521debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
4531debfc3dSmrg     stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr));
4541debfc3dSmrg 
4551debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
4561debfc3dSmrg     pack_ts_decl_common_value_fields (&bp, expr);
4571debfc3dSmrg 
4581debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
4591debfc3dSmrg     pack_ts_decl_wrtl_value_fields (&bp, expr);
4601debfc3dSmrg 
4611debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
4621debfc3dSmrg     pack_ts_decl_with_vis_value_fields (&bp, expr);
4631debfc3dSmrg 
4641debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
4651debfc3dSmrg     pack_ts_function_decl_value_fields (&bp, expr);
4661debfc3dSmrg 
4671debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
4681debfc3dSmrg     pack_ts_type_common_value_fields (&bp, expr);
4691debfc3dSmrg 
4701debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
4711debfc3dSmrg     {
4721debfc3dSmrg       stream_output_location (ob, &bp, EXPR_LOCATION (expr));
4731debfc3dSmrg       if (code == MEM_REF
4741debfc3dSmrg 	  || code == TARGET_MEM_REF)
4751debfc3dSmrg 	{
4761debfc3dSmrg 	  bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
4771debfc3dSmrg 	  if (MR_DEPENDENCE_CLIQUE (expr) != 0)
4781debfc3dSmrg 	    bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
4791debfc3dSmrg 	}
480a2dc1f3fSmrg       else if (code == CALL_EXPR)
481a2dc1f3fSmrg 	bp_pack_enum (&bp, internal_fn, IFN_LAST, CALL_EXPR_IFN (expr));
4821debfc3dSmrg     }
4831debfc3dSmrg 
4841debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
4851debfc3dSmrg     pack_ts_block_value_fields (ob, &bp, expr);
4861debfc3dSmrg 
4871debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
4881debfc3dSmrg     pack_ts_translation_unit_decl_value_fields (ob, &bp, expr);
4891debfc3dSmrg 
4901debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
491c0a68be4Smrg     cl_optimization_stream_out (ob, &bp, TREE_OPTIMIZATION (expr));
4921debfc3dSmrg 
4931debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
4941debfc3dSmrg     bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr));
4951debfc3dSmrg 
4961debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
4971debfc3dSmrg       /* Don't stream these when passing things to a different target.  */
4981debfc3dSmrg       && !lto_stream_offload_p)
4991debfc3dSmrg     cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr));
5001debfc3dSmrg 
5011debfc3dSmrg   if (code == OMP_CLAUSE)
5021debfc3dSmrg     pack_ts_omp_clause_value_fields (ob, &bp, expr);
5031debfc3dSmrg 
5041debfc3dSmrg   streamer_write_bitpack (&bp);
5051debfc3dSmrg }
5061debfc3dSmrg 
5071debfc3dSmrg 
5081debfc3dSmrg /* Emit the chain of tree nodes starting at T.  OB is the output block
5091debfc3dSmrg    to write to.  REF_P is true if chain elements should be emitted
5101debfc3dSmrg    as references.  */
5111debfc3dSmrg 
5121debfc3dSmrg void
streamer_write_chain(struct output_block * ob,tree t,bool ref_p)5131debfc3dSmrg streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
5141debfc3dSmrg {
5151debfc3dSmrg   while (t)
5161debfc3dSmrg     {
5171debfc3dSmrg       /* We avoid outputting external vars or functions by reference
5181debfc3dSmrg 	 to the global decls section as we do not want to have them
519c0a68be4Smrg 	 enter decl merging.  We should not need to do this anymore because
520c0a68be4Smrg 	 free_lang_data removes them from block scopes.  */
521c0a68be4Smrg       gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
5221debfc3dSmrg       stream_write_tree (ob, t, ref_p);
5231debfc3dSmrg 
5241debfc3dSmrg       t = TREE_CHAIN (t);
5251debfc3dSmrg     }
5261debfc3dSmrg 
5271debfc3dSmrg   /* Write a sentinel to terminate the chain.  */
5281debfc3dSmrg   stream_write_tree (ob, NULL_TREE, ref_p);
5291debfc3dSmrg }
5301debfc3dSmrg 
5311debfc3dSmrg 
5321debfc3dSmrg /* Write all pointer fields in the TS_COMMON structure of EXPR to output
5331debfc3dSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
5341debfc3dSmrg    fields.  */
5351debfc3dSmrg 
5361debfc3dSmrg static void
write_ts_common_tree_pointers(struct output_block * ob,tree expr,bool ref_p)5371debfc3dSmrg write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
5381debfc3dSmrg {
5391debfc3dSmrg   if (TREE_CODE (expr) != IDENTIFIER_NODE)
5401debfc3dSmrg     stream_write_tree (ob, TREE_TYPE (expr), ref_p);
5411debfc3dSmrg }
5421debfc3dSmrg 
5431debfc3dSmrg 
5441debfc3dSmrg /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
5451debfc3dSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
5461debfc3dSmrg    fields.  */
5471debfc3dSmrg 
5481debfc3dSmrg static void
write_ts_vector_tree_pointers(struct output_block * ob,tree expr,bool ref_p)5491debfc3dSmrg write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
5501debfc3dSmrg {
5511debfc3dSmrg   /* Note that the number of elements for EXPR has already been emitted
5521debfc3dSmrg      in EXPR's header (see streamer_write_tree_header).  */
553a2dc1f3fSmrg   unsigned int count = vector_cst_encoded_nelts (expr);
554a2dc1f3fSmrg   for (unsigned int i = 0; i < count; ++i)
555a2dc1f3fSmrg     stream_write_tree (ob, VECTOR_CST_ENCODED_ELT (expr, i), ref_p);
556a2dc1f3fSmrg }
557a2dc1f3fSmrg 
558a2dc1f3fSmrg 
559a2dc1f3fSmrg /* Write all pointer fields in the TS_POLY_INT_CST structure of EXPR to
560a2dc1f3fSmrg    output block OB.  If REF_P is true, write a reference to EXPR's pointer
561a2dc1f3fSmrg    fields.  */
562a2dc1f3fSmrg 
563a2dc1f3fSmrg static void
write_ts_poly_tree_pointers(struct output_block * ob,tree expr,bool ref_p)564a2dc1f3fSmrg write_ts_poly_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
565a2dc1f3fSmrg {
566a2dc1f3fSmrg   for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
567a2dc1f3fSmrg     stream_write_tree (ob, POLY_INT_CST_COEFF (expr, i), ref_p);
5681debfc3dSmrg }
5691debfc3dSmrg 
5701debfc3dSmrg 
5711debfc3dSmrg /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
5721debfc3dSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
5731debfc3dSmrg    fields.  */
5741debfc3dSmrg 
5751debfc3dSmrg static void
write_ts_complex_tree_pointers(struct output_block * ob,tree expr,bool ref_p)5761debfc3dSmrg write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
5771debfc3dSmrg {
5781debfc3dSmrg   stream_write_tree (ob, TREE_REALPART (expr), ref_p);
5791debfc3dSmrg   stream_write_tree (ob, TREE_IMAGPART (expr), ref_p);
5801debfc3dSmrg }
5811debfc3dSmrg 
5821debfc3dSmrg 
5831debfc3dSmrg /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
5841debfc3dSmrg    to output block OB.  If REF_P is true, write a reference to EXPR's
5851debfc3dSmrg    pointer fields.  */
5861debfc3dSmrg 
5871debfc3dSmrg static void
write_ts_decl_minimal_tree_pointers(struct output_block * ob,tree expr,bool ref_p)5881debfc3dSmrg write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
5891debfc3dSmrg 				     bool ref_p)
5901debfc3dSmrg {
5911debfc3dSmrg   /* Drop names that were created for anonymous entities.  */
5921debfc3dSmrg   if (DECL_NAME (expr)
5931debfc3dSmrg       && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
594*8feb0f0bSmrg       && IDENTIFIER_ANON_P (DECL_NAME (expr)))
5951debfc3dSmrg     stream_write_tree (ob, NULL_TREE, ref_p);
5961debfc3dSmrg   else
5971debfc3dSmrg     stream_write_tree (ob, DECL_NAME (expr), ref_p);
598a2dc1f3fSmrg   if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
599a2dc1f3fSmrg       && ! DECL_CONTEXT (expr))
600a2dc1f3fSmrg     stream_write_tree (ob, (*all_translation_units)[0], ref_p);
601a2dc1f3fSmrg   else
6021debfc3dSmrg     stream_write_tree (ob, DECL_CONTEXT (expr), ref_p);
6031debfc3dSmrg }
6041debfc3dSmrg 
6051debfc3dSmrg 
6061debfc3dSmrg /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
6071debfc3dSmrg    output block OB.  If REF_P is true, write a reference to EXPR's
6081debfc3dSmrg    pointer fields.  */
6091debfc3dSmrg 
6101debfc3dSmrg static void
write_ts_decl_common_tree_pointers(struct output_block * ob,tree expr,bool ref_p)6111debfc3dSmrg write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
6121debfc3dSmrg 				    bool ref_p)
6131debfc3dSmrg {
6141debfc3dSmrg   stream_write_tree (ob, DECL_SIZE (expr), ref_p);
6151debfc3dSmrg   stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p);
6161debfc3dSmrg 
6171debfc3dSmrg   /* Note, DECL_INITIAL is not handled here.  Since DECL_INITIAL needs
6181debfc3dSmrg      special handling in LTO, it must be handled by streamer hooks.  */
6191debfc3dSmrg 
6201debfc3dSmrg   stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p);
6211debfc3dSmrg 
622a2dc1f3fSmrg   /* On non-early-LTO enabled targets we claim we compiled with -g0
623a2dc1f3fSmrg      but dwarf2out still did its set_decl_origin_self game fooling
624a2dc1f3fSmrg      itself late.  Und that here since we won't have access to the
625a2dc1f3fSmrg      early generated abstract DIEs.  */
626a2dc1f3fSmrg   tree ao = DECL_ABSTRACT_ORIGIN (expr);
627a2dc1f3fSmrg   if (debug_info_level == DINFO_LEVEL_NONE
628a2dc1f3fSmrg       && ao == expr)
629a2dc1f3fSmrg     ao = NULL_TREE;
630a2dc1f3fSmrg   stream_write_tree (ob, ao, ref_p);
6311debfc3dSmrg 
6321debfc3dSmrg   if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
6331debfc3dSmrg       && DECL_HAS_VALUE_EXPR_P (expr))
6341debfc3dSmrg     stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p);
6351debfc3dSmrg 
636a2dc1f3fSmrg   if (VAR_P (expr)
637a2dc1f3fSmrg       && DECL_HAS_DEBUG_EXPR_P (expr))
6381debfc3dSmrg     stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p);
6391debfc3dSmrg }
6401debfc3dSmrg 
6411debfc3dSmrg 
6421debfc3dSmrg /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
6431debfc3dSmrg    EXPR to output block OB.  If REF_P is true, write a reference to EXPR's
6441debfc3dSmrg    pointer fields.  */
6451debfc3dSmrg 
6461debfc3dSmrg static void
write_ts_decl_non_common_tree_pointers(struct output_block *,tree,bool)647c0a68be4Smrg write_ts_decl_non_common_tree_pointers (struct output_block *, tree, bool)
6481debfc3dSmrg {
6491debfc3dSmrg }
6501debfc3dSmrg 
6511debfc3dSmrg 
6521debfc3dSmrg /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
6531debfc3dSmrg    to output block OB.  If REF_P is true, write a reference to EXPR's
6541debfc3dSmrg    pointer fields.  */
6551debfc3dSmrg 
6561debfc3dSmrg static void
write_ts_decl_with_vis_tree_pointers(struct output_block * ob,tree expr,bool ref_p)6571debfc3dSmrg write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
6581debfc3dSmrg 			              bool ref_p)
6591debfc3dSmrg {
6601debfc3dSmrg   /* Make sure we don't inadvertently set the assembler name.  */
6611debfc3dSmrg   if (DECL_ASSEMBLER_NAME_SET_P (expr))
6621debfc3dSmrg     stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
6631debfc3dSmrg   else
6641debfc3dSmrg     stream_write_tree (ob, NULL_TREE, false);
6651debfc3dSmrg }
6661debfc3dSmrg 
6671debfc3dSmrg 
6681debfc3dSmrg /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
6691debfc3dSmrg    output block OB.  If REF_P is true, write a reference to EXPR's
6701debfc3dSmrg    pointer fields.  */
6711debfc3dSmrg 
6721debfc3dSmrg static void
write_ts_field_decl_tree_pointers(struct output_block * ob,tree expr,bool ref_p)6731debfc3dSmrg write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
6741debfc3dSmrg 				   bool ref_p)
6751debfc3dSmrg {
6761debfc3dSmrg   stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p);
6771debfc3dSmrg   stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
6781debfc3dSmrg   stream_write_tree (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr), ref_p);
6791debfc3dSmrg   stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
6801debfc3dSmrg }
6811debfc3dSmrg 
6821debfc3dSmrg 
6831debfc3dSmrg /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
6841debfc3dSmrg    to output block OB.  If REF_P is true, write a reference to EXPR's
6851debfc3dSmrg    pointer fields.  */
6861debfc3dSmrg 
6871debfc3dSmrg static void
write_ts_function_decl_tree_pointers(struct output_block * ob,tree expr,bool ref_p)6881debfc3dSmrg write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
6891debfc3dSmrg 				      bool ref_p)
6901debfc3dSmrg {
6911debfc3dSmrg   /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  */
6921debfc3dSmrg   stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
6931debfc3dSmrg   /* Don't stream these when passing things to a different target.  */
6941debfc3dSmrg   if (!lto_stream_offload_p)
6951debfc3dSmrg     stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
6961debfc3dSmrg   stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
6971debfc3dSmrg }
6981debfc3dSmrg 
6991debfc3dSmrg 
7001debfc3dSmrg /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
7011debfc3dSmrg    output block OB.  If REF_P is true, write a reference to EXPR's
7021debfc3dSmrg    pointer fields.  */
7031debfc3dSmrg 
7041debfc3dSmrg static void
write_ts_type_common_tree_pointers(struct output_block * ob,tree expr,bool ref_p)7051debfc3dSmrg write_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
7061debfc3dSmrg 				    bool ref_p)
7071debfc3dSmrg {
7081debfc3dSmrg   stream_write_tree (ob, TYPE_SIZE (expr), ref_p);
7091debfc3dSmrg   stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p);
7101debfc3dSmrg   stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p);
7111debfc3dSmrg   stream_write_tree (ob, TYPE_NAME (expr), ref_p);
7121debfc3dSmrg   /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO.  They will be
7131debfc3dSmrg      reconstructed during fixup.  */
7141debfc3dSmrg   /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
7151debfc3dSmrg      during fixup.  */
7161debfc3dSmrg   stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p);
7171debfc3dSmrg   stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p);
7181debfc3dSmrg   /* TYPE_CANONICAL is re-computed during type merging, so no need
7191debfc3dSmrg      to stream it here.  */
720c0a68be4Smrg   /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
721c0a68be4Smrg      it cannot be freed by free_lang_data without triggering ICEs in
722c0a68be4Smrg      langhooks.  */
7231debfc3dSmrg }
7241debfc3dSmrg 
7251debfc3dSmrg /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
7261debfc3dSmrg    to output block OB.  If REF_P is true, write a reference to EXPR's
7271debfc3dSmrg    pointer fields.  */
7281debfc3dSmrg 
7291debfc3dSmrg static void
write_ts_type_non_common_tree_pointers(struct output_block * ob,tree expr,bool ref_p)7301debfc3dSmrg write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr,
7311debfc3dSmrg 					bool ref_p)
7321debfc3dSmrg {
733*8feb0f0bSmrg   if (TREE_CODE (expr) == ARRAY_TYPE)
7341debfc3dSmrg     stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p);
7351debfc3dSmrg   else if (RECORD_OR_UNION_TYPE_P (expr))
7361debfc3dSmrg     streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p);
7371debfc3dSmrg   else if (TREE_CODE (expr) == FUNCTION_TYPE
7381debfc3dSmrg 	   || TREE_CODE (expr) == METHOD_TYPE)
7391debfc3dSmrg     stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p);
7401debfc3dSmrg 
7411debfc3dSmrg   if (!POINTER_TYPE_P (expr))
742a2dc1f3fSmrg     stream_write_tree (ob, TYPE_MIN_VALUE_RAW (expr), ref_p);
743a2dc1f3fSmrg   stream_write_tree (ob, TYPE_MAX_VALUE_RAW (expr), ref_p);
7441debfc3dSmrg }
7451debfc3dSmrg 
7461debfc3dSmrg 
7471debfc3dSmrg /* Write all pointer fields in the TS_LIST structure of EXPR to output
7481debfc3dSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
7491debfc3dSmrg    fields.  */
7501debfc3dSmrg 
7511debfc3dSmrg static void
write_ts_list_tree_pointers(struct output_block * ob,tree expr,bool ref_p)7521debfc3dSmrg write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
7531debfc3dSmrg {
7541debfc3dSmrg   stream_write_tree (ob, TREE_PURPOSE (expr), ref_p);
7551debfc3dSmrg   stream_write_tree (ob, TREE_VALUE (expr), ref_p);
7561debfc3dSmrg   stream_write_tree (ob, TREE_CHAIN (expr), ref_p);
7571debfc3dSmrg }
7581debfc3dSmrg 
7591debfc3dSmrg 
7601debfc3dSmrg /* Write all pointer fields in the TS_VEC structure of EXPR to output
7611debfc3dSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
7621debfc3dSmrg    fields.  */
7631debfc3dSmrg 
7641debfc3dSmrg static void
write_ts_vec_tree_pointers(struct output_block * ob,tree expr,bool ref_p)7651debfc3dSmrg write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
7661debfc3dSmrg {
7671debfc3dSmrg   int i;
7681debfc3dSmrg 
7691debfc3dSmrg   /* Note that the number of slots for EXPR has already been emitted
7701debfc3dSmrg      in EXPR's header (see streamer_write_tree_header).  */
7711debfc3dSmrg   for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
7721debfc3dSmrg     stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p);
7731debfc3dSmrg }
7741debfc3dSmrg 
7751debfc3dSmrg 
7761debfc3dSmrg /* Write all pointer fields in the TS_EXP structure of EXPR to output
7771debfc3dSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
7781debfc3dSmrg    fields.  */
7791debfc3dSmrg 
7801debfc3dSmrg static void
write_ts_exp_tree_pointers(struct output_block * ob,tree expr,bool ref_p)7811debfc3dSmrg write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
7821debfc3dSmrg {
7831debfc3dSmrg   int i;
7841debfc3dSmrg 
7851debfc3dSmrg   for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
7861debfc3dSmrg     stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p);
7871debfc3dSmrg   stream_write_tree (ob, TREE_BLOCK (expr), ref_p);
7881debfc3dSmrg }
7891debfc3dSmrg 
7901debfc3dSmrg 
7911debfc3dSmrg /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
7921debfc3dSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
7931debfc3dSmrg    fields.  */
7941debfc3dSmrg 
7951debfc3dSmrg static void
write_ts_block_tree_pointers(struct output_block * ob,tree expr,bool ref_p)7961debfc3dSmrg write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
7971debfc3dSmrg {
7981debfc3dSmrg   streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
7991debfc3dSmrg 
8001debfc3dSmrg   stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
801c0a68be4Smrg   stream_write_tree (ob, BLOCK_ABSTRACT_ORIGIN (expr), ref_p);
8021debfc3dSmrg 
8031debfc3dSmrg   /* Do not stream BLOCK_NONLOCALIZED_VARS.  We cannot handle debug information
8041debfc3dSmrg      for early inlined BLOCKs so drop it on the floor instead of ICEing in
8051debfc3dSmrg      dwarf2out.c.  */
8061debfc3dSmrg 
8071debfc3dSmrg   /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
8081debfc3dSmrg      streaming time.  */
8091debfc3dSmrg 
8101debfc3dSmrg   /* Do not output BLOCK_SUBBLOCKS.  Instead on streaming-in this
8111debfc3dSmrg      list is re-constructed from BLOCK_SUPERCONTEXT.  */
8121debfc3dSmrg }
8131debfc3dSmrg 
8141debfc3dSmrg 
8151debfc3dSmrg /* Write all pointer fields in the TS_BINFO structure of EXPR to output
8161debfc3dSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
8171debfc3dSmrg    fields.  */
8181debfc3dSmrg 
8191debfc3dSmrg static void
write_ts_binfo_tree_pointers(struct output_block * ob,tree expr,bool ref_p)8201debfc3dSmrg write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
8211debfc3dSmrg {
8221debfc3dSmrg   unsigned i;
8231debfc3dSmrg   tree t;
8241debfc3dSmrg 
8251debfc3dSmrg   /* Note that the number of BINFO slots has already been emitted in
8261debfc3dSmrg      EXPR's header (see streamer_write_tree_header) because this length
8271debfc3dSmrg      is needed to build the empty BINFO node on the reader side.  */
8281debfc3dSmrg   FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
8291debfc3dSmrg     stream_write_tree (ob, t, ref_p);
8301debfc3dSmrg   stream_write_tree (ob, NULL_TREE, false);
8311debfc3dSmrg 
8321debfc3dSmrg   stream_write_tree (ob, BINFO_OFFSET (expr), ref_p);
8331debfc3dSmrg   stream_write_tree (ob, BINFO_VTABLE (expr), ref_p);
8341debfc3dSmrg 
835c0a68be4Smrg   /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
836c0a68be4Smrg      BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
8371debfc3dSmrg }
8381debfc3dSmrg 
8391debfc3dSmrg 
8401debfc3dSmrg /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
8411debfc3dSmrg    output block OB.  If REF_P is true, write a reference to EXPR's
8421debfc3dSmrg    pointer fields.  */
8431debfc3dSmrg 
8441debfc3dSmrg static void
write_ts_constructor_tree_pointers(struct output_block * ob,tree expr,bool ref_p)8451debfc3dSmrg write_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
8461debfc3dSmrg 				    bool ref_p)
8471debfc3dSmrg {
8481debfc3dSmrg   unsigned i;
8491debfc3dSmrg   tree index, value;
8501debfc3dSmrg 
8511debfc3dSmrg   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
8521debfc3dSmrg     {
8531debfc3dSmrg       stream_write_tree (ob, index, ref_p);
8541debfc3dSmrg       stream_write_tree (ob, value, ref_p);
8551debfc3dSmrg     }
8561debfc3dSmrg }
8571debfc3dSmrg 
8581debfc3dSmrg 
8591debfc3dSmrg /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
8601debfc3dSmrg    to output block OB.  If REF_P is true, write a reference to EXPR's
8611debfc3dSmrg    pointer fields.  */
8621debfc3dSmrg 
8631debfc3dSmrg static void
write_ts_omp_clause_tree_pointers(struct output_block * ob,tree expr,bool ref_p)8641debfc3dSmrg write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr,
8651debfc3dSmrg 				   bool ref_p)
8661debfc3dSmrg {
8671debfc3dSmrg   int i;
8681debfc3dSmrg   for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
8691debfc3dSmrg     stream_write_tree (ob, OMP_CLAUSE_OPERAND (expr, i), ref_p);
870c0a68be4Smrg   switch (OMP_CLAUSE_CODE (expr))
8711debfc3dSmrg     {
872c0a68be4Smrg     case OMP_CLAUSE_REDUCTION:
873c0a68be4Smrg     case OMP_CLAUSE_TASK_REDUCTION:
874c0a68be4Smrg     case OMP_CLAUSE_IN_REDUCTION:
8751debfc3dSmrg       /* We don't stream these right now, handle it if streaming
8761debfc3dSmrg 	 of them is needed.  */
8771debfc3dSmrg       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
8781debfc3dSmrg       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
879c0a68be4Smrg       break;
880c0a68be4Smrg     default:
881c0a68be4Smrg       break;
8821debfc3dSmrg     }
8831debfc3dSmrg   stream_write_tree (ob, OMP_CLAUSE_CHAIN (expr), ref_p);
8841debfc3dSmrg }
8851debfc3dSmrg 
8861debfc3dSmrg 
8871debfc3dSmrg /* Write all pointer fields in EXPR to output block OB.  If REF_P is true,
8881debfc3dSmrg    the leaves of EXPR are emitted as references.  */
8891debfc3dSmrg 
8901debfc3dSmrg void
streamer_write_tree_body(struct output_block * ob,tree expr,bool ref_p)8911debfc3dSmrg streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
8921debfc3dSmrg {
8931debfc3dSmrg   enum tree_code code;
8941debfc3dSmrg 
8951debfc3dSmrg   lto_stats.num_tree_bodies_output++;
8961debfc3dSmrg 
8971debfc3dSmrg   code = TREE_CODE (expr);
8981debfc3dSmrg 
8991debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
9001debfc3dSmrg     write_ts_common_tree_pointers (ob, expr, ref_p);
9011debfc3dSmrg 
9021debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
9031debfc3dSmrg     write_ts_vector_tree_pointers (ob, expr, ref_p);
9041debfc3dSmrg 
905a2dc1f3fSmrg   if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
906a2dc1f3fSmrg     write_ts_poly_tree_pointers (ob, expr, ref_p);
907a2dc1f3fSmrg 
9081debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
9091debfc3dSmrg     write_ts_complex_tree_pointers (ob, expr, ref_p);
9101debfc3dSmrg 
9111debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
9121debfc3dSmrg     write_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
9131debfc3dSmrg 
9141debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
9151debfc3dSmrg     write_ts_decl_common_tree_pointers (ob, expr, ref_p);
9161debfc3dSmrg 
9171debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
9181debfc3dSmrg     write_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
9191debfc3dSmrg 
9201debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
9211debfc3dSmrg     write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
9221debfc3dSmrg 
9231debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
9241debfc3dSmrg     write_ts_field_decl_tree_pointers (ob, expr, ref_p);
9251debfc3dSmrg 
9261debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
9271debfc3dSmrg     write_ts_function_decl_tree_pointers (ob, expr, ref_p);
9281debfc3dSmrg 
9291debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
9301debfc3dSmrg     write_ts_type_common_tree_pointers (ob, expr, ref_p);
9311debfc3dSmrg 
9321debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
9331debfc3dSmrg     write_ts_type_non_common_tree_pointers (ob, expr, ref_p);
9341debfc3dSmrg 
9351debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_LIST))
9361debfc3dSmrg     write_ts_list_tree_pointers (ob, expr, ref_p);
9371debfc3dSmrg 
9381debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_VEC))
9391debfc3dSmrg     write_ts_vec_tree_pointers (ob, expr, ref_p);
9401debfc3dSmrg 
9411debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
9421debfc3dSmrg     write_ts_exp_tree_pointers (ob, expr, ref_p);
9431debfc3dSmrg 
9441debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
9451debfc3dSmrg     write_ts_block_tree_pointers (ob, expr, ref_p);
9461debfc3dSmrg 
9471debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
9481debfc3dSmrg     write_ts_binfo_tree_pointers (ob, expr, ref_p);
9491debfc3dSmrg 
9501debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
9511debfc3dSmrg     write_ts_constructor_tree_pointers (ob, expr, ref_p);
9521debfc3dSmrg 
9531debfc3dSmrg   if (code == OMP_CLAUSE)
9541debfc3dSmrg     write_ts_omp_clause_tree_pointers (ob, expr, ref_p);
9551debfc3dSmrg }
9561debfc3dSmrg 
9571debfc3dSmrg 
9581debfc3dSmrg /* Emit header information for tree EXPR to output block OB.  The header
9591debfc3dSmrg    contains everything needed to instantiate an empty skeleton for
9601debfc3dSmrg    EXPR on the reading side.  IX is the index into the streamer cache
9611debfc3dSmrg    where EXPR is stored.  */
9621debfc3dSmrg 
9631debfc3dSmrg void
streamer_write_tree_header(struct output_block * ob,tree expr)9641debfc3dSmrg streamer_write_tree_header (struct output_block *ob, tree expr)
9651debfc3dSmrg {
9661debfc3dSmrg   enum LTO_tags tag;
9671debfc3dSmrg   enum tree_code code;
9681debfc3dSmrg 
9691debfc3dSmrg   /* We should not see any tree nodes not handled by the streamer.  */
9701debfc3dSmrg   code = TREE_CODE (expr);
9711debfc3dSmrg 
9721debfc3dSmrg   /* The header of a tree node consists of its tag, the size of
9731debfc3dSmrg      the node, and any other information needed to instantiate
9741debfc3dSmrg      EXPR on the reading side (such as the number of slots in
9751debfc3dSmrg      variable sized nodes).  */
9761debfc3dSmrg   tag = lto_tree_code_to_tag (code);
9771debfc3dSmrg   streamer_write_record_start (ob, tag);
9781debfc3dSmrg 
9791debfc3dSmrg   /* The text in strings and identifiers are completely emitted in
9801debfc3dSmrg      the header.  */
9811debfc3dSmrg   if (CODE_CONTAINS_STRUCT (code, TS_STRING))
9821debfc3dSmrg     streamer_write_string_cst (ob, ob->main_stream, expr);
9831debfc3dSmrg   else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
9841debfc3dSmrg     write_identifier (ob, ob->main_stream, expr);
9851debfc3dSmrg   else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
986a2dc1f3fSmrg     {
987a2dc1f3fSmrg       bitpack_d bp = bitpack_create (ob->main_stream);
988a2dc1f3fSmrg       bp_pack_value (&bp, VECTOR_CST_LOG2_NPATTERNS (expr), 8);
989a2dc1f3fSmrg       bp_pack_value (&bp, VECTOR_CST_NELTS_PER_PATTERN (expr), 8);
990a2dc1f3fSmrg       streamer_write_bitpack (&bp);
991a2dc1f3fSmrg     }
9921debfc3dSmrg   else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
9931debfc3dSmrg     streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
9941debfc3dSmrg   else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
9951debfc3dSmrg     streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
9961debfc3dSmrg   else if (TREE_CODE (expr) == CALL_EXPR)
9971debfc3dSmrg     streamer_write_uhwi (ob, call_expr_nargs (expr));
9981debfc3dSmrg   else if (TREE_CODE (expr) == OMP_CLAUSE)
9991debfc3dSmrg     streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
10001debfc3dSmrg   else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
10011debfc3dSmrg     {
10021debfc3dSmrg       gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
10031debfc3dSmrg       streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
10041debfc3dSmrg       streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
10051debfc3dSmrg     }
10061debfc3dSmrg }
10071debfc3dSmrg 
10081debfc3dSmrg 
10091debfc3dSmrg /* Emit the integer constant CST to output block OB.  If REF_P is true,
10101debfc3dSmrg    CST's type will be emitted as a reference.  */
10111debfc3dSmrg 
10121debfc3dSmrg void
streamer_write_integer_cst(struct output_block * ob,tree cst,bool ref_p)10131debfc3dSmrg streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p)
10141debfc3dSmrg {
10151debfc3dSmrg   int i;
10161debfc3dSmrg   int len = TREE_INT_CST_NUNITS (cst);
10171debfc3dSmrg   gcc_assert (!TREE_OVERFLOW (cst));
10181debfc3dSmrg   streamer_write_record_start (ob, LTO_integer_cst);
10191debfc3dSmrg   stream_write_tree (ob, TREE_TYPE (cst), ref_p);
10201debfc3dSmrg   /* We're effectively streaming a non-sign-extended wide_int here,
10211debfc3dSmrg      so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
10221debfc3dSmrg      array members beyond LEN.  We'll recreate the tree from the
10231debfc3dSmrg      wide_int and the type.  */
10241debfc3dSmrg   streamer_write_uhwi (ob, len);
10251debfc3dSmrg   for (i = 0; i < len; i++)
10261debfc3dSmrg     streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));
10271debfc3dSmrg }
1028