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