110d565efSmrg /* Routines for emitting trees to a file stream.
210d565efSmrg 
3*c7a68eb7Smrg    Copyright (C) 2011-2018 Free Software Foundation, Inc.
410d565efSmrg    Contributed by Diego Novillo <dnovillo@google.com>
510d565efSmrg 
610d565efSmrg This file is part of GCC.
710d565efSmrg 
810d565efSmrg GCC is free software; you can redistribute it and/or modify it under
910d565efSmrg the terms of the GNU General Public License as published by the Free
1010d565efSmrg Software Foundation; either version 3, or (at your option) any later
1110d565efSmrg version.
1210d565efSmrg 
1310d565efSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
1410d565efSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
1510d565efSmrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1610d565efSmrg for more details.
1710d565efSmrg 
1810d565efSmrg You should have received a copy of the GNU General Public License
1910d565efSmrg along with GCC; see the file COPYING3.  If not see
2010d565efSmrg <http://www.gnu.org/licenses/>.  */
2110d565efSmrg 
2210d565efSmrg #include "config.h"
2310d565efSmrg #include "system.h"
2410d565efSmrg #include "coretypes.h"
2510d565efSmrg #include "backend.h"
2610d565efSmrg #include "target.h"
2710d565efSmrg #include "tree.h"
2810d565efSmrg #include "gimple.h"
2910d565efSmrg #include "tree-streamer.h"
3010d565efSmrg #include "cgraph.h"
3110d565efSmrg #include "alias.h"
3210d565efSmrg #include "stor-layout.h"
3310d565efSmrg #include "gomp-constants.h"
3410d565efSmrg 
3510d565efSmrg 
3610d565efSmrg /* Output the STRING constant to the string
3710d565efSmrg    table in OB.  Then put the index onto the INDEX_STREAM.  */
3810d565efSmrg 
3910d565efSmrg void
4010d565efSmrg streamer_write_string_cst (struct output_block *ob,
4110d565efSmrg 			   struct lto_output_stream *index_stream,
4210d565efSmrg 			   tree string)
4310d565efSmrg {
4410d565efSmrg   streamer_write_string_with_length (ob, index_stream,
4510d565efSmrg 				     string ? TREE_STRING_POINTER (string)
4610d565efSmrg 					    : NULL,
4710d565efSmrg 				     string ? TREE_STRING_LENGTH (string) : 0,
4810d565efSmrg 				     true);
4910d565efSmrg }
5010d565efSmrg 
5110d565efSmrg 
5210d565efSmrg /* Output the identifier ID to the string
5310d565efSmrg    table in OB.  Then put the index onto the INDEX_STREAM.  */
5410d565efSmrg 
5510d565efSmrg static void
5610d565efSmrg write_identifier (struct output_block *ob,
5710d565efSmrg 		   struct lto_output_stream *index_stream,
5810d565efSmrg 		   tree id)
5910d565efSmrg {
6010d565efSmrg   streamer_write_string_with_length (ob, index_stream,
6110d565efSmrg 				     IDENTIFIER_POINTER (id),
6210d565efSmrg 				     IDENTIFIER_LENGTH (id),
6310d565efSmrg 				     true);
6410d565efSmrg }
6510d565efSmrg 
6610d565efSmrg 
6710d565efSmrg /* Pack all the non-pointer fields of the TS_BASE structure of
6810d565efSmrg    expression EXPR into bitpack BP.  */
6910d565efSmrg 
7010d565efSmrg static inline void
7110d565efSmrg pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
7210d565efSmrg {
7310d565efSmrg   bp_pack_value (bp, TREE_CODE (expr), 16);
7410d565efSmrg   if (!TYPE_P (expr))
7510d565efSmrg     {
7610d565efSmrg       bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
7710d565efSmrg       bp_pack_value (bp, TREE_CONSTANT (expr), 1);
7810d565efSmrg       bp_pack_value (bp, TREE_READONLY (expr), 1);
7910d565efSmrg 
8010d565efSmrg       /* TREE_PUBLIC is used on types to indicate that the type
8110d565efSmrg 	 has a TYPE_CACHED_VALUES vector.  This is not streamed out,
8210d565efSmrg 	 so we skip it here.  */
8310d565efSmrg       bp_pack_value (bp, TREE_PUBLIC (expr), 1);
8410d565efSmrg     }
8510d565efSmrg   else
8610d565efSmrg     bp_pack_value (bp, 0, 4);
8710d565efSmrg   bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
8810d565efSmrg   bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
8910d565efSmrg   if (DECL_P (expr))
9010d565efSmrg     {
9110d565efSmrg       bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
9210d565efSmrg       bp_pack_value (bp, DECL_NAMELESS (expr), 1);
9310d565efSmrg     }
9410d565efSmrg   else if (TYPE_P (expr))
9510d565efSmrg     bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
9610d565efSmrg   else
9710d565efSmrg     bp_pack_value (bp, 0, 1);
9810d565efSmrg   /* We write debug info two times, do not confuse the second one.
9910d565efSmrg      The only relevant TREE_ASM_WRITTEN use is on SSA names.  */
10010d565efSmrg   bp_pack_value (bp, (TREE_CODE (expr) != SSA_NAME
10110d565efSmrg 		      ? 0 : TREE_ASM_WRITTEN (expr)), 1);
10210d565efSmrg   if (TYPE_P (expr))
10310d565efSmrg     bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
10410d565efSmrg   else
10510d565efSmrg     bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
10610d565efSmrg   bp_pack_value (bp, TREE_NOTHROW (expr), 1);
10710d565efSmrg   bp_pack_value (bp, TREE_STATIC (expr), 1);
10810d565efSmrg   if (TREE_CODE (expr) != TREE_BINFO)
10910d565efSmrg     bp_pack_value (bp, TREE_PRIVATE (expr), 1);
11010d565efSmrg   else
11110d565efSmrg     bp_pack_value (bp, 0, 1);
11210d565efSmrg   bp_pack_value (bp, TREE_PROTECTED (expr), 1);
11310d565efSmrg   bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
11410d565efSmrg   if (TYPE_P (expr))
11510d565efSmrg     {
11610d565efSmrg       if (AGGREGATE_TYPE_P (expr))
11710d565efSmrg 	bp_pack_value (bp, TYPE_REVERSE_STORAGE_ORDER (expr), 1);
11810d565efSmrg       else
11910d565efSmrg 	bp_pack_value (bp, TYPE_SATURATING (expr), 1);
12010d565efSmrg       bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8);
12110d565efSmrg     }
12210d565efSmrg   else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
12310d565efSmrg     {
12410d565efSmrg       bp_pack_value (bp, REF_REVERSE_STORAGE_ORDER (expr), 1);
12510d565efSmrg       bp_pack_value (bp, 0, 8);
12610d565efSmrg     }
12710d565efSmrg   else if (TREE_CODE (expr) == SSA_NAME)
12810d565efSmrg     {
12910d565efSmrg       bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
13010d565efSmrg       bp_pack_value (bp, 0, 8);
13110d565efSmrg     }
132*c7a68eb7Smrg   else if (TREE_CODE (expr) == CALL_EXPR)
133*c7a68eb7Smrg     {
134*c7a68eb7Smrg       bp_pack_value (bp, CALL_EXPR_BY_DESCRIPTOR (expr), 1);
135*c7a68eb7Smrg       bp_pack_value (bp, 0, 8);
136*c7a68eb7Smrg     }
13710d565efSmrg   else
13810d565efSmrg     bp_pack_value (bp, 0, 9);
13910d565efSmrg }
14010d565efSmrg 
14110d565efSmrg 
14210d565efSmrg /* Pack all the non-pointer fields of the TS_INTEGER_CST structure of
14310d565efSmrg    expression EXPR into bitpack BP.  */
14410d565efSmrg 
14510d565efSmrg static void
14610d565efSmrg pack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
14710d565efSmrg {
14810d565efSmrg   int i;
14910d565efSmrg   /* Note that the number of elements has already been written out in
15010d565efSmrg      streamer_write_tree_header.  */
15110d565efSmrg   for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
15210d565efSmrg     bp_pack_var_len_int (bp, TREE_INT_CST_ELT (expr, i));
15310d565efSmrg }
15410d565efSmrg 
15510d565efSmrg 
15610d565efSmrg /* Pack all the non-pointer fields of the TS_REAL_CST structure of
15710d565efSmrg    expression EXPR into bitpack BP.  */
15810d565efSmrg 
15910d565efSmrg static void
16010d565efSmrg pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
16110d565efSmrg {
16210d565efSmrg   unsigned i;
16310d565efSmrg   REAL_VALUE_TYPE r;
16410d565efSmrg 
16510d565efSmrg   r = TREE_REAL_CST (expr);
16610d565efSmrg   bp_pack_value (bp, r.cl, 2);
16710d565efSmrg   bp_pack_value (bp, r.decimal, 1);
16810d565efSmrg   bp_pack_value (bp, r.sign, 1);
16910d565efSmrg   bp_pack_value (bp, r.signalling, 1);
17010d565efSmrg   bp_pack_value (bp, r.canonical, 1);
17110d565efSmrg   bp_pack_value (bp, r.uexp, EXP_BITS);
17210d565efSmrg   for (i = 0; i < SIGSZ; i++)
17310d565efSmrg     bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
17410d565efSmrg }
17510d565efSmrg 
17610d565efSmrg 
17710d565efSmrg /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
17810d565efSmrg    expression EXPR into bitpack BP.  */
17910d565efSmrg 
18010d565efSmrg static void
18110d565efSmrg pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
18210d565efSmrg {
18310d565efSmrg   struct fixed_value fv = TREE_FIXED_CST (expr);
18410d565efSmrg   bp_pack_machine_mode (bp, fv.mode);
18510d565efSmrg   bp_pack_var_len_int (bp, fv.data.low);
18610d565efSmrg   bp_pack_var_len_int (bp, fv.data.high);
18710d565efSmrg }
18810d565efSmrg 
18910d565efSmrg /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
19010d565efSmrg    of expression EXPR into bitpack BP.  */
19110d565efSmrg 
19210d565efSmrg static void
19310d565efSmrg pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
19410d565efSmrg {
19510d565efSmrg   bp_pack_machine_mode (bp, DECL_MODE (expr));
19610d565efSmrg   bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
19710d565efSmrg   bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
19810d565efSmrg   bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
19910d565efSmrg   bp_pack_value (bp, DECL_ABSTRACT_P (expr), 1);
20010d565efSmrg   bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
20110d565efSmrg   bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
20210d565efSmrg   bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
20310d565efSmrg   bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
20410d565efSmrg   bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1);
20510d565efSmrg   bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
20610d565efSmrg 
20710d565efSmrg   if (TREE_CODE (expr) == LABEL_DECL)
20810d565efSmrg     {
20910d565efSmrg       /* Note that we do not write LABEL_DECL_UID.  The reader will
21010d565efSmrg 	 always assume an initial value of -1 so that the
21110d565efSmrg 	 label_to_block_map is recreated by gimple_set_bb.  */
21210d565efSmrg       bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
21310d565efSmrg     }
21410d565efSmrg 
21521ff1670Smrg   else if (TREE_CODE (expr) == FIELD_DECL)
21610d565efSmrg     {
21710d565efSmrg       bp_pack_value (bp, DECL_PACKED (expr), 1);
21810d565efSmrg       bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
219*c7a68eb7Smrg       bp_pack_value (bp, DECL_PADDING_P (expr), 1);
22010d565efSmrg       bp_pack_value (bp, expr->decl_common.off_align, 8);
22110d565efSmrg     }
22210d565efSmrg 
22321ff1670Smrg   else if (VAR_P (expr))
22410d565efSmrg     {
22510d565efSmrg       bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
22610d565efSmrg       bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
22710d565efSmrg     }
22810d565efSmrg 
22921ff1670Smrg   else if (TREE_CODE (expr) == PARM_DECL)
23021ff1670Smrg     bp_pack_value (bp, DECL_HIDDEN_STRING_LENGTH (expr), 1);
23121ff1670Smrg 
23210d565efSmrg   if (TREE_CODE (expr) == RESULT_DECL
23310d565efSmrg       || TREE_CODE (expr) == PARM_DECL
23410d565efSmrg       || VAR_P (expr))
23510d565efSmrg     {
23610d565efSmrg       bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
23710d565efSmrg       if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
23810d565efSmrg 	bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
23910d565efSmrg     }
24010d565efSmrg }
24110d565efSmrg 
24210d565efSmrg 
24310d565efSmrg /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
24410d565efSmrg    of expression EXPR into bitpack BP.  */
24510d565efSmrg 
24610d565efSmrg static void
24710d565efSmrg pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
24810d565efSmrg {
24910d565efSmrg   bp_pack_value (bp, DECL_REGISTER (expr), 1);
25010d565efSmrg }
25110d565efSmrg 
25210d565efSmrg 
25310d565efSmrg /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
25410d565efSmrg    of expression EXPR into bitpack BP.  */
25510d565efSmrg 
25610d565efSmrg static void
25710d565efSmrg pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
25810d565efSmrg {
25910d565efSmrg   bp_pack_value (bp, DECL_COMMON (expr), 1);
26010d565efSmrg   bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
26110d565efSmrg   bp_pack_value (bp, DECL_WEAK (expr), 1);
26210d565efSmrg   bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr),  1);
26310d565efSmrg   bp_pack_value (bp, DECL_COMDAT (expr),  1);
26410d565efSmrg   bp_pack_value (bp, DECL_VISIBILITY (expr),  2);
26510d565efSmrg   bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr),  1);
26610d565efSmrg 
26710d565efSmrg   if (VAR_P (expr))
26810d565efSmrg     {
26910d565efSmrg       bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
27010d565efSmrg       /* DECL_IN_TEXT_SECTION is set during final asm output only. */
27110d565efSmrg       bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
27210d565efSmrg     }
27310d565efSmrg 
27410d565efSmrg   if (TREE_CODE (expr) == FUNCTION_DECL)
27510d565efSmrg     {
27610d565efSmrg       bp_pack_value (bp, DECL_FINAL_P (expr), 1);
27710d565efSmrg       bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1);
27810d565efSmrg       bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1);
27910d565efSmrg     }
28010d565efSmrg }
28110d565efSmrg 
28210d565efSmrg 
28310d565efSmrg /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
28410d565efSmrg    of expression EXPR into bitpack BP.  */
28510d565efSmrg 
28610d565efSmrg static void
28710d565efSmrg pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
28810d565efSmrg {
28910d565efSmrg   bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
29010d565efSmrg 		DECL_BUILT_IN_CLASS (expr));
29110d565efSmrg   bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
29210d565efSmrg   bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
29310d565efSmrg   bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
29410d565efSmrg   bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
29510d565efSmrg   bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
29610d565efSmrg   bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
29710d565efSmrg   bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
29810d565efSmrg   bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
29910d565efSmrg   bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
30010d565efSmrg   bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
30110d565efSmrg   bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
30210d565efSmrg   bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
30310d565efSmrg   bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
30410d565efSmrg   bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
30510d565efSmrg   bp_pack_value (bp, DECL_PURE_P (expr), 1);
30610d565efSmrg   bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
30710d565efSmrg   if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
30810d565efSmrg     bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 12);
30910d565efSmrg }
31010d565efSmrg 
31110d565efSmrg 
31210d565efSmrg /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
31310d565efSmrg    of expression EXPR into bitpack BP.  */
31410d565efSmrg 
31510d565efSmrg static void
31610d565efSmrg pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
31710d565efSmrg {
31810d565efSmrg   /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags
31910d565efSmrg      not necessary valid in a global context.
32010d565efSmrg      Use the raw value previously set by layout_type.  */
32110d565efSmrg   bp_pack_machine_mode (bp, TYPE_MODE_RAW (expr));
32210d565efSmrg   bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
32310d565efSmrg   /* TYPE_NO_FORCE_BLK is private to stor-layout and need
32410d565efSmrg      no streaming.  */
32510d565efSmrg   bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING (expr), 1);
32610d565efSmrg   bp_pack_value (bp, TYPE_PACKED (expr), 1);
32710d565efSmrg   bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
32810d565efSmrg   bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
32910d565efSmrg   bp_pack_value (bp, TYPE_READONLY (expr), 1);
33010d565efSmrg   /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark
33110d565efSmrg      types that are opaque for TBAA.  This however did not work as intended,
33210d565efSmrg      because TYPE_ALIAS_SET == 0 was regularly lost in type merging.  */
33310d565efSmrg   if (RECORD_OR_UNION_TYPE_P (expr))
33410d565efSmrg     {
33510d565efSmrg       bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
33610d565efSmrg       bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
33710d565efSmrg     }
33810d565efSmrg   else if (TREE_CODE (expr) == ARRAY_TYPE)
33910d565efSmrg     bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
34010d565efSmrg   if (AGGREGATE_TYPE_P (expr))
34110d565efSmrg     bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1);
342*c7a68eb7Smrg   bp_pack_value (bp, TYPE_EMPTY_P (expr), 1);
34310d565efSmrg   bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
34410d565efSmrg   bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
34510d565efSmrg }
34610d565efSmrg 
34710d565efSmrg 
34810d565efSmrg /* Pack all the non-pointer fields of the TS_BLOCK structure
34910d565efSmrg    of expression EXPR into bitpack BP.  */
35010d565efSmrg 
35110d565efSmrg static void
35210d565efSmrg pack_ts_block_value_fields (struct output_block *ob,
35310d565efSmrg 			    struct bitpack_d *bp, tree expr)
35410d565efSmrg {
35510d565efSmrg   bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1);
35610d565efSmrg   /* BLOCK_NUMBER is recomputed.  */
35710d565efSmrg   /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
35810d565efSmrg      that represent inlined function scopes.
35910d565efSmrg      For the rest them on the floor instead of ICEing in dwarf2out.c.  */
36010d565efSmrg   if (inlined_function_outer_scope_p (expr))
36110d565efSmrg     stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
36210d565efSmrg   else
36310d565efSmrg     stream_output_location (ob, bp, UNKNOWN_LOCATION);
36410d565efSmrg }
36510d565efSmrg 
36610d565efSmrg /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
36710d565efSmrg    of expression EXPR into bitpack BP.  */
36810d565efSmrg 
36910d565efSmrg static void
37010d565efSmrg pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
37110d565efSmrg 					    struct bitpack_d *bp, tree expr)
37210d565efSmrg {
37310d565efSmrg   bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
37410d565efSmrg }
37510d565efSmrg 
37610d565efSmrg 
37710d565efSmrg /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
37810d565efSmrg    of expression EXPR into bitpack BP.  */
37910d565efSmrg 
38010d565efSmrg static void
38110d565efSmrg pack_ts_omp_clause_value_fields (struct output_block *ob,
38210d565efSmrg 				 struct bitpack_d *bp, tree expr)
38310d565efSmrg {
38410d565efSmrg   stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
38510d565efSmrg   switch (OMP_CLAUSE_CODE (expr))
38610d565efSmrg     {
38710d565efSmrg     case OMP_CLAUSE_DEFAULT:
38810d565efSmrg       bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
38910d565efSmrg 		    OMP_CLAUSE_DEFAULT_KIND (expr));
39010d565efSmrg       break;
39110d565efSmrg     case OMP_CLAUSE_SCHEDULE:
39210d565efSmrg       bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
39310d565efSmrg 		    OMP_CLAUSE_SCHEDULE_KIND (expr));
39410d565efSmrg       break;
39510d565efSmrg     case OMP_CLAUSE_DEPEND:
39610d565efSmrg       bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
39710d565efSmrg 		    OMP_CLAUSE_DEPEND_KIND (expr));
39810d565efSmrg       break;
39910d565efSmrg     case OMP_CLAUSE_MAP:
40010d565efSmrg       bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
40110d565efSmrg 		    OMP_CLAUSE_MAP_KIND (expr));
40210d565efSmrg       break;
40310d565efSmrg     case OMP_CLAUSE_PROC_BIND:
40410d565efSmrg       bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
40510d565efSmrg 		    OMP_CLAUSE_PROC_BIND_KIND (expr));
40610d565efSmrg       break;
40710d565efSmrg     case OMP_CLAUSE_REDUCTION:
40810d565efSmrg       bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
40910d565efSmrg 		    OMP_CLAUSE_REDUCTION_CODE (expr));
41010d565efSmrg       break;
41110d565efSmrg     default:
41210d565efSmrg       break;
41310d565efSmrg     }
41410d565efSmrg }
41510d565efSmrg 
41610d565efSmrg 
41710d565efSmrg /* Pack all the bitfields in EXPR into a bit pack.  */
41810d565efSmrg 
41910d565efSmrg void
42010d565efSmrg streamer_write_tree_bitfields (struct output_block *ob, tree expr)
42110d565efSmrg {
42210d565efSmrg   bitpack_d bp = bitpack_create (ob->main_stream);
42310d565efSmrg   enum tree_code code;
42410d565efSmrg 
42510d565efSmrg   code = TREE_CODE (expr);
42610d565efSmrg 
42710d565efSmrg   /* Note that all these functions are highly sensitive to changes in
42810d565efSmrg      the types and sizes of each of the fields being packed.  */
42910d565efSmrg   pack_ts_base_value_fields (&bp, expr);
43010d565efSmrg 
43110d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
43210d565efSmrg     pack_ts_int_cst_value_fields (&bp, expr);
43310d565efSmrg 
43410d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
43510d565efSmrg     pack_ts_real_cst_value_fields (&bp, expr);
43610d565efSmrg 
43710d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
43810d565efSmrg     pack_ts_fixed_cst_value_fields (&bp, expr);
43910d565efSmrg 
44010d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
44110d565efSmrg     stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr));
44210d565efSmrg 
44310d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
44410d565efSmrg     pack_ts_decl_common_value_fields (&bp, expr);
44510d565efSmrg 
44610d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
44710d565efSmrg     pack_ts_decl_wrtl_value_fields (&bp, expr);
44810d565efSmrg 
44910d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
45010d565efSmrg     pack_ts_decl_with_vis_value_fields (&bp, expr);
45110d565efSmrg 
45210d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
45310d565efSmrg     pack_ts_function_decl_value_fields (&bp, expr);
45410d565efSmrg 
45510d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
45610d565efSmrg     pack_ts_type_common_value_fields (&bp, expr);
45710d565efSmrg 
45810d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
45910d565efSmrg     {
46010d565efSmrg       stream_output_location (ob, &bp, EXPR_LOCATION (expr));
46110d565efSmrg       if (code == MEM_REF
46210d565efSmrg 	  || code == TARGET_MEM_REF)
46310d565efSmrg 	{
46410d565efSmrg 	  bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
46510d565efSmrg 	  if (MR_DEPENDENCE_CLIQUE (expr) != 0)
46610d565efSmrg 	    bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
46710d565efSmrg 	}
468*c7a68eb7Smrg       else if (code == CALL_EXPR)
469*c7a68eb7Smrg 	bp_pack_enum (&bp, internal_fn, IFN_LAST, CALL_EXPR_IFN (expr));
47010d565efSmrg     }
47110d565efSmrg 
47210d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
47310d565efSmrg     pack_ts_block_value_fields (ob, &bp, expr);
47410d565efSmrg 
47510d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
47610d565efSmrg     pack_ts_translation_unit_decl_value_fields (ob, &bp, expr);
47710d565efSmrg 
47810d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
47910d565efSmrg     cl_optimization_stream_out (&bp, TREE_OPTIMIZATION (expr));
48010d565efSmrg 
48110d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
48210d565efSmrg     bp_pack_var_len_unsigned (&bp, vec_safe_length (BINFO_BASE_ACCESSES (expr)));
48310d565efSmrg 
48410d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
48510d565efSmrg     bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr));
48610d565efSmrg 
48710d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
48810d565efSmrg       /* Don't stream these when passing things to a different target.  */
48910d565efSmrg       && !lto_stream_offload_p)
49010d565efSmrg     cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr));
49110d565efSmrg 
49210d565efSmrg   if (code == OMP_CLAUSE)
49310d565efSmrg     pack_ts_omp_clause_value_fields (ob, &bp, expr);
49410d565efSmrg 
49510d565efSmrg   streamer_write_bitpack (&bp);
49610d565efSmrg }
49710d565efSmrg 
49810d565efSmrg 
49910d565efSmrg /* Emit the chain of tree nodes starting at T.  OB is the output block
50010d565efSmrg    to write to.  REF_P is true if chain elements should be emitted
50110d565efSmrg    as references.  */
50210d565efSmrg 
50310d565efSmrg void
50410d565efSmrg streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
50510d565efSmrg {
50610d565efSmrg   while (t)
50710d565efSmrg     {
50810d565efSmrg       /* We avoid outputting external vars or functions by reference
50910d565efSmrg 	 to the global decls section as we do not want to have them
51010d565efSmrg 	 enter decl merging.  This is, of course, only for the call
51110d565efSmrg 	 for streaming BLOCK_VARS, but other callers are safe.
51210d565efSmrg 	 See also lto-streamer-out.c:DFS_write_tree_body.  */
51310d565efSmrg       if (VAR_OR_FUNCTION_DECL_P (t)
51410d565efSmrg 	  && DECL_EXTERNAL (t))
51510d565efSmrg 	stream_write_tree_shallow_non_ref (ob, t, ref_p);
51610d565efSmrg       else
51710d565efSmrg 	stream_write_tree (ob, t, ref_p);
51810d565efSmrg 
51910d565efSmrg       t = TREE_CHAIN (t);
52010d565efSmrg     }
52110d565efSmrg 
52210d565efSmrg   /* Write a sentinel to terminate the chain.  */
52310d565efSmrg   stream_write_tree (ob, NULL_TREE, ref_p);
52410d565efSmrg }
52510d565efSmrg 
52610d565efSmrg 
52710d565efSmrg /* Write all pointer fields in the TS_COMMON structure of EXPR to output
52810d565efSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
52910d565efSmrg    fields.  */
53010d565efSmrg 
53110d565efSmrg static void
53210d565efSmrg write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
53310d565efSmrg {
53410d565efSmrg   if (TREE_CODE (expr) != IDENTIFIER_NODE)
53510d565efSmrg     stream_write_tree (ob, TREE_TYPE (expr), ref_p);
53610d565efSmrg }
53710d565efSmrg 
53810d565efSmrg 
53910d565efSmrg /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
54010d565efSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
54110d565efSmrg    fields.  */
54210d565efSmrg 
54310d565efSmrg static void
54410d565efSmrg write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
54510d565efSmrg {
54610d565efSmrg   /* Note that the number of elements for EXPR has already been emitted
54710d565efSmrg      in EXPR's header (see streamer_write_tree_header).  */
548*c7a68eb7Smrg   unsigned int count = vector_cst_encoded_nelts (expr);
549*c7a68eb7Smrg   for (unsigned int i = 0; i < count; ++i)
550*c7a68eb7Smrg     stream_write_tree (ob, VECTOR_CST_ENCODED_ELT (expr, i), ref_p);
551*c7a68eb7Smrg }
552*c7a68eb7Smrg 
553*c7a68eb7Smrg 
554*c7a68eb7Smrg /* Write all pointer fields in the TS_POLY_INT_CST structure of EXPR to
555*c7a68eb7Smrg    output block OB.  If REF_P is true, write a reference to EXPR's pointer
556*c7a68eb7Smrg    fields.  */
557*c7a68eb7Smrg 
558*c7a68eb7Smrg static void
559*c7a68eb7Smrg write_ts_poly_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
560*c7a68eb7Smrg {
561*c7a68eb7Smrg   for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
562*c7a68eb7Smrg     stream_write_tree (ob, POLY_INT_CST_COEFF (expr, i), ref_p);
56310d565efSmrg }
56410d565efSmrg 
56510d565efSmrg 
56610d565efSmrg /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
56710d565efSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
56810d565efSmrg    fields.  */
56910d565efSmrg 
57010d565efSmrg static void
57110d565efSmrg write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
57210d565efSmrg {
57310d565efSmrg   stream_write_tree (ob, TREE_REALPART (expr), ref_p);
57410d565efSmrg   stream_write_tree (ob, TREE_IMAGPART (expr), ref_p);
57510d565efSmrg }
57610d565efSmrg 
57710d565efSmrg 
57810d565efSmrg /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
57910d565efSmrg    to output block OB.  If REF_P is true, write a reference to EXPR's
58010d565efSmrg    pointer fields.  */
58110d565efSmrg 
58210d565efSmrg static void
58310d565efSmrg write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
58410d565efSmrg 				     bool ref_p)
58510d565efSmrg {
58610d565efSmrg   /* Drop names that were created for anonymous entities.  */
58710d565efSmrg   if (DECL_NAME (expr)
58810d565efSmrg       && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
58910d565efSmrg       && anon_aggrname_p (DECL_NAME (expr)))
59010d565efSmrg     stream_write_tree (ob, NULL_TREE, ref_p);
59110d565efSmrg   else
59210d565efSmrg     stream_write_tree (ob, DECL_NAME (expr), ref_p);
593*c7a68eb7Smrg   if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
594*c7a68eb7Smrg       && ! DECL_CONTEXT (expr))
595*c7a68eb7Smrg     stream_write_tree (ob, (*all_translation_units)[0], ref_p);
596*c7a68eb7Smrg   else
59710d565efSmrg     stream_write_tree (ob, DECL_CONTEXT (expr), ref_p);
59810d565efSmrg }
59910d565efSmrg 
60010d565efSmrg 
60110d565efSmrg /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
60210d565efSmrg    output block OB.  If REF_P is true, write a reference to EXPR's
60310d565efSmrg    pointer fields.  */
60410d565efSmrg 
60510d565efSmrg static void
60610d565efSmrg write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
60710d565efSmrg 				    bool ref_p)
60810d565efSmrg {
60910d565efSmrg   stream_write_tree (ob, DECL_SIZE (expr), ref_p);
61010d565efSmrg   stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p);
61110d565efSmrg 
61210d565efSmrg   /* Note, DECL_INITIAL is not handled here.  Since DECL_INITIAL needs
61310d565efSmrg      special handling in LTO, it must be handled by streamer hooks.  */
61410d565efSmrg 
61510d565efSmrg   stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p);
61610d565efSmrg 
617*c7a68eb7Smrg   /* On non-early-LTO enabled targets we claim we compiled with -g0
618*c7a68eb7Smrg      but dwarf2out still did its set_decl_origin_self game fooling
619*c7a68eb7Smrg      itself late.  Und that here since we won't have access to the
620*c7a68eb7Smrg      early generated abstract DIEs.  */
621*c7a68eb7Smrg   tree ao = DECL_ABSTRACT_ORIGIN (expr);
622*c7a68eb7Smrg   if (debug_info_level == DINFO_LEVEL_NONE
623*c7a68eb7Smrg       && ao == expr)
624*c7a68eb7Smrg     ao = NULL_TREE;
625*c7a68eb7Smrg   stream_write_tree (ob, ao, ref_p);
62610d565efSmrg 
62710d565efSmrg   if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
62810d565efSmrg       && DECL_HAS_VALUE_EXPR_P (expr))
62910d565efSmrg     stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p);
63010d565efSmrg 
631*c7a68eb7Smrg   if (VAR_P (expr)
632*c7a68eb7Smrg       && DECL_HAS_DEBUG_EXPR_P (expr))
63310d565efSmrg     stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p);
63410d565efSmrg }
63510d565efSmrg 
63610d565efSmrg 
63710d565efSmrg /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
63810d565efSmrg    EXPR to output block OB.  If REF_P is true, write a reference to EXPR's
63910d565efSmrg    pointer fields.  */
64010d565efSmrg 
64110d565efSmrg static void
64210d565efSmrg write_ts_decl_non_common_tree_pointers (struct output_block *ob, tree expr,
64310d565efSmrg 				        bool ref_p)
64410d565efSmrg {
64510d565efSmrg   if (TREE_CODE (expr) == TYPE_DECL)
64610d565efSmrg     stream_write_tree (ob, DECL_ORIGINAL_TYPE (expr), ref_p);
64710d565efSmrg }
64810d565efSmrg 
64910d565efSmrg 
65010d565efSmrg /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
65110d565efSmrg    to output block OB.  If REF_P is true, write a reference to EXPR's
65210d565efSmrg    pointer fields.  */
65310d565efSmrg 
65410d565efSmrg static void
65510d565efSmrg write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
65610d565efSmrg 			              bool ref_p)
65710d565efSmrg {
65810d565efSmrg   /* Make sure we don't inadvertently set the assembler name.  */
65910d565efSmrg   if (DECL_ASSEMBLER_NAME_SET_P (expr))
66010d565efSmrg     stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
66110d565efSmrg   else
66210d565efSmrg     stream_write_tree (ob, NULL_TREE, false);
66310d565efSmrg }
66410d565efSmrg 
66510d565efSmrg 
66610d565efSmrg /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
66710d565efSmrg    output block OB.  If REF_P is true, write a reference to EXPR's
66810d565efSmrg    pointer fields.  */
66910d565efSmrg 
67010d565efSmrg static void
67110d565efSmrg write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
67210d565efSmrg 				   bool ref_p)
67310d565efSmrg {
67410d565efSmrg   stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p);
67510d565efSmrg   stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
67610d565efSmrg   stream_write_tree (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr), ref_p);
67710d565efSmrg   stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
67810d565efSmrg   stream_write_tree (ob, DECL_FCONTEXT (expr), ref_p);
67910d565efSmrg }
68010d565efSmrg 
68110d565efSmrg 
68210d565efSmrg /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
68310d565efSmrg    to output block OB.  If REF_P is true, write a reference to EXPR's
68410d565efSmrg    pointer fields.  */
68510d565efSmrg 
68610d565efSmrg static void
68710d565efSmrg write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
68810d565efSmrg 				      bool ref_p)
68910d565efSmrg {
69010d565efSmrg   stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
69110d565efSmrg   /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  */
69210d565efSmrg   stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
69310d565efSmrg   /* Don't stream these when passing things to a different target.  */
69410d565efSmrg   if (!lto_stream_offload_p)
69510d565efSmrg     stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
69610d565efSmrg   stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
69710d565efSmrg }
69810d565efSmrg 
69910d565efSmrg 
70010d565efSmrg /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
70110d565efSmrg    output block OB.  If REF_P is true, write a reference to EXPR's
70210d565efSmrg    pointer fields.  */
70310d565efSmrg 
70410d565efSmrg static void
70510d565efSmrg write_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
70610d565efSmrg 				    bool ref_p)
70710d565efSmrg {
70810d565efSmrg   stream_write_tree (ob, TYPE_SIZE (expr), ref_p);
70910d565efSmrg   stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p);
71010d565efSmrg   stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p);
71110d565efSmrg   stream_write_tree (ob, TYPE_NAME (expr), ref_p);
71210d565efSmrg   /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO.  They will be
71310d565efSmrg      reconstructed during fixup.  */
71410d565efSmrg   /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
71510d565efSmrg      during fixup.  */
71610d565efSmrg   stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p);
71710d565efSmrg   stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p);
71810d565efSmrg   /* TYPE_CANONICAL is re-computed during type merging, so no need
71910d565efSmrg      to stream it here.  */
72010d565efSmrg   stream_write_tree (ob, TYPE_STUB_DECL (expr), ref_p);
72110d565efSmrg }
72210d565efSmrg 
72310d565efSmrg /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
72410d565efSmrg    to output block OB.  If REF_P is true, write a reference to EXPR's
72510d565efSmrg    pointer fields.  */
72610d565efSmrg 
72710d565efSmrg static void
72810d565efSmrg write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr,
72910d565efSmrg 					bool ref_p)
73010d565efSmrg {
73110d565efSmrg   if (TREE_CODE (expr) == ENUMERAL_TYPE)
73210d565efSmrg     stream_write_tree (ob, TYPE_VALUES (expr), ref_p);
73310d565efSmrg   else if (TREE_CODE (expr) == ARRAY_TYPE)
73410d565efSmrg     stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p);
73510d565efSmrg   else if (RECORD_OR_UNION_TYPE_P (expr))
73610d565efSmrg     streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p);
73710d565efSmrg   else if (TREE_CODE (expr) == FUNCTION_TYPE
73810d565efSmrg 	   || TREE_CODE (expr) == METHOD_TYPE)
73910d565efSmrg     stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p);
74010d565efSmrg 
74110d565efSmrg   if (!POINTER_TYPE_P (expr))
742*c7a68eb7Smrg     stream_write_tree (ob, TYPE_MIN_VALUE_RAW (expr), ref_p);
743*c7a68eb7Smrg   stream_write_tree (ob, TYPE_MAX_VALUE_RAW (expr), ref_p);
74410d565efSmrg }
74510d565efSmrg 
74610d565efSmrg 
74710d565efSmrg /* Write all pointer fields in the TS_LIST structure of EXPR to output
74810d565efSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
74910d565efSmrg    fields.  */
75010d565efSmrg 
75110d565efSmrg static void
75210d565efSmrg write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
75310d565efSmrg {
75410d565efSmrg   stream_write_tree (ob, TREE_PURPOSE (expr), ref_p);
75510d565efSmrg   stream_write_tree (ob, TREE_VALUE (expr), ref_p);
75610d565efSmrg   stream_write_tree (ob, TREE_CHAIN (expr), ref_p);
75710d565efSmrg }
75810d565efSmrg 
75910d565efSmrg 
76010d565efSmrg /* Write all pointer fields in the TS_VEC structure of EXPR to output
76110d565efSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
76210d565efSmrg    fields.  */
76310d565efSmrg 
76410d565efSmrg static void
76510d565efSmrg write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
76610d565efSmrg {
76710d565efSmrg   int i;
76810d565efSmrg 
76910d565efSmrg   /* Note that the number of slots for EXPR has already been emitted
77010d565efSmrg      in EXPR's header (see streamer_write_tree_header).  */
77110d565efSmrg   for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
77210d565efSmrg     stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p);
77310d565efSmrg }
77410d565efSmrg 
77510d565efSmrg 
77610d565efSmrg /* Write all pointer fields in the TS_EXP structure of EXPR to output
77710d565efSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
77810d565efSmrg    fields.  */
77910d565efSmrg 
78010d565efSmrg static void
78110d565efSmrg write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
78210d565efSmrg {
78310d565efSmrg   int i;
78410d565efSmrg 
78510d565efSmrg   for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
78610d565efSmrg     stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p);
78710d565efSmrg   stream_write_tree (ob, TREE_BLOCK (expr), ref_p);
78810d565efSmrg }
78910d565efSmrg 
79010d565efSmrg 
79110d565efSmrg /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
79210d565efSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
79310d565efSmrg    fields.  */
79410d565efSmrg 
79510d565efSmrg static void
79610d565efSmrg write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
79710d565efSmrg {
79810d565efSmrg   streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
79910d565efSmrg 
80010d565efSmrg   stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
80110d565efSmrg 
80210d565efSmrg   /* Stream BLOCK_ABSTRACT_ORIGIN for the limited cases we can handle - those
80310d565efSmrg      that represent inlined function scopes.
80410d565efSmrg      For the rest them on the floor instead of ICEing in dwarf2out.c, but
80510d565efSmrg      keep the notion of whether the block is an inlined block by refering
80610d565efSmrg      to itself for the sake of tree_nonartificial_location.  */
80710d565efSmrg   if (inlined_function_outer_scope_p (expr))
80810d565efSmrg     {
80910d565efSmrg       tree ultimate_origin = block_ultimate_origin (expr);
81010d565efSmrg       stream_write_tree (ob, ultimate_origin, ref_p);
81110d565efSmrg     }
81210d565efSmrg   else
81310d565efSmrg     stream_write_tree (ob, (BLOCK_ABSTRACT_ORIGIN (expr)
81410d565efSmrg 			    ? expr : NULL_TREE), ref_p);
81510d565efSmrg   /* Do not stream BLOCK_NONLOCALIZED_VARS.  We cannot handle debug information
81610d565efSmrg      for early inlined BLOCKs so drop it on the floor instead of ICEing in
81710d565efSmrg      dwarf2out.c.  */
81810d565efSmrg 
81910d565efSmrg   /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
82010d565efSmrg      streaming time.  */
82110d565efSmrg 
82210d565efSmrg   /* Do not output BLOCK_SUBBLOCKS.  Instead on streaming-in this
82310d565efSmrg      list is re-constructed from BLOCK_SUPERCONTEXT.  */
82410d565efSmrg }
82510d565efSmrg 
82610d565efSmrg 
82710d565efSmrg /* Write all pointer fields in the TS_BINFO structure of EXPR to output
82810d565efSmrg    block OB.  If REF_P is true, write a reference to EXPR's pointer
82910d565efSmrg    fields.  */
83010d565efSmrg 
83110d565efSmrg static void
83210d565efSmrg write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
83310d565efSmrg {
83410d565efSmrg   unsigned i;
83510d565efSmrg   tree t;
83610d565efSmrg 
83710d565efSmrg   /* Note that the number of BINFO slots has already been emitted in
83810d565efSmrg      EXPR's header (see streamer_write_tree_header) because this length
83910d565efSmrg      is needed to build the empty BINFO node on the reader side.  */
84010d565efSmrg   FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
84110d565efSmrg     stream_write_tree (ob, t, ref_p);
84210d565efSmrg   stream_write_tree (ob, NULL_TREE, false);
84310d565efSmrg 
84410d565efSmrg   stream_write_tree (ob, BINFO_OFFSET (expr), ref_p);
84510d565efSmrg   stream_write_tree (ob, BINFO_VTABLE (expr), ref_p);
84610d565efSmrg   stream_write_tree (ob, BINFO_VPTR_FIELD (expr), ref_p);
84710d565efSmrg 
84810d565efSmrg   /* The number of BINFO_BASE_ACCESSES has already been emitted in
84910d565efSmrg      EXPR's bitfield section.  */
85010d565efSmrg   FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
85110d565efSmrg     stream_write_tree (ob, t, ref_p);
85210d565efSmrg 
85310d565efSmrg   /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
85410d565efSmrg      and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
85510d565efSmrg }
85610d565efSmrg 
85710d565efSmrg 
85810d565efSmrg /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
85910d565efSmrg    output block OB.  If REF_P is true, write a reference to EXPR's
86010d565efSmrg    pointer fields.  */
86110d565efSmrg 
86210d565efSmrg static void
86310d565efSmrg write_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
86410d565efSmrg 				    bool ref_p)
86510d565efSmrg {
86610d565efSmrg   unsigned i;
86710d565efSmrg   tree index, value;
86810d565efSmrg 
86910d565efSmrg   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
87010d565efSmrg     {
87110d565efSmrg       stream_write_tree (ob, index, ref_p);
87210d565efSmrg       stream_write_tree (ob, value, ref_p);
87310d565efSmrg     }
87410d565efSmrg }
87510d565efSmrg 
87610d565efSmrg 
87710d565efSmrg /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
87810d565efSmrg    to output block OB.  If REF_P is true, write a reference to EXPR's
87910d565efSmrg    pointer fields.  */
88010d565efSmrg 
88110d565efSmrg static void
88210d565efSmrg write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr,
88310d565efSmrg 				   bool ref_p)
88410d565efSmrg {
88510d565efSmrg   int i;
88610d565efSmrg   for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
88710d565efSmrg     stream_write_tree (ob, OMP_CLAUSE_OPERAND (expr, i), ref_p);
88810d565efSmrg   if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_REDUCTION)
88910d565efSmrg     {
89010d565efSmrg       /* We don't stream these right now, handle it if streaming
89110d565efSmrg 	 of them is needed.  */
89210d565efSmrg       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
89310d565efSmrg       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
89410d565efSmrg     }
89510d565efSmrg   stream_write_tree (ob, OMP_CLAUSE_CHAIN (expr), ref_p);
89610d565efSmrg }
89710d565efSmrg 
89810d565efSmrg 
89910d565efSmrg /* Write all pointer fields in EXPR to output block OB.  If REF_P is true,
90010d565efSmrg    the leaves of EXPR are emitted as references.  */
90110d565efSmrg 
90210d565efSmrg void
90310d565efSmrg streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
90410d565efSmrg {
90510d565efSmrg   enum tree_code code;
90610d565efSmrg 
90710d565efSmrg   lto_stats.num_tree_bodies_output++;
90810d565efSmrg 
90910d565efSmrg   code = TREE_CODE (expr);
91010d565efSmrg 
91110d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
91210d565efSmrg     write_ts_common_tree_pointers (ob, expr, ref_p);
91310d565efSmrg 
91410d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
91510d565efSmrg     write_ts_vector_tree_pointers (ob, expr, ref_p);
91610d565efSmrg 
917*c7a68eb7Smrg   if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
918*c7a68eb7Smrg     write_ts_poly_tree_pointers (ob, expr, ref_p);
919*c7a68eb7Smrg 
92010d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
92110d565efSmrg     write_ts_complex_tree_pointers (ob, expr, ref_p);
92210d565efSmrg 
92310d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
92410d565efSmrg     write_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
92510d565efSmrg 
92610d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
92710d565efSmrg     write_ts_decl_common_tree_pointers (ob, expr, ref_p);
92810d565efSmrg 
92910d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
93010d565efSmrg     write_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
93110d565efSmrg 
93210d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
93310d565efSmrg     write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
93410d565efSmrg 
93510d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
93610d565efSmrg     write_ts_field_decl_tree_pointers (ob, expr, ref_p);
93710d565efSmrg 
93810d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
93910d565efSmrg     write_ts_function_decl_tree_pointers (ob, expr, ref_p);
94010d565efSmrg 
94110d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
94210d565efSmrg     write_ts_type_common_tree_pointers (ob, expr, ref_p);
94310d565efSmrg 
94410d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
94510d565efSmrg     write_ts_type_non_common_tree_pointers (ob, expr, ref_p);
94610d565efSmrg 
94710d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_LIST))
94810d565efSmrg     write_ts_list_tree_pointers (ob, expr, ref_p);
94910d565efSmrg 
95010d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_VEC))
95110d565efSmrg     write_ts_vec_tree_pointers (ob, expr, ref_p);
95210d565efSmrg 
95310d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
95410d565efSmrg     write_ts_exp_tree_pointers (ob, expr, ref_p);
95510d565efSmrg 
95610d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
95710d565efSmrg     write_ts_block_tree_pointers (ob, expr, ref_p);
95810d565efSmrg 
95910d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
96010d565efSmrg     write_ts_binfo_tree_pointers (ob, expr, ref_p);
96110d565efSmrg 
96210d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
96310d565efSmrg     write_ts_constructor_tree_pointers (ob, expr, ref_p);
96410d565efSmrg 
96510d565efSmrg   if (code == OMP_CLAUSE)
96610d565efSmrg     write_ts_omp_clause_tree_pointers (ob, expr, ref_p);
96710d565efSmrg }
96810d565efSmrg 
96910d565efSmrg 
97010d565efSmrg /* Emit header information for tree EXPR to output block OB.  The header
97110d565efSmrg    contains everything needed to instantiate an empty skeleton for
97210d565efSmrg    EXPR on the reading side.  IX is the index into the streamer cache
97310d565efSmrg    where EXPR is stored.  */
97410d565efSmrg 
97510d565efSmrg void
97610d565efSmrg streamer_write_tree_header (struct output_block *ob, tree expr)
97710d565efSmrg {
97810d565efSmrg   enum LTO_tags tag;
97910d565efSmrg   enum tree_code code;
98010d565efSmrg 
98110d565efSmrg   /* We should not see any tree nodes not handled by the streamer.  */
98210d565efSmrg   code = TREE_CODE (expr);
98310d565efSmrg 
98410d565efSmrg   /* The header of a tree node consists of its tag, the size of
98510d565efSmrg      the node, and any other information needed to instantiate
98610d565efSmrg      EXPR on the reading side (such as the number of slots in
98710d565efSmrg      variable sized nodes).  */
98810d565efSmrg   tag = lto_tree_code_to_tag (code);
98910d565efSmrg   streamer_write_record_start (ob, tag);
99010d565efSmrg 
99110d565efSmrg   /* The text in strings and identifiers are completely emitted in
99210d565efSmrg      the header.  */
99310d565efSmrg   if (CODE_CONTAINS_STRUCT (code, TS_STRING))
99410d565efSmrg     streamer_write_string_cst (ob, ob->main_stream, expr);
99510d565efSmrg   else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
99610d565efSmrg     write_identifier (ob, ob->main_stream, expr);
99710d565efSmrg   else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
998*c7a68eb7Smrg     {
999*c7a68eb7Smrg       bitpack_d bp = bitpack_create (ob->main_stream);
1000*c7a68eb7Smrg       bp_pack_value (&bp, VECTOR_CST_LOG2_NPATTERNS (expr), 8);
1001*c7a68eb7Smrg       bp_pack_value (&bp, VECTOR_CST_NELTS_PER_PATTERN (expr), 8);
1002*c7a68eb7Smrg       streamer_write_bitpack (&bp);
1003*c7a68eb7Smrg     }
100410d565efSmrg   else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
100510d565efSmrg     streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
100610d565efSmrg   else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
100710d565efSmrg     streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
100810d565efSmrg   else if (TREE_CODE (expr) == CALL_EXPR)
100910d565efSmrg     streamer_write_uhwi (ob, call_expr_nargs (expr));
101010d565efSmrg   else if (TREE_CODE (expr) == OMP_CLAUSE)
101110d565efSmrg     streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
101210d565efSmrg   else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
101310d565efSmrg     {
101410d565efSmrg       gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
101510d565efSmrg       streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
101610d565efSmrg       streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
101710d565efSmrg     }
101810d565efSmrg }
101910d565efSmrg 
102010d565efSmrg 
102110d565efSmrg /* Emit the integer constant CST to output block OB.  If REF_P is true,
102210d565efSmrg    CST's type will be emitted as a reference.  */
102310d565efSmrg 
102410d565efSmrg void
102510d565efSmrg streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p)
102610d565efSmrg {
102710d565efSmrg   int i;
102810d565efSmrg   int len = TREE_INT_CST_NUNITS (cst);
102910d565efSmrg   gcc_assert (!TREE_OVERFLOW (cst));
103010d565efSmrg   streamer_write_record_start (ob, LTO_integer_cst);
103110d565efSmrg   stream_write_tree (ob, TREE_TYPE (cst), ref_p);
103210d565efSmrg   /* We're effectively streaming a non-sign-extended wide_int here,
103310d565efSmrg      so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
103410d565efSmrg      array members beyond LEN.  We'll recreate the tree from the
103510d565efSmrg      wide_int and the type.  */
103610d565efSmrg   streamer_write_uhwi (ob, len);
103710d565efSmrg   for (i = 0; i < len; i++)
103810d565efSmrg     streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));
103910d565efSmrg }
1040