1 /* Routines for emitting trees to a file stream.
2 
3    Copyright (C) 2011-2018 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   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, DECL_PADDING_P (expr), 1);
215       bp_pack_value (bp, expr->decl_common.off_align, 8);
216     }
217 
218   if (VAR_P (expr))
219     {
220       bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
221       bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
222     }
223 
224   if (TREE_CODE (expr) == RESULT_DECL
225       || TREE_CODE (expr) == PARM_DECL
226       || VAR_P (expr))
227     {
228       bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
229       if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
230 	bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
231     }
232 }
233 
234 
235 /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
236    of expression EXPR into bitpack BP.  */
237 
238 static void
239 pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
240 {
241   bp_pack_value (bp, DECL_REGISTER (expr), 1);
242 }
243 
244 
245 /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
246    of expression EXPR into bitpack BP.  */
247 
248 static void
249 pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
250 {
251   bp_pack_value (bp, DECL_COMMON (expr), 1);
252   bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
253   bp_pack_value (bp, DECL_WEAK (expr), 1);
254   bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr),  1);
255   bp_pack_value (bp, DECL_COMDAT (expr),  1);
256   bp_pack_value (bp, DECL_VISIBILITY (expr),  2);
257   bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr),  1);
258 
259   if (VAR_P (expr))
260     {
261       bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
262       /* DECL_IN_TEXT_SECTION is set during final asm output only. */
263       bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
264     }
265 
266   if (TREE_CODE (expr) == FUNCTION_DECL)
267     {
268       bp_pack_value (bp, DECL_FINAL_P (expr), 1);
269       bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1);
270       bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1);
271     }
272 }
273 
274 
275 /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
276    of expression EXPR into bitpack BP.  */
277 
278 static void
279 pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
280 {
281   bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
282 		DECL_BUILT_IN_CLASS (expr));
283   bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
284   bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
285   bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
286   bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
287   bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
288   bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
289   bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
290   bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
291   bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
292   bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
293   bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
294   bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
295   bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
296   bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
297   bp_pack_value (bp, DECL_PURE_P (expr), 1);
298   bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
299   if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
300     bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 12);
301 }
302 
303 
304 /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
305    of expression EXPR into bitpack BP.  */
306 
307 static void
308 pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
309 {
310   /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags
311      not necessary valid in a global context.
312      Use the raw value previously set by layout_type.  */
313   bp_pack_machine_mode (bp, TYPE_MODE_RAW (expr));
314   bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
315   /* TYPE_NO_FORCE_BLK is private to stor-layout and need
316      no streaming.  */
317   bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING (expr), 1);
318   bp_pack_value (bp, TYPE_PACKED (expr), 1);
319   bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
320   bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
321   bp_pack_value (bp, TYPE_READONLY (expr), 1);
322   /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark
323      types that are opaque for TBAA.  This however did not work as intended,
324      because TYPE_ALIAS_SET == 0 was regularly lost in type merging.  */
325   if (RECORD_OR_UNION_TYPE_P (expr))
326     {
327       bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
328       bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
329     }
330   else if (TREE_CODE (expr) == ARRAY_TYPE)
331     bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
332   if (AGGREGATE_TYPE_P (expr))
333     bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1);
334   bp_pack_value (bp, TYPE_EMPTY_P (expr), 1);
335   bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
336   bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
337 }
338 
339 
340 /* Pack all the non-pointer fields of the TS_BLOCK structure
341    of expression EXPR into bitpack BP.  */
342 
343 static void
344 pack_ts_block_value_fields (struct output_block *ob,
345 			    struct bitpack_d *bp, tree expr)
346 {
347   bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1);
348   /* BLOCK_NUMBER is recomputed.  */
349   /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
350      that represent inlined function scopes.
351      For the rest them on the floor instead of ICEing in dwarf2out.c.  */
352   if (inlined_function_outer_scope_p (expr))
353     stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
354   else
355     stream_output_location (ob, bp, UNKNOWN_LOCATION);
356 }
357 
358 /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
359    of expression EXPR into bitpack BP.  */
360 
361 static void
362 pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
363 					    struct bitpack_d *bp, tree expr)
364 {
365   bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
366 }
367 
368 
369 /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
370    of expression EXPR into bitpack BP.  */
371 
372 static void
373 pack_ts_omp_clause_value_fields (struct output_block *ob,
374 				 struct bitpack_d *bp, tree expr)
375 {
376   stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
377   switch (OMP_CLAUSE_CODE (expr))
378     {
379     case OMP_CLAUSE_DEFAULT:
380       bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
381 		    OMP_CLAUSE_DEFAULT_KIND (expr));
382       break;
383     case OMP_CLAUSE_SCHEDULE:
384       bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
385 		    OMP_CLAUSE_SCHEDULE_KIND (expr));
386       break;
387     case OMP_CLAUSE_DEPEND:
388       bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
389 		    OMP_CLAUSE_DEPEND_KIND (expr));
390       break;
391     case OMP_CLAUSE_MAP:
392       bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
393 		    OMP_CLAUSE_MAP_KIND (expr));
394       break;
395     case OMP_CLAUSE_PROC_BIND:
396       bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
397 		    OMP_CLAUSE_PROC_BIND_KIND (expr));
398       break;
399     case OMP_CLAUSE_REDUCTION:
400       bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
401 		    OMP_CLAUSE_REDUCTION_CODE (expr));
402       break;
403     default:
404       break;
405     }
406 }
407 
408 
409 /* Pack all the bitfields in EXPR into a bit pack.  */
410 
411 void
412 streamer_write_tree_bitfields (struct output_block *ob, tree expr)
413 {
414   bitpack_d bp = bitpack_create (ob->main_stream);
415   enum tree_code code;
416 
417   code = TREE_CODE (expr);
418 
419   /* Note that all these functions are highly sensitive to changes in
420      the types and sizes of each of the fields being packed.  */
421   pack_ts_base_value_fields (&bp, expr);
422 
423   if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
424     pack_ts_int_cst_value_fields (&bp, expr);
425 
426   if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
427     pack_ts_real_cst_value_fields (&bp, expr);
428 
429   if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
430     pack_ts_fixed_cst_value_fields (&bp, expr);
431 
432   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
433     stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr));
434 
435   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
436     pack_ts_decl_common_value_fields (&bp, expr);
437 
438   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
439     pack_ts_decl_wrtl_value_fields (&bp, expr);
440 
441   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
442     pack_ts_decl_with_vis_value_fields (&bp, expr);
443 
444   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
445     pack_ts_function_decl_value_fields (&bp, expr);
446 
447   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
448     pack_ts_type_common_value_fields (&bp, expr);
449 
450   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
451     {
452       stream_output_location (ob, &bp, EXPR_LOCATION (expr));
453       if (code == MEM_REF
454 	  || code == TARGET_MEM_REF)
455 	{
456 	  bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
457 	  if (MR_DEPENDENCE_CLIQUE (expr) != 0)
458 	    bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
459 	}
460     }
461 
462   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
463     pack_ts_block_value_fields (ob, &bp, expr);
464 
465   if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
466     pack_ts_translation_unit_decl_value_fields (ob, &bp, expr);
467 
468   if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
469     cl_optimization_stream_out (&bp, TREE_OPTIMIZATION (expr));
470 
471   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
472     bp_pack_var_len_unsigned (&bp, vec_safe_length (BINFO_BASE_ACCESSES (expr)));
473 
474   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
475     bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr));
476 
477   if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
478       /* Don't stream these when passing things to a different target.  */
479       && !lto_stream_offload_p)
480     cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr));
481 
482   if (code == OMP_CLAUSE)
483     pack_ts_omp_clause_value_fields (ob, &bp, expr);
484 
485   streamer_write_bitpack (&bp);
486 }
487 
488 
489 /* Emit the chain of tree nodes starting at T.  OB is the output block
490    to write to.  REF_P is true if chain elements should be emitted
491    as references.  */
492 
493 void
494 streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
495 {
496   while (t)
497     {
498       /* We avoid outputting external vars or functions by reference
499 	 to the global decls section as we do not want to have them
500 	 enter decl merging.  This is, of course, only for the call
501 	 for streaming BLOCK_VARS, but other callers are safe.
502 	 See also lto-streamer-out.c:DFS_write_tree_body.  */
503       if (VAR_OR_FUNCTION_DECL_P (t)
504 	  && DECL_EXTERNAL (t))
505 	stream_write_tree_shallow_non_ref (ob, t, ref_p);
506       else
507 	stream_write_tree (ob, t, ref_p);
508 
509       t = TREE_CHAIN (t);
510     }
511 
512   /* Write a sentinel to terminate the chain.  */
513   stream_write_tree (ob, NULL_TREE, ref_p);
514 }
515 
516 
517 /* Write all pointer fields in the TS_COMMON structure of EXPR to output
518    block OB.  If REF_P is true, write a reference to EXPR's pointer
519    fields.  */
520 
521 static void
522 write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
523 {
524   if (TREE_CODE (expr) != IDENTIFIER_NODE)
525     stream_write_tree (ob, TREE_TYPE (expr), ref_p);
526 }
527 
528 
529 /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
530    block OB.  If REF_P is true, write a reference to EXPR's pointer
531    fields.  */
532 
533 static void
534 write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
535 {
536   /* Note that the number of elements for EXPR has already been emitted
537      in EXPR's header (see streamer_write_tree_header).  */
538   unsigned int count = vector_cst_encoded_nelts (expr);
539   for (unsigned int i = 0; i < count; ++i)
540     stream_write_tree (ob, VECTOR_CST_ENCODED_ELT (expr, i), ref_p);
541 }
542 
543 
544 /* Write all pointer fields in the TS_POLY_INT_CST structure of EXPR to
545    output block OB.  If REF_P is true, write a reference to EXPR's pointer
546    fields.  */
547 
548 static void
549 write_ts_poly_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
550 {
551   for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
552     stream_write_tree (ob, POLY_INT_CST_COEFF (expr, i), ref_p);
553 }
554 
555 
556 /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
557    block OB.  If REF_P is true, write a reference to EXPR's pointer
558    fields.  */
559 
560 static void
561 write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
562 {
563   stream_write_tree (ob, TREE_REALPART (expr), ref_p);
564   stream_write_tree (ob, TREE_IMAGPART (expr), ref_p);
565 }
566 
567 
568 /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
569    to output block OB.  If REF_P is true, write a reference to EXPR's
570    pointer fields.  */
571 
572 static void
573 write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
574 				     bool ref_p)
575 {
576   /* Drop names that were created for anonymous entities.  */
577   if (DECL_NAME (expr)
578       && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
579       && anon_aggrname_p (DECL_NAME (expr)))
580     stream_write_tree (ob, NULL_TREE, ref_p);
581   else
582     stream_write_tree (ob, DECL_NAME (expr), ref_p);
583   if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
584       && ! DECL_CONTEXT (expr))
585     stream_write_tree (ob, (*all_translation_units)[0], ref_p);
586   else
587     stream_write_tree (ob, DECL_CONTEXT (expr), ref_p);
588 }
589 
590 
591 /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
592    output block OB.  If REF_P is true, write a reference to EXPR's
593    pointer fields.  */
594 
595 static void
596 write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
597 				    bool ref_p)
598 {
599   stream_write_tree (ob, DECL_SIZE (expr), ref_p);
600   stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p);
601 
602   /* Note, DECL_INITIAL is not handled here.  Since DECL_INITIAL needs
603      special handling in LTO, it must be handled by streamer hooks.  */
604 
605   stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p);
606   stream_write_tree (ob, DECL_ABSTRACT_ORIGIN (expr), ref_p);
607 
608   if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
609       && DECL_HAS_VALUE_EXPR_P (expr))
610     stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p);
611 
612   if (VAR_P (expr)
613       && DECL_HAS_DEBUG_EXPR_P (expr))
614     stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p);
615 }
616 
617 
618 /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
619    EXPR 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_non_common_tree_pointers (struct output_block *ob, tree expr,
624 				        bool ref_p)
625 {
626   if (TREE_CODE (expr) == TYPE_DECL)
627     stream_write_tree (ob, DECL_ORIGINAL_TYPE (expr), ref_p);
628 }
629 
630 
631 /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
632    to output block OB.  If REF_P is true, write a reference to EXPR's
633    pointer fields.  */
634 
635 static void
636 write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
637 			              bool ref_p)
638 {
639   /* Make sure we don't inadvertently set the assembler name.  */
640   if (DECL_ASSEMBLER_NAME_SET_P (expr))
641     stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
642   else
643     stream_write_tree (ob, NULL_TREE, false);
644 }
645 
646 
647 /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
648    output block OB.  If REF_P is true, write a reference to EXPR's
649    pointer fields.  */
650 
651 static void
652 write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
653 				   bool ref_p)
654 {
655   stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p);
656   stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
657   stream_write_tree (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr), ref_p);
658   stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
659   stream_write_tree (ob, DECL_FCONTEXT (expr), ref_p);
660 }
661 
662 
663 /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
664    to output block OB.  If REF_P is true, write a reference to EXPR's
665    pointer fields.  */
666 
667 static void
668 write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
669 				      bool ref_p)
670 {
671   stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
672   /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  */
673   stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
674   /* Don't stream these when passing things to a different target.  */
675   if (!lto_stream_offload_p)
676     stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
677   stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
678 }
679 
680 
681 /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
682    output block OB.  If REF_P is true, write a reference to EXPR's
683    pointer fields.  */
684 
685 static void
686 write_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
687 				    bool ref_p)
688 {
689   stream_write_tree (ob, TYPE_SIZE (expr), ref_p);
690   stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p);
691   stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p);
692   stream_write_tree (ob, TYPE_NAME (expr), ref_p);
693   /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO.  They will be
694      reconstructed during fixup.  */
695   /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
696      during fixup.  */
697   stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p);
698   stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p);
699   /* TYPE_CANONICAL is re-computed during type merging, so no need
700      to stream it here.  */
701   stream_write_tree (ob, TYPE_STUB_DECL (expr), ref_p);
702 }
703 
704 /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
705    to output block OB.  If REF_P is true, write a reference to EXPR's
706    pointer fields.  */
707 
708 static void
709 write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr,
710 					bool ref_p)
711 {
712   if (TREE_CODE (expr) == ENUMERAL_TYPE)
713     stream_write_tree (ob, TYPE_VALUES (expr), ref_p);
714   else if (TREE_CODE (expr) == ARRAY_TYPE)
715     stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p);
716   else if (RECORD_OR_UNION_TYPE_P (expr))
717     streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p);
718   else if (TREE_CODE (expr) == FUNCTION_TYPE
719 	   || TREE_CODE (expr) == METHOD_TYPE)
720     stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p);
721 
722   if (!POINTER_TYPE_P (expr))
723     stream_write_tree (ob, TYPE_MIN_VALUE_RAW (expr), ref_p);
724   stream_write_tree (ob, TYPE_MAX_VALUE_RAW (expr), ref_p);
725 }
726 
727 
728 /* Write all pointer fields in the TS_LIST structure of EXPR to output
729    block OB.  If REF_P is true, write a reference to EXPR's pointer
730    fields.  */
731 
732 static void
733 write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
734 {
735   stream_write_tree (ob, TREE_PURPOSE (expr), ref_p);
736   stream_write_tree (ob, TREE_VALUE (expr), ref_p);
737   stream_write_tree (ob, TREE_CHAIN (expr), ref_p);
738 }
739 
740 
741 /* Write all pointer fields in the TS_VEC structure of EXPR to output
742    block OB.  If REF_P is true, write a reference to EXPR's pointer
743    fields.  */
744 
745 static void
746 write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
747 {
748   int i;
749 
750   /* Note that the number of slots for EXPR has already been emitted
751      in EXPR's header (see streamer_write_tree_header).  */
752   for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
753     stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p);
754 }
755 
756 
757 /* Write all pointer fields in the TS_EXP structure of EXPR to output
758    block OB.  If REF_P is true, write a reference to EXPR's pointer
759    fields.  */
760 
761 static void
762 write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
763 {
764   int i;
765 
766   for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
767     stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p);
768   stream_write_tree (ob, TREE_BLOCK (expr), ref_p);
769 }
770 
771 
772 /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
773    block OB.  If REF_P is true, write a reference to EXPR's pointer
774    fields.  */
775 
776 static void
777 write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
778 {
779   streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
780 
781   stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
782 
783   /* Stream BLOCK_ABSTRACT_ORIGIN for the limited cases we can handle - those
784      that represent inlined function scopes.
785      For the rest them on the floor instead of ICEing in dwarf2out.c, but
786      keep the notion of whether the block is an inlined block by refering
787      to itself for the sake of tree_nonartificial_location.  */
788   if (inlined_function_outer_scope_p (expr))
789     {
790       tree ultimate_origin = block_ultimate_origin (expr);
791       stream_write_tree (ob, ultimate_origin, ref_p);
792     }
793   else
794     stream_write_tree (ob, (BLOCK_ABSTRACT_ORIGIN (expr)
795 			    ? expr : NULL_TREE), ref_p);
796   /* Do not stream BLOCK_NONLOCALIZED_VARS.  We cannot handle debug information
797      for early inlined BLOCKs so drop it on the floor instead of ICEing in
798      dwarf2out.c.  */
799 
800   /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
801      streaming time.  */
802 
803   /* Do not output BLOCK_SUBBLOCKS.  Instead on streaming-in this
804      list is re-constructed from BLOCK_SUPERCONTEXT.  */
805 }
806 
807 
808 /* Write all pointer fields in the TS_BINFO structure of EXPR to output
809    block OB.  If REF_P is true, write a reference to EXPR's pointer
810    fields.  */
811 
812 static void
813 write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
814 {
815   unsigned i;
816   tree t;
817 
818   /* Note that the number of BINFO slots has already been emitted in
819      EXPR's header (see streamer_write_tree_header) because this length
820      is needed to build the empty BINFO node on the reader side.  */
821   FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
822     stream_write_tree (ob, t, ref_p);
823   stream_write_tree (ob, NULL_TREE, false);
824 
825   stream_write_tree (ob, BINFO_OFFSET (expr), ref_p);
826   stream_write_tree (ob, BINFO_VTABLE (expr), ref_p);
827   stream_write_tree (ob, BINFO_VPTR_FIELD (expr), ref_p);
828 
829   /* The number of BINFO_BASE_ACCESSES has already been emitted in
830      EXPR's bitfield section.  */
831   FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
832     stream_write_tree (ob, t, ref_p);
833 
834   /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
835      and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
836 }
837 
838 
839 /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
840    output block OB.  If REF_P is true, write a reference to EXPR's
841    pointer fields.  */
842 
843 static void
844 write_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
845 				    bool ref_p)
846 {
847   unsigned i;
848   tree index, value;
849 
850   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
851     {
852       stream_write_tree (ob, index, ref_p);
853       stream_write_tree (ob, value, ref_p);
854     }
855 }
856 
857 
858 /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
859    to output block OB.  If REF_P is true, write a reference to EXPR's
860    pointer fields.  */
861 
862 static void
863 write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr,
864 				   bool ref_p)
865 {
866   int i;
867   for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
868     stream_write_tree (ob, OMP_CLAUSE_OPERAND (expr, i), ref_p);
869   if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_REDUCTION)
870     {
871       /* We don't stream these right now, handle it if streaming
872 	 of them is needed.  */
873       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
874       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
875     }
876   stream_write_tree (ob, OMP_CLAUSE_CHAIN (expr), ref_p);
877 }
878 
879 
880 /* Write all pointer fields in EXPR to output block OB.  If REF_P is true,
881    the leaves of EXPR are emitted as references.  */
882 
883 void
884 streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
885 {
886   enum tree_code code;
887 
888   lto_stats.num_tree_bodies_output++;
889 
890   code = TREE_CODE (expr);
891 
892   if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
893     write_ts_common_tree_pointers (ob, expr, ref_p);
894 
895   if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
896     write_ts_vector_tree_pointers (ob, expr, ref_p);
897 
898   if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
899     write_ts_poly_tree_pointers (ob, expr, ref_p);
900 
901   if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
902     write_ts_complex_tree_pointers (ob, expr, ref_p);
903 
904   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
905     write_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
906 
907   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
908     write_ts_decl_common_tree_pointers (ob, expr, ref_p);
909 
910   if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
911     write_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
912 
913   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
914     write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
915 
916   if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
917     write_ts_field_decl_tree_pointers (ob, expr, ref_p);
918 
919   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
920     write_ts_function_decl_tree_pointers (ob, expr, ref_p);
921 
922   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
923     write_ts_type_common_tree_pointers (ob, expr, ref_p);
924 
925   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
926     write_ts_type_non_common_tree_pointers (ob, expr, ref_p);
927 
928   if (CODE_CONTAINS_STRUCT (code, TS_LIST))
929     write_ts_list_tree_pointers (ob, expr, ref_p);
930 
931   if (CODE_CONTAINS_STRUCT (code, TS_VEC))
932     write_ts_vec_tree_pointers (ob, expr, ref_p);
933 
934   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
935     write_ts_exp_tree_pointers (ob, expr, ref_p);
936 
937   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
938     write_ts_block_tree_pointers (ob, expr, ref_p);
939 
940   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
941     write_ts_binfo_tree_pointers (ob, expr, ref_p);
942 
943   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
944     write_ts_constructor_tree_pointers (ob, expr, ref_p);
945 
946   if (code == OMP_CLAUSE)
947     write_ts_omp_clause_tree_pointers (ob, expr, ref_p);
948 }
949 
950 
951 /* Emit header information for tree EXPR to output block OB.  The header
952    contains everything needed to instantiate an empty skeleton for
953    EXPR on the reading side.  IX is the index into the streamer cache
954    where EXPR is stored.  */
955 
956 void
957 streamer_write_tree_header (struct output_block *ob, tree expr)
958 {
959   enum LTO_tags tag;
960   enum tree_code code;
961 
962   /* We should not see any tree nodes not handled by the streamer.  */
963   code = TREE_CODE (expr);
964 
965   /* The header of a tree node consists of its tag, the size of
966      the node, and any other information needed to instantiate
967      EXPR on the reading side (such as the number of slots in
968      variable sized nodes).  */
969   tag = lto_tree_code_to_tag (code);
970   streamer_write_record_start (ob, tag);
971 
972   /* The text in strings and identifiers are completely emitted in
973      the header.  */
974   if (CODE_CONTAINS_STRUCT (code, TS_STRING))
975     streamer_write_string_cst (ob, ob->main_stream, expr);
976   else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
977     write_identifier (ob, ob->main_stream, expr);
978   else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
979     {
980       bitpack_d bp = bitpack_create (ob->main_stream);
981       bp_pack_value (&bp, VECTOR_CST_LOG2_NPATTERNS (expr), 8);
982       bp_pack_value (&bp, VECTOR_CST_NELTS_PER_PATTERN (expr), 8);
983       streamer_write_bitpack (&bp);
984     }
985   else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
986     streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
987   else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
988     streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
989   else if (TREE_CODE (expr) == CALL_EXPR)
990     streamer_write_uhwi (ob, call_expr_nargs (expr));
991   else if (TREE_CODE (expr) == OMP_CLAUSE)
992     streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
993   else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
994     {
995       gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
996       streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
997       streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
998     }
999 }
1000 
1001 
1002 /* Emit the integer constant CST to output block OB.  If REF_P is true,
1003    CST's type will be emitted as a reference.  */
1004 
1005 void
1006 streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p)
1007 {
1008   int i;
1009   int len = TREE_INT_CST_NUNITS (cst);
1010   gcc_assert (!TREE_OVERFLOW (cst));
1011   streamer_write_record_start (ob, LTO_integer_cst);
1012   stream_write_tree (ob, TREE_TYPE (cst), ref_p);
1013   /* We're effectively streaming a non-sign-extended wide_int here,
1014      so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
1015      array members beyond LEN.  We'll recreate the tree from the
1016      wide_int and the type.  */
1017   streamer_write_uhwi (ob, len);
1018   for (i = 0; i < len; i++)
1019     streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));
1020 }
1021