1 1.1 mrg /* Write and read the cgraph to the memory mapped representation of a 2 1.1 mrg .o file. 3 1.1 mrg 4 1.1 mrg Copyright (C) 2009-2022 Free Software Foundation, Inc. 5 1.1 mrg Contributed by Kenneth Zadeck <zadeck (at) naturalbridge.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 "rtl.h" 28 1.1 mrg #include "tree.h" 29 1.1 mrg #include "gimple.h" 30 1.1 mrg #include "predict.h" 31 1.1 mrg #include "stringpool.h" 32 1.1 mrg #include "tree-streamer.h" 33 1.1 mrg #include "cgraph.h" 34 1.1 mrg #include "tree-pass.h" 35 1.1 mrg #include "profile.h" 36 1.1 mrg #include "context.h" 37 1.1 mrg #include "pass_manager.h" 38 1.1 mrg #include "ipa-utils.h" 39 1.1 mrg #include "omp-offload.h" 40 1.1 mrg #include "stringpool.h" 41 1.1 mrg #include "attribs.h" 42 1.1 mrg #include "alloc-pool.h" 43 1.1 mrg #include "symbol-summary.h" 44 1.1 mrg #include "symtab-thunks.h" 45 1.1 mrg #include "symtab-clones.h" 46 1.1 mrg 47 1.1 mrg /* True when asm nodes has been output. */ 48 1.1 mrg bool asm_nodes_output = false; 49 1.1 mrg 50 1.1 mrg static void output_cgraph_opt_summary (void); 51 1.1 mrg static void input_cgraph_opt_summary (vec<symtab_node *> nodes); 52 1.1 mrg 53 1.1 mrg /* Number of LDPR values known to GCC. */ 54 1.1 mrg #define LDPR_NUM_KNOWN (LDPR_PREVAILING_DEF_IRONLY_EXP + 1) 55 1.1 mrg 56 1.1 mrg /* Cgraph streaming is organized as set of record whose type 57 1.1 mrg is indicated by a tag. */ 58 1.1 mrg enum LTO_symtab_tags 59 1.1 mrg { 60 1.1 mrg /* Must leave 0 for the stopper. */ 61 1.1 mrg 62 1.1 mrg /* Cgraph node without body available. */ 63 1.1 mrg LTO_symtab_unavail_node = 1, 64 1.1 mrg /* Cgraph node with function body. */ 65 1.1 mrg LTO_symtab_analyzed_node, 66 1.1 mrg /* Cgraph edges. */ 67 1.1 mrg LTO_symtab_edge, 68 1.1 mrg LTO_symtab_indirect_edge, 69 1.1 mrg LTO_symtab_variable, 70 1.1 mrg LTO_symtab_last_tag 71 1.1 mrg }; 72 1.1 mrg 73 1.1 mrg /* Create a new symtab encoder. 74 1.1 mrg if FOR_INPUT, the encoder allocate only datastructures needed 75 1.1 mrg to read the symtab. */ 76 1.1 mrg 77 1.1 mrg lto_symtab_encoder_t 78 1.1 mrg lto_symtab_encoder_new (bool for_input) 79 1.1 mrg { 80 1.1 mrg lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d); 81 1.1 mrg 82 1.1 mrg if (!for_input) 83 1.1 mrg encoder->map = new hash_map<symtab_node *, size_t>; 84 1.1 mrg encoder->nodes.create (0); 85 1.1 mrg return encoder; 86 1.1 mrg } 87 1.1 mrg 88 1.1 mrg 89 1.1 mrg /* Delete ENCODER and its components. */ 90 1.1 mrg 91 1.1 mrg void 92 1.1 mrg lto_symtab_encoder_delete (lto_symtab_encoder_t encoder) 93 1.1 mrg { 94 1.1 mrg encoder->nodes.release (); 95 1.1 mrg if (encoder->map) 96 1.1 mrg delete encoder->map; 97 1.1 mrg free (encoder); 98 1.1 mrg } 99 1.1 mrg 100 1.1 mrg 101 1.1 mrg /* Return the existing reference number of NODE in the symtab encoder in 102 1.1 mrg output block OB. Assign a new reference if this is the first time 103 1.1 mrg NODE is encoded. */ 104 1.1 mrg 105 1.1 mrg int 106 1.1 mrg lto_symtab_encoder_encode (lto_symtab_encoder_t encoder, 107 1.1 mrg symtab_node *node) 108 1.1 mrg { 109 1.1 mrg int ref; 110 1.1 mrg 111 1.1 mrg if (!encoder->map) 112 1.1 mrg { 113 1.1 mrg lto_encoder_entry entry = {node, false, false, false}; 114 1.1 mrg 115 1.1 mrg ref = encoder->nodes.length (); 116 1.1 mrg encoder->nodes.safe_push (entry); 117 1.1 mrg return ref; 118 1.1 mrg } 119 1.1 mrg 120 1.1 mrg size_t *slot = encoder->map->get (node); 121 1.1 mrg if (!slot || !*slot) 122 1.1 mrg { 123 1.1 mrg lto_encoder_entry entry = {node, false, false, false}; 124 1.1 mrg ref = encoder->nodes.length (); 125 1.1 mrg if (!slot) 126 1.1 mrg encoder->map->put (node, ref + 1); 127 1.1 mrg encoder->nodes.safe_push (entry); 128 1.1 mrg } 129 1.1 mrg else 130 1.1 mrg ref = *slot - 1; 131 1.1 mrg 132 1.1 mrg return ref; 133 1.1 mrg } 134 1.1 mrg 135 1.1 mrg /* Remove NODE from encoder. */ 136 1.1 mrg 137 1.1 mrg bool 138 1.1 mrg lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder, 139 1.1 mrg symtab_node *node) 140 1.1 mrg { 141 1.1 mrg int index; 142 1.1 mrg lto_encoder_entry last_node; 143 1.1 mrg 144 1.1 mrg size_t *slot = encoder->map->get (node); 145 1.1 mrg if (slot == NULL || !*slot) 146 1.1 mrg return false; 147 1.1 mrg 148 1.1 mrg index = *slot - 1; 149 1.1 mrg gcc_checking_assert (encoder->nodes[index].node == node); 150 1.1 mrg 151 1.1 mrg /* Remove from vector. We do this by swapping node with the last element 152 1.1 mrg of the vector. */ 153 1.1 mrg last_node = encoder->nodes.pop (); 154 1.1 mrg if (last_node.node != node) 155 1.1 mrg { 156 1.1 mrg bool existed = encoder->map->put (last_node.node, index + 1); 157 1.1 mrg gcc_assert (existed); 158 1.1 mrg 159 1.1 mrg /* Move the last element to the original spot of NODE. */ 160 1.1 mrg encoder->nodes[index] = last_node; 161 1.1 mrg } 162 1.1 mrg 163 1.1 mrg /* Remove element from hash table. */ 164 1.1 mrg encoder->map->remove (node); 165 1.1 mrg return true; 166 1.1 mrg } 167 1.1 mrg 168 1.1 mrg 169 1.1 mrg /* Return TRUE if we should encode the body of NODE (if any). */ 170 1.1 mrg 171 1.1 mrg bool 172 1.1 mrg lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t encoder, 173 1.1 mrg struct cgraph_node *node) 174 1.1 mrg { 175 1.1 mrg int index = lto_symtab_encoder_lookup (encoder, node); 176 1.1 mrg return encoder->nodes[index].body; 177 1.1 mrg } 178 1.1 mrg 179 1.1 mrg /* Specify that we encode the body of NODE in this partition. */ 180 1.1 mrg 181 1.1 mrg static void 182 1.1 mrg lto_set_symtab_encoder_encode_body (lto_symtab_encoder_t encoder, 183 1.1 mrg struct cgraph_node *node) 184 1.1 mrg { 185 1.1 mrg int index = lto_symtab_encoder_encode (encoder, node); 186 1.1 mrg gcc_checking_assert (encoder->nodes[index].node == node); 187 1.1 mrg encoder->nodes[index].body = true; 188 1.1 mrg } 189 1.1 mrg 190 1.1 mrg /* Return TRUE if we should encode initializer of NODE (if any). */ 191 1.1 mrg 192 1.1 mrg bool 193 1.1 mrg lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t encoder, 194 1.1 mrg varpool_node *node) 195 1.1 mrg { 196 1.1 mrg int index = lto_symtab_encoder_lookup (encoder, node); 197 1.1 mrg if (index == LCC_NOT_FOUND) 198 1.1 mrg return false; 199 1.1 mrg return encoder->nodes[index].initializer; 200 1.1 mrg } 201 1.1 mrg 202 1.1 mrg /* Specify that we should encode initializer of NODE (if any). */ 203 1.1 mrg 204 1.1 mrg static void 205 1.1 mrg lto_set_symtab_encoder_encode_initializer (lto_symtab_encoder_t encoder, 206 1.1 mrg varpool_node *node) 207 1.1 mrg { 208 1.1 mrg int index = lto_symtab_encoder_lookup (encoder, node); 209 1.1 mrg encoder->nodes[index].initializer = true; 210 1.1 mrg } 211 1.1 mrg 212 1.1 mrg /* Return TRUE if NODE is in this partition. */ 213 1.1 mrg 214 1.1 mrg bool 215 1.1 mrg lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t encoder, 216 1.1 mrg symtab_node *node) 217 1.1 mrg { 218 1.1 mrg int index = lto_symtab_encoder_lookup (encoder, node); 219 1.1 mrg if (index == LCC_NOT_FOUND) 220 1.1 mrg return false; 221 1.1 mrg return encoder->nodes[index].in_partition; 222 1.1 mrg } 223 1.1 mrg 224 1.1 mrg /* Specify that NODE is in this partition. */ 225 1.1 mrg 226 1.1 mrg void 227 1.1 mrg lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t encoder, 228 1.1 mrg symtab_node *node) 229 1.1 mrg { 230 1.1 mrg int index = lto_symtab_encoder_encode (encoder, node); 231 1.1 mrg encoder->nodes[index].in_partition = true; 232 1.1 mrg } 233 1.1 mrg 234 1.1 mrg /* Output the cgraph EDGE to OB using ENCODER. */ 235 1.1 mrg 236 1.1 mrg static void 237 1.1 mrg lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge, 238 1.1 mrg lto_symtab_encoder_t encoder) 239 1.1 mrg { 240 1.1 mrg unsigned int uid; 241 1.1 mrg intptr_t ref; 242 1.1 mrg struct bitpack_d bp; 243 1.1 mrg 244 1.1 mrg if (edge->indirect_unknown_callee) 245 1.1 mrg streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, 246 1.1 mrg LTO_symtab_indirect_edge); 247 1.1 mrg else 248 1.1 mrg streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, 249 1.1 mrg LTO_symtab_edge); 250 1.1 mrg 251 1.1 mrg ref = lto_symtab_encoder_lookup (encoder, edge->caller); 252 1.1 mrg gcc_assert (ref != LCC_NOT_FOUND); 253 1.1 mrg streamer_write_hwi_stream (ob->main_stream, ref); 254 1.1 mrg 255 1.1 mrg if (!edge->indirect_unknown_callee) 256 1.1 mrg { 257 1.1 mrg ref = lto_symtab_encoder_lookup (encoder, edge->callee); 258 1.1 mrg gcc_assert (ref != LCC_NOT_FOUND); 259 1.1 mrg streamer_write_hwi_stream (ob->main_stream, ref); 260 1.1 mrg } 261 1.1 mrg 262 1.1 mrg edge->count.stream_out (ob->main_stream); 263 1.1 mrg 264 1.1 mrg bp = bitpack_create (ob->main_stream); 265 1.1 mrg uid = !edge->call_stmt ? edge->lto_stmt_uid 266 1.1 mrg : gimple_uid (edge->call_stmt) + 1; 267 1.1 mrg bp_pack_enum (&bp, cgraph_inline_failed_t, 268 1.1 mrg CIF_N_REASONS, edge->inline_failed); 269 1.1 mrg gcc_checking_assert (uid || edge->caller->thunk); 270 1.1 mrg bp_pack_var_len_unsigned (&bp, uid); 271 1.1 mrg bp_pack_value (&bp, edge->speculative_id, 16); 272 1.1 mrg bp_pack_value (&bp, edge->indirect_inlining_edge, 1); 273 1.1 mrg bp_pack_value (&bp, edge->speculative, 1); 274 1.1 mrg bp_pack_value (&bp, edge->call_stmt_cannot_inline_p, 1); 275 1.1 mrg gcc_assert (!edge->call_stmt_cannot_inline_p 276 1.1 mrg || edge->inline_failed != CIF_BODY_NOT_AVAILABLE); 277 1.1 mrg bp_pack_value (&bp, edge->can_throw_external, 1); 278 1.1 mrg bp_pack_value (&bp, edge->in_polymorphic_cdtor, 1); 279 1.1 mrg if (edge->indirect_unknown_callee) 280 1.1 mrg { 281 1.1 mrg int flags = edge->indirect_info->ecf_flags; 282 1.1 mrg bp_pack_value (&bp, (flags & ECF_CONST) != 0, 1); 283 1.1 mrg bp_pack_value (&bp, (flags & ECF_PURE) != 0, 1); 284 1.1 mrg bp_pack_value (&bp, (flags & ECF_NORETURN) != 0, 1); 285 1.1 mrg bp_pack_value (&bp, (flags & ECF_MALLOC) != 0, 1); 286 1.1 mrg bp_pack_value (&bp, (flags & ECF_NOTHROW) != 0, 1); 287 1.1 mrg bp_pack_value (&bp, (flags & ECF_RETURNS_TWICE) != 0, 1); 288 1.1 mrg /* Flags that should not appear on indirect calls. */ 289 1.1 mrg gcc_assert (!(flags & (ECF_LOOPING_CONST_OR_PURE 290 1.1 mrg | ECF_MAY_BE_ALLOCA 291 1.1 mrg | ECF_SIBCALL 292 1.1 mrg | ECF_LEAF 293 1.1 mrg | ECF_NOVOPS))); 294 1.1 mrg 295 1.1 mrg bp_pack_value (&bp, edge->indirect_info->num_speculative_call_targets, 296 1.1 mrg 16); 297 1.1 mrg } 298 1.1 mrg streamer_write_bitpack (&bp); 299 1.1 mrg } 300 1.1 mrg 301 1.1 mrg /* Return if NODE contain references from other partitions. */ 302 1.1 mrg 303 1.1 mrg bool 304 1.1 mrg referenced_from_other_partition_p (symtab_node *node, lto_symtab_encoder_t encoder) 305 1.1 mrg { 306 1.1 mrg int i; 307 1.1 mrg struct ipa_ref *ref = NULL; 308 1.1 mrg 309 1.1 mrg for (i = 0; node->iterate_referring (i, ref); i++) 310 1.1 mrg { 311 1.1 mrg /* Ignore references from non-offloadable nodes while streaming NODE into 312 1.1 mrg offload LTO section. */ 313 1.1 mrg if (!ref->referring->need_lto_streaming) 314 1.1 mrg continue; 315 1.1 mrg 316 1.1 mrg if (ref->referring->in_other_partition 317 1.1 mrg || !lto_symtab_encoder_in_partition_p (encoder, ref->referring)) 318 1.1 mrg return true; 319 1.1 mrg } 320 1.1 mrg return false; 321 1.1 mrg } 322 1.1 mrg 323 1.1 mrg /* Return true when node is reachable from other partition. */ 324 1.1 mrg 325 1.1 mrg bool 326 1.1 mrg reachable_from_other_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder) 327 1.1 mrg { 328 1.1 mrg struct cgraph_edge *e; 329 1.1 mrg if (!node->definition) 330 1.1 mrg return false; 331 1.1 mrg if (node->inlined_to) 332 1.1 mrg return false; 333 1.1 mrg for (e = node->callers; e; e = e->next_caller) 334 1.1 mrg { 335 1.1 mrg /* Ignore references from non-offloadable nodes while streaming NODE into 336 1.1 mrg offload LTO section. */ 337 1.1 mrg if (!e->caller->need_lto_streaming) 338 1.1 mrg continue; 339 1.1 mrg 340 1.1 mrg if (e->caller->in_other_partition 341 1.1 mrg || !lto_symtab_encoder_in_partition_p (encoder, e->caller)) 342 1.1 mrg return true; 343 1.1 mrg } 344 1.1 mrg return false; 345 1.1 mrg } 346 1.1 mrg 347 1.1 mrg /* Return if NODE contain references from other partitions. */ 348 1.1 mrg 349 1.1 mrg bool 350 1.1 mrg referenced_from_this_partition_p (symtab_node *node, 351 1.1 mrg lto_symtab_encoder_t encoder) 352 1.1 mrg { 353 1.1 mrg int i; 354 1.1 mrg struct ipa_ref *ref = NULL; 355 1.1 mrg 356 1.1 mrg for (i = 0; node->iterate_referring (i, ref); i++) 357 1.1 mrg if (lto_symtab_encoder_in_partition_p (encoder, ref->referring)) 358 1.1 mrg return true; 359 1.1 mrg return false; 360 1.1 mrg } 361 1.1 mrg 362 1.1 mrg /* Return true when node is reachable from other partition. */ 363 1.1 mrg 364 1.1 mrg bool 365 1.1 mrg reachable_from_this_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder) 366 1.1 mrg { 367 1.1 mrg struct cgraph_edge *e; 368 1.1 mrg for (e = node->callers; e; e = e->next_caller) 369 1.1 mrg if (lto_symtab_encoder_in_partition_p (encoder, e->caller)) 370 1.1 mrg return true; 371 1.1 mrg return false; 372 1.1 mrg } 373 1.1 mrg 374 1.1 mrg /* Output the cgraph NODE to OB. ENCODER is used to find the 375 1.1 mrg reference number of NODE->inlined_to. SET is the set of nodes we 376 1.1 mrg are writing to the current file. If NODE is not in SET, then NODE 377 1.1 mrg is a boundary of a cgraph_node_set and we pretend NODE just has a 378 1.1 mrg decl and no callees. WRITTEN_DECLS is the set of FUNCTION_DECLs 379 1.1 mrg that have had their callgraph node written so far. This is used to 380 1.1 mrg determine if NODE is a clone of a previously written node. */ 381 1.1 mrg 382 1.1 mrg static void 383 1.1 mrg lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node, 384 1.1 mrg lto_symtab_encoder_t encoder) 385 1.1 mrg { 386 1.1 mrg unsigned int tag; 387 1.1 mrg struct bitpack_d bp; 388 1.1 mrg bool boundary_p; 389 1.1 mrg intptr_t ref; 390 1.1 mrg bool in_other_partition = false; 391 1.1 mrg struct cgraph_node *clone_of, *ultimate_clone_of; 392 1.1 mrg ipa_opt_pass_d *pass; 393 1.1 mrg int i; 394 1.1 mrg const char *comdat; 395 1.1 mrg const char *section; 396 1.1 mrg tree group; 397 1.1 mrg 398 1.1 mrg boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node); 399 1.1 mrg 400 1.1 mrg if (node->analyzed && (!boundary_p || node->alias 401 1.1 mrg || (node->thunk && !node->inlined_to))) 402 1.1 mrg tag = LTO_symtab_analyzed_node; 403 1.1 mrg else 404 1.1 mrg tag = LTO_symtab_unavail_node; 405 1.1 mrg 406 1.1 mrg streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, 407 1.1 mrg tag); 408 1.1 mrg streamer_write_hwi_stream (ob->main_stream, node->order); 409 1.1 mrg 410 1.1 mrg /* In WPA mode, we only output part of the call-graph. Also, we 411 1.1 mrg fake cgraph node attributes. There are two cases that we care. 412 1.1 mrg 413 1.1 mrg Boundary nodes: There are nodes that are not part of SET but are 414 1.1 mrg called from within SET. We artificially make them look like 415 1.1 mrg externally visible nodes with no function body. 416 1.1 mrg 417 1.1 mrg Cherry-picked nodes: These are nodes we pulled from other 418 1.1 mrg translation units into SET during IPA-inlining. We make them as 419 1.1 mrg local static nodes to prevent clashes with other local statics. */ 420 1.1 mrg if (boundary_p && node->analyzed 421 1.1 mrg && node->get_partitioning_class () == SYMBOL_PARTITION) 422 1.1 mrg { 423 1.1 mrg /* Inline clones cannot be part of boundary. 424 1.1 mrg gcc_assert (!node->inlined_to); 425 1.1 mrg 426 1.1 mrg FIXME: At the moment they can be, when partition contains an inline 427 1.1 mrg clone that is clone of inline clone from outside partition. We can 428 1.1 mrg reshape the clone tree and make other tree to be the root, but it 429 1.1 mrg needs a bit extra work and will be promplty done by cgraph_remove_node 430 1.1 mrg after reading back. */ 431 1.1 mrg in_other_partition = 1; 432 1.1 mrg } 433 1.1 mrg 434 1.1 mrg clone_of = node->clone_of; 435 1.1 mrg while (clone_of 436 1.1 mrg && (ref = lto_symtab_encoder_lookup (encoder, clone_of)) == LCC_NOT_FOUND) 437 1.1 mrg if (clone_of->prev_sibling_clone) 438 1.1 mrg clone_of = clone_of->prev_sibling_clone; 439 1.1 mrg else 440 1.1 mrg clone_of = clone_of->clone_of; 441 1.1 mrg 442 1.1 mrg /* See if body of the master function is output. If not, we are seeing only 443 1.1 mrg an declaration and we do not need to pass down clone tree. */ 444 1.1 mrg ultimate_clone_of = clone_of; 445 1.1 mrg while (ultimate_clone_of && ultimate_clone_of->clone_of) 446 1.1 mrg ultimate_clone_of = ultimate_clone_of->clone_of; 447 1.1 mrg 448 1.1 mrg if (clone_of && !lto_symtab_encoder_encode_body_p (encoder, ultimate_clone_of)) 449 1.1 mrg clone_of = NULL; 450 1.1 mrg 451 1.1 mrg if (tag == LTO_symtab_analyzed_node) 452 1.1 mrg gcc_assert (clone_of || !node->clone_of); 453 1.1 mrg if (!clone_of) 454 1.1 mrg streamer_write_hwi_stream (ob->main_stream, LCC_NOT_FOUND); 455 1.1 mrg else 456 1.1 mrg streamer_write_hwi_stream (ob->main_stream, ref); 457 1.1 mrg 458 1.1 mrg 459 1.1 mrg lto_output_fn_decl_ref (ob->decl_state, ob->main_stream, node->decl); 460 1.1 mrg node->count.stream_out (ob->main_stream); 461 1.1 mrg streamer_write_hwi_stream (ob->main_stream, node->count_materialization_scale); 462 1.1 mrg 463 1.1 mrg streamer_write_hwi_stream (ob->main_stream, 464 1.1 mrg node->ipa_transforms_to_apply.length ()); 465 1.1 mrg FOR_EACH_VEC_ELT (node->ipa_transforms_to_apply, i, pass) 466 1.1 mrg streamer_write_hwi_stream (ob->main_stream, pass->static_pass_number); 467 1.1 mrg 468 1.1 mrg if (tag == LTO_symtab_analyzed_node) 469 1.1 mrg { 470 1.1 mrg if (node->inlined_to) 471 1.1 mrg { 472 1.1 mrg ref = lto_symtab_encoder_lookup (encoder, node->inlined_to); 473 1.1 mrg gcc_assert (ref != LCC_NOT_FOUND); 474 1.1 mrg } 475 1.1 mrg else 476 1.1 mrg ref = LCC_NOT_FOUND; 477 1.1 mrg 478 1.1 mrg streamer_write_hwi_stream (ob->main_stream, ref); 479 1.1 mrg } 480 1.1 mrg 481 1.1 mrg group = node->get_comdat_group (); 482 1.1 mrg if (group) 483 1.1 mrg comdat = IDENTIFIER_POINTER (group); 484 1.1 mrg else 485 1.1 mrg comdat = ""; 486 1.1 mrg streamer_write_data_stream (ob->main_stream, comdat, strlen (comdat) + 1); 487 1.1 mrg 488 1.1 mrg if (group) 489 1.1 mrg { 490 1.1 mrg if (node->same_comdat_group) 491 1.1 mrg { 492 1.1 mrg ref = LCC_NOT_FOUND; 493 1.1 mrg for (struct symtab_node *n = node->same_comdat_group; 494 1.1 mrg ref == LCC_NOT_FOUND && n != node; n = n->same_comdat_group) 495 1.1 mrg ref = lto_symtab_encoder_lookup (encoder, n); 496 1.1 mrg } 497 1.1 mrg else 498 1.1 mrg ref = LCC_NOT_FOUND; 499 1.1 mrg streamer_write_hwi_stream (ob->main_stream, ref); 500 1.1 mrg } 501 1.1 mrg 502 1.1 mrg section = node->get_section (); 503 1.1 mrg if (!section) 504 1.1 mrg section = ""; 505 1.1 mrg 506 1.1 mrg streamer_write_hwi_stream (ob->main_stream, node->tp_first_run); 507 1.1 mrg 508 1.1 mrg bp = bitpack_create (ob->main_stream); 509 1.1 mrg bp_pack_value (&bp, node->local, 1); 510 1.1 mrg bp_pack_value (&bp, node->externally_visible, 1); 511 1.1 mrg bp_pack_value (&bp, node->no_reorder, 1); 512 1.1 mrg bp_pack_value (&bp, node->definition, 1); 513 1.1 mrg bp_pack_value (&bp, node->versionable, 1); 514 1.1 mrg bp_pack_value (&bp, node->can_change_signature, 1); 515 1.1 mrg bp_pack_value (&bp, node->redefined_extern_inline, 1); 516 1.1 mrg bp_pack_value (&bp, node->force_output, 1); 517 1.1 mrg bp_pack_value (&bp, node->forced_by_abi, 1); 518 1.1 mrg bp_pack_value (&bp, node->unique_name, 1); 519 1.1 mrg bp_pack_value (&bp, node->body_removed, 1); 520 1.1 mrg bp_pack_value (&bp, node->semantic_interposition, 1); 521 1.1 mrg bp_pack_value (&bp, node->implicit_section, 1); 522 1.1 mrg bp_pack_value (&bp, node->address_taken, 1); 523 1.1 mrg bp_pack_value (&bp, tag == LTO_symtab_analyzed_node 524 1.1 mrg && node->get_partitioning_class () == SYMBOL_PARTITION 525 1.1 mrg && (reachable_from_other_partition_p (node, encoder) 526 1.1 mrg || referenced_from_other_partition_p (node, encoder)), 1); 527 1.1 mrg bp_pack_value (&bp, node->lowered, 1); 528 1.1 mrg bp_pack_value (&bp, in_other_partition, 1); 529 1.1 mrg bp_pack_value (&bp, node->alias, 1); 530 1.1 mrg bp_pack_value (&bp, node->transparent_alias, 1); 531 1.1 mrg bp_pack_value (&bp, node->weakref, 1); 532 1.1 mrg bp_pack_value (&bp, node->symver, 1); 533 1.1 mrg bp_pack_value (&bp, node->frequency, 2); 534 1.1 mrg bp_pack_value (&bp, node->only_called_at_startup, 1); 535 1.1 mrg bp_pack_value (&bp, node->only_called_at_exit, 1); 536 1.1 mrg bp_pack_value (&bp, node->tm_clone, 1); 537 1.1 mrg bp_pack_value (&bp, node->calls_comdat_local, 1); 538 1.1 mrg bp_pack_value (&bp, node->icf_merged, 1); 539 1.1 mrg bp_pack_value (&bp, node->nonfreeing_fn, 1); 540 1.1 mrg bp_pack_value (&bp, node->merged_comdat, 1); 541 1.1 mrg bp_pack_value (&bp, node->merged_extern_inline, 1); 542 1.1 mrg bp_pack_value (&bp, node->thunk, 1); 543 1.1 mrg bp_pack_value (&bp, node->parallelized_function, 1); 544 1.1 mrg bp_pack_value (&bp, node->declare_variant_alt, 1); 545 1.1 mrg bp_pack_value (&bp, node->calls_declare_variant_alt, 1); 546 1.1 mrg 547 1.1 mrg /* Stream thunk info always because we use it in 548 1.1 mrg ipa_polymorphic_call_context::ipa_polymorphic_call_context 549 1.1 mrg to properly interpret THIS pointers for thunks that has been converted 550 1.1 mrg to Gimple. */ 551 1.1 mrg struct thunk_info *thunk = node->definition ? thunk_info::get (node) : NULL; 552 1.1 mrg 553 1.1 mrg bp_pack_value (&bp, thunk != NULL, 1); 554 1.1 mrg 555 1.1 mrg bp_pack_enum (&bp, ld_plugin_symbol_resolution, 556 1.1 mrg LDPR_NUM_KNOWN, 557 1.1 mrg /* When doing incremental link, we will get new resolution 558 1.1 mrg info next time we process the file. */ 559 1.1 mrg flag_incremental_link ? LDPR_UNKNOWN : node->resolution); 560 1.1 mrg bp_pack_value (&bp, node->split_part, 1); 561 1.1 mrg streamer_write_bitpack (&bp); 562 1.1 mrg streamer_write_data_stream (ob->main_stream, section, strlen (section) + 1); 563 1.1 mrg 564 1.1 mrg streamer_write_hwi_stream (ob->main_stream, node->profile_id); 565 1.1 mrg streamer_write_hwi_stream (ob->main_stream, node->unit_id); 566 1.1 mrg if (DECL_STATIC_CONSTRUCTOR (node->decl)) 567 1.1 mrg streamer_write_hwi_stream (ob->main_stream, node->get_init_priority ()); 568 1.1 mrg if (DECL_STATIC_DESTRUCTOR (node->decl)) 569 1.1 mrg streamer_write_hwi_stream (ob->main_stream, node->get_fini_priority ()); 570 1.1 mrg 571 1.1 mrg if (thunk) 572 1.1 mrg thunk_info::get (node)->stream_out (ob); 573 1.1 mrg } 574 1.1 mrg 575 1.1 mrg /* Output the varpool NODE to OB. 576 1.1 mrg If NODE is not in SET, then NODE is a boundary. */ 577 1.1 mrg 578 1.1 mrg static void 579 1.1 mrg lto_output_varpool_node (struct lto_simple_output_block *ob, varpool_node *node, 580 1.1 mrg lto_symtab_encoder_t encoder) 581 1.1 mrg { 582 1.1 mrg bool boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node); 583 1.1 mrg bool encode_initializer_p 584 1.1 mrg = (node->definition 585 1.1 mrg && lto_symtab_encoder_encode_initializer_p (encoder, node)); 586 1.1 mrg struct bitpack_d bp; 587 1.1 mrg int ref; 588 1.1 mrg const char *comdat; 589 1.1 mrg const char *section; 590 1.1 mrg tree group; 591 1.1 mrg 592 1.1 mrg gcc_assert (!encode_initializer_p || node->definition); 593 1.1 mrg gcc_assert (boundary_p || encode_initializer_p); 594 1.1 mrg 595 1.1 mrg streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, 596 1.1 mrg LTO_symtab_variable); 597 1.1 mrg streamer_write_hwi_stream (ob->main_stream, node->order); 598 1.1 mrg lto_output_var_decl_ref (ob->decl_state, ob->main_stream, node->decl); 599 1.1 mrg bp = bitpack_create (ob->main_stream); 600 1.1 mrg bp_pack_value (&bp, node->externally_visible, 1); 601 1.1 mrg bp_pack_value (&bp, node->no_reorder, 1); 602 1.1 mrg bp_pack_value (&bp, node->force_output, 1); 603 1.1 mrg bp_pack_value (&bp, node->forced_by_abi, 1); 604 1.1 mrg bp_pack_value (&bp, node->unique_name, 1); 605 1.1 mrg bp_pack_value (&bp, 606 1.1 mrg node->body_removed 607 1.1 mrg || (!encode_initializer_p && !node->alias && node->definition), 608 1.1 mrg 1); 609 1.1 mrg bp_pack_value (&bp, node->semantic_interposition, 1); 610 1.1 mrg bp_pack_value (&bp, node->implicit_section, 1); 611 1.1 mrg bp_pack_value (&bp, node->writeonly, 1); 612 1.1 mrg bp_pack_value (&bp, node->definition && (encode_initializer_p || node->alias), 613 1.1 mrg 1); 614 1.1 mrg bp_pack_value (&bp, node->alias, 1); 615 1.1 mrg bp_pack_value (&bp, node->transparent_alias, 1); 616 1.1 mrg bp_pack_value (&bp, node->weakref, 1); 617 1.1 mrg bp_pack_value (&bp, node->symver, 1); 618 1.1 mrg bp_pack_value (&bp, node->analyzed && (!boundary_p || node->alias), 1); 619 1.1 mrg gcc_assert (node->definition || !node->analyzed); 620 1.1 mrg /* Constant pool initializers can be de-unified into individual ltrans units. 621 1.1 mrg FIXME: Alternatively at -Os we may want to avoid generating for them the local 622 1.1 mrg labels and share them across LTRANS partitions. */ 623 1.1 mrg if (node->get_partitioning_class () != SYMBOL_PARTITION) 624 1.1 mrg { 625 1.1 mrg bp_pack_value (&bp, 0, 1); /* used_from_other_parition. */ 626 1.1 mrg bp_pack_value (&bp, 0, 1); /* in_other_partition. */ 627 1.1 mrg } 628 1.1 mrg else 629 1.1 mrg { 630 1.1 mrg bp_pack_value (&bp, node->definition 631 1.1 mrg && referenced_from_other_partition_p (node, encoder), 1); 632 1.1 mrg bp_pack_value (&bp, node->analyzed 633 1.1 mrg && boundary_p && !DECL_EXTERNAL (node->decl), 1); 634 1.1 mrg /* in_other_partition. */ 635 1.1 mrg } 636 1.1 mrg bp_pack_value (&bp, node->tls_model, 3); 637 1.1 mrg bp_pack_value (&bp, node->used_by_single_function, 1); 638 1.1 mrg bp_pack_value (&bp, node->dynamically_initialized, 1); 639 1.1 mrg streamer_write_bitpack (&bp); 640 1.1 mrg 641 1.1 mrg group = node->get_comdat_group (); 642 1.1 mrg if (group) 643 1.1 mrg comdat = IDENTIFIER_POINTER (group); 644 1.1 mrg else 645 1.1 mrg comdat = ""; 646 1.1 mrg streamer_write_data_stream (ob->main_stream, comdat, strlen (comdat) + 1); 647 1.1 mrg 648 1.1 mrg if (group) 649 1.1 mrg { 650 1.1 mrg if (node->same_comdat_group) 651 1.1 mrg { 652 1.1 mrg ref = LCC_NOT_FOUND; 653 1.1 mrg for (struct symtab_node *n = node->same_comdat_group; 654 1.1 mrg ref == LCC_NOT_FOUND && n != node; n = n->same_comdat_group) 655 1.1 mrg ref = lto_symtab_encoder_lookup (encoder, n); 656 1.1 mrg } 657 1.1 mrg else 658 1.1 mrg ref = LCC_NOT_FOUND; 659 1.1 mrg streamer_write_hwi_stream (ob->main_stream, ref); 660 1.1 mrg } 661 1.1 mrg 662 1.1 mrg section = node->get_section (); 663 1.1 mrg if (!section) 664 1.1 mrg section = ""; 665 1.1 mrg streamer_write_data_stream (ob->main_stream, section, strlen (section) + 1); 666 1.1 mrg 667 1.1 mrg streamer_write_enum (ob->main_stream, ld_plugin_symbol_resolution, 668 1.1 mrg LDPR_NUM_KNOWN, node->resolution); 669 1.1 mrg } 670 1.1 mrg 671 1.1 mrg /* Output the varpool NODE to OB. 672 1.1 mrg If NODE is not in SET, then NODE is a boundary. */ 673 1.1 mrg 674 1.1 mrg static void 675 1.1 mrg lto_output_ref (struct lto_simple_output_block *ob, struct ipa_ref *ref, 676 1.1 mrg lto_symtab_encoder_t encoder) 677 1.1 mrg { 678 1.1 mrg struct bitpack_d bp; 679 1.1 mrg int nref; 680 1.1 mrg int uid = !ref->stmt ? ref->lto_stmt_uid : gimple_uid (ref->stmt) + 1; 681 1.1 mrg struct cgraph_node *node; 682 1.1 mrg 683 1.1 mrg bp = bitpack_create (ob->main_stream); 684 1.1 mrg bp_pack_value (&bp, ref->use, 3); 685 1.1 mrg bp_pack_value (&bp, ref->speculative, 1); 686 1.1 mrg streamer_write_bitpack (&bp); 687 1.1 mrg nref = lto_symtab_encoder_lookup (encoder, ref->referred); 688 1.1 mrg gcc_assert (nref != LCC_NOT_FOUND); 689 1.1 mrg streamer_write_hwi_stream (ob->main_stream, nref); 690 1.1 mrg 691 1.1 mrg node = dyn_cast <cgraph_node *> (ref->referring); 692 1.1 mrg if (node) 693 1.1 mrg { 694 1.1 mrg if (ref->stmt) 695 1.1 mrg uid = gimple_uid (ref->stmt) + 1; 696 1.1 mrg streamer_write_hwi_stream (ob->main_stream, uid); 697 1.1 mrg bp_pack_value (&bp, ref->speculative_id, 16); 698 1.1 mrg streamer_write_bitpack (&bp); 699 1.1 mrg } 700 1.1 mrg } 701 1.1 mrg 702 1.1 mrg /* Stream out profile_summary to OB. */ 703 1.1 mrg 704 1.1 mrg static void 705 1.1 mrg output_profile_summary (struct lto_simple_output_block *ob) 706 1.1 mrg { 707 1.1 mrg if (profile_info) 708 1.1 mrg { 709 1.1 mrg /* We do not output num and run_max, they are not used by 710 1.1 mrg GCC profile feedback and they are difficult to merge from multiple 711 1.1 mrg units. */ 712 1.1 mrg unsigned runs = (profile_info->runs); 713 1.1 mrg streamer_write_uhwi_stream (ob->main_stream, runs); 714 1.1 mrg 715 1.1 mrg /* IPA-profile computes hot bb threshold based on cumulated 716 1.1 mrg whole program profile. We need to stream it down to ltrans. */ 717 1.1 mrg if (flag_wpa) 718 1.1 mrg streamer_write_gcov_count_stream (ob->main_stream, 719 1.1 mrg get_hot_bb_threshold ()); 720 1.1 mrg } 721 1.1 mrg else 722 1.1 mrg streamer_write_uhwi_stream (ob->main_stream, 0); 723 1.1 mrg } 724 1.1 mrg 725 1.1 mrg /* Output all callees or indirect outgoing edges. EDGE must be the first such 726 1.1 mrg edge. */ 727 1.1 mrg 728 1.1 mrg static void 729 1.1 mrg output_outgoing_cgraph_edges (struct cgraph_edge *edge, 730 1.1 mrg struct lto_simple_output_block *ob, 731 1.1 mrg lto_symtab_encoder_t encoder) 732 1.1 mrg { 733 1.1 mrg if (!edge) 734 1.1 mrg return; 735 1.1 mrg 736 1.1 mrg /* Output edges in backward direction, so the reconstructed callgraph match 737 1.1 mrg and it is easy to associate call sites in the IPA pass summaries. */ 738 1.1 mrg while (edge->next_callee) 739 1.1 mrg edge = edge->next_callee; 740 1.1 mrg for (; edge; edge = edge->prev_callee) 741 1.1 mrg lto_output_edge (ob, edge, encoder); 742 1.1 mrg } 743 1.1 mrg 744 1.1 mrg /* Output the part of the cgraph in SET. */ 745 1.1 mrg 746 1.1 mrg static void 747 1.1 mrg output_refs (lto_symtab_encoder_t encoder) 748 1.1 mrg { 749 1.1 mrg struct lto_simple_output_block *ob; 750 1.1 mrg int count; 751 1.1 mrg struct ipa_ref *ref; 752 1.1 mrg 753 1.1 mrg ob = lto_create_simple_output_block (LTO_section_refs); 754 1.1 mrg 755 1.1 mrg for (int i = 0; i < lto_symtab_encoder_size (encoder); i++) 756 1.1 mrg { 757 1.1 mrg symtab_node *node = lto_symtab_encoder_deref (encoder, i); 758 1.1 mrg 759 1.1 mrg /* IPA_REF_ALIAS references are always preserved 760 1.1 mrg in the boundary. Alias node can't have other references and 761 1.1 mrg can be always handled as if it's not in the boundary. */ 762 1.1 mrg if (!node->alias && !lto_symtab_encoder_in_partition_p (encoder, node)) 763 1.1 mrg continue; 764 1.1 mrg 765 1.1 mrg count = node->ref_list.nreferences (); 766 1.1 mrg if (count) 767 1.1 mrg { 768 1.1 mrg streamer_write_gcov_count_stream (ob->main_stream, count); 769 1.1 mrg streamer_write_uhwi_stream (ob->main_stream, 770 1.1 mrg lto_symtab_encoder_lookup (encoder, node)); 771 1.1 mrg for (int i = 0; node->iterate_reference (i, ref); i++) 772 1.1 mrg lto_output_ref (ob, ref, encoder); 773 1.1 mrg } 774 1.1 mrg if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node)) 775 1.1 mrg if (cnode->declare_variant_alt) 776 1.1 mrg omp_lto_output_declare_variant_alt (ob, cnode, encoder); 777 1.1 mrg } 778 1.1 mrg 779 1.1 mrg streamer_write_uhwi_stream (ob->main_stream, 0); 780 1.1 mrg 781 1.1 mrg lto_destroy_simple_output_block (ob); 782 1.1 mrg } 783 1.1 mrg 784 1.1 mrg /* Add NODE into encoder as well as nodes it is cloned from. 785 1.1 mrg Do it in a way so clones appear first. */ 786 1.1 mrg 787 1.1 mrg static void 788 1.1 mrg add_node_to (lto_symtab_encoder_t encoder, struct cgraph_node *node, 789 1.1 mrg bool include_body) 790 1.1 mrg { 791 1.1 mrg if (node->clone_of) 792 1.1 mrg add_node_to (encoder, node->clone_of, include_body); 793 1.1 mrg else if (include_body) 794 1.1 mrg lto_set_symtab_encoder_encode_body (encoder, node); 795 1.1 mrg lto_symtab_encoder_encode (encoder, node); 796 1.1 mrg } 797 1.1 mrg 798 1.1 mrg /* Add all references in NODE to encoders. */ 799 1.1 mrg 800 1.1 mrg static void 801 1.1 mrg create_references (lto_symtab_encoder_t encoder, symtab_node *node) 802 1.1 mrg { 803 1.1 mrg int i; 804 1.1 mrg struct ipa_ref *ref = NULL; 805 1.1 mrg for (i = 0; node->iterate_reference (i, ref); i++) 806 1.1 mrg if (is_a <cgraph_node *> (ref->referred)) 807 1.1 mrg add_node_to (encoder, dyn_cast <cgraph_node *> (ref->referred), false); 808 1.1 mrg else 809 1.1 mrg lto_symtab_encoder_encode (encoder, ref->referred); 810 1.1 mrg } 811 1.1 mrg 812 1.1 mrg /* Select what needs to be streamed out. In regular lto mode stream everything. 813 1.1 mrg In offload lto mode stream only nodes marked as offloadable. */ 814 1.1 mrg void 815 1.1 mrg select_what_to_stream (void) 816 1.1 mrg { 817 1.1 mrg struct symtab_node *snode; 818 1.1 mrg FOR_EACH_SYMBOL (snode) 819 1.1 mrg snode->need_lto_streaming = !lto_stream_offload_p || snode->offloadable; 820 1.1 mrg } 821 1.1 mrg 822 1.1 mrg /* Find all symbols we want to stream into given partition and insert them 823 1.1 mrg to encoders. 824 1.1 mrg 825 1.1 mrg The function actually replaces IN_ENCODER by new one. The reason is that 826 1.1 mrg streaming code needs clone's origin to be streamed before clone. This 827 1.1 mrg means that we need to insert the nodes in specific order. This order is 828 1.1 mrg ignored by the partitioning logic earlier. */ 829 1.1 mrg 830 1.1 mrg lto_symtab_encoder_t 831 1.1 mrg compute_ltrans_boundary (lto_symtab_encoder_t in_encoder) 832 1.1 mrg { 833 1.1 mrg struct cgraph_edge *edge; 834 1.1 mrg int i; 835 1.1 mrg lto_symtab_encoder_t encoder; 836 1.1 mrg lto_symtab_encoder_iterator lsei; 837 1.1 mrg hash_set<void *> reachable_call_targets; 838 1.1 mrg 839 1.1 mrg encoder = lto_symtab_encoder_new (false); 840 1.1 mrg 841 1.1 mrg /* Go over all entries in the IN_ENCODER and duplicate them to 842 1.1 mrg ENCODER. At the same time insert masters of clones so 843 1.1 mrg every master appears before clone. */ 844 1.1 mrg for (lsei = lsei_start_function_in_partition (in_encoder); 845 1.1 mrg !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei)) 846 1.1 mrg { 847 1.1 mrg struct cgraph_node *node = lsei_cgraph_node (lsei); 848 1.1 mrg if (!node->need_lto_streaming) 849 1.1 mrg continue; 850 1.1 mrg add_node_to (encoder, node, true); 851 1.1 mrg lto_set_symtab_encoder_in_partition (encoder, node); 852 1.1 mrg create_references (encoder, node); 853 1.1 mrg } 854 1.1 mrg for (lsei = lsei_start_variable_in_partition (in_encoder); 855 1.1 mrg !lsei_end_p (lsei); lsei_next_variable_in_partition (&lsei)) 856 1.1 mrg { 857 1.1 mrg varpool_node *vnode = lsei_varpool_node (lsei); 858 1.1 mrg 859 1.1 mrg if (!vnode->need_lto_streaming) 860 1.1 mrg continue; 861 1.1 mrg lto_set_symtab_encoder_in_partition (encoder, vnode); 862 1.1 mrg lto_set_symtab_encoder_encode_initializer (encoder, vnode); 863 1.1 mrg create_references (encoder, vnode); 864 1.1 mrg } 865 1.1 mrg /* Pickle in also the initializer of all referenced readonly variables 866 1.1 mrg to help folding. Constant pool variables are not shared, so we must 867 1.1 mrg pickle those too. */ 868 1.1 mrg for (i = 0; i < lto_symtab_encoder_size (encoder); i++) 869 1.1 mrg { 870 1.1 mrg symtab_node *node = lto_symtab_encoder_deref (encoder, i); 871 1.1 mrg if (varpool_node *vnode = dyn_cast <varpool_node *> (node)) 872 1.1 mrg { 873 1.1 mrg if (!lto_symtab_encoder_encode_initializer_p (encoder, 874 1.1 mrg vnode) 875 1.1 mrg && (((vnode->ctor_useable_for_folding_p () 876 1.1 mrg && (!DECL_VIRTUAL_P (vnode->decl) 877 1.1 mrg || !flag_wpa 878 1.1 mrg || flag_ltrans_devirtualize))))) 879 1.1 mrg { 880 1.1 mrg lto_set_symtab_encoder_encode_initializer (encoder, vnode); 881 1.1 mrg create_references (encoder, vnode); 882 1.1 mrg } 883 1.1 mrg } 884 1.1 mrg } 885 1.1 mrg 886 1.1 mrg /* Go over all the nodes again to include callees that are not in 887 1.1 mrg SET. */ 888 1.1 mrg for (lsei = lsei_start_function_in_partition (encoder); 889 1.1 mrg !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei)) 890 1.1 mrg { 891 1.1 mrg struct cgraph_node *node = lsei_cgraph_node (lsei); 892 1.1 mrg for (edge = node->callees; edge; edge = edge->next_callee) 893 1.1 mrg { 894 1.1 mrg struct cgraph_node *callee = edge->callee; 895 1.1 mrg if (!lto_symtab_encoder_in_partition_p (encoder, callee)) 896 1.1 mrg { 897 1.1 mrg /* We should have moved all the inlines. */ 898 1.1 mrg gcc_assert (!callee->inlined_to); 899 1.1 mrg add_node_to (encoder, callee, false); 900 1.1 mrg } 901 1.1 mrg } 902 1.1 mrg /* Add all possible targets for late devirtualization. */ 903 1.1 mrg if (flag_ltrans_devirtualize || !flag_wpa) 904 1.1 mrg for (edge = node->indirect_calls; edge; edge = edge->next_callee) 905 1.1 mrg if (edge->indirect_info->polymorphic) 906 1.1 mrg { 907 1.1 mrg unsigned int i; 908 1.1 mrg void *cache_token; 909 1.1 mrg bool final; 910 1.1 mrg vec <cgraph_node *>targets 911 1.1 mrg = possible_polymorphic_call_targets 912 1.1 mrg (edge, &final, &cache_token); 913 1.1 mrg if (!reachable_call_targets.add (cache_token)) 914 1.1 mrg { 915 1.1 mrg for (i = 0; i < targets.length (); i++) 916 1.1 mrg { 917 1.1 mrg struct cgraph_node *callee = targets[i]; 918 1.1 mrg 919 1.1 mrg /* Adding an external declarations into the unit serves 920 1.1 mrg no purpose and just increases its boundary. */ 921 1.1 mrg if (callee->definition 922 1.1 mrg && !lto_symtab_encoder_in_partition_p 923 1.1 mrg (encoder, callee)) 924 1.1 mrg { 925 1.1 mrg gcc_assert (!callee->inlined_to); 926 1.1 mrg add_node_to (encoder, callee, false); 927 1.1 mrg } 928 1.1 mrg } 929 1.1 mrg } 930 1.1 mrg } 931 1.1 mrg } 932 1.1 mrg /* Be sure to also insert alias targert and thunk callees. These needs 933 1.1 mrg to stay to aid local calling conventions. */ 934 1.1 mrg for (i = 0; i < lto_symtab_encoder_size (encoder); i++) 935 1.1 mrg { 936 1.1 mrg symtab_node *node = lto_symtab_encoder_deref (encoder, i); 937 1.1 mrg cgraph_node *cnode = dyn_cast <cgraph_node *> (node); 938 1.1 mrg 939 1.1 mrg if (node->alias && node->analyzed) 940 1.1 mrg create_references (encoder, node); 941 1.1 mrg if (cnode 942 1.1 mrg && cnode->thunk && !cnode->inlined_to) 943 1.1 mrg add_node_to (encoder, cnode->callees->callee, false); 944 1.1 mrg while (node->transparent_alias && node->analyzed) 945 1.1 mrg { 946 1.1 mrg node = node->get_alias_target (); 947 1.1 mrg if (is_a <cgraph_node *> (node)) 948 1.1 mrg add_node_to (encoder, dyn_cast <cgraph_node *> (node), 949 1.1 mrg false); 950 1.1 mrg else 951 1.1 mrg lto_symtab_encoder_encode (encoder, node); 952 1.1 mrg } 953 1.1 mrg } 954 1.1 mrg lto_symtab_encoder_delete (in_encoder); 955 1.1 mrg return encoder; 956 1.1 mrg } 957 1.1 mrg 958 1.1 mrg /* Output the part of the symtab in SET and VSET. */ 959 1.1 mrg 960 1.1 mrg void 961 1.1 mrg output_symtab (void) 962 1.1 mrg { 963 1.1 mrg struct cgraph_node *node; 964 1.1 mrg struct lto_simple_output_block *ob; 965 1.1 mrg int i, n_nodes; 966 1.1 mrg lto_symtab_encoder_t encoder; 967 1.1 mrg 968 1.1 mrg if (flag_wpa) 969 1.1 mrg output_cgraph_opt_summary (); 970 1.1 mrg 971 1.1 mrg ob = lto_create_simple_output_block (LTO_section_symtab_nodes); 972 1.1 mrg 973 1.1 mrg output_profile_summary (ob); 974 1.1 mrg 975 1.1 mrg /* An encoder for cgraph nodes should have been created by 976 1.1 mrg ipa_write_summaries_1. */ 977 1.1 mrg gcc_assert (ob->decl_state->symtab_node_encoder); 978 1.1 mrg encoder = ob->decl_state->symtab_node_encoder; 979 1.1 mrg 980 1.1 mrg /* Write out the nodes. We must first output a node and then its clones, 981 1.1 mrg otherwise at a time reading back the node there would be nothing to clone 982 1.1 mrg from. */ 983 1.1 mrg n_nodes = lto_symtab_encoder_size (encoder); 984 1.1 mrg for (i = 0; i < n_nodes; i++) 985 1.1 mrg { 986 1.1 mrg symtab_node *node = lto_symtab_encoder_deref (encoder, i); 987 1.1 mrg if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node)) 988 1.1 mrg lto_output_node (ob, cnode, encoder); 989 1.1 mrg else 990 1.1 mrg lto_output_varpool_node (ob, dyn_cast<varpool_node *> (node), encoder); 991 1.1 mrg } 992 1.1 mrg 993 1.1 mrg /* Go over the nodes in SET again to write edges. */ 994 1.1 mrg for (int i = 0; i < lto_symtab_encoder_size (encoder); i++) 995 1.1 mrg { 996 1.1 mrg node = dyn_cast <cgraph_node *> (lto_symtab_encoder_deref (encoder, i)); 997 1.1 mrg if (node 998 1.1 mrg && ((node->thunk && !node->inlined_to) 999 1.1 mrg || lto_symtab_encoder_in_partition_p (encoder, node))) 1000 1.1 mrg { 1001 1.1 mrg output_outgoing_cgraph_edges (node->callees, ob, encoder); 1002 1.1 mrg output_outgoing_cgraph_edges (node->indirect_calls, ob, encoder); 1003 1.1 mrg } 1004 1.1 mrg } 1005 1.1 mrg 1006 1.1 mrg streamer_write_uhwi_stream (ob->main_stream, 0); 1007 1.1 mrg 1008 1.1 mrg lto_destroy_simple_output_block (ob); 1009 1.1 mrg 1010 1.1 mrg /* Emit toplevel asms. 1011 1.1 mrg When doing WPA we must output every asm just once. Since we do not partition asm 1012 1.1 mrg nodes at all, output them to first output. This is kind of hack, but should work 1013 1.1 mrg well. */ 1014 1.1 mrg if (!asm_nodes_output) 1015 1.1 mrg { 1016 1.1 mrg asm_nodes_output = true; 1017 1.1 mrg lto_output_toplevel_asms (); 1018 1.1 mrg } 1019 1.1 mrg 1020 1.1 mrg output_refs (encoder); 1021 1.1 mrg } 1022 1.1 mrg 1023 1.1 mrg /* Return identifier encoded in IB as a plain string. */ 1024 1.1 mrg 1025 1.1 mrg static tree 1026 1.1 mrg read_identifier (class lto_input_block *ib) 1027 1.1 mrg { 1028 1.1 mrg unsigned int len = strnlen (ib->data + ib->p, ib->len - ib->p - 1); 1029 1.1 mrg tree id; 1030 1.1 mrg 1031 1.1 mrg if (ib->data[ib->p + len]) 1032 1.1 mrg lto_section_overrun (ib); 1033 1.1 mrg if (!len) 1034 1.1 mrg { 1035 1.1 mrg ib->p++; 1036 1.1 mrg return NULL; 1037 1.1 mrg } 1038 1.1 mrg id = get_identifier (ib->data + ib->p); 1039 1.1 mrg ib->p += len + 1; 1040 1.1 mrg return id; 1041 1.1 mrg } 1042 1.1 mrg 1043 1.1 mrg /* Return string encoded in IB, NULL if string is empty. */ 1044 1.1 mrg 1045 1.1 mrg static const char * 1046 1.1 mrg read_string (class lto_input_block *ib) 1047 1.1 mrg { 1048 1.1 mrg unsigned int len = strnlen (ib->data + ib->p, ib->len - ib->p - 1); 1049 1.1 mrg const char *str; 1050 1.1 mrg 1051 1.1 mrg if (ib->data[ib->p + len]) 1052 1.1 mrg lto_section_overrun (ib); 1053 1.1 mrg if (!len) 1054 1.1 mrg { 1055 1.1 mrg ib->p++; 1056 1.1 mrg return NULL; 1057 1.1 mrg } 1058 1.1 mrg str = ib->data + ib->p; 1059 1.1 mrg ib->p += len + 1; 1060 1.1 mrg return str; 1061 1.1 mrg } 1062 1.1 mrg 1063 1.1 mrg /* Output function/variable tables that will allow libgomp to look up offload 1064 1.1 mrg target code. 1065 1.1 mrg OFFLOAD_FUNCS is filled in expand_omp_target, OFFLOAD_VARS is filled in 1066 1.1 mrg varpool_node::get_create. In WHOPR (partitioned) mode during the WPA stage 1067 1.1 mrg both OFFLOAD_FUNCS and OFFLOAD_VARS are filled by input_offload_tables. */ 1068 1.1 mrg 1069 1.1 mrg void 1070 1.1 mrg output_offload_tables (void) 1071 1.1 mrg { 1072 1.1 mrg if (vec_safe_is_empty (offload_funcs) && vec_safe_is_empty (offload_vars)) 1073 1.1 mrg return; 1074 1.1 mrg 1075 1.1 mrg struct lto_simple_output_block *ob 1076 1.1 mrg = lto_create_simple_output_block (LTO_section_offload_table); 1077 1.1 mrg 1078 1.1 mrg for (unsigned i = 0; i < vec_safe_length (offload_funcs); i++) 1079 1.1 mrg { 1080 1.1 mrg symtab_node *node = symtab_node::get ((*offload_funcs)[i]); 1081 1.1 mrg if (!node) 1082 1.1 mrg continue; 1083 1.1 mrg node->force_output = true; 1084 1.1 mrg streamer_write_enum (ob->main_stream, LTO_symtab_tags, 1085 1.1 mrg LTO_symtab_last_tag, LTO_symtab_unavail_node); 1086 1.1 mrg lto_output_fn_decl_ref (ob->decl_state, ob->main_stream, 1087 1.1 mrg (*offload_funcs)[i]); 1088 1.1 mrg } 1089 1.1 mrg 1090 1.1 mrg for (unsigned i = 0; i < vec_safe_length (offload_vars); i++) 1091 1.1 mrg { 1092 1.1 mrg symtab_node *node = symtab_node::get ((*offload_vars)[i]); 1093 1.1 mrg if (!node) 1094 1.1 mrg continue; 1095 1.1 mrg node->force_output = true; 1096 1.1 mrg streamer_write_enum (ob->main_stream, LTO_symtab_tags, 1097 1.1 mrg LTO_symtab_last_tag, LTO_symtab_variable); 1098 1.1 mrg lto_output_var_decl_ref (ob->decl_state, ob->main_stream, 1099 1.1 mrg (*offload_vars)[i]); 1100 1.1 mrg } 1101 1.1 mrg 1102 1.1 mrg streamer_write_uhwi_stream (ob->main_stream, 0); 1103 1.1 mrg lto_destroy_simple_output_block (ob); 1104 1.1 mrg 1105 1.1 mrg /* In WHOPR mode during the WPA stage the joint offload tables need to be 1106 1.1 mrg streamed to one partition only. That's why we free offload_funcs and 1107 1.1 mrg offload_vars after the first call of output_offload_tables. */ 1108 1.1 mrg if (flag_wpa) 1109 1.1 mrg { 1110 1.1 mrg vec_free (offload_funcs); 1111 1.1 mrg vec_free (offload_vars); 1112 1.1 mrg } 1113 1.1 mrg } 1114 1.1 mrg 1115 1.1 mrg /* Verify the partitioning of NODE. */ 1116 1.1 mrg 1117 1.1 mrg static inline void 1118 1.1 mrg verify_node_partition (symtab_node *node) 1119 1.1 mrg { 1120 1.1 mrg if (flag_ltrans) 1121 1.1 mrg return; 1122 1.1 mrg 1123 1.1 mrg #ifdef ACCEL_COMPILER 1124 1.1 mrg if (node->in_other_partition) 1125 1.1 mrg { 1126 1.1 mrg if (TREE_CODE (node->decl) == FUNCTION_DECL) 1127 1.1 mrg error_at (DECL_SOURCE_LOCATION (node->decl), 1128 1.1 mrg "function %qs has been referenced in offloaded code but" 1129 1.1 mrg " hasn%'t been marked to be included in the offloaded code", 1130 1.1 mrg node->name ()); 1131 1.1 mrg else if (VAR_P (node->decl)) 1132 1.1 mrg error_at (DECL_SOURCE_LOCATION (node->decl), 1133 1.1 mrg "variable %qs has been referenced in offloaded code but" 1134 1.1 mrg " hasn%'t been marked to be included in the offloaded code", 1135 1.1 mrg node->name ()); 1136 1.1 mrg else 1137 1.1 mrg gcc_unreachable (); 1138 1.1 mrg } 1139 1.1 mrg #else 1140 1.1 mrg gcc_assert (!node->in_other_partition 1141 1.1 mrg && !node->used_from_other_partition); 1142 1.1 mrg #endif 1143 1.1 mrg } 1144 1.1 mrg 1145 1.1 mrg /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS, 1146 1.1 mrg STACK_SIZE, SELF_TIME and SELF_SIZE. This is called either to initialize 1147 1.1 mrg NODE or to replace the values in it, for instance because the first 1148 1.1 mrg time we saw it, the function body was not available but now it 1149 1.1 mrg is. BP is a bitpack with all the bitflags for NODE read from the 1150 1.1 mrg stream. Initialize HAS_THUNK_INFO to indicate if thunk info should 1151 1.1 mrg be streamed in. */ 1152 1.1 mrg 1153 1.1 mrg static void 1154 1.1 mrg input_overwrite_node (struct lto_file_decl_data *file_data, 1155 1.1 mrg struct cgraph_node *node, 1156 1.1 mrg enum LTO_symtab_tags tag, 1157 1.1 mrg struct bitpack_d *bp, bool *has_thunk_info) 1158 1.1 mrg { 1159 1.1 mrg node->aux = (void *) tag; 1160 1.1 mrg node->lto_file_data = file_data; 1161 1.1 mrg 1162 1.1 mrg node->local = bp_unpack_value (bp, 1); 1163 1.1 mrg node->externally_visible = bp_unpack_value (bp, 1); 1164 1.1 mrg node->no_reorder = bp_unpack_value (bp, 1); 1165 1.1 mrg node->definition = bp_unpack_value (bp, 1); 1166 1.1 mrg node->versionable = bp_unpack_value (bp, 1); 1167 1.1 mrg node->can_change_signature = bp_unpack_value (bp, 1); 1168 1.1 mrg node->redefined_extern_inline = bp_unpack_value (bp, 1); 1169 1.1 mrg node->force_output = bp_unpack_value (bp, 1); 1170 1.1 mrg node->forced_by_abi = bp_unpack_value (bp, 1); 1171 1.1 mrg node->unique_name = bp_unpack_value (bp, 1); 1172 1.1 mrg node->body_removed = bp_unpack_value (bp, 1); 1173 1.1 mrg node->semantic_interposition = bp_unpack_value (bp, 1); 1174 1.1 mrg node->implicit_section = bp_unpack_value (bp, 1); 1175 1.1 mrg node->address_taken = bp_unpack_value (bp, 1); 1176 1.1 mrg node->used_from_other_partition = bp_unpack_value (bp, 1); 1177 1.1 mrg node->lowered = bp_unpack_value (bp, 1); 1178 1.1 mrg node->analyzed = tag == LTO_symtab_analyzed_node; 1179 1.1 mrg node->in_other_partition = bp_unpack_value (bp, 1); 1180 1.1 mrg if (node->in_other_partition 1181 1.1 mrg /* Avoid updating decl when we are seeing just inline clone. 1182 1.1 mrg When inlining function that has functions already inlined into it, 1183 1.1 mrg we produce clones of inline clones. 1184 1.1 mrg 1185 1.1 mrg WPA partitioning might put each clone into different unit and 1186 1.1 mrg we might end up streaming inline clone from other partition 1187 1.1 mrg to support clone we are interested in. */ 1188 1.1 mrg && (!node->clone_of 1189 1.1 mrg || node->clone_of->decl != node->decl)) 1190 1.1 mrg { 1191 1.1 mrg DECL_EXTERNAL (node->decl) = 1; 1192 1.1 mrg TREE_STATIC (node->decl) = 0; 1193 1.1 mrg } 1194 1.1 mrg node->alias = bp_unpack_value (bp, 1); 1195 1.1 mrg node->transparent_alias = bp_unpack_value (bp, 1); 1196 1.1 mrg node->weakref = bp_unpack_value (bp, 1); 1197 1.1 mrg node->symver = bp_unpack_value (bp, 1); 1198 1.1 mrg node->frequency = (enum node_frequency)bp_unpack_value (bp, 2); 1199 1.1 mrg node->only_called_at_startup = bp_unpack_value (bp, 1); 1200 1.1 mrg node->only_called_at_exit = bp_unpack_value (bp, 1); 1201 1.1 mrg node->tm_clone = bp_unpack_value (bp, 1); 1202 1.1 mrg node->calls_comdat_local = bp_unpack_value (bp, 1); 1203 1.1 mrg node->icf_merged = bp_unpack_value (bp, 1); 1204 1.1 mrg node->nonfreeing_fn = bp_unpack_value (bp, 1); 1205 1.1 mrg node->merged_comdat = bp_unpack_value (bp, 1); 1206 1.1 mrg node->merged_extern_inline = bp_unpack_value (bp, 1); 1207 1.1 mrg node->thunk = bp_unpack_value (bp, 1); 1208 1.1 mrg node->parallelized_function = bp_unpack_value (bp, 1); 1209 1.1 mrg node->declare_variant_alt = bp_unpack_value (bp, 1); 1210 1.1 mrg node->calls_declare_variant_alt = bp_unpack_value (bp, 1); 1211 1.1 mrg *has_thunk_info = bp_unpack_value (bp, 1); 1212 1.1 mrg node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution, 1213 1.1 mrg LDPR_NUM_KNOWN); 1214 1.1 mrg node->split_part = bp_unpack_value (bp, 1); 1215 1.1 mrg verify_node_partition (node); 1216 1.1 mrg } 1217 1.1 mrg 1218 1.1 mrg /* Return string alias is alias of. */ 1219 1.1 mrg 1220 1.1 mrg static tree 1221 1.1 mrg get_alias_symbol (tree decl) 1222 1.1 mrg { 1223 1.1 mrg tree alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl)); 1224 1.1 mrg return get_identifier (TREE_STRING_POINTER 1225 1.1 mrg (TREE_VALUE (TREE_VALUE (alias)))); 1226 1.1 mrg } 1227 1.1 mrg 1228 1.1 mrg /* Read a node from input_block IB. TAG is the node's tag just read. 1229 1.1 mrg Return the node read or overwriten. */ 1230 1.1 mrg 1231 1.1 mrg static struct cgraph_node * 1232 1.1 mrg input_node (struct lto_file_decl_data *file_data, 1233 1.1 mrg class lto_input_block *ib, 1234 1.1 mrg enum LTO_symtab_tags tag, 1235 1.1 mrg vec<symtab_node *> nodes) 1236 1.1 mrg { 1237 1.1 mrg gcc::pass_manager *passes = g->get_passes (); 1238 1.1 mrg tree fn_decl; 1239 1.1 mrg struct cgraph_node *node; 1240 1.1 mrg struct bitpack_d bp; 1241 1.1 mrg int ref = LCC_NOT_FOUND, ref2 = LCC_NOT_FOUND; 1242 1.1 mrg int clone_ref; 1243 1.1 mrg int order; 1244 1.1 mrg int i, count; 1245 1.1 mrg tree group; 1246 1.1 mrg const char *section; 1247 1.1 mrg order = streamer_read_hwi (ib) + file_data->order_base; 1248 1.1 mrg clone_ref = streamer_read_hwi (ib); 1249 1.1 mrg bool has_thunk_info; 1250 1.1 mrg 1251 1.1 mrg fn_decl = lto_input_fn_decl_ref (ib, file_data); 1252 1.1 mrg 1253 1.1 mrg if (clone_ref != LCC_NOT_FOUND) 1254 1.1 mrg { 1255 1.1 mrg node = dyn_cast<cgraph_node *> (nodes[clone_ref])->create_clone (fn_decl, 1256 1.1 mrg profile_count::uninitialized (), false, 1257 1.1 mrg vNULL, false, NULL, NULL); 1258 1.1 mrg } 1259 1.1 mrg else 1260 1.1 mrg { 1261 1.1 mrg /* Declaration of functions can be already merged with a declaration 1262 1.1 mrg from other input file. We keep cgraph unmerged until after streaming 1263 1.1 mrg of ipa passes is done. Alays forcingly create a fresh node. */ 1264 1.1 mrg node = symtab->create_empty (); 1265 1.1 mrg node->decl = fn_decl; 1266 1.1 mrg if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (fn_decl))) 1267 1.1 mrg node->ifunc_resolver = 1; 1268 1.1 mrg node->register_symbol (); 1269 1.1 mrg } 1270 1.1 mrg 1271 1.1 mrg node->order = order; 1272 1.1 mrg if (order >= symtab->order) 1273 1.1 mrg symtab->order = order + 1; 1274 1.1 mrg 1275 1.1 mrg node->count = profile_count::stream_in (ib); 1276 1.1 mrg node->count_materialization_scale = streamer_read_hwi (ib); 1277 1.1 mrg 1278 1.1 mrg count = streamer_read_hwi (ib); 1279 1.1 mrg node->ipa_transforms_to_apply = vNULL; 1280 1.1 mrg for (i = 0; i < count; i++) 1281 1.1 mrg { 1282 1.1 mrg opt_pass *pass; 1283 1.1 mrg int pid = streamer_read_hwi (ib); 1284 1.1 mrg 1285 1.1 mrg gcc_assert (pid < passes->passes_by_id_size); 1286 1.1 mrg pass = passes->passes_by_id[pid]; 1287 1.1 mrg node->ipa_transforms_to_apply.safe_push ((ipa_opt_pass_d *) pass); 1288 1.1 mrg } 1289 1.1 mrg 1290 1.1 mrg if (tag == LTO_symtab_analyzed_node) 1291 1.1 mrg ref = streamer_read_hwi (ib); 1292 1.1 mrg 1293 1.1 mrg group = read_identifier (ib); 1294 1.1 mrg if (group) 1295 1.1 mrg ref2 = streamer_read_hwi (ib); 1296 1.1 mrg 1297 1.1 mrg /* Make sure that we have not read this node before. Nodes that 1298 1.1 mrg have already been read will have their tag stored in the 'aux' 1299 1.1 mrg field. Since built-in functions can be referenced in multiple 1300 1.1 mrg functions, they are expected to be read more than once. */ 1301 1.1 mrg if (node->aux && !fndecl_built_in_p (node->decl)) 1302 1.1 mrg internal_error ("bytecode stream: found multiple instances of cgraph " 1303 1.1 mrg "node with uid %d", node->get_uid ()); 1304 1.1 mrg 1305 1.1 mrg node->tp_first_run = streamer_read_uhwi (ib); 1306 1.1 mrg 1307 1.1 mrg bp = streamer_read_bitpack (ib); 1308 1.1 mrg 1309 1.1 mrg input_overwrite_node (file_data, node, tag, &bp, &has_thunk_info); 1310 1.1 mrg 1311 1.1 mrg /* Store a reference for now, and fix up later to be a pointer. */ 1312 1.1 mrg node->inlined_to = (cgraph_node *) (intptr_t) ref; 1313 1.1 mrg 1314 1.1 mrg if (group) 1315 1.1 mrg { 1316 1.1 mrg node->set_comdat_group (group); 1317 1.1 mrg /* Store a reference for now, and fix up later to be a pointer. */ 1318 1.1 mrg node->same_comdat_group = (symtab_node *) (intptr_t) ref2; 1319 1.1 mrg } 1320 1.1 mrg else 1321 1.1 mrg node->same_comdat_group = (symtab_node *) (intptr_t) LCC_NOT_FOUND; 1322 1.1 mrg section = read_string (ib); 1323 1.1 mrg if (section) 1324 1.1 mrg node->set_section_for_node (section); 1325 1.1 mrg 1326 1.1 mrg if (node->alias && !node->analyzed && node->weakref) 1327 1.1 mrg node->alias_target = get_alias_symbol (node->decl); 1328 1.1 mrg node->profile_id = streamer_read_hwi (ib); 1329 1.1 mrg node->unit_id = streamer_read_hwi (ib) + file_data->unit_base; 1330 1.1 mrg if (symtab->max_unit < node->unit_id) 1331 1.1 mrg symtab->max_unit = node->unit_id; 1332 1.1 mrg if (DECL_STATIC_CONSTRUCTOR (node->decl)) 1333 1.1 mrg node->set_init_priority (streamer_read_hwi (ib)); 1334 1.1 mrg if (DECL_STATIC_DESTRUCTOR (node->decl)) 1335 1.1 mrg node->set_fini_priority (streamer_read_hwi (ib)); 1336 1.1 mrg 1337 1.1 mrg if (has_thunk_info) 1338 1.1 mrg thunk_info::get_create (node)->stream_in (ib); 1339 1.1 mrg 1340 1.1 mrg return node; 1341 1.1 mrg } 1342 1.1 mrg 1343 1.1 mrg /* Read a node from input_block IB. TAG is the node's tag just read. 1344 1.1 mrg Return the node read or overwriten. */ 1345 1.1 mrg 1346 1.1 mrg static varpool_node * 1347 1.1 mrg input_varpool_node (struct lto_file_decl_data *file_data, 1348 1.1 mrg class lto_input_block *ib) 1349 1.1 mrg { 1350 1.1 mrg tree var_decl; 1351 1.1 mrg varpool_node *node; 1352 1.1 mrg struct bitpack_d bp; 1353 1.1 mrg int ref = LCC_NOT_FOUND; 1354 1.1 mrg int order; 1355 1.1 mrg tree group; 1356 1.1 mrg const char *section; 1357 1.1 mrg 1358 1.1 mrg order = streamer_read_hwi (ib) + file_data->order_base; 1359 1.1 mrg var_decl = lto_input_var_decl_ref (ib, file_data); 1360 1.1 mrg 1361 1.1 mrg /* Declaration of functions can be already merged with a declaration 1362 1.1 mrg from other input file. We keep cgraph unmerged until after streaming 1363 1.1 mrg of ipa passes is done. Alays forcingly create a fresh node. */ 1364 1.1 mrg node = varpool_node::create_empty (); 1365 1.1 mrg node->decl = var_decl; 1366 1.1 mrg node->register_symbol (); 1367 1.1 mrg 1368 1.1 mrg node->order = order; 1369 1.1 mrg if (order >= symtab->order) 1370 1.1 mrg symtab->order = order + 1; 1371 1.1 mrg node->lto_file_data = file_data; 1372 1.1 mrg 1373 1.1 mrg bp = streamer_read_bitpack (ib); 1374 1.1 mrg node->externally_visible = bp_unpack_value (&bp, 1); 1375 1.1 mrg node->no_reorder = bp_unpack_value (&bp, 1); 1376 1.1 mrg node->force_output = bp_unpack_value (&bp, 1); 1377 1.1 mrg node->forced_by_abi = bp_unpack_value (&bp, 1); 1378 1.1 mrg node->unique_name = bp_unpack_value (&bp, 1); 1379 1.1 mrg node->body_removed = bp_unpack_value (&bp, 1); 1380 1.1 mrg node->semantic_interposition = bp_unpack_value (&bp, 1); 1381 1.1 mrg node->implicit_section = bp_unpack_value (&bp, 1); 1382 1.1 mrg node->writeonly = bp_unpack_value (&bp, 1); 1383 1.1 mrg node->definition = bp_unpack_value (&bp, 1); 1384 1.1 mrg node->alias = bp_unpack_value (&bp, 1); 1385 1.1 mrg node->transparent_alias = bp_unpack_value (&bp, 1); 1386 1.1 mrg node->weakref = bp_unpack_value (&bp, 1); 1387 1.1 mrg node->symver = bp_unpack_value (&bp, 1); 1388 1.1 mrg node->analyzed = bp_unpack_value (&bp, 1); 1389 1.1 mrg node->used_from_other_partition = bp_unpack_value (&bp, 1); 1390 1.1 mrg node->in_other_partition = bp_unpack_value (&bp, 1); 1391 1.1 mrg if (node->in_other_partition) 1392 1.1 mrg { 1393 1.1 mrg DECL_EXTERNAL (node->decl) = 1; 1394 1.1 mrg TREE_STATIC (node->decl) = 0; 1395 1.1 mrg } 1396 1.1 mrg if (node->alias && !node->analyzed && node->weakref) 1397 1.1 mrg node->alias_target = get_alias_symbol (node->decl); 1398 1.1 mrg node->tls_model = (enum tls_model)bp_unpack_value (&bp, 3); 1399 1.1 mrg node->used_by_single_function = (enum tls_model)bp_unpack_value (&bp, 1); 1400 1.1 mrg node->dynamically_initialized = bp_unpack_value (&bp, 1); 1401 1.1 mrg group = read_identifier (ib); 1402 1.1 mrg if (group) 1403 1.1 mrg { 1404 1.1 mrg node->set_comdat_group (group); 1405 1.1 mrg ref = streamer_read_hwi (ib); 1406 1.1 mrg /* Store a reference for now, and fix up later to be a pointer. */ 1407 1.1 mrg node->same_comdat_group = (symtab_node *) (intptr_t) ref; 1408 1.1 mrg } 1409 1.1 mrg else 1410 1.1 mrg node->same_comdat_group = (symtab_node *) (intptr_t) LCC_NOT_FOUND; 1411 1.1 mrg section = read_string (ib); 1412 1.1 mrg if (section) 1413 1.1 mrg node->set_section_for_node (section); 1414 1.1 mrg node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution, 1415 1.1 mrg LDPR_NUM_KNOWN); 1416 1.1 mrg verify_node_partition (node); 1417 1.1 mrg return node; 1418 1.1 mrg } 1419 1.1 mrg 1420 1.1 mrg /* Read a node from input_block IB. TAG is the node's tag just read. 1421 1.1 mrg Return the node read or overwriten. */ 1422 1.1 mrg 1423 1.1 mrg static void 1424 1.1 mrg input_ref (class lto_input_block *ib, 1425 1.1 mrg symtab_node *referring_node, 1426 1.1 mrg vec<symtab_node *> nodes) 1427 1.1 mrg { 1428 1.1 mrg symtab_node *node = NULL; 1429 1.1 mrg struct bitpack_d bp; 1430 1.1 mrg enum ipa_ref_use use; 1431 1.1 mrg bool speculative; 1432 1.1 mrg struct ipa_ref *ref; 1433 1.1 mrg 1434 1.1 mrg bp = streamer_read_bitpack (ib); 1435 1.1 mrg use = (enum ipa_ref_use) bp_unpack_value (&bp, 3); 1436 1.1 mrg speculative = (enum ipa_ref_use) bp_unpack_value (&bp, 1); 1437 1.1 mrg node = nodes[streamer_read_hwi (ib)]; 1438 1.1 mrg ref = referring_node->create_reference (node, use); 1439 1.1 mrg ref->speculative = speculative; 1440 1.1 mrg if (is_a <cgraph_node *> (referring_node)) 1441 1.1 mrg { 1442 1.1 mrg ref->lto_stmt_uid = streamer_read_hwi (ib); 1443 1.1 mrg bp = streamer_read_bitpack (ib); 1444 1.1 mrg ref->speculative_id = bp_unpack_value (&bp, 16); 1445 1.1 mrg } 1446 1.1 mrg } 1447 1.1 mrg 1448 1.1 mrg /* Read an edge from IB. NODES points to a vector of previously read nodes for 1449 1.1 mrg decoding caller and callee of the edge to be read. If INDIRECT is true, the 1450 1.1 mrg edge being read is indirect (in the sense that it has 1451 1.1 mrg indirect_unknown_callee set). */ 1452 1.1 mrg 1453 1.1 mrg static void 1454 1.1 mrg input_edge (class lto_input_block *ib, vec<symtab_node *> nodes, 1455 1.1 mrg bool indirect) 1456 1.1 mrg { 1457 1.1 mrg struct cgraph_node *caller, *callee; 1458 1.1 mrg struct cgraph_edge *edge; 1459 1.1 mrg unsigned int stmt_id, speculative_id; 1460 1.1 mrg profile_count count; 1461 1.1 mrg cgraph_inline_failed_t inline_failed; 1462 1.1 mrg struct bitpack_d bp; 1463 1.1 mrg int ecf_flags = 0; 1464 1.1 mrg 1465 1.1 mrg caller = dyn_cast<cgraph_node *> (nodes[streamer_read_hwi (ib)]); 1466 1.1 mrg if (caller == NULL || caller->decl == NULL_TREE) 1467 1.1 mrg internal_error ("bytecode stream: no caller found while reading edge"); 1468 1.1 mrg 1469 1.1 mrg if (!indirect) 1470 1.1 mrg { 1471 1.1 mrg callee = dyn_cast<cgraph_node *> (nodes[streamer_read_hwi (ib)]); 1472 1.1 mrg if (callee == NULL || callee->decl == NULL_TREE) 1473 1.1 mrg internal_error ("bytecode stream: no callee found while reading edge"); 1474 1.1 mrg } 1475 1.1 mrg else 1476 1.1 mrg callee = NULL; 1477 1.1 mrg 1478 1.1 mrg count = profile_count::stream_in (ib); 1479 1.1 mrg 1480 1.1 mrg bp = streamer_read_bitpack (ib); 1481 1.1 mrg inline_failed = bp_unpack_enum (&bp, cgraph_inline_failed_t, CIF_N_REASONS); 1482 1.1 mrg stmt_id = bp_unpack_var_len_unsigned (&bp); 1483 1.1 mrg speculative_id = bp_unpack_value (&bp, 16); 1484 1.1 mrg 1485 1.1 mrg if (indirect) 1486 1.1 mrg edge = caller->create_indirect_edge (NULL, 0, count); 1487 1.1 mrg else 1488 1.1 mrg edge = caller->create_edge (callee, NULL, count); 1489 1.1 mrg 1490 1.1 mrg edge->indirect_inlining_edge = bp_unpack_value (&bp, 1); 1491 1.1 mrg edge->speculative = bp_unpack_value (&bp, 1); 1492 1.1 mrg edge->lto_stmt_uid = stmt_id; 1493 1.1 mrg edge->speculative_id = speculative_id; 1494 1.1 mrg edge->inline_failed = inline_failed; 1495 1.1 mrg edge->call_stmt_cannot_inline_p = bp_unpack_value (&bp, 1); 1496 1.1 mrg edge->can_throw_external = bp_unpack_value (&bp, 1); 1497 1.1 mrg edge->in_polymorphic_cdtor = bp_unpack_value (&bp, 1); 1498 1.1 mrg if (indirect) 1499 1.1 mrg { 1500 1.1 mrg if (bp_unpack_value (&bp, 1)) 1501 1.1 mrg ecf_flags |= ECF_CONST; 1502 1.1 mrg if (bp_unpack_value (&bp, 1)) 1503 1.1 mrg ecf_flags |= ECF_PURE; 1504 1.1 mrg if (bp_unpack_value (&bp, 1)) 1505 1.1 mrg ecf_flags |= ECF_NORETURN; 1506 1.1 mrg if (bp_unpack_value (&bp, 1)) 1507 1.1 mrg ecf_flags |= ECF_MALLOC; 1508 1.1 mrg if (bp_unpack_value (&bp, 1)) 1509 1.1 mrg ecf_flags |= ECF_NOTHROW; 1510 1.1 mrg if (bp_unpack_value (&bp, 1)) 1511 1.1 mrg ecf_flags |= ECF_RETURNS_TWICE; 1512 1.1 mrg edge->indirect_info->ecf_flags = ecf_flags; 1513 1.1 mrg 1514 1.1 mrg edge->indirect_info->num_speculative_call_targets 1515 1.1 mrg = bp_unpack_value (&bp, 16); 1516 1.1 mrg } 1517 1.1 mrg } 1518 1.1 mrg 1519 1.1 mrg 1520 1.1 mrg /* Read a cgraph from IB using the info in FILE_DATA. */ 1521 1.1 mrg 1522 1.1 mrg static vec<symtab_node *> 1523 1.1 mrg input_cgraph_1 (struct lto_file_decl_data *file_data, 1524 1.1 mrg class lto_input_block *ib) 1525 1.1 mrg { 1526 1.1 mrg enum LTO_symtab_tags tag; 1527 1.1 mrg vec<symtab_node *> nodes = vNULL; 1528 1.1 mrg symtab_node *node; 1529 1.1 mrg unsigned i; 1530 1.1 mrg 1531 1.1 mrg tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag); 1532 1.1 mrg file_data->order_base = symtab->order; 1533 1.1 mrg file_data->unit_base = symtab->max_unit + 1; 1534 1.1 mrg while (tag) 1535 1.1 mrg { 1536 1.1 mrg if (tag == LTO_symtab_edge) 1537 1.1 mrg input_edge (ib, nodes, false); 1538 1.1 mrg else if (tag == LTO_symtab_indirect_edge) 1539 1.1 mrg input_edge (ib, nodes, true); 1540 1.1 mrg else if (tag == LTO_symtab_variable) 1541 1.1 mrg { 1542 1.1 mrg node = input_varpool_node (file_data, ib); 1543 1.1 mrg nodes.safe_push (node); 1544 1.1 mrg lto_symtab_encoder_encode (file_data->symtab_node_encoder, node); 1545 1.1 mrg } 1546 1.1 mrg else 1547 1.1 mrg { 1548 1.1 mrg node = input_node (file_data, ib, tag, nodes); 1549 1.1 mrg if (node == NULL || node->decl == NULL_TREE) 1550 1.1 mrg internal_error ("bytecode stream: found empty cgraph node"); 1551 1.1 mrg nodes.safe_push (node); 1552 1.1 mrg lto_symtab_encoder_encode (file_data->symtab_node_encoder, node); 1553 1.1 mrg } 1554 1.1 mrg 1555 1.1 mrg tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag); 1556 1.1 mrg } 1557 1.1 mrg 1558 1.1 mrg lto_input_toplevel_asms (file_data, file_data->order_base); 1559 1.1 mrg 1560 1.1 mrg /* AUX pointers should be all non-zero for function nodes read from the stream. */ 1561 1.1 mrg if (flag_checking) 1562 1.1 mrg { 1563 1.1 mrg FOR_EACH_VEC_ELT (nodes, i, node) 1564 1.1 mrg gcc_assert (node->aux || !is_a <cgraph_node *> (node)); 1565 1.1 mrg } 1566 1.1 mrg FOR_EACH_VEC_ELT (nodes, i, node) 1567 1.1 mrg { 1568 1.1 mrg int ref; 1569 1.1 mrg if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node)) 1570 1.1 mrg { 1571 1.1 mrg ref = (int) (intptr_t) cnode->inlined_to; 1572 1.1 mrg 1573 1.1 mrg /* We share declaration of builtins, so we may read same node twice. */ 1574 1.1 mrg if (!node->aux) 1575 1.1 mrg continue; 1576 1.1 mrg node->aux = NULL; 1577 1.1 mrg 1578 1.1 mrg /* Fixup inlined_to from reference to pointer. */ 1579 1.1 mrg if (ref != LCC_NOT_FOUND) 1580 1.1 mrg dyn_cast<cgraph_node *> (node)->inlined_to 1581 1.1 mrg = dyn_cast<cgraph_node *> (nodes[ref]); 1582 1.1 mrg else 1583 1.1 mrg cnode->inlined_to = NULL; 1584 1.1 mrg } 1585 1.1 mrg 1586 1.1 mrg ref = (int) (intptr_t) node->same_comdat_group; 1587 1.1 mrg 1588 1.1 mrg /* Fixup same_comdat_group from reference to pointer. */ 1589 1.1 mrg if (ref != LCC_NOT_FOUND) 1590 1.1 mrg node->same_comdat_group = nodes[ref]; 1591 1.1 mrg else 1592 1.1 mrg node->same_comdat_group = NULL; 1593 1.1 mrg } 1594 1.1 mrg FOR_EACH_VEC_ELT (nodes, i, node) 1595 1.1 mrg node->aux = is_a <cgraph_node *> (node) ? (void *)1 : NULL; 1596 1.1 mrg return nodes; 1597 1.1 mrg } 1598 1.1 mrg 1599 1.1 mrg /* Input ipa_refs. */ 1600 1.1 mrg 1601 1.1 mrg static void 1602 1.1 mrg input_refs (class lto_input_block *ib, 1603 1.1 mrg vec<symtab_node *> nodes) 1604 1.1 mrg { 1605 1.1 mrg int count; 1606 1.1 mrg int idx; 1607 1.1 mrg while (true) 1608 1.1 mrg { 1609 1.1 mrg symtab_node *node; 1610 1.1 mrg count = streamer_read_uhwi (ib); 1611 1.1 mrg if (!count) 1612 1.1 mrg break; 1613 1.1 mrg idx = streamer_read_uhwi (ib); 1614 1.1 mrg node = nodes[idx]; 1615 1.1 mrg while (count) 1616 1.1 mrg { 1617 1.1 mrg input_ref (ib, node, nodes); 1618 1.1 mrg count--; 1619 1.1 mrg } 1620 1.1 mrg if (cgraph_node *cnode = dyn_cast <cgraph_node *> (node)) 1621 1.1 mrg if (cnode->declare_variant_alt) 1622 1.1 mrg omp_lto_input_declare_variant_alt (ib, cnode, nodes); 1623 1.1 mrg } 1624 1.1 mrg } 1625 1.1 mrg 1626 1.1 mrg /* Input profile_info from IB. */ 1627 1.1 mrg static void 1628 1.1 mrg input_profile_summary (class lto_input_block *ib, 1629 1.1 mrg struct lto_file_decl_data *file_data) 1630 1.1 mrg { 1631 1.1 mrg unsigned int runs = streamer_read_uhwi (ib); 1632 1.1 mrg if (runs) 1633 1.1 mrg { 1634 1.1 mrg file_data->profile_info.runs = runs; 1635 1.1 mrg 1636 1.1 mrg /* IPA-profile computes hot bb threshold based on cumulated 1637 1.1 mrg whole program profile. We need to stream it down to ltrans. */ 1638 1.1 mrg if (flag_ltrans) 1639 1.1 mrg set_hot_bb_threshold (streamer_read_gcov_count (ib)); 1640 1.1 mrg } 1641 1.1 mrg 1642 1.1 mrg } 1643 1.1 mrg 1644 1.1 mrg /* Rescale profile summaries to the same number of runs in the whole unit. */ 1645 1.1 mrg 1646 1.1 mrg static void 1647 1.1 mrg merge_profile_summaries (struct lto_file_decl_data **file_data_vec) 1648 1.1 mrg { 1649 1.1 mrg struct lto_file_decl_data *file_data; 1650 1.1 mrg unsigned int j; 1651 1.1 mrg gcov_unsigned_t max_runs = 0; 1652 1.1 mrg struct cgraph_node *node; 1653 1.1 mrg struct cgraph_edge *edge; 1654 1.1 mrg 1655 1.1 mrg /* Find unit with maximal number of runs. If we ever get serious about 1656 1.1 mrg roundoff errors, we might also consider computing smallest common 1657 1.1 mrg multiply. */ 1658 1.1 mrg for (j = 0; (file_data = file_data_vec[j]) != NULL; j++) 1659 1.1 mrg if (max_runs < file_data->profile_info.runs) 1660 1.1 mrg max_runs = file_data->profile_info.runs; 1661 1.1 mrg 1662 1.1 mrg if (!max_runs) 1663 1.1 mrg return; 1664 1.1 mrg 1665 1.1 mrg /* Simple overflow check. We probably don't need to support that many train 1666 1.1 mrg runs. Such a large value probably imply data corruption anyway. */ 1667 1.1 mrg if (max_runs > INT_MAX / REG_BR_PROB_BASE) 1668 1.1 mrg { 1669 1.1 mrg sorry ("At most %i profile runs is supported. Perhaps corrupted profile?", 1670 1.1 mrg INT_MAX / REG_BR_PROB_BASE); 1671 1.1 mrg return; 1672 1.1 mrg } 1673 1.1 mrg 1674 1.1 mrg profile_info = XCNEW (gcov_summary); 1675 1.1 mrg profile_info->runs = max_runs; 1676 1.1 mrg 1677 1.1 mrg /* If merging already happent at WPA time, we are done. */ 1678 1.1 mrg if (flag_ltrans) 1679 1.1 mrg return; 1680 1.1 mrg 1681 1.1 mrg /* Now compute count_materialization_scale of each node. 1682 1.1 mrg During LTRANS we already have values of count_materialization_scale 1683 1.1 mrg computed, so just update them. */ 1684 1.1 mrg FOR_EACH_FUNCTION (node) 1685 1.1 mrg if (node->lto_file_data 1686 1.1 mrg && node->lto_file_data->profile_info.runs) 1687 1.1 mrg { 1688 1.1 mrg int scale; 1689 1.1 mrg 1690 1.1 mrg scale = RDIV (node->count_materialization_scale * max_runs, 1691 1.1 mrg node->lto_file_data->profile_info.runs); 1692 1.1 mrg node->count_materialization_scale = scale; 1693 1.1 mrg if (scale < 0) 1694 1.1 mrg fatal_error (input_location, "Profile information in %s corrupted", 1695 1.1 mrg file_data->file_name); 1696 1.1 mrg 1697 1.1 mrg if (scale == REG_BR_PROB_BASE) 1698 1.1 mrg continue; 1699 1.1 mrg for (edge = node->callees; edge; edge = edge->next_callee) 1700 1.1 mrg if (edge->count.ipa ().nonzero_p ()) 1701 1.1 mrg edge->count = edge->count.apply_scale (scale, REG_BR_PROB_BASE); 1702 1.1 mrg for (edge = node->indirect_calls; edge; edge = edge->next_callee) 1703 1.1 mrg if (edge->count.ipa ().nonzero_p ()) 1704 1.1 mrg edge->count = edge->count.apply_scale (scale, REG_BR_PROB_BASE); 1705 1.1 mrg if (node->count.ipa ().nonzero_p ()) 1706 1.1 mrg node->count = node->count.apply_scale (scale, REG_BR_PROB_BASE); 1707 1.1 mrg } 1708 1.1 mrg } 1709 1.1 mrg 1710 1.1 mrg /* Input and merge the symtab from each of the .o files passed to 1711 1.1 mrg lto1. */ 1712 1.1 mrg 1713 1.1 mrg void 1714 1.1 mrg input_symtab (void) 1715 1.1 mrg { 1716 1.1 mrg struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data (); 1717 1.1 mrg struct lto_file_decl_data *file_data; 1718 1.1 mrg unsigned int j = 0; 1719 1.1 mrg struct cgraph_node *node; 1720 1.1 mrg 1721 1.1 mrg while ((file_data = file_data_vec[j++])) 1722 1.1 mrg { 1723 1.1 mrg const char *data; 1724 1.1 mrg size_t len; 1725 1.1 mrg class lto_input_block *ib; 1726 1.1 mrg vec<symtab_node *> nodes; 1727 1.1 mrg 1728 1.1 mrg ib = lto_create_simple_input_block (file_data, LTO_section_symtab_nodes, 1729 1.1 mrg &data, &len); 1730 1.1 mrg if (!ib) 1731 1.1 mrg fatal_error (input_location, 1732 1.1 mrg "cannot find LTO cgraph in %s", file_data->file_name); 1733 1.1 mrg input_profile_summary (ib, file_data); 1734 1.1 mrg file_data->symtab_node_encoder = lto_symtab_encoder_new (true); 1735 1.1 mrg nodes = input_cgraph_1 (file_data, ib); 1736 1.1 mrg lto_destroy_simple_input_block (file_data, LTO_section_symtab_nodes, 1737 1.1 mrg ib, data, len); 1738 1.1 mrg 1739 1.1 mrg ib = lto_create_simple_input_block (file_data, LTO_section_refs, 1740 1.1 mrg &data, &len); 1741 1.1 mrg if (!ib) 1742 1.1 mrg fatal_error (input_location, "cannot find LTO section refs in %s", 1743 1.1 mrg file_data->file_name); 1744 1.1 mrg input_refs (ib, nodes); 1745 1.1 mrg lto_destroy_simple_input_block (file_data, LTO_section_refs, 1746 1.1 mrg ib, data, len); 1747 1.1 mrg if (flag_ltrans) 1748 1.1 mrg input_cgraph_opt_summary (nodes); 1749 1.1 mrg nodes.release (); 1750 1.1 mrg } 1751 1.1 mrg 1752 1.1 mrg merge_profile_summaries (file_data_vec); 1753 1.1 mrg 1754 1.1 mrg /* Clear out the aux field that was used to store enough state to 1755 1.1 mrg tell which nodes should be overwritten. */ 1756 1.1 mrg FOR_EACH_FUNCTION (node) 1757 1.1 mrg { 1758 1.1 mrg /* Some nodes may have been created by cgraph_node. This 1759 1.1 mrg happens when the callgraph contains nested functions. If the 1760 1.1 mrg node for the parent function was never emitted to the gimple 1761 1.1 mrg file, cgraph_node will create a node for it when setting the 1762 1.1 mrg context of the nested function. */ 1763 1.1 mrg if (node->lto_file_data) 1764 1.1 mrg node->aux = NULL; 1765 1.1 mrg } 1766 1.1 mrg } 1767 1.1 mrg 1768 1.1 mrg /* Input function/variable tables that will allow libgomp to look up offload 1769 1.1 mrg target code, and store them into OFFLOAD_FUNCS and OFFLOAD_VARS. */ 1770 1.1 mrg 1771 1.1 mrg void 1772 1.1 mrg input_offload_tables (bool do_force_output) 1773 1.1 mrg { 1774 1.1 mrg struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data (); 1775 1.1 mrg struct lto_file_decl_data *file_data; 1776 1.1 mrg unsigned int j = 0; 1777 1.1 mrg 1778 1.1 mrg while ((file_data = file_data_vec[j++])) 1779 1.1 mrg { 1780 1.1 mrg const char *data; 1781 1.1 mrg size_t len; 1782 1.1 mrg class lto_input_block *ib 1783 1.1 mrg = lto_create_simple_input_block (file_data, LTO_section_offload_table, 1784 1.1 mrg &data, &len); 1785 1.1 mrg if (!ib) 1786 1.1 mrg continue; 1787 1.1 mrg 1788 1.1 mrg enum LTO_symtab_tags tag 1789 1.1 mrg = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag); 1790 1.1 mrg while (tag) 1791 1.1 mrg { 1792 1.1 mrg if (tag == LTO_symtab_unavail_node) 1793 1.1 mrg { 1794 1.1 mrg tree fn_decl 1795 1.1 mrg = lto_input_fn_decl_ref (ib, file_data); 1796 1.1 mrg vec_safe_push (offload_funcs, fn_decl); 1797 1.1 mrg 1798 1.1 mrg /* Prevent IPA from removing fn_decl as unreachable, since there 1799 1.1 mrg may be no refs from the parent function to child_fn in offload 1800 1.1 mrg LTO mode. */ 1801 1.1 mrg if (do_force_output) 1802 1.1 mrg cgraph_node::get (fn_decl)->mark_force_output (); 1803 1.1 mrg } 1804 1.1 mrg else if (tag == LTO_symtab_variable) 1805 1.1 mrg { 1806 1.1 mrg tree var_decl 1807 1.1 mrg = lto_input_var_decl_ref (ib, file_data); 1808 1.1 mrg vec_safe_push (offload_vars, var_decl); 1809 1.1 mrg 1810 1.1 mrg /* Prevent IPA from removing var_decl as unused, since there 1811 1.1 mrg may be no refs to var_decl in offload LTO mode. */ 1812 1.1 mrg if (do_force_output) 1813 1.1 mrg varpool_node::get (var_decl)->force_output = 1; 1814 1.1 mrg } 1815 1.1 mrg else 1816 1.1 mrg fatal_error (input_location, 1817 1.1 mrg "invalid offload table in %s", file_data->file_name); 1818 1.1 mrg 1819 1.1 mrg tag = streamer_read_enum (ib, LTO_symtab_tags, LTO_symtab_last_tag); 1820 1.1 mrg } 1821 1.1 mrg 1822 1.1 mrg lto_destroy_simple_input_block (file_data, LTO_section_offload_table, 1823 1.1 mrg ib, data, len); 1824 1.1 mrg } 1825 1.1 mrg } 1826 1.1 mrg 1827 1.1 mrg /* True when we need optimization summary for NODE. */ 1828 1.1 mrg 1829 1.1 mrg static int 1830 1.1 mrg output_cgraph_opt_summary_p (struct cgraph_node *node) 1831 1.1 mrg { 1832 1.1 mrg if (node->clone_of || node->former_clone_of) 1833 1.1 mrg return true; 1834 1.1 mrg clone_info *info = clone_info::get (node); 1835 1.1 mrg return info && (info->tree_map || info->param_adjustments); 1836 1.1 mrg } 1837 1.1 mrg 1838 1.1 mrg /* Output optimization summary for EDGE to OB. */ 1839 1.1 mrg static void 1840 1.1 mrg output_edge_opt_summary (struct output_block *ob ATTRIBUTE_UNUSED, 1841 1.1 mrg struct cgraph_edge *edge ATTRIBUTE_UNUSED) 1842 1.1 mrg { 1843 1.1 mrg } 1844 1.1 mrg 1845 1.1 mrg /* Output optimization summary for NODE to OB. */ 1846 1.1 mrg 1847 1.1 mrg static void 1848 1.1 mrg output_node_opt_summary (struct output_block *ob, 1849 1.1 mrg struct cgraph_node *node, 1850 1.1 mrg lto_symtab_encoder_t encoder) 1851 1.1 mrg { 1852 1.1 mrg struct ipa_replace_map *map; 1853 1.1 mrg int i; 1854 1.1 mrg struct cgraph_edge *e; 1855 1.1 mrg 1856 1.1 mrg /* TODO: Should this code be moved to ipa-param-manipulation? */ 1857 1.1 mrg struct bitpack_d bp; 1858 1.1 mrg bp = bitpack_create (ob->main_stream); 1859 1.1 mrg clone_info *info = clone_info::get (node); 1860 1.1 mrg 1861 1.1 mrg bp_pack_value (&bp, (info && info->param_adjustments != NULL), 1); 1862 1.1 mrg streamer_write_bitpack (&bp); 1863 1.1 mrg if (ipa_param_adjustments *adjustments 1864 1.1 mrg = info ? info->param_adjustments : NULL) 1865 1.1 mrg { 1866 1.1 mrg streamer_write_uhwi (ob, vec_safe_length (adjustments->m_adj_params)); 1867 1.1 mrg ipa_adjusted_param *adj; 1868 1.1 mrg FOR_EACH_VEC_SAFE_ELT (adjustments->m_adj_params, i, adj) 1869 1.1 mrg { 1870 1.1 mrg bp = bitpack_create (ob->main_stream); 1871 1.1 mrg bp_pack_value (&bp, adj->base_index, IPA_PARAM_MAX_INDEX_BITS); 1872 1.1 mrg bp_pack_value (&bp, adj->prev_clone_index, IPA_PARAM_MAX_INDEX_BITS); 1873 1.1 mrg bp_pack_value (&bp, adj->op, 2); 1874 1.1 mrg bp_pack_value (&bp, adj->param_prefix_index, 2); 1875 1.1 mrg bp_pack_value (&bp, adj->prev_clone_adjustment, 1); 1876 1.1 mrg bp_pack_value (&bp, adj->reverse, 1); 1877 1.1 mrg bp_pack_value (&bp, adj->user_flag, 1); 1878 1.1 mrg streamer_write_bitpack (&bp); 1879 1.1 mrg if (adj->op == IPA_PARAM_OP_SPLIT 1880 1.1 mrg || adj->op == IPA_PARAM_OP_NEW) 1881 1.1 mrg { 1882 1.1 mrg stream_write_tree (ob, adj->type, true); 1883 1.1 mrg if (adj->op == IPA_PARAM_OP_SPLIT) 1884 1.1 mrg { 1885 1.1 mrg stream_write_tree (ob, adj->alias_ptr_type, true); 1886 1.1 mrg streamer_write_uhwi (ob, adj->unit_offset); 1887 1.1 mrg } 1888 1.1 mrg } 1889 1.1 mrg } 1890 1.1 mrg streamer_write_hwi (ob, adjustments->m_always_copy_start); 1891 1.1 mrg bp = bitpack_create (ob->main_stream); 1892 1.1 mrg bp_pack_value (&bp, info->param_adjustments->m_skip_return, 1); 1893 1.1 mrg streamer_write_bitpack (&bp); 1894 1.1 mrg } 1895 1.1 mrg 1896 1.1 mrg streamer_write_uhwi (ob, info ? vec_safe_length (info->tree_map) : 0); 1897 1.1 mrg if (info) 1898 1.1 mrg FOR_EACH_VEC_SAFE_ELT (info->tree_map, i, map) 1899 1.1 mrg { 1900 1.1 mrg streamer_write_uhwi (ob, map->parm_num); 1901 1.1 mrg gcc_assert (EXPR_LOCATION (map->new_tree) == UNKNOWN_LOCATION); 1902 1.1 mrg stream_write_tree (ob, map->new_tree, true); 1903 1.1 mrg } 1904 1.1 mrg 1905 1.1 mrg if (lto_symtab_encoder_in_partition_p (encoder, node)) 1906 1.1 mrg { 1907 1.1 mrg for (e = node->callees; e; e = e->next_callee) 1908 1.1 mrg output_edge_opt_summary (ob, e); 1909 1.1 mrg for (e = node->indirect_calls; e; e = e->next_callee) 1910 1.1 mrg output_edge_opt_summary (ob, e); 1911 1.1 mrg } 1912 1.1 mrg } 1913 1.1 mrg 1914 1.1 mrg /* Output optimization summaries stored in callgraph. 1915 1.1 mrg At the moment it is the clone info structure. */ 1916 1.1 mrg 1917 1.1 mrg static void 1918 1.1 mrg output_cgraph_opt_summary (void) 1919 1.1 mrg { 1920 1.1 mrg int i, n_nodes; 1921 1.1 mrg lto_symtab_encoder_t encoder; 1922 1.1 mrg struct output_block *ob = create_output_block (LTO_section_cgraph_opt_sum); 1923 1.1 mrg unsigned count = 0; 1924 1.1 mrg 1925 1.1 mrg ob->symbol = NULL; 1926 1.1 mrg encoder = ob->decl_state->symtab_node_encoder; 1927 1.1 mrg n_nodes = lto_symtab_encoder_size (encoder); 1928 1.1 mrg for (i = 0; i < n_nodes; i++) 1929 1.1 mrg { 1930 1.1 mrg symtab_node *node = lto_symtab_encoder_deref (encoder, i); 1931 1.1 mrg cgraph_node *cnode = dyn_cast <cgraph_node *> (node); 1932 1.1 mrg if (cnode && output_cgraph_opt_summary_p (cnode)) 1933 1.1 mrg count++; 1934 1.1 mrg } 1935 1.1 mrg streamer_write_uhwi (ob, count); 1936 1.1 mrg for (i = 0; i < n_nodes; i++) 1937 1.1 mrg { 1938 1.1 mrg symtab_node *node = lto_symtab_encoder_deref (encoder, i); 1939 1.1 mrg cgraph_node *cnode = dyn_cast <cgraph_node *> (node); 1940 1.1 mrg if (cnode && output_cgraph_opt_summary_p (cnode)) 1941 1.1 mrg { 1942 1.1 mrg streamer_write_uhwi (ob, i); 1943 1.1 mrg output_node_opt_summary (ob, cnode, encoder); 1944 1.1 mrg } 1945 1.1 mrg } 1946 1.1 mrg produce_asm (ob, NULL); 1947 1.1 mrg destroy_output_block (ob); 1948 1.1 mrg } 1949 1.1 mrg 1950 1.1 mrg /* Input optimisation summary of EDGE. */ 1951 1.1 mrg 1952 1.1 mrg static void 1953 1.1 mrg input_edge_opt_summary (struct cgraph_edge *edge ATTRIBUTE_UNUSED, 1954 1.1 mrg class lto_input_block *ib_main ATTRIBUTE_UNUSED) 1955 1.1 mrg { 1956 1.1 mrg } 1957 1.1 mrg 1958 1.1 mrg /* Input optimisation summary of NODE. */ 1959 1.1 mrg 1960 1.1 mrg static void 1961 1.1 mrg input_node_opt_summary (struct cgraph_node *node, 1962 1.1 mrg class lto_input_block *ib_main, 1963 1.1 mrg class data_in *data_in) 1964 1.1 mrg { 1965 1.1 mrg int i; 1966 1.1 mrg int count; 1967 1.1 mrg struct cgraph_edge *e; 1968 1.1 mrg 1969 1.1 mrg /* TODO: Should this code be moved to ipa-param-manipulation? */ 1970 1.1 mrg struct bitpack_d bp; 1971 1.1 mrg bp = streamer_read_bitpack (ib_main); 1972 1.1 mrg bool have_adjustments = bp_unpack_value (&bp, 1); 1973 1.1 mrg clone_info *info = clone_info::get_create (node); 1974 1.1 mrg 1975 1.1 mrg if (have_adjustments) 1976 1.1 mrg { 1977 1.1 mrg count = streamer_read_uhwi (ib_main); 1978 1.1 mrg vec<ipa_adjusted_param, va_gc> *new_params = NULL; 1979 1.1 mrg for (i = 0; i < count; i++) 1980 1.1 mrg { 1981 1.1 mrg ipa_adjusted_param adj; 1982 1.1 mrg memset (&adj, 0, sizeof (adj)); 1983 1.1 mrg bp = streamer_read_bitpack (ib_main); 1984 1.1 mrg adj.base_index = bp_unpack_value (&bp, IPA_PARAM_MAX_INDEX_BITS); 1985 1.1 mrg adj.prev_clone_index 1986 1.1 mrg = bp_unpack_value (&bp, IPA_PARAM_MAX_INDEX_BITS); 1987 1.1 mrg adj.op = (enum ipa_parm_op) bp_unpack_value (&bp, 2); 1988 1.1 mrg adj.param_prefix_index = bp_unpack_value (&bp, 2); 1989 1.1 mrg adj.prev_clone_adjustment = bp_unpack_value (&bp, 1); 1990 1.1 mrg adj.reverse = bp_unpack_value (&bp, 1); 1991 1.1 mrg adj.user_flag = bp_unpack_value (&bp, 1); 1992 1.1 mrg if (adj.op == IPA_PARAM_OP_SPLIT 1993 1.1 mrg || adj.op == IPA_PARAM_OP_NEW) 1994 1.1 mrg { 1995 1.1 mrg adj.type = stream_read_tree (ib_main, data_in); 1996 1.1 mrg if (adj.op == IPA_PARAM_OP_SPLIT) 1997 1.1 mrg { 1998 1.1 mrg adj.alias_ptr_type = stream_read_tree (ib_main, data_in); 1999 1.1 mrg adj.unit_offset = streamer_read_uhwi (ib_main); 2000 1.1 mrg } 2001 1.1 mrg } 2002 1.1 mrg vec_safe_push (new_params, adj); 2003 1.1 mrg } 2004 1.1 mrg int always_copy_start = streamer_read_hwi (ib_main); 2005 1.1 mrg bp = streamer_read_bitpack (ib_main); 2006 1.1 mrg bool skip_return = bp_unpack_value (&bp, 1); 2007 1.1 mrg info->param_adjustments 2008 1.1 mrg = (new (ggc_alloc <ipa_param_adjustments> ()) 2009 1.1 mrg ipa_param_adjustments (new_params, always_copy_start, skip_return)); 2010 1.1 mrg } 2011 1.1 mrg 2012 1.1 mrg count = streamer_read_uhwi (ib_main); 2013 1.1 mrg for (i = 0; i < count; i++) 2014 1.1 mrg { 2015 1.1 mrg struct ipa_replace_map *map = ggc_alloc<ipa_replace_map> (); 2016 1.1 mrg 2017 1.1 mrg vec_safe_push (info->tree_map, map); 2018 1.1 mrg map->parm_num = streamer_read_uhwi (ib_main); 2019 1.1 mrg map->new_tree = stream_read_tree (ib_main, data_in); 2020 1.1 mrg } 2021 1.1 mrg for (e = node->callees; e; e = e->next_callee) 2022 1.1 mrg input_edge_opt_summary (e, ib_main); 2023 1.1 mrg for (e = node->indirect_calls; e; e = e->next_callee) 2024 1.1 mrg input_edge_opt_summary (e, ib_main); 2025 1.1 mrg } 2026 1.1 mrg 2027 1.1 mrg /* Read section in file FILE_DATA of length LEN with data DATA. */ 2028 1.1 mrg 2029 1.1 mrg static void 2030 1.1 mrg input_cgraph_opt_section (struct lto_file_decl_data *file_data, 2031 1.1 mrg const char *data, size_t len, 2032 1.1 mrg vec<symtab_node *> nodes) 2033 1.1 mrg { 2034 1.1 mrg const struct lto_function_header *header = 2035 1.1 mrg (const struct lto_function_header *) data; 2036 1.1 mrg const int cfg_offset = sizeof (struct lto_function_header); 2037 1.1 mrg const int main_offset = cfg_offset + header->cfg_size; 2038 1.1 mrg const int string_offset = main_offset + header->main_size; 2039 1.1 mrg class data_in *data_in; 2040 1.1 mrg unsigned int i; 2041 1.1 mrg unsigned int count; 2042 1.1 mrg 2043 1.1 mrg lto_input_block ib_main ((const char *) data + main_offset, 2044 1.1 mrg header->main_size, file_data->mode_table); 2045 1.1 mrg 2046 1.1 mrg data_in = 2047 1.1 mrg lto_data_in_create (file_data, (const char *) data + string_offset, 2048 1.1 mrg header->string_size, vNULL); 2049 1.1 mrg count = streamer_read_uhwi (&ib_main); 2050 1.1 mrg 2051 1.1 mrg for (i = 0; i < count; i++) 2052 1.1 mrg { 2053 1.1 mrg int ref = streamer_read_uhwi (&ib_main); 2054 1.1 mrg input_node_opt_summary (dyn_cast<cgraph_node *> (nodes[ref]), 2055 1.1 mrg &ib_main, data_in); 2056 1.1 mrg } 2057 1.1 mrg lto_free_section_data (file_data, LTO_section_cgraph_opt_sum, NULL, data, 2058 1.1 mrg len); 2059 1.1 mrg lto_data_in_delete (data_in); 2060 1.1 mrg } 2061 1.1 mrg 2062 1.1 mrg /* Input optimization summary of cgraph. */ 2063 1.1 mrg 2064 1.1 mrg static void 2065 1.1 mrg input_cgraph_opt_summary (vec<symtab_node *> nodes) 2066 1.1 mrg { 2067 1.1 mrg struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data (); 2068 1.1 mrg struct lto_file_decl_data *file_data; 2069 1.1 mrg unsigned int j = 0; 2070 1.1 mrg 2071 1.1 mrg while ((file_data = file_data_vec[j++])) 2072 1.1 mrg { 2073 1.1 mrg size_t len; 2074 1.1 mrg const char *data 2075 1.1 mrg = lto_get_summary_section_data (file_data, LTO_section_cgraph_opt_sum, 2076 1.1 mrg &len); 2077 1.1 mrg if (data) 2078 1.1 mrg input_cgraph_opt_section (file_data, data, len, nodes); 2079 1.1 mrg } 2080 1.1 mrg } 2081