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