1*38fd1498Szrj /* Routines for reading trees from 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 "stringpool.h" 30*38fd1498Szrj #include "tree-streamer.h" 31*38fd1498Szrj #include "cgraph.h" 32*38fd1498Szrj #include "builtins.h" 33*38fd1498Szrj #include "ipa-chkp.h" 34*38fd1498Szrj #include "gomp-constants.h" 35*38fd1498Szrj #include "stringpool.h" 36*38fd1498Szrj #include "attribs.h" 37*38fd1498Szrj #include "asan.h" 38*38fd1498Szrj #include "opts.h" 39*38fd1498Szrj 40*38fd1498Szrj 41*38fd1498Szrj /* Read a STRING_CST from the string table in DATA_IN using input 42*38fd1498Szrj block IB. */ 43*38fd1498Szrj 44*38fd1498Szrj tree 45*38fd1498Szrj streamer_read_string_cst (struct data_in *data_in, struct lto_input_block *ib) 46*38fd1498Szrj { 47*38fd1498Szrj unsigned int len; 48*38fd1498Szrj const char * ptr; 49*38fd1498Szrj 50*38fd1498Szrj ptr = streamer_read_indexed_string (data_in, ib, &len); 51*38fd1498Szrj if (!ptr) 52*38fd1498Szrj return NULL; 53*38fd1498Szrj return build_string (len, ptr); 54*38fd1498Szrj } 55*38fd1498Szrj 56*38fd1498Szrj 57*38fd1498Szrj /* Read an IDENTIFIER from the string table in DATA_IN using input 58*38fd1498Szrj block IB. */ 59*38fd1498Szrj 60*38fd1498Szrj static tree 61*38fd1498Szrj input_identifier (struct data_in *data_in, struct lto_input_block *ib) 62*38fd1498Szrj { 63*38fd1498Szrj unsigned int len; 64*38fd1498Szrj const char *ptr; 65*38fd1498Szrj 66*38fd1498Szrj ptr = streamer_read_indexed_string (data_in, ib, &len); 67*38fd1498Szrj if (!ptr) 68*38fd1498Szrj return NULL; 69*38fd1498Szrj return get_identifier_with_length (ptr, len); 70*38fd1498Szrj } 71*38fd1498Szrj 72*38fd1498Szrj 73*38fd1498Szrj /* Read a chain of tree nodes from input block IB. DATA_IN contains 74*38fd1498Szrj tables and descriptors for the file being read. */ 75*38fd1498Szrj 76*38fd1498Szrj tree 77*38fd1498Szrj streamer_read_chain (struct lto_input_block *ib, struct data_in *data_in) 78*38fd1498Szrj { 79*38fd1498Szrj tree first, prev, curr; 80*38fd1498Szrj 81*38fd1498Szrj /* The chain is written as NULL terminated list of trees. */ 82*38fd1498Szrj first = prev = NULL_TREE; 83*38fd1498Szrj do 84*38fd1498Szrj { 85*38fd1498Szrj curr = stream_read_tree (ib, data_in); 86*38fd1498Szrj if (prev) 87*38fd1498Szrj TREE_CHAIN (prev) = curr; 88*38fd1498Szrj else 89*38fd1498Szrj first = curr; 90*38fd1498Szrj 91*38fd1498Szrj prev = curr; 92*38fd1498Szrj } 93*38fd1498Szrj while (curr); 94*38fd1498Szrj 95*38fd1498Szrj return first; 96*38fd1498Szrj } 97*38fd1498Szrj 98*38fd1498Szrj 99*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_BASE structure of 100*38fd1498Szrj expression EXPR from bitpack BP. */ 101*38fd1498Szrj 102*38fd1498Szrj static inline void 103*38fd1498Szrj unpack_ts_base_value_fields (struct bitpack_d *bp, tree expr) 104*38fd1498Szrj { 105*38fd1498Szrj /* Note that the code for EXPR has already been unpacked to create EXPR in 106*38fd1498Szrj streamer_alloc_tree. */ 107*38fd1498Szrj if (!TYPE_P (expr)) 108*38fd1498Szrj { 109*38fd1498Szrj TREE_SIDE_EFFECTS (expr) = (unsigned) bp_unpack_value (bp, 1); 110*38fd1498Szrj TREE_CONSTANT (expr) = (unsigned) bp_unpack_value (bp, 1); 111*38fd1498Szrj TREE_READONLY (expr) = (unsigned) bp_unpack_value (bp, 1); 112*38fd1498Szrj 113*38fd1498Szrj /* TREE_PUBLIC is used on types to indicate that the type 114*38fd1498Szrj has a TYPE_CACHED_VALUES vector. This is not streamed out, 115*38fd1498Szrj so we skip it here. */ 116*38fd1498Szrj TREE_PUBLIC (expr) = (unsigned) bp_unpack_value (bp, 1); 117*38fd1498Szrj } 118*38fd1498Szrj else 119*38fd1498Szrj bp_unpack_value (bp, 4); 120*38fd1498Szrj TREE_ADDRESSABLE (expr) = (unsigned) bp_unpack_value (bp, 1); 121*38fd1498Szrj TREE_THIS_VOLATILE (expr) = (unsigned) bp_unpack_value (bp, 1); 122*38fd1498Szrj if (DECL_P (expr)) 123*38fd1498Szrj { 124*38fd1498Szrj DECL_UNSIGNED (expr) = (unsigned) bp_unpack_value (bp, 1); 125*38fd1498Szrj DECL_NAMELESS (expr) = (unsigned) bp_unpack_value (bp, 1); 126*38fd1498Szrj } 127*38fd1498Szrj else if (TYPE_P (expr)) 128*38fd1498Szrj TYPE_UNSIGNED (expr) = (unsigned) bp_unpack_value (bp, 1); 129*38fd1498Szrj else 130*38fd1498Szrj bp_unpack_value (bp, 1); 131*38fd1498Szrj TREE_ASM_WRITTEN (expr) = (unsigned) bp_unpack_value (bp, 1); 132*38fd1498Szrj if (TYPE_P (expr)) 133*38fd1498Szrj TYPE_ARTIFICIAL (expr) = (unsigned) bp_unpack_value (bp, 1); 134*38fd1498Szrj else 135*38fd1498Szrj TREE_NO_WARNING (expr) = (unsigned) bp_unpack_value (bp, 1); 136*38fd1498Szrj TREE_NOTHROW (expr) = (unsigned) bp_unpack_value (bp, 1); 137*38fd1498Szrj TREE_STATIC (expr) = (unsigned) bp_unpack_value (bp, 1); 138*38fd1498Szrj if (TREE_CODE (expr) != TREE_BINFO) 139*38fd1498Szrj TREE_PRIVATE (expr) = (unsigned) bp_unpack_value (bp, 1); 140*38fd1498Szrj else 141*38fd1498Szrj bp_unpack_value (bp, 1); 142*38fd1498Szrj TREE_PROTECTED (expr) = (unsigned) bp_unpack_value (bp, 1); 143*38fd1498Szrj TREE_DEPRECATED (expr) = (unsigned) bp_unpack_value (bp, 1); 144*38fd1498Szrj if (TYPE_P (expr)) 145*38fd1498Szrj { 146*38fd1498Szrj if (AGGREGATE_TYPE_P (expr)) 147*38fd1498Szrj TYPE_REVERSE_STORAGE_ORDER (expr) = (unsigned) bp_unpack_value (bp, 1); 148*38fd1498Szrj else 149*38fd1498Szrj TYPE_SATURATING (expr) = (unsigned) bp_unpack_value (bp, 1); 150*38fd1498Szrj TYPE_ADDR_SPACE (expr) = (unsigned) bp_unpack_value (bp, 8); 151*38fd1498Szrj } 152*38fd1498Szrj else if (TREE_CODE (expr) == BIT_FIELD_REF || TREE_CODE (expr) == MEM_REF) 153*38fd1498Szrj { 154*38fd1498Szrj REF_REVERSE_STORAGE_ORDER (expr) = (unsigned) bp_unpack_value (bp, 1); 155*38fd1498Szrj bp_unpack_value (bp, 8); 156*38fd1498Szrj } 157*38fd1498Szrj else if (TREE_CODE (expr) == SSA_NAME) 158*38fd1498Szrj { 159*38fd1498Szrj SSA_NAME_IS_DEFAULT_DEF (expr) = (unsigned) bp_unpack_value (bp, 1); 160*38fd1498Szrj bp_unpack_value (bp, 8); 161*38fd1498Szrj } 162*38fd1498Szrj else 163*38fd1498Szrj bp_unpack_value (bp, 9); 164*38fd1498Szrj } 165*38fd1498Szrj 166*38fd1498Szrj 167*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_INT_CST structure of 168*38fd1498Szrj expression EXPR from bitpack BP. */ 169*38fd1498Szrj 170*38fd1498Szrj static void 171*38fd1498Szrj unpack_ts_int_cst_value_fields (struct bitpack_d *bp, tree expr) 172*38fd1498Szrj { 173*38fd1498Szrj int i; 174*38fd1498Szrj for (i = 0; i < TREE_INT_CST_EXT_NUNITS (expr); i++) 175*38fd1498Szrj TREE_INT_CST_ELT (expr, i) = bp_unpack_var_len_int (bp); 176*38fd1498Szrj } 177*38fd1498Szrj 178*38fd1498Szrj 179*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_REAL_CST structure of 180*38fd1498Szrj expression EXPR from bitpack BP. */ 181*38fd1498Szrj 182*38fd1498Szrj static void 183*38fd1498Szrj unpack_ts_real_cst_value_fields (struct bitpack_d *bp, tree expr) 184*38fd1498Szrj { 185*38fd1498Szrj unsigned i; 186*38fd1498Szrj REAL_VALUE_TYPE r; 187*38fd1498Szrj REAL_VALUE_TYPE *rp; 188*38fd1498Szrj 189*38fd1498Szrj /* Clear all bits of the real value type so that we can later do 190*38fd1498Szrj bitwise comparisons to see if two values are the same. */ 191*38fd1498Szrj memset (&r, 0, sizeof r); 192*38fd1498Szrj r.cl = (unsigned) bp_unpack_value (bp, 2); 193*38fd1498Szrj r.decimal = (unsigned) bp_unpack_value (bp, 1); 194*38fd1498Szrj r.sign = (unsigned) bp_unpack_value (bp, 1); 195*38fd1498Szrj r.signalling = (unsigned) bp_unpack_value (bp, 1); 196*38fd1498Szrj r.canonical = (unsigned) bp_unpack_value (bp, 1); 197*38fd1498Szrj r.uexp = (unsigned) bp_unpack_value (bp, EXP_BITS); 198*38fd1498Szrj for (i = 0; i < SIGSZ; i++) 199*38fd1498Szrj r.sig[i] = (unsigned long) bp_unpack_value (bp, HOST_BITS_PER_LONG); 200*38fd1498Szrj 201*38fd1498Szrj rp = ggc_alloc<real_value> (); 202*38fd1498Szrj memcpy (rp, &r, sizeof (REAL_VALUE_TYPE)); 203*38fd1498Szrj TREE_REAL_CST_PTR (expr) = rp; 204*38fd1498Szrj } 205*38fd1498Szrj 206*38fd1498Szrj 207*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_FIXED_CST structure of 208*38fd1498Szrj expression EXPR from bitpack BP. */ 209*38fd1498Szrj 210*38fd1498Szrj static void 211*38fd1498Szrj unpack_ts_fixed_cst_value_fields (struct bitpack_d *bp, tree expr) 212*38fd1498Szrj { 213*38fd1498Szrj FIXED_VALUE_TYPE *fp = ggc_alloc<fixed_value> (); 214*38fd1498Szrj fp->mode = as_a <scalar_mode> (bp_unpack_machine_mode (bp)); 215*38fd1498Szrj fp->data.low = bp_unpack_var_len_int (bp); 216*38fd1498Szrj fp->data.high = bp_unpack_var_len_int (bp); 217*38fd1498Szrj TREE_FIXED_CST_PTR (expr) = fp; 218*38fd1498Szrj } 219*38fd1498Szrj 220*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_DECL_COMMON structure 221*38fd1498Szrj of expression EXPR from bitpack BP. */ 222*38fd1498Szrj 223*38fd1498Szrj static void 224*38fd1498Szrj unpack_ts_decl_common_value_fields (struct bitpack_d *bp, tree expr) 225*38fd1498Szrj { 226*38fd1498Szrj SET_DECL_MODE (expr, bp_unpack_machine_mode (bp)); 227*38fd1498Szrj DECL_NONLOCAL (expr) = (unsigned) bp_unpack_value (bp, 1); 228*38fd1498Szrj DECL_VIRTUAL_P (expr) = (unsigned) bp_unpack_value (bp, 1); 229*38fd1498Szrj DECL_IGNORED_P (expr) = (unsigned) bp_unpack_value (bp, 1); 230*38fd1498Szrj DECL_ABSTRACT_P (expr) = (unsigned) bp_unpack_value (bp, 1); 231*38fd1498Szrj DECL_ARTIFICIAL (expr) = (unsigned) bp_unpack_value (bp, 1); 232*38fd1498Szrj DECL_USER_ALIGN (expr) = (unsigned) bp_unpack_value (bp, 1); 233*38fd1498Szrj DECL_PRESERVE_P (expr) = (unsigned) bp_unpack_value (bp, 1); 234*38fd1498Szrj DECL_EXTERNAL (expr) = (unsigned) bp_unpack_value (bp, 1); 235*38fd1498Szrj DECL_GIMPLE_REG_P (expr) = (unsigned) bp_unpack_value (bp, 1); 236*38fd1498Szrj SET_DECL_ALIGN (expr, (unsigned) bp_unpack_var_len_unsigned (bp)); 237*38fd1498Szrj #ifdef ACCEL_COMPILER 238*38fd1498Szrj if (DECL_ALIGN (expr) > targetm.absolute_biggest_alignment) 239*38fd1498Szrj SET_DECL_ALIGN (expr, targetm.absolute_biggest_alignment); 240*38fd1498Szrj #endif 241*38fd1498Szrj if (TREE_CODE (expr) == LABEL_DECL) 242*38fd1498Szrj { 243*38fd1498Szrj EH_LANDING_PAD_NR (expr) = (int) bp_unpack_var_len_unsigned (bp); 244*38fd1498Szrj 245*38fd1498Szrj /* Always assume an initial value of -1 for LABEL_DECL_UID to 246*38fd1498Szrj force gimple_set_bb to recreate label_to_block_map. */ 247*38fd1498Szrj LABEL_DECL_UID (expr) = -1; 248*38fd1498Szrj } 249*38fd1498Szrj 250*38fd1498Szrj if (TREE_CODE (expr) == FIELD_DECL) 251*38fd1498Szrj { 252*38fd1498Szrj DECL_PACKED (expr) = (unsigned) bp_unpack_value (bp, 1); 253*38fd1498Szrj DECL_NONADDRESSABLE_P (expr) = (unsigned) bp_unpack_value (bp, 1); 254*38fd1498Szrj DECL_PADDING_P (expr) = (unsigned) bp_unpack_value (bp, 1); 255*38fd1498Szrj expr->decl_common.off_align = bp_unpack_value (bp, 8); 256*38fd1498Szrj } 257*38fd1498Szrj 258*38fd1498Szrj if (VAR_P (expr)) 259*38fd1498Szrj { 260*38fd1498Szrj DECL_HAS_DEBUG_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1); 261*38fd1498Szrj DECL_NONLOCAL_FRAME (expr) = (unsigned) bp_unpack_value (bp, 1); 262*38fd1498Szrj } 263*38fd1498Szrj 264*38fd1498Szrj if (TREE_CODE (expr) == RESULT_DECL 265*38fd1498Szrj || TREE_CODE (expr) == PARM_DECL 266*38fd1498Szrj || VAR_P (expr)) 267*38fd1498Szrj { 268*38fd1498Szrj DECL_BY_REFERENCE (expr) = (unsigned) bp_unpack_value (bp, 1); 269*38fd1498Szrj if (VAR_P (expr) || TREE_CODE (expr) == PARM_DECL) 270*38fd1498Szrj DECL_HAS_VALUE_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1); 271*38fd1498Szrj } 272*38fd1498Szrj } 273*38fd1498Szrj 274*38fd1498Szrj 275*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_DECL_WRTL structure 276*38fd1498Szrj of expression EXPR from bitpack BP. */ 277*38fd1498Szrj 278*38fd1498Szrj static void 279*38fd1498Szrj unpack_ts_decl_wrtl_value_fields (struct bitpack_d *bp, tree expr) 280*38fd1498Szrj { 281*38fd1498Szrj DECL_REGISTER (expr) = (unsigned) bp_unpack_value (bp, 1); 282*38fd1498Szrj } 283*38fd1498Szrj 284*38fd1498Szrj 285*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_DECL_WITH_VIS structure 286*38fd1498Szrj of expression EXPR from bitpack BP. */ 287*38fd1498Szrj 288*38fd1498Szrj static void 289*38fd1498Szrj unpack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr) 290*38fd1498Szrj { 291*38fd1498Szrj DECL_COMMON (expr) = (unsigned) bp_unpack_value (bp, 1); 292*38fd1498Szrj DECL_DLLIMPORT_P (expr) = (unsigned) bp_unpack_value (bp, 1); 293*38fd1498Szrj DECL_WEAK (expr) = (unsigned) bp_unpack_value (bp, 1); 294*38fd1498Szrj DECL_SEEN_IN_BIND_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1); 295*38fd1498Szrj DECL_COMDAT (expr) = (unsigned) bp_unpack_value (bp, 1); 296*38fd1498Szrj DECL_VISIBILITY (expr) = (enum symbol_visibility) bp_unpack_value (bp, 2); 297*38fd1498Szrj DECL_VISIBILITY_SPECIFIED (expr) = (unsigned) bp_unpack_value (bp, 1); 298*38fd1498Szrj 299*38fd1498Szrj if (VAR_P (expr)) 300*38fd1498Szrj { 301*38fd1498Szrj DECL_HARD_REGISTER (expr) = (unsigned) bp_unpack_value (bp, 1); 302*38fd1498Szrj DECL_IN_CONSTANT_POOL (expr) = (unsigned) bp_unpack_value (bp, 1); 303*38fd1498Szrj } 304*38fd1498Szrj 305*38fd1498Szrj if (TREE_CODE (expr) == FUNCTION_DECL) 306*38fd1498Szrj { 307*38fd1498Szrj DECL_FINAL_P (expr) = (unsigned) bp_unpack_value (bp, 1); 308*38fd1498Szrj DECL_CXX_CONSTRUCTOR_P (expr) = (unsigned) bp_unpack_value (bp, 1); 309*38fd1498Szrj DECL_CXX_DESTRUCTOR_P (expr) = (unsigned) bp_unpack_value (bp, 1); 310*38fd1498Szrj } 311*38fd1498Szrj } 312*38fd1498Szrj 313*38fd1498Szrj 314*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_FUNCTION_DECL structure 315*38fd1498Szrj of expression EXPR from bitpack BP. */ 316*38fd1498Szrj 317*38fd1498Szrj static void 318*38fd1498Szrj unpack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr) 319*38fd1498Szrj { 320*38fd1498Szrj DECL_BUILT_IN_CLASS (expr) = bp_unpack_enum (bp, built_in_class, 321*38fd1498Szrj BUILT_IN_LAST); 322*38fd1498Szrj DECL_STATIC_CONSTRUCTOR (expr) = (unsigned) bp_unpack_value (bp, 1); 323*38fd1498Szrj DECL_STATIC_DESTRUCTOR (expr) = (unsigned) bp_unpack_value (bp, 1); 324*38fd1498Szrj DECL_UNINLINABLE (expr) = (unsigned) bp_unpack_value (bp, 1); 325*38fd1498Szrj DECL_POSSIBLY_INLINED (expr) = (unsigned) bp_unpack_value (bp, 1); 326*38fd1498Szrj DECL_IS_NOVOPS (expr) = (unsigned) bp_unpack_value (bp, 1); 327*38fd1498Szrj DECL_IS_RETURNS_TWICE (expr) = (unsigned) bp_unpack_value (bp, 1); 328*38fd1498Szrj DECL_IS_MALLOC (expr) = (unsigned) bp_unpack_value (bp, 1); 329*38fd1498Szrj DECL_IS_OPERATOR_NEW (expr) = (unsigned) bp_unpack_value (bp, 1); 330*38fd1498Szrj DECL_DECLARED_INLINE_P (expr) = (unsigned) bp_unpack_value (bp, 1); 331*38fd1498Szrj DECL_STATIC_CHAIN (expr) = (unsigned) bp_unpack_value (bp, 1); 332*38fd1498Szrj DECL_NO_INLINE_WARNING_P (expr) = (unsigned) bp_unpack_value (bp, 1); 333*38fd1498Szrj DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (expr) 334*38fd1498Szrj = (unsigned) bp_unpack_value (bp, 1); 335*38fd1498Szrj DECL_NO_LIMIT_STACK (expr) = (unsigned) bp_unpack_value (bp, 1); 336*38fd1498Szrj DECL_DISREGARD_INLINE_LIMITS (expr) = (unsigned) bp_unpack_value (bp, 1); 337*38fd1498Szrj DECL_PURE_P (expr) = (unsigned) bp_unpack_value (bp, 1); 338*38fd1498Szrj DECL_LOOPING_CONST_OR_PURE_P (expr) = (unsigned) bp_unpack_value (bp, 1); 339*38fd1498Szrj if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN) 340*38fd1498Szrj { 341*38fd1498Szrj DECL_FUNCTION_CODE (expr) = (enum built_in_function) bp_unpack_value (bp, 342*38fd1498Szrj 12); 343*38fd1498Szrj if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_NORMAL 344*38fd1498Szrj && DECL_FUNCTION_CODE (expr) >= END_BUILTINS) 345*38fd1498Szrj fatal_error (input_location, 346*38fd1498Szrj "machine independent builtin code out of range"); 347*38fd1498Szrj else if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD) 348*38fd1498Szrj { 349*38fd1498Szrj tree result = targetm.builtin_decl (DECL_FUNCTION_CODE (expr), true); 350*38fd1498Szrj if (!result || result == error_mark_node) 351*38fd1498Szrj fatal_error (input_location, 352*38fd1498Szrj "target specific builtin not available"); 353*38fd1498Szrj } 354*38fd1498Szrj } 355*38fd1498Szrj } 356*38fd1498Szrj 357*38fd1498Szrj 358*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_TYPE_COMMON structure 359*38fd1498Szrj of expression EXPR from bitpack BP. */ 360*38fd1498Szrj 361*38fd1498Szrj static void 362*38fd1498Szrj unpack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr) 363*38fd1498Szrj { 364*38fd1498Szrj machine_mode mode; 365*38fd1498Szrj 366*38fd1498Szrj mode = bp_unpack_machine_mode (bp); 367*38fd1498Szrj SET_TYPE_MODE (expr, mode); 368*38fd1498Szrj TYPE_STRING_FLAG (expr) = (unsigned) bp_unpack_value (bp, 1); 369*38fd1498Szrj /* TYPE_NO_FORCE_BLK is private to stor-layout and need 370*38fd1498Szrj no streaming. */ 371*38fd1498Szrj TYPE_NEEDS_CONSTRUCTING (expr) = (unsigned) bp_unpack_value (bp, 1); 372*38fd1498Szrj TYPE_PACKED (expr) = (unsigned) bp_unpack_value (bp, 1); 373*38fd1498Szrj TYPE_RESTRICT (expr) = (unsigned) bp_unpack_value (bp, 1); 374*38fd1498Szrj TYPE_USER_ALIGN (expr) = (unsigned) bp_unpack_value (bp, 1); 375*38fd1498Szrj TYPE_READONLY (expr) = (unsigned) bp_unpack_value (bp, 1); 376*38fd1498Szrj if (RECORD_OR_UNION_TYPE_P (expr)) 377*38fd1498Szrj { 378*38fd1498Szrj TYPE_TRANSPARENT_AGGR (expr) = (unsigned) bp_unpack_value (bp, 1); 379*38fd1498Szrj TYPE_FINAL_P (expr) = (unsigned) bp_unpack_value (bp, 1); 380*38fd1498Szrj } 381*38fd1498Szrj else if (TREE_CODE (expr) == ARRAY_TYPE) 382*38fd1498Szrj TYPE_NONALIASED_COMPONENT (expr) = (unsigned) bp_unpack_value (bp, 1); 383*38fd1498Szrj if (AGGREGATE_TYPE_P (expr)) 384*38fd1498Szrj TYPE_TYPELESS_STORAGE (expr) = (unsigned) bp_unpack_value (bp, 1); 385*38fd1498Szrj TYPE_EMPTY_P (expr) = (unsigned) bp_unpack_value (bp, 1); 386*38fd1498Szrj TYPE_PRECISION (expr) = bp_unpack_var_len_unsigned (bp); 387*38fd1498Szrj SET_TYPE_ALIGN (expr, bp_unpack_var_len_unsigned (bp)); 388*38fd1498Szrj #ifdef ACCEL_COMPILER 389*38fd1498Szrj if (TYPE_ALIGN (expr) > targetm.absolute_biggest_alignment) 390*38fd1498Szrj SET_TYPE_ALIGN (expr, targetm.absolute_biggest_alignment); 391*38fd1498Szrj #endif 392*38fd1498Szrj } 393*38fd1498Szrj 394*38fd1498Szrj 395*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_BLOCK structure 396*38fd1498Szrj of expression EXPR from bitpack BP. */ 397*38fd1498Szrj 398*38fd1498Szrj static void 399*38fd1498Szrj unpack_ts_block_value_fields (struct data_in *data_in, 400*38fd1498Szrj struct bitpack_d *bp, tree expr) 401*38fd1498Szrj { 402*38fd1498Szrj BLOCK_ABSTRACT (expr) = (unsigned) bp_unpack_value (bp, 1); 403*38fd1498Szrj /* BLOCK_NUMBER is recomputed. */ 404*38fd1498Szrj stream_input_location (&BLOCK_SOURCE_LOCATION (expr), bp, data_in); 405*38fd1498Szrj } 406*38fd1498Szrj 407*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL 408*38fd1498Szrj structure of expression EXPR from bitpack BP. */ 409*38fd1498Szrj 410*38fd1498Szrj static void 411*38fd1498Szrj unpack_ts_translation_unit_decl_value_fields (struct data_in *data_in, 412*38fd1498Szrj struct bitpack_d *bp, tree expr) 413*38fd1498Szrj { 414*38fd1498Szrj TRANSLATION_UNIT_LANGUAGE (expr) = xstrdup (bp_unpack_string (data_in, bp)); 415*38fd1498Szrj vec_safe_push (all_translation_units, expr); 416*38fd1498Szrj } 417*38fd1498Szrj 418*38fd1498Szrj 419*38fd1498Szrj /* Unpack all the non-pointer fields of the TS_OMP_CLAUSE 420*38fd1498Szrj structure of expression EXPR from bitpack BP. */ 421*38fd1498Szrj 422*38fd1498Szrj static void 423*38fd1498Szrj unpack_ts_omp_clause_value_fields (struct data_in *data_in, 424*38fd1498Szrj struct bitpack_d *bp, tree expr) 425*38fd1498Szrj { 426*38fd1498Szrj stream_input_location (&OMP_CLAUSE_LOCATION (expr), bp, data_in); 427*38fd1498Szrj switch (OMP_CLAUSE_CODE (expr)) 428*38fd1498Szrj { 429*38fd1498Szrj case OMP_CLAUSE_DEFAULT: 430*38fd1498Szrj OMP_CLAUSE_DEFAULT_KIND (expr) 431*38fd1498Szrj = bp_unpack_enum (bp, omp_clause_default_kind, 432*38fd1498Szrj OMP_CLAUSE_DEFAULT_LAST); 433*38fd1498Szrj break; 434*38fd1498Szrj case OMP_CLAUSE_SCHEDULE: 435*38fd1498Szrj OMP_CLAUSE_SCHEDULE_KIND (expr) 436*38fd1498Szrj = bp_unpack_enum (bp, omp_clause_schedule_kind, 437*38fd1498Szrj OMP_CLAUSE_SCHEDULE_LAST); 438*38fd1498Szrj break; 439*38fd1498Szrj case OMP_CLAUSE_DEPEND: 440*38fd1498Szrj OMP_CLAUSE_DEPEND_KIND (expr) 441*38fd1498Szrj = bp_unpack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST); 442*38fd1498Szrj break; 443*38fd1498Szrj case OMP_CLAUSE_MAP: 444*38fd1498Szrj OMP_CLAUSE_SET_MAP_KIND (expr, bp_unpack_enum (bp, gomp_map_kind, 445*38fd1498Szrj GOMP_MAP_LAST)); 446*38fd1498Szrj break; 447*38fd1498Szrj case OMP_CLAUSE_PROC_BIND: 448*38fd1498Szrj OMP_CLAUSE_PROC_BIND_KIND (expr) 449*38fd1498Szrj = bp_unpack_enum (bp, omp_clause_proc_bind_kind, 450*38fd1498Szrj OMP_CLAUSE_PROC_BIND_LAST); 451*38fd1498Szrj break; 452*38fd1498Szrj case OMP_CLAUSE_REDUCTION: 453*38fd1498Szrj OMP_CLAUSE_REDUCTION_CODE (expr) 454*38fd1498Szrj = bp_unpack_enum (bp, tree_code, MAX_TREE_CODES); 455*38fd1498Szrj break; 456*38fd1498Szrj default: 457*38fd1498Szrj break; 458*38fd1498Szrj } 459*38fd1498Szrj } 460*38fd1498Szrj 461*38fd1498Szrj 462*38fd1498Szrj /* Read all the language-independent bitfield values for EXPR from IB. 463*38fd1498Szrj Return the partially unpacked bitpack so the caller can unpack any other 464*38fd1498Szrj bitfield values that the writer may have written. */ 465*38fd1498Szrj 466*38fd1498Szrj void 467*38fd1498Szrj streamer_read_tree_bitfields (struct lto_input_block *ib, 468*38fd1498Szrj struct data_in *data_in, tree expr) 469*38fd1498Szrj { 470*38fd1498Szrj enum tree_code code; 471*38fd1498Szrj struct bitpack_d bp; 472*38fd1498Szrj 473*38fd1498Szrj /* Read the bitpack of non-pointer values from IB. */ 474*38fd1498Szrj bp = streamer_read_bitpack (ib); 475*38fd1498Szrj 476*38fd1498Szrj /* The first word in BP contains the code of the tree that we 477*38fd1498Szrj are about to read. */ 478*38fd1498Szrj code = (enum tree_code) bp_unpack_value (&bp, 16); 479*38fd1498Szrj lto_tag_check (lto_tree_code_to_tag (code), 480*38fd1498Szrj lto_tree_code_to_tag (TREE_CODE (expr))); 481*38fd1498Szrj 482*38fd1498Szrj /* Note that all these functions are highly sensitive to changes in 483*38fd1498Szrj the types and sizes of each of the fields being packed. */ 484*38fd1498Szrj unpack_ts_base_value_fields (&bp, expr); 485*38fd1498Szrj 486*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_INT_CST)) 487*38fd1498Szrj unpack_ts_int_cst_value_fields (&bp, expr); 488*38fd1498Szrj 489*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST)) 490*38fd1498Szrj unpack_ts_real_cst_value_fields (&bp, expr); 491*38fd1498Szrj 492*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST)) 493*38fd1498Szrj unpack_ts_fixed_cst_value_fields (&bp, expr); 494*38fd1498Szrj 495*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL)) 496*38fd1498Szrj stream_input_location (&DECL_SOURCE_LOCATION (expr), &bp, data_in); 497*38fd1498Szrj 498*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 499*38fd1498Szrj unpack_ts_decl_common_value_fields (&bp, expr); 500*38fd1498Szrj 501*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)) 502*38fd1498Szrj unpack_ts_decl_wrtl_value_fields (&bp, expr); 503*38fd1498Szrj 504*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) 505*38fd1498Szrj unpack_ts_decl_with_vis_value_fields (&bp, expr); 506*38fd1498Szrj 507*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL)) 508*38fd1498Szrj unpack_ts_function_decl_value_fields (&bp, expr); 509*38fd1498Szrj 510*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON)) 511*38fd1498Szrj unpack_ts_type_common_value_fields (&bp, expr); 512*38fd1498Szrj 513*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_EXP)) 514*38fd1498Szrj { 515*38fd1498Szrj stream_input_location (&EXPR_CHECK (expr)->exp.locus, &bp, data_in); 516*38fd1498Szrj if (code == MEM_REF 517*38fd1498Szrj || code == TARGET_MEM_REF) 518*38fd1498Szrj { 519*38fd1498Szrj MR_DEPENDENCE_CLIQUE (expr) 520*38fd1498Szrj = (unsigned)bp_unpack_value (&bp, sizeof (short) * 8); 521*38fd1498Szrj if (MR_DEPENDENCE_CLIQUE (expr) != 0) 522*38fd1498Szrj MR_DEPENDENCE_BASE (expr) 523*38fd1498Szrj = (unsigned)bp_unpack_value (&bp, sizeof (short) * 8); 524*38fd1498Szrj } 525*38fd1498Szrj } 526*38fd1498Szrj 527*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_BLOCK)) 528*38fd1498Szrj unpack_ts_block_value_fields (data_in, &bp, expr); 529*38fd1498Szrj 530*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL)) 531*38fd1498Szrj unpack_ts_translation_unit_decl_value_fields (data_in, &bp, expr); 532*38fd1498Szrj 533*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION)) 534*38fd1498Szrj cl_optimization_stream_in (&bp, TREE_OPTIMIZATION (expr)); 535*38fd1498Szrj 536*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_BINFO)) 537*38fd1498Szrj { 538*38fd1498Szrj unsigned HOST_WIDE_INT length = bp_unpack_var_len_unsigned (&bp); 539*38fd1498Szrj if (length > 0) 540*38fd1498Szrj vec_safe_grow (BINFO_BASE_ACCESSES (expr), length); 541*38fd1498Szrj } 542*38fd1498Szrj 543*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) 544*38fd1498Szrj { 545*38fd1498Szrj unsigned HOST_WIDE_INT length = bp_unpack_var_len_unsigned (&bp); 546*38fd1498Szrj if (length > 0) 547*38fd1498Szrj vec_safe_grow (CONSTRUCTOR_ELTS (expr), length); 548*38fd1498Szrj } 549*38fd1498Szrj 550*38fd1498Szrj #ifndef ACCEL_COMPILER 551*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)) 552*38fd1498Szrj { 553*38fd1498Szrj cl_target_option_stream_in (data_in, &bp, TREE_TARGET_OPTION (expr)); 554*38fd1498Szrj if (targetm.target_option.post_stream_in) 555*38fd1498Szrj targetm.target_option.post_stream_in (TREE_TARGET_OPTION (expr)); 556*38fd1498Szrj } 557*38fd1498Szrj #endif 558*38fd1498Szrj 559*38fd1498Szrj if (code == OMP_CLAUSE) 560*38fd1498Szrj unpack_ts_omp_clause_value_fields (data_in, &bp, expr); 561*38fd1498Szrj } 562*38fd1498Szrj 563*38fd1498Szrj 564*38fd1498Szrj /* Materialize a new tree from input block IB using descriptors in 565*38fd1498Szrj DATA_IN. The code for the new tree should match TAG. Store in 566*38fd1498Szrj *IX_P the index into the reader cache where the new tree is stored. */ 567*38fd1498Szrj 568*38fd1498Szrj tree 569*38fd1498Szrj streamer_alloc_tree (struct lto_input_block *ib, struct data_in *data_in, 570*38fd1498Szrj enum LTO_tags tag) 571*38fd1498Szrj { 572*38fd1498Szrj enum tree_code code; 573*38fd1498Szrj tree result; 574*38fd1498Szrj 575*38fd1498Szrj result = NULL_TREE; 576*38fd1498Szrj 577*38fd1498Szrj code = lto_tag_to_tree_code (tag); 578*38fd1498Szrj 579*38fd1498Szrj /* We should never see an SSA_NAME tree. Only the version numbers of 580*38fd1498Szrj SSA names are ever written out. See input_ssa_names. */ 581*38fd1498Szrj gcc_assert (code != SSA_NAME); 582*38fd1498Szrj 583*38fd1498Szrj /* Instantiate a new tree using the header data. */ 584*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_STRING)) 585*38fd1498Szrj result = streamer_read_string_cst (data_in, ib); 586*38fd1498Szrj else if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER)) 587*38fd1498Szrj result = input_identifier (data_in, ib); 588*38fd1498Szrj else if (CODE_CONTAINS_STRUCT (code, TS_VEC)) 589*38fd1498Szrj { 590*38fd1498Szrj HOST_WIDE_INT len = streamer_read_hwi (ib); 591*38fd1498Szrj result = make_tree_vec (len); 592*38fd1498Szrj } 593*38fd1498Szrj else if (CODE_CONTAINS_STRUCT (code, TS_VECTOR)) 594*38fd1498Szrj { 595*38fd1498Szrj bitpack_d bp = streamer_read_bitpack (ib); 596*38fd1498Szrj unsigned int log2_npatterns = bp_unpack_value (&bp, 8); 597*38fd1498Szrj unsigned int nelts_per_pattern = bp_unpack_value (&bp, 8); 598*38fd1498Szrj result = make_vector (log2_npatterns, nelts_per_pattern); 599*38fd1498Szrj } 600*38fd1498Szrj else if (CODE_CONTAINS_STRUCT (code, TS_BINFO)) 601*38fd1498Szrj { 602*38fd1498Szrj unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib); 603*38fd1498Szrj result = make_tree_binfo (len); 604*38fd1498Szrj } 605*38fd1498Szrj else if (CODE_CONTAINS_STRUCT (code, TS_INT_CST)) 606*38fd1498Szrj { 607*38fd1498Szrj unsigned HOST_WIDE_INT len = streamer_read_uhwi (ib); 608*38fd1498Szrj unsigned HOST_WIDE_INT ext_len = streamer_read_uhwi (ib); 609*38fd1498Szrj result = make_int_cst (len, ext_len); 610*38fd1498Szrj } 611*38fd1498Szrj else if (code == CALL_EXPR) 612*38fd1498Szrj { 613*38fd1498Szrj unsigned HOST_WIDE_INT nargs = streamer_read_uhwi (ib); 614*38fd1498Szrj return build_vl_exp (CALL_EXPR, nargs + 3); 615*38fd1498Szrj } 616*38fd1498Szrj else if (code == OMP_CLAUSE) 617*38fd1498Szrj { 618*38fd1498Szrj enum omp_clause_code subcode 619*38fd1498Szrj = (enum omp_clause_code) streamer_read_uhwi (ib); 620*38fd1498Szrj return build_omp_clause (UNKNOWN_LOCATION, subcode); 621*38fd1498Szrj } 622*38fd1498Szrj else 623*38fd1498Szrj { 624*38fd1498Szrj /* For all other nodes, materialize the tree with a raw 625*38fd1498Szrj make_node call. */ 626*38fd1498Szrj result = make_node (code); 627*38fd1498Szrj } 628*38fd1498Szrj 629*38fd1498Szrj return result; 630*38fd1498Szrj } 631*38fd1498Szrj 632*38fd1498Szrj 633*38fd1498Szrj /* Read all pointer fields in the TS_COMMON structure of EXPR from input 634*38fd1498Szrj block IB. DATA_IN contains tables and descriptors for the 635*38fd1498Szrj file being read. */ 636*38fd1498Szrj 637*38fd1498Szrj 638*38fd1498Szrj static void 639*38fd1498Szrj lto_input_ts_common_tree_pointers (struct lto_input_block *ib, 640*38fd1498Szrj struct data_in *data_in, tree expr) 641*38fd1498Szrj { 642*38fd1498Szrj if (TREE_CODE (expr) != IDENTIFIER_NODE) 643*38fd1498Szrj TREE_TYPE (expr) = stream_read_tree (ib, data_in); 644*38fd1498Szrj } 645*38fd1498Szrj 646*38fd1498Szrj 647*38fd1498Szrj /* Read all pointer fields in the TS_VECTOR structure of EXPR from input 648*38fd1498Szrj block IB. DATA_IN contains tables and descriptors for the 649*38fd1498Szrj file being read. */ 650*38fd1498Szrj 651*38fd1498Szrj static void 652*38fd1498Szrj lto_input_ts_vector_tree_pointers (struct lto_input_block *ib, 653*38fd1498Szrj struct data_in *data_in, tree expr) 654*38fd1498Szrj { 655*38fd1498Szrj unsigned int count = vector_cst_encoded_nelts (expr); 656*38fd1498Szrj for (unsigned int i = 0; i < count; ++i) 657*38fd1498Szrj VECTOR_CST_ENCODED_ELT (expr, i) = stream_read_tree (ib, data_in); 658*38fd1498Szrj } 659*38fd1498Szrj 660*38fd1498Szrj 661*38fd1498Szrj /* Read all pointer fields in the TS_POLY_INT_CST structure of EXPR from 662*38fd1498Szrj input block IB. DATA_IN contains tables and descriptors for the 663*38fd1498Szrj file being read. */ 664*38fd1498Szrj 665*38fd1498Szrj static void 666*38fd1498Szrj lto_input_ts_poly_tree_pointers (struct lto_input_block *ib, 667*38fd1498Szrj struct data_in *data_in, tree expr) 668*38fd1498Szrj { 669*38fd1498Szrj for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i) 670*38fd1498Szrj POLY_INT_CST_COEFF (expr, i) = stream_read_tree (ib, data_in); 671*38fd1498Szrj } 672*38fd1498Szrj 673*38fd1498Szrj 674*38fd1498Szrj /* Read all pointer fields in the TS_COMPLEX structure of EXPR from input 675*38fd1498Szrj block IB. DATA_IN contains tables and descriptors for the 676*38fd1498Szrj file being read. */ 677*38fd1498Szrj 678*38fd1498Szrj static void 679*38fd1498Szrj lto_input_ts_complex_tree_pointers (struct lto_input_block *ib, 680*38fd1498Szrj struct data_in *data_in, tree expr) 681*38fd1498Szrj { 682*38fd1498Szrj TREE_REALPART (expr) = stream_read_tree (ib, data_in); 683*38fd1498Szrj TREE_IMAGPART (expr) = stream_read_tree (ib, data_in); 684*38fd1498Szrj } 685*38fd1498Szrj 686*38fd1498Szrj 687*38fd1498Szrj /* Read all pointer fields in the TS_DECL_MINIMAL structure of EXPR 688*38fd1498Szrj from input block IB. DATA_IN contains tables and descriptors for the 689*38fd1498Szrj file being read. */ 690*38fd1498Szrj 691*38fd1498Szrj static void 692*38fd1498Szrj lto_input_ts_decl_minimal_tree_pointers (struct lto_input_block *ib, 693*38fd1498Szrj struct data_in *data_in, tree expr) 694*38fd1498Szrj { 695*38fd1498Szrj DECL_NAME (expr) = stream_read_tree (ib, data_in); 696*38fd1498Szrj DECL_CONTEXT (expr) = stream_read_tree (ib, data_in); 697*38fd1498Szrj } 698*38fd1498Szrj 699*38fd1498Szrj 700*38fd1498Szrj /* Read all pointer fields in the TS_DECL_COMMON structure of EXPR from 701*38fd1498Szrj input block IB. DATA_IN contains tables and descriptors for the 702*38fd1498Szrj file being read. */ 703*38fd1498Szrj 704*38fd1498Szrj static void 705*38fd1498Szrj lto_input_ts_decl_common_tree_pointers (struct lto_input_block *ib, 706*38fd1498Szrj struct data_in *data_in, tree expr) 707*38fd1498Szrj { 708*38fd1498Szrj DECL_SIZE (expr) = stream_read_tree (ib, data_in); 709*38fd1498Szrj DECL_SIZE_UNIT (expr) = stream_read_tree (ib, data_in); 710*38fd1498Szrj DECL_ATTRIBUTES (expr) = stream_read_tree (ib, data_in); 711*38fd1498Szrj DECL_ABSTRACT_ORIGIN (expr) = stream_read_tree (ib, data_in); 712*38fd1498Szrj 713*38fd1498Szrj if ((VAR_P (expr) || TREE_CODE (expr) == PARM_DECL) 714*38fd1498Szrj && DECL_HAS_VALUE_EXPR_P (expr)) 715*38fd1498Szrj SET_DECL_VALUE_EXPR (expr, stream_read_tree (ib, data_in)); 716*38fd1498Szrj 717*38fd1498Szrj if (VAR_P (expr) 718*38fd1498Szrj && DECL_HAS_DEBUG_EXPR_P (expr)) 719*38fd1498Szrj { 720*38fd1498Szrj tree dexpr = stream_read_tree (ib, data_in); 721*38fd1498Szrj if (dexpr) 722*38fd1498Szrj SET_DECL_DEBUG_EXPR (expr, dexpr); 723*38fd1498Szrj } 724*38fd1498Szrj } 725*38fd1498Szrj 726*38fd1498Szrj 727*38fd1498Szrj /* Read all pointer fields in the TS_DECL_NON_COMMON structure of 728*38fd1498Szrj EXPR from input block IB. DATA_IN contains tables and descriptors for the 729*38fd1498Szrj file being read. */ 730*38fd1498Szrj 731*38fd1498Szrj static void 732*38fd1498Szrj lto_input_ts_decl_non_common_tree_pointers (struct lto_input_block *ib, 733*38fd1498Szrj struct data_in *data_in, tree expr) 734*38fd1498Szrj { 735*38fd1498Szrj if (TREE_CODE (expr) == TYPE_DECL) 736*38fd1498Szrj DECL_ORIGINAL_TYPE (expr) = stream_read_tree (ib, data_in); 737*38fd1498Szrj } 738*38fd1498Szrj 739*38fd1498Szrj 740*38fd1498Szrj /* Read all pointer fields in the TS_DECL_WITH_VIS structure of EXPR 741*38fd1498Szrj from input block IB. DATA_IN contains tables and descriptors for the 742*38fd1498Szrj file being read. */ 743*38fd1498Szrj 744*38fd1498Szrj static void 745*38fd1498Szrj lto_input_ts_decl_with_vis_tree_pointers (struct lto_input_block *ib, 746*38fd1498Szrj struct data_in *data_in, tree expr) 747*38fd1498Szrj { 748*38fd1498Szrj tree id; 749*38fd1498Szrj 750*38fd1498Szrj id = stream_read_tree (ib, data_in); 751*38fd1498Szrj if (id) 752*38fd1498Szrj { 753*38fd1498Szrj gcc_assert (TREE_CODE (id) == IDENTIFIER_NODE); 754*38fd1498Szrj SET_DECL_ASSEMBLER_NAME (expr, id); 755*38fd1498Szrj } 756*38fd1498Szrj } 757*38fd1498Szrj 758*38fd1498Szrj 759*38fd1498Szrj /* Read all pointer fields in the TS_FIELD_DECL structure of EXPR from 760*38fd1498Szrj input block IB. DATA_IN contains tables and descriptors for the 761*38fd1498Szrj file being read. */ 762*38fd1498Szrj 763*38fd1498Szrj static void 764*38fd1498Szrj lto_input_ts_field_decl_tree_pointers (struct lto_input_block *ib, 765*38fd1498Szrj struct data_in *data_in, tree expr) 766*38fd1498Szrj { 767*38fd1498Szrj DECL_FIELD_OFFSET (expr) = stream_read_tree (ib, data_in); 768*38fd1498Szrj DECL_BIT_FIELD_TYPE (expr) = stream_read_tree (ib, data_in); 769*38fd1498Szrj DECL_BIT_FIELD_REPRESENTATIVE (expr) = stream_read_tree (ib, data_in); 770*38fd1498Szrj DECL_FIELD_BIT_OFFSET (expr) = stream_read_tree (ib, data_in); 771*38fd1498Szrj DECL_FCONTEXT (expr) = stream_read_tree (ib, data_in); 772*38fd1498Szrj } 773*38fd1498Szrj 774*38fd1498Szrj 775*38fd1498Szrj /* Read all pointer fields in the TS_FUNCTION_DECL structure of EXPR 776*38fd1498Szrj from input block IB. DATA_IN contains tables and descriptors for the 777*38fd1498Szrj file being read. */ 778*38fd1498Szrj 779*38fd1498Szrj static void 780*38fd1498Szrj lto_input_ts_function_decl_tree_pointers (struct lto_input_block *ib, 781*38fd1498Szrj struct data_in *data_in, tree expr) 782*38fd1498Szrj { 783*38fd1498Szrj DECL_VINDEX (expr) = stream_read_tree (ib, data_in); 784*38fd1498Szrj /* DECL_STRUCT_FUNCTION is loaded on demand by cgraph_get_body. */ 785*38fd1498Szrj DECL_FUNCTION_PERSONALITY (expr) = stream_read_tree (ib, data_in); 786*38fd1498Szrj #ifndef ACCEL_COMPILER 787*38fd1498Szrj DECL_FUNCTION_SPECIFIC_TARGET (expr) = stream_read_tree (ib, data_in); 788*38fd1498Szrj #endif 789*38fd1498Szrj DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = stream_read_tree (ib, data_in); 790*38fd1498Szrj #ifdef ACCEL_COMPILER 791*38fd1498Szrj { 792*38fd1498Szrj tree opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr); 793*38fd1498Szrj if (opts) 794*38fd1498Szrj { 795*38fd1498Szrj struct gcc_options tmp; 796*38fd1498Szrj init_options_struct (&tmp, NULL); 797*38fd1498Szrj cl_optimization_restore (&tmp, TREE_OPTIMIZATION (opts)); 798*38fd1498Szrj finish_options (&tmp, &global_options_set, UNKNOWN_LOCATION); 799*38fd1498Szrj opts = build_optimization_node (&tmp); 800*38fd1498Szrj finalize_options_struct (&tmp); 801*38fd1498Szrj DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = opts; 802*38fd1498Szrj } 803*38fd1498Szrj } 804*38fd1498Szrj #endif 805*38fd1498Szrj 806*38fd1498Szrj /* If the file contains a function with an EH personality set, 807*38fd1498Szrj then it was compiled with -fexceptions. In that case, initialize 808*38fd1498Szrj the backend EH machinery. */ 809*38fd1498Szrj if (DECL_FUNCTION_PERSONALITY (expr)) 810*38fd1498Szrj lto_init_eh (); 811*38fd1498Szrj } 812*38fd1498Szrj 813*38fd1498Szrj 814*38fd1498Szrj /* Read all pointer fields in the TS_TYPE_COMMON structure of EXPR from 815*38fd1498Szrj input block IB. DATA_IN contains tables and descriptors for the file 816*38fd1498Szrj being read. */ 817*38fd1498Szrj 818*38fd1498Szrj static void 819*38fd1498Szrj lto_input_ts_type_common_tree_pointers (struct lto_input_block *ib, 820*38fd1498Szrj struct data_in *data_in, tree expr) 821*38fd1498Szrj { 822*38fd1498Szrj TYPE_SIZE (expr) = stream_read_tree (ib, data_in); 823*38fd1498Szrj TYPE_SIZE_UNIT (expr) = stream_read_tree (ib, data_in); 824*38fd1498Szrj TYPE_ATTRIBUTES (expr) = stream_read_tree (ib, data_in); 825*38fd1498Szrj TYPE_NAME (expr) = stream_read_tree (ib, data_in); 826*38fd1498Szrj /* Do not stream TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be 827*38fd1498Szrj reconstructed during fixup. */ 828*38fd1498Szrj /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists 829*38fd1498Szrj during fixup. */ 830*38fd1498Szrj TYPE_MAIN_VARIANT (expr) = stream_read_tree (ib, data_in); 831*38fd1498Szrj TYPE_CONTEXT (expr) = stream_read_tree (ib, data_in); 832*38fd1498Szrj /* TYPE_CANONICAL gets re-computed during type merging. */ 833*38fd1498Szrj TYPE_CANONICAL (expr) = NULL_TREE; 834*38fd1498Szrj TYPE_STUB_DECL (expr) = stream_read_tree (ib, data_in); 835*38fd1498Szrj } 836*38fd1498Szrj 837*38fd1498Szrj /* Read all pointer fields in the TS_TYPE_NON_COMMON structure of EXPR 838*38fd1498Szrj from input block IB. DATA_IN contains tables and descriptors for the 839*38fd1498Szrj file being read. */ 840*38fd1498Szrj 841*38fd1498Szrj static void 842*38fd1498Szrj lto_input_ts_type_non_common_tree_pointers (struct lto_input_block *ib, 843*38fd1498Szrj struct data_in *data_in, 844*38fd1498Szrj tree expr) 845*38fd1498Szrj { 846*38fd1498Szrj if (TREE_CODE (expr) == ENUMERAL_TYPE) 847*38fd1498Szrj TYPE_VALUES (expr) = stream_read_tree (ib, data_in); 848*38fd1498Szrj else if (TREE_CODE (expr) == ARRAY_TYPE) 849*38fd1498Szrj TYPE_DOMAIN (expr) = stream_read_tree (ib, data_in); 850*38fd1498Szrj else if (RECORD_OR_UNION_TYPE_P (expr)) 851*38fd1498Szrj TYPE_FIELDS (expr) = streamer_read_chain (ib, data_in); 852*38fd1498Szrj else if (TREE_CODE (expr) == FUNCTION_TYPE 853*38fd1498Szrj || TREE_CODE (expr) == METHOD_TYPE) 854*38fd1498Szrj TYPE_ARG_TYPES (expr) = stream_read_tree (ib, data_in); 855*38fd1498Szrj 856*38fd1498Szrj if (!POINTER_TYPE_P (expr)) 857*38fd1498Szrj TYPE_MIN_VALUE_RAW (expr) = stream_read_tree (ib, data_in); 858*38fd1498Szrj TYPE_MAX_VALUE_RAW (expr) = stream_read_tree (ib, data_in); 859*38fd1498Szrj } 860*38fd1498Szrj 861*38fd1498Szrj 862*38fd1498Szrj /* Read all pointer fields in the TS_LIST structure of EXPR from input 863*38fd1498Szrj block IB. DATA_IN contains tables and descriptors for the 864*38fd1498Szrj file being read. */ 865*38fd1498Szrj 866*38fd1498Szrj static void 867*38fd1498Szrj lto_input_ts_list_tree_pointers (struct lto_input_block *ib, 868*38fd1498Szrj struct data_in *data_in, tree expr) 869*38fd1498Szrj { 870*38fd1498Szrj TREE_PURPOSE (expr) = stream_read_tree (ib, data_in); 871*38fd1498Szrj TREE_VALUE (expr) = stream_read_tree (ib, data_in); 872*38fd1498Szrj TREE_CHAIN (expr) = stream_read_tree (ib, data_in); 873*38fd1498Szrj } 874*38fd1498Szrj 875*38fd1498Szrj 876*38fd1498Szrj /* Read all pointer fields in the TS_VEC structure of EXPR from input 877*38fd1498Szrj block IB. DATA_IN contains tables and descriptors for the 878*38fd1498Szrj file being read. */ 879*38fd1498Szrj 880*38fd1498Szrj static void 881*38fd1498Szrj lto_input_ts_vec_tree_pointers (struct lto_input_block *ib, 882*38fd1498Szrj struct data_in *data_in, tree expr) 883*38fd1498Szrj { 884*38fd1498Szrj int i; 885*38fd1498Szrj 886*38fd1498Szrj /* Note that TREE_VEC_LENGTH was read by streamer_alloc_tree to 887*38fd1498Szrj instantiate EXPR. */ 888*38fd1498Szrj for (i = 0; i < TREE_VEC_LENGTH (expr); i++) 889*38fd1498Szrj TREE_VEC_ELT (expr, i) = stream_read_tree (ib, data_in); 890*38fd1498Szrj } 891*38fd1498Szrj 892*38fd1498Szrj 893*38fd1498Szrj /* Read all pointer fields in the TS_EXP structure of EXPR from input 894*38fd1498Szrj block IB. DATA_IN contains tables and descriptors for the 895*38fd1498Szrj file being read. */ 896*38fd1498Szrj 897*38fd1498Szrj 898*38fd1498Szrj static void 899*38fd1498Szrj lto_input_ts_exp_tree_pointers (struct lto_input_block *ib, 900*38fd1498Szrj struct data_in *data_in, tree expr) 901*38fd1498Szrj { 902*38fd1498Szrj int i; 903*38fd1498Szrj tree block; 904*38fd1498Szrj 905*38fd1498Szrj for (i = 0; i < TREE_OPERAND_LENGTH (expr); i++) 906*38fd1498Szrj TREE_OPERAND (expr, i) = stream_read_tree (ib, data_in); 907*38fd1498Szrj 908*38fd1498Szrj block = stream_read_tree (ib, data_in); 909*38fd1498Szrj 910*38fd1498Szrj /* TODO: Block is stored in the locus information. It may make more sense to 911*38fd1498Szrj to make it go via the location cache. */ 912*38fd1498Szrj if (block) 913*38fd1498Szrj { 914*38fd1498Szrj data_in->location_cache.apply_location_cache (); 915*38fd1498Szrj TREE_SET_BLOCK (expr, block); 916*38fd1498Szrj } 917*38fd1498Szrj } 918*38fd1498Szrj 919*38fd1498Szrj 920*38fd1498Szrj /* Read all pointer fields in the TS_BLOCK structure of EXPR from input 921*38fd1498Szrj block IB. DATA_IN contains tables and descriptors for the 922*38fd1498Szrj file being read. */ 923*38fd1498Szrj 924*38fd1498Szrj static void 925*38fd1498Szrj lto_input_ts_block_tree_pointers (struct lto_input_block *ib, 926*38fd1498Szrj struct data_in *data_in, tree expr) 927*38fd1498Szrj { 928*38fd1498Szrj BLOCK_VARS (expr) = streamer_read_chain (ib, data_in); 929*38fd1498Szrj 930*38fd1498Szrj BLOCK_SUPERCONTEXT (expr) = stream_read_tree (ib, data_in); 931*38fd1498Szrj 932*38fd1498Szrj /* Stream BLOCK_ABSTRACT_ORIGIN and BLOCK_SOURCE_LOCATION for 933*38fd1498Szrj the limited cases we can handle - those that represent inlined 934*38fd1498Szrj function scopes. For the rest them on the floor instead of ICEing in 935*38fd1498Szrj dwarf2out.c. */ 936*38fd1498Szrj BLOCK_ABSTRACT_ORIGIN (expr) = stream_read_tree (ib, data_in); 937*38fd1498Szrj /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information 938*38fd1498Szrj for early inlined BLOCKs so drop it on the floor instead of ICEing in 939*38fd1498Szrj dwarf2out.c. */ 940*38fd1498Szrj 941*38fd1498Szrj /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO 942*38fd1498Szrj streaming time. */ 943*38fd1498Szrj 944*38fd1498Szrj /* We re-compute BLOCK_SUBBLOCKS of our parent here instead 945*38fd1498Szrj of streaming it. For non-BLOCK BLOCK_SUPERCONTEXTs we still 946*38fd1498Szrj stream the child relationship explicitly. */ 947*38fd1498Szrj if (BLOCK_SUPERCONTEXT (expr) 948*38fd1498Szrj && TREE_CODE (BLOCK_SUPERCONTEXT (expr)) == BLOCK) 949*38fd1498Szrj { 950*38fd1498Szrj BLOCK_CHAIN (expr) = BLOCK_SUBBLOCKS (BLOCK_SUPERCONTEXT (expr)); 951*38fd1498Szrj BLOCK_SUBBLOCKS (BLOCK_SUPERCONTEXT (expr)) = expr; 952*38fd1498Szrj } 953*38fd1498Szrj 954*38fd1498Szrj /* The global block is rooted at the TU decl. Hook it here to 955*38fd1498Szrj avoid the need to stream in this block during WPA time. */ 956*38fd1498Szrj else if (BLOCK_SUPERCONTEXT (expr) 957*38fd1498Szrj && TREE_CODE (BLOCK_SUPERCONTEXT (expr)) == TRANSLATION_UNIT_DECL) 958*38fd1498Szrj DECL_INITIAL (BLOCK_SUPERCONTEXT (expr)) = expr; 959*38fd1498Szrj 960*38fd1498Szrj /* The function-level block is connected at the time we read in 961*38fd1498Szrj function bodies for the same reason. */ 962*38fd1498Szrj } 963*38fd1498Szrj 964*38fd1498Szrj 965*38fd1498Szrj /* Read all pointer fields in the TS_BINFO structure of EXPR from input 966*38fd1498Szrj block IB. DATA_IN contains tables and descriptors for the 967*38fd1498Szrj file being read. */ 968*38fd1498Szrj 969*38fd1498Szrj static void 970*38fd1498Szrj lto_input_ts_binfo_tree_pointers (struct lto_input_block *ib, 971*38fd1498Szrj struct data_in *data_in, tree expr) 972*38fd1498Szrj { 973*38fd1498Szrj unsigned i; 974*38fd1498Szrj tree t; 975*38fd1498Szrj 976*38fd1498Szrj /* Note that the number of slots in EXPR was read in 977*38fd1498Szrj streamer_alloc_tree when instantiating EXPR. However, the 978*38fd1498Szrj vector is empty so we cannot rely on vec::length to know how many 979*38fd1498Szrj elements to read. So, this list is emitted as a 0-terminated 980*38fd1498Szrj list on the writer side. */ 981*38fd1498Szrj do 982*38fd1498Szrj { 983*38fd1498Szrj t = stream_read_tree (ib, data_in); 984*38fd1498Szrj if (t) 985*38fd1498Szrj BINFO_BASE_BINFOS (expr)->quick_push (t); 986*38fd1498Szrj } 987*38fd1498Szrj while (t); 988*38fd1498Szrj 989*38fd1498Szrj BINFO_OFFSET (expr) = stream_read_tree (ib, data_in); 990*38fd1498Szrj BINFO_VTABLE (expr) = stream_read_tree (ib, data_in); 991*38fd1498Szrj BINFO_VPTR_FIELD (expr) = stream_read_tree (ib, data_in); 992*38fd1498Szrj 993*38fd1498Szrj /* The vector of BINFO_BASE_ACCESSES is pre-allocated during 994*38fd1498Szrj unpacking the bitfield section. */ 995*38fd1498Szrj for (i = 0; i < vec_safe_length (BINFO_BASE_ACCESSES (expr)); i++) 996*38fd1498Szrj { 997*38fd1498Szrj tree a = stream_read_tree (ib, data_in); 998*38fd1498Szrj (*BINFO_BASE_ACCESSES (expr))[i] = a; 999*38fd1498Szrj } 1000*38fd1498Szrj /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX 1001*38fd1498Szrj and BINFO_VPTR_INDEX; these are used by C++ FE only. */ 1002*38fd1498Szrj } 1003*38fd1498Szrj 1004*38fd1498Szrj 1005*38fd1498Szrj /* Read all pointer fields in the TS_CONSTRUCTOR structure of EXPR from 1006*38fd1498Szrj input block IB. DATA_IN contains tables and descriptors for the 1007*38fd1498Szrj file being read. */ 1008*38fd1498Szrj 1009*38fd1498Szrj static void 1010*38fd1498Szrj lto_input_ts_constructor_tree_pointers (struct lto_input_block *ib, 1011*38fd1498Szrj struct data_in *data_in, tree expr) 1012*38fd1498Szrj { 1013*38fd1498Szrj unsigned i; 1014*38fd1498Szrj 1015*38fd1498Szrj for (i = 0; i < CONSTRUCTOR_NELTS (expr); i++) 1016*38fd1498Szrj { 1017*38fd1498Szrj constructor_elt e; 1018*38fd1498Szrj e.index = stream_read_tree (ib, data_in); 1019*38fd1498Szrj e.value = stream_read_tree (ib, data_in); 1020*38fd1498Szrj (*CONSTRUCTOR_ELTS (expr))[i] = e; 1021*38fd1498Szrj } 1022*38fd1498Szrj } 1023*38fd1498Szrj 1024*38fd1498Szrj 1025*38fd1498Szrj /* Read all pointer fields in the TS_OMP_CLAUSE structure of EXPR from 1026*38fd1498Szrj input block IB. DATA_IN contains tables and descriptors for the 1027*38fd1498Szrj file being read. */ 1028*38fd1498Szrj 1029*38fd1498Szrj static void 1030*38fd1498Szrj lto_input_ts_omp_clause_tree_pointers (struct lto_input_block *ib, 1031*38fd1498Szrj struct data_in *data_in, tree expr) 1032*38fd1498Szrj { 1033*38fd1498Szrj int i; 1034*38fd1498Szrj 1035*38fd1498Szrj for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++) 1036*38fd1498Szrj OMP_CLAUSE_OPERAND (expr, i) = stream_read_tree (ib, data_in); 1037*38fd1498Szrj OMP_CLAUSE_CHAIN (expr) = stream_read_tree (ib, data_in); 1038*38fd1498Szrj } 1039*38fd1498Szrj 1040*38fd1498Szrj 1041*38fd1498Szrj /* Read all pointer fields in EXPR from input block IB. DATA_IN 1042*38fd1498Szrj contains tables and descriptors for the file being read. */ 1043*38fd1498Szrj 1044*38fd1498Szrj void 1045*38fd1498Szrj streamer_read_tree_body (struct lto_input_block *ib, struct data_in *data_in, 1046*38fd1498Szrj tree expr) 1047*38fd1498Szrj { 1048*38fd1498Szrj enum tree_code code; 1049*38fd1498Szrj 1050*38fd1498Szrj code = TREE_CODE (expr); 1051*38fd1498Szrj 1052*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TYPED)) 1053*38fd1498Szrj lto_input_ts_common_tree_pointers (ib, data_in, expr); 1054*38fd1498Szrj 1055*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_VECTOR)) 1056*38fd1498Szrj lto_input_ts_vector_tree_pointers (ib, data_in, expr); 1057*38fd1498Szrj 1058*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST)) 1059*38fd1498Szrj lto_input_ts_poly_tree_pointers (ib, data_in, expr); 1060*38fd1498Szrj 1061*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX)) 1062*38fd1498Szrj lto_input_ts_complex_tree_pointers (ib, data_in, expr); 1063*38fd1498Szrj 1064*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL)) 1065*38fd1498Szrj lto_input_ts_decl_minimal_tree_pointers (ib, data_in, expr); 1066*38fd1498Szrj 1067*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 1068*38fd1498Szrj lto_input_ts_decl_common_tree_pointers (ib, data_in, expr); 1069*38fd1498Szrj 1070*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON)) 1071*38fd1498Szrj lto_input_ts_decl_non_common_tree_pointers (ib, data_in, expr); 1072*38fd1498Szrj 1073*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) 1074*38fd1498Szrj lto_input_ts_decl_with_vis_tree_pointers (ib, data_in, expr); 1075*38fd1498Szrj 1076*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL)) 1077*38fd1498Szrj lto_input_ts_field_decl_tree_pointers (ib, data_in, expr); 1078*38fd1498Szrj 1079*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL)) 1080*38fd1498Szrj lto_input_ts_function_decl_tree_pointers (ib, data_in, expr); 1081*38fd1498Szrj 1082*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON)) 1083*38fd1498Szrj lto_input_ts_type_common_tree_pointers (ib, data_in, expr); 1084*38fd1498Szrj 1085*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON)) 1086*38fd1498Szrj lto_input_ts_type_non_common_tree_pointers (ib, data_in, expr); 1087*38fd1498Szrj 1088*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_LIST)) 1089*38fd1498Szrj lto_input_ts_list_tree_pointers (ib, data_in, expr); 1090*38fd1498Szrj 1091*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_VEC)) 1092*38fd1498Szrj lto_input_ts_vec_tree_pointers (ib, data_in, expr); 1093*38fd1498Szrj 1094*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_EXP)) 1095*38fd1498Szrj lto_input_ts_exp_tree_pointers (ib, data_in, expr); 1096*38fd1498Szrj 1097*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_BLOCK)) 1098*38fd1498Szrj lto_input_ts_block_tree_pointers (ib, data_in, expr); 1099*38fd1498Szrj 1100*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_BINFO)) 1101*38fd1498Szrj lto_input_ts_binfo_tree_pointers (ib, data_in, expr); 1102*38fd1498Szrj 1103*38fd1498Szrj if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) 1104*38fd1498Szrj lto_input_ts_constructor_tree_pointers (ib, data_in, expr); 1105*38fd1498Szrj 1106*38fd1498Szrj if (code == OMP_CLAUSE) 1107*38fd1498Szrj lto_input_ts_omp_clause_tree_pointers (ib, data_in, expr); 1108*38fd1498Szrj } 1109*38fd1498Szrj 1110*38fd1498Szrj 1111*38fd1498Szrj /* Read an index IX from input block IB and return the tree node at 1112*38fd1498Szrj DATA_IN->FILE_DATA->GLOBALS_INDEX[IX]. */ 1113*38fd1498Szrj 1114*38fd1498Szrj tree 1115*38fd1498Szrj streamer_get_pickled_tree (struct lto_input_block *ib, struct data_in *data_in) 1116*38fd1498Szrj { 1117*38fd1498Szrj unsigned HOST_WIDE_INT ix; 1118*38fd1498Szrj tree result; 1119*38fd1498Szrj enum LTO_tags expected_tag; 1120*38fd1498Szrj 1121*38fd1498Szrj ix = streamer_read_uhwi (ib); 1122*38fd1498Szrj expected_tag = streamer_read_enum (ib, LTO_tags, LTO_NUM_TAGS); 1123*38fd1498Szrj 1124*38fd1498Szrj result = streamer_tree_cache_get_tree (data_in->reader_cache, ix); 1125*38fd1498Szrj gcc_assert (result 1126*38fd1498Szrj && TREE_CODE (result) == lto_tag_to_tree_code (expected_tag)); 1127*38fd1498Szrj 1128*38fd1498Szrj return result; 1129*38fd1498Szrj } 1130