blob: 1a43534d11782026e18899c1ab368b10e7a5da7e [file] [log] [blame]
Diego Novillof0efc7a2011-08-08 12:49:34 -04001/* Routines for emitting trees to a file stream.
2
Jakub Jelinek99dee822021-01-04 10:26:59 +01003 Copyright (C) 2011-2021 Free Software Foundation, Inc.
Diego Novillof0efc7a2011-08-08 12:49:34 -04004 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"
Andrew MacLeodc7131fb2015-07-08 00:53:03 +000025#include "backend.h"
Andrew MacLeod957060b2015-10-29 13:57:32 +000026#include "target.h"
Andrew MacLeodc7131fb2015-07-08 00:53:03 +000027#include "tree.h"
28#include "gimple.h"
Andrew MacLeod957060b2015-10-29 13:57:32 +000029#include "tree-streamer.h"
30#include "cgraph.h"
Michael Collison40e23962015-01-09 20:18:42 +000031#include "alias.h"
Michael Collison40e23962015-01-09 20:18:42 +000032#include "stor-layout.h"
Thomas Schwinge41dbbb32015-01-15 21:11:12 +010033#include "gomp-constants.h"
Jan Hubicka0896cc42020-05-22 15:44:10 +020034#include "print-tree.h"
Thomas Schwinge41dbbb32015-01-15 21:11:12 +010035
Diego Novillof0efc7a2011-08-08 12:49:34 -040036
37/* Output the STRING constant to the string
38 table in OB. Then put the index onto the INDEX_STREAM. */
39
Jan Beulich49f836b2011-09-30 14:56:01 +000040void
41streamer_write_string_cst (struct output_block *ob,
42 struct lto_output_stream *index_stream,
43 tree string)
Diego Novillof0efc7a2011-08-08 12:49:34 -040044{
Diego Novillo412288f2011-08-12 12:42:13 -040045 streamer_write_string_with_length (ob, index_stream,
Jan Beulich49f836b2011-09-30 14:56:01 +000046 string ? TREE_STRING_POINTER (string)
47 : NULL,
48 string ? TREE_STRING_LENGTH (string) : 0,
Diego Novillo412288f2011-08-12 12:42:13 -040049 true);
Diego Novillof0efc7a2011-08-08 12:49:34 -040050}
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
Diego Novillo412288f2011-08-12 12:42:13 -040057write_identifier (struct output_block *ob,
Diego Novillof0efc7a2011-08-08 12:49:34 -040058 struct lto_output_stream *index_stream,
59 tree id)
60{
Diego Novillo412288f2011-08-12 12:42:13 -040061 streamer_write_string_with_length (ob, index_stream,
62 IDENTIFIER_POINTER (id),
63 IDENTIFIER_LENGTH (id),
64 true);
Diego Novillof0efc7a2011-08-08 12:49:34 -040065}
66
67
68/* Pack all the non-pointer fields of the TS_BASE structure of
69 expression EXPR into bitpack BP. */
70
Richard Bienerb6bf2012015-02-09 13:18:15 +000071static inline void
Diego Novillof0efc7a2011-08-08 12:49:34 -040072pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
73{
Jan Hubickaa746f952020-05-25 14:41:33 +020074 if (streamer_debugging)
75 bp_pack_value (bp, TREE_CODE (expr), 16);
Diego Novillof0efc7a2011-08-08 12:49:34 -040076 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))
Richard Biener02ef53f2016-01-25 09:31:47 +000092 {
93 bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
94 bp_pack_value (bp, DECL_NAMELESS (expr), 1);
95 }
Diego Novillof0efc7a2011-08-08 12:49:34 -040096 else if (TYPE_P (expr))
97 bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
98 else
99 bp_pack_value (bp, 0, 1);
Richard Bienera367df52013-06-05 08:21:02 +0000100 /* 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
Richard Guentherca814622011-12-15 12:43:48 +0000103 ? 0 : TREE_ASM_WRITTEN (expr)), 1);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400104 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);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400108 bp_pack_value (bp, TREE_NOTHROW (expr), 1);
109 bp_pack_value (bp, TREE_STATIC (expr), 1);
Richard Bieneree03e712013-06-17 15:08:24 +0000110 if (TREE_CODE (expr) != TREE_BINFO)
111 bp_pack_value (bp, TREE_PRIVATE (expr), 1);
Richard Bienerb6bf2012015-02-09 13:18:15 +0000112 else
113 bp_pack_value (bp, 0, 1);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400114 bp_pack_value (bp, TREE_PROTECTED (expr), 1);
115 bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
116 if (TYPE_P (expr))
Diego Novillo875b35b2011-10-31 10:03:32 -0400117 {
Eric Botcazouee45a322015-11-08 18:33:42 +0000118 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);
Diego Novillo875b35b2011-10-31 10:03:32 -0400122 bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8);
123 }
Eric Botcazouee45a322015-11-08 18:33:42 +0000124 else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
Eric Botcazou7b95c722015-11-09 12:14:07 +0000125 {
126 bp_pack_value (bp, REF_REVERSE_STORAGE_ORDER (expr), 1);
127 bp_pack_value (bp, 0, 8);
128 }
Diego Novillof0efc7a2011-08-08 12:49:34 -0400129 else if (TREE_CODE (expr) == SSA_NAME)
Richard Bienerb6bf2012015-02-09 13:18:15 +0000130 {
131 bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
132 bp_pack_value (bp, 0, 8);
133 }
Richard Biener7f29daf2018-11-22 09:54:14 +0000134 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 }
Diego Novillof0efc7a2011-08-08 12:49:34 -0400139 else
Richard Bienerb6bf2012015-02-09 13:18:15 +0000140 bp_pack_value (bp, 0, 9);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400141}
142
143
Richard Guentherc61f8c32012-10-18 10:59:55 +0000144/* 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{
Kenneth Zadeck807e9022014-05-06 16:25:05 +0000150 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));
Richard Guentherc61f8c32012-10-18 10:59:55 +0000155}
156
157
Diego Novillof0efc7a2011-08-08 12:49:34 -0400158/* 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);
Jakub Jelinekdb847fa2015-02-26 13:26:11 +0100186 bp_pack_machine_mode (bp, fv.mode);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400187 bp_pack_var_len_int (bp, fv.data.low);
188 bp_pack_var_len_int (bp, fv.data.high);
189}
190
Diego Novillof0efc7a2011-08-08 12:49:34 -0400191/* 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{
Jakub Jelinekdb847fa2015-02-26 13:26:11 +0100197 bp_pack_machine_mode (bp, DECL_MODE (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400198 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);
Aldy Hernandez00de3282014-09-24 19:50:24 +0000201 bp_pack_value (bp, DECL_ABSTRACT_P (expr), 1);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400202 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);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400205 bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
Richard Bienereb72dc62020-04-22 10:40:51 +0200206 bp_pack_value (bp, DECL_NOT_GIMPLE_REG_P (expr), 1);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400207 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. */
Diego Novillof0efc7a2011-08-08 12:49:34 -0400214 bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
215 }
216
Jakub Jelinek4b8e35f2019-05-16 11:37:43 +0200217 else if (TREE_CODE (expr) == FIELD_DECL)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400218 {
219 bp_pack_value (bp, DECL_PACKED (expr), 1);
220 bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
Marek Polacek974aedc2017-11-22 16:06:18 +0000221 bp_pack_value (bp, DECL_PADDING_P (expr), 1);
Jakub Jelinek575ac272020-04-29 09:01:49 +0200222 bp_pack_value (bp, DECL_FIELD_ABI_IGNORED (expr), 1);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400223 bp_pack_value (bp, expr->decl_common.off_align, 8);
224 }
225
Jakub Jelinek4b8e35f2019-05-16 11:37:43 +0200226 else if (VAR_P (expr))
Richard Biener839b4222013-03-21 11:53:39 +0000227 {
228 bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
229 bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
230 }
Eric Botcazou0f1e8842012-10-02 10:00:32 +0000231
Jakub Jelinek4b8e35f2019-05-16 11:37:43 +0200232 else if (TREE_CODE (expr) == PARM_DECL)
233 bp_pack_value (bp, DECL_HIDDEN_STRING_LENGTH (expr), 1);
234
Diego Novillof0efc7a2011-08-08 12:49:34 -0400235 if (TREE_CODE (expr) == RESULT_DECL
236 || TREE_CODE (expr) == PARM_DECL
Jakub Jelinek8813a642016-10-09 13:19:48 +0200237 || VAR_P (expr))
Diego Novillof0efc7a2011-08-08 12:49:34 -0400238 {
239 bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
Jakub Jelinek8813a642016-10-09 13:19:48 +0200240 if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400241 bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400242 }
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{
Diego Novillof0efc7a2011-08-08 12:49:34 -0400262 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
Jakub Jelinek8813a642016-10-09 13:19:48 +0200270 if (VAR_P (expr))
Diego Novillof0efc7a2011-08-08 12:49:34 -0400271 {
272 bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
Jan Hubickac01c1112013-08-28 17:03:43 +0200273 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
Diego Novillof0efc7a2011-08-08 12:49:34 -0400274 bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400275 }
276
Jan Hubicka0170f332013-08-29 18:23:40 +0200277 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 }
Diego Novillof0efc7a2011-08-08 12:49:34 -0400283}
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{
Diego Novillof0efc7a2011-08-08 12:49:34 -0400292 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);
Martin Liskacb507012019-07-25 11:36:19 +0200301 bp_pack_value (bp, DECL_IS_OPERATOR_NEW_P (expr), 1);
Martin Liska6343b6b2019-07-25 11:36:38 +0200302 bp_pack_value (bp, DECL_IS_OPERATOR_DELETE_P (expr), 1);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400303 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);
Martin Liska70df40c2020-04-08 17:16:55 +0200311 bp_pack_value (bp, DECL_IS_REPLACEABLE_OPERATOR (expr), 1);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400312 if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
Richard Sandiford4d732402019-08-13 21:35:20 +0000313 bp_pack_value (bp, DECL_UNCHECKED_FUNCTION_CODE (expr), 32);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400314}
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{
Christian Bruelb52b9882015-12-17 14:56:05 +0100323 /* 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));
Jan Hubicka351d90f2015-06-15 01:40:12 +0200327 /* TYPE_NO_FORCE_BLK is private to stor-layout and need
328 no streaming. */
Jan Hubickaba6a6a12015-11-24 21:35:16 +0100329 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);
Richard Biener7e601a12019-10-15 18:30:15 +0000333 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);
Jan Hubicka8c862482015-12-01 20:13:12 +0100339 /* 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,
Jakub Jelinek56aae4b2016-03-08 18:49:34 +0100341 because TYPE_ALIAS_SET == 0 was regularly lost in type merging. */
Diego Novillof0efc7a2011-08-08 12:49:34 -0400342 if (RECORD_OR_UNION_TYPE_P (expr))
Jan Hubicka0170f332013-08-29 18:23:40 +0200343 {
344 bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
345 bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
Jan Hubicka18dd2952020-11-17 15:38:13 +0100346 /* alias_ptr_types_compatible_p relies on fact that during LTO
347 types do not get refined from WPA time to ltrans. */
348 bp_pack_value (bp, flag_wpa && TYPE_CANONICAL (expr)
349 ? TYPE_CXX_ODR_P (TYPE_CANONICAL (expr))
350 : TYPE_CXX_ODR_P (expr), 1);
Jan Hubicka0170f332013-08-29 18:23:40 +0200351 }
Eric Botcazou04208222012-09-24 10:27:18 +0000352 else if (TREE_CODE (expr) == ARRAY_TYPE)
353 bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
Jan Hubickaf4af4012019-06-24 23:13:12 +0200354 if (TREE_CODE (expr) == ARRAY_TYPE || TREE_CODE (expr) == INTEGER_TYPE)
355 bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
Richard Biener350792f2017-04-12 07:35:49 +0000356 if (AGGREGATE_TYPE_P (expr))
357 bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1);
Marek Polacek974aedc2017-11-22 16:06:18 +0000358 bp_pack_value (bp, TYPE_EMPTY_P (expr), 1);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400359 bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
360 bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400361}
362
363
364/* Pack all the non-pointer fields of the TS_BLOCK structure
365 of expression EXPR into bitpack BP. */
366
367static void
Richard Biener7cb7d202012-10-10 14:27:59 +0000368pack_ts_block_value_fields (struct output_block *ob,
369 struct bitpack_d *bp, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400370{
Diego Novillof0efc7a2011-08-08 12:49:34 -0400371 /* BLOCK_NUMBER is recomputed. */
Richard Biener7cb7d202012-10-10 14:27:59 +0000372 /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
373 that represent inlined function scopes.
374 For the rest them on the floor instead of ICEing in dwarf2out.c. */
375 if (inlined_function_outer_scope_p (expr))
376 stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
377 else
378 stream_output_location (ob, bp, UNKNOWN_LOCATION);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400379}
380
381/* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
382 of expression EXPR into bitpack BP. */
383
384static void
Richard Biener8135e1e2012-10-15 14:22:37 +0000385pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
386 struct bitpack_d *bp, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400387{
Richard Biener8135e1e2012-10-15 14:22:37 +0000388 bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400389}
390
Diego Novillo412288f2011-08-12 12:42:13 -0400391
Jakub Jelinekc193f582013-11-29 11:36:10 +0100392/* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
393 of expression EXPR into bitpack BP. */
394
395static void
396pack_ts_omp_clause_value_fields (struct output_block *ob,
397 struct bitpack_d *bp, tree expr)
398{
399 stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
400 switch (OMP_CLAUSE_CODE (expr))
401 {
402 case OMP_CLAUSE_DEFAULT:
403 bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
404 OMP_CLAUSE_DEFAULT_KIND (expr));
405 break;
406 case OMP_CLAUSE_SCHEDULE:
407 bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
408 OMP_CLAUSE_SCHEDULE_KIND (expr));
409 break;
410 case OMP_CLAUSE_DEPEND:
411 bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
412 OMP_CLAUSE_DEPEND_KIND (expr));
413 break;
414 case OMP_CLAUSE_MAP:
Thomas Schwinge41dbbb32015-01-15 21:11:12 +0100415 bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
Jakub Jelinekc193f582013-11-29 11:36:10 +0100416 OMP_CLAUSE_MAP_KIND (expr));
417 break;
418 case OMP_CLAUSE_PROC_BIND:
419 bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
420 OMP_CLAUSE_PROC_BIND_KIND (expr));
421 break;
422 case OMP_CLAUSE_REDUCTION:
Jakub Jelinek28567c42018-11-08 18:13:04 +0100423 case OMP_CLAUSE_TASK_REDUCTION:
424 case OMP_CLAUSE_IN_REDUCTION:
Jakub Jelinekc193f582013-11-29 11:36:10 +0100425 bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
426 OMP_CLAUSE_REDUCTION_CODE (expr));
427 break;
428 default:
429 break;
430 }
431}
432
433
Diego Novillo412288f2011-08-12 12:42:13 -0400434/* Pack all the bitfields in EXPR into a bit pack. */
Diego Novillof0efc7a2011-08-08 12:49:34 -0400435
Diego Novillob9393652011-08-11 08:02:34 -0400436void
Richard Bienerb6bf2012015-02-09 13:18:15 +0000437streamer_write_tree_bitfields (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400438{
Richard Bienerb6bf2012015-02-09 13:18:15 +0000439 bitpack_d bp = bitpack_create (ob->main_stream);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400440 enum tree_code code;
441
442 code = TREE_CODE (expr);
443
444 /* Note that all these functions are highly sensitive to changes in
445 the types and sizes of each of the fields being packed. */
Richard Bienerb6bf2012015-02-09 13:18:15 +0000446 pack_ts_base_value_fields (&bp, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400447
Richard Guentherc61f8c32012-10-18 10:59:55 +0000448 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000449 pack_ts_int_cst_value_fields (&bp, expr);
Richard Guentherc61f8c32012-10-18 10:59:55 +0000450
Diego Novillof0efc7a2011-08-08 12:49:34 -0400451 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000452 pack_ts_real_cst_value_fields (&bp, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400453
454 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000455 pack_ts_fixed_cst_value_fields (&bp, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400456
Richard Biener7cb7d202012-10-10 14:27:59 +0000457 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000458 stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr));
Richard Biener7cb7d202012-10-10 14:27:59 +0000459
Diego Novillof0efc7a2011-08-08 12:49:34 -0400460 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000461 pack_ts_decl_common_value_fields (&bp, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400462
463 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000464 pack_ts_decl_wrtl_value_fields (&bp, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400465
466 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000467 pack_ts_decl_with_vis_value_fields (&bp, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400468
469 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000470 pack_ts_function_decl_value_fields (&bp, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400471
472 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000473 pack_ts_type_common_value_fields (&bp, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400474
Richard Biener7cb7d202012-10-10 14:27:59 +0000475 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
Richard Bienerf3dccf52014-11-24 09:24:26 +0000476 {
Richard Bienerb6bf2012015-02-09 13:18:15 +0000477 stream_output_location (ob, &bp, EXPR_LOCATION (expr));
Richard Bienerf3dccf52014-11-24 09:24:26 +0000478 if (code == MEM_REF
479 || code == TARGET_MEM_REF)
480 {
Richard Bienerb6bf2012015-02-09 13:18:15 +0000481 bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
Richard Bienerf3dccf52014-11-24 09:24:26 +0000482 if (MR_DEPENDENCE_CLIQUE (expr) != 0)
Richard Bienerb6bf2012015-02-09 13:18:15 +0000483 bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
Richard Bienerf3dccf52014-11-24 09:24:26 +0000484 }
Richard Biener7f29daf2018-11-22 09:54:14 +0000485 else if (code == CALL_EXPR)
486 bp_pack_enum (&bp, internal_fn, IFN_LAST, CALL_EXPR_IFN (expr));
Richard Bienerf3dccf52014-11-24 09:24:26 +0000487 }
Richard Biener7cb7d202012-10-10 14:27:59 +0000488
Diego Novillof0efc7a2011-08-08 12:49:34 -0400489 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000490 pack_ts_block_value_fields (ob, &bp, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400491
492 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000493 pack_ts_translation_unit_decl_value_fields (ob, &bp, expr);
Richard Biener0889c5c2012-10-12 12:14:48 +0000494
Richard Biener0889c5c2012-10-12 12:14:48 +0000495 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
Martin Liskac518c102018-07-04 07:51:08 +0000496 cl_optimization_stream_out (ob, &bp, TREE_OPTIMIZATION (expr));
Richard Guenther0127aae2012-10-15 10:39:59 +0000497
Richard Guenther0127aae2012-10-15 10:39:59 +0000498 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
Richard Bienerb6bf2012015-02-09 13:18:15 +0000499 bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr));
Jakub Jelinekc193f582013-11-29 11:36:10 +0100500
Bernd Schmidt1b34e6e2015-01-09 21:38:00 +0000501 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
502 /* Don't stream these when passing things to a different target. */
503 && !lto_stream_offload_p)
Richard Bienerb6bf2012015-02-09 13:18:15 +0000504 cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr));
Jan Hubicka54e774c2014-11-14 16:47:53 +0100505
Jakub Jelinekc193f582013-11-29 11:36:10 +0100506 if (code == OMP_CLAUSE)
Richard Bienerb6bf2012015-02-09 13:18:15 +0000507 pack_ts_omp_clause_value_fields (ob, &bp, expr);
508
509 streamer_write_bitpack (&bp);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400510}
511
512
Diego Novillof0efc7a2011-08-08 12:49:34 -0400513/* Emit the chain of tree nodes starting at T. OB is the output block
514 to write to. REF_P is true if chain elements should be emitted
515 as references. */
516
Jan Hubicka33e23882020-05-29 22:41:11 +0200517static void
518streamer_write_chain (struct output_block *ob, tree t)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400519{
Richard Guenther0127aae2012-10-15 10:39:59 +0000520 while (t)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400521 {
Richard Guenther2e537cd2011-12-15 09:44:11 +0000522 /* We avoid outputting external vars or functions by reference
523 to the global decls section as we do not want to have them
Jan Hubicka69e02b32018-07-11 18:38:27 +0200524 enter decl merging. We should not need to do this anymore because
525 free_lang_data removes them from block scopes. */
526 gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
Jan Hubicka33e23882020-05-29 22:41:11 +0200527 stream_write_tree_ref (ob, t);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400528
Diego Novillof0efc7a2011-08-08 12:49:34 -0400529 t = TREE_CHAIN (t);
530 }
Richard Guenther0127aae2012-10-15 10:39:59 +0000531
532 /* Write a sentinel to terminate the chain. */
Jan Hubicka33e23882020-05-29 22:41:11 +0200533 stream_write_tree_ref (ob, NULL_TREE);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400534}
535
536
537/* Write all pointer fields in the TS_COMMON structure of EXPR to output
538 block OB. If REF_P is true, write a reference to EXPR's pointer
539 fields. */
540
541static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200542write_ts_common_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400543{
544 if (TREE_CODE (expr) != IDENTIFIER_NODE)
Jan Hubicka33e23882020-05-29 22:41:11 +0200545 stream_write_tree_ref (ob, TREE_TYPE (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400546}
547
548
549/* Write all pointer fields in the TS_VECTOR structure of EXPR to output
550 block OB. If REF_P is true, write a reference to EXPR's pointer
551 fields. */
552
553static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200554write_ts_vector_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400555{
Richard Guentherd2a12ae2012-03-16 09:47:09 +0000556 /* Note that the number of elements for EXPR has already been emitted
557 in EXPR's header (see streamer_write_tree_header). */
Richard Sandiford734914b2017-12-07 18:40:28 +0000558 unsigned int count = vector_cst_encoded_nelts (expr);
559 for (unsigned int i = 0; i < count; ++i)
Jan Hubicka33e23882020-05-29 22:41:11 +0200560 stream_write_tree_ref (ob, VECTOR_CST_ENCODED_ELT (expr, i));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400561}
562
563
Richard Sandiford36fd6402017-12-20 12:51:50 +0000564/* Write all pointer fields in the TS_POLY_INT_CST structure of EXPR to
565 output block OB. If REF_P is true, write a reference to EXPR's pointer
566 fields. */
567
568static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200569write_ts_poly_tree_pointers (struct output_block *ob, tree expr)
Richard Sandiford36fd6402017-12-20 12:51:50 +0000570{
571 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
Jan Hubicka33e23882020-05-29 22:41:11 +0200572 stream_write_tree_ref (ob, POLY_INT_CST_COEFF (expr, i));
Richard Sandiford36fd6402017-12-20 12:51:50 +0000573}
574
575
Diego Novillof0efc7a2011-08-08 12:49:34 -0400576/* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
577 block OB. If REF_P is true, write a reference to EXPR's pointer
578 fields. */
579
580static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200581write_ts_complex_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400582{
Jan Hubicka33e23882020-05-29 22:41:11 +0200583 stream_write_tree_ref (ob, TREE_REALPART (expr));
584 stream_write_tree_ref (ob, TREE_IMAGPART (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400585}
586
587
588/* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
589 to output block OB. If REF_P is true, write a reference to EXPR's
590 pointer fields. */
591
592static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200593write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400594{
Richard Bieneree03e712013-06-17 15:08:24 +0000595 /* Drop names that were created for anonymous entities. */
596 if (DECL_NAME (expr)
597 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
Nathan Sidwell7daef9a2019-05-28 13:31:16 +0000598 && IDENTIFIER_ANON_P (DECL_NAME (expr)))
Jan Hubicka33e23882020-05-29 22:41:11 +0200599 stream_write_tree_ref (ob, NULL_TREE);
Richard Bieneree03e712013-06-17 15:08:24 +0000600 else
Jan Hubicka33e23882020-05-29 22:41:11 +0200601 stream_write_tree_ref (ob, DECL_NAME (expr));
Richard Biener1ea85362017-08-21 10:29:00 +0000602 if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
603 && ! DECL_CONTEXT (expr))
Jan Hubicka33e23882020-05-29 22:41:11 +0200604 stream_write_tree_ref (ob, (*all_translation_units)[0]);
Richard Biener1ea85362017-08-21 10:29:00 +0000605 else
Jan Hubicka33e23882020-05-29 22:41:11 +0200606 stream_write_tree_ref (ob, DECL_CONTEXT (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400607}
608
609
610/* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
611 output block OB. If REF_P is true, write a reference to EXPR's
612 pointer fields. */
613
614static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200615write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400616{
Jan Hubicka33e23882020-05-29 22:41:11 +0200617 stream_write_tree_ref (ob, DECL_SIZE (expr));
618 stream_write_tree_ref (ob, DECL_SIZE_UNIT (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400619
620 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
621 special handling in LTO, it must be handled by streamer hooks. */
622
Jan Hubicka33e23882020-05-29 22:41:11 +0200623 stream_write_tree_ref (ob, DECL_ATTRIBUTES (expr));
Richard Biener0e2eb6a2019-01-24 12:36:14 +0000624
625 /* On non-early-LTO enabled targets we claim we compiled with -g0
626 but dwarf2out still did its set_decl_origin_self game fooling
627 itself late. Und that here since we won't have access to the
628 early generated abstract DIEs. */
629 tree ao = DECL_ABSTRACT_ORIGIN (expr);
630 if (debug_info_level == DINFO_LEVEL_NONE
631 && ao == expr)
632 ao = NULL_TREE;
Jan Hubicka33e23882020-05-29 22:41:11 +0200633 stream_write_tree_ref (ob, ao);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400634
Jakub Jelinek8813a642016-10-09 13:19:48 +0200635 if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400636 && DECL_HAS_VALUE_EXPR_P (expr))
Jan Hubicka33e23882020-05-29 22:41:11 +0200637 stream_write_tree_ref (ob, DECL_VALUE_EXPR (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400638
Richard Bienerc1a7ca72018-01-12 08:22:16 +0000639 if (VAR_P (expr)
640 && DECL_HAS_DEBUG_EXPR_P (expr))
Jan Hubicka33e23882020-05-29 22:41:11 +0200641 stream_write_tree_ref (ob, DECL_DEBUG_EXPR (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400642}
643
644
645/* Write all pointer fields in the TS_DECL_NON_COMMON structure of
646 EXPR to output block OB. If REF_P is true, write a reference to EXPR's
647 pointer fields. */
648
649static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200650write_ts_decl_non_common_tree_pointers (struct output_block *, tree)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400651{
Diego Novillof0efc7a2011-08-08 12:49:34 -0400652}
653
654
655/* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
656 to output block OB. If REF_P is true, write a reference to EXPR's
657 pointer fields. */
658
659static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200660write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400661{
662 /* Make sure we don't inadvertently set the assembler name. */
663 if (DECL_ASSEMBLER_NAME_SET_P (expr))
Jan Hubicka33e23882020-05-29 22:41:11 +0200664 stream_write_tree_ref (ob, DECL_ASSEMBLER_NAME (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400665 else
Jan Hubicka33e23882020-05-29 22:41:11 +0200666 stream_write_tree_ref (ob, NULL_TREE);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400667}
668
669
670/* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
671 output block OB. If REF_P is true, write a reference to EXPR's
672 pointer fields. */
673
674static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200675write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400676{
Jan Hubicka33e23882020-05-29 22:41:11 +0200677 stream_write_tree_ref (ob, DECL_FIELD_OFFSET (expr));
678 stream_write_tree_ref (ob, DECL_BIT_FIELD_TYPE (expr));
679 stream_write_tree_ref (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr));
680 stream_write_tree_ref (ob, DECL_FIELD_BIT_OFFSET (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400681}
682
683
684/* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
685 to output block OB. If REF_P is true, write a reference to EXPR's
686 pointer fields. */
687
688static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200689write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400690{
Jan Hubicka61204ad2014-11-19 21:35:49 +0100691 /* DECL_STRUCT_FUNCTION is handled by lto_output_function. */
Jan Hubicka33e23882020-05-29 22:41:11 +0200692 stream_write_tree_ref (ob, DECL_FUNCTION_PERSONALITY (expr));
Bernd Schmidt1b34e6e2015-01-09 21:38:00 +0000693 /* Don't stream these when passing things to a different target. */
694 if (!lto_stream_offload_p)
Jan Hubicka33e23882020-05-29 22:41:11 +0200695 stream_write_tree_ref (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr));
696 stream_write_tree_ref (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400697}
698
699
700/* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
701 output block OB. If REF_P is true, write a reference to EXPR's
702 pointer fields. */
703
704static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200705write_ts_type_common_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400706{
Jan Hubicka33e23882020-05-29 22:41:11 +0200707 stream_write_tree_ref (ob, TYPE_SIZE (expr));
708 stream_write_tree_ref (ob, TYPE_SIZE_UNIT (expr));
709 stream_write_tree_ref (ob, TYPE_ATTRIBUTES (expr));
710 stream_write_tree_ref (ob, TYPE_NAME (expr));
Jan Hubicka010f4e22014-07-01 00:18:25 +0200711 /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
712 reconstructed during fixup. */
Diego Novillof0efc7a2011-08-08 12:49:34 -0400713 /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
714 during fixup. */
Jan Hubicka33e23882020-05-29 22:41:11 +0200715 stream_write_tree_ref (ob, TYPE_MAIN_VARIANT (expr));
716 stream_write_tree_ref (ob, TYPE_CONTEXT (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400717 /* TYPE_CANONICAL is re-computed during type merging, so no need
718 to stream it here. */
Jan Hubicka2ebbdb62018-08-30 17:05:38 +0200719 /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently
Sandra Loosemore67914692019-01-09 16:37:45 -0500720 it cannot be freed by free_lang_data without triggering ICEs in
Jan Hubicka2ebbdb62018-08-30 17:05:38 +0200721 langhooks. */
Diego Novillof0efc7a2011-08-08 12:49:34 -0400722}
723
724/* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
725 to output block OB. If REF_P is true, write a reference to EXPR's
726 pointer fields. */
727
728static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200729write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400730{
Jan Hubicka3fb68f22020-06-03 21:16:43 +0200731 if (TREE_CODE (expr) == ARRAY_TYPE)
Jan Hubicka33e23882020-05-29 22:41:11 +0200732 stream_write_tree_ref (ob, TYPE_DOMAIN (expr));
Jan Hubicka010f4e22014-07-01 00:18:25 +0200733 else if (RECORD_OR_UNION_TYPE_P (expr))
Jan Hubicka33e23882020-05-29 22:41:11 +0200734 streamer_write_chain (ob, TYPE_FIELDS (expr));
Jan Hubicka010f4e22014-07-01 00:18:25 +0200735 else if (TREE_CODE (expr) == FUNCTION_TYPE
736 || TREE_CODE (expr) == METHOD_TYPE)
Jan Hubicka33e23882020-05-29 22:41:11 +0200737 stream_write_tree_ref (ob, TYPE_ARG_TYPES (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400738
Jan Hubicka010f4e22014-07-01 00:18:25 +0200739 if (!POINTER_TYPE_P (expr))
Jan Hubicka33e23882020-05-29 22:41:11 +0200740 stream_write_tree_ref (ob, TYPE_MIN_VALUE_RAW (expr));
741 stream_write_tree_ref (ob, TYPE_MAX_VALUE_RAW (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400742}
743
744
745/* Write all pointer fields in the TS_LIST structure of EXPR to output
746 block OB. If REF_P is true, write a reference to EXPR's pointer
747 fields. */
748
749static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200750write_ts_list_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400751{
Jan Hubicka33e23882020-05-29 22:41:11 +0200752 stream_write_tree_ref (ob, TREE_PURPOSE (expr));
753 stream_write_tree_ref (ob, TREE_VALUE (expr));
754 stream_write_tree_ref (ob, TREE_CHAIN (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400755}
756
757
758/* Write all pointer fields in the TS_VEC structure of EXPR to output
759 block OB. If REF_P is true, write a reference to EXPR's pointer
760 fields. */
761
762static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200763write_ts_vec_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400764{
765 int i;
766
767 /* Note that the number of slots for EXPR has already been emitted
Diego Novillo412288f2011-08-12 12:42:13 -0400768 in EXPR's header (see streamer_write_tree_header). */
Diego Novillof0efc7a2011-08-08 12:49:34 -0400769 for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
Jan Hubicka33e23882020-05-29 22:41:11 +0200770 stream_write_tree_ref (ob, TREE_VEC_ELT (expr, i));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400771}
772
773
774/* Write all pointer fields in the TS_EXP structure of EXPR to output
775 block OB. If REF_P is true, write a reference to EXPR's pointer
776 fields. */
777
778static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200779write_ts_exp_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400780{
781 int i;
782
Diego Novillof0efc7a2011-08-08 12:49:34 -0400783 for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
Jan Hubicka33e23882020-05-29 22:41:11 +0200784 stream_write_tree_ref (ob, TREE_OPERAND (expr, i));
785 stream_write_tree_ref (ob, TREE_BLOCK (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400786}
787
788
789/* Write all pointer fields in the TS_BLOCK structure of EXPR to output
790 block OB. If REF_P is true, write a reference to EXPR's pointer
791 fields. */
792
793static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200794write_ts_block_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400795{
Jan Hubicka33e23882020-05-29 22:41:11 +0200796 streamer_write_chain (ob, BLOCK_VARS (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400797
Jan Hubicka33e23882020-05-29 22:41:11 +0200798 stream_write_tree_ref (ob, BLOCK_SUPERCONTEXT (expr));
799 stream_write_tree_ref (ob, BLOCK_ABSTRACT_ORIGIN (expr));
Richard Guenther5c1eb612012-10-04 11:23:18 +0000800
Diego Novillof0efc7a2011-08-08 12:49:34 -0400801 /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information
Richard Guenther5c1eb612012-10-04 11:23:18 +0000802 for early inlined BLOCKs so drop it on the floor instead of ICEing in
Diego Novillof0efc7a2011-08-08 12:49:34 -0400803 dwarf2out.c. */
804
Richard Guenther5c1eb612012-10-04 11:23:18 +0000805 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
806 streaming time. */
807
Diego Novillof0efc7a2011-08-08 12:49:34 -0400808 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
809 list is re-constructed from BLOCK_SUPERCONTEXT. */
810}
811
812
813/* Write all pointer fields in the TS_BINFO structure of EXPR to output
814 block OB. If REF_P is true, write a reference to EXPR's pointer
815 fields. */
816
817static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200818write_ts_binfo_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400819{
820 unsigned i;
821 tree t;
822
823 /* Note that the number of BINFO slots has already been emitted in
Diego Novillo412288f2011-08-12 12:42:13 -0400824 EXPR's header (see streamer_write_tree_header) because this length
Diego Novillof0efc7a2011-08-08 12:49:34 -0400825 is needed to build the empty BINFO node on the reader side. */
Diego Novillo9771b262012-11-17 21:54:30 -0500826 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
Jan Hubicka33e23882020-05-29 22:41:11 +0200827 stream_write_tree_ref (ob, t);
828 stream_write_tree_ref (ob, NULL_TREE);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400829
Jan Hubicka33e23882020-05-29 22:41:11 +0200830 stream_write_tree_ref (ob, BINFO_OFFSET (expr));
831 stream_write_tree_ref (ob, BINFO_VTABLE (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400832
Jan Hubicka0c172702018-06-22 12:09:10 +0200833 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX,
834 BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used by C++ FE only. */
Diego Novillof0efc7a2011-08-08 12:49:34 -0400835}
836
837
838/* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
839 output block OB. If REF_P is true, write a reference to EXPR's
840 pointer fields. */
841
842static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200843write_ts_constructor_tree_pointers (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400844{
845 unsigned i;
846 tree index, value;
847
Diego Novillof0efc7a2011-08-08 12:49:34 -0400848 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
849 {
Jan Hubicka33e23882020-05-29 22:41:11 +0200850 stream_write_tree_ref (ob, index);
851 stream_write_tree_ref (ob, value);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400852 }
853}
854
Jakub Jelinekc193f582013-11-29 11:36:10 +0100855
856/* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
857 to output block OB. If REF_P is true, write a reference to EXPR's
858 pointer fields. */
859
860static void
Jan Hubicka33e23882020-05-29 22:41:11 +0200861write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr)
Jakub Jelinekc193f582013-11-29 11:36:10 +0100862{
863 int i;
864 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
Jan Hubicka33e23882020-05-29 22:41:11 +0200865 stream_write_tree_ref (ob, OMP_CLAUSE_OPERAND (expr, i));
Jakub Jelinek28567c42018-11-08 18:13:04 +0100866 switch (OMP_CLAUSE_CODE (expr))
Jakub Jelinekc193f582013-11-29 11:36:10 +0100867 {
Jakub Jelinek28567c42018-11-08 18:13:04 +0100868 case OMP_CLAUSE_REDUCTION:
869 case OMP_CLAUSE_TASK_REDUCTION:
870 case OMP_CLAUSE_IN_REDUCTION:
Jakub Jelinekc193f582013-11-29 11:36:10 +0100871 /* We don't stream these right now, handle it if streaming
872 of them is needed. */
873 gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
874 gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
Jakub Jelinek28567c42018-11-08 18:13:04 +0100875 break;
876 default:
877 break;
Jakub Jelinekc193f582013-11-29 11:36:10 +0100878 }
Jan Hubicka33e23882020-05-29 22:41:11 +0200879 stream_write_tree_ref (ob, OMP_CLAUSE_CHAIN (expr));
Jakub Jelinekc193f582013-11-29 11:36:10 +0100880}
881
882
Diego Novillob9393652011-08-11 08:02:34 -0400883/* Write all pointer fields in EXPR to output block OB. If REF_P is true,
884 the leaves of EXPR are emitted as references. */
Diego Novillof0efc7a2011-08-08 12:49:34 -0400885
Diego Novillob9393652011-08-11 08:02:34 -0400886void
Jan Hubicka33e23882020-05-29 22:41:11 +0200887streamer_write_tree_body (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400888{
889 enum tree_code code;
890
Richard Bieneree03e712013-06-17 15:08:24 +0000891 lto_stats.num_tree_bodies_output++;
892
Diego Novillof0efc7a2011-08-08 12:49:34 -0400893 code = TREE_CODE (expr);
894
895 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
Jan Hubicka33e23882020-05-29 22:41:11 +0200896 write_ts_common_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400897
898 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
Jan Hubicka33e23882020-05-29 22:41:11 +0200899 write_ts_vector_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400900
Richard Sandiford36fd6402017-12-20 12:51:50 +0000901 if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
Jan Hubicka33e23882020-05-29 22:41:11 +0200902 write_ts_poly_tree_pointers (ob, expr);
Richard Sandiford36fd6402017-12-20 12:51:50 +0000903
Diego Novillof0efc7a2011-08-08 12:49:34 -0400904 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
Jan Hubicka33e23882020-05-29 22:41:11 +0200905 write_ts_complex_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400906
907 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
Jan Hubicka33e23882020-05-29 22:41:11 +0200908 write_ts_decl_minimal_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400909
910 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
Jan Hubicka33e23882020-05-29 22:41:11 +0200911 write_ts_decl_common_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400912
913 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
Jan Hubicka33e23882020-05-29 22:41:11 +0200914 write_ts_decl_non_common_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400915
916 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
Jan Hubicka33e23882020-05-29 22:41:11 +0200917 write_ts_decl_with_vis_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400918
919 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
Jan Hubicka33e23882020-05-29 22:41:11 +0200920 write_ts_field_decl_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400921
922 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
Jan Hubicka33e23882020-05-29 22:41:11 +0200923 write_ts_function_decl_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400924
925 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
Jan Hubicka33e23882020-05-29 22:41:11 +0200926 write_ts_type_common_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400927
928 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
Jan Hubicka33e23882020-05-29 22:41:11 +0200929 write_ts_type_non_common_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400930
931 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
Jan Hubicka33e23882020-05-29 22:41:11 +0200932 write_ts_list_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400933
934 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
Jan Hubicka33e23882020-05-29 22:41:11 +0200935 write_ts_vec_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400936
937 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
Jan Hubicka33e23882020-05-29 22:41:11 +0200938 write_ts_exp_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400939
940 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
Jan Hubicka33e23882020-05-29 22:41:11 +0200941 write_ts_block_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400942
943 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
Jan Hubicka33e23882020-05-29 22:41:11 +0200944 write_ts_binfo_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400945
946 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
Jan Hubicka33e23882020-05-29 22:41:11 +0200947 write_ts_constructor_tree_pointers (ob, expr);
Jakub Jelinekc193f582013-11-29 11:36:10 +0100948
949 if (code == OMP_CLAUSE)
Jan Hubicka33e23882020-05-29 22:41:11 +0200950 write_ts_omp_clause_tree_pointers (ob, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400951}
952
953
954/* Emit header information for tree EXPR to output block OB. The header
955 contains everything needed to instantiate an empty skeleton for
956 EXPR on the reading side. IX is the index into the streamer cache
Diego Novillob9393652011-08-11 08:02:34 -0400957 where EXPR is stored. */
Diego Novillof0efc7a2011-08-08 12:49:34 -0400958
Diego Novillob9393652011-08-11 08:02:34 -0400959void
Diego Novillo412288f2011-08-12 12:42:13 -0400960streamer_write_tree_header (struct output_block *ob, tree expr)
Diego Novillof0efc7a2011-08-08 12:49:34 -0400961{
962 enum LTO_tags tag;
963 enum tree_code code;
964
Jan Hubicka0896cc42020-05-22 15:44:10 +0200965 if (streamer_dump_file)
966 {
967 print_node_brief (streamer_dump_file, " Streaming header of ",
968 expr, 4);
969 fprintf (streamer_dump_file, " to %s\n",
970 lto_section_name[ob->section_type]);
971 }
972
Diego Novillof0efc7a2011-08-08 12:49:34 -0400973 /* We should not see any tree nodes not handled by the streamer. */
974 code = TREE_CODE (expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400975
976 /* The header of a tree node consists of its tag, the size of
977 the node, and any other information needed to instantiate
978 EXPR on the reading side (such as the number of slots in
979 variable sized nodes). */
980 tag = lto_tree_code_to_tag (code);
Diego Novillo412288f2011-08-12 12:42:13 -0400981 streamer_write_record_start (ob, tag);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400982
Diego Novillof0efc7a2011-08-08 12:49:34 -0400983 /* The text in strings and identifiers are completely emitted in
984 the header. */
985 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
Jan Beulich49f836b2011-09-30 14:56:01 +0000986 streamer_write_string_cst (ob, ob->main_stream, expr);
Diego Novillof0efc7a2011-08-08 12:49:34 -0400987 else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
Diego Novillo412288f2011-08-12 12:42:13 -0400988 write_identifier (ob, ob->main_stream, expr);
Richard Guentherd2a12ae2012-03-16 09:47:09 +0000989 else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
Richard Sandiford734914b2017-12-07 18:40:28 +0000990 {
991 bitpack_d bp = bitpack_create (ob->main_stream);
992 bp_pack_value (&bp, VECTOR_CST_LOG2_NPATTERNS (expr), 8);
993 bp_pack_value (&bp, VECTOR_CST_NELTS_PER_PATTERN (expr), 8);
994 streamer_write_bitpack (&bp);
995 }
Diego Novillof0efc7a2011-08-08 12:49:34 -0400996 else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
Diego Novillo412288f2011-08-12 12:42:13 -0400997 streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
Diego Novillof0efc7a2011-08-08 12:49:34 -0400998 else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
Diego Novillo412288f2011-08-12 12:42:13 -0400999 streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
Diego Novillob9393652011-08-11 08:02:34 -04001000 else if (TREE_CODE (expr) == CALL_EXPR)
Diego Novillo412288f2011-08-12 12:42:13 -04001001 streamer_write_uhwi (ob, call_expr_nargs (expr));
Jakub Jelinekc193f582013-11-29 11:36:10 +01001002 else if (TREE_CODE (expr) == OMP_CLAUSE)
1003 streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
Kenneth Zadeck807e9022014-05-06 16:25:05 +00001004 else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
1005 {
1006 gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
1007 streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
1008 streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
1009 }
Diego Novillof0efc7a2011-08-08 12:49:34 -04001010}
1011
1012
1013/* Emit the integer constant CST to output block OB. If REF_P is true,
1014 CST's type will be emitted as a reference. */
1015
Diego Novillob9393652011-08-11 08:02:34 -04001016void
Jan Hubicka33e23882020-05-29 22:41:11 +02001017streamer_write_integer_cst (struct output_block *ob, tree cst)
Diego Novillof0efc7a2011-08-08 12:49:34 -04001018{
Kenneth Zadeck807e9022014-05-06 16:25:05 +00001019 int i;
1020 int len = TREE_INT_CST_NUNITS (cst);
Richard Guentherc61f8c32012-10-18 10:59:55 +00001021 gcc_assert (!TREE_OVERFLOW (cst));
Jan Hubicka098ba492020-05-22 16:31:21 +02001022 if (streamer_dump_file)
1023 {
1024 print_node_brief (streamer_dump_file, " Streaming integer ",
1025 cst, 4);
1026 fprintf (streamer_dump_file, "\n");
1027 }
Richard Guentherc61f8c32012-10-18 10:59:55 +00001028 streamer_write_record_start (ob, LTO_integer_cst);
Jan Hubicka33e23882020-05-29 22:41:11 +02001029 stream_write_tree_ref (ob, TREE_TYPE (cst));
Kenneth Zadeck807e9022014-05-06 16:25:05 +00001030 /* We're effectively streaming a non-sign-extended wide_int here,
1031 so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
1032 array members beyond LEN. We'll recreate the tree from the
1033 wide_int and the type. */
1034 streamer_write_uhwi (ob, len);
1035 for (i = 0; i < len; i++)
1036 streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));
Diego Novillof0efc7a2011-08-08 12:49:34 -04001037}