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