Daily bump.
[official-gcc.git] / gcc / cgraph.c
blobc6ab7e38ff6a1a4f699a0df688638a737f4d6af3
1 /* Callgraph handling code.
2 Copyright (C) 2003-2017 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* This file contains basic routines manipulating call graph
23 The call-graph is a data structure designed for inter-procedural
24 optimization. It represents a multi-graph where nodes are functions
25 (symbols within symbol table) and edges are call sites. */
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "backend.h"
31 #include "target.h"
32 #include "rtl.h"
33 #include "tree.h"
34 #include "gimple.h"
35 #include "predict.h"
36 #include "alloc-pool.h"
37 #include "gimple-ssa.h"
38 #include "cgraph.h"
39 #include "lto-streamer.h"
40 #include "fold-const.h"
41 #include "varasm.h"
42 #include "calls.h"
43 #include "print-tree.h"
44 #include "langhooks.h"
45 #include "intl.h"
46 #include "tree-eh.h"
47 #include "gimple-iterator.h"
48 #include "tree-cfg.h"
49 #include "tree-ssa.h"
50 #include "value-prof.h"
51 #include "ipa-utils.h"
52 #include "symbol-summary.h"
53 #include "tree-vrp.h"
54 #include "ipa-prop.h"
55 #include "ipa-fnsummary.h"
56 #include "cfgloop.h"
57 #include "gimple-pretty-print.h"
58 #include "tree-dfa.h"
59 #include "profile.h"
60 #include "params.h"
61 #include "tree-chkp.h"
62 #include "context.h"
63 #include "gimplify.h"
64 #include "stringpool.h"
65 #include "attribs.h"
67 /* FIXME: Only for PROP_loops, but cgraph shouldn't have to know about this. */
68 #include "tree-pass.h"
70 /* Queue of cgraph nodes scheduled to be lowered. */
71 symtab_node *x_cgraph_nodes_queue;
72 #define cgraph_nodes_queue ((cgraph_node *)x_cgraph_nodes_queue)
74 /* Symbol table global context. */
75 symbol_table *symtab;
77 /* List of hooks triggered on cgraph_edge events. */
78 struct cgraph_edge_hook_list {
79 cgraph_edge_hook hook;
80 void *data;
81 struct cgraph_edge_hook_list *next;
84 /* List of hooks triggered on cgraph_node events. */
85 struct cgraph_node_hook_list {
86 cgraph_node_hook hook;
87 void *data;
88 struct cgraph_node_hook_list *next;
91 /* List of hooks triggered on events involving two cgraph_edges. */
92 struct cgraph_2edge_hook_list {
93 cgraph_2edge_hook hook;
94 void *data;
95 struct cgraph_2edge_hook_list *next;
98 /* List of hooks triggered on events involving two cgraph_nodes. */
99 struct cgraph_2node_hook_list {
100 cgraph_2node_hook hook;
101 void *data;
102 struct cgraph_2node_hook_list *next;
105 /* Hash descriptor for cgraph_function_version_info. */
107 struct function_version_hasher : ggc_ptr_hash<cgraph_function_version_info>
109 static hashval_t hash (cgraph_function_version_info *);
110 static bool equal (cgraph_function_version_info *,
111 cgraph_function_version_info *);
114 /* Map a cgraph_node to cgraph_function_version_info using this htab.
115 The cgraph_function_version_info has a THIS_NODE field that is the
116 corresponding cgraph_node.. */
118 static GTY(()) hash_table<function_version_hasher> *cgraph_fnver_htab = NULL;
120 /* Hash function for cgraph_fnver_htab. */
121 hashval_t
122 function_version_hasher::hash (cgraph_function_version_info *ptr)
124 int uid = ptr->this_node->uid;
125 return (hashval_t)(uid);
128 /* eq function for cgraph_fnver_htab. */
129 bool
130 function_version_hasher::equal (cgraph_function_version_info *n1,
131 cgraph_function_version_info *n2)
133 return n1->this_node->uid == n2->this_node->uid;
136 /* Mark as GC root all allocated nodes. */
137 static GTY(()) struct cgraph_function_version_info *
138 version_info_node = NULL;
140 /* Return true if NODE's address can be compared. */
142 bool
143 symtab_node::address_can_be_compared_p ()
145 /* Address of virtual tables and functions is never compared. */
146 if (DECL_VIRTUAL_P (decl))
147 return false;
148 /* Address of C++ cdtors is never compared. */
149 if (is_a <cgraph_node *> (this)
150 && (DECL_CXX_CONSTRUCTOR_P (decl)
151 || DECL_CXX_DESTRUCTOR_P (decl)))
152 return false;
153 /* Constant pool symbols addresses are never compared.
154 flag_merge_constants permits us to assume the same on readonly vars. */
155 if (is_a <varpool_node *> (this)
156 && (DECL_IN_CONSTANT_POOL (decl)
157 || (flag_merge_constants >= 2
158 && TREE_READONLY (decl) && !TREE_THIS_VOLATILE (decl))))
159 return false;
160 return true;
163 /* Get the cgraph_function_version_info node corresponding to node. */
164 cgraph_function_version_info *
165 cgraph_node::function_version (void)
167 cgraph_function_version_info key;
168 key.this_node = this;
170 if (cgraph_fnver_htab == NULL)
171 return NULL;
173 return cgraph_fnver_htab->find (&key);
176 /* Insert a new cgraph_function_version_info node into cgraph_fnver_htab
177 corresponding to cgraph_node NODE. */
178 cgraph_function_version_info *
179 cgraph_node::insert_new_function_version (void)
181 version_info_node = NULL;
182 version_info_node = ggc_cleared_alloc<cgraph_function_version_info> ();
183 version_info_node->this_node = this;
185 if (cgraph_fnver_htab == NULL)
186 cgraph_fnver_htab = hash_table<function_version_hasher>::create_ggc (2);
188 *cgraph_fnver_htab->find_slot (version_info_node, INSERT)
189 = version_info_node;
190 return version_info_node;
193 /* Remove the cgraph_function_version_info and cgraph_node for DECL. This
194 DECL is a duplicate declaration. */
195 void
196 cgraph_node::delete_function_version (tree decl)
198 cgraph_node *decl_node = cgraph_node::get (decl);
199 cgraph_function_version_info *decl_v = NULL;
201 if (decl_node == NULL)
202 return;
204 decl_v = decl_node->function_version ();
206 if (decl_v == NULL)
207 return;
209 if (decl_v->prev != NULL)
210 decl_v->prev->next = decl_v->next;
212 if (decl_v->next != NULL)
213 decl_v->next->prev = decl_v->prev;
215 if (cgraph_fnver_htab != NULL)
216 cgraph_fnver_htab->remove_elt (decl_v);
218 decl_node->remove ();
221 /* Record that DECL1 and DECL2 are semantically identical function
222 versions. */
223 void
224 cgraph_node::record_function_versions (tree decl1, tree decl2)
226 cgraph_node *decl1_node = cgraph_node::get_create (decl1);
227 cgraph_node *decl2_node = cgraph_node::get_create (decl2);
228 cgraph_function_version_info *decl1_v = NULL;
229 cgraph_function_version_info *decl2_v = NULL;
230 cgraph_function_version_info *before;
231 cgraph_function_version_info *after;
233 gcc_assert (decl1_node != NULL && decl2_node != NULL);
234 decl1_v = decl1_node->function_version ();
235 decl2_v = decl2_node->function_version ();
237 if (decl1_v != NULL && decl2_v != NULL)
238 return;
240 if (decl1_v == NULL)
241 decl1_v = decl1_node->insert_new_function_version ();
243 if (decl2_v == NULL)
244 decl2_v = decl2_node->insert_new_function_version ();
246 /* Chain decl2_v and decl1_v. All semantically identical versions
247 will be chained together. */
249 before = decl1_v;
250 after = decl2_v;
252 while (before->next != NULL)
253 before = before->next;
255 while (after->prev != NULL)
256 after= after->prev;
258 before->next = after;
259 after->prev = before;
262 /* Initialize callgraph dump file. */
264 void
265 symbol_table::initialize (void)
267 if (!dump_file)
268 dump_file = dump_begin (TDI_cgraph, NULL);
270 if (!ipa_clones_dump_file)
271 ipa_clones_dump_file = dump_begin (TDI_clones, NULL);
274 /* Allocate new callgraph node and insert it into basic data structures. */
276 cgraph_node *
277 symbol_table::create_empty (void)
279 cgraph_node *node = allocate_cgraph_symbol ();
281 node->type = SYMTAB_FUNCTION;
282 node->frequency = NODE_FREQUENCY_NORMAL;
283 node->count_materialization_scale = REG_BR_PROB_BASE;
284 cgraph_count++;
286 return node;
289 /* Register HOOK to be called with DATA on each removed edge. */
290 cgraph_edge_hook_list *
291 symbol_table::add_edge_removal_hook (cgraph_edge_hook hook, void *data)
293 cgraph_edge_hook_list *entry;
294 cgraph_edge_hook_list **ptr = &m_first_edge_removal_hook;
296 entry = (cgraph_edge_hook_list *) xmalloc (sizeof (*entry));
297 entry->hook = hook;
298 entry->data = data;
299 entry->next = NULL;
300 while (*ptr)
301 ptr = &(*ptr)->next;
302 *ptr = entry;
303 return entry;
306 /* Remove ENTRY from the list of hooks called on removing edges. */
307 void
308 symbol_table::remove_edge_removal_hook (cgraph_edge_hook_list *entry)
310 cgraph_edge_hook_list **ptr = &m_first_edge_removal_hook;
312 while (*ptr != entry)
313 ptr = &(*ptr)->next;
314 *ptr = entry->next;
315 free (entry);
318 /* Call all edge removal hooks. */
319 void
320 symbol_table::call_edge_removal_hooks (cgraph_edge *e)
322 cgraph_edge_hook_list *entry = m_first_edge_removal_hook;
323 while (entry)
325 entry->hook (e, entry->data);
326 entry = entry->next;
330 /* Register HOOK to be called with DATA on each removed node. */
331 cgraph_node_hook_list *
332 symbol_table::add_cgraph_removal_hook (cgraph_node_hook hook, void *data)
334 cgraph_node_hook_list *entry;
335 cgraph_node_hook_list **ptr = &m_first_cgraph_removal_hook;
337 entry = (cgraph_node_hook_list *) xmalloc (sizeof (*entry));
338 entry->hook = hook;
339 entry->data = data;
340 entry->next = NULL;
341 while (*ptr)
342 ptr = &(*ptr)->next;
343 *ptr = entry;
344 return entry;
347 /* Remove ENTRY from the list of hooks called on removing nodes. */
348 void
349 symbol_table::remove_cgraph_removal_hook (cgraph_node_hook_list *entry)
351 cgraph_node_hook_list **ptr = &m_first_cgraph_removal_hook;
353 while (*ptr != entry)
354 ptr = &(*ptr)->next;
355 *ptr = entry->next;
356 free (entry);
359 /* Call all node removal hooks. */
360 void
361 symbol_table::call_cgraph_removal_hooks (cgraph_node *node)
363 cgraph_node_hook_list *entry = m_first_cgraph_removal_hook;
364 while (entry)
366 entry->hook (node, entry->data);
367 entry = entry->next;
371 /* Call all node removal hooks. */
372 void
373 symbol_table::call_cgraph_insertion_hooks (cgraph_node *node)
375 cgraph_node_hook_list *entry = m_first_cgraph_insertion_hook;
376 while (entry)
378 entry->hook (node, entry->data);
379 entry = entry->next;
384 /* Register HOOK to be called with DATA on each inserted node. */
385 cgraph_node_hook_list *
386 symbol_table::add_cgraph_insertion_hook (cgraph_node_hook hook, void *data)
388 cgraph_node_hook_list *entry;
389 cgraph_node_hook_list **ptr = &m_first_cgraph_insertion_hook;
391 entry = (cgraph_node_hook_list *) xmalloc (sizeof (*entry));
392 entry->hook = hook;
393 entry->data = data;
394 entry->next = NULL;
395 while (*ptr)
396 ptr = &(*ptr)->next;
397 *ptr = entry;
398 return entry;
401 /* Remove ENTRY from the list of hooks called on inserted nodes. */
402 void
403 symbol_table::remove_cgraph_insertion_hook (cgraph_node_hook_list *entry)
405 cgraph_node_hook_list **ptr = &m_first_cgraph_insertion_hook;
407 while (*ptr != entry)
408 ptr = &(*ptr)->next;
409 *ptr = entry->next;
410 free (entry);
413 /* Register HOOK to be called with DATA on each duplicated edge. */
414 cgraph_2edge_hook_list *
415 symbol_table::add_edge_duplication_hook (cgraph_2edge_hook hook, void *data)
417 cgraph_2edge_hook_list *entry;
418 cgraph_2edge_hook_list **ptr = &m_first_edge_duplicated_hook;
420 entry = (cgraph_2edge_hook_list *) xmalloc (sizeof (*entry));
421 entry->hook = hook;
422 entry->data = data;
423 entry->next = NULL;
424 while (*ptr)
425 ptr = &(*ptr)->next;
426 *ptr = entry;
427 return entry;
430 /* Remove ENTRY from the list of hooks called on duplicating edges. */
431 void
432 symbol_table::remove_edge_duplication_hook (cgraph_2edge_hook_list *entry)
434 cgraph_2edge_hook_list **ptr = &m_first_edge_duplicated_hook;
436 while (*ptr != entry)
437 ptr = &(*ptr)->next;
438 *ptr = entry->next;
439 free (entry);
442 /* Call all edge duplication hooks. */
443 void
444 symbol_table::call_edge_duplication_hooks (cgraph_edge *cs1, cgraph_edge *cs2)
446 cgraph_2edge_hook_list *entry = m_first_edge_duplicated_hook;
447 while (entry)
449 entry->hook (cs1, cs2, entry->data);
450 entry = entry->next;
454 /* Register HOOK to be called with DATA on each duplicated node. */
455 cgraph_2node_hook_list *
456 symbol_table::add_cgraph_duplication_hook (cgraph_2node_hook hook, void *data)
458 cgraph_2node_hook_list *entry;
459 cgraph_2node_hook_list **ptr = &m_first_cgraph_duplicated_hook;
461 entry = (cgraph_2node_hook_list *) xmalloc (sizeof (*entry));
462 entry->hook = hook;
463 entry->data = data;
464 entry->next = NULL;
465 while (*ptr)
466 ptr = &(*ptr)->next;
467 *ptr = entry;
468 return entry;
471 /* Remove ENTRY from the list of hooks called on duplicating nodes. */
472 void
473 symbol_table::remove_cgraph_duplication_hook (cgraph_2node_hook_list *entry)
475 cgraph_2node_hook_list **ptr = &m_first_cgraph_duplicated_hook;
477 while (*ptr != entry)
478 ptr = &(*ptr)->next;
479 *ptr = entry->next;
480 free (entry);
483 /* Call all node duplication hooks. */
484 void
485 symbol_table::call_cgraph_duplication_hooks (cgraph_node *node,
486 cgraph_node *node2)
488 cgraph_2node_hook_list *entry = m_first_cgraph_duplicated_hook;
489 while (entry)
491 entry->hook (node, node2, entry->data);
492 entry = entry->next;
496 /* Return cgraph node assigned to DECL. Create new one when needed. */
498 cgraph_node *
499 cgraph_node::create (tree decl)
501 cgraph_node *node = symtab->create_empty ();
502 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
504 node->decl = decl;
506 node->count = profile_count::uninitialized ();
508 if ((flag_openacc || flag_openmp)
509 && lookup_attribute ("omp declare target", DECL_ATTRIBUTES (decl)))
511 node->offloadable = 1;
512 if (ENABLE_OFFLOADING)
513 g->have_offload = true;
516 node->register_symbol ();
518 if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
520 node->origin = cgraph_node::get_create (DECL_CONTEXT (decl));
521 node->next_nested = node->origin->nested;
522 node->origin->nested = node;
524 return node;
527 /* Try to find a call graph node for declaration DECL and if it does not exist
528 or if it corresponds to an inline clone, create a new one. */
530 cgraph_node *
531 cgraph_node::get_create (tree decl)
533 cgraph_node *first_clone = cgraph_node::get (decl);
535 if (first_clone && !first_clone->global.inlined_to)
536 return first_clone;
538 cgraph_node *node = cgraph_node::create (decl);
539 if (first_clone)
541 first_clone->clone_of = node;
542 node->clones = first_clone;
543 symtab->symtab_prevail_in_asm_name_hash (node);
544 node->decl->decl_with_vis.symtab_node = node;
545 if (dump_file)
546 fprintf (dump_file, "Introduced new external node "
547 "(%s) and turned into root of the clone tree.\n",
548 node->dump_name ());
550 else if (dump_file)
551 fprintf (dump_file, "Introduced new external node "
552 "(%s).\n", node->dump_name ());
553 return node;
556 /* Mark ALIAS as an alias to DECL. DECL_NODE is cgraph node representing
557 the function body is associated with (not necessarily cgraph_node (DECL). */
559 cgraph_node *
560 cgraph_node::create_alias (tree alias, tree target)
562 cgraph_node *alias_node;
564 gcc_assert (TREE_CODE (target) == FUNCTION_DECL
565 || TREE_CODE (target) == IDENTIFIER_NODE);
566 gcc_assert (TREE_CODE (alias) == FUNCTION_DECL);
567 alias_node = cgraph_node::get_create (alias);
568 gcc_assert (!alias_node->definition);
569 alias_node->alias_target = target;
570 alias_node->definition = true;
571 alias_node->alias = true;
572 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (alias)) != NULL)
573 alias_node->transparent_alias = alias_node->weakref = true;
574 return alias_node;
577 /* Attempt to mark ALIAS as an alias to DECL. Return alias node if successful
578 and NULL otherwise.
579 Same body aliases are output whenever the body of DECL is output,
580 and cgraph_node::get (ALIAS) transparently returns
581 cgraph_node::get (DECL). */
583 cgraph_node *
584 cgraph_node::create_same_body_alias (tree alias, tree decl)
586 cgraph_node *n;
587 #ifndef ASM_OUTPUT_DEF
588 /* If aliases aren't supported by the assembler, fail. */
589 return NULL;
590 #endif
591 /* Langhooks can create same body aliases of symbols not defined.
592 Those are useless. Drop them on the floor. */
593 if (symtab->global_info_ready)
594 return NULL;
596 n = cgraph_node::create_alias (alias, decl);
597 n->cpp_implicit_alias = true;
598 if (symtab->cpp_implicit_aliases_done)
599 n->resolve_alias (cgraph_node::get (decl));
600 return n;
603 /* Add thunk alias into callgraph. The alias declaration is ALIAS and it
604 aliases DECL with an adjustments made into the first parameter.
605 See comments in thunk_adjust for detail on the parameters. */
607 cgraph_node *
608 cgraph_node::create_thunk (tree alias, tree, bool this_adjusting,
609 HOST_WIDE_INT fixed_offset,
610 HOST_WIDE_INT virtual_value,
611 tree virtual_offset,
612 tree real_alias)
614 cgraph_node *node;
616 node = cgraph_node::get (alias);
617 if (node)
618 node->reset ();
619 else
620 node = cgraph_node::create (alias);
621 gcc_checking_assert (!virtual_offset
622 || wi::eq_p (virtual_offset, virtual_value));
623 node->thunk.fixed_offset = fixed_offset;
624 node->thunk.this_adjusting = this_adjusting;
625 node->thunk.virtual_value = virtual_value;
626 node->thunk.virtual_offset_p = virtual_offset != NULL;
627 node->thunk.alias = real_alias;
628 node->thunk.thunk_p = true;
629 node->definition = true;
631 return node;
634 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
635 Return NULL if there's no such node. */
637 cgraph_node *
638 cgraph_node::get_for_asmname (tree asmname)
640 /* We do not want to look at inline clones. */
641 for (symtab_node *node = symtab_node::get_for_asmname (asmname);
642 node;
643 node = node->next_sharing_asm_name)
645 cgraph_node *cn = dyn_cast <cgraph_node *> (node);
646 if (cn && !cn->global.inlined_to)
647 return cn;
649 return NULL;
652 /* Returns a hash value for X (which really is a cgraph_edge). */
654 hashval_t
655 cgraph_edge_hasher::hash (cgraph_edge *e)
657 /* This is a really poor hash function, but it is what htab_hash_pointer
658 uses. */
659 return (hashval_t) ((intptr_t)e->call_stmt >> 3);
662 /* Returns a hash value for X (which really is a cgraph_edge). */
664 hashval_t
665 cgraph_edge_hasher::hash (gimple *call_stmt)
667 /* This is a really poor hash function, but it is what htab_hash_pointer
668 uses. */
669 return (hashval_t) ((intptr_t)call_stmt >> 3);
672 /* Return nonzero if the call_stmt of cgraph_edge X is stmt *Y. */
674 inline bool
675 cgraph_edge_hasher::equal (cgraph_edge *x, gimple *y)
677 return x->call_stmt == y;
680 /* Add call graph edge E to call site hash of its caller. */
682 static inline void
683 cgraph_update_edge_in_call_site_hash (cgraph_edge *e)
685 gimple *call = e->call_stmt;
686 *e->caller->call_site_hash->find_slot_with_hash
687 (call, cgraph_edge_hasher::hash (call), INSERT) = e;
690 /* Add call graph edge E to call site hash of its caller. */
692 static inline void
693 cgraph_add_edge_to_call_site_hash (cgraph_edge *e)
695 /* There are two speculative edges for every statement (one direct,
696 one indirect); always hash the direct one. */
697 if (e->speculative && e->indirect_unknown_callee)
698 return;
699 cgraph_edge **slot = e->caller->call_site_hash->find_slot_with_hash
700 (e->call_stmt, cgraph_edge_hasher::hash (e->call_stmt), INSERT);
701 if (*slot)
703 gcc_assert (((cgraph_edge *)*slot)->speculative);
704 if (e->callee)
705 *slot = e;
706 return;
708 gcc_assert (!*slot || e->speculative);
709 *slot = e;
712 /* Return the callgraph edge representing the GIMPLE_CALL statement
713 CALL_STMT. */
715 cgraph_edge *
716 cgraph_node::get_edge (gimple *call_stmt)
718 cgraph_edge *e, *e2;
719 int n = 0;
721 if (call_site_hash)
722 return call_site_hash->find_with_hash
723 (call_stmt, cgraph_edge_hasher::hash (call_stmt));
725 /* This loop may turn out to be performance problem. In such case adding
726 hashtables into call nodes with very many edges is probably best
727 solution. It is not good idea to add pointer into CALL_EXPR itself
728 because we want to make possible having multiple cgraph nodes representing
729 different clones of the same body before the body is actually cloned. */
730 for (e = callees; e; e = e->next_callee)
732 if (e->call_stmt == call_stmt)
733 break;
734 n++;
737 if (!e)
738 for (e = indirect_calls; e; e = e->next_callee)
740 if (e->call_stmt == call_stmt)
741 break;
742 n++;
745 if (n > 100)
747 call_site_hash = hash_table<cgraph_edge_hasher>::create_ggc (120);
748 for (e2 = callees; e2; e2 = e2->next_callee)
749 cgraph_add_edge_to_call_site_hash (e2);
750 for (e2 = indirect_calls; e2; e2 = e2->next_callee)
751 cgraph_add_edge_to_call_site_hash (e2);
754 return e;
758 /* Change field call_stmt of edge to NEW_STMT.
759 If UPDATE_SPECULATIVE and E is any component of speculative
760 edge, then update all components. */
762 void
763 cgraph_edge::set_call_stmt (gcall *new_stmt, bool update_speculative)
765 tree decl;
767 /* Speculative edges has three component, update all of them
768 when asked to. */
769 if (update_speculative && speculative)
771 cgraph_edge *direct, *indirect;
772 ipa_ref *ref;
774 speculative_call_info (direct, indirect, ref);
775 direct->set_call_stmt (new_stmt, false);
776 indirect->set_call_stmt (new_stmt, false);
777 ref->stmt = new_stmt;
778 return;
781 /* Only direct speculative edges go to call_site_hash. */
782 if (caller->call_site_hash
783 && (!speculative || !indirect_unknown_callee))
785 caller->call_site_hash->remove_elt_with_hash
786 (call_stmt, cgraph_edge_hasher::hash (call_stmt));
789 cgraph_edge *e = this;
791 call_stmt = new_stmt;
792 if (indirect_unknown_callee
793 && (decl = gimple_call_fndecl (new_stmt)))
795 /* Constant propagation (and possibly also inlining?) can turn an
796 indirect call into a direct one. */
797 cgraph_node *new_callee = cgraph_node::get (decl);
799 gcc_checking_assert (new_callee);
800 e = make_direct (new_callee);
803 push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
804 e->can_throw_external = stmt_can_throw_external (new_stmt);
805 pop_cfun ();
806 if (e->caller->call_site_hash)
807 cgraph_add_edge_to_call_site_hash (e);
810 /* Allocate a cgraph_edge structure and fill it with data according to the
811 parameters of which only CALLEE can be NULL (when creating an indirect call
812 edge). */
814 cgraph_edge *
815 symbol_table::create_edge (cgraph_node *caller, cgraph_node *callee,
816 gcall *call_stmt, profile_count count, int freq,
817 bool indir_unknown_callee)
819 cgraph_edge *edge;
821 /* LTO does not actually have access to the call_stmt since these
822 have not been loaded yet. */
823 if (call_stmt)
825 /* This is a rather expensive check possibly triggering
826 construction of call stmt hashtable. */
827 cgraph_edge *e;
828 gcc_checking_assert (!(e = caller->get_edge (call_stmt))
829 || e->speculative);
831 gcc_assert (is_gimple_call (call_stmt));
834 if (free_edges)
836 edge = free_edges;
837 free_edges = NEXT_FREE_EDGE (edge);
839 else
841 edge = ggc_alloc<cgraph_edge> ();
842 edge->uid = edges_max_uid++;
845 edges_count++;
847 edge->aux = NULL;
848 edge->caller = caller;
849 edge->callee = callee;
850 edge->prev_caller = NULL;
851 edge->next_caller = NULL;
852 edge->prev_callee = NULL;
853 edge->next_callee = NULL;
854 edge->lto_stmt_uid = 0;
856 edge->count = count;
857 edge->frequency = freq;
858 gcc_checking_assert (freq >= 0);
859 gcc_checking_assert (freq <= CGRAPH_FREQ_MAX);
861 edge->call_stmt = call_stmt;
862 push_cfun (DECL_STRUCT_FUNCTION (caller->decl));
863 edge->can_throw_external
864 = call_stmt ? stmt_can_throw_external (call_stmt) : false;
865 pop_cfun ();
866 if (call_stmt
867 && callee && callee->decl
868 && !gimple_check_call_matching_types (call_stmt, callee->decl,
869 false))
871 edge->inline_failed = CIF_MISMATCHED_ARGUMENTS;
872 edge->call_stmt_cannot_inline_p = true;
874 else
876 edge->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
877 edge->call_stmt_cannot_inline_p = false;
880 edge->indirect_info = NULL;
881 edge->indirect_inlining_edge = 0;
882 edge->speculative = false;
883 edge->indirect_unknown_callee = indir_unknown_callee;
884 if (opt_for_fn (edge->caller->decl, flag_devirtualize)
885 && call_stmt && DECL_STRUCT_FUNCTION (caller->decl))
886 edge->in_polymorphic_cdtor
887 = decl_maybe_in_construction_p (NULL, NULL, call_stmt,
888 caller->decl);
889 else
890 edge->in_polymorphic_cdtor = caller->thunk.thunk_p;
891 if (call_stmt && caller->call_site_hash)
892 cgraph_add_edge_to_call_site_hash (edge);
894 return edge;
897 /* Create edge from a given function to CALLEE in the cgraph. */
899 cgraph_edge *
900 cgraph_node::create_edge (cgraph_node *callee,
901 gcall *call_stmt, profile_count count, int freq)
903 cgraph_edge *edge = symtab->create_edge (this, callee, call_stmt, count,
904 freq, false);
906 initialize_inline_failed (edge);
908 edge->next_caller = callee->callers;
909 if (callee->callers)
910 callee->callers->prev_caller = edge;
911 edge->next_callee = callees;
912 if (callees)
913 callees->prev_callee = edge;
914 callees = edge;
915 callee->callers = edge;
917 return edge;
920 /* Allocate cgraph_indirect_call_info and set its fields to default values. */
922 cgraph_indirect_call_info *
923 cgraph_allocate_init_indirect_info (void)
925 cgraph_indirect_call_info *ii;
927 ii = ggc_cleared_alloc<cgraph_indirect_call_info> ();
928 ii->param_index = -1;
929 return ii;
932 /* Create an indirect edge with a yet-undetermined callee where the call
933 statement destination is a formal parameter of the caller with index
934 PARAM_INDEX. */
936 cgraph_edge *
937 cgraph_node::create_indirect_edge (gcall *call_stmt, int ecf_flags,
938 profile_count count, int freq,
939 bool compute_indirect_info)
941 cgraph_edge *edge = symtab->create_edge (this, NULL, call_stmt,
942 count, freq, true);
943 tree target;
945 initialize_inline_failed (edge);
947 edge->indirect_info = cgraph_allocate_init_indirect_info ();
948 edge->indirect_info->ecf_flags = ecf_flags;
949 edge->indirect_info->vptr_changed = true;
951 /* Record polymorphic call info. */
952 if (compute_indirect_info
953 && call_stmt
954 && (target = gimple_call_fn (call_stmt))
955 && virtual_method_call_p (target))
957 ipa_polymorphic_call_context context (decl, target, call_stmt);
959 /* Only record types can have virtual calls. */
960 edge->indirect_info->polymorphic = true;
961 edge->indirect_info->param_index = -1;
962 edge->indirect_info->otr_token
963 = tree_to_uhwi (OBJ_TYPE_REF_TOKEN (target));
964 edge->indirect_info->otr_type = obj_type_ref_class (target);
965 gcc_assert (TREE_CODE (edge->indirect_info->otr_type) == RECORD_TYPE);
966 edge->indirect_info->context = context;
969 edge->next_callee = indirect_calls;
970 if (indirect_calls)
971 indirect_calls->prev_callee = edge;
972 indirect_calls = edge;
974 return edge;
977 /* Remove the edge from the list of the callees of the caller. */
979 void
980 cgraph_edge::remove_caller (void)
982 if (prev_callee)
983 prev_callee->next_callee = next_callee;
984 if (next_callee)
985 next_callee->prev_callee = prev_callee;
986 if (!prev_callee)
988 if (indirect_unknown_callee)
989 caller->indirect_calls = next_callee;
990 else
991 caller->callees = next_callee;
993 if (caller->call_site_hash)
994 caller->call_site_hash->remove_elt_with_hash
995 (call_stmt, cgraph_edge_hasher::hash (call_stmt));
998 /* Put the edge onto the free list. */
1000 void
1001 symbol_table::free_edge (cgraph_edge *e)
1003 int uid = e->uid;
1005 if (e->indirect_info)
1006 ggc_free (e->indirect_info);
1008 /* Clear out the edge so we do not dangle pointers. */
1009 memset (e, 0, sizeof (*e));
1010 e->uid = uid;
1011 NEXT_FREE_EDGE (e) = free_edges;
1012 free_edges = e;
1013 edges_count--;
1016 /* Remove the edge in the cgraph. */
1018 void
1019 cgraph_edge::remove (void)
1021 /* Call all edge removal hooks. */
1022 symtab->call_edge_removal_hooks (this);
1024 if (!indirect_unknown_callee)
1025 /* Remove from callers list of the callee. */
1026 remove_callee ();
1028 /* Remove from callees list of the callers. */
1029 remove_caller ();
1031 /* Put the edge onto the free list. */
1032 symtab->free_edge (this);
1035 /* Turn edge into speculative call calling N2. Update
1036 the profile so the direct call is taken COUNT times
1037 with FREQUENCY.
1039 At clone materialization time, the indirect call E will
1040 be expanded as:
1042 if (call_dest == N2)
1043 n2 ();
1044 else
1045 call call_dest
1047 At this time the function just creates the direct call,
1048 the referencd representing the if conditional and attaches
1049 them all to the orginal indirect call statement.
1051 Return direct edge created. */
1053 cgraph_edge *
1054 cgraph_edge::make_speculative (cgraph_node *n2, profile_count direct_count,
1055 int direct_frequency)
1057 cgraph_node *n = caller;
1058 ipa_ref *ref = NULL;
1059 cgraph_edge *e2;
1061 if (dump_file)
1062 fprintf (dump_file, "Indirect call -> speculative call %s => %s\n",
1063 n->dump_name (), n2->dump_name ());
1064 speculative = true;
1065 e2 = n->create_edge (n2, call_stmt, direct_count, direct_frequency);
1066 initialize_inline_failed (e2);
1067 e2->speculative = true;
1068 if (TREE_NOTHROW (n2->decl))
1069 e2->can_throw_external = false;
1070 else
1071 e2->can_throw_external = can_throw_external;
1072 e2->lto_stmt_uid = lto_stmt_uid;
1073 e2->in_polymorphic_cdtor = in_polymorphic_cdtor;
1074 count -= e2->count;
1075 frequency -= e2->frequency;
1076 symtab->call_edge_duplication_hooks (this, e2);
1077 ref = n->create_reference (n2, IPA_REF_ADDR, call_stmt);
1078 ref->lto_stmt_uid = lto_stmt_uid;
1079 ref->speculative = speculative;
1080 n2->mark_address_taken ();
1081 return e2;
1084 /* Speculative call consist of three components:
1085 1) an indirect edge representing the original call
1086 2) an direct edge representing the new call
1087 3) ADDR_EXPR reference representing the speculative check.
1088 All three components are attached to single statement (the indirect
1089 call) and if one of them exists, all of them must exist.
1091 Given speculative call edge, return all three components.
1094 void
1095 cgraph_edge::speculative_call_info (cgraph_edge *&direct,
1096 cgraph_edge *&indirect,
1097 ipa_ref *&reference)
1099 ipa_ref *ref;
1100 int i;
1101 cgraph_edge *e2;
1102 cgraph_edge *e = this;
1104 if (!e->indirect_unknown_callee)
1105 for (e2 = e->caller->indirect_calls;
1106 e2->call_stmt != e->call_stmt || e2->lto_stmt_uid != e->lto_stmt_uid;
1107 e2 = e2->next_callee)
1109 else
1111 e2 = e;
1112 /* We can take advantage of the call stmt hash. */
1113 if (e2->call_stmt)
1115 e = e->caller->get_edge (e2->call_stmt);
1116 gcc_assert (e->speculative && !e->indirect_unknown_callee);
1118 else
1119 for (e = e->caller->callees;
1120 e2->call_stmt != e->call_stmt
1121 || e2->lto_stmt_uid != e->lto_stmt_uid;
1122 e = e->next_callee)
1125 gcc_assert (e->speculative && e2->speculative);
1126 direct = e;
1127 indirect = e2;
1129 reference = NULL;
1130 for (i = 0; e->caller->iterate_reference (i, ref); i++)
1131 if (ref->speculative
1132 && ((ref->stmt && ref->stmt == e->call_stmt)
1133 || (!ref->stmt && ref->lto_stmt_uid == e->lto_stmt_uid)))
1135 reference = ref;
1136 break;
1139 /* Speculative edge always consist of all three components - direct edge,
1140 indirect and reference. */
1142 gcc_assert (e && e2 && ref);
1145 /* Speculative call edge turned out to be direct call to CALLE_DECL.
1146 Remove the speculative call sequence and return edge representing the call.
1147 It is up to caller to redirect the call as appropriate. */
1149 cgraph_edge *
1150 cgraph_edge::resolve_speculation (tree callee_decl)
1152 cgraph_edge *edge = this;
1153 cgraph_edge *e2;
1154 ipa_ref *ref;
1156 gcc_assert (edge->speculative);
1157 edge->speculative_call_info (e2, edge, ref);
1158 if (!callee_decl
1159 || !ref->referred->semantically_equivalent_p
1160 (symtab_node::get (callee_decl)))
1162 if (dump_file)
1164 if (callee_decl)
1166 fprintf (dump_file, "Speculative indirect call %s => %s has "
1167 "turned out to have contradicting known target ",
1168 edge->caller->dump_name (),
1169 e2->callee->dump_name ());
1170 print_generic_expr (dump_file, callee_decl);
1171 fprintf (dump_file, "\n");
1173 else
1175 fprintf (dump_file, "Removing speculative call %s => %s\n",
1176 edge->caller->dump_name (),
1177 e2->callee->dump_name ());
1181 else
1183 cgraph_edge *tmp = edge;
1184 if (dump_file)
1185 fprintf (dump_file, "Speculative call turned into direct call.\n");
1186 edge = e2;
1187 e2 = tmp;
1188 /* FIXME: If EDGE is inlined, we should scale up the frequencies and counts
1189 in the functions inlined through it. */
1191 edge->count += e2->count;
1192 edge->frequency += e2->frequency;
1193 if (edge->frequency > CGRAPH_FREQ_MAX)
1194 edge->frequency = CGRAPH_FREQ_MAX;
1195 edge->speculative = false;
1196 e2->speculative = false;
1197 ref->remove_reference ();
1198 if (e2->indirect_unknown_callee || e2->inline_failed)
1199 e2->remove ();
1200 else
1201 e2->callee->remove_symbol_and_inline_clones ();
1202 if (edge->caller->call_site_hash)
1203 cgraph_update_edge_in_call_site_hash (edge);
1204 return edge;
1207 /* Make an indirect edge with an unknown callee an ordinary edge leading to
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. */
1211 cgraph_edge *
1212 cgraph_edge::make_direct (cgraph_node *callee)
1214 cgraph_edge *edge = this;
1215 gcc_assert (indirect_unknown_callee);
1217 /* If we are redirecting speculative call, make it non-speculative. */
1218 if (indirect_unknown_callee && speculative)
1220 edge = edge->resolve_speculation (callee->decl);
1222 /* On successful speculation just return the pre existing direct edge. */
1223 if (!indirect_unknown_callee)
1224 return edge;
1227 indirect_unknown_callee = 0;
1228 ggc_free (indirect_info);
1229 indirect_info = NULL;
1231 /* Get the edge out of the indirect edge list. */
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;
1239 /* Put it into the normal callee list */
1240 prev_callee = NULL;
1241 next_callee = caller->callees;
1242 if (caller->callees)
1243 caller->callees->prev_callee = edge;
1244 caller->callees = edge;
1246 /* Insert to callers list of the new callee. */
1247 edge->set_callee (callee);
1249 if (call_stmt
1250 && !gimple_check_call_matching_types (call_stmt, callee->decl, false))
1252 call_stmt_cannot_inline_p = true;
1253 inline_failed = CIF_MISMATCHED_ARGUMENTS;
1256 /* We need to re-determine the inlining status of the edge. */
1257 initialize_inline_failed (edge);
1258 return edge;
1261 /* If necessary, change the function declaration in the call statement
1262 associated with E so that it corresponds to the edge callee. */
1264 gimple *
1265 cgraph_edge::redirect_call_stmt_to_callee (void)
1267 cgraph_edge *e = this;
1269 tree decl = gimple_call_fndecl (e->call_stmt);
1270 gcall *new_stmt;
1271 gimple_stmt_iterator gsi;
1272 bool skip_bounds = false;
1274 if (e->speculative)
1276 cgraph_edge *e2;
1277 gcall *new_stmt;
1278 ipa_ref *ref;
1280 e->speculative_call_info (e, e2, ref);
1281 /* If there already is an direct call (i.e. as a result of inliner's
1282 substitution), forget about speculating. */
1283 if (decl)
1284 e = e->resolve_speculation (decl);
1285 /* If types do not match, speculation was likely wrong.
1286 The direct edge was possibly redirected to the clone with a different
1287 signature. We did not update the call statement yet, so compare it
1288 with the reference that still points to the proper type. */
1289 else if (!gimple_check_call_matching_types (e->call_stmt,
1290 ref->referred->decl,
1291 true))
1293 if (dump_file)
1294 fprintf (dump_file, "Not expanding speculative call of %s -> %s\n"
1295 "Type mismatch.\n",
1296 e->caller->dump_name (),
1297 e->callee->dump_name ());
1298 e = e->resolve_speculation ();
1299 /* We are producing the final function body and will throw away the
1300 callgraph edges really soon. Reset the counts/frequencies to
1301 keep verifier happy in the case of roundoff errors. */
1302 e->count = gimple_bb (e->call_stmt)->count;
1303 e->frequency = compute_call_stmt_bb_frequency
1304 (e->caller->decl, gimple_bb (e->call_stmt));
1306 /* Expand speculation into GIMPLE code. */
1307 else
1309 if (dump_file)
1311 fprintf (dump_file,
1312 "Expanding speculative call of %s -> %s count: ",
1313 e->caller->dump_name (),
1314 e->callee->dump_name ());
1315 e->count.dump (dump_file);
1316 fprintf (dump_file, "\n");
1318 gcc_assert (e2->speculative);
1319 push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
1321 profile_probability prob = e->count.probability_in (e->count
1322 + e2->count);
1323 if (prob.initialized_p ())
1325 else if (e->frequency || e2->frequency)
1326 prob = profile_probability::probability_in_gcov_type
1327 (e->frequency, e->frequency + e2->frequency).guessed ();
1328 else
1329 prob = profile_probability::even ();
1330 new_stmt = gimple_ic (e->call_stmt,
1331 dyn_cast<cgraph_node *> (ref->referred),
1332 prob, e->count, e->count + e2->count);
1333 e->speculative = false;
1334 e->caller->set_call_stmt_including_clones (e->call_stmt, new_stmt,
1335 false);
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)))
1343 tree dresult = gimple_call_lhs (new_stmt);
1344 tree iresult = gimple_call_lhs (e2->call_stmt);
1345 gcall *dbndret = chkp_retbnd_call_by_val (dresult);
1346 gcall *ibndret = chkp_retbnd_call_by_val (iresult);
1347 struct cgraph_edge *iedge
1348 = e2->caller->cgraph_node::get_edge (ibndret);
1349 struct cgraph_edge *dedge;
1351 if (dbndret)
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));
1359 iedge->frequency = compute_call_stmt_bb_frequency
1360 (iedge->caller->decl, gimple_bb (iedge->call_stmt));
1363 e->frequency = compute_call_stmt_bb_frequency
1364 (e->caller->decl, gimple_bb (e->call_stmt));
1365 e2->frequency = compute_call_stmt_bb_frequency
1366 (e2->caller->decl, gimple_bb (e2->call_stmt));
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. */
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);
1386 if (e->indirect_unknown_callee
1387 || (decl == e->callee->decl
1388 && !skip_bounds))
1389 return e->call_stmt;
1391 if (flag_checking && decl)
1393 cgraph_node *node = cgraph_node::get (decl);
1394 gcc_assert (!node || !node->clone.combined_args_to_skip);
1397 if (symtab->dump_file)
1399 fprintf (symtab->dump_file, "updating call of %s -> %s: ",
1400 e->caller->dump_name (), e->callee->dump_name ());
1401 print_gimple_stmt (symtab->dump_file, e->call_stmt, 0, dump_flags);
1402 if (e->callee->clone.combined_args_to_skip)
1404 fprintf (symtab->dump_file, " combined args to skip: ");
1405 dump_bitmap (symtab->dump_file,
1406 e->callee->clone.combined_args_to_skip);
1410 if (e->callee->clone.combined_args_to_skip
1411 || skip_bounds)
1413 int lp_nr;
1415 new_stmt = e->call_stmt;
1416 if (e->callee->clone.combined_args_to_skip)
1417 new_stmt
1418 = gimple_call_copy_skip_args (new_stmt,
1419 e->callee->clone.combined_args_to_skip);
1420 if (skip_bounds)
1421 new_stmt = chkp_copy_call_skip_bounds (new_stmt);
1423 tree old_fntype = gimple_call_fntype (e->call_stmt);
1424 gimple_call_set_fndecl (new_stmt, e->callee->decl);
1425 cgraph_node *origin = e->callee;
1426 while (origin->clone_of)
1427 origin = origin->clone_of;
1429 if ((origin->former_clone_of
1430 && old_fntype == TREE_TYPE (origin->former_clone_of))
1431 || old_fntype == TREE_TYPE (origin->decl))
1432 gimple_call_set_fntype (new_stmt, TREE_TYPE (e->callee->decl));
1433 else
1435 bitmap skip = e->callee->clone.combined_args_to_skip;
1436 tree t = cgraph_build_function_type_skip_args (old_fntype, skip,
1437 false);
1438 gimple_call_set_fntype (new_stmt, t);
1441 if (gimple_vdef (new_stmt)
1442 && TREE_CODE (gimple_vdef (new_stmt)) == SSA_NAME)
1443 SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
1445 gsi = gsi_for_stmt (e->call_stmt);
1447 /* For optimized away parameters, add on the caller side
1448 before the call
1449 DEBUG D#X => parm_Y(D)
1450 stmts and associate D#X with parm in decl_debug_args_lookup
1451 vector to say for debug info that if parameter parm had been passed,
1452 it would have value parm_Y(D). */
1453 if (e->callee->clone.combined_args_to_skip && MAY_HAVE_DEBUG_STMTS)
1455 vec<tree, va_gc> **debug_args
1456 = decl_debug_args_lookup (e->callee->decl);
1457 tree old_decl = gimple_call_fndecl (e->call_stmt);
1458 if (debug_args && old_decl)
1460 tree parm;
1461 unsigned i = 0, num;
1462 unsigned len = vec_safe_length (*debug_args);
1463 unsigned nargs = gimple_call_num_args (e->call_stmt);
1464 for (parm = DECL_ARGUMENTS (old_decl), num = 0;
1465 parm && num < nargs;
1466 parm = DECL_CHAIN (parm), num++)
1467 if (bitmap_bit_p (e->callee->clone.combined_args_to_skip, num)
1468 && is_gimple_reg (parm))
1470 unsigned last = i;
1472 while (i < len && (**debug_args)[i] != DECL_ORIGIN (parm))
1473 i += 2;
1474 if (i >= len)
1476 i = 0;
1477 while (i < last
1478 && (**debug_args)[i] != DECL_ORIGIN (parm))
1479 i += 2;
1480 if (i >= last)
1481 continue;
1483 tree ddecl = (**debug_args)[i + 1];
1484 tree arg = gimple_call_arg (e->call_stmt, num);
1485 if (!useless_type_conversion_p (TREE_TYPE (ddecl),
1486 TREE_TYPE (arg)))
1488 tree rhs1;
1489 if (!fold_convertible_p (TREE_TYPE (ddecl), arg))
1490 continue;
1491 if (TREE_CODE (arg) == SSA_NAME
1492 && gimple_assign_cast_p (SSA_NAME_DEF_STMT (arg))
1493 && (rhs1
1494 = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (arg)))
1495 && useless_type_conversion_p (TREE_TYPE (ddecl),
1496 TREE_TYPE (rhs1)))
1497 arg = rhs1;
1498 else
1499 arg = fold_convert (TREE_TYPE (ddecl), arg);
1502 gimple *def_temp
1503 = gimple_build_debug_bind (ddecl, unshare_expr (arg),
1504 e->call_stmt);
1505 gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT);
1510 gsi_replace (&gsi, new_stmt, false);
1511 /* We need to defer cleaning EH info on the new statement to
1512 fixup-cfg. We may not have dominator information at this point
1513 and thus would end up with unreachable blocks and have no way
1514 to communicate that we need to run CFG cleanup then. */
1515 lp_nr = lookup_stmt_eh_lp (e->call_stmt);
1516 if (lp_nr != 0)
1518 remove_stmt_from_eh_lp (e->call_stmt);
1519 add_stmt_to_eh_lp (new_stmt, lp_nr);
1522 else
1524 new_stmt = e->call_stmt;
1525 gimple_call_set_fndecl (new_stmt, e->callee->decl);
1526 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
1529 /* If changing the call to __cxa_pure_virtual or similar noreturn function,
1530 adjust gimple_call_fntype too. */
1531 if (gimple_call_noreturn_p (new_stmt)
1532 && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (e->callee->decl)))
1533 && TYPE_ARG_TYPES (TREE_TYPE (e->callee->decl))
1534 && (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (e->callee->decl)))
1535 == void_type_node))
1536 gimple_call_set_fntype (new_stmt, TREE_TYPE (e->callee->decl));
1538 /* If the call becomes noreturn, remove the LHS if possible. */
1539 tree lhs = gimple_call_lhs (new_stmt);
1540 if (lhs
1541 && gimple_call_noreturn_p (new_stmt)
1542 && (VOID_TYPE_P (TREE_TYPE (gimple_call_fntype (new_stmt)))
1543 || should_remove_lhs_p (lhs)))
1545 if (TREE_CODE (lhs) == SSA_NAME)
1547 tree var = create_tmp_reg_fn (DECL_STRUCT_FUNCTION (e->caller->decl),
1548 TREE_TYPE (lhs), NULL);
1549 var = get_or_create_ssa_default_def
1550 (DECL_STRUCT_FUNCTION (e->caller->decl), var);
1551 gimple *set_stmt = gimple_build_assign (lhs, var);
1552 gsi = gsi_for_stmt (new_stmt);
1553 gsi_insert_before_without_update (&gsi, set_stmt, GSI_SAME_STMT);
1554 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), set_stmt);
1556 gimple_call_set_lhs (new_stmt, NULL_TREE);
1557 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
1560 /* If new callee has no static chain, remove it. */
1561 if (gimple_call_chain (new_stmt) && !DECL_STATIC_CHAIN (e->callee->decl))
1563 gimple_call_set_chain (new_stmt, NULL);
1564 update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
1567 maybe_remove_unused_call_args (DECL_STRUCT_FUNCTION (e->caller->decl),
1568 new_stmt);
1570 e->caller->set_call_stmt_including_clones (e->call_stmt, new_stmt, false);
1572 if (symtab->dump_file)
1574 fprintf (symtab->dump_file, " updated to:");
1575 print_gimple_stmt (symtab->dump_file, e->call_stmt, 0, dump_flags);
1577 return new_stmt;
1580 /* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
1581 OLD_STMT changed into NEW_STMT. OLD_CALL is gimple_call_fndecl
1582 of OLD_STMT if it was previously call statement.
1583 If NEW_STMT is NULL, the call has been dropped without any
1584 replacement. */
1586 static void
1587 cgraph_update_edges_for_call_stmt_node (cgraph_node *node,
1588 gimple *old_stmt, tree old_call,
1589 gimple *new_stmt)
1591 tree new_call = (new_stmt && is_gimple_call (new_stmt))
1592 ? gimple_call_fndecl (new_stmt) : 0;
1594 /* We are seeing indirect calls, then there is nothing to update. */
1595 if (!new_call && !old_call)
1596 return;
1597 /* See if we turned indirect call into direct call or folded call to one builtin
1598 into different builtin. */
1599 if (old_call != new_call)
1601 cgraph_edge *e = node->get_edge (old_stmt);
1602 cgraph_edge *ne = NULL;
1603 profile_count count;
1604 int frequency;
1606 if (e)
1608 /* Keep calls marked as dead dead. */
1609 if (new_stmt && is_gimple_call (new_stmt) && e->callee
1610 && DECL_BUILT_IN_CLASS (e->callee->decl) == BUILT_IN_NORMAL
1611 && DECL_FUNCTION_CODE (e->callee->decl) == BUILT_IN_UNREACHABLE)
1613 node->get_edge (old_stmt)->set_call_stmt
1614 (as_a <gcall *> (new_stmt));
1615 return;
1617 /* See if the edge is already there and has the correct callee. It
1618 might be so because of indirect inlining has already updated
1619 it. We also might've cloned and redirected the edge. */
1620 if (new_call && e->callee)
1622 cgraph_node *callee = e->callee;
1623 while (callee)
1625 if (callee->decl == new_call
1626 || callee->former_clone_of == new_call)
1628 e->set_call_stmt (as_a <gcall *> (new_stmt));
1629 return;
1631 callee = callee->clone_of;
1635 /* Otherwise remove edge and create new one; we can't simply redirect
1636 since function has changed, so inline plan and other information
1637 attached to edge is invalid. */
1638 count = e->count;
1639 frequency = e->frequency;
1640 if (e->indirect_unknown_callee || e->inline_failed)
1641 e->remove ();
1642 else
1643 e->callee->remove_symbol_and_inline_clones ();
1645 else if (new_call)
1647 /* We are seeing new direct call; compute profile info based on BB. */
1648 basic_block bb = gimple_bb (new_stmt);
1649 count = bb->count;
1650 frequency = compute_call_stmt_bb_frequency (current_function_decl,
1651 bb);
1654 if (new_call)
1656 ne = node->create_edge (cgraph_node::get_create (new_call),
1657 as_a <gcall *> (new_stmt), count,
1658 frequency);
1659 gcc_assert (ne->inline_failed);
1662 /* We only updated the call stmt; update pointer in cgraph edge.. */
1663 else if (old_stmt != new_stmt)
1664 node->get_edge (old_stmt)->set_call_stmt (as_a <gcall *> (new_stmt));
1667 /* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
1668 OLD_STMT changed into NEW_STMT. OLD_DECL is gimple_call_fndecl
1669 of OLD_STMT before it was updated (updating can happen inplace). */
1671 void
1672 cgraph_update_edges_for_call_stmt (gimple *old_stmt, tree old_decl,
1673 gimple *new_stmt)
1675 cgraph_node *orig = cgraph_node::get (cfun->decl);
1676 cgraph_node *node;
1678 gcc_checking_assert (orig);
1679 cgraph_update_edges_for_call_stmt_node (orig, old_stmt, old_decl, new_stmt);
1680 if (orig->clones)
1681 for (node = orig->clones; node != orig;)
1683 cgraph_update_edges_for_call_stmt_node (node, old_stmt, old_decl, new_stmt);
1684 if (node->clones)
1685 node = node->clones;
1686 else if (node->next_sibling_clone)
1687 node = node->next_sibling_clone;
1688 else
1690 while (node != orig && !node->next_sibling_clone)
1691 node = node->clone_of;
1692 if (node != orig)
1693 node = node->next_sibling_clone;
1699 /* Remove all callees from the node. */
1701 void
1702 cgraph_node::remove_callees (void)
1704 cgraph_edge *e, *f;
1706 /* It is sufficient to remove the edges from the lists of callers of
1707 the callees. The callee list of the node can be zapped with one
1708 assignment. */
1709 for (e = callees; e; e = f)
1711 f = e->next_callee;
1712 symtab->call_edge_removal_hooks (e);
1713 if (!e->indirect_unknown_callee)
1714 e->remove_callee ();
1715 symtab->free_edge (e);
1717 for (e = indirect_calls; e; e = f)
1719 f = e->next_callee;
1720 symtab->call_edge_removal_hooks (e);
1721 if (!e->indirect_unknown_callee)
1722 e->remove_callee ();
1723 symtab->free_edge (e);
1725 indirect_calls = NULL;
1726 callees = NULL;
1727 if (call_site_hash)
1729 call_site_hash->empty ();
1730 call_site_hash = NULL;
1734 /* Remove all callers from the node. */
1736 void
1737 cgraph_node::remove_callers (void)
1739 cgraph_edge *e, *f;
1741 /* It is sufficient to remove the edges from the lists of callees of
1742 the callers. The caller list of the node can be zapped with one
1743 assignment. */
1744 for (e = callers; e; e = f)
1746 f = e->next_caller;
1747 symtab->call_edge_removal_hooks (e);
1748 e->remove_caller ();
1749 symtab->free_edge (e);
1751 callers = NULL;
1754 /* Helper function for cgraph_release_function_body and free_lang_data.
1755 It releases body from function DECL without having to inspect its
1756 possibly non-existent symtab node. */
1758 void
1759 release_function_body (tree decl)
1761 function *fn = DECL_STRUCT_FUNCTION (decl);
1762 if (fn)
1764 if (fn->cfg
1765 && loops_for_fn (fn))
1767 fn->curr_properties &= ~PROP_loops;
1768 loop_optimizer_finalize (fn);
1770 if (fn->gimple_df)
1772 delete_tree_ssa (fn);
1773 fn->eh = NULL;
1775 if (fn->cfg)
1777 gcc_assert (!dom_info_available_p (fn, CDI_DOMINATORS));
1778 gcc_assert (!dom_info_available_p (fn, CDI_POST_DOMINATORS));
1779 delete_tree_cfg_annotations (fn);
1780 clear_edges (fn);
1781 fn->cfg = NULL;
1783 if (fn->value_histograms)
1784 free_histograms (fn);
1785 gimple_set_body (decl, NULL);
1786 /* Struct function hangs a lot of data that would leak if we didn't
1787 removed all pointers to it. */
1788 ggc_free (fn);
1789 DECL_STRUCT_FUNCTION (decl) = NULL;
1791 DECL_SAVED_TREE (decl) = NULL;
1794 /* Release memory used to represent body of function.
1795 Use this only for functions that are released before being translated to
1796 target code (i.e. RTL). Functions that are compiled to RTL and beyond
1797 are free'd in final.c via free_after_compilation().
1798 KEEP_ARGUMENTS are useful only if you want to rebuild body as thunk. */
1800 void
1801 cgraph_node::release_body (bool keep_arguments)
1803 ipa_transforms_to_apply.release ();
1804 if (!used_as_abstract_origin && symtab->state != PARSING)
1806 DECL_RESULT (decl) = NULL;
1808 if (!keep_arguments)
1809 DECL_ARGUMENTS (decl) = NULL;
1811 /* If the node is abstract and needed, then do not clear
1812 DECL_INITIAL of its associated function declaration because it's
1813 needed to emit debug info later. */
1814 if (!used_as_abstract_origin && DECL_INITIAL (decl))
1815 DECL_INITIAL (decl) = error_mark_node;
1816 release_function_body (decl);
1817 if (lto_file_data)
1819 lto_free_function_in_decl_state_for_node (this);
1820 lto_file_data = NULL;
1824 /* Remove function from symbol table. */
1826 void
1827 cgraph_node::remove (void)
1829 cgraph_node *n;
1830 int uid = this->uid;
1832 if (symtab->ipa_clones_dump_file && symtab->cloned_nodes.contains (this))
1833 fprintf (symtab->ipa_clones_dump_file,
1834 "Callgraph removal;%s;%d;%s;%d;%d\n", asm_name (), order,
1835 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl),
1836 DECL_SOURCE_COLUMN (decl));
1838 symtab->call_cgraph_removal_hooks (this);
1839 remove_callers ();
1840 remove_callees ();
1841 ipa_transforms_to_apply.release ();
1843 /* Incremental inlining access removed nodes stored in the postorder list.
1845 force_output = false;
1846 forced_by_abi = false;
1847 for (n = nested; n; n = n->next_nested)
1848 n->origin = NULL;
1849 nested = NULL;
1850 if (origin)
1852 cgraph_node **node2 = &origin->nested;
1854 while (*node2 != this)
1855 node2 = &(*node2)->next_nested;
1856 *node2 = next_nested;
1858 unregister ();
1859 if (prev_sibling_clone)
1860 prev_sibling_clone->next_sibling_clone = next_sibling_clone;
1861 else if (clone_of)
1862 clone_of->clones = next_sibling_clone;
1863 if (next_sibling_clone)
1864 next_sibling_clone->prev_sibling_clone = prev_sibling_clone;
1865 if (clones)
1867 cgraph_node *n, *next;
1869 if (clone_of)
1871 for (n = clones; n->next_sibling_clone; n = n->next_sibling_clone)
1872 n->clone_of = clone_of;
1873 n->clone_of = clone_of;
1874 n->next_sibling_clone = clone_of->clones;
1875 if (clone_of->clones)
1876 clone_of->clones->prev_sibling_clone = n;
1877 clone_of->clones = clones;
1879 else
1881 /* We are removing node with clones. This makes clones inconsistent,
1882 but assume they will be removed subsequently and just keep clone
1883 tree intact. This can happen in unreachable function removal since
1884 we remove unreachable functions in random order, not by bottom-up
1885 walk of clone trees. */
1886 for (n = clones; n; n = next)
1888 next = n->next_sibling_clone;
1889 n->next_sibling_clone = NULL;
1890 n->prev_sibling_clone = NULL;
1891 n->clone_of = NULL;
1896 /* While all the clones are removed after being proceeded, the function
1897 itself is kept in the cgraph even after it is compiled. Check whether
1898 we are done with this body and reclaim it proactively if this is the case.
1900 if (symtab->state != LTO_STREAMING)
1902 n = cgraph_node::get (decl);
1903 if (!n
1904 || (!n->clones && !n->clone_of && !n->global.inlined_to
1905 && ((symtab->global_info_ready || in_lto_p)
1906 && (TREE_ASM_WRITTEN (n->decl)
1907 || DECL_EXTERNAL (n->decl)
1908 || !n->analyzed
1909 || (!flag_wpa && n->in_other_partition)))))
1910 release_body ();
1912 else
1914 lto_free_function_in_decl_state_for_node (this);
1915 lto_file_data = NULL;
1918 decl = NULL;
1919 if (call_site_hash)
1921 call_site_hash->empty ();
1922 call_site_hash = NULL;
1925 if (instrumented_version)
1927 instrumented_version->instrumented_version = NULL;
1928 instrumented_version = NULL;
1931 symtab->release_symbol (this, uid);
1934 /* Likewise indicate that a node is having address taken. */
1936 void
1937 cgraph_node::mark_address_taken (void)
1939 /* Indirect inlining can figure out that all uses of the address are
1940 inlined. */
1941 if (global.inlined_to)
1943 gcc_assert (cfun->after_inlining);
1944 gcc_assert (callers->indirect_inlining_edge);
1945 return;
1947 /* FIXME: address_taken flag is used both as a shortcut for testing whether
1948 IPA_REF_ADDR reference exists (and thus it should be set on node
1949 representing alias we take address of) and as a test whether address
1950 of the object was taken (and thus it should be set on node alias is
1951 referring to). We should remove the first use and the remove the
1952 following set. */
1953 address_taken = 1;
1954 cgraph_node *node = ultimate_alias_target ();
1955 node->address_taken = 1;
1958 /* Return local info for the compiled function. */
1960 cgraph_local_info *
1961 cgraph_node::local_info (tree decl)
1963 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1964 cgraph_node *node = get (decl);
1965 if (!node)
1966 return NULL;
1967 return &node->ultimate_alias_target ()->local;
1970 /* Return local info for the compiled function. */
1972 cgraph_rtl_info *
1973 cgraph_node::rtl_info (tree decl)
1975 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1976 cgraph_node *node = get (decl);
1977 if (!node)
1978 return NULL;
1979 enum availability avail;
1980 node = node->ultimate_alias_target (&avail);
1981 if (decl != current_function_decl
1982 && (avail < AVAIL_AVAILABLE
1983 || (node->decl != current_function_decl
1984 && !TREE_ASM_WRITTEN (node->decl))))
1985 return NULL;
1986 /* Allocate if it doesn't exist. */
1987 if (node->rtl == NULL)
1988 node->rtl = ggc_cleared_alloc<cgraph_rtl_info> ();
1989 return node->rtl;
1992 /* Return a string describing the failure REASON. */
1994 const char*
1995 cgraph_inline_failed_string (cgraph_inline_failed_t reason)
1997 #undef DEFCIFCODE
1998 #define DEFCIFCODE(code, type, string) string,
2000 static const char *cif_string_table[CIF_N_REASONS] = {
2001 #include "cif-code.def"
2004 /* Signedness of an enum type is implementation defined, so cast it
2005 to unsigned before testing. */
2006 gcc_assert ((unsigned) reason < CIF_N_REASONS);
2007 return cif_string_table[reason];
2010 /* Return a type describing the failure REASON. */
2012 cgraph_inline_failed_type_t
2013 cgraph_inline_failed_type (cgraph_inline_failed_t reason)
2015 #undef DEFCIFCODE
2016 #define DEFCIFCODE(code, type, string) type,
2018 static cgraph_inline_failed_type_t cif_type_table[CIF_N_REASONS] = {
2019 #include "cif-code.def"
2022 /* Signedness of an enum type is implementation defined, so cast it
2023 to unsigned before testing. */
2024 gcc_assert ((unsigned) reason < CIF_N_REASONS);
2025 return cif_type_table[reason];
2028 /* Names used to print out the availability enum. */
2029 const char * const cgraph_availability_names[] =
2030 {"unset", "not_available", "overwritable", "available", "local"};
2032 /* Output flags of edge to a file F. */
2034 void
2035 cgraph_edge::dump_edge_flags (FILE *f)
2037 if (speculative)
2038 fprintf (f, "(speculative) ");
2039 if (!inline_failed)
2040 fprintf (f, "(inlined) ");
2041 if (call_stmt_cannot_inline_p)
2042 fprintf (f, "(call_stmt_cannot_inline_p) ");
2043 if (indirect_inlining_edge)
2044 fprintf (f, "(indirect_inlining) ");
2045 if (count.initialized_p ())
2047 fprintf (f, "(");
2048 count.dump (f);
2049 fprintf (f, ")");
2051 if (frequency)
2052 fprintf (f, "(%.2f per call) ", frequency / (double)CGRAPH_FREQ_BASE);
2053 if (can_throw_external)
2054 fprintf (f, "(can throw external) ");
2057 /* Dump call graph node to file F. */
2059 void
2060 cgraph_node::dump (FILE *f)
2062 cgraph_edge *edge;
2064 dump_base (f);
2066 if (global.inlined_to)
2067 fprintf (f, " Function %s is inline copy in %s\n",
2068 dump_name (),
2069 global.inlined_to->dump_name ());
2070 if (clone_of)
2071 fprintf (f, " Clone of %s\n", clone_of->dump_asm_name ());
2072 if (symtab->function_flags_ready)
2073 fprintf (f, " Availability: %s\n",
2074 cgraph_availability_names [get_availability ()]);
2076 if (profile_id)
2077 fprintf (f, " Profile id: %i\n",
2078 profile_id);
2079 fprintf (f, " First run: %i\n", tp_first_run);
2080 cgraph_function_version_info *vi = function_version ();
2081 if (vi != NULL)
2083 fprintf (f, " Version info: ");
2084 if (vi->prev != NULL)
2086 fprintf (f, "prev: ");
2087 fprintf (f, "%s ", vi->prev->this_node->dump_asm_name ());
2089 if (vi->next != NULL)
2091 fprintf (f, "next: ");
2092 fprintf (f, "%s ", vi->next->this_node->dump_asm_name ());
2094 if (vi->dispatcher_resolver != NULL_TREE)
2095 fprintf (f, "dispatcher: %s",
2096 lang_hooks.decl_printable_name (vi->dispatcher_resolver, 2));
2098 fprintf (f, "\n");
2100 fprintf (f, " Function flags:");
2101 if (count.initialized_p ())
2103 fprintf (f, " count: ");
2104 count.dump (f);
2106 if (origin)
2107 fprintf (f, " nested in: %s", origin->asm_name ());
2108 if (gimple_has_body_p (decl))
2109 fprintf (f, " body");
2110 if (process)
2111 fprintf (f, " process");
2112 if (local.local)
2113 fprintf (f, " local");
2114 if (local.redefined_extern_inline)
2115 fprintf (f, " redefined_extern_inline");
2116 if (only_called_at_startup)
2117 fprintf (f, " only_called_at_startup");
2118 if (only_called_at_exit)
2119 fprintf (f, " only_called_at_exit");
2120 if (tm_clone)
2121 fprintf (f, " tm_clone");
2122 if (calls_comdat_local)
2123 fprintf (f, " calls_comdat_local");
2124 if (icf_merged)
2125 fprintf (f, " icf_merged");
2126 if (merged_comdat)
2127 fprintf (f, " merged_comdat");
2128 if (split_part)
2129 fprintf (f, " split_part");
2130 if (indirect_call_target)
2131 fprintf (f, " indirect_call_target");
2132 if (nonfreeing_fn)
2133 fprintf (f, " nonfreeing_fn");
2134 if (DECL_STATIC_CONSTRUCTOR (decl))
2135 fprintf (f," static_constructor (priority:%i)", get_init_priority ());
2136 if (DECL_STATIC_DESTRUCTOR (decl))
2137 fprintf (f," static_destructor (priority:%i)", get_fini_priority ());
2138 if (frequency == NODE_FREQUENCY_HOT)
2139 fprintf (f, " hot");
2140 if (frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
2141 fprintf (f, " unlikely_executed");
2142 if (frequency == NODE_FREQUENCY_EXECUTED_ONCE)
2143 fprintf (f, " executed_once");
2144 if (only_called_at_startup)
2145 fprintf (f, " only_called_at_startup");
2146 if (only_called_at_exit)
2147 fprintf (f, " only_called_at_exit");
2148 if (opt_for_fn (decl, optimize_size))
2149 fprintf (f, " optimize_size");
2150 if (parallelized_function)
2151 fprintf (f, " parallelized_function");
2153 fprintf (f, "\n");
2155 if (thunk.thunk_p)
2157 fprintf (f, " Thunk");
2158 if (thunk.alias)
2159 fprintf (f, " of %s (asm: %s)",
2160 lang_hooks.decl_printable_name (thunk.alias, 2),
2161 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk.alias)));
2162 fprintf (f, " fixed offset %i virtual value %i has "
2163 "virtual offset %i)\n",
2164 (int)thunk.fixed_offset,
2165 (int)thunk.virtual_value,
2166 (int)thunk.virtual_offset_p);
2168 if (alias && thunk.alias
2169 && DECL_P (thunk.alias))
2171 fprintf (f, " Alias of %s",
2172 lang_hooks.decl_printable_name (thunk.alias, 2));
2173 if (DECL_ASSEMBLER_NAME_SET_P (thunk.alias))
2174 fprintf (f, " (asm: %s)",
2175 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk.alias)));
2176 fprintf (f, "\n");
2179 fprintf (f, " Called by: ");
2181 profile_count sum = profile_count::zero ();
2182 for (edge = callers; edge; edge = edge->next_caller)
2184 fprintf (f, "%s ", edge->caller->dump_name ());
2185 edge->dump_edge_flags (f);
2186 if (edge->count.initialized_p ())
2187 sum += edge->count;
2190 fprintf (f, "\n Calls: ");
2191 for (edge = callees; edge; edge = edge->next_callee)
2193 fprintf (f, "%s ", edge->callee->dump_name ());
2194 edge->dump_edge_flags (f);
2196 fprintf (f, "\n");
2198 if (count.initialized_p ())
2200 bool ok = true;
2201 bool min = false;
2202 ipa_ref *ref;
2204 FOR_EACH_ALIAS (this, ref)
2205 if (dyn_cast <cgraph_node *> (ref->referring)->count.initialized_p ())
2206 sum += dyn_cast <cgraph_node *> (ref->referring)->count;
2208 if (global.inlined_to
2209 || (symtab->state < EXPANSION
2210 && ultimate_alias_target () == this && only_called_directly_p ()))
2211 ok = !count.differs_from_p (sum);
2212 else if (count > profile_count::from_gcov_type (100)
2213 && count < sum.apply_scale (99, 100))
2214 ok = false, min = true;
2215 if (!ok)
2217 fprintf (f, " Invalid sum of caller counts ");
2218 sum.dump (f);
2219 if (min)
2220 fprintf (f, ", should be at most ");
2221 else
2222 fprintf (f, ", should be ");
2223 count.dump (f);
2224 fprintf (f, "\n");
2228 for (edge = indirect_calls; edge; edge = edge->next_callee)
2230 if (edge->indirect_info->polymorphic)
2232 fprintf (f, " Polymorphic indirect call of type ");
2233 print_generic_expr (f, edge->indirect_info->otr_type, TDF_SLIM);
2234 fprintf (f, " token:%i", (int) edge->indirect_info->otr_token);
2236 else
2237 fprintf (f, " Indirect call");
2238 edge->dump_edge_flags (f);
2239 if (edge->indirect_info->param_index != -1)
2241 fprintf (f, " of param:%i", edge->indirect_info->param_index);
2242 if (edge->indirect_info->agg_contents)
2243 fprintf (f, " loaded from %s %s at offset %i",
2244 edge->indirect_info->member_ptr ? "member ptr" : "aggregate",
2245 edge->indirect_info->by_ref ? "passed by reference":"",
2246 (int)edge->indirect_info->offset);
2247 if (edge->indirect_info->vptr_changed)
2248 fprintf (f, " (vptr maybe changed)");
2250 fprintf (f, "\n");
2251 if (edge->indirect_info->polymorphic)
2252 edge->indirect_info->context.dump (f);
2255 if (instrumentation_clone)
2256 fprintf (f, " Is instrumented version.\n");
2257 else if (instrumented_version)
2258 fprintf (f, " Has instrumented version.\n");
2261 /* Dump call graph node NODE to stderr. */
2263 DEBUG_FUNCTION void
2264 cgraph_node::debug (void)
2266 dump (stderr);
2269 /* Dump the callgraph to file F. */
2271 void
2272 cgraph_node::dump_cgraph (FILE *f)
2274 cgraph_node *node;
2276 fprintf (f, "callgraph:\n\n");
2277 FOR_EACH_FUNCTION (node)
2278 node->dump (f);
2281 /* Return true when the DECL can possibly be inlined. */
2283 bool
2284 cgraph_function_possibly_inlined_p (tree decl)
2286 if (!symtab->global_info_ready)
2287 return !DECL_UNINLINABLE (decl);
2288 return DECL_POSSIBLY_INLINED (decl);
2291 /* cgraph_node is no longer nested function; update cgraph accordingly. */
2292 void
2293 cgraph_node::unnest (void)
2295 cgraph_node **node2 = &origin->nested;
2296 gcc_assert (origin);
2298 while (*node2 != this)
2299 node2 = &(*node2)->next_nested;
2300 *node2 = next_nested;
2301 origin = NULL;
2304 /* Return function availability. See cgraph.h for description of individual
2305 return values. */
2306 enum availability
2307 cgraph_node::get_availability (symtab_node *ref)
2309 if (ref)
2311 cgraph_node *cref = dyn_cast <cgraph_node *> (ref);
2312 if (cref)
2313 ref = cref->global.inlined_to;
2315 enum availability avail;
2316 if (!analyzed)
2317 avail = AVAIL_NOT_AVAILABLE;
2318 else if (local.local)
2319 avail = AVAIL_LOCAL;
2320 else if (global.inlined_to)
2321 avail = AVAIL_AVAILABLE;
2322 else if (transparent_alias)
2323 ultimate_alias_target (&avail, ref);
2324 else if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl))
2325 || lookup_attribute ("noipa", DECL_ATTRIBUTES (decl)))
2326 avail = AVAIL_INTERPOSABLE;
2327 else if (!externally_visible)
2328 avail = AVAIL_AVAILABLE;
2329 /* If this is a reference from symbol itself and there are no aliases, we
2330 may be sure that the symbol was not interposed by something else because
2331 the symbol itself would be unreachable otherwise.
2333 Also comdat groups are always resolved in groups. */
2334 else if ((this == ref && !has_aliases_p ())
2335 || (ref && get_comdat_group ()
2336 && get_comdat_group () == ref->get_comdat_group ()))
2337 avail = AVAIL_AVAILABLE;
2338 /* Inline functions are safe to be analyzed even if their symbol can
2339 be overwritten at runtime. It is not meaningful to enforce any sane
2340 behavior on replacing inline function by different body. */
2341 else if (DECL_DECLARED_INLINE_P (decl))
2342 avail = AVAIL_AVAILABLE;
2344 /* If the function can be overwritten, return OVERWRITABLE. Take
2345 care at least of two notable extensions - the COMDAT functions
2346 used to share template instantiations in C++ (this is symmetric
2347 to code cp_cannot_inline_tree_fn and probably shall be shared and
2348 the inlinability hooks completely eliminated). */
2350 else if (decl_replaceable_p (decl) && !DECL_EXTERNAL (decl))
2351 avail = AVAIL_INTERPOSABLE;
2352 else avail = AVAIL_AVAILABLE;
2354 return avail;
2357 /* Worker for cgraph_node_can_be_local_p. */
2358 static bool
2359 cgraph_node_cannot_be_local_p_1 (cgraph_node *node, void *)
2361 return !(!node->force_output
2362 && ((DECL_COMDAT (node->decl)
2363 && !node->forced_by_abi
2364 && !node->used_from_object_file_p ()
2365 && !node->same_comdat_group)
2366 || !node->externally_visible));
2369 /* Return true if cgraph_node can be made local for API change.
2370 Extern inline functions and C++ COMDAT functions can be made local
2371 at the expense of possible code size growth if function is used in multiple
2372 compilation units. */
2373 bool
2374 cgraph_node::can_be_local_p (void)
2376 return (!address_taken
2377 && !call_for_symbol_thunks_and_aliases (cgraph_node_cannot_be_local_p_1,
2378 NULL, true));
2381 /* Call callback on cgraph_node, thunks and aliases associated to cgraph_node.
2382 When INCLUDE_OVERWRITABLE is false, overwritable symbols are
2383 skipped. When EXCLUDE_VIRTUAL_THUNKS is true, virtual thunks are
2384 skipped. */
2385 bool
2386 cgraph_node::call_for_symbol_thunks_and_aliases (bool (*callback)
2387 (cgraph_node *, void *),
2388 void *data,
2389 bool include_overwritable,
2390 bool exclude_virtual_thunks)
2392 cgraph_edge *e;
2393 ipa_ref *ref;
2394 enum availability avail = AVAIL_AVAILABLE;
2396 if (include_overwritable
2397 || (avail = get_availability ()) > AVAIL_INTERPOSABLE)
2399 if (callback (this, data))
2400 return true;
2402 FOR_EACH_ALIAS (this, ref)
2404 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2405 if (include_overwritable
2406 || alias->get_availability () > AVAIL_INTERPOSABLE)
2407 if (alias->call_for_symbol_thunks_and_aliases (callback, data,
2408 include_overwritable,
2409 exclude_virtual_thunks))
2410 return true;
2412 if (avail <= AVAIL_INTERPOSABLE)
2413 return false;
2414 for (e = callers; e; e = e->next_caller)
2415 if (e->caller->thunk.thunk_p
2416 && (include_overwritable
2417 || e->caller->get_availability () > AVAIL_INTERPOSABLE)
2418 && !(exclude_virtual_thunks
2419 && e->caller->thunk.virtual_offset_p))
2420 if (e->caller->call_for_symbol_thunks_and_aliases (callback, data,
2421 include_overwritable,
2422 exclude_virtual_thunks))
2423 return true;
2425 return false;
2428 /* Worker to bring NODE local. */
2430 bool
2431 cgraph_node::make_local (cgraph_node *node, void *)
2433 gcc_checking_assert (node->can_be_local_p ());
2434 if (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
2436 node->make_decl_local ();
2437 node->set_section (NULL);
2438 node->set_comdat_group (NULL);
2439 node->externally_visible = false;
2440 node->forced_by_abi = false;
2441 node->local.local = true;
2442 node->set_section (NULL);
2443 node->unique_name = ((node->resolution == LDPR_PREVAILING_DEF_IRONLY
2444 || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
2445 && !flag_incremental_link);
2446 node->resolution = LDPR_PREVAILING_DEF_IRONLY;
2447 gcc_assert (node->get_availability () == AVAIL_LOCAL);
2449 return false;
2452 /* Bring cgraph node local. */
2454 void
2455 cgraph_node::make_local (void)
2457 call_for_symbol_thunks_and_aliases (cgraph_node::make_local, NULL, true);
2460 /* Worker to set nothrow flag. */
2462 static void
2463 set_nothrow_flag_1 (cgraph_node *node, bool nothrow, bool non_call,
2464 bool *changed)
2466 cgraph_edge *e;
2468 if (nothrow && !TREE_NOTHROW (node->decl))
2470 /* With non-call exceptions we can't say for sure if other function body
2471 was not possibly optimized to stil throw. */
2472 if (!non_call || node->binds_to_current_def_p ())
2474 TREE_NOTHROW (node->decl) = true;
2475 *changed = true;
2476 for (e = node->callers; e; e = e->next_caller)
2477 e->can_throw_external = false;
2480 else if (!nothrow && TREE_NOTHROW (node->decl))
2482 TREE_NOTHROW (node->decl) = false;
2483 *changed = true;
2485 ipa_ref *ref;
2486 FOR_EACH_ALIAS (node, ref)
2488 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2489 if (!nothrow || alias->get_availability () > AVAIL_INTERPOSABLE)
2490 set_nothrow_flag_1 (alias, nothrow, non_call, changed);
2492 for (cgraph_edge *e = node->callers; e; e = e->next_caller)
2493 if (e->caller->thunk.thunk_p
2494 && (!nothrow || e->caller->get_availability () > AVAIL_INTERPOSABLE))
2495 set_nothrow_flag_1 (e->caller, nothrow, non_call, changed);
2498 /* Set TREE_NOTHROW on NODE's decl and on aliases of NODE
2499 if any to NOTHROW. */
2501 bool
2502 cgraph_node::set_nothrow_flag (bool nothrow)
2504 bool changed = false;
2505 bool non_call = opt_for_fn (decl, flag_non_call_exceptions);
2507 if (!nothrow || get_availability () > AVAIL_INTERPOSABLE)
2508 set_nothrow_flag_1 (this, nothrow, non_call, &changed);
2509 else
2511 ipa_ref *ref;
2513 FOR_EACH_ALIAS (this, ref)
2515 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2516 if (!nothrow || alias->get_availability () > AVAIL_INTERPOSABLE)
2517 set_nothrow_flag_1 (alias, nothrow, non_call, &changed);
2520 return changed;
2523 /* Worker to set_const_flag. */
2525 static void
2526 set_const_flag_1 (cgraph_node *node, bool set_const, bool looping,
2527 bool *changed)
2529 /* Static constructors and destructors without a side effect can be
2530 optimized out. */
2531 if (set_const && !looping)
2533 if (DECL_STATIC_CONSTRUCTOR (node->decl))
2535 DECL_STATIC_CONSTRUCTOR (node->decl) = 0;
2536 *changed = true;
2538 if (DECL_STATIC_DESTRUCTOR (node->decl))
2540 DECL_STATIC_DESTRUCTOR (node->decl) = 0;
2541 *changed = true;
2544 if (!set_const)
2546 if (TREE_READONLY (node->decl))
2548 TREE_READONLY (node->decl) = 0;
2549 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2550 *changed = true;
2553 else
2555 /* Consider function:
2557 bool a(int *p)
2559 return *p==*p;
2562 During early optimization we will turn this into:
2564 bool a(int *p)
2566 return true;
2569 Now if this function will be detected as CONST however when interposed
2570 it may end up being just pure. We always must assume the worst
2571 scenario here. */
2572 if (TREE_READONLY (node->decl))
2574 if (!looping && DECL_LOOPING_CONST_OR_PURE_P (node->decl))
2576 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2577 *changed = true;
2580 else if (node->binds_to_current_def_p ())
2582 TREE_READONLY (node->decl) = true;
2583 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = looping;
2584 DECL_PURE_P (node->decl) = false;
2585 *changed = true;
2587 else
2589 if (dump_file && (dump_flags & TDF_DETAILS))
2590 fprintf (dump_file, "Dropping state to PURE because function does "
2591 "not bind to current def.\n");
2592 if (!DECL_PURE_P (node->decl))
2594 DECL_PURE_P (node->decl) = true;
2595 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = looping;
2596 *changed = true;
2598 else if (!looping && DECL_LOOPING_CONST_OR_PURE_P (node->decl))
2600 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2601 *changed = true;
2606 ipa_ref *ref;
2607 FOR_EACH_ALIAS (node, ref)
2609 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2610 if (!set_const || alias->get_availability () > AVAIL_INTERPOSABLE)
2611 set_const_flag_1 (alias, set_const, looping, changed);
2613 for (cgraph_edge *e = node->callers; e; e = e->next_caller)
2614 if (e->caller->thunk.thunk_p
2615 && (!set_const || e->caller->get_availability () > AVAIL_INTERPOSABLE))
2617 /* Virtual thunks access virtual offset in the vtable, so they can
2618 only be pure, never const. */
2619 if (set_const
2620 && (e->caller->thunk.virtual_offset_p
2621 || !node->binds_to_current_def_p (e->caller)))
2622 *changed |= e->caller->set_pure_flag (true, looping);
2623 else
2624 set_const_flag_1 (e->caller, set_const, looping, changed);
2628 /* If SET_CONST is true, mark function, aliases and thunks to be ECF_CONST.
2629 If SET_CONST if false, clear the flag.
2631 When setting the flag be careful about possible interposition and
2632 do not set the flag for functions that can be interposet and set pure
2633 flag for functions that can bind to other definition.
2635 Return true if any change was done. */
2637 bool
2638 cgraph_node::set_const_flag (bool set_const, bool looping)
2640 bool changed = false;
2641 if (!set_const || get_availability () > AVAIL_INTERPOSABLE)
2642 set_const_flag_1 (this, set_const, looping, &changed);
2643 else
2645 ipa_ref *ref;
2647 FOR_EACH_ALIAS (this, ref)
2649 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
2650 if (!set_const || alias->get_availability () > AVAIL_INTERPOSABLE)
2651 set_const_flag_1 (alias, set_const, looping, &changed);
2654 return changed;
2657 /* Info used by set_pure_flag_1. */
2659 struct set_pure_flag_info
2661 bool pure;
2662 bool looping;
2663 bool changed;
2666 /* Worker to set_pure_flag. */
2668 static bool
2669 set_pure_flag_1 (cgraph_node *node, void *data)
2671 struct set_pure_flag_info *info = (struct set_pure_flag_info *)data;
2672 /* Static constructors and destructors without a side effect can be
2673 optimized out. */
2674 if (info->pure && !info->looping)
2676 if (DECL_STATIC_CONSTRUCTOR (node->decl))
2678 DECL_STATIC_CONSTRUCTOR (node->decl) = 0;
2679 info->changed = true;
2681 if (DECL_STATIC_DESTRUCTOR (node->decl))
2683 DECL_STATIC_DESTRUCTOR (node->decl) = 0;
2684 info->changed = true;
2687 if (info->pure)
2689 if (!DECL_PURE_P (node->decl) && !TREE_READONLY (node->decl))
2691 DECL_PURE_P (node->decl) = true;
2692 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = info->looping;
2693 info->changed = true;
2695 else if (DECL_LOOPING_CONST_OR_PURE_P (node->decl)
2696 && !info->looping)
2698 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2699 info->changed = true;
2702 else
2704 if (DECL_PURE_P (node->decl))
2706 DECL_PURE_P (node->decl) = false;
2707 DECL_LOOPING_CONST_OR_PURE_P (node->decl) = false;
2708 info->changed = true;
2711 return false;
2714 /* Set DECL_PURE_P on cgraph_node's decl and on aliases of the node
2715 if any to PURE.
2717 When setting the flag, be careful about possible interposition.
2718 Return true if any change was done. */
2720 bool
2721 cgraph_node::set_pure_flag (bool pure, bool looping)
2723 struct set_pure_flag_info info = {pure, looping, false};
2724 if (!pure)
2725 looping = false;
2726 call_for_symbol_thunks_and_aliases (set_pure_flag_1, &info, !pure, true);
2727 return info.changed;
2730 /* Return true when cgraph_node can not return or throw and thus
2731 it is safe to ignore its side effects for IPA analysis. */
2733 bool
2734 cgraph_node::cannot_return_p (void)
2736 int flags = flags_from_decl_or_type (decl);
2737 if (!opt_for_fn (decl, flag_exceptions))
2738 return (flags & ECF_NORETURN) != 0;
2739 else
2740 return ((flags & (ECF_NORETURN | ECF_NOTHROW))
2741 == (ECF_NORETURN | ECF_NOTHROW));
2744 /* Return true when call of edge can not lead to return from caller
2745 and thus it is safe to ignore its side effects for IPA analysis
2746 when computing side effects of the caller.
2747 FIXME: We could actually mark all edges that have no reaching
2748 patch to the exit block or throw to get better results. */
2749 bool
2750 cgraph_edge::cannot_lead_to_return_p (void)
2752 if (caller->cannot_return_p ())
2753 return true;
2754 if (indirect_unknown_callee)
2756 int flags = indirect_info->ecf_flags;
2757 if (!opt_for_fn (caller->decl, flag_exceptions))
2758 return (flags & ECF_NORETURN) != 0;
2759 else
2760 return ((flags & (ECF_NORETURN | ECF_NOTHROW))
2761 == (ECF_NORETURN | ECF_NOTHROW));
2763 else
2764 return callee->cannot_return_p ();
2767 /* Return true if the call can be hot. */
2769 bool
2770 cgraph_edge::maybe_hot_p (void)
2772 if (!maybe_hot_count_p (NULL, count))
2773 return false;
2774 if (caller->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
2775 || (callee
2776 && callee->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED))
2777 return false;
2778 if (caller->frequency > NODE_FREQUENCY_UNLIKELY_EXECUTED
2779 && (callee
2780 && callee->frequency <= NODE_FREQUENCY_EXECUTED_ONCE))
2781 return false;
2782 if (opt_for_fn (caller->decl, optimize_size))
2783 return false;
2784 if (caller->frequency == NODE_FREQUENCY_HOT)
2785 return true;
2786 /* If profile is now known yet, be conservative.
2787 FIXME: this predicate is used by early inliner and can do better there. */
2788 if (symtab->state < IPA_SSA)
2789 return true;
2790 if (caller->frequency == NODE_FREQUENCY_EXECUTED_ONCE
2791 && frequency < CGRAPH_FREQ_BASE * 3 / 2)
2792 return false;
2793 if (opt_for_fn (caller->decl, flag_guess_branch_prob))
2795 if (PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION) == 0
2796 || frequency <= (CGRAPH_FREQ_BASE
2797 / PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION)))
2798 return false;
2800 return true;
2803 /* Worker for cgraph_can_remove_if_no_direct_calls_p. */
2805 static bool
2806 nonremovable_p (cgraph_node *node, void *)
2808 return !node->can_remove_if_no_direct_calls_and_refs_p ();
2811 /* Return true if whole comdat group can be removed if there are no direct
2812 calls to THIS. */
2814 bool
2815 cgraph_node::can_remove_if_no_direct_calls_p (bool will_inline)
2817 struct ipa_ref *ref;
2819 /* For local symbols or non-comdat group it is the same as
2820 can_remove_if_no_direct_calls_p. */
2821 if (!externally_visible || !same_comdat_group)
2823 if (DECL_EXTERNAL (decl))
2824 return true;
2825 if (address_taken)
2826 return false;
2827 return !call_for_symbol_and_aliases (nonremovable_p, NULL, true);
2830 if (will_inline && address_taken)
2831 return false;
2833 /* Otheriwse check if we can remove the symbol itself and then verify
2834 that only uses of the comdat groups are direct call to THIS
2835 or its aliases. */
2836 if (!can_remove_if_no_direct_calls_and_refs_p ())
2837 return false;
2839 /* Check that all refs come from within the comdat group. */
2840 for (int i = 0; iterate_referring (i, ref); i++)
2841 if (ref->referring->get_comdat_group () != get_comdat_group ())
2842 return false;
2844 struct cgraph_node *target = ultimate_alias_target ();
2845 for (cgraph_node *next = dyn_cast<cgraph_node *> (same_comdat_group);
2846 next != this; next = dyn_cast<cgraph_node *> (next->same_comdat_group))
2848 if (!externally_visible)
2849 continue;
2850 if (!next->alias
2851 && !next->can_remove_if_no_direct_calls_and_refs_p ())
2852 return false;
2854 /* If we see different symbol than THIS, be sure to check calls. */
2855 if (next->ultimate_alias_target () != target)
2856 for (cgraph_edge *e = next->callers; e; e = e->next_caller)
2857 if (e->caller->get_comdat_group () != get_comdat_group ()
2858 || will_inline)
2859 return false;
2861 /* If function is not being inlined, we care only about
2862 references outside of the comdat group. */
2863 if (!will_inline)
2864 for (int i = 0; next->iterate_referring (i, ref); i++)
2865 if (ref->referring->get_comdat_group () != get_comdat_group ())
2866 return false;
2868 return true;
2871 /* Return true when function cgraph_node can be expected to be removed
2872 from program when direct calls in this compilation unit are removed.
2874 As a special case COMDAT functions are
2875 cgraph_can_remove_if_no_direct_calls_p while the are not
2876 cgraph_only_called_directly_p (it is possible they are called from other
2877 unit)
2879 This function behaves as cgraph_only_called_directly_p because eliminating
2880 all uses of COMDAT function does not make it necessarily disappear from
2881 the program unless we are compiling whole program or we do LTO. In this
2882 case we know we win since dynamic linking will not really discard the
2883 linkonce section. */
2885 bool
2886 cgraph_node::will_be_removed_from_program_if_no_direct_calls_p
2887 (bool will_inline)
2889 gcc_assert (!global.inlined_to);
2890 if (DECL_EXTERNAL (decl))
2891 return true;
2893 if (!in_lto_p && !flag_whole_program)
2895 /* If the symbol is in comdat group, we need to verify that whole comdat
2896 group becomes unreachable. Technically we could skip references from
2897 within the group, too. */
2898 if (!only_called_directly_p ())
2899 return false;
2900 if (same_comdat_group && externally_visible)
2902 struct cgraph_node *target = ultimate_alias_target ();
2904 if (will_inline && address_taken)
2905 return true;
2906 for (cgraph_node *next = dyn_cast<cgraph_node *> (same_comdat_group);
2907 next != this;
2908 next = dyn_cast<cgraph_node *> (next->same_comdat_group))
2910 if (!externally_visible)
2911 continue;
2912 if (!next->alias
2913 && !next->only_called_directly_p ())
2914 return false;
2916 /* If we see different symbol than THIS,
2917 be sure to check calls. */
2918 if (next->ultimate_alias_target () != target)
2919 for (cgraph_edge *e = next->callers; e; e = e->next_caller)
2920 if (e->caller->get_comdat_group () != get_comdat_group ()
2921 || will_inline)
2922 return false;
2925 return true;
2927 else
2928 return can_remove_if_no_direct_calls_p (will_inline);
2932 /* Worker for cgraph_only_called_directly_p. */
2934 static bool
2935 cgraph_not_only_called_directly_p_1 (cgraph_node *node, void *)
2937 return !node->only_called_directly_or_aliased_p ();
2940 /* Return true when function cgraph_node and all its aliases are only called
2941 directly.
2942 i.e. it is not externally visible, address was not taken and
2943 it is not used in any other non-standard way. */
2945 bool
2946 cgraph_node::only_called_directly_p (void)
2948 gcc_assert (ultimate_alias_target () == this);
2949 return !call_for_symbol_and_aliases (cgraph_not_only_called_directly_p_1,
2950 NULL, true);
2954 /* Collect all callers of NODE. Worker for collect_callers_of_node. */
2956 static bool
2957 collect_callers_of_node_1 (cgraph_node *node, void *data)
2959 vec<cgraph_edge *> *redirect_callers = (vec<cgraph_edge *> *)data;
2960 cgraph_edge *cs;
2961 enum availability avail;
2962 node->ultimate_alias_target (&avail);
2964 if (avail > AVAIL_INTERPOSABLE)
2965 for (cs = node->callers; cs != NULL; cs = cs->next_caller)
2966 if (!cs->indirect_inlining_edge
2967 && !cs->caller->thunk.thunk_p)
2968 redirect_callers->safe_push (cs);
2969 return false;
2972 /* Collect all callers of cgraph_node and its aliases that are known to lead to
2973 cgraph_node (i.e. are not overwritable). */
2975 vec<cgraph_edge *>
2976 cgraph_node::collect_callers (void)
2978 vec<cgraph_edge *> redirect_callers = vNULL;
2979 call_for_symbol_thunks_and_aliases (collect_callers_of_node_1,
2980 &redirect_callers, false);
2981 return redirect_callers;
2984 /* Return TRUE if NODE2 a clone of NODE or is equivalent to it. */
2986 static bool
2987 clone_of_p (cgraph_node *node, cgraph_node *node2)
2989 bool skipped_thunk = false;
2990 node = node->ultimate_alias_target ();
2991 node2 = node2->ultimate_alias_target ();
2993 /* There are no virtual clones of thunks so check former_clone_of or if we
2994 might have skipped thunks because this adjustments are no longer
2995 necessary. */
2996 while (node->thunk.thunk_p)
2998 if (node2->former_clone_of == node->decl)
2999 return true;
3000 if (!node->thunk.this_adjusting)
3001 return false;
3002 node = node->callees->callee->ultimate_alias_target ();
3003 skipped_thunk = true;
3006 if (skipped_thunk)
3008 if (!node2->clone.args_to_skip
3009 || !bitmap_bit_p (node2->clone.args_to_skip, 0))
3010 return false;
3011 if (node2->former_clone_of == node->decl)
3012 return true;
3013 else if (!node2->clone_of)
3014 return false;
3017 while (node != node2 && node2)
3018 node2 = node2->clone_of;
3019 return node2 != NULL;
3022 /* Verify edge count and frequency. */
3024 bool
3025 cgraph_edge::verify_count_and_frequency ()
3027 bool error_found = false;
3028 if (count < 0)
3030 error ("caller edge count is negative");
3031 error_found = true;
3033 if (frequency < 0)
3035 error ("caller edge frequency is negative");
3036 error_found = true;
3038 if (frequency > CGRAPH_FREQ_MAX)
3040 error ("caller edge frequency is too large");
3041 error_found = true;
3043 return error_found;
3046 /* Switch to THIS_CFUN if needed and print STMT to stderr. */
3047 static void
3048 cgraph_debug_gimple_stmt (function *this_cfun, gimple *stmt)
3050 bool fndecl_was_null = false;
3051 /* debug_gimple_stmt needs correct cfun */
3052 if (cfun != this_cfun)
3053 set_cfun (this_cfun);
3054 /* ...and an actual current_function_decl */
3055 if (!current_function_decl)
3057 current_function_decl = this_cfun->decl;
3058 fndecl_was_null = true;
3060 debug_gimple_stmt (stmt);
3061 if (fndecl_was_null)
3062 current_function_decl = NULL;
3065 /* Verify that call graph edge corresponds to DECL from the associated
3066 statement. Return true if the verification should fail. */
3068 bool
3069 cgraph_edge::verify_corresponds_to_fndecl (tree decl)
3071 cgraph_node *node;
3073 if (!decl || callee->global.inlined_to)
3074 return false;
3075 if (symtab->state == LTO_STREAMING)
3076 return false;
3077 node = cgraph_node::get (decl);
3079 /* We do not know if a node from a different partition is an alias or what it
3080 aliases and therefore cannot do the former_clone_of check reliably. When
3081 body_removed is set, we have lost all information about what was alias or
3082 thunk of and also cannot proceed. */
3083 if (!node
3084 || node->body_removed
3085 || node->in_other_partition
3086 || callee->icf_merged
3087 || callee->in_other_partition)
3088 return false;
3090 node = node->ultimate_alias_target ();
3092 /* Optimizers can redirect unreachable calls or calls triggering undefined
3093 behavior to builtin_unreachable. */
3094 if (DECL_BUILT_IN_CLASS (callee->decl) == BUILT_IN_NORMAL
3095 && DECL_FUNCTION_CODE (callee->decl) == BUILT_IN_UNREACHABLE)
3096 return false;
3098 if (callee->former_clone_of != node->decl
3099 && (node != callee->ultimate_alias_target ())
3100 && !clone_of_p (node, callee))
3101 return true;
3102 else
3103 return false;
3106 /* Verify cgraph nodes of given cgraph node. */
3107 DEBUG_FUNCTION void
3108 cgraph_node::verify_node (void)
3110 cgraph_edge *e;
3111 function *this_cfun = DECL_STRUCT_FUNCTION (decl);
3112 basic_block this_block;
3113 gimple_stmt_iterator gsi;
3114 bool error_found = false;
3116 if (seen_error ())
3117 return;
3119 timevar_push (TV_CGRAPH_VERIFY);
3120 error_found |= verify_base ();
3121 for (e = callees; e; e = e->next_callee)
3122 if (e->aux)
3124 error ("aux field set for edge %s->%s",
3125 identifier_to_locale (e->caller->name ()),
3126 identifier_to_locale (e->callee->name ()));
3127 error_found = true;
3129 if (count < 0)
3131 error ("execution count is negative");
3132 error_found = true;
3134 if (global.inlined_to && same_comdat_group)
3136 error ("inline clone in same comdat group list");
3137 error_found = true;
3139 if (!definition && !in_other_partition && local.local)
3141 error ("local symbols must be defined");
3142 error_found = true;
3144 if (global.inlined_to && externally_visible)
3146 error ("externally visible inline clone");
3147 error_found = true;
3149 if (global.inlined_to && address_taken)
3151 error ("inline clone with address taken");
3152 error_found = true;
3154 if (global.inlined_to && force_output)
3156 error ("inline clone is forced to output");
3157 error_found = true;
3159 for (e = indirect_calls; e; e = e->next_callee)
3161 if (e->aux)
3163 error ("aux field set for indirect edge from %s",
3164 identifier_to_locale (e->caller->name ()));
3165 error_found = true;
3167 if (!e->indirect_unknown_callee
3168 || !e->indirect_info)
3170 error ("An indirect edge from %s is not marked as indirect or has "
3171 "associated indirect_info, the corresponding statement is: ",
3172 identifier_to_locale (e->caller->name ()));
3173 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3174 error_found = true;
3177 bool check_comdat = comdat_local_p ();
3178 for (e = callers; e; e = e->next_caller)
3180 if (e->verify_count_and_frequency ())
3181 error_found = true;
3182 if (check_comdat
3183 && !in_same_comdat_group_p (e->caller))
3185 error ("comdat-local function called by %s outside its comdat",
3186 identifier_to_locale (e->caller->name ()));
3187 error_found = true;
3189 if (!e->inline_failed)
3191 if (global.inlined_to
3192 != (e->caller->global.inlined_to
3193 ? e->caller->global.inlined_to : e->caller))
3195 error ("inlined_to pointer is wrong");
3196 error_found = true;
3198 if (callers->next_caller)
3200 error ("multiple inline callers");
3201 error_found = true;
3204 else
3205 if (global.inlined_to)
3207 error ("inlined_to pointer set for noninline callers");
3208 error_found = true;
3211 for (e = callees; e; e = e->next_callee)
3213 if (e->verify_count_and_frequency ())
3214 error_found = true;
3215 if (gimple_has_body_p (e->caller->decl)
3216 && !e->caller->global.inlined_to
3217 && !e->speculative
3218 /* Optimized out calls are redirected to __builtin_unreachable. */
3219 && (e->frequency
3220 || ! e->callee->decl
3221 || DECL_BUILT_IN_CLASS (e->callee->decl) != BUILT_IN_NORMAL
3222 || DECL_FUNCTION_CODE (e->callee->decl) != BUILT_IN_UNREACHABLE)
3223 && (e->frequency
3224 != compute_call_stmt_bb_frequency (e->caller->decl,
3225 gimple_bb (e->call_stmt))))
3227 error ("caller edge frequency %i does not match BB frequency %i",
3228 e->frequency,
3229 compute_call_stmt_bb_frequency (e->caller->decl,
3230 gimple_bb (e->call_stmt)));
3231 error_found = true;
3234 for (e = indirect_calls; e; e = e->next_callee)
3236 if (e->verify_count_and_frequency ())
3237 error_found = true;
3238 if (gimple_has_body_p (e->caller->decl)
3239 && !e->caller->global.inlined_to
3240 && !e->speculative
3241 && (e->frequency
3242 != compute_call_stmt_bb_frequency (e->caller->decl,
3243 gimple_bb (e->call_stmt))))
3245 error ("indirect call frequency %i does not match BB frequency %i",
3246 e->frequency,
3247 compute_call_stmt_bb_frequency (e->caller->decl,
3248 gimple_bb (e->call_stmt)));
3249 error_found = true;
3252 if (!callers && global.inlined_to)
3254 error ("inlined_to pointer is set but no predecessors found");
3255 error_found = true;
3257 if (global.inlined_to == this)
3259 error ("inlined_to pointer refers to itself");
3260 error_found = true;
3263 if (clone_of)
3265 cgraph_node *n;
3266 for (n = clone_of->clones; n; n = n->next_sibling_clone)
3267 if (n == this)
3268 break;
3269 if (!n)
3271 error ("cgraph_node has wrong clone_of");
3272 error_found = true;
3275 if (clones)
3277 cgraph_node *n;
3278 for (n = clones; n; n = n->next_sibling_clone)
3279 if (n->clone_of != this)
3280 break;
3281 if (n)
3283 error ("cgraph_node has wrong clone list");
3284 error_found = true;
3287 if ((prev_sibling_clone || next_sibling_clone) && !clone_of)
3289 error ("cgraph_node is in clone list but it is not clone");
3290 error_found = true;
3292 if (!prev_sibling_clone && clone_of && clone_of->clones != this)
3294 error ("cgraph_node has wrong prev_clone pointer");
3295 error_found = true;
3297 if (prev_sibling_clone && prev_sibling_clone->next_sibling_clone != this)
3299 error ("double linked list of clones corrupted");
3300 error_found = true;
3303 if (analyzed && alias)
3305 bool ref_found = false;
3306 int i;
3307 ipa_ref *ref = NULL;
3309 if (callees)
3311 error ("Alias has call edges");
3312 error_found = true;
3314 for (i = 0; iterate_reference (i, ref); i++)
3315 if (ref->use == IPA_REF_CHKP)
3317 else if (ref->use != IPA_REF_ALIAS)
3319 error ("Alias has non-alias reference");
3320 error_found = true;
3322 else if (ref_found)
3324 error ("Alias has more than one alias reference");
3325 error_found = true;
3327 else
3328 ref_found = true;
3329 if (!ref_found)
3331 error ("Analyzed alias has no reference");
3332 error_found = true;
3336 /* Check instrumented version reference. */
3337 if (instrumented_version
3338 && instrumented_version->instrumented_version != this)
3340 error ("Instrumentation clone does not reference original node");
3341 error_found = true;
3344 /* Cannot have orig_decl for not instrumented nodes. */
3345 if (!instrumentation_clone && orig_decl)
3347 error ("Not instrumented node has non-NULL original declaration");
3348 error_found = true;
3351 /* If original not instrumented node still exists then we may check
3352 original declaration is set properly. */
3353 if (instrumented_version
3354 && orig_decl
3355 && orig_decl != instrumented_version->decl)
3357 error ("Instrumented node has wrong original declaration");
3358 error_found = true;
3361 /* Check all nodes have chkp reference to their instrumented versions. */
3362 if (analyzed
3363 && instrumented_version
3364 && !instrumentation_clone)
3366 bool ref_found = false;
3367 int i;
3368 struct ipa_ref *ref;
3370 for (i = 0; iterate_reference (i, ref); i++)
3371 if (ref->use == IPA_REF_CHKP)
3373 if (ref_found)
3375 error ("Node has more than one chkp reference");
3376 error_found = true;
3378 if (ref->referred != instrumented_version)
3380 error ("Wrong node is referenced with chkp reference");
3381 error_found = true;
3383 ref_found = true;
3386 if (!ref_found)
3388 error ("Analyzed node has no reference to instrumented version");
3389 error_found = true;
3393 if (instrumentation_clone
3394 && DECL_BUILT_IN_CLASS (decl) == NOT_BUILT_IN)
3396 tree name = DECL_ASSEMBLER_NAME (decl);
3397 tree orig_name = DECL_ASSEMBLER_NAME (orig_decl);
3399 if (!IDENTIFIER_TRANSPARENT_ALIAS (name)
3400 || TREE_CHAIN (name) != orig_name)
3402 error ("Alias chain for instrumented node is broken");
3403 error_found = true;
3407 if (analyzed && thunk.thunk_p)
3409 if (!callees)
3411 error ("No edge out of thunk node");
3412 error_found = true;
3414 else if (callees->next_callee)
3416 error ("More than one edge out of thunk node");
3417 error_found = true;
3419 if (gimple_has_body_p (decl) && !global.inlined_to)
3421 error ("Thunk is not supposed to have body");
3422 error_found = true;
3424 if (thunk.add_pointer_bounds_args
3425 && !instrumented_version->semantically_equivalent_p (callees->callee))
3427 error ("Instrumentation thunk has wrong edge callee");
3428 error_found = true;
3431 else if (analyzed && gimple_has_body_p (decl)
3432 && !TREE_ASM_WRITTEN (decl)
3433 && (!DECL_EXTERNAL (decl) || global.inlined_to)
3434 && !flag_wpa)
3436 if (this_cfun->cfg)
3438 hash_set<gimple *> stmts;
3439 int i;
3440 ipa_ref *ref = NULL;
3442 /* Reach the trees by walking over the CFG, and note the
3443 enclosing basic-blocks in the call edges. */
3444 FOR_EACH_BB_FN (this_block, this_cfun)
3446 for (gsi = gsi_start_phis (this_block);
3447 !gsi_end_p (gsi); gsi_next (&gsi))
3448 stmts.add (gsi_stmt (gsi));
3449 for (gsi = gsi_start_bb (this_block);
3450 !gsi_end_p (gsi);
3451 gsi_next (&gsi))
3453 gimple *stmt = gsi_stmt (gsi);
3454 stmts.add (stmt);
3455 if (is_gimple_call (stmt))
3457 cgraph_edge *e = get_edge (stmt);
3458 tree decl = gimple_call_fndecl (stmt);
3459 if (e)
3461 if (e->aux)
3463 error ("shared call_stmt:");
3464 cgraph_debug_gimple_stmt (this_cfun, stmt);
3465 error_found = true;
3467 if (!e->indirect_unknown_callee)
3469 if (e->verify_corresponds_to_fndecl (decl))
3471 error ("edge points to wrong declaration:");
3472 debug_tree (e->callee->decl);
3473 fprintf (stderr," Instead of:");
3474 debug_tree (decl);
3475 error_found = true;
3478 else if (decl)
3480 error ("an indirect edge with unknown callee "
3481 "corresponding to a call_stmt with "
3482 "a known declaration:");
3483 error_found = true;
3484 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3486 e->aux = (void *)1;
3488 else if (decl)
3490 error ("missing callgraph edge for call stmt:");
3491 cgraph_debug_gimple_stmt (this_cfun, stmt);
3492 error_found = true;
3497 for (i = 0; iterate_reference (i, ref); i++)
3498 if (ref->stmt && !stmts.contains (ref->stmt))
3500 error ("reference to dead statement");
3501 cgraph_debug_gimple_stmt (this_cfun, ref->stmt);
3502 error_found = true;
3505 else
3506 /* No CFG available?! */
3507 gcc_unreachable ();
3509 for (e = callees; e; e = e->next_callee)
3511 if (!e->aux)
3513 error ("edge %s->%s has no corresponding call_stmt",
3514 identifier_to_locale (e->caller->name ()),
3515 identifier_to_locale (e->callee->name ()));
3516 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3517 error_found = true;
3519 e->aux = 0;
3521 for (e = indirect_calls; e; e = e->next_callee)
3523 if (!e->aux && !e->speculative)
3525 error ("an indirect edge from %s has no corresponding call_stmt",
3526 identifier_to_locale (e->caller->name ()));
3527 cgraph_debug_gimple_stmt (this_cfun, e->call_stmt);
3528 error_found = true;
3530 e->aux = 0;
3533 if (error_found)
3535 dump (stderr);
3536 internal_error ("verify_cgraph_node failed");
3538 timevar_pop (TV_CGRAPH_VERIFY);
3541 /* Verify whole cgraph structure. */
3542 DEBUG_FUNCTION void
3543 cgraph_node::verify_cgraph_nodes (void)
3545 cgraph_node *node;
3547 if (seen_error ())
3548 return;
3550 FOR_EACH_FUNCTION (node)
3551 node->verify ();
3554 /* Walk the alias chain to return the function cgraph_node is alias of.
3555 Walk through thunks, too.
3556 When AVAILABILITY is non-NULL, get minimal availability in the chain.
3557 When REF is non-NULL, assume that reference happens in symbol REF
3558 when determining the availability. */
3560 cgraph_node *
3561 cgraph_node::function_symbol (enum availability *availability,
3562 struct symtab_node *ref)
3564 cgraph_node *node = ultimate_alias_target (availability, ref);
3566 while (node->thunk.thunk_p)
3568 ref = node;
3569 node = node->callees->callee;
3570 if (availability)
3572 enum availability a;
3573 a = node->get_availability (ref);
3574 if (a < *availability)
3575 *availability = a;
3577 node = node->ultimate_alias_target (availability, ref);
3579 return node;
3582 /* Walk the alias chain to return the function cgraph_node is alias of.
3583 Walk through non virtual thunks, too. Thus we return either a function
3584 or a virtual thunk node.
3585 When AVAILABILITY is non-NULL, get minimal availability in the chain.
3586 When REF is non-NULL, assume that reference happens in symbol REF
3587 when determining the availability. */
3589 cgraph_node *
3590 cgraph_node::function_or_virtual_thunk_symbol
3591 (enum availability *availability,
3592 struct symtab_node *ref)
3594 cgraph_node *node = ultimate_alias_target (availability, ref);
3596 while (node->thunk.thunk_p && !node->thunk.virtual_offset_p)
3598 ref = node;
3599 node = node->callees->callee;
3600 if (availability)
3602 enum availability a;
3603 a = node->get_availability (ref);
3604 if (a < *availability)
3605 *availability = a;
3607 node = node->ultimate_alias_target (availability, ref);
3609 return node;
3612 /* When doing LTO, read cgraph_node's body from disk if it is not already
3613 present. */
3615 bool
3616 cgraph_node::get_untransformed_body (void)
3618 lto_file_decl_data *file_data;
3619 const char *data, *name;
3620 size_t len;
3621 tree decl = this->decl;
3623 /* Check if body is already there. Either we have gimple body or
3624 the function is thunk and in that case we set DECL_ARGUMENTS. */
3625 if (DECL_ARGUMENTS (decl) || gimple_has_body_p (decl))
3626 return false;
3628 gcc_assert (in_lto_p && !DECL_RESULT (decl));
3630 timevar_push (TV_IPA_LTO_GIMPLE_IN);
3632 file_data = lto_file_data;
3633 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
3635 /* We may have renamed the declaration, e.g., a static function. */
3636 name = lto_get_decl_name_mapping (file_data, name);
3637 struct lto_in_decl_state *decl_state
3638 = lto_get_function_in_decl_state (file_data, decl);
3640 data = lto_get_section_data (file_data, LTO_section_function_body,
3641 name, &len, decl_state->compressed);
3642 if (!data)
3643 fatal_error (input_location, "%s: section %s is missing",
3644 file_data->file_name,
3645 name);
3647 gcc_assert (DECL_STRUCT_FUNCTION (decl) == NULL);
3649 lto_input_function_body (file_data, this, data);
3650 lto_stats.num_function_bodies++;
3651 lto_free_section_data (file_data, LTO_section_function_body, name,
3652 data, len, decl_state->compressed);
3653 lto_free_function_in_decl_state_for_node (this);
3654 /* Keep lto file data so ipa-inline-analysis knows about cross module
3655 inlining. */
3657 timevar_pop (TV_IPA_LTO_GIMPLE_IN);
3659 return true;
3662 /* Prepare function body. When doing LTO, read cgraph_node's body from disk
3663 if it is not already present. When some IPA transformations are scheduled,
3664 apply them. */
3666 bool
3667 cgraph_node::get_body (void)
3669 bool updated;
3671 updated = get_untransformed_body ();
3673 /* Getting transformed body makes no sense for inline clones;
3674 we should never use this on real clones because they are materialized
3675 early.
3676 TODO: Materializing clones here will likely lead to smaller LTRANS
3677 footprint. */
3678 gcc_assert (!global.inlined_to && !clone_of);
3679 if (ipa_transforms_to_apply.exists ())
3681 opt_pass *saved_current_pass = current_pass;
3682 FILE *saved_dump_file = dump_file;
3683 const char *saved_dump_file_name = dump_file_name;
3684 dump_flags_t saved_dump_flags = dump_flags;
3685 dump_file_name = NULL;
3686 dump_file = NULL;
3688 push_cfun (DECL_STRUCT_FUNCTION (decl));
3689 execute_all_ipa_transforms ();
3690 cgraph_edge::rebuild_edges ();
3691 free_dominance_info (CDI_DOMINATORS);
3692 free_dominance_info (CDI_POST_DOMINATORS);
3693 pop_cfun ();
3694 updated = true;
3696 current_pass = saved_current_pass;
3697 dump_file = saved_dump_file;
3698 dump_file_name = saved_dump_file_name;
3699 dump_flags = saved_dump_flags;
3701 return updated;
3704 /* Return the DECL_STRUCT_FUNCTION of the function. */
3706 struct function *
3707 cgraph_node::get_fun (void)
3709 cgraph_node *node = this;
3710 struct function *fun = DECL_STRUCT_FUNCTION (node->decl);
3712 while (!fun && node->clone_of)
3714 node = node->clone_of;
3715 fun = DECL_STRUCT_FUNCTION (node->decl);
3718 return fun;
3721 /* Verify if the type of the argument matches that of the function
3722 declaration. If we cannot verify this or there is a mismatch,
3723 return false. */
3725 static bool
3726 gimple_check_call_args (gimple *stmt, tree fndecl, bool args_count_match)
3728 tree parms, p;
3729 unsigned int i, nargs;
3731 /* Calls to internal functions always match their signature. */
3732 if (gimple_call_internal_p (stmt))
3733 return true;
3735 nargs = gimple_call_num_args (stmt);
3737 /* Get argument types for verification. */
3738 if (fndecl)
3739 parms = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
3740 else
3741 parms = TYPE_ARG_TYPES (gimple_call_fntype (stmt));
3743 /* Verify if the type of the argument matches that of the function
3744 declaration. If we cannot verify this or there is a mismatch,
3745 return false. */
3746 if (fndecl && DECL_ARGUMENTS (fndecl))
3748 for (i = 0, p = DECL_ARGUMENTS (fndecl);
3749 i < nargs;
3750 i++, p = DECL_CHAIN (p))
3752 tree arg;
3753 /* We cannot distinguish a varargs function from the case
3754 of excess parameters, still deferring the inlining decision
3755 to the callee is possible. */
3756 if (!p)
3757 break;
3758 arg = gimple_call_arg (stmt, i);
3759 if (p == error_mark_node
3760 || DECL_ARG_TYPE (p) == error_mark_node
3761 || arg == error_mark_node
3762 || (!types_compatible_p (DECL_ARG_TYPE (p), TREE_TYPE (arg))
3763 && !fold_convertible_p (DECL_ARG_TYPE (p), arg)))
3764 return false;
3766 if (args_count_match && p)
3767 return false;
3769 else if (parms)
3771 for (i = 0, p = parms; i < nargs; i++, p = TREE_CHAIN (p))
3773 tree arg;
3774 /* If this is a varargs function defer inlining decision
3775 to callee. */
3776 if (!p)
3777 break;
3778 arg = gimple_call_arg (stmt, i);
3779 if (TREE_VALUE (p) == error_mark_node
3780 || arg == error_mark_node
3781 || TREE_CODE (TREE_VALUE (p)) == VOID_TYPE
3782 || (!types_compatible_p (TREE_VALUE (p), TREE_TYPE (arg))
3783 && !fold_convertible_p (TREE_VALUE (p), arg)))
3784 return false;
3787 else
3789 if (nargs != 0)
3790 return false;
3792 return true;
3795 /* Verify if the type of the argument and lhs of CALL_STMT matches
3796 that of the function declaration CALLEE. If ARGS_COUNT_MATCH is
3797 true, the arg count needs to be the same.
3798 If we cannot verify this or there is a mismatch, return false. */
3800 bool
3801 gimple_check_call_matching_types (gimple *call_stmt, tree callee,
3802 bool args_count_match)
3804 tree lhs;
3806 if ((DECL_RESULT (callee)
3807 && !DECL_BY_REFERENCE (DECL_RESULT (callee))
3808 && (lhs = gimple_call_lhs (call_stmt)) != NULL_TREE
3809 && !useless_type_conversion_p (TREE_TYPE (DECL_RESULT (callee)),
3810 TREE_TYPE (lhs))
3811 && !fold_convertible_p (TREE_TYPE (DECL_RESULT (callee)), lhs))
3812 || !gimple_check_call_args (call_stmt, callee, args_count_match))
3813 return false;
3814 return true;
3817 /* Reset all state within cgraph.c so that we can rerun the compiler
3818 within the same process. For use by toplev::finalize. */
3820 void
3821 cgraph_c_finalize (void)
3823 symtab = NULL;
3825 x_cgraph_nodes_queue = NULL;
3827 cgraph_fnver_htab = NULL;
3828 version_info_node = NULL;
3831 /* A wroker for call_for_symbol_and_aliases. */
3833 bool
3834 cgraph_node::call_for_symbol_and_aliases_1 (bool (*callback) (cgraph_node *,
3835 void *),
3836 void *data,
3837 bool include_overwritable)
3839 ipa_ref *ref;
3840 FOR_EACH_ALIAS (this, ref)
3842 cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
3843 if (include_overwritable
3844 || alias->get_availability () > AVAIL_INTERPOSABLE)
3845 if (alias->call_for_symbol_and_aliases (callback, data,
3846 include_overwritable))
3847 return true;
3849 return false;
3852 /* Return true if NODE has thunk. */
3854 bool
3855 cgraph_node::has_thunk_p (cgraph_node *node, void *)
3857 for (cgraph_edge *e = node->callers; e; e = e->next_caller)
3858 if (e->caller->thunk.thunk_p)
3859 return true;
3860 return false;
3863 #include "gt-cgraph.h"