2011-10-07 Tom de Vries <tom@codesourcery.com>
[official-gcc.git] / gcc / tree-streamer-out.c
blob58be0a385a00d9d42e8f92cfe9d2095f53b92aa5
1 /* Routines for emitting trees to a file stream.
3 Copyright 2011 Free Software Foundation, Inc.
4 Contributed by Diego Novillo <dnovillo@google.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "diagnostic.h"
26 #include "tree.h"
27 #include "tree-streamer.h"
28 #include "data-streamer.h"
29 #include "streamer-hooks.h"
31 /* Output the STRING constant to the string
32 table in OB. Then put the index onto the INDEX_STREAM. */
34 void
35 streamer_write_string_cst (struct output_block *ob,
36 struct lto_output_stream *index_stream,
37 tree string)
39 streamer_write_string_with_length (ob, index_stream,
40 string ? TREE_STRING_POINTER (string)
41 : NULL,
42 string ? TREE_STRING_LENGTH (string) : 0,
43 true);
47 /* Output the identifier ID to the string
48 table in OB. Then put the index onto the INDEX_STREAM. */
50 static void
51 write_identifier (struct output_block *ob,
52 struct lto_output_stream *index_stream,
53 tree id)
55 streamer_write_string_with_length (ob, index_stream,
56 IDENTIFIER_POINTER (id),
57 IDENTIFIER_LENGTH (id),
58 true);
62 /* Pack all the non-pointer fields of the TS_BASE structure of
63 expression EXPR into bitpack BP. */
65 static void
66 pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
68 bp_pack_value (bp, TREE_CODE (expr), 16);
69 if (!TYPE_P (expr))
71 bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
72 bp_pack_value (bp, TREE_CONSTANT (expr), 1);
73 bp_pack_value (bp, TREE_READONLY (expr), 1);
75 /* TREE_PUBLIC is used on types to indicate that the type
76 has a TYPE_CACHED_VALUES vector. This is not streamed out,
77 so we skip it here. */
78 bp_pack_value (bp, TREE_PUBLIC (expr), 1);
80 else
81 bp_pack_value (bp, 0, 4);
82 bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
83 bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
84 if (DECL_P (expr))
85 bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
86 else if (TYPE_P (expr))
87 bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
88 else
89 bp_pack_value (bp, 0, 1);
90 /* We write debug info two times, do not confuse the second one. */
91 bp_pack_value (bp, TYPE_P (expr) ? 0 : TREE_ASM_WRITTEN (expr), 1);
92 if (TYPE_P (expr))
93 bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
94 else
95 bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
96 bp_pack_value (bp, TREE_USED (expr), 1);
97 bp_pack_value (bp, TREE_NOTHROW (expr), 1);
98 bp_pack_value (bp, TREE_STATIC (expr), 1);
99 bp_pack_value (bp, TREE_PRIVATE (expr), 1);
100 bp_pack_value (bp, TREE_PROTECTED (expr), 1);
101 bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
102 if (TYPE_P (expr))
103 bp_pack_value (bp, TYPE_SATURATING (expr), 1);
104 else if (TREE_CODE (expr) == SSA_NAME)
105 bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
106 else
107 bp_pack_value (bp, 0, 1);
111 /* Pack all the non-pointer fields of the TS_REAL_CST structure of
112 expression EXPR into bitpack BP. */
114 static void
115 pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
117 unsigned i;
118 REAL_VALUE_TYPE r;
120 r = TREE_REAL_CST (expr);
121 bp_pack_value (bp, r.cl, 2);
122 bp_pack_value (bp, r.decimal, 1);
123 bp_pack_value (bp, r.sign, 1);
124 bp_pack_value (bp, r.signalling, 1);
125 bp_pack_value (bp, r.canonical, 1);
126 bp_pack_value (bp, r.uexp, EXP_BITS);
127 for (i = 0; i < SIGSZ; i++)
128 bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
132 /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
133 expression EXPR into bitpack BP. */
135 static void
136 pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
138 struct fixed_value fv = TREE_FIXED_CST (expr);
139 bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, fv.mode);
140 bp_pack_var_len_int (bp, fv.data.low);
141 bp_pack_var_len_int (bp, fv.data.high);
145 /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
146 of expression EXPR into bitpack BP. */
148 static void
149 pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
151 bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, DECL_MODE (expr));
152 bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
153 bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
154 bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
155 bp_pack_value (bp, DECL_ABSTRACT (expr), 1);
156 bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
157 bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
158 bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
159 bp_pack_value (bp, DECL_DEBUG_EXPR_IS_FROM (expr), 1);
160 bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
161 bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1);
162 bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
164 if (TREE_CODE (expr) == LABEL_DECL)
166 /* Note that we do not write LABEL_DECL_UID. The reader will
167 always assume an initial value of -1 so that the
168 label_to_block_map is recreated by gimple_set_bb. */
169 bp_pack_value (bp, DECL_ERROR_ISSUED (expr), 1);
170 bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
173 if (TREE_CODE (expr) == FIELD_DECL)
175 bp_pack_value (bp, DECL_PACKED (expr), 1);
176 bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
177 bp_pack_value (bp, expr->decl_common.off_align, 8);
180 if (TREE_CODE (expr) == RESULT_DECL
181 || TREE_CODE (expr) == PARM_DECL
182 || TREE_CODE (expr) == VAR_DECL)
184 bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
185 if (TREE_CODE (expr) == VAR_DECL
186 || TREE_CODE (expr) == PARM_DECL)
187 bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
188 bp_pack_value (bp, DECL_RESTRICTED_P (expr), 1);
193 /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
194 of expression EXPR into bitpack BP. */
196 static void
197 pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
199 bp_pack_value (bp, DECL_REGISTER (expr), 1);
203 /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
204 of expression EXPR into bitpack BP. */
206 static void
207 pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
209 bp_pack_value (bp, DECL_DEFER_OUTPUT (expr), 1);
210 bp_pack_value (bp, DECL_COMMON (expr), 1);
211 bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
212 bp_pack_value (bp, DECL_WEAK (expr), 1);
213 bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr), 1);
214 bp_pack_value (bp, DECL_COMDAT (expr), 1);
215 bp_pack_value (bp, DECL_VISIBILITY (expr), 2);
216 bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr), 1);
218 if (TREE_CODE (expr) == VAR_DECL)
220 bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
221 bp_pack_value (bp, DECL_IN_TEXT_SECTION (expr), 1);
222 bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
223 bp_pack_value (bp, DECL_TLS_MODEL (expr), 3);
226 if (VAR_OR_FUNCTION_DECL_P (expr))
227 bp_pack_var_len_unsigned (bp, DECL_INIT_PRIORITY (expr));
231 /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
232 of expression EXPR into bitpack BP. */
234 static void
235 pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
237 /* For normal/md builtins we only write the class and code, so they
238 should never be handled here. */
239 gcc_assert (!streamer_handle_as_builtin_p (expr));
241 bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
242 DECL_BUILT_IN_CLASS (expr));
243 bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
244 bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
245 bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
246 bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
247 bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
248 bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
249 bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
250 bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
251 bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
252 bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
253 bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
254 bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
255 bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
256 bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
257 bp_pack_value (bp, DECL_PURE_P (expr), 1);
258 bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
259 if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
260 bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 11);
261 if (DECL_STATIC_DESTRUCTOR (expr))
262 bp_pack_var_len_unsigned (bp, DECL_FINI_PRIORITY (expr));
266 /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
267 of expression EXPR into bitpack BP. */
269 static void
270 pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
272 bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, TYPE_MODE (expr));
273 bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
274 bp_pack_value (bp, TYPE_NO_FORCE_BLK (expr), 1);
275 bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING (expr), 1);
276 if (RECORD_OR_UNION_TYPE_P (expr))
277 bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
278 bp_pack_value (bp, TYPE_PACKED (expr), 1);
279 bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
280 bp_pack_value (bp, TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr), 2);
281 bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
282 bp_pack_value (bp, TYPE_READONLY (expr), 1);
283 bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
284 bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
285 bp_pack_var_len_int (bp, TYPE_ALIAS_SET (expr) == 0 ? 0 : -1);
289 /* Pack all the non-pointer fields of the TS_BLOCK structure
290 of expression EXPR into bitpack BP. */
292 static void
293 pack_ts_block_value_fields (struct bitpack_d *bp, tree expr)
295 bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1);
296 /* BLOCK_NUMBER is recomputed. */
299 /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
300 of expression EXPR into bitpack BP. */
302 static void
303 pack_ts_translation_unit_decl_value_fields (struct bitpack_d *bp ATTRIBUTE_UNUSED, tree expr ATTRIBUTE_UNUSED)
308 /* Pack all the bitfields in EXPR into a bit pack. */
310 void
311 streamer_pack_tree_bitfields (struct bitpack_d *bp, tree expr)
313 enum tree_code code;
315 code = TREE_CODE (expr);
317 /* Note that all these functions are highly sensitive to changes in
318 the types and sizes of each of the fields being packed. */
319 pack_ts_base_value_fields (bp, expr);
321 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
322 pack_ts_real_cst_value_fields (bp, expr);
324 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
325 pack_ts_fixed_cst_value_fields (bp, expr);
327 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
328 pack_ts_decl_common_value_fields (bp, expr);
330 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
331 pack_ts_decl_wrtl_value_fields (bp, expr);
333 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
334 pack_ts_decl_with_vis_value_fields (bp, expr);
336 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
337 pack_ts_function_decl_value_fields (bp, expr);
339 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
340 pack_ts_type_common_value_fields (bp, expr);
342 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
343 pack_ts_block_value_fields (bp, expr);
345 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
346 pack_ts_translation_unit_decl_value_fields (bp, expr);
350 /* Write the code and class of builtin EXPR to output block OB. IX is
351 the index into the streamer cache where EXPR is stored.*/
353 void
354 streamer_write_builtin (struct output_block *ob, tree expr)
356 gcc_assert (streamer_handle_as_builtin_p (expr));
358 if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD
359 && !targetm.builtin_decl)
360 sorry ("tree bytecode streams do not support machine specific builtin "
361 "functions on this target");
363 streamer_write_record_start (ob, LTO_builtin_decl);
364 streamer_write_enum (ob->main_stream, built_in_class, BUILT_IN_LAST,
365 DECL_BUILT_IN_CLASS (expr));
366 streamer_write_uhwi (ob, DECL_FUNCTION_CODE (expr));
368 if (DECL_ASSEMBLER_NAME_SET_P (expr))
370 /* When the assembler name of a builtin gets a user name,
371 the new name is always prefixed with '*' by
372 set_builtin_user_assembler_name. So, to prevent the
373 reader side from adding a second '*', we omit it here. */
374 const char *str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (expr));
375 if (strlen (str) > 1 && str[0] == '*')
376 streamer_write_string (ob, ob->main_stream, &str[1], true);
377 else
378 streamer_write_string (ob, ob->main_stream, NULL, true);
380 else
381 streamer_write_string (ob, ob->main_stream, NULL, true);
385 /* Emit the chain of tree nodes starting at T. OB is the output block
386 to write to. REF_P is true if chain elements should be emitted
387 as references. */
389 void
390 streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
392 int i, count;
394 count = list_length (t);
395 streamer_write_hwi (ob, count);
396 for (i = 0; i < count; i++)
398 tree saved_chain;
400 /* Clear TREE_CHAIN to avoid blindly recursing into the rest
401 of the list. */
402 saved_chain = TREE_CHAIN (t);
403 TREE_CHAIN (t) = NULL_TREE;
405 stream_write_tree (ob, t, ref_p);
407 TREE_CHAIN (t) = saved_chain;
408 t = TREE_CHAIN (t);
413 /* Write all pointer fields in the TS_COMMON structure of EXPR to output
414 block OB. If REF_P is true, write a reference to EXPR's pointer
415 fields. */
417 static void
418 write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
420 if (TREE_CODE (expr) != IDENTIFIER_NODE)
421 stream_write_tree (ob, TREE_TYPE (expr), ref_p);
425 /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
426 block OB. If REF_P is true, write a reference to EXPR's pointer
427 fields. */
429 static void
430 write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
432 streamer_write_chain (ob, TREE_VECTOR_CST_ELTS (expr), ref_p);
436 /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
437 block OB. If REF_P is true, write a reference to EXPR's pointer
438 fields. */
440 static void
441 write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
443 stream_write_tree (ob, TREE_REALPART (expr), ref_p);
444 stream_write_tree (ob, TREE_IMAGPART (expr), ref_p);
448 /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
449 to output block OB. If REF_P is true, write a reference to EXPR's
450 pointer fields. */
452 static void
453 write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
454 bool ref_p)
456 stream_write_tree (ob, DECL_NAME (expr), ref_p);
457 stream_write_tree (ob, DECL_CONTEXT (expr), ref_p);
458 lto_output_location (ob, DECL_SOURCE_LOCATION (expr));
462 /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
463 output block OB. If REF_P is true, write a reference to EXPR's
464 pointer fields. */
466 static void
467 write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
468 bool ref_p)
470 stream_write_tree (ob, DECL_SIZE (expr), ref_p);
471 stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p);
473 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
474 special handling in LTO, it must be handled by streamer hooks. */
476 stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p);
478 /* Do not stream DECL_ABSTRACT_ORIGIN. We cannot handle debug information
479 for early inlining so drop it on the floor instead of ICEing in
480 dwarf2out.c. */
482 if (TREE_CODE (expr) == PARM_DECL)
483 streamer_write_chain (ob, TREE_CHAIN (expr), ref_p);
485 if ((TREE_CODE (expr) == VAR_DECL
486 || TREE_CODE (expr) == PARM_DECL)
487 && DECL_HAS_VALUE_EXPR_P (expr))
488 stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p);
490 if (TREE_CODE (expr) == VAR_DECL)
491 stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p);
495 /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
496 EXPR to output block OB. If REF_P is true, write a reference to EXPR's
497 pointer fields. */
499 static void
500 write_ts_decl_non_common_tree_pointers (struct output_block *ob, tree expr,
501 bool ref_p)
503 if (TREE_CODE (expr) == FUNCTION_DECL)
505 stream_write_tree (ob, DECL_ARGUMENTS (expr), ref_p);
506 stream_write_tree (ob, DECL_RESULT (expr), ref_p);
508 stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
512 /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
513 to output block OB. If REF_P is true, write a reference to EXPR's
514 pointer fields. */
516 static void
517 write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
518 bool ref_p)
520 /* Make sure we don't inadvertently set the assembler name. */
521 if (DECL_ASSEMBLER_NAME_SET_P (expr))
522 stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
523 else
524 stream_write_tree (ob, NULL_TREE, false);
526 stream_write_tree (ob, DECL_SECTION_NAME (expr), ref_p);
527 stream_write_tree (ob, DECL_COMDAT_GROUP (expr), ref_p);
531 /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
532 output block OB. If REF_P is true, write a reference to EXPR's
533 pointer fields. */
535 static void
536 write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
537 bool ref_p)
539 stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p);
540 stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
541 stream_write_tree (ob, DECL_QUALIFIER (expr), ref_p);
542 stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
543 stream_write_tree (ob, DECL_FCONTEXT (expr), ref_p);
544 streamer_write_chain (ob, TREE_CHAIN (expr), ref_p);
548 /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
549 to output block OB. If REF_P is true, write a reference to EXPR's
550 pointer fields. */
552 static void
553 write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
554 bool ref_p)
556 /* DECL_STRUCT_FUNCTION is handled by lto_output_function. FIXME lto,
557 maybe it should be handled here? */
558 stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
559 stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
560 stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
564 /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
565 output block OB. If REF_P is true, write a reference to EXPR's
566 pointer fields. */
568 static void
569 write_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
570 bool ref_p)
572 stream_write_tree (ob, TYPE_SIZE (expr), ref_p);
573 stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p);
574 stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p);
575 stream_write_tree (ob, TYPE_NAME (expr), ref_p);
576 /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
577 reconstructed during fixup. */
578 /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
579 during fixup. */
580 stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p);
581 stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p);
582 /* TYPE_CANONICAL is re-computed during type merging, so no need
583 to stream it here. */
584 stream_write_tree (ob, TYPE_STUB_DECL (expr), ref_p);
587 /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
588 to output block OB. If REF_P is true, write a reference to EXPR's
589 pointer fields. */
591 static void
592 write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr,
593 bool ref_p)
595 if (TREE_CODE (expr) == ENUMERAL_TYPE)
596 stream_write_tree (ob, TYPE_VALUES (expr), ref_p);
597 else if (TREE_CODE (expr) == ARRAY_TYPE)
598 stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p);
599 else if (RECORD_OR_UNION_TYPE_P (expr))
600 stream_write_tree (ob, TYPE_FIELDS (expr), ref_p);
601 else if (TREE_CODE (expr) == FUNCTION_TYPE
602 || TREE_CODE (expr) == METHOD_TYPE)
603 stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p);
605 if (!POINTER_TYPE_P (expr))
606 stream_write_tree (ob, TYPE_MINVAL (expr), ref_p);
607 stream_write_tree (ob, TYPE_MAXVAL (expr), ref_p);
608 if (RECORD_OR_UNION_TYPE_P (expr))
609 stream_write_tree (ob, TYPE_BINFO (expr), ref_p);
613 /* Write all pointer fields in the TS_LIST structure of EXPR to output
614 block OB. If REF_P is true, write a reference to EXPR's pointer
615 fields. */
617 static void
618 write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
620 stream_write_tree (ob, TREE_PURPOSE (expr), ref_p);
621 stream_write_tree (ob, TREE_VALUE (expr), ref_p);
622 streamer_write_chain (ob, TREE_CHAIN (expr), ref_p);
626 /* Write all pointer fields in the TS_VEC structure of EXPR to output
627 block OB. If REF_P is true, write a reference to EXPR's pointer
628 fields. */
630 static void
631 write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
633 int i;
635 /* Note that the number of slots for EXPR has already been emitted
636 in EXPR's header (see streamer_write_tree_header). */
637 for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
638 stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p);
642 /* Write all pointer fields in the TS_EXP structure of EXPR to output
643 block OB. If REF_P is true, write a reference to EXPR's pointer
644 fields. */
646 static void
647 write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
649 int i;
651 streamer_write_hwi (ob, TREE_OPERAND_LENGTH (expr));
652 for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
653 stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p);
654 lto_output_location (ob, EXPR_LOCATION (expr));
655 stream_write_tree (ob, TREE_BLOCK (expr), ref_p);
659 /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
660 block OB. If REF_P is true, write a reference to EXPR's pointer
661 fields. */
663 static void
664 write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
666 /* Do not stream BLOCK_SOURCE_LOCATION. We cannot handle debug information
667 for early inlining so drop it on the floor instead of ICEing in
668 dwarf2out.c. */
669 streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
671 /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information
672 for early inlining so drop it on the floor instead of ICEing in
673 dwarf2out.c. */
675 stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
676 /* Do not stream BLOCK_ABSTRACT_ORIGIN. We cannot handle debug information
677 for early inlining so drop it on the floor instead of ICEing in
678 dwarf2out.c. */
679 stream_write_tree (ob, BLOCK_FRAGMENT_ORIGIN (expr), ref_p);
680 stream_write_tree (ob, BLOCK_FRAGMENT_CHAIN (expr), ref_p);
681 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
682 list is re-constructed from BLOCK_SUPERCONTEXT. */
686 /* Write all pointer fields in the TS_BINFO structure of EXPR to output
687 block OB. If REF_P is true, write a reference to EXPR's pointer
688 fields. */
690 static void
691 write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
693 unsigned i;
694 tree t;
696 /* Note that the number of BINFO slots has already been emitted in
697 EXPR's header (see streamer_write_tree_header) because this length
698 is needed to build the empty BINFO node on the reader side. */
699 FOR_EACH_VEC_ELT (tree, BINFO_BASE_BINFOS (expr), i, t)
700 stream_write_tree (ob, t, ref_p);
701 stream_write_tree (ob, NULL_TREE, false);
703 stream_write_tree (ob, BINFO_OFFSET (expr), ref_p);
704 stream_write_tree (ob, BINFO_VTABLE (expr), ref_p);
705 stream_write_tree (ob, BINFO_VPTR_FIELD (expr), ref_p);
707 streamer_write_uhwi (ob, VEC_length (tree, BINFO_BASE_ACCESSES (expr)));
708 FOR_EACH_VEC_ELT (tree, BINFO_BASE_ACCESSES (expr), i, t)
709 stream_write_tree (ob, t, ref_p);
711 stream_write_tree (ob, BINFO_INHERITANCE_CHAIN (expr), ref_p);
712 stream_write_tree (ob, BINFO_SUBVTT_INDEX (expr), ref_p);
713 stream_write_tree (ob, BINFO_VPTR_INDEX (expr), ref_p);
717 /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
718 output block OB. If REF_P is true, write a reference to EXPR's
719 pointer fields. */
721 static void
722 write_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
723 bool ref_p)
725 unsigned i;
726 tree index, value;
728 streamer_write_uhwi (ob, CONSTRUCTOR_NELTS (expr));
729 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
731 stream_write_tree (ob, index, ref_p);
732 stream_write_tree (ob, value, ref_p);
736 /* Write a TS_TARGET_OPTION tree in EXPR to OB. */
738 static void
739 write_ts_target_option (struct output_block *ob, tree expr)
741 struct cl_target_option *t = TREE_TARGET_OPTION (expr);
742 struct bitpack_d bp;
743 unsigned i, len;
745 /* The cl_target_option is target specific and generated by the options
746 awk script, so we just recreate a byte-by-byte copy here. */
748 bp = bitpack_create (ob->main_stream);
749 len = sizeof (struct cl_target_option);
750 for (i = 0; i < len; i++)
751 bp_pack_value (&bp, ((unsigned char *)t)[i], 8);
752 /* Catch struct size mismatches between reader and writer. */
753 bp_pack_value (&bp, 0x12345678, 32);
754 streamer_write_bitpack (&bp);
757 /* Write a TS_TRANSLATION_UNIT_DECL tree in EXPR to OB. */
759 static void
760 write_ts_translation_unit_decl_tree_pointers (struct output_block *ob,
761 tree expr)
763 streamer_write_string (ob, ob->main_stream,
764 TRANSLATION_UNIT_LANGUAGE (expr), true);
767 /* Write all pointer fields in EXPR to output block OB. If REF_P is true,
768 the leaves of EXPR are emitted as references. */
770 void
771 streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
773 enum tree_code code;
775 code = TREE_CODE (expr);
777 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
778 write_ts_common_tree_pointers (ob, expr, ref_p);
780 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
781 write_ts_vector_tree_pointers (ob, expr, ref_p);
783 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
784 write_ts_complex_tree_pointers (ob, expr, ref_p);
786 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
787 write_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
789 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
790 write_ts_decl_common_tree_pointers (ob, expr, ref_p);
792 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
793 write_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
795 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
796 write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
798 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
799 write_ts_field_decl_tree_pointers (ob, expr, ref_p);
801 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
802 write_ts_function_decl_tree_pointers (ob, expr, ref_p);
804 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
805 write_ts_type_common_tree_pointers (ob, expr, ref_p);
807 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
808 write_ts_type_non_common_tree_pointers (ob, expr, ref_p);
810 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
811 write_ts_list_tree_pointers (ob, expr, ref_p);
813 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
814 write_ts_vec_tree_pointers (ob, expr, ref_p);
816 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
817 write_ts_exp_tree_pointers (ob, expr, ref_p);
819 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
820 write_ts_block_tree_pointers (ob, expr, ref_p);
822 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
823 write_ts_binfo_tree_pointers (ob, expr, ref_p);
825 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
826 write_ts_constructor_tree_pointers (ob, expr, ref_p);
828 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
829 write_ts_target_option (ob, expr);
831 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
832 write_ts_translation_unit_decl_tree_pointers (ob, expr);
836 /* Emit header information for tree EXPR to output block OB. The header
837 contains everything needed to instantiate an empty skeleton for
838 EXPR on the reading side. IX is the index into the streamer cache
839 where EXPR is stored. */
841 void
842 streamer_write_tree_header (struct output_block *ob, tree expr)
844 enum LTO_tags tag;
845 enum tree_code code;
847 /* We should not see any tree nodes not handled by the streamer. */
848 code = TREE_CODE (expr);
850 /* The header of a tree node consists of its tag, the size of
851 the node, and any other information needed to instantiate
852 EXPR on the reading side (such as the number of slots in
853 variable sized nodes). */
854 tag = lto_tree_code_to_tag (code);
855 streamer_write_record_start (ob, tag);
857 /* The following will cause bootstrap miscomparisons. Enable with care. */
858 #ifdef LTO_STREAMER_DEBUG
859 /* This is used mainly for debugging purposes. When the reader
860 and the writer do not agree on a streamed node, the pointer
861 value for EXPR can be used to track down the differences in
862 the debugger. */
863 gcc_assert ((HOST_WIDEST_INT) (intptr_t) expr == (intptr_t) expr);
864 streamer_write_hwi (ob, (HOST_WIDEST_INT) (intptr_t) expr);
865 #endif
867 /* The text in strings and identifiers are completely emitted in
868 the header. */
869 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
870 streamer_write_string_cst (ob, ob->main_stream, expr);
871 else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
872 write_identifier (ob, ob->main_stream, expr);
873 else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
874 streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
875 else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
876 streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
877 else if (TREE_CODE (expr) == CALL_EXPR)
878 streamer_write_uhwi (ob, call_expr_nargs (expr));
882 /* Emit the integer constant CST to output block OB. If REF_P is true,
883 CST's type will be emitted as a reference. */
885 void
886 streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p)
888 streamer_write_record_start (ob, lto_tree_code_to_tag (INTEGER_CST));
889 stream_write_tree (ob, TREE_TYPE (cst), ref_p);
890 streamer_write_char_stream (ob->main_stream, TREE_OVERFLOW_P (cst));
891 streamer_write_uhwi (ob, TREE_INT_CST_LOW (cst));
892 streamer_write_uhwi (ob, TREE_INT_CST_HIGH (cst));