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