1 1.1 mrg /* Write the GIMPLE representation to a file stream. 2 1.1 mrg 3 1.1 mrg Copyright (C) 2009-2022 Free Software Foundation, Inc. 4 1.1 mrg Contributed by Kenneth Zadeck <zadeck (at) naturalbridge.com> 5 1.1 mrg Re-implemented by Diego Novillo <dnovillo (at) google.com> 6 1.1 mrg 7 1.1 mrg This file is part of GCC. 8 1.1 mrg 9 1.1 mrg GCC is free software; you can redistribute it and/or modify it under 10 1.1 mrg the terms of the GNU General Public License as published by the Free 11 1.1 mrg Software Foundation; either version 3, or (at your option) any later 12 1.1 mrg version. 13 1.1 mrg 14 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 15 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 17 1.1 mrg for more details. 18 1.1 mrg 19 1.1 mrg You should have received a copy of the GNU General Public License 20 1.1 mrg along with GCC; see the file COPYING3. If not see 21 1.1 mrg <http://www.gnu.org/licenses/>. */ 22 1.1 mrg 23 1.1 mrg #include "config.h" 24 1.1 mrg #include "system.h" 25 1.1 mrg #include "coretypes.h" 26 1.1 mrg #include "backend.h" 27 1.1 mrg #include "target.h" 28 1.1 mrg #include "rtl.h" 29 1.1 mrg #include "tree.h" 30 1.1 mrg #include "gimple.h" 31 1.1 mrg #include "tree-pass.h" 32 1.1 mrg #include "ssa.h" 33 1.1 mrg #include "gimple-streamer.h" 34 1.1 mrg #include "alias.h" 35 1.1 mrg #include "stor-layout.h" 36 1.1 mrg #include "gimple-iterator.h" 37 1.1 mrg #include "except.h" 38 1.1 mrg #include "lto-symtab.h" 39 1.1 mrg #include "cgraph.h" 40 1.1 mrg #include "cfgloop.h" 41 1.1 mrg #include "builtins.h" 42 1.1 mrg #include "gomp-constants.h" 43 1.1 mrg #include "debug.h" 44 1.1 mrg #include "omp-offload.h" 45 1.1 mrg #include "print-tree.h" 46 1.1 mrg #include "tree-dfa.h" 47 1.1 mrg #include "file-prefix-map.h" /* remap_debug_filename() */ 48 1.1 mrg #include "output.h" 49 1.1 mrg #include "ipa-utils.h" 50 1.1 mrg #include "toplev.h" 51 1.1 mrg 52 1.1 mrg 53 1.1 mrg static void lto_write_tree (struct output_block*, tree, bool); 54 1.1 mrg 55 1.1 mrg /* Clear the line info stored in DATA_IN. */ 56 1.1 mrg 57 1.1 mrg static void 58 1.1 mrg clear_line_info (struct output_block *ob) 59 1.1 mrg { 60 1.1 mrg ob->current_file = NULL; 61 1.1 mrg ob->current_line = 0; 62 1.1 mrg ob->current_col = 0; 63 1.1 mrg ob->current_sysp = false; 64 1.1 mrg ob->reset_locus = true; 65 1.1 mrg ob->emit_pwd = true; 66 1.1 mrg /* Initialize to something that will never appear as block, 67 1.1 mrg so that the first location with block in a function etc. 68 1.1 mrg always streams a change_block bit and the first block. */ 69 1.1 mrg ob->current_block = void_node; 70 1.1 mrg } 71 1.1 mrg 72 1.1 mrg 73 1.1 mrg /* Create the output block and return it. SECTION_TYPE is 74 1.1 mrg LTO_section_function_body or LTO_static_initializer. */ 75 1.1 mrg 76 1.1 mrg struct output_block * 77 1.1 mrg create_output_block (enum lto_section_type section_type) 78 1.1 mrg { 79 1.1 mrg struct output_block *ob = XCNEW (struct output_block); 80 1.1 mrg if (streamer_dump_file) 81 1.1 mrg fprintf (streamer_dump_file, "Creating output block for %s\n", 82 1.1 mrg lto_section_name[section_type]); 83 1.1 mrg 84 1.1 mrg ob->section_type = section_type; 85 1.1 mrg ob->decl_state = lto_get_out_decl_state (); 86 1.1 mrg /* Only global decl stream in non-wpa will ever be considered by tree 87 1.1 mrg merging. */ 88 1.1 mrg if (!flag_wpa && section_type == LTO_section_decls) 89 1.1 mrg ob->local_trees = new (hash_set <tree>); 90 1.1 mrg ob->main_stream = XCNEW (struct lto_output_stream); 91 1.1 mrg ob->string_stream = XCNEW (struct lto_output_stream); 92 1.1 mrg ob->writer_cache = streamer_tree_cache_create (!flag_wpa, true, false); 93 1.1 mrg 94 1.1 mrg if (section_type == LTO_section_function_body) 95 1.1 mrg ob->cfg_stream = XCNEW (struct lto_output_stream); 96 1.1 mrg 97 1.1 mrg clear_line_info (ob); 98 1.1 mrg 99 1.1 mrg ob->string_hash_table = new hash_table<string_slot_hasher> (37); 100 1.1 mrg gcc_obstack_init (&ob->obstack); 101 1.1 mrg 102 1.1 mrg return ob; 103 1.1 mrg } 104 1.1 mrg 105 1.1 mrg 106 1.1 mrg /* Destroy the output block OB. */ 107 1.1 mrg 108 1.1 mrg void 109 1.1 mrg destroy_output_block (struct output_block *ob) 110 1.1 mrg { 111 1.1 mrg enum lto_section_type section_type = ob->section_type; 112 1.1 mrg 113 1.1 mrg delete ob->string_hash_table; 114 1.1 mrg ob->string_hash_table = NULL; 115 1.1 mrg delete ob->local_trees; 116 1.1 mrg 117 1.1 mrg free (ob->main_stream); 118 1.1 mrg free (ob->string_stream); 119 1.1 mrg if (section_type == LTO_section_function_body) 120 1.1 mrg free (ob->cfg_stream); 121 1.1 mrg 122 1.1 mrg streamer_tree_cache_delete (ob->writer_cache); 123 1.1 mrg obstack_free (&ob->obstack, NULL); 124 1.1 mrg 125 1.1 mrg free (ob); 126 1.1 mrg } 127 1.1 mrg 128 1.1 mrg 129 1.1 mrg /* Wrapper around variably_modified_type_p avoiding type modification 130 1.1 mrg during WPA streaming. */ 131 1.1 mrg 132 1.1 mrg static bool 133 1.1 mrg lto_variably_modified_type_p (tree type) 134 1.1 mrg { 135 1.1 mrg return (in_lto_p 136 1.1 mrg ? TYPE_LANG_FLAG_0 (TYPE_MAIN_VARIANT (type)) 137 1.1 mrg : variably_modified_type_p (type, NULL_TREE)); 138 1.1 mrg } 139 1.1 mrg 140 1.1 mrg 141 1.1 mrg /* Return true if tree node T is written to various tables. For these 142 1.1 mrg nodes, we sometimes want to write their phyiscal representation 143 1.1 mrg (via lto_output_tree), and sometimes we need to emit an index 144 1.1 mrg reference into a table (via lto_output_tree_ref). */ 145 1.1 mrg 146 1.1 mrg static bool 147 1.1 mrg tree_is_indexable (tree t) 148 1.1 mrg { 149 1.1 mrg /* Parameters and return values of functions of variably modified types 150 1.1 mrg must go to global stream, because they may be used in the type 151 1.1 mrg definition. */ 152 1.1 mrg if ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL) 153 1.1 mrg && DECL_CONTEXT (t)) 154 1.1 mrg return lto_variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t))); 155 1.1 mrg /* IMPORTED_DECL is put into BLOCK and thus it never can be shared. 156 1.1 mrg We should no longer need to stream it. */ 157 1.1 mrg else if (TREE_CODE (t) == IMPORTED_DECL) 158 1.1 mrg gcc_unreachable (); 159 1.1 mrg else if (TREE_CODE (t) == LABEL_DECL) 160 1.1 mrg return FORCED_LABEL (t) || DECL_NONLOCAL (t); 161 1.1 mrg else if (((VAR_P (t) && !TREE_STATIC (t)) 162 1.1 mrg || TREE_CODE (t) == TYPE_DECL 163 1.1 mrg || TREE_CODE (t) == CONST_DECL 164 1.1 mrg || TREE_CODE (t) == NAMELIST_DECL) 165 1.1 mrg && decl_function_context (t)) 166 1.1 mrg return false; 167 1.1 mrg else if (TREE_CODE (t) == DEBUG_EXPR_DECL) 168 1.1 mrg return false; 169 1.1 mrg /* Variably modified types need to be streamed alongside function 170 1.1 mrg bodies because they can refer to local entities. Together with 171 1.1 mrg them we have to localize their members as well. 172 1.1 mrg ??? In theory that includes non-FIELD_DECLs as well. */ 173 1.1 mrg else if (TYPE_P (t) 174 1.1 mrg && lto_variably_modified_type_p (t)) 175 1.1 mrg return false; 176 1.1 mrg else if (TREE_CODE (t) == FIELD_DECL 177 1.1 mrg && lto_variably_modified_type_p (DECL_CONTEXT (t))) 178 1.1 mrg return false; 179 1.1 mrg else 180 1.1 mrg return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME); 181 1.1 mrg } 182 1.1 mrg 183 1.1 mrg 184 1.1 mrg /* Output info about new location into bitpack BP. 185 1.1 mrg After outputting bitpack, lto_output_location_data has 186 1.1 mrg to be done to output actual data. */ 187 1.1 mrg 188 1.1 mrg static void 189 1.1 mrg lto_output_location_1 (struct output_block *ob, struct bitpack_d *bp, 190 1.1 mrg location_t orig_loc, bool block_p) 191 1.1 mrg { 192 1.1 mrg location_t loc = LOCATION_LOCUS (orig_loc); 193 1.1 mrg 194 1.1 mrg if (loc >= RESERVED_LOCATION_COUNT) 195 1.1 mrg { 196 1.1 mrg expanded_location xloc = expand_location (loc); 197 1.1 mrg 198 1.1 mrg if (ob->reset_locus) 199 1.1 mrg { 200 1.1 mrg if (xloc.file == NULL) 201 1.1 mrg ob->current_file = ""; 202 1.1 mrg if (xloc.line == 0) 203 1.1 mrg ob->current_line = 1; 204 1.1 mrg if (xloc.column == 0) 205 1.1 mrg ob->current_col = 1; 206 1.1 mrg ob->reset_locus = false; 207 1.1 mrg } 208 1.1 mrg 209 1.1 mrg /* As RESERVED_LOCATION_COUNT is 2, we can use the spare value of 210 1.1 mrg 3 without wasting additional bits to signalize file change. 211 1.1 mrg If RESERVED_LOCATION_COUNT changes, reconsider this. */ 212 1.1 mrg gcc_checking_assert (RESERVED_LOCATION_COUNT == 2); 213 1.1 mrg bp_pack_int_in_range (bp, 0, RESERVED_LOCATION_COUNT + 1, 214 1.1 mrg RESERVED_LOCATION_COUNT 215 1.1 mrg + (ob->current_file != xloc.file)); 216 1.1 mrg 217 1.1 mrg bp_pack_value (bp, ob->current_line != xloc.line, 1); 218 1.1 mrg bp_pack_value (bp, ob->current_col != xloc.column, 1); 219 1.1 mrg 220 1.1 mrg if (ob->current_file != xloc.file) 221 1.1 mrg { 222 1.1 mrg bool stream_pwd = false; 223 1.1 mrg const char *remapped = remap_debug_filename (xloc.file); 224 1.1 mrg if (ob->emit_pwd && remapped && !IS_ABSOLUTE_PATH (remapped)) 225 1.1 mrg { 226 1.1 mrg stream_pwd = true; 227 1.1 mrg ob->emit_pwd = false; 228 1.1 mrg } 229 1.1 mrg bp_pack_value (bp, stream_pwd, 1); 230 1.1 mrg if (stream_pwd) 231 1.1 mrg bp_pack_string (ob, bp, get_src_pwd (), true); 232 1.1 mrg bp_pack_string (ob, bp, remapped, true); 233 1.1 mrg bp_pack_value (bp, xloc.sysp, 1); 234 1.1 mrg } 235 1.1 mrg ob->current_file = xloc.file; 236 1.1 mrg ob->current_sysp = xloc.sysp; 237 1.1 mrg 238 1.1 mrg if (ob->current_line != xloc.line) 239 1.1 mrg bp_pack_var_len_unsigned (bp, xloc.line); 240 1.1 mrg ob->current_line = xloc.line; 241 1.1 mrg 242 1.1 mrg if (ob->current_col != xloc.column) 243 1.1 mrg bp_pack_var_len_unsigned (bp, xloc.column); 244 1.1 mrg ob->current_col = xloc.column; 245 1.1 mrg } 246 1.1 mrg else 247 1.1 mrg bp_pack_int_in_range (bp, 0, RESERVED_LOCATION_COUNT + 1, loc); 248 1.1 mrg 249 1.1 mrg if (block_p) 250 1.1 mrg { 251 1.1 mrg tree block = LOCATION_BLOCK (orig_loc); 252 1.1 mrg bp_pack_value (bp, ob->current_block != block, 1); 253 1.1 mrg streamer_write_bitpack (bp); 254 1.1 mrg if (ob->current_block != block) 255 1.1 mrg lto_output_tree (ob, block, true, true); 256 1.1 mrg ob->current_block = block; 257 1.1 mrg } 258 1.1 mrg } 259 1.1 mrg 260 1.1 mrg /* Output info about new location into bitpack BP. 261 1.1 mrg After outputting bitpack, lto_output_location_data has 262 1.1 mrg to be done to output actual data. */ 263 1.1 mrg 264 1.1 mrg void 265 1.1 mrg lto_output_location (struct output_block *ob, struct bitpack_d *bp, 266 1.1 mrg location_t loc) 267 1.1 mrg { 268 1.1 mrg lto_output_location_1 (ob, bp, loc, false); 269 1.1 mrg } 270 1.1 mrg 271 1.1 mrg /* Output info about new location into bitpack BP. 272 1.1 mrg After outputting bitpack, lto_output_location_data has 273 1.1 mrg to be done to output actual data. Like lto_output_location, but 274 1.1 mrg additionally output LOCATION_BLOCK info too and write the BP bitpack. */ 275 1.1 mrg 276 1.1 mrg void 277 1.1 mrg lto_output_location_and_block (struct output_block *ob, struct bitpack_d *bp, 278 1.1 mrg location_t loc) 279 1.1 mrg { 280 1.1 mrg lto_output_location_1 (ob, bp, loc, true); 281 1.1 mrg } 282 1.1 mrg 283 1.1 mrg 284 1.1 mrg /* Lookup NAME in ENCODER. If NAME is not found, create a new entry in 285 1.1 mrg ENCODER for NAME with the next available index of ENCODER, then 286 1.1 mrg print the index to OBS. 287 1.1 mrg Return the index. */ 288 1.1 mrg 289 1.1 mrg 290 1.1 mrg static unsigned 291 1.1 mrg lto_get_index (struct lto_tree_ref_encoder *encoder, tree t) 292 1.1 mrg { 293 1.1 mrg bool existed_p; 294 1.1 mrg 295 1.1 mrg unsigned int &index 296 1.1 mrg = encoder->tree_hash_table->get_or_insert (t, &existed_p); 297 1.1 mrg if (!existed_p) 298 1.1 mrg { 299 1.1 mrg index = encoder->trees.length (); 300 1.1 mrg if (streamer_dump_file) 301 1.1 mrg { 302 1.1 mrg print_node_brief (streamer_dump_file, " Encoding indexable ", 303 1.1 mrg t, 4); 304 1.1 mrg fprintf (streamer_dump_file, " as %i \n", index); 305 1.1 mrg } 306 1.1 mrg encoder->trees.safe_push (t); 307 1.1 mrg } 308 1.1 mrg 309 1.1 mrg return index; 310 1.1 mrg } 311 1.1 mrg 312 1.1 mrg 313 1.1 mrg /* If EXPR is an indexable tree node, output a reference to it to 314 1.1 mrg output block OB. Otherwise, output the physical representation of 315 1.1 mrg EXPR to OB. */ 316 1.1 mrg 317 1.1 mrg static void 318 1.1 mrg lto_indexable_tree_ref (struct output_block *ob, tree expr, 319 1.1 mrg enum LTO_tags *tag, unsigned *index) 320 1.1 mrg { 321 1.1 mrg gcc_checking_assert (tree_is_indexable (expr)); 322 1.1 mrg 323 1.1 mrg if (TREE_CODE (expr) == SSA_NAME) 324 1.1 mrg { 325 1.1 mrg *tag = LTO_ssa_name_ref; 326 1.1 mrg *index = SSA_NAME_VERSION (expr); 327 1.1 mrg } 328 1.1 mrg else 329 1.1 mrg { 330 1.1 mrg *tag = LTO_global_stream_ref; 331 1.1 mrg *index = lto_get_index (&ob->decl_state->streams[LTO_DECL_STREAM], expr); 332 1.1 mrg } 333 1.1 mrg } 334 1.1 mrg 335 1.1 mrg 336 1.1 mrg /* Output a static or extern var DECL to OBS. */ 337 1.1 mrg 338 1.1 mrg void 339 1.1 mrg lto_output_var_decl_ref (struct lto_out_decl_state *decl_state, 340 1.1 mrg struct lto_output_stream * obs, tree decl) 341 1.1 mrg { 342 1.1 mrg gcc_checking_assert (TREE_CODE (decl) == VAR_DECL); 343 1.1 mrg streamer_write_uhwi_stream 344 1.1 mrg (obs, lto_get_index (&decl_state->streams[LTO_DECL_STREAM], 345 1.1 mrg decl)); 346 1.1 mrg } 347 1.1 mrg 348 1.1 mrg 349 1.1 mrg /* Output a static or extern var DECL to OBS. */ 350 1.1 mrg 351 1.1 mrg void 352 1.1 mrg lto_output_fn_decl_ref (struct lto_out_decl_state *decl_state, 353 1.1 mrg struct lto_output_stream * obs, tree decl) 354 1.1 mrg { 355 1.1 mrg gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL); 356 1.1 mrg streamer_write_uhwi_stream 357 1.1 mrg (obs, lto_get_index (&decl_state->streams[LTO_DECL_STREAM], decl)); 358 1.1 mrg } 359 1.1 mrg 360 1.1 mrg /* Return true if EXPR is a tree node that can be written to disk. */ 361 1.1 mrg 362 1.1 mrg static inline bool 363 1.1 mrg lto_is_streamable (tree expr) 364 1.1 mrg { 365 1.1 mrg enum tree_code code = TREE_CODE (expr); 366 1.1 mrg 367 1.1 mrg /* Notice that we reject SSA_NAMEs as well. We only emit the SSA 368 1.1 mrg name version in lto_output_tree_ref (see output_ssa_names). */ 369 1.1 mrg return !is_lang_specific (expr) 370 1.1 mrg && code != SSA_NAME 371 1.1 mrg && code != LANG_TYPE 372 1.1 mrg && code != MODIFY_EXPR 373 1.1 mrg && code != INIT_EXPR 374 1.1 mrg && code != TARGET_EXPR 375 1.1 mrg && code != BIND_EXPR 376 1.1 mrg && code != WITH_CLEANUP_EXPR 377 1.1 mrg && code != STATEMENT_LIST 378 1.1 mrg && (code == CASE_LABEL_EXPR 379 1.1 mrg || code == DECL_EXPR 380 1.1 mrg || TREE_CODE_CLASS (code) != tcc_statement); 381 1.1 mrg } 382 1.1 mrg 383 1.1 mrg /* Very rough estimate of streaming size of the initializer. If we ignored 384 1.1 mrg presence of strings, we could simply just count number of non-indexable 385 1.1 mrg tree nodes and number of references to indexable nodes. Strings however 386 1.1 mrg may be very large and we do not want to dump them int othe global stream. 387 1.1 mrg 388 1.1 mrg Count the size of initializer until the size in DATA is positive. */ 389 1.1 mrg 390 1.1 mrg static tree 391 1.1 mrg subtract_estimated_size (tree *tp, int *ws, void *data) 392 1.1 mrg { 393 1.1 mrg long *sum = (long *)data; 394 1.1 mrg if (tree_is_indexable (*tp)) 395 1.1 mrg { 396 1.1 mrg /* Indexable tree is one reference to global stream. 397 1.1 mrg Guess it may be about 4 bytes. */ 398 1.1 mrg *sum -= 4; 399 1.1 mrg *ws = 0; 400 1.1 mrg } 401 1.1 mrg /* String table entry + base of tree node needs to be streamed. */ 402 1.1 mrg if (TREE_CODE (*tp) == STRING_CST) 403 1.1 mrg *sum -= TREE_STRING_LENGTH (*tp) + 8; 404 1.1 mrg else 405 1.1 mrg { 406 1.1 mrg /* Identifiers are also variable length but should not appear 407 1.1 mrg naked in constructor. */ 408 1.1 mrg gcc_checking_assert (TREE_CODE (*tp) != IDENTIFIER_NODE); 409 1.1 mrg /* We do not really make attempt to work out size of pickled tree, as 410 1.1 mrg it is very variable. Make it bigger than the reference. */ 411 1.1 mrg *sum -= 16; 412 1.1 mrg } 413 1.1 mrg if (*sum < 0) 414 1.1 mrg return *tp; 415 1.1 mrg return NULL_TREE; 416 1.1 mrg } 417 1.1 mrg 418 1.1 mrg 419 1.1 mrg /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */ 420 1.1 mrg 421 1.1 mrg static tree 422 1.1 mrg get_symbol_initial_value (lto_symtab_encoder_t encoder, tree expr) 423 1.1 mrg { 424 1.1 mrg gcc_checking_assert (DECL_P (expr) 425 1.1 mrg && TREE_CODE (expr) != FUNCTION_DECL 426 1.1 mrg && TREE_CODE (expr) != TRANSLATION_UNIT_DECL); 427 1.1 mrg 428 1.1 mrg /* Handle DECL_INITIAL for symbols. */ 429 1.1 mrg tree initial = DECL_INITIAL (expr); 430 1.1 mrg if (VAR_P (expr) 431 1.1 mrg && (TREE_STATIC (expr) || DECL_EXTERNAL (expr)) 432 1.1 mrg && !DECL_IN_CONSTANT_POOL (expr) 433 1.1 mrg && initial) 434 1.1 mrg { 435 1.1 mrg varpool_node *vnode; 436 1.1 mrg /* Extra section needs about 30 bytes; do not produce it for simple 437 1.1 mrg scalar values. */ 438 1.1 mrg if (!(vnode = varpool_node::get (expr)) 439 1.1 mrg || !lto_symtab_encoder_encode_initializer_p (encoder, vnode)) 440 1.1 mrg initial = error_mark_node; 441 1.1 mrg if (initial != error_mark_node) 442 1.1 mrg { 443 1.1 mrg long max_size = 30; 444 1.1 mrg if (walk_tree (&initial, subtract_estimated_size, (void *)&max_size, 445 1.1 mrg NULL)) 446 1.1 mrg initial = error_mark_node; 447 1.1 mrg } 448 1.1 mrg } 449 1.1 mrg 450 1.1 mrg return initial; 451 1.1 mrg } 452 1.1 mrg 453 1.1 mrg 454 1.1 mrg /* Output reference to tree T to the stream. 455 1.1 mrg Assume that T is already in encoder cache. 456 1.1 mrg This is used to stream tree bodies where we know the DFS walk arranged 457 1.1 mrg everything to cache. Must be matched with stream_read_tree_ref. */ 458 1.1 mrg 459 1.1 mrg void 460 1.1 mrg stream_write_tree_ref (struct output_block *ob, tree t) 461 1.1 mrg { 462 1.1 mrg if (!t) 463 1.1 mrg streamer_write_zero (ob); 464 1.1 mrg else 465 1.1 mrg { 466 1.1 mrg unsigned int ix; 467 1.1 mrg bool existed_p = streamer_tree_cache_lookup (ob->writer_cache, t, &ix); 468 1.1 mrg if (existed_p) 469 1.1 mrg streamer_write_hwi (ob, ix + 1); 470 1.1 mrg else 471 1.1 mrg { 472 1.1 mrg enum LTO_tags tag; 473 1.1 mrg unsigned ix; 474 1.1 mrg int id = 0; 475 1.1 mrg 476 1.1 mrg lto_indexable_tree_ref (ob, t, &tag, &ix); 477 1.1 mrg if (tag == LTO_ssa_name_ref) 478 1.1 mrg id = 1; 479 1.1 mrg else 480 1.1 mrg gcc_checking_assert (tag == LTO_global_stream_ref); 481 1.1 mrg streamer_write_hwi (ob, -(int)(ix * 2 + id + 1)); 482 1.1 mrg } 483 1.1 mrg if (streamer_debugging) 484 1.1 mrg streamer_write_uhwi (ob, TREE_CODE (t)); 485 1.1 mrg } 486 1.1 mrg } 487 1.1 mrg 488 1.1 mrg 489 1.1 mrg 490 1.1 mrg /* Write a physical representation of tree node EXPR to output block 491 1.1 mrg OB. If REF_P is true, the leaves of EXPR are emitted as references 492 1.1 mrg via lto_output_tree_ref. IX is the index into the streamer cache 493 1.1 mrg where EXPR is stored. */ 494 1.1 mrg 495 1.1 mrg static void 496 1.1 mrg lto_write_tree_1 (struct output_block *ob, tree expr, bool ref_p) 497 1.1 mrg { 498 1.1 mrg if (streamer_dump_file) 499 1.1 mrg { 500 1.1 mrg print_node_brief (streamer_dump_file, " Streaming body of ", 501 1.1 mrg expr, 4); 502 1.1 mrg fprintf (streamer_dump_file, " to %s\n", 503 1.1 mrg lto_section_name[ob->section_type]); 504 1.1 mrg } 505 1.1 mrg 506 1.1 mrg /* Pack all the non-pointer fields in EXPR into a bitpack and write 507 1.1 mrg the resulting bitpack. */ 508 1.1 mrg streamer_write_tree_bitfields (ob, expr); 509 1.1 mrg 510 1.1 mrg /* Write all the pointer fields in EXPR. */ 511 1.1 mrg streamer_write_tree_body (ob, expr); 512 1.1 mrg 513 1.1 mrg /* Write any LTO-specific data to OB. */ 514 1.1 mrg if (DECL_P (expr) 515 1.1 mrg && TREE_CODE (expr) != FUNCTION_DECL 516 1.1 mrg && TREE_CODE (expr) != TRANSLATION_UNIT_DECL) 517 1.1 mrg { 518 1.1 mrg /* Handle DECL_INITIAL for symbols. */ 519 1.1 mrg tree initial = get_symbol_initial_value 520 1.1 mrg (ob->decl_state->symtab_node_encoder, expr); 521 1.1 mrg stream_write_tree (ob, initial, ref_p); 522 1.1 mrg } 523 1.1 mrg 524 1.1 mrg /* Stream references to early generated DIEs. Keep in sync with the 525 1.1 mrg trees handled in dwarf2out_die_ref_for_decl. */ 526 1.1 mrg if ((DECL_P (expr) 527 1.1 mrg && TREE_CODE (expr) != FIELD_DECL 528 1.1 mrg && TREE_CODE (expr) != DEBUG_EXPR_DECL 529 1.1 mrg && TREE_CODE (expr) != TYPE_DECL) 530 1.1 mrg || TREE_CODE (expr) == BLOCK) 531 1.1 mrg { 532 1.1 mrg const char *sym; 533 1.1 mrg unsigned HOST_WIDE_INT off; 534 1.1 mrg if (debug_info_level > DINFO_LEVEL_NONE 535 1.1 mrg && debug_hooks->die_ref_for_decl (expr, &sym, &off)) 536 1.1 mrg { 537 1.1 mrg streamer_write_string (ob, ob->main_stream, sym, true); 538 1.1 mrg streamer_write_uhwi (ob, off); 539 1.1 mrg } 540 1.1 mrg else 541 1.1 mrg streamer_write_string (ob, ob->main_stream, NULL, true); 542 1.1 mrg } 543 1.1 mrg } 544 1.1 mrg 545 1.1 mrg /* Write a physical representation of tree node EXPR to output block 546 1.1 mrg OB. If REF_P is true, the leaves of EXPR are emitted as references 547 1.1 mrg via lto_output_tree_ref. IX is the index into the streamer cache 548 1.1 mrg where EXPR is stored. */ 549 1.1 mrg 550 1.1 mrg static void 551 1.1 mrg lto_write_tree (struct output_block *ob, tree expr, bool ref_p) 552 1.1 mrg { 553 1.1 mrg if (!lto_is_streamable (expr)) 554 1.1 mrg internal_error ("tree code %qs is not supported in LTO streams", 555 1.1 mrg get_tree_code_name (TREE_CODE (expr))); 556 1.1 mrg 557 1.1 mrg /* Write the header, containing everything needed to materialize 558 1.1 mrg EXPR on the reading side. */ 559 1.1 mrg streamer_write_tree_header (ob, expr); 560 1.1 mrg 561 1.1 mrg lto_write_tree_1 (ob, expr, ref_p); 562 1.1 mrg } 563 1.1 mrg 564 1.1 mrg /* Emit the physical representation of tree node EXPR to output block OB, 565 1.1 mrg If THIS_REF_P is true, the leaves of EXPR are emitted as references via 566 1.1 mrg lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */ 567 1.1 mrg 568 1.1 mrg static void 569 1.1 mrg lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash, 570 1.1 mrg bool ref_p, bool this_ref_p) 571 1.1 mrg { 572 1.1 mrg unsigned ix; 573 1.1 mrg 574 1.1 mrg gcc_checking_assert (expr != NULL_TREE 575 1.1 mrg && !(this_ref_p && tree_is_indexable (expr))); 576 1.1 mrg 577 1.1 mrg bool exists_p = streamer_tree_cache_insert (ob->writer_cache, 578 1.1 mrg expr, hash, &ix); 579 1.1 mrg gcc_assert (!exists_p); 580 1.1 mrg if (TREE_CODE (expr) == INTEGER_CST 581 1.1 mrg && !TREE_OVERFLOW (expr)) 582 1.1 mrg { 583 1.1 mrg /* Shared INTEGER_CST nodes are special because they need their 584 1.1 mrg original type to be materialized by the reader (to implement 585 1.1 mrg TYPE_CACHED_VALUES). */ 586 1.1 mrg streamer_write_integer_cst (ob, expr); 587 1.1 mrg } 588 1.1 mrg else 589 1.1 mrg { 590 1.1 mrg /* This is the first time we see EXPR, write its fields 591 1.1 mrg to OB. */ 592 1.1 mrg lto_write_tree (ob, expr, ref_p); 593 1.1 mrg } 594 1.1 mrg } 595 1.1 mrg 596 1.1 mrg class DFS 597 1.1 mrg { 598 1.1 mrg public: 599 1.1 mrg DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p, 600 1.1 mrg bool single_p); 601 1.1 mrg ~DFS (); 602 1.1 mrg 603 1.1 mrg struct scc_entry 604 1.1 mrg { 605 1.1 mrg tree t; 606 1.1 mrg hashval_t hash; 607 1.1 mrg }; 608 1.1 mrg auto_vec<scc_entry,32> sccstack; 609 1.1 mrg 610 1.1 mrg private: 611 1.1 mrg struct sccs 612 1.1 mrg { 613 1.1 mrg unsigned int dfsnum; 614 1.1 mrg unsigned int low; 615 1.1 mrg }; 616 1.1 mrg struct worklist 617 1.1 mrg { 618 1.1 mrg tree expr; 619 1.1 mrg sccs *from_state; 620 1.1 mrg sccs *cstate; 621 1.1 mrg bool ref_p; 622 1.1 mrg bool this_ref_p; 623 1.1 mrg }; 624 1.1 mrg /* Maximum index of scc stack containing a local tree. */ 625 1.1 mrg int max_local_entry; 626 1.1 mrg 627 1.1 mrg static int scc_entry_compare (const void *, const void *); 628 1.1 mrg 629 1.1 mrg void DFS_write_tree_body (struct output_block *ob, 630 1.1 mrg tree expr, sccs *expr_state, bool ref_p); 631 1.1 mrg 632 1.1 mrg void DFS_write_tree (struct output_block *ob, sccs *from_state, 633 1.1 mrg tree expr, bool ref_p, bool this_ref_p); 634 1.1 mrg 635 1.1 mrg hashval_t 636 1.1 mrg hash_scc (struct output_block *ob, unsigned first, unsigned size, 637 1.1 mrg bool ref_p, bool this_ref_p); 638 1.1 mrg 639 1.1 mrg hash_map<tree, sccs *> sccstate; 640 1.1 mrg auto_vec<worklist, 32> worklist_vec; 641 1.1 mrg struct obstack sccstate_obstack; 642 1.1 mrg }; 643 1.1 mrg 644 1.1 mrg /* Return true if type can not be merged with structurally same tree in 645 1.1 mrg other translation unit. During stream out this information is propagated 646 1.1 mrg to all trees referring to T and they are not streamed with additional 647 1.1 mrg information needed by the tree merging in lto-common.cc (in particular, 648 1.1 mrg scc hash codes are not streamed). 649 1.1 mrg 650 1.1 mrg TRANSLATION_UNIT_DECL is handled specially since references to it does 651 1.1 mrg not make other trees local as well. */ 652 1.1 mrg 653 1.1 mrg static bool 654 1.1 mrg local_tree_p (tree t) 655 1.1 mrg { 656 1.1 mrg switch (TREE_CODE (t)) 657 1.1 mrg { 658 1.1 mrg case LABEL_DECL: 659 1.1 mrg return true; 660 1.1 mrg case NAMESPACE_DECL: 661 1.1 mrg return !DECL_NAME (t); 662 1.1 mrg case VAR_DECL: 663 1.1 mrg case FUNCTION_DECL: 664 1.1 mrg return !TREE_PUBLIC (t) && !DECL_EXTERNAL (t); 665 1.1 mrg case RECORD_TYPE: 666 1.1 mrg case UNION_TYPE: 667 1.1 mrg case ENUMERAL_TYPE: 668 1.1 mrg /* Anonymous namespace types are local. 669 1.1 mrg Only work hard for main variants; 670 1.1 mrg variant types will inherit locality. */ 671 1.1 mrg return TYPE_MAIN_VARIANT (t) == t 672 1.1 mrg && odr_type_p (t) && type_with_linkage_p (t) 673 1.1 mrg && type_in_anonymous_namespace_p (t); 674 1.1 mrg default: 675 1.1 mrg return false; 676 1.1 mrg } 677 1.1 mrg } 678 1.1 mrg 679 1.1 mrg /* Emit the physical representation of tree node EXPR to output block OB, 680 1.1 mrg using depth-first search on the subgraph. If THIS_REF_P is true, the 681 1.1 mrg leaves of EXPR are emitted as references via lto_output_tree_ref. 682 1.1 mrg REF_P is used for streaming siblings of EXPR. If SINGLE_P is true, 683 1.1 mrg this is for a rewalk of a single leaf SCC. */ 684 1.1 mrg 685 1.1 mrg DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p, 686 1.1 mrg bool single_p) 687 1.1 mrg { 688 1.1 mrg unsigned int next_dfs_num = 1; 689 1.1 mrg 690 1.1 mrg max_local_entry = -1; 691 1.1 mrg gcc_obstack_init (&sccstate_obstack); 692 1.1 mrg DFS_write_tree (ob, NULL, expr, ref_p, this_ref_p); 693 1.1 mrg while (!worklist_vec.is_empty ()) 694 1.1 mrg { 695 1.1 mrg worklist &w = worklist_vec.last (); 696 1.1 mrg expr = w.expr; 697 1.1 mrg sccs *from_state = w.from_state; 698 1.1 mrg sccs *cstate = w.cstate; 699 1.1 mrg ref_p = w.ref_p; 700 1.1 mrg this_ref_p = w.this_ref_p; 701 1.1 mrg if (cstate == NULL) 702 1.1 mrg { 703 1.1 mrg sccs **slot = &sccstate.get_or_insert (expr); 704 1.1 mrg cstate = *slot; 705 1.1 mrg if (cstate) 706 1.1 mrg { 707 1.1 mrg gcc_checking_assert (from_state); 708 1.1 mrg if (cstate->dfsnum < from_state->dfsnum) 709 1.1 mrg from_state->low = MIN (cstate->dfsnum, from_state->low); 710 1.1 mrg worklist_vec.pop (); 711 1.1 mrg continue; 712 1.1 mrg } 713 1.1 mrg 714 1.1 mrg scc_entry e = { expr, 0 }; 715 1.1 mrg /* Not yet visited. DFS recurse and push it onto the stack. */ 716 1.1 mrg *slot = cstate = XOBNEW (&sccstate_obstack, struct sccs); 717 1.1 mrg if (ob->local_trees && local_tree_p (expr)) 718 1.1 mrg max_local_entry = sccstack.length (); 719 1.1 mrg sccstack.safe_push (e); 720 1.1 mrg cstate->dfsnum = next_dfs_num++; 721 1.1 mrg cstate->low = cstate->dfsnum; 722 1.1 mrg w.cstate = cstate; 723 1.1 mrg 724 1.1 mrg if (TREE_CODE (expr) == INTEGER_CST 725 1.1 mrg && !TREE_OVERFLOW (expr)) 726 1.1 mrg DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p); 727 1.1 mrg else 728 1.1 mrg { 729 1.1 mrg DFS_write_tree_body (ob, expr, cstate, ref_p); 730 1.1 mrg 731 1.1 mrg /* Walk any LTO-specific edges. */ 732 1.1 mrg if (DECL_P (expr) 733 1.1 mrg && TREE_CODE (expr) != FUNCTION_DECL 734 1.1 mrg && TREE_CODE (expr) != TRANSLATION_UNIT_DECL) 735 1.1 mrg { 736 1.1 mrg /* Handle DECL_INITIAL for symbols. */ 737 1.1 mrg tree initial 738 1.1 mrg = get_symbol_initial_value (ob->decl_state->symtab_node_encoder, 739 1.1 mrg expr); 740 1.1 mrg DFS_write_tree (ob, cstate, initial, ref_p, ref_p); 741 1.1 mrg } 742 1.1 mrg } 743 1.1 mrg continue; 744 1.1 mrg } 745 1.1 mrg 746 1.1 mrg /* See if we found an SCC. */ 747 1.1 mrg if (cstate->low == cstate->dfsnum) 748 1.1 mrg { 749 1.1 mrg unsigned first, size; 750 1.1 mrg tree x; 751 1.1 mrg 752 1.1 mrg /* If we are re-walking a single leaf SCC just pop it, 753 1.1 mrg let earlier worklist item access the sccstack. */ 754 1.1 mrg if (single_p) 755 1.1 mrg { 756 1.1 mrg worklist_vec.pop (); 757 1.1 mrg continue; 758 1.1 mrg } 759 1.1 mrg 760 1.1 mrg /* Pop the SCC and compute its size. */ 761 1.1 mrg first = sccstack.length (); 762 1.1 mrg do 763 1.1 mrg { 764 1.1 mrg x = sccstack[--first].t; 765 1.1 mrg } 766 1.1 mrg while (x != expr); 767 1.1 mrg size = sccstack.length () - first; 768 1.1 mrg 769 1.1 mrg /* No need to compute hashes for LTRANS units, we don't perform 770 1.1 mrg any merging there. */ 771 1.1 mrg hashval_t scc_hash = 0; 772 1.1 mrg unsigned scc_entry_len = 0; 773 1.1 mrg bool local_to_unit = !ob->local_trees 774 1.1 mrg || max_local_entry >= (int)first; 775 1.1 mrg 776 1.1 mrg /* Remember that trees are local so info gets propagated to other 777 1.1 mrg SCCs. */ 778 1.1 mrg if (local_to_unit && ob->local_trees) 779 1.1 mrg { 780 1.1 mrg for (unsigned i = 0; i < size; ++i) 781 1.1 mrg ob->local_trees->add (sccstack[first + i].t); 782 1.1 mrg } 783 1.1 mrg 784 1.1 mrg /* As a special case do not stream TRANSLATION_UNIT_DECL as shared 785 1.1 mrg tree. We can not mark it local because references to it does not 786 1.1 mrg make other trees local (all global decls reffer to it via 787 1.1 mrg CONTEXT). */ 788 1.1 mrg if (size == 1 789 1.1 mrg && TREE_CODE (sccstack[first].t) == TRANSLATION_UNIT_DECL) 790 1.1 mrg local_to_unit = true; 791 1.1 mrg 792 1.1 mrg if (!local_to_unit) 793 1.1 mrg { 794 1.1 mrg scc_hash = hash_scc (ob, first, size, ref_p, this_ref_p); 795 1.1 mrg 796 1.1 mrg /* Put the entries with the least number of collisions first. */ 797 1.1 mrg unsigned entry_start = 0; 798 1.1 mrg scc_entry_len = size + 1; 799 1.1 mrg for (unsigned i = 0; i < size;) 800 1.1 mrg { 801 1.1 mrg unsigned from = i; 802 1.1 mrg for (i = i + 1; i < size 803 1.1 mrg && (sccstack[first + i].hash 804 1.1 mrg == sccstack[first + from].hash); ++i) 805 1.1 mrg ; 806 1.1 mrg if (i - from < scc_entry_len) 807 1.1 mrg { 808 1.1 mrg scc_entry_len = i - from; 809 1.1 mrg entry_start = from; 810 1.1 mrg } 811 1.1 mrg } 812 1.1 mrg for (unsigned i = 0; i < scc_entry_len; ++i) 813 1.1 mrg std::swap (sccstack[first + i], 814 1.1 mrg sccstack[first + entry_start + i]); 815 1.1 mrg 816 1.1 mrg /* We already sorted SCC deterministically in hash_scc. */ 817 1.1 mrg 818 1.1 mrg /* Check that we have only one SCC. 819 1.1 mrg Naturally we may have conflicts if hash function is not 820 1.1 mrg strong enough. Lets see how far this gets. */ 821 1.1 mrg gcc_checking_assert (scc_entry_len == 1); 822 1.1 mrg } 823 1.1 mrg 824 1.1 mrg worklist_vec.pop (); 825 1.1 mrg 826 1.1 mrg unsigned int prev_size = ob->main_stream->total_size; 827 1.1 mrg 828 1.1 mrg /* Only global decl sections are considered by tree merging. */ 829 1.1 mrg if (ob->section_type != LTO_section_decls) 830 1.1 mrg { 831 1.1 mrg /* If this is the original tree we stream and it forms SCC 832 1.1 mrg by itself then we do not need to stream SCC at all. */ 833 1.1 mrg if (worklist_vec.is_empty () && first == 0 && size == 1) 834 1.1 mrg return; 835 1.1 mrg if (streamer_dump_file) 836 1.1 mrg { 837 1.1 mrg fprintf (streamer_dump_file, 838 1.1 mrg " Start of LTO_trees of size %i\n", size); 839 1.1 mrg } 840 1.1 mrg streamer_write_record_start (ob, LTO_trees); 841 1.1 mrg streamer_write_uhwi (ob, size); 842 1.1 mrg } 843 1.1 mrg /* Write LTO_tree_scc if tree merging is going to be performed. */ 844 1.1 mrg else if (!local_to_unit 845 1.1 mrg /* These are special since sharing is not done by tree 846 1.1 mrg merging machinery. We can not special case them earlier 847 1.1 mrg because we still need to compute hash for further sharing 848 1.1 mrg of trees referring to them. */ 849 1.1 mrg && (size != 1 850 1.1 mrg || (TREE_CODE (sccstack[first].t) != IDENTIFIER_NODE 851 1.1 mrg && (TREE_CODE (sccstack[first].t) != INTEGER_CST 852 1.1 mrg || TREE_OVERFLOW (sccstack[first].t))))) 853 1.1 mrg 854 1.1 mrg { 855 1.1 mrg gcc_checking_assert (ob->section_type == LTO_section_decls); 856 1.1 mrg if (streamer_dump_file) 857 1.1 mrg { 858 1.1 mrg fprintf (streamer_dump_file, 859 1.1 mrg " Start of LTO_tree_scc of size %i\n", size); 860 1.1 mrg } 861 1.1 mrg streamer_write_record_start (ob, LTO_tree_scc); 862 1.1 mrg /* In wast majority of cases scc_entry_len is 1 and size is small 863 1.1 mrg integer. Use extra bit of size to stream info about 864 1.1 mrg exceptions. */ 865 1.1 mrg streamer_write_uhwi (ob, size * 2 + (scc_entry_len != 1)); 866 1.1 mrg if (scc_entry_len != 1) 867 1.1 mrg streamer_write_uhwi (ob, scc_entry_len); 868 1.1 mrg streamer_write_uhwi (ob, scc_hash); 869 1.1 mrg } 870 1.1 mrg /* Non-trivial SCCs must be packed to trees blocks so forward 871 1.1 mrg references work correctly. */ 872 1.1 mrg else if (size != 1) 873 1.1 mrg { 874 1.1 mrg if (streamer_dump_file) 875 1.1 mrg { 876 1.1 mrg fprintf (streamer_dump_file, 877 1.1 mrg " Start of LTO_trees of size %i\n", size); 878 1.1 mrg } 879 1.1 mrg streamer_write_record_start (ob, LTO_trees); 880 1.1 mrg streamer_write_uhwi (ob, size); 881 1.1 mrg } 882 1.1 mrg else if (streamer_dump_file) 883 1.1 mrg { 884 1.1 mrg fprintf (streamer_dump_file, " Streaming single tree\n"); 885 1.1 mrg } 886 1.1 mrg 887 1.1 mrg /* Write size-1 SCCs without wrapping them inside SCC bundles. 888 1.1 mrg All INTEGER_CSTs need to be handled this way as we need 889 1.1 mrg their type to materialize them. Also builtins are handled 890 1.1 mrg this way. */ 891 1.1 mrg if (size == 1) 892 1.1 mrg lto_output_tree_1 (ob, expr, scc_hash, ref_p, this_ref_p); 893 1.1 mrg else 894 1.1 mrg { 895 1.1 mrg 896 1.1 mrg /* Write all headers and populate the streamer cache. */ 897 1.1 mrg for (unsigned i = 0; i < size; ++i) 898 1.1 mrg { 899 1.1 mrg hashval_t hash = sccstack[first+i].hash; 900 1.1 mrg tree t = sccstack[first+i].t; 901 1.1 mrg bool exists_p = streamer_tree_cache_insert (ob->writer_cache, 902 1.1 mrg t, hash, NULL); 903 1.1 mrg gcc_assert (!exists_p); 904 1.1 mrg 905 1.1 mrg if (!lto_is_streamable (t)) 906 1.1 mrg internal_error ("tree code %qs is not supported " 907 1.1 mrg "in LTO streams", 908 1.1 mrg get_tree_code_name (TREE_CODE (t))); 909 1.1 mrg 910 1.1 mrg /* Write the header, containing everything needed to 911 1.1 mrg materialize EXPR on the reading side. */ 912 1.1 mrg streamer_write_tree_header (ob, t); 913 1.1 mrg } 914 1.1 mrg 915 1.1 mrg /* Write the bitpacks and tree references. */ 916 1.1 mrg for (unsigned i = 0; i < size; ++i) 917 1.1 mrg lto_write_tree_1 (ob, sccstack[first+i].t, ref_p); 918 1.1 mrg } 919 1.1 mrg if (streamer_dump_file) 920 1.1 mrg fprintf (streamer_dump_file, " %u bytes\n", 921 1.1 mrg ob->main_stream->total_size - prev_size); 922 1.1 mrg 923 1.1 mrg /* Finally truncate the vector. */ 924 1.1 mrg sccstack.truncate (first); 925 1.1 mrg if ((int)first <= max_local_entry) 926 1.1 mrg max_local_entry = first - 1; 927 1.1 mrg 928 1.1 mrg if (from_state) 929 1.1 mrg from_state->low = MIN (from_state->low, cstate->low); 930 1.1 mrg continue; 931 1.1 mrg } 932 1.1 mrg 933 1.1 mrg gcc_checking_assert (from_state); 934 1.1 mrg from_state->low = MIN (from_state->low, cstate->low); 935 1.1 mrg if (cstate->dfsnum < from_state->dfsnum) 936 1.1 mrg from_state->low = MIN (cstate->dfsnum, from_state->low); 937 1.1 mrg worklist_vec.pop (); 938 1.1 mrg } 939 1.1 mrg } 940 1.1 mrg 941 1.1 mrg DFS::~DFS () 942 1.1 mrg { 943 1.1 mrg obstack_free (&sccstate_obstack, NULL); 944 1.1 mrg } 945 1.1 mrg 946 1.1 mrg /* Handle the tree EXPR in the DFS walk with SCC state EXPR_STATE and 947 1.1 mrg DFS recurse for all tree edges originating from it. */ 948 1.1 mrg 949 1.1 mrg void 950 1.1 mrg DFS::DFS_write_tree_body (struct output_block *ob, 951 1.1 mrg tree expr, sccs *expr_state, bool ref_p) 952 1.1 mrg { 953 1.1 mrg #define DFS_follow_tree_edge(DEST) \ 954 1.1 mrg DFS_write_tree (ob, expr_state, DEST, ref_p, ref_p) 955 1.1 mrg 956 1.1 mrg enum tree_code code; 957 1.1 mrg 958 1.1 mrg code = TREE_CODE (expr); 959 1.1 mrg 960 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPED)) 961 1.1 mrg { 962 1.1 mrg if (TREE_CODE (expr) != IDENTIFIER_NODE) 963 1.1 mrg DFS_follow_tree_edge (TREE_TYPE (expr)); 964 1.1 mrg } 965 1.1 mrg 966 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_VECTOR)) 967 1.1 mrg { 968 1.1 mrg unsigned int count = vector_cst_encoded_nelts (expr); 969 1.1 mrg for (unsigned int i = 0; i < count; ++i) 970 1.1 mrg DFS_follow_tree_edge (VECTOR_CST_ENCODED_ELT (expr, i)); 971 1.1 mrg } 972 1.1 mrg 973 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST)) 974 1.1 mrg for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i) 975 1.1 mrg DFS_follow_tree_edge (POLY_INT_CST_COEFF (expr, i)); 976 1.1 mrg 977 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX)) 978 1.1 mrg { 979 1.1 mrg DFS_follow_tree_edge (TREE_REALPART (expr)); 980 1.1 mrg DFS_follow_tree_edge (TREE_IMAGPART (expr)); 981 1.1 mrg } 982 1.1 mrg 983 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL)) 984 1.1 mrg { 985 1.1 mrg /* Drop names that were created for anonymous entities. */ 986 1.1 mrg if (DECL_NAME (expr) 987 1.1 mrg && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE 988 1.1 mrg && IDENTIFIER_ANON_P (DECL_NAME (expr))) 989 1.1 mrg ; 990 1.1 mrg else 991 1.1 mrg DFS_follow_tree_edge (DECL_NAME (expr)); 992 1.1 mrg if (TREE_CODE (expr) != TRANSLATION_UNIT_DECL 993 1.1 mrg && ! DECL_CONTEXT (expr)) 994 1.1 mrg DFS_follow_tree_edge ((*all_translation_units)[0]); 995 1.1 mrg else 996 1.1 mrg DFS_follow_tree_edge (DECL_CONTEXT (expr)); 997 1.1 mrg } 998 1.1 mrg 999 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 1000 1.1 mrg { 1001 1.1 mrg DFS_follow_tree_edge (DECL_SIZE (expr)); 1002 1.1 mrg DFS_follow_tree_edge (DECL_SIZE_UNIT (expr)); 1003 1.1 mrg 1004 1.1 mrg /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs 1005 1.1 mrg special handling in LTO, it must be handled by streamer hooks. */ 1006 1.1 mrg 1007 1.1 mrg DFS_follow_tree_edge (DECL_ATTRIBUTES (expr)); 1008 1.1 mrg 1009 1.1 mrg /* We use DECL_ABSTRACT_ORIGIN == error_mark_node to mark 1010 1.1 mrg declarations which should be eliminated by decl merging. Be sure none 1011 1.1 mrg leaks to this point. */ 1012 1.1 mrg gcc_assert (DECL_ABSTRACT_ORIGIN (expr) != error_mark_node); 1013 1.1 mrg DFS_follow_tree_edge (DECL_ABSTRACT_ORIGIN (expr)); 1014 1.1 mrg 1015 1.1 mrg if ((VAR_P (expr) 1016 1.1 mrg || TREE_CODE (expr) == PARM_DECL) 1017 1.1 mrg && DECL_HAS_VALUE_EXPR_P (expr)) 1018 1.1 mrg DFS_follow_tree_edge (DECL_VALUE_EXPR (expr)); 1019 1.1 mrg if (VAR_P (expr) 1020 1.1 mrg && DECL_HAS_DEBUG_EXPR_P (expr)) 1021 1.1 mrg DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr)); 1022 1.1 mrg } 1023 1.1 mrg 1024 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) 1025 1.1 mrg { 1026 1.1 mrg /* Make sure we don't inadvertently set the assembler name. */ 1027 1.1 mrg if (DECL_ASSEMBLER_NAME_SET_P (expr)) 1028 1.1 mrg DFS_follow_tree_edge (DECL_ASSEMBLER_NAME (expr)); 1029 1.1 mrg } 1030 1.1 mrg 1031 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL)) 1032 1.1 mrg { 1033 1.1 mrg DFS_follow_tree_edge (DECL_FIELD_OFFSET (expr)); 1034 1.1 mrg DFS_follow_tree_edge (DECL_BIT_FIELD_TYPE (expr)); 1035 1.1 mrg DFS_follow_tree_edge (DECL_BIT_FIELD_REPRESENTATIVE (expr)); 1036 1.1 mrg DFS_follow_tree_edge (DECL_FIELD_BIT_OFFSET (expr)); 1037 1.1 mrg gcc_checking_assert (!DECL_FCONTEXT (expr)); 1038 1.1 mrg } 1039 1.1 mrg 1040 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL)) 1041 1.1 mrg { 1042 1.1 mrg gcc_checking_assert (DECL_VINDEX (expr) == NULL); 1043 1.1 mrg DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr)); 1044 1.1 mrg DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_TARGET (expr)); 1045 1.1 mrg DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr)); 1046 1.1 mrg } 1047 1.1 mrg 1048 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON)) 1049 1.1 mrg { 1050 1.1 mrg DFS_follow_tree_edge (TYPE_SIZE (expr)); 1051 1.1 mrg DFS_follow_tree_edge (TYPE_SIZE_UNIT (expr)); 1052 1.1 mrg DFS_follow_tree_edge (TYPE_ATTRIBUTES (expr)); 1053 1.1 mrg DFS_follow_tree_edge (TYPE_NAME (expr)); 1054 1.1 mrg /* Do not follow TYPE_POINTER_TO or TYPE_REFERENCE_TO. They will be 1055 1.1 mrg reconstructed during fixup. */ 1056 1.1 mrg /* Do not follow TYPE_NEXT_VARIANT, we reconstruct the variant lists 1057 1.1 mrg during fixup. */ 1058 1.1 mrg DFS_follow_tree_edge (TYPE_MAIN_VARIANT (expr)); 1059 1.1 mrg DFS_follow_tree_edge (TYPE_CONTEXT (expr)); 1060 1.1 mrg /* TYPE_CANONICAL is re-computed during type merging, so no need 1061 1.1 mrg to follow it here. */ 1062 1.1 mrg /* Do not stream TYPE_STUB_DECL; it is not needed by LTO but currently 1063 1.1 mrg it cannot be freed by free_lang_data without triggering ICEs in 1064 1.1 mrg langhooks. */ 1065 1.1 mrg } 1066 1.1 mrg 1067 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON)) 1068 1.1 mrg { 1069 1.1 mrg if (TREE_CODE (expr) == ARRAY_TYPE) 1070 1.1 mrg DFS_follow_tree_edge (TYPE_DOMAIN (expr)); 1071 1.1 mrg else if (RECORD_OR_UNION_TYPE_P (expr)) 1072 1.1 mrg for (tree t = TYPE_FIELDS (expr); t; t = TREE_CHAIN (t)) 1073 1.1 mrg DFS_follow_tree_edge (t); 1074 1.1 mrg else if (TREE_CODE (expr) == FUNCTION_TYPE 1075 1.1 mrg || TREE_CODE (expr) == METHOD_TYPE) 1076 1.1 mrg DFS_follow_tree_edge (TYPE_ARG_TYPES (expr)); 1077 1.1 mrg 1078 1.1 mrg if (!POINTER_TYPE_P (expr)) 1079 1.1 mrg DFS_follow_tree_edge (TYPE_MIN_VALUE_RAW (expr)); 1080 1.1 mrg DFS_follow_tree_edge (TYPE_MAX_VALUE_RAW (expr)); 1081 1.1 mrg } 1082 1.1 mrg 1083 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_LIST)) 1084 1.1 mrg { 1085 1.1 mrg DFS_follow_tree_edge (TREE_PURPOSE (expr)); 1086 1.1 mrg DFS_follow_tree_edge (TREE_VALUE (expr)); 1087 1.1 mrg DFS_follow_tree_edge (TREE_CHAIN (expr)); 1088 1.1 mrg } 1089 1.1 mrg 1090 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_VEC)) 1091 1.1 mrg { 1092 1.1 mrg for (int i = 0; i < TREE_VEC_LENGTH (expr); i++) 1093 1.1 mrg DFS_follow_tree_edge (TREE_VEC_ELT (expr, i)); 1094 1.1 mrg } 1095 1.1 mrg 1096 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_EXP)) 1097 1.1 mrg { 1098 1.1 mrg for (int i = 0; i < TREE_OPERAND_LENGTH (expr); i++) 1099 1.1 mrg DFS_follow_tree_edge (TREE_OPERAND (expr, i)); 1100 1.1 mrg DFS_follow_tree_edge (TREE_BLOCK (expr)); 1101 1.1 mrg } 1102 1.1 mrg 1103 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_BLOCK)) 1104 1.1 mrg { 1105 1.1 mrg for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t)) 1106 1.1 mrg { 1107 1.1 mrg /* We would have to stream externals in the block chain as 1108 1.1 mrg non-references but we should have dropped them in 1109 1.1 mrg free-lang-data. */ 1110 1.1 mrg gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t)); 1111 1.1 mrg DFS_follow_tree_edge (t); 1112 1.1 mrg } 1113 1.1 mrg 1114 1.1 mrg DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr)); 1115 1.1 mrg DFS_follow_tree_edge (BLOCK_ABSTRACT_ORIGIN (expr)); 1116 1.1 mrg 1117 1.1 mrg /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug 1118 1.1 mrg information for early inlined BLOCKs so drop it on the floor instead 1119 1.1 mrg of ICEing in dwarf2out.cc. */ 1120 1.1 mrg 1121 1.1 mrg /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO 1122 1.1 mrg streaming time. */ 1123 1.1 mrg 1124 1.1 mrg /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this 1125 1.1 mrg list is re-constructed from BLOCK_SUPERCONTEXT. */ 1126 1.1 mrg } 1127 1.1 mrg 1128 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_BINFO)) 1129 1.1 mrg { 1130 1.1 mrg unsigned i; 1131 1.1 mrg tree t; 1132 1.1 mrg 1133 1.1 mrg /* Note that the number of BINFO slots has already been emitted in 1134 1.1 mrg EXPR's header (see streamer_write_tree_header) because this length 1135 1.1 mrg is needed to build the empty BINFO node on the reader side. */ 1136 1.1 mrg FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (expr), i, t) 1137 1.1 mrg DFS_follow_tree_edge (t); 1138 1.1 mrg DFS_follow_tree_edge (BINFO_OFFSET (expr)); 1139 1.1 mrg DFS_follow_tree_edge (BINFO_VTABLE (expr)); 1140 1.1 mrg 1141 1.1 mrg /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX, 1142 1.1 mrg BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used 1143 1.1 mrg by C++ FE only. */ 1144 1.1 mrg } 1145 1.1 mrg 1146 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) 1147 1.1 mrg { 1148 1.1 mrg unsigned i; 1149 1.1 mrg tree index, value; 1150 1.1 mrg 1151 1.1 mrg FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (expr), i, index, value) 1152 1.1 mrg { 1153 1.1 mrg DFS_follow_tree_edge (index); 1154 1.1 mrg DFS_follow_tree_edge (value); 1155 1.1 mrg } 1156 1.1 mrg } 1157 1.1 mrg 1158 1.1 mrg if (code == OMP_CLAUSE) 1159 1.1 mrg { 1160 1.1 mrg int i; 1161 1.1 mrg for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++) 1162 1.1 mrg DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i)); 1163 1.1 mrg DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr)); 1164 1.1 mrg } 1165 1.1 mrg 1166 1.1 mrg #undef DFS_follow_tree_edge 1167 1.1 mrg } 1168 1.1 mrg 1169 1.1 mrg /* Return a hash value for the tree T. 1170 1.1 mrg CACHE holds hash values of trees outside current SCC. MAP, if non-NULL, 1171 1.1 mrg may hold hash values if trees inside current SCC. */ 1172 1.1 mrg 1173 1.1 mrg static hashval_t 1174 1.1 mrg hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map, tree t) 1175 1.1 mrg { 1176 1.1 mrg inchash::hash hstate; 1177 1.1 mrg 1178 1.1 mrg #define visit(SIBLING) \ 1179 1.1 mrg do { \ 1180 1.1 mrg unsigned ix; \ 1181 1.1 mrg if (!SIBLING) \ 1182 1.1 mrg hstate.add_int (0); \ 1183 1.1 mrg else if (streamer_tree_cache_lookup (cache, SIBLING, &ix)) \ 1184 1.1 mrg hstate.add_int (streamer_tree_cache_get_hash (cache, ix)); \ 1185 1.1 mrg else if (map) \ 1186 1.1 mrg hstate.add_int (*map->get (SIBLING)); \ 1187 1.1 mrg else \ 1188 1.1 mrg hstate.add_int (1); \ 1189 1.1 mrg } while (0) 1190 1.1 mrg 1191 1.1 mrg /* Hash TS_BASE. */ 1192 1.1 mrg enum tree_code code = TREE_CODE (t); 1193 1.1 mrg hstate.add_int (code); 1194 1.1 mrg if (!TYPE_P (t)) 1195 1.1 mrg { 1196 1.1 mrg hstate.add_flag (TREE_SIDE_EFFECTS (t)); 1197 1.1 mrg hstate.add_flag (TREE_CONSTANT (t)); 1198 1.1 mrg hstate.add_flag (TREE_READONLY (t)); 1199 1.1 mrg hstate.add_flag (TREE_PUBLIC (t)); 1200 1.1 mrg } 1201 1.1 mrg hstate.add_flag (TREE_ADDRESSABLE (t)); 1202 1.1 mrg hstate.add_flag (TREE_THIS_VOLATILE (t)); 1203 1.1 mrg if (DECL_P (t)) 1204 1.1 mrg hstate.add_flag (DECL_UNSIGNED (t)); 1205 1.1 mrg else if (TYPE_P (t)) 1206 1.1 mrg hstate.add_flag (TYPE_UNSIGNED (t)); 1207 1.1 mrg if (TYPE_P (t)) 1208 1.1 mrg hstate.add_flag (TYPE_ARTIFICIAL (t)); 1209 1.1 mrg else 1210 1.1 mrg hstate.add_flag (TREE_NO_WARNING (t)); 1211 1.1 mrg hstate.add_flag (TREE_NOTHROW (t)); 1212 1.1 mrg hstate.add_flag (TREE_STATIC (t)); 1213 1.1 mrg hstate.add_flag (TREE_PROTECTED (t)); 1214 1.1 mrg hstate.add_flag (TREE_DEPRECATED (t)); 1215 1.1 mrg if (code != TREE_BINFO) 1216 1.1 mrg hstate.add_flag (TREE_PRIVATE (t)); 1217 1.1 mrg if (TYPE_P (t)) 1218 1.1 mrg { 1219 1.1 mrg hstate.add_flag (AGGREGATE_TYPE_P (t) 1220 1.1 mrg ? TYPE_REVERSE_STORAGE_ORDER (t) : TYPE_SATURATING (t)); 1221 1.1 mrg hstate.add_flag (TYPE_ADDR_SPACE (t)); 1222 1.1 mrg } 1223 1.1 mrg else if (code == SSA_NAME) 1224 1.1 mrg hstate.add_flag (SSA_NAME_IS_DEFAULT_DEF (t)); 1225 1.1 mrg hstate.commit_flag (); 1226 1.1 mrg 1227 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_INT_CST)) 1228 1.1 mrg hstate.add_wide_int (wi::to_widest (t)); 1229 1.1 mrg 1230 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_REAL_CST)) 1231 1.1 mrg { 1232 1.1 mrg REAL_VALUE_TYPE r = TREE_REAL_CST (t); 1233 1.1 mrg hstate.add_flag (r.cl); 1234 1.1 mrg hstate.add_flag (r.sign); 1235 1.1 mrg hstate.add_flag (r.signalling); 1236 1.1 mrg hstate.add_flag (r.canonical); 1237 1.1 mrg hstate.commit_flag (); 1238 1.1 mrg hstate.add_int (r.uexp); 1239 1.1 mrg hstate.add (r.sig, sizeof (r.sig)); 1240 1.1 mrg } 1241 1.1 mrg 1242 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_FIXED_CST)) 1243 1.1 mrg { 1244 1.1 mrg FIXED_VALUE_TYPE f = TREE_FIXED_CST (t); 1245 1.1 mrg hstate.add_int (f.mode); 1246 1.1 mrg hstate.add_int (f.data.low); 1247 1.1 mrg hstate.add_int (f.data.high); 1248 1.1 mrg } 1249 1.1 mrg 1250 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 1251 1.1 mrg { 1252 1.1 mrg hstate.add_hwi (DECL_MODE (t)); 1253 1.1 mrg hstate.add_flag (DECL_NONLOCAL (t)); 1254 1.1 mrg hstate.add_flag (DECL_VIRTUAL_P (t)); 1255 1.1 mrg hstate.add_flag (DECL_IGNORED_P (t)); 1256 1.1 mrg hstate.add_flag (DECL_ABSTRACT_P (t)); 1257 1.1 mrg hstate.add_flag (DECL_ARTIFICIAL (t)); 1258 1.1 mrg hstate.add_flag (DECL_USER_ALIGN (t)); 1259 1.1 mrg hstate.add_flag (DECL_PRESERVE_P (t)); 1260 1.1 mrg hstate.add_flag (DECL_EXTERNAL (t)); 1261 1.1 mrg hstate.add_flag (DECL_NOT_GIMPLE_REG_P (t)); 1262 1.1 mrg hstate.commit_flag (); 1263 1.1 mrg hstate.add_int (DECL_ALIGN (t)); 1264 1.1 mrg if (code == LABEL_DECL) 1265 1.1 mrg { 1266 1.1 mrg hstate.add_int (EH_LANDING_PAD_NR (t)); 1267 1.1 mrg hstate.add_int (LABEL_DECL_UID (t)); 1268 1.1 mrg } 1269 1.1 mrg else if (code == FIELD_DECL) 1270 1.1 mrg { 1271 1.1 mrg hstate.add_flag (DECL_PACKED (t)); 1272 1.1 mrg hstate.add_flag (DECL_NONADDRESSABLE_P (t)); 1273 1.1 mrg hstate.add_flag (DECL_PADDING_P (t)); 1274 1.1 mrg if (DECL_BIT_FIELD (t)) 1275 1.1 mrg hstate.add_flag (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (t)); 1276 1.1 mrg else 1277 1.1 mrg hstate.add_flag (DECL_FIELD_ABI_IGNORED (t)); 1278 1.1 mrg hstate.add_int (DECL_OFFSET_ALIGN (t)); 1279 1.1 mrg } 1280 1.1 mrg else if (code == VAR_DECL) 1281 1.1 mrg { 1282 1.1 mrg hstate.add_flag (DECL_HAS_DEBUG_EXPR_P (t)); 1283 1.1 mrg hstate.add_flag (DECL_NONLOCAL_FRAME (t)); 1284 1.1 mrg } 1285 1.1 mrg if (code == RESULT_DECL 1286 1.1 mrg || code == PARM_DECL 1287 1.1 mrg || code == VAR_DECL) 1288 1.1 mrg { 1289 1.1 mrg hstate.add_flag (DECL_BY_REFERENCE (t)); 1290 1.1 mrg if (code == VAR_DECL 1291 1.1 mrg || code == PARM_DECL) 1292 1.1 mrg hstate.add_flag (DECL_HAS_VALUE_EXPR_P (t)); 1293 1.1 mrg } 1294 1.1 mrg hstate.commit_flag (); 1295 1.1 mrg } 1296 1.1 mrg 1297 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)) 1298 1.1 mrg hstate.add_int (DECL_REGISTER (t)); 1299 1.1 mrg 1300 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) 1301 1.1 mrg { 1302 1.1 mrg hstate.add_flag (DECL_COMMON (t)); 1303 1.1 mrg hstate.add_flag (DECL_DLLIMPORT_P (t)); 1304 1.1 mrg hstate.add_flag (DECL_WEAK (t)); 1305 1.1 mrg hstate.add_flag (DECL_SEEN_IN_BIND_EXPR_P (t)); 1306 1.1 mrg hstate.add_flag (DECL_COMDAT (t)); 1307 1.1 mrg hstate.add_flag (DECL_VISIBILITY_SPECIFIED (t)); 1308 1.1 mrg hstate.add_int (DECL_VISIBILITY (t)); 1309 1.1 mrg if (code == VAR_DECL) 1310 1.1 mrg { 1311 1.1 mrg /* DECL_IN_TEXT_SECTION is set during final asm output only. */ 1312 1.1 mrg hstate.add_flag (DECL_HARD_REGISTER (t)); 1313 1.1 mrg hstate.add_flag (DECL_IN_CONSTANT_POOL (t)); 1314 1.1 mrg } 1315 1.1 mrg if (TREE_CODE (t) == FUNCTION_DECL) 1316 1.1 mrg { 1317 1.1 mrg hstate.add_flag (DECL_FINAL_P (t)); 1318 1.1 mrg hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (t)); 1319 1.1 mrg hstate.add_flag (DECL_CXX_DESTRUCTOR_P (t)); 1320 1.1 mrg } 1321 1.1 mrg hstate.commit_flag (); 1322 1.1 mrg } 1323 1.1 mrg 1324 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL)) 1325 1.1 mrg { 1326 1.1 mrg hstate.add_int (DECL_BUILT_IN_CLASS (t)); 1327 1.1 mrg hstate.add_flag (DECL_STATIC_CONSTRUCTOR (t)); 1328 1.1 mrg hstate.add_flag (DECL_STATIC_DESTRUCTOR (t)); 1329 1.1 mrg hstate.add_flag (FUNCTION_DECL_DECL_TYPE (t)); 1330 1.1 mrg hstate.add_flag (DECL_UNINLINABLE (t)); 1331 1.1 mrg hstate.add_flag (DECL_POSSIBLY_INLINED (t)); 1332 1.1 mrg hstate.add_flag (DECL_IS_NOVOPS (t)); 1333 1.1 mrg hstate.add_flag (DECL_IS_RETURNS_TWICE (t)); 1334 1.1 mrg hstate.add_flag (DECL_IS_MALLOC (t)); 1335 1.1 mrg hstate.add_flag (DECL_DECLARED_INLINE_P (t)); 1336 1.1 mrg hstate.add_flag (DECL_STATIC_CHAIN (t)); 1337 1.1 mrg hstate.add_flag (DECL_NO_INLINE_WARNING_P (t)); 1338 1.1 mrg hstate.add_flag (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (t)); 1339 1.1 mrg hstate.add_flag (DECL_NO_LIMIT_STACK (t)); 1340 1.1 mrg hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (t)); 1341 1.1 mrg hstate.add_flag (DECL_PURE_P (t)); 1342 1.1 mrg hstate.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t)); 1343 1.1 mrg hstate.commit_flag (); 1344 1.1 mrg if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN) 1345 1.1 mrg hstate.add_int (DECL_UNCHECKED_FUNCTION_CODE (t)); 1346 1.1 mrg } 1347 1.1 mrg 1348 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON)) 1349 1.1 mrg { 1350 1.1 mrg hstate.add_hwi (TYPE_MODE (t)); 1351 1.1 mrg /* TYPE_NO_FORCE_BLK is private to stor-layout and need 1352 1.1 mrg no streaming. */ 1353 1.1 mrg hstate.add_flag (TYPE_PACKED (t)); 1354 1.1 mrg hstate.add_flag (TYPE_RESTRICT (t)); 1355 1.1 mrg hstate.add_flag (TYPE_USER_ALIGN (t)); 1356 1.1 mrg hstate.add_flag (TYPE_READONLY (t)); 1357 1.1 mrg if (RECORD_OR_UNION_TYPE_P (t)) 1358 1.1 mrg { 1359 1.1 mrg hstate.add_flag (TYPE_TRANSPARENT_AGGR (t)); 1360 1.1 mrg hstate.add_flag (TYPE_FINAL_P (t)); 1361 1.1 mrg hstate.add_flag (TYPE_CXX_ODR_P (t)); 1362 1.1 mrg } 1363 1.1 mrg else if (code == ARRAY_TYPE) 1364 1.1 mrg hstate.add_flag (TYPE_NONALIASED_COMPONENT (t)); 1365 1.1 mrg if (code == ARRAY_TYPE || code == INTEGER_TYPE) 1366 1.1 mrg hstate.add_flag (TYPE_STRING_FLAG (t)); 1367 1.1 mrg if (AGGREGATE_TYPE_P (t)) 1368 1.1 mrg hstate.add_flag (TYPE_TYPELESS_STORAGE (t)); 1369 1.1 mrg hstate.commit_flag (); 1370 1.1 mrg hstate.add_int (TYPE_PRECISION (t)); 1371 1.1 mrg hstate.add_int (TYPE_ALIGN (t)); 1372 1.1 mrg hstate.add_int (TYPE_EMPTY_P (t)); 1373 1.1 mrg } 1374 1.1 mrg 1375 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL)) 1376 1.1 mrg hstate.add (TRANSLATION_UNIT_LANGUAGE (t), 1377 1.1 mrg strlen (TRANSLATION_UNIT_LANGUAGE (t))); 1378 1.1 mrg 1379 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION) 1380 1.1 mrg /* We don't stream these when passing things to a different target. */ 1381 1.1 mrg && !lto_stream_offload_p) 1382 1.1 mrg hstate.add_hwi (cl_target_option_hash (TREE_TARGET_OPTION (t))); 1383 1.1 mrg 1384 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION)) 1385 1.1 mrg hstate.add_hwi (cl_optimization_hash (TREE_OPTIMIZATION (t))); 1386 1.1 mrg 1387 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_IDENTIFIER)) 1388 1.1 mrg hstate.merge_hash (IDENTIFIER_HASH_VALUE (t)); 1389 1.1 mrg 1390 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_STRING)) 1391 1.1 mrg hstate.add (TREE_STRING_POINTER (t), TREE_STRING_LENGTH (t)); 1392 1.1 mrg 1393 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPED)) 1394 1.1 mrg { 1395 1.1 mrg if (code != IDENTIFIER_NODE) 1396 1.1 mrg visit (TREE_TYPE (t)); 1397 1.1 mrg } 1398 1.1 mrg 1399 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_VECTOR)) 1400 1.1 mrg { 1401 1.1 mrg unsigned int count = vector_cst_encoded_nelts (t); 1402 1.1 mrg for (unsigned int i = 0; i < count; ++i) 1403 1.1 mrg visit (VECTOR_CST_ENCODED_ELT (t, i)); 1404 1.1 mrg } 1405 1.1 mrg 1406 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_POLY_INT_CST)) 1407 1.1 mrg for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i) 1408 1.1 mrg visit (POLY_INT_CST_COEFF (t, i)); 1409 1.1 mrg 1410 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_COMPLEX)) 1411 1.1 mrg { 1412 1.1 mrg visit (TREE_REALPART (t)); 1413 1.1 mrg visit (TREE_IMAGPART (t)); 1414 1.1 mrg } 1415 1.1 mrg 1416 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL)) 1417 1.1 mrg { 1418 1.1 mrg /* Drop names that were created for anonymous entities. */ 1419 1.1 mrg if (DECL_NAME (t) 1420 1.1 mrg && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE 1421 1.1 mrg && IDENTIFIER_ANON_P (DECL_NAME (t))) 1422 1.1 mrg ; 1423 1.1 mrg else 1424 1.1 mrg visit (DECL_NAME (t)); 1425 1.1 mrg if (DECL_FILE_SCOPE_P (t)) 1426 1.1 mrg ; 1427 1.1 mrg else 1428 1.1 mrg visit (DECL_CONTEXT (t)); 1429 1.1 mrg } 1430 1.1 mrg 1431 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 1432 1.1 mrg { 1433 1.1 mrg visit (DECL_SIZE (t)); 1434 1.1 mrg visit (DECL_SIZE_UNIT (t)); 1435 1.1 mrg visit (DECL_ATTRIBUTES (t)); 1436 1.1 mrg if ((code == VAR_DECL 1437 1.1 mrg || code == PARM_DECL) 1438 1.1 mrg && DECL_HAS_VALUE_EXPR_P (t)) 1439 1.1 mrg visit (DECL_VALUE_EXPR (t)); 1440 1.1 mrg if (code == VAR_DECL 1441 1.1 mrg && DECL_HAS_DEBUG_EXPR_P (t)) 1442 1.1 mrg visit (DECL_DEBUG_EXPR (t)); 1443 1.1 mrg /* ??? Hash DECL_INITIAL as streamed. Needs the output-block to 1444 1.1 mrg be able to call get_symbol_initial_value. */ 1445 1.1 mrg } 1446 1.1 mrg 1447 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) 1448 1.1 mrg { 1449 1.1 mrg if (DECL_ASSEMBLER_NAME_SET_P (t)) 1450 1.1 mrg visit (DECL_ASSEMBLER_NAME (t)); 1451 1.1 mrg } 1452 1.1 mrg 1453 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL)) 1454 1.1 mrg { 1455 1.1 mrg visit (DECL_FIELD_OFFSET (t)); 1456 1.1 mrg visit (DECL_BIT_FIELD_TYPE (t)); 1457 1.1 mrg visit (DECL_BIT_FIELD_REPRESENTATIVE (t)); 1458 1.1 mrg visit (DECL_FIELD_BIT_OFFSET (t)); 1459 1.1 mrg } 1460 1.1 mrg 1461 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL)) 1462 1.1 mrg { 1463 1.1 mrg visit (DECL_FUNCTION_PERSONALITY (t)); 1464 1.1 mrg visit (DECL_FUNCTION_SPECIFIC_TARGET (t)); 1465 1.1 mrg visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t)); 1466 1.1 mrg } 1467 1.1 mrg 1468 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON)) 1469 1.1 mrg { 1470 1.1 mrg visit (TYPE_SIZE (t)); 1471 1.1 mrg visit (TYPE_SIZE_UNIT (t)); 1472 1.1 mrg visit (TYPE_ATTRIBUTES (t)); 1473 1.1 mrg visit (TYPE_NAME (t)); 1474 1.1 mrg visit (TYPE_MAIN_VARIANT (t)); 1475 1.1 mrg if (TYPE_FILE_SCOPE_P (t)) 1476 1.1 mrg ; 1477 1.1 mrg else 1478 1.1 mrg visit (TYPE_CONTEXT (t)); 1479 1.1 mrg } 1480 1.1 mrg 1481 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON)) 1482 1.1 mrg { 1483 1.1 mrg if (code == ARRAY_TYPE) 1484 1.1 mrg visit (TYPE_DOMAIN (t)); 1485 1.1 mrg else if (RECORD_OR_UNION_TYPE_P (t)) 1486 1.1 mrg for (tree f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f)) 1487 1.1 mrg visit (f); 1488 1.1 mrg else if (code == FUNCTION_TYPE 1489 1.1 mrg || code == METHOD_TYPE) 1490 1.1 mrg visit (TYPE_ARG_TYPES (t)); 1491 1.1 mrg if (!POINTER_TYPE_P (t)) 1492 1.1 mrg visit (TYPE_MIN_VALUE_RAW (t)); 1493 1.1 mrg visit (TYPE_MAX_VALUE_RAW (t)); 1494 1.1 mrg } 1495 1.1 mrg 1496 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_LIST)) 1497 1.1 mrg { 1498 1.1 mrg visit (TREE_PURPOSE (t)); 1499 1.1 mrg visit (TREE_VALUE (t)); 1500 1.1 mrg visit (TREE_CHAIN (t)); 1501 1.1 mrg } 1502 1.1 mrg 1503 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_VEC)) 1504 1.1 mrg for (int i = 0; i < TREE_VEC_LENGTH (t); ++i) 1505 1.1 mrg visit (TREE_VEC_ELT (t, i)); 1506 1.1 mrg 1507 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_EXP)) 1508 1.1 mrg { 1509 1.1 mrg hstate.add_hwi (TREE_OPERAND_LENGTH (t)); 1510 1.1 mrg for (int i = 0; i < TREE_OPERAND_LENGTH (t); ++i) 1511 1.1 mrg visit (TREE_OPERAND (t, i)); 1512 1.1 mrg } 1513 1.1 mrg 1514 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_BINFO)) 1515 1.1 mrg { 1516 1.1 mrg unsigned i; 1517 1.1 mrg tree b; 1518 1.1 mrg FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t), i, b) 1519 1.1 mrg visit (b); 1520 1.1 mrg visit (BINFO_OFFSET (t)); 1521 1.1 mrg visit (BINFO_VTABLE (t)); 1522 1.1 mrg /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX 1523 1.1 mrg BINFO_BASE_ACCESSES and BINFO_VPTR_INDEX; these are used 1524 1.1 mrg by C++ FE only. */ 1525 1.1 mrg } 1526 1.1 mrg 1527 1.1 mrg if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) 1528 1.1 mrg { 1529 1.1 mrg unsigned i; 1530 1.1 mrg tree index, value; 1531 1.1 mrg hstate.add_hwi (CONSTRUCTOR_NELTS (t)); 1532 1.1 mrg FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value) 1533 1.1 mrg { 1534 1.1 mrg visit (index); 1535 1.1 mrg visit (value); 1536 1.1 mrg } 1537 1.1 mrg } 1538 1.1 mrg 1539 1.1 mrg if (code == OMP_CLAUSE) 1540 1.1 mrg { 1541 1.1 mrg int i; 1542 1.1 mrg HOST_WIDE_INT val; 1543 1.1 mrg 1544 1.1 mrg hstate.add_hwi (OMP_CLAUSE_CODE (t)); 1545 1.1 mrg switch (OMP_CLAUSE_CODE (t)) 1546 1.1 mrg { 1547 1.1 mrg case OMP_CLAUSE_DEFAULT: 1548 1.1 mrg val = OMP_CLAUSE_DEFAULT_KIND (t); 1549 1.1 mrg break; 1550 1.1 mrg case OMP_CLAUSE_SCHEDULE: 1551 1.1 mrg val = OMP_CLAUSE_SCHEDULE_KIND (t); 1552 1.1 mrg break; 1553 1.1 mrg case OMP_CLAUSE_DEPEND: 1554 1.1 mrg val = OMP_CLAUSE_DEPEND_KIND (t); 1555 1.1 mrg break; 1556 1.1 mrg case OMP_CLAUSE_MAP: 1557 1.1 mrg val = OMP_CLAUSE_MAP_KIND (t); 1558 1.1 mrg break; 1559 1.1 mrg case OMP_CLAUSE_PROC_BIND: 1560 1.1 mrg val = OMP_CLAUSE_PROC_BIND_KIND (t); 1561 1.1 mrg break; 1562 1.1 mrg case OMP_CLAUSE_REDUCTION: 1563 1.1 mrg case OMP_CLAUSE_TASK_REDUCTION: 1564 1.1 mrg case OMP_CLAUSE_IN_REDUCTION: 1565 1.1 mrg val = OMP_CLAUSE_REDUCTION_CODE (t); 1566 1.1 mrg break; 1567 1.1 mrg default: 1568 1.1 mrg val = 0; 1569 1.1 mrg break; 1570 1.1 mrg } 1571 1.1 mrg hstate.add_hwi (val); 1572 1.1 mrg for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++) 1573 1.1 mrg visit (OMP_CLAUSE_OPERAND (t, i)); 1574 1.1 mrg visit (OMP_CLAUSE_CHAIN (t)); 1575 1.1 mrg } 1576 1.1 mrg 1577 1.1 mrg return hstate.end (); 1578 1.1 mrg 1579 1.1 mrg #undef visit 1580 1.1 mrg } 1581 1.1 mrg 1582 1.1 mrg /* Compare two SCC entries by their hash value for qsorting them. */ 1583 1.1 mrg 1584 1.1 mrg int 1585 1.1 mrg DFS::scc_entry_compare (const void *p1_, const void *p2_) 1586 1.1 mrg { 1587 1.1 mrg const scc_entry *p1 = (const scc_entry *) p1_; 1588 1.1 mrg const scc_entry *p2 = (const scc_entry *) p2_; 1589 1.1 mrg if (p1->hash < p2->hash) 1590 1.1 mrg return -1; 1591 1.1 mrg else if (p1->hash > p2->hash) 1592 1.1 mrg return 1; 1593 1.1 mrg return 0; 1594 1.1 mrg } 1595 1.1 mrg 1596 1.1 mrg /* Return a hash value for the SCC on the SCC stack from FIRST with SIZE. 1597 1.1 mrg THIS_REF_P and REF_P are as passed to lto_output_tree for FIRST. */ 1598 1.1 mrg 1599 1.1 mrg hashval_t 1600 1.1 mrg DFS::hash_scc (struct output_block *ob, unsigned first, unsigned size, 1601 1.1 mrg bool ref_p, bool this_ref_p) 1602 1.1 mrg { 1603 1.1 mrg unsigned int last_classes = 0, iterations = 0; 1604 1.1 mrg 1605 1.1 mrg /* Compute hash values for the SCC members. */ 1606 1.1 mrg for (unsigned i = 0; i < size; ++i) 1607 1.1 mrg sccstack[first+i].hash 1608 1.1 mrg = hash_tree (ob->writer_cache, NULL, sccstack[first+i].t); 1609 1.1 mrg 1610 1.1 mrg if (size == 1) 1611 1.1 mrg return sccstack[first].hash; 1612 1.1 mrg 1613 1.1 mrg /* We aim to get unique hash for every tree within SCC and compute hash value 1614 1.1 mrg of the whole SCC by combining all values together in a stable (entry-point 1615 1.1 mrg independent) order. This guarantees that the same SCC regions within 1616 1.1 mrg different translation units will get the same hash values and therefore 1617 1.1 mrg will be merged at WPA time. 1618 1.1 mrg 1619 1.1 mrg Often the hashes are already unique. In that case we compute the SCC hash 1620 1.1 mrg by combining individual hash values in an increasing order. 1621 1.1 mrg 1622 1.1 mrg If there are duplicates, we seek at least one tree with unique hash (and 1623 1.1 mrg pick one with minimal hash and this property). Then we obtain a stable 1624 1.1 mrg order by DFS walk starting from this unique tree and then use the index 1625 1.1 mrg within this order to make individual hash values unique. 1626 1.1 mrg 1627 1.1 mrg If there is no tree with unique hash, we iteratively propagate the hash 1628 1.1 mrg values across the internal edges of SCC. This usually quickly leads 1629 1.1 mrg to unique hashes. Consider, for example, an SCC containing two pointers 1630 1.1 mrg that are identical except for the types they point to and assume that 1631 1.1 mrg these types are also part of the SCC. The propagation will add the 1632 1.1 mrg points-to type information into their hash values. */ 1633 1.1 mrg do 1634 1.1 mrg { 1635 1.1 mrg /* Sort the SCC so we can easily check for uniqueness. */ 1636 1.1 mrg qsort (&sccstack[first], size, sizeof (scc_entry), scc_entry_compare); 1637 1.1 mrg 1638 1.1 mrg unsigned int classes = 1; 1639 1.1 mrg int firstunique = -1; 1640 1.1 mrg 1641 1.1 mrg /* Find the tree with lowest unique hash (if it exists) and compute 1642 1.1 mrg the number of equivalence classes. */ 1643 1.1 mrg if (sccstack[first].hash != sccstack[first+1].hash) 1644 1.1 mrg firstunique = 0; 1645 1.1 mrg for (unsigned i = 1; i < size; ++i) 1646 1.1 mrg if (sccstack[first+i-1].hash != sccstack[first+i].hash) 1647 1.1 mrg { 1648 1.1 mrg classes++; 1649 1.1 mrg if (firstunique == -1 1650 1.1 mrg && (i == size - 1 1651 1.1 mrg || sccstack[first+i+1].hash != sccstack[first+i].hash)) 1652 1.1 mrg firstunique = i; 1653 1.1 mrg } 1654 1.1 mrg 1655 1.1 mrg /* If we found a tree with unique hash, stop the iteration. */ 1656 1.1 mrg if (firstunique != -1 1657 1.1 mrg /* Also terminate if we run out of iterations or if the number of 1658 1.1 mrg equivalence classes is no longer increasing. 1659 1.1 mrg For example a cyclic list of trees that are all equivalent will 1660 1.1 mrg never have unique entry point; we however do not build such SCCs 1661 1.1 mrg in our IL. */ 1662 1.1 mrg || classes <= last_classes || iterations > 16) 1663 1.1 mrg { 1664 1.1 mrg hashval_t scc_hash; 1665 1.1 mrg 1666 1.1 mrg /* If some hashes are not unique (CLASSES != SIZE), use the DFS walk 1667 1.1 mrg starting from FIRSTUNIQUE to obtain a stable order. */ 1668 1.1 mrg if (classes != size && firstunique != -1) 1669 1.1 mrg { 1670 1.1 mrg hash_map <tree, hashval_t> map(size*2); 1671 1.1 mrg 1672 1.1 mrg /* Store hash values into a map, so we can associate them with 1673 1.1 mrg the reordered SCC. */ 1674 1.1 mrg for (unsigned i = 0; i < size; ++i) 1675 1.1 mrg map.put (sccstack[first+i].t, sccstack[first+i].hash); 1676 1.1 mrg 1677 1.1 mrg DFS again (ob, sccstack[first+firstunique].t, ref_p, this_ref_p, 1678 1.1 mrg true); 1679 1.1 mrg gcc_assert (again.sccstack.length () == size); 1680 1.1 mrg 1681 1.1 mrg memcpy (sccstack.address () + first, 1682 1.1 mrg again.sccstack.address (), 1683 1.1 mrg sizeof (scc_entry) * size); 1684 1.1 mrg 1685 1.1 mrg /* Update hash values of individual members by hashing in the 1686 1.1 mrg index within the stable order. This ensures uniqueness. 1687 1.1 mrg Also compute the SCC hash by mixing in all hash values in 1688 1.1 mrg the stable order we obtained. */ 1689 1.1 mrg sccstack[first].hash = *map.get (sccstack[first].t); 1690 1.1 mrg scc_hash = sccstack[first].hash; 1691 1.1 mrg for (unsigned i = 1; i < size; ++i) 1692 1.1 mrg { 1693 1.1 mrg sccstack[first+i].hash 1694 1.1 mrg = iterative_hash_hashval_t (i, 1695 1.1 mrg *map.get (sccstack[first+i].t)); 1696 1.1 mrg scc_hash 1697 1.1 mrg = iterative_hash_hashval_t (scc_hash, 1698 1.1 mrg sccstack[first+i].hash); 1699 1.1 mrg } 1700 1.1 mrg } 1701 1.1 mrg /* If we got a unique hash value for each tree, then sort already 1702 1.1 mrg ensured entry-point independent order. Only compute the final 1703 1.1 mrg SCC hash. 1704 1.1 mrg 1705 1.1 mrg If we failed to find the unique entry point, we go by the same 1706 1.1 mrg route. We will eventually introduce unwanted hash conflicts. */ 1707 1.1 mrg else 1708 1.1 mrg { 1709 1.1 mrg scc_hash = sccstack[first].hash; 1710 1.1 mrg for (unsigned i = 1; i < size; ++i) 1711 1.1 mrg scc_hash 1712 1.1 mrg = iterative_hash_hashval_t (scc_hash, sccstack[first+i].hash); 1713 1.1 mrg 1714 1.1 mrg /* We cannot 100% guarantee that the hash won't conflict so as 1715 1.1 mrg to make it impossible to find a unique hash. This however 1716 1.1 mrg should be an extremely rare case. ICE for now so possible 1717 1.1 mrg issues are found and evaluated. */ 1718 1.1 mrg gcc_checking_assert (classes == size); 1719 1.1 mrg } 1720 1.1 mrg 1721 1.1 mrg /* To avoid conflicts across SCCs, iteratively hash the whole SCC 1722 1.1 mrg hash into the hash of each element. */ 1723 1.1 mrg for (unsigned i = 0; i < size; ++i) 1724 1.1 mrg sccstack[first+i].hash 1725 1.1 mrg = iterative_hash_hashval_t (sccstack[first+i].hash, scc_hash); 1726 1.1 mrg return scc_hash; 1727 1.1 mrg } 1728 1.1 mrg 1729 1.1 mrg last_classes = classes; 1730 1.1 mrg iterations++; 1731 1.1 mrg 1732 1.1 mrg /* We failed to identify the entry point; propagate hash values across 1733 1.1 mrg the edges. */ 1734 1.1 mrg hash_map <tree, hashval_t> map(size*2); 1735 1.1 mrg 1736 1.1 mrg for (unsigned i = 0; i < size; ++i) 1737 1.1 mrg map.put (sccstack[first+i].t, sccstack[first+i].hash); 1738 1.1 mrg 1739 1.1 mrg for (unsigned i = 0; i < size; i++) 1740 1.1 mrg sccstack[first+i].hash 1741 1.1 mrg = hash_tree (ob->writer_cache, &map, sccstack[first+i].t); 1742 1.1 mrg } 1743 1.1 mrg while (true); 1744 1.1 mrg } 1745 1.1 mrg 1746 1.1 mrg /* DFS walk EXPR and stream SCCs of tree bodies if they are not 1747 1.1 mrg already in the streamer cache. Main routine called for 1748 1.1 mrg each visit of EXPR. */ 1749 1.1 mrg 1750 1.1 mrg void 1751 1.1 mrg DFS::DFS_write_tree (struct output_block *ob, sccs *from_state, 1752 1.1 mrg tree expr, bool ref_p, bool this_ref_p) 1753 1.1 mrg { 1754 1.1 mrg /* Handle special cases. */ 1755 1.1 mrg if (expr == NULL_TREE) 1756 1.1 mrg return; 1757 1.1 mrg 1758 1.1 mrg /* Do not DFS walk into indexable trees. */ 1759 1.1 mrg if (this_ref_p && tree_is_indexable (expr)) 1760 1.1 mrg return; 1761 1.1 mrg 1762 1.1 mrg /* Check if we already streamed EXPR. */ 1763 1.1 mrg if (streamer_tree_cache_lookup (ob->writer_cache, expr, NULL)) 1764 1.1 mrg { 1765 1.1 mrg /* Reference to a local tree makes entry also local. We always process 1766 1.1 mrg top of stack entry, so set max to number of entries in stack - 1. */ 1767 1.1 mrg if (ob->local_trees 1768 1.1 mrg && ob->local_trees->contains (expr)) 1769 1.1 mrg max_local_entry = sccstack.length () - 1; 1770 1.1 mrg return; 1771 1.1 mrg } 1772 1.1 mrg 1773 1.1 mrg worklist w; 1774 1.1 mrg w.expr = expr; 1775 1.1 mrg w.from_state = from_state; 1776 1.1 mrg w.cstate = NULL; 1777 1.1 mrg w.ref_p = ref_p; 1778 1.1 mrg w.this_ref_p = this_ref_p; 1779 1.1 mrg worklist_vec.safe_push (w); 1780 1.1 mrg } 1781 1.1 mrg 1782 1.1 mrg 1783 1.1 mrg /* Emit the physical representation of tree node EXPR to output block OB. 1784 1.1 mrg If THIS_REF_P is true, the leaves of EXPR are emitted as references via 1785 1.1 mrg lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */ 1786 1.1 mrg 1787 1.1 mrg void 1788 1.1 mrg lto_output_tree (struct output_block *ob, tree expr, 1789 1.1 mrg bool ref_p, bool this_ref_p) 1790 1.1 mrg { 1791 1.1 mrg unsigned ix; 1792 1.1 mrg bool existed_p; 1793 1.1 mrg unsigned int size = ob->main_stream->total_size; 1794 1.1 mrg /* This is the first time we see EXPR, write all reachable 1795 1.1 mrg trees to OB. */ 1796 1.1 mrg static bool in_dfs_walk; 1797 1.1 mrg 1798 1.1 mrg if (expr == NULL_TREE) 1799 1.1 mrg { 1800 1.1 mrg streamer_write_record_start (ob, LTO_null); 1801 1.1 mrg return; 1802 1.1 mrg } 1803 1.1 mrg 1804 1.1 mrg if (this_ref_p && tree_is_indexable (expr)) 1805 1.1 mrg { 1806 1.1 mrg enum LTO_tags tag; 1807 1.1 mrg unsigned ix; 1808 1.1 mrg 1809 1.1 mrg lto_indexable_tree_ref (ob, expr, &tag, &ix); 1810 1.1 mrg streamer_write_record_start (ob, tag); 1811 1.1 mrg streamer_write_uhwi (ob, ix); 1812 1.1 mrg return; 1813 1.1 mrg } 1814 1.1 mrg 1815 1.1 mrg existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix); 1816 1.1 mrg if (existed_p) 1817 1.1 mrg { 1818 1.1 mrg if (streamer_dump_file) 1819 1.1 mrg { 1820 1.1 mrg if (in_dfs_walk) 1821 1.1 mrg print_node_brief (streamer_dump_file, " Streaming ref to ", 1822 1.1 mrg expr, 4); 1823 1.1 mrg else 1824 1.1 mrg print_node_brief (streamer_dump_file, " Streaming ref to ", 1825 1.1 mrg expr, 4); 1826 1.1 mrg fprintf (streamer_dump_file, "\n"); 1827 1.1 mrg } 1828 1.1 mrg /* If a node has already been streamed out, make sure that 1829 1.1 mrg we don't write it more than once. Otherwise, the reader 1830 1.1 mrg will instantiate two different nodes for the same object. */ 1831 1.1 mrg streamer_write_record_start (ob, LTO_tree_pickle_reference); 1832 1.1 mrg streamer_write_uhwi (ob, ix); 1833 1.1 mrg if (streamer_debugging) 1834 1.1 mrg streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS, 1835 1.1 mrg lto_tree_code_to_tag (TREE_CODE (expr))); 1836 1.1 mrg lto_stats.num_pickle_refs_output++; 1837 1.1 mrg } 1838 1.1 mrg else 1839 1.1 mrg { 1840 1.1 mrg /* Protect against recursion which means disconnect between 1841 1.1 mrg what tree edges we walk in the DFS walk and what edges 1842 1.1 mrg we stream out. */ 1843 1.1 mrg gcc_assert (!in_dfs_walk); 1844 1.1 mrg 1845 1.1 mrg if (streamer_dump_file) 1846 1.1 mrg { 1847 1.1 mrg print_node_brief (streamer_dump_file, " Streaming tree ", 1848 1.1 mrg expr, 4); 1849 1.1 mrg fprintf (streamer_dump_file, "\n"); 1850 1.1 mrg } 1851 1.1 mrg 1852 1.1 mrg /* Start the DFS walk. */ 1853 1.1 mrg /* Save ob state ... */ 1854 1.1 mrg /* let's see ... */ 1855 1.1 mrg in_dfs_walk = true; 1856 1.1 mrg DFS (ob, expr, ref_p, this_ref_p, false); 1857 1.1 mrg 1858 1.1 mrg /* Finally append a reference to the tree we were writing. */ 1859 1.1 mrg existed_p = streamer_tree_cache_lookup (ob->writer_cache, expr, &ix); 1860 1.1 mrg 1861 1.1 mrg /* DFS walk above possibly skipped streaming EXPR itself to let us inline 1862 1.1 mrg it. */ 1863 1.1 mrg if (!existed_p) 1864 1.1 mrg lto_output_tree_1 (ob, expr, 0, ref_p, this_ref_p); 1865 1.1 mrg else if (this_ref_p) 1866 1.1 mrg { 1867 1.1 mrg if (streamer_dump_file) 1868 1.1 mrg { 1869 1.1 mrg print_node_brief (streamer_dump_file, 1870 1.1 mrg " Streaming final ref to ", 1871 1.1 mrg expr, 4); 1872 1.1 mrg fprintf (streamer_dump_file, "\n"); 1873 1.1 mrg } 1874 1.1 mrg streamer_write_record_start (ob, LTO_tree_pickle_reference); 1875 1.1 mrg streamer_write_uhwi (ob, ix); 1876 1.1 mrg if (streamer_debugging) 1877 1.1 mrg streamer_write_enum (ob->main_stream, LTO_tags, LTO_NUM_TAGS, 1878 1.1 mrg lto_tree_code_to_tag (TREE_CODE (expr))); 1879 1.1 mrg } 1880 1.1 mrg in_dfs_walk = false; 1881 1.1 mrg lto_stats.num_pickle_refs_output++; 1882 1.1 mrg } 1883 1.1 mrg if (streamer_dump_file && !in_dfs_walk) 1884 1.1 mrg fprintf (streamer_dump_file, " %u bytes\n", 1885 1.1 mrg ob->main_stream->total_size - size); 1886 1.1 mrg } 1887 1.1 mrg 1888 1.1 mrg 1889 1.1 mrg /* Output to OB a list of try/catch handlers starting with FIRST. */ 1890 1.1 mrg 1891 1.1 mrg static void 1892 1.1 mrg output_eh_try_list (struct output_block *ob, eh_catch first) 1893 1.1 mrg { 1894 1.1 mrg eh_catch n; 1895 1.1 mrg 1896 1.1 mrg for (n = first; n; n = n->next_catch) 1897 1.1 mrg { 1898 1.1 mrg streamer_write_record_start (ob, LTO_eh_catch); 1899 1.1 mrg stream_write_tree (ob, n->type_list, true); 1900 1.1 mrg stream_write_tree (ob, n->filter_list, true); 1901 1.1 mrg stream_write_tree (ob, n->label, true); 1902 1.1 mrg } 1903 1.1 mrg 1904 1.1 mrg streamer_write_record_start (ob, LTO_null); 1905 1.1 mrg } 1906 1.1 mrg 1907 1.1 mrg 1908 1.1 mrg /* Output EH region R in function FN to OB. CURR_RN is the slot index 1909 1.1 mrg that is being emitted in FN->EH->REGION_ARRAY. This is used to 1910 1.1 mrg detect EH region sharing. */ 1911 1.1 mrg 1912 1.1 mrg static void 1913 1.1 mrg output_eh_region (struct output_block *ob, eh_region r) 1914 1.1 mrg { 1915 1.1 mrg enum LTO_tags tag; 1916 1.1 mrg 1917 1.1 mrg if (r == NULL) 1918 1.1 mrg { 1919 1.1 mrg streamer_write_record_start (ob, LTO_null); 1920 1.1 mrg return; 1921 1.1 mrg } 1922 1.1 mrg 1923 1.1 mrg if (r->type == ERT_CLEANUP) 1924 1.1 mrg tag = LTO_ert_cleanup; 1925 1.1 mrg else if (r->type == ERT_TRY) 1926 1.1 mrg tag = LTO_ert_try; 1927 1.1 mrg else if (r->type == ERT_ALLOWED_EXCEPTIONS) 1928 1.1 mrg tag = LTO_ert_allowed_exceptions; 1929 1.1 mrg else if (r->type == ERT_MUST_NOT_THROW) 1930 1.1 mrg tag = LTO_ert_must_not_throw; 1931 1.1 mrg else 1932 1.1 mrg gcc_unreachable (); 1933 1.1 mrg 1934 1.1 mrg streamer_write_record_start (ob, tag); 1935 1.1 mrg streamer_write_hwi (ob, r->index); 1936 1.1 mrg 1937 1.1 mrg if (r->outer) 1938 1.1 mrg streamer_write_hwi (ob, r->outer->index); 1939 1.1 mrg else 1940 1.1 mrg streamer_write_zero (ob); 1941 1.1 mrg 1942 1.1 mrg if (r->inner) 1943 1.1 mrg streamer_write_hwi (ob, r->inner->index); 1944 1.1 mrg else 1945 1.1 mrg streamer_write_zero (ob); 1946 1.1 mrg 1947 1.1 mrg if (r->next_peer) 1948 1.1 mrg streamer_write_hwi (ob, r->next_peer->index); 1949 1.1 mrg else 1950 1.1 mrg streamer_write_zero (ob); 1951 1.1 mrg 1952 1.1 mrg if (r->type == ERT_TRY) 1953 1.1 mrg { 1954 1.1 mrg output_eh_try_list (ob, r->u.eh_try.first_catch); 1955 1.1 mrg } 1956 1.1 mrg else if (r->type == ERT_ALLOWED_EXCEPTIONS) 1957 1.1 mrg { 1958 1.1 mrg stream_write_tree (ob, r->u.allowed.type_list, true); 1959 1.1 mrg stream_write_tree (ob, r->u.allowed.label, true); 1960 1.1 mrg streamer_write_uhwi (ob, r->u.allowed.filter); 1961 1.1 mrg } 1962 1.1 mrg else if (r->type == ERT_MUST_NOT_THROW) 1963 1.1 mrg { 1964 1.1 mrg stream_write_tree (ob, r->u.must_not_throw.failure_decl, true); 1965 1.1 mrg bitpack_d bp = bitpack_create (ob->main_stream); 1966 1.1 mrg stream_output_location (ob, &bp, r->u.must_not_throw.failure_loc); 1967 1.1 mrg streamer_write_bitpack (&bp); 1968 1.1 mrg } 1969 1.1 mrg 1970 1.1 mrg if (r->landing_pads) 1971 1.1 mrg streamer_write_hwi (ob, r->landing_pads->index); 1972 1.1 mrg else 1973 1.1 mrg streamer_write_zero (ob); 1974 1.1 mrg } 1975 1.1 mrg 1976 1.1 mrg 1977 1.1 mrg /* Output landing pad LP to OB. */ 1978 1.1 mrg 1979 1.1 mrg static void 1980 1.1 mrg output_eh_lp (struct output_block *ob, eh_landing_pad lp) 1981 1.1 mrg { 1982 1.1 mrg if (lp == NULL) 1983 1.1 mrg { 1984 1.1 mrg streamer_write_record_start (ob, LTO_null); 1985 1.1 mrg return; 1986 1.1 mrg } 1987 1.1 mrg 1988 1.1 mrg streamer_write_record_start (ob, LTO_eh_landing_pad); 1989 1.1 mrg streamer_write_hwi (ob, lp->index); 1990 1.1 mrg if (lp->next_lp) 1991 1.1 mrg streamer_write_hwi (ob, lp->next_lp->index); 1992 1.1 mrg else 1993 1.1 mrg streamer_write_zero (ob); 1994 1.1 mrg 1995 1.1 mrg if (lp->region) 1996 1.1 mrg streamer_write_hwi (ob, lp->region->index); 1997 1.1 mrg else 1998 1.1 mrg streamer_write_zero (ob); 1999 1.1 mrg 2000 1.1 mrg stream_write_tree (ob, lp->post_landing_pad, true); 2001 1.1 mrg } 2002 1.1 mrg 2003 1.1 mrg 2004 1.1 mrg /* Output the existing eh_table to OB. */ 2005 1.1 mrg 2006 1.1 mrg static void 2007 1.1 mrg output_eh_regions (struct output_block *ob, struct function *fn) 2008 1.1 mrg { 2009 1.1 mrg if (fn->eh && fn->eh->region_tree) 2010 1.1 mrg { 2011 1.1 mrg unsigned i; 2012 1.1 mrg eh_region eh; 2013 1.1 mrg eh_landing_pad lp; 2014 1.1 mrg tree ttype; 2015 1.1 mrg 2016 1.1 mrg streamer_write_record_start (ob, LTO_eh_table); 2017 1.1 mrg 2018 1.1 mrg /* Emit the index of the root of the EH region tree. */ 2019 1.1 mrg streamer_write_hwi (ob, fn->eh->region_tree->index); 2020 1.1 mrg 2021 1.1 mrg /* Emit all the EH regions in the region array. */ 2022 1.1 mrg streamer_write_hwi (ob, vec_safe_length (fn->eh->region_array)); 2023 1.1 mrg FOR_EACH_VEC_SAFE_ELT (fn->eh->region_array, i, eh) 2024 1.1 mrg output_eh_region (ob, eh); 2025 1.1 mrg 2026 1.1 mrg /* Emit all landing pads. */ 2027 1.1 mrg streamer_write_hwi (ob, vec_safe_length (fn->eh->lp_array)); 2028 1.1 mrg FOR_EACH_VEC_SAFE_ELT (fn->eh->lp_array, i, lp) 2029 1.1 mrg output_eh_lp (ob, lp); 2030 1.1 mrg 2031 1.1 mrg /* Emit all the runtime type data. */ 2032 1.1 mrg streamer_write_hwi (ob, vec_safe_length (fn->eh->ttype_data)); 2033 1.1 mrg FOR_EACH_VEC_SAFE_ELT (fn->eh->ttype_data, i, ttype) 2034 1.1 mrg stream_write_tree (ob, ttype, true); 2035 1.1 mrg 2036 1.1 mrg /* Emit the table of action chains. */ 2037 1.1 mrg if (targetm.arm_eabi_unwinder) 2038 1.1 mrg { 2039 1.1 mrg tree t; 2040 1.1 mrg streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.arm_eabi)); 2041 1.1 mrg FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.arm_eabi, i, t) 2042 1.1 mrg stream_write_tree (ob, t, true); 2043 1.1 mrg } 2044 1.1 mrg else 2045 1.1 mrg { 2046 1.1 mrg uchar c; 2047 1.1 mrg streamer_write_hwi (ob, vec_safe_length (fn->eh->ehspec_data.other)); 2048 1.1 mrg FOR_EACH_VEC_SAFE_ELT (fn->eh->ehspec_data.other, i, c) 2049 1.1 mrg streamer_write_char_stream (ob->main_stream, c); 2050 1.1 mrg } 2051 1.1 mrg } 2052 1.1 mrg 2053 1.1 mrg /* The LTO_null either terminates the record or indicates that there 2054 1.1 mrg are no eh_records at all. */ 2055 1.1 mrg streamer_write_record_start (ob, LTO_null); 2056 1.1 mrg } 2057 1.1 mrg 2058 1.1 mrg 2059 1.1 mrg /* Output all of the active ssa names to the ssa_names stream. */ 2060 1.1 mrg 2061 1.1 mrg static void 2062 1.1 mrg output_ssa_names (struct output_block *ob, struct function *fn) 2063 1.1 mrg { 2064 1.1 mrg unsigned int i, len; 2065 1.1 mrg 2066 1.1 mrg len = vec_safe_length (SSANAMES (fn)); 2067 1.1 mrg streamer_write_uhwi (ob, len); 2068 1.1 mrg 2069 1.1 mrg for (i = 1; i < len; i++) 2070 1.1 mrg { 2071 1.1 mrg tree ptr = (*SSANAMES (fn))[i]; 2072 1.1 mrg 2073 1.1 mrg if (ptr == NULL_TREE 2074 1.1 mrg || SSA_NAME_IN_FREE_LIST (ptr) 2075 1.1 mrg || virtual_operand_p (ptr) 2076 1.1 mrg /* Simply skip unreleased SSA names. */ 2077 1.1 mrg || (! SSA_NAME_IS_DEFAULT_DEF (ptr) 2078 1.1 mrg && (! SSA_NAME_DEF_STMT (ptr) 2079 1.1 mrg || ! gimple_bb (SSA_NAME_DEF_STMT (ptr))))) 2080 1.1 mrg continue; 2081 1.1 mrg 2082 1.1 mrg streamer_write_uhwi (ob, i); 2083 1.1 mrg streamer_write_char_stream (ob->main_stream, 2084 1.1 mrg SSA_NAME_IS_DEFAULT_DEF (ptr)); 2085 1.1 mrg if (SSA_NAME_VAR (ptr)) 2086 1.1 mrg stream_write_tree (ob, SSA_NAME_VAR (ptr), true); 2087 1.1 mrg else 2088 1.1 mrg /* ??? This drops SSA_NAME_IDENTIFIER on the floor. */ 2089 1.1 mrg stream_write_tree (ob, TREE_TYPE (ptr), true); 2090 1.1 mrg } 2091 1.1 mrg 2092 1.1 mrg streamer_write_zero (ob); 2093 1.1 mrg } 2094 1.1 mrg 2095 1.1 mrg 2096 1.1 mrg 2097 1.1 mrg /* Output the cfg. */ 2098 1.1 mrg 2099 1.1 mrg static void 2100 1.1 mrg output_cfg (struct output_block *ob, struct function *fn) 2101 1.1 mrg { 2102 1.1 mrg struct lto_output_stream *tmp_stream = ob->main_stream; 2103 1.1 mrg basic_block bb; 2104 1.1 mrg 2105 1.1 mrg ob->main_stream = ob->cfg_stream; 2106 1.1 mrg 2107 1.1 mrg streamer_write_enum (ob->main_stream, profile_status_d, PROFILE_LAST, 2108 1.1 mrg profile_status_for_fn (fn)); 2109 1.1 mrg 2110 1.1 mrg /* Output the number of the highest basic block. */ 2111 1.1 mrg streamer_write_uhwi (ob, last_basic_block_for_fn (fn)); 2112 1.1 mrg 2113 1.1 mrg FOR_ALL_BB_FN (bb, fn) 2114 1.1 mrg { 2115 1.1 mrg edge_iterator ei; 2116 1.1 mrg edge e; 2117 1.1 mrg 2118 1.1 mrg streamer_write_hwi (ob, bb->index); 2119 1.1 mrg 2120 1.1 mrg /* Output the successors and the edge flags. */ 2121 1.1 mrg streamer_write_uhwi (ob, EDGE_COUNT (bb->succs)); 2122 1.1 mrg FOR_EACH_EDGE (e, ei, bb->succs) 2123 1.1 mrg { 2124 1.1 mrg bitpack_d bp = bitpack_create (ob->main_stream); 2125 1.1 mrg bp_pack_var_len_unsigned (&bp, e->dest->index); 2126 1.1 mrg bp_pack_var_len_unsigned (&bp, e->flags); 2127 1.1 mrg stream_output_location_and_block (ob, &bp, e->goto_locus); 2128 1.1 mrg e->probability.stream_out (ob); 2129 1.1 mrg } 2130 1.1 mrg } 2131 1.1 mrg 2132 1.1 mrg streamer_write_hwi (ob, -1); 2133 1.1 mrg 2134 1.1 mrg bb = ENTRY_BLOCK_PTR_FOR_FN (fn); 2135 1.1 mrg while (bb->next_bb) 2136 1.1 mrg { 2137 1.1 mrg streamer_write_hwi (ob, bb->next_bb->index); 2138 1.1 mrg bb = bb->next_bb; 2139 1.1 mrg } 2140 1.1 mrg 2141 1.1 mrg streamer_write_hwi (ob, -1); 2142 1.1 mrg 2143 1.1 mrg /* Output the number of loops. */ 2144 1.1 mrg streamer_write_uhwi (ob, number_of_loops (fn)); 2145 1.1 mrg 2146 1.1 mrg /* Output each loop, skipping the tree root which has number zero. */ 2147 1.1 mrg for (unsigned i = 1; i < number_of_loops (fn); ++i) 2148 1.1 mrg { 2149 1.1 mrg class loop *loop = get_loop (fn, i); 2150 1.1 mrg 2151 1.1 mrg /* Write the index of the loop header. That's enough to rebuild 2152 1.1 mrg the loop tree on the reader side. Stream -1 for an unused 2153 1.1 mrg loop entry. */ 2154 1.1 mrg if (!loop) 2155 1.1 mrg { 2156 1.1 mrg streamer_write_hwi (ob, -1); 2157 1.1 mrg continue; 2158 1.1 mrg } 2159 1.1 mrg else 2160 1.1 mrg streamer_write_hwi (ob, loop->header->index); 2161 1.1 mrg 2162 1.1 mrg /* Write everything copy_loop_info copies. */ 2163 1.1 mrg streamer_write_enum (ob->main_stream, 2164 1.1 mrg loop_estimation, EST_LAST, loop->estimate_state); 2165 1.1 mrg streamer_write_hwi (ob, loop->any_upper_bound); 2166 1.1 mrg if (loop->any_upper_bound) 2167 1.1 mrg streamer_write_widest_int (ob, loop->nb_iterations_upper_bound); 2168 1.1 mrg streamer_write_hwi (ob, loop->any_likely_upper_bound); 2169 1.1 mrg if (loop->any_likely_upper_bound) 2170 1.1 mrg streamer_write_widest_int (ob, loop->nb_iterations_likely_upper_bound); 2171 1.1 mrg streamer_write_hwi (ob, loop->any_estimate); 2172 1.1 mrg if (loop->any_estimate) 2173 1.1 mrg streamer_write_widest_int (ob, loop->nb_iterations_estimate); 2174 1.1 mrg 2175 1.1 mrg /* Write OMP SIMD related info. */ 2176 1.1 mrg streamer_write_hwi (ob, loop->safelen); 2177 1.1 mrg streamer_write_hwi (ob, loop->unroll); 2178 1.1 mrg streamer_write_hwi (ob, loop->owned_clique); 2179 1.1 mrg streamer_write_hwi (ob, loop->dont_vectorize); 2180 1.1 mrg streamer_write_hwi (ob, loop->force_vectorize); 2181 1.1 mrg streamer_write_hwi (ob, loop->finite_p); 2182 1.1 mrg stream_write_tree (ob, loop->simduid, true); 2183 1.1 mrg } 2184 1.1 mrg 2185 1.1 mrg ob->main_stream = tmp_stream; 2186 1.1 mrg } 2187 1.1 mrg 2188 1.1 mrg 2189 1.1 mrg /* Create the header in the file using OB. If the section type is for 2190 1.1 mrg a function, set FN to the decl for that function. */ 2191 1.1 mrg 2192 1.1 mrg void 2193 1.1 mrg produce_asm (struct output_block *ob, tree fn) 2194 1.1 mrg { 2195 1.1 mrg enum lto_section_type section_type = ob->section_type; 2196 1.1 mrg struct lto_function_header header; 2197 1.1 mrg char *section_name; 2198 1.1 mrg 2199 1.1 mrg if (section_type == LTO_section_function_body) 2200 1.1 mrg { 2201 1.1 mrg const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fn)); 2202 1.1 mrg section_name = lto_get_section_name (section_type, name, 2203 1.1 mrg symtab_node::get (fn)->order, 2204 1.1 mrg NULL); 2205 1.1 mrg } 2206 1.1 mrg else 2207 1.1 mrg section_name = lto_get_section_name (section_type, NULL, 0, NULL); 2208 1.1 mrg 2209 1.1 mrg lto_begin_section (section_name, !flag_wpa); 2210 1.1 mrg free (section_name); 2211 1.1 mrg 2212 1.1 mrg /* The entire header is stream computed here. */ 2213 1.1 mrg memset (&header, 0, sizeof (struct lto_function_header)); 2214 1.1 mrg 2215 1.1 mrg if (section_type == LTO_section_function_body) 2216 1.1 mrg header.cfg_size = ob->cfg_stream->total_size; 2217 1.1 mrg header.main_size = ob->main_stream->total_size; 2218 1.1 mrg header.string_size = ob->string_stream->total_size; 2219 1.1 mrg lto_write_data (&header, sizeof header); 2220 1.1 mrg 2221 1.1 mrg /* Put all of the gimple and the string table out the asm file as a 2222 1.1 mrg block of text. */ 2223 1.1 mrg if (section_type == LTO_section_function_body) 2224 1.1 mrg lto_write_stream (ob->cfg_stream); 2225 1.1 mrg lto_write_stream (ob->main_stream); 2226 1.1 mrg lto_write_stream (ob->string_stream); 2227 1.1 mrg 2228 1.1 mrg lto_end_section (); 2229 1.1 mrg } 2230 1.1 mrg 2231 1.1 mrg 2232 1.1 mrg /* Output the base body of struct function FN using output block OB. */ 2233 1.1 mrg 2234 1.1 mrg static void 2235 1.1 mrg output_struct_function_base (struct output_block *ob, struct function *fn) 2236 1.1 mrg { 2237 1.1 mrg struct bitpack_d bp; 2238 1.1 mrg unsigned i; 2239 1.1 mrg tree t; 2240 1.1 mrg 2241 1.1 mrg /* Output the static chain and non-local goto save area. */ 2242 1.1 mrg stream_write_tree (ob, fn->static_chain_decl, true); 2243 1.1 mrg stream_write_tree (ob, fn->nonlocal_goto_save_area, true); 2244 1.1 mrg 2245 1.1 mrg /* Output all the local variables in the function. */ 2246 1.1 mrg streamer_write_hwi (ob, vec_safe_length (fn->local_decls)); 2247 1.1 mrg FOR_EACH_VEC_SAFE_ELT (fn->local_decls, i, t) 2248 1.1 mrg stream_write_tree (ob, t, true); 2249 1.1 mrg 2250 1.1 mrg /* Output current IL state of the function. */ 2251 1.1 mrg streamer_write_uhwi (ob, fn->curr_properties); 2252 1.1 mrg 2253 1.1 mrg /* Write all the attributes for FN. */ 2254 1.1 mrg bp = bitpack_create (ob->main_stream); 2255 1.1 mrg bp_pack_value (&bp, fn->is_thunk, 1); 2256 1.1 mrg bp_pack_value (&bp, fn->has_local_explicit_reg_vars, 1); 2257 1.1 mrg bp_pack_value (&bp, fn->returns_pcc_struct, 1); 2258 1.1 mrg bp_pack_value (&bp, fn->returns_struct, 1); 2259 1.1 mrg bp_pack_value (&bp, fn->can_throw_non_call_exceptions, 1); 2260 1.1 mrg bp_pack_value (&bp, fn->can_delete_dead_exceptions, 1); 2261 1.1 mrg bp_pack_value (&bp, fn->always_inline_functions_inlined, 1); 2262 1.1 mrg bp_pack_value (&bp, fn->after_inlining, 1); 2263 1.1 mrg bp_pack_value (&bp, fn->stdarg, 1); 2264 1.1 mrg bp_pack_value (&bp, fn->has_nonlocal_label, 1); 2265 1.1 mrg bp_pack_value (&bp, fn->has_forced_label_in_static, 1); 2266 1.1 mrg bp_pack_value (&bp, fn->calls_alloca, 1); 2267 1.1 mrg bp_pack_value (&bp, fn->calls_setjmp, 1); 2268 1.1 mrg bp_pack_value (&bp, fn->calls_eh_return, 1); 2269 1.1 mrg bp_pack_value (&bp, fn->has_force_vectorize_loops, 1); 2270 1.1 mrg bp_pack_value (&bp, fn->has_simduid_loops, 1); 2271 1.1 mrg bp_pack_value (&bp, fn->va_list_fpr_size, 8); 2272 1.1 mrg bp_pack_value (&bp, fn->va_list_gpr_size, 8); 2273 1.1 mrg bp_pack_value (&bp, fn->last_clique, sizeof (short) * 8); 2274 1.1 mrg 2275 1.1 mrg /* Output the function start and end loci. */ 2276 1.1 mrg stream_output_location (ob, &bp, fn->function_start_locus); 2277 1.1 mrg stream_output_location (ob, &bp, fn->function_end_locus); 2278 1.1 mrg 2279 1.1 mrg /* Save the instance discriminator if present. */ 2280 1.1 mrg int *instance_number_p = NULL; 2281 1.1 mrg if (decl_to_instance_map) 2282 1.1 mrg instance_number_p = decl_to_instance_map->get (fn->decl); 2283 1.1 mrg bp_pack_value (&bp, !!instance_number_p, 1); 2284 1.1 mrg if (instance_number_p) 2285 1.1 mrg bp_pack_value (&bp, *instance_number_p, sizeof (int) * CHAR_BIT); 2286 1.1 mrg 2287 1.1 mrg streamer_write_bitpack (&bp); 2288 1.1 mrg } 2289 1.1 mrg 2290 1.1 mrg 2291 1.1 mrg /* Collect all leaf BLOCKs beyond ROOT into LEAFS. */ 2292 1.1 mrg 2293 1.1 mrg static void 2294 1.1 mrg collect_block_tree_leafs (tree root, vec<tree> &leafs) 2295 1.1 mrg { 2296 1.1 mrg for (root = BLOCK_SUBBLOCKS (root); root; root = BLOCK_CHAIN (root)) 2297 1.1 mrg if (! BLOCK_SUBBLOCKS (root)) 2298 1.1 mrg leafs.safe_push (root); 2299 1.1 mrg else 2300 1.1 mrg collect_block_tree_leafs (root, leafs); 2301 1.1 mrg } 2302 1.1 mrg 2303 1.1 mrg /* This performs function body modifications that are needed for streaming 2304 1.1 mrg to work. */ 2305 1.1 mrg 2306 1.1 mrg void 2307 1.1 mrg lto_prepare_function_for_streaming (struct cgraph_node *node) 2308 1.1 mrg { 2309 1.1 mrg struct function *fn = DECL_STRUCT_FUNCTION (node->decl); 2310 1.1 mrg basic_block bb; 2311 1.1 mrg 2312 1.1 mrg if (number_of_loops (fn)) 2313 1.1 mrg { 2314 1.1 mrg push_cfun (fn); 2315 1.1 mrg loop_optimizer_init (AVOID_CFG_MODIFICATIONS); 2316 1.1 mrg loop_optimizer_finalize (); 2317 1.1 mrg pop_cfun (); 2318 1.1 mrg } 2319 1.1 mrg /* We will renumber the statements. The code that does this uses 2320 1.1 mrg the same ordering that we use for serializing them so we can use 2321 1.1 mrg the same code on the other end and not have to write out the 2322 1.1 mrg statement numbers. We do not assign UIDs to PHIs here because 2323 1.1 mrg virtual PHIs get re-computed on-the-fly which would make numbers 2324 1.1 mrg inconsistent. */ 2325 1.1 mrg set_gimple_stmt_max_uid (fn, 0); 2326 1.1 mrg FOR_ALL_BB_FN (bb, fn) 2327 1.1 mrg { 2328 1.1 mrg for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); 2329 1.1 mrg gsi_next (&gsi)) 2330 1.1 mrg { 2331 1.1 mrg gphi *stmt = gsi.phi (); 2332 1.1 mrg 2333 1.1 mrg /* Virtual PHIs are not going to be streamed. */ 2334 1.1 mrg if (!virtual_operand_p (gimple_phi_result (stmt))) 2335 1.1 mrg gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn)); 2336 1.1 mrg } 2337 1.1 mrg for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi); 2338 1.1 mrg gsi_next (&gsi)) 2339 1.1 mrg { 2340 1.1 mrg gimple *stmt = gsi_stmt (gsi); 2341 1.1 mrg gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn)); 2342 1.1 mrg } 2343 1.1 mrg } 2344 1.1 mrg /* To avoid keeping duplicate gimple IDs in the statements, renumber 2345 1.1 mrg virtual phis now. */ 2346 1.1 mrg FOR_ALL_BB_FN (bb, fn) 2347 1.1 mrg { 2348 1.1 mrg for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); 2349 1.1 mrg gsi_next (&gsi)) 2350 1.1 mrg { 2351 1.1 mrg gphi *stmt = gsi.phi (); 2352 1.1 mrg if (virtual_operand_p (gimple_phi_result (stmt))) 2353 1.1 mrg gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn)); 2354 1.1 mrg } 2355 1.1 mrg } 2356 1.1 mrg 2357 1.1 mrg } 2358 1.1 mrg 2359 1.1 mrg /* Emit the chain of tree nodes starting at T. OB is the output block 2360 1.1 mrg to write to. REF_P is true if chain elements should be emitted 2361 1.1 mrg as references. */ 2362 1.1 mrg 2363 1.1 mrg static void 2364 1.1 mrg streamer_write_chain (struct output_block *ob, tree t, bool ref_p) 2365 1.1 mrg { 2366 1.1 mrg while (t) 2367 1.1 mrg { 2368 1.1 mrg /* We avoid outputting external vars or functions by reference 2369 1.1 mrg to the global decls section as we do not want to have them 2370 1.1 mrg enter decl merging. We should not need to do this anymore because 2371 1.1 mrg free_lang_data removes them from block scopes. */ 2372 1.1 mrg gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t)); 2373 1.1 mrg stream_write_tree (ob, t, ref_p); 2374 1.1 mrg 2375 1.1 mrg t = TREE_CHAIN (t); 2376 1.1 mrg } 2377 1.1 mrg 2378 1.1 mrg /* Write a sentinel to terminate the chain. */ 2379 1.1 mrg stream_write_tree (ob, NULL_TREE, ref_p); 2380 1.1 mrg } 2381 1.1 mrg 2382 1.1 mrg /* Output the body of function NODE->DECL. */ 2383 1.1 mrg 2384 1.1 mrg static void 2385 1.1 mrg output_function (struct cgraph_node *node) 2386 1.1 mrg { 2387 1.1 mrg tree function; 2388 1.1 mrg struct function *fn; 2389 1.1 mrg basic_block bb; 2390 1.1 mrg struct output_block *ob; 2391 1.1 mrg 2392 1.1 mrg if (streamer_dump_file) 2393 1.1 mrg fprintf (streamer_dump_file, "\nStreaming body of %s\n", 2394 1.1 mrg node->dump_name ()); 2395 1.1 mrg 2396 1.1 mrg function = node->decl; 2397 1.1 mrg fn = DECL_STRUCT_FUNCTION (function); 2398 1.1 mrg ob = create_output_block (LTO_section_function_body); 2399 1.1 mrg 2400 1.1 mrg ob->symbol = node; 2401 1.1 mrg 2402 1.1 mrg gcc_assert (current_function_decl == NULL_TREE && cfun == NULL); 2403 1.1 mrg 2404 1.1 mrg /* Make string 0 be a NULL string. */ 2405 1.1 mrg streamer_write_char_stream (ob->string_stream, 0); 2406 1.1 mrg 2407 1.1 mrg streamer_write_record_start (ob, LTO_function); 2408 1.1 mrg 2409 1.1 mrg /* Output decls for parameters and args. */ 2410 1.1 mrg stream_write_tree (ob, DECL_RESULT (function), true); 2411 1.1 mrg streamer_write_chain (ob, DECL_ARGUMENTS (function), true); 2412 1.1 mrg 2413 1.1 mrg /* Output debug args if available. */ 2414 1.1 mrg vec<tree, va_gc> **debugargs = decl_debug_args_lookup (function); 2415 1.1 mrg if (! debugargs) 2416 1.1 mrg streamer_write_uhwi (ob, 0); 2417 1.1 mrg else 2418 1.1 mrg { 2419 1.1 mrg streamer_write_uhwi (ob, (*debugargs)->length ()); 2420 1.1 mrg for (unsigned i = 0; i < (*debugargs)->length (); ++i) 2421 1.1 mrg stream_write_tree (ob, (**debugargs)[i], true); 2422 1.1 mrg } 2423 1.1 mrg 2424 1.1 mrg /* Output DECL_INITIAL for the function, which contains the tree of 2425 1.1 mrg lexical scopes. */ 2426 1.1 mrg stream_write_tree (ob, DECL_INITIAL (function), true); 2427 1.1 mrg /* As we do not recurse into BLOCK_SUBBLOCKS but only BLOCK_SUPERCONTEXT 2428 1.1 mrg collect block tree leafs and stream those. */ 2429 1.1 mrg auto_vec<tree> block_tree_leafs; 2430 1.1 mrg if (DECL_INITIAL (function) && DECL_INITIAL (function) != error_mark_node) 2431 1.1 mrg collect_block_tree_leafs (DECL_INITIAL (function), block_tree_leafs); 2432 1.1 mrg streamer_write_uhwi (ob, block_tree_leafs.length ()); 2433 1.1 mrg for (unsigned i = 0; i < block_tree_leafs.length (); ++i) 2434 1.1 mrg stream_write_tree (ob, block_tree_leafs[i], true); 2435 1.1 mrg 2436 1.1 mrg /* We also stream abstract functions where we stream only stuff needed for 2437 1.1 mrg debug info. */ 2438 1.1 mrg if (gimple_has_body_p (function)) 2439 1.1 mrg { 2440 1.1 mrg streamer_write_uhwi (ob, 1); 2441 1.1 mrg output_struct_function_base (ob, fn); 2442 1.1 mrg 2443 1.1 mrg output_cfg (ob, fn); 2444 1.1 mrg 2445 1.1 mrg /* Output all the SSA names used in the function. */ 2446 1.1 mrg output_ssa_names (ob, fn); 2447 1.1 mrg 2448 1.1 mrg /* Output any exception handling regions. */ 2449 1.1 mrg output_eh_regions (ob, fn); 2450 1.1 mrg 2451 1.1 mrg /* Output the code for the function. */ 2452 1.1 mrg FOR_ALL_BB_FN (bb, fn) 2453 1.1 mrg output_bb (ob, bb, fn); 2454 1.1 mrg 2455 1.1 mrg /* The terminator for this function. */ 2456 1.1 mrg streamer_write_record_start (ob, LTO_null); 2457 1.1 mrg } 2458 1.1 mrg else 2459 1.1 mrg streamer_write_uhwi (ob, 0); 2460 1.1 mrg 2461 1.1 mrg /* Create a section to hold the pickled output of this function. */ 2462 1.1 mrg produce_asm (ob, function); 2463 1.1 mrg 2464 1.1 mrg destroy_output_block (ob); 2465 1.1 mrg if (streamer_dump_file) 2466 1.1 mrg fprintf (streamer_dump_file, "Finished streaming %s\n", 2467 1.1 mrg node->dump_name ()); 2468 1.1 mrg } 2469 1.1 mrg 2470 1.1 mrg /* Output the body of function NODE->DECL. */ 2471 1.1 mrg 2472 1.1 mrg static void 2473 1.1 mrg output_constructor (struct varpool_node *node) 2474 1.1 mrg { 2475 1.1 mrg tree var = node->decl; 2476 1.1 mrg struct output_block *ob; 2477 1.1 mrg 2478 1.1 mrg if (streamer_dump_file) 2479 1.1 mrg fprintf (streamer_dump_file, "\nStreaming constructor of %s\n", 2480 1.1 mrg node->dump_name ()); 2481 1.1 mrg 2482 1.1 mrg timevar_push (TV_IPA_LTO_CTORS_OUT); 2483 1.1 mrg ob = create_output_block (LTO_section_function_body); 2484 1.1 mrg 2485 1.1 mrg ob->symbol = node; 2486 1.1 mrg 2487 1.1 mrg /* Make string 0 be a NULL string. */ 2488 1.1 mrg streamer_write_char_stream (ob->string_stream, 0); 2489 1.1 mrg 2490 1.1 mrg /* Output DECL_INITIAL for the function, which contains the tree of 2491 1.1 mrg lexical scopes. */ 2492 1.1 mrg stream_write_tree (ob, DECL_INITIAL (var), true); 2493 1.1 mrg 2494 1.1 mrg /* Create a section to hold the pickled output of this function. */ 2495 1.1 mrg produce_asm (ob, var); 2496 1.1 mrg 2497 1.1 mrg destroy_output_block (ob); 2498 1.1 mrg if (streamer_dump_file) 2499 1.1 mrg fprintf (streamer_dump_file, "Finished streaming %s\n", 2500 1.1 mrg node->dump_name ()); 2501 1.1 mrg timevar_pop (TV_IPA_LTO_CTORS_OUT); 2502 1.1 mrg } 2503 1.1 mrg 2504 1.1 mrg 2505 1.1 mrg /* Emit toplevel asms. */ 2506 1.1 mrg 2507 1.1 mrg void 2508 1.1 mrg lto_output_toplevel_asms (void) 2509 1.1 mrg { 2510 1.1 mrg struct output_block *ob; 2511 1.1 mrg struct asm_node *can; 2512 1.1 mrg char *section_name; 2513 1.1 mrg struct lto_simple_header_with_strings header; 2514 1.1 mrg 2515 1.1 mrg if (!symtab->first_asm_symbol ()) 2516 1.1 mrg return; 2517 1.1 mrg 2518 1.1 mrg ob = create_output_block (LTO_section_asm); 2519 1.1 mrg 2520 1.1 mrg /* Make string 0 be a NULL string. */ 2521 1.1 mrg streamer_write_char_stream (ob->string_stream, 0); 2522 1.1 mrg 2523 1.1 mrg for (can = symtab->first_asm_symbol (); can; can = can->next) 2524 1.1 mrg { 2525 1.1 mrg streamer_write_string_cst (ob, ob->main_stream, can->asm_str); 2526 1.1 mrg streamer_write_hwi (ob, can->order); 2527 1.1 mrg } 2528 1.1 mrg 2529 1.1 mrg streamer_write_string_cst (ob, ob->main_stream, NULL_TREE); 2530 1.1 mrg 2531 1.1 mrg section_name = lto_get_section_name (LTO_section_asm, NULL, 0, NULL); 2532 1.1 mrg lto_begin_section (section_name, !flag_wpa); 2533 1.1 mrg free (section_name); 2534 1.1 mrg 2535 1.1 mrg /* The entire header stream is computed here. */ 2536 1.1 mrg memset (&header, 0, sizeof (header)); 2537 1.1 mrg 2538 1.1 mrg header.main_size = ob->main_stream->total_size; 2539 1.1 mrg header.string_size = ob->string_stream->total_size; 2540 1.1 mrg lto_write_data (&header, sizeof header); 2541 1.1 mrg 2542 1.1 mrg /* Put all of the gimple and the string table out the asm file as a 2543 1.1 mrg block of text. */ 2544 1.1 mrg lto_write_stream (ob->main_stream); 2545 1.1 mrg lto_write_stream (ob->string_stream); 2546 1.1 mrg 2547 1.1 mrg lto_end_section (); 2548 1.1 mrg 2549 1.1 mrg destroy_output_block (ob); 2550 1.1 mrg } 2551 1.1 mrg 2552 1.1 mrg 2553 1.1 mrg /* Copy the function body or variable constructor of NODE without deserializing. */ 2554 1.1 mrg 2555 1.1 mrg static void 2556 1.1 mrg copy_function_or_variable (struct symtab_node *node) 2557 1.1 mrg { 2558 1.1 mrg tree function = node->decl; 2559 1.1 mrg struct lto_file_decl_data *file_data = node->lto_file_data; 2560 1.1 mrg const char *data; 2561 1.1 mrg size_t len; 2562 1.1 mrg const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function)); 2563 1.1 mrg char *section_name = 2564 1.1 mrg lto_get_section_name (LTO_section_function_body, name, node->order, NULL); 2565 1.1 mrg size_t i, j; 2566 1.1 mrg struct lto_in_decl_state *in_state; 2567 1.1 mrg struct lto_out_decl_state *out_state = lto_get_out_decl_state (); 2568 1.1 mrg 2569 1.1 mrg if (streamer_dump_file) 2570 1.1 mrg fprintf (streamer_dump_file, "Copying section for %s\n", name); 2571 1.1 mrg lto_begin_section (section_name, false); 2572 1.1 mrg free (section_name); 2573 1.1 mrg 2574 1.1 mrg /* We may have renamed the declaration, e.g., a static function. */ 2575 1.1 mrg name = lto_get_decl_name_mapping (file_data, name); 2576 1.1 mrg 2577 1.1 mrg data = lto_get_raw_section_data (file_data, LTO_section_function_body, 2578 1.1 mrg name, node->order - file_data->order_base, 2579 1.1 mrg &len); 2580 1.1 mrg gcc_assert (data); 2581 1.1 mrg 2582 1.1 mrg /* Do a bit copy of the function body. */ 2583 1.1 mrg lto_write_raw_data (data, len); 2584 1.1 mrg 2585 1.1 mrg /* Copy decls. */ 2586 1.1 mrg in_state = 2587 1.1 mrg lto_get_function_in_decl_state (node->lto_file_data, function); 2588 1.1 mrg out_state->compressed = in_state->compressed; 2589 1.1 mrg gcc_assert (in_state); 2590 1.1 mrg 2591 1.1 mrg for (i = 0; i < LTO_N_DECL_STREAMS; i++) 2592 1.1 mrg { 2593 1.1 mrg size_t n = vec_safe_length (in_state->streams[i]); 2594 1.1 mrg vec<tree, va_gc> *trees = in_state->streams[i]; 2595 1.1 mrg struct lto_tree_ref_encoder *encoder = &(out_state->streams[i]); 2596 1.1 mrg 2597 1.1 mrg /* The out state must have the same indices and the in state. 2598 1.1 mrg So just copy the vector. All the encoders in the in state 2599 1.1 mrg must be empty where we reach here. */ 2600 1.1 mrg gcc_assert (lto_tree_ref_encoder_size (encoder) == 0); 2601 1.1 mrg encoder->trees.reserve_exact (n); 2602 1.1 mrg for (j = 0; j < n; j++) 2603 1.1 mrg encoder->trees.safe_push ((*trees)[j]); 2604 1.1 mrg } 2605 1.1 mrg 2606 1.1 mrg lto_free_raw_section_data (file_data, LTO_section_function_body, name, 2607 1.1 mrg data, len); 2608 1.1 mrg lto_end_section (); 2609 1.1 mrg } 2610 1.1 mrg 2611 1.1 mrg /* Wrap symbol references in *TP inside a type-preserving MEM_REF. */ 2612 1.1 mrg 2613 1.1 mrg static tree 2614 1.1 mrg wrap_refs (tree *tp, int *ws, void *) 2615 1.1 mrg { 2616 1.1 mrg tree t = *tp; 2617 1.1 mrg if (handled_component_p (t) 2618 1.1 mrg && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL 2619 1.1 mrg && TREE_PUBLIC (TREE_OPERAND (t, 0))) 2620 1.1 mrg { 2621 1.1 mrg tree decl = TREE_OPERAND (t, 0); 2622 1.1 mrg tree ptrtype = build_pointer_type (TREE_TYPE (decl)); 2623 1.1 mrg TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl), 2624 1.1 mrg build1 (ADDR_EXPR, ptrtype, decl), 2625 1.1 mrg build_int_cst (ptrtype, 0)); 2626 1.1 mrg TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl); 2627 1.1 mrg *ws = 0; 2628 1.1 mrg } 2629 1.1 mrg else if (TREE_CODE (t) == CONSTRUCTOR) 2630 1.1 mrg ; 2631 1.1 mrg else if (!EXPR_P (t)) 2632 1.1 mrg *ws = 0; 2633 1.1 mrg return NULL_TREE; 2634 1.1 mrg } 2635 1.1 mrg 2636 1.1 mrg /* Remove functions that are no longer used from offload_funcs, and mark the 2637 1.1 mrg remaining ones with DECL_PRESERVE_P. */ 2638 1.1 mrg 2639 1.1 mrg static void 2640 1.1 mrg prune_offload_funcs (void) 2641 1.1 mrg { 2642 1.1 mrg if (!offload_funcs) 2643 1.1 mrg return; 2644 1.1 mrg 2645 1.1 mrg unsigned ix, ix2; 2646 1.1 mrg tree *elem_ptr; 2647 1.1 mrg VEC_ORDERED_REMOVE_IF (*offload_funcs, ix, ix2, elem_ptr, 2648 1.1 mrg cgraph_node::get (*elem_ptr) == NULL); 2649 1.1 mrg 2650 1.1 mrg tree fn_decl; 2651 1.1 mrg FOR_EACH_VEC_ELT (*offload_funcs, ix, fn_decl) 2652 1.1 mrg DECL_PRESERVE_P (fn_decl) = 1; 2653 1.1 mrg } 2654 1.1 mrg 2655 1.1 mrg /* Produce LTO section that contains global information 2656 1.1 mrg about LTO bytecode. */ 2657 1.1 mrg 2658 1.1 mrg static void 2659 1.1 mrg produce_lto_section () 2660 1.1 mrg { 2661 1.1 mrg /* Stream LTO meta section. */ 2662 1.1 mrg output_block *ob = create_output_block (LTO_section_lto); 2663 1.1 mrg 2664 1.1 mrg char * section_name = lto_get_section_name (LTO_section_lto, NULL, 0, NULL); 2665 1.1 mrg lto_begin_section (section_name, false); 2666 1.1 mrg free (section_name); 2667 1.1 mrg 2668 1.1 mrg #ifdef HAVE_ZSTD_H 2669 1.1 mrg lto_compression compression = ZSTD; 2670 1.1 mrg #else 2671 1.1 mrg lto_compression compression = ZLIB; 2672 1.1 mrg #endif 2673 1.1 mrg 2674 1.1 mrg bool slim_object = flag_generate_lto && !flag_fat_lto_objects; 2675 1.1 mrg lto_section s 2676 1.1 mrg = { LTO_major_version, LTO_minor_version, slim_object, 0, 0 }; 2677 1.1 mrg s.set_compression (compression); 2678 1.1 mrg lto_write_data (&s, sizeof s); 2679 1.1 mrg lto_end_section (); 2680 1.1 mrg destroy_output_block (ob); 2681 1.1 mrg } 2682 1.1 mrg 2683 1.1 mrg /* Compare symbols to get them sorted by filename (to optimize streaming) */ 2684 1.1 mrg 2685 1.1 mrg static int 2686 1.1 mrg cmp_symbol_files (const void *pn1, const void *pn2, void *id_map_) 2687 1.1 mrg { 2688 1.1 mrg const symtab_node *n1 = *(const symtab_node * const *)pn1; 2689 1.1 mrg const symtab_node *n2 = *(const symtab_node * const *)pn2; 2690 1.1 mrg hash_map<lto_file_decl_data *, int> *id_map 2691 1.1 mrg = (hash_map<lto_file_decl_data *, int> *)id_map_; 2692 1.1 mrg 2693 1.1 mrg int file_order1 = n1->lto_file_data ? n1->lto_file_data->order : -1; 2694 1.1 mrg int file_order2 = n2->lto_file_data ? n2->lto_file_data->order : -1; 2695 1.1 mrg 2696 1.1 mrg /* Order files same way as they appeared in the command line to reduce 2697 1.1 mrg seeking while copying sections. */ 2698 1.1 mrg if (file_order1 != file_order2) 2699 1.1 mrg return file_order1 - file_order2; 2700 1.1 mrg 2701 1.1 mrg /* Order within static library. */ 2702 1.1 mrg if (n1->lto_file_data && n1->lto_file_data->id != n2->lto_file_data->id) 2703 1.1 mrg return *id_map->get (n1->lto_file_data) - *id_map->get (n2->lto_file_data); 2704 1.1 mrg 2705 1.1 mrg /* And finaly order by the definition order. */ 2706 1.1 mrg return n1->order - n2->order; 2707 1.1 mrg } 2708 1.1 mrg 2709 1.1 mrg /* Main entry point from the pass manager. */ 2710 1.1 mrg 2711 1.1 mrg void 2712 1.1 mrg lto_output (void) 2713 1.1 mrg { 2714 1.1 mrg struct lto_out_decl_state *decl_state; 2715 1.1 mrg bitmap output = NULL; 2716 1.1 mrg bitmap_obstack output_obstack; 2717 1.1 mrg unsigned int i, n_nodes; 2718 1.1 mrg lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder; 2719 1.1 mrg auto_vec<symtab_node *> symbols_to_copy; 2720 1.1 mrg 2721 1.1 mrg prune_offload_funcs (); 2722 1.1 mrg 2723 1.1 mrg if (flag_checking) 2724 1.1 mrg { 2725 1.1 mrg bitmap_obstack_initialize (&output_obstack); 2726 1.1 mrg output = BITMAP_ALLOC (&output_obstack); 2727 1.1 mrg } 2728 1.1 mrg 2729 1.1 mrg /* Initialize the streamer. */ 2730 1.1 mrg lto_streamer_init (); 2731 1.1 mrg 2732 1.1 mrg produce_lto_section (); 2733 1.1 mrg 2734 1.1 mrg n_nodes = lto_symtab_encoder_size (encoder); 2735 1.1 mrg /* Prepare vector of functions to output and then sort it to optimize 2736 1.1 mrg section copying. */ 2737 1.1 mrg for (i = 0; i < n_nodes; i++) 2738 1.1 mrg { 2739 1.1 mrg symtab_node *snode = lto_symtab_encoder_deref (encoder, i); 2740 1.1 mrg if (snode->alias) 2741 1.1 mrg continue; 2742 1.1 mrg if (cgraph_node *node = dyn_cast <cgraph_node *> (snode)) 2743 1.1 mrg { 2744 1.1 mrg if (lto_symtab_encoder_encode_body_p (encoder, node)) 2745 1.1 mrg symbols_to_copy.safe_push (node); 2746 1.1 mrg } 2747 1.1 mrg else if (varpool_node *node = dyn_cast <varpool_node *> (snode)) 2748 1.1 mrg { 2749 1.1 mrg /* Wrap symbol references inside the ctor in a type 2750 1.1 mrg preserving MEM_REF. */ 2751 1.1 mrg tree ctor = DECL_INITIAL (node->decl); 2752 1.1 mrg if (ctor && !in_lto_p) 2753 1.1 mrg walk_tree (&ctor, wrap_refs, NULL, NULL); 2754 1.1 mrg if (get_symbol_initial_value (encoder, node->decl) == error_mark_node 2755 1.1 mrg && lto_symtab_encoder_encode_initializer_p (encoder, node)) 2756 1.1 mrg symbols_to_copy.safe_push (node); 2757 1.1 mrg } 2758 1.1 mrg } 2759 1.1 mrg /* Map the section hash to an order it appears in symbols_to_copy 2760 1.1 mrg since we want to sort same ID symbols next to each other but need 2761 1.1 mrg to avoid making overall order depend on the actual hash value. */ 2762 1.1 mrg int order = 0; 2763 1.1 mrg hash_map<lto_file_decl_data *, int> id_map; 2764 1.1 mrg for (i = 0; i < symbols_to_copy.length (); ++i) 2765 1.1 mrg { 2766 1.1 mrg symtab_node *snode = symbols_to_copy[i]; 2767 1.1 mrg if (snode->lto_file_data) 2768 1.1 mrg { 2769 1.1 mrg bool existed_p = false; 2770 1.1 mrg int &ord = id_map.get_or_insert (snode->lto_file_data, &existed_p); 2771 1.1 mrg if (!existed_p) 2772 1.1 mrg ord = order++; 2773 1.1 mrg } 2774 1.1 mrg } 2775 1.1 mrg symbols_to_copy.sort (cmp_symbol_files, (void *)&id_map); 2776 1.1 mrg for (i = 0; i < symbols_to_copy.length (); i++) 2777 1.1 mrg { 2778 1.1 mrg symtab_node *snode = symbols_to_copy[i]; 2779 1.1 mrg cgraph_node *cnode; 2780 1.1 mrg varpool_node *vnode; 2781 1.1 mrg 2782 1.1 mrg if (flag_checking) 2783 1.1 mrg gcc_assert (bitmap_set_bit (output, DECL_UID (snode->decl))); 2784 1.1 mrg 2785 1.1 mrg decl_state = lto_new_out_decl_state (); 2786 1.1 mrg lto_push_out_decl_state (decl_state); 2787 1.1 mrg 2788 1.1 mrg if ((cnode = dyn_cast <cgraph_node *> (snode)) 2789 1.1 mrg && (gimple_has_body_p (cnode->decl) 2790 1.1 mrg || (!flag_wpa 2791 1.1 mrg && flag_incremental_link != INCREMENTAL_LINK_LTO) 2792 1.1 mrg /* Thunks have no body but they may be synthetized 2793 1.1 mrg at WPA time. */ 2794 1.1 mrg || DECL_ARGUMENTS (cnode->decl) 2795 1.1 mrg || cnode->declare_variant_alt)) 2796 1.1 mrg output_function (cnode); 2797 1.1 mrg else if ((vnode = dyn_cast <varpool_node *> (snode)) 2798 1.1 mrg && (DECL_INITIAL (vnode->decl) != error_mark_node 2799 1.1 mrg || (!flag_wpa 2800 1.1 mrg && flag_incremental_link != INCREMENTAL_LINK_LTO))) 2801 1.1 mrg output_constructor (vnode); 2802 1.1 mrg else 2803 1.1 mrg copy_function_or_variable (snode); 2804 1.1 mrg gcc_assert (lto_get_out_decl_state () == decl_state); 2805 1.1 mrg lto_pop_out_decl_state (); 2806 1.1 mrg lto_record_function_out_decl_state (snode->decl, decl_state); 2807 1.1 mrg } 2808 1.1 mrg 2809 1.1 mrg /* Emit the callgraph after emitting function bodies. This needs to 2810 1.1 mrg be done now to make sure that all the statements in every function 2811 1.1 mrg have been renumbered so that edges can be associated with call 2812 1.1 mrg statements using the statement UIDs. */ 2813 1.1 mrg output_symtab (); 2814 1.1 mrg 2815 1.1 mrg output_offload_tables (); 2816 1.1 mrg 2817 1.1 mrg if (flag_checking) 2818 1.1 mrg { 2819 1.1 mrg BITMAP_FREE (output); 2820 1.1 mrg bitmap_obstack_release (&output_obstack); 2821 1.1 mrg } 2822 1.1 mrg } 2823 1.1 mrg 2824 1.1 mrg /* Write each node in encoded by ENCODER to OB, as well as those reachable 2825 1.1 mrg from it and required for correct representation of its semantics. 2826 1.1 mrg Each node in ENCODER must be a global declaration or a type. A node 2827 1.1 mrg is written only once, even if it appears multiple times in the 2828 1.1 mrg vector. Certain transitively-reachable nodes, such as those 2829 1.1 mrg representing expressions, may be duplicated, but such nodes 2830 1.1 mrg must not appear in ENCODER itself. */ 2831 1.1 mrg 2832 1.1 mrg static void 2833 1.1 mrg write_global_stream (struct output_block *ob, 2834 1.1 mrg struct lto_tree_ref_encoder *encoder) 2835 1.1 mrg { 2836 1.1 mrg tree t; 2837 1.1 mrg size_t index; 2838 1.1 mrg const size_t size = lto_tree_ref_encoder_size (encoder); 2839 1.1 mrg 2840 1.1 mrg for (index = 0; index < size; index++) 2841 1.1 mrg { 2842 1.1 mrg t = lto_tree_ref_encoder_get_tree (encoder, index); 2843 1.1 mrg if (streamer_dump_file) 2844 1.1 mrg { 2845 1.1 mrg fprintf (streamer_dump_file, " %i:", (int)index); 2846 1.1 mrg print_node_brief (streamer_dump_file, "", t, 4); 2847 1.1 mrg fprintf (streamer_dump_file, "\n"); 2848 1.1 mrg } 2849 1.1 mrg if (!streamer_tree_cache_lookup (ob->writer_cache, t, NULL)) 2850 1.1 mrg stream_write_tree (ob, t, false); 2851 1.1 mrg } 2852 1.1 mrg } 2853 1.1 mrg 2854 1.1 mrg 2855 1.1 mrg /* Write a sequence of indices into the globals vector corresponding 2856 1.1 mrg to the trees in ENCODER. These are used by the reader to map the 2857 1.1 mrg indices used to refer to global entities within function bodies to 2858 1.1 mrg their referents. */ 2859 1.1 mrg 2860 1.1 mrg static void 2861 1.1 mrg write_global_references (struct output_block *ob, 2862 1.1 mrg struct lto_tree_ref_encoder *encoder) 2863 1.1 mrg { 2864 1.1 mrg tree t; 2865 1.1 mrg uint32_t index; 2866 1.1 mrg const uint32_t size = lto_tree_ref_encoder_size (encoder); 2867 1.1 mrg 2868 1.1 mrg /* Write size and slot indexes as 32-bit unsigned numbers. */ 2869 1.1 mrg uint32_t *data = XNEWVEC (uint32_t, size + 1); 2870 1.1 mrg data[0] = size; 2871 1.1 mrg 2872 1.1 mrg for (index = 0; index < size; index++) 2873 1.1 mrg { 2874 1.1 mrg unsigned slot_num; 2875 1.1 mrg 2876 1.1 mrg t = lto_tree_ref_encoder_get_tree (encoder, index); 2877 1.1 mrg streamer_tree_cache_lookup (ob->writer_cache, t, &slot_num); 2878 1.1 mrg gcc_assert (slot_num != (unsigned)-1); 2879 1.1 mrg data[index + 1] = slot_num; 2880 1.1 mrg } 2881 1.1 mrg 2882 1.1 mrg lto_write_data (data, sizeof (int32_t) * (size + 1)); 2883 1.1 mrg free (data); 2884 1.1 mrg } 2885 1.1 mrg 2886 1.1 mrg 2887 1.1 mrg /* Write all the streams in an lto_out_decl_state STATE using 2888 1.1 mrg output block OB and output stream OUT_STREAM. */ 2889 1.1 mrg 2890 1.1 mrg void 2891 1.1 mrg lto_output_decl_state_streams (struct output_block *ob, 2892 1.1 mrg struct lto_out_decl_state *state) 2893 1.1 mrg { 2894 1.1 mrg int i; 2895 1.1 mrg 2896 1.1 mrg for (i = 0; i < LTO_N_DECL_STREAMS; i++) 2897 1.1 mrg write_global_stream (ob, &state->streams[i]); 2898 1.1 mrg } 2899 1.1 mrg 2900 1.1 mrg 2901 1.1 mrg /* Write all the references in an lto_out_decl_state STATE using 2902 1.1 mrg output block OB and output stream OUT_STREAM. */ 2903 1.1 mrg 2904 1.1 mrg void 2905 1.1 mrg lto_output_decl_state_refs (struct output_block *ob, 2906 1.1 mrg struct lto_out_decl_state *state) 2907 1.1 mrg { 2908 1.1 mrg unsigned i; 2909 1.1 mrg unsigned ref; 2910 1.1 mrg tree decl; 2911 1.1 mrg 2912 1.1 mrg /* Write reference to FUNCTION_DECL. If there is not function, 2913 1.1 mrg write reference to void_type_node. */ 2914 1.1 mrg decl = (state->fn_decl) ? state->fn_decl : void_type_node; 2915 1.1 mrg streamer_tree_cache_lookup (ob->writer_cache, decl, &ref); 2916 1.1 mrg gcc_assert (ref != (unsigned)-1); 2917 1.1 mrg ref = ref * 2 + (state->compressed ? 1 : 0); 2918 1.1 mrg lto_write_data (&ref, sizeof (uint32_t)); 2919 1.1 mrg 2920 1.1 mrg for (i = 0; i < LTO_N_DECL_STREAMS; i++) 2921 1.1 mrg write_global_references (ob, &state->streams[i]); 2922 1.1 mrg } 2923 1.1 mrg 2924 1.1 mrg 2925 1.1 mrg /* Return the written size of STATE. */ 2926 1.1 mrg 2927 1.1 mrg static size_t 2928 1.1 mrg lto_out_decl_state_written_size (struct lto_out_decl_state *state) 2929 1.1 mrg { 2930 1.1 mrg int i; 2931 1.1 mrg size_t size; 2932 1.1 mrg 2933 1.1 mrg size = sizeof (int32_t); /* fn_ref. */ 2934 1.1 mrg for (i = 0; i < LTO_N_DECL_STREAMS; i++) 2935 1.1 mrg { 2936 1.1 mrg size += sizeof (int32_t); /* vector size. */ 2937 1.1 mrg size += (lto_tree_ref_encoder_size (&state->streams[i]) 2938 1.1 mrg * sizeof (int32_t)); 2939 1.1 mrg } 2940 1.1 mrg return size; 2941 1.1 mrg } 2942 1.1 mrg 2943 1.1 mrg 2944 1.1 mrg /* Write symbol T into STREAM in CACHE. SEEN specifies symbols we wrote 2945 1.1 mrg so far. */ 2946 1.1 mrg 2947 1.1 mrg static void 2948 1.1 mrg write_symbol (struct streamer_tree_cache_d *cache, 2949 1.1 mrg tree t, hash_set<const char *> *seen, bool alias) 2950 1.1 mrg { 2951 1.1 mrg const char *name; 2952 1.1 mrg enum gcc_plugin_symbol_kind kind; 2953 1.1 mrg enum gcc_plugin_symbol_visibility visibility = GCCPV_DEFAULT; 2954 1.1 mrg unsigned slot_num; 2955 1.1 mrg uint64_t size; 2956 1.1 mrg const char *comdat; 2957 1.1 mrg unsigned char c; 2958 1.1 mrg 2959 1.1 mrg gcc_assert (VAR_OR_FUNCTION_DECL_P (t)); 2960 1.1 mrg 2961 1.1 mrg name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t)); 2962 1.1 mrg 2963 1.1 mrg /* This behaves like assemble_name_raw in varasm.cc, performing the 2964 1.1 mrg same name manipulations that ASM_OUTPUT_LABELREF does. */ 2965 1.1 mrg name = IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) (name)); 2966 1.1 mrg 2967 1.1 mrg if (seen->add (name)) 2968 1.1 mrg return; 2969 1.1 mrg 2970 1.1 mrg streamer_tree_cache_lookup (cache, t, &slot_num); 2971 1.1 mrg gcc_assert (slot_num != (unsigned)-1); 2972 1.1 mrg 2973 1.1 mrg if (DECL_EXTERNAL (t)) 2974 1.1 mrg { 2975 1.1 mrg if (DECL_WEAK (t)) 2976 1.1 mrg kind = GCCPK_WEAKUNDEF; 2977 1.1 mrg else 2978 1.1 mrg kind = GCCPK_UNDEF; 2979 1.1 mrg } 2980 1.1 mrg else 2981 1.1 mrg { 2982 1.1 mrg if (DECL_WEAK (t)) 2983 1.1 mrg kind = GCCPK_WEAKDEF; 2984 1.1 mrg else if (DECL_COMMON (t)) 2985 1.1 mrg kind = GCCPK_COMMON; 2986 1.1 mrg else 2987 1.1 mrg kind = GCCPK_DEF; 2988 1.1 mrg 2989 1.1 mrg /* When something is defined, it should have node attached. */ 2990 1.1 mrg gcc_assert (alias || !VAR_P (t) || varpool_node::get (t)->definition); 2991 1.1 mrg gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL 2992 1.1 mrg || (cgraph_node::get (t) 2993 1.1 mrg && cgraph_node::get (t)->definition)); 2994 1.1 mrg } 2995 1.1 mrg 2996 1.1 mrg /* Imitate what default_elf_asm_output_external do. 2997 1.1 mrg When symbol is external, we need to output it with DEFAULT visibility 2998 1.1 mrg when compiling with -fvisibility=default, while with HIDDEN visibility 2999 1.1 mrg when symbol has attribute (visibility("hidden")) specified. 3000 1.1 mrg targetm.binds_local_p check DECL_VISIBILITY_SPECIFIED and gets this 3001 1.1 mrg right. */ 3002 1.1 mrg 3003 1.1 mrg if (DECL_EXTERNAL (t) 3004 1.1 mrg && !targetm.binds_local_p (t)) 3005 1.1 mrg visibility = GCCPV_DEFAULT; 3006 1.1 mrg else 3007 1.1 mrg switch (DECL_VISIBILITY (t)) 3008 1.1 mrg { 3009 1.1 mrg case VISIBILITY_DEFAULT: 3010 1.1 mrg visibility = GCCPV_DEFAULT; 3011 1.1 mrg break; 3012 1.1 mrg case VISIBILITY_PROTECTED: 3013 1.1 mrg visibility = GCCPV_PROTECTED; 3014 1.1 mrg break; 3015 1.1 mrg case VISIBILITY_HIDDEN: 3016 1.1 mrg visibility = GCCPV_HIDDEN; 3017 1.1 mrg break; 3018 1.1 mrg case VISIBILITY_INTERNAL: 3019 1.1 mrg visibility = GCCPV_INTERNAL; 3020 1.1 mrg break; 3021 1.1 mrg } 3022 1.1 mrg 3023 1.1 mrg if (kind == GCCPK_COMMON 3024 1.1 mrg && DECL_SIZE_UNIT (t) 3025 1.1 mrg && TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST) 3026 1.1 mrg size = TREE_INT_CST_LOW (DECL_SIZE_UNIT (t)); 3027 1.1 mrg else 3028 1.1 mrg size = 0; 3029 1.1 mrg 3030 1.1 mrg if (DECL_ONE_ONLY (t)) 3031 1.1 mrg comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t)); 3032 1.1 mrg else 3033 1.1 mrg comdat = ""; 3034 1.1 mrg 3035 1.1 mrg lto_write_data (name, strlen (name) + 1); 3036 1.1 mrg lto_write_data (comdat, strlen (comdat) + 1); 3037 1.1 mrg c = (unsigned char) kind; 3038 1.1 mrg lto_write_data (&c, 1); 3039 1.1 mrg c = (unsigned char) visibility; 3040 1.1 mrg lto_write_data (&c, 1); 3041 1.1 mrg lto_write_data (&size, 8); 3042 1.1 mrg lto_write_data (&slot_num, 4); 3043 1.1 mrg } 3044 1.1 mrg 3045 1.1 mrg /* Write extension information for symbols (symbol type, section flags). */ 3046 1.1 mrg 3047 1.1 mrg static void 3048 1.1 mrg write_symbol_extension_info (tree t) 3049 1.1 mrg { 3050 1.1 mrg unsigned char c; 3051 1.1 mrg c = ((unsigned char) TREE_CODE (t) == VAR_DECL 3052 1.1 mrg ? GCCST_VARIABLE : GCCST_FUNCTION); 3053 1.1 mrg lto_write_data (&c, 1); 3054 1.1 mrg unsigned char section_kind = 0; 3055 1.1 mrg if (TREE_CODE (t) == VAR_DECL) 3056 1.1 mrg { 3057 1.1 mrg section *s = get_variable_section (t, false); 3058 1.1 mrg if (s->common.flags & SECTION_BSS) 3059 1.1 mrg section_kind |= GCCSSK_BSS; 3060 1.1 mrg } 3061 1.1 mrg lto_write_data (§ion_kind, 1); 3062 1.1 mrg } 3063 1.1 mrg 3064 1.1 mrg /* Write an IL symbol table to OB. 3065 1.1 mrg SET and VSET are cgraph/varpool node sets we are outputting. */ 3066 1.1 mrg 3067 1.1 mrg static unsigned int 3068 1.1 mrg produce_symtab (struct output_block *ob) 3069 1.1 mrg { 3070 1.1 mrg unsigned int streamed_symbols = 0; 3071 1.1 mrg struct streamer_tree_cache_d *cache = ob->writer_cache; 3072 1.1 mrg char *section_name = lto_get_section_name (LTO_section_symtab, NULL, 0, NULL); 3073 1.1 mrg lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder; 3074 1.1 mrg lto_symtab_encoder_iterator lsei; 3075 1.1 mrg 3076 1.1 mrg lto_begin_section (section_name, false); 3077 1.1 mrg free (section_name); 3078 1.1 mrg 3079 1.1 mrg hash_set<const char *> seen; 3080 1.1 mrg 3081 1.1 mrg /* Write the symbol table. 3082 1.1 mrg First write everything defined and then all declarations. 3083 1.1 mrg This is necessary to handle cases where we have duplicated symbols. */ 3084 1.1 mrg for (lsei = lsei_start (encoder); 3085 1.1 mrg !lsei_end_p (lsei); lsei_next (&lsei)) 3086 1.1 mrg { 3087 1.1 mrg symtab_node *node = lsei_node (lsei); 3088 1.1 mrg 3089 1.1 mrg if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ()) 3090 1.1 mrg continue; 3091 1.1 mrg write_symbol (cache, node->decl, &seen, false); 3092 1.1 mrg ++streamed_symbols; 3093 1.1 mrg } 3094 1.1 mrg for (lsei = lsei_start (encoder); 3095 1.1 mrg !lsei_end_p (lsei); lsei_next (&lsei)) 3096 1.1 mrg { 3097 1.1 mrg symtab_node *node = lsei_node (lsei); 3098 1.1 mrg 3099 1.1 mrg if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ()) 3100 1.1 mrg continue; 3101 1.1 mrg write_symbol (cache, node->decl, &seen, false); 3102 1.1 mrg ++streamed_symbols; 3103 1.1 mrg } 3104 1.1 mrg 3105 1.1 mrg lto_end_section (); 3106 1.1 mrg 3107 1.1 mrg return streamed_symbols; 3108 1.1 mrg } 3109 1.1 mrg 3110 1.1 mrg /* Symtab extension version. */ 3111 1.1 mrg #define LTO_SYMTAB_EXTENSION_VERSION 1 3112 1.1 mrg 3113 1.1 mrg /* Write an IL symbol table extension to OB. 3114 1.1 mrg SET and VSET are cgraph/varpool node sets we are outputting. */ 3115 1.1 mrg 3116 1.1 mrg static void 3117 1.1 mrg produce_symtab_extension (struct output_block *ob, 3118 1.1 mrg unsigned int previous_streamed_symbols) 3119 1.1 mrg { 3120 1.1 mrg unsigned int streamed_symbols = 0; 3121 1.1 mrg char *section_name = lto_get_section_name (LTO_section_symtab_extension, 3122 1.1 mrg NULL, 0, NULL); 3123 1.1 mrg lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder; 3124 1.1 mrg lto_symtab_encoder_iterator lsei; 3125 1.1 mrg 3126 1.1 mrg lto_begin_section (section_name, false); 3127 1.1 mrg free (section_name); 3128 1.1 mrg 3129 1.1 mrg unsigned char version = LTO_SYMTAB_EXTENSION_VERSION; 3130 1.1 mrg lto_write_data (&version, 1); 3131 1.1 mrg 3132 1.1 mrg /* Write the symbol table. 3133 1.1 mrg First write everything defined and then all declarations. 3134 1.1 mrg This is necessary to handle cases where we have duplicated symbols. */ 3135 1.1 mrg for (lsei = lsei_start (encoder); 3136 1.1 mrg !lsei_end_p (lsei); lsei_next (&lsei)) 3137 1.1 mrg { 3138 1.1 mrg symtab_node *node = lsei_node (lsei); 3139 1.1 mrg 3140 1.1 mrg if (DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ()) 3141 1.1 mrg continue; 3142 1.1 mrg write_symbol_extension_info (node->decl); 3143 1.1 mrg ++streamed_symbols; 3144 1.1 mrg } 3145 1.1 mrg for (lsei = lsei_start (encoder); 3146 1.1 mrg !lsei_end_p (lsei); lsei_next (&lsei)) 3147 1.1 mrg { 3148 1.1 mrg symtab_node *node = lsei_node (lsei); 3149 1.1 mrg 3150 1.1 mrg if (!DECL_EXTERNAL (node->decl) || !node->output_to_lto_symbol_table_p ()) 3151 1.1 mrg continue; 3152 1.1 mrg write_symbol_extension_info (node->decl); 3153 1.1 mrg ++streamed_symbols; 3154 1.1 mrg } 3155 1.1 mrg 3156 1.1 mrg gcc_assert (previous_streamed_symbols == streamed_symbols); 3157 1.1 mrg lto_end_section (); 3158 1.1 mrg } 3159 1.1 mrg 3160 1.1 mrg 3161 1.1 mrg /* Init the streamer_mode_table for output, where we collect info on what 3162 1.1 mrg machine_mode values have been streamed. */ 3163 1.1 mrg void 3164 1.1 mrg lto_output_init_mode_table (void) 3165 1.1 mrg { 3166 1.1 mrg memset (streamer_mode_table, '\0', MAX_MACHINE_MODE); 3167 1.1 mrg } 3168 1.1 mrg 3169 1.1 mrg 3170 1.1 mrg /* Write the mode table. */ 3171 1.1 mrg static void 3172 1.1 mrg lto_write_mode_table (void) 3173 1.1 mrg { 3174 1.1 mrg struct output_block *ob; 3175 1.1 mrg ob = create_output_block (LTO_section_mode_table); 3176 1.1 mrg bitpack_d bp = bitpack_create (ob->main_stream); 3177 1.1 mrg 3178 1.1 mrg /* Ensure that for GET_MODE_INNER (m) != m we have 3179 1.1 mrg also the inner mode marked. */ 3180 1.1 mrg for (int i = 0; i < (int) MAX_MACHINE_MODE; i++) 3181 1.1 mrg if (streamer_mode_table[i]) 3182 1.1 mrg { 3183 1.1 mrg machine_mode m = (machine_mode) i; 3184 1.1 mrg machine_mode inner_m = GET_MODE_INNER (m); 3185 1.1 mrg if (inner_m != m) 3186 1.1 mrg streamer_mode_table[(int) inner_m] = 1; 3187 1.1 mrg } 3188 1.1 mrg /* First stream modes that have GET_MODE_INNER (m) == m, 3189 1.1 mrg so that we can refer to them afterwards. */ 3190 1.1 mrg for (int pass = 0; pass < 2; pass++) 3191 1.1 mrg for (int i = 0; i < (int) MAX_MACHINE_MODE; i++) 3192 1.1 mrg if (streamer_mode_table[i] && i != (int) VOIDmode && i != (int) BLKmode) 3193 1.1 mrg { 3194 1.1 mrg machine_mode m = (machine_mode) i; 3195 1.1 mrg if ((GET_MODE_INNER (m) == m) ^ (pass == 0)) 3196 1.1 mrg continue; 3197 1.1 mrg bp_pack_value (&bp, m, 8); 3198 1.1 mrg bp_pack_enum (&bp, mode_class, MAX_MODE_CLASS, GET_MODE_CLASS (m)); 3199 1.1 mrg bp_pack_poly_value (&bp, GET_MODE_SIZE (m), 16); 3200 1.1 mrg bp_pack_poly_value (&bp, GET_MODE_PRECISION (m), 16); 3201 1.1 mrg bp_pack_value (&bp, GET_MODE_INNER (m), 8); 3202 1.1 mrg bp_pack_poly_value (&bp, GET_MODE_NUNITS (m), 16); 3203 1.1 mrg switch (GET_MODE_CLASS (m)) 3204 1.1 mrg { 3205 1.1 mrg case MODE_FRACT: 3206 1.1 mrg case MODE_UFRACT: 3207 1.1 mrg case MODE_ACCUM: 3208 1.1 mrg case MODE_UACCUM: 3209 1.1 mrg bp_pack_value (&bp, GET_MODE_IBIT (m), 8); 3210 1.1 mrg bp_pack_value (&bp, GET_MODE_FBIT (m), 8); 3211 1.1 mrg break; 3212 1.1 mrg case MODE_FLOAT: 3213 1.1 mrg case MODE_DECIMAL_FLOAT: 3214 1.1 mrg bp_pack_string (ob, &bp, REAL_MODE_FORMAT (m)->name, true); 3215 1.1 mrg break; 3216 1.1 mrg default: 3217 1.1 mrg break; 3218 1.1 mrg } 3219 1.1 mrg bp_pack_string (ob, &bp, GET_MODE_NAME (m), true); 3220 1.1 mrg } 3221 1.1 mrg bp_pack_value (&bp, VOIDmode, 8); 3222 1.1 mrg 3223 1.1 mrg streamer_write_bitpack (&bp); 3224 1.1 mrg 3225 1.1 mrg char *section_name 3226 1.1 mrg = lto_get_section_name (LTO_section_mode_table, NULL, 0, NULL); 3227 1.1 mrg lto_begin_section (section_name, !flag_wpa); 3228 1.1 mrg free (section_name); 3229 1.1 mrg 3230 1.1 mrg /* The entire header stream is computed here. */ 3231 1.1 mrg struct lto_simple_header_with_strings header; 3232 1.1 mrg memset (&header, 0, sizeof (header)); 3233 1.1 mrg 3234 1.1 mrg header.main_size = ob->main_stream->total_size; 3235 1.1 mrg header.string_size = ob->string_stream->total_size; 3236 1.1 mrg lto_write_data (&header, sizeof header); 3237 1.1 mrg 3238 1.1 mrg /* Put all of the gimple and the string table out the asm file as a 3239 1.1 mrg block of text. */ 3240 1.1 mrg lto_write_stream (ob->main_stream); 3241 1.1 mrg lto_write_stream (ob->string_stream); 3242 1.1 mrg 3243 1.1 mrg lto_end_section (); 3244 1.1 mrg destroy_output_block (ob); 3245 1.1 mrg } 3246 1.1 mrg 3247 1.1 mrg 3248 1.1 mrg /* This pass is run after all of the functions are serialized and all 3249 1.1 mrg of the IPA passes have written their serialized forms. This pass 3250 1.1 mrg causes the vector of all of the global decls and types used from 3251 1.1 mrg this file to be written in to a section that can then be read in to 3252 1.1 mrg recover these on other side. */ 3253 1.1 mrg 3254 1.1 mrg void 3255 1.1 mrg produce_asm_for_decls (void) 3256 1.1 mrg { 3257 1.1 mrg struct lto_out_decl_state *out_state; 3258 1.1 mrg struct lto_out_decl_state *fn_out_state; 3259 1.1 mrg struct lto_decl_header header; 3260 1.1 mrg char *section_name; 3261 1.1 mrg struct output_block *ob; 3262 1.1 mrg unsigned idx, num_fns; 3263 1.1 mrg size_t decl_state_size; 3264 1.1 mrg int32_t num_decl_states; 3265 1.1 mrg 3266 1.1 mrg ob = create_output_block (LTO_section_decls); 3267 1.1 mrg 3268 1.1 mrg memset (&header, 0, sizeof (struct lto_decl_header)); 3269 1.1 mrg 3270 1.1 mrg section_name = lto_get_section_name (LTO_section_decls, NULL, 0, NULL); 3271 1.1 mrg lto_begin_section (section_name, !flag_wpa); 3272 1.1 mrg free (section_name); 3273 1.1 mrg 3274 1.1 mrg /* Make string 0 be a NULL string. */ 3275 1.1 mrg streamer_write_char_stream (ob->string_stream, 0); 3276 1.1 mrg 3277 1.1 mrg gcc_assert (!alias_pairs); 3278 1.1 mrg 3279 1.1 mrg /* Get rid of the global decl state hash tables to save some memory. */ 3280 1.1 mrg out_state = lto_get_out_decl_state (); 3281 1.1 mrg for (int i = 0; i < LTO_N_DECL_STREAMS; i++) 3282 1.1 mrg if (out_state->streams[i].tree_hash_table) 3283 1.1 mrg { 3284 1.1 mrg delete out_state->streams[i].tree_hash_table; 3285 1.1 mrg out_state->streams[i].tree_hash_table = NULL; 3286 1.1 mrg } 3287 1.1 mrg 3288 1.1 mrg /* Write the global symbols. */ 3289 1.1 mrg if (streamer_dump_file) 3290 1.1 mrg fprintf (streamer_dump_file, "Outputting global stream\n"); 3291 1.1 mrg lto_output_decl_state_streams (ob, out_state); 3292 1.1 mrg num_fns = lto_function_decl_states.length (); 3293 1.1 mrg for (idx = 0; idx < num_fns; idx++) 3294 1.1 mrg { 3295 1.1 mrg fn_out_state = 3296 1.1 mrg lto_function_decl_states[idx]; 3297 1.1 mrg if (streamer_dump_file) 3298 1.1 mrg fprintf (streamer_dump_file, "Outputting stream for %s\n", 3299 1.1 mrg IDENTIFIER_POINTER 3300 1.1 mrg (DECL_ASSEMBLER_NAME (fn_out_state->fn_decl))); 3301 1.1 mrg lto_output_decl_state_streams (ob, fn_out_state); 3302 1.1 mrg } 3303 1.1 mrg 3304 1.1 mrg /* Currently not used. This field would allow us to preallocate 3305 1.1 mrg the globals vector, so that it need not be resized as it is extended. */ 3306 1.1 mrg header.num_nodes = -1; 3307 1.1 mrg 3308 1.1 mrg /* Compute the total size of all decl out states. */ 3309 1.1 mrg decl_state_size = sizeof (int32_t); 3310 1.1 mrg decl_state_size += lto_out_decl_state_written_size (out_state); 3311 1.1 mrg for (idx = 0; idx < num_fns; idx++) 3312 1.1 mrg { 3313 1.1 mrg fn_out_state = 3314 1.1 mrg lto_function_decl_states[idx]; 3315 1.1 mrg decl_state_size += lto_out_decl_state_written_size (fn_out_state); 3316 1.1 mrg } 3317 1.1 mrg header.decl_state_size = decl_state_size; 3318 1.1 mrg 3319 1.1 mrg header.main_size = ob->main_stream->total_size; 3320 1.1 mrg header.string_size = ob->string_stream->total_size; 3321 1.1 mrg 3322 1.1 mrg lto_write_data (&header, sizeof header); 3323 1.1 mrg 3324 1.1 mrg /* Write the main out-decl state, followed by out-decl states of 3325 1.1 mrg functions. */ 3326 1.1 mrg num_decl_states = num_fns + 1; 3327 1.1 mrg lto_write_data (&num_decl_states, sizeof (num_decl_states)); 3328 1.1 mrg lto_output_decl_state_refs (ob, out_state); 3329 1.1 mrg for (idx = 0; idx < num_fns; idx++) 3330 1.1 mrg { 3331 1.1 mrg fn_out_state = lto_function_decl_states[idx]; 3332 1.1 mrg lto_output_decl_state_refs (ob, fn_out_state); 3333 1.1 mrg } 3334 1.1 mrg 3335 1.1 mrg lto_write_stream (ob->main_stream); 3336 1.1 mrg lto_write_stream (ob->string_stream); 3337 1.1 mrg 3338 1.1 mrg lto_end_section (); 3339 1.1 mrg 3340 1.1 mrg /* Write the symbol table. It is used by linker to determine dependencies 3341 1.1 mrg and thus we can skip it for WPA. */ 3342 1.1 mrg if (!flag_wpa) 3343 1.1 mrg { 3344 1.1 mrg unsigned int streamed_symbols = produce_symtab (ob); 3345 1.1 mrg produce_symtab_extension (ob, streamed_symbols); 3346 1.1 mrg } 3347 1.1 mrg 3348 1.1 mrg /* Write command line opts. */ 3349 1.1 mrg lto_write_options (); 3350 1.1 mrg 3351 1.1 mrg /* Deallocate memory and clean up. */ 3352 1.1 mrg for (idx = 0; idx < num_fns; idx++) 3353 1.1 mrg { 3354 1.1 mrg fn_out_state = 3355 1.1 mrg lto_function_decl_states[idx]; 3356 1.1 mrg lto_delete_out_decl_state (fn_out_state); 3357 1.1 mrg } 3358 1.1 mrg lto_symtab_encoder_delete (ob->decl_state->symtab_node_encoder); 3359 1.1 mrg lto_function_decl_states.release (); 3360 1.1 mrg destroy_output_block (ob); 3361 1.1 mrg if (lto_stream_offload_p) 3362 1.1 mrg lto_write_mode_table (); 3363 1.1 mrg } 3364