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