xref: /dflybsd-src/contrib/gcc-8.0/gcc/tree-streamer-in.c (revision 95059079af47f9a66a175f374f2da1a5020e3255)
138fd1498Szrj /* Routines for reading trees from a file stream.
238fd1498Szrj 
338fd1498Szrj    Copyright (C) 2011-2018 Free Software Foundation, Inc.
438fd1498Szrj    Contributed by Diego Novillo <dnovillo@google.com>
538fd1498Szrj 
638fd1498Szrj This file is part of GCC.
738fd1498Szrj 
838fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
938fd1498Szrj the terms of the GNU General Public License as published by the Free
1038fd1498Szrj Software Foundation; either version 3, or (at your option) any later
1138fd1498Szrj version.
1238fd1498Szrj 
1338fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
1438fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
1538fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1638fd1498Szrj for more details.
1738fd1498Szrj 
1838fd1498Szrj You should have received a copy of the GNU General Public License
1938fd1498Szrj along with GCC; see the file COPYING3.  If not see
2038fd1498Szrj <http://www.gnu.org/licenses/>.  */
2138fd1498Szrj 
2238fd1498Szrj #include "config.h"
2338fd1498Szrj #include "system.h"
2438fd1498Szrj #include "coretypes.h"
2538fd1498Szrj #include "backend.h"
2638fd1498Szrj #include "target.h"
2738fd1498Szrj #include "tree.h"
2838fd1498Szrj #include "gimple.h"
2938fd1498Szrj #include "stringpool.h"
3038fd1498Szrj #include "tree-streamer.h"
3138fd1498Szrj #include "cgraph.h"
3238fd1498Szrj #include "builtins.h"
3338fd1498Szrj #include "ipa-chkp.h"
3438fd1498Szrj #include "gomp-constants.h"
3538fd1498Szrj #include "stringpool.h"
3638fd1498Szrj #include "attribs.h"
3738fd1498Szrj #include "asan.h"
3838fd1498Szrj #include "opts.h"
3938fd1498Szrj 
4038fd1498Szrj 
4138fd1498Szrj /* Read a STRING_CST from the string table in DATA_IN using input
4238fd1498Szrj    block IB.  */
4338fd1498Szrj 
4438fd1498Szrj tree
streamer_read_string_cst(struct data_in * data_in,struct lto_input_block * ib)4538fd1498Szrj streamer_read_string_cst (struct data_in *data_in, struct lto_input_block *ib)
4638fd1498Szrj {
4738fd1498Szrj   unsigned int len;
4838fd1498Szrj   const char * ptr;
4938fd1498Szrj 
5038fd1498Szrj   ptr = streamer_read_indexed_string (data_in, ib, &len);
5138fd1498Szrj   if (!ptr)
5238fd1498Szrj     return NULL;
5338fd1498Szrj   return build_string (len, ptr);
5438fd1498Szrj }
5538fd1498Szrj 
5638fd1498Szrj 
5738fd1498Szrj /* Read an IDENTIFIER from the string table in DATA_IN using input
5838fd1498Szrj    block IB.  */
5938fd1498Szrj 
6038fd1498Szrj static tree
input_identifier(struct data_in * data_in,struct lto_input_block * ib)6138fd1498Szrj input_identifier (struct data_in *data_in, struct lto_input_block *ib)
6238fd1498Szrj {
6338fd1498Szrj   unsigned int len;
6438fd1498Szrj   const char *ptr;
6538fd1498Szrj 
6638fd1498Szrj   ptr = streamer_read_indexed_string (data_in, ib, &len);
6738fd1498Szrj   if (!ptr)
6838fd1498Szrj     return NULL;
6938fd1498Szrj   return get_identifier_with_length (ptr, len);
7038fd1498Szrj }
7138fd1498Szrj 
7238fd1498Szrj 
7338fd1498Szrj /* Read a chain of tree nodes from input block IB. DATA_IN contains
7438fd1498Szrj    tables and descriptors for the file being read.  */
7538fd1498Szrj 
7638fd1498Szrj tree
streamer_read_chain(struct lto_input_block * ib,struct data_in * data_in)7738fd1498Szrj streamer_read_chain (struct lto_input_block *ib, struct data_in *data_in)
7838fd1498Szrj {
7938fd1498Szrj   tree first, prev, curr;
8038fd1498Szrj 
8138fd1498Szrj   /* The chain is written as NULL terminated list of trees.  */
8238fd1498Szrj   first = prev = NULL_TREE;
8338fd1498Szrj   do
8438fd1498Szrj     {
8538fd1498Szrj       curr = stream_read_tree (ib, data_in);
8638fd1498Szrj       if (prev)
8738fd1498Szrj 	TREE_CHAIN (prev) = curr;
8838fd1498Szrj       else
8938fd1498Szrj 	first = curr;
9038fd1498Szrj 
9138fd1498Szrj       prev = curr;
9238fd1498Szrj     }
9338fd1498Szrj   while (curr);
9438fd1498Szrj 
9538fd1498Szrj   return first;
9638fd1498Szrj }
9738fd1498Szrj 
9838fd1498Szrj 
9938fd1498Szrj /* Unpack all the non-pointer fields of the TS_BASE structure of
10038fd1498Szrj    expression EXPR from bitpack BP.  */
10138fd1498Szrj 
10238fd1498Szrj static inline void
unpack_ts_base_value_fields(struct bitpack_d * bp,tree expr)10338fd1498Szrj unpack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
10438fd1498Szrj {
10538fd1498Szrj   /* Note that the code for EXPR has already been unpacked to create EXPR in
10638fd1498Szrj      streamer_alloc_tree.  */
10738fd1498Szrj   if (!TYPE_P (expr))
10838fd1498Szrj     {
10938fd1498Szrj       TREE_SIDE_EFFECTS (expr) = (unsigned) bp_unpack_value (bp, 1);
11038fd1498Szrj       TREE_CONSTANT (expr) = (unsigned) bp_unpack_value (bp, 1);
11138fd1498Szrj       TREE_READONLY (expr) = (unsigned) bp_unpack_value (bp, 1);
11238fd1498Szrj 
11338fd1498Szrj       /* TREE_PUBLIC is used on types to indicate that the type
11438fd1498Szrj 	 has a TYPE_CACHED_VALUES vector.  This is not streamed out,
11538fd1498Szrj 	 so we skip it here.  */
11638fd1498Szrj       TREE_PUBLIC (expr) = (unsigned) bp_unpack_value (bp, 1);
11738fd1498Szrj     }
11838fd1498Szrj   else
11938fd1498Szrj     bp_unpack_value (bp, 4);
12038fd1498Szrj   TREE_ADDRESSABLE (expr) = (unsigned) bp_unpack_value (bp, 1);
12138fd1498Szrj   TREE_THIS_VOLATILE (expr) = (unsigned) bp_unpack_value (bp, 1);
12238fd1498Szrj   if (DECL_P (expr))
12338fd1498Szrj     {
12438fd1498Szrj       DECL_UNSIGNED (expr) = (unsigned) bp_unpack_value (bp, 1);
12538fd1498Szrj       DECL_NAMELESS (expr) = (unsigned) bp_unpack_value (bp, 1);
12638fd1498Szrj     }
12738fd1498Szrj   else if (TYPE_P (expr))
12838fd1498Szrj     TYPE_UNSIGNED (expr) = (unsigned) bp_unpack_value (bp, 1);
12938fd1498Szrj   else
13038fd1498Szrj     bp_unpack_value (bp, 1);
13138fd1498Szrj   TREE_ASM_WRITTEN (expr) = (unsigned) bp_unpack_value (bp, 1);
13238fd1498Szrj   if (TYPE_P (expr))
13338fd1498Szrj     TYPE_ARTIFICIAL (expr) = (unsigned) bp_unpack_value (bp, 1);
13438fd1498Szrj   else
13538fd1498Szrj     TREE_NO_WARNING (expr) = (unsigned) bp_unpack_value (bp, 1);
13638fd1498Szrj   TREE_NOTHROW (expr) = (unsigned) bp_unpack_value (bp, 1);
13738fd1498Szrj   TREE_STATIC (expr) = (unsigned) bp_unpack_value (bp, 1);
13838fd1498Szrj   if (TREE_CODE (expr) != TREE_BINFO)
13938fd1498Szrj     TREE_PRIVATE (expr) = (unsigned) bp_unpack_value (bp, 1);
14038fd1498Szrj   else
14138fd1498Szrj     bp_unpack_value (bp, 1);
14238fd1498Szrj   TREE_PROTECTED (expr) = (unsigned) bp_unpack_value (bp, 1);
14338fd1498Szrj   TREE_DEPRECATED (expr) = (unsigned) bp_unpack_value (bp, 1);
14438fd1498Szrj   if (TYPE_P (expr))
14538fd1498Szrj     {
14638fd1498Szrj       if (AGGREGATE_TYPE_P (expr))
14738fd1498Szrj 	TYPE_REVERSE_STORAGE_ORDER (expr) = (unsigned) bp_unpack_value (bp, 1);
14838fd1498Szrj       else
14938fd1498Szrj 	TYPE_SATURATING (expr) = (unsigned) bp_unpack_value (bp, 1);
15038fd1498Szrj       TYPE_ADDR_SPACE (expr) = (unsigned) bp_unpack_value (bp, 8);
15138fd1498Szrj     }
15238fd1498Szrj   else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
15338fd1498Szrj     {
15438fd1498Szrj       REF_REVERSE_STORAGE_ORDER (expr) = (unsigned) bp_unpack_value (bp, 1);
15538fd1498Szrj       bp_unpack_value (bp, 8);
15638fd1498Szrj     }
15738fd1498Szrj   else if (TREE_CODE (expr) == SSA_NAME)
15838fd1498Szrj     {
15938fd1498Szrj       SSA_NAME_IS_DEFAULT_DEF (expr) = (unsigned) bp_unpack_value (bp, 1);
16038fd1498Szrj       bp_unpack_value (bp, 8);
16138fd1498Szrj     }
162*58e805e6Szrj   else if (TREE_CODE (expr) == CALL_EXPR)
163*58e805e6Szrj     {
164*58e805e6Szrj       CALL_EXPR_BY_DESCRIPTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
165*58e805e6Szrj       bp_unpack_value (bp, 8);
166*58e805e6Szrj     }
16738fd1498Szrj   else
16838fd1498Szrj     bp_unpack_value (bp, 9);
16938fd1498Szrj }
17038fd1498Szrj 
17138fd1498Szrj 
17238fd1498Szrj /* Unpack all the non-pointer fields of the TS_INT_CST structure of
17338fd1498Szrj    expression EXPR from bitpack BP.  */
17438fd1498Szrj 
17538fd1498Szrj static void
unpack_ts_int_cst_value_fields(struct bitpack_d * bp,tree expr)17638fd1498Szrj unpack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
17738fd1498Szrj {
17838fd1498Szrj   int i;
17938fd1498Szrj   for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
18038fd1498Szrj     TREE_INT_CST_ELT (expr, i) = bp_unpack_var_len_int (bp);
18138fd1498Szrj }
18238fd1498Szrj 
18338fd1498Szrj 
18438fd1498Szrj /* Unpack all the non-pointer fields of the TS_REAL_CST structure of
18538fd1498Szrj    expression EXPR from bitpack BP.  */
18638fd1498Szrj 
18738fd1498Szrj static void
unpack_ts_real_cst_value_fields(struct bitpack_d * bp,tree expr)18838fd1498Szrj unpack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
18938fd1498Szrj {
19038fd1498Szrj   unsigned i;
19138fd1498Szrj   REAL_VALUE_TYPE r;
19238fd1498Szrj   REAL_VALUE_TYPE *rp;
19338fd1498Szrj 
19438fd1498Szrj   /* Clear all bits of the real value type so that we can later do
19538fd1498Szrj      bitwise comparisons to see if two values are the same.  */
19638fd1498Szrj   memset (&r, 0, sizeof r);
19738fd1498Szrj   r.cl = (unsigned) bp_unpack_value (bp, 2);
19838fd1498Szrj   r.decimal = (unsigned) bp_unpack_value (bp, 1);
19938fd1498Szrj   r.sign = (unsigned) bp_unpack_value (bp, 1);
20038fd1498Szrj   r.signalling = (unsigned) bp_unpack_value (bp, 1);
20138fd1498Szrj   r.canonical = (unsigned) bp_unpack_value (bp, 1);
20238fd1498Szrj   r.uexp = (unsigned) bp_unpack_value (bp, EXP_BITS);
20338fd1498Szrj   for (i = 0; i < SIGSZ; i++)
20438fd1498Szrj     r.sig[i] = (unsigned long) bp_unpack_value (bp, HOST_BITS_PER_LONG);
20538fd1498Szrj 
20638fd1498Szrj   rp = ggc_alloc<real_value> ();
20738fd1498Szrj   memcpy (rp, &r, sizeof (REAL_VALUE_TYPE));
20838fd1498Szrj   TREE_REAL_CST_PTR (expr) = rp;
20938fd1498Szrj }
21038fd1498Szrj 
21138fd1498Szrj 
21238fd1498Szrj /* Unpack all the non-pointer fields of the TS_FIXED_CST structure of
21338fd1498Szrj    expression EXPR from bitpack BP.  */
21438fd1498Szrj 
21538fd1498Szrj static void
unpack_ts_fixed_cst_value_fields(struct bitpack_d * bp,tree expr)21638fd1498Szrj unpack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
21738fd1498Szrj {
21838fd1498Szrj   FIXED_VALUE_TYPE *fp = ggc_alloc<fixed_value> ();
21938fd1498Szrj   fp->mode = as_a <scalar_mode> (bp_unpack_machine_mode (bp));
22038fd1498Szrj   fp->data.low = bp_unpack_var_len_int (bp);
22138fd1498Szrj   fp->data.high = bp_unpack_var_len_int (bp);
22238fd1498Szrj   TREE_FIXED_CST_PTR (expr) = fp;
22338fd1498Szrj }
22438fd1498Szrj 
22538fd1498Szrj /* Unpack all the non-pointer fields of the TS_DECL_COMMON structure
22638fd1498Szrj    of expression EXPR from bitpack BP.  */
22738fd1498Szrj 
22838fd1498Szrj static void
unpack_ts_decl_common_value_fields(struct bitpack_d * bp,tree expr)22938fd1498Szrj unpack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
23038fd1498Szrj {
23138fd1498Szrj   SET_DECL_MODE (expr, bp_unpack_machine_mode (bp));
23238fd1498Szrj   DECL_NONLOCAL (expr) = (unsigned) bp_unpack_value (bp, 1);
23338fd1498Szrj   DECL_VIRTUAL_P (expr) = (unsigned) bp_unpack_value (bp, 1);
23438fd1498Szrj   DECL_IGNORED_P (expr) = (unsigned) bp_unpack_value (bp, 1);
23538fd1498Szrj   DECL_ABSTRACT_P (expr) = (unsigned) bp_unpack_value (bp, 1);
23638fd1498Szrj   DECL_ARTIFICIAL (expr) = (unsigned) bp_unpack_value (bp, 1);
23738fd1498Szrj   DECL_USER_ALIGN (expr) = (unsigned) bp_unpack_value (bp, 1);
23838fd1498Szrj   DECL_PRESERVE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
23938fd1498Szrj   DECL_EXTERNAL (expr) = (unsigned) bp_unpack_value (bp, 1);
24038fd1498Szrj   DECL_GIMPLE_REG_P (expr) = (unsigned) bp_unpack_value (bp, 1);
24138fd1498Szrj   SET_DECL_ALIGN (expr, (unsigned) bp_unpack_var_len_unsigned (bp));
24238fd1498Szrj #ifdef ACCEL_COMPILER
24338fd1498Szrj   if (DECL_ALIGN (expr) > targetm.absolute_biggest_alignment)
24438fd1498Szrj     SET_DECL_ALIGN (expr, targetm.absolute_biggest_alignment);
24538fd1498Szrj #endif
24638fd1498Szrj   if (TREE_CODE (expr) == LABEL_DECL)
24738fd1498Szrj     {
24838fd1498Szrj       EH_LANDING_PAD_NR (expr) = (int) bp_unpack_var_len_unsigned (bp);
24938fd1498Szrj 
25038fd1498Szrj       /* Always assume an initial value of -1 for LABEL_DECL_UID to
25138fd1498Szrj 	 force gimple_set_bb to recreate label_to_block_map.  */
25238fd1498Szrj       LABEL_DECL_UID (expr) = -1;
25338fd1498Szrj     }
25438fd1498Szrj 
25538fd1498Szrj   if (TREE_CODE (expr) == FIELD_DECL)
25638fd1498Szrj     {
25738fd1498Szrj       DECL_PACKED (expr) = (unsigned) bp_unpack_value (bp, 1);
25838fd1498Szrj       DECL_NONADDRESSABLE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
25938fd1498Szrj       DECL_PADDING_P (expr) = (unsigned) bp_unpack_value (bp, 1);
26038fd1498Szrj       expr->decl_common.off_align = bp_unpack_value (bp, 8);
26138fd1498Szrj     }
26238fd1498Szrj 
26338fd1498Szrj   if (VAR_P (expr))
26438fd1498Szrj     {
26538fd1498Szrj       DECL_HAS_DEBUG_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
26638fd1498Szrj       DECL_NONLOCAL_FRAME (expr) = (unsigned) bp_unpack_value (bp, 1);
26738fd1498Szrj     }
26838fd1498Szrj 
26938fd1498Szrj   if (TREE_CODE (expr) == RESULT_DECL
27038fd1498Szrj       || TREE_CODE (expr) == PARM_DECL
27138fd1498Szrj       || VAR_P (expr))
27238fd1498Szrj     {
27338fd1498Szrj       DECL_BY_REFERENCE (expr) = (unsigned) bp_unpack_value (bp, 1);
27438fd1498Szrj       if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
27538fd1498Szrj 	DECL_HAS_VALUE_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
27638fd1498Szrj     }
27738fd1498Szrj }
27838fd1498Szrj 
27938fd1498Szrj 
28038fd1498Szrj /* Unpack all the non-pointer fields of the TS_DECL_WRTL structure
28138fd1498Szrj    of expression EXPR from bitpack BP.  */
28238fd1498Szrj 
28338fd1498Szrj static void
unpack_ts_decl_wrtl_value_fields(struct bitpack_d * bp,tree expr)28438fd1498Szrj unpack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
28538fd1498Szrj {
28638fd1498Szrj   DECL_REGISTER (expr) = (unsigned) bp_unpack_value (bp, 1);
28738fd1498Szrj }
28838fd1498Szrj 
28938fd1498Szrj 
29038fd1498Szrj /* Unpack all the non-pointer fields of the TS_DECL_WITH_VIS structure
29138fd1498Szrj    of expression EXPR from bitpack BP.  */
29238fd1498Szrj 
29338fd1498Szrj static void
unpack_ts_decl_with_vis_value_fields(struct bitpack_d * bp,tree expr)29438fd1498Szrj unpack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
29538fd1498Szrj {
29638fd1498Szrj   DECL_COMMON (expr) = (unsigned) bp_unpack_value (bp, 1);
29738fd1498Szrj   DECL_DLLIMPORT_P (expr) = (unsigned) bp_unpack_value (bp, 1);
29838fd1498Szrj   DECL_WEAK (expr) = (unsigned) bp_unpack_value (bp, 1);
29938fd1498Szrj   DECL_SEEN_IN_BIND_EXPR_P (expr) = (unsigned) bp_unpack_value (bp,  1);
30038fd1498Szrj   DECL_COMDAT (expr) = (unsigned) bp_unpack_value (bp,  1);
30138fd1498Szrj   DECL_VISIBILITY (expr) = (enum symbol_visibility) bp_unpack_value (bp,  2);
30238fd1498Szrj   DECL_VISIBILITY_SPECIFIED (expr) = (unsigned) bp_unpack_value (bp,  1);
30338fd1498Szrj 
30438fd1498Szrj   if (VAR_P (expr))
30538fd1498Szrj     {
30638fd1498Szrj       DECL_HARD_REGISTER (expr) = (unsigned) bp_unpack_value (bp, 1);
30738fd1498Szrj       DECL_IN_CONSTANT_POOL (expr) = (unsigned) bp_unpack_value (bp, 1);
30838fd1498Szrj     }
30938fd1498Szrj 
31038fd1498Szrj   if (TREE_CODE (expr) == FUNCTION_DECL)
31138fd1498Szrj     {
31238fd1498Szrj       DECL_FINAL_P (expr) = (unsigned) bp_unpack_value (bp, 1);
31338fd1498Szrj       DECL_CXX_CONSTRUCTOR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
31438fd1498Szrj       DECL_CXX_DESTRUCTOR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
31538fd1498Szrj     }
31638fd1498Szrj }
31738fd1498Szrj 
31838fd1498Szrj 
31938fd1498Szrj /* Unpack all the non-pointer fields of the TS_FUNCTION_DECL structure
32038fd1498Szrj    of expression EXPR from bitpack BP.  */
32138fd1498Szrj 
32238fd1498Szrj static void
unpack_ts_function_decl_value_fields(struct bitpack_d * bp,tree expr)32338fd1498Szrj unpack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
32438fd1498Szrj {
32538fd1498Szrj   DECL_BUILT_IN_CLASS (expr) = bp_unpack_enum (bp, built_in_class,
32638fd1498Szrj 					       BUILT_IN_LAST);
32738fd1498Szrj   DECL_STATIC_CONSTRUCTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
32838fd1498Szrj   DECL_STATIC_DESTRUCTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
32938fd1498Szrj   DECL_UNINLINABLE (expr) = (unsigned) bp_unpack_value (bp, 1);
33038fd1498Szrj   DECL_POSSIBLY_INLINED (expr) = (unsigned) bp_unpack_value (bp, 1);
33138fd1498Szrj   DECL_IS_NOVOPS (expr) = (unsigned) bp_unpack_value (bp, 1);
33238fd1498Szrj   DECL_IS_RETURNS_TWICE (expr) = (unsigned) bp_unpack_value (bp, 1);
33338fd1498Szrj   DECL_IS_MALLOC (expr) = (unsigned) bp_unpack_value (bp, 1);
33438fd1498Szrj   DECL_IS_OPERATOR_NEW (expr) = (unsigned) bp_unpack_value (bp, 1);
33538fd1498Szrj   DECL_DECLARED_INLINE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
33638fd1498Szrj   DECL_STATIC_CHAIN (expr) = (unsigned) bp_unpack_value (bp, 1);
33738fd1498Szrj   DECL_NO_INLINE_WARNING_P (expr) = (unsigned) bp_unpack_value (bp, 1);
33838fd1498Szrj   DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr)
33938fd1498Szrj     			= (unsigned) bp_unpack_value (bp, 1);
34038fd1498Szrj   DECL_NO_LIMIT_STACK (expr) = (unsigned) bp_unpack_value (bp, 1);
34138fd1498Szrj   DECL_DISREGARD_INLINE_LIMITS (expr) = (unsigned) bp_unpack_value (bp, 1);
34238fd1498Szrj   DECL_PURE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
34338fd1498Szrj   DECL_LOOPING_CONST_OR_PURE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
34438fd1498Szrj   if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
34538fd1498Szrj     {
34638fd1498Szrj       DECL_FUNCTION_CODE (expr) = (enum built_in_function) bp_unpack_value (bp,
34738fd1498Szrj 	                                                                    12);
34838fd1498Szrj       if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_NORMAL
34938fd1498Szrj 	  && DECL_FUNCTION_CODE (expr) >= END_BUILTINS)
35038fd1498Szrj 	fatal_error (input_location,
35138fd1498Szrj 		     "machine independent builtin code out of range");
35238fd1498Szrj       else if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD)
35338fd1498Szrj 	{
35438fd1498Szrj           tree result = targetm.builtin_decl (DECL_FUNCTION_CODE (expr), true);
35538fd1498Szrj 	  if (!result || result == error_mark_node)
35638fd1498Szrj 	    fatal_error (input_location,
35738fd1498Szrj 			 "target specific builtin not available");
35838fd1498Szrj 	}
35938fd1498Szrj     }
36038fd1498Szrj }
36138fd1498Szrj 
36238fd1498Szrj 
36338fd1498Szrj /* Unpack all the non-pointer fields of the TS_TYPE_COMMON structure
36438fd1498Szrj    of expression EXPR from bitpack BP.  */
36538fd1498Szrj 
36638fd1498Szrj static void
unpack_ts_type_common_value_fields(struct bitpack_d * bp,tree expr)36738fd1498Szrj unpack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
36838fd1498Szrj {
36938fd1498Szrj   machine_mode mode;
37038fd1498Szrj 
37138fd1498Szrj   mode = bp_unpack_machine_mode (bp);
37238fd1498Szrj   SET_TYPE_MODE (expr, mode);
37338fd1498Szrj   TYPE_STRING_FLAG (expr) = (unsigned) bp_unpack_value (bp, 1);
37438fd1498Szrj   /* TYPE_NO_FORCE_BLK is private to stor-layout and need
37538fd1498Szrj      no streaming.  */
37638fd1498Szrj   TYPE_NEEDS_CONSTRUCTING (expr) = (unsigned) bp_unpack_value (bp, 1);
37738fd1498Szrj   TYPE_PACKED (expr) = (unsigned) bp_unpack_value (bp, 1);
37838fd1498Szrj   TYPE_RESTRICT (expr) = (unsigned) bp_unpack_value (bp, 1);
37938fd1498Szrj   TYPE_USER_ALIGN (expr) = (unsigned) bp_unpack_value (bp, 1);
38038fd1498Szrj   TYPE_READONLY (expr) = (unsigned) bp_unpack_value (bp, 1);
38138fd1498Szrj   if (RECORD_OR_UNION_TYPE_P (expr))
38238fd1498Szrj     {
38338fd1498Szrj       TYPE_TRANSPARENT_AGGR (expr) = (unsigned) bp_unpack_value (bp, 1);
38438fd1498Szrj       TYPE_FINAL_P (expr) = (unsigned) bp_unpack_value (bp, 1);
38538fd1498Szrj     }
38638fd1498Szrj   else if (TREE_CODE (expr) == ARRAY_TYPE)
38738fd1498Szrj     TYPE_NONALIASED_COMPONENT (expr) = (unsigned) bp_unpack_value (bp, 1);
38838fd1498Szrj   if (AGGREGATE_TYPE_P (expr))
38938fd1498Szrj     TYPE_TYPELESS_STORAGE (expr) = (unsigned) bp_unpack_value (bp, 1);
39038fd1498Szrj   TYPE_EMPTY_P (expr) = (unsigned) bp_unpack_value (bp, 1);
39138fd1498Szrj   TYPE_PRECISION (expr) = bp_unpack_var_len_unsigned (bp);
39238fd1498Szrj   SET_TYPE_ALIGN (expr, bp_unpack_var_len_unsigned (bp));
39338fd1498Szrj #ifdef ACCEL_COMPILER
39438fd1498Szrj   if (TYPE_ALIGN (expr) > targetm.absolute_biggest_alignment)
39538fd1498Szrj     SET_TYPE_ALIGN (expr, targetm.absolute_biggest_alignment);
39638fd1498Szrj #endif
39738fd1498Szrj }
39838fd1498Szrj 
39938fd1498Szrj 
40038fd1498Szrj /* Unpack all the non-pointer fields of the TS_BLOCK structure
40138fd1498Szrj    of expression EXPR from bitpack BP.  */
40238fd1498Szrj 
40338fd1498Szrj static void
unpack_ts_block_value_fields(struct data_in * data_in,struct bitpack_d * bp,tree expr)40438fd1498Szrj unpack_ts_block_value_fields (struct data_in *data_in,
40538fd1498Szrj 			      struct bitpack_d *bp, tree expr)
40638fd1498Szrj {
40738fd1498Szrj   BLOCK_ABSTRACT (expr) = (unsigned) bp_unpack_value (bp, 1);
40838fd1498Szrj   /* BLOCK_NUMBER is recomputed.  */
40938fd1498Szrj   stream_input_location (&BLOCK_SOURCE_LOCATION (expr), bp, data_in);
41038fd1498Szrj }
41138fd1498Szrj 
41238fd1498Szrj /* Unpack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL
41338fd1498Szrj    structure of expression EXPR from bitpack BP.  */
41438fd1498Szrj 
41538fd1498Szrj static void
unpack_ts_translation_unit_decl_value_fields(struct data_in * data_in,struct bitpack_d * bp,tree expr)41638fd1498Szrj unpack_ts_translation_unit_decl_value_fields (struct data_in *data_in,
41738fd1498Szrj 					      struct bitpack_d *bp, tree expr)
41838fd1498Szrj {
41938fd1498Szrj   TRANSLATION_UNIT_LANGUAGE (expr) = xstrdup (bp_unpack_string (data_in, bp));
42038fd1498Szrj   vec_safe_push (all_translation_units, expr);
42138fd1498Szrj }
42238fd1498Szrj 
42338fd1498Szrj 
42438fd1498Szrj /* Unpack all the non-pointer fields of the TS_OMP_CLAUSE
42538fd1498Szrj    structure of expression EXPR from bitpack BP.  */
42638fd1498Szrj 
42738fd1498Szrj static void
unpack_ts_omp_clause_value_fields(struct data_in * data_in,struct bitpack_d * bp,tree expr)42838fd1498Szrj unpack_ts_omp_clause_value_fields (struct data_in *data_in,
42938fd1498Szrj 				   struct bitpack_d *bp, tree expr)
43038fd1498Szrj {
43138fd1498Szrj   stream_input_location (&OMP_CLAUSE_LOCATION (expr), bp, data_in);
43238fd1498Szrj   switch (OMP_CLAUSE_CODE (expr))
43338fd1498Szrj     {
43438fd1498Szrj     case OMP_CLAUSE_DEFAULT:
43538fd1498Szrj       OMP_CLAUSE_DEFAULT_KIND (expr)
43638fd1498Szrj 	= bp_unpack_enum (bp, omp_clause_default_kind,
43738fd1498Szrj 			  OMP_CLAUSE_DEFAULT_LAST);
43838fd1498Szrj       break;
43938fd1498Szrj     case OMP_CLAUSE_SCHEDULE:
44038fd1498Szrj       OMP_CLAUSE_SCHEDULE_KIND (expr)
44138fd1498Szrj 	= bp_unpack_enum (bp, omp_clause_schedule_kind,
44238fd1498Szrj 			  OMP_CLAUSE_SCHEDULE_LAST);
44338fd1498Szrj       break;
44438fd1498Szrj     case OMP_CLAUSE_DEPEND:
44538fd1498Szrj       OMP_CLAUSE_DEPEND_KIND (expr)
44638fd1498Szrj 	= bp_unpack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST);
44738fd1498Szrj       break;
44838fd1498Szrj     case OMP_CLAUSE_MAP:
44938fd1498Szrj       OMP_CLAUSE_SET_MAP_KIND (expr, bp_unpack_enum (bp, gomp_map_kind,
45038fd1498Szrj 						     GOMP_MAP_LAST));
45138fd1498Szrj       break;
45238fd1498Szrj     case OMP_CLAUSE_PROC_BIND:
45338fd1498Szrj       OMP_CLAUSE_PROC_BIND_KIND (expr)
45438fd1498Szrj 	= bp_unpack_enum (bp, omp_clause_proc_bind_kind,
45538fd1498Szrj 			  OMP_CLAUSE_PROC_BIND_LAST);
45638fd1498Szrj       break;
45738fd1498Szrj     case OMP_CLAUSE_REDUCTION:
45838fd1498Szrj       OMP_CLAUSE_REDUCTION_CODE (expr)
45938fd1498Szrj 	= bp_unpack_enum (bp, tree_code, MAX_TREE_CODES);
46038fd1498Szrj       break;
46138fd1498Szrj     default:
46238fd1498Szrj       break;
46338fd1498Szrj     }
46438fd1498Szrj }
46538fd1498Szrj 
46638fd1498Szrj 
46738fd1498Szrj /* Read all the language-independent bitfield values for EXPR from IB.
46838fd1498Szrj    Return the partially unpacked bitpack so the caller can unpack any other
46938fd1498Szrj    bitfield values that the writer may have written.  */
47038fd1498Szrj 
47138fd1498Szrj void
streamer_read_tree_bitfields(struct lto_input_block * ib,struct data_in * data_in,tree expr)47238fd1498Szrj streamer_read_tree_bitfields (struct lto_input_block *ib,
47338fd1498Szrj 			      struct data_in *data_in, tree expr)
47438fd1498Szrj {
47538fd1498Szrj   enum tree_code code;
47638fd1498Szrj   struct bitpack_d bp;
47738fd1498Szrj 
47838fd1498Szrj   /* Read the bitpack of non-pointer values from IB.  */
47938fd1498Szrj   bp = streamer_read_bitpack (ib);
48038fd1498Szrj 
48138fd1498Szrj   /* The first word in BP contains the code of the tree that we
48238fd1498Szrj      are about to read.  */
48338fd1498Szrj   code = (enum tree_code) bp_unpack_value (&bp, 16);
48438fd1498Szrj   lto_tag_check (lto_tree_code_to_tag (code),
48538fd1498Szrj 		 lto_tree_code_to_tag (TREE_CODE (expr)));
48638fd1498Szrj 
48738fd1498Szrj   /* Note that all these functions are highly sensitive to changes in
48838fd1498Szrj      the types and sizes of each of the fields being packed.  */
48938fd1498Szrj   unpack_ts_base_value_fields (&bp, expr);
49038fd1498Szrj 
49138fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
49238fd1498Szrj     unpack_ts_int_cst_value_fields (&bp, expr);
49338fd1498Szrj 
49438fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
49538fd1498Szrj     unpack_ts_real_cst_value_fields (&bp, expr);
49638fd1498Szrj 
49738fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
49838fd1498Szrj     unpack_ts_fixed_cst_value_fields (&bp, expr);
49938fd1498Szrj 
50038fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
50138fd1498Szrj     stream_input_location (&DECL_SOURCE_LOCATION (expr), &bp, data_in);
50238fd1498Szrj 
50338fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
50438fd1498Szrj     unpack_ts_decl_common_value_fields (&bp, expr);
50538fd1498Szrj 
50638fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
50738fd1498Szrj     unpack_ts_decl_wrtl_value_fields (&bp, expr);
50838fd1498Szrj 
50938fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
51038fd1498Szrj     unpack_ts_decl_with_vis_value_fields (&bp, expr);
51138fd1498Szrj 
51238fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
51338fd1498Szrj     unpack_ts_function_decl_value_fields (&bp, expr);
51438fd1498Szrj 
51538fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
51638fd1498Szrj     unpack_ts_type_common_value_fields (&bp, expr);
51738fd1498Szrj 
51838fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
51938fd1498Szrj     {
52038fd1498Szrj       stream_input_location (&EXPR_CHECK (expr)->exp.locus, &bp, data_in);
52138fd1498Szrj       if (code == MEM_REF
52238fd1498Szrj 	  || code == TARGET_MEM_REF)
52338fd1498Szrj 	{
52438fd1498Szrj 	  MR_DEPENDENCE_CLIQUE (expr)
52538fd1498Szrj 	    = (unsigned)bp_unpack_value (&bp, sizeof (short) * 8);
52638fd1498Szrj 	  if (MR_DEPENDENCE_CLIQUE (expr) != 0)
52738fd1498Szrj 	    MR_DEPENDENCE_BASE (expr)
52838fd1498Szrj 	      = (unsigned)bp_unpack_value (&bp, sizeof (short) * 8);
52938fd1498Szrj 	}
530*58e805e6Szrj       else if (code == CALL_EXPR)
531*58e805e6Szrj 	CALL_EXPR_IFN (expr) = bp_unpack_enum (&bp, internal_fn, IFN_LAST);
53238fd1498Szrj     }
53338fd1498Szrj 
53438fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
53538fd1498Szrj     unpack_ts_block_value_fields (data_in, &bp, expr);
53638fd1498Szrj 
53738fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
53838fd1498Szrj     unpack_ts_translation_unit_decl_value_fields (data_in, &bp, expr);
53938fd1498Szrj 
54038fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
54138fd1498Szrj     cl_optimization_stream_in (&bp, TREE_OPTIMIZATION (expr));
54238fd1498Szrj 
54338fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
54438fd1498Szrj     {
54538fd1498Szrj       unsigned HOST_WIDE_INT length = bp_unpack_var_len_unsigned (&bp);
54638fd1498Szrj       if (length > 0)
54738fd1498Szrj 	vec_safe_grow (BINFO_BASE_ACCESSES (expr), length);
54838fd1498Szrj     }
54938fd1498Szrj 
55038fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
55138fd1498Szrj     {
55238fd1498Szrj       unsigned HOST_WIDE_INT length = bp_unpack_var_len_unsigned (&bp);
55338fd1498Szrj       if (length > 0)
55438fd1498Szrj 	vec_safe_grow (CONSTRUCTOR_ELTS (expr), length);
55538fd1498Szrj     }
55638fd1498Szrj 
55738fd1498Szrj #ifndef ACCEL_COMPILER
55838fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
55938fd1498Szrj     {
56038fd1498Szrj       cl_target_option_stream_in (data_in, &bp, TREE_TARGET_OPTION (expr));
56138fd1498Szrj       if (targetm.target_option.post_stream_in)
56238fd1498Szrj 	targetm.target_option.post_stream_in (TREE_TARGET_OPTION (expr));
56338fd1498Szrj     }
56438fd1498Szrj #endif
56538fd1498Szrj 
56638fd1498Szrj   if (code == OMP_CLAUSE)
56738fd1498Szrj     unpack_ts_omp_clause_value_fields (data_in, &bp, expr);
56838fd1498Szrj }
56938fd1498Szrj 
57038fd1498Szrj 
57138fd1498Szrj /* Materialize a new tree from input block IB using descriptors in
57238fd1498Szrj    DATA_IN.  The code for the new tree should match TAG.  Store in
57338fd1498Szrj    *IX_P the index into the reader cache where the new tree is stored.  */
57438fd1498Szrj 
57538fd1498Szrj tree
streamer_alloc_tree(struct lto_input_block * ib,struct data_in * data_in,enum LTO_tags tag)57638fd1498Szrj streamer_alloc_tree (struct lto_input_block *ib, struct data_in *data_in,
57738fd1498Szrj 		     enum LTO_tags tag)
57838fd1498Szrj {
57938fd1498Szrj   enum tree_code code;
58038fd1498Szrj   tree result;
58138fd1498Szrj 
58238fd1498Szrj   result = NULL_TREE;
58338fd1498Szrj 
58438fd1498Szrj   code = lto_tag_to_tree_code (tag);
58538fd1498Szrj 
58638fd1498Szrj   /* We should never see an SSA_NAME tree.  Only the version numbers of
58738fd1498Szrj      SSA names are ever written out.  See input_ssa_names.  */
58838fd1498Szrj   gcc_assert (code != SSA_NAME);
58938fd1498Szrj 
59038fd1498Szrj   /* Instantiate a new tree using the header data.  */
59138fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_STRING))
59238fd1498Szrj     result = streamer_read_string_cst (data_in, ib);
59338fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
59438fd1498Szrj     result = input_identifier (data_in, ib);
59538fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
59638fd1498Szrj     {
59738fd1498Szrj       HOST_WIDE_INT len = streamer_read_hwi (ib);
59838fd1498Szrj       result = make_tree_vec (len);
59938fd1498Szrj     }
60038fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
60138fd1498Szrj     {
60238fd1498Szrj       bitpack_d bp = streamer_read_bitpack (ib);
60338fd1498Szrj       unsigned int log2_npatterns = bp_unpack_value (&bp, 8);
60438fd1498Szrj       unsigned int nelts_per_pattern = bp_unpack_value (&bp, 8);
60538fd1498Szrj       result = make_vector (log2_npatterns, nelts_per_pattern);
60638fd1498Szrj     }
60738fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
60838fd1498Szrj     {
60938fd1498Szrj       unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib);
61038fd1498Szrj       result = make_tree_binfo (len);
61138fd1498Szrj     }
61238fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
61338fd1498Szrj     {
61438fd1498Szrj       unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib);
61538fd1498Szrj       unsigned HOST_WIDE_INT ext_len = streamer_read_uhwi (ib);
61638fd1498Szrj       result = make_int_cst (len, ext_len);
61738fd1498Szrj     }
61838fd1498Szrj   else if (code == CALL_EXPR)
61938fd1498Szrj     {
62038fd1498Szrj       unsigned HOST_WIDE_INT nargs = streamer_read_uhwi (ib);
62138fd1498Szrj       return build_vl_exp (CALL_EXPR, nargs + 3);
62238fd1498Szrj     }
62338fd1498Szrj   else if (code == OMP_CLAUSE)
62438fd1498Szrj     {
62538fd1498Szrj       enum omp_clause_code subcode
62638fd1498Szrj 	= (enum omp_clause_code) streamer_read_uhwi (ib);
62738fd1498Szrj       return build_omp_clause (UNKNOWN_LOCATION, subcode);
62838fd1498Szrj     }
62938fd1498Szrj   else
63038fd1498Szrj     {
63138fd1498Szrj       /* For all other nodes, materialize the tree with a raw
63238fd1498Szrj 	 make_node call.  */
63338fd1498Szrj       result = make_node (code);
63438fd1498Szrj     }
63538fd1498Szrj 
63638fd1498Szrj   return result;
63738fd1498Szrj }
63838fd1498Szrj 
63938fd1498Szrj 
64038fd1498Szrj /* Read all pointer fields in the TS_COMMON structure of EXPR from input
64138fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
64238fd1498Szrj    file being read.  */
64338fd1498Szrj 
64438fd1498Szrj 
64538fd1498Szrj static void
lto_input_ts_common_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)64638fd1498Szrj lto_input_ts_common_tree_pointers (struct lto_input_block *ib,
64738fd1498Szrj 				   struct data_in *data_in, tree expr)
64838fd1498Szrj {
64938fd1498Szrj   if (TREE_CODE (expr) != IDENTIFIER_NODE)
65038fd1498Szrj     TREE_TYPE (expr) = stream_read_tree (ib, data_in);
65138fd1498Szrj }
65238fd1498Szrj 
65338fd1498Szrj 
65438fd1498Szrj /* Read all pointer fields in the TS_VECTOR structure of EXPR from input
65538fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
65638fd1498Szrj    file being read.  */
65738fd1498Szrj 
65838fd1498Szrj static void
lto_input_ts_vector_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)65938fd1498Szrj lto_input_ts_vector_tree_pointers (struct lto_input_block *ib,
66038fd1498Szrj 				   struct data_in *data_in, tree expr)
66138fd1498Szrj {
66238fd1498Szrj   unsigned int count = vector_cst_encoded_nelts (expr);
66338fd1498Szrj   for (unsigned int i = 0; i < count; ++i)
66438fd1498Szrj     VECTOR_CST_ENCODED_ELT (expr, i) = stream_read_tree (ib, data_in);
66538fd1498Szrj }
66638fd1498Szrj 
66738fd1498Szrj 
66838fd1498Szrj /* Read all pointer fields in the TS_POLY_INT_CST structure of EXPR from
66938fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the
67038fd1498Szrj    file being read.  */
67138fd1498Szrj 
67238fd1498Szrj static void
lto_input_ts_poly_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)67338fd1498Szrj lto_input_ts_poly_tree_pointers (struct lto_input_block *ib,
67438fd1498Szrj 				 struct data_in *data_in, tree expr)
67538fd1498Szrj {
67638fd1498Szrj   for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
67738fd1498Szrj     POLY_INT_CST_COEFF (expr, i) = stream_read_tree (ib, data_in);
67838fd1498Szrj }
67938fd1498Szrj 
68038fd1498Szrj 
68138fd1498Szrj /* Read all pointer fields in the TS_COMPLEX structure of EXPR from input
68238fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
68338fd1498Szrj    file being read.  */
68438fd1498Szrj 
68538fd1498Szrj static void
lto_input_ts_complex_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)68638fd1498Szrj lto_input_ts_complex_tree_pointers (struct lto_input_block *ib,
68738fd1498Szrj 				    struct data_in *data_in, tree expr)
68838fd1498Szrj {
68938fd1498Szrj   TREE_REALPART (expr) = stream_read_tree (ib, data_in);
69038fd1498Szrj   TREE_IMAGPART (expr) = stream_read_tree (ib, data_in);
69138fd1498Szrj }
69238fd1498Szrj 
69338fd1498Szrj 
69438fd1498Szrj /* Read all pointer fields in the TS_DECL_MINIMAL structure of EXPR
69538fd1498Szrj    from input block IB.  DATA_IN contains tables and descriptors for the
69638fd1498Szrj    file being read.  */
69738fd1498Szrj 
69838fd1498Szrj static void
lto_input_ts_decl_minimal_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)69938fd1498Szrj lto_input_ts_decl_minimal_tree_pointers (struct lto_input_block *ib,
70038fd1498Szrj 					 struct data_in *data_in, tree expr)
70138fd1498Szrj {
70238fd1498Szrj   DECL_NAME (expr) = stream_read_tree (ib, data_in);
70338fd1498Szrj   DECL_CONTEXT (expr) = stream_read_tree (ib, data_in);
70438fd1498Szrj }
70538fd1498Szrj 
70638fd1498Szrj 
70738fd1498Szrj /* Read all pointer fields in the TS_DECL_COMMON structure of EXPR from
70838fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the
70938fd1498Szrj    file being read.  */
71038fd1498Szrj 
71138fd1498Szrj static void
lto_input_ts_decl_common_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)71238fd1498Szrj lto_input_ts_decl_common_tree_pointers (struct lto_input_block *ib,
71338fd1498Szrj 					struct data_in *data_in, tree expr)
71438fd1498Szrj {
71538fd1498Szrj   DECL_SIZE (expr) = stream_read_tree (ib, data_in);
71638fd1498Szrj   DECL_SIZE_UNIT (expr) = stream_read_tree (ib, data_in);
71738fd1498Szrj   DECL_ATTRIBUTES (expr) = stream_read_tree (ib, data_in);
71838fd1498Szrj   DECL_ABSTRACT_ORIGIN (expr) = stream_read_tree (ib, data_in);
71938fd1498Szrj 
72038fd1498Szrj   if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
72138fd1498Szrj       && DECL_HAS_VALUE_EXPR_P (expr))
72238fd1498Szrj     SET_DECL_VALUE_EXPR (expr, stream_read_tree (ib, data_in));
72338fd1498Szrj 
72438fd1498Szrj   if (VAR_P (expr)
72538fd1498Szrj       && DECL_HAS_DEBUG_EXPR_P (expr))
72638fd1498Szrj     {
72738fd1498Szrj       tree dexpr = stream_read_tree (ib, data_in);
72838fd1498Szrj       if (dexpr)
72938fd1498Szrj 	SET_DECL_DEBUG_EXPR (expr, dexpr);
73038fd1498Szrj     }
73138fd1498Szrj }
73238fd1498Szrj 
73338fd1498Szrj 
73438fd1498Szrj /* Read all pointer fields in the TS_DECL_NON_COMMON structure of
73538fd1498Szrj    EXPR from input block IB.  DATA_IN contains tables and descriptors for the
73638fd1498Szrj    file being read.  */
73738fd1498Szrj 
73838fd1498Szrj static void
lto_input_ts_decl_non_common_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)73938fd1498Szrj lto_input_ts_decl_non_common_tree_pointers (struct lto_input_block *ib,
74038fd1498Szrj 					    struct data_in *data_in, tree expr)
74138fd1498Szrj {
74238fd1498Szrj   if (TREE_CODE (expr) == TYPE_DECL)
74338fd1498Szrj     DECL_ORIGINAL_TYPE (expr) = stream_read_tree (ib, data_in);
74438fd1498Szrj }
74538fd1498Szrj 
74638fd1498Szrj 
74738fd1498Szrj /* Read all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
74838fd1498Szrj    from input block IB.  DATA_IN contains tables and descriptors for the
74938fd1498Szrj    file being read.  */
75038fd1498Szrj 
75138fd1498Szrj static void
lto_input_ts_decl_with_vis_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)75238fd1498Szrj lto_input_ts_decl_with_vis_tree_pointers (struct lto_input_block *ib,
75338fd1498Szrj 				          struct data_in *data_in, tree expr)
75438fd1498Szrj {
75538fd1498Szrj   tree id;
75638fd1498Szrj 
75738fd1498Szrj   id = stream_read_tree (ib, data_in);
75838fd1498Szrj   if (id)
75938fd1498Szrj     {
76038fd1498Szrj       gcc_assert (TREE_CODE (id) == IDENTIFIER_NODE);
76138fd1498Szrj       SET_DECL_ASSEMBLER_NAME (expr, id);
76238fd1498Szrj     }
76338fd1498Szrj }
76438fd1498Szrj 
76538fd1498Szrj 
76638fd1498Szrj /* Read all pointer fields in the TS_FIELD_DECL structure of EXPR from
76738fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the
76838fd1498Szrj    file being read.  */
76938fd1498Szrj 
77038fd1498Szrj static void
lto_input_ts_field_decl_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)77138fd1498Szrj lto_input_ts_field_decl_tree_pointers (struct lto_input_block *ib,
77238fd1498Szrj 				       struct data_in *data_in, tree expr)
77338fd1498Szrj {
77438fd1498Szrj   DECL_FIELD_OFFSET (expr) = stream_read_tree (ib, data_in);
77538fd1498Szrj   DECL_BIT_FIELD_TYPE (expr) = stream_read_tree (ib, data_in);
77638fd1498Szrj   DECL_BIT_FIELD_REPRESENTATIVE (expr) = stream_read_tree (ib, data_in);
77738fd1498Szrj   DECL_FIELD_BIT_OFFSET (expr) = stream_read_tree (ib, data_in);
77838fd1498Szrj   DECL_FCONTEXT (expr) = stream_read_tree (ib, data_in);
77938fd1498Szrj }
78038fd1498Szrj 
78138fd1498Szrj 
78238fd1498Szrj /* Read all pointer fields in the TS_FUNCTION_DECL structure of EXPR
78338fd1498Szrj    from input block IB.  DATA_IN contains tables and descriptors for the
78438fd1498Szrj    file being read.  */
78538fd1498Szrj 
78638fd1498Szrj static void
lto_input_ts_function_decl_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)78738fd1498Szrj lto_input_ts_function_decl_tree_pointers (struct lto_input_block *ib,
78838fd1498Szrj 					  struct data_in *data_in, tree expr)
78938fd1498Szrj {
79038fd1498Szrj   DECL_VINDEX (expr) = stream_read_tree (ib, data_in);
79138fd1498Szrj   /* DECL_STRUCT_FUNCTION is loaded on demand by cgraph_get_body.  */
79238fd1498Szrj   DECL_FUNCTION_PERSONALITY (expr) = stream_read_tree (ib, data_in);
79338fd1498Szrj #ifndef ACCEL_COMPILER
79438fd1498Szrj   DECL_FUNCTION_SPECIFIC_TARGET (expr) = stream_read_tree (ib, data_in);
79538fd1498Szrj #endif
79638fd1498Szrj   DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = stream_read_tree (ib, data_in);
79738fd1498Szrj #ifdef ACCEL_COMPILER
79838fd1498Szrj   {
79938fd1498Szrj     tree opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr);
80038fd1498Szrj     if (opts)
80138fd1498Szrj       {
80238fd1498Szrj 	struct gcc_options tmp;
80338fd1498Szrj 	init_options_struct (&tmp, NULL);
80438fd1498Szrj 	cl_optimization_restore (&tmp, TREE_OPTIMIZATION (opts));
80538fd1498Szrj 	finish_options (&tmp, &global_options_set, UNKNOWN_LOCATION);
80638fd1498Szrj 	opts = build_optimization_node (&tmp);
80738fd1498Szrj 	finalize_options_struct (&tmp);
80838fd1498Szrj 	DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = opts;
80938fd1498Szrj       }
81038fd1498Szrj   }
81138fd1498Szrj #endif
81238fd1498Szrj 
81338fd1498Szrj   /* If the file contains a function with an EH personality set,
81438fd1498Szrj      then it was compiled with -fexceptions.  In that case, initialize
81538fd1498Szrj      the backend EH machinery.  */
81638fd1498Szrj   if (DECL_FUNCTION_PERSONALITY (expr))
81738fd1498Szrj     lto_init_eh ();
81838fd1498Szrj }
81938fd1498Szrj 
82038fd1498Szrj 
82138fd1498Szrj /* Read all pointer fields in the TS_TYPE_COMMON structure of EXPR from
82238fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the file
82338fd1498Szrj    being read.  */
82438fd1498Szrj 
82538fd1498Szrj static void
lto_input_ts_type_common_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)82638fd1498Szrj lto_input_ts_type_common_tree_pointers (struct lto_input_block *ib,
82738fd1498Szrj 					struct data_in *data_in, tree expr)
82838fd1498Szrj {
82938fd1498Szrj   TYPE_SIZE (expr) = stream_read_tree (ib, data_in);
83038fd1498Szrj   TYPE_SIZE_UNIT (expr) = stream_read_tree (ib, data_in);
83138fd1498Szrj   TYPE_ATTRIBUTES (expr) = stream_read_tree (ib, data_in);
83238fd1498Szrj   TYPE_NAME (expr) = stream_read_tree (ib, data_in);
83338fd1498Szrj   /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO.  They will be
83438fd1498Szrj      reconstructed during fixup.  */
83538fd1498Szrj   /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
83638fd1498Szrj      during fixup.  */
83738fd1498Szrj   TYPE_MAIN_VARIANT (expr) = stream_read_tree (ib, data_in);
83838fd1498Szrj   TYPE_CONTEXT (expr) = stream_read_tree (ib, data_in);
83938fd1498Szrj   /* TYPE_CANONICAL gets re-computed during type merging.  */
84038fd1498Szrj   TYPE_CANONICAL (expr) = NULL_TREE;
84138fd1498Szrj   TYPE_STUB_DECL (expr) = stream_read_tree (ib, data_in);
84238fd1498Szrj }
84338fd1498Szrj 
84438fd1498Szrj /* Read all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
84538fd1498Szrj    from input block IB.  DATA_IN contains tables and descriptors for the
84638fd1498Szrj    file being read.  */
84738fd1498Szrj 
84838fd1498Szrj static void
lto_input_ts_type_non_common_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)84938fd1498Szrj lto_input_ts_type_non_common_tree_pointers (struct lto_input_block *ib,
85038fd1498Szrj 					    struct data_in *data_in,
85138fd1498Szrj 					    tree expr)
85238fd1498Szrj {
85338fd1498Szrj   if (TREE_CODE (expr) == ENUMERAL_TYPE)
85438fd1498Szrj     TYPE_VALUES (expr) = stream_read_tree (ib, data_in);
85538fd1498Szrj   else if (TREE_CODE (expr) == ARRAY_TYPE)
85638fd1498Szrj     TYPE_DOMAIN (expr) = stream_read_tree (ib, data_in);
85738fd1498Szrj   else if (RECORD_OR_UNION_TYPE_P (expr))
85838fd1498Szrj     TYPE_FIELDS (expr) = streamer_read_chain (ib, data_in);
85938fd1498Szrj   else if (TREE_CODE (expr) == FUNCTION_TYPE
86038fd1498Szrj 	   || TREE_CODE (expr) == METHOD_TYPE)
86138fd1498Szrj     TYPE_ARG_TYPES (expr) = stream_read_tree (ib, data_in);
86238fd1498Szrj 
86338fd1498Szrj   if (!POINTER_TYPE_P (expr))
86438fd1498Szrj     TYPE_MIN_VALUE_RAW (expr) = stream_read_tree (ib, data_in);
86538fd1498Szrj   TYPE_MAX_VALUE_RAW (expr) = stream_read_tree (ib, data_in);
86638fd1498Szrj }
86738fd1498Szrj 
86838fd1498Szrj 
86938fd1498Szrj /* Read all pointer fields in the TS_LIST structure of EXPR from input
87038fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
87138fd1498Szrj    file being read.  */
87238fd1498Szrj 
87338fd1498Szrj static void
lto_input_ts_list_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)87438fd1498Szrj lto_input_ts_list_tree_pointers (struct lto_input_block *ib,
87538fd1498Szrj 				 struct data_in *data_in, tree expr)
87638fd1498Szrj {
87738fd1498Szrj   TREE_PURPOSE (expr) = stream_read_tree (ib, data_in);
87838fd1498Szrj   TREE_VALUE (expr) = stream_read_tree (ib, data_in);
87938fd1498Szrj   TREE_CHAIN (expr) = stream_read_tree (ib, data_in);
88038fd1498Szrj }
88138fd1498Szrj 
88238fd1498Szrj 
88338fd1498Szrj /* Read all pointer fields in the TS_VEC structure of EXPR from input
88438fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
88538fd1498Szrj    file being read.  */
88638fd1498Szrj 
88738fd1498Szrj static void
lto_input_ts_vec_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)88838fd1498Szrj lto_input_ts_vec_tree_pointers (struct lto_input_block *ib,
88938fd1498Szrj 				struct data_in *data_in, tree expr)
89038fd1498Szrj {
89138fd1498Szrj   int i;
89238fd1498Szrj 
89338fd1498Szrj   /* Note that TREE_VEC_LENGTH was read by streamer_alloc_tree to
89438fd1498Szrj      instantiate EXPR.  */
89538fd1498Szrj   for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
89638fd1498Szrj     TREE_VEC_ELT (expr, i) = stream_read_tree (ib, data_in);
89738fd1498Szrj }
89838fd1498Szrj 
89938fd1498Szrj 
90038fd1498Szrj /* Read all pointer fields in the TS_EXP structure of EXPR from input
90138fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
90238fd1498Szrj    file being read.  */
90338fd1498Szrj 
90438fd1498Szrj 
90538fd1498Szrj static void
lto_input_ts_exp_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)90638fd1498Szrj lto_input_ts_exp_tree_pointers (struct lto_input_block *ib,
90738fd1498Szrj 			        struct data_in *data_in, tree expr)
90838fd1498Szrj {
90938fd1498Szrj   int i;
91038fd1498Szrj   tree block;
91138fd1498Szrj 
91238fd1498Szrj   for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
91338fd1498Szrj     TREE_OPERAND (expr, i) = stream_read_tree (ib, data_in);
91438fd1498Szrj 
91538fd1498Szrj   block = stream_read_tree (ib, data_in);
91638fd1498Szrj 
91738fd1498Szrj   /* TODO: Block is stored in the locus information.  It may make more sense to
91838fd1498Szrj      to make it go via the location cache.  */
91938fd1498Szrj   if (block)
92038fd1498Szrj     {
92138fd1498Szrj       data_in->location_cache.apply_location_cache ();
92238fd1498Szrj       TREE_SET_BLOCK (expr, block);
92338fd1498Szrj     }
92438fd1498Szrj }
92538fd1498Szrj 
92638fd1498Szrj 
92738fd1498Szrj /* Read all pointer fields in the TS_BLOCK structure of EXPR from input
92838fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
92938fd1498Szrj    file being read.  */
93038fd1498Szrj 
93138fd1498Szrj static void
lto_input_ts_block_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)93238fd1498Szrj lto_input_ts_block_tree_pointers (struct lto_input_block *ib,
93338fd1498Szrj 				  struct data_in *data_in, tree expr)
93438fd1498Szrj {
93538fd1498Szrj   BLOCK_VARS (expr) = streamer_read_chain (ib, data_in);
93638fd1498Szrj 
93738fd1498Szrj   BLOCK_SUPERCONTEXT (expr) = stream_read_tree (ib, data_in);
93838fd1498Szrj 
93938fd1498Szrj   /* Stream BLOCK_ABSTRACT_ORIGIN and BLOCK_SOURCE_LOCATION for
94038fd1498Szrj      the limited cases we can handle - those that represent inlined
94138fd1498Szrj      function scopes.  For the rest them on the floor instead of ICEing in
94238fd1498Szrj      dwarf2out.c.  */
94338fd1498Szrj   BLOCK_ABSTRACT_ORIGIN (expr) = stream_read_tree (ib, data_in);
94438fd1498Szrj   /* Do not stream BLOCK_NONLOCALIZED_VARS.  We cannot handle debug information
94538fd1498Szrj      for early inlined BLOCKs so drop it on the floor instead of ICEing in
94638fd1498Szrj      dwarf2out.c.  */
94738fd1498Szrj 
94838fd1498Szrj   /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
94938fd1498Szrj      streaming time.  */
95038fd1498Szrj 
95138fd1498Szrj   /* We re-compute BLOCK_SUBBLOCKS of our parent here instead
95238fd1498Szrj      of streaming it.  For non-BLOCK BLOCK_SUPERCONTEXTs we still
95338fd1498Szrj      stream the child relationship explicitly.  */
95438fd1498Szrj   if (BLOCK_SUPERCONTEXT (expr)
95538fd1498Szrj       && TREE_CODE (BLOCK_SUPERCONTEXT (expr)) == BLOCK)
95638fd1498Szrj     {
95738fd1498Szrj       BLOCK_CHAIN (expr) = BLOCK_SUBBLOCKS (BLOCK_SUPERCONTEXT (expr));
95838fd1498Szrj       BLOCK_SUBBLOCKS (BLOCK_SUPERCONTEXT (expr)) = expr;
95938fd1498Szrj     }
96038fd1498Szrj 
96138fd1498Szrj   /* The global block is rooted at the TU decl.  Hook it here to
96238fd1498Szrj      avoid the need to stream in this block during WPA time.  */
96338fd1498Szrj   else if (BLOCK_SUPERCONTEXT (expr)
96438fd1498Szrj 	   && TREE_CODE (BLOCK_SUPERCONTEXT (expr)) == TRANSLATION_UNIT_DECL)
96538fd1498Szrj     DECL_INITIAL (BLOCK_SUPERCONTEXT (expr)) = expr;
96638fd1498Szrj 
96738fd1498Szrj   /* The function-level block is connected at the time we read in
96838fd1498Szrj      function bodies for the same reason.  */
96938fd1498Szrj }
97038fd1498Szrj 
97138fd1498Szrj 
97238fd1498Szrj /* Read all pointer fields in the TS_BINFO structure of EXPR from input
97338fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
97438fd1498Szrj    file being read.  */
97538fd1498Szrj 
97638fd1498Szrj static void
lto_input_ts_binfo_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)97738fd1498Szrj lto_input_ts_binfo_tree_pointers (struct lto_input_block *ib,
97838fd1498Szrj 				  struct data_in *data_in, tree expr)
97938fd1498Szrj {
98038fd1498Szrj   unsigned i;
98138fd1498Szrj   tree t;
98238fd1498Szrj 
98338fd1498Szrj   /* Note that the number of slots in EXPR was read in
98438fd1498Szrj      streamer_alloc_tree when instantiating EXPR.  However, the
98538fd1498Szrj      vector is empty so we cannot rely on vec::length to know how many
98638fd1498Szrj      elements to read.  So, this list is emitted as a 0-terminated
98738fd1498Szrj      list on the writer side.  */
98838fd1498Szrj   do
98938fd1498Szrj     {
99038fd1498Szrj       t = stream_read_tree (ib, data_in);
99138fd1498Szrj       if (t)
99238fd1498Szrj 	BINFO_BASE_BINFOS (expr)->quick_push (t);
99338fd1498Szrj     }
99438fd1498Szrj   while (t);
99538fd1498Szrj 
99638fd1498Szrj   BINFO_OFFSET (expr) = stream_read_tree (ib, data_in);
99738fd1498Szrj   BINFO_VTABLE (expr) = stream_read_tree (ib, data_in);
99838fd1498Szrj   BINFO_VPTR_FIELD (expr) = stream_read_tree (ib, data_in);
99938fd1498Szrj 
100038fd1498Szrj   /* The vector of BINFO_BASE_ACCESSES is pre-allocated during
100138fd1498Szrj      unpacking the bitfield section.  */
100238fd1498Szrj   for (i = 0; i < vec_safe_length (BINFO_BASE_ACCESSES (expr)); i++)
100338fd1498Szrj     {
100438fd1498Szrj       tree a = stream_read_tree (ib, data_in);
100538fd1498Szrj       (*BINFO_BASE_ACCESSES (expr))[i] = a;
100638fd1498Szrj     }
100738fd1498Szrj   /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
100838fd1498Szrj      and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
100938fd1498Szrj }
101038fd1498Szrj 
101138fd1498Szrj 
101238fd1498Szrj /* Read all pointer fields in the TS_CONSTRUCTOR structure of EXPR from
101338fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the
101438fd1498Szrj    file being read.  */
101538fd1498Szrj 
101638fd1498Szrj static void
lto_input_ts_constructor_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)101738fd1498Szrj lto_input_ts_constructor_tree_pointers (struct lto_input_block *ib,
101838fd1498Szrj 				        struct data_in *data_in, tree expr)
101938fd1498Szrj {
102038fd1498Szrj   unsigned i;
102138fd1498Szrj 
102238fd1498Szrj   for (i = 0; i < CONSTRUCTOR_NELTS (expr); i++)
102338fd1498Szrj     {
102438fd1498Szrj       constructor_elt e;
102538fd1498Szrj       e.index = stream_read_tree (ib, data_in);
102638fd1498Szrj       e.value = stream_read_tree (ib, data_in);
102738fd1498Szrj       (*CONSTRUCTOR_ELTS (expr))[i] = e;
102838fd1498Szrj     }
102938fd1498Szrj }
103038fd1498Szrj 
103138fd1498Szrj 
103238fd1498Szrj /* Read all pointer fields in the TS_OMP_CLAUSE structure of EXPR from
103338fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the
103438fd1498Szrj    file being read.  */
103538fd1498Szrj 
103638fd1498Szrj static void
lto_input_ts_omp_clause_tree_pointers(struct lto_input_block * ib,struct data_in * data_in,tree expr)103738fd1498Szrj lto_input_ts_omp_clause_tree_pointers (struct lto_input_block *ib,
103838fd1498Szrj 				       struct data_in *data_in, tree expr)
103938fd1498Szrj {
104038fd1498Szrj   int i;
104138fd1498Szrj 
104238fd1498Szrj   for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
104338fd1498Szrj     OMP_CLAUSE_OPERAND (expr, i) = stream_read_tree (ib, data_in);
104438fd1498Szrj   OMP_CLAUSE_CHAIN (expr) = stream_read_tree (ib, data_in);
104538fd1498Szrj }
104638fd1498Szrj 
104738fd1498Szrj 
104838fd1498Szrj /* Read all pointer fields in EXPR from input block IB.  DATA_IN
104938fd1498Szrj    contains tables and descriptors for the file being read.  */
105038fd1498Szrj 
105138fd1498Szrj void
streamer_read_tree_body(struct lto_input_block * ib,struct data_in * data_in,tree expr)105238fd1498Szrj streamer_read_tree_body (struct lto_input_block *ib, struct data_in *data_in,
105338fd1498Szrj 			 tree expr)
105438fd1498Szrj {
105538fd1498Szrj   enum tree_code code;
105638fd1498Szrj 
105738fd1498Szrj   code = TREE_CODE (expr);
105838fd1498Szrj 
105938fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
106038fd1498Szrj     lto_input_ts_common_tree_pointers (ib, data_in, expr);
106138fd1498Szrj 
106238fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
106338fd1498Szrj     lto_input_ts_vector_tree_pointers (ib, data_in, expr);
106438fd1498Szrj 
106538fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
106638fd1498Szrj     lto_input_ts_poly_tree_pointers (ib, data_in, expr);
106738fd1498Szrj 
106838fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
106938fd1498Szrj     lto_input_ts_complex_tree_pointers (ib, data_in, expr);
107038fd1498Szrj 
107138fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
107238fd1498Szrj     lto_input_ts_decl_minimal_tree_pointers (ib, data_in, expr);
107338fd1498Szrj 
107438fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
107538fd1498Szrj     lto_input_ts_decl_common_tree_pointers (ib, data_in, expr);
107638fd1498Szrj 
107738fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
107838fd1498Szrj     lto_input_ts_decl_non_common_tree_pointers (ib, data_in, expr);
107938fd1498Szrj 
108038fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
108138fd1498Szrj     lto_input_ts_decl_with_vis_tree_pointers (ib, data_in, expr);
108238fd1498Szrj 
108338fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
108438fd1498Szrj     lto_input_ts_field_decl_tree_pointers (ib, data_in, expr);
108538fd1498Szrj 
108638fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
108738fd1498Szrj     lto_input_ts_function_decl_tree_pointers (ib, data_in, expr);
108838fd1498Szrj 
108938fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
109038fd1498Szrj     lto_input_ts_type_common_tree_pointers (ib, data_in, expr);
109138fd1498Szrj 
109238fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
109338fd1498Szrj     lto_input_ts_type_non_common_tree_pointers (ib, data_in, expr);
109438fd1498Szrj 
109538fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_LIST))
109638fd1498Szrj     lto_input_ts_list_tree_pointers (ib, data_in, expr);
109738fd1498Szrj 
109838fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_VEC))
109938fd1498Szrj     lto_input_ts_vec_tree_pointers (ib, data_in, expr);
110038fd1498Szrj 
110138fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
110238fd1498Szrj     lto_input_ts_exp_tree_pointers (ib, data_in, expr);
110338fd1498Szrj 
110438fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
110538fd1498Szrj     lto_input_ts_block_tree_pointers (ib, data_in, expr);
110638fd1498Szrj 
110738fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
110838fd1498Szrj     lto_input_ts_binfo_tree_pointers (ib, data_in, expr);
110938fd1498Szrj 
111038fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
111138fd1498Szrj     lto_input_ts_constructor_tree_pointers (ib, data_in, expr);
111238fd1498Szrj 
111338fd1498Szrj   if (code == OMP_CLAUSE)
111438fd1498Szrj     lto_input_ts_omp_clause_tree_pointers (ib, data_in, expr);
111538fd1498Szrj }
111638fd1498Szrj 
111738fd1498Szrj 
111838fd1498Szrj /* Read an index IX from input block IB and return the tree node at
111938fd1498Szrj    DATA_IN->FILE_DATA->GLOBALS_INDEX[IX].  */
112038fd1498Szrj 
112138fd1498Szrj tree
streamer_get_pickled_tree(struct lto_input_block * ib,struct data_in * data_in)112238fd1498Szrj streamer_get_pickled_tree (struct lto_input_block *ib, struct data_in *data_in)
112338fd1498Szrj {
112438fd1498Szrj   unsigned HOST_WIDE_INT ix;
112538fd1498Szrj   tree result;
112638fd1498Szrj   enum LTO_tags expected_tag;
112738fd1498Szrj 
112838fd1498Szrj   ix = streamer_read_uhwi (ib);
112938fd1498Szrj   expected_tag = streamer_read_enum (ib, LTO_tags, LTO_NUM_TAGS);
113038fd1498Szrj 
113138fd1498Szrj   result = streamer_tree_cache_get_tree (data_in->reader_cache, ix);
113238fd1498Szrj   gcc_assert (result
113338fd1498Szrj               && TREE_CODE (result) == lto_tag_to_tree_code (expected_tag));
113438fd1498Szrj 
113538fd1498Szrj   return result;
113638fd1498Szrj }
1137