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