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