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