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