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