2015-01-23 Bernd Edlinger <bernd.edlinger@hotmail.de>
[official-gcc.git] / gcc / tree-streamer-out.c
blob3669680ae9369764cae764523653a93be1dac127
1 /* Routines for emitting trees to a file stream.
3 Copyright (C) 2011-2015 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 "tm.h"
26 #include "diagnostic.h"
27 #include "hash-set.h"
28 #include "machmode.h"
29 #include "vec.h"
30 #include "double-int.h"
31 #include "input.h"
32 #include "alias.h"
33 #include "symtab.h"
34 #include "wide-int.h"
35 #include "inchash.h"
36 #include "real.h"
37 #include "fixed-value.h"
38 #include "tree.h"
39 #include "fold-const.h"
40 #include "stor-layout.h"
41 #include "predict.h"
42 #include "hard-reg-set.h"
43 #include "input.h"
44 #include "function.h"
45 #include "basic-block.h"
46 #include "tree-ssa-alias.h"
47 #include "internal-fn.h"
48 #include "gimple-expr.h"
49 #include "is-a.h"
50 #include "gimple.h"
51 #include "hash-map.h"
52 #include "plugin-api.h"
53 #include "ipa-ref.h"
54 #include "cgraph.h"
55 #include "tree-streamer.h"
56 #include "data-streamer.h"
57 #include "streamer-hooks.h"
58 #include "gomp-constants.h"
61 /* Output the STRING constant to the string
62 table in OB. Then put the index onto the INDEX_STREAM. */
64 void
65 streamer_write_string_cst (struct output_block *ob,
66 struct lto_output_stream *index_stream,
67 tree string)
69 streamer_write_string_with_length (ob, index_stream,
70 string ? TREE_STRING_POINTER (string)
71 : NULL,
72 string ? TREE_STRING_LENGTH (string) : 0,
73 true);
77 /* Output the identifier ID to the string
78 table in OB. Then put the index onto the INDEX_STREAM. */
80 static void
81 write_identifier (struct output_block *ob,
82 struct lto_output_stream *index_stream,
83 tree id)
85 streamer_write_string_with_length (ob, index_stream,
86 IDENTIFIER_POINTER (id),
87 IDENTIFIER_LENGTH (id),
88 true);
92 /* Pack all the non-pointer fields of the TS_BASE structure of
93 expression EXPR into bitpack BP. */
95 static void
96 pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
98 bp_pack_value (bp, TREE_CODE (expr), 16);
99 if (!TYPE_P (expr))
101 bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
102 bp_pack_value (bp, TREE_CONSTANT (expr), 1);
103 bp_pack_value (bp, TREE_READONLY (expr), 1);
105 /* TREE_PUBLIC is used on types to indicate that the type
106 has a TYPE_CACHED_VALUES vector. This is not streamed out,
107 so we skip it here. */
108 bp_pack_value (bp, TREE_PUBLIC (expr), 1);
110 else
111 bp_pack_value (bp, 0, 4);
112 bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
113 bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
114 if (DECL_P (expr))
115 bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
116 else if (TYPE_P (expr))
117 bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
118 else
119 bp_pack_value (bp, 0, 1);
120 /* We write debug info two times, do not confuse the second one.
121 The only relevant TREE_ASM_WRITTEN use is on SSA names. */
122 bp_pack_value (bp, (TREE_CODE (expr) != SSA_NAME
123 ? 0 : TREE_ASM_WRITTEN (expr)), 1);
124 if (TYPE_P (expr))
125 bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
126 else
127 bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
128 bp_pack_value (bp, TREE_NOTHROW (expr), 1);
129 bp_pack_value (bp, TREE_STATIC (expr), 1);
130 if (TREE_CODE (expr) != TREE_BINFO)
131 bp_pack_value (bp, TREE_PRIVATE (expr), 1);
132 bp_pack_value (bp, TREE_PROTECTED (expr), 1);
133 bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
134 if (TYPE_P (expr))
136 bp_pack_value (bp, TYPE_SATURATING (expr), 1);
137 bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8);
139 else if (TREE_CODE (expr) == SSA_NAME)
140 bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
141 else
142 bp_pack_value (bp, 0, 1);
146 /* Pack all the non-pointer fields of the TS_INTEGER_CST structure of
147 expression EXPR into bitpack BP. */
149 static void
150 pack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
152 int i;
153 /* Note that the number of elements has already been written out in
154 streamer_write_tree_header. */
155 for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
156 bp_pack_var_len_int (bp, TREE_INT_CST_ELT (expr, i));
160 /* Pack all the non-pointer fields of the TS_REAL_CST structure of
161 expression EXPR into bitpack BP. */
163 static void
164 pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
166 unsigned i;
167 REAL_VALUE_TYPE r;
169 r = TREE_REAL_CST (expr);
170 bp_pack_value (bp, r.cl, 2);
171 bp_pack_value (bp, r.decimal, 1);
172 bp_pack_value (bp, r.sign, 1);
173 bp_pack_value (bp, r.signalling, 1);
174 bp_pack_value (bp, r.canonical, 1);
175 bp_pack_value (bp, r.uexp, EXP_BITS);
176 for (i = 0; i < SIGSZ; i++)
177 bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
181 /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
182 expression EXPR into bitpack BP. */
184 static void
185 pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
187 struct fixed_value fv = TREE_FIXED_CST (expr);
188 bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, fv.mode);
189 bp_pack_var_len_int (bp, fv.data.low);
190 bp_pack_var_len_int (bp, fv.data.high);
193 /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
194 of expression EXPR into bitpack BP. */
196 static void
197 pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
199 bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, DECL_MODE (expr));
200 bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
201 bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
202 bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
203 bp_pack_value (bp, DECL_ABSTRACT_P (expr), 1);
204 bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
205 bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
206 bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
207 bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
208 bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1);
209 bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
211 if (TREE_CODE (expr) == LABEL_DECL)
213 /* Note that we do not write LABEL_DECL_UID. The reader will
214 always assume an initial value of -1 so that the
215 label_to_block_map is recreated by gimple_set_bb. */
216 bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
219 if (TREE_CODE (expr) == FIELD_DECL)
221 bp_pack_value (bp, DECL_PACKED (expr), 1);
222 bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
223 bp_pack_value (bp, expr->decl_common.off_align, 8);
226 if (TREE_CODE (expr) == VAR_DECL)
228 bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
229 bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
232 if (TREE_CODE (expr) == RESULT_DECL
233 || TREE_CODE (expr) == PARM_DECL
234 || TREE_CODE (expr) == VAR_DECL)
236 bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
237 if (TREE_CODE (expr) == VAR_DECL
238 || TREE_CODE (expr) == PARM_DECL)
239 bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
244 /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
245 of expression EXPR into bitpack BP. */
247 static void
248 pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
250 bp_pack_value (bp, DECL_REGISTER (expr), 1);
254 /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
255 of expression EXPR into bitpack BP. */
257 static void
258 pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
260 bp_pack_value (bp, DECL_COMMON (expr), 1);
261 bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
262 bp_pack_value (bp, DECL_WEAK (expr), 1);
263 bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr), 1);
264 bp_pack_value (bp, DECL_COMDAT (expr), 1);
265 bp_pack_value (bp, DECL_VISIBILITY (expr), 2);
266 bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr), 1);
268 if (TREE_CODE (expr) == VAR_DECL)
270 bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
271 /* DECL_IN_TEXT_SECTION is set during final asm output only. */
272 bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
275 if (TREE_CODE (expr) == FUNCTION_DECL)
277 bp_pack_value (bp, DECL_FINAL_P (expr), 1);
278 bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1);
279 bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1);
284 /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
285 of expression EXPR into bitpack BP. */
287 static void
288 pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
290 /* For normal/md builtins we only write the class and code, so they
291 should never be handled here. */
292 gcc_assert (!streamer_handle_as_builtin_p (expr));
294 bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
295 DECL_BUILT_IN_CLASS (expr));
296 bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
297 bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
298 bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
299 bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
300 bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
301 bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
302 bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
303 bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
304 bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
305 bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
306 bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
307 bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
308 bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
309 bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
310 bp_pack_value (bp, DECL_PURE_P (expr), 1);
311 bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
312 if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
313 bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 12);
317 /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
318 of expression EXPR into bitpack BP. */
320 static void
321 pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
323 bp_pack_enum (bp, machine_mode, MAX_MACHINE_MODE, TYPE_MODE (expr));
324 bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
325 bp_pack_value (bp, TYPE_NO_FORCE_BLK (expr), 1);
326 bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING (expr), 1);
327 if (RECORD_OR_UNION_TYPE_P (expr))
329 bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
330 bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
332 else if (TREE_CODE (expr) == ARRAY_TYPE)
333 bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
334 bp_pack_value (bp, TYPE_PACKED (expr), 1);
335 bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
336 bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
337 bp_pack_value (bp, TYPE_READONLY (expr), 1);
338 bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
339 bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
340 /* Make sure to preserve the fact whether the frontend would assign
341 alias-set zero to this type. */
342 bp_pack_var_len_int (bp, (TYPE_ALIAS_SET (expr) == 0
343 || (!in_lto_p
344 && get_alias_set (expr) == 0)) ? 0 : -1);
348 /* Pack all the non-pointer fields of the TS_BLOCK structure
349 of expression EXPR into bitpack BP. */
351 static void
352 pack_ts_block_value_fields (struct output_block *ob,
353 struct bitpack_d *bp, tree expr)
355 bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1);
356 /* BLOCK_NUMBER is recomputed. */
357 /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
358 that represent inlined function scopes.
359 For the rest them on the floor instead of ICEing in dwarf2out.c. */
360 if (inlined_function_outer_scope_p (expr))
361 stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
362 else
363 stream_output_location (ob, bp, UNKNOWN_LOCATION);
366 /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
367 of expression EXPR into bitpack BP. */
369 static void
370 pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
371 struct bitpack_d *bp, tree expr)
373 bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
377 /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
378 of expression EXPR into bitpack BP. */
380 static void
381 pack_ts_omp_clause_value_fields (struct output_block *ob,
382 struct bitpack_d *bp, tree expr)
384 stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
385 switch (OMP_CLAUSE_CODE (expr))
387 case OMP_CLAUSE_DEFAULT:
388 bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
389 OMP_CLAUSE_DEFAULT_KIND (expr));
390 break;
391 case OMP_CLAUSE_SCHEDULE:
392 bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
393 OMP_CLAUSE_SCHEDULE_KIND (expr));
394 break;
395 case OMP_CLAUSE_DEPEND:
396 bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
397 OMP_CLAUSE_DEPEND_KIND (expr));
398 break;
399 case OMP_CLAUSE_MAP:
400 bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
401 OMP_CLAUSE_MAP_KIND (expr));
402 break;
403 case OMP_CLAUSE_PROC_BIND:
404 bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
405 OMP_CLAUSE_PROC_BIND_KIND (expr));
406 break;
407 case OMP_CLAUSE_REDUCTION:
408 bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
409 OMP_CLAUSE_REDUCTION_CODE (expr));
410 break;
411 default:
412 break;
417 /* Pack all the bitfields in EXPR into a bit pack. */
419 void
420 streamer_pack_tree_bitfields (struct output_block *ob,
421 struct bitpack_d *bp, tree expr)
423 enum tree_code code;
425 code = TREE_CODE (expr);
427 /* Note that all these functions are highly sensitive to changes in
428 the types and sizes of each of the fields being packed. */
429 pack_ts_base_value_fields (bp, expr);
431 if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
432 pack_ts_int_cst_value_fields (bp, expr);
434 if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
435 pack_ts_real_cst_value_fields (bp, expr);
437 if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
438 pack_ts_fixed_cst_value_fields (bp, expr);
440 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
441 stream_output_location (ob, bp, DECL_SOURCE_LOCATION (expr));
443 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
444 pack_ts_decl_common_value_fields (bp, expr);
446 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
447 pack_ts_decl_wrtl_value_fields (bp, expr);
449 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
450 pack_ts_decl_with_vis_value_fields (bp, expr);
452 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
453 pack_ts_function_decl_value_fields (bp, expr);
455 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
456 pack_ts_type_common_value_fields (bp, expr);
458 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
460 stream_output_location (ob, bp, EXPR_LOCATION (expr));
461 if (code == MEM_REF
462 || code == TARGET_MEM_REF)
464 bp_pack_value (bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
465 if (MR_DEPENDENCE_CLIQUE (expr) != 0)
466 bp_pack_value (bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
470 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
471 pack_ts_block_value_fields (ob, bp, expr);
473 if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
474 pack_ts_translation_unit_decl_value_fields (ob, bp, expr);
476 if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
477 cl_optimization_stream_out (bp, TREE_OPTIMIZATION (expr));
479 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
480 bp_pack_var_len_unsigned (bp, vec_safe_length (BINFO_BASE_ACCESSES (expr)));
482 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
483 bp_pack_var_len_unsigned (bp, CONSTRUCTOR_NELTS (expr));
485 if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
486 /* Don't stream these when passing things to a different target. */
487 && !lto_stream_offload_p)
488 cl_target_option_stream_out (ob, bp, TREE_TARGET_OPTION (expr));
490 if (code == OMP_CLAUSE)
491 pack_ts_omp_clause_value_fields (ob, bp, expr);
495 /* Write the code and class of builtin EXPR to output block OB. IX is
496 the index into the streamer cache where EXPR is stored.*/
498 void
499 streamer_write_builtin (struct output_block *ob, tree expr)
501 gcc_assert (streamer_handle_as_builtin_p (expr));
503 if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD
504 && !targetm.builtin_decl)
505 sorry ("tree bytecode streams do not support machine specific builtin "
506 "functions on this target");
508 streamer_write_record_start (ob, LTO_builtin_decl);
509 streamer_write_enum (ob->main_stream, built_in_class, BUILT_IN_LAST,
510 DECL_BUILT_IN_CLASS (expr));
511 streamer_write_uhwi (ob, DECL_FUNCTION_CODE (expr));
513 if (DECL_ASSEMBLER_NAME_SET_P (expr))
515 /* When the assembler name of a builtin gets a user name,
516 the new name is always prefixed with '*' by
517 set_builtin_user_assembler_name. So, to prevent the
518 reader side from adding a second '*', we omit it here. */
519 const char *str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (expr));
520 if (strlen (str) > 1 && str[0] == '*')
521 streamer_write_string (ob, ob->main_stream, &str[1], true);
522 else
523 streamer_write_string (ob, ob->main_stream, NULL, true);
525 else
526 streamer_write_string (ob, ob->main_stream, NULL, true);
530 /* Emit the chain of tree nodes starting at T. OB is the output block
531 to write to. REF_P is true if chain elements should be emitted
532 as references. */
534 void
535 streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
537 while (t)
539 /* We avoid outputting external vars or functions by reference
540 to the global decls section as we do not want to have them
541 enter decl merging. This is, of course, only for the call
542 for streaming BLOCK_VARS, but other callers are safe.
543 See also lto-streamer-out.c:DFS_write_tree_body. */
544 if (VAR_OR_FUNCTION_DECL_P (t)
545 && DECL_EXTERNAL (t))
546 stream_write_tree_shallow_non_ref (ob, t, ref_p);
547 else
548 stream_write_tree (ob, t, ref_p);
550 t = TREE_CHAIN (t);
553 /* Write a sentinel to terminate the chain. */
554 stream_write_tree (ob, NULL_TREE, ref_p);
558 /* Write all pointer fields in the TS_COMMON structure of EXPR to output
559 block OB. If REF_P is true, write a reference to EXPR's pointer
560 fields. */
562 static void
563 write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
565 if (TREE_CODE (expr) != IDENTIFIER_NODE)
566 stream_write_tree (ob, TREE_TYPE (expr), ref_p);
570 /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
571 block OB. If REF_P is true, write a reference to EXPR's pointer
572 fields. */
574 static void
575 write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
577 unsigned i;
578 /* Note that the number of elements for EXPR has already been emitted
579 in EXPR's header (see streamer_write_tree_header). */
580 for (i = 0; i < VECTOR_CST_NELTS (expr); ++i)
581 stream_write_tree (ob, VECTOR_CST_ELT (expr, i), ref_p);
585 /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
586 block OB. If REF_P is true, write a reference to EXPR's pointer
587 fields. */
589 static void
590 write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
592 stream_write_tree (ob, TREE_REALPART (expr), ref_p);
593 stream_write_tree (ob, TREE_IMAGPART (expr), ref_p);
597 /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
598 to output block OB. If REF_P is true, write a reference to EXPR's
599 pointer fields. */
601 static void
602 write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
603 bool ref_p)
605 /* Drop names that were created for anonymous entities. */
606 if (DECL_NAME (expr)
607 && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
608 && ANON_AGGRNAME_P (DECL_NAME (expr)))
609 stream_write_tree (ob, NULL_TREE, ref_p);
610 else
611 stream_write_tree (ob, DECL_NAME (expr), ref_p);
612 stream_write_tree (ob, DECL_CONTEXT (expr), ref_p);
616 /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
617 output block OB. If REF_P is true, write a reference to EXPR's
618 pointer fields. */
620 static void
621 write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
622 bool ref_p)
624 stream_write_tree (ob, DECL_SIZE (expr), ref_p);
625 stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p);
627 /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs
628 special handling in LTO, it must be handled by streamer hooks. */
630 stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p);
632 /* Do not stream DECL_ABSTRACT_ORIGIN. We cannot handle debug information
633 for early inlining so drop it on the floor instead of ICEing in
634 dwarf2out.c. */
636 if ((TREE_CODE (expr) == VAR_DECL
637 || TREE_CODE (expr) == PARM_DECL)
638 && DECL_HAS_VALUE_EXPR_P (expr))
639 stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p);
641 if (TREE_CODE (expr) == VAR_DECL)
642 stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p);
646 /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
647 EXPR to output block OB. If REF_P is true, write a reference to EXPR's
648 pointer fields. */
650 static void
651 write_ts_decl_non_common_tree_pointers (struct output_block *ob, tree expr,
652 bool ref_p)
654 if (TREE_CODE (expr) == TYPE_DECL)
655 stream_write_tree (ob, DECL_ORIGINAL_TYPE (expr), ref_p);
659 /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
660 to output block OB. If REF_P is true, write a reference to EXPR's
661 pointer fields. */
663 static void
664 write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
665 bool ref_p)
667 /* Make sure we don't inadvertently set the assembler name. */
668 if (DECL_ASSEMBLER_NAME_SET_P (expr))
669 stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
670 else
671 stream_write_tree (ob, NULL_TREE, false);
675 /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
676 output block OB. If REF_P is true, write a reference to EXPR's
677 pointer fields. */
679 static void
680 write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
681 bool ref_p)
683 stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p);
684 stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
685 stream_write_tree (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr), ref_p);
686 stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
687 stream_write_tree (ob, DECL_FCONTEXT (expr), ref_p);
691 /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
692 to output block OB. If REF_P is true, write a reference to EXPR's
693 pointer fields. */
695 static void
696 write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
697 bool ref_p)
699 stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
700 /* DECL_STRUCT_FUNCTION is handled by lto_output_function. */
701 stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
702 /* Don't stream these when passing things to a different target. */
703 if (!lto_stream_offload_p)
704 stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
705 stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
709 /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
710 output block OB. If REF_P is true, write a reference to EXPR's
711 pointer fields. */
713 static void
714 write_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
715 bool ref_p)
717 stream_write_tree (ob, TYPE_SIZE (expr), ref_p);
718 stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p);
719 stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p);
720 stream_write_tree (ob, TYPE_NAME (expr), ref_p);
721 /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be
722 reconstructed during fixup. */
723 /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
724 during fixup. */
725 stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p);
726 stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p);
727 /* TYPE_CANONICAL is re-computed during type merging, so no need
728 to stream it here. */
729 stream_write_tree (ob, TYPE_STUB_DECL (expr), ref_p);
732 /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
733 to output block OB. If REF_P is true, write a reference to EXPR's
734 pointer fields. */
736 static void
737 write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr,
738 bool ref_p)
740 if (TREE_CODE (expr) == ENUMERAL_TYPE)
741 stream_write_tree (ob, TYPE_VALUES (expr), ref_p);
742 else if (TREE_CODE (expr) == ARRAY_TYPE)
743 stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p);
744 else if (RECORD_OR_UNION_TYPE_P (expr))
745 streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p);
746 else if (TREE_CODE (expr) == FUNCTION_TYPE
747 || TREE_CODE (expr) == METHOD_TYPE)
748 stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p);
750 if (!POINTER_TYPE_P (expr))
751 stream_write_tree (ob, TYPE_MINVAL (expr), ref_p);
752 stream_write_tree (ob, TYPE_MAXVAL (expr), ref_p);
753 if (RECORD_OR_UNION_TYPE_P (expr))
754 stream_write_tree (ob, TYPE_BINFO (expr), ref_p);
758 /* Write all pointer fields in the TS_LIST structure of EXPR to output
759 block OB. If REF_P is true, write a reference to EXPR's pointer
760 fields. */
762 static void
763 write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
765 stream_write_tree (ob, TREE_PURPOSE (expr), ref_p);
766 stream_write_tree (ob, TREE_VALUE (expr), ref_p);
767 stream_write_tree (ob, TREE_CHAIN (expr), ref_p);
771 /* Write all pointer fields in the TS_VEC structure of EXPR to output
772 block OB. If REF_P is true, write a reference to EXPR's pointer
773 fields. */
775 static void
776 write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
778 int i;
780 /* Note that the number of slots for EXPR has already been emitted
781 in EXPR's header (see streamer_write_tree_header). */
782 for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
783 stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p);
787 /* Write all pointer fields in the TS_EXP structure of EXPR to output
788 block OB. If REF_P is true, write a reference to EXPR's pointer
789 fields. */
791 static void
792 write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
794 int i;
796 for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
797 stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p);
798 stream_write_tree (ob, TREE_BLOCK (expr), ref_p);
802 /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
803 block OB. If REF_P is true, write a reference to EXPR's pointer
804 fields. */
806 static void
807 write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
809 streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
811 stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
813 /* Stream BLOCK_ABSTRACT_ORIGIN for the limited cases we can handle - those
814 that represent inlined function scopes.
815 For the rest them on the floor instead of ICEing in dwarf2out.c. */
816 if (inlined_function_outer_scope_p (expr))
818 tree ultimate_origin = block_ultimate_origin (expr);
819 stream_write_tree (ob, ultimate_origin, ref_p);
821 else
822 stream_write_tree (ob, NULL_TREE, ref_p);
823 /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information
824 for early inlined BLOCKs so drop it on the floor instead of ICEing in
825 dwarf2out.c. */
827 /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
828 streaming time. */
830 /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
831 list is re-constructed from BLOCK_SUPERCONTEXT. */
835 /* Write all pointer fields in the TS_BINFO structure of EXPR to output
836 block OB. If REF_P is true, write a reference to EXPR's pointer
837 fields. */
839 static void
840 write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
842 unsigned i;
843 tree t;
845 /* Note that the number of BINFO slots has already been emitted in
846 EXPR's header (see streamer_write_tree_header) because this length
847 is needed to build the empty BINFO node on the reader side. */
848 FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
849 stream_write_tree (ob, t, ref_p);
850 stream_write_tree (ob, NULL_TREE, false);
852 stream_write_tree (ob, BINFO_OFFSET (expr), ref_p);
853 stream_write_tree (ob, BINFO_VTABLE (expr), ref_p);
854 stream_write_tree (ob, BINFO_VPTR_FIELD (expr), ref_p);
856 /* The number of BINFO_BASE_ACCESSES has already been emitted in
857 EXPR's bitfield section. */
858 FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
859 stream_write_tree (ob, t, ref_p);
861 /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
862 and BINFO_VPTR_INDEX; these are used by C++ FE only. */
866 /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
867 output block OB. If REF_P is true, write a reference to EXPR's
868 pointer fields. */
870 static void
871 write_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
872 bool ref_p)
874 unsigned i;
875 tree index, value;
877 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
879 stream_write_tree (ob, index, ref_p);
880 stream_write_tree (ob, value, ref_p);
885 /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
886 to output block OB. If REF_P is true, write a reference to EXPR's
887 pointer fields. */
889 static void
890 write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr,
891 bool ref_p)
893 int i;
894 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
895 stream_write_tree (ob, OMP_CLAUSE_OPERAND (expr, i), ref_p);
896 if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_REDUCTION)
898 /* We don't stream these right now, handle it if streaming
899 of them is needed. */
900 gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
901 gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
903 stream_write_tree (ob, OMP_CLAUSE_CHAIN (expr), ref_p);
907 /* Write all pointer fields in EXPR to output block OB. If REF_P is true,
908 the leaves of EXPR are emitted as references. */
910 void
911 streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
913 enum tree_code code;
915 lto_stats.num_tree_bodies_output++;
917 code = TREE_CODE (expr);
919 if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
920 write_ts_common_tree_pointers (ob, expr, ref_p);
922 if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
923 write_ts_vector_tree_pointers (ob, expr, ref_p);
925 if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
926 write_ts_complex_tree_pointers (ob, expr, ref_p);
928 if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
929 write_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
931 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
932 write_ts_decl_common_tree_pointers (ob, expr, ref_p);
934 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
935 write_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
937 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
938 write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
940 if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
941 write_ts_field_decl_tree_pointers (ob, expr, ref_p);
943 if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
944 write_ts_function_decl_tree_pointers (ob, expr, ref_p);
946 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
947 write_ts_type_common_tree_pointers (ob, expr, ref_p);
949 if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
950 write_ts_type_non_common_tree_pointers (ob, expr, ref_p);
952 if (CODE_CONTAINS_STRUCT (code, TS_LIST))
953 write_ts_list_tree_pointers (ob, expr, ref_p);
955 if (CODE_CONTAINS_STRUCT (code, TS_VEC))
956 write_ts_vec_tree_pointers (ob, expr, ref_p);
958 if (CODE_CONTAINS_STRUCT (code, TS_EXP))
959 write_ts_exp_tree_pointers (ob, expr, ref_p);
961 if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
962 write_ts_block_tree_pointers (ob, expr, ref_p);
964 if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
965 write_ts_binfo_tree_pointers (ob, expr, ref_p);
967 if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
968 write_ts_constructor_tree_pointers (ob, expr, ref_p);
970 if (code == OMP_CLAUSE)
971 write_ts_omp_clause_tree_pointers (ob, expr, ref_p);
975 /* Emit header information for tree EXPR to output block OB. The header
976 contains everything needed to instantiate an empty skeleton for
977 EXPR on the reading side. IX is the index into the streamer cache
978 where EXPR is stored. */
980 void
981 streamer_write_tree_header (struct output_block *ob, tree expr)
983 enum LTO_tags tag;
984 enum tree_code code;
986 /* We should not see any tree nodes not handled by the streamer. */
987 code = TREE_CODE (expr);
989 /* The header of a tree node consists of its tag, the size of
990 the node, and any other information needed to instantiate
991 EXPR on the reading side (such as the number of slots in
992 variable sized nodes). */
993 tag = lto_tree_code_to_tag (code);
994 streamer_write_record_start (ob, tag);
996 /* The following will cause bootstrap miscomparisons. Enable with care. */
997 #ifdef LTO_STREAMER_DEBUG
998 /* This is used mainly for debugging purposes. When the reader
999 and the writer do not agree on a streamed node, the pointer
1000 value for EXPR can be used to track down the differences in
1001 the debugger. */
1002 gcc_assert ((HOST_WIDE_INT) (intptr_t) expr == (intptr_t) expr);
1003 streamer_write_hwi (ob, (HOST_WIDE_INT) (intptr_t) expr);
1004 #endif
1006 /* The text in strings and identifiers are completely emitted in
1007 the header. */
1008 if (CODE_CONTAINS_STRUCT (code, TS_STRING))
1009 streamer_write_string_cst (ob, ob->main_stream, expr);
1010 else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
1011 write_identifier (ob, ob->main_stream, expr);
1012 else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
1013 streamer_write_hwi (ob, VECTOR_CST_NELTS (expr));
1014 else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
1015 streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
1016 else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
1017 streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
1018 else if (TREE_CODE (expr) == CALL_EXPR)
1019 streamer_write_uhwi (ob, call_expr_nargs (expr));
1020 else if (TREE_CODE (expr) == OMP_CLAUSE)
1021 streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
1022 else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
1024 gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
1025 streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
1026 streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
1031 /* Emit the integer constant CST to output block OB. If REF_P is true,
1032 CST's type will be emitted as a reference. */
1034 void
1035 streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p)
1037 int i;
1038 int len = TREE_INT_CST_NUNITS (cst);
1039 gcc_assert (!TREE_OVERFLOW (cst));
1040 streamer_write_record_start (ob, LTO_integer_cst);
1041 stream_write_tree (ob, TREE_TYPE (cst), ref_p);
1042 /* We're effectively streaming a non-sign-extended wide_int here,
1043 so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
1044 array members beyond LEN. We'll recreate the tree from the
1045 wide_int and the type. */
1046 streamer_write_uhwi (ob, len);
1047 for (i = 0; i < len; i++)
1048 streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));