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