1*38fd1498Szrj /* Routines for emitting trees to a file stream. 2*38fd1498Szrj 3*38fd1498Szrj Copyright (C) 2011-2018 Free Software Foundation, Inc. 4*38fd1498Szrj Contributed by Diego Novillo <dnovillo@google.com> 5*38fd1498Szrj 6*38fd1498Szrj This file is part of GCC. 7*38fd1498Szrj 8*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under 9*38fd1498Szrj the terms of the GNU General Public License as published by the Free 10*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later 11*38fd1498Szrj version. 12*38fd1498Szrj 13*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY 14*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or 15*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16*38fd1498Szrj for more details. 17*38fd1498Szrj 18*38fd1498Szrj You should have received a copy of the GNU General Public License 19*38fd1498Szrj along with GCC; see the file COPYING3. If not see 20*38fd1498Szrj <http://www.gnu.org/licenses/>. */ 21*38fd1498Szrj 22*38fd1498Szrj #include "config.h" 23*38fd1498Szrj #include "system.h" 24*38fd1498Szrj #include "coretypes.h" 25*38fd1498Szrj #include "backend.h" 26*38fd1498Szrj #include "target.h" 27*38fd1498Szrj #include "tree.h" 28*38fd1498Szrj #include "gimple.h" 29*38fd1498Szrj #include "tree-streamer.h" 30*38fd1498Szrj #include "cgraph.h" 31*38fd1498Szrj #include "alias.h" 32*38fd1498Szrj #include "stor-layout.h" 33*38fd1498Szrj #include "gomp-constants.h" 34*38fd1498Szrj 35*38fd1498Szrj 36*38fd1498Szrj /* Output the STRING constant to the string 37*38fd1498Szrj table in OB. Then put the index onto the INDEX_STREAM. */ 38*38fd1498Szrj 39*38fd1498Szrj void 40*38fd1498Szrj streamer_write_string_cst (struct output_block *ob, 41*38fd1498Szrj struct lto_output_stream *index_stream, 42*38fd1498Szrj tree string) 43*38fd1498Szrj { 44*38fd1498Szrj streamer_write_string_with_length (ob, index_stream, 45*38fd1498Szrj string ? TREE_STRING_POINTER (string) 46*38fd1498Szrj : NULL, 47*38fd1498Szrj string ? TREE_STRING_LENGTH (string) : 0, 48*38fd1498Szrj true); 49*38fd1498Szrj } 50*38fd1498Szrj 51*38fd1498Szrj 52*38fd1498Szrj /* Output the identifier ID to the string 53*38fd1498Szrj table in OB. Then put the index onto the INDEX_STREAM. */ 54*38fd1498Szrj 55*38fd1498Szrj static void 56*38fd1498Szrj write_identifier (struct output_block *ob, 57*38fd1498Szrj struct lto_output_stream *index_stream, 58*38fd1498Szrj tree id) 59*38fd1498Szrj { 60*38fd1498Szrj streamer_write_string_with_length (ob, index_stream, 61*38fd1498Szrj IDENTIFIER_POINTER (id), 62*38fd1498Szrj IDENTIFIER_LENGTH (id), 63*38fd1498Szrj true); 64*38fd1498Szrj } 65*38fd1498Szrj 66*38fd1498Szrj 67*38fd1498Szrj /* Pack all the non-pointer fields of the TS_BASE structure of 68*38fd1498Szrj expression EXPR into bitpack BP. */ 69*38fd1498Szrj 70*38fd1498Szrj static inline void 71*38fd1498Szrj pack_ts_base_value_fields (struct bitpack_d *bp, tree expr) 72*38fd1498Szrj { 73*38fd1498Szrj bp_pack_value (bp, TREE_CODE (expr), 16); 74*38fd1498Szrj if (!TYPE_P (expr)) 75*38fd1498Szrj { 76*38fd1498Szrj bp_pack_value (bp, TREE_SIDE_EFFECTS (expr), 1); 77*38fd1498Szrj bp_pack_value (bp, TREE_CONSTANT (expr), 1); 78*38fd1498Szrj bp_pack_value (bp, TREE_READONLY (expr), 1); 79*38fd1498Szrj 80*38fd1498Szrj /* TREE_PUBLIC is used on types to indicate that the type 81*38fd1498Szrj has a TYPE_CACHED_VALUES vector. This is not streamed out, 82*38fd1498Szrj so we skip it here. */ 83*38fd1498Szrj bp_pack_value (bp, TREE_PUBLIC (expr), 1); 84*38fd1498Szrj } 85*38fd1498Szrj else 86*38fd1498Szrj bp_pack_value (bp, 0, 4); 87*38fd1498Szrj bp_pack_value (bp, TREE_ADDRESSABLE (expr), 1); 88*38fd1498Szrj bp_pack_value (bp, TREE_THIS_VOLATILE (expr), 1); 89*38fd1498Szrj if (DECL_P (expr)) 90*38fd1498Szrj { 91*38fd1498Szrj bp_pack_value (bp, DECL_UNSIGNED (expr), 1); 92*38fd1498Szrj bp_pack_value (bp, DECL_NAMELESS (expr), 1); 93*38fd1498Szrj } 94*38fd1498Szrj else if (TYPE_P (expr)) 95*38fd1498Szrj bp_pack_value (bp, TYPE_UNSIGNED (expr), 1); 96*38fd1498Szrj else 97*38fd1498Szrj bp_pack_value (bp, 0, 1); 98*38fd1498Szrj /* We write debug info two times, do not confuse the second one. 99*38fd1498Szrj The only relevant TREE_ASM_WRITTEN use is on SSA names. */ 100*38fd1498Szrj bp_pack_value (bp, (TREE_CODE (expr) != SSA_NAME 101*38fd1498Szrj ? 0 : TREE_ASM_WRITTEN (expr)), 1); 102*38fd1498Szrj if (TYPE_P (expr)) 103*38fd1498Szrj bp_pack_value (bp, TYPE_ARTIFICIAL (expr), 1); 104*38fd1498Szrj else 105*38fd1498Szrj bp_pack_value (bp, TREE_NO_WARNING (expr), 1); 106*38fd1498Szrj bp_pack_value (bp, TREE_NOTHROW (expr), 1); 107*38fd1498Szrj bp_pack_value (bp, TREE_STATIC (expr), 1); 108*38fd1498Szrj if (TREE_CODE (expr) != TREE_BINFO) 109*38fd1498Szrj bp_pack_value (bp, TREE_PRIVATE (expr), 1); 110*38fd1498Szrj else 111*38fd1498Szrj bp_pack_value (bp, 0, 1); 112*38fd1498Szrj bp_pack_value (bp, TREE_PROTECTED (expr), 1); 113*38fd1498Szrj bp_pack_value (bp, TREE_DEPRECATED (expr), 1); 114*38fd1498Szrj if (TYPE_P (expr)) 115*38fd1498Szrj { 116*38fd1498Szrj if (AGGREGATE_TYPE_P (expr)) 117*38fd1498Szrj bp_pack_value (bp, TYPE_REVERSE_STORAGE_ORDER (expr), 1); 118*38fd1498Szrj else 119*38fd1498Szrj bp_pack_value (bp, TYPE_SATURATING (expr), 1); 120*38fd1498Szrj bp_pack_value (bp, TYPE_ADDR_SPACE (expr), 8); 121*38fd1498Szrj } 122*38fd1498Szrj else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF) 123*38fd1498Szrj { 124*38fd1498Szrj bp_pack_value (bp, REF_REVERSE_STORAGE_ORDER (expr), 1); 125*38fd1498Szrj bp_pack_value (bp, 0, 8); 126*38fd1498Szrj } 127*38fd1498Szrj else if (TREE_CODE (expr) == SSA_NAME) 128*38fd1498Szrj { 129*38fd1498Szrj bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1); 130*38fd1498Szrj bp_pack_value (bp, 0, 8); 131*38fd1498Szrj } 132*38fd1498Szrj else 133*38fd1498Szrj bp_pack_value (bp, 0, 9); 134*38fd1498Szrj } 135*38fd1498Szrj 136*38fd1498Szrj 137*38fd1498Szrj /* Pack all the non-pointer fields of the TS_INTEGER_CST structure of 138*38fd1498Szrj expression EXPR into bitpack BP. */ 139*38fd1498Szrj 140*38fd1498Szrj static void 141*38fd1498Szrj pack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr) 142*38fd1498Szrj { 143*38fd1498Szrj int i; 144*38fd1498Szrj /* Note that the number of elements has already been written out in 145*38fd1498Szrj streamer_write_tree_header. */ 146*38fd1498Szrj for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++) 147*38fd1498Szrj bp_pack_var_len_int (bp, TREE_INT_CST_ELT (expr, i)); 148*38fd1498Szrj } 149*38fd1498Szrj 150*38fd1498Szrj 151*38fd1498Szrj /* Pack all the non-pointer fields of the TS_REAL_CST structure of 152*38fd1498Szrj expression EXPR into bitpack BP. */ 153*38fd1498Szrj 154*38fd1498Szrj static void 155*38fd1498Szrj pack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr) 156*38fd1498Szrj { 157*38fd1498Szrj unsigned i; 158*38fd1498Szrj REAL_VALUE_TYPE r; 159*38fd1498Szrj 160*38fd1498Szrj r = TREE_REAL_CST (expr); 161*38fd1498Szrj bp_pack_value (bp, r.cl, 2); 162*38fd1498Szrj bp_pack_value (bp, r.decimal, 1); 163*38fd1498Szrj bp_pack_value (bp, r.sign, 1); 164*38fd1498Szrj bp_pack_value (bp, r.signalling, 1); 165*38fd1498Szrj bp_pack_value (bp, r.canonical, 1); 166*38fd1498Szrj bp_pack_value (bp, r.uexp, EXP_BITS); 167*38fd1498Szrj for (i = 0; i < SIGSZ; i++) 168*38fd1498Szrj bp_pack_value (bp, r.sig[i], HOST_BITS_PER_LONG); 169*38fd1498Szrj } 170*38fd1498Szrj 171*38fd1498Szrj 172*38fd1498Szrj /* Pack all the non-pointer fields of the TS_FIXED_CST structure of 173*38fd1498Szrj expression EXPR into bitpack BP. */ 174*38fd1498Szrj 175*38fd1498Szrj static void 176*38fd1498Szrj pack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr) 177*38fd1498Szrj { 178*38fd1498Szrj struct fixed_value fv = TREE_FIXED_CST (expr); 179*38fd1498Szrj bp_pack_machine_mode (bp, fv.mode); 180*38fd1498Szrj bp_pack_var_len_int (bp, fv.data.low); 181*38fd1498Szrj bp_pack_var_len_int (bp, fv.data.high); 182*38fd1498Szrj } 183*38fd1498Szrj 184*38fd1498Szrj /* Pack all the non-pointer fields of the TS_DECL_COMMON structure 185*38fd1498Szrj of expression EXPR into bitpack BP. */ 186*38fd1498Szrj 187*38fd1498Szrj static void 188*38fd1498Szrj pack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr) 189*38fd1498Szrj { 190*38fd1498Szrj bp_pack_machine_mode (bp, DECL_MODE (expr)); 191*38fd1498Szrj bp_pack_value (bp, DECL_NONLOCAL (expr), 1); 192*38fd1498Szrj bp_pack_value (bp, DECL_VIRTUAL_P (expr), 1); 193*38fd1498Szrj bp_pack_value (bp, DECL_IGNORED_P (expr), 1); 194*38fd1498Szrj bp_pack_value (bp, DECL_ABSTRACT_P (expr), 1); 195*38fd1498Szrj bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1); 196*38fd1498Szrj bp_pack_value (bp, DECL_USER_ALIGN (expr), 1); 197*38fd1498Szrj bp_pack_value (bp, DECL_PRESERVE_P (expr), 1); 198*38fd1498Szrj bp_pack_value (bp, DECL_EXTERNAL (expr), 1); 199*38fd1498Szrj bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1); 200*38fd1498Szrj bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr)); 201*38fd1498Szrj 202*38fd1498Szrj if (TREE_CODE (expr) == LABEL_DECL) 203*38fd1498Szrj { 204*38fd1498Szrj /* Note that we do not write LABEL_DECL_UID. The reader will 205*38fd1498Szrj always assume an initial value of -1 so that the 206*38fd1498Szrj label_to_block_map is recreated by gimple_set_bb. */ 207*38fd1498Szrj bp_pack_var_len_unsigned (bp, EH_LANDING_PAD_NR (expr)); 208*38fd1498Szrj } 209*38fd1498Szrj 210*38fd1498Szrj if (TREE_CODE (expr) == FIELD_DECL) 211*38fd1498Szrj { 212*38fd1498Szrj bp_pack_value (bp, DECL_PACKED (expr), 1); 213*38fd1498Szrj bp_pack_value (bp, DECL_NONADDRESSABLE_P (expr), 1); 214*38fd1498Szrj bp_pack_value (bp, DECL_PADDING_P (expr), 1); 215*38fd1498Szrj bp_pack_value (bp, expr->decl_common.off_align, 8); 216*38fd1498Szrj } 217*38fd1498Szrj 218*38fd1498Szrj if (VAR_P (expr)) 219*38fd1498Szrj { 220*38fd1498Szrj bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1); 221*38fd1498Szrj bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1); 222*38fd1498Szrj } 223*38fd1498Szrj 224*38fd1498Szrj if (TREE_CODE (expr) == RESULT_DECL 225*38fd1498Szrj || TREE_CODE (expr) == PARM_DECL 226*38fd1498Szrj || VAR_P (expr)) 227*38fd1498Szrj { 228*38fd1498Szrj bp_pack_value (bp, DECL_BY_REFERENCE (expr), 1); 229*38fd1498Szrj if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL) 230*38fd1498Szrj bp_pack_value (bp, DECL_HAS_VALUE_EXPR_P (expr), 1); 231*38fd1498Szrj } 232*38fd1498Szrj } 233*38fd1498Szrj 234*38fd1498Szrj 235*38fd1498Szrj /* Pack all the non-pointer fields of the TS_DECL_WRTL structure 236*38fd1498Szrj of expression EXPR into bitpack BP. */ 237*38fd1498Szrj 238*38fd1498Szrj static void 239*38fd1498Szrj pack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr) 240*38fd1498Szrj { 241*38fd1498Szrj bp_pack_value (bp, DECL_REGISTER (expr), 1); 242*38fd1498Szrj } 243*38fd1498Szrj 244*38fd1498Szrj 245*38fd1498Szrj /* Pack all the non-pointer fields of the TS_DECL_WITH_VIS structure 246*38fd1498Szrj of expression EXPR into bitpack BP. */ 247*38fd1498Szrj 248*38fd1498Szrj static void 249*38fd1498Szrj pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr) 250*38fd1498Szrj { 251*38fd1498Szrj bp_pack_value (bp, DECL_COMMON (expr), 1); 252*38fd1498Szrj bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1); 253*38fd1498Szrj bp_pack_value (bp, DECL_WEAK (expr), 1); 254*38fd1498Szrj bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr), 1); 255*38fd1498Szrj bp_pack_value (bp, DECL_COMDAT (expr), 1); 256*38fd1498Szrj bp_pack_value (bp, DECL_VISIBILITY (expr), 2); 257*38fd1498Szrj bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr), 1); 258*38fd1498Szrj 259*38fd1498Szrj if (VAR_P (expr)) 260*38fd1498Szrj { 261*38fd1498Szrj bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1); 262*38fd1498Szrj /* DECL_IN_TEXT_SECTION is set during final asm output only. */ 263*38fd1498Szrj bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1); 264*38fd1498Szrj } 265*38fd1498Szrj 266*38fd1498Szrj if (TREE_CODE (expr) == FUNCTION_DECL) 267*38fd1498Szrj { 268*38fd1498Szrj bp_pack_value (bp, DECL_FINAL_P (expr), 1); 269*38fd1498Szrj bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1); 270*38fd1498Szrj bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1); 271*38fd1498Szrj } 272*38fd1498Szrj } 273*38fd1498Szrj 274*38fd1498Szrj 275*38fd1498Szrj /* Pack all the non-pointer fields of the TS_FUNCTION_DECL structure 276*38fd1498Szrj of expression EXPR into bitpack BP. */ 277*38fd1498Szrj 278*38fd1498Szrj static void 279*38fd1498Szrj pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr) 280*38fd1498Szrj { 281*38fd1498Szrj bp_pack_enum (bp, built_in_class, BUILT_IN_LAST, 282*38fd1498Szrj DECL_BUILT_IN_CLASS (expr)); 283*38fd1498Szrj bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1); 284*38fd1498Szrj bp_pack_value (bp, DECL_STATIC_DESTRUCTOR (expr), 1); 285*38fd1498Szrj bp_pack_value (bp, DECL_UNINLINABLE (expr), 1); 286*38fd1498Szrj bp_pack_value (bp, DECL_POSSIBLY_INLINED (expr), 1); 287*38fd1498Szrj bp_pack_value (bp, DECL_IS_NOVOPS (expr), 1); 288*38fd1498Szrj bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1); 289*38fd1498Szrj bp_pack_value (bp, DECL_IS_MALLOC (expr), 1); 290*38fd1498Szrj bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1); 291*38fd1498Szrj bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1); 292*38fd1498Szrj bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1); 293*38fd1498Szrj bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1); 294*38fd1498Szrj bp_pack_value (bp, DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr), 1); 295*38fd1498Szrj bp_pack_value (bp, DECL_NO_LIMIT_STACK (expr), 1); 296*38fd1498Szrj bp_pack_value (bp, DECL_DISREGARD_INLINE_LIMITS (expr), 1); 297*38fd1498Szrj bp_pack_value (bp, DECL_PURE_P (expr), 1); 298*38fd1498Szrj bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1); 299*38fd1498Szrj if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN) 300*38fd1498Szrj bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 12); 301*38fd1498Szrj } 302*38fd1498Szrj 303*38fd1498Szrj 304*38fd1498Szrj /* Pack all the non-pointer fields of the TS_TYPE_COMMON structure 305*38fd1498Szrj of expression EXPR into bitpack BP. */ 306*38fd1498Szrj 307*38fd1498Szrj static void 308*38fd1498Szrj pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr) 309*38fd1498Szrj { 310*38fd1498Szrj /* for VECTOR_TYPE, TYPE_MODE reevaluates the mode using target_flags 311*38fd1498Szrj not necessary valid in a global context. 312*38fd1498Szrj Use the raw value previously set by layout_type. */ 313*38fd1498Szrj bp_pack_machine_mode (bp, TYPE_MODE_RAW (expr)); 314*38fd1498Szrj bp_pack_value (bp, TYPE_STRING_FLAG (expr), 1); 315*38fd1498Szrj /* TYPE_NO_FORCE_BLK is private to stor-layout and need 316*38fd1498Szrj no streaming. */ 317*38fd1498Szrj bp_pack_value (bp, TYPE_NEEDS_CONSTRUCTING (expr), 1); 318*38fd1498Szrj bp_pack_value (bp, TYPE_PACKED (expr), 1); 319*38fd1498Szrj bp_pack_value (bp, TYPE_RESTRICT (expr), 1); 320*38fd1498Szrj bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1); 321*38fd1498Szrj bp_pack_value (bp, TYPE_READONLY (expr), 1); 322*38fd1498Szrj /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark 323*38fd1498Szrj types that are opaque for TBAA. This however did not work as intended, 324*38fd1498Szrj because TYPE_ALIAS_SET == 0 was regularly lost in type merging. */ 325*38fd1498Szrj if (RECORD_OR_UNION_TYPE_P (expr)) 326*38fd1498Szrj { 327*38fd1498Szrj bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1); 328*38fd1498Szrj bp_pack_value (bp, TYPE_FINAL_P (expr), 1); 329*38fd1498Szrj } 330*38fd1498Szrj else if (TREE_CODE (expr) == ARRAY_TYPE) 331*38fd1498Szrj bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1); 332*38fd1498Szrj if (AGGREGATE_TYPE_P (expr)) 333*38fd1498Szrj bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1); 334*38fd1498Szrj bp_pack_value (bp, TYPE_EMPTY_P (expr), 1); 335*38fd1498Szrj bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr)); 336*38fd1498Szrj bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr)); 337*38fd1498Szrj } 338*38fd1498Szrj 339*38fd1498Szrj 340*38fd1498Szrj /* Pack all the non-pointer fields of the TS_BLOCK structure 341*38fd1498Szrj of expression EXPR into bitpack BP. */ 342*38fd1498Szrj 343*38fd1498Szrj static void 344*38fd1498Szrj pack_ts_block_value_fields (struct output_block *ob, 345*38fd1498Szrj struct bitpack_d *bp, tree expr) 346*38fd1498Szrj { 347*38fd1498Szrj bp_pack_value (bp, BLOCK_ABSTRACT (expr), 1); 348*38fd1498Szrj /* BLOCK_NUMBER is recomputed. */ 349*38fd1498Szrj /* Stream BLOCK_SOURCE_LOCATION for the limited cases we can handle - those 350*38fd1498Szrj that represent inlined function scopes. 351*38fd1498Szrj For the rest them on the floor instead of ICEing in dwarf2out.c. */ 352*38fd1498Szrj if (inlined_function_outer_scope_p (expr)) 353*38fd1498Szrj stream_output_location (ob, bp, BLOCK_SOURCE_LOCATION (expr)); 354*38fd1498Szrj else 355*38fd1498Szrj stream_output_location (ob, bp, UNKNOWN_LOCATION); 356*38fd1498Szrj } 357*38fd1498Szrj 358*38fd1498Szrj /* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure 359*38fd1498Szrj of expression EXPR into bitpack BP. */ 360*38fd1498Szrj 361*38fd1498Szrj static void 362*38fd1498Szrj pack_ts_translation_unit_decl_value_fields (struct output_block *ob, 363*38fd1498Szrj struct bitpack_d *bp, tree expr) 364*38fd1498Szrj { 365*38fd1498Szrj bp_pack_string (ob, bp, TRANSLATION_UNIT_LANGUAGE (expr), true); 366*38fd1498Szrj } 367*38fd1498Szrj 368*38fd1498Szrj 369*38fd1498Szrj /* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure 370*38fd1498Szrj of expression EXPR into bitpack BP. */ 371*38fd1498Szrj 372*38fd1498Szrj static void 373*38fd1498Szrj pack_ts_omp_clause_value_fields (struct output_block *ob, 374*38fd1498Szrj struct bitpack_d *bp, tree expr) 375*38fd1498Szrj { 376*38fd1498Szrj stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr)); 377*38fd1498Szrj switch (OMP_CLAUSE_CODE (expr)) 378*38fd1498Szrj { 379*38fd1498Szrj case OMP_CLAUSE_DEFAULT: 380*38fd1498Szrj bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST, 381*38fd1498Szrj OMP_CLAUSE_DEFAULT_KIND (expr)); 382*38fd1498Szrj break; 383*38fd1498Szrj case OMP_CLAUSE_SCHEDULE: 384*38fd1498Szrj bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST, 385*38fd1498Szrj OMP_CLAUSE_SCHEDULE_KIND (expr)); 386*38fd1498Szrj break; 387*38fd1498Szrj case OMP_CLAUSE_DEPEND: 388*38fd1498Szrj bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST, 389*38fd1498Szrj OMP_CLAUSE_DEPEND_KIND (expr)); 390*38fd1498Szrj break; 391*38fd1498Szrj case OMP_CLAUSE_MAP: 392*38fd1498Szrj bp_pack_enum (bp, gomp_map_kind, GOMP_MAP_LAST, 393*38fd1498Szrj OMP_CLAUSE_MAP_KIND (expr)); 394*38fd1498Szrj break; 395*38fd1498Szrj case OMP_CLAUSE_PROC_BIND: 396*38fd1498Szrj bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST, 397*38fd1498Szrj OMP_CLAUSE_PROC_BIND_KIND (expr)); 398*38fd1498Szrj break; 399*38fd1498Szrj case OMP_CLAUSE_REDUCTION: 400*38fd1498Szrj bp_pack_enum (bp, tree_code, MAX_TREE_CODES, 401*38fd1498Szrj OMP_CLAUSE_REDUCTION_CODE (expr)); 402*38fd1498Szrj break; 403*38fd1498Szrj default: 404*38fd1498Szrj break; 405*38fd1498Szrj } 406*38fd1498Szrj } 407*38fd1498Szrj 408*38fd1498Szrj 409*38fd1498Szrj /* Pack all the bitfields in EXPR into a bit pack. */ 410*38fd1498Szrj 411*38fd1498Szrj void 412*38fd1498Szrj streamer_write_tree_bitfields (struct output_block *ob, tree expr) 413*38fd1498Szrj { 414*38fd1498Szrj bitpack_d bp = bitpack_create (ob->main_stream); 415*38fd1498Szrj enum tree_code code; 416*38fd1498Szrj 417*38fd1498Szrj code = TREE_CODE (expr); 418*38fd1498Szrj 419*38fd1498Szrj /* Note that all these functions are highly sensitive to changes in 420*38fd1498Szrj the types and sizes of each of the fields being packed. */ 421*38fd1498Szrj pack_ts_base_value_fields (&bp, expr); 422*38fd1498Szrj 423*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_INT_CST)) 424*38fd1498Szrj pack_ts_int_cst_value_fields (&bp, expr); 425*38fd1498Szrj 426*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST)) 427*38fd1498Szrj pack_ts_real_cst_value_fields (&bp, expr); 428*38fd1498Szrj 429*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST)) 430*38fd1498Szrj pack_ts_fixed_cst_value_fields (&bp, expr); 431*38fd1498Szrj 432*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL)) 433*38fd1498Szrj stream_output_location (ob, &bp, DECL_SOURCE_LOCATION (expr)); 434*38fd1498Szrj 435*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 436*38fd1498Szrj pack_ts_decl_common_value_fields (&bp, expr); 437*38fd1498Szrj 438*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)) 439*38fd1498Szrj pack_ts_decl_wrtl_value_fields (&bp, expr); 440*38fd1498Szrj 441*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) 442*38fd1498Szrj pack_ts_decl_with_vis_value_fields (&bp, expr); 443*38fd1498Szrj 444*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL)) 445*38fd1498Szrj pack_ts_function_decl_value_fields (&bp, expr); 446*38fd1498Szrj 447*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON)) 448*38fd1498Szrj pack_ts_type_common_value_fields (&bp, expr); 449*38fd1498Szrj 450*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_EXP)) 451*38fd1498Szrj { 452*38fd1498Szrj stream_output_location (ob, &bp, EXPR_LOCATION (expr)); 453*38fd1498Szrj if (code == MEM_REF 454*38fd1498Szrj || code == TARGET_MEM_REF) 455*38fd1498Szrj { 456*38fd1498Szrj bp_pack_value (&bp, MR_DEPENDENCE_CLIQUE (expr), sizeof (short) * 8); 457*38fd1498Szrj if (MR_DEPENDENCE_CLIQUE (expr) != 0) 458*38fd1498Szrj bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8); 459*38fd1498Szrj } 460*38fd1498Szrj } 461*38fd1498Szrj 462*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_BLOCK)) 463*38fd1498Szrj pack_ts_block_value_fields (ob, &bp, expr); 464*38fd1498Szrj 465*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL)) 466*38fd1498Szrj pack_ts_translation_unit_decl_value_fields (ob, &bp, expr); 467*38fd1498Szrj 468*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION)) 469*38fd1498Szrj cl_optimization_stream_out (&bp, TREE_OPTIMIZATION (expr)); 470*38fd1498Szrj 471*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_BINFO)) 472*38fd1498Szrj bp_pack_var_len_unsigned (&bp, vec_safe_length (BINFO_BASE_ACCESSES (expr))); 473*38fd1498Szrj 474*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) 475*38fd1498Szrj bp_pack_var_len_unsigned (&bp, CONSTRUCTOR_NELTS (expr)); 476*38fd1498Szrj 477*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION) 478*38fd1498Szrj /* Don't stream these when passing things to a different target. */ 479*38fd1498Szrj && !lto_stream_offload_p) 480*38fd1498Szrj cl_target_option_stream_out (ob, &bp, TREE_TARGET_OPTION (expr)); 481*38fd1498Szrj 482*38fd1498Szrj if (code == OMP_CLAUSE) 483*38fd1498Szrj pack_ts_omp_clause_value_fields (ob, &bp, expr); 484*38fd1498Szrj 485*38fd1498Szrj streamer_write_bitpack (&bp); 486*38fd1498Szrj } 487*38fd1498Szrj 488*38fd1498Szrj 489*38fd1498Szrj /* Emit the chain of tree nodes starting at T. OB is the output block 490*38fd1498Szrj to write to. REF_P is true if chain elements should be emitted 491*38fd1498Szrj as references. */ 492*38fd1498Szrj 493*38fd1498Szrj void 494*38fd1498Szrj streamer_write_chain (struct output_block *ob, tree t, bool ref_p) 495*38fd1498Szrj { 496*38fd1498Szrj while (t) 497*38fd1498Szrj { 498*38fd1498Szrj /* We avoid outputting external vars or functions by reference 499*38fd1498Szrj to the global decls section as we do not want to have them 500*38fd1498Szrj enter decl merging. This is, of course, only for the call 501*38fd1498Szrj for streaming BLOCK_VARS, but other callers are safe. 502*38fd1498Szrj See also lto-streamer-out.c:DFS_write_tree_body. */ 503*38fd1498Szrj if (VAR_OR_FUNCTION_DECL_P (t) 504*38fd1498Szrj && DECL_EXTERNAL (t)) 505*38fd1498Szrj stream_write_tree_shallow_non_ref (ob, t, ref_p); 506*38fd1498Szrj else 507*38fd1498Szrj stream_write_tree (ob, t, ref_p); 508*38fd1498Szrj 509*38fd1498Szrj t = TREE_CHAIN (t); 510*38fd1498Szrj } 511*38fd1498Szrj 512*38fd1498Szrj /* Write a sentinel to terminate the chain. */ 513*38fd1498Szrj stream_write_tree (ob, NULL_TREE, ref_p); 514*38fd1498Szrj } 515*38fd1498Szrj 516*38fd1498Szrj 517*38fd1498Szrj /* Write all pointer fields in the TS_COMMON structure of EXPR to output 518*38fd1498Szrj block OB. If REF_P is true, write a reference to EXPR's pointer 519*38fd1498Szrj fields. */ 520*38fd1498Szrj 521*38fd1498Szrj static void 522*38fd1498Szrj write_ts_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p) 523*38fd1498Szrj { 524*38fd1498Szrj if (TREE_CODE (expr) != IDENTIFIER_NODE) 525*38fd1498Szrj stream_write_tree (ob, TREE_TYPE (expr), ref_p); 526*38fd1498Szrj } 527*38fd1498Szrj 528*38fd1498Szrj 529*38fd1498Szrj /* Write all pointer fields in the TS_VECTOR structure of EXPR to output 530*38fd1498Szrj block OB. If REF_P is true, write a reference to EXPR's pointer 531*38fd1498Szrj fields. */ 532*38fd1498Szrj 533*38fd1498Szrj static void 534*38fd1498Szrj write_ts_vector_tree_pointers (struct output_block *ob, tree expr, bool ref_p) 535*38fd1498Szrj { 536*38fd1498Szrj /* Note that the number of elements for EXPR has already been emitted 537*38fd1498Szrj in EXPR's header (see streamer_write_tree_header). */ 538*38fd1498Szrj unsigned int count = vector_cst_encoded_nelts (expr); 539*38fd1498Szrj for (unsigned int i = 0; i < count; ++i) 540*38fd1498Szrj stream_write_tree (ob, VECTOR_CST_ENCODED_ELT (expr, i), ref_p); 541*38fd1498Szrj } 542*38fd1498Szrj 543*38fd1498Szrj 544*38fd1498Szrj /* Write all pointer fields in the TS_POLY_INT_CST structure of EXPR to 545*38fd1498Szrj output block OB. If REF_P is true, write a reference to EXPR's pointer 546*38fd1498Szrj fields. */ 547*38fd1498Szrj 548*38fd1498Szrj static void 549*38fd1498Szrj write_ts_poly_tree_pointers (struct output_block *ob, tree expr, bool ref_p) 550*38fd1498Szrj { 551*38fd1498Szrj for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i) 552*38fd1498Szrj stream_write_tree (ob, POLY_INT_CST_COEFF (expr, i), ref_p); 553*38fd1498Szrj } 554*38fd1498Szrj 555*38fd1498Szrj 556*38fd1498Szrj /* Write all pointer fields in the TS_COMPLEX structure of EXPR to output 557*38fd1498Szrj block OB. If REF_P is true, write a reference to EXPR's pointer 558*38fd1498Szrj fields. */ 559*38fd1498Szrj 560*38fd1498Szrj static void 561*38fd1498Szrj write_ts_complex_tree_pointers (struct output_block *ob, tree expr, bool ref_p) 562*38fd1498Szrj { 563*38fd1498Szrj stream_write_tree (ob, TREE_REALPART (expr), ref_p); 564*38fd1498Szrj stream_write_tree (ob, TREE_IMAGPART (expr), ref_p); 565*38fd1498Szrj } 566*38fd1498Szrj 567*38fd1498Szrj 568*38fd1498Szrj /* Write all pointer fields in the TS_DECL_MINIMAL structure of EXPR 569*38fd1498Szrj to output block OB. If REF_P is true, write a reference to EXPR's 570*38fd1498Szrj pointer fields. */ 571*38fd1498Szrj 572*38fd1498Szrj static void 573*38fd1498Szrj write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr, 574*38fd1498Szrj bool ref_p) 575*38fd1498Szrj { 576*38fd1498Szrj /* Drop names that were created for anonymous entities. */ 577*38fd1498Szrj if (DECL_NAME (expr) 578*38fd1498Szrj && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE 579*38fd1498Szrj && anon_aggrname_p (DECL_NAME (expr))) 580*38fd1498Szrj stream_write_tree (ob, NULL_TREE, ref_p); 581*38fd1498Szrj else 582*38fd1498Szrj stream_write_tree (ob, DECL_NAME (expr), ref_p); 583*38fd1498Szrj if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL 584*38fd1498Szrj && ! DECL_CONTEXT (expr)) 585*38fd1498Szrj stream_write_tree (ob, (*all_translation_units)[0], ref_p); 586*38fd1498Szrj else 587*38fd1498Szrj stream_write_tree (ob, DECL_CONTEXT (expr), ref_p); 588*38fd1498Szrj } 589*38fd1498Szrj 590*38fd1498Szrj 591*38fd1498Szrj /* Write all pointer fields in the TS_DECL_COMMON structure of EXPR to 592*38fd1498Szrj output block OB. If REF_P is true, write a reference to EXPR's 593*38fd1498Szrj pointer fields. */ 594*38fd1498Szrj 595*38fd1498Szrj static void 596*38fd1498Szrj write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr, 597*38fd1498Szrj bool ref_p) 598*38fd1498Szrj { 599*38fd1498Szrj stream_write_tree (ob, DECL_SIZE (expr), ref_p); 600*38fd1498Szrj stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p); 601*38fd1498Szrj 602*38fd1498Szrj /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs 603*38fd1498Szrj special handling in LTO, it must be handled by streamer hooks. */ 604*38fd1498Szrj 605*38fd1498Szrj stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p); 606*38fd1498Szrj stream_write_tree (ob, DECL_ABSTRACT_ORIGIN (expr), ref_p); 607*38fd1498Szrj 608*38fd1498Szrj if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL) 609*38fd1498Szrj && DECL_HAS_VALUE_EXPR_P (expr)) 610*38fd1498Szrj stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p); 611*38fd1498Szrj 612*38fd1498Szrj if (VAR_P (expr) 613*38fd1498Szrj && DECL_HAS_DEBUG_EXPR_P (expr)) 614*38fd1498Szrj stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p); 615*38fd1498Szrj } 616*38fd1498Szrj 617*38fd1498Szrj 618*38fd1498Szrj /* Write all pointer fields in the TS_DECL_NON_COMMON structure of 619*38fd1498Szrj EXPR to output block OB. If REF_P is true, write a reference to EXPR's 620*38fd1498Szrj pointer fields. */ 621*38fd1498Szrj 622*38fd1498Szrj static void 623*38fd1498Szrj write_ts_decl_non_common_tree_pointers (struct output_block *ob, tree expr, 624*38fd1498Szrj bool ref_p) 625*38fd1498Szrj { 626*38fd1498Szrj if (TREE_CODE (expr) == TYPE_DECL) 627*38fd1498Szrj stream_write_tree (ob, DECL_ORIGINAL_TYPE (expr), ref_p); 628*38fd1498Szrj } 629*38fd1498Szrj 630*38fd1498Szrj 631*38fd1498Szrj /* Write all pointer fields in the TS_DECL_WITH_VIS structure of EXPR 632*38fd1498Szrj to output block OB. If REF_P is true, write a reference to EXPR's 633*38fd1498Szrj pointer fields. */ 634*38fd1498Szrj 635*38fd1498Szrj static void 636*38fd1498Szrj write_ts_decl_with_vis_tree_pointers (struct output_block *ob, tree expr, 637*38fd1498Szrj bool ref_p) 638*38fd1498Szrj { 639*38fd1498Szrj /* Make sure we don't inadvertently set the assembler name. */ 640*38fd1498Szrj if (DECL_ASSEMBLER_NAME_SET_P (expr)) 641*38fd1498Szrj stream_write_tree (ob, DECL_ASSEMBLER_NAME (expr), ref_p); 642*38fd1498Szrj else 643*38fd1498Szrj stream_write_tree (ob, NULL_TREE, false); 644*38fd1498Szrj } 645*38fd1498Szrj 646*38fd1498Szrj 647*38fd1498Szrj /* Write all pointer fields in the TS_FIELD_DECL structure of EXPR to 648*38fd1498Szrj output block OB. If REF_P is true, write a reference to EXPR's 649*38fd1498Szrj pointer fields. */ 650*38fd1498Szrj 651*38fd1498Szrj static void 652*38fd1498Szrj write_ts_field_decl_tree_pointers (struct output_block *ob, tree expr, 653*38fd1498Szrj bool ref_p) 654*38fd1498Szrj { 655*38fd1498Szrj stream_write_tree (ob, DECL_FIELD_OFFSET (expr), ref_p); 656*38fd1498Szrj stream_write_tree (ob, DECL_BIT_FIELD_TYPE (expr), ref_p); 657*38fd1498Szrj stream_write_tree (ob, DECL_BIT_FIELD_REPRESENTATIVE (expr), ref_p); 658*38fd1498Szrj stream_write_tree (ob, DECL_FIELD_BIT_OFFSET (expr), ref_p); 659*38fd1498Szrj stream_write_tree (ob, DECL_FCONTEXT (expr), ref_p); 660*38fd1498Szrj } 661*38fd1498Szrj 662*38fd1498Szrj 663*38fd1498Szrj /* Write all pointer fields in the TS_FUNCTION_DECL structure of EXPR 664*38fd1498Szrj to output block OB. If REF_P is true, write a reference to EXPR's 665*38fd1498Szrj pointer fields. */ 666*38fd1498Szrj 667*38fd1498Szrj static void 668*38fd1498Szrj write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr, 669*38fd1498Szrj bool ref_p) 670*38fd1498Szrj { 671*38fd1498Szrj stream_write_tree (ob, DECL_VINDEX (expr), ref_p); 672*38fd1498Szrj /* DECL_STRUCT_FUNCTION is handled by lto_output_function. */ 673*38fd1498Szrj stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p); 674*38fd1498Szrj /* Don't stream these when passing things to a different target. */ 675*38fd1498Szrj if (!lto_stream_offload_p) 676*38fd1498Szrj stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p); 677*38fd1498Szrj stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p); 678*38fd1498Szrj } 679*38fd1498Szrj 680*38fd1498Szrj 681*38fd1498Szrj /* Write all pointer fields in the TS_TYPE_COMMON structure of EXPR to 682*38fd1498Szrj output block OB. If REF_P is true, write a reference to EXPR's 683*38fd1498Szrj pointer fields. */ 684*38fd1498Szrj 685*38fd1498Szrj static void 686*38fd1498Szrj write_ts_type_common_tree_pointers (struct output_block *ob, tree expr, 687*38fd1498Szrj bool ref_p) 688*38fd1498Szrj { 689*38fd1498Szrj stream_write_tree (ob, TYPE_SIZE (expr), ref_p); 690*38fd1498Szrj stream_write_tree (ob, TYPE_SIZE_UNIT (expr), ref_p); 691*38fd1498Szrj stream_write_tree (ob, TYPE_ATTRIBUTES (expr), ref_p); 692*38fd1498Szrj stream_write_tree (ob, TYPE_NAME (expr), ref_p); 693*38fd1498Szrj /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be 694*38fd1498Szrj reconstructed during fixup. */ 695*38fd1498Szrj /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists 696*38fd1498Szrj during fixup. */ 697*38fd1498Szrj stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p); 698*38fd1498Szrj stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p); 699*38fd1498Szrj /* TYPE_CANONICAL is re-computed during type merging, so no need 700*38fd1498Szrj to stream it here. */ 701*38fd1498Szrj stream_write_tree (ob, TYPE_STUB_DECL (expr), ref_p); 702*38fd1498Szrj } 703*38fd1498Szrj 704*38fd1498Szrj /* Write all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR 705*38fd1498Szrj to output block OB. If REF_P is true, write a reference to EXPR's 706*38fd1498Szrj pointer fields. */ 707*38fd1498Szrj 708*38fd1498Szrj static void 709*38fd1498Szrj write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr, 710*38fd1498Szrj bool ref_p) 711*38fd1498Szrj { 712*38fd1498Szrj if (TREE_CODE (expr) == ENUMERAL_TYPE) 713*38fd1498Szrj stream_write_tree (ob, TYPE_VALUES (expr), ref_p); 714*38fd1498Szrj else if (TREE_CODE (expr) == ARRAY_TYPE) 715*38fd1498Szrj stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p); 716*38fd1498Szrj else if (RECORD_OR_UNION_TYPE_P (expr)) 717*38fd1498Szrj streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p); 718*38fd1498Szrj else if (TREE_CODE (expr) == FUNCTION_TYPE 719*38fd1498Szrj || TREE_CODE (expr) == METHOD_TYPE) 720*38fd1498Szrj stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p); 721*38fd1498Szrj 722*38fd1498Szrj if (!POINTER_TYPE_P (expr)) 723*38fd1498Szrj stream_write_tree (ob, TYPE_MIN_VALUE_RAW (expr), ref_p); 724*38fd1498Szrj stream_write_tree (ob, TYPE_MAX_VALUE_RAW (expr), ref_p); 725*38fd1498Szrj } 726*38fd1498Szrj 727*38fd1498Szrj 728*38fd1498Szrj /* Write all pointer fields in the TS_LIST structure of EXPR to output 729*38fd1498Szrj block OB. If REF_P is true, write a reference to EXPR's pointer 730*38fd1498Szrj fields. */ 731*38fd1498Szrj 732*38fd1498Szrj static void 733*38fd1498Szrj write_ts_list_tree_pointers (struct output_block *ob, tree expr, bool ref_p) 734*38fd1498Szrj { 735*38fd1498Szrj stream_write_tree (ob, TREE_PURPOSE (expr), ref_p); 736*38fd1498Szrj stream_write_tree (ob, TREE_VALUE (expr), ref_p); 737*38fd1498Szrj stream_write_tree (ob, TREE_CHAIN (expr), ref_p); 738*38fd1498Szrj } 739*38fd1498Szrj 740*38fd1498Szrj 741*38fd1498Szrj /* Write all pointer fields in the TS_VEC structure of EXPR to output 742*38fd1498Szrj block OB. If REF_P is true, write a reference to EXPR's pointer 743*38fd1498Szrj fields. */ 744*38fd1498Szrj 745*38fd1498Szrj static void 746*38fd1498Szrj write_ts_vec_tree_pointers (struct output_block *ob, tree expr, bool ref_p) 747*38fd1498Szrj { 748*38fd1498Szrj int i; 749*38fd1498Szrj 750*38fd1498Szrj /* Note that the number of slots for EXPR has already been emitted 751*38fd1498Szrj in EXPR's header (see streamer_write_tree_header). */ 752*38fd1498Szrj for (i = 0; i < TREE_VEC_LENGTH (expr); i++) 753*38fd1498Szrj stream_write_tree (ob, TREE_VEC_ELT (expr, i), ref_p); 754*38fd1498Szrj } 755*38fd1498Szrj 756*38fd1498Szrj 757*38fd1498Szrj /* Write all pointer fields in the TS_EXP structure of EXPR to output 758*38fd1498Szrj block OB. If REF_P is true, write a reference to EXPR's pointer 759*38fd1498Szrj fields. */ 760*38fd1498Szrj 761*38fd1498Szrj static void 762*38fd1498Szrj write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p) 763*38fd1498Szrj { 764*38fd1498Szrj int i; 765*38fd1498Szrj 766*38fd1498Szrj for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++) 767*38fd1498Szrj stream_write_tree (ob, TREE_OPERAND (expr, i), ref_p); 768*38fd1498Szrj stream_write_tree (ob, TREE_BLOCK (expr), ref_p); 769*38fd1498Szrj } 770*38fd1498Szrj 771*38fd1498Szrj 772*38fd1498Szrj /* Write all pointer fields in the TS_BLOCK structure of EXPR to output 773*38fd1498Szrj block OB. If REF_P is true, write a reference to EXPR's pointer 774*38fd1498Szrj fields. */ 775*38fd1498Szrj 776*38fd1498Szrj static void 777*38fd1498Szrj write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p) 778*38fd1498Szrj { 779*38fd1498Szrj streamer_write_chain (ob, BLOCK_VARS (expr), ref_p); 780*38fd1498Szrj 781*38fd1498Szrj stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p); 782*38fd1498Szrj 783*38fd1498Szrj /* Stream BLOCK_ABSTRACT_ORIGIN for the limited cases we can handle - those 784*38fd1498Szrj that represent inlined function scopes. 785*38fd1498Szrj For the rest them on the floor instead of ICEing in dwarf2out.c, but 786*38fd1498Szrj keep the notion of whether the block is an inlined block by refering 787*38fd1498Szrj to itself for the sake of tree_nonartificial_location. */ 788*38fd1498Szrj if (inlined_function_outer_scope_p (expr)) 789*38fd1498Szrj { 790*38fd1498Szrj tree ultimate_origin = block_ultimate_origin (expr); 791*38fd1498Szrj stream_write_tree (ob, ultimate_origin, ref_p); 792*38fd1498Szrj } 793*38fd1498Szrj else 794*38fd1498Szrj stream_write_tree (ob, (BLOCK_ABSTRACT_ORIGIN (expr) 795*38fd1498Szrj ? expr : NULL_TREE), ref_p); 796*38fd1498Szrj /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information 797*38fd1498Szrj for early inlined BLOCKs so drop it on the floor instead of ICEing in 798*38fd1498Szrj dwarf2out.c. */ 799*38fd1498Szrj 800*38fd1498Szrj /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO 801*38fd1498Szrj streaming time. */ 802*38fd1498Szrj 803*38fd1498Szrj /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this 804*38fd1498Szrj list is re-constructed from BLOCK_SUPERCONTEXT. */ 805*38fd1498Szrj } 806*38fd1498Szrj 807*38fd1498Szrj 808*38fd1498Szrj /* Write all pointer fields in the TS_BINFO structure of EXPR to output 809*38fd1498Szrj block OB. If REF_P is true, write a reference to EXPR's pointer 810*38fd1498Szrj fields. */ 811*38fd1498Szrj 812*38fd1498Szrj static void 813*38fd1498Szrj write_ts_binfo_tree_pointers (struct output_block *ob, tree expr, bool ref_p) 814*38fd1498Szrj { 815*38fd1498Szrj unsigned i; 816*38fd1498Szrj tree t; 817*38fd1498Szrj 818*38fd1498Szrj /* Note that the number of BINFO slots has already been emitted in 819*38fd1498Szrj EXPR's header (see streamer_write_tree_header) because this length 820*38fd1498Szrj is needed to build the empty BINFO node on the reader side. */ 821*38fd1498Szrj FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t) 822*38fd1498Szrj stream_write_tree (ob, t, ref_p); 823*38fd1498Szrj stream_write_tree (ob, NULL_TREE, false); 824*38fd1498Szrj 825*38fd1498Szrj stream_write_tree (ob, BINFO_OFFSET (expr), ref_p); 826*38fd1498Szrj stream_write_tree (ob, BINFO_VTABLE (expr), ref_p); 827*38fd1498Szrj stream_write_tree (ob, BINFO_VPTR_FIELD (expr), ref_p); 828*38fd1498Szrj 829*38fd1498Szrj /* The number of BINFO_BASE_ACCESSES has already been emitted in 830*38fd1498Szrj EXPR's bitfield section. */ 831*38fd1498Szrj FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (expr), i, t) 832*38fd1498Szrj stream_write_tree (ob, t, ref_p); 833*38fd1498Szrj 834*38fd1498Szrj /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX 835*38fd1498Szrj and BINFO_VPTR_INDEX; these are used by C++ FE only. */ 836*38fd1498Szrj } 837*38fd1498Szrj 838*38fd1498Szrj 839*38fd1498Szrj /* Write all pointer fields in the TS_CONSTRUCTOR structure of EXPR to 840*38fd1498Szrj output block OB. If REF_P is true, write a reference to EXPR's 841*38fd1498Szrj pointer fields. */ 842*38fd1498Szrj 843*38fd1498Szrj static void 844*38fd1498Szrj write_ts_constructor_tree_pointers (struct output_block *ob, tree expr, 845*38fd1498Szrj bool ref_p) 846*38fd1498Szrj { 847*38fd1498Szrj unsigned i; 848*38fd1498Szrj tree index, value; 849*38fd1498Szrj 850*38fd1498Szrj FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value) 851*38fd1498Szrj { 852*38fd1498Szrj stream_write_tree (ob, index, ref_p); 853*38fd1498Szrj stream_write_tree (ob, value, ref_p); 854*38fd1498Szrj } 855*38fd1498Szrj } 856*38fd1498Szrj 857*38fd1498Szrj 858*38fd1498Szrj /* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR 859*38fd1498Szrj to output block OB. If REF_P is true, write a reference to EXPR's 860*38fd1498Szrj pointer fields. */ 861*38fd1498Szrj 862*38fd1498Szrj static void 863*38fd1498Szrj write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr, 864*38fd1498Szrj bool ref_p) 865*38fd1498Szrj { 866*38fd1498Szrj int i; 867*38fd1498Szrj for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++) 868*38fd1498Szrj stream_write_tree (ob, OMP_CLAUSE_OPERAND (expr, i), ref_p); 869*38fd1498Szrj if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_REDUCTION) 870*38fd1498Szrj { 871*38fd1498Szrj /* We don't stream these right now, handle it if streaming 872*38fd1498Szrj of them is needed. */ 873*38fd1498Szrj gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL); 874*38fd1498Szrj gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL); 875*38fd1498Szrj } 876*38fd1498Szrj stream_write_tree (ob, OMP_CLAUSE_CHAIN (expr), ref_p); 877*38fd1498Szrj } 878*38fd1498Szrj 879*38fd1498Szrj 880*38fd1498Szrj /* Write all pointer fields in EXPR to output block OB. If REF_P is true, 881*38fd1498Szrj the leaves of EXPR are emitted as references. */ 882*38fd1498Szrj 883*38fd1498Szrj void 884*38fd1498Szrj streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p) 885*38fd1498Szrj { 886*38fd1498Szrj enum tree_code code; 887*38fd1498Szrj 888*38fd1498Szrj lto_stats.num_tree_bodies_output++; 889*38fd1498Szrj 890*38fd1498Szrj code = TREE_CODE (expr); 891*38fd1498Szrj 892*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TYPED)) 893*38fd1498Szrj write_ts_common_tree_pointers (ob, expr, ref_p); 894*38fd1498Szrj 895*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_VECTOR)) 896*38fd1498Szrj write_ts_vector_tree_pointers (ob, expr, ref_p); 897*38fd1498Szrj 898*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST)) 899*38fd1498Szrj write_ts_poly_tree_pointers (ob, expr, ref_p); 900*38fd1498Szrj 901*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX)) 902*38fd1498Szrj write_ts_complex_tree_pointers (ob, expr, ref_p); 903*38fd1498Szrj 904*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL)) 905*38fd1498Szrj write_ts_decl_minimal_tree_pointers (ob, expr, ref_p); 906*38fd1498Szrj 907*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 908*38fd1498Szrj write_ts_decl_common_tree_pointers (ob, expr, ref_p); 909*38fd1498Szrj 910*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON)) 911*38fd1498Szrj write_ts_decl_non_common_tree_pointers (ob, expr, ref_p); 912*38fd1498Szrj 913*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) 914*38fd1498Szrj write_ts_decl_with_vis_tree_pointers (ob, expr, ref_p); 915*38fd1498Szrj 916*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL)) 917*38fd1498Szrj write_ts_field_decl_tree_pointers (ob, expr, ref_p); 918*38fd1498Szrj 919*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL)) 920*38fd1498Szrj write_ts_function_decl_tree_pointers (ob, expr, ref_p); 921*38fd1498Szrj 922*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON)) 923*38fd1498Szrj write_ts_type_common_tree_pointers (ob, expr, ref_p); 924*38fd1498Szrj 925*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON)) 926*38fd1498Szrj write_ts_type_non_common_tree_pointers (ob, expr, ref_p); 927*38fd1498Szrj 928*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_LIST)) 929*38fd1498Szrj write_ts_list_tree_pointers (ob, expr, ref_p); 930*38fd1498Szrj 931*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_VEC)) 932*38fd1498Szrj write_ts_vec_tree_pointers (ob, expr, ref_p); 933*38fd1498Szrj 934*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_EXP)) 935*38fd1498Szrj write_ts_exp_tree_pointers (ob, expr, ref_p); 936*38fd1498Szrj 937*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_BLOCK)) 938*38fd1498Szrj write_ts_block_tree_pointers (ob, expr, ref_p); 939*38fd1498Szrj 940*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_BINFO)) 941*38fd1498Szrj write_ts_binfo_tree_pointers (ob, expr, ref_p); 942*38fd1498Szrj 943*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) 944*38fd1498Szrj write_ts_constructor_tree_pointers (ob, expr, ref_p); 945*38fd1498Szrj 946*38fd1498Szrj if (code == OMP_CLAUSE) 947*38fd1498Szrj write_ts_omp_clause_tree_pointers (ob, expr, ref_p); 948*38fd1498Szrj } 949*38fd1498Szrj 950*38fd1498Szrj 951*38fd1498Szrj /* Emit header information for tree EXPR to output block OB. The header 952*38fd1498Szrj contains everything needed to instantiate an empty skeleton for 953*38fd1498Szrj EXPR on the reading side. IX is the index into the streamer cache 954*38fd1498Szrj where EXPR is stored. */ 955*38fd1498Szrj 956*38fd1498Szrj void 957*38fd1498Szrj streamer_write_tree_header (struct output_block *ob, tree expr) 958*38fd1498Szrj { 959*38fd1498Szrj enum LTO_tags tag; 960*38fd1498Szrj enum tree_code code; 961*38fd1498Szrj 962*38fd1498Szrj /* We should not see any tree nodes not handled by the streamer. */ 963*38fd1498Szrj code = TREE_CODE (expr); 964*38fd1498Szrj 965*38fd1498Szrj /* The header of a tree node consists of its tag, the size of 966*38fd1498Szrj the node, and any other information needed to instantiate 967*38fd1498Szrj EXPR on the reading side (such as the number of slots in 968*38fd1498Szrj variable sized nodes). */ 969*38fd1498Szrj tag = lto_tree_code_to_tag (code); 970*38fd1498Szrj streamer_write_record_start (ob, tag); 971*38fd1498Szrj 972*38fd1498Szrj /* The text in strings and identifiers are completely emitted in 973*38fd1498Szrj the header. */ 974*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_STRING)) 975*38fd1498Szrj streamer_write_string_cst (ob, ob->main_stream, expr); 976*38fd1498Szrj else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER)) 977*38fd1498Szrj write_identifier (ob, ob->main_stream, expr); 978*38fd1498Szrj else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR)) 979*38fd1498Szrj { 980*38fd1498Szrj bitpack_d bp = bitpack_create (ob->main_stream); 981*38fd1498Szrj bp_pack_value (&bp, VECTOR_CST_LOG2_NPATTERNS (expr), 8); 982*38fd1498Szrj bp_pack_value (&bp, VECTOR_CST_NELTS_PER_PATTERN (expr), 8); 983*38fd1498Szrj streamer_write_bitpack (&bp); 984*38fd1498Szrj } 985*38fd1498Szrj else if (CODE_CONTAINS_STRUCT (code, TS_VEC)) 986*38fd1498Szrj streamer_write_hwi (ob, TREE_VEC_LENGTH (expr)); 987*38fd1498Szrj else if (CODE_CONTAINS_STRUCT (code, TS_BINFO)) 988*38fd1498Szrj streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr)); 989*38fd1498Szrj else if (TREE_CODE (expr) == CALL_EXPR) 990*38fd1498Szrj streamer_write_uhwi (ob, call_expr_nargs (expr)); 991*38fd1498Szrj else if (TREE_CODE (expr) == OMP_CLAUSE) 992*38fd1498Szrj streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr)); 993*38fd1498Szrj else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST)) 994*38fd1498Szrj { 995*38fd1498Szrj gcc_checking_assert (TREE_INT_CST_NUNITS (expr)); 996*38fd1498Szrj streamer_write_uhwi (ob, TREE_INT_CST_NUNITS (expr)); 997*38fd1498Szrj streamer_write_uhwi (ob, TREE_INT_CST_EXT_NUNITS (expr)); 998*38fd1498Szrj } 999*38fd1498Szrj } 1000*38fd1498Szrj 1001*38fd1498Szrj 1002*38fd1498Szrj /* Emit the integer constant CST to output block OB. If REF_P is true, 1003*38fd1498Szrj CST's type will be emitted as a reference. */ 1004*38fd1498Szrj 1005*38fd1498Szrj void 1006*38fd1498Szrj streamer_write_integer_cst (struct output_block *ob, tree cst, bool ref_p) 1007*38fd1498Szrj { 1008*38fd1498Szrj int i; 1009*38fd1498Szrj int len = TREE_INT_CST_NUNITS (cst); 1010*38fd1498Szrj gcc_assert (!TREE_OVERFLOW (cst)); 1011*38fd1498Szrj streamer_write_record_start (ob, LTO_integer_cst); 1012*38fd1498Szrj stream_write_tree (ob, TREE_TYPE (cst), ref_p); 1013*38fd1498Szrj /* We're effectively streaming a non-sign-extended wide_int here, 1014*38fd1498Szrj so there's no need to stream TREE_INT_CST_EXT_NUNITS or any 1015*38fd1498Szrj array members beyond LEN. We'll recreate the tree from the 1016*38fd1498Szrj wide_int and the type. */ 1017*38fd1498Szrj streamer_write_uhwi (ob, len); 1018*38fd1498Szrj for (i = 0; i < len; i++) 1019*38fd1498Szrj streamer_write_hwi (ob, TREE_INT_CST_ELT (cst, i)); 1020*38fd1498Szrj } 1021