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