]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cgraph.c
[Ada] Warning for out-of-order record representation clauses
[thirdparty/gcc.git] / gcc / cgraph.c
CommitLineData
833eb724 1/* Callgraph handling code.
fbd26352 2 Copyright (C) 2003-2019 Free Software Foundation, Inc.
833eb724 3 Contributed by Jan Hubicka
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
8c4c00c1 9Software Foundation; either version 3, or (at your option) any later
833eb724 10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
8c4c00c1 18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
833eb724 20
1d416bd7 21/* This file contains basic routines manipulating call graph
a0c938f0 22
720cfc43 23 The call-graph is a data structure designed for inter-procedural
24 optimization. It represents a multi-graph where nodes are functions
25 (symbols within symbol table) and edges are call sites. */
b0cdf642 26
833eb724 27#include "config.h"
28#include "system.h"
29#include "coretypes.h"
9ef16211 30#include "backend.h"
7c29e30e 31#include "target.h"
32#include "rtl.h"
833eb724 33#include "tree.h"
9ef16211 34#include "gimple.h"
7c29e30e 35#include "predict.h"
36#include "alloc-pool.h"
7c29e30e 37#include "gimple-ssa.h"
7c29e30e 38#include "cgraph.h"
39#include "lto-streamer.h"
b20a8bb4 40#include "fold-const.h"
9ed99284 41#include "varasm.h"
42#include "calls.h"
43#include "print-tree.h"
833eb724 44#include "langhooks.h"
611e5405 45#include "intl.h"
bc61cadb 46#include "tree-eh.h"
dcf1a1ec 47#include "gimple-iterator.h"
073c1fd5 48#include "tree-cfg.h"
69ee5dbb 49#include "tree-ssa.h"
bfb4e08d 50#include "value-prof.h"
2b2fe710 51#include "ipa-utils.h"
2cc80ac3 52#include "symbol-summary.h"
25a8e007 53#include "tree-vrp.h"
1140c305 54#include "ipa-prop.h"
b9a58fc5 55#include "ipa-fnsummary.h"
79f958cb 56#include "cfgloop.h"
da5e1e7c 57#include "gimple-pretty-print.h"
ebd03cf7 58#include "tree-dfa.h"
e5a23585 59#include "profile.h"
60#include "params.h"
b9dd9f0e 61#include "context.h"
6ec840b0 62#include "gimplify.h"
30a86690 63#include "stringpool.h"
64#include "attribs.h"
564850b9 65#include "selftest.h"
639e4be4 66
b9ed1410 67/* FIXME: Only for PROP_loops, but cgraph shouldn't have to know about this. */
68#include "tree-pass.h"
69
3d7bfc56 70/* Queue of cgraph nodes scheduled to be lowered. */
452659af 71symtab_node *x_cgraph_nodes_queue;
35ee1c66 72#define cgraph_nodes_queue ((cgraph_node *)x_cgraph_nodes_queue)
523c1122 73
35ee1c66 74/* Symbol table global context. */
75symbol_table *symtab;
c1dcd13c 76
0a10fd82 77/* List of hooks triggered on cgraph_edge events. */
dd1c9157 78struct cgraph_edge_hook_list {
79 cgraph_edge_hook hook;
80 void *data;
81 struct cgraph_edge_hook_list *next;
82};
83
0a10fd82 84/* List of hooks triggered on cgraph_node events. */
dd1c9157 85struct cgraph_node_hook_list {
86 cgraph_node_hook hook;
87 void *data;
88 struct cgraph_node_hook_list *next;
89};
90
0a10fd82 91/* List of hooks triggered on events involving two cgraph_edges. */
dd1c9157 92struct cgraph_2edge_hook_list {
93 cgraph_2edge_hook hook;
94 void *data;
95 struct cgraph_2edge_hook_list *next;
96};
97
0a10fd82 98/* List of hooks triggered on events involving two cgraph_nodes. */
dd1c9157 99struct cgraph_2node_hook_list {
100 cgraph_2node_hook hook;
101 void *data;
102 struct cgraph_2node_hook_list *next;
103};
104
2ef51f0e 105/* Hash descriptor for cgraph_function_version_info. */
106
b594087e 107struct function_version_hasher : ggc_ptr_hash<cgraph_function_version_info>
2ef51f0e 108{
109 static hashval_t hash (cgraph_function_version_info *);
110 static bool equal (cgraph_function_version_info *,
111 cgraph_function_version_info *);
112};
113
cc8ef84f 114/* Map a cgraph_node to cgraph_function_version_info using this htab.
115 The cgraph_function_version_info has a THIS_NODE field that is the
116 corresponding cgraph_node.. */
117
2ef51f0e 118static GTY(()) hash_table<function_version_hasher> *cgraph_fnver_htab = NULL;
cc8ef84f 119
120/* Hash function for cgraph_fnver_htab. */
2ef51f0e 121hashval_t
122function_version_hasher::hash (cgraph_function_version_info *ptr)
cc8ef84f 123{
2c8bbd94 124 int uid = ptr->this_node->get_uid ();
cc8ef84f 125 return (hashval_t)(uid);
126}
127
128/* eq function for cgraph_fnver_htab. */
2ef51f0e 129bool
130function_version_hasher::equal (cgraph_function_version_info *n1,
131 cgraph_function_version_info *n2)
cc8ef84f 132{
2c8bbd94 133 return n1->this_node->get_uid () == n2->this_node->get_uid ();
cc8ef84f 134}
135
136/* Mark as GC root all allocated nodes. */
137static GTY(()) struct cgraph_function_version_info *
138 version_info_node = NULL;
139
ec2e0095 140/* Return true if NODE's address can be compared. */
141
142bool
143symtab_node::address_can_be_compared_p ()
144{
145 /* Address of virtual tables and functions is never compared. */
146 if (DECL_VIRTUAL_P (decl))
147 return false;
148 /* Address of C++ cdtors is never compared. */
149 if (is_a <cgraph_node *> (this)
150 && (DECL_CXX_CONSTRUCTOR_P (decl)
151 || DECL_CXX_DESTRUCTOR_P (decl)))
152 return false;
153 /* Constant pool symbols addresses are never compared.
154 flag_merge_constants permits us to assume the same on readonly vars. */
155 if (is_a <varpool_node *> (this)
156 && (DECL_IN_CONSTANT_POOL (decl)
157 || (flag_merge_constants >= 2
158 && TREE_READONLY (decl) && !TREE_THIS_VOLATILE (decl))))
159 return false;
160 return true;
161}
162
cc8ef84f 163/* Get the cgraph_function_version_info node corresponding to node. */
35ee1c66 164cgraph_function_version_info *
415d1b9a 165cgraph_node::function_version (void)
cc8ef84f 166{
35ee1c66 167 cgraph_function_version_info key;
415d1b9a 168 key.this_node = this;
cc8ef84f 169
170 if (cgraph_fnver_htab == NULL)
171 return NULL;
172
2ef51f0e 173 return cgraph_fnver_htab->find (&key);
cc8ef84f 174}
175
176/* Insert a new cgraph_function_version_info node into cgraph_fnver_htab
177 corresponding to cgraph_node NODE. */
35ee1c66 178cgraph_function_version_info *
415d1b9a 179cgraph_node::insert_new_function_version (void)
cc8ef84f 180{
cc8ef84f 181 version_info_node = NULL;
25a27413 182 version_info_node = ggc_cleared_alloc<cgraph_function_version_info> ();
415d1b9a 183 version_info_node->this_node = this;
cc8ef84f 184
185 if (cgraph_fnver_htab == NULL)
2ef51f0e 186 cgraph_fnver_htab = hash_table<function_version_hasher>::create_ggc (2);
cc8ef84f 187
2ef51f0e 188 *cgraph_fnver_htab->find_slot (version_info_node, INSERT)
189 = version_info_node;
cc8ef84f 190 return version_info_node;
191}
192
a0ffb0fb 193/* Remove the cgraph_function_version_info node given by DECL_V. */
194static void
195delete_function_version (cgraph_function_version_info *decl_v)
cc8ef84f 196{
cc8ef84f 197 if (decl_v == NULL)
198 return;
199
200 if (decl_v->prev != NULL)
a0ffb0fb 201 decl_v->prev->next = decl_v->next;
cc8ef84f 202
203 if (decl_v->next != NULL)
204 decl_v->next->prev = decl_v->prev;
205
206 if (cgraph_fnver_htab != NULL)
2ef51f0e 207 cgraph_fnver_htab->remove_elt (decl_v);
a0ffb0fb 208}
209
210/* Remove the cgraph_function_version_info and cgraph_node for DECL. This
211 DECL is a duplicate declaration. */
212void
213cgraph_node::delete_function_version_by_decl (tree decl)
214{
215 cgraph_node *decl_node = cgraph_node::get (decl);
216
217 if (decl_node == NULL)
218 return;
219
220 delete_function_version (decl_node->function_version ());
cc8ef84f 221
415d1b9a 222 decl_node->remove ();
cc8ef84f 223}
224
225/* Record that DECL1 and DECL2 are semantically identical function
226 versions. */
227void
415d1b9a 228cgraph_node::record_function_versions (tree decl1, tree decl2)
cc8ef84f 229{
35ee1c66 230 cgraph_node *decl1_node = cgraph_node::get_create (decl1);
231 cgraph_node *decl2_node = cgraph_node::get_create (decl2);
232 cgraph_function_version_info *decl1_v = NULL;
233 cgraph_function_version_info *decl2_v = NULL;
234 cgraph_function_version_info *before;
235 cgraph_function_version_info *after;
cc8ef84f 236
237 gcc_assert (decl1_node != NULL && decl2_node != NULL);
415d1b9a 238 decl1_v = decl1_node->function_version ();
239 decl2_v = decl2_node->function_version ();
cc8ef84f 240
241 if (decl1_v != NULL && decl2_v != NULL)
242 return;
243
244 if (decl1_v == NULL)
415d1b9a 245 decl1_v = decl1_node->insert_new_function_version ();
cc8ef84f 246
247 if (decl2_v == NULL)
415d1b9a 248 decl2_v = decl2_node->insert_new_function_version ();
cc8ef84f 249
250 /* Chain decl2_v and decl1_v. All semantically identical versions
251 will be chained together. */
252
253 before = decl1_v;
254 after = decl2_v;
255
256 while (before->next != NULL)
257 before = before->next;
258
259 while (after->prev != NULL)
260 after= after->prev;
261
262 before->next = after;
263 after->prev = before;
264}
265
1140c305 266/* Initialize callgraph dump file. */
267
268void
269symbol_table::initialize (void)
270{
271 if (!dump_file)
272 dump_file = dump_begin (TDI_cgraph, NULL);
9dc70d59 273
274 if (!ipa_clones_dump_file)
275 ipa_clones_dump_file = dump_begin (TDI_clones, NULL);
1140c305 276}
277
94ea8568 278/* Allocate new callgraph node and insert it into basic data structures. */
279
280cgraph_node *
281symbol_table::create_empty (void)
282{
283 cgraph_node *node = allocate_cgraph_symbol ();
284
285 node->type = SYMTAB_FUNCTION;
286 node->frequency = NODE_FREQUENCY_NORMAL;
287 node->count_materialization_scale = REG_BR_PROB_BASE;
288 cgraph_count++;
289
290 return node;
291}
292
dd1c9157 293/* Register HOOK to be called with DATA on each removed edge. */
35ee1c66 294cgraph_edge_hook_list *
295symbol_table::add_edge_removal_hook (cgraph_edge_hook hook, void *data)
dd1c9157 296{
35ee1c66 297 cgraph_edge_hook_list *entry;
298 cgraph_edge_hook_list **ptr = &m_first_edge_removal_hook;
dd1c9157 299
35ee1c66 300 entry = (cgraph_edge_hook_list *) xmalloc (sizeof (*entry));
dd1c9157 301 entry->hook = hook;
302 entry->data = data;
303 entry->next = NULL;
304 while (*ptr)
305 ptr = &(*ptr)->next;
306 *ptr = entry;
307 return entry;
308}
309
310/* Remove ENTRY from the list of hooks called on removing edges. */
311void
35ee1c66 312symbol_table::remove_edge_removal_hook (cgraph_edge_hook_list *entry)
dd1c9157 313{
35ee1c66 314 cgraph_edge_hook_list **ptr = &m_first_edge_removal_hook;
dd1c9157 315
316 while (*ptr != entry)
317 ptr = &(*ptr)->next;
318 *ptr = entry->next;
e83fcabc 319 free (entry);
dd1c9157 320}
321
322/* Call all edge removal hooks. */
35ee1c66 323void
324symbol_table::call_edge_removal_hooks (cgraph_edge *e)
dd1c9157 325{
35ee1c66 326 cgraph_edge_hook_list *entry = m_first_edge_removal_hook;
dd1c9157 327 while (entry)
328 {
329 entry->hook (e, entry->data);
330 entry = entry->next;
331 }
332}
333
334/* Register HOOK to be called with DATA on each removed node. */
35ee1c66 335cgraph_node_hook_list *
336symbol_table::add_cgraph_removal_hook (cgraph_node_hook hook, void *data)
dd1c9157 337{
35ee1c66 338 cgraph_node_hook_list *entry;
339 cgraph_node_hook_list **ptr = &m_first_cgraph_removal_hook;
dd1c9157 340
35ee1c66 341 entry = (cgraph_node_hook_list *) xmalloc (sizeof (*entry));
dd1c9157 342 entry->hook = hook;
343 entry->data = data;
344 entry->next = NULL;
345 while (*ptr)
346 ptr = &(*ptr)->next;
347 *ptr = entry;
348 return entry;
349}
350
351/* Remove ENTRY from the list of hooks called on removing nodes. */
352void
35ee1c66 353symbol_table::remove_cgraph_removal_hook (cgraph_node_hook_list *entry)
dd1c9157 354{
35ee1c66 355 cgraph_node_hook_list **ptr = &m_first_cgraph_removal_hook;
dd1c9157 356
357 while (*ptr != entry)
358 ptr = &(*ptr)->next;
359 *ptr = entry->next;
e83fcabc 360 free (entry);
dd1c9157 361}
362
363/* Call all node removal hooks. */
35ee1c66 364void
365symbol_table::call_cgraph_removal_hooks (cgraph_node *node)
dd1c9157 366{
35ee1c66 367 cgraph_node_hook_list *entry = m_first_cgraph_removal_hook;
dd1c9157 368 while (entry)
369 {
370 entry->hook (node, entry->data);
371 entry = entry->next;
372 }
373}
374
35ee1c66 375/* Call all node removal hooks. */
376void
377symbol_table::call_cgraph_insertion_hooks (cgraph_node *node)
378{
379 cgraph_node_hook_list *entry = m_first_cgraph_insertion_hook;
380 while (entry)
381 {
382 entry->hook (node, entry->data);
383 entry = entry->next;
384 }
385}
386
387
1359ee7a 388/* Register HOOK to be called with DATA on each inserted node. */
35ee1c66 389cgraph_node_hook_list *
390symbol_table::add_cgraph_insertion_hook (cgraph_node_hook hook, void *data)
50828ed8 391{
35ee1c66 392 cgraph_node_hook_list *entry;
393 cgraph_node_hook_list **ptr = &m_first_cgraph_insertion_hook;
50828ed8 394
35ee1c66 395 entry = (cgraph_node_hook_list *) xmalloc (sizeof (*entry));
50828ed8 396 entry->hook = hook;
397 entry->data = data;
398 entry->next = NULL;
399 while (*ptr)
400 ptr = &(*ptr)->next;
401 *ptr = entry;
402 return entry;
403}
404
1359ee7a 405/* Remove ENTRY from the list of hooks called on inserted nodes. */
50828ed8 406void
35ee1c66 407symbol_table::remove_cgraph_insertion_hook (cgraph_node_hook_list *entry)
50828ed8 408{
35ee1c66 409 cgraph_node_hook_list **ptr = &m_first_cgraph_insertion_hook;
50828ed8 410
411 while (*ptr != entry)
412 ptr = &(*ptr)->next;
413 *ptr = entry->next;
e83fcabc 414 free (entry);
50828ed8 415}
416
dd1c9157 417/* Register HOOK to be called with DATA on each duplicated edge. */
35ee1c66 418cgraph_2edge_hook_list *
419symbol_table::add_edge_duplication_hook (cgraph_2edge_hook hook, void *data)
dd1c9157 420{
35ee1c66 421 cgraph_2edge_hook_list *entry;
422 cgraph_2edge_hook_list **ptr = &m_first_edge_duplicated_hook;
dd1c9157 423
35ee1c66 424 entry = (cgraph_2edge_hook_list *) xmalloc (sizeof (*entry));
dd1c9157 425 entry->hook = hook;
426 entry->data = data;
427 entry->next = NULL;
428 while (*ptr)
429 ptr = &(*ptr)->next;
430 *ptr = entry;
431 return entry;
432}
433
434/* Remove ENTRY from the list of hooks called on duplicating edges. */
435void
35ee1c66 436symbol_table::remove_edge_duplication_hook (cgraph_2edge_hook_list *entry)
dd1c9157 437{
35ee1c66 438 cgraph_2edge_hook_list **ptr = &m_first_edge_duplicated_hook;
dd1c9157 439
440 while (*ptr != entry)
441 ptr = &(*ptr)->next;
442 *ptr = entry->next;
e83fcabc 443 free (entry);
dd1c9157 444}
445
446/* Call all edge duplication hooks. */
f41db742 447void
35ee1c66 448symbol_table::call_edge_duplication_hooks (cgraph_edge *cs1, cgraph_edge *cs2)
dd1c9157 449{
35ee1c66 450 cgraph_2edge_hook_list *entry = m_first_edge_duplicated_hook;
dd1c9157 451 while (entry)
452 {
453 entry->hook (cs1, cs2, entry->data);
454 entry = entry->next;
455 }
456}
457
458/* Register HOOK to be called with DATA on each duplicated node. */
35ee1c66 459cgraph_2node_hook_list *
460symbol_table::add_cgraph_duplication_hook (cgraph_2node_hook hook, void *data)
dd1c9157 461{
35ee1c66 462 cgraph_2node_hook_list *entry;
463 cgraph_2node_hook_list **ptr = &m_first_cgraph_duplicated_hook;
dd1c9157 464
35ee1c66 465 entry = (cgraph_2node_hook_list *) xmalloc (sizeof (*entry));
dd1c9157 466 entry->hook = hook;
467 entry->data = data;
468 entry->next = NULL;
469 while (*ptr)
470 ptr = &(*ptr)->next;
471 *ptr = entry;
472 return entry;
473}
474
475/* Remove ENTRY from the list of hooks called on duplicating nodes. */
476void
35ee1c66 477symbol_table::remove_cgraph_duplication_hook (cgraph_2node_hook_list *entry)
dd1c9157 478{
35ee1c66 479 cgraph_2node_hook_list **ptr = &m_first_cgraph_duplicated_hook;
dd1c9157 480
481 while (*ptr != entry)
482 ptr = &(*ptr)->next;
483 *ptr = entry->next;
e83fcabc 484 free (entry);
dd1c9157 485}
486
487/* Call all node duplication hooks. */
ad687a96 488void
35ee1c66 489symbol_table::call_cgraph_duplication_hooks (cgraph_node *node,
490 cgraph_node *node2)
dd1c9157 491{
35ee1c66 492 cgraph_2node_hook_list *entry = m_first_cgraph_duplicated_hook;
dd1c9157 493 while (entry)
494 {
35ee1c66 495 entry->hook (node, node2, entry->data);
dd1c9157 496 entry = entry->next;
497 }
498}
499
833eb724 500/* Return cgraph node assigned to DECL. Create new one when needed. */
a30b29a7 501
415d1b9a 502cgraph_node *
503cgraph_node::create (tree decl)
833eb724 504{
35ee1c66 505 cgraph_node *node = symtab->create_empty ();
cc636d56 506 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
639e4be4 507
02774f2d 508 node->decl = decl;
b0c5e347 509
db9cef39 510 node->count = profile_count::uninitialized ();
511
ca4c3545 512 if ((flag_openacc || flag_openmp)
b0c5e347 513 && lookup_attribute ("omp declare target", DECL_ATTRIBUTES (decl)))
514 {
515 node->offloadable = 1;
5f3001a9 516 if (ENABLE_OFFLOADING)
517 g->have_offload = true;
b0c5e347 518 }
519
b859b598 520 if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)))
521 node->ifunc_resolver = true;
522
415d1b9a 523 node->register_symbol ();
cfbe30aa 524
964f7991 525 if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
833eb724 526 {
415d1b9a 527 node->origin = cgraph_node::get_create (DECL_CONTEXT (decl));
833eb724 528 node->next_nested = node->origin->nested;
529 node->origin->nested = node;
530 }
531 return node;
532}
533
593ce529 534/* Try to find a call graph node for declaration DECL and if it does not exist
535 or if it corresponds to an inline clone, create a new one. */
5a90471f 536
415d1b9a 537cgraph_node *
538cgraph_node::get_create (tree decl)
5a90471f 539{
35ee1c66 540 cgraph_node *first_clone = cgraph_node::get (decl);
5a90471f 541
593ce529 542 if (first_clone && !first_clone->global.inlined_to)
543 return first_clone;
5a90471f 544
35ee1c66 545 cgraph_node *node = cgraph_node::create (decl);
593ce529 546 if (first_clone)
547 {
548 first_clone->clone_of = node;
549 node->clones = first_clone;
35ee1c66 550 symtab->symtab_prevail_in_asm_name_hash (node);
8c016392 551 node->decl->decl_with_vis.symtab_node = node;
593ce529 552 if (dump_file)
553 fprintf (dump_file, "Introduced new external node "
0e388735 554 "(%s) and turned into root of the clone tree.\n",
555 node->dump_name ());
593ce529 556 }
557 else if (dump_file)
558 fprintf (dump_file, "Introduced new external node "
0e388735 559 "(%s).\n", node->dump_name ());
593ce529 560 return node;
5a90471f 561}
562
aa29908f 563/* Mark ALIAS as an alias to DECL. DECL_NODE is cgraph node representing
9d75589a 564 the function body is associated with (not necessarily cgraph_node (DECL). */
ed772161 565
415d1b9a 566cgraph_node *
567cgraph_node::create_alias (tree alias, tree target)
ed772161 568{
415d1b9a 569 cgraph_node *alias_node;
ed772161 570
48669653 571 gcc_assert (TREE_CODE (target) == FUNCTION_DECL
572 || TREE_CODE (target) == IDENTIFIER_NODE);
ed772161 573 gcc_assert (TREE_CODE (alias) == FUNCTION_DECL);
415d1b9a 574 alias_node = cgraph_node::get_create (alias);
02774f2d 575 gcc_assert (!alias_node->definition);
576 alias_node->alias_target = target;
577 alias_node->definition = true;
578 alias_node->alias = true;
f2526cce 579 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (alias)) != NULL)
e0dec29d 580 alias_node->transparent_alias = alias_node->weakref = true;
b859b598 581 if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (alias)))
582 alias_node->ifunc_resolver = true;
28454517 583 return alias_node;
584}
585
9ced88d0 586/* Attempt to mark ALIAS as an alias to DECL. Return alias node if successful
5a90471f 587 and NULL otherwise.
28454517 588 Same body aliases are output whenever the body of DECL is output,
415d1b9a 589 and cgraph_node::get (ALIAS) transparently returns
590 cgraph_node::get (DECL). */
28454517 591
35ee1c66 592cgraph_node *
415d1b9a 593cgraph_node::create_same_body_alias (tree alias, tree decl)
28454517 594{
35ee1c66 595 cgraph_node *n;
07b8a412 596
28454517 597 /* If aliases aren't supported by the assembler, fail. */
07b8a412 598 if (!TARGET_SUPPORTS_ALIASES)
599 return NULL;
600
c70f46b0 601 /* Langhooks can create same body aliases of symbols not defined.
602 Those are useless. Drop them on the floor. */
35ee1c66 603 if (symtab->global_info_ready)
c70f46b0 604 return NULL;
28454517 605
415d1b9a 606 n = cgraph_node::create_alias (alias, decl);
02774f2d 607 n->cpp_implicit_alias = true;
35ee1c66 608 if (symtab->cpp_implicit_aliases_done)
415d1b9a 609 n->resolve_alias (cgraph_node::get (decl));
c70f46b0 610 return n;
28454517 611}
612
9ced88d0 613/* Add thunk alias into callgraph. The alias declaration is ALIAS and it
0a10fd82 614 aliases DECL with an adjustments made into the first parameter.
0e3918d8 615 See comments in struct cgraph_thunk_info for detail on the parameters. */
9ced88d0 616
35ee1c66 617cgraph_node *
415d1b9a 618cgraph_node::create_thunk (tree alias, tree, bool this_adjusting,
619 HOST_WIDE_INT fixed_offset,
620 HOST_WIDE_INT virtual_value,
4c7db812 621 HOST_WIDE_INT indirect_offset,
415d1b9a 622 tree virtual_offset,
623 tree real_alias)
28454517 624{
35ee1c66 625 cgraph_node *node;
28454517 626
415d1b9a 627 node = cgraph_node::get (alias);
28454517 628 if (node)
415d1b9a 629 node->reset ();
71e19e54 630 else
415d1b9a 631 node = cgraph_node::create (alias);
0e3918d8 632
633 /* Make sure that if VIRTUAL_OFFSET is in sync with VIRTUAL_VALUE. */
634 gcc_checking_assert (virtual_offset
e3d0f65c 635 ? virtual_value == wi::to_wide (virtual_offset)
0e3918d8 636 : virtual_value == 0);
637
28454517 638 node->thunk.fixed_offset = fixed_offset;
28454517 639 node->thunk.virtual_value = virtual_value;
4c7db812 640 node->thunk.indirect_offset = indirect_offset;
28454517 641 node->thunk.alias = real_alias;
0e3918d8 642 node->thunk.this_adjusting = this_adjusting;
643 node->thunk.virtual_offset_p = virtual_offset != NULL;
28454517 644 node->thunk.thunk_p = true;
02774f2d 645 node->definition = true;
91bf9d9a 646
9ced88d0 647 return node;
ed772161 648}
649
8bc09a74 650/* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
651 Return NULL if there's no such node. */
652
415d1b9a 653cgraph_node *
654cgraph_node::get_for_asmname (tree asmname)
8bc09a74 655{
cfbe30aa 656 /* We do not want to look at inline clones. */
35ee1c66 657 for (symtab_node *node = symtab_node::get_for_asmname (asmname);
2dc9831f 658 node;
02774f2d 659 node = node->next_sharing_asm_name)
2dc9831f 660 {
13cbeaac 661 cgraph_node *cn = dyn_cast <cgraph_node *> (node);
2dc9831f 662 if (cn && !cn->global.inlined_to)
663 return cn;
664 }
8bc09a74 665 return NULL;
666}
667
88c5a1d1 668/* Returns a hash value for X (which really is a cgraph_edge). */
8df22c5c 669
2ef51f0e 670hashval_t
671cgraph_edge_hasher::hash (cgraph_edge *e)
8df22c5c 672{
6f0f5716 673 /* This is a really poor hash function, but it is what htab_hash_pointer
674 uses. */
675 return (hashval_t) ((intptr_t)e->call_stmt >> 3);
676}
677
678/* Returns a hash value for X (which really is a cgraph_edge). */
679
680hashval_t
42acab1c 681cgraph_edge_hasher::hash (gimple *call_stmt)
6f0f5716 682{
683 /* This is a really poor hash function, but it is what htab_hash_pointer
684 uses. */
685 return (hashval_t) ((intptr_t)call_stmt >> 3);
8df22c5c 686}
687
47ae02b7 688/* Return nonzero if the call_stmt of cgraph_edge X is stmt *Y. */
8df22c5c 689
2ef51f0e 690inline bool
42acab1c 691cgraph_edge_hasher::equal (cgraph_edge *x, gimple *y)
8df22c5c 692{
2ef51f0e 693 return x->call_stmt == y;
8df22c5c 694}
695
799c8711 696/* Add call graph edge E to call site hash of its caller. */
697
4d044066 698static inline void
35ee1c66 699cgraph_update_edge_in_call_site_hash (cgraph_edge *e)
4d044066 700{
42acab1c 701 gimple *call = e->call_stmt;
6f0f5716 702 *e->caller->call_site_hash->find_slot_with_hash
703 (call, cgraph_edge_hasher::hash (call), INSERT) = e;
4d044066 704}
705
706/* Add call graph edge E to call site hash of its caller. */
707
799c8711 708static inline void
35ee1c66 709cgraph_add_edge_to_call_site_hash (cgraph_edge *e)
799c8711 710{
4d044066 711 /* There are two speculative edges for every statement (one direct,
712 one indirect); always hash the direct one. */
713 if (e->speculative && e->indirect_unknown_callee)
714 return;
2ef51f0e 715 cgraph_edge **slot = e->caller->call_site_hash->find_slot_with_hash
6f0f5716 716 (e->call_stmt, cgraph_edge_hasher::hash (e->call_stmt), INSERT);
4d044066 717 if (*slot)
718 {
35ee1c66 719 gcc_assert (((cgraph_edge *)*slot)->speculative);
29074219 720 if (e->callee)
721 *slot = e;
4d044066 722 return;
723 }
724 gcc_assert (!*slot || e->speculative);
799c8711 725 *slot = e;
726}
75a70cf9 727
728/* Return the callgraph edge representing the GIMPLE_CALL statement
729 CALL_STMT. */
730
415d1b9a 731cgraph_edge *
42acab1c 732cgraph_node::get_edge (gimple *call_stmt)
b0cdf642 733{
35ee1c66 734 cgraph_edge *e, *e2;
8df22c5c 735 int n = 0;
736
415d1b9a 737 if (call_site_hash)
6f0f5716 738 return call_site_hash->find_with_hash
739 (call_stmt, cgraph_edge_hasher::hash (call_stmt));
b0cdf642 740
741 /* This loop may turn out to be performance problem. In such case adding
742 hashtables into call nodes with very many edges is probably best
9c9bad97 743 solution. It is not good idea to add pointer into CALL_EXPR itself
b0cdf642 744 because we want to make possible having multiple cgraph nodes representing
745 different clones of the same body before the body is actually cloned. */
415d1b9a 746 for (e = callees; e; e = e->next_callee)
8df22c5c 747 {
748 if (e->call_stmt == call_stmt)
749 break;
750 n++;
751 }
75a70cf9 752
799c8711 753 if (!e)
415d1b9a 754 for (e = indirect_calls; e; e = e->next_callee)
799c8711 755 {
756 if (e->call_stmt == call_stmt)
757 break;
758 n++;
759 }
760
8df22c5c 761 if (n > 100)
762 {
2ef51f0e 763 call_site_hash = hash_table<cgraph_edge_hasher>::create_ggc (120);
415d1b9a 764 for (e2 = callees; e2; e2 = e2->next_callee)
799c8711 765 cgraph_add_edge_to_call_site_hash (e2);
415d1b9a 766 for (e2 = indirect_calls; e2; e2 = e2->next_callee)
799c8711 767 cgraph_add_edge_to_call_site_hash (e2);
8df22c5c 768 }
75a70cf9 769
b0cdf642 770 return e;
771}
772
75a70cf9 773
35ee1c66 774/* Change field call_stmt of edge to NEW_STMT.
4d044066 775 If UPDATE_SPECULATIVE and E is any component of speculative
776 edge, then update all components. */
a30b29a7 777
8df22c5c 778void
1a91d914 779cgraph_edge::set_call_stmt (gcall *new_stmt, bool update_speculative)
8df22c5c 780{
799c8711 781 tree decl;
782
4d044066 783 /* Speculative edges has three component, update all of them
784 when asked to. */
35ee1c66 785 if (update_speculative && speculative)
4d044066 786 {
35ee1c66 787 cgraph_edge *direct, *indirect;
788 ipa_ref *ref;
4d044066 789
35ee1c66 790 speculative_call_info (direct, indirect, ref);
791 direct->set_call_stmt (new_stmt, false);
792 indirect->set_call_stmt (new_stmt, false);
4d044066 793 ref->stmt = new_stmt;
794 return;
795 }
796
797 /* Only direct speculative edges go to call_site_hash. */
35ee1c66 798 if (caller->call_site_hash
799 && (!speculative || !indirect_unknown_callee))
8df22c5c 800 {
2ef51f0e 801 caller->call_site_hash->remove_elt_with_hash
6f0f5716 802 (call_stmt, cgraph_edge_hasher::hash (call_stmt));
8df22c5c 803 }
799c8711 804
35ee1c66 805 cgraph_edge *e = this;
806
807 call_stmt = new_stmt;
808 if (indirect_unknown_callee
799c8711 809 && (decl = gimple_call_fndecl (new_stmt)))
810 {
811 /* Constant propagation (and possibly also inlining?) can turn an
812 indirect call into a direct one. */
35ee1c66 813 cgraph_node *new_callee = cgraph_node::get (decl);
799c8711 814
5a90471f 815 gcc_checking_assert (new_callee);
35ee1c66 816 e = make_direct (new_callee);
799c8711 817 }
818
aac19106 819 function *fun = DECL_STRUCT_FUNCTION (e->caller->decl);
820 e->can_throw_external = stmt_can_throw_external (fun, new_stmt);
8df22c5c 821 if (e->caller->call_site_hash)
799c8711 822 cgraph_add_edge_to_call_site_hash (e);
8df22c5c 823}
824
799c8711 825/* Allocate a cgraph_edge structure and fill it with data according to the
826 parameters of which only CALLEE can be NULL (when creating an indirect call
827 edge). */
833eb724 828
415d1b9a 829cgraph_edge *
35ee1c66 830symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee,
151b9ff5 831 gcall *call_stmt, profile_count count,
1a91d914 832 bool indir_unknown_callee)
833eb724 833{
415d1b9a 834 cgraph_edge *edge;
b0cdf642 835
7bfefa9d 836 /* LTO does not actually have access to the call_stmt since these
837 have not been loaded yet. */
838 if (call_stmt)
839 {
0a10fd82 840 /* This is a rather expensive check possibly triggering
1b4345f7 841 construction of call stmt hashtable. */
35ee1c66 842 cgraph_edge *e;
382ecba7 843 gcc_checking_assert (!(e = caller->get_edge (call_stmt))
844 || e->speculative);
b0cdf642 845
7bfefa9d 846 gcc_assert (is_gimple_call (call_stmt));
847 }
d7c6d889 848
72b1ee08 849 edge = ggc_alloc<cgraph_edge> ();
850 edge->m_summary_id = -1;
35ee1c66 851 edges_count++;
852
d24fc4aa 853 gcc_assert (++edges_max_uid != 0);
854 edge->m_uid = edges_max_uid;
b0cdf642 855 edge->aux = NULL;
833eb724 856 edge->caller = caller;
857 edge->callee = callee;
799c8711 858 edge->prev_caller = NULL;
859 edge->next_caller = NULL;
860 edge->prev_callee = NULL;
861 edge->next_callee = NULL;
4d044066 862 edge->lto_stmt_uid = 0;
799c8711 863
151b9ff5 864 edge->count = count;
799c8711 865
9bfec7c2 866 edge->call_stmt = call_stmt;
0780673f 867 edge->can_throw_external
aac19106 868 = call_stmt ? stmt_can_throw_external (DECL_STRUCT_FUNCTION (caller->decl),
869 call_stmt) : false;
f883da84 870 if (call_stmt
02774f2d 871 && callee && callee->decl
872 && !gimple_check_call_matching_types (call_stmt, callee->decl,
341de017 873 false))
0754a747 874 {
875 edge->inline_failed = CIF_MISMATCHED_ARGUMENTS;
876 edge->call_stmt_cannot_inline_p = true;
877 }
f883da84 878 else
0754a747 879 {
880 edge->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
881 edge->call_stmt_cannot_inline_p = false;
882 }
799c8711 883
884 edge->indirect_info = NULL;
885 edge->indirect_inlining_edge = 0;
136bc3b3 886 edge->speculative = false;
5a900841 887 edge->indirect_unknown_callee = indir_unknown_callee;
1697db31 888 if (opt_for_fn (edge->caller->decl, flag_devirtualize)
889 && call_stmt && DECL_STRUCT_FUNCTION (caller->decl))
007a6c27 890 edge->in_polymorphic_cdtor
891 = decl_maybe_in_construction_p (NULL, NULL, call_stmt,
892 caller->decl);
893 else
894 edge->in_polymorphic_cdtor = caller->thunk.thunk_p;
f7eab642 895 if (call_stmt && caller->call_site_hash)
896 cgraph_add_edge_to_call_site_hash (edge);
799c8711 897
898 return edge;
899}
900
415d1b9a 901/* Create edge from a given function to CALLEE in the cgraph. */
799c8711 902
35ee1c66 903cgraph_edge *
904cgraph_node::create_edge (cgraph_node *callee,
151b9ff5 905 gcall *call_stmt, profile_count count)
799c8711 906{
35ee1c66 907 cgraph_edge *edge = symtab->create_edge (this, callee, call_stmt, count,
151b9ff5 908 false);
799c8711 909
799c8711 910 initialize_inline_failed (edge);
911
833eb724 912 edge->next_caller = callee->callers;
bb4c7a44 913 if (callee->callers)
914 callee->callers->prev_caller = edge;
415d1b9a 915 edge->next_callee = callees;
916 if (callees)
917 callees->prev_callee = edge;
918 callees = edge;
833eb724 919 callee->callers = edge;
69428266 920
799c8711 921 return edge;
922}
923
9bab6a70 924/* Allocate cgraph_indirect_call_info and set its fields to default values. */
925
35ee1c66 926cgraph_indirect_call_info *
9bab6a70 927cgraph_allocate_init_indirect_info (void)
928{
35ee1c66 929 cgraph_indirect_call_info *ii;
9bab6a70 930
25a27413 931 ii = ggc_cleared_alloc<cgraph_indirect_call_info> ();
9bab6a70 932 ii->param_index = -1;
933 return ii;
934}
799c8711 935
936/* Create an indirect edge with a yet-undetermined callee where the call
937 statement destination is a formal parameter of the caller with index
938 PARAM_INDEX. */
939
35ee1c66 940cgraph_edge *
1a91d914 941cgraph_node::create_indirect_edge (gcall *call_stmt, int ecf_flags,
151b9ff5 942 profile_count count,
39c98dee 943 bool compute_indirect_info)
799c8711 944{
35ee1c66 945 cgraph_edge *edge = symtab->create_edge (this, NULL, call_stmt,
151b9ff5 946 count, true);
f5e35fed 947 tree target;
799c8711 948
69428266 949 initialize_inline_failed (edge);
950
9bab6a70 951 edge->indirect_info = cgraph_allocate_init_indirect_info ();
f8b7e3ec 952 edge->indirect_info->ecf_flags = ecf_flags;
43aac8cb 953 edge->indirect_info->vptr_changed = true;
799c8711 954
f5e35fed 955 /* Record polymorphic call info. */
39c98dee 956 if (compute_indirect_info
957 && call_stmt
f5e35fed 958 && (target = gimple_call_fn (call_stmt))
959 && virtual_method_call_p (target))
960 {
379f6698 961 ipa_polymorphic_call_context context (decl, target, call_stmt);
f5e35fed 962
963 /* Only record types can have virtual calls. */
3af5e0b7 964 edge->indirect_info->polymorphic = true;
f5e35fed 965 edge->indirect_info->param_index = -1;
379f6698 966 edge->indirect_info->otr_token
967 = tree_to_uhwi (OBJ_TYPE_REF_TOKEN (target));
968 edge->indirect_info->otr_type = obj_type_ref_class (target);
969 gcc_assert (TREE_CODE (edge->indirect_info->otr_type) == RECORD_TYPE);
e33892d7 970 edge->indirect_info->context = context;
f5e35fed 971 }
972
415d1b9a 973 edge->next_callee = indirect_calls;
974 if (indirect_calls)
975 indirect_calls->prev_callee = edge;
976 indirect_calls = edge;
799c8711 977
833eb724 978 return edge;
979}
980
35ee1c66 981/* Remove the edge from the list of the callees of the caller. */
bb4c7a44 982
35ee1c66 983void
984cgraph_edge::remove_caller (void)
bb4c7a44 985{
35ee1c66 986 if (prev_callee)
987 prev_callee->next_callee = next_callee;
988 if (next_callee)
989 next_callee->prev_callee = prev_callee;
990 if (!prev_callee)
799c8711 991 {
35ee1c66 992 if (indirect_unknown_callee)
993 caller->indirect_calls = next_callee;
799c8711 994 else
35ee1c66 995 caller->callees = next_callee;
799c8711 996 }
35ee1c66 997 if (caller->call_site_hash)
6f0f5716 998 caller->call_site_hash->remove_elt_with_hash
999 (call_stmt, cgraph_edge_hasher::hash (call_stmt));
bb4c7a44 1000}
1001
e83fcabc 1002/* Put the edge onto the free list. */
1003
35ee1c66 1004void
1005symbol_table::free_edge (cgraph_edge *e)
e83fcabc 1006{
72b1ee08 1007 edges_count--;
1008 if (e->m_summary_id != -1)
1009 edge_released_summary_ids.safe_push (e->m_summary_id);
1010
4d044066 1011 if (e->indirect_info)
1012 ggc_free (e->indirect_info);
72b1ee08 1013 ggc_free (e);
e83fcabc 1014}
1015
35ee1c66 1016/* Remove the edge in the cgraph. */
833eb724 1017
4e570444 1018void
35ee1c66 1019cgraph_edge::remove (void)
833eb724 1020{
e83fcabc 1021 /* Call all edge removal hooks. */
35ee1c66 1022 symtab->call_edge_removal_hooks (this);
e83fcabc 1023
35ee1c66 1024 if (!indirect_unknown_callee)
799c8711 1025 /* Remove from callers list of the callee. */
35ee1c66 1026 remove_callee ();
bb4c7a44 1027
1028 /* Remove from callees list of the callers. */
35ee1c66 1029 remove_caller ();
e83fcabc 1030
1031 /* Put the edge onto the free list. */
35ee1c66 1032 symtab->free_edge (this);
833eb724 1033}
1034
35ee1c66 1035/* Turn edge into speculative call calling N2. Update
4d044066 1036 the profile so the direct call is taken COUNT times
1037 with FREQUENCY.
1038
1039 At clone materialization time, the indirect call E will
1040 be expanded as:
1041
1042 if (call_dest == N2)
1043 n2 ();
1044 else
1045 call call_dest
1046
1047 At this time the function just creates the direct call,
1048 the referencd representing the if conditional and attaches
12d5ae9f 1049 them all to the orginal indirect call statement.
4d044066 1050
12d5ae9f 1051 Return direct edge created. */
1052
35ee1c66 1053cgraph_edge *
151b9ff5 1054cgraph_edge::make_speculative (cgraph_node *n2, profile_count direct_count)
4d044066 1055{
35ee1c66 1056 cgraph_node *n = caller;
1057 ipa_ref *ref = NULL;
1058 cgraph_edge *e2;
4d044066 1059
1060 if (dump_file)
0e388735 1061 fprintf (dump_file, "Indirect call -> speculative call %s => %s\n",
1062 n->dump_name (), n2->dump_name ());
35ee1c66 1063 speculative = true;
151b9ff5 1064 e2 = n->create_edge (n2, call_stmt, direct_count);
4d044066 1065 initialize_inline_failed (e2);
1066 e2->speculative = true;
02774f2d 1067 if (TREE_NOTHROW (n2->decl))
29074219 1068 e2->can_throw_external = false;
1069 else
35ee1c66 1070 e2->can_throw_external = can_throw_external;
1071 e2->lto_stmt_uid = lto_stmt_uid;
007a6c27 1072 e2->in_polymorphic_cdtor = in_polymorphic_cdtor;
35ee1c66 1073 count -= e2->count;
35ee1c66 1074 symtab->call_edge_duplication_hooks (this, e2);
1075 ref = n->create_reference (n2, IPA_REF_ADDR, call_stmt);
1076 ref->lto_stmt_uid = lto_stmt_uid;
1077 ref->speculative = speculative;
415d1b9a 1078 n2->mark_address_taken ();
12d5ae9f 1079 return e2;
4d044066 1080}
1081
1082/* Speculative call consist of three components:
1083 1) an indirect edge representing the original call
1084 2) an direct edge representing the new call
1085 3) ADDR_EXPR reference representing the speculative check.
1086 All three components are attached to single statement (the indirect
1087 call) and if one of them exists, all of them must exist.
1088
35ee1c66 1089 Given speculative call edge, return all three components.
4d044066 1090 */
1091
1092void
35ee1c66 1093cgraph_edge::speculative_call_info (cgraph_edge *&direct,
1094 cgraph_edge *&indirect,
1095 ipa_ref *&reference)
4d044066 1096{
35ee1c66 1097 ipa_ref *ref;
4d044066 1098 int i;
35ee1c66 1099 cgraph_edge *e2;
1100 cgraph_edge *e = this;
4d044066 1101
1102 if (!e->indirect_unknown_callee)
1103 for (e2 = e->caller->indirect_calls;
1104 e2->call_stmt != e->call_stmt || e2->lto_stmt_uid != e->lto_stmt_uid;
1105 e2 = e2->next_callee)
1106 ;
1107 else
1108 {
1109 e2 = e;
1110 /* We can take advantage of the call stmt hash. */
1111 if (e2->call_stmt)
1112 {
415d1b9a 1113 e = e->caller->get_edge (e2->call_stmt);
12d5ae9f 1114 gcc_assert (e->speculative && !e->indirect_unknown_callee);
4d044066 1115 }
1116 else
1117 for (e = e->caller->callees;
4582129e 1118 e2->call_stmt != e->call_stmt
1119 || e2->lto_stmt_uid != e->lto_stmt_uid;
4d044066 1120 e = e->next_callee)
1121 ;
1122 }
1123 gcc_assert (e->speculative && e2->speculative);
4582129e 1124 direct = e;
1125 indirect = e2;
4d044066 1126
1127 reference = NULL;
51ce5652 1128 for (i = 0; e->caller->iterate_reference (i, ref); i++)
4d044066 1129 if (ref->speculative
1130 && ((ref->stmt && ref->stmt == e->call_stmt)
30c45111 1131 || (!ref->stmt && ref->lto_stmt_uid == e->lto_stmt_uid)))
4d044066 1132 {
1133 reference = ref;
1134 break;
1135 }
4582129e 1136
1137 /* Speculative edge always consist of all three components - direct edge,
1138 indirect and reference. */
1139
1140 gcc_assert (e && e2 && ref);
4d044066 1141}
1142
35ee1c66 1143/* Speculative call edge turned out to be direct call to CALLE_DECL.
4d044066 1144 Remove the speculative call sequence and return edge representing the call.
1145 It is up to caller to redirect the call as appropriate. */
1146
35ee1c66 1147cgraph_edge *
1148cgraph_edge::resolve_speculation (tree callee_decl)
4d044066 1149{
35ee1c66 1150 cgraph_edge *edge = this;
1151 cgraph_edge *e2;
1152 ipa_ref *ref;
4d044066 1153
1154 gcc_assert (edge->speculative);
35ee1c66 1155 edge->speculative_call_info (e2, edge, ref);
608e8a24 1156 if (!callee_decl
415d1b9a 1157 || !ref->referred->semantically_equivalent_p
1158 (symtab_node::get (callee_decl)))
4d044066 1159 {
1160 if (dump_file)
1161 {
12d5ae9f 1162 if (callee_decl)
1163 {
0e388735 1164 fprintf (dump_file, "Speculative indirect call %s => %s has "
12d5ae9f 1165 "turned out to have contradicting known target ",
0e388735 1166 edge->caller->dump_name (),
1167 e2->callee->dump_name ());
1ffa4346 1168 print_generic_expr (dump_file, callee_decl);
12d5ae9f 1169 fprintf (dump_file, "\n");
1170 }
1171 else
1172 {
0e388735 1173 fprintf (dump_file, "Removing speculative call %s => %s\n",
1174 edge->caller->dump_name (),
1175 e2->callee->dump_name ());
12d5ae9f 1176 }
4d044066 1177 }
1178 }
1179 else
1180 {
35ee1c66 1181 cgraph_edge *tmp = edge;
4d044066 1182 if (dump_file)
1183 fprintf (dump_file, "Speculative call turned into direct call.\n");
1184 edge = e2;
1185 e2 = tmp;
4582129e 1186 /* FIXME: If EDGE is inlined, we should scale up the frequencies and counts
1187 in the functions inlined through it. */
4d044066 1188 }
1189 edge->count += e2->count;
4d044066 1190 edge->speculative = false;
1191 e2->speculative = false;
51ce5652 1192 ref->remove_reference ();
4d044066 1193 if (e2->indirect_unknown_callee || e2->inline_failed)
35ee1c66 1194 e2->remove ();
4d044066 1195 else
415d1b9a 1196 e2->callee->remove_symbol_and_inline_clones ();
4d044066 1197 if (edge->caller->call_site_hash)
1198 cgraph_update_edge_in_call_site_hash (edge);
4d044066 1199 return edge;
1200}
1201
35ee1c66 1202/* Make an indirect edge with an unknown callee an ordinary edge leading to
9bab6a70 1203 CALLEE. DELTA is an integer constant that is to be added to the this
1204 pointer (first parameter) to compensate for skipping a thunk adjustment. */
799c8711 1205
35ee1c66 1206cgraph_edge *
1207cgraph_edge::make_direct (cgraph_node *callee)
799c8711 1208{
35ee1c66 1209 cgraph_edge *edge = this;
1210 gcc_assert (indirect_unknown_callee);
4d044066 1211
1212 /* If we are redirecting speculative call, make it non-speculative. */
35ee1c66 1213 if (indirect_unknown_callee && speculative)
4d044066 1214 {
35ee1c66 1215 edge = edge->resolve_speculation (callee->decl);
4d044066 1216
1217 /* On successful speculation just return the pre existing direct edge. */
0ab4d0a8 1218 if (!edge->indirect_unknown_callee)
4d044066 1219 return edge;
1220 }
1221
35ee1c66 1222 indirect_unknown_callee = 0;
1223 ggc_free (indirect_info);
1224 indirect_info = NULL;
799c8711 1225
1226 /* Get the edge out of the indirect edge list. */
35ee1c66 1227 if (prev_callee)
1228 prev_callee->next_callee = next_callee;
1229 if (next_callee)
1230 next_callee->prev_callee = prev_callee;
1231 if (!prev_callee)
1232 caller->indirect_calls = next_callee;
799c8711 1233
1234 /* Put it into the normal callee list */
35ee1c66 1235 prev_callee = NULL;
1236 next_callee = caller->callees;
1237 if (caller->callees)
1238 caller->callees->prev_callee = edge;
1239 caller->callees = edge;
799c8711 1240
1241 /* Insert to callers list of the new callee. */
c308ecc8 1242 edge->set_callee (callee);
799c8711 1243
0754a747 1244 if (call_stmt
1245 && !gimple_check_call_matching_types (call_stmt, callee->decl, false))
1246 {
1247 call_stmt_cannot_inline_p = true;
1248 inline_failed = CIF_MISMATCHED_ARGUMENTS;
1249 }
a1942f0c 1250
799c8711 1251 /* We need to re-determine the inlining status of the edge. */
1252 initialize_inline_failed (edge);
4d044066 1253 return edge;
bb4c7a44 1254}
1255
f41db742 1256/* If necessary, change the function declaration in the call statement
1257 associated with E so that it corresponds to the edge callee. */
1258
42acab1c 1259gimple *
35ee1c66 1260cgraph_edge::redirect_call_stmt_to_callee (void)
f41db742 1261{
35ee1c66 1262 cgraph_edge *e = this;
1263
f41db742 1264 tree decl = gimple_call_fndecl (e->call_stmt);
1a91d914 1265 gcall *new_stmt;
f41db742 1266 gimple_stmt_iterator gsi;
f41db742 1267
4d044066 1268 if (e->speculative)
1269 {
35ee1c66 1270 cgraph_edge *e2;
1a91d914 1271 gcall *new_stmt;
35ee1c66 1272 ipa_ref *ref;
4d044066 1273
35ee1c66 1274 e->speculative_call_info (e, e2, ref);
8b83e6bf 1275 /* If there already is an direct call (i.e. as a result of inliner's
1276 substitution), forget about speculating. */
5514adf9 1277 if (decl)
35ee1c66 1278 e = e->resolve_speculation (decl);
8b83e6bf 1279 /* If types do not match, speculation was likely wrong.
6ec840b0 1280 The direct edge was possibly redirected to the clone with a different
8b83e6bf 1281 signature. We did not update the call statement yet, so compare it
1282 with the reference that still points to the proper type. */
1283 else if (!gimple_check_call_matching_types (e->call_stmt,
02774f2d 1284 ref->referred->decl,
5514adf9 1285 true))
4d044066 1286 {
1287 if (dump_file)
0e388735 1288 fprintf (dump_file, "Not expanding speculative call of %s -> %s\n"
12d5ae9f 1289 "Type mismatch.\n",
0e388735 1290 e->caller->dump_name (),
1291 e->callee->dump_name ());
35ee1c66 1292 e = e->resolve_speculation ();
8b83e6bf 1293 /* We are producing the final function body and will throw away the
1294 callgraph edges really soon. Reset the counts/frequencies to
1295 keep verifier happy in the case of roundoff errors. */
151b9ff5 1296 e->count = gimple_bb (e->call_stmt)->count;
12d5ae9f 1297 }
5514adf9 1298 /* Expand speculation into GIMPLE code. */
12d5ae9f 1299 else
1300 {
1301 if (dump_file)
db9cef39 1302 {
1303 fprintf (dump_file,
1304 "Expanding speculative call of %s -> %s count: ",
1305 e->caller->dump_name (),
1306 e->callee->dump_name ());
1307 e->count.dump (dump_file);
1308 fprintf (dump_file, "\n");
1309 }
4d044066 1310 gcc_assert (e2->speculative);
02774f2d 1311 push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
5d31e485 1312
1313 profile_probability prob = e->count.probability_in (e->count
1314 + e2->count);
151b9ff5 1315 if (!prob.initialized_p ())
5d31e485 1316 prob = profile_probability::even ();
aee8a3e8 1317 new_stmt = gimple_ic (e->call_stmt,
1318 dyn_cast<cgraph_node *> (ref->referred),
205ce1aa 1319 prob);
4d044066 1320 e->speculative = false;
415d1b9a 1321 e->caller->set_call_stmt_including_clones (e->call_stmt, new_stmt,
1322 false);
99d664b3 1323 e->count = gimple_bb (e->call_stmt)->count;
4d044066 1324 e2->speculative = false;
99d664b3 1325 e2->count = gimple_bb (e2->call_stmt)->count;
4d044066 1326 ref->speculative = false;
1327 ref->stmt = NULL;
1328 /* Indirect edges are not both in the call site hash.
1329 get it updated. */
1330 if (e->caller->call_site_hash)
1331 cgraph_update_edge_in_call_site_hash (e2);
1332 pop_cfun ();
1333 /* Continue redirecting E to proper target. */
1334 }
1335 }
1336
100c2304 1337
f41db742 1338 if (e->indirect_unknown_callee
1e42d5c6 1339 || decl == e->callee->decl)
f41db742 1340 return e->call_stmt;
1341
382ecba7 1342 if (flag_checking && decl)
f41db742 1343 {
382ecba7 1344 cgraph_node *node = cgraph_node::get (decl);
f41db742 1345 gcc_assert (!node || !node->clone.combined_args_to_skip);
1346 }
f41db742 1347
35ee1c66 1348 if (symtab->dump_file)
f41db742 1349 {
0e388735 1350 fprintf (symtab->dump_file, "updating call of %s -> %s: ",
1351 e->caller->dump_name (), e->callee->dump_name ());
35ee1c66 1352 print_gimple_stmt (symtab->dump_file, e->call_stmt, 0, dump_flags);
f41db742 1353 if (e->callee->clone.combined_args_to_skip)
1354 {
35ee1c66 1355 fprintf (symtab->dump_file, " combined args to skip: ");
1356 dump_bitmap (symtab->dump_file,
f41db742 1357 e->callee->clone.combined_args_to_skip);
1358 }
1359 }
1360
1e42d5c6 1361 if (e->callee->clone.combined_args_to_skip)
f41db742 1362 {
1363 int lp_nr;
1364
100c2304 1365 new_stmt = e->call_stmt;
1366 if (e->callee->clone.combined_args_to_skip)
1367 new_stmt
1368 = gimple_call_copy_skip_args (new_stmt,
1369 e->callee->clone.combined_args_to_skip);
61896fab 1370 tree old_fntype = gimple_call_fntype (e->call_stmt);
02774f2d 1371 gimple_call_set_fndecl (new_stmt, e->callee->decl);
61896fab 1372 cgraph_node *origin = e->callee;
1373 while (origin->clone_of)
1374 origin = origin->clone_of;
1375
1376 if ((origin->former_clone_of
1377 && old_fntype == TREE_TYPE (origin->former_clone_of))
1378 || old_fntype == TREE_TYPE (origin->decl))
1379 gimple_call_set_fntype (new_stmt, TREE_TYPE (e->callee->decl));
1380 else
1381 {
1382 bitmap skip = e->callee->clone.combined_args_to_skip;
1383 tree t = cgraph_build_function_type_skip_args (old_fntype, skip,
1384 false);
1385 gimple_call_set_fntype (new_stmt, t);
1386 }
f41db742 1387
1388 if (gimple_vdef (new_stmt)
1389 && TREE_CODE (gimple_vdef (new_stmt)) == SSA_NAME)
1390 SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
1391
1392 gsi = gsi_for_stmt (e->call_stmt);
6ec840b0 1393
1394 /* For optimized away parameters, add on the caller side
1395 before the call
1396 DEBUG D#X => parm_Y(D)
1397 stmts and associate D#X with parm in decl_debug_args_lookup
1398 vector to say for debug info that if parameter parm had been passed,
1399 it would have value parm_Y(D). */
c64f38bf 1400 if (e->callee->clone.combined_args_to_skip && MAY_HAVE_DEBUG_BIND_STMTS)
6ec840b0 1401 {
1402 vec<tree, va_gc> **debug_args
1403 = decl_debug_args_lookup (e->callee->decl);
1404 tree old_decl = gimple_call_fndecl (e->call_stmt);
1405 if (debug_args && old_decl)
1406 {
1407 tree parm;
1408 unsigned i = 0, num;
1409 unsigned len = vec_safe_length (*debug_args);
1410 unsigned nargs = gimple_call_num_args (e->call_stmt);
1411 for (parm = DECL_ARGUMENTS (old_decl), num = 0;
1412 parm && num < nargs;
1413 parm = DECL_CHAIN (parm), num++)
1414 if (bitmap_bit_p (e->callee->clone.combined_args_to_skip, num)
1415 && is_gimple_reg (parm))
1416 {
1417 unsigned last = i;
1418
1419 while (i < len && (**debug_args)[i] != DECL_ORIGIN (parm))
1420 i += 2;
1421 if (i >= len)
1422 {
1423 i = 0;
1424 while (i < last
1425 && (**debug_args)[i] != DECL_ORIGIN (parm))
1426 i += 2;
1427 if (i >= last)
1428 continue;
1429 }
1430 tree ddecl = (**debug_args)[i + 1];
1431 tree arg = gimple_call_arg (e->call_stmt, num);
1432 if (!useless_type_conversion_p (TREE_TYPE (ddecl),
1433 TREE_TYPE (arg)))
1434 {
1435 tree rhs1;
1436 if (!fold_convertible_p (TREE_TYPE (ddecl), arg))
1437 continue;
1438 if (TREE_CODE (arg) == SSA_NAME
1439 && gimple_assign_cast_p (SSA_NAME_DEF_STMT (arg))
1440 && (rhs1
1441 = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (arg)))
1442 && useless_type_conversion_p (TREE_TYPE (ddecl),
1443 TREE_TYPE (rhs1)))
1444 arg = rhs1;
1445 else
1446 arg = fold_convert (TREE_TYPE (ddecl), arg);
1447 }
1448
1449 gimple *def_temp
1450 = gimple_build_debug_bind (ddecl, unshare_expr (arg),
1451 e->call_stmt);
1452 gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT);
1453 }
1454 }
1455 }
1456
f41db742 1457 gsi_replace (&gsi, new_stmt, false);
1458 /* We need to defer cleaning EH info on the new statement to
1459 fixup-cfg. We may not have dominator information at this point
1460 and thus would end up with unreachable blocks and have no way
1461 to communicate that we need to run CFG cleanup then. */
1462 lp_nr = lookup_stmt_eh_lp (e->call_stmt);
1463 if (lp_nr != 0)
1464 {
1465 remove_stmt_from_eh_lp (e->call_stmt);
1466 add_stmt_to_eh_lp (new_stmt, lp_nr);
1467 }
1468 }
1469 else
1470 {
1471 new_stmt = e->call_stmt;
02774f2d 1472 gimple_call_set_fndecl (new_stmt, e->callee->decl);
861b4e39 1473 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
f41db742 1474 }
1475
eba6788d 1476 /* If changing the call to __cxa_pure_virtual or similar noreturn function,
1477 adjust gimple_call_fntype too. */
1478 if (gimple_call_noreturn_p (new_stmt)
1479 && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (e->callee->decl)))
1480 && TYPE_ARG_TYPES (TREE_TYPE (e->callee->decl))
1481 && (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (e->callee->decl)))
1482 == void_type_node))
1483 gimple_call_set_fntype (new_stmt, TREE_TYPE (e->callee->decl));
1484
33b2642e 1485 /* If the call becomes noreturn, remove the LHS if possible. */
6f7e2d6e 1486 tree lhs = gimple_call_lhs (new_stmt);
eba6788d 1487 if (lhs
1488 && gimple_call_noreturn_p (new_stmt)
1489 && (VOID_TYPE_P (TREE_TYPE (gimple_call_fntype (new_stmt)))
1490 || should_remove_lhs_p (lhs)))
ebd03cf7 1491 {
1492 if (TREE_CODE (lhs) == SSA_NAME)
1493 {
98107def 1494 tree var = create_tmp_reg_fn (DECL_STRUCT_FUNCTION (e->caller->decl),
1495 TREE_TYPE (lhs), NULL);
1496 var = get_or_create_ssa_default_def
1497 (DECL_STRUCT_FUNCTION (e->caller->decl), var);
42acab1c 1498 gimple *set_stmt = gimple_build_assign (lhs, var);
ebd03cf7 1499 gsi = gsi_for_stmt (new_stmt);
98107def 1500 gsi_insert_before_without_update (&gsi, set_stmt, GSI_SAME_STMT);
1501 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), set_stmt);
ebd03cf7 1502 }
1503 gimple_call_set_lhs (new_stmt, NULL_TREE);
7a33f452 1504 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
1505 }
1506
1507 /* If new callee has no static chain, remove it. */
1508 if (gimple_call_chain (new_stmt) && !DECL_STATIC_CHAIN (e->callee->decl))
1509 {
1510 gimple_call_set_chain (new_stmt, NULL);
1511 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
ebd03cf7 1512 }
1513
aee8a3e8 1514 maybe_remove_unused_call_args (DECL_STRUCT_FUNCTION (e->caller->decl),
1515 new_stmt);
1516
415d1b9a 1517 e->caller->set_call_stmt_including_clones (e->call_stmt, new_stmt, false);
f41db742 1518
35ee1c66 1519 if (symtab->dump_file)
f41db742 1520 {
35ee1c66 1521 fprintf (symtab->dump_file, " updated to:");
1522 print_gimple_stmt (symtab->dump_file, e->call_stmt, 0, dump_flags);
f41db742 1523 }
1524 return new_stmt;
1525}
75a70cf9 1526
1527/* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
8d8c4f3e 1528 OLD_STMT changed into NEW_STMT. OLD_CALL is gimple_call_fndecl
bb4322f9 1529 of OLD_STMT if it was previously call statement.
1530 If NEW_STMT is NULL, the call has been dropped without any
1531 replacement. */
117ef3d7 1532
ccf4ab6b 1533static void
35ee1c66 1534cgraph_update_edges_for_call_stmt_node (cgraph_node *node,
42acab1c 1535 gimple *old_stmt, tree old_call,
1536 gimple *new_stmt)
117ef3d7 1537{
bb4322f9 1538 tree new_call = (new_stmt && is_gimple_call (new_stmt))
1539 ? gimple_call_fndecl (new_stmt) : 0;
117ef3d7 1540
8d8c4f3e 1541 /* We are seeing indirect calls, then there is nothing to update. */
1542 if (!new_call && !old_call)
1543 return;
1544 /* See if we turned indirect call into direct call or folded call to one builtin
0a10fd82 1545 into different builtin. */
117ef3d7 1546 if (old_call != new_call)
1547 {
35ee1c66 1548 cgraph_edge *e = node->get_edge (old_stmt);
1549 cgraph_edge *ne = NULL;
db9cef39 1550 profile_count count;
117ef3d7 1551
1552 if (e)
1553 {
bfbaf6bb 1554 /* Keep calls marked as dead dead. */
bdbe7747 1555 if (new_stmt && is_gimple_call (new_stmt) && e->callee
a0e9bfbb 1556 && fndecl_built_in_p (e->callee->decl, BUILT_IN_UNREACHABLE))
bfbaf6bb 1557 {
1558 node->get_edge (old_stmt)->set_call_stmt
1559 (as_a <gcall *> (new_stmt));
1560 return;
1561 }
799c8711 1562 /* See if the edge is already there and has the correct callee. It
1563 might be so because of indirect inlining has already updated
b9ffeffb 1564 it. We also might've cloned and redirected the edge. */
1565 if (new_call && e->callee)
1566 {
35ee1c66 1567 cgraph_node *callee = e->callee;
b9ffeffb 1568 while (callee)
1569 {
02774f2d 1570 if (callee->decl == new_call
b9ffeffb 1571 || callee->former_clone_of == new_call)
ac3cd7ce 1572 {
1a91d914 1573 e->set_call_stmt (as_a <gcall *> (new_stmt));
ac3cd7ce 1574 return;
1575 }
b9ffeffb 1576 callee = callee->clone_of;
1577 }
1578 }
8d8c4f3e 1579
1580 /* Otherwise remove edge and create new one; we can't simply redirect
1581 since function has changed, so inline plan and other information
1582 attached to edge is invalid. */
151b9ff5 1583 count = e->count;
776e3d35 1584 if (e->indirect_unknown_callee || e->inline_failed)
35ee1c66 1585 e->remove ();
776e3d35 1586 else
415d1b9a 1587 e->callee->remove_symbol_and_inline_clones ();
8d8c4f3e 1588 }
bb4322f9 1589 else if (new_call)
8d8c4f3e 1590 {
1591 /* We are seeing new direct call; compute profile info based on BB. */
1592 basic_block bb = gimple_bb (new_stmt);
151b9ff5 1593 count = bb->count;
117ef3d7 1594 }
117ef3d7 1595
8d8c4f3e 1596 if (new_call)
1597 {
415d1b9a 1598 ne = node->create_edge (cgraph_node::get_create (new_call),
151b9ff5 1599 as_a <gcall *> (new_stmt), count);
8d8c4f3e 1600 gcc_assert (ne->inline_failed);
1601 }
117ef3d7 1602 }
8d8c4f3e 1603 /* We only updated the call stmt; update pointer in cgraph edge.. */
1604 else if (old_stmt != new_stmt)
1a91d914 1605 node->get_edge (old_stmt)->set_call_stmt (as_a <gcall *> (new_stmt));
117ef3d7 1606}
1607
ccf4ab6b 1608/* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
8d8c4f3e 1609 OLD_STMT changed into NEW_STMT. OLD_DECL is gimple_call_fndecl
1610 of OLD_STMT before it was updated (updating can happen inplace). */
ccf4ab6b 1611
1612void
42acab1c 1613cgraph_update_edges_for_call_stmt (gimple *old_stmt, tree old_decl,
1614 gimple *new_stmt)
ccf4ab6b 1615{
35ee1c66 1616 cgraph_node *orig = cgraph_node::get (cfun->decl);
1617 cgraph_node *node;
ccf4ab6b 1618
5a90471f 1619 gcc_checking_assert (orig);
8d8c4f3e 1620 cgraph_update_edges_for_call_stmt_node (orig, old_stmt, old_decl, new_stmt);
ccf4ab6b 1621 if (orig->clones)
1622 for (node = orig->clones; node != orig;)
1623 {
8d8c4f3e 1624 cgraph_update_edges_for_call_stmt_node (node, old_stmt, old_decl, new_stmt);
ccf4ab6b 1625 if (node->clones)
1626 node = node->clones;
1627 else if (node->next_sibling_clone)
1628 node = node->next_sibling_clone;
1629 else
1630 {
1631 while (node != orig && !node->next_sibling_clone)
1632 node = node->clone_of;
1633 if (node != orig)
1634 node = node->next_sibling_clone;
1635 }
1636 }
1637}
1638
75a70cf9 1639
bb4c7a44 1640/* Remove all callees from the node. */
1641
1642void
415d1b9a 1643cgraph_node::remove_callees (void)
bb4c7a44 1644{
35ee1c66 1645 cgraph_edge *e, *f;
bb4c7a44 1646
1647 /* It is sufficient to remove the edges from the lists of callers of
1648 the callees. The callee list of the node can be zapped with one
1649 assignment. */
415d1b9a 1650 for (e = callees; e; e = f)
dd1c9157 1651 {
74140efd 1652 f = e->next_callee;
35ee1c66 1653 symtab->call_edge_removal_hooks (e);
799c8711 1654 if (!e->indirect_unknown_callee)
35ee1c66 1655 e->remove_callee ();
1656 symtab->free_edge (e);
dd1c9157 1657 }
415d1b9a 1658 for (e = indirect_calls; e; e = f)
f8b7e3ec 1659 {
1660 f = e->next_callee;
35ee1c66 1661 symtab->call_edge_removal_hooks (e);
f8b7e3ec 1662 if (!e->indirect_unknown_callee)
35ee1c66 1663 e->remove_callee ();
1664 symtab->free_edge (e);
f8b7e3ec 1665 }
415d1b9a 1666 indirect_calls = NULL;
1667 callees = NULL;
1668 if (call_site_hash)
8df22c5c 1669 {
2ef51f0e 1670 call_site_hash->empty ();
415d1b9a 1671 call_site_hash = NULL;
8df22c5c 1672 }
bb4c7a44 1673}
1674
1675/* Remove all callers from the node. */
1676
415d1b9a 1677void
1678cgraph_node::remove_callers (void)
bb4c7a44 1679{
35ee1c66 1680 cgraph_edge *e, *f;
bb4c7a44 1681
1682 /* It is sufficient to remove the edges from the lists of callees of
1683 the callers. The caller list of the node can be zapped with one
1684 assignment. */
415d1b9a 1685 for (e = callers; e; e = f)
dd1c9157 1686 {
74140efd 1687 f = e->next_caller;
35ee1c66 1688 symtab->call_edge_removal_hooks (e);
1689 e->remove_caller ();
1690 symtab->free_edge (e);
dd1c9157 1691 }
415d1b9a 1692 callers = NULL;
b0cdf642 1693}
1694
79e830ee 1695/* Helper function for cgraph_release_function_body and free_lang_data.
1696 It releases body from function DECL without having to inspect its
1697 possibly non-existent symtab node. */
b62f482d 1698
1699void
79e830ee 1700release_function_body (tree decl)
b62f482d 1701{
d4f078b5 1702 function *fn = DECL_STRUCT_FUNCTION (decl);
1703 if (fn)
b62f482d 1704 {
d4f078b5 1705 if (fn->cfg
9ae1b28a 1706 && loops_for_fn (fn))
5737913a 1707 {
9ae1b28a 1708 fn->curr_properties &= ~PROP_loops;
1709 loop_optimizer_finalize (fn);
1710 }
1711 if (fn->gimple_df)
1712 {
1713 delete_tree_ssa (fn);
1714 fn->eh = NULL;
1715 }
1716 if (fn->cfg)
1717 {
1718 gcc_assert (!dom_info_available_p (fn, CDI_DOMINATORS));
1719 gcc_assert (!dom_info_available_p (fn, CDI_POST_DOMINATORS));
1720 delete_tree_cfg_annotations (fn);
1721 clear_edges (fn);
1722 fn->cfg = NULL;
5737913a 1723 }
9ae1b28a 1724 if (fn->value_histograms)
1725 free_histograms (fn);
79e830ee 1726 gimple_set_body (decl, NULL);
5737913a 1727 /* Struct function hangs a lot of data that would leak if we didn't
1728 removed all pointers to it. */
d4f078b5 1729 ggc_free (fn);
79e830ee 1730 DECL_STRUCT_FUNCTION (decl) = NULL;
1731 }
1732 DECL_SAVED_TREE (decl) = NULL;
1733}
1734
415d1b9a 1735/* Release memory used to represent body of function.
79e830ee 1736 Use this only for functions that are released before being translated to
1737 target code (i.e. RTL). Functions that are compiled to RTL and beyond
8e92a5ee 1738 are free'd in final.c via free_after_compilation().
1739 KEEP_ARGUMENTS are useful only if you want to rebuild body as thunk. */
79e830ee 1740
1741void
8e92a5ee 1742cgraph_node::release_body (bool keep_arguments)
79e830ee 1743{
415d1b9a 1744 ipa_transforms_to_apply.release ();
35ee1c66 1745 if (!used_as_abstract_origin && symtab->state != PARSING)
79e830ee 1746 {
415d1b9a 1747 DECL_RESULT (decl) = NULL;
8e92a5ee 1748
1749 if (!keep_arguments)
1750 DECL_ARGUMENTS (decl) = NULL;
b62f482d 1751 }
47ae02b7 1752 /* If the node is abstract and needed, then do not clear
1753 DECL_INITIAL of its associated function declaration because it's
d544ceff 1754 needed to emit debug info later. */
415d1b9a 1755 if (!used_as_abstract_origin && DECL_INITIAL (decl))
1756 DECL_INITIAL (decl) = error_mark_node;
1757 release_function_body (decl);
1758 if (lto_file_data)
e9e2b82f 1759 {
1760 lto_free_function_in_decl_state_for_node (this);
1761 lto_file_data = NULL;
1762 }
b62f482d 1763}
1764
415d1b9a 1765/* Remove function from symbol table. */
961e3b13 1766
1767void
415d1b9a 1768cgraph_node::remove (void)
961e3b13 1769{
9dc70d59 1770 if (symtab->ipa_clones_dump_file && symtab->cloned_nodes.contains (this))
1771 fprintf (symtab->ipa_clones_dump_file,
1772 "Callgraph removal;%s;%d;%s;%d;%d\n", asm_name (), order,
1773 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl),
1774 DECL_SOURCE_COLUMN (decl));
1775
35ee1c66 1776 symtab->call_cgraph_removal_hooks (this);
415d1b9a 1777 remove_callers ();
1778 remove_callees ();
1779 ipa_transforms_to_apply.release ();
a0ffb0fb 1780 delete_function_version (function_version ());
28485874 1781
f4ec5ce1 1782 /* Incremental inlining access removed nodes stored in the postorder list.
1783 */
415d1b9a 1784 force_output = false;
1785 forced_by_abi = false;
de5f7a76 1786 cgraph_node *next = nested;
1787 for (cgraph_node *n = nested; n; n = next)
1788 {
1789 next = n->next_nested;
11b73810 1790 n->origin = NULL;
de5f7a76 1791 n->next_nested = NULL;
1792 }
415d1b9a 1793 nested = NULL;
1794 if (origin)
961e3b13 1795 {
35ee1c66 1796 cgraph_node **node2 = &origin->nested;
961e3b13 1797
415d1b9a 1798 while (*node2 != this)
961e3b13 1799 node2 = &(*node2)->next_nested;
415d1b9a 1800 *node2 = next_nested;
961e3b13 1801 }
415d1b9a 1802 unregister ();
1803 if (prev_sibling_clone)
1804 prev_sibling_clone->next_sibling_clone = next_sibling_clone;
1805 else if (clone_of)
1806 clone_of->clones = next_sibling_clone;
1807 if (next_sibling_clone)
1808 next_sibling_clone->prev_sibling_clone = prev_sibling_clone;
1809 if (clones)
b0cdf642 1810 {
35ee1c66 1811 cgraph_node *n, *next;
ee3f5fc0 1812
415d1b9a 1813 if (clone_of)
ee3f5fc0 1814 {
415d1b9a 1815 for (n = clones; n->next_sibling_clone; n = n->next_sibling_clone)
1816 n->clone_of = clone_of;
1817 n->clone_of = clone_of;
1818 n->next_sibling_clone = clone_of->clones;
1819 if (clone_of->clones)
1820 clone_of->clones->prev_sibling_clone = n;
1821 clone_of->clones = clones;
ee3f5fc0 1822 }
1823 else
1824 {
f41db742 1825 /* We are removing node with clones. This makes clones inconsistent,
ee3f5fc0 1826 but assume they will be removed subsequently and just keep clone
1827 tree intact. This can happen in unreachable function removal since
1828 we remove unreachable functions in random order, not by bottom-up
1829 walk of clone trees. */
415d1b9a 1830 for (n = clones; n; n = next)
ee3f5fc0 1831 {
1832 next = n->next_sibling_clone;
1833 n->next_sibling_clone = NULL;
1834 n->prev_sibling_clone = NULL;
1835 n->clone_of = NULL;
1836 }
1837 }
b0cdf642 1838 }
1839
a0c938f0 1840 /* While all the clones are removed after being proceeded, the function
5830087f 1841 itself is kept in the cgraph even after it is compiled. Check whether
1842 we are done with this body and reclaim it proactively if this is the case.
1843 */
35ee1c66 1844 if (symtab->state != LTO_STREAMING)
b9b49047 1845 {
de5f7a76 1846 cgraph_node *n = cgraph_node::get (decl);
b9b49047 1847 if (!n
1848 || (!n->clones && !n->clone_of && !n->global.inlined_to
e9e2b82f 1849 && ((symtab->global_info_ready || in_lto_p)
02774f2d 1850 && (TREE_ASM_WRITTEN (n->decl)
1851 || DECL_EXTERNAL (n->decl)
1852 || !n->analyzed
1853 || (!flag_wpa && n->in_other_partition)))))
415d1b9a 1854 release_body ();
b9b49047 1855 }
e9e2b82f 1856 else
1857 {
1858 lto_free_function_in_decl_state_for_node (this);
1859 lto_file_data = NULL;
1860 }
cfbe30aa 1861
415d1b9a 1862 decl = NULL;
1863 if (call_site_hash)
8df22c5c 1864 {
2ef51f0e 1865 call_site_hash->empty ();
415d1b9a 1866 call_site_hash = NULL;
8df22c5c 1867 }
8325d2de 1868
8a604555 1869 symtab->release_symbol (this);
961e3b13 1870}
1871
2cb64f78 1872/* Likewise indicate that a node is having address taken. */
1873
1874void
415d1b9a 1875cgraph_node::mark_address_taken (void)
2cb64f78 1876{
096295f6 1877 /* Indirect inlining can figure out that all uses of the address are
1878 inlined. */
415d1b9a 1879 if (global.inlined_to)
096295f6 1880 {
1881 gcc_assert (cfun->after_inlining);
415d1b9a 1882 gcc_assert (callers->indirect_inlining_edge);
096295f6 1883 return;
1884 }
c70f46b0 1885 /* FIXME: address_taken flag is used both as a shortcut for testing whether
1886 IPA_REF_ADDR reference exists (and thus it should be set on node
1887 representing alias we take address of) and as a test whether address
1888 of the object was taken (and thus it should be set on node alias is
1889 referring to). We should remove the first use and the remove the
1890 following set. */
415d1b9a 1891 address_taken = 1;
1892 cgraph_node *node = ultimate_alias_target ();
02774f2d 1893 node->address_taken = 1;
2cb64f78 1894}
1895
80a85d8a 1896/* Return local info for the compiled function. */
1897
35ee1c66 1898cgraph_local_info *
1899cgraph_node::local_info (tree decl)
80a85d8a 1900{
cc636d56 1901 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
35ee1c66 1902 cgraph_node *node = get (decl);
924de091 1903 if (!node)
1904 return NULL;
c5e076fc 1905 return &node->ultimate_alias_target ()->local;
80a85d8a 1906}
1907
28992b23 1908/* Return local info for the compiled function. */
1909
35ee1c66 1910cgraph_rtl_info *
1911cgraph_node::rtl_info (tree decl)
28992b23 1912{
cc636d56 1913 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
35ee1c66 1914 cgraph_node *node = get (decl);
c5e076fc 1915 if (!node)
1916 return NULL;
5f036000 1917 enum availability avail;
1918 node = node->ultimate_alias_target (&avail);
1919 if (decl != current_function_decl
1920 && (avail < AVAIL_AVAILABLE
1921 || (node->decl != current_function_decl
1922 && !TREE_ASM_WRITTEN (node->decl))))
28992b23 1923 return NULL;
5f036000 1924 /* Allocate if it doesn't exist. */
1925 if (node->rtl == NULL)
1926 node->rtl = ggc_cleared_alloc<cgraph_rtl_info> ();
1927 return node->rtl;
28992b23 1928}
1929
326a9581 1930/* Return a string describing the failure REASON. */
1931
1932const char*
1933cgraph_inline_failed_string (cgraph_inline_failed_t reason)
1934{
1935#undef DEFCIFCODE
4f13e575 1936#define DEFCIFCODE(code, type, string) string,
326a9581 1937
1938 static const char *cif_string_table[CIF_N_REASONS] = {
1939#include "cif-code.def"
1940 };
1941
1942 /* Signedness of an enum type is implementation defined, so cast it
1943 to unsigned before testing. */
1944 gcc_assert ((unsigned) reason < CIF_N_REASONS);
1945 return cif_string_table[reason];
1946}
1947
4f13e575 1948/* Return a type describing the failure REASON. */
1949
1950cgraph_inline_failed_type_t
1951cgraph_inline_failed_type (cgraph_inline_failed_t reason)
1952{
1953#undef DEFCIFCODE
1954#define DEFCIFCODE(code, type, string) type,
1955
1956 static cgraph_inline_failed_type_t cif_type_table[CIF_N_REASONS] = {
1957#include "cif-code.def"
1958 };
1959
1960 /* Signedness of an enum type is implementation defined, so cast it
1961 to unsigned before testing. */
1962 gcc_assert ((unsigned) reason < CIF_N_REASONS);
1963 return cif_type_table[reason];
1964}
1965
e1be32b8 1966/* Names used to print out the availability enum. */
1d416bd7 1967const char * const cgraph_availability_names[] =
f0b5f617 1968 {"unset", "not_available", "overwritable", "available", "local"};
e1be32b8 1969
c308ecc8 1970/* Output flags of edge to a file F. */
e33892d7 1971
c308ecc8 1972void
1973cgraph_edge::dump_edge_flags (FILE *f)
e33892d7 1974{
c308ecc8 1975 if (speculative)
e33892d7 1976 fprintf (f, "(speculative) ");
c308ecc8 1977 if (!inline_failed)
e33892d7 1978 fprintf (f, "(inlined) ");
0754a747 1979 if (call_stmt_cannot_inline_p)
1980 fprintf (f, "(call_stmt_cannot_inline_p) ");
c308ecc8 1981 if (indirect_inlining_edge)
e33892d7 1982 fprintf (f, "(indirect_inlining) ");
db9cef39 1983 if (count.initialized_p ())
1984 {
1985 fprintf (f, "(");
1986 count.dump (f);
151b9ff5 1987 fprintf (f, ",");
d1612523 1988 fprintf (f, "%.2f per call) ", sreal_frequency ().to_double ());
db9cef39 1989 }
c308ecc8 1990 if (can_throw_external)
e33892d7 1991 fprintf (f, "(can throw external) ");
1992}
e83c4efa 1993
415d1b9a 1994/* Dump call graph node to file F. */
e83c4efa 1995
b0cdf642 1996void
415d1b9a 1997cgraph_node::dump (FILE *f)
b0cdf642 1998{
35ee1c66 1999 cgraph_edge *edge;
799c8711 2000
415d1b9a 2001 dump_base (f);
18841b0c 2002
415d1b9a 2003 if (global.inlined_to)
0e388735 2004 fprintf (f, " Function %s is inline copy in %s\n",
2005 dump_name (),
2006 global.inlined_to->dump_name ());
415d1b9a 2007 if (clone_of)
0e388735 2008 fprintf (f, " Clone of %s\n", clone_of->dump_asm_name ());
35ee1c66 2009 if (symtab->function_flags_ready)
18841b0c 2010 fprintf (f, " Availability: %s\n",
415d1b9a 2011 cgraph_availability_names [get_availability ()]);
18841b0c 2012
415d1b9a 2013 if (profile_id)
6a261305 2014 fprintf (f, " Profile id: %i\n",
415d1b9a 2015 profile_id);
539b4873 2016 cgraph_function_version_info *vi = function_version ();
2017 if (vi != NULL)
2018 {
2019 fprintf (f, " Version info: ");
2020 if (vi->prev != NULL)
2021 {
2022 fprintf (f, "prev: ");
0e388735 2023 fprintf (f, "%s ", vi->prev->this_node->dump_asm_name ());
539b4873 2024 }
2025 if (vi->next != NULL)
2026 {
2027 fprintf (f, "next: ");
0e388735 2028 fprintf (f, "%s ", vi->next->this_node->dump_asm_name ());
539b4873 2029 }
2030 if (vi->dispatcher_resolver != NULL_TREE)
2031 fprintf (f, "dispatcher: %s",
2032 lang_hooks.decl_printable_name (vi->dispatcher_resolver, 2));
2033
2034 fprintf (f, "\n");
2035 }
18841b0c 2036 fprintf (f, " Function flags:");
db9cef39 2037 if (count.initialized_p ())
2038 {
2a4fec09 2039 fprintf (f, " count:");
db9cef39 2040 count.dump (f);
2041 }
2a4fec09 2042 if (tp_first_run > 0)
2043 fprintf (f, " first_run:%i", tp_first_run);
415d1b9a 2044 if (origin)
2a4fec09 2045 fprintf (f, " nested in:%s", origin->asm_name ());
415d1b9a 2046 if (gimple_has_body_p (decl))
75a70cf9 2047 fprintf (f, " body");
415d1b9a 2048 if (process)
09fc9532 2049 fprintf (f, " process");
415d1b9a 2050 if (local.local)
b0cdf642 2051 fprintf (f, " local");
415d1b9a 2052 if (local.redefined_extern_inline)
3f82b628 2053 fprintf (f, " redefined_extern_inline");
415d1b9a 2054 if (only_called_at_startup)
0f9fb931 2055 fprintf (f, " only_called_at_startup");
415d1b9a 2056 if (only_called_at_exit)
0f9fb931 2057 fprintf (f, " only_called_at_exit");
415d1b9a 2058 if (tm_clone)
4c0315d0 2059 fprintf (f, " tm_clone");
236594e6 2060 if (calls_comdat_local)
2061 fprintf (f, " calls_comdat_local");
52200d03 2062 if (icf_merged)
2063 fprintf (f, " icf_merged");
7d38b7bc 2064 if (merged_comdat)
2065 fprintf (f, " merged_comdat");
75e72311 2066 if (split_part)
2067 fprintf (f, " split_part");
2068 if (indirect_call_target)
2069 fprintf (f, " indirect_call_target");
04c849b3 2070 if (nonfreeing_fn)
2071 fprintf (f, " nonfreeing_fn");
415d1b9a 2072 if (DECL_STATIC_CONSTRUCTOR (decl))
2073 fprintf (f," static_constructor (priority:%i)", get_init_priority ());
2074 if (DECL_STATIC_DESTRUCTOR (decl))
2075 fprintf (f," static_destructor (priority:%i)", get_fini_priority ());
f070b34d 2076 if (frequency == NODE_FREQUENCY_HOT)
2077 fprintf (f, " hot");
2078 if (frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
2079 fprintf (f, " unlikely_executed");
2080 if (frequency == NODE_FREQUENCY_EXECUTED_ONCE)
2081 fprintf (f, " executed_once");
f070b34d 2082 if (opt_for_fn (decl, optimize_size))
2083 fprintf (f, " optimize_size");
66460ec1 2084 if (parallelized_function)
2085 fprintf (f, " parallelized_function");
4117a6c5 2086 if (DECL_IS_OPERATOR_NEW_P (decl))
2087 fprintf (f, " operator_new");
2088 if (DECL_IS_OPERATOR_DELETE_P (decl))
2089 fprintf (f, " operator_delete");
2090
b0cdf642 2091
91bf9d9a 2092 fprintf (f, "\n");
2093
415d1b9a 2094 if (thunk.thunk_p)
91bf9d9a 2095 {
48669653 2096 fprintf (f, " Thunk");
415d1b9a 2097 if (thunk.alias)
2a4fec09 2098 fprintf (f, " of %s (asm:%s)",
415d1b9a 2099 lang_hooks.decl_printable_name (thunk.alias, 2),
2100 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk.alias)));
4c7db812 2101 fprintf (f, " fixed offset %i virtual value %i indirect_offset %i "
2102 "has virtual offset %i\n",
415d1b9a 2103 (int)thunk.fixed_offset,
2104 (int)thunk.virtual_value,
4c7db812 2105 (int)thunk.indirect_offset,
415d1b9a 2106 (int)thunk.virtual_offset_p);
91bf9d9a 2107 }
e3e42b03 2108 else if (former_thunk_p ())
37b040cd 2109 fprintf (f, " Former thunk fixed offset %i virtual value %i "
2110 "indirect_offset %i has virtual offset %i\n",
2111 (int)thunk.fixed_offset,
2112 (int)thunk.virtual_value,
2113 (int)thunk.indirect_offset,
2114 (int)thunk.virtual_offset_p);
415d1b9a 2115 if (alias && thunk.alias
2116 && DECL_P (thunk.alias))
c70f46b0 2117 {
18841b0c 2118 fprintf (f, " Alias of %s",
415d1b9a 2119 lang_hooks.decl_printable_name (thunk.alias, 2));
2120 if (DECL_ASSEMBLER_NAME_SET_P (thunk.alias))
2a4fec09 2121 fprintf (f, " (asm:%s)",
415d1b9a 2122 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk.alias)));
c70f46b0 2123 fprintf (f, "\n");
2124 }
91bf9d9a 2125
18841b0c 2126 fprintf (f, " Called by: ");
91bf9d9a 2127
65cb69a0 2128 profile_count sum = profile_count::zero ();
415d1b9a 2129 for (edge = callers; edge; edge = edge->next_caller)
b0cdf642 2130 {
0e388735 2131 fprintf (f, "%s ", edge->caller->dump_name ());
c308ecc8 2132 edge->dump_edge_flags (f);
65cb69a0 2133 if (edge->count.initialized_p ())
8b754dcd 2134 sum += edge->count.ipa ();
b0cdf642 2135 }
2136
18841b0c 2137 fprintf (f, "\n Calls: ");
415d1b9a 2138 for (edge = callees; edge; edge = edge->next_callee)
b0cdf642 2139 {
0e388735 2140 fprintf (f, "%s ", edge->callee->dump_name ());
c308ecc8 2141 edge->dump_edge_flags (f);
b0cdf642 2142 }
2143 fprintf (f, "\n");
28454517 2144
151b9ff5 2145 if (count.ipa ().initialized_p ())
65cb69a0 2146 {
2147 bool ok = true;
2148 bool min = false;
2149 ipa_ref *ref;
2150
2151 FOR_EACH_ALIAS (this, ref)
2152 if (dyn_cast <cgraph_node *> (ref->referring)->count.initialized_p ())
151b9ff5 2153 sum += dyn_cast <cgraph_node *> (ref->referring)->count.ipa ();
65cb69a0 2154
2155 if (global.inlined_to
2156 || (symtab->state < EXPANSION
2157 && ultimate_alias_target () == this && only_called_directly_p ()))
8b754dcd 2158 ok = !count.ipa ().differs_from_p (sum);
151b9ff5 2159 else if (count.ipa () > profile_count::from_gcov_type (100)
2160 && count.ipa () < sum.apply_scale (99, 100))
65cb69a0 2161 ok = false, min = true;
2162 if (!ok)
2163 {
2164 fprintf (f, " Invalid sum of caller counts ");
2165 sum.dump (f);
2166 if (min)
2167 fprintf (f, ", should be at most ");
2168 else
2169 fprintf (f, ", should be ");
8b754dcd 2170 count.ipa ().dump (f);
65cb69a0 2171 fprintf (f, "\n");
2172 }
2173 }
2174
415d1b9a 2175 for (edge = indirect_calls; edge; edge = edge->next_callee)
e33892d7 2176 {
2177 if (edge->indirect_info->polymorphic)
2178 {
2179 fprintf (f, " Polymorphic indirect call of type ");
2180 print_generic_expr (f, edge->indirect_info->otr_type, TDF_SLIM);
2181 fprintf (f, " token:%i", (int) edge->indirect_info->otr_token);
2182 }
2183 else
2184 fprintf (f, " Indirect call");
c308ecc8 2185 edge->dump_edge_flags (f);
e33892d7 2186 if (edge->indirect_info->param_index != -1)
2187 {
2188 fprintf (f, " of param:%i", edge->indirect_info->param_index);
2189 if (edge->indirect_info->agg_contents)
2190 fprintf (f, " loaded from %s %s at offset %i",
2191 edge->indirect_info->member_ptr ? "member ptr" : "aggregate",
2192 edge->indirect_info->by_ref ? "passed by reference":"",
2193 (int)edge->indirect_info->offset);
43aac8cb 2194 if (edge->indirect_info->vptr_changed)
2195 fprintf (f, " (vptr maybe changed)");
e33892d7 2196 }
2197 fprintf (f, "\n");
2198 if (edge->indirect_info->polymorphic)
2199 edge->indirect_info->context.dump (f);
2200 }
b0cdf642 2201}
2202
4f6144ba 2203/* Dump call graph node to file F in graphviz format. */
2204
2205void
2206cgraph_node::dump_graphviz (FILE *f)
2207{
2208 cgraph_edge *edge;
2209
2210 for (edge = callees; edge; edge = edge->next_callee)
2211 {
2212 cgraph_node *callee = edge->callee;
2213
2214 fprintf (f, "\t\"%s\" -> \"%s\"\n", name (), callee->name ());
2215 }
2216}
2217
2218
e83c4efa 2219/* Dump call graph node NODE to stderr. */
2220
4b987fac 2221DEBUG_FUNCTION void
415d1b9a 2222cgraph_node::debug (void)
e83c4efa 2223{
415d1b9a 2224 dump (stderr);
e83c4efa 2225}
2226
e83c4efa 2227/* Dump the callgraph to file F. */
833eb724 2228
2229void
415d1b9a 2230cgraph_node::dump_cgraph (FILE *f)
833eb724 2231{
35ee1c66 2232 cgraph_node *node;
833eb724 2233
e4200070 2234 fprintf (f, "callgraph:\n\n");
7c455d87 2235 FOR_EACH_FUNCTION (node)
415d1b9a 2236 node->dump (f);
e83c4efa 2237}
2238
5bd74231 2239/* Return true when the DECL can possibly be inlined. */
415d1b9a 2240
5bd74231 2241bool
2242cgraph_function_possibly_inlined_p (tree decl)
2243{
35ee1c66 2244 if (!symtab->global_info_ready)
1c2f0012 2245 return !DECL_UNINLINABLE (decl);
e1232ce2 2246 return DECL_POSSIBLY_INLINED (decl);
b0cdf642 2247}
2248
415d1b9a 2249/* cgraph_node is no longer nested function; update cgraph accordingly. */
9d95b2b0 2250void
415d1b9a 2251cgraph_node::unnest (void)
9d95b2b0 2252{
35ee1c66 2253 cgraph_node **node2 = &origin->nested;
415d1b9a 2254 gcc_assert (origin);
9d95b2b0 2255
415d1b9a 2256 while (*node2 != this)
9d95b2b0 2257 node2 = &(*node2)->next_nested;
415d1b9a 2258 *node2 = next_nested;
2259 origin = NULL;
9d95b2b0 2260}
e1be32b8 2261
2262/* Return function availability. See cgraph.h for description of individual
2263 return values. */
2264enum availability
2f7867dc 2265cgraph_node::get_availability (symtab_node *ref)
e1be32b8 2266{
2f7867dc 2267 if (ref)
2268 {
2269 cgraph_node *cref = dyn_cast <cgraph_node *> (ref);
2270 if (cref)
2271 ref = cref->global.inlined_to;
2272 }
e1be32b8 2273 enum availability avail;
415d1b9a 2274 if (!analyzed)
e1be32b8 2275 avail = AVAIL_NOT_AVAILABLE;
415d1b9a 2276 else if (local.local)
e1be32b8 2277 avail = AVAIL_LOCAL;
2f7867dc 2278 else if (global.inlined_to)
2279 avail = AVAIL_AVAILABLE;
e0dec29d 2280 else if (transparent_alias)
2f7867dc 2281 ultimate_alias_target (&avail, ref);
b859b598 2282 else if (ifunc_resolver
280ce47d 2283 || lookup_attribute ("noipa", DECL_ATTRIBUTES (decl)))
415d1b9a 2284 avail = AVAIL_INTERPOSABLE;
2285 else if (!externally_visible)
e1be32b8 2286 avail = AVAIL_AVAILABLE;
2f7867dc 2287 /* If this is a reference from symbol itself and there are no aliases, we
72b4723c 2288 may be sure that the symbol was not interposed by something else because
2f7867dc 2289 the symbol itself would be unreachable otherwise.
2290
2291 Also comdat groups are always resolved in groups. */
2292 else if ((this == ref && !has_aliases_p ())
2293 || (ref && get_comdat_group ()
2294 && get_comdat_group () == ref->get_comdat_group ()))
2295 avail = AVAIL_AVAILABLE;
0a10fd82 2296 /* Inline functions are safe to be analyzed even if their symbol can
2297 be overwritten at runtime. It is not meaningful to enforce any sane
67cf9b55 2298 behavior on replacing inline function by different body. */
415d1b9a 2299 else if (DECL_DECLARED_INLINE_P (decl))
cc76f102 2300 avail = AVAIL_AVAILABLE;
e1be32b8 2301
2302 /* If the function can be overwritten, return OVERWRITABLE. Take
2303 care at least of two notable extensions - the COMDAT functions
2304 used to share template instantiations in C++ (this is symmetric
2305 to code cp_cannot_inline_tree_fn and probably shall be shared and
2f7867dc 2306 the inlinability hooks completely eliminated). */
cc76f102 2307
415d1b9a 2308 else if (decl_replaceable_p (decl) && !DECL_EXTERNAL (decl))
2309 avail = AVAIL_INTERPOSABLE;
e1be32b8 2310 else avail = AVAIL_AVAILABLE;
2311
2312 return avail;
2313}
2314
74fa5f1c 2315/* Worker for cgraph_node_can_be_local_p. */
2316static bool
35ee1c66 2317cgraph_node_cannot_be_local_p_1 (cgraph_node *node, void *)
74fa5f1c 2318{
02774f2d 2319 return !(!node->force_output
2320 && ((DECL_COMDAT (node->decl)
2321 && !node->forced_by_abi
415d1b9a 2322 && !node->used_from_object_file_p ()
02774f2d 2323 && !node->same_comdat_group)
2324 || !node->externally_visible));
74fa5f1c 2325}
2326
415d1b9a 2327/* Return true if cgraph_node can be made local for API change.
9967e578 2328 Extern inline functions and C++ COMDAT functions can be made local
2329 at the expense of possible code size growth if function is used in multiple
2330 compilation units. */
2331bool
415d1b9a 2332cgraph_node::can_be_local_p (void)
9967e578 2333{
415d1b9a 2334 return (!address_taken
2335 && !call_for_symbol_thunks_and_aliases (cgraph_node_cannot_be_local_p_1,
2336 NULL, true));
9967e578 2337}
2338
cfd85d03 2339/* Call callback on cgraph_node, thunks and aliases associated to cgraph_node.
aaa36a78 2340 When INCLUDE_OVERWRITABLE is false, overwritable symbols are
cfd85d03 2341 skipped. When EXCLUDE_VIRTUAL_THUNKS is true, virtual thunks are
2342 skipped. */
74fa5f1c 2343bool
415d1b9a 2344cgraph_node::call_for_symbol_thunks_and_aliases (bool (*callback)
2345 (cgraph_node *, void *),
2346 void *data,
cfd85d03 2347 bool include_overwritable,
2348 bool exclude_virtual_thunks)
74fa5f1c 2349{
35ee1c66 2350 cgraph_edge *e;
2351 ipa_ref *ref;
aaa36a78 2352 enum availability avail = AVAIL_AVAILABLE;
74fa5f1c 2353
aaa36a78 2354 if (include_overwritable
2355 || (avail = get_availability ()) > AVAIL_INTERPOSABLE)
2356 {
2357 if (callback (this, data))
2358 return true;
2359 }
7feaa33e 2360 FOR_EACH_ALIAS (this, ref)
2361 {
2362 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2363 if (include_overwritable
2364 || alias->get_availability () > AVAIL_INTERPOSABLE)
2365 if (alias->call_for_symbol_thunks_and_aliases (callback, data,
2366 include_overwritable,
2367 exclude_virtual_thunks))
2368 return true;
2369 }
aaa36a78 2370 if (avail <= AVAIL_INTERPOSABLE)
530dc126 2371 return false;
415d1b9a 2372 for (e = callers; e; e = e->next_caller)
74fa5f1c 2373 if (e->caller->thunk.thunk_p
2374 && (include_overwritable
cfd85d03 2375 || e->caller->get_availability () > AVAIL_INTERPOSABLE)
2376 && !(exclude_virtual_thunks
2377 && e->caller->thunk.virtual_offset_p))
415d1b9a 2378 if (e->caller->call_for_symbol_thunks_and_aliases (callback, data,
cfd85d03 2379 include_overwritable,
2380 exclude_virtual_thunks))
794fd282 2381 return true;
e4a2b488 2382
74fa5f1c 2383 return false;
2384}
2385
74fa5f1c 2386/* Worker to bring NODE local. */
2387
415d1b9a 2388bool
35ee1c66 2389cgraph_node::make_local (cgraph_node *node, void *)
74fa5f1c 2390{
415d1b9a 2391 gcc_checking_assert (node->can_be_local_p ());
02774f2d 2392 if (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
9967e578 2393 {
415d1b9a 2394 node->make_decl_local ();
aca3df3b 2395 node->set_section (NULL);
71e19e54 2396 node->set_comdat_group (NULL);
02774f2d 2397 node->externally_visible = false;
2398 node->forced_by_abi = false;
9967e578 2399 node->local.local = true;
aca3df3b 2400 node->set_section (NULL);
c7549d13 2401 node->unique_name = ((node->resolution == LDPR_PREVAILING_DEF_IRONLY
2402 || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
2403 && !flag_incremental_link);
02774f2d 2404 node->resolution = LDPR_PREVAILING_DEF_IRONLY;
415d1b9a 2405 gcc_assert (node->get_availability () == AVAIL_LOCAL);
9967e578 2406 }
74fa5f1c 2407 return false;
9967e578 2408}
2409
415d1b9a 2410/* Bring cgraph node local. */
74fa5f1c 2411
2412void
415d1b9a 2413cgraph_node::make_local (void)
74fa5f1c 2414{
415d1b9a 2415 call_for_symbol_thunks_and_aliases (cgraph_node::make_local, NULL, true);
74fa5f1c 2416}
2417
2418/* Worker to set nothrow flag. */
2419
ace7bf06 2420static void
2421set_nothrow_flag_1 (cgraph_node *node, bool nothrow, bool non_call,
2422 bool *changed)
74fa5f1c 2423{
35ee1c66 2424 cgraph_edge *e;
8c1fce46 2425
ace7bf06 2426 if (nothrow && !TREE_NOTHROW (node->decl))
2427 {
2428 /* With non-call exceptions we can't say for sure if other function body
2429 was not possibly optimized to stil throw. */
2430 if (!non_call || node->binds_to_current_def_p ())
2431 {
2432 TREE_NOTHROW (node->decl) = true;
2433 *changed = true;
2434 for (e = node->callers; e; e = e->next_caller)
2435 e->can_throw_external = false;
2436 }
2437 }
2438 else if (!nothrow && TREE_NOTHROW (node->decl))
2439 {
2440 TREE_NOTHROW (node->decl) = false;
2441 *changed = true;
2442 }
2443 ipa_ref *ref;
2444 FOR_EACH_ALIAS (node, ref)
2445 {
2446 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2447 if (!nothrow || alias->get_availability () > AVAIL_INTERPOSABLE)
2448 set_nothrow_flag_1 (alias, nothrow, non_call, changed);
2449 }
2450 for (cgraph_edge *e = node->callers; e; e = e->next_caller)
2451 if (e->caller->thunk.thunk_p
2452 && (!nothrow || e->caller->get_availability () > AVAIL_INTERPOSABLE))
2453 set_nothrow_flag_1 (e->caller, nothrow, non_call, changed);
74fa5f1c 2454}
2455
2456/* Set TREE_NOTHROW on NODE's decl and on aliases of NODE
16fcf0f4 2457 if any to NOTHROW. */
2458
ace7bf06 2459bool
415d1b9a 2460cgraph_node::set_nothrow_flag (bool nothrow)
16fcf0f4 2461{
ace7bf06 2462 bool changed = false;
2463 bool non_call = opt_for_fn (decl, flag_non_call_exceptions);
2464
2465 if (!nothrow || get_availability () > AVAIL_INTERPOSABLE)
2466 set_nothrow_flag_1 (this, nothrow, non_call, &changed);
2467 else
2468 {
2469 ipa_ref *ref;
2470
2471 FOR_EACH_ALIAS (this, ref)
2472 {
2473 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2474 if (!nothrow || alias->get_availability () > AVAIL_INTERPOSABLE)
2475 set_nothrow_flag_1 (alias, nothrow, non_call, &changed);
2476 }
2477 }
2478 return changed;
16fcf0f4 2479}
2480
bd5ef087 2481/* Worker to set malloc flag. */
2482static void
2483set_malloc_flag_1 (cgraph_node *node, bool malloc_p, bool *changed)
2484{
2485 if (malloc_p && !DECL_IS_MALLOC (node->decl))
2486 {
2487 DECL_IS_MALLOC (node->decl) = true;
2488 *changed = true;
2489 }
2490
2491 ipa_ref *ref;
2492 FOR_EACH_ALIAS (node, ref)
2493 {
2494 cgraph_node *alias = dyn_cast<cgraph_node *> (ref->referring);
2495 if (!malloc_p || alias->get_availability () > AVAIL_INTERPOSABLE)
2496 set_malloc_flag_1 (alias, malloc_p, changed);
2497 }
2498
2499 for (cgraph_edge *e = node->callers; e; e = e->next_caller)
2500 if (e->caller->thunk.thunk_p
2501 && (!malloc_p || e->caller->get_availability () > AVAIL_INTERPOSABLE))
2502 set_malloc_flag_1 (e->caller, malloc_p, changed);
2503}
2504
2505/* Set DECL_IS_MALLOC on NODE's decl and on NODE's aliases if any. */
2506
2507bool
2508cgraph_node::set_malloc_flag (bool malloc_p)
2509{
2510 bool changed = false;
2511
2512 if (!malloc_p || get_availability () > AVAIL_INTERPOSABLE)
2513 set_malloc_flag_1 (this, malloc_p, &changed);
2514 else
2515 {
2516 ipa_ref *ref;
2517
2518 FOR_EACH_ALIAS (this, ref)
2519 {
2520 cgraph_node *alias = dyn_cast<cgraph_node *> (ref->referring);
2521 if (!malloc_p || alias->get_availability () > AVAIL_INTERPOSABLE)
2522 set_malloc_flag_1 (alias, malloc_p, &changed);
2523 }
2524 }
2525 return changed;
2526}
2527
530dc126 2528/* Worker to set_const_flag. */
16fcf0f4 2529
530dc126 2530static void
2531set_const_flag_1 (cgraph_node *node, bool set_const, bool looping,
2532 bool *changed)
16fcf0f4 2533{
7f74ac6b 2534 /* Static constructors and destructors without a side effect can be
2535 optimized out. */
530dc126 2536 if (set_const && !looping)
7f74ac6b 2537 {
02774f2d 2538 if (DECL_STATIC_CONSTRUCTOR (node->decl))
530dc126 2539 {
2540 DECL_STATIC_CONSTRUCTOR (node->decl) = 0;
2541 *changed = true;
2542 }
02774f2d 2543 if (DECL_STATIC_DESTRUCTOR (node->decl))
530dc126 2544 {
2545 DECL_STATIC_DESTRUCTOR (node->decl) = 0;
2546 *changed = true;
2547 }
7f74ac6b 2548 }
530dc126 2549 if (!set_const)
2550 {
2551 if (TREE_READONLY (node->decl))
2552 {
2553 TREE_READONLY (node->decl) = 0;
2554 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2555 *changed = true;
2556 }
2557 }
2558 else
2559 {
2560 /* Consider function:
8b4ee73c 2561
530dc126 2562 bool a(int *p)
2563 {
2564 return *p==*p;
2565 }
8b4ee73c 2566
530dc126 2567 During early optimization we will turn this into:
8b4ee73c 2568
530dc126 2569 bool a(int *p)
2570 {
2571 return true;
2572 }
8b4ee73c 2573
530dc126 2574 Now if this function will be detected as CONST however when interposed
2575 it may end up being just pure. We always must assume the worst
2576 scenario here. */
2577 if (TREE_READONLY (node->decl))
2578 {
2579 if (!looping && DECL_LOOPING_CONST_OR_PURE_P (node->decl))
2580 {
2581 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2582 *changed = true;
2583 }
2584 }
2585 else if (node->binds_to_current_def_p ())
2586 {
2587 TREE_READONLY (node->decl) = true;
2588 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = looping;
2589 DECL_PURE_P (node->decl) = false;
2590 *changed = true;
2591 }
2592 else
2593 {
2594 if (dump_file && (dump_flags & TDF_DETAILS))
2595 fprintf (dump_file, "Dropping state to PURE because function does "
2596 "not bind to current def.\n");
2597 if (!DECL_PURE_P (node->decl))
2598 {
2599 DECL_PURE_P (node->decl) = true;
2600 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = looping;
2601 *changed = true;
2602 }
2603 else if (!looping && DECL_LOOPING_CONST_OR_PURE_P (node->decl))
2604 {
2605 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2606 *changed = true;
2607 }
2608 }
2609 }
8b4ee73c 2610
530dc126 2611 ipa_ref *ref;
2612 FOR_EACH_ALIAS (node, ref)
8b4ee73c 2613 {
530dc126 2614 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2615 if (!set_const || alias->get_availability () > AVAIL_INTERPOSABLE)
2616 set_const_flag_1 (alias, set_const, looping, changed);
8b4ee73c 2617 }
530dc126 2618 for (cgraph_edge *e = node->callers; e; e = e->next_caller)
2619 if (e->caller->thunk.thunk_p
2620 && (!set_const || e->caller->get_availability () > AVAIL_INTERPOSABLE))
2621 {
2622 /* Virtual thunks access virtual offset in the vtable, so they can
2623 only be pure, never const. */
2624 if (set_const
2625 && (e->caller->thunk.virtual_offset_p
2626 || !node->binds_to_current_def_p (e->caller)))
2627 *changed |= e->caller->set_pure_flag (true, looping);
2628 else
2629 set_const_flag_1 (e->caller, set_const, looping, changed);
2630 }
16fcf0f4 2631}
2632
530dc126 2633/* If SET_CONST is true, mark function, aliases and thunks to be ECF_CONST.
2634 If SET_CONST if false, clear the flag.
16fcf0f4 2635
530dc126 2636 When setting the flag be careful about possible interposition and
2637 do not set the flag for functions that can be interposet and set pure
2638 flag for functions that can bind to other definition.
2639
2640 Return true if any change was done. */
2641
2642bool
2643cgraph_node::set_const_flag (bool set_const, bool looping)
16fcf0f4 2644{
530dc126 2645 bool changed = false;
2646 if (!set_const || get_availability () > AVAIL_INTERPOSABLE)
2647 set_const_flag_1 (this, set_const, looping, &changed);
2648 else
2649 {
2650 ipa_ref *ref;
2651
2652 FOR_EACH_ALIAS (this, ref)
2653 {
2654 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2655 if (!set_const || alias->get_availability () > AVAIL_INTERPOSABLE)
2656 set_const_flag_1 (alias, set_const, looping, &changed);
2657 }
2658 }
2659 return changed;
74fa5f1c 2660}
2661
530dc126 2662/* Info used by set_pure_flag_1. */
2663
ace7bf06 2664struct set_pure_flag_info
530dc126 2665{
2666 bool pure;
2667 bool looping;
2668 bool changed;
2669};
2670
2671/* Worker to set_pure_flag. */
74fa5f1c 2672
2673static bool
530dc126 2674set_pure_flag_1 (cgraph_node *node, void *data)
74fa5f1c 2675{
530dc126 2676 struct set_pure_flag_info *info = (struct set_pure_flag_info *)data;
c99756c1 2677 /* Static constructors and destructors without a side effect can be
7f74ac6b 2678 optimized out. */
530dc126 2679 if (info->pure && !info->looping)
7f74ac6b 2680 {
02774f2d 2681 if (DECL_STATIC_CONSTRUCTOR (node->decl))
530dc126 2682 {
2683 DECL_STATIC_CONSTRUCTOR (node->decl) = 0;
2684 info->changed = true;
2685 }
02774f2d 2686 if (DECL_STATIC_DESTRUCTOR (node->decl))
530dc126 2687 {
2688 DECL_STATIC_DESTRUCTOR (node->decl) = 0;
2689 info->changed = true;
2690 }
2691 }
2692 if (info->pure)
2693 {
2694 if (!DECL_PURE_P (node->decl) && !TREE_READONLY (node->decl))
2695 {
2696 DECL_PURE_P (node->decl) = true;
2697 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = info->looping;
2698 info->changed = true;
2699 }
2700 else if (DECL_LOOPING_CONST_OR_PURE_P (node->decl)
2701 && !info->looping)
2702 {
2703 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2704 info->changed = true;
2705 }
2706 }
2707 else
2708 {
2709 if (DECL_PURE_P (node->decl))
2710 {
2711 DECL_PURE_P (node->decl) = false;
2712 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2713 info->changed = true;
2714 }
7f74ac6b 2715 }
74fa5f1c 2716 return false;
16fcf0f4 2717}
2718
415d1b9a 2719/* Set DECL_PURE_P on cgraph_node's decl and on aliases of the node
530dc126 2720 if any to PURE.
74fa5f1c 2721
530dc126 2722 When setting the flag, be careful about possible interposition.
2723 Return true if any change was done. */
2724
2725bool
415d1b9a 2726cgraph_node::set_pure_flag (bool pure, bool looping)
5ea60108 2727{
530dc126 2728 struct set_pure_flag_info info = {pure, looping, false};
530dc126 2729 call_for_symbol_thunks_and_aliases (set_pure_flag_1, &info, !pure, true);
2730 return info.changed;
74fa5f1c 2731}
0f9fb931 2732
f4d3c071 2733/* Return true when cgraph_node cannot return or throw and thus
fc94a528 2734 it is safe to ignore its side effects for IPA analysis. */
2735
2736bool
415d1b9a 2737cgraph_node::cannot_return_p (void)
fc94a528 2738{
415d1b9a 2739 int flags = flags_from_decl_or_type (decl);
1697db31 2740 if (!opt_for_fn (decl, flag_exceptions))
fc94a528 2741 return (flags & ECF_NORETURN) != 0;
2742 else
2743 return ((flags & (ECF_NORETURN | ECF_NOTHROW))
2744 == (ECF_NORETURN | ECF_NOTHROW));
2745}
2746
f4d3c071 2747/* Return true when call of edge cannot lead to return from caller
fc94a528 2748 and thus it is safe to ignore its side effects for IPA analysis
2749 when computing side effects of the caller.
2750 FIXME: We could actually mark all edges that have no reaching
efee62d1 2751 patch to the exit block or throw to get better results. */
fc94a528 2752bool
35ee1c66 2753cgraph_edge::cannot_lead_to_return_p (void)
fc94a528 2754{
35ee1c66 2755 if (caller->cannot_return_p ())
023a28e1 2756 return true;
35ee1c66 2757 if (indirect_unknown_callee)
fc94a528 2758 {
35ee1c66 2759 int flags = indirect_info->ecf_flags;
1697db31 2760 if (!opt_for_fn (caller->decl, flag_exceptions))
fc94a528 2761 return (flags & ECF_NORETURN) != 0;
2762 else
2763 return ((flags & (ECF_NORETURN | ECF_NOTHROW))
2764 == (ECF_NORETURN | ECF_NOTHROW));
2765 }
2766 else
35ee1c66 2767 return callee->cannot_return_p ();
fc94a528 2768}
2769
8070b8d5 2770/* Return true if the edge may be considered hot. */
e5a23585 2771
2772bool
2773cgraph_edge::maybe_hot_p (void)
2774{
151b9ff5 2775 if (!maybe_hot_count_p (NULL, count.ipa ()))
e5a23585 2776 return false;
2777 if (caller->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
2778 || (callee
2779 && callee->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED))
2780 return false;
2781 if (caller->frequency > NODE_FREQUENCY_UNLIKELY_EXECUTED
2782 && (callee
2783 && callee->frequency <= NODE_FREQUENCY_EXECUTED_ONCE))
2784 return false;
1697db31 2785 if (opt_for_fn (caller->decl, optimize_size))
2786 return false;
e5a23585 2787 if (caller->frequency == NODE_FREQUENCY_HOT)
2788 return true;
db9cef39 2789 /* If profile is now known yet, be conservative.
2790 FIXME: this predicate is used by early inliner and can do better there. */
2791 if (symtab->state < IPA_SSA)
2792 return true;
e5a23585 2793 if (caller->frequency == NODE_FREQUENCY_EXECUTED_ONCE
d1612523 2794 && sreal_frequency () * 2 < 3)
2795 return false;
8070b8d5 2796 if (sreal_frequency () * PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION) <= 1)
e5a23585 2797 return false;
e5a23585 2798 return true;
2799}
2800
794fd282 2801/* Worker for cgraph_can_remove_if_no_direct_calls_p. */
2802
2803static bool
35ee1c66 2804nonremovable_p (cgraph_node *node, void *)
794fd282 2805{
415d1b9a 2806 return !node->can_remove_if_no_direct_calls_and_refs_p ();
794fd282 2807}
2808
e88fecaf 2809/* Return true if whole comdat group can be removed if there are no direct
2810 calls to THIS. */
794fd282 2811
2812bool
b12b920e 2813cgraph_node::can_remove_if_no_direct_calls_p (bool will_inline)
794fd282 2814{
e88fecaf 2815 struct ipa_ref *ref;
2816
2817 /* For local symbols or non-comdat group it is the same as
2818 can_remove_if_no_direct_calls_p. */
2819 if (!externally_visible || !same_comdat_group)
2820 {
2821 if (DECL_EXTERNAL (decl))
2822 return true;
2823 if (address_taken)
2824 return false;
2825 return !call_for_symbol_and_aliases (nonremovable_p, NULL, true);
2826 }
2827
b12b920e 2828 if (will_inline && address_taken)
2829 return false;
2830
e88fecaf 2831 /* Otheriwse check if we can remove the symbol itself and then verify
2832 that only uses of the comdat groups are direct call to THIS
2833 or its aliases. */
2834 if (!can_remove_if_no_direct_calls_and_refs_p ())
794fd282 2835 return false;
e88fecaf 2836
2837 /* Check that all refs come from within the comdat group. */
2838 for (int i = 0; iterate_referring (i, ref); i++)
2839 if (ref->referring->get_comdat_group () != get_comdat_group ())
2840 return false;
2841
2842 struct cgraph_node *target = ultimate_alias_target ();
2843 for (cgraph_node *next = dyn_cast<cgraph_node *> (same_comdat_group);
2844 next != this; next = dyn_cast<cgraph_node *> (next->same_comdat_group))
2845 {
2846 if (!externally_visible)
2847 continue;
2848 if (!next->alias
2849 && !next->can_remove_if_no_direct_calls_and_refs_p ())
2850 return false;
2851
2852 /* If we see different symbol than THIS, be sure to check calls. */
2853 if (next->ultimate_alias_target () != target)
2854 for (cgraph_edge *e = next->callers; e; e = e->next_caller)
b12b920e 2855 if (e->caller->get_comdat_group () != get_comdat_group ()
2856 || will_inline)
e88fecaf 2857 return false;
2858
b12b920e 2859 /* If function is not being inlined, we care only about
2860 references outside of the comdat group. */
2861 if (!will_inline)
2862 for (int i = 0; next->iterate_referring (i, ref); i++)
2863 if (ref->referring->get_comdat_group () != get_comdat_group ())
2864 return false;
e88fecaf 2865 }
2866 return true;
794fd282 2867}
2868
415d1b9a 2869/* Return true when function cgraph_node can be expected to be removed
69b18a8b 2870 from program when direct calls in this compilation unit are removed.
2871
2872 As a special case COMDAT functions are
2873 cgraph_can_remove_if_no_direct_calls_p while the are not
2874 cgraph_only_called_directly_p (it is possible they are called from other
2875 unit)
2876
2877 This function behaves as cgraph_only_called_directly_p because eliminating
0a10fd82 2878 all uses of COMDAT function does not make it necessarily disappear from
69b18a8b 2879 the program unless we are compiling whole program or we do LTO. In this
2880 case we know we win since dynamic linking will not really discard the
2881 linkonce section. */
2882
2883bool
b12b920e 2884cgraph_node::will_be_removed_from_program_if_no_direct_calls_p
2885 (bool will_inline)
69b18a8b 2886{
415d1b9a 2887 gcc_assert (!global.inlined_to);
e88fecaf 2888 if (DECL_EXTERNAL (decl))
2889 return true;
415d1b9a 2890
69b18a8b 2891 if (!in_lto_p && !flag_whole_program)
7f74ac6b 2892 {
e88fecaf 2893 /* If the symbol is in comdat group, we need to verify that whole comdat
2894 group becomes unreachable. Technically we could skip references from
2895 within the group, too. */
2896 if (!only_called_directly_p ())
2897 return false;
2898 if (same_comdat_group && externally_visible)
2899 {
2900 struct cgraph_node *target = ultimate_alias_target ();
b12b920e 2901
2902 if (will_inline && address_taken)
2903 return true;
e88fecaf 2904 for (cgraph_node *next = dyn_cast<cgraph_node *> (same_comdat_group);
2905 next != this;
2906 next = dyn_cast<cgraph_node *> (next->same_comdat_group))
2907 {
2908 if (!externally_visible)
2909 continue;
2910 if (!next->alias
2911 && !next->only_called_directly_p ())
2912 return false;
2913
2914 /* If we see different symbol than THIS,
2915 be sure to check calls. */
2916 if (next->ultimate_alias_target () != target)
2917 for (cgraph_edge *e = next->callers; e; e = e->next_caller)
b12b920e 2918 if (e->caller->get_comdat_group () != get_comdat_group ()
2919 || will_inline)
e88fecaf 2920 return false;
e88fecaf 2921 }
2922 }
2923 return true;
7f74ac6b 2924 }
e88fecaf 2925 else
b12b920e 2926 return can_remove_if_no_direct_calls_p (will_inline);
69b18a8b 2927}
2928
9ced88d0 2929
74fa5f1c 2930/* Worker for cgraph_only_called_directly_p. */
2931
2932static bool
35ee1c66 2933cgraph_not_only_called_directly_p_1 (cgraph_node *node, void *)
74fa5f1c 2934{
415d1b9a 2935 return !node->only_called_directly_or_aliased_p ();
74fa5f1c 2936}
2937
415d1b9a 2938/* Return true when function cgraph_node and all its aliases are only called
74fa5f1c 2939 directly.
2940 i.e. it is not externally visible, address was not taken and
2941 it is not used in any other non-standard way. */
2942
2943bool
415d1b9a 2944cgraph_node::only_called_directly_p (void)
74fa5f1c 2945{
415d1b9a 2946 gcc_assert (ultimate_alias_target () == this);
2947 return !call_for_symbol_and_aliases (cgraph_not_only_called_directly_p_1,
74fa5f1c 2948 NULL, true);
2949}
2950
2951
2952/* Collect all callers of NODE. Worker for collect_callers_of_node. */
2953
2954static bool
35ee1c66 2955collect_callers_of_node_1 (cgraph_node *node, void *data)
74fa5f1c 2956{
415d1b9a 2957 vec<cgraph_edge *> *redirect_callers = (vec<cgraph_edge *> *)data;
35ee1c66 2958 cgraph_edge *cs;
74fa5f1c 2959 enum availability avail;
415d1b9a 2960 node->ultimate_alias_target (&avail);
74fa5f1c 2961
415d1b9a 2962 if (avail > AVAIL_INTERPOSABLE)
74fa5f1c 2963 for (cs = node->callers; cs != NULL; cs = cs->next_caller)
f6bd593a 2964 if (!cs->indirect_inlining_edge
2965 && !cs->caller->thunk.thunk_p)
f1f41a6c 2966 redirect_callers->safe_push (cs);
74fa5f1c 2967 return false;
2968}
2969
415d1b9a 2970/* Collect all callers of cgraph_node and its aliases that are known to lead to
2971 cgraph_node (i.e. are not overwritable). */
74fa5f1c 2972
415d1b9a 2973vec<cgraph_edge *>
2974cgraph_node::collect_callers (void)
74fa5f1c 2975{
415d1b9a 2976 vec<cgraph_edge *> redirect_callers = vNULL;
2977 call_for_symbol_thunks_and_aliases (collect_callers_of_node_1,
2978 &redirect_callers, false);
74fa5f1c 2979 return redirect_callers;
2980}
2981
e3e42b03 2982
2983/* Return TRUE if NODE2 a clone of NODE or is equivalent to it. Return
2984 optimistically true if this cannot be determined. */
98d52bcd 2985
da5e1e7c 2986static bool
35ee1c66 2987clone_of_p (cgraph_node *node, cgraph_node *node2)
da5e1e7c 2988{
415d1b9a 2989 node = node->ultimate_alias_target ();
2990 node2 = node2->ultimate_alias_target ();
98d52bcd 2991
fc01d804 2992 if (node2->clone_of == node
2993 || node2->former_clone_of == node->decl)
2994 return true;
2995
2996 if (!node->thunk.thunk_p && !node->former_thunk_p ())
2997 {
2998 while (node2 && node->decl != node2->decl)
2999 node2 = node2->clone_of;
3000 return node2 != NULL;
3001 }
3002
98d52bcd 3003 /* There are no virtual clones of thunks so check former_clone_of or if we
3004 might have skipped thunks because this adjustments are no longer
3005 necessary. */
e3e42b03 3006 while (node->thunk.thunk_p || node->former_thunk_p ())
98d52bcd 3007 {
98d52bcd 3008 if (!node->thunk.this_adjusting)
3009 return false;
e3e42b03 3010 /* In case of instrumented expanded thunks, which can have multiple calls
3011 in them, we do not know how to continue and just have to be
3012 optimistic. */
3013 if (node->callees->next_callee)
3014 return true;
415d1b9a 3015 node = node->callees->callee->ultimate_alias_target ();
98d52bcd 3016
543e8d1d 3017 if (!node2->clone.args_to_skip
3018 || !bitmap_bit_p (node2->clone.args_to_skip, 0))
3019 return false;
3020 if (node2->former_clone_of == node->decl)
3021 return true;
fc01d804 3022
3023 cgraph_node *n2 = node2;
3024 while (n2 && node->decl != n2->decl)
3025 n2 = n2->clone_of;
3026 if (n2)
3027 return true;
543e8d1d 3028 }
98d52bcd 3029
fc01d804 3030 return false;
da5e1e7c 3031}
3032
c308ecc8 3033/* Verify edge count and frequency. */
da5e1e7c 3034
c308ecc8 3035bool
151b9ff5 3036cgraph_edge::verify_count ()
da5e1e7c 3037{
3038 bool error_found = false;
205ce1aa 3039 if (!count.verify ())
da5e1e7c 3040 {
205ce1aa 3041 error ("caller edge count invalid");
3042 error_found = true;
3043 }
da5e1e7c 3044 return error_found;
3045}
3046
3047/* Switch to THIS_CFUN if needed and print STMT to stderr. */
3048static void
42acab1c 3049cgraph_debug_gimple_stmt (function *this_cfun, gimple *stmt)
da5e1e7c 3050{
38bc09df 3051 bool fndecl_was_null = false;
da5e1e7c 3052 /* debug_gimple_stmt needs correct cfun */
3053 if (cfun != this_cfun)
3054 set_cfun (this_cfun);
38bc09df 3055 /* ...and an actual current_function_decl */
3056 if (!current_function_decl)
3057 {
3058 current_function_decl = this_cfun->decl;
3059 fndecl_was_null = true;
3060 }
da5e1e7c 3061 debug_gimple_stmt (stmt);
38bc09df 3062 if (fndecl_was_null)
3063 current_function_decl = NULL;
da5e1e7c 3064}
3065
c308ecc8 3066/* Verify that call graph edge corresponds to DECL from the associated
da5e1e7c 3067 statement. Return true if the verification should fail. */
3068
c308ecc8 3069bool
3070cgraph_edge::verify_corresponds_to_fndecl (tree decl)
da5e1e7c 3071{
35ee1c66 3072 cgraph_node *node;
da5e1e7c 3073
c308ecc8 3074 if (!decl || callee->global.inlined_to)
da5e1e7c 3075 return false;
35ee1c66 3076 if (symtab->state == LTO_STREAMING)
da4b8721 3077 return false;
415d1b9a 3078 node = cgraph_node::get (decl);
da5e1e7c 3079
3080 /* We do not know if a node from a different partition is an alias or what it
fa4052b3 3081 aliases and therefore cannot do the former_clone_of check reliably. When
3082 body_removed is set, we have lost all information about what was alias or
3083 thunk of and also cannot proceed. */
3084 if (!node
3085 || node->body_removed
3086 || node->in_other_partition
ce7711df 3087 || callee->icf_merged
c308ecc8 3088 || callee->in_other_partition)
da5e1e7c 3089 return false;
5a7ad253 3090
415d1b9a 3091 node = node->ultimate_alias_target ();
3092
5a7ad253 3093 /* Optimizers can redirect unreachable calls or calls triggering undefined
67cf9b55 3094 behavior to builtin_unreachable. */
a0e9bfbb 3095
3096 if (fndecl_built_in_p (callee->decl, BUILT_IN_UNREACHABLE))
da5e1e7c 3097 return false;
da5e1e7c 3098
c308ecc8 3099 if (callee->former_clone_of != node->decl
3100 && (node != callee->ultimate_alias_target ())
3101 && !clone_of_p (node, callee))
da5e1e7c 3102 return true;
3103 else
3104 return false;
3105}
3106
62c34df8 3107/* Disable warnings about missing quoting in GCC diagnostics for
3108 the verification errors. Their format strings don't follow GCC
3109 diagnostic conventions and the calls are ultimately followed by
3110 one to internal_error. */
3111#if __GNUC__ >= 10
3112# pragma GCC diagnostic push
3113# pragma GCC diagnostic ignored "-Wformat-diag"
3114#endif
3115
da5e1e7c 3116/* Verify cgraph nodes of given cgraph node. */
3117DEBUG_FUNCTION void
415d1b9a 3118cgraph_node::verify_node (void)
da5e1e7c 3119{
35ee1c66 3120 cgraph_edge *e;
3121 function *this_cfun = DECL_STRUCT_FUNCTION (decl);
da5e1e7c 3122 basic_block this_block;
3123 gimple_stmt_iterator gsi;
3124 bool error_found = false;
3125
3126 if (seen_error ())
3127 return;
3128
3129 timevar_push (TV_CGRAPH_VERIFY);
415d1b9a 3130 error_found |= verify_base ();
3131 for (e = callees; e; e = e->next_callee)
da5e1e7c 3132 if (e->aux)
3133 {
3134 error ("aux field set for edge %s->%s",
f1c8b4d7 3135 identifier_to_locale (e->caller->name ()),
3136 identifier_to_locale (e->callee->name ()));
da5e1e7c 3137 error_found = true;
3138 }
205ce1aa 3139 if (!count.verify ())
3140 {
3141 error ("cgraph count invalid");
3142 error_found = true;
3143 }
415d1b9a 3144 if (global.inlined_to && same_comdat_group)
cf951b1a 3145 {
3146 error ("inline clone in same comdat group list");
3147 error_found = true;
3148 }
415d1b9a 3149 if (!definition && !in_other_partition && local.local)
15ca8f90 3150 {
3151 error ("local symbols must be defined");
3152 error_found = true;
3153 }
415d1b9a 3154 if (global.inlined_to && externally_visible)
da5e1e7c 3155 {
3156 error ("externally visible inline clone");
3157 error_found = true;
3158 }
415d1b9a 3159 if (global.inlined_to && address_taken)
da5e1e7c 3160 {
3161 error ("inline clone with address taken");
3162 error_found = true;
3163 }
415d1b9a 3164 if (global.inlined_to && force_output)
da5e1e7c 3165 {
3166 error ("inline clone is forced to output");
3167 error_found = true;
3168 }
415d1b9a 3169 for (e = indirect_calls; e; e = e->next_callee)
da5e1e7c 3170 {
3171 if (e->aux)
3172 {
3173 error ("aux field set for indirect edge from %s",
f1c8b4d7 3174 identifier_to_locale (e->caller->name ()));
da5e1e7c 3175 error_found = true;
3176 }
3177 if (!e->indirect_unknown_callee
3178 || !e->indirect_info)
3179 {
3180 error ("An indirect edge from %s is not marked as indirect or has "
3181 "associated indirect_info, the corresponding statement is: ",
f1c8b4d7 3182 identifier_to_locale (e->caller->name ()));
da5e1e7c 3183 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3184 error_found = true;
3185 }
3186 }
415d1b9a 3187 bool check_comdat = comdat_local_p ();
3188 for (e = callers; e; e = e->next_caller)
da5e1e7c 3189 {
151b9ff5 3190 if (e->verify_count ())
da5e1e7c 3191 error_found = true;
468088ac 3192 if (check_comdat
415d1b9a 3193 && !in_same_comdat_group_p (e->caller))
468088ac 3194 {
3195 error ("comdat-local function called by %s outside its comdat",
3196 identifier_to_locale (e->caller->name ()));
3197 error_found = true;
3198 }
da5e1e7c 3199 if (!e->inline_failed)
3200 {
415d1b9a 3201 if (global.inlined_to
da5e1e7c 3202 != (e->caller->global.inlined_to
3203 ? e->caller->global.inlined_to : e->caller))
3204 {
3205 error ("inlined_to pointer is wrong");
3206 error_found = true;
3207 }
415d1b9a 3208 if (callers->next_caller)
da5e1e7c 3209 {
3210 error ("multiple inline callers");
3211 error_found = true;
3212 }
3213 }
3214 else
415d1b9a 3215 if (global.inlined_to)
da5e1e7c 3216 {
3217 error ("inlined_to pointer set for noninline callers");
3218 error_found = true;
3219 }
3220 }
bfbaf6bb 3221 for (e = callees; e; e = e->next_callee)
3222 {
151b9ff5 3223 if (e->verify_count ())
bfbaf6bb 3224 error_found = true;
3225 if (gimple_has_body_p (e->caller->decl)
3226 && !e->caller->global.inlined_to
3227 && !e->speculative
3228 /* Optimized out calls are redirected to __builtin_unreachable. */
151b9ff5 3229 && (e->count.nonzero_p ()
c0250021 3230 || ! e->callee->decl
a0e9bfbb 3231 || !fndecl_built_in_p (e->callee->decl, BUILT_IN_UNREACHABLE))
151b9ff5 3232 && count
3233 == ENTRY_BLOCK_PTR_FOR_FN (DECL_STRUCT_FUNCTION (decl))->count
3234 && (!e->count.ipa_p ()
3235 && e->count.differs_from_p (gimple_bb (e->call_stmt)->count)))
bfbaf6bb 3236 {
151b9ff5 3237 error ("caller edge count does not match BB count");
3238 fprintf (stderr, "edge count: ");
3239 e->count.dump (stderr);
3240 fprintf (stderr, "\n bb count: ");
3241 gimple_bb (e->call_stmt)->count.dump (stderr);
3242 fprintf (stderr, "\n");
bfbaf6bb 3243 error_found = true;
3244 }
3245 }
415d1b9a 3246 for (e = indirect_calls; e; e = e->next_callee)
bfbaf6bb 3247 {
151b9ff5 3248 if (e->verify_count ())
bfbaf6bb 3249 error_found = true;
3250 if (gimple_has_body_p (e->caller->decl)
3251 && !e->caller->global.inlined_to
3252 && !e->speculative
151b9ff5 3253 && e->count.ipa_p ()
3254 && count
3255 == ENTRY_BLOCK_PTR_FOR_FN (DECL_STRUCT_FUNCTION (decl))->count
3256 && (!e->count.ipa_p ()
3257 && e->count.differs_from_p (gimple_bb (e->call_stmt)->count)))
bfbaf6bb 3258 {
151b9ff5 3259 error ("indirect call count does not match BB count");
3260 fprintf (stderr, "edge count: ");
3261 e->count.dump (stderr);
3262 fprintf (stderr, "\n bb count: ");
3263 gimple_bb (e->call_stmt)->count.dump (stderr);
3264 fprintf (stderr, "\n");
bfbaf6bb 3265 error_found = true;
3266 }
3267 }
415d1b9a 3268 if (!callers && global.inlined_to)
da5e1e7c 3269 {
3270 error ("inlined_to pointer is set but no predecessors found");
3271 error_found = true;
3272 }
415d1b9a 3273 if (global.inlined_to == this)
da5e1e7c 3274 {
3275 error ("inlined_to pointer refers to itself");
3276 error_found = true;
3277 }
3278
415d1b9a 3279 if (clone_of)
da5e1e7c 3280 {
4481f3d0 3281 cgraph_node *first_clone = clone_of->clones;
3282 if (first_clone != this)
da5e1e7c 3283 {
4481f3d0 3284 if (prev_sibling_clone->clone_of != clone_of)
3285 {
3286 error ("cgraph_node has wrong clone_of");
3287 error_found = true;
3288 }
da5e1e7c 3289 }
3290 }
415d1b9a 3291 if (clones)
da5e1e7c 3292 {
35ee1c66 3293 cgraph_node *n;
415d1b9a 3294 for (n = clones; n; n = n->next_sibling_clone)
3295 if (n->clone_of != this)
da5e1e7c 3296 break;
3297 if (n)
3298 {
415d1b9a 3299 error ("cgraph_node has wrong clone list");
da5e1e7c 3300 error_found = true;
3301 }
3302 }
415d1b9a 3303 if ((prev_sibling_clone || next_sibling_clone) && !clone_of)
da5e1e7c 3304 {
415d1b9a 3305 error ("cgraph_node is in clone list but it is not clone");
da5e1e7c 3306 error_found = true;
3307 }
415d1b9a 3308 if (!prev_sibling_clone && clone_of && clone_of->clones != this)
da5e1e7c 3309 {
415d1b9a 3310 error ("cgraph_node has wrong prev_clone pointer");
da5e1e7c 3311 error_found = true;
3312 }
415d1b9a 3313 if (prev_sibling_clone && prev_sibling_clone->next_sibling_clone != this)
da5e1e7c 3314 {
3315 error ("double linked list of clones corrupted");
3316 error_found = true;
3317 }
3318
415d1b9a 3319 if (analyzed && alias)
da5e1e7c 3320 {
3321 bool ref_found = false;
3322 int i;
35ee1c66 3323 ipa_ref *ref = NULL;
da5e1e7c 3324
415d1b9a 3325 if (callees)
da5e1e7c 3326 {
3327 error ("Alias has call edges");
3328 error_found = true;
3329 }
415d1b9a 3330 for (i = 0; iterate_reference (i, ref); i++)
1e42d5c6 3331 if (ref->use != IPA_REF_ALIAS)
da5e1e7c 3332 {
3333 error ("Alias has non-alias reference");
3334 error_found = true;
3335 }
3336 else if (ref_found)
3337 {
3338 error ("Alias has more than one alias reference");
3339 error_found = true;
3340 }
3341 else
3342 ref_found = true;
5c6f6a61 3343 if (!ref_found)
3344 {
3345 error ("Analyzed alias has no reference");
3346 error_found = true;
3347 }
da5e1e7c 3348 }
058a1b7a 3349
415d1b9a 3350 if (analyzed && thunk.thunk_p)
da5e1e7c 3351 {
415d1b9a 3352 if (!callees)
da5e1e7c 3353 {
3354 error ("No edge out of thunk node");
3355 error_found = true;
3356 }
415d1b9a 3357 else if (callees->next_callee)
da5e1e7c 3358 {
3359 error ("More than one edge out of thunk node");
3360 error_found = true;
3361 }
46729204 3362 if (gimple_has_body_p (decl) && !global.inlined_to)
da5e1e7c 3363 {
3364 error ("Thunk is not supposed to have body");
3365 error_found = true;
3366 }
3367 }
415d1b9a 3368 else if (analyzed && gimple_has_body_p (decl)
3369 && !TREE_ASM_WRITTEN (decl)
3370 && (!DECL_EXTERNAL (decl) || global.inlined_to)
3371 && !flag_wpa)
da5e1e7c 3372 {
3373 if (this_cfun->cfg)
3374 {
42acab1c 3375 hash_set<gimple *> stmts;
9df17e79 3376 int i;
35ee1c66 3377 ipa_ref *ref = NULL;
9df17e79 3378
da5e1e7c 3379 /* Reach the trees by walking over the CFG, and note the
3380 enclosing basic-blocks in the call edges. */
3381 FOR_EACH_BB_FN (this_block, this_cfun)
9df17e79 3382 {
3383 for (gsi = gsi_start_phis (this_block);
3384 !gsi_end_p (gsi); gsi_next (&gsi))
431205b7 3385 stmts.add (gsi_stmt (gsi));
9df17e79 3386 for (gsi = gsi_start_bb (this_block);
3387 !gsi_end_p (gsi);
3388 gsi_next (&gsi))
3389 {
42acab1c 3390 gimple *stmt = gsi_stmt (gsi);
431205b7 3391 stmts.add (stmt);
9df17e79 3392 if (is_gimple_call (stmt))
3393 {
35ee1c66 3394 cgraph_edge *e = get_edge (stmt);
9df17e79 3395 tree decl = gimple_call_fndecl (stmt);
3396 if (e)
3397 {
3398 if (e->aux)
3399 {
3400 error ("shared call_stmt:");
3401 cgraph_debug_gimple_stmt (this_cfun, stmt);
3402 error_found = true;
3403 }
3404 if (!e->indirect_unknown_callee)
3405 {
c308ecc8 3406 if (e->verify_corresponds_to_fndecl (decl))
9df17e79 3407 {
3408 error ("edge points to wrong declaration:");
02774f2d 3409 debug_tree (e->callee->decl);
9df17e79 3410 fprintf (stderr," Instead of:");
3411 debug_tree (decl);
3412 error_found = true;
3413 }
3414 }
3415 else if (decl)
3416 {
3417 error ("an indirect edge with unknown callee "
3418 "corresponding to a call_stmt with "
3419 "a known declaration:");
3420 error_found = true;
3421 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3422 }
3423 e->aux = (void *)1;
3424 }
3425 else if (decl)
3426 {
3427 error ("missing callgraph edge for call stmt:");
3428 cgraph_debug_gimple_stmt (this_cfun, stmt);
3429 error_found = true;
3430 }
3431 }
3432 }
da5e1e7c 3433 }
415d1b9a 3434 for (i = 0; iterate_reference (i, ref); i++)
431205b7 3435 if (ref->stmt && !stmts.contains (ref->stmt))
9df17e79 3436 {
3437 error ("reference to dead statement");
3438 cgraph_debug_gimple_stmt (this_cfun, ref->stmt);
3439 error_found = true;
3440 }
da5e1e7c 3441 }
3442 else
3443 /* No CFG available?! */
3444 gcc_unreachable ();
3445
415d1b9a 3446 for (e = callees; e; e = e->next_callee)
da5e1e7c 3447 {
3448 if (!e->aux)
3449 {
3450 error ("edge %s->%s has no corresponding call_stmt",
f1c8b4d7 3451 identifier_to_locale (e->caller->name ()),
3452 identifier_to_locale (e->callee->name ()));
da5e1e7c 3453 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3454 error_found = true;
3455 }
3456 e->aux = 0;
3457 }
415d1b9a 3458 for (e = indirect_calls; e; e = e->next_callee)
da5e1e7c 3459 {
4d044066 3460 if (!e->aux && !e->speculative)
da5e1e7c 3461 {
3462 error ("an indirect edge from %s has no corresponding call_stmt",
f1c8b4d7 3463 identifier_to_locale (e->caller->name ()));
da5e1e7c 3464 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3465 error_found = true;
3466 }
3467 e->aux = 0;
3468 }
3469 }
71847308 3470
3471 if (nested != NULL)
3472 {
3473 for (cgraph_node *n = nested; n != NULL; n = n->next_nested)
3474 {
3475 if (n->origin == NULL)
3476 {
3477 error ("missing origin for a node in a nested list");
3478 error_found = true;
3479 }
3480 else if (n->origin != this)
3481 {
3482 error ("origin points to a different parent");
3483 error_found = true;
3484 break;
3485 }
3486 }
3487 }
3488 if (next_nested != NULL && origin == NULL)
3489 {
3490 error ("missing origin for a node in a nested list");
3491 error_found = true;
3492 }
3493
da5e1e7c 3494 if (error_found)
3495 {
415d1b9a 3496 dump (stderr);
da5e1e7c 3497 internal_error ("verify_cgraph_node failed");
3498 }
3499 timevar_pop (TV_CGRAPH_VERIFY);
3500}
3501
3502/* Verify whole cgraph structure. */
3503DEBUG_FUNCTION void
415d1b9a 3504cgraph_node::verify_cgraph_nodes (void)
da5e1e7c 3505{
35ee1c66 3506 cgraph_node *node;
da5e1e7c 3507
3508 if (seen_error ())
3509 return;
3510
3511 FOR_EACH_FUNCTION (node)
415d1b9a 3512 node->verify ();
da5e1e7c 3513}
7d52f1a3 3514
62c34df8 3515#if __GNUC__ >= 10
3516# pragma GCC diagnostic pop
3517#endif
3518
415d1b9a 3519/* Walk the alias chain to return the function cgraph_node is alias of.
cfd85d03 3520 Walk through thunks, too.
2f7867dc 3521 When AVAILABILITY is non-NULL, get minimal availability in the chain.
3522 When REF is non-NULL, assume that reference happens in symbol REF
3523 when determining the availability. */
15ca8f90 3524
415d1b9a 3525cgraph_node *
2f7867dc 3526cgraph_node::function_symbol (enum availability *availability,
3527 struct symtab_node *ref)
15ca8f90 3528{
2f7867dc 3529 cgraph_node *node = ultimate_alias_target (availability, ref);
415d1b9a 3530
cfd85d03 3531 while (node->thunk.thunk_p)
15ca8f90 3532 {
2f7867dc 3533 ref = node;
cfd85d03 3534 node = node->callees->callee;
3535 if (availability)
3536 {
3537 enum availability a;
2f7867dc 3538 a = node->get_availability (ref);
cfd85d03 3539 if (a < *availability)
3540 *availability = a;
3541 }
2f7867dc 3542 node = node->ultimate_alias_target (availability, ref);
cfd85d03 3543 }
3544 return node;
3545}
3546
3547/* Walk the alias chain to return the function cgraph_node is alias of.
3548 Walk through non virtual thunks, too. Thus we return either a function
3549 or a virtual thunk node.
2f7867dc 3550 When AVAILABILITY is non-NULL, get minimal availability in the chain.
3551 When REF is non-NULL, assume that reference happens in symbol REF
3552 when determining the availability. */
cfd85d03 3553
3554cgraph_node *
3555cgraph_node::function_or_virtual_thunk_symbol
2f7867dc 3556 (enum availability *availability,
3557 struct symtab_node *ref)
cfd85d03 3558{
2f7867dc 3559 cgraph_node *node = ultimate_alias_target (availability, ref);
cfd85d03 3560
3561 while (node->thunk.thunk_p && !node->thunk.virtual_offset_p)
3562 {
2f7867dc 3563 ref = node;
cfd85d03 3564 node = node->callees->callee;
3565 if (availability)
15ca8f90 3566 {
cfd85d03 3567 enum availability a;
2f7867dc 3568 a = node->get_availability (ref);
cfd85d03 3569 if (a < *availability)
3570 *availability = a;
15ca8f90 3571 }
2f7867dc 3572 node = node->ultimate_alias_target (availability, ref);
cfd85d03 3573 }
15ca8f90 3574 return node;
3575}
3576
415d1b9a 3577/* When doing LTO, read cgraph_node's body from disk if it is not already
3578 present. */
eaad46f2 3579
3580bool
4560777c 3581cgraph_node::get_untransformed_body (void)
eaad46f2 3582{
35ee1c66 3583 lto_file_decl_data *file_data;
eaad46f2 3584 const char *data, *name;
3585 size_t len;
415d1b9a 3586 tree decl = this->decl;
eaad46f2 3587
72a985d7 3588 /* Check if body is already there. Either we have gimple body or
3589 the function is thunk and in that case we set DECL_ARGUMENTS. */
3590 if (DECL_ARGUMENTS (decl) || gimple_has_body_p (decl))
eaad46f2 3591 return false;
3592
72a985d7 3593 gcc_assert (in_lto_p && !DECL_RESULT (decl));
eaad46f2 3594
e52d4978 3595 timevar_push (TV_IPA_LTO_GIMPLE_IN);
3596
415d1b9a 3597 file_data = lto_file_data;
eaad46f2 3598 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
3599
3600 /* We may have renamed the declaration, e.g., a static function. */
3601 name = lto_get_decl_name_mapping (file_data, name);
6cbd82a6 3602 struct lto_in_decl_state *decl_state
3603 = lto_get_function_in_decl_state (file_data, decl);
eaad46f2 3604
3605 data = lto_get_section_data (file_data, LTO_section_function_body,
6cbd82a6 3606 name, &len, decl_state->compressed);
eaad46f2 3607 if (!data)
c05be867 3608 fatal_error (input_location, "%s: section %s is missing",
eaad46f2 3609 file_data->file_name,
3610 name);
eaad46f2 3611
3612 gcc_assert (DECL_STRUCT_FUNCTION (decl) == NULL);
3613
7858a084 3614 if (!quiet_flag)
3615 fprintf (stderr, " in:%s", IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
415d1b9a 3616 lto_input_function_body (file_data, this, data);
eaad46f2 3617 lto_stats.num_function_bodies++;
3618 lto_free_section_data (file_data, LTO_section_function_body, name,
6cbd82a6 3619 data, len, decl_state->compressed);
415d1b9a 3620 lto_free_function_in_decl_state_for_node (this);
e9e2b82f 3621 /* Keep lto file data so ipa-inline-analysis knows about cross module
3622 inlining. */
e52d4978 3623
3624 timevar_pop (TV_IPA_LTO_GIMPLE_IN);
3625
eaad46f2 3626 return true;
3627}
3628
4560777c 3629/* Prepare function body. When doing LTO, read cgraph_node's body from disk
3630 if it is not already present. When some IPA transformations are scheduled,
3631 apply them. */
3632
3633bool
3634cgraph_node::get_body (void)
3635{
3636 bool updated;
3637
3638 updated = get_untransformed_body ();
3639
3640 /* Getting transformed body makes no sense for inline clones;
fe4bc123 3641 we should never use this on real clones because they are materialized
4560777c 3642 early.
3643 TODO: Materializing clones here will likely lead to smaller LTRANS
3644 footprint. */
3645 gcc_assert (!global.inlined_to && !clone_of);
3646 if (ipa_transforms_to_apply.exists ())
3647 {
3648 opt_pass *saved_current_pass = current_pass;
3649 FILE *saved_dump_file = dump_file;
f9e9225b 3650 const char *saved_dump_file_name = dump_file_name;
3f6e5ced 3651 dump_flags_t saved_dump_flags = dump_flags;
f9e9225b 3652 dump_file_name = NULL;
7fa3c46f 3653 set_dump_file (NULL);
4560777c 3654
3655 push_cfun (DECL_STRUCT_FUNCTION (decl));
02f70d0e 3656 execute_all_ipa_transforms (true);
4560777c 3657 cgraph_edge::rebuild_edges ();
3658 free_dominance_info (CDI_DOMINATORS);
3659 free_dominance_info (CDI_POST_DOMINATORS);
3660 pop_cfun ();
3661 updated = true;
3662
3663 current_pass = saved_current_pass;
7fa3c46f 3664 set_dump_file (saved_dump_file);
f9e9225b 3665 dump_file_name = saved_dump_file_name;
4560777c 3666 dump_flags = saved_dump_flags;
3667 }
3668 return updated;
3669}
3670
9d4a0f4b 3671/* Return the DECL_STRUCT_FUNCTION of the function. */
3672
3673struct function *
3674cgraph_node::get_fun (void)
3675{
3676 cgraph_node *node = this;
3677 struct function *fun = DECL_STRUCT_FUNCTION (node->decl);
3678
3679 while (!fun && node->clone_of)
3680 {
3681 node = node->clone_of;
3682 fun = DECL_STRUCT_FUNCTION (node->decl);
3683 }
3684
3685 return fun;
3686}
3687
424a4a92 3688/* Verify if the type of the argument matches that of the function
3689 declaration. If we cannot verify this or there is a mismatch,
3690 return false. */
3691
3692static bool
42acab1c 3693gimple_check_call_args (gimple *stmt, tree fndecl, bool args_count_match)
424a4a92 3694{
3695 tree parms, p;
3696 unsigned int i, nargs;
3697
3698 /* Calls to internal functions always match their signature. */
3699 if (gimple_call_internal_p (stmt))
3700 return true;
3701
3702 nargs = gimple_call_num_args (stmt);
3703
3704 /* Get argument types for verification. */
3705 if (fndecl)
3706 parms = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
3707 else
3708 parms = TYPE_ARG_TYPES (gimple_call_fntype (stmt));
3709
3710 /* Verify if the type of the argument matches that of the function
3711 declaration. If we cannot verify this or there is a mismatch,
3712 return false. */
3713 if (fndecl && DECL_ARGUMENTS (fndecl))
3714 {
3715 for (i = 0, p = DECL_ARGUMENTS (fndecl);
3716 i < nargs;
3717 i++, p = DECL_CHAIN (p))
3718 {
3719 tree arg;
3720 /* We cannot distinguish a varargs function from the case
3721 of excess parameters, still deferring the inlining decision
3722 to the callee is possible. */
3723 if (!p)
3724 break;
3725 arg = gimple_call_arg (stmt, i);
3726 if (p == error_mark_node
2830de69 3727 || DECL_ARG_TYPE (p) == error_mark_node
424a4a92 3728 || arg == error_mark_node
3729 || (!types_compatible_p (DECL_ARG_TYPE (p), TREE_TYPE (arg))
3730 && !fold_convertible_p (DECL_ARG_TYPE (p), arg)))
3731 return false;
3732 }
3733 if (args_count_match && p)
3734 return false;
3735 }
3736 else if (parms)
3737 {
3738 for (i = 0, p = parms; i < nargs; i++, p = TREE_CHAIN (p))
3739 {
3740 tree arg;
3741 /* If this is a varargs function defer inlining decision
3742 to callee. */
3743 if (!p)
3744 break;
3745 arg = gimple_call_arg (stmt, i);
3746 if (TREE_VALUE (p) == error_mark_node
3747 || arg == error_mark_node
3748 || TREE_CODE (TREE_VALUE (p)) == VOID_TYPE
3749 || (!types_compatible_p (TREE_VALUE (p), TREE_TYPE (arg))
3750 && !fold_convertible_p (TREE_VALUE (p), arg)))
3751 return false;
3752 }
3753 }
3754 else
3755 {
3756 if (nargs != 0)
3757 return false;
3758 }
3759 return true;
3760}
3761
3762/* Verify if the type of the argument and lhs of CALL_STMT matches
3763 that of the function declaration CALLEE. If ARGS_COUNT_MATCH is
3764 true, the arg count needs to be the same.
3765 If we cannot verify this or there is a mismatch, return false. */
3766
3767bool
42acab1c 3768gimple_check_call_matching_types (gimple *call_stmt, tree callee,
424a4a92 3769 bool args_count_match)
3770{
3771 tree lhs;
3772
3773 if ((DECL_RESULT (callee)
3774 && !DECL_BY_REFERENCE (DECL_RESULT (callee))
3775 && (lhs = gimple_call_lhs (call_stmt)) != NULL_TREE
3776 && !useless_type_conversion_p (TREE_TYPE (DECL_RESULT (callee)),
3777 TREE_TYPE (lhs))
3778 && !fold_convertible_p (TREE_TYPE (DECL_RESULT (callee)), lhs))
3779 || !gimple_check_call_args (call_stmt, callee, args_count_match))
3780 return false;
3781 return true;
3782}
3783
415309e2 3784/* Reset all state within cgraph.c so that we can rerun the compiler
3785 within the same process. For use by toplev::finalize. */
3786
3787void
3788cgraph_c_finalize (void)
3789{
3790 symtab = NULL;
3791
3792 x_cgraph_nodes_queue = NULL;
3793
3794 cgraph_fnver_htab = NULL;
3795 version_info_node = NULL;
3796}
3797
50f2a18b 3798/* A wroker for call_for_symbol_and_aliases. */
3799
3800bool
3801cgraph_node::call_for_symbol_and_aliases_1 (bool (*callback) (cgraph_node *,
3802 void *),
3803 void *data,
3804 bool include_overwritable)
3805{
3806 ipa_ref *ref;
3807 FOR_EACH_ALIAS (this, ref)
3808 {
3809 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
3810 if (include_overwritable
3811 || alias->get_availability () > AVAIL_INTERPOSABLE)
3812 if (alias->call_for_symbol_and_aliases (callback, data,
3813 include_overwritable))
3814 return true;
3815 }
3816 return false;
3817}
c1df982e 3818
3819/* Return true if NODE has thunk. */
3820
3821bool
3822cgraph_node::has_thunk_p (cgraph_node *node, void *)
3823{
3824 for (cgraph_edge *e = node->callers; e; e = e->next_caller)
3825 if (e->caller->thunk.thunk_p)
3826 return true;
3827 return false;
3828}
3829
d1612523 3830/* Expected frequency of executions within the function. */
7c343235 3831
3832sreal
3833cgraph_edge::sreal_frequency ()
3834{
3835 return count.to_sreal_scale (caller->global.inlined_to
3836 ? caller->global.inlined_to->count
3837 : caller->count);
3838}
3839
42157758 3840
3841/* During LTO stream in this can be used to check whether call can possibly
3842 be internal to the current translation unit. */
3843
3844bool
3845cgraph_edge::possibly_call_in_translation_unit_p (void)
3846{
3847 gcc_checking_assert (in_lto_p && caller->prevailing_p ());
3848
3849 /* While incremental linking we may end up getting function body later. */
3850 if (flag_incremental_link == INCREMENTAL_LINK_LTO)
3851 return true;
3852
3853 /* We may be smarter here and avoid stremaing in indirect calls we can't
3854 track, but that would require arranging stremaing the indirect call
3855 summary first. */
3856 if (!callee)
3857 return true;
3858
3859 /* If calle is local to the original translation unit, it will be defined. */
3860 if (!TREE_PUBLIC (callee->decl) && !DECL_EXTERNAL (callee->decl))
3861 return true;
3862
3863 /* Otherwise we need to lookup prevailing symbol (symbol table is not merged,
3864 yet) and see if it is a definition. In fact we may also resolve aliases,
3865 but that is probably not too important. */
3866 symtab_node *node = callee;
3867 for (int n = 10; node->previous_sharing_asm_name && n ; n--)
3868 node = node->previous_sharing_asm_name;
3869 if (node->previous_sharing_asm_name)
3870 node = symtab_node::get_for_asmname (DECL_ASSEMBLER_NAME (callee->decl));
3871 gcc_assert (TREE_PUBLIC (node->decl));
3872 return node->get_availability () >= AVAIL_AVAILABLE;
3873}
3874
564850b9 3875/* A stashed copy of "symtab" for use by selftest::symbol_table_test.
3876 This needs to be a global so that it can be a GC root, and thus
3877 prevent the stashed copy from being garbage-collected if the GC runs
3878 during a symbol_table_test. */
3879
3880symbol_table *saved_symtab;
3881
3882#if CHECKING_P
3883
3884namespace selftest {
3885
3886/* class selftest::symbol_table_test. */
3887
3888/* Constructor. Store the old value of symtab, and create a new one. */
3889
3890symbol_table_test::symbol_table_test ()
3891{
3892 gcc_assert (saved_symtab == NULL);
3893 saved_symtab = symtab;
3894 symtab = new (ggc_cleared_alloc <symbol_table> ()) symbol_table ();
3895}
3896
3897/* Destructor. Restore the old value of symtab. */
3898
3899symbol_table_test::~symbol_table_test ()
3900{
3901 gcc_assert (saved_symtab != NULL);
3902 symtab = saved_symtab;
3903 saved_symtab = NULL;
3904}
3905
3906/* Verify that symbol_table_test works. */
3907
3908static void
3909test_symbol_table_test ()
3910{
3911 /* Simulate running two selftests involving symbol tables. */
3912 for (int i = 0; i < 2; i++)
3913 {
3914 symbol_table_test stt;
3915 tree test_decl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
3916 get_identifier ("test_decl"),
3917 build_function_type_list (void_type_node,
3918 NULL_TREE));
3919 cgraph_node *node = cgraph_node::get_create (test_decl);
3920 gcc_assert (node);
3921
3922 /* Verify that the node has order 0 on both iterations,
3923 and thus that nodes have predictable dump names in selftests. */
3924 ASSERT_EQ (node->order, 0);
3925 ASSERT_STREQ (node->dump_name (), "test_decl/0");
3926 }
3927}
3928
3929/* Run all of the selftests within this file. */
3930
3931void
3932cgraph_c_tests ()
3933{
3934 test_symbol_table_test ();
3935}
3936
3937} // namespace selftest
3938
3939#endif /* CHECKING_P */
3940
639e4be4 3941#include "gt-cgraph.h"