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