re PR rtl-optimization/45621 (ICE: verify_cgraph_node failed: inlined_to pointer...
[platform/upstream/gcc.git] / gcc / cgraph.c
1 /* Callgraph handling code.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3    Free Software Foundation, Inc.
4    Contributed by Jan Hubicka
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /*  This file contains basic routines manipulating call graph
23
24 The callgraph:
25
26     The call-graph is data structure designed for intra-procedural optimization
27     but it is also used in non-unit-at-a-time compilation to allow easier code
28     sharing.
29
30     The call-graph consist of nodes and edges represented via linked lists.
31     Each function (external or not) corresponds to the unique node.
32
33     The mapping from declarations to call-graph nodes is done using hash table
34     based on DECL_UID.  The call-graph nodes are created lazily using
35     cgraph_node function when called for unknown declaration.
36
37     The callgraph at the moment does not represent all indirect calls or calls
38     from other compilation units.  Flag NEEDED is set for each node that may be
39     accessed in such an invisible way and it shall be considered an entry point
40     to the callgraph.
41
42     On the other hand, the callgraph currently does contain some edges for
43     indirect calls with unknown callees which can be accessed through
44     indirect_calls field of a node.  It should be noted however that at the
45     moment only calls which are potential candidates for indirect inlining are
46     added there.
47
48     Interprocedural information:
49
50       Callgraph is place to store data needed for interprocedural optimization.
51       All data structures are divided into three components: local_info that
52       is produced while analyzing the function, global_info that is result
53       of global walking of the callgraph on the end of compilation and
54       rtl_info used by RTL backend to propagate data from already compiled
55       functions to their callers.
56
57       Moreover, each node has a uid which can be used to keep information in
58       on-the-side arrays.  UIDs are reused and therefore reasonably dense.
59
60     Inlining plans:
61
62       The function inlining information is decided in advance and maintained
63       in the callgraph as so called inline plan.
64       For each inlined call, the callee's node is cloned to represent the
65       new function copy produced by inliner.
66       Each inlined call gets a unique corresponding clone node of the callee
67       and the data structure is updated while inlining is performed, so
68       the clones are eliminated and their callee edges redirected to the
69       caller.
70
71       Each edge has "inline_failed" field.  When the field is set to NULL,
72       the call will be inlined.  When it is non-NULL it contains a reason
73       why inlining wasn't performed.  */
74
75 #include "config.h"
76 #include "system.h"
77 #include "coretypes.h"
78 #include "tm.h"
79 #include "tree.h"
80 #include "tree-inline.h"
81 #include "langhooks.h"
82 #include "hashtab.h"
83 #include "toplev.h"
84 #include "flags.h"
85 #include "ggc.h"
86 #include "debug.h"
87 #include "target.h"
88 #include "basic-block.h"
89 #include "cgraph.h"
90 #include "output.h"
91 #include "intl.h"
92 #include "gimple.h"
93 #include "tree-dump.h"
94 #include "tree-flow.h"
95 #include "value-prof.h"
96 #include "except.h"
97 #include "diagnostic-core.h"
98 #include "rtl.h"
99 #include "ipa-utils.h"
100 #include "lto-streamer.h"
101
102 static void cgraph_node_remove_callers (struct cgraph_node *node);
103 static inline void cgraph_edge_remove_caller (struct cgraph_edge *e);
104 static inline void cgraph_edge_remove_callee (struct cgraph_edge *e);
105
106 /* Hash table used to convert declarations into nodes.  */
107 static GTY((param_is (struct cgraph_node))) htab_t cgraph_hash;
108 /* Hash table used to convert assembler names into nodes.  */
109 static GTY((param_is (struct cgraph_node))) htab_t assembler_name_hash;
110
111 /* The linked list of cgraph nodes.  */
112 struct cgraph_node *cgraph_nodes;
113
114 /* Queue of cgraph nodes scheduled to be lowered.  */
115 struct cgraph_node *cgraph_nodes_queue;
116
117 /* Queue of cgraph nodes scheduled to be added into cgraph.  This is a
118    secondary queue used during optimization to accommodate passes that
119    may generate new functions that need to be optimized and expanded.  */
120 struct cgraph_node *cgraph_new_nodes;
121
122 /* Number of nodes in existence.  */
123 int cgraph_n_nodes;
124
125 /* Maximal uid used in cgraph nodes.  */
126 int cgraph_max_uid;
127
128 /* Maximal uid used in cgraph edges.  */
129 int cgraph_edge_max_uid;
130
131 /* Maximal pid used for profiling */
132 int cgraph_max_pid;
133
134 /* Set when whole unit has been analyzed so we can access global info.  */
135 bool cgraph_global_info_ready = false;
136
137 /* What state callgraph is in right now.  */
138 enum cgraph_state cgraph_state = CGRAPH_STATE_CONSTRUCTION;
139
140 /* Set when the cgraph is fully build and the basic flags are computed.  */
141 bool cgraph_function_flags_ready = false;
142
143 /* Linked list of cgraph asm nodes.  */
144 struct cgraph_asm_node *cgraph_asm_nodes;
145
146 /* Last node in cgraph_asm_nodes.  */
147 static GTY(()) struct cgraph_asm_node *cgraph_asm_last_node;
148
149 /* The order index of the next cgraph node to be created.  This is
150    used so that we can sort the cgraph nodes in order by when we saw
151    them, to support -fno-toplevel-reorder.  */
152 int cgraph_order;
153
154 /* List of hooks trigerred on cgraph_edge events.  */
155 struct cgraph_edge_hook_list {
156   cgraph_edge_hook hook;
157   void *data;
158   struct cgraph_edge_hook_list *next;
159 };
160
161 /* List of hooks trigerred on cgraph_node events.  */
162 struct cgraph_node_hook_list {
163   cgraph_node_hook hook;
164   void *data;
165   struct cgraph_node_hook_list *next;
166 };
167
168 /* List of hooks trigerred on events involving two cgraph_edges.  */
169 struct cgraph_2edge_hook_list {
170   cgraph_2edge_hook hook;
171   void *data;
172   struct cgraph_2edge_hook_list *next;
173 };
174
175 /* List of hooks trigerred on events involving two cgraph_nodes.  */
176 struct cgraph_2node_hook_list {
177   cgraph_2node_hook hook;
178   void *data;
179   struct cgraph_2node_hook_list *next;
180 };
181
182 /* List of hooks triggered when an edge is removed.  */
183 struct cgraph_edge_hook_list *first_cgraph_edge_removal_hook;
184 /* List of hooks triggered when a node is removed.  */
185 struct cgraph_node_hook_list *first_cgraph_node_removal_hook;
186 /* List of hooks triggered when an edge is duplicated.  */
187 struct cgraph_2edge_hook_list *first_cgraph_edge_duplicated_hook;
188 /* List of hooks triggered when a node is duplicated.  */
189 struct cgraph_2node_hook_list *first_cgraph_node_duplicated_hook;
190 /* List of hooks triggered when an function is inserted.  */
191 struct cgraph_node_hook_list *first_cgraph_function_insertion_hook;
192
193 /* Head of a linked list of unused (freed) call graph nodes.
194    Do not GTY((delete)) this list so UIDs gets reliably recycled.  */
195 static GTY(()) struct cgraph_node *free_nodes;
196 /* Head of a linked list of unused (freed) call graph edges.
197    Do not GTY((delete)) this list so UIDs gets reliably recycled.  */
198 static GTY(()) struct cgraph_edge *free_edges;
199
200 /* Macros to access the next item in the list of free cgraph nodes and
201    edges. */
202 #define NEXT_FREE_NODE(NODE) (NODE)->next
203 #define NEXT_FREE_EDGE(EDGE) (EDGE)->prev_caller
204
205 /* Register HOOK to be called with DATA on each removed edge.  */
206 struct cgraph_edge_hook_list *
207 cgraph_add_edge_removal_hook (cgraph_edge_hook hook, void *data)
208 {
209   struct cgraph_edge_hook_list *entry;
210   struct cgraph_edge_hook_list **ptr = &first_cgraph_edge_removal_hook;
211
212   entry = (struct cgraph_edge_hook_list *) xmalloc (sizeof (*entry));
213   entry->hook = hook;
214   entry->data = data;
215   entry->next = NULL;
216   while (*ptr)
217     ptr = &(*ptr)->next;
218   *ptr = entry;
219   return entry;
220 }
221
222 /* Remove ENTRY from the list of hooks called on removing edges.  */
223 void
224 cgraph_remove_edge_removal_hook (struct cgraph_edge_hook_list *entry)
225 {
226   struct cgraph_edge_hook_list **ptr = &first_cgraph_edge_removal_hook;
227
228   while (*ptr != entry)
229     ptr = &(*ptr)->next;
230   *ptr = entry->next;
231   free (entry);
232 }
233
234 /* Call all edge removal hooks.  */
235 static void
236 cgraph_call_edge_removal_hooks (struct cgraph_edge *e)
237 {
238   struct cgraph_edge_hook_list *entry = first_cgraph_edge_removal_hook;
239   while (entry)
240   {
241     entry->hook (e, entry->data);
242     entry = entry->next;
243   }
244 }
245
246 /* Register HOOK to be called with DATA on each removed node.  */
247 struct cgraph_node_hook_list *
248 cgraph_add_node_removal_hook (cgraph_node_hook hook, void *data)
249 {
250   struct cgraph_node_hook_list *entry;
251   struct cgraph_node_hook_list **ptr = &first_cgraph_node_removal_hook;
252
253   entry = (struct cgraph_node_hook_list *) xmalloc (sizeof (*entry));
254   entry->hook = hook;
255   entry->data = data;
256   entry->next = NULL;
257   while (*ptr)
258     ptr = &(*ptr)->next;
259   *ptr = entry;
260   return entry;
261 }
262
263 /* Remove ENTRY from the list of hooks called on removing nodes.  */
264 void
265 cgraph_remove_node_removal_hook (struct cgraph_node_hook_list *entry)
266 {
267   struct cgraph_node_hook_list **ptr = &first_cgraph_node_removal_hook;
268
269   while (*ptr != entry)
270     ptr = &(*ptr)->next;
271   *ptr = entry->next;
272   free (entry);
273 }
274
275 /* Call all node removal hooks.  */
276 static void
277 cgraph_call_node_removal_hooks (struct cgraph_node *node)
278 {
279   struct cgraph_node_hook_list *entry = first_cgraph_node_removal_hook;
280   while (entry)
281   {
282     entry->hook (node, entry->data);
283     entry = entry->next;
284   }
285 }
286
287 /* Register HOOK to be called with DATA on each inserted node.  */
288 struct cgraph_node_hook_list *
289 cgraph_add_function_insertion_hook (cgraph_node_hook hook, void *data)
290 {
291   struct cgraph_node_hook_list *entry;
292   struct cgraph_node_hook_list **ptr = &first_cgraph_function_insertion_hook;
293
294   entry = (struct cgraph_node_hook_list *) xmalloc (sizeof (*entry));
295   entry->hook = hook;
296   entry->data = data;
297   entry->next = NULL;
298   while (*ptr)
299     ptr = &(*ptr)->next;
300   *ptr = entry;
301   return entry;
302 }
303
304 /* Remove ENTRY from the list of hooks called on inserted nodes.  */
305 void
306 cgraph_remove_function_insertion_hook (struct cgraph_node_hook_list *entry)
307 {
308   struct cgraph_node_hook_list **ptr = &first_cgraph_function_insertion_hook;
309
310   while (*ptr != entry)
311     ptr = &(*ptr)->next;
312   *ptr = entry->next;
313   free (entry);
314 }
315
316 /* Call all node insertion hooks.  */
317 void
318 cgraph_call_function_insertion_hooks (struct cgraph_node *node)
319 {
320   struct cgraph_node_hook_list *entry = first_cgraph_function_insertion_hook;
321   while (entry)
322   {
323     entry->hook (node, entry->data);
324     entry = entry->next;
325   }
326 }
327
328 /* Register HOOK to be called with DATA on each duplicated edge.  */
329 struct cgraph_2edge_hook_list *
330 cgraph_add_edge_duplication_hook (cgraph_2edge_hook hook, void *data)
331 {
332   struct cgraph_2edge_hook_list *entry;
333   struct cgraph_2edge_hook_list **ptr = &first_cgraph_edge_duplicated_hook;
334
335   entry = (struct cgraph_2edge_hook_list *) xmalloc (sizeof (*entry));
336   entry->hook = hook;
337   entry->data = data;
338   entry->next = NULL;
339   while (*ptr)
340     ptr = &(*ptr)->next;
341   *ptr = entry;
342   return entry;
343 }
344
345 /* Remove ENTRY from the list of hooks called on duplicating edges.  */
346 void
347 cgraph_remove_edge_duplication_hook (struct cgraph_2edge_hook_list *entry)
348 {
349   struct cgraph_2edge_hook_list **ptr = &first_cgraph_edge_duplicated_hook;
350
351   while (*ptr != entry)
352     ptr = &(*ptr)->next;
353   *ptr = entry->next;
354   free (entry);
355 }
356
357 /* Call all edge duplication hooks.  */
358 static void
359 cgraph_call_edge_duplication_hooks (struct cgraph_edge *cs1,
360                                     struct cgraph_edge *cs2)
361 {
362   struct cgraph_2edge_hook_list *entry = first_cgraph_edge_duplicated_hook;
363   while (entry)
364   {
365     entry->hook (cs1, cs2, entry->data);
366     entry = entry->next;
367   }
368 }
369
370 /* Register HOOK to be called with DATA on each duplicated node.  */
371 struct cgraph_2node_hook_list *
372 cgraph_add_node_duplication_hook (cgraph_2node_hook hook, void *data)
373 {
374   struct cgraph_2node_hook_list *entry;
375   struct cgraph_2node_hook_list **ptr = &first_cgraph_node_duplicated_hook;
376
377   entry = (struct cgraph_2node_hook_list *) xmalloc (sizeof (*entry));
378   entry->hook = hook;
379   entry->data = data;
380   entry->next = NULL;
381   while (*ptr)
382     ptr = &(*ptr)->next;
383   *ptr = entry;
384   return entry;
385 }
386
387 /* Remove ENTRY from the list of hooks called on duplicating nodes.  */
388 void
389 cgraph_remove_node_duplication_hook (struct cgraph_2node_hook_list *entry)
390 {
391   struct cgraph_2node_hook_list **ptr = &first_cgraph_node_duplicated_hook;
392
393   while (*ptr != entry)
394     ptr = &(*ptr)->next;
395   *ptr = entry->next;
396   free (entry);
397 }
398
399 /* Call all node duplication hooks.  */
400 static void
401 cgraph_call_node_duplication_hooks (struct cgraph_node *node1,
402                                     struct cgraph_node *node2)
403 {
404   struct cgraph_2node_hook_list *entry = first_cgraph_node_duplicated_hook;
405   while (entry)
406   {
407     entry->hook (node1, node2, entry->data);
408     entry = entry->next;
409   }
410 }
411
412 /* Returns a hash code for P.  */
413
414 static hashval_t
415 hash_node (const void *p)
416 {
417   const struct cgraph_node *n = (const struct cgraph_node *) p;
418   return (hashval_t) DECL_UID (n->decl);
419 }
420
421
422 /* Returns nonzero if P1 and P2 are equal.  */
423
424 static int
425 eq_node (const void *p1, const void *p2)
426 {
427   const struct cgraph_node *n1 = (const struct cgraph_node *) p1;
428   const struct cgraph_node *n2 = (const struct cgraph_node *) p2;
429   return DECL_UID (n1->decl) == DECL_UID (n2->decl);
430 }
431
432 /* Allocate new callgraph node.  */
433
434 static inline struct cgraph_node *
435 cgraph_allocate_node (void)
436 {
437   struct cgraph_node *node;
438
439   if (free_nodes)
440     {
441       node = free_nodes;
442       free_nodes = NEXT_FREE_NODE (node);
443     }
444   else
445     {
446       node = ggc_alloc_cleared_cgraph_node ();
447       node->uid = cgraph_max_uid++;
448     }
449
450   return node;
451 }
452
453 /* Allocate new callgraph node and insert it into basic data structures.  */
454
455 static struct cgraph_node *
456 cgraph_create_node (void)
457 {
458   struct cgraph_node *node = cgraph_allocate_node ();
459
460   node->next = cgraph_nodes;
461   node->pid = -1;
462   node->order = cgraph_order++;
463   if (cgraph_nodes)
464     cgraph_nodes->previous = node;
465   node->previous = NULL;
466   node->global.estimated_growth = INT_MIN;
467   node->frequency = NODE_FREQUENCY_NORMAL;
468   ipa_empty_ref_list (&node->ref_list);
469   cgraph_nodes = node;
470   cgraph_n_nodes++;
471   return node;
472 }
473
474 /* Return cgraph node assigned to DECL.  Create new one when needed.  */
475
476 struct cgraph_node *
477 cgraph_node (tree decl)
478 {
479   struct cgraph_node key, *node, **slot;
480
481   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
482
483   if (!cgraph_hash)
484     cgraph_hash = htab_create_ggc (10, hash_node, eq_node, NULL);
485
486   key.decl = decl;
487
488   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, &key, INSERT);
489
490   if (*slot)
491     {
492       node = *slot;
493       if (node->same_body_alias)
494         node = node->same_body;
495       return node;
496     }
497
498   node = cgraph_create_node ();
499   node->decl = decl;
500   *slot = node;
501   if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
502     {
503       node->origin = cgraph_node (DECL_CONTEXT (decl));
504       node->next_nested = node->origin->nested;
505       node->origin->nested = node;
506     }
507   if (assembler_name_hash)
508     {
509       void **aslot;
510       tree name = DECL_ASSEMBLER_NAME (decl);
511
512       aslot = htab_find_slot_with_hash (assembler_name_hash, name,
513                                         decl_assembler_name_hash (name),
514                                         INSERT);
515       /* We can have multiple declarations with same assembler name. For C++
516          it is __builtin_strlen and strlen, for instance.  Do we need to
517          record them all?  Original implementation marked just first one
518          so lets hope for the best.  */
519       if (*aslot == NULL)
520         *aslot = node;
521     }
522   return node;
523 }
524
525 /* Mark ALIAS as an alias to DECL.  */
526
527 static struct cgraph_node *
528 cgraph_same_body_alias_1 (tree alias, tree decl)
529 {
530   struct cgraph_node key, *alias_node, *decl_node, **slot;
531
532   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
533   gcc_assert (TREE_CODE (alias) == FUNCTION_DECL);
534   decl_node = cgraph_node (decl);
535
536   key.decl = alias;
537
538   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, &key, INSERT);
539
540   /* If the cgraph_node has been already created, fail.  */
541   if (*slot)
542     return NULL;
543
544   alias_node = cgraph_allocate_node ();
545   alias_node->decl = alias;
546   alias_node->same_body_alias = 1;
547   alias_node->same_body = decl_node;
548   alias_node->previous = NULL;
549   if (decl_node->same_body)
550     decl_node->same_body->previous = alias_node;
551   alias_node->next = decl_node->same_body;
552   alias_node->thunk.alias = decl;
553   decl_node->same_body = alias_node;
554   *slot = alias_node;
555   return alias_node;
556 }
557
558 /* Attempt to mark ALIAS as an alias to DECL.  Return alias node if successful
559    and NULL otherwise. 
560    Same body aliases are output whenever the body of DECL is output,
561    and cgraph_node (ALIAS) transparently returns cgraph_node (DECL).   */
562
563 struct cgraph_node *
564 cgraph_same_body_alias (tree alias, tree decl)
565 {
566 #ifndef ASM_OUTPUT_DEF
567   /* If aliases aren't supported by the assembler, fail.  */
568   return NULL;
569 #endif
570
571   /*gcc_assert (!assembler_name_hash);*/
572
573   return cgraph_same_body_alias_1 (alias, decl);
574 }
575
576 /* Add thunk alias into callgraph.  The alias declaration is ALIAS and it
577    alises DECL with an adjustments made into the first parameter.
578    See comments in thunk_adjust for detail on the parameters.  */
579
580 struct cgraph_node *
581 cgraph_add_thunk (tree alias, tree decl, bool this_adjusting,
582                   HOST_WIDE_INT fixed_offset, HOST_WIDE_INT virtual_value,
583                   tree virtual_offset,
584                   tree real_alias)
585 {
586   struct cgraph_node *node = cgraph_get_node (alias);
587
588   if (node)
589     {
590       gcc_assert (node->local.finalized);
591       gcc_assert (!node->same_body);
592       cgraph_remove_node (node);
593     }
594   
595   node = cgraph_same_body_alias_1 (alias, decl);
596   gcc_assert (node);
597 #ifdef ENABLE_CHECKING
598   gcc_assert (!virtual_offset
599               || tree_int_cst_equal (virtual_offset, size_int (virtual_value)));
600 #endif
601   node->thunk.fixed_offset = fixed_offset;
602   node->thunk.this_adjusting = this_adjusting;
603   node->thunk.virtual_value = virtual_value;
604   node->thunk.virtual_offset_p = virtual_offset != NULL;
605   node->thunk.alias = real_alias;
606   node->thunk.thunk_p = true;
607   return node;
608 }
609
610 /* Returns the cgraph node assigned to DECL or NULL if no cgraph node
611    is assigned.  */
612
613 struct cgraph_node *
614 cgraph_get_node_or_alias (const_tree decl)
615 {
616   struct cgraph_node key, *node = NULL, **slot;
617
618   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
619
620   if (!cgraph_hash)
621     return NULL;
622
623   key.decl = CONST_CAST2 (tree, const_tree, decl);
624
625   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, &key,
626                                                  NO_INSERT);
627
628   if (slot && *slot)
629     node = *slot;
630   return node;
631 }
632
633 /* Returns the cgraph node assigned to DECL or NULL if no cgraph node
634    is assigned.  */
635
636 struct cgraph_node *
637 cgraph_get_node (const_tree decl)
638 {
639   struct cgraph_node key, *node = NULL, **slot;
640
641   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
642
643   if (!cgraph_hash)
644     return NULL;
645
646   key.decl = CONST_CAST2 (tree, const_tree, decl);
647
648   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, &key,
649                                                  NO_INSERT);
650
651   if (slot && *slot)
652     {
653       node = *slot;
654       if (node->same_body_alias)
655         node = node->same_body;
656     }
657   return node;
658 }
659
660 /* Insert already constructed node into hashtable.  */
661
662 void
663 cgraph_insert_node_to_hashtable (struct cgraph_node *node)
664 {
665   struct cgraph_node **slot;
666
667   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, node, INSERT);
668
669   gcc_assert (!*slot);
670   *slot = node;
671 }
672
673 /* Returns a hash code for P.  */
674
675 static hashval_t
676 hash_node_by_assembler_name (const void *p)
677 {
678   const struct cgraph_node *n = (const struct cgraph_node *) p;
679   return (hashval_t) decl_assembler_name_hash (DECL_ASSEMBLER_NAME (n->decl));
680 }
681
682 /* Returns nonzero if P1 and P2 are equal.  */
683
684 static int
685 eq_assembler_name (const void *p1, const void *p2)
686 {
687   const struct cgraph_node *n1 = (const struct cgraph_node *) p1;
688   const_tree name = (const_tree)p2;
689   return (decl_assembler_name_equal (n1->decl, name));
690 }
691
692 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
693    Return NULL if there's no such node.  */
694
695 struct cgraph_node *
696 cgraph_node_for_asm (tree asmname)
697 {
698   struct cgraph_node *node;
699   void **slot;
700
701   if (!assembler_name_hash)
702     {
703       assembler_name_hash =
704         htab_create_ggc (10, hash_node_by_assembler_name, eq_assembler_name,
705                          NULL);
706       for (node = cgraph_nodes; node; node = node->next)
707         if (!node->global.inlined_to)
708           {
709             tree name = DECL_ASSEMBLER_NAME (node->decl);
710             slot = htab_find_slot_with_hash (assembler_name_hash, name,
711                                              decl_assembler_name_hash (name),
712                                              INSERT);
713             /* We can have multiple declarations with same assembler name. For C++
714                it is __builtin_strlen and strlen, for instance.  Do we need to
715                record them all?  Original implementation marked just first one
716                so lets hope for the best.  */
717             if (!*slot)
718               *slot = node;
719             if (node->same_body)
720               {
721                 struct cgraph_node *alias;
722
723                 for (alias = node->same_body; alias; alias = alias->next)
724                   {
725                     hashval_t hash;
726                     name = DECL_ASSEMBLER_NAME (alias->decl);
727                     hash = decl_assembler_name_hash (name);
728                     slot = htab_find_slot_with_hash (assembler_name_hash, name,
729                                                      hash,  INSERT);
730                     if (!*slot)
731                       *slot = alias;
732                   }
733               }
734           }
735     }
736
737   slot = htab_find_slot_with_hash (assembler_name_hash, asmname,
738                                    decl_assembler_name_hash (asmname),
739                                    NO_INSERT);
740
741   if (slot)
742     {
743       node = (struct cgraph_node *) *slot;
744       if (node->same_body_alias)
745         node = node->same_body;
746       return node;
747     }
748   return NULL;
749 }
750
751 /* Returns a hash value for X (which really is a die_struct).  */
752
753 static hashval_t
754 edge_hash (const void *x)
755 {
756   return htab_hash_pointer (((const struct cgraph_edge *) x)->call_stmt);
757 }
758
759 /* Return nonzero if decl_id of die_struct X is the same as UID of decl *Y.  */
760
761 static int
762 edge_eq (const void *x, const void *y)
763 {
764   return ((const struct cgraph_edge *) x)->call_stmt == y;
765 }
766
767 /* Add call graph edge E to call site hash of its caller.  */
768
769 static inline void
770 cgraph_add_edge_to_call_site_hash (struct cgraph_edge *e)
771 {
772   void **slot;
773   slot = htab_find_slot_with_hash (e->caller->call_site_hash,
774                                    e->call_stmt,
775                                    htab_hash_pointer (e->call_stmt),
776                                    INSERT);
777   gcc_assert (!*slot);
778   *slot = e;
779 }
780
781 /* Return the callgraph edge representing the GIMPLE_CALL statement
782    CALL_STMT.  */
783
784 struct cgraph_edge *
785 cgraph_edge (struct cgraph_node *node, gimple call_stmt)
786 {
787   struct cgraph_edge *e, *e2;
788   int n = 0;
789
790   if (node->call_site_hash)
791     return (struct cgraph_edge *)
792       htab_find_with_hash (node->call_site_hash, call_stmt,
793                            htab_hash_pointer (call_stmt));
794
795   /* This loop may turn out to be performance problem.  In such case adding
796      hashtables into call nodes with very many edges is probably best
797      solution.  It is not good idea to add pointer into CALL_EXPR itself
798      because we want to make possible having multiple cgraph nodes representing
799      different clones of the same body before the body is actually cloned.  */
800   for (e = node->callees; e; e = e->next_callee)
801     {
802       if (e->call_stmt == call_stmt)
803         break;
804       n++;
805     }
806
807   if (!e)
808     for (e = node->indirect_calls; e; e = e->next_callee)
809       {
810         if (e->call_stmt == call_stmt)
811           break;
812         n++;
813       }
814
815   if (n > 100)
816     {
817       node->call_site_hash = htab_create_ggc (120, edge_hash, edge_eq, NULL);
818       for (e2 = node->callees; e2; e2 = e2->next_callee)
819         cgraph_add_edge_to_call_site_hash (e2);
820       for (e2 = node->indirect_calls; e2; e2 = e2->next_callee)
821         cgraph_add_edge_to_call_site_hash (e2);
822     }
823
824   return e;
825 }
826
827
828 /* Change field call_stmt of edge E to NEW_STMT.  */
829
830 void
831 cgraph_set_call_stmt (struct cgraph_edge *e, gimple new_stmt)
832 {
833   tree decl;
834
835   if (e->caller->call_site_hash)
836     {
837       htab_remove_elt_with_hash (e->caller->call_site_hash,
838                                  e->call_stmt,
839                                  htab_hash_pointer (e->call_stmt));
840     }
841
842   e->call_stmt = new_stmt;
843   if (e->indirect_unknown_callee
844       && (decl = gimple_call_fndecl (new_stmt)))
845     {
846       /* Constant propagation (and possibly also inlining?) can turn an
847          indirect call into a direct one.  */
848       struct cgraph_node *new_callee = cgraph_node (decl);
849
850       cgraph_make_edge_direct (e, new_callee);
851     }
852
853   push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
854   e->can_throw_external = stmt_can_throw_external (new_stmt);
855   pop_cfun ();
856   if (e->caller->call_site_hash)
857     cgraph_add_edge_to_call_site_hash (e);
858 }
859
860 /* Like cgraph_set_call_stmt but walk the clone tree and update all
861    clones sharing the same function body.  */
862
863 void
864 cgraph_set_call_stmt_including_clones (struct cgraph_node *orig,
865                                        gimple old_stmt, gimple new_stmt)
866 {
867   struct cgraph_node *node;
868   struct cgraph_edge *edge = cgraph_edge (orig, old_stmt);
869
870   if (edge)
871     cgraph_set_call_stmt (edge, new_stmt);
872
873   node = orig->clones;
874   if (node)
875     while (node != orig)
876       {
877         struct cgraph_edge *edge = cgraph_edge (node, old_stmt);
878         if (edge)
879           cgraph_set_call_stmt (edge, new_stmt);
880         if (node->clones)
881           node = node->clones;
882         else if (node->next_sibling_clone)
883           node = node->next_sibling_clone;
884         else
885           {
886             while (node != orig && !node->next_sibling_clone)
887               node = node->clone_of;
888             if (node != orig)
889               node = node->next_sibling_clone;
890           }
891       }
892 }
893
894 /* Like cgraph_create_edge walk the clone tree and update all clones sharing
895    same function body.  If clones already have edge for OLD_STMT; only
896    update the edge same way as cgraph_set_call_stmt_including_clones does.
897
898    TODO: COUNT and LOOP_DEPTH should be properly distributed based on relative
899    frequencies of the clones.  */
900
901 void
902 cgraph_create_edge_including_clones (struct cgraph_node *orig,
903                                      struct cgraph_node *callee,
904                                      gimple old_stmt,
905                                      gimple stmt, gcov_type count,
906                                      int freq, int loop_depth,
907                                      cgraph_inline_failed_t reason)
908 {
909   struct cgraph_node *node;
910   struct cgraph_edge *edge;
911
912   if (!cgraph_edge (orig, stmt))
913     {
914       edge = cgraph_create_edge (orig, callee, stmt, count, freq, loop_depth);
915       edge->inline_failed = reason;
916     }
917
918   node = orig->clones;
919   if (node)
920     while (node != orig)
921       {
922         struct cgraph_edge *edge = cgraph_edge (node, old_stmt);
923
924         /* It is possible that clones already contain the edge while
925            master didn't.  Either we promoted indirect call into direct
926            call in the clone or we are processing clones of unreachable
927            master where edges has been rmeoved.  */
928         if (edge)
929           cgraph_set_call_stmt (edge, stmt);
930         else if (!cgraph_edge (node, stmt))
931           {
932             edge = cgraph_create_edge (node, callee, stmt, count,
933                                        freq, loop_depth);
934             edge->inline_failed = reason;
935           }
936
937         if (node->clones)
938           node = node->clones;
939         else if (node->next_sibling_clone)
940           node = node->next_sibling_clone;
941         else
942           {
943             while (node != orig && !node->next_sibling_clone)
944               node = node->clone_of;
945             if (node != orig)
946               node = node->next_sibling_clone;
947           }
948       }
949 }
950
951 /* Give initial reasons why inlining would fail on EDGE.  This gets either
952    nullified or usually overwritten by more precise reasons later.  */
953
954 static void
955 initialize_inline_failed (struct cgraph_edge *e)
956 {
957   struct cgraph_node *callee = e->callee;
958
959   if (e->indirect_unknown_callee)
960     e->inline_failed = CIF_INDIRECT_UNKNOWN_CALL;
961   else if (!callee->analyzed)
962     e->inline_failed = CIF_BODY_NOT_AVAILABLE;
963   else if (callee->local.redefined_extern_inline)
964     e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
965   else if (!callee->local.inlinable)
966     e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
967   else if (e->call_stmt && gimple_call_cannot_inline_p (e->call_stmt))
968     e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
969   else
970     e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
971 }
972
973 /* Allocate a cgraph_edge structure and fill it with data according to the
974    parameters of which only CALLEE can be NULL (when creating an indirect call
975    edge).  */
976
977 static struct cgraph_edge *
978 cgraph_create_edge_1 (struct cgraph_node *caller, struct cgraph_node *callee,
979                        gimple call_stmt, gcov_type count, int freq, int nest)
980 {
981   struct cgraph_edge *edge;
982
983   /* LTO does not actually have access to the call_stmt since these
984      have not been loaded yet.  */
985   if (call_stmt)
986     {
987 #ifdef ENABLE_CHECKING
988       /* This is rather pricely check possibly trigerring construction of
989          call stmt hashtable.  */
990       gcc_assert (!cgraph_edge (caller, call_stmt));
991 #endif
992
993       gcc_assert (is_gimple_call (call_stmt));
994     }
995
996   if (free_edges)
997     {
998       edge = free_edges;
999       free_edges = NEXT_FREE_EDGE (edge);
1000     }
1001   else
1002     {
1003       edge = ggc_alloc_cgraph_edge ();
1004       edge->uid = cgraph_edge_max_uid++;
1005     }
1006
1007   edge->aux = NULL;
1008   edge->caller = caller;
1009   edge->callee = callee;
1010   edge->prev_caller = NULL;
1011   edge->next_caller = NULL;
1012   edge->prev_callee = NULL;
1013   edge->next_callee = NULL;
1014
1015   edge->count = count;
1016   gcc_assert (count >= 0);
1017   edge->frequency = freq;
1018   gcc_assert (freq >= 0);
1019   gcc_assert (freq <= CGRAPH_FREQ_MAX);
1020   edge->loop_nest = nest;
1021
1022   edge->call_stmt = call_stmt;
1023   push_cfun (DECL_STRUCT_FUNCTION (caller->decl));
1024   edge->can_throw_external
1025     = call_stmt ? stmt_can_throw_external (call_stmt) : false;
1026   pop_cfun ();
1027   edge->call_stmt_cannot_inline_p =
1028     (call_stmt ? gimple_call_cannot_inline_p (call_stmt) : false);
1029   if (call_stmt && caller->call_site_hash)
1030     cgraph_add_edge_to_call_site_hash (edge);
1031
1032   edge->indirect_info = NULL;
1033   edge->indirect_inlining_edge = 0;
1034
1035   return edge;
1036 }
1037
1038 /* Create edge from CALLER to CALLEE in the cgraph.  */
1039
1040 struct cgraph_edge *
1041 cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
1042                     gimple call_stmt, gcov_type count, int freq, int nest)
1043 {
1044   struct cgraph_edge *edge = cgraph_create_edge_1 (caller, callee, call_stmt,
1045                                                    count, freq, nest);
1046
1047   edge->indirect_unknown_callee = 0;
1048   initialize_inline_failed (edge);
1049
1050   edge->next_caller = callee->callers;
1051   if (callee->callers)
1052     callee->callers->prev_caller = edge;
1053   edge->next_callee = caller->callees;
1054   if (caller->callees)
1055     caller->callees->prev_callee = edge;
1056   caller->callees = edge;
1057   callee->callers = edge;
1058
1059   return edge;
1060 }
1061
1062
1063 /* Create an indirect edge with a yet-undetermined callee where the call
1064    statement destination is a formal parameter of the caller with index
1065    PARAM_INDEX. */
1066
1067 struct cgraph_edge *
1068 cgraph_create_indirect_edge (struct cgraph_node *caller, gimple call_stmt,
1069                              int ecf_flags,
1070                              gcov_type count, int freq, int nest)
1071 {
1072   struct cgraph_edge *edge = cgraph_create_edge_1 (caller, NULL, call_stmt,
1073                                                    count, freq, nest);
1074
1075   edge->indirect_unknown_callee = 1;
1076   initialize_inline_failed (edge);
1077
1078   edge->indirect_info = ggc_alloc_cleared_cgraph_indirect_call_info ();
1079   edge->indirect_info->param_index = -1;
1080   edge->indirect_info->ecf_flags = ecf_flags;
1081
1082   edge->next_callee = caller->indirect_calls;
1083   if (caller->indirect_calls)
1084     caller->indirect_calls->prev_callee = edge;
1085   caller->indirect_calls = edge;
1086
1087   return edge;
1088 }
1089
1090 /* Remove the edge E from the list of the callers of the callee.  */
1091
1092 static inline void
1093 cgraph_edge_remove_callee (struct cgraph_edge *e)
1094 {
1095   gcc_assert (!e->indirect_unknown_callee);
1096   if (e->prev_caller)
1097     e->prev_caller->next_caller = e->next_caller;
1098   if (e->next_caller)
1099     e->next_caller->prev_caller = e->prev_caller;
1100   if (!e->prev_caller)
1101     e->callee->callers = e->next_caller;
1102 }
1103
1104 /* Remove the edge E from the list of the callees of the caller.  */
1105
1106 static inline void
1107 cgraph_edge_remove_caller (struct cgraph_edge *e)
1108 {
1109   if (e->prev_callee)
1110     e->prev_callee->next_callee = e->next_callee;
1111   if (e->next_callee)
1112     e->next_callee->prev_callee = e->prev_callee;
1113   if (!e->prev_callee)
1114     {
1115       if (e->indirect_unknown_callee)
1116         e->caller->indirect_calls = e->next_callee;
1117       else
1118         e->caller->callees = e->next_callee;
1119     }
1120   if (e->caller->call_site_hash)
1121     htab_remove_elt_with_hash (e->caller->call_site_hash,
1122                                e->call_stmt,
1123                                htab_hash_pointer (e->call_stmt));
1124 }
1125
1126 /* Put the edge onto the free list.  */
1127
1128 static void
1129 cgraph_free_edge (struct cgraph_edge *e)
1130 {
1131   int uid = e->uid;
1132
1133   /* Clear out the edge so we do not dangle pointers.  */
1134   memset (e, 0, sizeof (*e));
1135   e->uid = uid;
1136   NEXT_FREE_EDGE (e) = free_edges;
1137   free_edges = e;
1138 }
1139
1140 /* Remove the edge E in the cgraph.  */
1141
1142 void
1143 cgraph_remove_edge (struct cgraph_edge *e)
1144 {
1145   /* Call all edge removal hooks.  */
1146   cgraph_call_edge_removal_hooks (e);
1147
1148   if (!e->indirect_unknown_callee)
1149     /* Remove from callers list of the callee.  */
1150     cgraph_edge_remove_callee (e);
1151
1152   /* Remove from callees list of the callers.  */
1153   cgraph_edge_remove_caller (e);
1154
1155   /* Put the edge onto the free list.  */
1156   cgraph_free_edge (e);
1157 }
1158
1159 /* Set callee of call graph edge E and add it to the corresponding set of
1160    callers. */
1161
1162 static void
1163 cgraph_set_edge_callee (struct cgraph_edge *e, struct cgraph_node *n)
1164 {
1165   e->prev_caller = NULL;
1166   if (n->callers)
1167     n->callers->prev_caller = e;
1168   e->next_caller = n->callers;
1169   n->callers = e;
1170   e->callee = n;
1171 }
1172
1173 /* Redirect callee of E to N.  The function does not update underlying
1174    call expression.  */
1175
1176 void
1177 cgraph_redirect_edge_callee (struct cgraph_edge *e, struct cgraph_node *n)
1178 {
1179   /* Remove from callers list of the current callee.  */
1180   cgraph_edge_remove_callee (e);
1181
1182   /* Insert to callers list of the new callee.  */
1183   cgraph_set_edge_callee (e, n);
1184 }
1185
1186 /* Make an indirect EDGE with an unknown callee an ordinary edge leading to
1187    CALLEE.  */
1188
1189 void
1190 cgraph_make_edge_direct (struct cgraph_edge *edge, struct cgraph_node *callee)
1191 {
1192   edge->indirect_unknown_callee = 0;
1193
1194   /* Get the edge out of the indirect edge list. */
1195   if (edge->prev_callee)
1196     edge->prev_callee->next_callee = edge->next_callee;
1197   if (edge->next_callee)
1198     edge->next_callee->prev_callee = edge->prev_callee;
1199   if (!edge->prev_callee)
1200     edge->caller->indirect_calls = edge->next_callee;
1201
1202   /* Put it into the normal callee list */
1203   edge->prev_callee = NULL;
1204   edge->next_callee = edge->caller->callees;
1205   if (edge->caller->callees)
1206     edge->caller->callees->prev_callee = edge;
1207   edge->caller->callees = edge;
1208
1209   /* Insert to callers list of the new callee.  */
1210   cgraph_set_edge_callee (edge, callee);
1211
1212   /* We need to re-determine the inlining status of the edge.  */
1213   initialize_inline_failed (edge);
1214 }
1215
1216
1217 /* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
1218    OLD_STMT changed into NEW_STMT.  OLD_CALL is gimple_call_fndecl
1219    of OLD_STMT if it was previously call statement.  */
1220
1221 static void
1222 cgraph_update_edges_for_call_stmt_node (struct cgraph_node *node,
1223                                         gimple old_stmt, tree old_call, gimple new_stmt)
1224 {
1225   tree new_call = (is_gimple_call (new_stmt)) ? gimple_call_fndecl (new_stmt) : 0;
1226
1227   /* We are seeing indirect calls, then there is nothing to update.  */
1228   if (!new_call && !old_call)
1229     return;
1230   /* See if we turned indirect call into direct call or folded call to one builtin
1231      into different bultin.  */
1232   if (old_call != new_call)
1233     {
1234       struct cgraph_edge *e = cgraph_edge (node, old_stmt);
1235       struct cgraph_edge *ne = NULL;
1236       gcov_type count;
1237       int frequency;
1238       int loop_nest;
1239
1240       if (e)
1241         {
1242           /* See if the edge is already there and has the correct callee.  It
1243              might be so because of indirect inlining has already updated
1244              it.  We also might've cloned and redirected the edge.  */
1245           if (new_call && e->callee)
1246             {
1247               struct cgraph_node *callee = e->callee;
1248               while (callee)
1249                 {
1250                   if (callee->decl == new_call
1251                       || callee->former_clone_of == new_call)
1252                     return;
1253                   callee = callee->clone_of;
1254                 }
1255             }
1256
1257           /* Otherwise remove edge and create new one; we can't simply redirect
1258              since function has changed, so inline plan and other information
1259              attached to edge is invalid.  */
1260           count = e->count;
1261           frequency = e->frequency;
1262           loop_nest = e->loop_nest;
1263           cgraph_remove_edge (e);
1264         }
1265       else
1266         {
1267           /* We are seeing new direct call; compute profile info based on BB.  */
1268           basic_block bb = gimple_bb (new_stmt);
1269           count = bb->count;
1270           frequency = compute_call_stmt_bb_frequency (current_function_decl,
1271                                                       bb);
1272           loop_nest = bb->loop_depth;
1273         }
1274
1275       if (new_call)
1276         {
1277           ne = cgraph_create_edge (node, cgraph_node (new_call),
1278                                    new_stmt, count, frequency,
1279                                    loop_nest);
1280           gcc_assert (ne->inline_failed);
1281         }
1282     }
1283   /* We only updated the call stmt; update pointer in cgraph edge..  */
1284   else if (old_stmt != new_stmt)
1285     cgraph_set_call_stmt (cgraph_edge (node, old_stmt), new_stmt);
1286 }
1287
1288 /* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
1289    OLD_STMT changed into NEW_STMT.  OLD_DECL is gimple_call_fndecl
1290    of OLD_STMT before it was updated (updating can happen inplace).  */
1291
1292 void
1293 cgraph_update_edges_for_call_stmt (gimple old_stmt, tree old_decl, gimple new_stmt)
1294 {
1295   struct cgraph_node *orig = cgraph_node (cfun->decl);
1296   struct cgraph_node *node;
1297
1298   cgraph_update_edges_for_call_stmt_node (orig, old_stmt, old_decl, new_stmt);
1299   if (orig->clones)
1300     for (node = orig->clones; node != orig;)
1301       {
1302         cgraph_update_edges_for_call_stmt_node (node, old_stmt, old_decl, new_stmt);
1303         if (node->clones)
1304           node = node->clones;
1305         else if (node->next_sibling_clone)
1306           node = node->next_sibling_clone;
1307         else
1308           {
1309             while (node != orig && !node->next_sibling_clone)
1310               node = node->clone_of;
1311             if (node != orig)
1312               node = node->next_sibling_clone;
1313           }
1314       }
1315 }
1316
1317
1318 /* Remove all callees from the node.  */
1319
1320 void
1321 cgraph_node_remove_callees (struct cgraph_node *node)
1322 {
1323   struct cgraph_edge *e, *f;
1324
1325   /* It is sufficient to remove the edges from the lists of callers of
1326      the callees.  The callee list of the node can be zapped with one
1327      assignment.  */
1328   for (e = node->callees; e; e = f)
1329     {
1330       f = e->next_callee;
1331       cgraph_call_edge_removal_hooks (e);
1332       if (!e->indirect_unknown_callee)
1333         cgraph_edge_remove_callee (e);
1334       cgraph_free_edge (e);
1335     }
1336   for (e = node->indirect_calls; e; e = f)
1337     {
1338       f = e->next_callee;
1339       cgraph_call_edge_removal_hooks (e);
1340       if (!e->indirect_unknown_callee)
1341         cgraph_edge_remove_callee (e);
1342       cgraph_free_edge (e);
1343     }
1344   node->indirect_calls = NULL;
1345   node->callees = NULL;
1346   if (node->call_site_hash)
1347     {
1348       htab_delete (node->call_site_hash);
1349       node->call_site_hash = NULL;
1350     }
1351 }
1352
1353 /* Remove all callers from the node.  */
1354
1355 static void
1356 cgraph_node_remove_callers (struct cgraph_node *node)
1357 {
1358   struct cgraph_edge *e, *f;
1359
1360   /* It is sufficient to remove the edges from the lists of callees of
1361      the callers.  The caller list of the node can be zapped with one
1362      assignment.  */
1363   for (e = node->callers; e; e = f)
1364     {
1365       f = e->next_caller;
1366       cgraph_call_edge_removal_hooks (e);
1367       cgraph_edge_remove_caller (e);
1368       cgraph_free_edge (e);
1369     }
1370   node->callers = NULL;
1371 }
1372
1373 /* Release memory used to represent body of function NODE.  */
1374
1375 void
1376 cgraph_release_function_body (struct cgraph_node *node)
1377 {
1378   if (DECL_STRUCT_FUNCTION (node->decl))
1379     {
1380       tree old_decl = current_function_decl;
1381       push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1382       if (cfun->gimple_df)
1383         {
1384           current_function_decl = node->decl;
1385           delete_tree_ssa ();
1386           delete_tree_cfg_annotations ();
1387           cfun->eh = NULL;
1388           current_function_decl = old_decl;
1389         }
1390       if (cfun->cfg)
1391         {
1392           gcc_assert (dom_computed[0] == DOM_NONE);
1393           gcc_assert (dom_computed[1] == DOM_NONE);
1394           clear_edges ();
1395         }
1396       if (cfun->value_histograms)
1397         free_histograms ();
1398       gcc_assert (!current_loops);
1399       pop_cfun();
1400       gimple_set_body (node->decl, NULL);
1401       VEC_free (ipa_opt_pass, heap,
1402                 node->ipa_transforms_to_apply);
1403       /* Struct function hangs a lot of data that would leak if we didn't
1404          removed all pointers to it.   */
1405       ggc_free (DECL_STRUCT_FUNCTION (node->decl));
1406       DECL_STRUCT_FUNCTION (node->decl) = NULL;
1407     }
1408   DECL_SAVED_TREE (node->decl) = NULL;
1409   /* If the node is abstract and needed, then do not clear DECL_INITIAL
1410      of its associated function function declaration because it's
1411      needed to emit debug info later.  */
1412   if (!node->abstract_and_needed)
1413     DECL_INITIAL (node->decl) = error_mark_node;
1414 }
1415
1416 /* Remove same body alias node.  */
1417
1418 void
1419 cgraph_remove_same_body_alias (struct cgraph_node *node)
1420 {
1421   void **slot;
1422   int uid = node->uid;
1423
1424   gcc_assert (node->same_body_alias);
1425   if (node->previous)
1426     node->previous->next = node->next;
1427   else
1428     node->same_body->same_body = node->next;
1429   if (node->next)
1430     node->next->previous = node->previous;
1431   node->next = NULL;
1432   node->previous = NULL;
1433   slot = htab_find_slot (cgraph_hash, node, NO_INSERT);
1434   if (*slot == node)
1435     htab_clear_slot (cgraph_hash, slot);
1436   if (assembler_name_hash)
1437     {
1438       tree name = DECL_ASSEMBLER_NAME (node->decl);
1439       slot = htab_find_slot_with_hash (assembler_name_hash, name,
1440                                        decl_assembler_name_hash (name),
1441                                        NO_INSERT);
1442       if (slot && *slot == node)
1443         htab_clear_slot (assembler_name_hash, slot);
1444     }
1445
1446   /* Clear out the node to NULL all pointers and add the node to the free
1447      list.  */
1448   memset (node, 0, sizeof(*node));
1449   node->uid = uid;
1450   NEXT_FREE_NODE (node) = free_nodes;
1451   free_nodes = node;
1452 }
1453
1454 /* Remove the node from cgraph.  */
1455
1456 void
1457 cgraph_remove_node (struct cgraph_node *node)
1458 {
1459   void **slot;
1460   bool kill_body = false;
1461   struct cgraph_node *n;
1462   int uid = node->uid;
1463
1464   cgraph_call_node_removal_hooks (node);
1465   cgraph_node_remove_callers (node);
1466   cgraph_node_remove_callees (node);
1467   ipa_remove_all_references (&node->ref_list);
1468   ipa_remove_all_refering (&node->ref_list);
1469   VEC_free (ipa_opt_pass, heap,
1470             node->ipa_transforms_to_apply);
1471
1472   /* Incremental inlining access removed nodes stored in the postorder list.
1473      */
1474   node->needed = node->reachable = false;
1475   for (n = node->nested; n; n = n->next_nested)
1476     n->origin = NULL;
1477   node->nested = NULL;
1478   if (node->origin)
1479     {
1480       struct cgraph_node **node2 = &node->origin->nested;
1481
1482       while (*node2 != node)
1483         node2 = &(*node2)->next_nested;
1484       *node2 = node->next_nested;
1485     }
1486   if (node->previous)
1487     node->previous->next = node->next;
1488   else
1489     cgraph_nodes = node->next;
1490   if (node->next)
1491     node->next->previous = node->previous;
1492   node->next = NULL;
1493   node->previous = NULL;
1494   slot = htab_find_slot (cgraph_hash, node, NO_INSERT);
1495   if (*slot == node)
1496     {
1497       struct cgraph_node *next_inline_clone;
1498
1499       for (next_inline_clone = node->clones;
1500            next_inline_clone && next_inline_clone->decl != node->decl;
1501            next_inline_clone = next_inline_clone->next_sibling_clone)
1502         ;
1503
1504       /* If there is inline clone of the node being removed, we need
1505          to put it into the position of removed node and reorganize all
1506          other clones to be based on it.  */
1507       if (next_inline_clone)
1508         {
1509           struct cgraph_node *n;
1510           struct cgraph_node *new_clones;
1511
1512           *slot = next_inline_clone;
1513
1514           /* Unlink inline clone from the list of clones of removed node.  */
1515           if (next_inline_clone->next_sibling_clone)
1516             next_inline_clone->next_sibling_clone->prev_sibling_clone
1517               = next_inline_clone->prev_sibling_clone;
1518           if (next_inline_clone->prev_sibling_clone)
1519             {
1520               gcc_assert (node->clones != next_inline_clone);
1521               next_inline_clone->prev_sibling_clone->next_sibling_clone
1522                 = next_inline_clone->next_sibling_clone;
1523             }
1524           else
1525             {
1526               gcc_assert (node->clones == next_inline_clone);
1527               node->clones = next_inline_clone->next_sibling_clone;
1528             }
1529
1530           new_clones = node->clones;
1531           node->clones = NULL;
1532
1533           /* Copy clone info.  */
1534           next_inline_clone->clone = node->clone;
1535
1536           /* Now place it into clone tree at same level at NODE.  */
1537           next_inline_clone->clone_of = node->clone_of;
1538           next_inline_clone->prev_sibling_clone = NULL;
1539           next_inline_clone->next_sibling_clone = NULL;
1540           if (node->clone_of)
1541             {
1542               if (node->clone_of->clones)
1543                 node->clone_of->clones->prev_sibling_clone = next_inline_clone;
1544               next_inline_clone->next_sibling_clone = node->clone_of->clones;
1545               node->clone_of->clones = next_inline_clone;
1546             }
1547
1548           /* Merge the clone list.  */
1549           if (new_clones)
1550             {
1551               if (!next_inline_clone->clones)
1552                 next_inline_clone->clones = new_clones;
1553               else
1554                 {
1555                   n = next_inline_clone->clones;
1556                   while (n->next_sibling_clone)
1557                     n =  n->next_sibling_clone;
1558                   n->next_sibling_clone = new_clones;
1559                   new_clones->prev_sibling_clone = n;
1560                 }
1561             }
1562
1563           /* Update clone_of pointers.  */
1564           n = new_clones;
1565           while (n)
1566             {
1567               n->clone_of = next_inline_clone;
1568               n = n->next_sibling_clone;
1569             }
1570         }
1571       else
1572         {
1573           htab_clear_slot (cgraph_hash, slot);
1574           kill_body = true;
1575         }
1576
1577     }
1578   if (node->prev_sibling_clone)
1579     node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone;
1580   else if (node->clone_of)
1581     node->clone_of->clones = node->next_sibling_clone;
1582   if (node->next_sibling_clone)
1583     node->next_sibling_clone->prev_sibling_clone = node->prev_sibling_clone;
1584   if (node->clones)
1585     {
1586       struct cgraph_node *n, *next;
1587
1588       if (node->clone_of)
1589         {
1590           for (n = node->clones; n->next_sibling_clone; n = n->next_sibling_clone)
1591             n->clone_of = node->clone_of;
1592           n->clone_of = node->clone_of;
1593           n->next_sibling_clone = node->clone_of->clones;
1594           if (node->clone_of->clones)
1595             node->clone_of->clones->prev_sibling_clone = n;
1596           node->clone_of->clones = node->clones;
1597         }
1598       else
1599         {
1600           /* We are removing node with clones.  this makes clones inconsistent,
1601              but assume they will be removed subsequently and just keep clone
1602              tree intact.  This can happen in unreachable function removal since
1603              we remove unreachable functions in random order, not by bottom-up
1604              walk of clone trees.  */
1605           for (n = node->clones; n; n = next)
1606             {
1607                next = n->next_sibling_clone;
1608                n->next_sibling_clone = NULL;
1609                n->prev_sibling_clone = NULL;
1610                n->clone_of = NULL;
1611             }
1612         }
1613     }
1614
1615   while (node->same_body)
1616     cgraph_remove_same_body_alias (node->same_body);
1617
1618   if (node->same_comdat_group)
1619     {
1620       struct cgraph_node *prev;
1621       for (prev = node->same_comdat_group;
1622            prev->same_comdat_group != node;
1623            prev = prev->same_comdat_group)
1624         ;
1625       if (node->same_comdat_group == prev)
1626         prev->same_comdat_group = NULL;
1627       else
1628         prev->same_comdat_group = node->same_comdat_group;
1629       node->same_comdat_group = NULL;
1630     }
1631
1632   /* While all the clones are removed after being proceeded, the function
1633      itself is kept in the cgraph even after it is compiled.  Check whether
1634      we are done with this body and reclaim it proactively if this is the case.
1635      */
1636   if (!kill_body && *slot)
1637     {
1638       struct cgraph_node *n = (struct cgraph_node *) *slot;
1639       if (!n->clones && !n->clone_of && !n->global.inlined_to
1640           && (cgraph_global_info_ready
1641               && (TREE_ASM_WRITTEN (n->decl) || DECL_EXTERNAL (n->decl)
1642                   || n->in_other_partition)))
1643         kill_body = true;
1644     }
1645   if (assembler_name_hash)
1646     {
1647       tree name = DECL_ASSEMBLER_NAME (node->decl);
1648       slot = htab_find_slot_with_hash (assembler_name_hash, name,
1649                                        decl_assembler_name_hash (name),
1650                                        NO_INSERT);
1651       /* Inline clones are not hashed.  */
1652       if (slot && *slot == node)
1653         htab_clear_slot (assembler_name_hash, slot);
1654     }
1655
1656   if (kill_body)
1657     cgraph_release_function_body (node);
1658   node->decl = NULL;
1659   if (node->call_site_hash)
1660     {
1661       htab_delete (node->call_site_hash);
1662       node->call_site_hash = NULL;
1663     }
1664   cgraph_n_nodes--;
1665
1666   /* Clear out the node to NULL all pointers and add the node to the free
1667      list.  */
1668   memset (node, 0, sizeof(*node));
1669   node->uid = uid;
1670   NEXT_FREE_NODE (node) = free_nodes;
1671   free_nodes = node;
1672 }
1673
1674 /* Remove the node from cgraph.  */
1675
1676 void
1677 cgraph_remove_node_and_inline_clones (struct cgraph_node *node)
1678 {
1679   struct cgraph_edge *e, *next;
1680   for (e = node->callees; e; e = next)
1681     {
1682       next = e->next_callee;
1683       if (!e->inline_failed)
1684         cgraph_remove_node_and_inline_clones (e->callee);
1685     }
1686   cgraph_remove_node (node);
1687 }
1688
1689 /* Notify finalize_compilation_unit that given node is reachable.  */
1690
1691 void
1692 cgraph_mark_reachable_node (struct cgraph_node *node)
1693 {
1694   if (!node->reachable && node->local.finalized)
1695     {
1696       if (cgraph_global_info_ready)
1697         {
1698           /* Verify that function does not appear to be needed out of blue
1699              during the optimization process.  This can happen for extern
1700              inlines when bodies was removed after inlining.  */
1701           gcc_assert ((node->analyzed || node->in_other_partition
1702                        || DECL_EXTERNAL (node->decl)));
1703         }
1704       else
1705         notice_global_symbol (node->decl);
1706       node->reachable = 1;
1707
1708       node->next_needed = cgraph_nodes_queue;
1709       cgraph_nodes_queue = node;
1710     }
1711 }
1712
1713 /* Likewise indicate that a node is needed, i.e. reachable via some
1714    external means.  */
1715
1716 void
1717 cgraph_mark_needed_node (struct cgraph_node *node)
1718 {
1719   node->needed = 1;
1720   gcc_assert (!node->global.inlined_to);
1721   cgraph_mark_reachable_node (node);
1722 }
1723
1724 /* Likewise indicate that a node is having address taken.  */
1725
1726 void
1727 cgraph_mark_address_taken_node (struct cgraph_node *node)
1728 {
1729   cgraph_mark_reachable_node (node);
1730   node->address_taken = 1;
1731 }
1732
1733 /* Return local info for the compiled function.  */
1734
1735 struct cgraph_local_info *
1736 cgraph_local_info (tree decl)
1737 {
1738   struct cgraph_node *node;
1739
1740   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1741   node = cgraph_node (decl);
1742   return &node->local;
1743 }
1744
1745 /* Return local info for the compiled function.  */
1746
1747 struct cgraph_global_info *
1748 cgraph_global_info (tree decl)
1749 {
1750   struct cgraph_node *node;
1751
1752   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL && cgraph_global_info_ready);
1753   node = cgraph_node (decl);
1754   return &node->global;
1755 }
1756
1757 /* Return local info for the compiled function.  */
1758
1759 struct cgraph_rtl_info *
1760 cgraph_rtl_info (tree decl)
1761 {
1762   struct cgraph_node *node;
1763
1764   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1765   node = cgraph_node (decl);
1766   if (decl != current_function_decl
1767       && !TREE_ASM_WRITTEN (node->decl))
1768     return NULL;
1769   return &node->rtl;
1770 }
1771
1772 /* Return a string describing the failure REASON.  */
1773
1774 const char*
1775 cgraph_inline_failed_string (cgraph_inline_failed_t reason)
1776 {
1777 #undef DEFCIFCODE
1778 #define DEFCIFCODE(code, string)        string,
1779
1780   static const char *cif_string_table[CIF_N_REASONS] = {
1781 #include "cif-code.def"
1782   };
1783
1784   /* Signedness of an enum type is implementation defined, so cast it
1785      to unsigned before testing. */
1786   gcc_assert ((unsigned) reason < CIF_N_REASONS);
1787   return cif_string_table[reason];
1788 }
1789
1790 /* Return name of the node used in debug output.  */
1791 const char *
1792 cgraph_node_name (struct cgraph_node *node)
1793 {
1794   return lang_hooks.decl_printable_name (node->decl, 2);
1795 }
1796
1797 /* Names used to print out the availability enum.  */
1798 const char * const cgraph_availability_names[] =
1799   {"unset", "not_available", "overwritable", "available", "local"};
1800
1801
1802 /* Dump call graph node NODE to file F.  */
1803
1804 void
1805 dump_cgraph_node (FILE *f, struct cgraph_node *node)
1806 {
1807   struct cgraph_edge *edge;
1808   int indirect_calls_count = 0;
1809
1810   fprintf (f, "%s/%i(%i)", cgraph_node_name (node), node->uid,
1811            node->pid);
1812   dump_addr (f, " @", (void *)node);
1813   if (DECL_ASSEMBLER_NAME_SET_P (node->decl))
1814     fprintf (f, " (asm: %s)", IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl)));
1815   if (node->global.inlined_to)
1816     fprintf (f, " (inline copy in %s/%i)",
1817              cgraph_node_name (node->global.inlined_to),
1818              node->global.inlined_to->uid);
1819   if (node->clone_of)
1820     fprintf (f, " (clone of %s/%i)",
1821              cgraph_node_name (node->clone_of),
1822              node->clone_of->uid);
1823   if (cgraph_function_flags_ready)
1824     fprintf (f, " availability:%s",
1825              cgraph_availability_names [cgraph_function_body_availability (node)]);
1826   if (node->analyzed)
1827     fprintf (f, " analyzed");
1828   if (node->in_other_partition)
1829     fprintf (f, " in_other_partition");
1830   if (node->count)
1831     fprintf (f, " executed "HOST_WIDEST_INT_PRINT_DEC"x",
1832              (HOST_WIDEST_INT)node->count);
1833   if (node->local.inline_summary.self_time)
1834     fprintf (f, " %i time, %i benefit", node->local.inline_summary.self_time,
1835                                         node->local.inline_summary.time_inlining_benefit);
1836   if (node->global.time && node->global.time
1837       != node->local.inline_summary.self_time)
1838     fprintf (f, " (%i after inlining)", node->global.time);
1839   if (node->local.inline_summary.self_size)
1840     fprintf (f, " %i size, %i benefit", node->local.inline_summary.self_size,
1841                                         node->local.inline_summary.size_inlining_benefit);
1842   if (node->global.size && node->global.size
1843       != node->local.inline_summary.self_size)
1844     fprintf (f, " (%i after inlining)", node->global.size);
1845   if (node->local.inline_summary.estimated_self_stack_size)
1846     fprintf (f, " %i bytes stack usage", (int)node->local.inline_summary.estimated_self_stack_size);
1847   if (node->global.estimated_stack_size != node->local.inline_summary.estimated_self_stack_size)
1848     fprintf (f, " %i bytes after inlining", (int)node->global.estimated_stack_size);
1849   if (node->origin)
1850     fprintf (f, " nested in: %s", cgraph_node_name (node->origin));
1851   if (node->needed)
1852     fprintf (f, " needed");
1853   if (node->address_taken)
1854     fprintf (f, " address_taken");
1855   else if (node->reachable)
1856     fprintf (f, " reachable");
1857   else if (node->reachable_from_other_partition)
1858     fprintf (f, " reachable_from_other_partition");
1859   if (gimple_has_body_p (node->decl))
1860     fprintf (f, " body");
1861   if (node->process)
1862     fprintf (f, " process");
1863   if (node->local.local)
1864     fprintf (f, " local");
1865   if (node->local.externally_visible)
1866     fprintf (f, " externally_visible");
1867   if (node->local.finalized)
1868     fprintf (f, " finalized");
1869   if (node->local.disregard_inline_limits)
1870     fprintf (f, " always_inline");
1871   else if (node->local.inlinable)
1872     fprintf (f, " inlinable");
1873   else if (node->local.versionable)
1874     fprintf (f, " versionable");
1875   if (node->local.redefined_extern_inline)
1876     fprintf (f, " redefined_extern_inline");
1877   if (TREE_ASM_WRITTEN (node->decl))
1878     fprintf (f, " asm_written");
1879
1880   fprintf (f, "\n  called by: ");
1881   for (edge = node->callers; edge; edge = edge->next_caller)
1882     {
1883       fprintf (f, "%s/%i ", cgraph_node_name (edge->caller),
1884                edge->caller->uid);
1885       if (edge->count)
1886         fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ",
1887                  (HOST_WIDEST_INT)edge->count);
1888       if (edge->frequency)
1889         fprintf (f, "(%.2f per call) ",
1890                  edge->frequency / (double)CGRAPH_FREQ_BASE);
1891       if (!edge->inline_failed)
1892         fprintf(f, "(inlined) ");
1893       if (edge->indirect_inlining_edge)
1894         fprintf(f, "(indirect_inlining) ");
1895       if (edge->can_throw_external)
1896         fprintf(f, "(can throw external) ");
1897     }
1898
1899   fprintf (f, "\n  calls: ");
1900   for (edge = node->callees; edge; edge = edge->next_callee)
1901     {
1902       fprintf (f, "%s/%i ", cgraph_node_name (edge->callee),
1903                edge->callee->uid);
1904       if (!edge->inline_failed)
1905         fprintf(f, "(inlined) ");
1906       if (edge->indirect_inlining_edge)
1907         fprintf(f, "(indirect_inlining) ");
1908       if (edge->count)
1909         fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ",
1910                  (HOST_WIDEST_INT)edge->count);
1911       if (edge->frequency)
1912         fprintf (f, "(%.2f per call) ",
1913                  edge->frequency / (double)CGRAPH_FREQ_BASE);
1914       if (edge->loop_nest)
1915         fprintf (f, "(nested in %i loops) ", edge->loop_nest);
1916       if (edge->can_throw_external)
1917         fprintf(f, "(can throw external) ");
1918     }
1919   fprintf (f, "\n");
1920   fprintf (f, "  References: ");
1921   ipa_dump_references (f, &node->ref_list);
1922   fprintf (f, "  Refering this function: ");
1923   ipa_dump_refering (f, &node->ref_list);
1924
1925   for (edge = node->indirect_calls; edge; edge = edge->next_callee)
1926     indirect_calls_count++;
1927   if (indirect_calls_count)
1928     fprintf (f, "  has %i outgoing edges for indirect calls.\n",
1929              indirect_calls_count);
1930
1931   if (node->same_body)
1932     {
1933       struct cgraph_node *n;
1934       fprintf (f, "  aliases & thunks:");
1935       for (n = node->same_body; n; n = n->next)
1936         {
1937           fprintf (f, " %s/%i", cgraph_node_name (n), n->uid);
1938           if (n->thunk.thunk_p)
1939             {
1940               fprintf (f, " (thunk of %s fixed ofset %i virtual value %i has "
1941                        "virtual offset %i",
1942                        lang_hooks.decl_printable_name (n->thunk.alias, 2),
1943                        (int)n->thunk.fixed_offset,
1944                        (int)n->thunk.virtual_value,
1945                        (int)n->thunk.virtual_offset_p);
1946               fprintf (f, ")");
1947             }
1948           if (DECL_ASSEMBLER_NAME_SET_P (n->decl))
1949             fprintf (f, " (asm: %s)", IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (n->decl)));
1950         }
1951       fprintf (f, "\n");
1952     }
1953 }
1954
1955
1956 /* Dump call graph node NODE to stderr.  */
1957
1958 DEBUG_FUNCTION void
1959 debug_cgraph_node (struct cgraph_node *node)
1960 {
1961   dump_cgraph_node (stderr, node);
1962 }
1963
1964
1965 /* Dump the callgraph to file F.  */
1966
1967 void
1968 dump_cgraph (FILE *f)
1969 {
1970   struct cgraph_node *node;
1971
1972   fprintf (f, "callgraph:\n\n");
1973   for (node = cgraph_nodes; node; node = node->next)
1974     dump_cgraph_node (f, node);
1975 }
1976
1977
1978 /* Dump the call graph to stderr.  */
1979
1980 DEBUG_FUNCTION void
1981 debug_cgraph (void)
1982 {
1983   dump_cgraph (stderr);
1984 }
1985
1986
1987 /* Set the DECL_ASSEMBLER_NAME and update cgraph hashtables.  */
1988
1989 void
1990 change_decl_assembler_name (tree decl, tree name)
1991 {
1992   struct cgraph_node *node;
1993   void **slot;
1994   if (!DECL_ASSEMBLER_NAME_SET_P (decl))
1995     SET_DECL_ASSEMBLER_NAME (decl, name);
1996   else
1997     {
1998       if (name == DECL_ASSEMBLER_NAME (decl))
1999         return;
2000
2001       if (assembler_name_hash
2002           && TREE_CODE (decl) == FUNCTION_DECL
2003           && (node = cgraph_get_node_or_alias (decl)) != NULL)
2004         {
2005           tree old_name = DECL_ASSEMBLER_NAME (decl);
2006           slot = htab_find_slot_with_hash (assembler_name_hash, old_name,
2007                                            decl_assembler_name_hash (old_name),
2008                                            NO_INSERT);
2009           /* Inline clones are not hashed.  */
2010           if (slot && *slot == node)
2011             htab_clear_slot (assembler_name_hash, slot);
2012         }
2013       if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
2014           && DECL_RTL_SET_P (decl))
2015         warning (0, "%D renamed after being referenced in assembly", decl);
2016
2017       SET_DECL_ASSEMBLER_NAME (decl, name);
2018     }
2019   if (assembler_name_hash
2020       && TREE_CODE (decl) == FUNCTION_DECL
2021       && (node = cgraph_get_node_or_alias (decl)) != NULL)
2022     {
2023       slot = htab_find_slot_with_hash (assembler_name_hash, name,
2024                                        decl_assembler_name_hash (name),
2025                                        INSERT);
2026       gcc_assert (!*slot);
2027       *slot = node;
2028     }
2029 }
2030
2031 /* Add a top-level asm statement to the list.  */
2032
2033 struct cgraph_asm_node *
2034 cgraph_add_asm_node (tree asm_str)
2035 {
2036   struct cgraph_asm_node *node;
2037
2038   node = ggc_alloc_cleared_cgraph_asm_node ();
2039   node->asm_str = asm_str;
2040   node->order = cgraph_order++;
2041   node->next = NULL;
2042   if (cgraph_asm_nodes == NULL)
2043     cgraph_asm_nodes = node;
2044   else
2045     cgraph_asm_last_node->next = node;
2046   cgraph_asm_last_node = node;
2047   return node;
2048 }
2049
2050 /* Return true when the DECL can possibly be inlined.  */
2051 bool
2052 cgraph_function_possibly_inlined_p (tree decl)
2053 {
2054   if (!cgraph_global_info_ready)
2055     return !DECL_UNINLINABLE (decl);
2056   return DECL_POSSIBLY_INLINED (decl);
2057 }
2058
2059 /* Create clone of E in the node N represented by CALL_EXPR the callgraph.  */
2060 struct cgraph_edge *
2061 cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n,
2062                    gimple call_stmt, unsigned stmt_uid, gcov_type count_scale,
2063                    int freq_scale, int loop_nest, bool update_original)
2064 {
2065   struct cgraph_edge *new_edge;
2066   gcov_type count = e->count * count_scale / REG_BR_PROB_BASE;
2067   gcov_type freq;
2068
2069   /* We do not want to ignore loop nest after frequency drops to 0.  */
2070   if (!freq_scale)
2071     freq_scale = 1;
2072   freq = e->frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE;
2073   if (freq > CGRAPH_FREQ_MAX)
2074     freq = CGRAPH_FREQ_MAX;
2075
2076   if (e->indirect_unknown_callee)
2077     {
2078       tree decl;
2079
2080       if (call_stmt && (decl = gimple_call_fndecl (call_stmt)))
2081         {
2082           struct cgraph_node *callee = cgraph_node (decl);
2083           new_edge = cgraph_create_edge (n, callee, call_stmt, count, freq,
2084                                          e->loop_nest + loop_nest);
2085         }
2086       else
2087         {
2088           new_edge = cgraph_create_indirect_edge (n, call_stmt,
2089                                                   e->indirect_info->ecf_flags,
2090                                                   count, freq,
2091                                                   e->loop_nest + loop_nest);
2092           *new_edge->indirect_info = *e->indirect_info;
2093         }
2094     }
2095   else
2096     new_edge = cgraph_create_edge (n, e->callee, call_stmt, count, freq,
2097                                    e->loop_nest + loop_nest);
2098
2099   new_edge->inline_failed = e->inline_failed;
2100   new_edge->indirect_inlining_edge = e->indirect_inlining_edge;
2101   new_edge->lto_stmt_uid = stmt_uid;
2102   if (update_original)
2103     {
2104       e->count -= new_edge->count;
2105       if (e->count < 0)
2106         e->count = 0;
2107     }
2108   cgraph_call_edge_duplication_hooks (e, new_edge);
2109   return new_edge;
2110 }
2111
2112 /* Create node representing clone of N executed COUNT times.  Decrease
2113    the execution counts from original node too.
2114    The new clone will have decl set to DECL that may or may not be the same
2115    as decl of N.
2116
2117    When UPDATE_ORIGINAL is true, the counts are subtracted from the original
2118    function's profile to reflect the fact that part of execution is handled
2119    by node.  */
2120 struct cgraph_node *
2121 cgraph_clone_node (struct cgraph_node *n, tree decl, gcov_type count, int freq,
2122                    int loop_nest, bool update_original,
2123                    VEC(cgraph_edge_p,heap) *redirect_callers)
2124 {
2125   struct cgraph_node *new_node = cgraph_create_node ();
2126   struct cgraph_edge *e;
2127   gcov_type count_scale;
2128   unsigned i;
2129
2130   new_node->decl = decl;
2131   new_node->origin = n->origin;
2132   if (new_node->origin)
2133     {
2134       new_node->next_nested = new_node->origin->nested;
2135       new_node->origin->nested = new_node;
2136     }
2137   new_node->analyzed = n->analyzed;
2138   new_node->local = n->local;
2139   new_node->local.externally_visible = false;
2140   new_node->local.local = true;
2141   new_node->local.vtable_method = false;
2142   new_node->global = n->global;
2143   new_node->rtl = n->rtl;
2144   new_node->count = count;
2145   new_node->frequency = n->frequency;
2146   new_node->clone = n->clone;
2147   new_node->clone.tree_map = 0;
2148   if (n->count)
2149     {
2150       if (new_node->count > n->count)
2151         count_scale = REG_BR_PROB_BASE;
2152       else
2153         count_scale = new_node->count * REG_BR_PROB_BASE / n->count;
2154     }
2155   else
2156     count_scale = 0;
2157   if (update_original)
2158     {
2159       n->count -= count;
2160       if (n->count < 0)
2161         n->count = 0;
2162     }
2163
2164   FOR_EACH_VEC_ELT (cgraph_edge_p, redirect_callers, i, e)
2165     {
2166       /* Redirect calls to the old version node to point to its new
2167          version.  */
2168       cgraph_redirect_edge_callee (e, new_node);
2169     }
2170
2171
2172   for (e = n->callees;e; e=e->next_callee)
2173     cgraph_clone_edge (e, new_node, e->call_stmt, e->lto_stmt_uid,
2174                        count_scale, freq, loop_nest, update_original);
2175
2176   for (e = n->indirect_calls; e; e = e->next_callee)
2177     cgraph_clone_edge (e, new_node, e->call_stmt, e->lto_stmt_uid,
2178                        count_scale, freq, loop_nest, update_original);
2179   ipa_clone_references (new_node, NULL, &n->ref_list);
2180
2181   new_node->next_sibling_clone = n->clones;
2182   if (n->clones)
2183     n->clones->prev_sibling_clone = new_node;
2184   n->clones = new_node;
2185   new_node->clone_of = n;
2186
2187   cgraph_call_node_duplication_hooks (n, new_node);
2188   if (n->decl != decl)
2189     {
2190       struct cgraph_node **slot;
2191       slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, new_node, INSERT);
2192       gcc_assert (!*slot);
2193       *slot = new_node;
2194       if (assembler_name_hash)
2195         {
2196           void **aslot;
2197           tree name = DECL_ASSEMBLER_NAME (decl);
2198
2199           aslot = htab_find_slot_with_hash (assembler_name_hash, name,
2200                                             decl_assembler_name_hash (name),
2201                                             INSERT);
2202           gcc_assert (!*aslot);
2203           *aslot = new_node;
2204         }
2205     }
2206   return new_node;
2207 }
2208
2209 /* Create a new name for clone of DECL, add SUFFIX.  Returns an identifier.  */
2210
2211 static GTY(()) unsigned int clone_fn_id_num;
2212
2213 tree
2214 clone_function_name (tree decl, const char *suffix)
2215 {
2216   tree name = DECL_ASSEMBLER_NAME (decl);
2217   size_t len = IDENTIFIER_LENGTH (name);
2218   char *tmp_name, *prefix;
2219
2220   prefix = XALLOCAVEC (char, len + strlen (suffix) + 2);
2221   memcpy (prefix, IDENTIFIER_POINTER (name), len);
2222   strcpy (prefix + len + 1, suffix);
2223 #ifndef NO_DOT_IN_LABEL
2224   prefix[len] = '.';
2225 #elif !defined NO_DOLLAR_IN_LABEL
2226   prefix[len] = '$';
2227 #else
2228   prefix[len] = '_';
2229 #endif
2230   ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix, clone_fn_id_num++);
2231   return get_identifier (tmp_name);
2232 }
2233
2234 /* Create callgraph node clone with new declaration.  The actual body will
2235    be copied later at compilation stage.
2236
2237    TODO: after merging in ipa-sra use function call notes instead of args_to_skip
2238    bitmap interface.
2239    */
2240 struct cgraph_node *
2241 cgraph_create_virtual_clone (struct cgraph_node *old_node,
2242                              VEC(cgraph_edge_p,heap) *redirect_callers,
2243                              VEC(ipa_replace_map_p,gc) *tree_map,
2244                              bitmap args_to_skip,
2245                              const char * suffix)
2246 {
2247   tree old_decl = old_node->decl;
2248   struct cgraph_node *new_node = NULL;
2249   tree new_decl;
2250   size_t i;
2251   struct ipa_replace_map *map;
2252
2253 #ifdef ENABLE_CHECKING
2254   if (!flag_wpa)
2255     gcc_assert  (tree_versionable_function_p (old_decl));
2256 #endif
2257
2258   /* Make a new FUNCTION_DECL tree node */
2259   if (!args_to_skip)
2260     new_decl = copy_node (old_decl);
2261   else
2262     new_decl = build_function_decl_skip_args (old_decl, args_to_skip);
2263   DECL_STRUCT_FUNCTION (new_decl) = NULL;
2264
2265   /* Generate a new name for the new version. */
2266   DECL_NAME (new_decl) = clone_function_name (old_decl, suffix);
2267   SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
2268   SET_DECL_RTL (new_decl, NULL);
2269
2270   new_node = cgraph_clone_node (old_node, new_decl, old_node->count,
2271                                 CGRAPH_FREQ_BASE, 0, false,
2272                                 redirect_callers);
2273   /* Update the properties.
2274      Make clone visible only within this translation unit.  Make sure
2275      that is not weak also.
2276      ??? We cannot use COMDAT linkage because there is no
2277      ABI support for this.  */
2278   DECL_EXTERNAL (new_node->decl) = 0;
2279   if (DECL_ONE_ONLY (old_decl))
2280     DECL_SECTION_NAME (new_node->decl) = NULL;
2281   DECL_COMDAT_GROUP (new_node->decl) = 0;
2282   TREE_PUBLIC (new_node->decl) = 0;
2283   DECL_COMDAT (new_node->decl) = 0;
2284   DECL_WEAK (new_node->decl) = 0;
2285   new_node->clone.tree_map = tree_map;
2286   new_node->clone.args_to_skip = args_to_skip;
2287   FOR_EACH_VEC_ELT (ipa_replace_map_p, tree_map, i, map)
2288     {
2289       tree var = map->new_tree;
2290
2291       STRIP_NOPS (var);
2292       if (TREE_CODE (var) != ADDR_EXPR)
2293         continue;
2294       var = get_base_var (var);
2295       if (!var)
2296         continue;
2297
2298       /* Record references of the future statement initializing the constant
2299          argument.  */
2300       if (TREE_CODE (var) == FUNCTION_DECL)
2301         ipa_record_reference (new_node, NULL, cgraph_node (var),
2302                               NULL, IPA_REF_ADDR, NULL);
2303       else if (TREE_CODE (var) == VAR_DECL)
2304         ipa_record_reference (new_node, NULL, NULL, varpool_node (var),
2305                               IPA_REF_ADDR, NULL);
2306     }
2307   if (!args_to_skip)
2308     new_node->clone.combined_args_to_skip = old_node->clone.combined_args_to_skip;
2309   else if (old_node->clone.combined_args_to_skip)
2310     {
2311       int newi = 0, oldi = 0;
2312       tree arg;
2313       bitmap new_args_to_skip = BITMAP_GGC_ALLOC ();
2314       struct cgraph_node *orig_node;
2315       for (orig_node = old_node; orig_node->clone_of; orig_node = orig_node->clone_of)
2316         ;
2317       for (arg = DECL_ARGUMENTS (orig_node->decl); arg; arg = DECL_CHAIN (arg), oldi++)
2318         {
2319           if (bitmap_bit_p (old_node->clone.combined_args_to_skip, oldi))
2320             {
2321               bitmap_set_bit (new_args_to_skip, oldi);
2322               continue;
2323             }
2324           if (bitmap_bit_p (args_to_skip, newi))
2325             bitmap_set_bit (new_args_to_skip, oldi);
2326           newi++;
2327         }
2328       new_node->clone.combined_args_to_skip = new_args_to_skip;
2329     }
2330   else
2331     new_node->clone.combined_args_to_skip = args_to_skip;
2332   new_node->local.externally_visible = 0;
2333   new_node->local.local = 1;
2334   new_node->lowered = true;
2335   new_node->reachable = true;
2336
2337
2338   return new_node;
2339 }
2340
2341 /* NODE is no longer nested function; update cgraph accordingly.  */
2342 void
2343 cgraph_unnest_node (struct cgraph_node *node)
2344 {
2345   struct cgraph_node **node2 = &node->origin->nested;
2346   gcc_assert (node->origin);
2347
2348   while (*node2 != node)
2349     node2 = &(*node2)->next_nested;
2350   *node2 = node->next_nested;
2351   node->origin = NULL;
2352 }
2353
2354 /* Return function availability.  See cgraph.h for description of individual
2355    return values.  */
2356 enum availability
2357 cgraph_function_body_availability (struct cgraph_node *node)
2358 {
2359   enum availability avail;
2360   gcc_assert (cgraph_function_flags_ready);
2361   if (!node->analyzed)
2362     avail = AVAIL_NOT_AVAILABLE;
2363   else if (node->local.local)
2364     avail = AVAIL_LOCAL;
2365   else if (!node->local.externally_visible)
2366     avail = AVAIL_AVAILABLE;
2367   /* Inline functions are safe to be analyzed even if their sybol can
2368      be overwritten at runtime.  It is not meaningful to enfore any sane
2369      behaviour on replacing inline function by different body.  */
2370   else if (DECL_DECLARED_INLINE_P (node->decl))
2371     avail = AVAIL_AVAILABLE;
2372
2373   /* If the function can be overwritten, return OVERWRITABLE.  Take
2374      care at least of two notable extensions - the COMDAT functions
2375      used to share template instantiations in C++ (this is symmetric
2376      to code cp_cannot_inline_tree_fn and probably shall be shared and
2377      the inlinability hooks completely eliminated).
2378
2379      ??? Does the C++ one definition rule allow us to always return
2380      AVAIL_AVAILABLE here?  That would be good reason to preserve this
2381      bit.  */
2382
2383   else if (decl_replaceable_p (node->decl) && !DECL_EXTERNAL (node->decl))
2384     avail = AVAIL_OVERWRITABLE;
2385   else avail = AVAIL_AVAILABLE;
2386
2387   return avail;
2388 }
2389
2390 /* Add the function FNDECL to the call graph.
2391    Unlike cgraph_finalize_function, this function is intended to be used
2392    by middle end and allows insertion of new function at arbitrary point
2393    of compilation.  The function can be either in high, low or SSA form
2394    GIMPLE.
2395
2396    The function is assumed to be reachable and have address taken (so no
2397    API breaking optimizations are performed on it).
2398
2399    Main work done by this function is to enqueue the function for later
2400    processing to avoid need the passes to be re-entrant.  */
2401
2402 void
2403 cgraph_add_new_function (tree fndecl, bool lowered)
2404 {
2405   struct cgraph_node *node;
2406   switch (cgraph_state)
2407     {
2408       case CGRAPH_STATE_CONSTRUCTION:
2409         /* Just enqueue function to be processed at nearest occurrence.  */
2410         node = cgraph_node (fndecl);
2411         node->next_needed = cgraph_new_nodes;
2412         if (lowered)
2413           node->lowered = true;
2414         cgraph_new_nodes = node;
2415         break;
2416
2417       case CGRAPH_STATE_IPA:
2418       case CGRAPH_STATE_IPA_SSA:
2419       case CGRAPH_STATE_EXPANSION:
2420         /* Bring the function into finalized state and enqueue for later
2421            analyzing and compilation.  */
2422         node = cgraph_node (fndecl);
2423         node->local.local = false;
2424         node->local.finalized = true;
2425         node->reachable = node->needed = true;
2426         if (!lowered && cgraph_state == CGRAPH_STATE_EXPANSION)
2427           {
2428             push_cfun (DECL_STRUCT_FUNCTION (fndecl));
2429             current_function_decl = fndecl;
2430             gimple_register_cfg_hooks ();
2431             tree_lowering_passes (fndecl);
2432             bitmap_obstack_initialize (NULL);
2433             if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
2434               execute_pass_list (pass_early_local_passes.pass.sub);
2435             bitmap_obstack_release (NULL);
2436             pop_cfun ();
2437             current_function_decl = NULL;
2438
2439             lowered = true;
2440           }
2441         if (lowered)
2442           node->lowered = true;
2443         node->next_needed = cgraph_new_nodes;
2444         cgraph_new_nodes = node;
2445         break;
2446
2447       case CGRAPH_STATE_FINISHED:
2448         /* At the very end of compilation we have to do all the work up
2449            to expansion.  */
2450         push_cfun (DECL_STRUCT_FUNCTION (fndecl));
2451         current_function_decl = fndecl;
2452         gimple_register_cfg_hooks ();
2453         if (!lowered)
2454           tree_lowering_passes (fndecl);
2455         bitmap_obstack_initialize (NULL);
2456         if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
2457           execute_pass_list (pass_early_local_passes.pass.sub);
2458         bitmap_obstack_release (NULL);
2459         tree_rest_of_compilation (fndecl);
2460         pop_cfun ();
2461         current_function_decl = NULL;
2462         break;
2463     }
2464
2465   /* Set a personality if required and we already passed EH lowering.  */
2466   if (lowered
2467       && (function_needs_eh_personality (DECL_STRUCT_FUNCTION (fndecl))
2468           == eh_personality_lang))
2469     DECL_FUNCTION_PERSONALITY (fndecl) = lang_hooks.eh_personality ();
2470 }
2471
2472 /* Return true if NODE can be made local for API change.
2473    Extern inline functions and C++ COMDAT functions can be made local
2474    at the expense of possible code size growth if function is used in multiple
2475    compilation units.  */
2476 bool
2477 cgraph_node_can_be_local_p (struct cgraph_node *node)
2478 {
2479   return (!node->needed && !node->address_taken
2480           && ((DECL_COMDAT (node->decl) && !node->same_comdat_group)
2481               || !node->local.externally_visible));
2482 }
2483
2484 /* Make DECL local.  FIXME: We shouldn't need to mess with rtl this early,
2485    but other code such as notice_global_symbol generates rtl.  */
2486 void
2487 cgraph_make_decl_local (tree decl)
2488 {
2489   rtx rtl, symbol;
2490
2491   if (TREE_CODE (decl) == VAR_DECL)
2492     DECL_COMMON (decl) = 0;
2493   else gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
2494
2495   if (DECL_COMDAT (decl))
2496     {
2497       /* It is possible that we are linking against library defining same COMDAT
2498          function.  To avoid conflict we need to rename our local name of the
2499          function just in the case WHOPR partitioning decide to make it hidden
2500          to avoid cross partition references.  */
2501       if (flag_wpa)
2502         {
2503           const char *old_name;
2504
2505           old_name  = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
2506           if (TREE_CODE (decl) == FUNCTION_DECL)
2507             {
2508               struct cgraph_node *node = cgraph_get_node_or_alias (decl);
2509               change_decl_assembler_name (decl,
2510                                           clone_function_name (decl, "local"));
2511               if (node->local.lto_file_data)
2512                 lto_record_renamed_decl (node->local.lto_file_data,
2513                                          old_name,
2514                                          IDENTIFIER_POINTER
2515                                            (DECL_ASSEMBLER_NAME (decl)));
2516             }
2517           else if (TREE_CODE (decl) == VAR_DECL)
2518             {
2519               struct varpool_node *vnode = varpool_get_node (decl);
2520               /* change_decl_assembler_name will warn here on vtables because
2521                  C++ frontend still sets TREE_SYMBOL_REFERENCED on them.  */
2522               SET_DECL_ASSEMBLER_NAME (decl,
2523                                        clone_function_name (decl, "local"));
2524               if (vnode->lto_file_data)
2525                 lto_record_renamed_decl (vnode->lto_file_data,
2526                                          old_name,
2527                                          IDENTIFIER_POINTER
2528                                            (DECL_ASSEMBLER_NAME (decl)));
2529             }
2530         }
2531       DECL_SECTION_NAME (decl) = 0;
2532       DECL_COMDAT (decl) = 0;
2533     }
2534   DECL_COMDAT_GROUP (decl) = 0;
2535   DECL_WEAK (decl) = 0;
2536   DECL_EXTERNAL (decl) = 0;
2537   TREE_PUBLIC (decl) = 0;
2538   if (!DECL_RTL_SET_P (decl))
2539     return;
2540
2541   /* Update rtl flags.  */
2542   make_decl_rtl (decl);
2543
2544   rtl = DECL_RTL (decl);
2545   if (!MEM_P (rtl))
2546     return;
2547
2548   symbol = XEXP (rtl, 0);
2549   if (GET_CODE (symbol) != SYMBOL_REF)
2550     return;
2551
2552   SYMBOL_REF_WEAK (symbol) = DECL_WEAK (decl);
2553 }
2554
2555 /* Bring NODE local.  */
2556 void
2557 cgraph_make_node_local (struct cgraph_node *node)
2558 {
2559   gcc_assert (cgraph_node_can_be_local_p (node));
2560   if (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
2561     {
2562       struct cgraph_node *alias;
2563       cgraph_make_decl_local (node->decl);
2564
2565       for (alias = node->same_body; alias; alias = alias->next)
2566         cgraph_make_decl_local (alias->decl);
2567
2568       node->local.externally_visible = false;
2569       node->local.local = true;
2570       node->resolution = LDPR_PREVAILING_DEF_IRONLY;
2571       gcc_assert (cgraph_function_body_availability (node) == AVAIL_LOCAL);
2572     }
2573 }
2574
2575 /* Set TREE_NOTHROW on NODE's decl and on same_body aliases of NODE
2576    if any to NOTHROW.  */
2577
2578 void
2579 cgraph_set_nothrow_flag (struct cgraph_node *node, bool nothrow)
2580 {
2581   struct cgraph_node *alias;
2582   TREE_NOTHROW (node->decl) = nothrow;
2583   for (alias = node->same_body; alias; alias = alias->next)
2584     TREE_NOTHROW (alias->decl) = nothrow;
2585 }
2586
2587 /* Set TREE_READONLY on NODE's decl and on same_body aliases of NODE
2588    if any to READONLY.  */
2589
2590 void
2591 cgraph_set_readonly_flag (struct cgraph_node *node, bool readonly)
2592 {
2593   struct cgraph_node *alias;
2594   TREE_READONLY (node->decl) = readonly;
2595   for (alias = node->same_body; alias; alias = alias->next)
2596     TREE_READONLY (alias->decl) = readonly;
2597 }
2598
2599 /* Set DECL_PURE_P on NODE's decl and on same_body aliases of NODE
2600    if any to PURE.  */
2601
2602 void
2603 cgraph_set_pure_flag (struct cgraph_node *node, bool pure)
2604 {
2605   struct cgraph_node *alias;
2606   DECL_PURE_P (node->decl) = pure;
2607   for (alias = node->same_body; alias; alias = alias->next)
2608     DECL_PURE_P (alias->decl) = pure;
2609 }
2610
2611 /* Set DECL_LOOPING_CONST_OR_PURE_P on NODE's decl and on
2612    same_body aliases of NODE if any to LOOPING_CONST_OR_PURE.  */
2613
2614 void
2615 cgraph_set_looping_const_or_pure_flag (struct cgraph_node *node,
2616                                        bool looping_const_or_pure)
2617 {
2618   struct cgraph_node *alias;
2619   DECL_LOOPING_CONST_OR_PURE_P (node->decl) = looping_const_or_pure;
2620   for (alias = node->same_body; alias; alias = alias->next)
2621     DECL_LOOPING_CONST_OR_PURE_P (alias->decl) = looping_const_or_pure;
2622 }
2623
2624 /* See if the frequency of NODE can be updated based on frequencies of its
2625    callers.  */
2626 bool
2627 cgraph_propagate_frequency (struct cgraph_node *node)
2628 {
2629   bool maybe_unlikely_executed = true, maybe_executed_once = true;
2630   struct cgraph_edge *edge;
2631   if (!node->local.local)
2632     return false;
2633   gcc_assert (node->analyzed);
2634   if (node->frequency == NODE_FREQUENCY_HOT)
2635     return false;
2636   if (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
2637     return false;
2638   if (dump_file && (dump_flags & TDF_DETAILS))
2639     fprintf (dump_file, "Processing frequency %s\n", cgraph_node_name (node));
2640   for (edge = node->callers;
2641        edge && (maybe_unlikely_executed || maybe_executed_once);
2642        edge = edge->next_caller)
2643     {
2644       if (!edge->frequency)
2645         continue;
2646       switch (edge->caller->frequency)
2647         {
2648         case NODE_FREQUENCY_UNLIKELY_EXECUTED:
2649           break;
2650         case NODE_FREQUENCY_EXECUTED_ONCE:
2651           if (dump_file && (dump_flags & TDF_DETAILS))
2652             fprintf (dump_file, "  Called by %s that is executed once\n", cgraph_node_name (node));
2653           maybe_unlikely_executed = false;
2654           if (edge->loop_nest)
2655             {
2656               maybe_executed_once = false;
2657               if (dump_file && (dump_flags & TDF_DETAILS))
2658                 fprintf (dump_file, "  Called in loop\n");
2659             }
2660           break;
2661         case NODE_FREQUENCY_HOT:
2662         case NODE_FREQUENCY_NORMAL:
2663           if (dump_file && (dump_flags & TDF_DETAILS))
2664             fprintf (dump_file, "  Called by %s that is normal or hot\n", cgraph_node_name (node));
2665           maybe_unlikely_executed = false;
2666           maybe_executed_once = false;
2667           break;
2668         }
2669     }
2670    if (maybe_unlikely_executed)
2671      {
2672        node->frequency = NODE_FREQUENCY_UNLIKELY_EXECUTED;
2673        if (dump_file)
2674          fprintf (dump_file, "Node %s promoted to unlikely executed.\n", cgraph_node_name (node));
2675        return true;
2676      }
2677    if (maybe_executed_once && node->frequency != NODE_FREQUENCY_EXECUTED_ONCE)
2678      {
2679        node->frequency = NODE_FREQUENCY_EXECUTED_ONCE;
2680        if (dump_file)
2681          fprintf (dump_file, "Node %s promoted to executed once.\n", cgraph_node_name (node));
2682        return true;
2683      }
2684    return false;
2685 }
2686
2687 /* Return true when NODE can not return or throw and thus
2688    it is safe to ignore its side effects for IPA analysis.  */
2689
2690 bool
2691 cgraph_node_cannot_return (struct cgraph_node *node)
2692 {
2693   int flags = flags_from_decl_or_type (node->decl);
2694   if (!flag_exceptions)
2695     return (flags & ECF_NORETURN) != 0;
2696   else
2697     return ((flags & (ECF_NORETURN | ECF_NOTHROW))
2698              == (ECF_NORETURN | ECF_NOTHROW));
2699 }
2700
2701 /* Return true when call of E can not lead to return from caller
2702    and thus it is safe to ignore its side effects for IPA analysis
2703    when computing side effects of the caller.
2704    FIXME: We could actually mark all edges that have no reaching
2705    patch to EXIT_BLOCK_PTR or throw to get better results.  */
2706 bool
2707 cgraph_edge_cannot_lead_to_return (struct cgraph_edge *e)
2708 {
2709   if (cgraph_node_cannot_return (e->caller))
2710     return true;
2711   if (e->indirect_unknown_callee)
2712     {
2713       int flags = e->indirect_info->ecf_flags;
2714       if (!flag_exceptions)
2715         return (flags & ECF_NORETURN) != 0;
2716       else
2717         return ((flags & (ECF_NORETURN | ECF_NOTHROW))
2718                  == (ECF_NORETURN | ECF_NOTHROW));
2719     }
2720   else
2721     return cgraph_node_cannot_return (e->callee);
2722 }
2723
2724 /* Return true when function NODE can be removed from callgraph
2725    if all direct calls are eliminated.  */
2726
2727 bool
2728 cgraph_can_remove_if_no_direct_calls_and_refs_p (struct cgraph_node *node)
2729 {
2730   /* When function is needed, we can not remove it.  */
2731   if (node->needed || node->reachable_from_other_partition)
2732     return false;
2733   /* Only COMDAT functions can be removed if externally visible.  */
2734   if (node->local.externally_visible
2735       && (!DECL_COMDAT (node->decl)
2736           || cgraph_used_from_object_file_p (node)))
2737     return false;
2738   /* Constructors and destructors are executed by the runtime, however
2739      we can get rid of all pure constructors and destructors.  */
2740   if (DECL_STATIC_CONSTRUCTOR (node->decl)
2741       || DECL_STATIC_DESTRUCTOR (node->decl))
2742     {
2743       int flags = flags_from_decl_or_type (node->decl);
2744       if (!optimize
2745           || !(flags & (ECF_CONST | ECF_PURE))
2746           || (flags & ECF_LOOPING_CONST_OR_PURE))
2747         return false;
2748     }
2749   return true;
2750 }
2751
2752 /* Return true when function NODE can be excpected to be removed
2753    from program when direct calls in this compilation unit are removed.
2754
2755    As a special case COMDAT functions are
2756    cgraph_can_remove_if_no_direct_calls_p while the are not
2757    cgraph_only_called_directly_p (it is possible they are called from other
2758    unit)
2759
2760    This function behaves as cgraph_only_called_directly_p because eliminating
2761    all uses of COMDAT function does not make it neccesarily disappear from
2762    the program unless we are compiling whole program or we do LTO.  In this
2763    case we know we win since dynamic linking will not really discard the
2764    linkonce section.  */
2765
2766 bool
2767 cgraph_will_be_removed_from_program_if_no_direct_calls (struct cgraph_node *node)
2768 {
2769   if (cgraph_used_from_object_file_p (node))
2770     return false;
2771   if (!in_lto_p && !flag_whole_program)
2772     return cgraph_only_called_directly_p (node);
2773   else
2774     return cgraph_can_remove_if_no_direct_calls_p (node);
2775 }
2776
2777 /* Return true when RESOLUTION indicate that linker will use
2778    the symbol from non-LTo object files.  */
2779
2780 bool
2781 resolution_used_from_other_file_p (enum ld_plugin_symbol_resolution resolution)
2782 {
2783   return (resolution == LDPR_PREVAILING_DEF
2784           || resolution == LDPR_PREEMPTED_REG
2785           || resolution == LDPR_RESOLVED_EXEC
2786           || resolution == LDPR_RESOLVED_DYN);
2787 }
2788
2789 /* Return true when NODE is known to be used from other (non-LTO) object file.
2790    Known only when doing LTO via linker plugin.  */
2791
2792 bool
2793 cgraph_used_from_object_file_p (struct cgraph_node *node)
2794 {
2795   struct cgraph_node *alias;
2796
2797   if (!TREE_PUBLIC (node->decl))
2798     return false;
2799   if (resolution_used_from_other_file_p (node->resolution))
2800     return true;
2801   for (alias = node->same_body; alias; alias = alias->next)
2802     if (TREE_PUBLIC (alias->decl)
2803         && resolution_used_from_other_file_p (alias->resolution))
2804       return true;
2805   return false;
2806 }
2807
2808 #include "gt-cgraph.h"