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