xref: /dflybsd-src/contrib/gcc-8.0/gcc/tree-streamer-out.c (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj /* Routines for emitting trees to 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 "tree-streamer.h"
30*38fd1498Szrj #include "cgraph.h"
31*38fd1498Szrj #include "alias.h"
32*38fd1498Szrj #include "stor-layout.h"
33*38fd1498Szrj #include "gomp-constants.h"
34*38fd1498Szrj 
35*38fd1498Szrj 
36*38fd1498Szrj /* Output the STRING constant to the string
37*38fd1498Szrj    table in OB.  Then put the index onto the INDEX_STREAM.  */
38*38fd1498Szrj 
39*38fd1498Szrj void
40*38fd1498Szrj streamer_write_string_cst (struct output_block *ob,
41*38fd1498Szrj 			   struct lto_output_stream *index_stream,
42*38fd1498Szrj 			   tree string)
43*38fd1498Szrj {
44*38fd1498Szrj   streamer_write_string_with_length (ob, index_stream,
45*38fd1498Szrj 				     string ? TREE_STRING_POINTER (string)
46*38fd1498Szrj 					    : NULL,
47*38fd1498Szrj 				     string ? TREE_STRING_LENGTH (string) : 0,
48*38fd1498Szrj 				     true);
49*38fd1498Szrj }
50*38fd1498Szrj 
51*38fd1498Szrj 
52*38fd1498Szrj /* Output the identifier ID to the string
53*38fd1498Szrj    table in OB.  Then put the index onto the INDEX_STREAM.  */
54*38fd1498Szrj 
55*38fd1498Szrj static void
56*38fd1498Szrj write_identifier (struct output_block *ob,
57*38fd1498Szrj 		   struct lto_output_stream *index_stream,
58*38fd1498Szrj 		   tree id)
59*38fd1498Szrj {
60*38fd1498Szrj   streamer_write_string_with_length (ob, index_stream,
61*38fd1498Szrj 				     IDENTIFIER_POINTER (id),
62*38fd1498Szrj 				     IDENTIFIER_LENGTH (id),
63*38fd1498Szrj 				     true);
64*38fd1498Szrj }
65*38fd1498Szrj 
66*38fd1498Szrj 
67*38fd1498Szrj /* Pack all the non-pointer fields of the TS_BASE structure of
68*38fd1498Szrj    expression EXPR into bitpack BP.  */
69*38fd1498Szrj 
70*38fd1498Szrj static inline void
71*38fd1498Szrj pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
72*38fd1498Szrj {
73*38fd1498Szrj   bp_pack_value (bp, TREE_CODE (expr), 16);
74*38fd1498Szrj   if (!TYPE_P (expr))
75*38fd1498Szrj     {
76*38fd1498Szrj       bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
77*38fd1498Szrj       bp_pack_value (bp, TREE_CONSTANT (expr), 1);
78*38fd1498Szrj       bp_pack_value (bp, TREE_READONLY (expr), 1);
79*38fd1498Szrj 
80*38fd1498Szrj       /* TREE_PUBLIC is used on types to indicate that the type
81*38fd1498Szrj 	 has a TYPE_CACHED_VALUES vector.  This is not streamed out,
82*38fd1498Szrj 	 so we skip it here.  */
83*38fd1498Szrj       bp_pack_value (bp, TREE_PUBLIC (expr), 1);
84*38fd1498Szrj     }
85*38fd1498Szrj   else
86*38fd1498Szrj     bp_pack_value (bp, 0, 4);
87*38fd1498Szrj   bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
88*38fd1498Szrj   bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
89*38fd1498Szrj   if (DECL_P (expr))
90*38fd1498Szrj     {
91*38fd1498Szrj       bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
92*38fd1498Szrj       bp_pack_value (bp, DECL_NAMELESS (expr), 1);
93*38fd1498Szrj     }
94*38fd1498Szrj   else if (TYPE_P (expr))
95*38fd1498Szrj     bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
96*38fd1498Szrj   else
97*38fd1498Szrj     bp_pack_value (bp, 0, 1);
98*38fd1498Szrj   /* We write debug info two times, do not confuse the second one.
99*38fd1498Szrj      The only relevant TREE_ASM_WRITTEN use is on SSA names.  */
100*38fd1498Szrj   bp_pack_value (bp, (TREE_CODE (expr) != SSA_NAME
101*38fd1498Szrj 		      ? 0 : TREE_ASM_WRITTEN (expr)), 1);
102*38fd1498Szrj   if (TYPE_P (expr))
103*38fd1498Szrj     bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
104*38fd1498Szrj   else
105*38fd1498Szrj     bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
106*38fd1498Szrj   bp_pack_value (bp, TREE_NOTHROW (expr), 1);
107*38fd1498Szrj   bp_pack_value (bp, TREE_STATIC (expr), 1);
108*38fd1498Szrj   if (TREE_CODE (expr) != TREE_BINFO)
109*38fd1498Szrj     bp_pack_value (bp, TREE_PRIVATE (expr), 1);
110*38fd1498Szrj   else
111*38fd1498Szrj     bp_pack_value (bp, 0, 1);
112*38fd1498Szrj   bp_pack_value (bp, TREE_PROTECTED (expr), 1);
113*38fd1498Szrj   bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
114*38fd1498Szrj   if (TYPE_P (expr))
115*38fd1498Szrj     {
116*38fd1498Szrj       if (AGGREGATE_TYPE_P (expr))
117*38fd1498Szrj 	bp_pack_value (bp, TYPE_REVERSE_STORAGE_ORDER (expr), 1);
118*38fd1498Szrj       else
119*38fd1498Szrj 	bp_pack_value (bp, TYPE_SATURATING (expr), 1);
120*38fd1498Szrj       bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8);
121*38fd1498Szrj     }
122*38fd1498Szrj   else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
123*38fd1498Szrj     {
124*38fd1498Szrj       bp_pack_value (bp, REF_REVERSE_STORAGE_ORDER (expr), 1);
125*38fd1498Szrj       bp_pack_value (bp, 0, 8);
126*38fd1498Szrj     }
127*38fd1498Szrj   else if (TREE_CODE (expr) == SSA_NAME)
128*38fd1498Szrj     {
129*38fd1498Szrj       bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
130*38fd1498Szrj       bp_pack_value (bp, 0, 8);
131*38fd1498Szrj     }
132*38fd1498Szrj   else
133*38fd1498Szrj     bp_pack_value (bp, 0, 9);
134*38fd1498Szrj }
135*38fd1498Szrj 
136*38fd1498Szrj 
137*38fd1498Szrj /* Pack all the non-pointer fields of the TS_INTEGER_CST structure of
138*38fd1498Szrj    expression EXPR into bitpack BP.  */
139*38fd1498Szrj 
140*38fd1498Szrj static void
141*38fd1498Szrj pack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
142*38fd1498Szrj {
143*38fd1498Szrj   int i;
144*38fd1498Szrj   /* Note that the number of elements has already been written out in
145*38fd1498Szrj      streamer_write_tree_header.  */
146*38fd1498Szrj   for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
147*38fd1498Szrj     bp_pack_var_len_int (bp, TREE_INT_CST_ELT (expr, i));
148*38fd1498Szrj }
149*38fd1498Szrj 
150*38fd1498Szrj 
151*38fd1498Szrj /* Pack all the non-pointer fields of the TS_REAL_CST structure of
152*38fd1498Szrj    expression EXPR into bitpack BP.  */
153*38fd1498Szrj 
154*38fd1498Szrj static void
155*38fd1498Szrj pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
156*38fd1498Szrj {
157*38fd1498Szrj   unsigned i;
158*38fd1498Szrj   REAL_VALUE_TYPE r;
159*38fd1498Szrj 
160*38fd1498Szrj   r = TREE_REAL_CST (expr);
161*38fd1498Szrj   bp_pack_value (bp, r.cl, 2);
162*38fd1498Szrj   bp_pack_value (bp, r.decimal, 1);
163*38fd1498Szrj   bp_pack_value (bp, r.sign, 1);
164*38fd1498Szrj   bp_pack_value (bp, r.signalling, 1);
165*38fd1498Szrj   bp_pack_value (bp, r.canonical, 1);
166*38fd1498Szrj   bp_pack_value (bp, r.uexp, EXP_BITS);
167*38fd1498Szrj   for (i = 0; i < SIGSZ; i++)
168*38fd1498Szrj     bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
169*38fd1498Szrj }
170*38fd1498Szrj 
171*38fd1498Szrj 
172*38fd1498Szrj /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
173*38fd1498Szrj    expression EXPR into bitpack BP.  */
174*38fd1498Szrj 
175*38fd1498Szrj static void
176*38fd1498Szrj pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
177*38fd1498Szrj {
178*38fd1498Szrj   struct fixed_value fv = TREE_FIXED_CST (expr);
179*38fd1498Szrj   bp_pack_machine_mode (bp, fv.mode);
180*38fd1498Szrj   bp_pack_var_len_int (bp, fv.data.low);
181*38fd1498Szrj   bp_pack_var_len_int (bp, fv.data.high);
182*38fd1498Szrj }
183*38fd1498Szrj 
184*38fd1498Szrj /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
185*38fd1498Szrj    of expression EXPR into bitpack BP.  */
186*38fd1498Szrj 
187*38fd1498Szrj static void
188*38fd1498Szrj pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
189*38fd1498Szrj {
190*38fd1498Szrj   bp_pack_machine_mode (bp, DECL_MODE (expr));
191*38fd1498Szrj   bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
192*38fd1498Szrj   bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
193*38fd1498Szrj   bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
194*38fd1498Szrj   bp_pack_value (bp, DECL_ABSTRACT_P (expr), 1);
195*38fd1498Szrj   bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
196*38fd1498Szrj   bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
197*38fd1498Szrj   bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
198*38fd1498Szrj   bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
199*38fd1498Szrj   bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1);
200*38fd1498Szrj   bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
201*38fd1498Szrj 
202*38fd1498Szrj   if (TREE_CODE (expr) == LABEL_DECL)
203*38fd1498Szrj     {
204*38fd1498Szrj       /* Note that we do not write LABEL_DECL_UID.  The reader will
205*38fd1498Szrj 	 always assume an initial value of -1 so that the
206*38fd1498Szrj 	 label_to_block_map is recreated by gimple_set_bb.  */
207*38fd1498Szrj       bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
208*38fd1498Szrj     }
209*38fd1498Szrj 
210*38fd1498Szrj   if (TREE_CODE (expr) == FIELD_DECL)
211*38fd1498Szrj     {
212*38fd1498Szrj       bp_pack_value (bp, DECL_PACKED (expr), 1);
213*38fd1498Szrj       bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
214*38fd1498Szrj       bp_pack_value (bp, DECL_PADDING_P (expr), 1);
215*38fd1498Szrj       bp_pack_value (bp, expr->decl_common.off_align, 8);
216*38fd1498Szrj     }
217*38fd1498Szrj 
218*38fd1498Szrj   if (VAR_P (expr))
219*38fd1498Szrj     {
220*38fd1498Szrj       bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
221*38fd1498Szrj       bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
222*38fd1498Szrj     }
223*38fd1498Szrj 
224*38fd1498Szrj   if (TREE_CODE (expr) == RESULT_DECL
225*38fd1498Szrj       || TREE_CODE (expr) == PARM_DECL
226*38fd1498Szrj       || VAR_P (expr))
227*38fd1498Szrj     {
228*38fd1498Szrj       bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
229*38fd1498Szrj       if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
230*38fd1498Szrj 	bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
231*38fd1498Szrj     }
232*38fd1498Szrj }
233*38fd1498Szrj 
234*38fd1498Szrj 
235*38fd1498Szrj /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
236*38fd1498Szrj    of expression EXPR into bitpack BP.  */
237*38fd1498Szrj 
238*38fd1498Szrj static void
239*38fd1498Szrj pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
240*38fd1498Szrj {
241*38fd1498Szrj   bp_pack_value (bp, DECL_REGISTER (expr), 1);
242*38fd1498Szrj }
243*38fd1498Szrj 
244*38fd1498Szrj 
245*38fd1498Szrj /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
246*38fd1498Szrj    of expression EXPR into bitpack BP.  */
247*38fd1498Szrj 
248*38fd1498Szrj static void
249*38fd1498Szrj pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
250*38fd1498Szrj {
251*38fd1498Szrj   bp_pack_value (bp, DECL_COMMON (expr), 1);
252*38fd1498Szrj   bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
253*38fd1498Szrj   bp_pack_value (bp, DECL_WEAK (expr), 1);
254*38fd1498Szrj   bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr),  1);
255*38fd1498Szrj   bp_pack_value (bp, DECL_COMDAT (expr),  1);
256*38fd1498Szrj   bp_pack_value (bp, DECL_VISIBILITY (expr),  2);
257*38fd1498Szrj   bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr),  1);
258*38fd1498Szrj 
259*38fd1498Szrj   if (VAR_P (expr))
260*38fd1498Szrj     {
261*38fd1498Szrj       bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
262*38fd1498Szrj       /* DECL_IN_TEXT_SECTION is set during final asm output only. */
263*38fd1498Szrj       bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
264*38fd1498Szrj     }
265*38fd1498Szrj 
266*38fd1498Szrj   if (TREE_CODE (expr) == FUNCTION_DECL)
267*38fd1498Szrj     {
268*38fd1498Szrj       bp_pack_value (bp, DECL_FINAL_P (expr), 1);
269*38fd1498Szrj       bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1);
270*38fd1498Szrj       bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1);
271*38fd1498Szrj     }
272*38fd1498Szrj }
273*38fd1498Szrj 
274*38fd1498Szrj 
275*38fd1498Szrj /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
276*38fd1498Szrj    of expression EXPR into bitpack BP.  */
277*38fd1498Szrj 
278*38fd1498Szrj static void
279*38fd1498Szrj pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
280*38fd1498Szrj {
281*38fd1498Szrj   bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
282*38fd1498Szrj 		DECL_BUILT_IN_CLASS (expr));
283*38fd1498Szrj   bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
284*38fd1498Szrj   bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
285*38fd1498Szrj   bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
286*38fd1498Szrj   bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
287*38fd1498Szrj   bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
288*38fd1498Szrj   bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
289*38fd1498Szrj   bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
290*38fd1498Szrj   bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
291*38fd1498Szrj   bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
292*38fd1498Szrj   bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
293*38fd1498Szrj   bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
294*38fd1498Szrj   bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
295*38fd1498Szrj   bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
296*38fd1498Szrj   bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
297*38fd1498Szrj   bp_pack_value (bp, DECL_PURE_P (expr), 1);
298*38fd1498Szrj   bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
299*38fd1498Szrj   if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
300*38fd1498Szrj     bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 12);
301*38fd1498Szrj }
302*38fd1498Szrj 
303*38fd1498Szrj 
304*38fd1498Szrj /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
305*38fd1498Szrj    of expression EXPR into bitpack BP.  */
306*38fd1498Szrj 
307*38fd1498Szrj static void
308*38fd1498Szrj pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
309*38fd1498Szrj {
310*38fd1498Szrj   /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags
311*38fd1498Szrj      not necessary valid in a global context.
312*38fd1498Szrj      Use the raw value previously set by layout_type.  */
313*38fd1498Szrj   bp_pack_machine_mode (bp, TYPE_MODE_RAW (expr));
314*38fd1498Szrj   bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
315*38fd1498Szrj   /* TYPE_NO_FORCE_BLK is private to stor-layout and need
316*38fd1498Szrj      no streaming.  */
317*38fd1498Szrj   bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING (expr), 1);
318*38fd1498Szrj   bp_pack_value (bp, TYPE_PACKED (expr), 1);
319*38fd1498Szrj   bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
320*38fd1498Szrj   bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
321*38fd1498Szrj   bp_pack_value (bp, TYPE_READONLY (expr), 1);
322*38fd1498Szrj   /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark
323*38fd1498Szrj      types that are opaque for TBAA.  This however did not work as intended,
324*38fd1498Szrj      because TYPE_ALIAS_SET == 0 was regularly lost in type merging.  */
325*38fd1498Szrj   if (RECORD_OR_UNION_TYPE_P (expr))
326*38fd1498Szrj     {
327*38fd1498Szrj       bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
328*38fd1498Szrj       bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
329*38fd1498Szrj     }
330*38fd1498Szrj   else if (TREE_CODE (expr) == ARRAY_TYPE)
331*38fd1498Szrj     bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
332*38fd1498Szrj   if (AGGREGATE_TYPE_P (expr))
333*38fd1498Szrj     bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1);
334*38fd1498Szrj   bp_pack_value (bp, TYPE_EMPTY_P (expr), 1);
335*38fd1498Szrj   bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
336*38fd1498Szrj   bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
337*38fd1498Szrj }
338*38fd1498Szrj 
339*38fd1498Szrj 
340*38fd1498Szrj /* Pack all the non-pointer fields of the TS_BLOCK structure
341*38fd1498Szrj    of expression EXPR into bitpack BP.  */
342*38fd1498Szrj 
343*38fd1498Szrj static void
344*38fd1498Szrj pack_ts_block_value_fields (struct output_block *ob,
345*38fd1498Szrj 			    struct bitpack_d *bp, tree expr)
346*38fd1498Szrj {
347*38fd1498Szrj   bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1);
348*38fd1498Szrj   /* BLOCK_NUMBER is recomputed.  */
349*38fd1498Szrj   /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
350*38fd1498Szrj      that represent inlined function scopes.
351*38fd1498Szrj      For the rest them on the floor instead of ICEing in dwarf2out.c.  */
352*38fd1498Szrj   if (inlined_function_outer_scope_p (expr))
353*38fd1498Szrj     stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
354*38fd1498Szrj   else
355*38fd1498Szrj     stream_output_location (ob, bp, UNKNOWN_LOCATION);
356*38fd1498Szrj }
357*38fd1498Szrj 
358*38fd1498Szrj /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
359*38fd1498Szrj    of expression EXPR into bitpack BP.  */
360*38fd1498Szrj 
361*38fd1498Szrj static void
362*38fd1498Szrj pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
363*38fd1498Szrj 					    struct bitpack_d *bp, tree expr)
364*38fd1498Szrj {
365*38fd1498Szrj   bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
366*38fd1498Szrj }
367*38fd1498Szrj 
368*38fd1498Szrj 
369*38fd1498Szrj /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
370*38fd1498Szrj    of expression EXPR into bitpack BP.  */
371*38fd1498Szrj 
372*38fd1498Szrj static void
373*38fd1498Szrj pack_ts_omp_clause_value_fields (struct output_block *ob,
374*38fd1498Szrj 				 struct bitpack_d *bp, tree expr)
375*38fd1498Szrj {
376*38fd1498Szrj   stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
377*38fd1498Szrj   switch (OMP_CLAUSE_CODE (expr))
378*38fd1498Szrj     {
379*38fd1498Szrj     case OMP_CLAUSE_DEFAULT:
380*38fd1498Szrj       bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
381*38fd1498Szrj 		    OMP_CLAUSE_DEFAULT_KIND (expr));
382*38fd1498Szrj       break;
383*38fd1498Szrj     case OMP_CLAUSE_SCHEDULE:
384*38fd1498Szrj       bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
385*38fd1498Szrj 		    OMP_CLAUSE_SCHEDULE_KIND (expr));
386*38fd1498Szrj       break;
387*38fd1498Szrj     case OMP_CLAUSE_DEPEND:
388*38fd1498Szrj       bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
389*38fd1498Szrj 		    OMP_CLAUSE_DEPEND_KIND (expr));
390*38fd1498Szrj       break;
391*38fd1498Szrj     case OMP_CLAUSE_MAP:
392*38fd1498Szrj       bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
393*38fd1498Szrj 		    OMP_CLAUSE_MAP_KIND (expr));
394*38fd1498Szrj       break;
395*38fd1498Szrj     case OMP_CLAUSE_PROC_BIND:
396*38fd1498Szrj       bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
397*38fd1498Szrj 		    OMP_CLAUSE_PROC_BIND_KIND (expr));
398*38fd1498Szrj       break;
399*38fd1498Szrj     case OMP_CLAUSE_REDUCTION:
400*38fd1498Szrj       bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
401*38fd1498Szrj 		    OMP_CLAUSE_REDUCTION_CODE (expr));
402*38fd1498Szrj       break;
403*38fd1498Szrj     default:
404*38fd1498Szrj       break;
405*38fd1498Szrj     }
406*38fd1498Szrj }
407*38fd1498Szrj 
408*38fd1498Szrj 
409*38fd1498Szrj /* Pack all the bitfields in EXPR into a bit pack.  */
410*38fd1498Szrj 
411*38fd1498Szrj void
412*38fd1498Szrj streamer_write_tree_bitfields (struct output_block *ob, tree expr)
413*38fd1498Szrj {
414*38fd1498Szrj   bitpack_d bp = bitpack_create (ob->main_stream);
415*38fd1498Szrj   enum tree_code code;
416*38fd1498Szrj 
417*38fd1498Szrj   code = TREE_CODE (expr);
418*38fd1498Szrj 
419*38fd1498Szrj   /* Note that all these functions are highly sensitive to changes in
420*38fd1498Szrj      the types and sizes of each of the fields being packed.  */
421*38fd1498Szrj   pack_ts_base_value_fields (&bp, expr);
422*38fd1498Szrj 
423*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
424*38fd1498Szrj     pack_ts_int_cst_value_fields (&bp, expr);
425*38fd1498Szrj 
426*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
427*38fd1498Szrj     pack_ts_real_cst_value_fields (&bp, expr);
428*38fd1498Szrj 
429*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
430*38fd1498Szrj     pack_ts_fixed_cst_value_fields (&bp, expr);
431*38fd1498Szrj 
432*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
433*38fd1498Szrj     stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr));
434*38fd1498Szrj 
435*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
436*38fd1498Szrj     pack_ts_decl_common_value_fields (&bp, expr);
437*38fd1498Szrj 
438*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
439*38fd1498Szrj     pack_ts_decl_wrtl_value_fields (&bp, expr);
440*38fd1498Szrj 
441*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
442*38fd1498Szrj     pack_ts_decl_with_vis_value_fields (&bp, expr);
443*38fd1498Szrj 
444*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
445*38fd1498Szrj     pack_ts_function_decl_value_fields (&bp, expr);
446*38fd1498Szrj 
447*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
448*38fd1498Szrj     pack_ts_type_common_value_fields (&bp, expr);
449*38fd1498Szrj 
450*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
451*38fd1498Szrj     {
452*38fd1498Szrj       stream_output_location (ob, &bp, EXPR_LOCATION (expr));
453*38fd1498Szrj       if (code == MEM_REF
454*38fd1498Szrj 	  || code == TARGET_MEM_REF)
455*38fd1498Szrj 	{
456*38fd1498Szrj 	  bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
457*38fd1498Szrj 	  if (MR_DEPENDENCE_CLIQUE (expr) != 0)
458*38fd1498Szrj 	    bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
459*38fd1498Szrj 	}
460*38fd1498Szrj     }
461*38fd1498Szrj 
462*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
463*38fd1498Szrj     pack_ts_block_value_fields (ob, &bp, expr);
464*38fd1498Szrj 
465*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
466*38fd1498Szrj     pack_ts_translation_unit_decl_value_fields (ob, &bp, expr);
467*38fd1498Szrj 
468*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
469*38fd1498Szrj     cl_optimization_stream_out (&bp, TREE_OPTIMIZATION (expr));
470*38fd1498Szrj 
471*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
472*38fd1498Szrj     bp_pack_var_len_unsigned (&bp, vec_safe_length (BINFO_BASE_ACCESSES (expr)));
473*38fd1498Szrj 
474*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
475*38fd1498Szrj     bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr));
476*38fd1498Szrj 
477*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
478*38fd1498Szrj       /* Don't stream these when passing things to a different target.  */
479*38fd1498Szrj       && !lto_stream_offload_p)
480*38fd1498Szrj     cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr));
481*38fd1498Szrj 
482*38fd1498Szrj   if (code == OMP_CLAUSE)
483*38fd1498Szrj     pack_ts_omp_clause_value_fields (ob, &bp, expr);
484*38fd1498Szrj 
485*38fd1498Szrj   streamer_write_bitpack (&bp);
486*38fd1498Szrj }
487*38fd1498Szrj 
488*38fd1498Szrj 
489*38fd1498Szrj /* Emit the chain of tree nodes starting at T.  OB is the output block
490*38fd1498Szrj    to write to.  REF_P is true if chain elements should be emitted
491*38fd1498Szrj    as references.  */
492*38fd1498Szrj 
493*38fd1498Szrj void
494*38fd1498Szrj streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
495*38fd1498Szrj {
496*38fd1498Szrj   while (t)
497*38fd1498Szrj     {
498*38fd1498Szrj       /* We avoid outputting external vars or functions by reference
499*38fd1498Szrj 	 to the global decls section as we do not want to have them
500*38fd1498Szrj 	 enter decl merging.  This is, of course, only for the call
501*38fd1498Szrj 	 for streaming BLOCK_VARS, but other callers are safe.
502*38fd1498Szrj 	 See also lto-streamer-out.c:DFS_write_tree_body.  */
503*38fd1498Szrj       if (VAR_OR_FUNCTION_DECL_P (t)
504*38fd1498Szrj 	  && DECL_EXTERNAL (t))
505*38fd1498Szrj 	stream_write_tree_shallow_non_ref (ob, t, ref_p);
506*38fd1498Szrj       else
507*38fd1498Szrj 	stream_write_tree (ob, t, ref_p);
508*38fd1498Szrj 
509*38fd1498Szrj       t = TREE_CHAIN (t);
510*38fd1498Szrj     }
511*38fd1498Szrj 
512*38fd1498Szrj   /* Write a sentinel to terminate the chain.  */
513*38fd1498Szrj   stream_write_tree (ob, NULL_TREE, ref_p);
514*38fd1498Szrj }
515*38fd1498Szrj 
516*38fd1498Szrj 
517*38fd1498Szrj /* Write all pointer fields in the TS_COMMON structure of EXPR to output
518*38fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
519*38fd1498Szrj    fields.  */
520*38fd1498Szrj 
521*38fd1498Szrj static void
522*38fd1498Szrj write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
523*38fd1498Szrj {
524*38fd1498Szrj   if (TREE_CODE (expr) != IDENTIFIER_NODE)
525*38fd1498Szrj     stream_write_tree (ob, TREE_TYPE (expr), ref_p);
526*38fd1498Szrj }
527*38fd1498Szrj 
528*38fd1498Szrj 
529*38fd1498Szrj /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
530*38fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
531*38fd1498Szrj    fields.  */
532*38fd1498Szrj 
533*38fd1498Szrj static void
534*38fd1498Szrj write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
535*38fd1498Szrj {
536*38fd1498Szrj   /* Note that the number of elements for EXPR has already been emitted
537*38fd1498Szrj      in EXPR's header (see streamer_write_tree_header).  */
538*38fd1498Szrj   unsigned int count = vector_cst_encoded_nelts (expr);
539*38fd1498Szrj   for (unsigned int i = 0; i < count; ++i)
540*38fd1498Szrj     stream_write_tree (ob, VECTOR_CST_ENCODED_ELT (expr, i), ref_p);
541*38fd1498Szrj }
542*38fd1498Szrj 
543*38fd1498Szrj 
544*38fd1498Szrj /* Write all pointer fields in the TS_POLY_INT_CST structure of EXPR to
545*38fd1498Szrj    output block OB.  If REF_P is true, write a reference to EXPR's pointer
546*38fd1498Szrj    fields.  */
547*38fd1498Szrj 
548*38fd1498Szrj static void
549*38fd1498Szrj write_ts_poly_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
550*38fd1498Szrj {
551*38fd1498Szrj   for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
552*38fd1498Szrj     stream_write_tree (ob, POLY_INT_CST_COEFF (expr, i), ref_p);
553*38fd1498Szrj }
554*38fd1498Szrj 
555*38fd1498Szrj 
556*38fd1498Szrj /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
557*38fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
558*38fd1498Szrj    fields.  */
559*38fd1498Szrj 
560*38fd1498Szrj static void
561*38fd1498Szrj write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
562*38fd1498Szrj {
563*38fd1498Szrj   stream_write_tree (ob, TREE_REALPART (expr), ref_p);
564*38fd1498Szrj   stream_write_tree (ob, TREE_IMAGPART (expr), ref_p);
565*38fd1498Szrj }
566*38fd1498Szrj 
567*38fd1498Szrj 
568*38fd1498Szrj /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
569*38fd1498Szrj    to output block OB.  If REF_P is true, write a reference to EXPR's
570*38fd1498Szrj    pointer fields.  */
571*38fd1498Szrj 
572*38fd1498Szrj static void
573*38fd1498Szrj write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
574*38fd1498Szrj 				     bool ref_p)
575*38fd1498Szrj {
576*38fd1498Szrj   /* Drop names that were created for anonymous entities.  */
577*38fd1498Szrj   if (DECL_NAME (expr)
578*38fd1498Szrj       && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
579*38fd1498Szrj       && anon_aggrname_p (DECL_NAME (expr)))
580*38fd1498Szrj     stream_write_tree (ob, NULL_TREE, ref_p);
581*38fd1498Szrj   else
582*38fd1498Szrj     stream_write_tree (ob, DECL_NAME (expr), ref_p);
583*38fd1498Szrj   if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
584*38fd1498Szrj       && ! DECL_CONTEXT (expr))
585*38fd1498Szrj     stream_write_tree (ob, (*all_translation_units)[0], ref_p);
586*38fd1498Szrj   else
587*38fd1498Szrj     stream_write_tree (ob, DECL_CONTEXT (expr), ref_p);
588*38fd1498Szrj }
589*38fd1498Szrj 
590*38fd1498Szrj 
591*38fd1498Szrj /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
592*38fd1498Szrj    output block OB.  If REF_P is true, write a reference to EXPR's
593*38fd1498Szrj    pointer fields.  */
594*38fd1498Szrj 
595*38fd1498Szrj static void
596*38fd1498Szrj write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
597*38fd1498Szrj 				    bool ref_p)
598*38fd1498Szrj {
599*38fd1498Szrj   stream_write_tree (ob, DECL_SIZE (expr), ref_p);
600*38fd1498Szrj   stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p);
601*38fd1498Szrj 
602*38fd1498Szrj   /* Note, DECL_INITIAL is not handled here.  Since DECL_INITIAL needs
603*38fd1498Szrj      special handling in LTO, it must be handled by streamer hooks.  */
604*38fd1498Szrj 
605*38fd1498Szrj   stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p);
606*38fd1498Szrj   stream_write_tree (ob, DECL_ABSTRACT_ORIGIN (expr), ref_p);
607*38fd1498Szrj 
608*38fd1498Szrj   if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
609*38fd1498Szrj       && DECL_HAS_VALUE_EXPR_P (expr))
610*38fd1498Szrj     stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p);
611*38fd1498Szrj 
612*38fd1498Szrj   if (VAR_P (expr)
613*38fd1498Szrj       && DECL_HAS_DEBUG_EXPR_P (expr))
614*38fd1498Szrj     stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p);
615*38fd1498Szrj }
616*38fd1498Szrj 
617*38fd1498Szrj 
618*38fd1498Szrj /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
619*38fd1498Szrj    EXPR to output block OB.  If REF_P is true, write a reference to EXPR's
620*38fd1498Szrj    pointer fields.  */
621*38fd1498Szrj 
622*38fd1498Szrj static void
623*38fd1498Szrj write_ts_decl_non_common_tree_pointers (struct output_block *ob, tree expr,
624*38fd1498Szrj 				        bool ref_p)
625*38fd1498Szrj {
626*38fd1498Szrj   if (TREE_CODE (expr) == TYPE_DECL)
627*38fd1498Szrj     stream_write_tree (ob, DECL_ORIGINAL_TYPE (expr), ref_p);
628*38fd1498Szrj }
629*38fd1498Szrj 
630*38fd1498Szrj 
631*38fd1498Szrj /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
632*38fd1498Szrj    to output block OB.  If REF_P is true, write a reference to EXPR's
633*38fd1498Szrj    pointer fields.  */
634*38fd1498Szrj 
635*38fd1498Szrj static void
636*38fd1498Szrj write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
637*38fd1498Szrj 			              bool ref_p)
638*38fd1498Szrj {
639*38fd1498Szrj   /* Make sure we don't inadvertently set the assembler name.  */
640*38fd1498Szrj   if (DECL_ASSEMBLER_NAME_SET_P (expr))
641*38fd1498Szrj     stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
642*38fd1498Szrj   else
643*38fd1498Szrj     stream_write_tree (ob, NULL_TREE, false);
644*38fd1498Szrj }
645*38fd1498Szrj 
646*38fd1498Szrj 
647*38fd1498Szrj /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
648*38fd1498Szrj    output block OB.  If REF_P is true, write a reference to EXPR's
649*38fd1498Szrj    pointer fields.  */
650*38fd1498Szrj 
651*38fd1498Szrj static void
652*38fd1498Szrj write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
653*38fd1498Szrj 				   bool ref_p)
654*38fd1498Szrj {
655*38fd1498Szrj   stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p);
656*38fd1498Szrj   stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
657*38fd1498Szrj   stream_write_tree (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr), ref_p);
658*38fd1498Szrj   stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
659*38fd1498Szrj   stream_write_tree (ob, DECL_FCONTEXT (expr), ref_p);
660*38fd1498Szrj }
661*38fd1498Szrj 
662*38fd1498Szrj 
663*38fd1498Szrj /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
664*38fd1498Szrj    to output block OB.  If REF_P is true, write a reference to EXPR's
665*38fd1498Szrj    pointer fields.  */
666*38fd1498Szrj 
667*38fd1498Szrj static void
668*38fd1498Szrj write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
669*38fd1498Szrj 				      bool ref_p)
670*38fd1498Szrj {
671*38fd1498Szrj   stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
672*38fd1498Szrj   /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  */
673*38fd1498Szrj   stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
674*38fd1498Szrj   /* Don't stream these when passing things to a different target.  */
675*38fd1498Szrj   if (!lto_stream_offload_p)
676*38fd1498Szrj     stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
677*38fd1498Szrj   stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
678*38fd1498Szrj }
679*38fd1498Szrj 
680*38fd1498Szrj 
681*38fd1498Szrj /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
682*38fd1498Szrj    output block OB.  If REF_P is true, write a reference to EXPR's
683*38fd1498Szrj    pointer fields.  */
684*38fd1498Szrj 
685*38fd1498Szrj static void
686*38fd1498Szrj write_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
687*38fd1498Szrj 				    bool ref_p)
688*38fd1498Szrj {
689*38fd1498Szrj   stream_write_tree (ob, TYPE_SIZE (expr), ref_p);
690*38fd1498Szrj   stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p);
691*38fd1498Szrj   stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p);
692*38fd1498Szrj   stream_write_tree (ob, TYPE_NAME (expr), ref_p);
693*38fd1498Szrj   /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO.  They will be
694*38fd1498Szrj      reconstructed during fixup.  */
695*38fd1498Szrj   /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
696*38fd1498Szrj      during fixup.  */
697*38fd1498Szrj   stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p);
698*38fd1498Szrj   stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p);
699*38fd1498Szrj   /* TYPE_CANONICAL is re-computed during type merging, so no need
700*38fd1498Szrj      to stream it here.  */
701*38fd1498Szrj   stream_write_tree (ob, TYPE_STUB_DECL (expr), ref_p);
702*38fd1498Szrj }
703*38fd1498Szrj 
704*38fd1498Szrj /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
705*38fd1498Szrj    to output block OB.  If REF_P is true, write a reference to EXPR's
706*38fd1498Szrj    pointer fields.  */
707*38fd1498Szrj 
708*38fd1498Szrj static void
709*38fd1498Szrj write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr,
710*38fd1498Szrj 					bool ref_p)
711*38fd1498Szrj {
712*38fd1498Szrj   if (TREE_CODE (expr) == ENUMERAL_TYPE)
713*38fd1498Szrj     stream_write_tree (ob, TYPE_VALUES (expr), ref_p);
714*38fd1498Szrj   else if (TREE_CODE (expr) == ARRAY_TYPE)
715*38fd1498Szrj     stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p);
716*38fd1498Szrj   else if (RECORD_OR_UNION_TYPE_P (expr))
717*38fd1498Szrj     streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p);
718*38fd1498Szrj   else if (TREE_CODE (expr) == FUNCTION_TYPE
719*38fd1498Szrj 	   || TREE_CODE (expr) == METHOD_TYPE)
720*38fd1498Szrj     stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p);
721*38fd1498Szrj 
722*38fd1498Szrj   if (!POINTER_TYPE_P (expr))
723*38fd1498Szrj     stream_write_tree (ob, TYPE_MIN_VALUE_RAW (expr), ref_p);
724*38fd1498Szrj   stream_write_tree (ob, TYPE_MAX_VALUE_RAW (expr), ref_p);
725*38fd1498Szrj }
726*38fd1498Szrj 
727*38fd1498Szrj 
728*38fd1498Szrj /* Write all pointer fields in the TS_LIST structure of EXPR to output
729*38fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
730*38fd1498Szrj    fields.  */
731*38fd1498Szrj 
732*38fd1498Szrj static void
733*38fd1498Szrj write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
734*38fd1498Szrj {
735*38fd1498Szrj   stream_write_tree (ob, TREE_PURPOSE (expr), ref_p);
736*38fd1498Szrj   stream_write_tree (ob, TREE_VALUE (expr), ref_p);
737*38fd1498Szrj   stream_write_tree (ob, TREE_CHAIN (expr), ref_p);
738*38fd1498Szrj }
739*38fd1498Szrj 
740*38fd1498Szrj 
741*38fd1498Szrj /* Write all pointer fields in the TS_VEC structure of EXPR to output
742*38fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
743*38fd1498Szrj    fields.  */
744*38fd1498Szrj 
745*38fd1498Szrj static void
746*38fd1498Szrj write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
747*38fd1498Szrj {
748*38fd1498Szrj   int i;
749*38fd1498Szrj 
750*38fd1498Szrj   /* Note that the number of slots for EXPR has already been emitted
751*38fd1498Szrj      in EXPR's header (see streamer_write_tree_header).  */
752*38fd1498Szrj   for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
753*38fd1498Szrj     stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p);
754*38fd1498Szrj }
755*38fd1498Szrj 
756*38fd1498Szrj 
757*38fd1498Szrj /* Write all pointer fields in the TS_EXP structure of EXPR to output
758*38fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
759*38fd1498Szrj    fields.  */
760*38fd1498Szrj 
761*38fd1498Szrj static void
762*38fd1498Szrj write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
763*38fd1498Szrj {
764*38fd1498Szrj   int i;
765*38fd1498Szrj 
766*38fd1498Szrj   for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
767*38fd1498Szrj     stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p);
768*38fd1498Szrj   stream_write_tree (ob, TREE_BLOCK (expr), ref_p);
769*38fd1498Szrj }
770*38fd1498Szrj 
771*38fd1498Szrj 
772*38fd1498Szrj /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
773*38fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
774*38fd1498Szrj    fields.  */
775*38fd1498Szrj 
776*38fd1498Szrj static void
777*38fd1498Szrj write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
778*38fd1498Szrj {
779*38fd1498Szrj   streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
780*38fd1498Szrj 
781*38fd1498Szrj   stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
782*38fd1498Szrj 
783*38fd1498Szrj   /* Stream BLOCK_ABSTRACT_ORIGIN for the limited cases we can handle - those
784*38fd1498Szrj      that represent inlined function scopes.
785*38fd1498Szrj      For the rest them on the floor instead of ICEing in dwarf2out.c, but
786*38fd1498Szrj      keep the notion of whether the block is an inlined block by refering
787*38fd1498Szrj      to itself for the sake of tree_nonartificial_location.  */
788*38fd1498Szrj   if (inlined_function_outer_scope_p (expr))
789*38fd1498Szrj     {
790*38fd1498Szrj       tree ultimate_origin = block_ultimate_origin (expr);
791*38fd1498Szrj       stream_write_tree (ob, ultimate_origin, ref_p);
792*38fd1498Szrj     }
793*38fd1498Szrj   else
794*38fd1498Szrj     stream_write_tree (ob, (BLOCK_ABSTRACT_ORIGIN (expr)
795*38fd1498Szrj 			    ? expr : NULL_TREE), ref_p);
796*38fd1498Szrj   /* Do not stream BLOCK_NONLOCALIZED_VARS.  We cannot handle debug information
797*38fd1498Szrj      for early inlined BLOCKs so drop it on the floor instead of ICEing in
798*38fd1498Szrj      dwarf2out.c.  */
799*38fd1498Szrj 
800*38fd1498Szrj   /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
801*38fd1498Szrj      streaming time.  */
802*38fd1498Szrj 
803*38fd1498Szrj   /* Do not output BLOCK_SUBBLOCKS.  Instead on streaming-in this
804*38fd1498Szrj      list is re-constructed from BLOCK_SUPERCONTEXT.  */
805*38fd1498Szrj }
806*38fd1498Szrj 
807*38fd1498Szrj 
808*38fd1498Szrj /* Write all pointer fields in the TS_BINFO structure of EXPR to output
809*38fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
810*38fd1498Szrj    fields.  */
811*38fd1498Szrj 
812*38fd1498Szrj static void
813*38fd1498Szrj write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
814*38fd1498Szrj {
815*38fd1498Szrj   unsigned i;
816*38fd1498Szrj   tree t;
817*38fd1498Szrj 
818*38fd1498Szrj   /* Note that the number of BINFO slots has already been emitted in
819*38fd1498Szrj      EXPR's header (see streamer_write_tree_header) because this length
820*38fd1498Szrj      is needed to build the empty BINFO node on the reader side.  */
821*38fd1498Szrj   FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
822*38fd1498Szrj     stream_write_tree (ob, t, ref_p);
823*38fd1498Szrj   stream_write_tree (ob, NULL_TREE, false);
824*38fd1498Szrj 
825*38fd1498Szrj   stream_write_tree (ob, BINFO_OFFSET (expr), ref_p);
826*38fd1498Szrj   stream_write_tree (ob, BINFO_VTABLE (expr), ref_p);
827*38fd1498Szrj   stream_write_tree (ob, BINFO_VPTR_FIELD (expr), ref_p);
828*38fd1498Szrj 
829*38fd1498Szrj   /* The number of BINFO_BASE_ACCESSES has already been emitted in
830*38fd1498Szrj      EXPR's bitfield section.  */
831*38fd1498Szrj   FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
832*38fd1498Szrj     stream_write_tree (ob, t, ref_p);
833*38fd1498Szrj 
834*38fd1498Szrj   /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
835*38fd1498Szrj      and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
836*38fd1498Szrj }
837*38fd1498Szrj 
838*38fd1498Szrj 
839*38fd1498Szrj /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
840*38fd1498Szrj    output block OB.  If REF_P is true, write a reference to EXPR's
841*38fd1498Szrj    pointer fields.  */
842*38fd1498Szrj 
843*38fd1498Szrj static void
844*38fd1498Szrj write_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
845*38fd1498Szrj 				    bool ref_p)
846*38fd1498Szrj {
847*38fd1498Szrj   unsigned i;
848*38fd1498Szrj   tree index, value;
849*38fd1498Szrj 
850*38fd1498Szrj   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
851*38fd1498Szrj     {
852*38fd1498Szrj       stream_write_tree (ob, index, ref_p);
853*38fd1498Szrj       stream_write_tree (ob, value, ref_p);
854*38fd1498Szrj     }
855*38fd1498Szrj }
856*38fd1498Szrj 
857*38fd1498Szrj 
858*38fd1498Szrj /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
859*38fd1498Szrj    to output block OB.  If REF_P is true, write a reference to EXPR's
860*38fd1498Szrj    pointer fields.  */
861*38fd1498Szrj 
862*38fd1498Szrj static void
863*38fd1498Szrj write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr,
864*38fd1498Szrj 				   bool ref_p)
865*38fd1498Szrj {
866*38fd1498Szrj   int i;
867*38fd1498Szrj   for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
868*38fd1498Szrj     stream_write_tree (ob, OMP_CLAUSE_OPERAND (expr, i), ref_p);
869*38fd1498Szrj   if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_REDUCTION)
870*38fd1498Szrj     {
871*38fd1498Szrj       /* We don't stream these right now, handle it if streaming
872*38fd1498Szrj 	 of them is needed.  */
873*38fd1498Szrj       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
874*38fd1498Szrj       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
875*38fd1498Szrj     }
876*38fd1498Szrj   stream_write_tree (ob, OMP_CLAUSE_CHAIN (expr), ref_p);
877*38fd1498Szrj }
878*38fd1498Szrj 
879*38fd1498Szrj 
880*38fd1498Szrj /* Write all pointer fields in EXPR to output block OB.  If REF_P is true,
881*38fd1498Szrj    the leaves of EXPR are emitted as references.  */
882*38fd1498Szrj 
883*38fd1498Szrj void
884*38fd1498Szrj streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
885*38fd1498Szrj {
886*38fd1498Szrj   enum tree_code code;
887*38fd1498Szrj 
888*38fd1498Szrj   lto_stats.num_tree_bodies_output++;
889*38fd1498Szrj 
890*38fd1498Szrj   code = TREE_CODE (expr);
891*38fd1498Szrj 
892*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
893*38fd1498Szrj     write_ts_common_tree_pointers (ob, expr, ref_p);
894*38fd1498Szrj 
895*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
896*38fd1498Szrj     write_ts_vector_tree_pointers (ob, expr, ref_p);
897*38fd1498Szrj 
898*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
899*38fd1498Szrj     write_ts_poly_tree_pointers (ob, expr, ref_p);
900*38fd1498Szrj 
901*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
902*38fd1498Szrj     write_ts_complex_tree_pointers (ob, expr, ref_p);
903*38fd1498Szrj 
904*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
905*38fd1498Szrj     write_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
906*38fd1498Szrj 
907*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
908*38fd1498Szrj     write_ts_decl_common_tree_pointers (ob, expr, ref_p);
909*38fd1498Szrj 
910*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
911*38fd1498Szrj     write_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
912*38fd1498Szrj 
913*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
914*38fd1498Szrj     write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
915*38fd1498Szrj 
916*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
917*38fd1498Szrj     write_ts_field_decl_tree_pointers (ob, expr, ref_p);
918*38fd1498Szrj 
919*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
920*38fd1498Szrj     write_ts_function_decl_tree_pointers (ob, expr, ref_p);
921*38fd1498Szrj 
922*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
923*38fd1498Szrj     write_ts_type_common_tree_pointers (ob, expr, ref_p);
924*38fd1498Szrj 
925*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
926*38fd1498Szrj     write_ts_type_non_common_tree_pointers (ob, expr, ref_p);
927*38fd1498Szrj 
928*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_LIST))
929*38fd1498Szrj     write_ts_list_tree_pointers (ob, expr, ref_p);
930*38fd1498Szrj 
931*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_VEC))
932*38fd1498Szrj     write_ts_vec_tree_pointers (ob, expr, ref_p);
933*38fd1498Szrj 
934*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
935*38fd1498Szrj     write_ts_exp_tree_pointers (ob, expr, ref_p);
936*38fd1498Szrj 
937*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
938*38fd1498Szrj     write_ts_block_tree_pointers (ob, expr, ref_p);
939*38fd1498Szrj 
940*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
941*38fd1498Szrj     write_ts_binfo_tree_pointers (ob, expr, ref_p);
942*38fd1498Szrj 
943*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
944*38fd1498Szrj     write_ts_constructor_tree_pointers (ob, expr, ref_p);
945*38fd1498Szrj 
946*38fd1498Szrj   if (code == OMP_CLAUSE)
947*38fd1498Szrj     write_ts_omp_clause_tree_pointers (ob, expr, ref_p);
948*38fd1498Szrj }
949*38fd1498Szrj 
950*38fd1498Szrj 
951*38fd1498Szrj /* Emit header information for tree EXPR to output block OB.  The header
952*38fd1498Szrj    contains everything needed to instantiate an empty skeleton for
953*38fd1498Szrj    EXPR on the reading side.  IX is the index into the streamer cache
954*38fd1498Szrj    where EXPR is stored.  */
955*38fd1498Szrj 
956*38fd1498Szrj void
957*38fd1498Szrj streamer_write_tree_header (struct output_block *ob, tree expr)
958*38fd1498Szrj {
959*38fd1498Szrj   enum LTO_tags tag;
960*38fd1498Szrj   enum tree_code code;
961*38fd1498Szrj 
962*38fd1498Szrj   /* We should not see any tree nodes not handled by the streamer.  */
963*38fd1498Szrj   code = TREE_CODE (expr);
964*38fd1498Szrj 
965*38fd1498Szrj   /* The header of a tree node consists of its tag, the size of
966*38fd1498Szrj      the node, and any other information needed to instantiate
967*38fd1498Szrj      EXPR on the reading side (such as the number of slots in
968*38fd1498Szrj      variable sized nodes).  */
969*38fd1498Szrj   tag = lto_tree_code_to_tag (code);
970*38fd1498Szrj   streamer_write_record_start (ob, tag);
971*38fd1498Szrj 
972*38fd1498Szrj   /* The text in strings and identifiers are completely emitted in
973*38fd1498Szrj      the header.  */
974*38fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_STRING))
975*38fd1498Szrj     streamer_write_string_cst (ob, ob->main_stream, expr);
976*38fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
977*38fd1498Szrj     write_identifier (ob, ob->main_stream, expr);
978*38fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
979*38fd1498Szrj     {
980*38fd1498Szrj       bitpack_d bp = bitpack_create (ob->main_stream);
981*38fd1498Szrj       bp_pack_value (&bp, VECTOR_CST_LOG2_NPATTERNS (expr), 8);
982*38fd1498Szrj       bp_pack_value (&bp, VECTOR_CST_NELTS_PER_PATTERN (expr), 8);
983*38fd1498Szrj       streamer_write_bitpack (&bp);
984*38fd1498Szrj     }
985*38fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
986*38fd1498Szrj     streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
987*38fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
988*38fd1498Szrj     streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
989*38fd1498Szrj   else if (TREE_CODE (expr) == CALL_EXPR)
990*38fd1498Szrj     streamer_write_uhwi (ob, call_expr_nargs (expr));
991*38fd1498Szrj   else if (TREE_CODE (expr) == OMP_CLAUSE)
992*38fd1498Szrj     streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
993*38fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
994*38fd1498Szrj     {
995*38fd1498Szrj       gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
996*38fd1498Szrj       streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
997*38fd1498Szrj       streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
998*38fd1498Szrj     }
999*38fd1498Szrj }
1000*38fd1498Szrj 
1001*38fd1498Szrj 
1002*38fd1498Szrj /* Emit the integer constant CST to output block OB.  If REF_P is true,
1003*38fd1498Szrj    CST's type will be emitted as a reference.  */
1004*38fd1498Szrj 
1005*38fd1498Szrj void
1006*38fd1498Szrj streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p)
1007*38fd1498Szrj {
1008*38fd1498Szrj   int i;
1009*38fd1498Szrj   int len = TREE_INT_CST_NUNITS (cst);
1010*38fd1498Szrj   gcc_assert (!TREE_OVERFLOW (cst));
1011*38fd1498Szrj   streamer_write_record_start (ob, LTO_integer_cst);
1012*38fd1498Szrj   stream_write_tree (ob, TREE_TYPE (cst), ref_p);
1013*38fd1498Szrj   /* We're effectively streaming a non-sign-extended wide_int here,
1014*38fd1498Szrj      so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
1015*38fd1498Szrj      array members beyond LEN.  We'll recreate the tree from the
1016*38fd1498Szrj      wide_int and the type.  */
1017*38fd1498Szrj   streamer_write_uhwi (ob, len);
1018*38fd1498Szrj   for (i = 0; i < len; i++)
1019*38fd1498Szrj     streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));
1020*38fd1498Szrj }
1021