xref: /dflybsd-src/contrib/gcc-8.0/gcc/tree-streamer-out.c (revision 95059079af47f9a66a175f374f2da1a5020e3255)
138fd1498Szrj /* Routines for emitting trees to a file stream.
238fd1498Szrj 
338fd1498Szrj    Copyright (C) 2011-2018 Free Software Foundation, Inc.
438fd1498Szrj    Contributed by Diego Novillo <dnovillo@google.com>
538fd1498Szrj 
638fd1498Szrj This file is part of GCC.
738fd1498Szrj 
838fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
938fd1498Szrj the terms of the GNU General Public License as published by the Free
1038fd1498Szrj Software Foundation; either version 3, or (at your option) any later
1138fd1498Szrj version.
1238fd1498Szrj 
1338fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
1438fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
1538fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1638fd1498Szrj for more details.
1738fd1498Szrj 
1838fd1498Szrj You should have received a copy of the GNU General Public License
1938fd1498Szrj along with GCC; see the file COPYING3.  If not see
2038fd1498Szrj <http://www.gnu.org/licenses/>.  */
2138fd1498Szrj 
2238fd1498Szrj #include "config.h"
2338fd1498Szrj #include "system.h"
2438fd1498Szrj #include "coretypes.h"
2538fd1498Szrj #include "backend.h"
2638fd1498Szrj #include "target.h"
2738fd1498Szrj #include "tree.h"
2838fd1498Szrj #include "gimple.h"
2938fd1498Szrj #include "tree-streamer.h"
3038fd1498Szrj #include "cgraph.h"
3138fd1498Szrj #include "alias.h"
3238fd1498Szrj #include "stor-layout.h"
3338fd1498Szrj #include "gomp-constants.h"
3438fd1498Szrj 
3538fd1498Szrj 
3638fd1498Szrj /* Output the STRING constant to the string
3738fd1498Szrj    table in OB.  Then put the index onto the INDEX_STREAM.  */
3838fd1498Szrj 
3938fd1498Szrj void
streamer_write_string_cst(struct output_block * ob,struct lto_output_stream * index_stream,tree string)4038fd1498Szrj streamer_write_string_cst (struct output_block *ob,
4138fd1498Szrj 			   struct lto_output_stream *index_stream,
4238fd1498Szrj 			   tree string)
4338fd1498Szrj {
4438fd1498Szrj   streamer_write_string_with_length (ob, index_stream,
4538fd1498Szrj 				     string ? TREE_STRING_POINTER (string)
4638fd1498Szrj 					    : NULL,
4738fd1498Szrj 				     string ? TREE_STRING_LENGTH (string) : 0,
4838fd1498Szrj 				     true);
4938fd1498Szrj }
5038fd1498Szrj 
5138fd1498Szrj 
5238fd1498Szrj /* Output the identifier ID to the string
5338fd1498Szrj    table in OB.  Then put the index onto the INDEX_STREAM.  */
5438fd1498Szrj 
5538fd1498Szrj static void
write_identifier(struct output_block * ob,struct lto_output_stream * index_stream,tree id)5638fd1498Szrj write_identifier (struct output_block *ob,
5738fd1498Szrj 		   struct lto_output_stream *index_stream,
5838fd1498Szrj 		   tree id)
5938fd1498Szrj {
6038fd1498Szrj   streamer_write_string_with_length (ob, index_stream,
6138fd1498Szrj 				     IDENTIFIER_POINTER (id),
6238fd1498Szrj 				     IDENTIFIER_LENGTH (id),
6338fd1498Szrj 				     true);
6438fd1498Szrj }
6538fd1498Szrj 
6638fd1498Szrj 
6738fd1498Szrj /* Pack all the non-pointer fields of the TS_BASE structure of
6838fd1498Szrj    expression EXPR into bitpack BP.  */
6938fd1498Szrj 
7038fd1498Szrj static inline void
pack_ts_base_value_fields(struct bitpack_d * bp,tree expr)7138fd1498Szrj pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
7238fd1498Szrj {
7338fd1498Szrj   bp_pack_value (bp, TREE_CODE (expr), 16);
7438fd1498Szrj   if (!TYPE_P (expr))
7538fd1498Szrj     {
7638fd1498Szrj       bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1);
7738fd1498Szrj       bp_pack_value (bp, TREE_CONSTANT (expr), 1);
7838fd1498Szrj       bp_pack_value (bp, TREE_READONLY (expr), 1);
7938fd1498Szrj 
8038fd1498Szrj       /* TREE_PUBLIC is used on types to indicate that the type
8138fd1498Szrj 	 has a TYPE_CACHED_VALUES vector.  This is not streamed out,
8238fd1498Szrj 	 so we skip it here.  */
8338fd1498Szrj       bp_pack_value (bp, TREE_PUBLIC (expr), 1);
8438fd1498Szrj     }
8538fd1498Szrj   else
8638fd1498Szrj     bp_pack_value (bp, 0, 4);
8738fd1498Szrj   bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1);
8838fd1498Szrj   bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1);
8938fd1498Szrj   if (DECL_P (expr))
9038fd1498Szrj     {
9138fd1498Szrj       bp_pack_value (bp, DECL_UNSIGNED (expr), 1);
9238fd1498Szrj       bp_pack_value (bp, DECL_NAMELESS (expr), 1);
9338fd1498Szrj     }
9438fd1498Szrj   else if (TYPE_P (expr))
9538fd1498Szrj     bp_pack_value (bp, TYPE_UNSIGNED (expr), 1);
9638fd1498Szrj   else
9738fd1498Szrj     bp_pack_value (bp, 0, 1);
9838fd1498Szrj   /* We write debug info two times, do not confuse the second one.
9938fd1498Szrj      The only relevant TREE_ASM_WRITTEN use is on SSA names.  */
10038fd1498Szrj   bp_pack_value (bp, (TREE_CODE (expr) != SSA_NAME
10138fd1498Szrj 		      ? 0 : TREE_ASM_WRITTEN (expr)), 1);
10238fd1498Szrj   if (TYPE_P (expr))
10338fd1498Szrj     bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1);
10438fd1498Szrj   else
10538fd1498Szrj     bp_pack_value (bp, TREE_NO_WARNING (expr), 1);
10638fd1498Szrj   bp_pack_value (bp, TREE_NOTHROW (expr), 1);
10738fd1498Szrj   bp_pack_value (bp, TREE_STATIC (expr), 1);
10838fd1498Szrj   if (TREE_CODE (expr) != TREE_BINFO)
10938fd1498Szrj     bp_pack_value (bp, TREE_PRIVATE (expr), 1);
11038fd1498Szrj   else
11138fd1498Szrj     bp_pack_value (bp, 0, 1);
11238fd1498Szrj   bp_pack_value (bp, TREE_PROTECTED (expr), 1);
11338fd1498Szrj   bp_pack_value (bp, TREE_DEPRECATED (expr), 1);
11438fd1498Szrj   if (TYPE_P (expr))
11538fd1498Szrj     {
11638fd1498Szrj       if (AGGREGATE_TYPE_P (expr))
11738fd1498Szrj 	bp_pack_value (bp, TYPE_REVERSE_STORAGE_ORDER (expr), 1);
11838fd1498Szrj       else
11938fd1498Szrj 	bp_pack_value (bp, TYPE_SATURATING (expr), 1);
12038fd1498Szrj       bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8);
12138fd1498Szrj     }
12238fd1498Szrj   else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF)
12338fd1498Szrj     {
12438fd1498Szrj       bp_pack_value (bp, REF_REVERSE_STORAGE_ORDER (expr), 1);
12538fd1498Szrj       bp_pack_value (bp, 0, 8);
12638fd1498Szrj     }
12738fd1498Szrj   else if (TREE_CODE (expr) == SSA_NAME)
12838fd1498Szrj     {
12938fd1498Szrj       bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
13038fd1498Szrj       bp_pack_value (bp, 0, 8);
13138fd1498Szrj     }
132*58e805e6Szrj   else if (TREE_CODE (expr) == CALL_EXPR)
133*58e805e6Szrj     {
134*58e805e6Szrj       bp_pack_value (bp, CALL_EXPR_BY_DESCRIPTOR (expr), 1);
135*58e805e6Szrj       bp_pack_value (bp, 0, 8);
136*58e805e6Szrj     }
13738fd1498Szrj   else
13838fd1498Szrj     bp_pack_value (bp, 0, 9);
13938fd1498Szrj }
14038fd1498Szrj 
14138fd1498Szrj 
14238fd1498Szrj /* Pack all the non-pointer fields of the TS_INTEGER_CST structure of
14338fd1498Szrj    expression EXPR into bitpack BP.  */
14438fd1498Szrj 
14538fd1498Szrj static void
pack_ts_int_cst_value_fields(struct bitpack_d * bp,tree expr)14638fd1498Szrj pack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr)
14738fd1498Szrj {
14838fd1498Szrj   int i;
14938fd1498Szrj   /* Note that the number of elements has already been written out in
15038fd1498Szrj      streamer_write_tree_header.  */
15138fd1498Szrj   for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++)
15238fd1498Szrj     bp_pack_var_len_int (bp, TREE_INT_CST_ELT (expr, i));
15338fd1498Szrj }
15438fd1498Szrj 
15538fd1498Szrj 
15638fd1498Szrj /* Pack all the non-pointer fields of the TS_REAL_CST structure of
15738fd1498Szrj    expression EXPR into bitpack BP.  */
15838fd1498Szrj 
15938fd1498Szrj static void
pack_ts_real_cst_value_fields(struct bitpack_d * bp,tree expr)16038fd1498Szrj pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr)
16138fd1498Szrj {
16238fd1498Szrj   unsigned i;
16338fd1498Szrj   REAL_VALUE_TYPE r;
16438fd1498Szrj 
16538fd1498Szrj   r = TREE_REAL_CST (expr);
16638fd1498Szrj   bp_pack_value (bp, r.cl, 2);
16738fd1498Szrj   bp_pack_value (bp, r.decimal, 1);
16838fd1498Szrj   bp_pack_value (bp, r.sign, 1);
16938fd1498Szrj   bp_pack_value (bp, r.signalling, 1);
17038fd1498Szrj   bp_pack_value (bp, r.canonical, 1);
17138fd1498Szrj   bp_pack_value (bp, r.uexp, EXP_BITS);
17238fd1498Szrj   for (i = 0; i < SIGSZ; i++)
17338fd1498Szrj     bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG);
17438fd1498Szrj }
17538fd1498Szrj 
17638fd1498Szrj 
17738fd1498Szrj /* Pack all the non-pointer fields of the TS_FIXED_CST structure of
17838fd1498Szrj    expression EXPR into bitpack BP.  */
17938fd1498Szrj 
18038fd1498Szrj static void
pack_ts_fixed_cst_value_fields(struct bitpack_d * bp,tree expr)18138fd1498Szrj pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr)
18238fd1498Szrj {
18338fd1498Szrj   struct fixed_value fv = TREE_FIXED_CST (expr);
18438fd1498Szrj   bp_pack_machine_mode (bp, fv.mode);
18538fd1498Szrj   bp_pack_var_len_int (bp, fv.data.low);
18638fd1498Szrj   bp_pack_var_len_int (bp, fv.data.high);
18738fd1498Szrj }
18838fd1498Szrj 
18938fd1498Szrj /* Pack all the non-pointer fields of the TS_DECL_COMMON structure
19038fd1498Szrj    of expression EXPR into bitpack BP.  */
19138fd1498Szrj 
19238fd1498Szrj static void
pack_ts_decl_common_value_fields(struct bitpack_d * bp,tree expr)19338fd1498Szrj pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr)
19438fd1498Szrj {
19538fd1498Szrj   bp_pack_machine_mode (bp, DECL_MODE (expr));
19638fd1498Szrj   bp_pack_value (bp, DECL_NONLOCAL (expr), 1);
19738fd1498Szrj   bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1);
19838fd1498Szrj   bp_pack_value (bp, DECL_IGNORED_P (expr), 1);
19938fd1498Szrj   bp_pack_value (bp, DECL_ABSTRACT_P (expr), 1);
20038fd1498Szrj   bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1);
20138fd1498Szrj   bp_pack_value (bp, DECL_USER_ALIGN (expr), 1);
20238fd1498Szrj   bp_pack_value (bp, DECL_PRESERVE_P (expr), 1);
20338fd1498Szrj   bp_pack_value (bp, DECL_EXTERNAL (expr), 1);
20438fd1498Szrj   bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1);
20538fd1498Szrj   bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr));
20638fd1498Szrj 
20738fd1498Szrj   if (TREE_CODE (expr) == LABEL_DECL)
20838fd1498Szrj     {
20938fd1498Szrj       /* Note that we do not write LABEL_DECL_UID.  The reader will
21038fd1498Szrj 	 always assume an initial value of -1 so that the
21138fd1498Szrj 	 label_to_block_map is recreated by gimple_set_bb.  */
21238fd1498Szrj       bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr));
21338fd1498Szrj     }
21438fd1498Szrj 
21538fd1498Szrj   if (TREE_CODE (expr) == FIELD_DECL)
21638fd1498Szrj     {
21738fd1498Szrj       bp_pack_value (bp, DECL_PACKED (expr), 1);
21838fd1498Szrj       bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1);
21938fd1498Szrj       bp_pack_value (bp, DECL_PADDING_P (expr), 1);
22038fd1498Szrj       bp_pack_value (bp, expr->decl_common.off_align, 8);
22138fd1498Szrj     }
22238fd1498Szrj 
22338fd1498Szrj   if (VAR_P (expr))
22438fd1498Szrj     {
22538fd1498Szrj       bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1);
22638fd1498Szrj       bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1);
22738fd1498Szrj     }
22838fd1498Szrj 
22938fd1498Szrj   if (TREE_CODE (expr) == RESULT_DECL
23038fd1498Szrj       || TREE_CODE (expr) == PARM_DECL
23138fd1498Szrj       || VAR_P (expr))
23238fd1498Szrj     {
23338fd1498Szrj       bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1);
23438fd1498Szrj       if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
23538fd1498Szrj 	bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1);
23638fd1498Szrj     }
23738fd1498Szrj }
23838fd1498Szrj 
23938fd1498Szrj 
24038fd1498Szrj /* Pack all the non-pointer fields of the TS_DECL_WRTL structure
24138fd1498Szrj    of expression EXPR into bitpack BP.  */
24238fd1498Szrj 
24338fd1498Szrj static void
pack_ts_decl_wrtl_value_fields(struct bitpack_d * bp,tree expr)24438fd1498Szrj pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr)
24538fd1498Szrj {
24638fd1498Szrj   bp_pack_value (bp, DECL_REGISTER (expr), 1);
24738fd1498Szrj }
24838fd1498Szrj 
24938fd1498Szrj 
25038fd1498Szrj /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure
25138fd1498Szrj    of expression EXPR into bitpack BP.  */
25238fd1498Szrj 
25338fd1498Szrj static void
pack_ts_decl_with_vis_value_fields(struct bitpack_d * bp,tree expr)25438fd1498Szrj pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
25538fd1498Szrj {
25638fd1498Szrj   bp_pack_value (bp, DECL_COMMON (expr), 1);
25738fd1498Szrj   bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1);
25838fd1498Szrj   bp_pack_value (bp, DECL_WEAK (expr), 1);
25938fd1498Szrj   bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr),  1);
26038fd1498Szrj   bp_pack_value (bp, DECL_COMDAT (expr),  1);
26138fd1498Szrj   bp_pack_value (bp, DECL_VISIBILITY (expr),  2);
26238fd1498Szrj   bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr),  1);
26338fd1498Szrj 
26438fd1498Szrj   if (VAR_P (expr))
26538fd1498Szrj     {
26638fd1498Szrj       bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1);
26738fd1498Szrj       /* DECL_IN_TEXT_SECTION is set during final asm output only. */
26838fd1498Szrj       bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1);
26938fd1498Szrj     }
27038fd1498Szrj 
27138fd1498Szrj   if (TREE_CODE (expr) == FUNCTION_DECL)
27238fd1498Szrj     {
27338fd1498Szrj       bp_pack_value (bp, DECL_FINAL_P (expr), 1);
27438fd1498Szrj       bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1);
27538fd1498Szrj       bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1);
27638fd1498Szrj     }
27738fd1498Szrj }
27838fd1498Szrj 
27938fd1498Szrj 
28038fd1498Szrj /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure
28138fd1498Szrj    of expression EXPR into bitpack BP.  */
28238fd1498Szrj 
28338fd1498Szrj static void
pack_ts_function_decl_value_fields(struct bitpack_d * bp,tree expr)28438fd1498Szrj pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
28538fd1498Szrj {
28638fd1498Szrj   bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
28738fd1498Szrj 		DECL_BUILT_IN_CLASS (expr));
28838fd1498Szrj   bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
28938fd1498Szrj   bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1);
29038fd1498Szrj   bp_pack_value (bp, DECL_UNINLINABLE (expr), 1);
29138fd1498Szrj   bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1);
29238fd1498Szrj   bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1);
29338fd1498Szrj   bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
29438fd1498Szrj   bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
29538fd1498Szrj   bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
29638fd1498Szrj   bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
29738fd1498Szrj   bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
29838fd1498Szrj   bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
29938fd1498Szrj   bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1);
30038fd1498Szrj   bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1);
30138fd1498Szrj   bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1);
30238fd1498Szrj   bp_pack_value (bp, DECL_PURE_P (expr), 1);
30338fd1498Szrj   bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
30438fd1498Szrj   if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
30538fd1498Szrj     bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 12);
30638fd1498Szrj }
30738fd1498Szrj 
30838fd1498Szrj 
30938fd1498Szrj /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure
31038fd1498Szrj    of expression EXPR into bitpack BP.  */
31138fd1498Szrj 
31238fd1498Szrj static void
pack_ts_type_common_value_fields(struct bitpack_d * bp,tree expr)31338fd1498Szrj pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr)
31438fd1498Szrj {
31538fd1498Szrj   /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags
31638fd1498Szrj      not necessary valid in a global context.
31738fd1498Szrj      Use the raw value previously set by layout_type.  */
31838fd1498Szrj   bp_pack_machine_mode (bp, TYPE_MODE_RAW (expr));
31938fd1498Szrj   bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1);
32038fd1498Szrj   /* TYPE_NO_FORCE_BLK is private to stor-layout and need
32138fd1498Szrj      no streaming.  */
32238fd1498Szrj   bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING (expr), 1);
32338fd1498Szrj   bp_pack_value (bp, TYPE_PACKED (expr), 1);
32438fd1498Szrj   bp_pack_value (bp, TYPE_RESTRICT (expr), 1);
32538fd1498Szrj   bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1);
32638fd1498Szrj   bp_pack_value (bp, TYPE_READONLY (expr), 1);
32738fd1498Szrj   /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark
32838fd1498Szrj      types that are opaque for TBAA.  This however did not work as intended,
32938fd1498Szrj      because TYPE_ALIAS_SET == 0 was regularly lost in type merging.  */
33038fd1498Szrj   if (RECORD_OR_UNION_TYPE_P (expr))
33138fd1498Szrj     {
33238fd1498Szrj       bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1);
33338fd1498Szrj       bp_pack_value (bp, TYPE_FINAL_P (expr), 1);
33438fd1498Szrj     }
33538fd1498Szrj   else if (TREE_CODE (expr) == ARRAY_TYPE)
33638fd1498Szrj     bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1);
33738fd1498Szrj   if (AGGREGATE_TYPE_P (expr))
33838fd1498Szrj     bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1);
33938fd1498Szrj   bp_pack_value (bp, TYPE_EMPTY_P (expr), 1);
34038fd1498Szrj   bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr));
34138fd1498Szrj   bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr));
34238fd1498Szrj }
34338fd1498Szrj 
34438fd1498Szrj 
34538fd1498Szrj /* Pack all the non-pointer fields of the TS_BLOCK structure
34638fd1498Szrj    of expression EXPR into bitpack BP.  */
34738fd1498Szrj 
34838fd1498Szrj static void
pack_ts_block_value_fields(struct output_block * ob,struct bitpack_d * bp,tree expr)34938fd1498Szrj pack_ts_block_value_fields (struct output_block *ob,
35038fd1498Szrj 			    struct bitpack_d *bp, tree expr)
35138fd1498Szrj {
35238fd1498Szrj   bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1);
35338fd1498Szrj   /* BLOCK_NUMBER is recomputed.  */
35438fd1498Szrj   /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those
35538fd1498Szrj      that represent inlined function scopes.
35638fd1498Szrj      For the rest them on the floor instead of ICEing in dwarf2out.c.  */
35738fd1498Szrj   if (inlined_function_outer_scope_p (expr))
35838fd1498Szrj     stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr));
35938fd1498Szrj   else
36038fd1498Szrj     stream_output_location (ob, bp, UNKNOWN_LOCATION);
36138fd1498Szrj }
36238fd1498Szrj 
36338fd1498Szrj /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
36438fd1498Szrj    of expression EXPR into bitpack BP.  */
36538fd1498Szrj 
36638fd1498Szrj static void
pack_ts_translation_unit_decl_value_fields(struct output_block * ob,struct bitpack_d * bp,tree expr)36738fd1498Szrj pack_ts_translation_unit_decl_value_fields (struct output_block *ob,
36838fd1498Szrj 					    struct bitpack_d *bp, tree expr)
36938fd1498Szrj {
37038fd1498Szrj   bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true);
37138fd1498Szrj }
37238fd1498Szrj 
37338fd1498Szrj 
37438fd1498Szrj /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure
37538fd1498Szrj    of expression EXPR into bitpack BP.  */
37638fd1498Szrj 
37738fd1498Szrj static void
pack_ts_omp_clause_value_fields(struct output_block * ob,struct bitpack_d * bp,tree expr)37838fd1498Szrj pack_ts_omp_clause_value_fields (struct output_block *ob,
37938fd1498Szrj 				 struct bitpack_d *bp, tree expr)
38038fd1498Szrj {
38138fd1498Szrj   stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr));
38238fd1498Szrj   switch (OMP_CLAUSE_CODE (expr))
38338fd1498Szrj     {
38438fd1498Szrj     case OMP_CLAUSE_DEFAULT:
38538fd1498Szrj       bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST,
38638fd1498Szrj 		    OMP_CLAUSE_DEFAULT_KIND (expr));
38738fd1498Szrj       break;
38838fd1498Szrj     case OMP_CLAUSE_SCHEDULE:
38938fd1498Szrj       bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST,
39038fd1498Szrj 		    OMP_CLAUSE_SCHEDULE_KIND (expr));
39138fd1498Szrj       break;
39238fd1498Szrj     case OMP_CLAUSE_DEPEND:
39338fd1498Szrj       bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST,
39438fd1498Szrj 		    OMP_CLAUSE_DEPEND_KIND (expr));
39538fd1498Szrj       break;
39638fd1498Szrj     case OMP_CLAUSE_MAP:
39738fd1498Szrj       bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST,
39838fd1498Szrj 		    OMP_CLAUSE_MAP_KIND (expr));
39938fd1498Szrj       break;
40038fd1498Szrj     case OMP_CLAUSE_PROC_BIND:
40138fd1498Szrj       bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST,
40238fd1498Szrj 		    OMP_CLAUSE_PROC_BIND_KIND (expr));
40338fd1498Szrj       break;
40438fd1498Szrj     case OMP_CLAUSE_REDUCTION:
40538fd1498Szrj       bp_pack_enum (bp, tree_code, MAX_TREE_CODES,
40638fd1498Szrj 		    OMP_CLAUSE_REDUCTION_CODE (expr));
40738fd1498Szrj       break;
40838fd1498Szrj     default:
40938fd1498Szrj       break;
41038fd1498Szrj     }
41138fd1498Szrj }
41238fd1498Szrj 
41338fd1498Szrj 
41438fd1498Szrj /* Pack all the bitfields in EXPR into a bit pack.  */
41538fd1498Szrj 
41638fd1498Szrj void
streamer_write_tree_bitfields(struct output_block * ob,tree expr)41738fd1498Szrj streamer_write_tree_bitfields (struct output_block *ob, tree expr)
41838fd1498Szrj {
41938fd1498Szrj   bitpack_d bp = bitpack_create (ob->main_stream);
42038fd1498Szrj   enum tree_code code;
42138fd1498Szrj 
42238fd1498Szrj   code = TREE_CODE (expr);
42338fd1498Szrj 
42438fd1498Szrj   /* Note that all these functions are highly sensitive to changes in
42538fd1498Szrj      the types and sizes of each of the fields being packed.  */
42638fd1498Szrj   pack_ts_base_value_fields (&bp, expr);
42738fd1498Szrj 
42838fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
42938fd1498Szrj     pack_ts_int_cst_value_fields (&bp, expr);
43038fd1498Szrj 
43138fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST))
43238fd1498Szrj     pack_ts_real_cst_value_fields (&bp, expr);
43338fd1498Szrj 
43438fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST))
43538fd1498Szrj     pack_ts_fixed_cst_value_fields (&bp, expr);
43638fd1498Szrj 
43738fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
43838fd1498Szrj     stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr));
43938fd1498Szrj 
44038fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
44138fd1498Szrj     pack_ts_decl_common_value_fields (&bp, expr);
44238fd1498Szrj 
44338fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
44438fd1498Szrj     pack_ts_decl_wrtl_value_fields (&bp, expr);
44538fd1498Szrj 
44638fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
44738fd1498Szrj     pack_ts_decl_with_vis_value_fields (&bp, expr);
44838fd1498Szrj 
44938fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
45038fd1498Szrj     pack_ts_function_decl_value_fields (&bp, expr);
45138fd1498Szrj 
45238fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
45338fd1498Szrj     pack_ts_type_common_value_fields (&bp, expr);
45438fd1498Szrj 
45538fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
45638fd1498Szrj     {
45738fd1498Szrj       stream_output_location (ob, &bp, EXPR_LOCATION (expr));
45838fd1498Szrj       if (code == MEM_REF
45938fd1498Szrj 	  || code == TARGET_MEM_REF)
46038fd1498Szrj 	{
46138fd1498Szrj 	  bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8);
46238fd1498Szrj 	  if (MR_DEPENDENCE_CLIQUE (expr) != 0)
46338fd1498Szrj 	    bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
46438fd1498Szrj 	}
465*58e805e6Szrj       else if (code == CALL_EXPR)
466*58e805e6Szrj 	bp_pack_enum (&bp, internal_fn, IFN_LAST, CALL_EXPR_IFN (expr));
46738fd1498Szrj     }
46838fd1498Szrj 
46938fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
47038fd1498Szrj     pack_ts_block_value_fields (ob, &bp, expr);
47138fd1498Szrj 
47238fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
47338fd1498Szrj     pack_ts_translation_unit_decl_value_fields (ob, &bp, expr);
47438fd1498Szrj 
47538fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
47638fd1498Szrj     cl_optimization_stream_out (&bp, TREE_OPTIMIZATION (expr));
47738fd1498Szrj 
47838fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
47938fd1498Szrj     bp_pack_var_len_unsigned (&bp, vec_safe_length (BINFO_BASE_ACCESSES (expr)));
48038fd1498Szrj 
48138fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
48238fd1498Szrj     bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr));
48338fd1498Szrj 
48438fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
48538fd1498Szrj       /* Don't stream these when passing things to a different target.  */
48638fd1498Szrj       && !lto_stream_offload_p)
48738fd1498Szrj     cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr));
48838fd1498Szrj 
48938fd1498Szrj   if (code == OMP_CLAUSE)
49038fd1498Szrj     pack_ts_omp_clause_value_fields (ob, &bp, expr);
49138fd1498Szrj 
49238fd1498Szrj   streamer_write_bitpack (&bp);
49338fd1498Szrj }
49438fd1498Szrj 
49538fd1498Szrj 
49638fd1498Szrj /* Emit the chain of tree nodes starting at T.  OB is the output block
49738fd1498Szrj    to write to.  REF_P is true if chain elements should be emitted
49838fd1498Szrj    as references.  */
49938fd1498Szrj 
50038fd1498Szrj void
streamer_write_chain(struct output_block * ob,tree t,bool ref_p)50138fd1498Szrj streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
50238fd1498Szrj {
50338fd1498Szrj   while (t)
50438fd1498Szrj     {
50538fd1498Szrj       /* We avoid outputting external vars or functions by reference
50638fd1498Szrj 	 to the global decls section as we do not want to have them
50738fd1498Szrj 	 enter decl merging.  This is, of course, only for the call
50838fd1498Szrj 	 for streaming BLOCK_VARS, but other callers are safe.
50938fd1498Szrj 	 See also lto-streamer-out.c:DFS_write_tree_body.  */
51038fd1498Szrj       if (VAR_OR_FUNCTION_DECL_P (t)
51138fd1498Szrj 	  && DECL_EXTERNAL (t))
51238fd1498Szrj 	stream_write_tree_shallow_non_ref (ob, t, ref_p);
51338fd1498Szrj       else
51438fd1498Szrj 	stream_write_tree (ob, t, ref_p);
51538fd1498Szrj 
51638fd1498Szrj       t = TREE_CHAIN (t);
51738fd1498Szrj     }
51838fd1498Szrj 
51938fd1498Szrj   /* Write a sentinel to terminate the chain.  */
52038fd1498Szrj   stream_write_tree (ob, NULL_TREE, ref_p);
52138fd1498Szrj }
52238fd1498Szrj 
52338fd1498Szrj 
52438fd1498Szrj /* Write all pointer fields in the TS_COMMON structure of EXPR to output
52538fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
52638fd1498Szrj    fields.  */
52738fd1498Szrj 
52838fd1498Szrj static void
write_ts_common_tree_pointers(struct output_block * ob,tree expr,bool ref_p)52938fd1498Szrj write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
53038fd1498Szrj {
53138fd1498Szrj   if (TREE_CODE (expr) != IDENTIFIER_NODE)
53238fd1498Szrj     stream_write_tree (ob, TREE_TYPE (expr), ref_p);
53338fd1498Szrj }
53438fd1498Szrj 
53538fd1498Szrj 
53638fd1498Szrj /* Write all pointer fields in the TS_VECTOR structure of EXPR to output
53738fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
53838fd1498Szrj    fields.  */
53938fd1498Szrj 
54038fd1498Szrj static void
write_ts_vector_tree_pointers(struct output_block * ob,tree expr,bool ref_p)54138fd1498Szrj write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
54238fd1498Szrj {
54338fd1498Szrj   /* Note that the number of elements for EXPR has already been emitted
54438fd1498Szrj      in EXPR's header (see streamer_write_tree_header).  */
54538fd1498Szrj   unsigned int count = vector_cst_encoded_nelts (expr);
54638fd1498Szrj   for (unsigned int i = 0; i < count; ++i)
54738fd1498Szrj     stream_write_tree (ob, VECTOR_CST_ENCODED_ELT (expr, i), ref_p);
54838fd1498Szrj }
54938fd1498Szrj 
55038fd1498Szrj 
55138fd1498Szrj /* Write all pointer fields in the TS_POLY_INT_CST structure of EXPR to
55238fd1498Szrj    output block OB.  If REF_P is true, write a reference to EXPR's pointer
55338fd1498Szrj    fields.  */
55438fd1498Szrj 
55538fd1498Szrj static void
write_ts_poly_tree_pointers(struct output_block * ob,tree expr,bool ref_p)55638fd1498Szrj write_ts_poly_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
55738fd1498Szrj {
55838fd1498Szrj   for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
55938fd1498Szrj     stream_write_tree (ob, POLY_INT_CST_COEFF (expr, i), ref_p);
56038fd1498Szrj }
56138fd1498Szrj 
56238fd1498Szrj 
56338fd1498Szrj /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output
56438fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
56538fd1498Szrj    fields.  */
56638fd1498Szrj 
56738fd1498Szrj static void
write_ts_complex_tree_pointers(struct output_block * ob,tree expr,bool ref_p)56838fd1498Szrj write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
56938fd1498Szrj {
57038fd1498Szrj   stream_write_tree (ob, TREE_REALPART (expr), ref_p);
57138fd1498Szrj   stream_write_tree (ob, TREE_IMAGPART (expr), ref_p);
57238fd1498Szrj }
57338fd1498Szrj 
57438fd1498Szrj 
57538fd1498Szrj /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR
57638fd1498Szrj    to output block OB.  If REF_P is true, write a reference to EXPR's
57738fd1498Szrj    pointer fields.  */
57838fd1498Szrj 
57938fd1498Szrj static void
write_ts_decl_minimal_tree_pointers(struct output_block * ob,tree expr,bool ref_p)58038fd1498Szrj write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr,
58138fd1498Szrj 				     bool ref_p)
58238fd1498Szrj {
58338fd1498Szrj   /* Drop names that were created for anonymous entities.  */
58438fd1498Szrj   if (DECL_NAME (expr)
58538fd1498Szrj       && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE
58638fd1498Szrj       && anon_aggrname_p (DECL_NAME (expr)))
58738fd1498Szrj     stream_write_tree (ob, NULL_TREE, ref_p);
58838fd1498Szrj   else
58938fd1498Szrj     stream_write_tree (ob, DECL_NAME (expr), ref_p);
59038fd1498Szrj   if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL
59138fd1498Szrj       && ! DECL_CONTEXT (expr))
59238fd1498Szrj     stream_write_tree (ob, (*all_translation_units)[0], ref_p);
59338fd1498Szrj   else
59438fd1498Szrj     stream_write_tree (ob, DECL_CONTEXT (expr), ref_p);
59538fd1498Szrj }
59638fd1498Szrj 
59738fd1498Szrj 
59838fd1498Szrj /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to
59938fd1498Szrj    output block OB.  If REF_P is true, write a reference to EXPR's
60038fd1498Szrj    pointer fields.  */
60138fd1498Szrj 
60238fd1498Szrj static void
write_ts_decl_common_tree_pointers(struct output_block * ob,tree expr,bool ref_p)60338fd1498Szrj write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr,
60438fd1498Szrj 				    bool ref_p)
60538fd1498Szrj {
60638fd1498Szrj   stream_write_tree (ob, DECL_SIZE (expr), ref_p);
60738fd1498Szrj   stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p);
60838fd1498Szrj 
60938fd1498Szrj   /* Note, DECL_INITIAL is not handled here.  Since DECL_INITIAL needs
61038fd1498Szrj      special handling in LTO, it must be handled by streamer hooks.  */
61138fd1498Szrj 
61238fd1498Szrj   stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p);
613*58e805e6Szrj 
614*58e805e6Szrj   /* On non-early-LTO enabled targets we claim we compiled with -g0
615*58e805e6Szrj      but dwarf2out still did its set_decl_origin_self game fooling
616*58e805e6Szrj      itself late.  Und that here since we won't have access to the
617*58e805e6Szrj      early generated abstract DIEs.  */
618*58e805e6Szrj   tree ao = DECL_ABSTRACT_ORIGIN (expr);
619*58e805e6Szrj   if (debug_info_level == DINFO_LEVEL_NONE
620*58e805e6Szrj       && ao == expr)
621*58e805e6Szrj     ao = NULL_TREE;
622*58e805e6Szrj   stream_write_tree (ob, ao, ref_p);
62338fd1498Szrj 
62438fd1498Szrj   if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL)
62538fd1498Szrj       && DECL_HAS_VALUE_EXPR_P (expr))
62638fd1498Szrj     stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p);
62738fd1498Szrj 
62838fd1498Szrj   if (VAR_P (expr)
62938fd1498Szrj       && DECL_HAS_DEBUG_EXPR_P (expr))
63038fd1498Szrj     stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p);
63138fd1498Szrj }
63238fd1498Szrj 
63338fd1498Szrj 
63438fd1498Szrj /* Write all pointer fields in the TS_DECL_NON_COMMON structure of
63538fd1498Szrj    EXPR to output block OB.  If REF_P is true, write a reference to EXPR's
63638fd1498Szrj    pointer fields.  */
63738fd1498Szrj 
63838fd1498Szrj static void
write_ts_decl_non_common_tree_pointers(struct output_block * ob,tree expr,bool ref_p)63938fd1498Szrj write_ts_decl_non_common_tree_pointers (struct output_block *ob, tree expr,
64038fd1498Szrj 				        bool ref_p)
64138fd1498Szrj {
64238fd1498Szrj   if (TREE_CODE (expr) == TYPE_DECL)
64338fd1498Szrj     stream_write_tree (ob, DECL_ORIGINAL_TYPE (expr), ref_p);
64438fd1498Szrj }
64538fd1498Szrj 
64638fd1498Szrj 
64738fd1498Szrj /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR
64838fd1498Szrj    to output block OB.  If REF_P is true, write a reference to EXPR's
64938fd1498Szrj    pointer fields.  */
65038fd1498Szrj 
65138fd1498Szrj static void
write_ts_decl_with_vis_tree_pointers(struct output_block * ob,tree expr,bool ref_p)65238fd1498Szrj write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr,
65338fd1498Szrj 			              bool ref_p)
65438fd1498Szrj {
65538fd1498Szrj   /* Make sure we don't inadvertently set the assembler name.  */
65638fd1498Szrj   if (DECL_ASSEMBLER_NAME_SET_P (expr))
65738fd1498Szrj     stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p);
65838fd1498Szrj   else
65938fd1498Szrj     stream_write_tree (ob, NULL_TREE, false);
66038fd1498Szrj }
66138fd1498Szrj 
66238fd1498Szrj 
66338fd1498Szrj /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to
66438fd1498Szrj    output block OB.  If REF_P is true, write a reference to EXPR's
66538fd1498Szrj    pointer fields.  */
66638fd1498Szrj 
66738fd1498Szrj static void
write_ts_field_decl_tree_pointers(struct output_block * ob,tree expr,bool ref_p)66838fd1498Szrj write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr,
66938fd1498Szrj 				   bool ref_p)
67038fd1498Szrj {
67138fd1498Szrj   stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p);
67238fd1498Szrj   stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p);
67338fd1498Szrj   stream_write_tree (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr), ref_p);
67438fd1498Szrj   stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p);
67538fd1498Szrj   stream_write_tree (ob, DECL_FCONTEXT (expr), ref_p);
67638fd1498Szrj }
67738fd1498Szrj 
67838fd1498Szrj 
67938fd1498Szrj /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR
68038fd1498Szrj    to output block OB.  If REF_P is true, write a reference to EXPR's
68138fd1498Szrj    pointer fields.  */
68238fd1498Szrj 
68338fd1498Szrj static void
write_ts_function_decl_tree_pointers(struct output_block * ob,tree expr,bool ref_p)68438fd1498Szrj write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
68538fd1498Szrj 				      bool ref_p)
68638fd1498Szrj {
68738fd1498Szrj   stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
68838fd1498Szrj   /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  */
68938fd1498Szrj   stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
69038fd1498Szrj   /* Don't stream these when passing things to a different target.  */
69138fd1498Szrj   if (!lto_stream_offload_p)
69238fd1498Szrj     stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
69338fd1498Szrj   stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
69438fd1498Szrj }
69538fd1498Szrj 
69638fd1498Szrj 
69738fd1498Szrj /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to
69838fd1498Szrj    output block OB.  If REF_P is true, write a reference to EXPR's
69938fd1498Szrj    pointer fields.  */
70038fd1498Szrj 
70138fd1498Szrj static void
write_ts_type_common_tree_pointers(struct output_block * ob,tree expr,bool ref_p)70238fd1498Szrj write_ts_type_common_tree_pointers (struct output_block *ob, tree expr,
70338fd1498Szrj 				    bool ref_p)
70438fd1498Szrj {
70538fd1498Szrj   stream_write_tree (ob, TYPE_SIZE (expr), ref_p);
70638fd1498Szrj   stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p);
70738fd1498Szrj   stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p);
70838fd1498Szrj   stream_write_tree (ob, TYPE_NAME (expr), ref_p);
70938fd1498Szrj   /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO.  They will be
71038fd1498Szrj      reconstructed during fixup.  */
71138fd1498Szrj   /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists
71238fd1498Szrj      during fixup.  */
71338fd1498Szrj   stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p);
71438fd1498Szrj   stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p);
71538fd1498Szrj   /* TYPE_CANONICAL is re-computed during type merging, so no need
71638fd1498Szrj      to stream it here.  */
71738fd1498Szrj   stream_write_tree (ob, TYPE_STUB_DECL (expr), ref_p);
71838fd1498Szrj }
71938fd1498Szrj 
72038fd1498Szrj /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR
72138fd1498Szrj    to output block OB.  If REF_P is true, write a reference to EXPR's
72238fd1498Szrj    pointer fields.  */
72338fd1498Szrj 
72438fd1498Szrj static void
write_ts_type_non_common_tree_pointers(struct output_block * ob,tree expr,bool ref_p)72538fd1498Szrj write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr,
72638fd1498Szrj 					bool ref_p)
72738fd1498Szrj {
72838fd1498Szrj   if (TREE_CODE (expr) == ENUMERAL_TYPE)
72938fd1498Szrj     stream_write_tree (ob, TYPE_VALUES (expr), ref_p);
73038fd1498Szrj   else if (TREE_CODE (expr) == ARRAY_TYPE)
73138fd1498Szrj     stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p);
73238fd1498Szrj   else if (RECORD_OR_UNION_TYPE_P (expr))
73338fd1498Szrj     streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p);
73438fd1498Szrj   else if (TREE_CODE (expr) == FUNCTION_TYPE
73538fd1498Szrj 	   || TREE_CODE (expr) == METHOD_TYPE)
73638fd1498Szrj     stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p);
73738fd1498Szrj 
73838fd1498Szrj   if (!POINTER_TYPE_P (expr))
73938fd1498Szrj     stream_write_tree (ob, TYPE_MIN_VALUE_RAW (expr), ref_p);
74038fd1498Szrj   stream_write_tree (ob, TYPE_MAX_VALUE_RAW (expr), ref_p);
74138fd1498Szrj }
74238fd1498Szrj 
74338fd1498Szrj 
74438fd1498Szrj /* Write all pointer fields in the TS_LIST structure of EXPR to output
74538fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
74638fd1498Szrj    fields.  */
74738fd1498Szrj 
74838fd1498Szrj static void
write_ts_list_tree_pointers(struct output_block * ob,tree expr,bool ref_p)74938fd1498Szrj write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
75038fd1498Szrj {
75138fd1498Szrj   stream_write_tree (ob, TREE_PURPOSE (expr), ref_p);
75238fd1498Szrj   stream_write_tree (ob, TREE_VALUE (expr), ref_p);
75338fd1498Szrj   stream_write_tree (ob, TREE_CHAIN (expr), ref_p);
75438fd1498Szrj }
75538fd1498Szrj 
75638fd1498Szrj 
75738fd1498Szrj /* Write all pointer fields in the TS_VEC structure of EXPR to output
75838fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
75938fd1498Szrj    fields.  */
76038fd1498Szrj 
76138fd1498Szrj static void
write_ts_vec_tree_pointers(struct output_block * ob,tree expr,bool ref_p)76238fd1498Szrj write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
76338fd1498Szrj {
76438fd1498Szrj   int i;
76538fd1498Szrj 
76638fd1498Szrj   /* Note that the number of slots for EXPR has already been emitted
76738fd1498Szrj      in EXPR's header (see streamer_write_tree_header).  */
76838fd1498Szrj   for (i = 0; i < TREE_VEC_LENGTH (expr); i++)
76938fd1498Szrj     stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p);
77038fd1498Szrj }
77138fd1498Szrj 
77238fd1498Szrj 
77338fd1498Szrj /* Write all pointer fields in the TS_EXP structure of EXPR to output
77438fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
77538fd1498Szrj    fields.  */
77638fd1498Szrj 
77738fd1498Szrj static void
write_ts_exp_tree_pointers(struct output_block * ob,tree expr,bool ref_p)77838fd1498Szrj write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
77938fd1498Szrj {
78038fd1498Szrj   int i;
78138fd1498Szrj 
78238fd1498Szrj   for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++)
78338fd1498Szrj     stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p);
78438fd1498Szrj   stream_write_tree (ob, TREE_BLOCK (expr), ref_p);
78538fd1498Szrj }
78638fd1498Szrj 
78738fd1498Szrj 
78838fd1498Szrj /* Write all pointer fields in the TS_BLOCK structure of EXPR to output
78938fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
79038fd1498Szrj    fields.  */
79138fd1498Szrj 
79238fd1498Szrj static void
write_ts_block_tree_pointers(struct output_block * ob,tree expr,bool ref_p)79338fd1498Szrj write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
79438fd1498Szrj {
79538fd1498Szrj   streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
79638fd1498Szrj 
79738fd1498Szrj   stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
79838fd1498Szrj 
79938fd1498Szrj   /* Stream BLOCK_ABSTRACT_ORIGIN for the limited cases we can handle - those
80038fd1498Szrj      that represent inlined function scopes.
80138fd1498Szrj      For the rest them on the floor instead of ICEing in dwarf2out.c, but
80238fd1498Szrj      keep the notion of whether the block is an inlined block by refering
80338fd1498Szrj      to itself for the sake of tree_nonartificial_location.  */
80438fd1498Szrj   if (inlined_function_outer_scope_p (expr))
80538fd1498Szrj     {
80638fd1498Szrj       tree ultimate_origin = block_ultimate_origin (expr);
80738fd1498Szrj       stream_write_tree (ob, ultimate_origin, ref_p);
80838fd1498Szrj     }
80938fd1498Szrj   else
81038fd1498Szrj     stream_write_tree (ob, (BLOCK_ABSTRACT_ORIGIN (expr)
81138fd1498Szrj 			    ? expr : NULL_TREE), ref_p);
81238fd1498Szrj   /* Do not stream BLOCK_NONLOCALIZED_VARS.  We cannot handle debug information
81338fd1498Szrj      for early inlined BLOCKs so drop it on the floor instead of ICEing in
81438fd1498Szrj      dwarf2out.c.  */
81538fd1498Szrj 
81638fd1498Szrj   /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
81738fd1498Szrj      streaming time.  */
81838fd1498Szrj 
81938fd1498Szrj   /* Do not output BLOCK_SUBBLOCKS.  Instead on streaming-in this
82038fd1498Szrj      list is re-constructed from BLOCK_SUPERCONTEXT.  */
82138fd1498Szrj }
82238fd1498Szrj 
82338fd1498Szrj 
82438fd1498Szrj /* Write all pointer fields in the TS_BINFO structure of EXPR to output
82538fd1498Szrj    block OB.  If REF_P is true, write a reference to EXPR's pointer
82638fd1498Szrj    fields.  */
82738fd1498Szrj 
82838fd1498Szrj static void
write_ts_binfo_tree_pointers(struct output_block * ob,tree expr,bool ref_p)82938fd1498Szrj write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
83038fd1498Szrj {
83138fd1498Szrj   unsigned i;
83238fd1498Szrj   tree t;
83338fd1498Szrj 
83438fd1498Szrj   /* Note that the number of BINFO slots has already been emitted in
83538fd1498Szrj      EXPR's header (see streamer_write_tree_header) because this length
83638fd1498Szrj      is needed to build the empty BINFO node on the reader side.  */
83738fd1498Szrj   FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t)
83838fd1498Szrj     stream_write_tree (ob, t, ref_p);
83938fd1498Szrj   stream_write_tree (ob, NULL_TREE, false);
84038fd1498Szrj 
84138fd1498Szrj   stream_write_tree (ob, BINFO_OFFSET (expr), ref_p);
84238fd1498Szrj   stream_write_tree (ob, BINFO_VTABLE (expr), ref_p);
84338fd1498Szrj   stream_write_tree (ob, BINFO_VPTR_FIELD (expr), ref_p);
84438fd1498Szrj 
84538fd1498Szrj   /* The number of BINFO_BASE_ACCESSES has already been emitted in
84638fd1498Szrj      EXPR's bitfield section.  */
84738fd1498Szrj   FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t)
84838fd1498Szrj     stream_write_tree (ob, t, ref_p);
84938fd1498Szrj 
85038fd1498Szrj   /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
85138fd1498Szrj      and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
85238fd1498Szrj }
85338fd1498Szrj 
85438fd1498Szrj 
85538fd1498Szrj /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to
85638fd1498Szrj    output block OB.  If REF_P is true, write a reference to EXPR's
85738fd1498Szrj    pointer fields.  */
85838fd1498Szrj 
85938fd1498Szrj static void
write_ts_constructor_tree_pointers(struct output_block * ob,tree expr,bool ref_p)86038fd1498Szrj write_ts_constructor_tree_pointers (struct output_block *ob, tree expr,
86138fd1498Szrj 				    bool ref_p)
86238fd1498Szrj {
86338fd1498Szrj   unsigned i;
86438fd1498Szrj   tree index, value;
86538fd1498Szrj 
86638fd1498Szrj   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value)
86738fd1498Szrj     {
86838fd1498Szrj       stream_write_tree (ob, index, ref_p);
86938fd1498Szrj       stream_write_tree (ob, value, ref_p);
87038fd1498Szrj     }
87138fd1498Szrj }
87238fd1498Szrj 
87338fd1498Szrj 
87438fd1498Szrj /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR
87538fd1498Szrj    to output block OB.  If REF_P is true, write a reference to EXPR's
87638fd1498Szrj    pointer fields.  */
87738fd1498Szrj 
87838fd1498Szrj static void
write_ts_omp_clause_tree_pointers(struct output_block * ob,tree expr,bool ref_p)87938fd1498Szrj write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr,
88038fd1498Szrj 				   bool ref_p)
88138fd1498Szrj {
88238fd1498Szrj   int i;
88338fd1498Szrj   for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++)
88438fd1498Szrj     stream_write_tree (ob, OMP_CLAUSE_OPERAND (expr, i), ref_p);
88538fd1498Szrj   if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_REDUCTION)
88638fd1498Szrj     {
88738fd1498Szrj       /* We don't stream these right now, handle it if streaming
88838fd1498Szrj 	 of them is needed.  */
88938fd1498Szrj       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL);
89038fd1498Szrj       gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL);
89138fd1498Szrj     }
89238fd1498Szrj   stream_write_tree (ob, OMP_CLAUSE_CHAIN (expr), ref_p);
89338fd1498Szrj }
89438fd1498Szrj 
89538fd1498Szrj 
89638fd1498Szrj /* Write all pointer fields in EXPR to output block OB.  If REF_P is true,
89738fd1498Szrj    the leaves of EXPR are emitted as references.  */
89838fd1498Szrj 
89938fd1498Szrj void
streamer_write_tree_body(struct output_block * ob,tree expr,bool ref_p)90038fd1498Szrj streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p)
90138fd1498Szrj {
90238fd1498Szrj   enum tree_code code;
90338fd1498Szrj 
90438fd1498Szrj   lto_stats.num_tree_bodies_output++;
90538fd1498Szrj 
90638fd1498Szrj   code = TREE_CODE (expr);
90738fd1498Szrj 
90838fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
90938fd1498Szrj     write_ts_common_tree_pointers (ob, expr, ref_p);
91038fd1498Szrj 
91138fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
91238fd1498Szrj     write_ts_vector_tree_pointers (ob, expr, ref_p);
91338fd1498Szrj 
91438fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST))
91538fd1498Szrj     write_ts_poly_tree_pointers (ob, expr, ref_p);
91638fd1498Szrj 
91738fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX))
91838fd1498Szrj     write_ts_complex_tree_pointers (ob, expr, ref_p);
91938fd1498Szrj 
92038fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
92138fd1498Szrj     write_ts_decl_minimal_tree_pointers (ob, expr, ref_p);
92238fd1498Szrj 
92338fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
92438fd1498Szrj     write_ts_decl_common_tree_pointers (ob, expr, ref_p);
92538fd1498Szrj 
92638fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
92738fd1498Szrj     write_ts_decl_non_common_tree_pointers (ob, expr, ref_p);
92838fd1498Szrj 
92938fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
93038fd1498Szrj     write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p);
93138fd1498Szrj 
93238fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
93338fd1498Szrj     write_ts_field_decl_tree_pointers (ob, expr, ref_p);
93438fd1498Szrj 
93538fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
93638fd1498Szrj     write_ts_function_decl_tree_pointers (ob, expr, ref_p);
93738fd1498Szrj 
93838fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
93938fd1498Szrj     write_ts_type_common_tree_pointers (ob, expr, ref_p);
94038fd1498Szrj 
94138fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
94238fd1498Szrj     write_ts_type_non_common_tree_pointers (ob, expr, ref_p);
94338fd1498Szrj 
94438fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_LIST))
94538fd1498Szrj     write_ts_list_tree_pointers (ob, expr, ref_p);
94638fd1498Szrj 
94738fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_VEC))
94838fd1498Szrj     write_ts_vec_tree_pointers (ob, expr, ref_p);
94938fd1498Szrj 
95038fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_EXP))
95138fd1498Szrj     write_ts_exp_tree_pointers (ob, expr, ref_p);
95238fd1498Szrj 
95338fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
95438fd1498Szrj     write_ts_block_tree_pointers (ob, expr, ref_p);
95538fd1498Szrj 
95638fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
95738fd1498Szrj     write_ts_binfo_tree_pointers (ob, expr, ref_p);
95838fd1498Szrj 
95938fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
96038fd1498Szrj     write_ts_constructor_tree_pointers (ob, expr, ref_p);
96138fd1498Szrj 
96238fd1498Szrj   if (code == OMP_CLAUSE)
96338fd1498Szrj     write_ts_omp_clause_tree_pointers (ob, expr, ref_p);
96438fd1498Szrj }
96538fd1498Szrj 
96638fd1498Szrj 
96738fd1498Szrj /* Emit header information for tree EXPR to output block OB.  The header
96838fd1498Szrj    contains everything needed to instantiate an empty skeleton for
96938fd1498Szrj    EXPR on the reading side.  IX is the index into the streamer cache
97038fd1498Szrj    where EXPR is stored.  */
97138fd1498Szrj 
97238fd1498Szrj void
streamer_write_tree_header(struct output_block * ob,tree expr)97338fd1498Szrj streamer_write_tree_header (struct output_block *ob, tree expr)
97438fd1498Szrj {
97538fd1498Szrj   enum LTO_tags tag;
97638fd1498Szrj   enum tree_code code;
97738fd1498Szrj 
97838fd1498Szrj   /* We should not see any tree nodes not handled by the streamer.  */
97938fd1498Szrj   code = TREE_CODE (expr);
98038fd1498Szrj 
98138fd1498Szrj   /* The header of a tree node consists of its tag, the size of
98238fd1498Szrj      the node, and any other information needed to instantiate
98338fd1498Szrj      EXPR on the reading side (such as the number of slots in
98438fd1498Szrj      variable sized nodes).  */
98538fd1498Szrj   tag = lto_tree_code_to_tag (code);
98638fd1498Szrj   streamer_write_record_start (ob, tag);
98738fd1498Szrj 
98838fd1498Szrj   /* The text in strings and identifiers are completely emitted in
98938fd1498Szrj      the header.  */
99038fd1498Szrj   if (CODE_CONTAINS_STRUCT (code, TS_STRING))
99138fd1498Szrj     streamer_write_string_cst (ob, ob->main_stream, expr);
99238fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER))
99338fd1498Szrj     write_identifier (ob, ob->main_stream, expr);
99438fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR))
99538fd1498Szrj     {
99638fd1498Szrj       bitpack_d bp = bitpack_create (ob->main_stream);
99738fd1498Szrj       bp_pack_value (&bp, VECTOR_CST_LOG2_NPATTERNS (expr), 8);
99838fd1498Szrj       bp_pack_value (&bp, VECTOR_CST_NELTS_PER_PATTERN (expr), 8);
99938fd1498Szrj       streamer_write_bitpack (&bp);
100038fd1498Szrj     }
100138fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_VEC))
100238fd1498Szrj     streamer_write_hwi (ob, TREE_VEC_LENGTH (expr));
100338fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
100438fd1498Szrj     streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr));
100538fd1498Szrj   else if (TREE_CODE (expr) == CALL_EXPR)
100638fd1498Szrj     streamer_write_uhwi (ob, call_expr_nargs (expr));
100738fd1498Szrj   else if (TREE_CODE (expr) == OMP_CLAUSE)
100838fd1498Szrj     streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr));
100938fd1498Szrj   else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST))
101038fd1498Szrj     {
101138fd1498Szrj       gcc_checking_assert (TREE_INT_CST_NUNITS (expr));
101238fd1498Szrj       streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr));
101338fd1498Szrj       streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr));
101438fd1498Szrj     }
101538fd1498Szrj }
101638fd1498Szrj 
101738fd1498Szrj 
101838fd1498Szrj /* Emit the integer constant CST to output block OB.  If REF_P is true,
101938fd1498Szrj    CST's type will be emitted as a reference.  */
102038fd1498Szrj 
102138fd1498Szrj void
streamer_write_integer_cst(struct output_block * ob,tree cst,bool ref_p)102238fd1498Szrj streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p)
102338fd1498Szrj {
102438fd1498Szrj   int i;
102538fd1498Szrj   int len = TREE_INT_CST_NUNITS (cst);
102638fd1498Szrj   gcc_assert (!TREE_OVERFLOW (cst));
102738fd1498Szrj   streamer_write_record_start (ob, LTO_integer_cst);
102838fd1498Szrj   stream_write_tree (ob, TREE_TYPE (cst), ref_p);
102938fd1498Szrj   /* We're effectively streaming a non-sign-extended wide_int here,
103038fd1498Szrj      so there's no need to stream TREE_INT_CST_EXT_NUNITS or any
103138fd1498Szrj      array members beyond LEN.  We'll recreate the tree from the
103238fd1498Szrj      wide_int and the type.  */
103338fd1498Szrj   streamer_write_uhwi (ob, len);
103438fd1498Szrj   for (i = 0; i < len; i++)
103538fd1498Szrj     streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i));
103638fd1498Szrj }
1037