xref: /dflybsd-src/contrib/gcc-8.0/gcc/tree-streamer-in.c (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj /* Routines for reading trees from a file stream.
2*38fd1498Szrj 
3*38fd1498Szrj    Copyright (C) 2011-2018 Free Software Foundation, Inc.
4*38fd1498Szrj    Contributed by Diego Novillo <dnovillo@google.com>
5*38fd1498Szrj 
6*38fd1498Szrj This file is part of GCC.
7*38fd1498Szrj 
8*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
9*38fd1498Szrj the terms of the GNU General Public License as published by the Free
10*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
11*38fd1498Szrj version.
12*38fd1498Szrj 
13*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
15*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16*38fd1498Szrj for more details.
17*38fd1498Szrj 
18*38fd1498Szrj You should have received a copy of the GNU General Public License
19*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
20*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
21*38fd1498Szrj 
22*38fd1498Szrj #include "config.h"
23*38fd1498Szrj #include "system.h"
24*38fd1498Szrj #include "coretypes.h"
25*38fd1498Szrj #include "backend.h"
26*38fd1498Szrj #include "target.h"
27*38fd1498Szrj #include "tree.h"
28*38fd1498Szrj #include "gimple.h"
29*38fd1498Szrj #include "stringpool.h"
30*38fd1498Szrj #include "tree-streamer.h"
31*38fd1498Szrj #include "cgraph.h"
32*38fd1498Szrj #include "builtins.h"
33*38fd1498Szrj #include "ipa-chkp.h"
34*38fd1498Szrj #include "gomp-constants.h"
35*38fd1498Szrj #include "stringpool.h"
36*38fd1498Szrj #include "attribs.h"
37*38fd1498Szrj #include "asan.h"
38*38fd1498Szrj #include "opts.h"
39*38fd1498Szrj 
40*38fd1498Szrj 
41*38fd1498Szrj /* Read a STRING_CST from the string table in DATA_IN using input
42*38fd1498Szrj    block IB.  */
43*38fd1498Szrj 
44*38fd1498Szrj tree
45*38fd1498Szrj streamer_read_string_cst (struct data_in *data_in, struct lto_input_block *ib)
46*38fd1498Szrj {
47*38fd1498Szrj   unsigned int len;
48*38fd1498Szrj   const char * ptr;
49*38fd1498Szrj 
50*38fd1498Szrj   ptr = streamer_read_indexed_string (data_in, ib, &len);
51*38fd1498Szrj   if (!ptr)
52*38fd1498Szrj     return NULL;
53*38fd1498Szrj   return build_string (len, ptr);
54*38fd1498Szrj }
55*38fd1498Szrj 
56*38fd1498Szrj 
57*38fd1498Szrj /* Read an IDENTIFIER from the string table in DATA_IN using input
58*38fd1498Szrj    block IB.  */
59*38fd1498Szrj 
60*38fd1498Szrj static tree
61*38fd1498Szrj input_identifier (struct data_in *data_in, struct lto_input_block *ib)
62*38fd1498Szrj {
63*38fd1498Szrj   unsigned int len;
64*38fd1498Szrj   const char *ptr;
65*38fd1498Szrj 
66*38fd1498Szrj   ptr = streamer_read_indexed_string (data_in, ib, &len);
67*38fd1498Szrj   if (!ptr)
68*38fd1498Szrj     return NULL;
69*38fd1498Szrj   return get_identifier_with_length (ptr, len);
70*38fd1498Szrj }
71*38fd1498Szrj 
72*38fd1498Szrj 
73*38fd1498Szrj /* Read a chain of tree nodes from input block IB. DATA_IN contains
74*38fd1498Szrj    tables and descriptors for the file being read.  */
75*38fd1498Szrj 
76*38fd1498Szrj tree
77*38fd1498Szrj streamer_read_chain (struct lto_input_block *ib, struct data_in *data_in)
78*38fd1498Szrj {
79*38fd1498Szrj   tree first, prev, curr;
80*38fd1498Szrj 
81*38fd1498Szrj   /* The chain is written as NULL terminated list of trees.  */
82*38fd1498Szrj   first = prev = NULL_TREE;
83*38fd1498Szrj   do
84*38fd1498Szrj     {
85*38fd1498Szrj       curr = stream_read_tree (ib, data_in);
86*38fd1498Szrj       if (prev)
87*38fd1498Szrj 	TREE_CHAIN (prev) = curr;
88*38fd1498Szrj       else
89*38fd1498Szrj 	first = curr;
90*38fd1498Szrj 
91*38fd1498Szrj       prev = curr;
92*38fd1498Szrj     }
93*38fd1498Szrj   while (curr);
94*38fd1498Szrj 
95*38fd1498Szrj   return first;
96*38fd1498Szrj }
97*38fd1498Szrj 
98*38fd1498Szrj 
99*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_BASE structure of
100*38fd1498Szrj    expression EXPR from bitpack BP.  */
101*38fd1498Szrj 
102*38fd1498Szrj static inline void
103*38fd1498Szrj unpack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
104*38fd1498Szrj {
105*38fd1498Szrj   /* Note that the code for EXPR has already been unpacked to create EXPR in
106*38fd1498Szrj      streamer_alloc_tree.  */
107*38fd1498Szrj   if (!TYPE_P (expr))
108*38fd1498Szrj     {
109*38fd1498Szrj       TREE_SIDE_EFFECTS (expr) = (unsigned) bp_unpack_value (bp, 1);
110*38fd1498Szrj       TREE_CONSTANT (expr) = (unsigned) bp_unpack_value (bp, 1);
111*38fd1498Szrj       TREE_READONLY (expr) = (unsigned) bp_unpack_value (bp, 1);
112*38fd1498Szrj 
113*38fd1498Szrj       /* TREE_PUBLIC is used on types to indicate that the type
114*38fd1498Szrj 	 has a TYPE_CACHED_VALUES vector.  This is not streamed out,
115*38fd1498Szrj 	 so we skip it here.  */
116*38fd1498Szrj       TREE_PUBLIC (expr) = (unsigned) bp_unpack_value (bp, 1);
117*38fd1498Szrj     }
118*38fd1498Szrj   else
119*38fd1498Szrj     bp_unpack_value (bp, 4);
120*38fd1498Szrj   TREE_ADDRESSABLE (expr) = (unsigned) bp_unpack_value (bp, 1);
121*38fd1498Szrj   TREE_THIS_VOLATILE (expr) = (unsigned) bp_unpack_value (bp, 1);
122*38fd1498Szrj   if (DECL_P (expr))
123*38fd1498Szrj     {
124*38fd1498Szrj       DECL_UNSIGNED (expr) = (unsigned) bp_unpack_value (bp, 1);
125*38fd1498Szrj       DECL_NAMELESS (expr) = (unsigned) bp_unpack_value (bp, 1);
126*38fd1498Szrj     }
127*38fd1498Szrj   else if (TYPE_P (expr))
128*38fd1498Szrj     TYPE_UNSIGNED (expr) = (unsigned) bp_unpack_value (bp, 1);
129*38fd1498Szrj   else
130*38fd1498Szrj     bp_unpack_value (bp, 1);
131*38fd1498Szrj   TREE_ASM_WRITTEN (expr) = (unsigned) bp_unpack_value (bp, 1);
132*38fd1498Szrj   if (TYPE_P (expr))
133*38fd1498Szrj     TYPE_ARTIFICIAL (expr) = (unsigned) bp_unpack_value (bp, 1);
134*38fd1498Szrj   else
135*38fd1498Szrj     TREE_NO_WARNING (expr) = (unsigned) bp_unpack_value (bp, 1);
136*38fd1498Szrj   TREE_NOTHROW (expr) = (unsigned) bp_unpack_value (bp, 1);
137*38fd1498Szrj   TREE_STATIC (expr) = (unsigned) bp_unpack_value (bp, 1);
138*38fd1498Szrj   if (TREE_CODE (expr) != TREE_BINFO)
139*38fd1498Szrj     TREE_PRIVATE (expr) = (unsigned) bp_unpack_value (bp, 1);
140*38fd1498Szrj   else
141*38fd1498Szrj     bp_unpack_value (bp, 1);
142*38fd1498Szrj   TREE_PROTECTED (expr) = (unsigned) bp_unpack_value (bp, 1);
143*38fd1498Szrj   TREE_DEPRECATED (expr) = (unsigned) bp_unpack_value (bp, 1);
144*38fd1498Szrj   if (TYPE_P (expr))
145*38fd1498Szrj     {
146*38fd1498Szrj       if (AGGREGATE_TYPE_P (expr))
147*38fd1498Szrj 	TYPE_REVERSE_STORAGE_ORDER (expr) = (unsigned) bp_unpack_value (bp, 1);
148*38fd1498Szrj       else
149*38fd1498Szrj 	TYPE_SATURATING (expr) = (unsigned) bp_unpack_value (bp, 1);
150*38fd1498Szrj       TYPE_ADDR_SPACE (expr) = (unsigned) bp_unpack_value (bp, 8);
151*38fd1498Szrj     }
152*38fd1498Szrj   else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
153*38fd1498Szrj     {
154*38fd1498Szrj       REF_REVERSE_STORAGE_ORDER (expr) = (unsigned) bp_unpack_value (bp, 1);
155*38fd1498Szrj       bp_unpack_value (bp, 8);
156*38fd1498Szrj     }
157*38fd1498Szrj   else if (TREE_CODE (expr) == SSA_NAME)
158*38fd1498Szrj     {
159*38fd1498Szrj       SSA_NAME_IS_DEFAULT_DEF (expr) = (unsigned) bp_unpack_value (bp, 1);
160*38fd1498Szrj       bp_unpack_value (bp, 8);
161*38fd1498Szrj     }
162*38fd1498Szrj   else
163*38fd1498Szrj     bp_unpack_value (bp, 9);
164*38fd1498Szrj }
165*38fd1498Szrj 
166*38fd1498Szrj 
167*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_INT_CST structure of
168*38fd1498Szrj    expression EXPR from bitpack BP.  */
169*38fd1498Szrj 
170*38fd1498Szrj static void
171*38fd1498Szrj unpack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
172*38fd1498Szrj {
173*38fd1498Szrj   int i;
174*38fd1498Szrj   for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
175*38fd1498Szrj     TREE_INT_CST_ELT (expr, i) = bp_unpack_var_len_int (bp);
176*38fd1498Szrj }
177*38fd1498Szrj 
178*38fd1498Szrj 
179*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_REAL_CST structure of
180*38fd1498Szrj    expression EXPR from bitpack BP.  */
181*38fd1498Szrj 
182*38fd1498Szrj static void
183*38fd1498Szrj unpack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
184*38fd1498Szrj {
185*38fd1498Szrj   unsigned i;
186*38fd1498Szrj   REAL_VALUE_TYPE r;
187*38fd1498Szrj   REAL_VALUE_TYPE *rp;
188*38fd1498Szrj 
189*38fd1498Szrj   /* Clear all bits of the real value type so that we can later do
190*38fd1498Szrj      bitwise comparisons to see if two values are the same.  */
191*38fd1498Szrj   memset (&r, 0, sizeof r);
192*38fd1498Szrj   r.cl = (unsigned) bp_unpack_value (bp, 2);
193*38fd1498Szrj   r.decimal = (unsigned) bp_unpack_value (bp, 1);
194*38fd1498Szrj   r.sign = (unsigned) bp_unpack_value (bp, 1);
195*38fd1498Szrj   r.signalling = (unsigned) bp_unpack_value (bp, 1);
196*38fd1498Szrj   r.canonical = (unsigned) bp_unpack_value (bp, 1);
197*38fd1498Szrj   r.uexp = (unsigned) bp_unpack_value (bp, EXP_BITS);
198*38fd1498Szrj   for (i = 0; i < SIGSZ; i++)
199*38fd1498Szrj     r.sig[i] = (unsigned long) bp_unpack_value (bp, HOST_BITS_PER_LONG);
200*38fd1498Szrj 
201*38fd1498Szrj   rp = ggc_alloc<real_value> ();
202*38fd1498Szrj   memcpy (rp, &r, sizeof (REAL_VALUE_TYPE));
203*38fd1498Szrj   TREE_REAL_CST_PTR (expr) = rp;
204*38fd1498Szrj }
205*38fd1498Szrj 
206*38fd1498Szrj 
207*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_FIXED_CST structure of
208*38fd1498Szrj    expression EXPR from bitpack BP.  */
209*38fd1498Szrj 
210*38fd1498Szrj static void
211*38fd1498Szrj unpack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
212*38fd1498Szrj {
213*38fd1498Szrj   FIXED_VALUE_TYPE *fp = ggc_alloc<fixed_value> ();
214*38fd1498Szrj   fp->mode = as_a <scalar_mode> (bp_unpack_machine_mode (bp));
215*38fd1498Szrj   fp->data.low = bp_unpack_var_len_int (bp);
216*38fd1498Szrj   fp->data.high = bp_unpack_var_len_int (bp);
217*38fd1498Szrj   TREE_FIXED_CST_PTR (expr) = fp;
218*38fd1498Szrj }
219*38fd1498Szrj 
220*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_DECL_COMMON structure
221*38fd1498Szrj    of expression EXPR from bitpack BP.  */
222*38fd1498Szrj 
223*38fd1498Szrj static void
224*38fd1498Szrj unpack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
225*38fd1498Szrj {
226*38fd1498Szrj   SET_DECL_MODE (expr, bp_unpack_machine_mode (bp));
227*38fd1498Szrj   DECL_NONLOCAL (expr) = (unsigned) bp_unpack_value (bp, 1);
228*38fd1498Szrj   DECL_VIRTUAL_P (expr) = (unsigned) bp_unpack_value (bp, 1);
229*38fd1498Szrj   DECL_IGNORED_P (expr) = (unsigned) bp_unpack_value (bp, 1);
230*38fd1498Szrj   DECL_ABSTRACT_P (expr) = (unsigned) bp_unpack_value (bp, 1);
231*38fd1498Szrj   DECL_ARTIFICIAL (expr) = (unsigned) bp_unpack_value (bp, 1);
232*38fd1498Szrj   DECL_USER_ALIGN (expr) = (unsigned) bp_unpack_value (bp, 1);
233*38fd1498Szrj   DECL_PRESERVE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
234*38fd1498Szrj   DECL_EXTERNAL (expr) = (unsigned) bp_unpack_value (bp, 1);
235*38fd1498Szrj   DECL_GIMPLE_REG_P (expr) = (unsigned) bp_unpack_value (bp, 1);
236*38fd1498Szrj   SET_DECL_ALIGN (expr, (unsigned) bp_unpack_var_len_unsigned (bp));
237*38fd1498Szrj #ifdef ACCEL_COMPILER
238*38fd1498Szrj   if (DECL_ALIGN (expr) > targetm.absolute_biggest_alignment)
239*38fd1498Szrj     SET_DECL_ALIGN (expr, targetm.absolute_biggest_alignment);
240*38fd1498Szrj #endif
241*38fd1498Szrj   if (TREE_CODE (expr) == LABEL_DECL)
242*38fd1498Szrj     {
243*38fd1498Szrj       EH_LANDING_PAD_NR (expr) = (int) bp_unpack_var_len_unsigned (bp);
244*38fd1498Szrj 
245*38fd1498Szrj       /* Always assume an initial value of -1 for LABEL_DECL_UID to
246*38fd1498Szrj 	 force gimple_set_bb to recreate label_to_block_map.  */
247*38fd1498Szrj       LABEL_DECL_UID (expr) = -1;
248*38fd1498Szrj     }
249*38fd1498Szrj 
250*38fd1498Szrj   if (TREE_CODE (expr) == FIELD_DECL)
251*38fd1498Szrj     {
252*38fd1498Szrj       DECL_PACKED (expr) = (unsigned) bp_unpack_value (bp, 1);
253*38fd1498Szrj       DECL_NONADDRESSABLE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
254*38fd1498Szrj       DECL_PADDING_P (expr) = (unsigned) bp_unpack_value (bp, 1);
255*38fd1498Szrj       expr->decl_common.off_align = bp_unpack_value (bp, 8);
256*38fd1498Szrj     }
257*38fd1498Szrj 
258*38fd1498Szrj   if (VAR_P (expr))
259*38fd1498Szrj     {
260*38fd1498Szrj       DECL_HAS_DEBUG_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
261*38fd1498Szrj       DECL_NONLOCAL_FRAME (expr) = (unsigned) bp_unpack_value (bp, 1);
262*38fd1498Szrj     }
263*38fd1498Szrj 
264*38fd1498Szrj   if (TREE_CODE (expr) == RESULT_DECL
265*38fd1498Szrj       || TREE_CODE (expr) == PARM_DECL
266*38fd1498Szrj       || VAR_P (expr))
267*38fd1498Szrj     {
268*38fd1498Szrj       DECL_BY_REFERENCE (expr) = (unsigned) bp_unpack_value (bp, 1);
269*38fd1498Szrj       if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
270*38fd1498Szrj 	DECL_HAS_VALUE_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
271*38fd1498Szrj     }
272*38fd1498Szrj }
273*38fd1498Szrj 
274*38fd1498Szrj 
275*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_DECL_WRTL structure
276*38fd1498Szrj    of expression EXPR from bitpack BP.  */
277*38fd1498Szrj 
278*38fd1498Szrj static void
279*38fd1498Szrj unpack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
280*38fd1498Szrj {
281*38fd1498Szrj   DECL_REGISTER (expr) = (unsigned) bp_unpack_value (bp, 1);
282*38fd1498Szrj }
283*38fd1498Szrj 
284*38fd1498Szrj 
285*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_DECL_WITH_VIS structure
286*38fd1498Szrj    of expression EXPR from bitpack BP.  */
287*38fd1498Szrj 
288*38fd1498Szrj static void
289*38fd1498Szrj unpack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
290*38fd1498Szrj {
291*38fd1498Szrj   DECL_COMMON (expr) = (unsigned) bp_unpack_value (bp, 1);
292*38fd1498Szrj   DECL_DLLIMPORT_P (expr) = (unsigned) bp_unpack_value (bp, 1);
293*38fd1498Szrj   DECL_WEAK (expr) = (unsigned) bp_unpack_value (bp, 1);
294*38fd1498Szrj   DECL_SEEN_IN_BIND_EXPR_P (expr) = (unsigned) bp_unpack_value (bp,  1);
295*38fd1498Szrj   DECL_COMDAT (expr) = (unsigned) bp_unpack_value (bp,  1);
296*38fd1498Szrj   DECL_VISIBILITY (expr) = (enum symbol_visibility) bp_unpack_value (bp,  2);
297*38fd1498Szrj   DECL_VISIBILITY_SPECIFIED (expr) = (unsigned) bp_unpack_value (bp,  1);
298*38fd1498Szrj 
299*38fd1498Szrj   if (VAR_P (expr))
300*38fd1498Szrj     {
301*38fd1498Szrj       DECL_HARD_REGISTER (expr) = (unsigned) bp_unpack_value (bp, 1);
302*38fd1498Szrj       DECL_IN_CONSTANT_POOL (expr) = (unsigned) bp_unpack_value (bp, 1);
303*38fd1498Szrj     }
304*38fd1498Szrj 
305*38fd1498Szrj   if (TREE_CODE (expr) == FUNCTION_DECL)
306*38fd1498Szrj     {
307*38fd1498Szrj       DECL_FINAL_P (expr) = (unsigned) bp_unpack_value (bp, 1);
308*38fd1498Szrj       DECL_CXX_CONSTRUCTOR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
309*38fd1498Szrj       DECL_CXX_DESTRUCTOR_P (expr) = (unsigned) bp_unpack_value (bp, 1);
310*38fd1498Szrj     }
311*38fd1498Szrj }
312*38fd1498Szrj 
313*38fd1498Szrj 
314*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_FUNCTION_DECL structure
315*38fd1498Szrj    of expression EXPR from bitpack BP.  */
316*38fd1498Szrj 
317*38fd1498Szrj static void
318*38fd1498Szrj unpack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
319*38fd1498Szrj {
320*38fd1498Szrj   DECL_BUILT_IN_CLASS (expr) = bp_unpack_enum (bp, built_in_class,
321*38fd1498Szrj 					       BUILT_IN_LAST);
322*38fd1498Szrj   DECL_STATIC_CONSTRUCTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
323*38fd1498Szrj   DECL_STATIC_DESTRUCTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
324*38fd1498Szrj   DECL_UNINLINABLE (expr) = (unsigned) bp_unpack_value (bp, 1);
325*38fd1498Szrj   DECL_POSSIBLY_INLINED (expr) = (unsigned) bp_unpack_value (bp, 1);
326*38fd1498Szrj   DECL_IS_NOVOPS (expr) = (unsigned) bp_unpack_value (bp, 1);
327*38fd1498Szrj   DECL_IS_RETURNS_TWICE (expr) = (unsigned) bp_unpack_value (bp, 1);
328*38fd1498Szrj   DECL_IS_MALLOC (expr) = (unsigned) bp_unpack_value (bp, 1);
329*38fd1498Szrj   DECL_IS_OPERATOR_NEW (expr) = (unsigned) bp_unpack_value (bp, 1);
330*38fd1498Szrj   DECL_DECLARED_INLINE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
331*38fd1498Szrj   DECL_STATIC_CHAIN (expr) = (unsigned) bp_unpack_value (bp, 1);
332*38fd1498Szrj   DECL_NO_INLINE_WARNING_P (expr) = (unsigned) bp_unpack_value (bp, 1);
333*38fd1498Szrj   DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr)
334*38fd1498Szrj     			= (unsigned) bp_unpack_value (bp, 1);
335*38fd1498Szrj   DECL_NO_LIMIT_STACK (expr) = (unsigned) bp_unpack_value (bp, 1);
336*38fd1498Szrj   DECL_DISREGARD_INLINE_LIMITS (expr) = (unsigned) bp_unpack_value (bp, 1);
337*38fd1498Szrj   DECL_PURE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
338*38fd1498Szrj   DECL_LOOPING_CONST_OR_PURE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
339*38fd1498Szrj   if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
340*38fd1498Szrj     {
341*38fd1498Szrj       DECL_FUNCTION_CODE (expr) = (enum built_in_function) bp_unpack_value (bp,
342*38fd1498Szrj 	                                                                    12);
343*38fd1498Szrj       if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_NORMAL
344*38fd1498Szrj 	  && DECL_FUNCTION_CODE (expr) >= END_BUILTINS)
345*38fd1498Szrj 	fatal_error (input_location,
346*38fd1498Szrj 		     "machine independent builtin code out of range");
347*38fd1498Szrj       else if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD)
348*38fd1498Szrj 	{
349*38fd1498Szrj           tree result = targetm.builtin_decl (DECL_FUNCTION_CODE (expr), true);
350*38fd1498Szrj 	  if (!result || result == error_mark_node)
351*38fd1498Szrj 	    fatal_error (input_location,
352*38fd1498Szrj 			 "target specific builtin not available");
353*38fd1498Szrj 	}
354*38fd1498Szrj     }
355*38fd1498Szrj }
356*38fd1498Szrj 
357*38fd1498Szrj 
358*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_TYPE_COMMON structure
359*38fd1498Szrj    of expression EXPR from bitpack BP.  */
360*38fd1498Szrj 
361*38fd1498Szrj static void
362*38fd1498Szrj unpack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
363*38fd1498Szrj {
364*38fd1498Szrj   machine_mode mode;
365*38fd1498Szrj 
366*38fd1498Szrj   mode = bp_unpack_machine_mode (bp);
367*38fd1498Szrj   SET_TYPE_MODE (expr, mode);
368*38fd1498Szrj   TYPE_STRING_FLAG (expr) = (unsigned) bp_unpack_value (bp, 1);
369*38fd1498Szrj   /* TYPE_NO_FORCE_BLK is private to stor-layout and need
370*38fd1498Szrj      no streaming.  */
371*38fd1498Szrj   TYPE_NEEDS_CONSTRUCTING (expr) = (unsigned) bp_unpack_value (bp, 1);
372*38fd1498Szrj   TYPE_PACKED (expr) = (unsigned) bp_unpack_value (bp, 1);
373*38fd1498Szrj   TYPE_RESTRICT (expr) = (unsigned) bp_unpack_value (bp, 1);
374*38fd1498Szrj   TYPE_USER_ALIGN (expr) = (unsigned) bp_unpack_value (bp, 1);
375*38fd1498Szrj   TYPE_READONLY (expr) = (unsigned) bp_unpack_value (bp, 1);
376*38fd1498Szrj   if (RECORD_OR_UNION_TYPE_P (expr))
377*38fd1498Szrj     {
378*38fd1498Szrj       TYPE_TRANSPARENT_AGGR (expr) = (unsigned) bp_unpack_value (bp, 1);
379*38fd1498Szrj       TYPE_FINAL_P (expr) = (unsigned) bp_unpack_value (bp, 1);
380*38fd1498Szrj     }
381*38fd1498Szrj   else if (TREE_CODE (expr) == ARRAY_TYPE)
382*38fd1498Szrj     TYPE_NONALIASED_COMPONENT (expr) = (unsigned) bp_unpack_value (bp, 1);
383*38fd1498Szrj   if (AGGREGATE_TYPE_P (expr))
384*38fd1498Szrj     TYPE_TYPELESS_STORAGE (expr) = (unsigned) bp_unpack_value (bp, 1);
385*38fd1498Szrj   TYPE_EMPTY_P (expr) = (unsigned) bp_unpack_value (bp, 1);
386*38fd1498Szrj   TYPE_PRECISION (expr) = bp_unpack_var_len_unsigned (bp);
387*38fd1498Szrj   SET_TYPE_ALIGN (expr, bp_unpack_var_len_unsigned (bp));
388*38fd1498Szrj #ifdef ACCEL_COMPILER
389*38fd1498Szrj   if (TYPE_ALIGN (expr) > targetm.absolute_biggest_alignment)
390*38fd1498Szrj     SET_TYPE_ALIGN (expr, targetm.absolute_biggest_alignment);
391*38fd1498Szrj #endif
392*38fd1498Szrj }
393*38fd1498Szrj 
394*38fd1498Szrj 
395*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_BLOCK structure
396*38fd1498Szrj    of expression EXPR from bitpack BP.  */
397*38fd1498Szrj 
398*38fd1498Szrj static void
399*38fd1498Szrj unpack_ts_block_value_fields (struct data_in *data_in,
400*38fd1498Szrj 			      struct bitpack_d *bp, tree expr)
401*38fd1498Szrj {
402*38fd1498Szrj   BLOCK_ABSTRACT (expr) = (unsigned) bp_unpack_value (bp, 1);
403*38fd1498Szrj   /* BLOCK_NUMBER is recomputed.  */
404*38fd1498Szrj   stream_input_location (&BLOCK_SOURCE_LOCATION (expr), bp, data_in);
405*38fd1498Szrj }
406*38fd1498Szrj 
407*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL
408*38fd1498Szrj    structure of expression EXPR from bitpack BP.  */
409*38fd1498Szrj 
410*38fd1498Szrj static void
411*38fd1498Szrj unpack_ts_translation_unit_decl_value_fields (struct data_in *data_in,
412*38fd1498Szrj 					      struct bitpack_d *bp, tree expr)
413*38fd1498Szrj {
414*38fd1498Szrj   TRANSLATION_UNIT_LANGUAGE (expr) = xstrdup (bp_unpack_string (data_in, bp));
415*38fd1498Szrj   vec_safe_push (all_translation_units, expr);
416*38fd1498Szrj }
417*38fd1498Szrj 
418*38fd1498Szrj 
419*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_OMP_CLAUSE
420*38fd1498Szrj    structure of expression EXPR from bitpack BP.  */
421*38fd1498Szrj 
422*38fd1498Szrj static void
423*38fd1498Szrj unpack_ts_omp_clause_value_fields (struct data_in *data_in,
424*38fd1498Szrj 				   struct bitpack_d *bp, tree expr)
425*38fd1498Szrj {
426*38fd1498Szrj   stream_input_location (&OMP_CLAUSE_LOCATION (expr), bp, data_in);
427*38fd1498Szrj   switch (OMP_CLAUSE_CODE (expr))
428*38fd1498Szrj     {
429*38fd1498Szrj     case OMP_CLAUSE_DEFAULT:
430*38fd1498Szrj       OMP_CLAUSE_DEFAULT_KIND (expr)
431*38fd1498Szrj 	= bp_unpack_enum (bp, omp_clause_default_kind,
432*38fd1498Szrj 			  OMP_CLAUSE_DEFAULT_LAST);
433*38fd1498Szrj       break;
434*38fd1498Szrj     case OMP_CLAUSE_SCHEDULE:
435*38fd1498Szrj       OMP_CLAUSE_SCHEDULE_KIND (expr)
436*38fd1498Szrj 	= bp_unpack_enum (bp, omp_clause_schedule_kind,
437*38fd1498Szrj 			  OMP_CLAUSE_SCHEDULE_LAST);
438*38fd1498Szrj       break;
439*38fd1498Szrj     case OMP_CLAUSE_DEPEND:
440*38fd1498Szrj       OMP_CLAUSE_DEPEND_KIND (expr)
441*38fd1498Szrj 	= bp_unpack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST);
442*38fd1498Szrj       break;
443*38fd1498Szrj     case OMP_CLAUSE_MAP:
444*38fd1498Szrj       OMP_CLAUSE_SET_MAP_KIND (expr, bp_unpack_enum (bp, gomp_map_kind,
445*38fd1498Szrj 						     GOMP_MAP_LAST));
446*38fd1498Szrj       break;
447*38fd1498Szrj     case OMP_CLAUSE_PROC_BIND:
448*38fd1498Szrj       OMP_CLAUSE_PROC_BIND_KIND (expr)
449*38fd1498Szrj 	= bp_unpack_enum (bp, omp_clause_proc_bind_kind,
450*38fd1498Szrj 			  OMP_CLAUSE_PROC_BIND_LAST);
451*38fd1498Szrj       break;
452*38fd1498Szrj     case OMP_CLAUSE_REDUCTION:
453*38fd1498Szrj       OMP_CLAUSE_REDUCTION_CODE (expr)
454*38fd1498Szrj 	= bp_unpack_enum (bp, tree_code, MAX_TREE_CODES);
455*38fd1498Szrj       break;
456*38fd1498Szrj     default:
457*38fd1498Szrj       break;
458*38fd1498Szrj     }
459*38fd1498Szrj }
460*38fd1498Szrj 
461*38fd1498Szrj 
462*38fd1498Szrj /* Read all the language-independent bitfield values for EXPR from IB.
463*38fd1498Szrj    Return the partially unpacked bitpack so the caller can unpack any other
464*38fd1498Szrj    bitfield values that the writer may have written.  */
465*38fd1498Szrj 
466*38fd1498Szrj void
467*38fd1498Szrj streamer_read_tree_bitfields (struct lto_input_block *ib,
468*38fd1498Szrj 			      struct data_in *data_in, tree expr)
469*38fd1498Szrj {
470*38fd1498Szrj   enum tree_code code;
471*38fd1498Szrj   struct bitpack_d bp;
472*38fd1498Szrj 
473*38fd1498Szrj   /* Read the bitpack of non-pointer values from IB.  */
474*38fd1498Szrj   bp = streamer_read_bitpack (ib);
475*38fd1498Szrj 
476*38fd1498Szrj   /* The first word in BP contains the code of the tree that we
477*38fd1498Szrj      are about to read.  */
478*38fd1498Szrj   code = (enum tree_code) bp_unpack_value (&bp, 16);
479*38fd1498Szrj   lto_tag_check (lto_tree_code_to_tag (code),
480*38fd1498Szrj 		 lto_tree_code_to_tag (TREE_CODE (expr)));
481*38fd1498Szrj 
482*38fd1498Szrj   /* Note that all these functions are highly sensitive to changes in
483*38fd1498Szrj      the types and sizes of each of the fields being packed.  */
484*38fd1498Szrj   unpack_ts_base_value_fields (&bp, expr);
485*38fd1498Szrj 
486*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
487*38fd1498Szrj     unpack_ts_int_cst_value_fields (&bp, expr);
488*38fd1498Szrj 
489*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
490*38fd1498Szrj     unpack_ts_real_cst_value_fields (&bp, expr);
491*38fd1498Szrj 
492*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
493*38fd1498Szrj     unpack_ts_fixed_cst_value_fields (&bp, expr);
494*38fd1498Szrj 
495*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
496*38fd1498Szrj     stream_input_location (&DECL_SOURCE_LOCATION (expr), &bp, data_in);
497*38fd1498Szrj 
498*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
499*38fd1498Szrj     unpack_ts_decl_common_value_fields (&bp, expr);
500*38fd1498Szrj 
501*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
502*38fd1498Szrj     unpack_ts_decl_wrtl_value_fields (&bp, expr);
503*38fd1498Szrj 
504*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
505*38fd1498Szrj     unpack_ts_decl_with_vis_value_fields (&bp, expr);
506*38fd1498Szrj 
507*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
508*38fd1498Szrj     unpack_ts_function_decl_value_fields (&bp, expr);
509*38fd1498Szrj 
510*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
511*38fd1498Szrj     unpack_ts_type_common_value_fields (&bp, expr);
512*38fd1498Szrj 
513*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
514*38fd1498Szrj     {
515*38fd1498Szrj       stream_input_location (&EXPR_CHECK (expr)->exp.locus, &bp, data_in);
516*38fd1498Szrj       if (code == MEM_REF
517*38fd1498Szrj 	  || code == TARGET_MEM_REF)
518*38fd1498Szrj 	{
519*38fd1498Szrj 	  MR_DEPENDENCE_CLIQUE (expr)
520*38fd1498Szrj 	    = (unsigned)bp_unpack_value (&bp, sizeof (short) * 8);
521*38fd1498Szrj 	  if (MR_DEPENDENCE_CLIQUE (expr) != 0)
522*38fd1498Szrj 	    MR_DEPENDENCE_BASE (expr)
523*38fd1498Szrj 	      = (unsigned)bp_unpack_value (&bp, sizeof (short) * 8);
524*38fd1498Szrj 	}
525*38fd1498Szrj     }
526*38fd1498Szrj 
527*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
528*38fd1498Szrj     unpack_ts_block_value_fields (data_in, &bp, expr);
529*38fd1498Szrj 
530*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
531*38fd1498Szrj     unpack_ts_translation_unit_decl_value_fields (data_in, &bp, expr);
532*38fd1498Szrj 
533*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
534*38fd1498Szrj     cl_optimization_stream_in (&bp, TREE_OPTIMIZATION (expr));
535*38fd1498Szrj 
536*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
537*38fd1498Szrj     {
538*38fd1498Szrj       unsigned HOST_WIDE_INT length = bp_unpack_var_len_unsigned (&bp);
539*38fd1498Szrj       if (length > 0)
540*38fd1498Szrj 	vec_safe_grow (BINFO_BASE_ACCESSES (expr), length);
541*38fd1498Szrj     }
542*38fd1498Szrj 
543*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
544*38fd1498Szrj     {
545*38fd1498Szrj       unsigned HOST_WIDE_INT length = bp_unpack_var_len_unsigned (&bp);
546*38fd1498Szrj       if (length > 0)
547*38fd1498Szrj 	vec_safe_grow (CONSTRUCTOR_ELTS (expr), length);
548*38fd1498Szrj     }
549*38fd1498Szrj 
550*38fd1498Szrj #ifndef ACCEL_COMPILER
551*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
552*38fd1498Szrj     {
553*38fd1498Szrj       cl_target_option_stream_in (data_in, &bp, TREE_TARGET_OPTION (expr));
554*38fd1498Szrj       if (targetm.target_option.post_stream_in)
555*38fd1498Szrj 	targetm.target_option.post_stream_in (TREE_TARGET_OPTION (expr));
556*38fd1498Szrj     }
557*38fd1498Szrj #endif
558*38fd1498Szrj 
559*38fd1498Szrj   if (code == OMP_CLAUSE)
560*38fd1498Szrj     unpack_ts_omp_clause_value_fields (data_in, &bp, expr);
561*38fd1498Szrj }
562*38fd1498Szrj 
563*38fd1498Szrj 
564*38fd1498Szrj /* Materialize a new tree from input block IB using descriptors in
565*38fd1498Szrj    DATA_IN.  The code for the new tree should match TAG.  Store in
566*38fd1498Szrj    *IX_P the index into the reader cache where the new tree is stored.  */
567*38fd1498Szrj 
568*38fd1498Szrj tree
569*38fd1498Szrj streamer_alloc_tree (struct lto_input_block *ib, struct data_in *data_in,
570*38fd1498Szrj 		     enum LTO_tags tag)
571*38fd1498Szrj {
572*38fd1498Szrj   enum tree_code code;
573*38fd1498Szrj   tree result;
574*38fd1498Szrj 
575*38fd1498Szrj   result = NULL_TREE;
576*38fd1498Szrj 
577*38fd1498Szrj   code = lto_tag_to_tree_code (tag);
578*38fd1498Szrj 
579*38fd1498Szrj   /* We should never see an SSA_NAME tree.  Only the version numbers of
580*38fd1498Szrj      SSA names are ever written out.  See input_ssa_names.  */
581*38fd1498Szrj   gcc_assert (code != SSA_NAME);
582*38fd1498Szrj 
583*38fd1498Szrj   /* Instantiate a new tree using the header data.  */
584*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_STRING))
585*38fd1498Szrj     result = streamer_read_string_cst (data_in, ib);
586*38fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
587*38fd1498Szrj     result = input_identifier (data_in, ib);
588*38fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
589*38fd1498Szrj     {
590*38fd1498Szrj       HOST_WIDE_INT len = streamer_read_hwi (ib);
591*38fd1498Szrj       result = make_tree_vec (len);
592*38fd1498Szrj     }
593*38fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
594*38fd1498Szrj     {
595*38fd1498Szrj       bitpack_d bp = streamer_read_bitpack (ib);
596*38fd1498Szrj       unsigned int log2_npatterns = bp_unpack_value (&bp, 8);
597*38fd1498Szrj       unsigned int nelts_per_pattern = bp_unpack_value (&bp, 8);
598*38fd1498Szrj       result = make_vector (log2_npatterns, nelts_per_pattern);
599*38fd1498Szrj     }
600*38fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
601*38fd1498Szrj     {
602*38fd1498Szrj       unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib);
603*38fd1498Szrj       result = make_tree_binfo (len);
604*38fd1498Szrj     }
605*38fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
606*38fd1498Szrj     {
607*38fd1498Szrj       unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib);
608*38fd1498Szrj       unsigned HOST_WIDE_INT ext_len = streamer_read_uhwi (ib);
609*38fd1498Szrj       result = make_int_cst (len, ext_len);
610*38fd1498Szrj     }
611*38fd1498Szrj   else if (code == CALL_EXPR)
612*38fd1498Szrj     {
613*38fd1498Szrj       unsigned HOST_WIDE_INT nargs = streamer_read_uhwi (ib);
614*38fd1498Szrj       return build_vl_exp (CALL_EXPR, nargs + 3);
615*38fd1498Szrj     }
616*38fd1498Szrj   else if (code == OMP_CLAUSE)
617*38fd1498Szrj     {
618*38fd1498Szrj       enum omp_clause_code subcode
619*38fd1498Szrj 	= (enum omp_clause_code) streamer_read_uhwi (ib);
620*38fd1498Szrj       return build_omp_clause (UNKNOWN_LOCATION, subcode);
621*38fd1498Szrj     }
622*38fd1498Szrj   else
623*38fd1498Szrj     {
624*38fd1498Szrj       /* For all other nodes, materialize the tree with a raw
625*38fd1498Szrj 	 make_node call.  */
626*38fd1498Szrj       result = make_node (code);
627*38fd1498Szrj     }
628*38fd1498Szrj 
629*38fd1498Szrj   return result;
630*38fd1498Szrj }
631*38fd1498Szrj 
632*38fd1498Szrj 
633*38fd1498Szrj /* Read all pointer fields in the TS_COMMON structure of EXPR from input
634*38fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
635*38fd1498Szrj    file being read.  */
636*38fd1498Szrj 
637*38fd1498Szrj 
638*38fd1498Szrj static void
639*38fd1498Szrj lto_input_ts_common_tree_pointers (struct lto_input_block *ib,
640*38fd1498Szrj 				   struct data_in *data_in, tree expr)
641*38fd1498Szrj {
642*38fd1498Szrj   if (TREE_CODE (expr) != IDENTIFIER_NODE)
643*38fd1498Szrj     TREE_TYPE (expr) = stream_read_tree (ib, data_in);
644*38fd1498Szrj }
645*38fd1498Szrj 
646*38fd1498Szrj 
647*38fd1498Szrj /* Read all pointer fields in the TS_VECTOR structure of EXPR from input
648*38fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
649*38fd1498Szrj    file being read.  */
650*38fd1498Szrj 
651*38fd1498Szrj static void
652*38fd1498Szrj lto_input_ts_vector_tree_pointers (struct lto_input_block *ib,
653*38fd1498Szrj 				   struct data_in *data_in, tree expr)
654*38fd1498Szrj {
655*38fd1498Szrj   unsigned int count = vector_cst_encoded_nelts (expr);
656*38fd1498Szrj   for (unsigned int i = 0; i < count; ++i)
657*38fd1498Szrj     VECTOR_CST_ENCODED_ELT (expr, i) = stream_read_tree (ib, data_in);
658*38fd1498Szrj }
659*38fd1498Szrj 
660*38fd1498Szrj 
661*38fd1498Szrj /* Read all pointer fields in the TS_POLY_INT_CST structure of EXPR from
662*38fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the
663*38fd1498Szrj    file being read.  */
664*38fd1498Szrj 
665*38fd1498Szrj static void
666*38fd1498Szrj lto_input_ts_poly_tree_pointers (struct lto_input_block *ib,
667*38fd1498Szrj 				 struct data_in *data_in, tree expr)
668*38fd1498Szrj {
669*38fd1498Szrj   for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
670*38fd1498Szrj     POLY_INT_CST_COEFF (expr, i) = stream_read_tree (ib, data_in);
671*38fd1498Szrj }
672*38fd1498Szrj 
673*38fd1498Szrj 
674*38fd1498Szrj /* Read all pointer fields in the TS_COMPLEX structure of EXPR from input
675*38fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
676*38fd1498Szrj    file being read.  */
677*38fd1498Szrj 
678*38fd1498Szrj static void
679*38fd1498Szrj lto_input_ts_complex_tree_pointers (struct lto_input_block *ib,
680*38fd1498Szrj 				    struct data_in *data_in, tree expr)
681*38fd1498Szrj {
682*38fd1498Szrj   TREE_REALPART (expr) = stream_read_tree (ib, data_in);
683*38fd1498Szrj   TREE_IMAGPART (expr) = stream_read_tree (ib, data_in);
684*38fd1498Szrj }
685*38fd1498Szrj 
686*38fd1498Szrj 
687*38fd1498Szrj /* Read all pointer fields in the TS_DECL_MINIMAL structure of EXPR
688*38fd1498Szrj    from input block IB.  DATA_IN contains tables and descriptors for the
689*38fd1498Szrj    file being read.  */
690*38fd1498Szrj 
691*38fd1498Szrj static void
692*38fd1498Szrj lto_input_ts_decl_minimal_tree_pointers (struct lto_input_block *ib,
693*38fd1498Szrj 					 struct data_in *data_in, tree expr)
694*38fd1498Szrj {
695*38fd1498Szrj   DECL_NAME (expr) = stream_read_tree (ib, data_in);
696*38fd1498Szrj   DECL_CONTEXT (expr) = stream_read_tree (ib, data_in);
697*38fd1498Szrj }
698*38fd1498Szrj 
699*38fd1498Szrj 
700*38fd1498Szrj /* Read all pointer fields in the TS_DECL_COMMON structure of EXPR from
701*38fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the
702*38fd1498Szrj    file being read.  */
703*38fd1498Szrj 
704*38fd1498Szrj static void
705*38fd1498Szrj lto_input_ts_decl_common_tree_pointers (struct lto_input_block *ib,
706*38fd1498Szrj 					struct data_in *data_in, tree expr)
707*38fd1498Szrj {
708*38fd1498Szrj   DECL_SIZE (expr) = stream_read_tree (ib, data_in);
709*38fd1498Szrj   DECL_SIZE_UNIT (expr) = stream_read_tree (ib, data_in);
710*38fd1498Szrj   DECL_ATTRIBUTES (expr) = stream_read_tree (ib, data_in);
711*38fd1498Szrj   DECL_ABSTRACT_ORIGIN (expr) = stream_read_tree (ib, data_in);
712*38fd1498Szrj 
713*38fd1498Szrj   if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
714*38fd1498Szrj       && DECL_HAS_VALUE_EXPR_P (expr))
715*38fd1498Szrj     SET_DECL_VALUE_EXPR (expr, stream_read_tree (ib, data_in));
716*38fd1498Szrj 
717*38fd1498Szrj   if (VAR_P (expr)
718*38fd1498Szrj       && DECL_HAS_DEBUG_EXPR_P (expr))
719*38fd1498Szrj     {
720*38fd1498Szrj       tree dexpr = stream_read_tree (ib, data_in);
721*38fd1498Szrj       if (dexpr)
722*38fd1498Szrj 	SET_DECL_DEBUG_EXPR (expr, dexpr);
723*38fd1498Szrj     }
724*38fd1498Szrj }
725*38fd1498Szrj 
726*38fd1498Szrj 
727*38fd1498Szrj /* Read all pointer fields in the TS_DECL_NON_COMMON structure of
728*38fd1498Szrj    EXPR from input block IB.  DATA_IN contains tables and descriptors for the
729*38fd1498Szrj    file being read.  */
730*38fd1498Szrj 
731*38fd1498Szrj static void
732*38fd1498Szrj lto_input_ts_decl_non_common_tree_pointers (struct lto_input_block *ib,
733*38fd1498Szrj 					    struct data_in *data_in, tree expr)
734*38fd1498Szrj {
735*38fd1498Szrj   if (TREE_CODE (expr) == TYPE_DECL)
736*38fd1498Szrj     DECL_ORIGINAL_TYPE (expr) = stream_read_tree (ib, data_in);
737*38fd1498Szrj }
738*38fd1498Szrj 
739*38fd1498Szrj 
740*38fd1498Szrj /* Read all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
741*38fd1498Szrj    from input block IB.  DATA_IN contains tables and descriptors for the
742*38fd1498Szrj    file being read.  */
743*38fd1498Szrj 
744*38fd1498Szrj static void
745*38fd1498Szrj lto_input_ts_decl_with_vis_tree_pointers (struct lto_input_block *ib,
746*38fd1498Szrj 				          struct data_in *data_in, tree expr)
747*38fd1498Szrj {
748*38fd1498Szrj   tree id;
749*38fd1498Szrj 
750*38fd1498Szrj   id = stream_read_tree (ib, data_in);
751*38fd1498Szrj   if (id)
752*38fd1498Szrj     {
753*38fd1498Szrj       gcc_assert (TREE_CODE (id) == IDENTIFIER_NODE);
754*38fd1498Szrj       SET_DECL_ASSEMBLER_NAME (expr, id);
755*38fd1498Szrj     }
756*38fd1498Szrj }
757*38fd1498Szrj 
758*38fd1498Szrj 
759*38fd1498Szrj /* Read all pointer fields in the TS_FIELD_DECL structure of EXPR from
760*38fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the
761*38fd1498Szrj    file being read.  */
762*38fd1498Szrj 
763*38fd1498Szrj static void
764*38fd1498Szrj lto_input_ts_field_decl_tree_pointers (struct lto_input_block *ib,
765*38fd1498Szrj 				       struct data_in *data_in, tree expr)
766*38fd1498Szrj {
767*38fd1498Szrj   DECL_FIELD_OFFSET (expr) = stream_read_tree (ib, data_in);
768*38fd1498Szrj   DECL_BIT_FIELD_TYPE (expr) = stream_read_tree (ib, data_in);
769*38fd1498Szrj   DECL_BIT_FIELD_REPRESENTATIVE (expr) = stream_read_tree (ib, data_in);
770*38fd1498Szrj   DECL_FIELD_BIT_OFFSET (expr) = stream_read_tree (ib, data_in);
771*38fd1498Szrj   DECL_FCONTEXT (expr) = stream_read_tree (ib, data_in);
772*38fd1498Szrj }
773*38fd1498Szrj 
774*38fd1498Szrj 
775*38fd1498Szrj /* Read all pointer fields in the TS_FUNCTION_DECL structure of EXPR
776*38fd1498Szrj    from input block IB.  DATA_IN contains tables and descriptors for the
777*38fd1498Szrj    file being read.  */
778*38fd1498Szrj 
779*38fd1498Szrj static void
780*38fd1498Szrj lto_input_ts_function_decl_tree_pointers (struct lto_input_block *ib,
781*38fd1498Szrj 					  struct data_in *data_in, tree expr)
782*38fd1498Szrj {
783*38fd1498Szrj   DECL_VINDEX (expr) = stream_read_tree (ib, data_in);
784*38fd1498Szrj   /* DECL_STRUCT_FUNCTION is loaded on demand by cgraph_get_body.  */
785*38fd1498Szrj   DECL_FUNCTION_PERSONALITY (expr) = stream_read_tree (ib, data_in);
786*38fd1498Szrj #ifndef ACCEL_COMPILER
787*38fd1498Szrj   DECL_FUNCTION_SPECIFIC_TARGET (expr) = stream_read_tree (ib, data_in);
788*38fd1498Szrj #endif
789*38fd1498Szrj   DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = stream_read_tree (ib, data_in);
790*38fd1498Szrj #ifdef ACCEL_COMPILER
791*38fd1498Szrj   {
792*38fd1498Szrj     tree opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr);
793*38fd1498Szrj     if (opts)
794*38fd1498Szrj       {
795*38fd1498Szrj 	struct gcc_options tmp;
796*38fd1498Szrj 	init_options_struct (&tmp, NULL);
797*38fd1498Szrj 	cl_optimization_restore (&tmp, TREE_OPTIMIZATION (opts));
798*38fd1498Szrj 	finish_options (&tmp, &global_options_set, UNKNOWN_LOCATION);
799*38fd1498Szrj 	opts = build_optimization_node (&tmp);
800*38fd1498Szrj 	finalize_options_struct (&tmp);
801*38fd1498Szrj 	DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = opts;
802*38fd1498Szrj       }
803*38fd1498Szrj   }
804*38fd1498Szrj #endif
805*38fd1498Szrj 
806*38fd1498Szrj   /* If the file contains a function with an EH personality set,
807*38fd1498Szrj      then it was compiled with -fexceptions.  In that case, initialize
808*38fd1498Szrj      the backend EH machinery.  */
809*38fd1498Szrj   if (DECL_FUNCTION_PERSONALITY (expr))
810*38fd1498Szrj     lto_init_eh ();
811*38fd1498Szrj }
812*38fd1498Szrj 
813*38fd1498Szrj 
814*38fd1498Szrj /* Read all pointer fields in the TS_TYPE_COMMON structure of EXPR from
815*38fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the file
816*38fd1498Szrj    being read.  */
817*38fd1498Szrj 
818*38fd1498Szrj static void
819*38fd1498Szrj lto_input_ts_type_common_tree_pointers (struct lto_input_block *ib,
820*38fd1498Szrj 					struct data_in *data_in, tree expr)
821*38fd1498Szrj {
822*38fd1498Szrj   TYPE_SIZE (expr) = stream_read_tree (ib, data_in);
823*38fd1498Szrj   TYPE_SIZE_UNIT (expr) = stream_read_tree (ib, data_in);
824*38fd1498Szrj   TYPE_ATTRIBUTES (expr) = stream_read_tree (ib, data_in);
825*38fd1498Szrj   TYPE_NAME (expr) = stream_read_tree (ib, data_in);
826*38fd1498Szrj   /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO.  They will be
827*38fd1498Szrj      reconstructed during fixup.  */
828*38fd1498Szrj   /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
829*38fd1498Szrj      during fixup.  */
830*38fd1498Szrj   TYPE_MAIN_VARIANT (expr) = stream_read_tree (ib, data_in);
831*38fd1498Szrj   TYPE_CONTEXT (expr) = stream_read_tree (ib, data_in);
832*38fd1498Szrj   /* TYPE_CANONICAL gets re-computed during type merging.  */
833*38fd1498Szrj   TYPE_CANONICAL (expr) = NULL_TREE;
834*38fd1498Szrj   TYPE_STUB_DECL (expr) = stream_read_tree (ib, data_in);
835*38fd1498Szrj }
836*38fd1498Szrj 
837*38fd1498Szrj /* Read all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
838*38fd1498Szrj    from input block IB.  DATA_IN contains tables and descriptors for the
839*38fd1498Szrj    file being read.  */
840*38fd1498Szrj 
841*38fd1498Szrj static void
842*38fd1498Szrj lto_input_ts_type_non_common_tree_pointers (struct lto_input_block *ib,
843*38fd1498Szrj 					    struct data_in *data_in,
844*38fd1498Szrj 					    tree expr)
845*38fd1498Szrj {
846*38fd1498Szrj   if (TREE_CODE (expr) == ENUMERAL_TYPE)
847*38fd1498Szrj     TYPE_VALUES (expr) = stream_read_tree (ib, data_in);
848*38fd1498Szrj   else if (TREE_CODE (expr) == ARRAY_TYPE)
849*38fd1498Szrj     TYPE_DOMAIN (expr) = stream_read_tree (ib, data_in);
850*38fd1498Szrj   else if (RECORD_OR_UNION_TYPE_P (expr))
851*38fd1498Szrj     TYPE_FIELDS (expr) = streamer_read_chain (ib, data_in);
852*38fd1498Szrj   else if (TREE_CODE (expr) == FUNCTION_TYPE
853*38fd1498Szrj 	   || TREE_CODE (expr) == METHOD_TYPE)
854*38fd1498Szrj     TYPE_ARG_TYPES (expr) = stream_read_tree (ib, data_in);
855*38fd1498Szrj 
856*38fd1498Szrj   if (!POINTER_TYPE_P (expr))
857*38fd1498Szrj     TYPE_MIN_VALUE_RAW (expr) = stream_read_tree (ib, data_in);
858*38fd1498Szrj   TYPE_MAX_VALUE_RAW (expr) = stream_read_tree (ib, data_in);
859*38fd1498Szrj }
860*38fd1498Szrj 
861*38fd1498Szrj 
862*38fd1498Szrj /* Read all pointer fields in the TS_LIST structure of EXPR from input
863*38fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
864*38fd1498Szrj    file being read.  */
865*38fd1498Szrj 
866*38fd1498Szrj static void
867*38fd1498Szrj lto_input_ts_list_tree_pointers (struct lto_input_block *ib,
868*38fd1498Szrj 				 struct data_in *data_in, tree expr)
869*38fd1498Szrj {
870*38fd1498Szrj   TREE_PURPOSE (expr) = stream_read_tree (ib, data_in);
871*38fd1498Szrj   TREE_VALUE (expr) = stream_read_tree (ib, data_in);
872*38fd1498Szrj   TREE_CHAIN (expr) = stream_read_tree (ib, data_in);
873*38fd1498Szrj }
874*38fd1498Szrj 
875*38fd1498Szrj 
876*38fd1498Szrj /* Read all pointer fields in the TS_VEC structure of EXPR from input
877*38fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
878*38fd1498Szrj    file being read.  */
879*38fd1498Szrj 
880*38fd1498Szrj static void
881*38fd1498Szrj lto_input_ts_vec_tree_pointers (struct lto_input_block *ib,
882*38fd1498Szrj 				struct data_in *data_in, tree expr)
883*38fd1498Szrj {
884*38fd1498Szrj   int i;
885*38fd1498Szrj 
886*38fd1498Szrj   /* Note that TREE_VEC_LENGTH was read by streamer_alloc_tree to
887*38fd1498Szrj      instantiate EXPR.  */
888*38fd1498Szrj   for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
889*38fd1498Szrj     TREE_VEC_ELT (expr, i) = stream_read_tree (ib, data_in);
890*38fd1498Szrj }
891*38fd1498Szrj 
892*38fd1498Szrj 
893*38fd1498Szrj /* Read all pointer fields in the TS_EXP structure of EXPR from input
894*38fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
895*38fd1498Szrj    file being read.  */
896*38fd1498Szrj 
897*38fd1498Szrj 
898*38fd1498Szrj static void
899*38fd1498Szrj lto_input_ts_exp_tree_pointers (struct lto_input_block *ib,
900*38fd1498Szrj 			        struct data_in *data_in, tree expr)
901*38fd1498Szrj {
902*38fd1498Szrj   int i;
903*38fd1498Szrj   tree block;
904*38fd1498Szrj 
905*38fd1498Szrj   for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
906*38fd1498Szrj     TREE_OPERAND (expr, i) = stream_read_tree (ib, data_in);
907*38fd1498Szrj 
908*38fd1498Szrj   block = stream_read_tree (ib, data_in);
909*38fd1498Szrj 
910*38fd1498Szrj   /* TODO: Block is stored in the locus information.  It may make more sense to
911*38fd1498Szrj      to make it go via the location cache.  */
912*38fd1498Szrj   if (block)
913*38fd1498Szrj     {
914*38fd1498Szrj       data_in->location_cache.apply_location_cache ();
915*38fd1498Szrj       TREE_SET_BLOCK (expr, block);
916*38fd1498Szrj     }
917*38fd1498Szrj }
918*38fd1498Szrj 
919*38fd1498Szrj 
920*38fd1498Szrj /* Read all pointer fields in the TS_BLOCK structure of EXPR from input
921*38fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
922*38fd1498Szrj    file being read.  */
923*38fd1498Szrj 
924*38fd1498Szrj static void
925*38fd1498Szrj lto_input_ts_block_tree_pointers (struct lto_input_block *ib,
926*38fd1498Szrj 				  struct data_in *data_in, tree expr)
927*38fd1498Szrj {
928*38fd1498Szrj   BLOCK_VARS (expr) = streamer_read_chain (ib, data_in);
929*38fd1498Szrj 
930*38fd1498Szrj   BLOCK_SUPERCONTEXT (expr) = stream_read_tree (ib, data_in);
931*38fd1498Szrj 
932*38fd1498Szrj   /* Stream BLOCK_ABSTRACT_ORIGIN and BLOCK_SOURCE_LOCATION for
933*38fd1498Szrj      the limited cases we can handle - those that represent inlined
934*38fd1498Szrj      function scopes.  For the rest them on the floor instead of ICEing in
935*38fd1498Szrj      dwarf2out.c.  */
936*38fd1498Szrj   BLOCK_ABSTRACT_ORIGIN (expr) = stream_read_tree (ib, data_in);
937*38fd1498Szrj   /* Do not stream BLOCK_NONLOCALIZED_VARS.  We cannot handle debug information
938*38fd1498Szrj      for early inlined BLOCKs so drop it on the floor instead of ICEing in
939*38fd1498Szrj      dwarf2out.c.  */
940*38fd1498Szrj 
941*38fd1498Szrj   /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
942*38fd1498Szrj      streaming time.  */
943*38fd1498Szrj 
944*38fd1498Szrj   /* We re-compute BLOCK_SUBBLOCKS of our parent here instead
945*38fd1498Szrj      of streaming it.  For non-BLOCK BLOCK_SUPERCONTEXTs we still
946*38fd1498Szrj      stream the child relationship explicitly.  */
947*38fd1498Szrj   if (BLOCK_SUPERCONTEXT (expr)
948*38fd1498Szrj       && TREE_CODE (BLOCK_SUPERCONTEXT (expr)) == BLOCK)
949*38fd1498Szrj     {
950*38fd1498Szrj       BLOCK_CHAIN (expr) = BLOCK_SUBBLOCKS (BLOCK_SUPERCONTEXT (expr));
951*38fd1498Szrj       BLOCK_SUBBLOCKS (BLOCK_SUPERCONTEXT (expr)) = expr;
952*38fd1498Szrj     }
953*38fd1498Szrj 
954*38fd1498Szrj   /* The global block is rooted at the TU decl.  Hook it here to
955*38fd1498Szrj      avoid the need to stream in this block during WPA time.  */
956*38fd1498Szrj   else if (BLOCK_SUPERCONTEXT (expr)
957*38fd1498Szrj 	   && TREE_CODE (BLOCK_SUPERCONTEXT (expr)) == TRANSLATION_UNIT_DECL)
958*38fd1498Szrj     DECL_INITIAL (BLOCK_SUPERCONTEXT (expr)) = expr;
959*38fd1498Szrj 
960*38fd1498Szrj   /* The function-level block is connected at the time we read in
961*38fd1498Szrj      function bodies for the same reason.  */
962*38fd1498Szrj }
963*38fd1498Szrj 
964*38fd1498Szrj 
965*38fd1498Szrj /* Read all pointer fields in the TS_BINFO structure of EXPR from input
966*38fd1498Szrj    block IB.  DATA_IN contains tables and descriptors for the
967*38fd1498Szrj    file being read.  */
968*38fd1498Szrj 
969*38fd1498Szrj static void
970*38fd1498Szrj lto_input_ts_binfo_tree_pointers (struct lto_input_block *ib,
971*38fd1498Szrj 				  struct data_in *data_in, tree expr)
972*38fd1498Szrj {
973*38fd1498Szrj   unsigned i;
974*38fd1498Szrj   tree t;
975*38fd1498Szrj 
976*38fd1498Szrj   /* Note that the number of slots in EXPR was read in
977*38fd1498Szrj      streamer_alloc_tree when instantiating EXPR.  However, the
978*38fd1498Szrj      vector is empty so we cannot rely on vec::length to know how many
979*38fd1498Szrj      elements to read.  So, this list is emitted as a 0-terminated
980*38fd1498Szrj      list on the writer side.  */
981*38fd1498Szrj   do
982*38fd1498Szrj     {
983*38fd1498Szrj       t = stream_read_tree (ib, data_in);
984*38fd1498Szrj       if (t)
985*38fd1498Szrj 	BINFO_BASE_BINFOS (expr)->quick_push (t);
986*38fd1498Szrj     }
987*38fd1498Szrj   while (t);
988*38fd1498Szrj 
989*38fd1498Szrj   BINFO_OFFSET (expr) = stream_read_tree (ib, data_in);
990*38fd1498Szrj   BINFO_VTABLE (expr) = stream_read_tree (ib, data_in);
991*38fd1498Szrj   BINFO_VPTR_FIELD (expr) = stream_read_tree (ib, data_in);
992*38fd1498Szrj 
993*38fd1498Szrj   /* The vector of BINFO_BASE_ACCESSES is pre-allocated during
994*38fd1498Szrj      unpacking the bitfield section.  */
995*38fd1498Szrj   for (i = 0; i < vec_safe_length (BINFO_BASE_ACCESSES (expr)); i++)
996*38fd1498Szrj     {
997*38fd1498Szrj       tree a = stream_read_tree (ib, data_in);
998*38fd1498Szrj       (*BINFO_BASE_ACCESSES (expr))[i] = a;
999*38fd1498Szrj     }
1000*38fd1498Szrj   /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
1001*38fd1498Szrj      and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
1002*38fd1498Szrj }
1003*38fd1498Szrj 
1004*38fd1498Szrj 
1005*38fd1498Szrj /* Read all pointer fields in the TS_CONSTRUCTOR structure of EXPR from
1006*38fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the
1007*38fd1498Szrj    file being read.  */
1008*38fd1498Szrj 
1009*38fd1498Szrj static void
1010*38fd1498Szrj lto_input_ts_constructor_tree_pointers (struct lto_input_block *ib,
1011*38fd1498Szrj 				        struct data_in *data_in, tree expr)
1012*38fd1498Szrj {
1013*38fd1498Szrj   unsigned i;
1014*38fd1498Szrj 
1015*38fd1498Szrj   for (i = 0; i < CONSTRUCTOR_NELTS (expr); i++)
1016*38fd1498Szrj     {
1017*38fd1498Szrj       constructor_elt e;
1018*38fd1498Szrj       e.index = stream_read_tree (ib, data_in);
1019*38fd1498Szrj       e.value = stream_read_tree (ib, data_in);
1020*38fd1498Szrj       (*CONSTRUCTOR_ELTS (expr))[i] = e;
1021*38fd1498Szrj     }
1022*38fd1498Szrj }
1023*38fd1498Szrj 
1024*38fd1498Szrj 
1025*38fd1498Szrj /* Read all pointer fields in the TS_OMP_CLAUSE structure of EXPR from
1026*38fd1498Szrj    input block IB.  DATA_IN contains tables and descriptors for the
1027*38fd1498Szrj    file being read.  */
1028*38fd1498Szrj 
1029*38fd1498Szrj static void
1030*38fd1498Szrj lto_input_ts_omp_clause_tree_pointers (struct lto_input_block *ib,
1031*38fd1498Szrj 				       struct data_in *data_in, tree expr)
1032*38fd1498Szrj {
1033*38fd1498Szrj   int i;
1034*38fd1498Szrj 
1035*38fd1498Szrj   for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
1036*38fd1498Szrj     OMP_CLAUSE_OPERAND (expr, i) = stream_read_tree (ib, data_in);
1037*38fd1498Szrj   OMP_CLAUSE_CHAIN (expr) = stream_read_tree (ib, data_in);
1038*38fd1498Szrj }
1039*38fd1498Szrj 
1040*38fd1498Szrj 
1041*38fd1498Szrj /* Read all pointer fields in EXPR from input block IB.  DATA_IN
1042*38fd1498Szrj    contains tables and descriptors for the file being read.  */
1043*38fd1498Szrj 
1044*38fd1498Szrj void
1045*38fd1498Szrj streamer_read_tree_body (struct lto_input_block *ib, struct data_in *data_in,
1046*38fd1498Szrj 			 tree expr)
1047*38fd1498Szrj {
1048*38fd1498Szrj   enum tree_code code;
1049*38fd1498Szrj 
1050*38fd1498Szrj   code = TREE_CODE (expr);
1051*38fd1498Szrj 
1052*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
1053*38fd1498Szrj     lto_input_ts_common_tree_pointers (ib, data_in, expr);
1054*38fd1498Szrj 
1055*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
1056*38fd1498Szrj     lto_input_ts_vector_tree_pointers (ib, data_in, expr);
1057*38fd1498Szrj 
1058*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
1059*38fd1498Szrj     lto_input_ts_poly_tree_pointers (ib, data_in, expr);
1060*38fd1498Szrj 
1061*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
1062*38fd1498Szrj     lto_input_ts_complex_tree_pointers (ib, data_in, expr);
1063*38fd1498Szrj 
1064*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
1065*38fd1498Szrj     lto_input_ts_decl_minimal_tree_pointers (ib, data_in, expr);
1066*38fd1498Szrj 
1067*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
1068*38fd1498Szrj     lto_input_ts_decl_common_tree_pointers (ib, data_in, expr);
1069*38fd1498Szrj 
1070*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
1071*38fd1498Szrj     lto_input_ts_decl_non_common_tree_pointers (ib, data_in, expr);
1072*38fd1498Szrj 
1073*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
1074*38fd1498Szrj     lto_input_ts_decl_with_vis_tree_pointers (ib, data_in, expr);
1075*38fd1498Szrj 
1076*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
1077*38fd1498Szrj     lto_input_ts_field_decl_tree_pointers (ib, data_in, expr);
1078*38fd1498Szrj 
1079*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
1080*38fd1498Szrj     lto_input_ts_function_decl_tree_pointers (ib, data_in, expr);
1081*38fd1498Szrj 
1082*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
1083*38fd1498Szrj     lto_input_ts_type_common_tree_pointers (ib, data_in, expr);
1084*38fd1498Szrj 
1085*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
1086*38fd1498Szrj     lto_input_ts_type_non_common_tree_pointers (ib, data_in, expr);
1087*38fd1498Szrj 
1088*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_LIST))
1089*38fd1498Szrj     lto_input_ts_list_tree_pointers (ib, data_in, expr);
1090*38fd1498Szrj 
1091*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1092*38fd1498Szrj     lto_input_ts_vec_tree_pointers (ib, data_in, expr);
1093*38fd1498Szrj 
1094*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
1095*38fd1498Szrj     lto_input_ts_exp_tree_pointers (ib, data_in, expr);
1096*38fd1498Szrj 
1097*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
1098*38fd1498Szrj     lto_input_ts_block_tree_pointers (ib, data_in, expr);
1099*38fd1498Szrj 
1100*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1101*38fd1498Szrj     lto_input_ts_binfo_tree_pointers (ib, data_in, expr);
1102*38fd1498Szrj 
1103*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
1104*38fd1498Szrj     lto_input_ts_constructor_tree_pointers (ib, data_in, expr);
1105*38fd1498Szrj 
1106*38fd1498Szrj   if (code == OMP_CLAUSE)
1107*38fd1498Szrj     lto_input_ts_omp_clause_tree_pointers (ib, data_in, expr);
1108*38fd1498Szrj }
1109*38fd1498Szrj 
1110*38fd1498Szrj 
1111*38fd1498Szrj /* Read an index IX from input block IB and return the tree node at
1112*38fd1498Szrj    DATA_IN->FILE_DATA->GLOBALS_INDEX[IX].  */
1113*38fd1498Szrj 
1114*38fd1498Szrj tree
1115*38fd1498Szrj streamer_get_pickled_tree (struct lto_input_block *ib, struct data_in *data_in)
1116*38fd1498Szrj {
1117*38fd1498Szrj   unsigned HOST_WIDE_INT ix;
1118*38fd1498Szrj   tree result;
1119*38fd1498Szrj   enum LTO_tags expected_tag;
1120*38fd1498Szrj 
1121*38fd1498Szrj   ix = streamer_read_uhwi (ib);
1122*38fd1498Szrj   expected_tag = streamer_read_enum (ib, LTO_tags, LTO_NUM_TAGS);
1123*38fd1498Szrj 
1124*38fd1498Szrj   result = streamer_tree_cache_get_tree (data_in->reader_cache, ix);
1125*38fd1498Szrj   gcc_assert (result
1126*38fd1498Szrj               && TREE_CODE (result) == lto_tag_to_tree_code (expected_tag));
1127*38fd1498Szrj 
1128*38fd1498Szrj   return result;
1129*38fd1498Szrj }
1130