OSDN Git Service

PR middle-end/40084
[pf3gnuchains/gcc-fork.git] / gcc / cgraph.c
1 /* Callgraph handling code.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
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 indirect calls or calls
38     from other compilation unit.  Flag NEEDED is set for each node that may
39     be accessed in such an invisible way and it shall be considered an
40     entry point to the callgraph.
41
42     Interprocedural information:
43
44       Callgraph is place to store data needed for interprocedural optimization.
45       All data structures are divided into three components: local_info that
46       is produced while analyzing the function, global_info that is result
47       of global walking of the callgraph on the end of compilation and
48       rtl_info used by RTL backend to propagate data from already compiled
49       functions to their callers.
50
51     Inlining plans:
52
53       The function inlining information is decided in advance and maintained
54       in the callgraph as so called inline plan.
55       For each inlined call, the callee's node is cloned to represent the
56       new function copy produced by inliner.
57       Each inlined call gets a unique corresponding clone node of the callee
58       and the data structure is updated while inlining is performed, so
59       the clones are eliminated and their callee edges redirected to the
60       caller.
61
62       Each edge has "inline_failed" field.  When the field is set to NULL,
63       the call will be inlined.  When it is non-NULL it contains a reason
64       why inlining wasn't performed.  */
65
66 #include "config.h"
67 #include "system.h"
68 #include "coretypes.h"
69 #include "tm.h"
70 #include "tree.h"
71 #include "tree-inline.h"
72 #include "langhooks.h"
73 #include "hashtab.h"
74 #include "toplev.h"
75 #include "flags.h"
76 #include "ggc.h"
77 #include "debug.h"
78 #include "target.h"
79 #include "basic-block.h"
80 #include "cgraph.h"
81 #include "output.h"
82 #include "intl.h"
83 #include "gimple.h"
84 #include "tree-dump.h"
85 #include "tree-flow.h"
86 #include "value-prof.h"
87
88 static void cgraph_node_remove_callers (struct cgraph_node *node);
89 static inline void cgraph_edge_remove_caller (struct cgraph_edge *e);
90 static inline void cgraph_edge_remove_callee (struct cgraph_edge *e);
91
92 /* Hash table used to convert declarations into nodes.  */
93 static GTY((param_is (struct cgraph_node))) htab_t cgraph_hash;
94 /* Hash table used to convert assembler names into nodes.  */
95 static GTY((param_is (struct cgraph_node))) htab_t assembler_name_hash;
96
97 /* The linked list of cgraph nodes.  */
98 struct cgraph_node *cgraph_nodes;
99
100 /* Queue of cgraph nodes scheduled to be lowered.  */
101 struct cgraph_node *cgraph_nodes_queue;
102
103 /* Queue of cgraph nodes scheduled to be added into cgraph.  This is a
104    secondary queue used during optimization to accommodate passes that
105    may generate new functions that need to be optimized and expanded.  */
106 struct cgraph_node *cgraph_new_nodes;
107
108 /* Number of nodes in existence.  */
109 int cgraph_n_nodes;
110
111 /* Maximal uid used in cgraph nodes.  */
112 int cgraph_max_uid;
113
114 /* Maximal uid used in cgraph edges.  */
115 int cgraph_edge_max_uid;
116
117 /* Maximal pid used for profiling */
118 int cgraph_max_pid;
119
120 /* Set when whole unit has been analyzed so we can access global info.  */
121 bool cgraph_global_info_ready = false;
122
123 /* What state callgraph is in right now.  */
124 enum cgraph_state cgraph_state = CGRAPH_STATE_CONSTRUCTION;
125
126 /* Set when the cgraph is fully build and the basic flags are computed.  */
127 bool cgraph_function_flags_ready = false;
128
129 /* Linked list of cgraph asm nodes.  */
130 struct cgraph_asm_node *cgraph_asm_nodes;
131
132 /* Last node in cgraph_asm_nodes.  */
133 static GTY(()) struct cgraph_asm_node *cgraph_asm_last_node;
134
135 /* The order index of the next cgraph node to be created.  This is
136    used so that we can sort the cgraph nodes in order by when we saw
137    them, to support -fno-toplevel-reorder.  */
138 int cgraph_order;
139
140 /* List of hooks trigerred on cgraph_edge events.  */
141 struct cgraph_edge_hook_list {
142   cgraph_edge_hook hook;
143   void *data;
144   struct cgraph_edge_hook_list *next;
145 };
146
147 /* List of hooks trigerred on cgraph_node events.  */
148 struct cgraph_node_hook_list {
149   cgraph_node_hook hook;
150   void *data;
151   struct cgraph_node_hook_list *next;
152 };
153
154 /* List of hooks trigerred on events involving two cgraph_edges.  */
155 struct cgraph_2edge_hook_list {
156   cgraph_2edge_hook hook;
157   void *data;
158   struct cgraph_2edge_hook_list *next;
159 };
160
161 /* List of hooks trigerred on events involving two cgraph_nodes.  */
162 struct cgraph_2node_hook_list {
163   cgraph_2node_hook hook;
164   void *data;
165   struct cgraph_2node_hook_list *next;
166 };
167
168 /* List of hooks triggered when an edge is removed.  */
169 struct cgraph_edge_hook_list *first_cgraph_edge_removal_hook;
170 /* List of hooks triggered when a node is removed.  */
171 struct cgraph_node_hook_list *first_cgraph_node_removal_hook;
172 /* List of hooks triggered when an edge is duplicated.  */
173 struct cgraph_2edge_hook_list *first_cgraph_edge_duplicated_hook;
174 /* List of hooks triggered when a node is duplicated.  */
175 struct cgraph_2node_hook_list *first_cgraph_node_duplicated_hook;
176 /* List of hooks triggered when an function is inserted.  */
177 struct cgraph_node_hook_list *first_cgraph_function_insertion_hook;
178
179 /* Head of a linked list of unused (freed) call graph nodes.
180    Do not GTY((delete)) this list so UIDs gets reliably recycled.  */
181 static GTY(()) struct cgraph_node *free_nodes;
182 /* Head of a linked list of unused (freed) call graph edges.
183    Do not GTY((delete)) this list so UIDs gets reliably recycled.  */
184 static GTY(()) struct cgraph_edge *free_edges;
185
186 /* Macros to access the next item in the list of free cgraph nodes and
187    edges. */
188 #define NEXT_FREE_NODE(NODE) (NODE)->next
189 #define NEXT_FREE_EDGE(EDGE) (EDGE)->prev_caller
190
191 /* Register HOOK to be called with DATA on each removed edge.  */
192 struct cgraph_edge_hook_list *
193 cgraph_add_edge_removal_hook (cgraph_edge_hook hook, void *data)
194 {
195   struct cgraph_edge_hook_list *entry;
196   struct cgraph_edge_hook_list **ptr = &first_cgraph_edge_removal_hook;
197
198   entry = (struct cgraph_edge_hook_list *) xmalloc (sizeof (*entry));
199   entry->hook = hook;
200   entry->data = data;
201   entry->next = NULL;
202   while (*ptr)
203     ptr = &(*ptr)->next;
204   *ptr = entry;
205   return entry;
206 }
207
208 /* Remove ENTRY from the list of hooks called on removing edges.  */
209 void
210 cgraph_remove_edge_removal_hook (struct cgraph_edge_hook_list *entry)
211 {
212   struct cgraph_edge_hook_list **ptr = &first_cgraph_edge_removal_hook;
213
214   while (*ptr != entry)
215     ptr = &(*ptr)->next;
216   *ptr = entry->next;
217   free (entry);
218 }
219
220 /* Call all edge removal hooks.  */
221 static void
222 cgraph_call_edge_removal_hooks (struct cgraph_edge *e)
223 {
224   struct cgraph_edge_hook_list *entry = first_cgraph_edge_removal_hook;
225   while (entry)
226   {
227     entry->hook (e, entry->data);
228     entry = entry->next;
229   }
230 }
231
232 /* Register HOOK to be called with DATA on each removed node.  */
233 struct cgraph_node_hook_list *
234 cgraph_add_node_removal_hook (cgraph_node_hook hook, void *data)
235 {
236   struct cgraph_node_hook_list *entry;
237   struct cgraph_node_hook_list **ptr = &first_cgraph_node_removal_hook;
238
239   entry = (struct cgraph_node_hook_list *) xmalloc (sizeof (*entry));
240   entry->hook = hook;
241   entry->data = data;
242   entry->next = NULL;
243   while (*ptr)
244     ptr = &(*ptr)->next;
245   *ptr = entry;
246   return entry;
247 }
248
249 /* Remove ENTRY from the list of hooks called on removing nodes.  */
250 void
251 cgraph_remove_node_removal_hook (struct cgraph_node_hook_list *entry)
252 {
253   struct cgraph_node_hook_list **ptr = &first_cgraph_node_removal_hook;
254
255   while (*ptr != entry)
256     ptr = &(*ptr)->next;
257   *ptr = entry->next;
258   free (entry);
259 }
260
261 /* Call all node removal hooks.  */
262 static void
263 cgraph_call_node_removal_hooks (struct cgraph_node *node)
264 {
265   struct cgraph_node_hook_list *entry = first_cgraph_node_removal_hook;
266   while (entry)
267   {
268     entry->hook (node, entry->data);
269     entry = entry->next;
270   }
271 }
272
273 /* Register HOOK to be called with DATA on each removed node.  */
274 struct cgraph_node_hook_list *
275 cgraph_add_function_insertion_hook (cgraph_node_hook hook, void *data)
276 {
277   struct cgraph_node_hook_list *entry;
278   struct cgraph_node_hook_list **ptr = &first_cgraph_function_insertion_hook;
279
280   entry = (struct cgraph_node_hook_list *) xmalloc (sizeof (*entry));
281   entry->hook = hook;
282   entry->data = data;
283   entry->next = NULL;
284   while (*ptr)
285     ptr = &(*ptr)->next;
286   *ptr = entry;
287   return entry;
288 }
289
290 /* Remove ENTRY from the list of hooks called on removing nodes.  */
291 void
292 cgraph_remove_function_insertion_hook (struct cgraph_node_hook_list *entry)
293 {
294   struct cgraph_node_hook_list **ptr = &first_cgraph_function_insertion_hook;
295
296   while (*ptr != entry)
297     ptr = &(*ptr)->next;
298   *ptr = entry->next;
299   free (entry);
300 }
301
302 /* Call all node removal hooks.  */
303 void
304 cgraph_call_function_insertion_hooks (struct cgraph_node *node)
305 {
306   struct cgraph_node_hook_list *entry = first_cgraph_function_insertion_hook;
307   while (entry)
308   {
309     entry->hook (node, entry->data);
310     entry = entry->next;
311   }
312 }
313
314 /* Register HOOK to be called with DATA on each duplicated edge.  */
315 struct cgraph_2edge_hook_list *
316 cgraph_add_edge_duplication_hook (cgraph_2edge_hook hook, void *data)
317 {
318   struct cgraph_2edge_hook_list *entry;
319   struct cgraph_2edge_hook_list **ptr = &first_cgraph_edge_duplicated_hook;
320
321   entry = (struct cgraph_2edge_hook_list *) xmalloc (sizeof (*entry));
322   entry->hook = hook;
323   entry->data = data;
324   entry->next = NULL;
325   while (*ptr)
326     ptr = &(*ptr)->next;
327   *ptr = entry;
328   return entry;
329 }
330
331 /* Remove ENTRY from the list of hooks called on duplicating edges.  */
332 void
333 cgraph_remove_edge_duplication_hook (struct cgraph_2edge_hook_list *entry)
334 {
335   struct cgraph_2edge_hook_list **ptr = &first_cgraph_edge_duplicated_hook;
336
337   while (*ptr != entry)
338     ptr = &(*ptr)->next;
339   *ptr = entry->next;
340   free (entry);
341 }
342
343 /* Call all edge duplication hooks.  */
344 static void
345 cgraph_call_edge_duplication_hooks (struct cgraph_edge *cs1,
346                                     struct cgraph_edge *cs2)
347 {
348   struct cgraph_2edge_hook_list *entry = first_cgraph_edge_duplicated_hook;
349   while (entry)
350   {
351     entry->hook (cs1, cs2, entry->data);
352     entry = entry->next;
353   }
354 }
355
356 /* Register HOOK to be called with DATA on each duplicated node.  */
357 struct cgraph_2node_hook_list *
358 cgraph_add_node_duplication_hook (cgraph_2node_hook hook, void *data)
359 {
360   struct cgraph_2node_hook_list *entry;
361   struct cgraph_2node_hook_list **ptr = &first_cgraph_node_duplicated_hook;
362
363   entry = (struct cgraph_2node_hook_list *) xmalloc (sizeof (*entry));
364   entry->hook = hook;
365   entry->data = data;
366   entry->next = NULL;
367   while (*ptr)
368     ptr = &(*ptr)->next;
369   *ptr = entry;
370   return entry;
371 }
372
373 /* Remove ENTRY from the list of hooks called on duplicating nodes.  */
374 void
375 cgraph_remove_node_duplication_hook (struct cgraph_2node_hook_list *entry)
376 {
377   struct cgraph_2node_hook_list **ptr = &first_cgraph_node_duplicated_hook;
378
379   while (*ptr != entry)
380     ptr = &(*ptr)->next;
381   *ptr = entry->next;
382   free (entry);
383 }
384
385 /* Call all node duplication hooks.  */
386 static void
387 cgraph_call_node_duplication_hooks (struct cgraph_node *node1,
388                                     struct cgraph_node *node2)
389 {
390   struct cgraph_2node_hook_list *entry = first_cgraph_node_duplicated_hook;
391   while (entry)
392   {
393     entry->hook (node1, node2, entry->data);
394     entry = entry->next;
395   }
396 }
397
398 /* Returns a hash code for P.  */
399
400 static hashval_t
401 hash_node (const void *p)
402 {
403   const struct cgraph_node *n = (const struct cgraph_node *) p;
404   return (hashval_t) DECL_UID (n->decl);
405 }
406
407 /* Returns nonzero if P1 and P2 are equal.  */
408
409 static int
410 eq_node (const void *p1, const void *p2)
411 {
412   const struct cgraph_node *n1 = (const struct cgraph_node *) p1;
413   const struct cgraph_node *n2 = (const struct cgraph_node *) p2;
414   return DECL_UID (n1->decl) == DECL_UID (n2->decl);
415 }
416
417 /* Allocate new callgraph node and insert it into basic data structures.  */
418
419 static struct cgraph_node *
420 cgraph_create_node (void)
421 {
422   struct cgraph_node *node;
423
424   if (free_nodes)
425     {
426       node = free_nodes;
427       free_nodes = NEXT_FREE_NODE (node);
428     }
429   else
430     {
431       node = GGC_CNEW (struct cgraph_node);
432       node->uid = cgraph_max_uid++;
433     }
434
435   node->next = cgraph_nodes;
436   node->pid = -1;
437   node->order = cgraph_order++;
438   if (cgraph_nodes)
439     cgraph_nodes->previous = node;
440   node->previous = NULL;
441   node->global.estimated_growth = INT_MIN;
442   cgraph_nodes = node;
443   cgraph_n_nodes++;
444   return node;
445 }
446
447 /* Return cgraph node assigned to DECL.  Create new one when needed.  */
448
449 struct cgraph_node *
450 cgraph_node (tree decl)
451 {
452   struct cgraph_node key, *node, **slot;
453
454   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
455
456   if (!cgraph_hash)
457     cgraph_hash = htab_create_ggc (10, hash_node, eq_node, NULL);
458
459   key.decl = decl;
460
461   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, &key, INSERT);
462
463   if (*slot)
464     {
465       node = *slot;
466       return node;
467     }
468
469   node = cgraph_create_node ();
470   node->decl = decl;
471   *slot = node;
472   if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
473     {
474       node->origin = cgraph_node (DECL_CONTEXT (decl));
475       node->next_nested = node->origin->nested;
476       node->origin->nested = node;
477     }
478   if (assembler_name_hash)
479     {
480       void **aslot;
481       tree name = DECL_ASSEMBLER_NAME (decl);
482
483       aslot = htab_find_slot_with_hash (assembler_name_hash, name,
484                                         decl_assembler_name_hash (name),
485                                         INSERT);
486       /* We can have multiple declarations with same assembler name. For C++
487          it is __builtin_strlen and strlen, for instance.  Do we need to
488          record them all?  Original implementation marked just first one
489          so lets hope for the best.  */
490       if (*aslot == NULL)
491         *aslot = node;
492     }
493   return node;
494 }
495
496 /* Insert already constructed node into hashtable.  */
497
498 void
499 cgraph_insert_node_to_hashtable (struct cgraph_node *node)
500 {
501   struct cgraph_node **slot;
502
503   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, node, INSERT);
504
505   gcc_assert (!*slot);
506   *slot = node;
507 }
508
509 /* Returns a hash code for P.  */
510
511 static hashval_t
512 hash_node_by_assembler_name (const void *p)
513 {
514   const struct cgraph_node *n = (const struct cgraph_node *) p;
515   return (hashval_t) decl_assembler_name_hash (DECL_ASSEMBLER_NAME (n->decl));
516 }
517
518 /* Returns nonzero if P1 and P2 are equal.  */
519
520 static int
521 eq_assembler_name (const void *p1, const void *p2)
522 {
523   const struct cgraph_node *n1 = (const struct cgraph_node *) p1;
524   const_tree name = (const_tree)p2;
525   return (decl_assembler_name_equal (n1->decl, name));
526 }
527
528 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
529    Return NULL if there's no such node.  */
530
531 struct cgraph_node *
532 cgraph_node_for_asm (tree asmname)
533 {
534   struct cgraph_node *node;
535   void **slot;
536
537   if (!assembler_name_hash)
538     {
539       assembler_name_hash =
540         htab_create_ggc (10, hash_node_by_assembler_name, eq_assembler_name,
541                          NULL);
542       for (node = cgraph_nodes; node; node = node->next)
543         if (!node->global.inlined_to)
544           {
545             tree name = DECL_ASSEMBLER_NAME (node->decl);
546             slot = htab_find_slot_with_hash (assembler_name_hash, name,
547                                              decl_assembler_name_hash (name),
548                                              INSERT);
549             /* We can have multiple declarations with same assembler name. For C++
550                it is __builtin_strlen and strlen, for instance.  Do we need to
551                record them all?  Original implementation marked just first one
552                so lets hope for the best.  */
553             if (*slot)
554               continue;
555             *slot = node;
556           }
557     }
558
559   slot = htab_find_slot_with_hash (assembler_name_hash, asmname,
560                                    decl_assembler_name_hash (asmname),
561                                    NO_INSERT);
562
563   if (slot)
564     return (struct cgraph_node *) *slot;
565   return NULL;
566 }
567
568 /* Returns a hash value for X (which really is a die_struct).  */
569
570 static hashval_t
571 edge_hash (const void *x)
572 {
573   return htab_hash_pointer (((const struct cgraph_edge *) x)->call_stmt);
574 }
575
576 /* Return nonzero if decl_id of die_struct X is the same as UID of decl *Y.  */
577
578 static int
579 edge_eq (const void *x, const void *y)
580 {
581   return ((const struct cgraph_edge *) x)->call_stmt == y;
582 }
583
584
585 /* Return the callgraph edge representing the GIMPLE_CALL statement
586    CALL_STMT.  */
587
588 struct cgraph_edge *
589 cgraph_edge (struct cgraph_node *node, gimple call_stmt)
590 {
591   struct cgraph_edge *e, *e2;
592   int n = 0;
593
594   if (node->call_site_hash)
595     return (struct cgraph_edge *)
596       htab_find_with_hash (node->call_site_hash, call_stmt,
597                            htab_hash_pointer (call_stmt));
598
599   /* This loop may turn out to be performance problem.  In such case adding
600      hashtables into call nodes with very many edges is probably best
601      solution.  It is not good idea to add pointer into CALL_EXPR itself
602      because we want to make possible having multiple cgraph nodes representing
603      different clones of the same body before the body is actually cloned.  */
604   for (e = node->callees; e; e= e->next_callee)
605     {
606       if (e->call_stmt == call_stmt)
607         break;
608       n++;
609     }
610
611   if (n > 100)
612     {
613       node->call_site_hash = htab_create_ggc (120, edge_hash, edge_eq, NULL);
614       for (e2 = node->callees; e2; e2 = e2->next_callee)
615         {
616           void **slot;
617           slot = htab_find_slot_with_hash (node->call_site_hash,
618                                            e2->call_stmt,
619                                            htab_hash_pointer (e2->call_stmt),
620                                            INSERT);
621           gcc_assert (!*slot);
622           *slot = e2;
623         }
624     }
625
626   return e;
627 }
628
629
630 /* Change field call_stmt of edge E to NEW_STMT.  */
631
632 void
633 cgraph_set_call_stmt (struct cgraph_edge *e, gimple new_stmt)
634 {
635   if (e->caller->call_site_hash)
636     {
637       htab_remove_elt_with_hash (e->caller->call_site_hash,
638                                  e->call_stmt,
639                                  htab_hash_pointer (e->call_stmt));
640     }
641   e->call_stmt = new_stmt;
642   push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
643   e->can_throw_external = stmt_can_throw_external (new_stmt);
644   pop_cfun ();
645   if (e->caller->call_site_hash)
646     {
647       void **slot;
648       slot = htab_find_slot_with_hash (e->caller->call_site_hash,
649                                        e->call_stmt,
650                                        htab_hash_pointer
651                                        (e->call_stmt), INSERT);
652       gcc_assert (!*slot);
653       *slot = e;
654     }
655 }
656
657 /* Like cgraph_set_call_stmt but walk the clone tree and update all clones sharing
658    same function body.  */
659
660 void
661 cgraph_set_call_stmt_including_clones (struct cgraph_node *orig,
662                                        gimple old_stmt, gimple new_stmt)
663 {
664   struct cgraph_node *node;
665   struct cgraph_edge *edge = cgraph_edge (orig, old_stmt);
666
667   if (edge)
668     cgraph_set_call_stmt (edge, new_stmt);
669   if (orig->clones)
670     for (node = orig->clones; node != orig;)
671       {
672         struct cgraph_edge *edge = cgraph_edge (node, old_stmt);
673         if (edge)
674           cgraph_set_call_stmt (edge, new_stmt);
675         if (node->clones)
676           node = node->clones;
677         else if (node->next_sibling_clone)
678           node = node->next_sibling_clone;
679         else
680           {
681             while (node != orig && !node->next_sibling_clone)
682               node = node->clone_of;
683             if (node != orig)
684               node = node->next_sibling_clone;
685           }
686       }
687 }
688
689 /* Like cgraph_create_edge walk the clone tree and update all clones sharing
690    same function body.  
691    
692    TODO: COUNT and LOOP_DEPTH should be properly distributed based on relative
693    frequencies of the clones.
694    */
695
696 void
697 cgraph_create_edge_including_clones (struct cgraph_node *orig, struct cgraph_node *callee,
698                                      gimple stmt, gcov_type count, int freq,
699                                      int loop_depth,
700                                      cgraph_inline_failed_t reason)
701 {
702   struct cgraph_node *node;
703
704   cgraph_create_edge (orig, callee, stmt, count, freq, loop_depth)->inline_failed =
705     reason;
706
707   if (orig->clones)
708     for (node = orig->clones; node != orig;)
709       {
710         /* It is possible that we already constant propagated into the clone
711            and turned indirect call into dirrect call.  */
712         if (!cgraph_edge (node, stmt))
713           cgraph_create_edge (node, callee, stmt, count, freq,
714                               loop_depth)->inline_failed = reason;
715
716         if (node->clones)
717           node = node->clones;
718         else if (node->next_sibling_clone)
719           node = node->next_sibling_clone;
720         else
721           {
722             while (node != orig && !node->next_sibling_clone)
723               node = node->clone_of;
724             if (node != orig)
725               node = node->next_sibling_clone;
726           }
727       }
728 }
729
730 /* Give initial reasons why inlining would fail on EDGE.  This gets either
731    nullified or usually overwritten by more precise reasons later.  */
732
733 static void
734 initialize_inline_failed (struct cgraph_edge *e)
735 {
736   struct cgraph_node *callee = e->callee;
737
738   if (!callee->analyzed)
739     e->inline_failed = CIF_BODY_NOT_AVAILABLE;
740   else if (callee->local.redefined_extern_inline)
741     e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
742   else if (!callee->local.inlinable)
743     e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
744   else if (gimple_call_cannot_inline_p (e->call_stmt))
745     e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
746   else
747     e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
748 }
749
750 /* Create edge from CALLER to CALLEE in the cgraph.  */
751
752 struct cgraph_edge *
753 cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
754                     gimple call_stmt, gcov_type count, int freq, int nest)
755 {
756   struct cgraph_edge *edge;
757
758 #ifdef ENABLE_CHECKING
759   /* This is rather pricely check possibly trigerring construction of call stmt
760      hashtable.  */
761   gcc_assert (!cgraph_edge (caller, call_stmt));
762 #endif
763
764   gcc_assert (is_gimple_call (call_stmt));
765
766   if (free_edges)
767     {
768       edge = free_edges;
769       free_edges = NEXT_FREE_EDGE (edge);
770     }
771   else
772     {
773       edge = GGC_NEW (struct cgraph_edge);
774       edge->uid = cgraph_edge_max_uid++;
775     }
776
777   edge->aux = NULL;
778
779   edge->caller = caller;
780   edge->callee = callee;
781   edge->call_stmt = call_stmt;
782   push_cfun (DECL_STRUCT_FUNCTION (caller->decl));
783   edge->can_throw_external = stmt_can_throw_external (call_stmt);
784   pop_cfun ();
785   edge->prev_caller = NULL;
786   edge->next_caller = callee->callers;
787   if (callee->callers)
788     callee->callers->prev_caller = edge;
789   edge->prev_callee = NULL;
790   edge->next_callee = caller->callees;
791   if (caller->callees)
792     caller->callees->prev_callee = edge;
793   caller->callees = edge;
794   callee->callers = edge;
795   edge->count = count;
796   gcc_assert (count >= 0);
797   edge->frequency = freq;
798   gcc_assert (freq >= 0);
799   gcc_assert (freq <= CGRAPH_FREQ_MAX);
800   edge->loop_nest = nest;
801   edge->indirect_call = 0;
802   if (caller->call_site_hash)
803     {
804       void **slot;
805       slot = htab_find_slot_with_hash (caller->call_site_hash,
806                                        edge->call_stmt,
807                                        htab_hash_pointer
808                                          (edge->call_stmt),
809                                        INSERT);
810       gcc_assert (!*slot);
811       *slot = edge;
812     }
813
814   initialize_inline_failed (edge);
815
816   return edge;
817 }
818
819 /* Remove the edge E from the list of the callers of the callee.  */
820
821 static inline void
822 cgraph_edge_remove_callee (struct cgraph_edge *e)
823 {
824   if (e->prev_caller)
825     e->prev_caller->next_caller = e->next_caller;
826   if (e->next_caller)
827     e->next_caller->prev_caller = e->prev_caller;
828   if (!e->prev_caller)
829     e->callee->callers = e->next_caller;
830 }
831
832 /* Remove the edge E from the list of the callees of the caller.  */
833
834 static inline void
835 cgraph_edge_remove_caller (struct cgraph_edge *e)
836 {
837   if (e->prev_callee)
838     e->prev_callee->next_callee = e->next_callee;
839   if (e->next_callee)
840     e->next_callee->prev_callee = e->prev_callee;
841   if (!e->prev_callee)
842     e->caller->callees = e->next_callee;
843   if (e->caller->call_site_hash)
844     htab_remove_elt_with_hash (e->caller->call_site_hash,
845                                e->call_stmt,
846                                htab_hash_pointer (e->call_stmt));
847 }
848
849 /* Put the edge onto the free list.  */
850
851 static void
852 cgraph_free_edge (struct cgraph_edge *e)
853 {
854   int uid = e->uid;
855
856   /* Clear out the edge so we do not dangle pointers.  */
857   memset (e, 0, sizeof (*e));
858   e->uid = uid;
859   NEXT_FREE_EDGE (e) = free_edges;
860   free_edges = e;
861 }
862
863 /* Remove the edge E in the cgraph.  */
864
865 void
866 cgraph_remove_edge (struct cgraph_edge *e)
867 {
868   /* Call all edge removal hooks.  */
869   cgraph_call_edge_removal_hooks (e);
870
871   /* Remove from callers list of the callee.  */
872   cgraph_edge_remove_callee (e);
873
874   /* Remove from callees list of the callers.  */
875   cgraph_edge_remove_caller (e);
876
877   /* Put the edge onto the free list.  */
878   cgraph_free_edge (e);
879 }
880
881 /* Redirect callee of E to N.  The function does not update underlying
882    call expression.  */
883
884 void
885 cgraph_redirect_edge_callee (struct cgraph_edge *e, struct cgraph_node *n)
886 {
887   /* Remove from callers list of the current callee.  */
888   cgraph_edge_remove_callee (e);
889
890   /* Insert to callers list of the new callee.  */
891   e->prev_caller = NULL;
892   if (n->callers)
893     n->callers->prev_caller = e;
894   e->next_caller = n->callers;
895   n->callers = e;
896   e->callee = n;
897 }
898
899
900 /* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
901    OLD_STMT changed into NEW_STMT.  OLD_CALL is gimple_call_fndecl
902    of OLD_STMT if it was previously call statement.  */
903
904 static void
905 cgraph_update_edges_for_call_stmt_node (struct cgraph_node *node,
906                                         gimple old_stmt, tree old_call, gimple new_stmt)
907 {
908   tree new_call = (is_gimple_call (new_stmt)) ? gimple_call_fndecl (new_stmt) : 0;
909
910   /* We are seeing indirect calls, then there is nothing to update.  */
911   if (!new_call && !old_call)
912     return;
913   /* See if we turned indirect call into direct call or folded call to one builtin
914      into different bultin.  */
915   if (old_call != new_call)
916     {
917       struct cgraph_edge *e = cgraph_edge (node, old_stmt);
918       struct cgraph_edge *ne = NULL;
919       gcov_type count;
920       int frequency;
921       int loop_nest;
922
923       if (e)
924         {
925           /* See if the call is already there.  It might be because of indirect
926              inlining already found it.  */
927           if (new_call && e->callee->decl == new_call)
928             return;
929
930           /* Otherwise remove edge and create new one; we can't simply redirect
931              since function has changed, so inline plan and other information
932              attached to edge is invalid.  */
933           cgraph_remove_edge (e);
934           count = e->count;
935           frequency = e->frequency;
936           loop_nest = e->loop_nest;
937         }
938       else
939         {
940           /* We are seeing new direct call; compute profile info based on BB.  */
941           basic_block bb = gimple_bb (new_stmt);
942           count = bb->count;
943           frequency = compute_call_stmt_bb_frequency (current_function_decl,
944                                                       bb);
945           loop_nest = bb->loop_depth;
946         }
947
948       if (new_call)
949         {
950           ne = cgraph_create_edge (node, cgraph_node (new_call),
951                                    new_stmt, count, frequency,
952                                    loop_nest);
953           gcc_assert (ne->inline_failed);
954         }
955     }
956   /* We only updated the call stmt; update pointer in cgraph edge..  */
957   else if (old_stmt != new_stmt)
958     cgraph_set_call_stmt (cgraph_edge (node, old_stmt), new_stmt);
959 }
960
961 /* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
962    OLD_STMT changed into NEW_STMT.  OLD_DECL is gimple_call_fndecl
963    of OLD_STMT before it was updated (updating can happen inplace).  */
964
965 void
966 cgraph_update_edges_for_call_stmt (gimple old_stmt, tree old_decl, gimple new_stmt)
967 {
968   struct cgraph_node *orig = cgraph_node (cfun->decl);
969   struct cgraph_node *node;
970
971   cgraph_update_edges_for_call_stmt_node (orig, old_stmt, old_decl, new_stmt);
972   if (orig->clones)
973     for (node = orig->clones; node != orig;)
974       {
975         cgraph_update_edges_for_call_stmt_node (node, old_stmt, old_decl, new_stmt);
976         if (node->clones)
977           node = node->clones;
978         else if (node->next_sibling_clone)
979           node = node->next_sibling_clone;
980         else
981           {
982             while (node != orig && !node->next_sibling_clone)
983               node = node->clone_of;
984             if (node != orig)
985               node = node->next_sibling_clone;
986           }
987       }
988 }
989
990
991 /* Remove all callees from the node.  */
992
993 void
994 cgraph_node_remove_callees (struct cgraph_node *node)
995 {
996   struct cgraph_edge *e, *f;
997
998   /* It is sufficient to remove the edges from the lists of callers of
999      the callees.  The callee list of the node can be zapped with one
1000      assignment.  */
1001   for (e = node->callees; e; e = f)
1002     {
1003       f = e->next_callee;
1004       cgraph_call_edge_removal_hooks (e);
1005       cgraph_edge_remove_callee (e);
1006       cgraph_free_edge (e);
1007     }
1008   node->callees = NULL;
1009   if (node->call_site_hash)
1010     {
1011       htab_delete (node->call_site_hash);
1012       node->call_site_hash = NULL;
1013     }
1014 }
1015
1016 /* Remove all callers from the node.  */
1017
1018 static void
1019 cgraph_node_remove_callers (struct cgraph_node *node)
1020 {
1021   struct cgraph_edge *e, *f;
1022
1023   /* It is sufficient to remove the edges from the lists of callees of
1024      the callers.  The caller list of the node can be zapped with one
1025      assignment.  */
1026   for (e = node->callers; e; e = f)
1027     {
1028       f = e->next_caller;
1029       cgraph_call_edge_removal_hooks (e);
1030       cgraph_edge_remove_caller (e);
1031       cgraph_free_edge (e);
1032     }
1033   node->callers = NULL;
1034 }
1035
1036 /* Release memory used to represent body of function NODE.  */
1037
1038 void
1039 cgraph_release_function_body (struct cgraph_node *node)
1040 {
1041   if (DECL_STRUCT_FUNCTION (node->decl))
1042     {
1043       tree old_decl = current_function_decl;
1044       push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1045       if (cfun->gimple_df)
1046         {
1047           current_function_decl = node->decl;
1048           delete_tree_ssa ();
1049           delete_tree_cfg_annotations ();
1050           cfun->eh = NULL;
1051           current_function_decl = old_decl;
1052         }
1053       if (cfun->cfg)
1054         {
1055           gcc_assert (dom_computed[0] == DOM_NONE);
1056           gcc_assert (dom_computed[1] == DOM_NONE);
1057           clear_edges ();
1058         }
1059       if (cfun->value_histograms)
1060         free_histograms ();
1061       gcc_assert (!current_loops);
1062       pop_cfun();
1063       gimple_set_body (node->decl, NULL);
1064       VEC_free (ipa_opt_pass, heap,
1065                 DECL_STRUCT_FUNCTION (node->decl)->ipa_transforms_to_apply);
1066       /* Struct function hangs a lot of data that would leak if we didn't
1067          removed all pointers to it.   */
1068       ggc_free (DECL_STRUCT_FUNCTION (node->decl));
1069       DECL_STRUCT_FUNCTION (node->decl) = NULL;
1070     }
1071   DECL_SAVED_TREE (node->decl) = NULL;
1072   /* If the node is abstract and needed, then do not clear DECL_INITIAL
1073      of its associated function function declaration because it's
1074      needed to emit debug info later.  */
1075   if (!node->abstract_and_needed)
1076     DECL_INITIAL (node->decl) = error_mark_node;
1077 }
1078
1079 /* Remove the node from cgraph.  */
1080
1081 void
1082 cgraph_remove_node (struct cgraph_node *node)
1083 {
1084   void **slot;
1085   bool kill_body = false;
1086   struct cgraph_node *n;
1087   int uid = node->uid;
1088
1089   cgraph_call_node_removal_hooks (node);
1090   cgraph_node_remove_callers (node);
1091   cgraph_node_remove_callees (node);
1092
1093   /* Incremental inlining access removed nodes stored in the postorder list.
1094      */
1095   node->needed = node->reachable = false;
1096   for (n = node->nested; n; n = n->next_nested)
1097     n->origin = NULL;
1098   node->nested = NULL;
1099   if (node->origin)
1100     {
1101       struct cgraph_node **node2 = &node->origin->nested;
1102
1103       while (*node2 != node)
1104         node2 = &(*node2)->next_nested;
1105       *node2 = node->next_nested;
1106     }
1107   if (node->previous)
1108     node->previous->next = node->next;
1109   else
1110     cgraph_nodes = node->next;
1111   if (node->next)
1112     node->next->previous = node->previous;
1113   node->next = NULL;
1114   node->previous = NULL;
1115   slot = htab_find_slot (cgraph_hash, node, NO_INSERT);
1116   if (*slot == node)
1117     {
1118       struct cgraph_node *next_inline_clone;
1119
1120       for (next_inline_clone = node->clones;
1121            next_inline_clone && next_inline_clone->decl != node->decl;
1122            next_inline_clone = next_inline_clone->next_sibling_clone)
1123         ;
1124
1125       /* If there is inline clone of the node being removed, we need
1126          to put it into the position of removed node and reorganize all
1127          other clones to be based on it.  */
1128       if (next_inline_clone)
1129         {
1130           struct cgraph_node *n;
1131           struct cgraph_node *new_clones;
1132
1133           *slot = next_inline_clone;
1134
1135           /* Unlink inline clone from the list of clones of removed node.  */
1136           if (next_inline_clone->next_sibling_clone)
1137             next_inline_clone->next_sibling_clone->prev_sibling_clone
1138               = next_inline_clone->prev_sibling_clone;
1139           if (next_inline_clone->prev_sibling_clone)
1140             {
1141               next_inline_clone->prev_sibling_clone->next_sibling_clone
1142                 = next_inline_clone->next_sibling_clone;
1143             }
1144           else
1145            node->clones = next_inline_clone->next_sibling_clone;
1146
1147           new_clones = node->clones;
1148           node->clones = NULL;
1149
1150           /* Copy clone info.  */
1151           next_inline_clone->clone = node->clone;
1152
1153           /* Now place it into clone tree at same level at NODE.  */
1154           next_inline_clone->clone_of = node->clone_of;
1155           next_inline_clone->prev_sibling_clone = NULL;
1156           next_inline_clone->next_sibling_clone = NULL;
1157           if (node->clone_of)
1158             {
1159               next_inline_clone->next_sibling_clone = node->clone_of->clones;
1160               node->clone_of->clones = next_inline_clone;
1161             }
1162
1163           /* Merge the clone list.  */
1164           if (new_clones)
1165             {
1166               if (!next_inline_clone->clones)
1167                 next_inline_clone->clones = new_clones;
1168               else
1169                 {
1170                   n = next_inline_clone->clones;
1171                   while (n->next_sibling_clone)
1172                     n =  n->next_sibling_clone;
1173                   n->next_sibling_clone = new_clones;
1174                   new_clones->prev_sibling_clone = n;
1175                 }
1176             }
1177
1178           /* Update clone_of pointers.  */
1179           n = new_clones;
1180           while (n)
1181             {
1182               n->clone_of = next_inline_clone;
1183               n = n->next_sibling_clone;
1184             }
1185         }
1186       else
1187         {
1188           htab_clear_slot (cgraph_hash, slot);
1189           kill_body = true;
1190         }
1191
1192     }
1193   else
1194     gcc_assert (node->clone_of);
1195   if (node->prev_sibling_clone)
1196     node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone;
1197   else if (node->clone_of)
1198     node->clone_of->clones = node->next_sibling_clone;
1199   if (node->next_sibling_clone)
1200     node->next_sibling_clone->prev_sibling_clone = node->prev_sibling_clone;
1201   if (node->clones)
1202     {
1203       struct cgraph_node *n;
1204
1205       for (n = node->clones; n->next_sibling_clone; n = n->next_sibling_clone)
1206         n->clone_of = node->clone_of;
1207       n->clone_of = node->clone_of;
1208       n->next_sibling_clone = node->clone_of->clones;
1209       if (node->clone_of->clones)
1210         node->clone_of->clones->prev_sibling_clone = n;
1211       node->clone_of->clones = node->clones;
1212     }
1213
1214   /* While all the clones are removed after being proceeded, the function
1215      itself is kept in the cgraph even after it is compiled.  Check whether
1216      we are done with this body and reclaim it proactively if this is the case.
1217      */
1218   if (!kill_body && *slot)
1219     {
1220       struct cgraph_node *n = (struct cgraph_node *) *slot;
1221       if (!n->clones && !n->clone_of && !n->global.inlined_to
1222           && (cgraph_global_info_ready
1223               && (TREE_ASM_WRITTEN (n->decl) || DECL_EXTERNAL (n->decl))))
1224         kill_body = true;
1225     }
1226   if (assembler_name_hash)
1227     {
1228       tree name = DECL_ASSEMBLER_NAME (node->decl);
1229       slot = htab_find_slot_with_hash (assembler_name_hash, name,
1230                                        decl_assembler_name_hash (name),
1231                                        NO_INSERT);
1232       /* Inline clones are not hashed.  */
1233       if (slot && *slot == node)
1234         htab_clear_slot (assembler_name_hash, slot);
1235     }
1236
1237   if (kill_body)
1238     cgraph_release_function_body (node);
1239   node->decl = NULL;
1240   if (node->call_site_hash)
1241     {
1242       htab_delete (node->call_site_hash);
1243       node->call_site_hash = NULL;
1244     }
1245   cgraph_n_nodes--;
1246
1247   /* Clear out the node to NULL all pointers and add the node to the free
1248      list.  */
1249   memset (node, 0, sizeof(*node));
1250   node->uid = uid;
1251   NEXT_FREE_NODE (node) = free_nodes;
1252   free_nodes = node;
1253 }
1254
1255 /* Remove the node from cgraph.  */
1256
1257 void
1258 cgraph_remove_node_and_inline_clones (struct cgraph_node *node)
1259 {
1260   struct cgraph_edge *e, *next;
1261   for (e = node->callees; e; e = next)
1262     {
1263       next = e->next_callee;
1264       if (!e->inline_failed)
1265         cgraph_remove_node_and_inline_clones (e->callee);
1266     }
1267   cgraph_remove_node (node);
1268 }
1269
1270 /* Notify finalize_compilation_unit that given node is reachable.  */
1271
1272 void
1273 cgraph_mark_reachable_node (struct cgraph_node *node)
1274 {
1275   if (!node->reachable && node->local.finalized)
1276     {
1277       notice_global_symbol (node->decl);
1278       node->reachable = 1;
1279       gcc_assert (!cgraph_global_info_ready);
1280
1281       node->next_needed = cgraph_nodes_queue;
1282       cgraph_nodes_queue = node;
1283     }
1284 }
1285
1286 /* Likewise indicate that a node is needed, i.e. reachable via some
1287    external means.  */
1288
1289 void
1290 cgraph_mark_needed_node (struct cgraph_node *node)
1291 {
1292   node->needed = 1;
1293   cgraph_mark_reachable_node (node);
1294 }
1295
1296 /* Return local info for the compiled function.  */
1297
1298 struct cgraph_local_info *
1299 cgraph_local_info (tree decl)
1300 {
1301   struct cgraph_node *node;
1302
1303   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1304   node = cgraph_node (decl);
1305   return &node->local;
1306 }
1307
1308 /* Return local info for the compiled function.  */
1309
1310 struct cgraph_global_info *
1311 cgraph_global_info (tree decl)
1312 {
1313   struct cgraph_node *node;
1314
1315   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL && cgraph_global_info_ready);
1316   node = cgraph_node (decl);
1317   return &node->global;
1318 }
1319
1320 /* Return local info for the compiled function.  */
1321
1322 struct cgraph_rtl_info *
1323 cgraph_rtl_info (tree decl)
1324 {
1325   struct cgraph_node *node;
1326
1327   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1328   node = cgraph_node (decl);
1329   if (decl != current_function_decl
1330       && !TREE_ASM_WRITTEN (node->decl))
1331     return NULL;
1332   return &node->rtl;
1333 }
1334
1335 /* Return a string describing the failure REASON.  */
1336
1337 const char*
1338 cgraph_inline_failed_string (cgraph_inline_failed_t reason)
1339 {
1340 #undef DEFCIFCODE
1341 #define DEFCIFCODE(code, string)        string,
1342
1343   static const char *cif_string_table[CIF_N_REASONS] = {
1344 #include "cif-code.def"
1345   };
1346
1347   /* Signedness of an enum type is implementation defined, so cast it
1348      to unsigned before testing. */
1349   gcc_assert ((unsigned) reason < CIF_N_REASONS);
1350   return cif_string_table[reason];
1351 }
1352
1353 /* Return name of the node used in debug output.  */
1354 const char *
1355 cgraph_node_name (struct cgraph_node *node)
1356 {
1357   return lang_hooks.decl_printable_name (node->decl, 2);
1358 }
1359
1360 /* Names used to print out the availability enum.  */
1361 const char * const cgraph_availability_names[] =
1362   {"unset", "not_available", "overwritable", "available", "local"};
1363
1364
1365 /* Dump call graph node NODE to file F.  */
1366
1367 void
1368 dump_cgraph_node (FILE *f, struct cgraph_node *node)
1369 {
1370   struct cgraph_edge *edge;
1371   fprintf (f, "%s/%i(%i) [%p]:", cgraph_node_name (node), node->uid,
1372            node->pid, (void *) node);
1373   if (node->global.inlined_to)
1374     fprintf (f, " (inline copy in %s/%i)",
1375              cgraph_node_name (node->global.inlined_to),
1376              node->global.inlined_to->uid);
1377   if (node->clone_of)
1378     fprintf (f, " (clone of %s/%i)",
1379              cgraph_node_name (node->clone_of),
1380              node->clone_of->uid);
1381   if (cgraph_function_flags_ready)
1382     fprintf (f, " availability:%s",
1383              cgraph_availability_names [cgraph_function_body_availability (node)]);
1384   if (node->count)
1385     fprintf (f, " executed "HOST_WIDEST_INT_PRINT_DEC"x",
1386              (HOST_WIDEST_INT)node->count);
1387   if (node->local.inline_summary.self_insns)
1388     fprintf (f, " %i insns", node->local.inline_summary.self_insns);
1389   if (node->global.insns && node->global.insns
1390       != node->local.inline_summary.self_insns)
1391     fprintf (f, " (%i after inlining)", node->global.insns);
1392   if (node->local.inline_summary.estimated_self_stack_size)
1393     fprintf (f, " %i bytes stack usage", (int)node->local.inline_summary.estimated_self_stack_size);
1394   if (node->global.estimated_stack_size != node->local.inline_summary.estimated_self_stack_size)
1395     fprintf (f, " %i bytes after inlining", (int)node->global.estimated_stack_size);
1396   if (node->origin)
1397     fprintf (f, " nested in: %s", cgraph_node_name (node->origin));
1398   if (node->needed)
1399     fprintf (f, " needed");
1400   else if (node->reachable)
1401     fprintf (f, " reachable");
1402   if (gimple_has_body_p (node->decl))
1403     fprintf (f, " body");
1404   if (node->process)
1405     fprintf (f, " process");
1406   if (node->local.local)
1407     fprintf (f, " local");
1408   if (node->local.externally_visible)
1409     fprintf (f, " externally_visible");
1410   if (node->local.finalized)
1411     fprintf (f, " finalized");
1412   if (node->local.disregard_inline_limits)
1413     fprintf (f, " always_inline");
1414   else if (node->local.inlinable)
1415     fprintf (f, " inlinable");
1416   if (node->local.redefined_extern_inline)
1417     fprintf (f, " redefined_extern_inline");
1418   if (TREE_ASM_WRITTEN (node->decl))
1419     fprintf (f, " asm_written");
1420
1421   fprintf (f, "\n  called by: ");
1422   for (edge = node->callers; edge; edge = edge->next_caller)
1423     {
1424       fprintf (f, "%s/%i ", cgraph_node_name (edge->caller),
1425                edge->caller->uid);
1426       if (edge->count)
1427         fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ",
1428                  (HOST_WIDEST_INT)edge->count);
1429       if (edge->frequency)
1430         fprintf (f, "(%.2f per call) ",
1431                  edge->frequency / (double)CGRAPH_FREQ_BASE);
1432       if (!edge->inline_failed)
1433         fprintf(f, "(inlined) ");
1434       if (edge->indirect_call)
1435         fprintf(f, "(indirect) ");
1436       if (edge->can_throw_external)
1437         fprintf(f, "(can throw external) ");
1438     }
1439
1440   fprintf (f, "\n  calls: ");
1441   for (edge = node->callees; edge; edge = edge->next_callee)
1442     {
1443       fprintf (f, "%s/%i ", cgraph_node_name (edge->callee),
1444                edge->callee->uid);
1445       if (!edge->inline_failed)
1446         fprintf(f, "(inlined) ");
1447       if (edge->indirect_call)
1448         fprintf(f, "(indirect) ");
1449       if (edge->count)
1450         fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ",
1451                  (HOST_WIDEST_INT)edge->count);
1452       if (edge->frequency)
1453         fprintf (f, "(%.2f per call) ",
1454                  edge->frequency / (double)CGRAPH_FREQ_BASE);
1455       if (edge->loop_nest)
1456         fprintf (f, "(nested in %i loops) ", edge->loop_nest);
1457       if (edge->can_throw_external)
1458         fprintf(f, "(can throw external) ");
1459     }
1460   fprintf (f, "\n");
1461 }
1462
1463
1464 /* Dump call graph node NODE to stderr.  */
1465
1466 void
1467 debug_cgraph_node (struct cgraph_node *node)
1468 {
1469   dump_cgraph_node (stderr, node);
1470 }
1471
1472
1473 /* Dump the callgraph to file F.  */
1474
1475 void
1476 dump_cgraph (FILE *f)
1477 {
1478   struct cgraph_node *node;
1479
1480   fprintf (f, "callgraph:\n\n");
1481   for (node = cgraph_nodes; node; node = node->next)
1482     dump_cgraph_node (f, node);
1483 }
1484
1485
1486 /* Dump the call graph to stderr.  */
1487
1488 void
1489 debug_cgraph (void)
1490 {
1491   dump_cgraph (stderr);
1492 }
1493
1494
1495 /* Set the DECL_ASSEMBLER_NAME and update cgraph hashtables.  */
1496
1497 void
1498 change_decl_assembler_name (tree decl, tree name)
1499 {
1500   gcc_assert (!assembler_name_hash);
1501   if (!DECL_ASSEMBLER_NAME_SET_P (decl))
1502     {
1503       SET_DECL_ASSEMBLER_NAME (decl, name);
1504       return;
1505     }
1506   if (name == DECL_ASSEMBLER_NAME (decl))
1507     return;
1508
1509   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
1510       && DECL_RTL_SET_P (decl))
1511     warning (0, "%D renamed after being referenced in assembly", decl);
1512
1513   SET_DECL_ASSEMBLER_NAME (decl, name);
1514 }
1515
1516 /* Add a top-level asm statement to the list.  */
1517
1518 struct cgraph_asm_node *
1519 cgraph_add_asm_node (tree asm_str)
1520 {
1521   struct cgraph_asm_node *node;
1522
1523   node = GGC_CNEW (struct cgraph_asm_node);
1524   node->asm_str = asm_str;
1525   node->order = cgraph_order++;
1526   node->next = NULL;
1527   if (cgraph_asm_nodes == NULL)
1528     cgraph_asm_nodes = node;
1529   else
1530     cgraph_asm_last_node->next = node;
1531   cgraph_asm_last_node = node;
1532   return node;
1533 }
1534
1535 /* Return true when the DECL can possibly be inlined.  */
1536 bool
1537 cgraph_function_possibly_inlined_p (tree decl)
1538 {
1539   if (!cgraph_global_info_ready)
1540     return !DECL_UNINLINABLE (decl);
1541   return DECL_POSSIBLY_INLINED (decl);
1542 }
1543
1544 /* Create clone of E in the node N represented by CALL_EXPR the callgraph.  */
1545 struct cgraph_edge *
1546 cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n,
1547                    gimple call_stmt, gcov_type count_scale, int freq_scale,
1548                    int loop_nest, bool update_original)
1549 {
1550   struct cgraph_edge *new_edge;
1551   gcov_type count = e->count * count_scale / REG_BR_PROB_BASE;
1552   gcov_type freq = e->frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE;
1553
1554   if (freq > CGRAPH_FREQ_MAX)
1555     freq = CGRAPH_FREQ_MAX;
1556   new_edge = cgraph_create_edge (n, e->callee, call_stmt, count, freq,
1557                             e->loop_nest + loop_nest);
1558
1559   new_edge->inline_failed = e->inline_failed;
1560   new_edge->indirect_call = e->indirect_call;
1561   if (update_original)
1562     {
1563       e->count -= new_edge->count;
1564       if (e->count < 0)
1565         e->count = 0;
1566     }
1567   cgraph_call_edge_duplication_hooks (e, new_edge);
1568   return new_edge;
1569 }
1570
1571 /* Create node representing clone of N executed COUNT times.  Decrease
1572    the execution counts from original node too.
1573
1574    When UPDATE_ORIGINAL is true, the counts are subtracted from the original
1575    function's profile to reflect the fact that part of execution is handled
1576    by node.  */
1577 struct cgraph_node *
1578 cgraph_clone_node (struct cgraph_node *n, gcov_type count, int freq,
1579                    int loop_nest, bool update_original)
1580 {
1581   struct cgraph_node *new_node = cgraph_create_node ();
1582   struct cgraph_edge *e;
1583   gcov_type count_scale;
1584
1585   new_node->decl = n->decl;
1586   new_node->origin = n->origin;
1587   if (new_node->origin)
1588     {
1589       new_node->next_nested = new_node->origin->nested;
1590       new_node->origin->nested = new_node;
1591     }
1592   new_node->analyzed = n->analyzed;
1593   new_node->local = n->local;
1594   new_node->global = n->global;
1595   new_node->rtl = n->rtl;
1596   new_node->count = count;
1597   new_node->clone = n->clone;
1598   if (n->count)
1599     {
1600       if (new_node->count > n->count)
1601         count_scale = REG_BR_PROB_BASE;
1602       else
1603         count_scale = new_node->count * REG_BR_PROB_BASE / n->count;
1604     }
1605   else
1606     count_scale = 0;
1607   if (update_original)
1608     {
1609       n->count -= count;
1610       if (n->count < 0)
1611         n->count = 0;
1612     }
1613
1614   for (e = n->callees;e; e=e->next_callee)
1615     cgraph_clone_edge (e, new_node, e->call_stmt, count_scale, freq, loop_nest,
1616                        update_original);
1617
1618   new_node->next_sibling_clone = n->clones;
1619   if (n->clones)
1620     n->clones->prev_sibling_clone = new_node;
1621   n->clones = new_node;
1622   new_node->clone_of = n;
1623
1624   cgraph_call_node_duplication_hooks (n, new_node);
1625   return new_node;
1626 }
1627
1628 /* Create a new name for omp child function.  Returns an identifier.  */
1629
1630 static GTY(()) unsigned int clone_fn_id_num;
1631
1632 static tree
1633 clone_function_name (tree decl)
1634 {
1635   tree name = DECL_ASSEMBLER_NAME (decl);
1636   size_t len = IDENTIFIER_LENGTH (name);
1637   char *tmp_name, *prefix;
1638
1639   prefix = XALLOCAVEC (char, len + strlen ("_clone") + 1);
1640   memcpy (prefix, IDENTIFIER_POINTER (name), len);
1641   strcpy (prefix + len, "_clone");
1642 #ifndef NO_DOT_IN_LABEL
1643   prefix[len] = '.';
1644 #elif !defined NO_DOLLAR_IN_LABEL
1645   prefix[len] = '$';
1646 #endif
1647   ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix, clone_fn_id_num++);
1648   return get_identifier (tmp_name);
1649 }
1650
1651 /* Create callgraph node clone with new declaration.  The actual body will
1652    be copied later at compilation stage.  
1653
1654    TODO: after merging in ipa-sra use function call notes instead of args_to_skip
1655    bitmap interface.
1656    */
1657 struct cgraph_node *
1658 cgraph_create_virtual_clone (struct cgraph_node *old_node,
1659                              VEC(cgraph_edge_p,heap) *redirect_callers,
1660                              VEC(ipa_replace_map_p,gc) *tree_map,
1661                              bitmap args_to_skip)
1662 {
1663   tree old_decl = old_node->decl;
1664   struct cgraph_node *new_node = NULL;
1665   tree new_decl;
1666   struct cgraph_node key, **slot;
1667   unsigned i;
1668   struct cgraph_edge *e;
1669
1670   gcc_assert  (tree_versionable_function_p (old_decl));
1671
1672   /* Make a new FUNCTION_DECL tree node */
1673   if (!args_to_skip)
1674     new_decl = copy_node (old_decl);
1675   else
1676     new_decl = build_function_decl_skip_args (old_decl, args_to_skip);
1677   DECL_STRUCT_FUNCTION (new_decl) = NULL;
1678
1679   /* Generate a new name for the new version. */
1680   DECL_NAME (new_decl) = clone_function_name (old_decl);
1681   SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
1682   SET_DECL_RTL (new_decl, NULL);
1683
1684   new_node = cgraph_clone_node (old_node, old_node->count,
1685                                 CGRAPH_FREQ_BASE, 0, false);
1686   new_node->decl = new_decl;
1687   /* Update the properties.
1688      Make clone visible only within this translation unit.  Make sure
1689      that is not weak also.
1690      ??? We cannot use COMDAT linkage because there is no
1691      ABI support for this.  */
1692   DECL_EXTERNAL (new_node->decl) = 0;
1693   DECL_ONE_ONLY (new_node->decl) = 0;
1694   TREE_PUBLIC (new_node->decl) = 0;
1695   DECL_COMDAT (new_node->decl) = 0;
1696   DECL_WEAK (new_node->decl) = 0;
1697   new_node->clone.tree_map = tree_map;
1698   new_node->clone.args_to_skip = args_to_skip;
1699   new_node->local.externally_visible = 0;
1700   new_node->local.local = 1;
1701   new_node->lowered = true;
1702   new_node->reachable = true;
1703
1704   key.decl = new_decl;
1705   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, &key, INSERT);
1706   gcc_assert (!*slot);
1707   *slot = new_node;
1708   if (assembler_name_hash)
1709     {
1710       void **aslot;
1711       tree name = DECL_ASSEMBLER_NAME (new_decl);
1712
1713       aslot = htab_find_slot_with_hash (assembler_name_hash, name,
1714                                         decl_assembler_name_hash (name),
1715                                         INSERT);
1716       gcc_assert (!*aslot);
1717       *aslot = new_node;
1718     }
1719    for (i = 0; VEC_iterate (cgraph_edge_p, redirect_callers, i, e); i++)
1720      {
1721        /* Redirect calls to the old version node to point to its new
1722           version.  */
1723        cgraph_redirect_edge_callee (e, new_node);
1724      }
1725   
1726   return new_node;
1727 }
1728
1729 /* NODE is no longer nested function; update cgraph accordingly.  */
1730 void
1731 cgraph_unnest_node (struct cgraph_node *node)
1732 {
1733   struct cgraph_node **node2 = &node->origin->nested;
1734   gcc_assert (node->origin);
1735
1736   while (*node2 != node)
1737     node2 = &(*node2)->next_nested;
1738   *node2 = node->next_nested;
1739   node->origin = NULL;
1740 }
1741
1742 /* Return function availability.  See cgraph.h for description of individual
1743    return values.  */
1744 enum availability
1745 cgraph_function_body_availability (struct cgraph_node *node)
1746 {
1747   enum availability avail;
1748   gcc_assert (cgraph_function_flags_ready);
1749   if (!node->analyzed)
1750     avail = AVAIL_NOT_AVAILABLE;
1751   else if (node->local.local)
1752     avail = AVAIL_LOCAL;
1753   else if (!node->local.externally_visible)
1754     avail = AVAIL_AVAILABLE;
1755   /* Inline functions are safe to be analyzed even if their sybol can
1756      be overwritten at runtime.  It is not meaningful to enfore any sane
1757      behaviour on replacing inline function by different body.  */
1758   else if (DECL_DECLARED_INLINE_P (node->decl))
1759     avail = AVAIL_AVAILABLE;
1760
1761   /* If the function can be overwritten, return OVERWRITABLE.  Take
1762      care at least of two notable extensions - the COMDAT functions
1763      used to share template instantiations in C++ (this is symmetric
1764      to code cp_cannot_inline_tree_fn and probably shall be shared and
1765      the inlinability hooks completely eliminated).
1766
1767      ??? Does the C++ one definition rule allow us to always return
1768      AVAIL_AVAILABLE here?  That would be good reason to preserve this
1769      bit.  */
1770
1771   else if (DECL_REPLACEABLE_P (node->decl) && !DECL_EXTERNAL (node->decl))
1772     avail = AVAIL_OVERWRITABLE;
1773   else avail = AVAIL_AVAILABLE;
1774
1775   return avail;
1776 }
1777
1778 /* Add the function FNDECL to the call graph.
1779    Unlike cgraph_finalize_function, this function is intended to be used
1780    by middle end and allows insertion of new function at arbitrary point
1781    of compilation.  The function can be either in high, low or SSA form
1782    GIMPLE.
1783
1784    The function is assumed to be reachable and have address taken (so no
1785    API breaking optimizations are performed on it).  
1786
1787    Main work done by this function is to enqueue the function for later
1788    processing to avoid need the passes to be re-entrant.  */
1789
1790 void
1791 cgraph_add_new_function (tree fndecl, bool lowered)
1792 {
1793   struct cgraph_node *node;
1794   switch (cgraph_state)
1795     {
1796       case CGRAPH_STATE_CONSTRUCTION:
1797         /* Just enqueue function to be processed at nearest occurrence.  */
1798         node = cgraph_node (fndecl);
1799         node->next_needed = cgraph_new_nodes;
1800         if (lowered)
1801           node->lowered = true;
1802         cgraph_new_nodes = node;
1803         break;
1804
1805       case CGRAPH_STATE_IPA:
1806       case CGRAPH_STATE_IPA_SSA:
1807       case CGRAPH_STATE_EXPANSION:
1808         /* Bring the function into finalized state and enqueue for later
1809            analyzing and compilation.  */
1810         node = cgraph_node (fndecl);
1811         node->local.local = false;
1812         node->local.finalized = true;
1813         node->reachable = node->needed = true;
1814         if (!lowered && cgraph_state == CGRAPH_STATE_EXPANSION)
1815           {
1816             push_cfun (DECL_STRUCT_FUNCTION (fndecl));
1817             current_function_decl = fndecl;
1818             gimple_register_cfg_hooks ();
1819             tree_lowering_passes (fndecl);
1820             bitmap_obstack_initialize (NULL);
1821             if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
1822               execute_pass_list (pass_early_local_passes.pass.sub);
1823             bitmap_obstack_release (NULL);
1824             pop_cfun ();
1825             current_function_decl = NULL;
1826
1827             lowered = true;
1828           }
1829         if (lowered)
1830           node->lowered = true;
1831         node->next_needed = cgraph_new_nodes;
1832         cgraph_new_nodes = node;
1833         break;
1834
1835       case CGRAPH_STATE_FINISHED:
1836         /* At the very end of compilation we have to do all the work up
1837            to expansion.  */
1838         push_cfun (DECL_STRUCT_FUNCTION (fndecl));
1839         current_function_decl = fndecl;
1840         gimple_register_cfg_hooks ();
1841         if (!lowered)
1842           tree_lowering_passes (fndecl);
1843         bitmap_obstack_initialize (NULL);
1844         if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
1845           execute_pass_list (pass_early_local_passes.pass.sub);
1846         bitmap_obstack_release (NULL);
1847         tree_rest_of_compilation (fndecl);
1848         pop_cfun ();
1849         current_function_decl = NULL;
1850         break;
1851     }
1852 }
1853
1854 #include "gt-cgraph.h"