]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cgraph.c
Daily bump.
[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
e6a54b01 1515 /* If the call becomes noreturn, remove the LHS if possible. */
abd3a68c 1516 if (gimple_call_noreturn_p (new_stmt) && should_remove_lhs_p (lhs))
23a04216
JH
1517 {
1518 if (TREE_CODE (lhs) == SSA_NAME)
1519 {
45b62594
RB
1520 tree var = create_tmp_reg_fn (DECL_STRUCT_FUNCTION (e->caller->decl),
1521 TREE_TYPE (lhs), NULL);
1522 var = get_or_create_ssa_default_def
1523 (DECL_STRUCT_FUNCTION (e->caller->decl), var);
355fe088 1524 gimple *set_stmt = gimple_build_assign (lhs, var);
23a04216 1525 gsi = gsi_for_stmt (new_stmt);
45b62594
RB
1526 gsi_insert_before_without_update (&gsi, set_stmt, GSI_SAME_STMT);
1527 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), set_stmt);
23a04216
JH
1528 }
1529 gimple_call_set_lhs (new_stmt, NULL_TREE);
1f91035f
JH
1530 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
1531 }
1532
1533 /* If new callee has no static chain, remove it. */
1534 if (gimple_call_chain (new_stmt) && !DECL_STATIC_CHAIN (e->callee->decl))
1535 {
1536 gimple_call_set_chain (new_stmt, NULL);
1537 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
23a04216
JH
1538 }
1539
0b986c6a
JH
1540 maybe_remove_unused_call_args (DECL_STRUCT_FUNCTION (e->caller->decl),
1541 new_stmt);
1542
d52f5295 1543 e->caller->set_call_stmt_including_clones (e->call_stmt, new_stmt, false);
66a20fc2 1544
3dafb85c 1545 if (symtab->dump_file)
66a20fc2 1546 {
3dafb85c
ML
1547 fprintf (symtab->dump_file, " updated to:");
1548 print_gimple_stmt (symtab->dump_file, e->call_stmt, 0, dump_flags);
66a20fc2
JH
1549 }
1550 return new_stmt;
1551}
726a989a
RB
1552
1553/* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
4b685e14 1554 OLD_STMT changed into NEW_STMT. OLD_CALL is gimple_call_fndecl
a9d24544
JJ
1555 of OLD_STMT if it was previously call statement.
1556 If NEW_STMT is NULL, the call has been dropped without any
1557 replacement. */
2bafad93 1558
9187e02d 1559static void
3dafb85c 1560cgraph_update_edges_for_call_stmt_node (cgraph_node *node,
355fe088
TS
1561 gimple *old_stmt, tree old_call,
1562 gimple *new_stmt)
2bafad93 1563{
a9d24544
JJ
1564 tree new_call = (new_stmt && is_gimple_call (new_stmt))
1565 ? gimple_call_fndecl (new_stmt) : 0;
2bafad93 1566
4b685e14
JH
1567 /* We are seeing indirect calls, then there is nothing to update. */
1568 if (!new_call && !old_call)
1569 return;
1570 /* See if we turned indirect call into direct call or folded call to one builtin
61502ca8 1571 into different builtin. */
2bafad93
JJ
1572 if (old_call != new_call)
1573 {
3dafb85c
ML
1574 cgraph_edge *e = node->get_edge (old_stmt);
1575 cgraph_edge *ne = NULL;
4b685e14
JH
1576 gcov_type count;
1577 int frequency;
2bafad93
JJ
1578
1579 if (e)
1580 {
1f4eb0e9 1581 /* Keep calls marked as dead dead. */
931c8e9a 1582 if (new_stmt && is_gimple_call (new_stmt) && e->callee
1f4eb0e9
JH
1583 && DECL_BUILT_IN_CLASS (e->callee->decl) == BUILT_IN_NORMAL
1584 && DECL_FUNCTION_CODE (e->callee->decl) == BUILT_IN_UNREACHABLE)
1585 {
1586 node->get_edge (old_stmt)->set_call_stmt
1587 (as_a <gcall *> (new_stmt));
1588 return;
1589 }
e33c6cd6
MJ
1590 /* See if the edge is already there and has the correct callee. It
1591 might be so because of indirect inlining has already updated
97ba0040
JH
1592 it. We also might've cloned and redirected the edge. */
1593 if (new_call && e->callee)
1594 {
3dafb85c 1595 cgraph_node *callee = e->callee;
97ba0040
JH
1596 while (callee)
1597 {
67348ccc 1598 if (callee->decl == new_call
97ba0040 1599 || callee->former_clone_of == new_call)
eb14a79f 1600 {
538dd0b7 1601 e->set_call_stmt (as_a <gcall *> (new_stmt));
eb14a79f
ML
1602 return;
1603 }
97ba0040
JH
1604 callee = callee->clone_of;
1605 }
1606 }
4b685e14
JH
1607
1608 /* Otherwise remove edge and create new one; we can't simply redirect
1609 since function has changed, so inline plan and other information
1610 attached to edge is invalid. */
4b685e14
JH
1611 count = e->count;
1612 frequency = e->frequency;
2dbe8b70 1613 if (e->indirect_unknown_callee || e->inline_failed)
3dafb85c 1614 e->remove ();
2dbe8b70 1615 else
d52f5295 1616 e->callee->remove_symbol_and_inline_clones ();
4b685e14 1617 }
a9d24544 1618 else if (new_call)
4b685e14
JH
1619 {
1620 /* We are seeing new direct call; compute profile info based on BB. */
1621 basic_block bb = gimple_bb (new_stmt);
1622 count = bb->count;
1623 frequency = compute_call_stmt_bb_frequency (current_function_decl,
1624 bb);
2bafad93 1625 }
2bafad93 1626
4b685e14
JH
1627 if (new_call)
1628 {
d52f5295 1629 ne = node->create_edge (cgraph_node::get_create (new_call),
538dd0b7
DM
1630 as_a <gcall *> (new_stmt), count,
1631 frequency);
4b685e14
JH
1632 gcc_assert (ne->inline_failed);
1633 }
2bafad93 1634 }
4b685e14
JH
1635 /* We only updated the call stmt; update pointer in cgraph edge.. */
1636 else if (old_stmt != new_stmt)
538dd0b7 1637 node->get_edge (old_stmt)->set_call_stmt (as_a <gcall *> (new_stmt));
2bafad93
JJ
1638}
1639
9187e02d 1640/* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
4b685e14
JH
1641 OLD_STMT changed into NEW_STMT. OLD_DECL is gimple_call_fndecl
1642 of OLD_STMT before it was updated (updating can happen inplace). */
9187e02d
JH
1643
1644void
355fe088
TS
1645cgraph_update_edges_for_call_stmt (gimple *old_stmt, tree old_decl,
1646 gimple *new_stmt)
9187e02d 1647{
3dafb85c
ML
1648 cgraph_node *orig = cgraph_node::get (cfun->decl);
1649 cgraph_node *node;
9187e02d 1650
a358e188 1651 gcc_checking_assert (orig);
4b685e14 1652 cgraph_update_edges_for_call_stmt_node (orig, old_stmt, old_decl, new_stmt);
9187e02d
JH
1653 if (orig->clones)
1654 for (node = orig->clones; node != orig;)
1655 {
4b685e14 1656 cgraph_update_edges_for_call_stmt_node (node, old_stmt, old_decl, new_stmt);
9187e02d
JH
1657 if (node->clones)
1658 node = node->clones;
1659 else if (node->next_sibling_clone)
1660 node = node->next_sibling_clone;
1661 else
1662 {
1663 while (node != orig && !node->next_sibling_clone)
1664 node = node->clone_of;
1665 if (node != orig)
1666 node = node->next_sibling_clone;
1667 }
1668 }
1669}
1670
726a989a 1671
2563c224
RG
1672/* Remove all callees from the node. */
1673
1674void
d52f5295 1675cgraph_node::remove_callees (void)
2563c224 1676{
3dafb85c 1677 cgraph_edge *e, *f;
2563c224
RG
1678
1679 /* It is sufficient to remove the edges from the lists of callers of
1680 the callees. The callee list of the node can be zapped with one
1681 assignment. */
d52f5295 1682 for (e = callees; e; e = f)
9088c1cc 1683 {
5c0466b5 1684 f = e->next_callee;
3dafb85c 1685 symtab->call_edge_removal_hooks (e);
e33c6cd6 1686 if (!e->indirect_unknown_callee)
3dafb85c
ML
1687 e->remove_callee ();
1688 symtab->free_edge (e);
9088c1cc 1689 }
d52f5295 1690 for (e = indirect_calls; e; e = f)
5f902d76
JH
1691 {
1692 f = e->next_callee;
3dafb85c 1693 symtab->call_edge_removal_hooks (e);
5f902d76 1694 if (!e->indirect_unknown_callee)
3dafb85c
ML
1695 e->remove_callee ();
1696 symtab->free_edge (e);
5f902d76 1697 }
d52f5295
ML
1698 indirect_calls = NULL;
1699 callees = NULL;
1700 if (call_site_hash)
70d539ce 1701 {
2a22f99c 1702 call_site_hash->empty ();
d52f5295 1703 call_site_hash = NULL;
70d539ce 1704 }
2563c224
RG
1705}
1706
1707/* Remove all callers from the node. */
1708
d52f5295
ML
1709void
1710cgraph_node::remove_callers (void)
2563c224 1711{
3dafb85c 1712 cgraph_edge *e, *f;
2563c224
RG
1713
1714 /* It is sufficient to remove the edges from the lists of callees of
1715 the callers. The caller list of the node can be zapped with one
1716 assignment. */
d52f5295 1717 for (e = callers; e; e = f)
9088c1cc 1718 {
5c0466b5 1719 f = e->next_caller;
3dafb85c
ML
1720 symtab->call_edge_removal_hooks (e);
1721 e->remove_caller ();
1722 symtab->free_edge (e);
9088c1cc 1723 }
d52f5295 1724 callers = NULL;
18c6ada9
JH
1725}
1726
49bde175
JH
1727/* Helper function for cgraph_release_function_body and free_lang_data.
1728 It releases body from function DECL without having to inspect its
1729 possibly non-existent symtab node. */
3a40c18a
JH
1730
1731void
49bde175 1732release_function_body (tree decl)
3a40c18a 1733{
61183076
RB
1734 function *fn = DECL_STRUCT_FUNCTION (decl);
1735 if (fn)
3a40c18a 1736 {
61183076 1737 if (fn->cfg
381cdae4 1738 && loops_for_fn (fn))
936fc9ba 1739 {
381cdae4
RB
1740 fn->curr_properties &= ~PROP_loops;
1741 loop_optimizer_finalize (fn);
1742 }
1743 if (fn->gimple_df)
1744 {
1745 delete_tree_ssa (fn);
1746 fn->eh = NULL;
1747 }
1748 if (fn->cfg)
1749 {
1750 gcc_assert (!dom_info_available_p (fn, CDI_DOMINATORS));
1751 gcc_assert (!dom_info_available_p (fn, CDI_POST_DOMINATORS));
1752 delete_tree_cfg_annotations (fn);
1753 clear_edges (fn);
1754 fn->cfg = NULL;
936fc9ba 1755 }
381cdae4
RB
1756 if (fn->value_histograms)
1757 free_histograms (fn);
49bde175 1758 gimple_set_body (decl, NULL);
936fc9ba
JH
1759 /* Struct function hangs a lot of data that would leak if we didn't
1760 removed all pointers to it. */
61183076 1761 ggc_free (fn);
49bde175
JH
1762 DECL_STRUCT_FUNCTION (decl) = NULL;
1763 }
1764 DECL_SAVED_TREE (decl) = NULL;
1765}
1766
d52f5295 1767/* Release memory used to represent body of function.
49bde175
JH
1768 Use this only for functions that are released before being translated to
1769 target code (i.e. RTL). Functions that are compiled to RTL and beyond
bf898b30
ML
1770 are free'd in final.c via free_after_compilation().
1771 KEEP_ARGUMENTS are useful only if you want to rebuild body as thunk. */
49bde175
JH
1772
1773void
bf898b30 1774cgraph_node::release_body (bool keep_arguments)
49bde175 1775{
d52f5295 1776 ipa_transforms_to_apply.release ();
3dafb85c 1777 if (!used_as_abstract_origin && symtab->state != PARSING)
49bde175 1778 {
d52f5295 1779 DECL_RESULT (decl) = NULL;
bf898b30
ML
1780
1781 if (!keep_arguments)
1782 DECL_ARGUMENTS (decl) = NULL;
3a40c18a 1783 }
026c3cfd
AH
1784 /* If the node is abstract and needed, then do not clear
1785 DECL_INITIAL of its associated function declaration because it's
6b20f353 1786 needed to emit debug info later. */
d52f5295
ML
1787 if (!used_as_abstract_origin && DECL_INITIAL (decl))
1788 DECL_INITIAL (decl) = error_mark_node;
1789 release_function_body (decl);
1790 if (lto_file_data)
1c4db829
JH
1791 {
1792 lto_free_function_in_decl_state_for_node (this);
1793 lto_file_data = NULL;
1794 }
3a40c18a
JH
1795}
1796
d52f5295 1797/* Remove function from symbol table. */
18d13f34
JH
1798
1799void
d52f5295 1800cgraph_node::remove (void)
18d13f34 1801{
3dafb85c 1802 cgraph_node *n;
d52f5295 1803 int uid = this->uid;
18c6ada9 1804
3dafb85c 1805 symtab->call_cgraph_removal_hooks (this);
d52f5295
ML
1806 remove_callers ();
1807 remove_callees ();
1808 ipa_transforms_to_apply.release ();
266ad5c8 1809
96fc428c
JH
1810 /* Incremental inlining access removed nodes stored in the postorder list.
1811 */
d52f5295
ML
1812 force_output = false;
1813 forced_by_abi = false;
1814 for (n = nested; n; n = n->next_nested)
ca30a539 1815 n->origin = NULL;
d52f5295
ML
1816 nested = NULL;
1817 if (origin)
18d13f34 1818 {
3dafb85c 1819 cgraph_node **node2 = &origin->nested;
18d13f34 1820
d52f5295 1821 while (*node2 != this)
18d13f34 1822 node2 = &(*node2)->next_nested;
d52f5295 1823 *node2 = next_nested;
18d13f34 1824 }
d52f5295
ML
1825 unregister ();
1826 if (prev_sibling_clone)
1827 prev_sibling_clone->next_sibling_clone = next_sibling_clone;
1828 else if (clone_of)
1829 clone_of->clones = next_sibling_clone;
1830 if (next_sibling_clone)
1831 next_sibling_clone->prev_sibling_clone = prev_sibling_clone;
1832 if (clones)
18c6ada9 1833 {
3dafb85c 1834 cgraph_node *n, *next;
47cb0d7d 1835
d52f5295 1836 if (clone_of)
47cb0d7d 1837 {
d52f5295
ML
1838 for (n = clones; n->next_sibling_clone; n = n->next_sibling_clone)
1839 n->clone_of = clone_of;
1840 n->clone_of = clone_of;
1841 n->next_sibling_clone = clone_of->clones;
1842 if (clone_of->clones)
1843 clone_of->clones->prev_sibling_clone = n;
1844 clone_of->clones = clones;
47cb0d7d
JH
1845 }
1846 else
1847 {
66a20fc2 1848 /* We are removing node with clones. This makes clones inconsistent,
47cb0d7d
JH
1849 but assume they will be removed subsequently and just keep clone
1850 tree intact. This can happen in unreachable function removal since
1851 we remove unreachable functions in random order, not by bottom-up
1852 walk of clone trees. */
d52f5295 1853 for (n = clones; n; n = next)
47cb0d7d
JH
1854 {
1855 next = n->next_sibling_clone;
1856 n->next_sibling_clone = NULL;
1857 n->prev_sibling_clone = NULL;
1858 n->clone_of = NULL;
1859 }
1860 }
18c6ada9
JH
1861 }
1862
c22cacf3 1863 /* While all the clones are removed after being proceeded, the function
4a76d91a
JH
1864 itself is kept in the cgraph even after it is compiled. Check whether
1865 we are done with this body and reclaim it proactively if this is the case.
1866 */
3dafb85c 1867 if (symtab->state != LTO_STREAMING)
4f63dfc6 1868 {
d52f5295 1869 n = cgraph_node::get (decl);
4f63dfc6
JH
1870 if (!n
1871 || (!n->clones && !n->clone_of && !n->global.inlined_to
1c4db829 1872 && ((symtab->global_info_ready || in_lto_p)
67348ccc
DM
1873 && (TREE_ASM_WRITTEN (n->decl)
1874 || DECL_EXTERNAL (n->decl)
1875 || !n->analyzed
1876 || (!flag_wpa && n->in_other_partition)))))
d52f5295 1877 release_body ();
4f63dfc6 1878 }
1c4db829
JH
1879 else
1880 {
1881 lto_free_function_in_decl_state_for_node (this);
1882 lto_file_data = NULL;
1883 }
1ab24192 1884
d52f5295
ML
1885 decl = NULL;
1886 if (call_site_hash)
70d539ce 1887 {
2a22f99c 1888 call_site_hash->empty ();
d52f5295 1889 call_site_hash = NULL;
70d539ce 1890 }
2fb16412 1891
d5e254e1
IE
1892 if (instrumented_version)
1893 {
1894 instrumented_version->instrumented_version = NULL;
1895 instrumented_version = NULL;
1896 }
1897
3dafb85c 1898 symtab->release_symbol (this, uid);
18d13f34
JH
1899}
1900
39ff5a96
JH
1901/* Likewise indicate that a node is having address taken. */
1902
1903void
d52f5295 1904cgraph_node::mark_address_taken (void)
39ff5a96 1905{
4502fe8d
MJ
1906 /* Indirect inlining can figure out that all uses of the address are
1907 inlined. */
d52f5295 1908 if (global.inlined_to)
4502fe8d
MJ
1909 {
1910 gcc_assert (cfun->after_inlining);
d52f5295 1911 gcc_assert (callers->indirect_inlining_edge);
4502fe8d
MJ
1912 return;
1913 }
39e2db00
JH
1914 /* FIXME: address_taken flag is used both as a shortcut for testing whether
1915 IPA_REF_ADDR reference exists (and thus it should be set on node
1916 representing alias we take address of) and as a test whether address
1917 of the object was taken (and thus it should be set on node alias is
1918 referring to). We should remove the first use and the remove the
1919 following set. */
d52f5295
ML
1920 address_taken = 1;
1921 cgraph_node *node = ultimate_alias_target ();
67348ccc 1922 node->address_taken = 1;
39ff5a96
JH
1923}
1924
dafc5b82
JH
1925/* Return local info for the compiled function. */
1926
3dafb85c
ML
1927cgraph_local_info *
1928cgraph_node::local_info (tree decl)
dafc5b82 1929{
341c100f 1930 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
3dafb85c 1931 cgraph_node *node = get (decl);
9f9ebcdf
MJ
1932 if (!node)
1933 return NULL;
4bd019b8 1934 return &node->ultimate_alias_target ()->local;
dafc5b82
JH
1935}
1936
b255a036
JH
1937/* Return local info for the compiled function. */
1938
3dafb85c
ML
1939cgraph_rtl_info *
1940cgraph_node::rtl_info (tree decl)
b255a036 1941{
341c100f 1942 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
3dafb85c 1943 cgraph_node *node = get (decl);
4bd019b8
JH
1944 if (!node)
1945 return NULL;
1946 node = node->ultimate_alias_target ();
1947 if (node->decl != current_function_decl
1948 && !TREE_ASM_WRITTEN (node->decl))
b255a036 1949 return NULL;
88f554b4
AM
1950 /* Allocate if it doesnt exist. */
1951 if (node->ultimate_alias_target ()->rtl == NULL)
1952 node->ultimate_alias_target ()->rtl = ggc_cleared_alloc<cgraph_rtl_info> ();
1953 return node->ultimate_alias_target ()->rtl;
b255a036
JH
1954}
1955
61a05df1
JH
1956/* Return a string describing the failure REASON. */
1957
1958const char*
1959cgraph_inline_failed_string (cgraph_inline_failed_t reason)
1960{
1961#undef DEFCIFCODE
1cf11770 1962#define DEFCIFCODE(code, type, string) string,
61a05df1
JH
1963
1964 static const char *cif_string_table[CIF_N_REASONS] = {
1965#include "cif-code.def"
1966 };
1967
1968 /* Signedness of an enum type is implementation defined, so cast it
1969 to unsigned before testing. */
1970 gcc_assert ((unsigned) reason < CIF_N_REASONS);
1971 return cif_string_table[reason];
1972}
1973
1cf11770
L
1974/* Return a type describing the failure REASON. */
1975
1976cgraph_inline_failed_type_t
1977cgraph_inline_failed_type (cgraph_inline_failed_t reason)
1978{
1979#undef DEFCIFCODE
1980#define DEFCIFCODE(code, type, string) type,
1981
1982 static cgraph_inline_failed_type_t cif_type_table[CIF_N_REASONS] = {
1983#include "cif-code.def"
1984 };
1985
1986 /* Signedness of an enum type is implementation defined, so cast it
1987 to unsigned before testing. */
1988 gcc_assert ((unsigned) reason < CIF_N_REASONS);
1989 return cif_type_table[reason];
1990}
1991
6b02a499 1992/* Names used to print out the availability enum. */
8a4a83ed 1993const char * const cgraph_availability_names[] =
fa10beec 1994 {"unset", "not_available", "overwritable", "available", "local"};
6b02a499 1995
90988f77 1996/* Output flags of edge to a file F. */
ba392339 1997
90988f77
ML
1998void
1999cgraph_edge::dump_edge_flags (FILE *f)
ba392339 2000{
90988f77 2001 if (speculative)
ba392339 2002 fprintf (f, "(speculative) ");
90988f77 2003 if (!inline_failed)
ba392339 2004 fprintf (f, "(inlined) ");
1a0bf5e1
JH
2005 if (call_stmt_cannot_inline_p)
2006 fprintf (f, "(call_stmt_cannot_inline_p) ");
90988f77 2007 if (indirect_inlining_edge)
ba392339 2008 fprintf (f, "(indirect_inlining) ");
90988f77 2009 if (count)
16998094 2010 fprintf (f, "(%" PRId64"x) ", (int64_t)count);
90988f77
ML
2011 if (frequency)
2012 fprintf (f, "(%.2f per call) ", frequency / (double)CGRAPH_FREQ_BASE);
2013 if (can_throw_external)
ba392339
JH
2014 fprintf (f, "(can throw external) ");
2015}
c4e622b6 2016
d52f5295 2017/* Dump call graph node to file F. */
c4e622b6 2018
18c6ada9 2019void
d52f5295 2020cgraph_node::dump (FILE *f)
18c6ada9 2021{
3dafb85c 2022 cgraph_edge *edge;
e33c6cd6 2023
d52f5295 2024 dump_base (f);
8f940ee6 2025
d52f5295 2026 if (global.inlined_to)
8f940ee6 2027 fprintf (f, " Function %s/%i is inline copy in %s/%i\n",
2a72a953 2028 xstrdup_for_dump (name ()),
d52f5295 2029 order,
2a72a953 2030 xstrdup_for_dump (global.inlined_to->name ()),
d52f5295
ML
2031 global.inlined_to->order);
2032 if (clone_of)
8f940ee6 2033 fprintf (f, " Clone of %s/%i\n",
d52f5295
ML
2034 clone_of->asm_name (),
2035 clone_of->order);
3dafb85c 2036 if (symtab->function_flags_ready)
8f940ee6 2037 fprintf (f, " Availability: %s\n",
d52f5295 2038 cgraph_availability_names [get_availability ()]);
8f940ee6 2039
d52f5295 2040 if (profile_id)
634ab819 2041 fprintf (f, " Profile id: %i\n",
d52f5295
ML
2042 profile_id);
2043 fprintf (f, " First run: %i\n", tp_first_run);
8f940ee6 2044 fprintf (f, " Function flags:");
d52f5295 2045 if (count)
16998094 2046 fprintf (f, " executed %" PRId64"x",
d52f5295
ML
2047 (int64_t)count);
2048 if (origin)
2049 fprintf (f, " nested in: %s", origin->asm_name ());
2050 if (gimple_has_body_p (decl))
726a989a 2051 fprintf (f, " body");
d52f5295 2052 if (process)
257eb6e3 2053 fprintf (f, " process");
d52f5295 2054 if (local.local)
18c6ada9 2055 fprintf (f, " local");
d52f5295 2056 if (local.redefined_extern_inline)
e7d6beb0 2057 fprintf (f, " redefined_extern_inline");
d52f5295 2058 if (only_called_at_startup)
844db5d0 2059 fprintf (f, " only_called_at_startup");
d52f5295 2060 if (only_called_at_exit)
844db5d0 2061 fprintf (f, " only_called_at_exit");
d52f5295 2062 if (tm_clone)
0a35513e 2063 fprintf (f, " tm_clone");
b84d4347
ML
2064 if (icf_merged)
2065 fprintf (f, " icf_merged");
88636b62
JH
2066 if (merged_comdat)
2067 fprintf (f, " merged_comdat");
4f4ada6a
JH
2068 if (split_part)
2069 fprintf (f, " split_part");
2070 if (indirect_call_target)
2071 fprintf (f, " indirect_call_target");
8413ca87
JJ
2072 if (nonfreeing_fn)
2073 fprintf (f, " nonfreeing_fn");
d52f5295
ML
2074 if (DECL_STATIC_CONSTRUCTOR (decl))
2075 fprintf (f," static_constructor (priority:%i)", get_init_priority ());
2076 if (DECL_STATIC_DESTRUCTOR (decl))
2077 fprintf (f," static_destructor (priority:%i)", get_fini_priority ());
a89bd7d2
JH
2078 if (frequency == NODE_FREQUENCY_HOT)
2079 fprintf (f, " hot");
2080 if (frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
2081 fprintf (f, " unlikely_executed");
2082 if (frequency == NODE_FREQUENCY_EXECUTED_ONCE)
2083 fprintf (f, " executed_once");
2084 if (only_called_at_startup)
2085 fprintf (f, " only_called_at_startup");
2086 if (only_called_at_exit)
2087 fprintf (f, " only_called_at_exit");
2088 if (opt_for_fn (decl, optimize_size))
2089 fprintf (f, " optimize_size");
a79b7ec5
TV
2090 if (parallelized_function)
2091 fprintf (f, " parallelized_function");
18c6ada9 2092
c47d0034
JH
2093 fprintf (f, "\n");
2094
d52f5295 2095 if (thunk.thunk_p)
c47d0034 2096 {
40a7fe1e 2097 fprintf (f, " Thunk");
d52f5295 2098 if (thunk.alias)
40a7fe1e 2099 fprintf (f, " of %s (asm: %s)",
d52f5295
ML
2100 lang_hooks.decl_printable_name (thunk.alias, 2),
2101 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk.alias)));
40a7fe1e 2102 fprintf (f, " fixed offset %i virtual value %i has "
c47d0034 2103 "virtual offset %i)\n",
d52f5295
ML
2104 (int)thunk.fixed_offset,
2105 (int)thunk.virtual_value,
2106 (int)thunk.virtual_offset_p);
c47d0034 2107 }
d52f5295
ML
2108 if (alias && thunk.alias
2109 && DECL_P (thunk.alias))
39e2db00 2110 {
8f940ee6 2111 fprintf (f, " Alias of %s",
d52f5295
ML
2112 lang_hooks.decl_printable_name (thunk.alias, 2));
2113 if (DECL_ASSEMBLER_NAME_SET_P (thunk.alias))
39e2db00 2114 fprintf (f, " (asm: %s)",
d52f5295 2115 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk.alias)));
39e2db00
JH
2116 fprintf (f, "\n");
2117 }
c47d0034 2118
8f940ee6 2119 fprintf (f, " Called by: ");
c47d0034 2120
d52f5295 2121 for (edge = callers; edge; edge = edge->next_caller)
18c6ada9 2122 {
fec39fa6 2123 fprintf (f, "%s/%i ", edge->caller->asm_name (),
67348ccc 2124 edge->caller->order);
90988f77 2125 edge->dump_edge_flags (f);
18c6ada9
JH
2126 }
2127
8f940ee6 2128 fprintf (f, "\n Calls: ");
d52f5295 2129 for (edge = callees; edge; edge = edge->next_callee)
18c6ada9 2130 {
fec39fa6 2131 fprintf (f, "%s/%i ", edge->callee->asm_name (),
67348ccc 2132 edge->callee->order);
90988f77 2133 edge->dump_edge_flags (f);
18c6ada9
JH
2134 }
2135 fprintf (f, "\n");
6744a6ab 2136
d52f5295 2137 for (edge = indirect_calls; edge; edge = edge->next_callee)
ba392339
JH
2138 {
2139 if (edge->indirect_info->polymorphic)
2140 {
2141 fprintf (f, " Polymorphic indirect call of type ");
2142 print_generic_expr (f, edge->indirect_info->otr_type, TDF_SLIM);
2143 fprintf (f, " token:%i", (int) edge->indirect_info->otr_token);
2144 }
2145 else
2146 fprintf (f, " Indirect call");
90988f77 2147 edge->dump_edge_flags (f);
ba392339
JH
2148 if (edge->indirect_info->param_index != -1)
2149 {
2150 fprintf (f, " of param:%i", edge->indirect_info->param_index);
2151 if (edge->indirect_info->agg_contents)
2152 fprintf (f, " loaded from %s %s at offset %i",
2153 edge->indirect_info->member_ptr ? "member ptr" : "aggregate",
2154 edge->indirect_info->by_ref ? "passed by reference":"",
2155 (int)edge->indirect_info->offset);
0127c169
JH
2156 if (edge->indirect_info->vptr_changed)
2157 fprintf (f, " (vptr maybe changed)");
ba392339
JH
2158 }
2159 fprintf (f, "\n");
2160 if (edge->indirect_info->polymorphic)
2161 edge->indirect_info->context.dump (f);
2162 }
d5e254e1
IE
2163
2164 if (instrumentation_clone)
2165 fprintf (f, " Is instrumented version.\n");
2166 else if (instrumented_version)
2167 fprintf (f, " Has instrumented version.\n");
18c6ada9
JH
2168}
2169
c4e622b6
DN
2170/* Dump call graph node NODE to stderr. */
2171
24e47c76 2172DEBUG_FUNCTION void
d52f5295 2173cgraph_node::debug (void)
c4e622b6 2174{
d52f5295 2175 dump (stderr);
c4e622b6
DN
2176}
2177
c4e622b6 2178/* Dump the callgraph to file F. */
e72fcfe8
JH
2179
2180void
d52f5295 2181cgraph_node::dump_cgraph (FILE *f)
e72fcfe8 2182{
3dafb85c 2183 cgraph_node *node;
e72fcfe8 2184
7d82fe7c 2185 fprintf (f, "callgraph:\n\n");
65c70e6b 2186 FOR_EACH_FUNCTION (node)
d52f5295 2187 node->dump (f);
c4e622b6
DN
2188}
2189
1bb17c21 2190/* Return true when the DECL can possibly be inlined. */
d52f5295 2191
1bb17c21
JH
2192bool
2193cgraph_function_possibly_inlined_p (tree decl)
2194{
3dafb85c 2195 if (!symtab->global_info_ready)
e90acd93 2196 return !DECL_UNINLINABLE (decl);
6f312d18 2197 return DECL_POSSIBLY_INLINED (decl);
18c6ada9
JH
2198}
2199
d52f5295 2200/* cgraph_node is no longer nested function; update cgraph accordingly. */
8f235343 2201void
d52f5295 2202cgraph_node::unnest (void)
8f235343 2203{
3dafb85c 2204 cgraph_node **node2 = &origin->nested;
d52f5295 2205 gcc_assert (origin);
8f235343 2206
d52f5295 2207 while (*node2 != this)
8f235343 2208 node2 = &(*node2)->next_nested;
d52f5295
ML
2209 *node2 = next_nested;
2210 origin = NULL;
8f235343 2211}
6b02a499
JH
2212
2213/* Return function availability. See cgraph.h for description of individual
2214 return values. */
2215enum availability
f13fe18b 2216cgraph_node::get_availability (symtab_node *ref)
6b02a499 2217{
f13fe18b
JH
2218 if (ref)
2219 {
2220 cgraph_node *cref = dyn_cast <cgraph_node *> (ref);
2221 if (cref)
2222 ref = cref->global.inlined_to;
2223 }
6b02a499 2224 enum availability avail;
d52f5295 2225 if (!analyzed)
6b02a499 2226 avail = AVAIL_NOT_AVAILABLE;
d52f5295 2227 else if (local.local)
6b02a499 2228 avail = AVAIL_LOCAL;
f13fe18b
JH
2229 else if (global.inlined_to)
2230 avail = AVAIL_AVAILABLE;
71e54687 2231 else if (transparent_alias)
f13fe18b 2232 ultimate_alias_target (&avail, ref);
d52f5295
ML
2233 else if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)))
2234 avail = AVAIL_INTERPOSABLE;
2235 else if (!externally_visible)
6b02a499 2236 avail = AVAIL_AVAILABLE;
f13fe18b
JH
2237 /* If this is a reference from symbol itself and there are no aliases, we
2238 may be sure that the symbol was not interposed by soemthing else because
2239 the symbol itself would be unreachable otherwise.
2240
2241 Also comdat groups are always resolved in groups. */
2242 else if ((this == ref && !has_aliases_p ())
2243 || (ref && get_comdat_group ()
2244 && get_comdat_group () == ref->get_comdat_group ()))
2245 avail = AVAIL_AVAILABLE;
61502ca8
NF
2246 /* Inline functions are safe to be analyzed even if their symbol can
2247 be overwritten at runtime. It is not meaningful to enforce any sane
9c582551 2248 behavior on replacing inline function by different body. */
d52f5295 2249 else if (DECL_DECLARED_INLINE_P (decl))
4a371c8d 2250 avail = AVAIL_AVAILABLE;
6b02a499
JH
2251
2252 /* If the function can be overwritten, return OVERWRITABLE. Take
2253 care at least of two notable extensions - the COMDAT functions
2254 used to share template instantiations in C++ (this is symmetric
2255 to code cp_cannot_inline_tree_fn and probably shall be shared and
f13fe18b 2256 the inlinability hooks completely eliminated). */
4a371c8d 2257
d52f5295
ML
2258 else if (decl_replaceable_p (decl) && !DECL_EXTERNAL (decl))
2259 avail = AVAIL_INTERPOSABLE;
6b02a499
JH
2260 else avail = AVAIL_AVAILABLE;
2261
2262 return avail;
2263}
2264
be330ed4
JH
2265/* Worker for cgraph_node_can_be_local_p. */
2266static bool
3dafb85c 2267cgraph_node_cannot_be_local_p_1 (cgraph_node *node, void *)
be330ed4 2268{
67348ccc
DM
2269 return !(!node->force_output
2270 && ((DECL_COMDAT (node->decl)
2271 && !node->forced_by_abi
d52f5295 2272 && !node->used_from_object_file_p ()
67348ccc
DM
2273 && !node->same_comdat_group)
2274 || !node->externally_visible));
be330ed4
JH
2275}
2276
d52f5295 2277/* Return true if cgraph_node can be made local for API change.
a550d677
MJ
2278 Extern inline functions and C++ COMDAT functions can be made local
2279 at the expense of possible code size growth if function is used in multiple
2280 compilation units. */
2281bool
d52f5295 2282cgraph_node::can_be_local_p (void)
a550d677 2283{
d52f5295
ML
2284 return (!address_taken
2285 && !call_for_symbol_thunks_and_aliases (cgraph_node_cannot_be_local_p_1,
2286 NULL, true));
a550d677
MJ
2287}
2288
6cbde2e3 2289/* Call callback on cgraph_node, thunks and aliases associated to cgraph_node.
6b715bf6 2290 When INCLUDE_OVERWRITABLE is false, overwritable symbols are
6cbde2e3
BE
2291 skipped. When EXCLUDE_VIRTUAL_THUNKS is true, virtual thunks are
2292 skipped. */
be330ed4 2293bool
d52f5295
ML
2294cgraph_node::call_for_symbol_thunks_and_aliases (bool (*callback)
2295 (cgraph_node *, void *),
2296 void *data,
6cbde2e3
BE
2297 bool include_overwritable,
2298 bool exclude_virtual_thunks)
be330ed4 2299{
3dafb85c
ML
2300 cgraph_edge *e;
2301 ipa_ref *ref;
6b715bf6 2302 enum availability avail = AVAIL_AVAILABLE;
be330ed4 2303
6b715bf6
JH
2304 if (include_overwritable
2305 || (avail = get_availability ()) > AVAIL_INTERPOSABLE)
2306 {
2307 if (callback (this, data))
2308 return true;
2309 }
1ede94c5
JH
2310 FOR_EACH_ALIAS (this, ref)
2311 {
2312 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2313 if (include_overwritable
2314 || alias->get_availability () > AVAIL_INTERPOSABLE)
2315 if (alias->call_for_symbol_thunks_and_aliases (callback, data,
2316 include_overwritable,
2317 exclude_virtual_thunks))
2318 return true;
2319 }
6b715bf6 2320 if (avail <= AVAIL_INTERPOSABLE)
69a4e898 2321 return false;
d52f5295 2322 for (e = callers; e; e = e->next_caller)
be330ed4
JH
2323 if (e->caller->thunk.thunk_p
2324 && (include_overwritable
6cbde2e3
BE
2325 || e->caller->get_availability () > AVAIL_INTERPOSABLE)
2326 && !(exclude_virtual_thunks
2327 && e->caller->thunk.virtual_offset_p))
d52f5295 2328 if (e->caller->call_for_symbol_thunks_and_aliases (callback, data,
6cbde2e3
BE
2329 include_overwritable,
2330 exclude_virtual_thunks))
9aa3f5c5 2331 return true;
e55637b7 2332
be330ed4
JH
2333 return false;
2334}
2335
be330ed4
JH
2336/* Worker to bring NODE local. */
2337
d52f5295 2338bool
3dafb85c 2339cgraph_node::make_local (cgraph_node *node, void *)
be330ed4 2340{
d52f5295 2341 gcc_checking_assert (node->can_be_local_p ());
67348ccc 2342 if (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
a550d677 2343 {
d52f5295 2344 node->make_decl_local ();
da66d596 2345 node->set_section (NULL);
24d047a3 2346 node->set_comdat_group (NULL);
67348ccc
DM
2347 node->externally_visible = false;
2348 node->forced_by_abi = false;
a550d677 2349 node->local.local = true;
da66d596 2350 node->set_section (NULL);
f1703a2e
JH
2351 node->unique_name = ((node->resolution == LDPR_PREVAILING_DEF_IRONLY
2352 || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
2353 && !flag_incremental_link);
67348ccc 2354 node->resolution = LDPR_PREVAILING_DEF_IRONLY;
d52f5295 2355 gcc_assert (node->get_availability () == AVAIL_LOCAL);
a550d677 2356 }
be330ed4 2357 return false;
a550d677
MJ
2358}
2359
d52f5295 2360/* Bring cgraph node local. */
be330ed4
JH
2361
2362void
d52f5295 2363cgraph_node::make_local (void)
be330ed4 2364{
d52f5295 2365 call_for_symbol_thunks_and_aliases (cgraph_node::make_local, NULL, true);
be330ed4
JH
2366}
2367
2368/* Worker to set nothrow flag. */
2369
a2b056a3
JH
2370static void
2371set_nothrow_flag_1 (cgraph_node *node, bool nothrow, bool non_call,
2372 bool *changed)
be330ed4 2373{
3dafb85c 2374 cgraph_edge *e;
71fb4f92 2375
a2b056a3
JH
2376 if (nothrow && !TREE_NOTHROW (node->decl))
2377 {
2378 /* With non-call exceptions we can't say for sure if other function body
2379 was not possibly optimized to stil throw. */
2380 if (!non_call || node->binds_to_current_def_p ())
2381 {
2382 TREE_NOTHROW (node->decl) = true;
2383 *changed = true;
2384 for (e = node->callers; e; e = e->next_caller)
2385 e->can_throw_external = false;
2386 }
2387 }
2388 else if (!nothrow && TREE_NOTHROW (node->decl))
2389 {
2390 TREE_NOTHROW (node->decl) = false;
2391 *changed = true;
2392 }
2393 ipa_ref *ref;
2394 FOR_EACH_ALIAS (node, ref)
2395 {
2396 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2397 if (!nothrow || alias->get_availability () > AVAIL_INTERPOSABLE)
2398 set_nothrow_flag_1 (alias, nothrow, non_call, changed);
2399 }
2400 for (cgraph_edge *e = node->callers; e; e = e->next_caller)
2401 if (e->caller->thunk.thunk_p
2402 && (!nothrow || e->caller->get_availability () > AVAIL_INTERPOSABLE))
2403 set_nothrow_flag_1 (e->caller, nothrow, non_call, changed);
be330ed4
JH
2404}
2405
2406/* Set TREE_NOTHROW on NODE's decl and on aliases of NODE
20cdc2be
JJ
2407 if any to NOTHROW. */
2408
a2b056a3 2409bool
d52f5295 2410cgraph_node::set_nothrow_flag (bool nothrow)
20cdc2be 2411{
a2b056a3
JH
2412 bool changed = false;
2413 bool non_call = opt_for_fn (decl, flag_non_call_exceptions);
2414
2415 if (!nothrow || get_availability () > AVAIL_INTERPOSABLE)
2416 set_nothrow_flag_1 (this, nothrow, non_call, &changed);
2417 else
2418 {
2419 ipa_ref *ref;
2420
2421 FOR_EACH_ALIAS (this, ref)
2422 {
2423 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2424 if (!nothrow || alias->get_availability () > AVAIL_INTERPOSABLE)
2425 set_nothrow_flag_1 (alias, nothrow, non_call, &changed);
2426 }
2427 }
2428 return changed;
20cdc2be
JJ
2429}
2430
69a4e898 2431/* Worker to set_const_flag. */
20cdc2be 2432
69a4e898
JH
2433static void
2434set_const_flag_1 (cgraph_node *node, bool set_const, bool looping,
2435 bool *changed)
20cdc2be 2436{
530f3a1b
JH
2437 /* Static constructors and destructors without a side effect can be
2438 optimized out. */
69a4e898 2439 if (set_const && !looping)
530f3a1b 2440 {
67348ccc 2441 if (DECL_STATIC_CONSTRUCTOR (node->decl))
69a4e898
JH
2442 {
2443 DECL_STATIC_CONSTRUCTOR (node->decl) = 0;
2444 *changed = true;
2445 }
67348ccc 2446 if (DECL_STATIC_DESTRUCTOR (node->decl))
69a4e898
JH
2447 {
2448 DECL_STATIC_DESTRUCTOR (node->decl) = 0;
2449 *changed = true;
2450 }
530f3a1b 2451 }
69a4e898
JH
2452 if (!set_const)
2453 {
2454 if (TREE_READONLY (node->decl))
2455 {
2456 TREE_READONLY (node->decl) = 0;
2457 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2458 *changed = true;
2459 }
2460 }
2461 else
2462 {
2463 /* Consider function:
cc950f98 2464
69a4e898
JH
2465 bool a(int *p)
2466 {
2467 return *p==*p;
2468 }
cc950f98 2469
69a4e898 2470 During early optimization we will turn this into:
cc950f98 2471
69a4e898
JH
2472 bool a(int *p)
2473 {
2474 return true;
2475 }
cc950f98 2476
69a4e898
JH
2477 Now if this function will be detected as CONST however when interposed
2478 it may end up being just pure. We always must assume the worst
2479 scenario here. */
2480 if (TREE_READONLY (node->decl))
2481 {
2482 if (!looping && DECL_LOOPING_CONST_OR_PURE_P (node->decl))
2483 {
2484 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2485 *changed = true;
2486 }
2487 }
2488 else if (node->binds_to_current_def_p ())
2489 {
2490 TREE_READONLY (node->decl) = true;
2491 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = looping;
2492 DECL_PURE_P (node->decl) = false;
2493 *changed = true;
2494 }
2495 else
2496 {
2497 if (dump_file && (dump_flags & TDF_DETAILS))
2498 fprintf (dump_file, "Dropping state to PURE because function does "
2499 "not bind to current def.\n");
2500 if (!DECL_PURE_P (node->decl))
2501 {
2502 DECL_PURE_P (node->decl) = true;
2503 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = looping;
2504 *changed = true;
2505 }
2506 else if (!looping && DECL_LOOPING_CONST_OR_PURE_P (node->decl))
2507 {
2508 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2509 *changed = true;
2510 }
2511 }
2512 }
cc950f98 2513
69a4e898
JH
2514 ipa_ref *ref;
2515 FOR_EACH_ALIAS (node, ref)
cc950f98 2516 {
69a4e898
JH
2517 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2518 if (!set_const || alias->get_availability () > AVAIL_INTERPOSABLE)
2519 set_const_flag_1 (alias, set_const, looping, changed);
cc950f98 2520 }
69a4e898
JH
2521 for (cgraph_edge *e = node->callers; e; e = e->next_caller)
2522 if (e->caller->thunk.thunk_p
2523 && (!set_const || e->caller->get_availability () > AVAIL_INTERPOSABLE))
2524 {
2525 /* Virtual thunks access virtual offset in the vtable, so they can
2526 only be pure, never const. */
2527 if (set_const
2528 && (e->caller->thunk.virtual_offset_p
2529 || !node->binds_to_current_def_p (e->caller)))
2530 *changed |= e->caller->set_pure_flag (true, looping);
2531 else
2532 set_const_flag_1 (e->caller, set_const, looping, changed);
2533 }
20cdc2be
JJ
2534}
2535
69a4e898
JH
2536/* If SET_CONST is true, mark function, aliases and thunks to be ECF_CONST.
2537 If SET_CONST if false, clear the flag.
20cdc2be 2538
69a4e898
JH
2539 When setting the flag be careful about possible interposition and
2540 do not set the flag for functions that can be interposet and set pure
2541 flag for functions that can bind to other definition.
2542
2543 Return true if any change was done. */
2544
2545bool
2546cgraph_node::set_const_flag (bool set_const, bool looping)
20cdc2be 2547{
69a4e898
JH
2548 bool changed = false;
2549 if (!set_const || get_availability () > AVAIL_INTERPOSABLE)
2550 set_const_flag_1 (this, set_const, looping, &changed);
2551 else
2552 {
2553 ipa_ref *ref;
2554
2555 FOR_EACH_ALIAS (this, ref)
2556 {
2557 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2558 if (!set_const || alias->get_availability () > AVAIL_INTERPOSABLE)
2559 set_const_flag_1 (alias, set_const, looping, &changed);
2560 }
2561 }
2562 return changed;
be330ed4
JH
2563}
2564
69a4e898
JH
2565/* Info used by set_pure_flag_1. */
2566
a2b056a3 2567struct set_pure_flag_info
69a4e898
JH
2568{
2569 bool pure;
2570 bool looping;
2571 bool changed;
2572};
2573
2574/* Worker to set_pure_flag. */
be330ed4
JH
2575
2576static bool
69a4e898 2577set_pure_flag_1 (cgraph_node *node, void *data)
be330ed4 2578{
69a4e898 2579 struct set_pure_flag_info *info = (struct set_pure_flag_info *)data;
a1ffba98 2580 /* Static constructors and destructors without a side effect can be
530f3a1b 2581 optimized out. */
69a4e898 2582 if (info->pure && !info->looping)
530f3a1b 2583 {
67348ccc 2584 if (DECL_STATIC_CONSTRUCTOR (node->decl))
69a4e898
JH
2585 {
2586 DECL_STATIC_CONSTRUCTOR (node->decl) = 0;
2587 info->changed = true;
2588 }
67348ccc 2589 if (DECL_STATIC_DESTRUCTOR (node->decl))
69a4e898
JH
2590 {
2591 DECL_STATIC_DESTRUCTOR (node->decl) = 0;
2592 info->changed = true;
2593 }
2594 }
2595 if (info->pure)
2596 {
2597 if (!DECL_PURE_P (node->decl) && !TREE_READONLY (node->decl))
2598 {
2599 DECL_PURE_P (node->decl) = true;
2600 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = info->looping;
2601 info->changed = true;
2602 }
2603 else if (DECL_LOOPING_CONST_OR_PURE_P (node->decl)
2604 && !info->looping)
2605 {
2606 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2607 info->changed = true;
2608 }
2609 }
2610 else
2611 {
2612 if (DECL_PURE_P (node->decl))
2613 {
2614 DECL_PURE_P (node->decl) = false;
2615 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2616 info->changed = true;
2617 }
530f3a1b 2618 }
be330ed4 2619 return false;
20cdc2be
JJ
2620}
2621
d52f5295 2622/* Set DECL_PURE_P on cgraph_node's decl and on aliases of the node
69a4e898 2623 if any to PURE.
be330ed4 2624
69a4e898
JH
2625 When setting the flag, be careful about possible interposition.
2626 Return true if any change was done. */
2627
2628bool
d52f5295 2629cgraph_node::set_pure_flag (bool pure, bool looping)
fa5f5e27 2630{
69a4e898
JH
2631 struct set_pure_flag_info info = {pure, looping, false};
2632 if (!pure)
2633 looping = false;
2634 call_for_symbol_thunks_and_aliases (set_pure_flag_1, &info, !pure, true);
2635 return info.changed;
be330ed4 2636}
844db5d0 2637
d52f5295 2638/* Return true when cgraph_node can not return or throw and thus
d56026c2
JH
2639 it is safe to ignore its side effects for IPA analysis. */
2640
2641bool
d52f5295 2642cgraph_node::cannot_return_p (void)
d56026c2 2643{
d52f5295 2644 int flags = flags_from_decl_or_type (decl);
a6b1490d 2645 if (!opt_for_fn (decl, flag_exceptions))
d56026c2
JH
2646 return (flags & ECF_NORETURN) != 0;
2647 else
2648 return ((flags & (ECF_NORETURN | ECF_NOTHROW))
2649 == (ECF_NORETURN | ECF_NOTHROW));
2650}
2651
3dafb85c 2652/* Return true when call of edge can not lead to return from caller
d56026c2
JH
2653 and thus it is safe to ignore its side effects for IPA analysis
2654 when computing side effects of the caller.
2655 FIXME: We could actually mark all edges that have no reaching
6626665f 2656 patch to the exit block or throw to get better results. */
d56026c2 2657bool
3dafb85c 2658cgraph_edge::cannot_lead_to_return_p (void)
d56026c2 2659{
3dafb85c 2660 if (caller->cannot_return_p ())
f10ea640 2661 return true;
3dafb85c 2662 if (indirect_unknown_callee)
d56026c2 2663 {
3dafb85c 2664 int flags = indirect_info->ecf_flags;
a6b1490d 2665 if (!opt_for_fn (caller->decl, flag_exceptions))
d56026c2
JH
2666 return (flags & ECF_NORETURN) != 0;
2667 else
2668 return ((flags & (ECF_NORETURN | ECF_NOTHROW))
2669 == (ECF_NORETURN | ECF_NOTHROW));
2670 }
2671 else
3dafb85c 2672 return callee->cannot_return_p ();
d56026c2
JH
2673}
2674
893479de
AM
2675/* Return true if the call can be hot. */
2676
2677bool
2678cgraph_edge::maybe_hot_p (void)
2679{
a6b1490d
JH
2680 /* TODO: Export profile_status from cfun->cfg to cgraph_node. */
2681 if (profile_info
2682 && opt_for_fn (caller->decl, flag_branch_probabilities)
893479de
AM
2683 && !maybe_hot_count_p (NULL, count))
2684 return false;
2685 if (caller->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
2686 || (callee
2687 && callee->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED))
2688 return false;
2689 if (caller->frequency > NODE_FREQUENCY_UNLIKELY_EXECUTED
2690 && (callee
2691 && callee->frequency <= NODE_FREQUENCY_EXECUTED_ONCE))
2692 return false;
a6b1490d
JH
2693 if (opt_for_fn (caller->decl, optimize_size))
2694 return false;
893479de
AM
2695 if (caller->frequency == NODE_FREQUENCY_HOT)
2696 return true;
2697 if (caller->frequency == NODE_FREQUENCY_EXECUTED_ONCE
2698 && frequency < CGRAPH_FREQ_BASE * 3 / 2)
2699 return false;
a6b1490d 2700 if (opt_for_fn (caller->decl, flag_guess_branch_prob))
893479de
AM
2701 {
2702 if (PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION) == 0
2703 || frequency <= (CGRAPH_FREQ_BASE
a6b1490d 2704 / PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION)))
893479de
AM
2705 return false;
2706 }
2707 return true;
2708}
2709
9aa3f5c5
JH
2710/* Worker for cgraph_can_remove_if_no_direct_calls_p. */
2711
2712static bool
3dafb85c 2713nonremovable_p (cgraph_node *node, void *)
9aa3f5c5 2714{
d52f5295 2715 return !node->can_remove_if_no_direct_calls_and_refs_p ();
9aa3f5c5
JH
2716}
2717
a6a543bf
JH
2718/* Return true if whole comdat group can be removed if there are no direct
2719 calls to THIS. */
9aa3f5c5
JH
2720
2721bool
e0d514da 2722cgraph_node::can_remove_if_no_direct_calls_p (bool will_inline)
9aa3f5c5 2723{
a6a543bf
JH
2724 struct ipa_ref *ref;
2725
2726 /* For local symbols or non-comdat group it is the same as
2727 can_remove_if_no_direct_calls_p. */
2728 if (!externally_visible || !same_comdat_group)
2729 {
2730 if (DECL_EXTERNAL (decl))
2731 return true;
2732 if (address_taken)
2733 return false;
2734 return !call_for_symbol_and_aliases (nonremovable_p, NULL, true);
2735 }
2736
e0d514da
JH
2737 if (will_inline && address_taken)
2738 return false;
2739
a6a543bf
JH
2740 /* Otheriwse check if we can remove the symbol itself and then verify
2741 that only uses of the comdat groups are direct call to THIS
2742 or its aliases. */
2743 if (!can_remove_if_no_direct_calls_and_refs_p ())
9aa3f5c5 2744 return false;
a6a543bf
JH
2745
2746 /* Check that all refs come from within the comdat group. */
2747 for (int i = 0; iterate_referring (i, ref); i++)
2748 if (ref->referring->get_comdat_group () != get_comdat_group ())
2749 return false;
2750
2751 struct cgraph_node *target = ultimate_alias_target ();
2752 for (cgraph_node *next = dyn_cast<cgraph_node *> (same_comdat_group);
2753 next != this; next = dyn_cast<cgraph_node *> (next->same_comdat_group))
2754 {
2755 if (!externally_visible)
2756 continue;
2757 if (!next->alias
2758 && !next->can_remove_if_no_direct_calls_and_refs_p ())
2759 return false;
2760
2761 /* If we see different symbol than THIS, be sure to check calls. */
2762 if (next->ultimate_alias_target () != target)
2763 for (cgraph_edge *e = next->callers; e; e = e->next_caller)
e0d514da
JH
2764 if (e->caller->get_comdat_group () != get_comdat_group ()
2765 || will_inline)
a6a543bf
JH
2766 return false;
2767
e0d514da
JH
2768 /* If function is not being inlined, we care only about
2769 references outside of the comdat group. */
2770 if (!will_inline)
2771 for (int i = 0; next->iterate_referring (i, ref); i++)
2772 if (ref->referring->get_comdat_group () != get_comdat_group ())
2773 return false;
a6a543bf
JH
2774 }
2775 return true;
9aa3f5c5
JH
2776}
2777
d52f5295 2778/* Return true when function cgraph_node can be expected to be removed
09411461
JH
2779 from program when direct calls in this compilation unit are removed.
2780
2781 As a special case COMDAT functions are
2782 cgraph_can_remove_if_no_direct_calls_p while the are not
2783 cgraph_only_called_directly_p (it is possible they are called from other
2784 unit)
2785
2786 This function behaves as cgraph_only_called_directly_p because eliminating
61502ca8 2787 all uses of COMDAT function does not make it necessarily disappear from
09411461
JH
2788 the program unless we are compiling whole program or we do LTO. In this
2789 case we know we win since dynamic linking will not really discard the
2790 linkonce section. */
2791
2792bool
e0d514da
JH
2793cgraph_node::will_be_removed_from_program_if_no_direct_calls_p
2794 (bool will_inline)
09411461 2795{
d52f5295 2796 gcc_assert (!global.inlined_to);
a6a543bf
JH
2797 if (DECL_EXTERNAL (decl))
2798 return true;
d52f5295 2799
09411461 2800 if (!in_lto_p && !flag_whole_program)
530f3a1b 2801 {
a6a543bf
JH
2802 /* If the symbol is in comdat group, we need to verify that whole comdat
2803 group becomes unreachable. Technically we could skip references from
2804 within the group, too. */
2805 if (!only_called_directly_p ())
2806 return false;
2807 if (same_comdat_group && externally_visible)
2808 {
2809 struct cgraph_node *target = ultimate_alias_target ();
e0d514da
JH
2810
2811 if (will_inline && address_taken)
2812 return true;
a6a543bf
JH
2813 for (cgraph_node *next = dyn_cast<cgraph_node *> (same_comdat_group);
2814 next != this;
2815 next = dyn_cast<cgraph_node *> (next->same_comdat_group))
2816 {
2817 if (!externally_visible)
2818 continue;
2819 if (!next->alias
2820 && !next->only_called_directly_p ())
2821 return false;
2822
2823 /* If we see different symbol than THIS,
2824 be sure to check calls. */
2825 if (next->ultimate_alias_target () != target)
2826 for (cgraph_edge *e = next->callers; e; e = e->next_caller)
e0d514da
JH
2827 if (e->caller->get_comdat_group () != get_comdat_group ()
2828 || will_inline)
a6a543bf 2829 return false;
a6a543bf
JH
2830 }
2831 }
2832 return true;
530f3a1b 2833 }
a6a543bf 2834 else
e0d514da 2835 return can_remove_if_no_direct_calls_p (will_inline);
09411461
JH
2836}
2837
051f8cc6 2838
be330ed4
JH
2839/* Worker for cgraph_only_called_directly_p. */
2840
2841static bool
3dafb85c 2842cgraph_not_only_called_directly_p_1 (cgraph_node *node, void *)
be330ed4 2843{
d52f5295 2844 return !node->only_called_directly_or_aliased_p ();
be330ed4
JH
2845}
2846
d52f5295 2847/* Return true when function cgraph_node and all its aliases are only called
be330ed4
JH
2848 directly.
2849 i.e. it is not externally visible, address was not taken and
2850 it is not used in any other non-standard way. */
2851
2852bool
d52f5295 2853cgraph_node::only_called_directly_p (void)
be330ed4 2854{
d52f5295
ML
2855 gcc_assert (ultimate_alias_target () == this);
2856 return !call_for_symbol_and_aliases (cgraph_not_only_called_directly_p_1,
be330ed4
JH
2857 NULL, true);
2858}
2859
2860
2861/* Collect all callers of NODE. Worker for collect_callers_of_node. */
2862
2863static bool
3dafb85c 2864collect_callers_of_node_1 (cgraph_node *node, void *data)
be330ed4 2865{
d52f5295 2866 vec<cgraph_edge *> *redirect_callers = (vec<cgraph_edge *> *)data;
3dafb85c 2867 cgraph_edge *cs;
be330ed4 2868 enum availability avail;
d52f5295 2869 node->ultimate_alias_target (&avail);
be330ed4 2870
d52f5295 2871 if (avail > AVAIL_INTERPOSABLE)
be330ed4 2872 for (cs = node->callers; cs != NULL; cs = cs->next_caller)
4a414de8
MJ
2873 if (!cs->indirect_inlining_edge
2874 && !cs->caller->thunk.thunk_p)
9771b263 2875 redirect_callers->safe_push (cs);
be330ed4
JH
2876 return false;
2877}
2878
d52f5295
ML
2879/* Collect all callers of cgraph_node and its aliases that are known to lead to
2880 cgraph_node (i.e. are not overwritable). */
be330ed4 2881
d52f5295
ML
2882vec<cgraph_edge *>
2883cgraph_node::collect_callers (void)
be330ed4 2884{
d52f5295
ML
2885 vec<cgraph_edge *> redirect_callers = vNULL;
2886 call_for_symbol_thunks_and_aliases (collect_callers_of_node_1,
2887 &redirect_callers, false);
be330ed4
JH
2888 return redirect_callers;
2889}
2890
610c8ef0
MJ
2891/* Return TRUE if NODE2 a clone of NODE or is equivalent to it. */
2892
9c8305f8 2893static bool
3dafb85c 2894clone_of_p (cgraph_node *node, cgraph_node *node2)
9c8305f8 2895{
610c8ef0 2896 bool skipped_thunk = false;
d52f5295
ML
2897 node = node->ultimate_alias_target ();
2898 node2 = node2->ultimate_alias_target ();
610c8ef0
MJ
2899
2900 /* There are no virtual clones of thunks so check former_clone_of or if we
2901 might have skipped thunks because this adjustments are no longer
2902 necessary. */
2903 while (node->thunk.thunk_p)
2904 {
2905 if (node2->former_clone_of == node->decl)
2906 return true;
2907 if (!node->thunk.this_adjusting)
2908 return false;
d52f5295 2909 node = node->callees->callee->ultimate_alias_target ();
610c8ef0
MJ
2910 skipped_thunk = true;
2911 }
2912
803d0ab0
MJ
2913 if (skipped_thunk)
2914 {
2915 if (!node2->clone.args_to_skip
2916 || !bitmap_bit_p (node2->clone.args_to_skip, 0))
2917 return false;
2918 if (node2->former_clone_of == node->decl)
2919 return true;
2920 else if (!node2->clone_of)
2921 return false;
2922 }
610c8ef0 2923
9c8305f8
JH
2924 while (node != node2 && node2)
2925 node2 = node2->clone_of;
2926 return node2 != NULL;
2927}
2928
90988f77 2929/* Verify edge count and frequency. */
9c8305f8 2930
90988f77
ML
2931bool
2932cgraph_edge::verify_count_and_frequency ()
9c8305f8
JH
2933{
2934 bool error_found = false;
90988f77 2935 if (count < 0)
9c8305f8
JH
2936 {
2937 error ("caller edge count is negative");
2938 error_found = true;
2939 }
90988f77 2940 if (frequency < 0)
9c8305f8
JH
2941 {
2942 error ("caller edge frequency is negative");
2943 error_found = true;
2944 }
90988f77 2945 if (frequency > CGRAPH_FREQ_MAX)
9c8305f8
JH
2946 {
2947 error ("caller edge frequency is too large");
2948 error_found = true;
2949 }
9c8305f8
JH
2950 return error_found;
2951}
2952
2953/* Switch to THIS_CFUN if needed and print STMT to stderr. */
2954static void
355fe088 2955cgraph_debug_gimple_stmt (function *this_cfun, gimple *stmt)
9c8305f8 2956{
27f7e1c3 2957 bool fndecl_was_null = false;
9c8305f8
JH
2958 /* debug_gimple_stmt needs correct cfun */
2959 if (cfun != this_cfun)
2960 set_cfun (this_cfun);
27f7e1c3
AH
2961 /* ...and an actual current_function_decl */
2962 if (!current_function_decl)
2963 {
2964 current_function_decl = this_cfun->decl;
2965 fndecl_was_null = true;
2966 }
9c8305f8 2967 debug_gimple_stmt (stmt);
27f7e1c3
AH
2968 if (fndecl_was_null)
2969 current_function_decl = NULL;
9c8305f8
JH
2970}
2971
90988f77 2972/* Verify that call graph edge corresponds to DECL from the associated
9c8305f8
JH
2973 statement. Return true if the verification should fail. */
2974
90988f77
ML
2975bool
2976cgraph_edge::verify_corresponds_to_fndecl (tree decl)
9c8305f8 2977{
3dafb85c 2978 cgraph_node *node;
9c8305f8 2979
90988f77 2980 if (!decl || callee->global.inlined_to)
9c8305f8 2981 return false;
3dafb85c 2982 if (symtab->state == LTO_STREAMING)
ca0f62a8 2983 return false;
d52f5295 2984 node = cgraph_node::get (decl);
9c8305f8
JH
2985
2986 /* We do not know if a node from a different partition is an alias or what it
3d8d0043
MJ
2987 aliases and therefore cannot do the former_clone_of check reliably. When
2988 body_removed is set, we have lost all information about what was alias or
2989 thunk of and also cannot proceed. */
2990 if (!node
2991 || node->body_removed
2992 || node->in_other_partition
0a7246ee 2993 || callee->icf_merged
90988f77 2994 || callee->in_other_partition)
9c8305f8 2995 return false;
9de6f6c3 2996
d52f5295
ML
2997 node = node->ultimate_alias_target ();
2998
9de6f6c3 2999 /* Optimizers can redirect unreachable calls or calls triggering undefined
9c582551 3000 behavior to builtin_unreachable. */
90988f77
ML
3001 if (DECL_BUILT_IN_CLASS (callee->decl) == BUILT_IN_NORMAL
3002 && DECL_FUNCTION_CODE (callee->decl) == BUILT_IN_UNREACHABLE)
9de6f6c3 3003 return false;
9c8305f8 3004
90988f77
ML
3005 if (callee->former_clone_of != node->decl
3006 && (node != callee->ultimate_alias_target ())
3007 && !clone_of_p (node, callee))
9c8305f8
JH
3008 return true;
3009 else
3010 return false;
3011}
3012
3013/* Verify cgraph nodes of given cgraph node. */
3014DEBUG_FUNCTION void
d52f5295 3015cgraph_node::verify_node (void)
9c8305f8 3016{
3dafb85c
ML
3017 cgraph_edge *e;
3018 function *this_cfun = DECL_STRUCT_FUNCTION (decl);
9c8305f8
JH
3019 basic_block this_block;
3020 gimple_stmt_iterator gsi;
3021 bool error_found = false;
3022
3023 if (seen_error ())
3024 return;
3025
3026 timevar_push (TV_CGRAPH_VERIFY);
d52f5295
ML
3027 error_found |= verify_base ();
3028 for (e = callees; e; e = e->next_callee)
9c8305f8
JH
3029 if (e->aux)
3030 {
3031 error ("aux field set for edge %s->%s",
fec39fa6
TS
3032 identifier_to_locale (e->caller->name ()),
3033 identifier_to_locale (e->callee->name ()));
9c8305f8
JH
3034 error_found = true;
3035 }
d52f5295 3036 if (count < 0)
9c8305f8
JH
3037 {
3038 error ("execution count is negative");
3039 error_found = true;
3040 }
d52f5295 3041 if (global.inlined_to && same_comdat_group)
65d630d4
JH
3042 {
3043 error ("inline clone in same comdat group list");
3044 error_found = true;
3045 }
d52f5295 3046 if (!definition && !in_other_partition && local.local)
e70670cf
JH
3047 {
3048 error ("local symbols must be defined");
3049 error_found = true;
3050 }
d52f5295 3051 if (global.inlined_to && externally_visible)
9c8305f8
JH
3052 {
3053 error ("externally visible inline clone");
3054 error_found = true;
3055 }
d52f5295 3056 if (global.inlined_to && address_taken)
9c8305f8
JH
3057 {
3058 error ("inline clone with address taken");
3059 error_found = true;
3060 }
d52f5295 3061 if (global.inlined_to && force_output)
9c8305f8
JH
3062 {
3063 error ("inline clone is forced to output");
3064 error_found = true;
3065 }
d52f5295 3066 for (e = indirect_calls; e; e = e->next_callee)
9c8305f8
JH
3067 {
3068 if (e->aux)
3069 {
3070 error ("aux field set for indirect edge from %s",
fec39fa6 3071 identifier_to_locale (e->caller->name ()));
9c8305f8
JH
3072 error_found = true;
3073 }
3074 if (!e->indirect_unknown_callee
3075 || !e->indirect_info)
3076 {
3077 error ("An indirect edge from %s is not marked as indirect or has "
3078 "associated indirect_info, the corresponding statement is: ",
fec39fa6 3079 identifier_to_locale (e->caller->name ()));
9c8305f8
JH
3080 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3081 error_found = true;
3082 }
3083 }
d52f5295
ML
3084 bool check_comdat = comdat_local_p ();
3085 for (e = callers; e; e = e->next_caller)
9c8305f8 3086 {
90988f77 3087 if (e->verify_count_and_frequency ())
9c8305f8 3088 error_found = true;
1f26ac87 3089 if (check_comdat
d52f5295 3090 && !in_same_comdat_group_p (e->caller))
1f26ac87
JM
3091 {
3092 error ("comdat-local function called by %s outside its comdat",
3093 identifier_to_locale (e->caller->name ()));
3094 error_found = true;
3095 }
9c8305f8
JH
3096 if (!e->inline_failed)
3097 {
d52f5295 3098 if (global.inlined_to
9c8305f8
JH
3099 != (e->caller->global.inlined_to
3100 ? e->caller->global.inlined_to : e->caller))
3101 {
3102 error ("inlined_to pointer is wrong");
3103 error_found = true;
3104 }
d52f5295 3105 if (callers->next_caller)
9c8305f8
JH
3106 {
3107 error ("multiple inline callers");
3108 error_found = true;
3109 }
3110 }
3111 else
d52f5295 3112 if (global.inlined_to)
9c8305f8
JH
3113 {
3114 error ("inlined_to pointer set for noninline callers");
3115 error_found = true;
3116 }
3117 }
1f4eb0e9
JH
3118 for (e = callees; e; e = e->next_callee)
3119 {
3120 if (e->verify_count_and_frequency ())
3121 error_found = true;
3122 if (gimple_has_body_p (e->caller->decl)
3123 && !e->caller->global.inlined_to
3124 && !e->speculative
3125 /* Optimized out calls are redirected to __builtin_unreachable. */
3126 && (e->frequency
3127 || e->callee->decl
3128 != builtin_decl_implicit (BUILT_IN_UNREACHABLE))
3129 && (e->frequency
3130 != compute_call_stmt_bb_frequency (e->caller->decl,
3131 gimple_bb (e->call_stmt))))
3132 {
3133 error ("caller edge frequency %i does not match BB frequency %i",
3134 e->frequency,
3135 compute_call_stmt_bb_frequency (e->caller->decl,
3136 gimple_bb (e->call_stmt)));
3137 error_found = true;
3138 }
3139 }
d52f5295 3140 for (e = indirect_calls; e; e = e->next_callee)
1f4eb0e9
JH
3141 {
3142 if (e->verify_count_and_frequency ())
3143 error_found = true;
3144 if (gimple_has_body_p (e->caller->decl)
3145 && !e->caller->global.inlined_to
3146 && !e->speculative
3147 && (e->frequency
3148 != compute_call_stmt_bb_frequency (e->caller->decl,
3149 gimple_bb (e->call_stmt))))
3150 {
3151 error ("indirect call frequency %i does not match BB frequency %i",
3152 e->frequency,
3153 compute_call_stmt_bb_frequency (e->caller->decl,
3154 gimple_bb (e->call_stmt)));
3155 error_found = true;
3156 }
3157 }
d52f5295 3158 if (!callers && global.inlined_to)
9c8305f8
JH
3159 {
3160 error ("inlined_to pointer is set but no predecessors found");
3161 error_found = true;
3162 }
d52f5295 3163 if (global.inlined_to == this)
9c8305f8
JH
3164 {
3165 error ("inlined_to pointer refers to itself");
3166 error_found = true;
3167 }
3168
d52f5295 3169 if (clone_of)
9c8305f8 3170 {
3dafb85c 3171 cgraph_node *n;
d52f5295
ML
3172 for (n = clone_of->clones; n; n = n->next_sibling_clone)
3173 if (n == this)
9c8305f8
JH
3174 break;
3175 if (!n)
3176 {
d52f5295 3177 error ("cgraph_node has wrong clone_of");
9c8305f8
JH
3178 error_found = true;
3179 }
3180 }
d52f5295 3181 if (clones)
9c8305f8 3182 {
3dafb85c 3183 cgraph_node *n;
d52f5295
ML
3184 for (n = clones; n; n = n->next_sibling_clone)
3185 if (n->clone_of != this)
9c8305f8
JH
3186 break;
3187 if (n)
3188 {
d52f5295 3189 error ("cgraph_node has wrong clone list");
9c8305f8
JH
3190 error_found = true;
3191 }
3192 }
d52f5295 3193 if ((prev_sibling_clone || next_sibling_clone) && !clone_of)
9c8305f8 3194 {
d52f5295 3195 error ("cgraph_node is in clone list but it is not clone");
9c8305f8
JH
3196 error_found = true;
3197 }
d52f5295 3198 if (!prev_sibling_clone && clone_of && clone_of->clones != this)
9c8305f8 3199 {
d52f5295 3200 error ("cgraph_node has wrong prev_clone pointer");
9c8305f8
JH
3201 error_found = true;
3202 }
d52f5295 3203 if (prev_sibling_clone && prev_sibling_clone->next_sibling_clone != this)
9c8305f8
JH
3204 {
3205 error ("double linked list of clones corrupted");
3206 error_found = true;
3207 }
3208
d52f5295 3209 if (analyzed && alias)
9c8305f8
JH
3210 {
3211 bool ref_found = false;
3212 int i;
3dafb85c 3213 ipa_ref *ref = NULL;
9c8305f8 3214
d52f5295 3215 if (callees)
9c8305f8
JH
3216 {
3217 error ("Alias has call edges");
3218 error_found = true;
3219 }
d52f5295 3220 for (i = 0; iterate_reference (i, ref); i++)
d5e254e1
IE
3221 if (ref->use == IPA_REF_CHKP)
3222 ;
3223 else if (ref->use != IPA_REF_ALIAS)
9c8305f8
JH
3224 {
3225 error ("Alias has non-alias reference");
3226 error_found = true;
3227 }
3228 else if (ref_found)
3229 {
3230 error ("Alias has more than one alias reference");
3231 error_found = true;
3232 }
3233 else
3234 ref_found = true;
21c0a521
DM
3235 if (!ref_found)
3236 {
3237 error ("Analyzed alias has no reference");
3238 error_found = true;
3239 }
9c8305f8 3240 }
d5e254e1
IE
3241
3242 /* Check instrumented version reference. */
3243 if (instrumented_version
3244 && instrumented_version->instrumented_version != this)
3245 {
3246 error ("Instrumentation clone does not reference original node");
3247 error_found = true;
3248 }
3249
3250 /* Cannot have orig_decl for not instrumented nodes. */
3251 if (!instrumentation_clone && orig_decl)
3252 {
3253 error ("Not instrumented node has non-NULL original declaration");
3254 error_found = true;
3255 }
3256
3257 /* If original not instrumented node still exists then we may check
3258 original declaration is set properly. */
3259 if (instrumented_version
3260 && orig_decl
3261 && orig_decl != instrumented_version->decl)
3262 {
3263 error ("Instrumented node has wrong original declaration");
3264 error_found = true;
3265 }
3266
3267 /* Check all nodes have chkp reference to their instrumented versions. */
3268 if (analyzed
3269 && instrumented_version
3270 && !instrumentation_clone)
3271 {
3272 bool ref_found = false;
3273 int i;
3274 struct ipa_ref *ref;
3275
3276 for (i = 0; iterate_reference (i, ref); i++)
3277 if (ref->use == IPA_REF_CHKP)
3278 {
3279 if (ref_found)
3280 {
3281 error ("Node has more than one chkp reference");
3282 error_found = true;
3283 }
3284 if (ref->referred != instrumented_version)
3285 {
3286 error ("Wrong node is referenced with chkp reference");
3287 error_found = true;
3288 }
3289 ref_found = true;
3290 }
3291
3292 if (!ref_found)
3293 {
3294 error ("Analyzed node has no reference to instrumented version");
3295 error_found = true;
3296 }
3297 }
3298
48de5d37
IE
3299 if (instrumentation_clone
3300 && DECL_BUILT_IN_CLASS (decl) == NOT_BUILT_IN)
3301 {
3302 tree name = DECL_ASSEMBLER_NAME (decl);
3303 tree orig_name = DECL_ASSEMBLER_NAME (orig_decl);
3304
3305 if (!IDENTIFIER_TRANSPARENT_ALIAS (name)
3306 || TREE_CHAIN (name) != orig_name)
3307 {
3308 error ("Alias chain for instrumented node is broken");
3309 error_found = true;
3310 }
3311 }
3312
d52f5295 3313 if (analyzed && thunk.thunk_p)
9c8305f8 3314 {
d52f5295 3315 if (!callees)
9c8305f8
JH
3316 {
3317 error ("No edge out of thunk node");
3318 error_found = true;
3319 }
d52f5295 3320 else if (callees->next_callee)
9c8305f8
JH
3321 {
3322 error ("More than one edge out of thunk node");
3323 error_found = true;
3324 }
0b9004ed 3325 if (gimple_has_body_p (decl) && !global.inlined_to)
9c8305f8
JH
3326 {
3327 error ("Thunk is not supposed to have body");
3328 error_found = true;
3329 }
d5e254e1
IE
3330 if (thunk.add_pointer_bounds_args
3331 && !instrumented_version->semantically_equivalent_p (callees->callee))
3332 {
3333 error ("Instrumentation thunk has wrong edge callee");
3334 error_found = true;
3335 }
9c8305f8 3336 }
d52f5295
ML
3337 else if (analyzed && gimple_has_body_p (decl)
3338 && !TREE_ASM_WRITTEN (decl)
3339 && (!DECL_EXTERNAL (decl) || global.inlined_to)
3340 && !flag_wpa)
9c8305f8
JH
3341 {
3342 if (this_cfun->cfg)
3343 {
355fe088 3344 hash_set<gimple *> stmts;
71cafea9 3345 int i;
3dafb85c 3346 ipa_ref *ref = NULL;
71cafea9 3347
9c8305f8
JH
3348 /* Reach the trees by walking over the CFG, and note the
3349 enclosing basic-blocks in the call edges. */
3350 FOR_EACH_BB_FN (this_block, this_cfun)
71cafea9
JH
3351 {
3352 for (gsi = gsi_start_phis (this_block);
3353 !gsi_end_p (gsi); gsi_next (&gsi))
6e2830c3 3354 stmts.add (gsi_stmt (gsi));
71cafea9
JH
3355 for (gsi = gsi_start_bb (this_block);
3356 !gsi_end_p (gsi);
3357 gsi_next (&gsi))
3358 {
355fe088 3359 gimple *stmt = gsi_stmt (gsi);
6e2830c3 3360 stmts.add (stmt);
71cafea9
JH
3361 if (is_gimple_call (stmt))
3362 {
3dafb85c 3363 cgraph_edge *e = get_edge (stmt);
71cafea9
JH
3364 tree decl = gimple_call_fndecl (stmt);
3365 if (e)
3366 {
3367 if (e->aux)
3368 {
3369 error ("shared call_stmt:");
3370 cgraph_debug_gimple_stmt (this_cfun, stmt);
3371 error_found = true;
3372 }
3373 if (!e->indirect_unknown_callee)
3374 {
90988f77 3375 if (e->verify_corresponds_to_fndecl (decl))
71cafea9
JH
3376 {
3377 error ("edge points to wrong declaration:");
67348ccc 3378 debug_tree (e->callee->decl);
71cafea9
JH
3379 fprintf (stderr," Instead of:");
3380 debug_tree (decl);
3381 error_found = true;
3382 }
3383 }
3384 else if (decl)
3385 {
3386 error ("an indirect edge with unknown callee "
3387 "corresponding to a call_stmt with "
3388 "a known declaration:");
3389 error_found = true;
3390 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3391 }
3392 e->aux = (void *)1;
3393 }
3394 else if (decl)
3395 {
3396 error ("missing callgraph edge for call stmt:");
3397 cgraph_debug_gimple_stmt (this_cfun, stmt);
3398 error_found = true;
3399 }
3400 }
3401 }
9c8305f8 3402 }
d52f5295 3403 for (i = 0; iterate_reference (i, ref); i++)
6e2830c3 3404 if (ref->stmt && !stmts.contains (ref->stmt))
71cafea9
JH
3405 {
3406 error ("reference to dead statement");
3407 cgraph_debug_gimple_stmt (this_cfun, ref->stmt);
3408 error_found = true;
3409 }
9c8305f8
JH
3410 }
3411 else
3412 /* No CFG available?! */
3413 gcc_unreachable ();
3414
d52f5295 3415 for (e = callees; e; e = e->next_callee)
9c8305f8
JH
3416 {
3417 if (!e->aux)
3418 {
3419 error ("edge %s->%s has no corresponding call_stmt",
fec39fa6
TS
3420 identifier_to_locale (e->caller->name ()),
3421 identifier_to_locale (e->callee->name ()));
9c8305f8
JH
3422 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3423 error_found = true;
3424 }
3425 e->aux = 0;
3426 }
d52f5295 3427 for (e = indirect_calls; e; e = e->next_callee)
9c8305f8 3428 {
042ae7d2 3429 if (!e->aux && !e->speculative)
9c8305f8
JH
3430 {
3431 error ("an indirect edge from %s has no corresponding call_stmt",
fec39fa6 3432 identifier_to_locale (e->caller->name ()));
9c8305f8
JH
3433 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3434 error_found = true;
3435 }
3436 e->aux = 0;
3437 }
3438 }
3439 if (error_found)
3440 {
d52f5295 3441 dump (stderr);
9c8305f8
JH
3442 internal_error ("verify_cgraph_node failed");
3443 }
3444 timevar_pop (TV_CGRAPH_VERIFY);
3445}
3446
3447/* Verify whole cgraph structure. */
3448DEBUG_FUNCTION void
d52f5295 3449cgraph_node::verify_cgraph_nodes (void)
9c8305f8 3450{
3dafb85c 3451 cgraph_node *node;
9c8305f8
JH
3452
3453 if (seen_error ())
3454 return;
3455
3456 FOR_EACH_FUNCTION (node)
d52f5295 3457 node->verify ();
9c8305f8 3458}
48f4a6fa 3459
d52f5295 3460/* Walk the alias chain to return the function cgraph_node is alias of.
6cbde2e3 3461 Walk through thunks, too.
f13fe18b
JH
3462 When AVAILABILITY is non-NULL, get minimal availability in the chain.
3463 When REF is non-NULL, assume that reference happens in symbol REF
3464 when determining the availability. */
e70670cf 3465
d52f5295 3466cgraph_node *
f13fe18b
JH
3467cgraph_node::function_symbol (enum availability *availability,
3468 struct symtab_node *ref)
e70670cf 3469{
f13fe18b 3470 cgraph_node *node = ultimate_alias_target (availability, ref);
d52f5295 3471
6cbde2e3 3472 while (node->thunk.thunk_p)
e70670cf 3473 {
f13fe18b 3474 ref = node;
6cbde2e3
BE
3475 node = node->callees->callee;
3476 if (availability)
3477 {
3478 enum availability a;
f13fe18b 3479 a = node->get_availability (ref);
6cbde2e3
BE
3480 if (a < *availability)
3481 *availability = a;
3482 }
f13fe18b 3483 node = node->ultimate_alias_target (availability, ref);
6cbde2e3
BE
3484 }
3485 return node;
3486}
3487
3488/* Walk the alias chain to return the function cgraph_node is alias of.
3489 Walk through non virtual thunks, too. Thus we return either a function
3490 or a virtual thunk node.
f13fe18b
JH
3491 When AVAILABILITY is non-NULL, get minimal availability in the chain.
3492 When REF is non-NULL, assume that reference happens in symbol REF
3493 when determining the availability. */
6cbde2e3
BE
3494
3495cgraph_node *
3496cgraph_node::function_or_virtual_thunk_symbol
f13fe18b
JH
3497 (enum availability *availability,
3498 struct symtab_node *ref)
6cbde2e3 3499{
f13fe18b 3500 cgraph_node *node = ultimate_alias_target (availability, ref);
6cbde2e3
BE
3501
3502 while (node->thunk.thunk_p && !node->thunk.virtual_offset_p)
3503 {
f13fe18b 3504 ref = node;
6cbde2e3
BE
3505 node = node->callees->callee;
3506 if (availability)
e70670cf 3507 {
6cbde2e3 3508 enum availability a;
f13fe18b 3509 a = node->get_availability (ref);
6cbde2e3
BE
3510 if (a < *availability)
3511 *availability = a;
e70670cf 3512 }
f13fe18b 3513 node = node->ultimate_alias_target (availability, ref);
6cbde2e3 3514 }
e70670cf
JH
3515 return node;
3516}
3517
d52f5295
ML
3518/* When doing LTO, read cgraph_node's body from disk if it is not already
3519 present. */
a2e2a668
JH
3520
3521bool
70486010 3522cgraph_node::get_untransformed_body (void)
a2e2a668 3523{
3dafb85c 3524 lto_file_decl_data *file_data;
a2e2a668
JH
3525 const char *data, *name;
3526 size_t len;
d52f5295 3527 tree decl = this->decl;
a2e2a668 3528
e9191ad3
JH
3529 /* Check if body is already there. Either we have gimple body or
3530 the function is thunk and in that case we set DECL_ARGUMENTS. */
3531 if (DECL_ARGUMENTS (decl) || gimple_has_body_p (decl))
a2e2a668
JH
3532 return false;
3533
e9191ad3 3534 gcc_assert (in_lto_p && !DECL_RESULT (decl));
a2e2a668 3535
917dd9bf
JH
3536 timevar_push (TV_IPA_LTO_GIMPLE_IN);
3537
d52f5295 3538 file_data = lto_file_data;
a2e2a668
JH
3539 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
3540
3541 /* We may have renamed the declaration, e.g., a static function. */
3542 name = lto_get_decl_name_mapping (file_data, name);
ca834876
JH
3543 struct lto_in_decl_state *decl_state
3544 = lto_get_function_in_decl_state (file_data, decl);
a2e2a668
JH
3545
3546 data = lto_get_section_data (file_data, LTO_section_function_body,
ca834876 3547 name, &len, decl_state->compressed);
a2e2a668 3548 if (!data)
40fecdd6 3549 fatal_error (input_location, "%s: section %s is missing",
a2e2a668
JH
3550 file_data->file_name,
3551 name);
a2e2a668
JH
3552
3553 gcc_assert (DECL_STRUCT_FUNCTION (decl) == NULL);
3554
d52f5295 3555 lto_input_function_body (file_data, this, data);
a2e2a668
JH
3556 lto_stats.num_function_bodies++;
3557 lto_free_section_data (file_data, LTO_section_function_body, name,
ca834876 3558 data, len, decl_state->compressed);
d52f5295 3559 lto_free_function_in_decl_state_for_node (this);
1c4db829
JH
3560 /* Keep lto file data so ipa-inline-analysis knows about cross module
3561 inlining. */
917dd9bf
JH
3562
3563 timevar_pop (TV_IPA_LTO_GIMPLE_IN);
3564
a2e2a668
JH
3565 return true;
3566}
3567
70486010
JH
3568/* Prepare function body. When doing LTO, read cgraph_node's body from disk
3569 if it is not already present. When some IPA transformations are scheduled,
3570 apply them. */
3571
3572bool
3573cgraph_node::get_body (void)
3574{
3575 bool updated;
3576
3577 updated = get_untransformed_body ();
3578
3579 /* Getting transformed body makes no sense for inline clones;
56aae4b7 3580 we should never use this on real clones because they are materialized
70486010
JH
3581 early.
3582 TODO: Materializing clones here will likely lead to smaller LTRANS
3583 footprint. */
3584 gcc_assert (!global.inlined_to && !clone_of);
3585 if (ipa_transforms_to_apply.exists ())
3586 {
3587 opt_pass *saved_current_pass = current_pass;
3588 FILE *saved_dump_file = dump_file;
5a15be97 3589 const char *saved_dump_file_name = dump_file_name;
70486010 3590 int saved_dump_flags = dump_flags;
5a15be97 3591 dump_file_name = NULL;
fa22501a 3592 dump_file = NULL;
70486010
JH
3593
3594 push_cfun (DECL_STRUCT_FUNCTION (decl));
3595 execute_all_ipa_transforms ();
3596 cgraph_edge::rebuild_edges ();
3597 free_dominance_info (CDI_DOMINATORS);
3598 free_dominance_info (CDI_POST_DOMINATORS);
3599 pop_cfun ();
3600 updated = true;
3601
3602 current_pass = saved_current_pass;
3603 dump_file = saved_dump_file;
5a15be97 3604 dump_file_name = saved_dump_file_name;
70486010
JH
3605 dump_flags = saved_dump_flags;
3606 }
3607 return updated;
3608}
3609
8ccda8bc
EB
3610/* Return the DECL_STRUCT_FUNCTION of the function. */
3611
3612struct function *
3613cgraph_node::get_fun (void)
3614{
3615 cgraph_node *node = this;
3616 struct function *fun = DECL_STRUCT_FUNCTION (node->decl);
3617
3618 while (!fun && node->clone_of)
3619 {
3620 node = node->clone_of;
3621 fun = DECL_STRUCT_FUNCTION (node->decl);
3622 }
3623
3624 return fun;
3625}
3626
4484a35a
AM
3627/* Verify if the type of the argument matches that of the function
3628 declaration. If we cannot verify this or there is a mismatch,
3629 return false. */
3630
3631static bool
355fe088 3632gimple_check_call_args (gimple *stmt, tree fndecl, bool args_count_match)
4484a35a
AM
3633{
3634 tree parms, p;
3635 unsigned int i, nargs;
3636
3637 /* Calls to internal functions always match their signature. */
3638 if (gimple_call_internal_p (stmt))
3639 return true;
3640
3641 nargs = gimple_call_num_args (stmt);
3642
3643 /* Get argument types for verification. */
3644 if (fndecl)
3645 parms = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
3646 else
3647 parms = TYPE_ARG_TYPES (gimple_call_fntype (stmt));
3648
3649 /* Verify if the type of the argument matches that of the function
3650 declaration. If we cannot verify this or there is a mismatch,
3651 return false. */
3652 if (fndecl && DECL_ARGUMENTS (fndecl))
3653 {
3654 for (i = 0, p = DECL_ARGUMENTS (fndecl);
3655 i < nargs;
3656 i++, p = DECL_CHAIN (p))
3657 {
3658 tree arg;
3659 /* We cannot distinguish a varargs function from the case
3660 of excess parameters, still deferring the inlining decision
3661 to the callee is possible. */
3662 if (!p)
3663 break;
3664 arg = gimple_call_arg (stmt, i);
3665 if (p == error_mark_node
5147d10a 3666 || DECL_ARG_TYPE (p) == error_mark_node
4484a35a
AM
3667 || arg == error_mark_node
3668 || (!types_compatible_p (DECL_ARG_TYPE (p), TREE_TYPE (arg))
3669 && !fold_convertible_p (DECL_ARG_TYPE (p), arg)))
3670 return false;
3671 }
3672 if (args_count_match && p)
3673 return false;
3674 }
3675 else if (parms)
3676 {
3677 for (i = 0, p = parms; i < nargs; i++, p = TREE_CHAIN (p))
3678 {
3679 tree arg;
3680 /* If this is a varargs function defer inlining decision
3681 to callee. */
3682 if (!p)
3683 break;
3684 arg = gimple_call_arg (stmt, i);
3685 if (TREE_VALUE (p) == error_mark_node
3686 || arg == error_mark_node
3687 || TREE_CODE (TREE_VALUE (p)) == VOID_TYPE
3688 || (!types_compatible_p (TREE_VALUE (p), TREE_TYPE (arg))
3689 && !fold_convertible_p (TREE_VALUE (p), arg)))
3690 return false;
3691 }
3692 }
3693 else
3694 {
3695 if (nargs != 0)
3696 return false;
3697 }
3698 return true;
3699}
3700
3701/* Verify if the type of the argument and lhs of CALL_STMT matches
3702 that of the function declaration CALLEE. If ARGS_COUNT_MATCH is
3703 true, the arg count needs to be the same.
3704 If we cannot verify this or there is a mismatch, return false. */
3705
3706bool
355fe088 3707gimple_check_call_matching_types (gimple *call_stmt, tree callee,
4484a35a
AM
3708 bool args_count_match)
3709{
3710 tree lhs;
3711
3712 if ((DECL_RESULT (callee)
3713 && !DECL_BY_REFERENCE (DECL_RESULT (callee))
3714 && (lhs = gimple_call_lhs (call_stmt)) != NULL_TREE
3715 && !useless_type_conversion_p (TREE_TYPE (DECL_RESULT (callee)),
3716 TREE_TYPE (lhs))
3717 && !fold_convertible_p (TREE_TYPE (DECL_RESULT (callee)), lhs))
3718 || !gimple_check_call_args (call_stmt, callee, args_count_match))
3719 return false;
3720 return true;
3721}
3722
3edf64aa
DM
3723/* Reset all state within cgraph.c so that we can rerun the compiler
3724 within the same process. For use by toplev::finalize. */
3725
3726void
3727cgraph_c_finalize (void)
3728{
3729 symtab = NULL;
3730
3731 x_cgraph_nodes_queue = NULL;
3732
3733 cgraph_fnver_htab = NULL;
3734 version_info_node = NULL;
3735}
3736
31de7606
JH
3737/* A wroker for call_for_symbol_and_aliases. */
3738
3739bool
3740cgraph_node::call_for_symbol_and_aliases_1 (bool (*callback) (cgraph_node *,
3741 void *),
3742 void *data,
3743 bool include_overwritable)
3744{
3745 ipa_ref *ref;
3746 FOR_EACH_ALIAS (this, ref)
3747 {
3748 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
3749 if (include_overwritable
3750 || alias->get_availability () > AVAIL_INTERPOSABLE)
3751 if (alias->call_for_symbol_and_aliases (callback, data,
3752 include_overwritable))
3753 return true;
3754 }
3755 return false;
3756}
17d1bf76
ML
3757
3758/* Return true if NODE has thunk. */
3759
3760bool
3761cgraph_node::has_thunk_p (cgraph_node *node, void *)
3762{
3763 for (cgraph_edge *e = node->callers; e; e = e->next_caller)
3764 if (e->caller->thunk.thunk_p)
3765 return true;
3766 return false;
3767}
3768
988d1653 3769#include "gt-cgraph.h"