xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-streamer-in.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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