11debfc3dSmrg /* Routines for reading trees from 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 "stringpool.h"
301debfc3dSmrg #include "tree-streamer.h"
311debfc3dSmrg #include "cgraph.h"
321debfc3dSmrg #include "builtins.h"
331debfc3dSmrg #include "gomp-constants.h"
34a2dc1f3fSmrg #include "stringpool.h"
35a2dc1f3fSmrg #include "attribs.h"
361debfc3dSmrg #include "asan.h"
37a2dc1f3fSmrg #include "opts.h"
381debfc3dSmrg
391debfc3dSmrg
401debfc3dSmrg /* Read a STRING_CST from the string table in DATA_IN using input
411debfc3dSmrg block IB. */
421debfc3dSmrg
431debfc3dSmrg tree
streamer_read_string_cst(class data_in * data_in,class lto_input_block * ib)44*8feb0f0bSmrg streamer_read_string_cst (class data_in *data_in, class lto_input_block *ib)
451debfc3dSmrg {
461debfc3dSmrg unsigned int len;
471debfc3dSmrg const char * ptr;
481debfc3dSmrg
491debfc3dSmrg ptr = streamer_read_indexed_string (data_in, ib, &len);
501debfc3dSmrg if (!ptr)
511debfc3dSmrg return NULL;
521debfc3dSmrg return build_string (len, ptr);
531debfc3dSmrg }
541debfc3dSmrg
551debfc3dSmrg
561debfc3dSmrg /* Read an IDENTIFIER from the string table in DATA_IN using input
571debfc3dSmrg block IB. */
581debfc3dSmrg
591debfc3dSmrg static tree
input_identifier(class data_in * data_in,class lto_input_block * ib)60*8feb0f0bSmrg input_identifier (class data_in *data_in, class lto_input_block *ib)
611debfc3dSmrg {
621debfc3dSmrg unsigned int len;
631debfc3dSmrg const char *ptr;
641debfc3dSmrg
651debfc3dSmrg ptr = streamer_read_indexed_string (data_in, ib, &len);
661debfc3dSmrg if (!ptr)
671debfc3dSmrg return NULL;
681debfc3dSmrg return get_identifier_with_length (ptr, len);
691debfc3dSmrg }
701debfc3dSmrg
711debfc3dSmrg
721debfc3dSmrg /* Read a chain of tree nodes from input block IB. DATA_IN contains
731debfc3dSmrg tables and descriptors for the file being read. */
741debfc3dSmrg
751debfc3dSmrg tree
streamer_read_chain(class lto_input_block * ib,class data_in * data_in)76*8feb0f0bSmrg streamer_read_chain (class lto_input_block *ib, class data_in *data_in)
771debfc3dSmrg {
781debfc3dSmrg tree first, prev, curr;
791debfc3dSmrg
801debfc3dSmrg /* The chain is written as NULL terminated list of trees. */
811debfc3dSmrg first = prev = NULL_TREE;
821debfc3dSmrg do
831debfc3dSmrg {
841debfc3dSmrg curr = stream_read_tree (ib, data_in);
851debfc3dSmrg if (prev)
861debfc3dSmrg TREE_CHAIN (prev) = curr;
871debfc3dSmrg else
881debfc3dSmrg first = curr;
891debfc3dSmrg
901debfc3dSmrg prev = curr;
911debfc3dSmrg }
921debfc3dSmrg while (curr);
931debfc3dSmrg
941debfc3dSmrg return first;
951debfc3dSmrg }
961debfc3dSmrg
971debfc3dSmrg
981debfc3dSmrg /* Unpack all the non-pointer fields of the TS_BASE structure of
991debfc3dSmrg expression EXPR from bitpack BP. */
1001debfc3dSmrg
1011debfc3dSmrg static inline void
unpack_ts_base_value_fields(struct bitpack_d * bp,tree expr)1021debfc3dSmrg unpack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
1031debfc3dSmrg {
1041debfc3dSmrg /* Note that the code for EXPR has already been unpacked to create EXPR in
1051debfc3dSmrg streamer_alloc_tree. */
1061debfc3dSmrg if (!TYPE_P (expr))
1071debfc3dSmrg {
1081debfc3dSmrg TREE_SIDE_EFFECTS (expr) = (unsigned) bp_unpack_value (bp, 1);
1091debfc3dSmrg TREE_CONSTANT (expr) = (unsigned) bp_unpack_value (bp, 1);
1101debfc3dSmrg TREE_READONLY (expr) = (unsigned) bp_unpack_value (bp, 1);
1111debfc3dSmrg
1121debfc3dSmrg /* TREE_PUBLIC is used on types to indicate that the type
1131debfc3dSmrg has a TYPE_CACHED_VALUES vector. This is not streamed out,
1141debfc3dSmrg so we skip it here. */
1151debfc3dSmrg TREE_PUBLIC (expr) = (unsigned) bp_unpack_value (bp, 1);
1161debfc3dSmrg }
1171debfc3dSmrg else
1181debfc3dSmrg bp_unpack_value (bp, 4);
1191debfc3dSmrg TREE_ADDRESSABLE (expr) = (unsigned) bp_unpack_value (bp, 1);
1201debfc3dSmrg TREE_THIS_VOLATILE (expr) = (unsigned) bp_unpack_value (bp, 1);
1211debfc3dSmrg if (DECL_P (expr))
1221debfc3dSmrg {
1231debfc3dSmrg DECL_UNSIGNED (expr) = (unsigned) bp_unpack_value (bp, 1);
1241debfc3dSmrg DECL_NAMELESS (expr) = (unsigned) bp_unpack_value (bp, 1);
1251debfc3dSmrg }
1261debfc3dSmrg else if (TYPE_P (expr))
1271debfc3dSmrg TYPE_UNSIGNED (expr) = (unsigned) bp_unpack_value (bp, 1);
1281debfc3dSmrg else
1291debfc3dSmrg bp_unpack_value (bp, 1);
1301debfc3dSmrg TREE_ASM_WRITTEN (expr) = (unsigned) bp_unpack_value (bp, 1);
1311debfc3dSmrg if (TYPE_P (expr))
1321debfc3dSmrg TYPE_ARTIFICIAL (expr) = (unsigned) bp_unpack_value (bp, 1);
1331debfc3dSmrg else
1341debfc3dSmrg TREE_NO_WARNING (expr) = (unsigned) bp_unpack_value (bp, 1);
1351debfc3dSmrg TREE_NOTHROW (expr) = (unsigned) bp_unpack_value (bp, 1);
1361debfc3dSmrg TREE_STATIC (expr) = (unsigned) bp_unpack_value (bp, 1);
1371debfc3dSmrg if (TREE_CODE (expr) != TREE_BINFO)
1381debfc3dSmrg TREE_PRIVATE (expr) = (unsigned) bp_unpack_value (bp, 1);
1391debfc3dSmrg else
1401debfc3dSmrg bp_unpack_value (bp, 1);
1411debfc3dSmrg TREE_PROTECTED (expr) = (unsigned) bp_unpack_value (bp, 1);
1421debfc3dSmrg TREE_DEPRECATED (expr) = (unsigned) bp_unpack_value (bp, 1);
1431debfc3dSmrg if (TYPE_P (expr))
1441debfc3dSmrg {
1451debfc3dSmrg if (AGGREGATE_TYPE_P (expr))
1461debfc3dSmrg TYPE_REVERSE_STORAGE_ORDER (expr) = (unsigned) bp_unpack_value (bp, 1);
1471debfc3dSmrg else
1481debfc3dSmrg TYPE_SATURATING (expr) = (unsigned) bp_unpack_value (bp, 1);
1491debfc3dSmrg TYPE_ADDR_SPACE (expr) = (unsigned) bp_unpack_value (bp, 8);
1501debfc3dSmrg }
1511debfc3dSmrg else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
1521debfc3dSmrg {
1531debfc3dSmrg REF_REVERSE_STORAGE_ORDER (expr) = (unsigned) bp_unpack_value (bp, 1);
1541debfc3dSmrg bp_unpack_value (bp, 8);
1551debfc3dSmrg }
1561debfc3dSmrg else if (TREE_CODE (expr) == SSA_NAME)
1571debfc3dSmrg {
1581debfc3dSmrg SSA_NAME_IS_DEFAULT_DEF (expr) = (unsigned) bp_unpack_value (bp, 1);
1591debfc3dSmrg bp_unpack_value (bp, 8);
1601debfc3dSmrg }
161a2dc1f3fSmrg else if (TREE_CODE (expr) == CALL_EXPR)
162a2dc1f3fSmrg {
163a2dc1f3fSmrg CALL_EXPR_BY_DESCRIPTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
164a2dc1f3fSmrg bp_unpack_value (bp, 8);
165a2dc1f3fSmrg }
1661debfc3dSmrg else
1671debfc3dSmrg bp_unpack_value (bp, 9);
1681debfc3dSmrg }
1691debfc3dSmrg
1701debfc3dSmrg
1711debfc3dSmrg /* Unpack all the non-pointer fields of the TS_INT_CST structure of
1721debfc3dSmrg expression EXPR from bitpack BP. */
1731debfc3dSmrg
1741debfc3dSmrg static void
unpack_ts_int_cst_value_fields(struct bitpack_d * bp,tree expr)1751debfc3dSmrg unpack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
1761debfc3dSmrg {
1771debfc3dSmrg int i;
1781debfc3dSmrg for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
1791debfc3dSmrg TREE_INT_CST_ELT (expr, i) = bp_unpack_var_len_int (bp);
1801debfc3dSmrg }
1811debfc3dSmrg
1821debfc3dSmrg
1831debfc3dSmrg /* Unpack all the non-pointer fields of the TS_REAL_CST structure of
1841debfc3dSmrg expression EXPR from bitpack BP. */
1851debfc3dSmrg
1861debfc3dSmrg static void
unpack_ts_real_cst_value_fields(struct bitpack_d * bp,tree expr)1871debfc3dSmrg unpack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
1881debfc3dSmrg {
1891debfc3dSmrg unsigned i;
1901debfc3dSmrg REAL_VALUE_TYPE r;
1911debfc3dSmrg REAL_VALUE_TYPE *rp;
1921debfc3dSmrg
1931debfc3dSmrg /* Clear all bits of the real value type so that we can later do
1941debfc3dSmrg bitwise comparisons to see if two values are the same. */
1951debfc3dSmrg memset (&r, 0, sizeof r);
1961debfc3dSmrg r.cl = (unsigned) bp_unpack_value (bp, 2);
1971debfc3dSmrg r.decimal = (unsigned) bp_unpack_value (bp, 1);
1981debfc3dSmrg r.sign = (unsigned) bp_unpack_value (bp, 1);
1991debfc3dSmrg r.signalling = (unsigned) bp_unpack_value (bp, 1);
2001debfc3dSmrg r.canonical = (unsigned) bp_unpack_value (bp, 1);
2011debfc3dSmrg r.uexp = (unsigned) bp_unpack_value (bp, EXP_BITS);
2021debfc3dSmrg for (i = 0; i < SIGSZ; i++)
2031debfc3dSmrg r.sig[i] = (unsigned long) bp_unpack_value (bp, HOST_BITS_PER_LONG);
2041debfc3dSmrg
2051debfc3dSmrg rp = ggc_alloc<real_value> ();
2061debfc3dSmrg memcpy (rp, &r, sizeof (REAL_VALUE_TYPE));
2071debfc3dSmrg TREE_REAL_CST_PTR (expr) = rp;
2081debfc3dSmrg }
2091debfc3dSmrg
2101debfc3dSmrg
2111debfc3dSmrg /* Unpack all the non-pointer fields of the TS_FIXED_CST structure of
2121debfc3dSmrg expression EXPR from bitpack BP. */
2131debfc3dSmrg
2141debfc3dSmrg static void
unpack_ts_fixed_cst_value_fields(struct bitpack_d * bp,tree expr)2151debfc3dSmrg unpack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
2161debfc3dSmrg {
2171debfc3dSmrg FIXED_VALUE_TYPE *fp = ggc_alloc<fixed_value> ();
218a2dc1f3fSmrg fp->mode = as_a <scalar_mode> (bp_unpack_machine_mode (bp));
2191debfc3dSmrg fp->data.low = bp_unpack_var_len_int (bp);
2201debfc3dSmrg fp->data.high = bp_unpack_var_len_int (bp);
2211debfc3dSmrg TREE_FIXED_CST_PTR (expr) = fp;
2221debfc3dSmrg }
2231debfc3dSmrg
2241debfc3dSmrg /* Unpack all the non-pointer fields of the TS_DECL_COMMON structure
2251debfc3dSmrg of expression EXPR from bitpack BP. */
2261debfc3dSmrg
2271debfc3dSmrg static void
unpack_ts_decl_common_value_fields(struct bitpack_d * bp,tree expr)2281debfc3dSmrg unpack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
2291debfc3dSmrg {
2301debfc3dSmrg SET_DECL_MODE (expr, bp_unpack_machine_mode (bp));
2311debfc3dSmrg DECL_NONLOCAL (expr) = (unsigned) bp_unpack_value (bp, 1);
2321debfc3dSmrg DECL_VIRTUAL_P (expr) = (unsigned) bp_unpack_value (bp, 1);
2331debfc3dSmrg DECL_IGNORED_P (expr) = (unsigned) bp_unpack_value (bp, 1);
2341debfc3dSmrg DECL_ABSTRACT_P (expr) = (unsigned) bp_unpack_value (bp, 1);
2351debfc3dSmrg DECL_ARTIFICIAL (expr) = (unsigned) bp_unpack_value (bp, 1);
2361debfc3dSmrg DECL_USER_ALIGN (expr) = (unsigned) bp_unpack_value (bp, 1);
2371debfc3dSmrg DECL_PRESERVE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
2381debfc3dSmrg DECL_EXTERNAL (expr) = (unsigned) bp_unpack_value (bp, 1);
2391debfc3dSmrg DECL_GIMPLE_REG_P (expr) = (unsigned) bp_unpack_value (bp, 1);
2401debfc3dSmrg SET_DECL_ALIGN (expr, (unsigned) bp_unpack_var_len_unsigned (bp));
2411debfc3dSmrg #ifdef ACCEL_COMPILER
2421debfc3dSmrg if (DECL_ALIGN (expr) > targetm.absolute_biggest_alignment)
2431debfc3dSmrg SET_DECL_ALIGN (expr, targetm.absolute_biggest_alignment);
2441debfc3dSmrg #endif
2451debfc3dSmrg if (TREE_CODE (expr) == LABEL_DECL)
2461debfc3dSmrg {
2471debfc3dSmrg EH_LANDING_PAD_NR (expr) = (int) bp_unpack_var_len_unsigned (bp);
2481debfc3dSmrg
2491debfc3dSmrg /* Always assume an initial value of -1 for LABEL_DECL_UID to
2501debfc3dSmrg force gimple_set_bb to recreate label_to_block_map. */
2511debfc3dSmrg LABEL_DECL_UID (expr) = -1;
2521debfc3dSmrg }
2531debfc3dSmrg
254a05ac97eSmrg else if (TREE_CODE (expr) == FIELD_DECL)
2551debfc3dSmrg {
2561debfc3dSmrg DECL_PACKED (expr) = (unsigned) bp_unpack_value (bp, 1);
2571debfc3dSmrg DECL_NONADDRESSABLE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
258a2dc1f3fSmrg DECL_PADDING_P (expr) = (unsigned) bp_unpack_value (bp, 1);
259*8feb0f0bSmrg DECL_FIELD_ABI_IGNORED (expr) = (unsigned) bp_unpack_value (bp, 1);
2601debfc3dSmrg expr->decl_common.off_align = bp_unpack_value (bp, 8);
2611debfc3dSmrg }
2621debfc3dSmrg
263a05ac97eSmrg else if (VAR_P (expr))
2641debfc3dSmrg {
2651debfc3dSmrg DECL_HAS_DEBUG_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
2661debfc3dSmrg DECL_NONLOCAL_FRAME (expr) = (unsigned) bp_unpack_value (bp, 1);
2671debfc3dSmrg }
2681debfc3dSmrg
269a05ac97eSmrg else if (TREE_CODE (expr) == PARM_DECL)
270a05ac97eSmrg DECL_HIDDEN_STRING_LENGTH (expr) = (unsigned) bp_unpack_value (bp, 1);
271a05ac97eSmrg
2721debfc3dSmrg if (TREE_CODE (expr) == RESULT_DECL
2731debfc3dSmrg || TREE_CODE (expr) == PARM_DECL
2741debfc3dSmrg || VAR_P (expr))
2751debfc3dSmrg {
2761debfc3dSmrg DECL_BY_REFERENCE (expr) = (unsigned) bp_unpack_value (bp, 1);
2771debfc3dSmrg if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
2781debfc3dSmrg DECL_HAS_VALUE_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
2791debfc3dSmrg }
2801debfc3dSmrg }
2811debfc3dSmrg
2821debfc3dSmrg
2831debfc3dSmrg /* Unpack all the non-pointer fields of the TS_DECL_WRTL structure
2841debfc3dSmrg of expression EXPR from bitpack BP. */
2851debfc3dSmrg
2861debfc3dSmrg static void
unpack_ts_decl_wrtl_value_fields(struct bitpack_d * bp,tree expr)2871debfc3dSmrg unpack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
2881debfc3dSmrg {
2891debfc3dSmrg DECL_REGISTER (expr) = (unsigned) bp_unpack_value (bp, 1);
2901debfc3dSmrg }
2911debfc3dSmrg
2921debfc3dSmrg
2931debfc3dSmrg /* Unpack all the non-pointer fields of the TS_DECL_WITH_VIS structure
2941debfc3dSmrg of expression EXPR from bitpack BP. */
2951debfc3dSmrg
2961debfc3dSmrg static void
unpack_ts_decl_with_vis_value_fields(struct bitpack_d * bp,tree expr)2971debfc3dSmrg unpack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
2981debfc3dSmrg {
2991debfc3dSmrg DECL_COMMON (expr) = (unsigned) bp_unpack_value (bp, 1);
3001debfc3dSmrg DECL_DLLIMPORT_P (expr) = (unsigned) bp_unpack_value (bp, 1);
3011debfc3dSmrg DECL_WEAK (expr) = (unsigned) bp_unpack_value (bp, 1);
3021debfc3dSmrg DECL_SEEN_IN_BIND_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
3031debfc3dSmrg DECL_COMDAT (expr) = (unsigned) bp_unpack_value (bp, 1);
3041debfc3dSmrg DECL_VISIBILITY (expr) = (enum symbol_visibility) bp_unpack_value (bp, 2);
3051debfc3dSmrg DECL_VISIBILITY_SPECIFIED (expr) = (unsigned) bp_unpack_value (bp, 1);
3061debfc3dSmrg
3071debfc3dSmrg if (VAR_P (expr))
3081debfc3dSmrg {
3091debfc3dSmrg DECL_HARD_REGISTER (expr) = (unsigned) bp_unpack_value (bp, 1);
3101debfc3dSmrg DECL_IN_CONSTANT_POOL (expr) = (unsigned) bp_unpack_value (bp, 1);
3111debfc3dSmrg }
3121debfc3dSmrg
3131debfc3dSmrg if (TREE_CODE (expr) == FUNCTION_DECL)
3141debfc3dSmrg {
3151debfc3dSmrg DECL_FINAL_P (expr) = (unsigned) bp_unpack_value (bp, 1);
3161debfc3dSmrg DECL_CXX_CONSTRUCTOR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
3171debfc3dSmrg DECL_CXX_DESTRUCTOR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
3181debfc3dSmrg }
3191debfc3dSmrg }
3201debfc3dSmrg
3211debfc3dSmrg
3221debfc3dSmrg /* Unpack all the non-pointer fields of the TS_FUNCTION_DECL structure
3231debfc3dSmrg of expression EXPR from bitpack BP. */
3241debfc3dSmrg
3251debfc3dSmrg static void
unpack_ts_function_decl_value_fields(struct bitpack_d * bp,tree expr)3261debfc3dSmrg unpack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
3271debfc3dSmrg {
328*8feb0f0bSmrg built_in_class cl = bp_unpack_enum (bp, built_in_class, BUILT_IN_LAST);
3291debfc3dSmrg DECL_STATIC_CONSTRUCTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
3301debfc3dSmrg DECL_STATIC_DESTRUCTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
3311debfc3dSmrg DECL_UNINLINABLE (expr) = (unsigned) bp_unpack_value (bp, 1);
3321debfc3dSmrg DECL_POSSIBLY_INLINED (expr) = (unsigned) bp_unpack_value (bp, 1);
3331debfc3dSmrg DECL_IS_NOVOPS (expr) = (unsigned) bp_unpack_value (bp, 1);
3341debfc3dSmrg DECL_IS_RETURNS_TWICE (expr) = (unsigned) bp_unpack_value (bp, 1);
3351debfc3dSmrg DECL_IS_MALLOC (expr) = (unsigned) bp_unpack_value (bp, 1);
336*8feb0f0bSmrg DECL_SET_IS_OPERATOR_NEW (expr, (unsigned) bp_unpack_value (bp, 1));
337*8feb0f0bSmrg DECL_SET_IS_OPERATOR_DELETE (expr, (unsigned) bp_unpack_value (bp, 1));
3381debfc3dSmrg DECL_DECLARED_INLINE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
3391debfc3dSmrg DECL_STATIC_CHAIN (expr) = (unsigned) bp_unpack_value (bp, 1);
3401debfc3dSmrg DECL_NO_INLINE_WARNING_P (expr) = (unsigned) bp_unpack_value (bp, 1);
3411debfc3dSmrg DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr)
3421debfc3dSmrg = (unsigned) bp_unpack_value (bp, 1);
3431debfc3dSmrg DECL_NO_LIMIT_STACK (expr) = (unsigned) bp_unpack_value (bp, 1);
3441debfc3dSmrg DECL_DISREGARD_INLINE_LIMITS (expr) = (unsigned) bp_unpack_value (bp, 1);
3451debfc3dSmrg DECL_PURE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
3461debfc3dSmrg DECL_LOOPING_CONST_OR_PURE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
347*8feb0f0bSmrg DECL_IS_REPLACEABLE_OPERATOR (expr) = (unsigned) bp_unpack_value (bp, 1);
348*8feb0f0bSmrg unsigned int fcode = 0;
349*8feb0f0bSmrg if (cl != NOT_BUILT_IN)
3501debfc3dSmrg {
351*8feb0f0bSmrg fcode = bp_unpack_value (bp, 32);
352*8feb0f0bSmrg if (cl == BUILT_IN_NORMAL && fcode >= END_BUILTINS)
3531debfc3dSmrg fatal_error (input_location,
3541debfc3dSmrg "machine independent builtin code out of range");
355*8feb0f0bSmrg else if (cl == BUILT_IN_MD)
3561debfc3dSmrg {
357*8feb0f0bSmrg tree result = targetm.builtin_decl (fcode, true);
3581debfc3dSmrg if (!result || result == error_mark_node)
3591debfc3dSmrg fatal_error (input_location,
3601debfc3dSmrg "target specific builtin not available");
3611debfc3dSmrg }
3621debfc3dSmrg }
363*8feb0f0bSmrg set_decl_built_in_function (expr, cl, fcode);
3641debfc3dSmrg }
3651debfc3dSmrg
3661debfc3dSmrg
3671debfc3dSmrg /* Unpack all the non-pointer fields of the TS_TYPE_COMMON structure
3681debfc3dSmrg of expression EXPR from bitpack BP. */
3691debfc3dSmrg
3701debfc3dSmrg static void
unpack_ts_type_common_value_fields(struct bitpack_d * bp,tree expr)3711debfc3dSmrg unpack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
3721debfc3dSmrg {
3731debfc3dSmrg machine_mode mode;
3741debfc3dSmrg
3751debfc3dSmrg mode = bp_unpack_machine_mode (bp);
3761debfc3dSmrg SET_TYPE_MODE (expr, mode);
3771debfc3dSmrg /* TYPE_NO_FORCE_BLK is private to stor-layout and need
3781debfc3dSmrg no streaming. */
3791debfc3dSmrg TYPE_PACKED (expr) = (unsigned) bp_unpack_value (bp, 1);
3801debfc3dSmrg TYPE_RESTRICT (expr) = (unsigned) bp_unpack_value (bp, 1);
3811debfc3dSmrg TYPE_USER_ALIGN (expr) = (unsigned) bp_unpack_value (bp, 1);
3821debfc3dSmrg TYPE_READONLY (expr) = (unsigned) bp_unpack_value (bp, 1);
383*8feb0f0bSmrg TYPE_LANG_FLAG_0 (expr) = (unsigned) bp_unpack_value (bp, 1);
3841debfc3dSmrg if (RECORD_OR_UNION_TYPE_P (expr))
3851debfc3dSmrg {
3861debfc3dSmrg TYPE_TRANSPARENT_AGGR (expr) = (unsigned) bp_unpack_value (bp, 1);
3871debfc3dSmrg TYPE_FINAL_P (expr) = (unsigned) bp_unpack_value (bp, 1);
388*8feb0f0bSmrg TYPE_CXX_ODR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
3891debfc3dSmrg }
3901debfc3dSmrg else if (TREE_CODE (expr) == ARRAY_TYPE)
3911debfc3dSmrg TYPE_NONALIASED_COMPONENT (expr) = (unsigned) bp_unpack_value (bp, 1);
392*8feb0f0bSmrg if (TREE_CODE (expr) == ARRAY_TYPE || TREE_CODE (expr) == INTEGER_TYPE)
393*8feb0f0bSmrg TYPE_STRING_FLAG (expr) = (unsigned) bp_unpack_value (bp, 1);
3941debfc3dSmrg if (AGGREGATE_TYPE_P (expr))
3951debfc3dSmrg TYPE_TYPELESS_STORAGE (expr) = (unsigned) bp_unpack_value (bp, 1);
396a2dc1f3fSmrg TYPE_EMPTY_P (expr) = (unsigned) bp_unpack_value (bp, 1);
3971debfc3dSmrg TYPE_PRECISION (expr) = bp_unpack_var_len_unsigned (bp);
3981debfc3dSmrg SET_TYPE_ALIGN (expr, bp_unpack_var_len_unsigned (bp));
3991debfc3dSmrg #ifdef ACCEL_COMPILER
4001debfc3dSmrg if (TYPE_ALIGN (expr) > targetm.absolute_biggest_alignment)
4011debfc3dSmrg SET_TYPE_ALIGN (expr, targetm.absolute_biggest_alignment);
4021debfc3dSmrg #endif
4031debfc3dSmrg }
4041debfc3dSmrg
4051debfc3dSmrg
4061debfc3dSmrg /* Unpack all the non-pointer fields of the TS_BLOCK structure
4071debfc3dSmrg of expression EXPR from bitpack BP. */
4081debfc3dSmrg
4091debfc3dSmrg static void
unpack_ts_block_value_fields(class data_in * data_in,struct bitpack_d * bp,tree expr)410*8feb0f0bSmrg unpack_ts_block_value_fields (class data_in *data_in,
4111debfc3dSmrg struct bitpack_d *bp, tree expr)
4121debfc3dSmrg {
4131debfc3dSmrg /* BLOCK_NUMBER is recomputed. */
4141debfc3dSmrg stream_input_location (&BLOCK_SOURCE_LOCATION (expr), bp, data_in);
4151debfc3dSmrg }
4161debfc3dSmrg
4171debfc3dSmrg /* Unpack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL
4181debfc3dSmrg structure of expression EXPR from bitpack BP. */
4191debfc3dSmrg
4201debfc3dSmrg static void
unpack_ts_translation_unit_decl_value_fields(class data_in * data_in,struct bitpack_d * bp,tree expr)421*8feb0f0bSmrg unpack_ts_translation_unit_decl_value_fields (class data_in *data_in,
4221debfc3dSmrg struct bitpack_d *bp, tree expr)
4231debfc3dSmrg {
4241debfc3dSmrg TRANSLATION_UNIT_LANGUAGE (expr) = xstrdup (bp_unpack_string (data_in, bp));
4251debfc3dSmrg vec_safe_push (all_translation_units, expr);
4261debfc3dSmrg }
4271debfc3dSmrg
4281debfc3dSmrg
4291debfc3dSmrg /* Unpack all the non-pointer fields of the TS_OMP_CLAUSE
4301debfc3dSmrg structure of expression EXPR from bitpack BP. */
4311debfc3dSmrg
4321debfc3dSmrg static void
unpack_ts_omp_clause_value_fields(class data_in * data_in,struct bitpack_d * bp,tree expr)433*8feb0f0bSmrg unpack_ts_omp_clause_value_fields (class data_in *data_in,
4341debfc3dSmrg struct bitpack_d *bp, tree expr)
4351debfc3dSmrg {
4361debfc3dSmrg stream_input_location (&OMP_CLAUSE_LOCATION (expr), bp, data_in);
4371debfc3dSmrg switch (OMP_CLAUSE_CODE (expr))
4381debfc3dSmrg {
4391debfc3dSmrg case OMP_CLAUSE_DEFAULT:
4401debfc3dSmrg OMP_CLAUSE_DEFAULT_KIND (expr)
4411debfc3dSmrg = bp_unpack_enum (bp, omp_clause_default_kind,
4421debfc3dSmrg OMP_CLAUSE_DEFAULT_LAST);
4431debfc3dSmrg break;
4441debfc3dSmrg case OMP_CLAUSE_SCHEDULE:
4451debfc3dSmrg OMP_CLAUSE_SCHEDULE_KIND (expr)
4461debfc3dSmrg = bp_unpack_enum (bp, omp_clause_schedule_kind,
4471debfc3dSmrg OMP_CLAUSE_SCHEDULE_LAST);
4481debfc3dSmrg break;
4491debfc3dSmrg case OMP_CLAUSE_DEPEND:
4501debfc3dSmrg OMP_CLAUSE_DEPEND_KIND (expr)
4511debfc3dSmrg = bp_unpack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST);
4521debfc3dSmrg break;
4531debfc3dSmrg case OMP_CLAUSE_MAP:
4541debfc3dSmrg OMP_CLAUSE_SET_MAP_KIND (expr, bp_unpack_enum (bp, gomp_map_kind,
4551debfc3dSmrg GOMP_MAP_LAST));
4561debfc3dSmrg break;
4571debfc3dSmrg case OMP_CLAUSE_PROC_BIND:
4581debfc3dSmrg OMP_CLAUSE_PROC_BIND_KIND (expr)
4591debfc3dSmrg = bp_unpack_enum (bp, omp_clause_proc_bind_kind,
4601debfc3dSmrg OMP_CLAUSE_PROC_BIND_LAST);
4611debfc3dSmrg break;
4621debfc3dSmrg case OMP_CLAUSE_REDUCTION:
463c0a68be4Smrg case OMP_CLAUSE_TASK_REDUCTION:
464c0a68be4Smrg case OMP_CLAUSE_IN_REDUCTION:
4651debfc3dSmrg OMP_CLAUSE_REDUCTION_CODE (expr)
4661debfc3dSmrg = bp_unpack_enum (bp, tree_code, MAX_TREE_CODES);
4671debfc3dSmrg break;
4681debfc3dSmrg default:
4691debfc3dSmrg break;
4701debfc3dSmrg }
4711debfc3dSmrg }
4721debfc3dSmrg
4731debfc3dSmrg
4741debfc3dSmrg /* Read all the language-independent bitfield values for EXPR from IB.
4751debfc3dSmrg Return the partially unpacked bitpack so the caller can unpack any other
4761debfc3dSmrg bitfield values that the writer may have written. */
4771debfc3dSmrg
4781debfc3dSmrg void
streamer_read_tree_bitfields(class lto_input_block * ib,class data_in * data_in,tree expr)479*8feb0f0bSmrg streamer_read_tree_bitfields (class lto_input_block *ib,
480*8feb0f0bSmrg class data_in *data_in, tree expr)
4811debfc3dSmrg {
4821debfc3dSmrg enum tree_code code;
4831debfc3dSmrg struct bitpack_d bp;
4841debfc3dSmrg
4851debfc3dSmrg /* Read the bitpack of non-pointer values from IB. */
4861debfc3dSmrg bp = streamer_read_bitpack (ib);
4871debfc3dSmrg
4881debfc3dSmrg /* The first word in BP contains the code of the tree that we
4891debfc3dSmrg are about to read. */
490*8feb0f0bSmrg if (streamer_debugging)
491*8feb0f0bSmrg {
4921debfc3dSmrg code = (enum tree_code) bp_unpack_value (&bp, 16);
4931debfc3dSmrg lto_tag_check (lto_tree_code_to_tag (code),
4941debfc3dSmrg lto_tree_code_to_tag (TREE_CODE (expr)));
495*8feb0f0bSmrg }
496*8feb0f0bSmrg code = TREE_CODE (expr);
4971debfc3dSmrg
4981debfc3dSmrg /* Note that all these functions are highly sensitive to changes in
4991debfc3dSmrg the types and sizes of each of the fields being packed. */
5001debfc3dSmrg unpack_ts_base_value_fields (&bp, expr);
5011debfc3dSmrg
5021debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
5031debfc3dSmrg unpack_ts_int_cst_value_fields (&bp, expr);
5041debfc3dSmrg
5051debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
5061debfc3dSmrg unpack_ts_real_cst_value_fields (&bp, expr);
5071debfc3dSmrg
5081debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
5091debfc3dSmrg unpack_ts_fixed_cst_value_fields (&bp, expr);
5101debfc3dSmrg
5111debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
5121debfc3dSmrg stream_input_location (&DECL_SOURCE_LOCATION (expr), &bp, data_in);
5131debfc3dSmrg
5141debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
5151debfc3dSmrg unpack_ts_decl_common_value_fields (&bp, expr);
5161debfc3dSmrg
5171debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
5181debfc3dSmrg unpack_ts_decl_wrtl_value_fields (&bp, expr);
5191debfc3dSmrg
5201debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
5211debfc3dSmrg unpack_ts_decl_with_vis_value_fields (&bp, expr);
5221debfc3dSmrg
5231debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
5241debfc3dSmrg unpack_ts_function_decl_value_fields (&bp, expr);
5251debfc3dSmrg
5261debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
5271debfc3dSmrg unpack_ts_type_common_value_fields (&bp, expr);
5281debfc3dSmrg
5291debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_EXP))
5301debfc3dSmrg {
5311debfc3dSmrg stream_input_location (&EXPR_CHECK (expr)->exp.locus, &bp, data_in);
5321debfc3dSmrg if (code == MEM_REF
5331debfc3dSmrg || code == TARGET_MEM_REF)
5341debfc3dSmrg {
5351debfc3dSmrg MR_DEPENDENCE_CLIQUE (expr)
5361debfc3dSmrg = (unsigned)bp_unpack_value (&bp, sizeof (short) * 8);
5371debfc3dSmrg if (MR_DEPENDENCE_CLIQUE (expr) != 0)
5381debfc3dSmrg MR_DEPENDENCE_BASE (expr)
5391debfc3dSmrg = (unsigned)bp_unpack_value (&bp, sizeof (short) * 8);
5401debfc3dSmrg }
541a2dc1f3fSmrg else if (code == CALL_EXPR)
542a2dc1f3fSmrg CALL_EXPR_IFN (expr) = bp_unpack_enum (&bp, internal_fn, IFN_LAST);
5431debfc3dSmrg }
5441debfc3dSmrg
5451debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
5461debfc3dSmrg unpack_ts_block_value_fields (data_in, &bp, expr);
5471debfc3dSmrg
5481debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
5491debfc3dSmrg unpack_ts_translation_unit_decl_value_fields (data_in, &bp, expr);
5501debfc3dSmrg
5511debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
552c0a68be4Smrg cl_optimization_stream_in (data_in, &bp, TREE_OPTIMIZATION (expr));
5531debfc3dSmrg
5541debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
5551debfc3dSmrg {
5561debfc3dSmrg unsigned HOST_WIDE_INT length = bp_unpack_var_len_unsigned (&bp);
5571debfc3dSmrg if (length > 0)
5581debfc3dSmrg vec_safe_grow (CONSTRUCTOR_ELTS (expr), length);
5591debfc3dSmrg }
5601debfc3dSmrg
5611debfc3dSmrg #ifndef ACCEL_COMPILER
5621debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
5631debfc3dSmrg {
5641debfc3dSmrg cl_target_option_stream_in (data_in, &bp, TREE_TARGET_OPTION (expr));
5651debfc3dSmrg if (targetm.target_option.post_stream_in)
5661debfc3dSmrg targetm.target_option.post_stream_in (TREE_TARGET_OPTION (expr));
5671debfc3dSmrg }
5681debfc3dSmrg #endif
5691debfc3dSmrg
5701debfc3dSmrg if (code == OMP_CLAUSE)
5711debfc3dSmrg unpack_ts_omp_clause_value_fields (data_in, &bp, expr);
5721debfc3dSmrg }
5731debfc3dSmrg
5741debfc3dSmrg
5751debfc3dSmrg /* Materialize a new tree from input block IB using descriptors in
5761debfc3dSmrg DATA_IN. The code for the new tree should match TAG. Store in
5771debfc3dSmrg *IX_P the index into the reader cache where the new tree is stored. */
5781debfc3dSmrg
5791debfc3dSmrg tree
streamer_alloc_tree(class lto_input_block * ib,class data_in * data_in,enum LTO_tags tag)580*8feb0f0bSmrg streamer_alloc_tree (class lto_input_block *ib, class data_in *data_in,
5811debfc3dSmrg enum LTO_tags tag)
5821debfc3dSmrg {
5831debfc3dSmrg enum tree_code code;
5841debfc3dSmrg tree result;
5851debfc3dSmrg
5861debfc3dSmrg result = NULL_TREE;
5871debfc3dSmrg
5881debfc3dSmrg code = lto_tag_to_tree_code (tag);
5891debfc3dSmrg
5901debfc3dSmrg /* We should never see an SSA_NAME tree. Only the version numbers of
5911debfc3dSmrg SSA names are ever written out. See input_ssa_names. */
5921debfc3dSmrg gcc_assert (code != SSA_NAME);
5931debfc3dSmrg
5941debfc3dSmrg /* Instantiate a new tree using the header data. */
5951debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_STRING))
5961debfc3dSmrg result = streamer_read_string_cst (data_in, ib);
5971debfc3dSmrg else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
5981debfc3dSmrg result = input_identifier (data_in, ib);
5991debfc3dSmrg else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
6001debfc3dSmrg {
6011debfc3dSmrg HOST_WIDE_INT len = streamer_read_hwi (ib);
6021debfc3dSmrg result = make_tree_vec (len);
6031debfc3dSmrg }
6041debfc3dSmrg else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
6051debfc3dSmrg {
606a2dc1f3fSmrg bitpack_d bp = streamer_read_bitpack (ib);
607a2dc1f3fSmrg unsigned int log2_npatterns = bp_unpack_value (&bp, 8);
608a2dc1f3fSmrg unsigned int nelts_per_pattern = bp_unpack_value (&bp, 8);
609a2dc1f3fSmrg result = make_vector (log2_npatterns, nelts_per_pattern);
6101debfc3dSmrg }
6111debfc3dSmrg else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
6121debfc3dSmrg {
6131debfc3dSmrg unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib);
6141debfc3dSmrg result = make_tree_binfo (len);
6151debfc3dSmrg }
6161debfc3dSmrg else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
6171debfc3dSmrg {
6181debfc3dSmrg unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib);
6191debfc3dSmrg unsigned HOST_WIDE_INT ext_len = streamer_read_uhwi (ib);
6201debfc3dSmrg result = make_int_cst (len, ext_len);
6211debfc3dSmrg }
6221debfc3dSmrg else if (code == CALL_EXPR)
6231debfc3dSmrg {
6241debfc3dSmrg unsigned HOST_WIDE_INT nargs = streamer_read_uhwi (ib);
6251debfc3dSmrg return build_vl_exp (CALL_EXPR, nargs + 3);
6261debfc3dSmrg }
6271debfc3dSmrg else if (code == OMP_CLAUSE)
6281debfc3dSmrg {
6291debfc3dSmrg enum omp_clause_code subcode
6301debfc3dSmrg = (enum omp_clause_code) streamer_read_uhwi (ib);
6311debfc3dSmrg return build_omp_clause (UNKNOWN_LOCATION, subcode);
6321debfc3dSmrg }
6331debfc3dSmrg else
6341debfc3dSmrg {
6351debfc3dSmrg /* For all other nodes, materialize the tree with a raw
6361debfc3dSmrg make_node call. */
6371debfc3dSmrg result = make_node (code);
6381debfc3dSmrg }
6391debfc3dSmrg
6401debfc3dSmrg return result;
6411debfc3dSmrg }
6421debfc3dSmrg
6431debfc3dSmrg
6441debfc3dSmrg /* Read all pointer fields in the TS_COMMON structure of EXPR from input
6451debfc3dSmrg block IB. DATA_IN contains tables and descriptors for the
6461debfc3dSmrg file being read. */
6471debfc3dSmrg
6481debfc3dSmrg
6491debfc3dSmrg static void
lto_input_ts_common_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)650*8feb0f0bSmrg lto_input_ts_common_tree_pointers (class lto_input_block *ib,
651*8feb0f0bSmrg class data_in *data_in, tree expr)
6521debfc3dSmrg {
6531debfc3dSmrg if (TREE_CODE (expr) != IDENTIFIER_NODE)
6541debfc3dSmrg TREE_TYPE (expr) = stream_read_tree (ib, data_in);
6551debfc3dSmrg }
6561debfc3dSmrg
6571debfc3dSmrg
6581debfc3dSmrg /* Read all pointer fields in the TS_VECTOR structure of EXPR from input
6591debfc3dSmrg block IB. DATA_IN contains tables and descriptors for the
6601debfc3dSmrg file being read. */
6611debfc3dSmrg
6621debfc3dSmrg static void
lto_input_ts_vector_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)663*8feb0f0bSmrg lto_input_ts_vector_tree_pointers (class lto_input_block *ib,
664*8feb0f0bSmrg class data_in *data_in, tree expr)
6651debfc3dSmrg {
666a2dc1f3fSmrg unsigned int count = vector_cst_encoded_nelts (expr);
667a2dc1f3fSmrg for (unsigned int i = 0; i < count; ++i)
668a2dc1f3fSmrg VECTOR_CST_ENCODED_ELT (expr, i) = stream_read_tree (ib, data_in);
669a2dc1f3fSmrg }
670a2dc1f3fSmrg
671a2dc1f3fSmrg
672a2dc1f3fSmrg /* Read all pointer fields in the TS_POLY_INT_CST structure of EXPR from
673a2dc1f3fSmrg input block IB. DATA_IN contains tables and descriptors for the
674a2dc1f3fSmrg file being read. */
675a2dc1f3fSmrg
676a2dc1f3fSmrg static void
lto_input_ts_poly_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)677*8feb0f0bSmrg lto_input_ts_poly_tree_pointers (class lto_input_block *ib,
678*8feb0f0bSmrg class data_in *data_in, tree expr)
679a2dc1f3fSmrg {
680a2dc1f3fSmrg for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
681a2dc1f3fSmrg POLY_INT_CST_COEFF (expr, i) = stream_read_tree (ib, data_in);
6821debfc3dSmrg }
6831debfc3dSmrg
6841debfc3dSmrg
6851debfc3dSmrg /* Read all pointer fields in the TS_COMPLEX structure of EXPR from input
6861debfc3dSmrg block IB. DATA_IN contains tables and descriptors for the
6871debfc3dSmrg file being read. */
6881debfc3dSmrg
6891debfc3dSmrg static void
lto_input_ts_complex_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)690*8feb0f0bSmrg lto_input_ts_complex_tree_pointers (class lto_input_block *ib,
691*8feb0f0bSmrg class data_in *data_in, tree expr)
6921debfc3dSmrg {
6931debfc3dSmrg TREE_REALPART (expr) = stream_read_tree (ib, data_in);
6941debfc3dSmrg TREE_IMAGPART (expr) = stream_read_tree (ib, data_in);
6951debfc3dSmrg }
6961debfc3dSmrg
6971debfc3dSmrg
6981debfc3dSmrg /* Read all pointer fields in the TS_DECL_MINIMAL structure of EXPR
6991debfc3dSmrg from input block IB. DATA_IN contains tables and descriptors for the
7001debfc3dSmrg file being read. */
7011debfc3dSmrg
7021debfc3dSmrg static void
lto_input_ts_decl_minimal_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)703*8feb0f0bSmrg lto_input_ts_decl_minimal_tree_pointers (class lto_input_block *ib,
704*8feb0f0bSmrg class data_in *data_in, tree expr)
7051debfc3dSmrg {
7061debfc3dSmrg DECL_NAME (expr) = stream_read_tree (ib, data_in);
7071debfc3dSmrg DECL_CONTEXT (expr) = stream_read_tree (ib, data_in);
7081debfc3dSmrg }
7091debfc3dSmrg
7101debfc3dSmrg
7111debfc3dSmrg /* Read all pointer fields in the TS_DECL_COMMON structure of EXPR from
7121debfc3dSmrg input block IB. DATA_IN contains tables and descriptors for the
7131debfc3dSmrg file being read. */
7141debfc3dSmrg
7151debfc3dSmrg static void
lto_input_ts_decl_common_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)716*8feb0f0bSmrg lto_input_ts_decl_common_tree_pointers (class lto_input_block *ib,
717*8feb0f0bSmrg class data_in *data_in, tree expr)
7181debfc3dSmrg {
7191debfc3dSmrg DECL_SIZE (expr) = stream_read_tree (ib, data_in);
7201debfc3dSmrg DECL_SIZE_UNIT (expr) = stream_read_tree (ib, data_in);
7211debfc3dSmrg DECL_ATTRIBUTES (expr) = stream_read_tree (ib, data_in);
722a2dc1f3fSmrg DECL_ABSTRACT_ORIGIN (expr) = stream_read_tree (ib, data_in);
7231debfc3dSmrg
7241debfc3dSmrg if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
7251debfc3dSmrg && DECL_HAS_VALUE_EXPR_P (expr))
7261debfc3dSmrg SET_DECL_VALUE_EXPR (expr, stream_read_tree (ib, data_in));
7271debfc3dSmrg
728a2dc1f3fSmrg if (VAR_P (expr)
729a2dc1f3fSmrg && DECL_HAS_DEBUG_EXPR_P (expr))
7301debfc3dSmrg {
7311debfc3dSmrg tree dexpr = stream_read_tree (ib, data_in);
7321debfc3dSmrg if (dexpr)
7331debfc3dSmrg SET_DECL_DEBUG_EXPR (expr, dexpr);
7341debfc3dSmrg }
7351debfc3dSmrg }
7361debfc3dSmrg
7371debfc3dSmrg
7381debfc3dSmrg /* Read all pointer fields in the TS_DECL_NON_COMMON structure of
7391debfc3dSmrg EXPR from input block IB. DATA_IN contains tables and descriptors for the
7401debfc3dSmrg file being read. */
7411debfc3dSmrg
7421debfc3dSmrg static void
lto_input_ts_decl_non_common_tree_pointers(class lto_input_block *,class data_in *,tree)743*8feb0f0bSmrg lto_input_ts_decl_non_common_tree_pointers (class lto_input_block *,
744*8feb0f0bSmrg class data_in *, tree)
7451debfc3dSmrg {
7461debfc3dSmrg }
7471debfc3dSmrg
7481debfc3dSmrg
7491debfc3dSmrg /* Read all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
7501debfc3dSmrg from input block IB. DATA_IN contains tables and descriptors for the
7511debfc3dSmrg file being read. */
7521debfc3dSmrg
7531debfc3dSmrg static void
lto_input_ts_decl_with_vis_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)754*8feb0f0bSmrg lto_input_ts_decl_with_vis_tree_pointers (class lto_input_block *ib,
755*8feb0f0bSmrg class data_in *data_in, tree expr)
7561debfc3dSmrg {
7571debfc3dSmrg tree id;
7581debfc3dSmrg
7591debfc3dSmrg id = stream_read_tree (ib, data_in);
7601debfc3dSmrg if (id)
7611debfc3dSmrg {
7621debfc3dSmrg gcc_assert (TREE_CODE (id) == IDENTIFIER_NODE);
7631debfc3dSmrg SET_DECL_ASSEMBLER_NAME (expr, id);
7641debfc3dSmrg }
7651debfc3dSmrg }
7661debfc3dSmrg
7671debfc3dSmrg
7681debfc3dSmrg /* Read all pointer fields in the TS_FIELD_DECL structure of EXPR from
7691debfc3dSmrg input block IB. DATA_IN contains tables and descriptors for the
7701debfc3dSmrg file being read. */
7711debfc3dSmrg
7721debfc3dSmrg static void
lto_input_ts_field_decl_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)773*8feb0f0bSmrg lto_input_ts_field_decl_tree_pointers (class lto_input_block *ib,
774*8feb0f0bSmrg class data_in *data_in, tree expr)
7751debfc3dSmrg {
7761debfc3dSmrg DECL_FIELD_OFFSET (expr) = stream_read_tree (ib, data_in);
7771debfc3dSmrg DECL_BIT_FIELD_TYPE (expr) = stream_read_tree (ib, data_in);
7781debfc3dSmrg DECL_BIT_FIELD_REPRESENTATIVE (expr) = stream_read_tree (ib, data_in);
7791debfc3dSmrg DECL_FIELD_BIT_OFFSET (expr) = stream_read_tree (ib, data_in);
7801debfc3dSmrg }
7811debfc3dSmrg
7821debfc3dSmrg
7831debfc3dSmrg /* Read all pointer fields in the TS_FUNCTION_DECL structure of EXPR
7841debfc3dSmrg from input block IB. DATA_IN contains tables and descriptors for the
7851debfc3dSmrg file being read. */
7861debfc3dSmrg
7871debfc3dSmrg static void
lto_input_ts_function_decl_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)788*8feb0f0bSmrg lto_input_ts_function_decl_tree_pointers (class lto_input_block *ib,
789*8feb0f0bSmrg class data_in *data_in, tree expr)
7901debfc3dSmrg {
7911debfc3dSmrg /* DECL_STRUCT_FUNCTION is loaded on demand by cgraph_get_body. */
7921debfc3dSmrg DECL_FUNCTION_PERSONALITY (expr) = stream_read_tree (ib, data_in);
7931debfc3dSmrg #ifndef ACCEL_COMPILER
7941debfc3dSmrg DECL_FUNCTION_SPECIFIC_TARGET (expr) = stream_read_tree (ib, data_in);
7951debfc3dSmrg #endif
7961debfc3dSmrg DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = stream_read_tree (ib, data_in);
797a2dc1f3fSmrg #ifdef ACCEL_COMPILER
798a2dc1f3fSmrg {
799a2dc1f3fSmrg tree opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr);
800a2dc1f3fSmrg if (opts)
801a2dc1f3fSmrg {
802a2dc1f3fSmrg struct gcc_options tmp;
803a2dc1f3fSmrg init_options_struct (&tmp, NULL);
804a2dc1f3fSmrg cl_optimization_restore (&tmp, TREE_OPTIMIZATION (opts));
805a2dc1f3fSmrg finish_options (&tmp, &global_options_set, UNKNOWN_LOCATION);
806a2dc1f3fSmrg opts = build_optimization_node (&tmp);
807a2dc1f3fSmrg DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = opts;
808a2dc1f3fSmrg }
809a2dc1f3fSmrg }
810a2dc1f3fSmrg #endif
8111debfc3dSmrg }
8121debfc3dSmrg
8131debfc3dSmrg
8141debfc3dSmrg /* Read all pointer fields in the TS_TYPE_COMMON structure of EXPR from
8151debfc3dSmrg input block IB. DATA_IN contains tables and descriptors for the file
8161debfc3dSmrg being read. */
8171debfc3dSmrg
8181debfc3dSmrg static void
lto_input_ts_type_common_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)819*8feb0f0bSmrg lto_input_ts_type_common_tree_pointers (class lto_input_block *ib,
820*8feb0f0bSmrg class data_in *data_in, tree expr)
8211debfc3dSmrg {
8221debfc3dSmrg TYPE_SIZE (expr) = stream_read_tree (ib, data_in);
8231debfc3dSmrg TYPE_SIZE_UNIT (expr) = stream_read_tree (ib, data_in);
8241debfc3dSmrg TYPE_ATTRIBUTES (expr) = stream_read_tree (ib, data_in);
8251debfc3dSmrg TYPE_NAME (expr) = stream_read_tree (ib, data_in);
8261debfc3dSmrg /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
8271debfc3dSmrg reconstructed during fixup. */
8281debfc3dSmrg /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
8291debfc3dSmrg during fixup. */
8301debfc3dSmrg TYPE_MAIN_VARIANT (expr) = stream_read_tree (ib, data_in);
8311debfc3dSmrg TYPE_CONTEXT (expr) = stream_read_tree (ib, data_in);
8321debfc3dSmrg /* TYPE_CANONICAL gets re-computed during type merging. */
8331debfc3dSmrg TYPE_CANONICAL (expr) = NULL_TREE;
8341debfc3dSmrg }
8351debfc3dSmrg
8361debfc3dSmrg /* Read all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
8371debfc3dSmrg from input block IB. DATA_IN contains tables and descriptors for the
8381debfc3dSmrg file being read. */
8391debfc3dSmrg
8401debfc3dSmrg static void
lto_input_ts_type_non_common_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)841*8feb0f0bSmrg lto_input_ts_type_non_common_tree_pointers (class lto_input_block *ib,
842*8feb0f0bSmrg class data_in *data_in,
8431debfc3dSmrg tree expr)
8441debfc3dSmrg {
845*8feb0f0bSmrg if (TREE_CODE (expr) == ARRAY_TYPE)
8461debfc3dSmrg TYPE_DOMAIN (expr) = stream_read_tree (ib, data_in);
8471debfc3dSmrg else if (RECORD_OR_UNION_TYPE_P (expr))
8481debfc3dSmrg TYPE_FIELDS (expr) = streamer_read_chain (ib, data_in);
8491debfc3dSmrg else if (TREE_CODE (expr) == FUNCTION_TYPE
8501debfc3dSmrg || TREE_CODE (expr) == METHOD_TYPE)
8511debfc3dSmrg TYPE_ARG_TYPES (expr) = stream_read_tree (ib, data_in);
8521debfc3dSmrg
8531debfc3dSmrg if (!POINTER_TYPE_P (expr))
854a2dc1f3fSmrg TYPE_MIN_VALUE_RAW (expr) = stream_read_tree (ib, data_in);
855a2dc1f3fSmrg TYPE_MAX_VALUE_RAW (expr) = stream_read_tree (ib, data_in);
8561debfc3dSmrg }
8571debfc3dSmrg
8581debfc3dSmrg
8591debfc3dSmrg /* Read all pointer fields in the TS_LIST structure of EXPR from input
8601debfc3dSmrg block IB. DATA_IN contains tables and descriptors for the
8611debfc3dSmrg file being read. */
8621debfc3dSmrg
8631debfc3dSmrg static void
lto_input_ts_list_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)864*8feb0f0bSmrg lto_input_ts_list_tree_pointers (class lto_input_block *ib,
865*8feb0f0bSmrg class data_in *data_in, tree expr)
8661debfc3dSmrg {
8671debfc3dSmrg TREE_PURPOSE (expr) = stream_read_tree (ib, data_in);
8681debfc3dSmrg TREE_VALUE (expr) = stream_read_tree (ib, data_in);
8691debfc3dSmrg TREE_CHAIN (expr) = stream_read_tree (ib, data_in);
8701debfc3dSmrg }
8711debfc3dSmrg
8721debfc3dSmrg
8731debfc3dSmrg /* Read all pointer fields in the TS_VEC structure of EXPR from input
8741debfc3dSmrg block IB. DATA_IN contains tables and descriptors for the
8751debfc3dSmrg file being read. */
8761debfc3dSmrg
8771debfc3dSmrg static void
lto_input_ts_vec_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)878*8feb0f0bSmrg lto_input_ts_vec_tree_pointers (class lto_input_block *ib,
879*8feb0f0bSmrg class data_in *data_in, tree expr)
8801debfc3dSmrg {
8811debfc3dSmrg int i;
8821debfc3dSmrg
8831debfc3dSmrg /* Note that TREE_VEC_LENGTH was read by streamer_alloc_tree to
8841debfc3dSmrg instantiate EXPR. */
8851debfc3dSmrg for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
8861debfc3dSmrg TREE_VEC_ELT (expr, i) = stream_read_tree (ib, data_in);
8871debfc3dSmrg }
8881debfc3dSmrg
8891debfc3dSmrg
8901debfc3dSmrg /* Read all pointer fields in the TS_EXP structure of EXPR from input
8911debfc3dSmrg block IB. DATA_IN contains tables and descriptors for the
8921debfc3dSmrg file being read. */
8931debfc3dSmrg
8941debfc3dSmrg
8951debfc3dSmrg static void
lto_input_ts_exp_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)896*8feb0f0bSmrg lto_input_ts_exp_tree_pointers (class lto_input_block *ib,
897*8feb0f0bSmrg class data_in *data_in, tree expr)
8981debfc3dSmrg {
8991debfc3dSmrg int i;
9001debfc3dSmrg tree block;
9011debfc3dSmrg
9021debfc3dSmrg for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
9031debfc3dSmrg TREE_OPERAND (expr, i) = stream_read_tree (ib, data_in);
9041debfc3dSmrg
9051debfc3dSmrg block = stream_read_tree (ib, data_in);
9061debfc3dSmrg
9071debfc3dSmrg /* TODO: Block is stored in the locus information. It may make more sense to
9081debfc3dSmrg to make it go via the location cache. */
9091debfc3dSmrg if (block)
9101debfc3dSmrg {
9111debfc3dSmrg data_in->location_cache.apply_location_cache ();
9121debfc3dSmrg TREE_SET_BLOCK (expr, block);
9131debfc3dSmrg }
9141debfc3dSmrg }
9151debfc3dSmrg
9161debfc3dSmrg
9171debfc3dSmrg /* Read all pointer fields in the TS_BLOCK structure of EXPR from input
9181debfc3dSmrg block IB. DATA_IN contains tables and descriptors for the
9191debfc3dSmrg file being read. */
9201debfc3dSmrg
9211debfc3dSmrg static void
lto_input_ts_block_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)922*8feb0f0bSmrg lto_input_ts_block_tree_pointers (class lto_input_block *ib,
923*8feb0f0bSmrg class data_in *data_in, tree expr)
9241debfc3dSmrg {
9251debfc3dSmrg BLOCK_VARS (expr) = streamer_read_chain (ib, data_in);
9261debfc3dSmrg
9271debfc3dSmrg BLOCK_SUPERCONTEXT (expr) = stream_read_tree (ib, data_in);
9281debfc3dSmrg BLOCK_ABSTRACT_ORIGIN (expr) = stream_read_tree (ib, data_in);
929c0a68be4Smrg /* We may end up prevailing a decl with DECL_ORIGIN (t) != t here
930c0a68be4Smrg which breaks the invariant that BLOCK_ABSTRACT_ORIGIN is the
931c0a68be4Smrg ultimate origin. Fixup here.
932c0a68be4Smrg ??? This should get fixed with moving to DIE references. */
933c0a68be4Smrg if (DECL_P (BLOCK_ORIGIN (expr)))
934c0a68be4Smrg BLOCK_ABSTRACT_ORIGIN (expr) = DECL_ORIGIN (BLOCK_ABSTRACT_ORIGIN (expr));
9351debfc3dSmrg /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information
9361debfc3dSmrg for early inlined BLOCKs so drop it on the floor instead of ICEing in
9371debfc3dSmrg dwarf2out.c. */
9381debfc3dSmrg
9391debfc3dSmrg /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
9401debfc3dSmrg streaming time. */
9411debfc3dSmrg
9421debfc3dSmrg /* We re-compute BLOCK_SUBBLOCKS of our parent here instead
9431debfc3dSmrg of streaming it. For non-BLOCK BLOCK_SUPERCONTEXTs we still
9441debfc3dSmrg stream the child relationship explicitly. */
9451debfc3dSmrg if (BLOCK_SUPERCONTEXT (expr)
9461debfc3dSmrg && TREE_CODE (BLOCK_SUPERCONTEXT (expr)) == BLOCK)
9471debfc3dSmrg {
9481debfc3dSmrg BLOCK_CHAIN (expr) = BLOCK_SUBBLOCKS (BLOCK_SUPERCONTEXT (expr));
9491debfc3dSmrg BLOCK_SUBBLOCKS (BLOCK_SUPERCONTEXT (expr)) = expr;
9501debfc3dSmrg }
9511debfc3dSmrg
9521debfc3dSmrg /* The global block is rooted at the TU decl. Hook it here to
9531debfc3dSmrg avoid the need to stream in this block during WPA time. */
9541debfc3dSmrg else if (BLOCK_SUPERCONTEXT (expr)
9551debfc3dSmrg && TREE_CODE (BLOCK_SUPERCONTEXT (expr)) == TRANSLATION_UNIT_DECL)
9561debfc3dSmrg DECL_INITIAL (BLOCK_SUPERCONTEXT (expr)) = expr;
9571debfc3dSmrg
9581debfc3dSmrg /* The function-level block is connected at the time we read in
9591debfc3dSmrg function bodies for the same reason. */
9601debfc3dSmrg }
9611debfc3dSmrg
9621debfc3dSmrg
9631debfc3dSmrg /* Read all pointer fields in the TS_BINFO structure of EXPR from input
9641debfc3dSmrg block IB. DATA_IN contains tables and descriptors for the
9651debfc3dSmrg file being read. */
9661debfc3dSmrg
9671debfc3dSmrg static void
lto_input_ts_binfo_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)968*8feb0f0bSmrg lto_input_ts_binfo_tree_pointers (class lto_input_block *ib,
969*8feb0f0bSmrg class data_in *data_in, tree expr)
9701debfc3dSmrg {
9711debfc3dSmrg tree t;
9721debfc3dSmrg
9731debfc3dSmrg /* Note that the number of slots in EXPR was read in
9741debfc3dSmrg streamer_alloc_tree when instantiating EXPR. However, the
9751debfc3dSmrg vector is empty so we cannot rely on vec::length to know how many
9761debfc3dSmrg elements to read. So, this list is emitted as a 0-terminated
9771debfc3dSmrg list on the writer side. */
9781debfc3dSmrg do
9791debfc3dSmrg {
9801debfc3dSmrg t = stream_read_tree (ib, data_in);
9811debfc3dSmrg if (t)
9821debfc3dSmrg BINFO_BASE_BINFOS (expr)->quick_push (t);
9831debfc3dSmrg }
9841debfc3dSmrg while (t);
9851debfc3dSmrg
9861debfc3dSmrg BINFO_OFFSET (expr) = stream_read_tree (ib, data_in);
9871debfc3dSmrg BINFO_VTABLE (expr) = stream_read_tree (ib, data_in);
9881debfc3dSmrg
989c0a68be4Smrg /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
990c0a68be4Smrg BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used by C++ FE
991c0a68be4Smrg only. */
9921debfc3dSmrg }
9931debfc3dSmrg
9941debfc3dSmrg
9951debfc3dSmrg /* Read all pointer fields in the TS_CONSTRUCTOR structure of EXPR from
9961debfc3dSmrg input block IB. DATA_IN contains tables and descriptors for the
9971debfc3dSmrg file being read. */
9981debfc3dSmrg
9991debfc3dSmrg static void
lto_input_ts_constructor_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)1000*8feb0f0bSmrg lto_input_ts_constructor_tree_pointers (class lto_input_block *ib,
1001*8feb0f0bSmrg class data_in *data_in, tree expr)
10021debfc3dSmrg {
10031debfc3dSmrg unsigned i;
10041debfc3dSmrg
10051debfc3dSmrg for (i = 0; i < CONSTRUCTOR_NELTS (expr); i++)
10061debfc3dSmrg {
10071debfc3dSmrg constructor_elt e;
10081debfc3dSmrg e.index = stream_read_tree (ib, data_in);
10091debfc3dSmrg e.value = stream_read_tree (ib, data_in);
10101debfc3dSmrg (*CONSTRUCTOR_ELTS (expr))[i] = e;
10111debfc3dSmrg }
10121debfc3dSmrg }
10131debfc3dSmrg
10141debfc3dSmrg
10151debfc3dSmrg /* Read all pointer fields in the TS_OMP_CLAUSE structure of EXPR from
10161debfc3dSmrg input block IB. DATA_IN contains tables and descriptors for the
10171debfc3dSmrg file being read. */
10181debfc3dSmrg
10191debfc3dSmrg static void
lto_input_ts_omp_clause_tree_pointers(class lto_input_block * ib,class data_in * data_in,tree expr)1020*8feb0f0bSmrg lto_input_ts_omp_clause_tree_pointers (class lto_input_block *ib,
1021*8feb0f0bSmrg class data_in *data_in, tree expr)
10221debfc3dSmrg {
10231debfc3dSmrg int i;
10241debfc3dSmrg
10251debfc3dSmrg for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
10261debfc3dSmrg OMP_CLAUSE_OPERAND (expr, i) = stream_read_tree (ib, data_in);
10271debfc3dSmrg OMP_CLAUSE_CHAIN (expr) = stream_read_tree (ib, data_in);
10281debfc3dSmrg }
10291debfc3dSmrg
10301debfc3dSmrg
10311debfc3dSmrg /* Read all pointer fields in EXPR from input block IB. DATA_IN
10321debfc3dSmrg contains tables and descriptors for the file being read. */
10331debfc3dSmrg
10341debfc3dSmrg void
streamer_read_tree_body(class lto_input_block * ib,class data_in * data_in,tree expr)1035*8feb0f0bSmrg streamer_read_tree_body (class lto_input_block *ib, class data_in *data_in,
10361debfc3dSmrg tree expr)
10371debfc3dSmrg {
10381debfc3dSmrg enum tree_code code;
10391debfc3dSmrg
10401debfc3dSmrg code = TREE_CODE (expr);
10411debfc3dSmrg
10421debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
10431debfc3dSmrg lto_input_ts_common_tree_pointers (ib, data_in, expr);
10441debfc3dSmrg
10451debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
10461debfc3dSmrg lto_input_ts_vector_tree_pointers (ib, data_in, expr);
10471debfc3dSmrg
1048a2dc1f3fSmrg if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
1049a2dc1f3fSmrg lto_input_ts_poly_tree_pointers (ib, data_in, expr);
1050a2dc1f3fSmrg
10511debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
10521debfc3dSmrg lto_input_ts_complex_tree_pointers (ib, data_in, expr);
10531debfc3dSmrg
10541debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
10551debfc3dSmrg lto_input_ts_decl_minimal_tree_pointers (ib, data_in, expr);
10561debfc3dSmrg
10571debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
10581debfc3dSmrg lto_input_ts_decl_common_tree_pointers (ib, data_in, expr);
10591debfc3dSmrg
10601debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
10611debfc3dSmrg lto_input_ts_decl_non_common_tree_pointers (ib, data_in, expr);
10621debfc3dSmrg
10631debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
10641debfc3dSmrg lto_input_ts_decl_with_vis_tree_pointers (ib, data_in, expr);
10651debfc3dSmrg
10661debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
10671debfc3dSmrg lto_input_ts_field_decl_tree_pointers (ib, data_in, expr);
10681debfc3dSmrg
10691debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
10701debfc3dSmrg lto_input_ts_function_decl_tree_pointers (ib, data_in, expr);
10711debfc3dSmrg
10721debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
10731debfc3dSmrg lto_input_ts_type_common_tree_pointers (ib, data_in, expr);
10741debfc3dSmrg
10751debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
10761debfc3dSmrg lto_input_ts_type_non_common_tree_pointers (ib, data_in, expr);
10771debfc3dSmrg
10781debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_LIST))
10791debfc3dSmrg lto_input_ts_list_tree_pointers (ib, data_in, expr);
10801debfc3dSmrg
10811debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_VEC))
10821debfc3dSmrg lto_input_ts_vec_tree_pointers (ib, data_in, expr);
10831debfc3dSmrg
10841debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_EXP))
10851debfc3dSmrg lto_input_ts_exp_tree_pointers (ib, data_in, expr);
10861debfc3dSmrg
10871debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
10881debfc3dSmrg lto_input_ts_block_tree_pointers (ib, data_in, expr);
10891debfc3dSmrg
10901debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
10911debfc3dSmrg lto_input_ts_binfo_tree_pointers (ib, data_in, expr);
10921debfc3dSmrg
10931debfc3dSmrg if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
10941debfc3dSmrg lto_input_ts_constructor_tree_pointers (ib, data_in, expr);
10951debfc3dSmrg
10961debfc3dSmrg if (code == OMP_CLAUSE)
10971debfc3dSmrg lto_input_ts_omp_clause_tree_pointers (ib, data_in, expr);
10981debfc3dSmrg }
10991debfc3dSmrg
11001debfc3dSmrg
11011debfc3dSmrg /* Read an index IX from input block IB and return the tree node at
11021debfc3dSmrg DATA_IN->FILE_DATA->GLOBALS_INDEX[IX]. */
11031debfc3dSmrg
11041debfc3dSmrg tree
streamer_get_pickled_tree(class lto_input_block * ib,class data_in * data_in)1105*8feb0f0bSmrg streamer_get_pickled_tree (class lto_input_block *ib, class data_in *data_in)
11061debfc3dSmrg {
11071debfc3dSmrg unsigned HOST_WIDE_INT ix;
11081debfc3dSmrg tree result;
11091debfc3dSmrg enum LTO_tags expected_tag;
11101debfc3dSmrg
11111debfc3dSmrg ix = streamer_read_uhwi (ib);
11121debfc3dSmrg result = streamer_tree_cache_get_tree (data_in->reader_cache, ix);
1113*8feb0f0bSmrg
1114*8feb0f0bSmrg if (streamer_debugging)
1115*8feb0f0bSmrg {
1116*8feb0f0bSmrg expected_tag = streamer_read_enum (ib, LTO_tags, LTO_NUM_TAGS);
11171debfc3dSmrg gcc_assert (result
11181debfc3dSmrg && TREE_CODE (result) == lto_tag_to_tree_code (expected_tag));
1119*8feb0f0bSmrg }
11201debfc3dSmrg
11211debfc3dSmrg return result;
11221debfc3dSmrg }
1123