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