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