OSDN Git Service

2009-05-07 Paolo Bonzini <bonzini@gnu.org>
[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 "varray.h"
82 #include "output.h"
83 #include "intl.h"
84 #include "gimple.h"
85 #include "tree-dump.h"
86 #include "tree-flow.h"
87 #include "value-prof.h"
88
89 static void cgraph_node_remove_callers (struct cgraph_node *node);
90 static inline void cgraph_edge_remove_caller (struct cgraph_edge *e);
91 static inline void cgraph_edge_remove_callee (struct cgraph_edge *e);
92
93 /* Hash table used to convert declarations into nodes.  */
94 static GTY((param_is (struct cgraph_node))) htab_t cgraph_hash;
95 /* Hash table used to convert assembler names into nodes.  */
96 static GTY((param_is (struct cgraph_node))) htab_t assembler_name_hash;
97
98 /* The linked list of cgraph nodes.  */
99 struct cgraph_node *cgraph_nodes;
100
101 /* Queue of cgraph nodes scheduled to be lowered.  */
102 struct cgraph_node *cgraph_nodes_queue;
103
104 /* Queue of cgraph nodes scheduled to be added into cgraph.  This is a
105    secondary queue used during optimization to accommodate passes that
106    may generate new functions that need to be optimized and expanded.  */
107 struct cgraph_node *cgraph_new_nodes;
108
109 /* Number of nodes in existence.  */
110 int cgraph_n_nodes;
111
112 /* Maximal uid used in cgraph nodes.  */
113 int cgraph_max_uid;
114
115 /* Maximal uid used in cgraph edges.  */
116 int cgraph_edge_max_uid;
117
118 /* Maximal pid used for profiling */
119 int cgraph_max_pid;
120
121 /* Set when whole unit has been analyzed so we can access global info.  */
122 bool cgraph_global_info_ready = false;
123
124 /* What state callgraph is in right now.  */
125 enum cgraph_state cgraph_state = CGRAPH_STATE_CONSTRUCTION;
126
127 /* Set when the cgraph is fully build and the basic flags are computed.  */
128 bool cgraph_function_flags_ready = false;
129
130 /* Linked list of cgraph asm nodes.  */
131 struct cgraph_asm_node *cgraph_asm_nodes;
132
133 /* Last node in cgraph_asm_nodes.  */
134 static GTY(()) struct cgraph_asm_node *cgraph_asm_last_node;
135
136 /* The order index of the next cgraph node to be created.  This is
137    used so that we can sort the cgraph nodes in order by when we saw
138    them, to support -fno-toplevel-reorder.  */
139 int cgraph_order;
140
141 /* List of hooks trigerred on cgraph_edge events.  */
142 struct cgraph_edge_hook_list {
143   cgraph_edge_hook hook;
144   void *data;
145   struct cgraph_edge_hook_list *next;
146 };
147
148 /* List of hooks trigerred on cgraph_node events.  */
149 struct cgraph_node_hook_list {
150   cgraph_node_hook hook;
151   void *data;
152   struct cgraph_node_hook_list *next;
153 };
154
155 /* List of hooks trigerred on events involving two cgraph_edges.  */
156 struct cgraph_2edge_hook_list {
157   cgraph_2edge_hook hook;
158   void *data;
159   struct cgraph_2edge_hook_list *next;
160 };
161
162 /* List of hooks trigerred on events involving two cgraph_nodes.  */
163 struct cgraph_2node_hook_list {
164   cgraph_2node_hook hook;
165   void *data;
166   struct cgraph_2node_hook_list *next;
167 };
168
169 /* List of hooks triggered when an edge is removed.  */
170 struct cgraph_edge_hook_list *first_cgraph_edge_removal_hook;
171 /* List of hooks triggered when a node is removed.  */
172 struct cgraph_node_hook_list *first_cgraph_node_removal_hook;
173 /* List of hooks triggered when an edge is duplicated.  */
174 struct cgraph_2edge_hook_list *first_cgraph_edge_duplicated_hook;
175 /* List of hooks triggered when a node is duplicated.  */
176 struct cgraph_2node_hook_list *first_cgraph_node_duplicated_hook;
177 /* List of hooks triggered when an function is inserted.  */
178 struct cgraph_node_hook_list *first_cgraph_function_insertion_hook;
179
180 /* Head of a linked list of unused (freed) call graph nodes.
181    Do not GTY((delete)) this list so UIDs gets reliably recycled.  */
182 static GTY(()) struct cgraph_node *free_nodes;
183 /* Head of a linked list of unused (freed) call graph edges.
184    Do not GTY((delete)) this list so UIDs gets reliably recycled.  */
185 static GTY(()) struct cgraph_edge *free_edges;
186
187 /* Macros to access the next item in the list of free cgraph nodes and
188    edges. */
189 #define NEXT_FREE_NODE(NODE) (NODE)->next
190 #define NEXT_FREE_EDGE(EDGE) (EDGE)->prev_caller
191
192 /* Register HOOK to be called with DATA on each removed edge.  */
193 struct cgraph_edge_hook_list *
194 cgraph_add_edge_removal_hook (cgraph_edge_hook hook, void *data)
195 {
196   struct cgraph_edge_hook_list *entry;
197   struct cgraph_edge_hook_list **ptr = &first_cgraph_edge_removal_hook;
198
199   entry = (struct cgraph_edge_hook_list *) xmalloc (sizeof (*entry));
200   entry->hook = hook;
201   entry->data = data;
202   entry->next = NULL;
203   while (*ptr)
204     ptr = &(*ptr)->next;
205   *ptr = entry;
206   return entry;
207 }
208
209 /* Remove ENTRY from the list of hooks called on removing edges.  */
210 void
211 cgraph_remove_edge_removal_hook (struct cgraph_edge_hook_list *entry)
212 {
213   struct cgraph_edge_hook_list **ptr = &first_cgraph_edge_removal_hook;
214
215   while (*ptr != entry)
216     ptr = &(*ptr)->next;
217   *ptr = entry->next;
218   free (entry);
219 }
220
221 /* Call all edge removal hooks.  */
222 static void
223 cgraph_call_edge_removal_hooks (struct cgraph_edge *e)
224 {
225   struct cgraph_edge_hook_list *entry = first_cgraph_edge_removal_hook;
226   while (entry)
227   {
228     entry->hook (e, entry->data);
229     entry = entry->next;
230   }
231 }
232
233 /* Register HOOK to be called with DATA on each removed node.  */
234 struct cgraph_node_hook_list *
235 cgraph_add_node_removal_hook (cgraph_node_hook hook, void *data)
236 {
237   struct cgraph_node_hook_list *entry;
238   struct cgraph_node_hook_list **ptr = &first_cgraph_node_removal_hook;
239
240   entry = (struct cgraph_node_hook_list *) xmalloc (sizeof (*entry));
241   entry->hook = hook;
242   entry->data = data;
243   entry->next = NULL;
244   while (*ptr)
245     ptr = &(*ptr)->next;
246   *ptr = entry;
247   return entry;
248 }
249
250 /* Remove ENTRY from the list of hooks called on removing nodes.  */
251 void
252 cgraph_remove_node_removal_hook (struct cgraph_node_hook_list *entry)
253 {
254   struct cgraph_node_hook_list **ptr = &first_cgraph_node_removal_hook;
255
256   while (*ptr != entry)
257     ptr = &(*ptr)->next;
258   *ptr = entry->next;
259   free (entry);
260 }
261
262 /* Call all node removal hooks.  */
263 static void
264 cgraph_call_node_removal_hooks (struct cgraph_node *node)
265 {
266   struct cgraph_node_hook_list *entry = first_cgraph_node_removal_hook;
267   while (entry)
268   {
269     entry->hook (node, entry->data);
270     entry = entry->next;
271   }
272 }
273
274 /* Register HOOK to be called with DATA on each removed node.  */
275 struct cgraph_node_hook_list *
276 cgraph_add_function_insertion_hook (cgraph_node_hook hook, void *data)
277 {
278   struct cgraph_node_hook_list *entry;
279   struct cgraph_node_hook_list **ptr = &first_cgraph_function_insertion_hook;
280
281   entry = (struct cgraph_node_hook_list *) xmalloc (sizeof (*entry));
282   entry->hook = hook;
283   entry->data = data;
284   entry->next = NULL;
285   while (*ptr)
286     ptr = &(*ptr)->next;
287   *ptr = entry;
288   return entry;
289 }
290
291 /* Remove ENTRY from the list of hooks called on removing nodes.  */
292 void
293 cgraph_remove_function_insertion_hook (struct cgraph_node_hook_list *entry)
294 {
295   struct cgraph_node_hook_list **ptr = &first_cgraph_function_insertion_hook;
296
297   while (*ptr != entry)
298     ptr = &(*ptr)->next;
299   *ptr = entry->next;
300   free (entry);
301 }
302
303 /* Call all node removal hooks.  */
304 void
305 cgraph_call_function_insertion_hooks (struct cgraph_node *node)
306 {
307   struct cgraph_node_hook_list *entry = first_cgraph_function_insertion_hook;
308   while (entry)
309   {
310     entry->hook (node, entry->data);
311     entry = entry->next;
312   }
313 }
314
315 /* Register HOOK to be called with DATA on each duplicated edge.  */
316 struct cgraph_2edge_hook_list *
317 cgraph_add_edge_duplication_hook (cgraph_2edge_hook hook, void *data)
318 {
319   struct cgraph_2edge_hook_list *entry;
320   struct cgraph_2edge_hook_list **ptr = &first_cgraph_edge_duplicated_hook;
321
322   entry = (struct cgraph_2edge_hook_list *) xmalloc (sizeof (*entry));
323   entry->hook = hook;
324   entry->data = data;
325   entry->next = NULL;
326   while (*ptr)
327     ptr = &(*ptr)->next;
328   *ptr = entry;
329   return entry;
330 }
331
332 /* Remove ENTRY from the list of hooks called on duplicating edges.  */
333 void
334 cgraph_remove_edge_duplication_hook (struct cgraph_2edge_hook_list *entry)
335 {
336   struct cgraph_2edge_hook_list **ptr = &first_cgraph_edge_duplicated_hook;
337
338   while (*ptr != entry)
339     ptr = &(*ptr)->next;
340   *ptr = entry->next;
341   free (entry);
342 }
343
344 /* Call all edge duplication hooks.  */
345 static void
346 cgraph_call_edge_duplication_hooks (struct cgraph_edge *cs1,
347                                     struct cgraph_edge *cs2)
348 {
349   struct cgraph_2edge_hook_list *entry = first_cgraph_edge_duplicated_hook;
350   while (entry)
351   {
352     entry->hook (cs1, cs2, entry->data);
353     entry = entry->next;
354   }
355 }
356
357 /* Register HOOK to be called with DATA on each duplicated node.  */
358 struct cgraph_2node_hook_list *
359 cgraph_add_node_duplication_hook (cgraph_2node_hook hook, void *data)
360 {
361   struct cgraph_2node_hook_list *entry;
362   struct cgraph_2node_hook_list **ptr = &first_cgraph_node_duplicated_hook;
363
364   entry = (struct cgraph_2node_hook_list *) xmalloc (sizeof (*entry));
365   entry->hook = hook;
366   entry->data = data;
367   entry->next = NULL;
368   while (*ptr)
369     ptr = &(*ptr)->next;
370   *ptr = entry;
371   return entry;
372 }
373
374 /* Remove ENTRY from the list of hooks called on duplicating nodes.  */
375 void
376 cgraph_remove_node_duplication_hook (struct cgraph_2node_hook_list *entry)
377 {
378   struct cgraph_2node_hook_list **ptr = &first_cgraph_node_duplicated_hook;
379
380   while (*ptr != entry)
381     ptr = &(*ptr)->next;
382   *ptr = entry->next;
383   free (entry);
384 }
385
386 /* Call all node duplication hooks.  */
387 static void
388 cgraph_call_node_duplication_hooks (struct cgraph_node *node1,
389                                     struct cgraph_node *node2)
390 {
391   struct cgraph_2node_hook_list *entry = first_cgraph_node_duplicated_hook;
392   while (entry)
393   {
394     entry->hook (node1, node2, entry->data);
395     entry = entry->next;
396   }
397 }
398
399 /* Returns a hash code for P.  */
400
401 static hashval_t
402 hash_node (const void *p)
403 {
404   const struct cgraph_node *n = (const struct cgraph_node *) p;
405   return (hashval_t) DECL_UID (n->decl);
406 }
407
408 /* Returns nonzero if P1 and P2 are equal.  */
409
410 static int
411 eq_node (const void *p1, const void *p2)
412 {
413   const struct cgraph_node *n1 = (const struct cgraph_node *) p1;
414   const struct cgraph_node *n2 = (const struct cgraph_node *) p2;
415   return DECL_UID (n1->decl) == DECL_UID (n2->decl);
416 }
417
418 /* Allocate new callgraph node and insert it into basic data structures.  */
419
420 static struct cgraph_node *
421 cgraph_create_node (void)
422 {
423   struct cgraph_node *node;
424
425   if (free_nodes)
426     {
427       node = free_nodes;
428       free_nodes = NEXT_FREE_NODE (node);
429     }
430   else
431     {
432       node = GGC_CNEW (struct cgraph_node);
433       node->uid = cgraph_max_uid++;
434     }
435
436   node->next = cgraph_nodes;
437   node->pid = -1;
438   node->order = cgraph_order++;
439   if (cgraph_nodes)
440     cgraph_nodes->previous = node;
441   node->previous = NULL;
442   node->global.estimated_growth = INT_MIN;
443   cgraph_nodes = node;
444   cgraph_n_nodes++;
445   return node;
446 }
447
448 /* Return cgraph node assigned to DECL.  Create new one when needed.  */
449
450 struct cgraph_node *
451 cgraph_node (tree decl)
452 {
453   struct cgraph_node key, *node, **slot;
454
455   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
456
457   if (!cgraph_hash)
458     cgraph_hash = htab_create_ggc (10, hash_node, eq_node, NULL);
459
460   key.decl = decl;
461
462   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, &key, INSERT);
463
464   if (*slot)
465     {
466       node = *slot;
467       return node;
468     }
469
470   node = cgraph_create_node ();
471   node->decl = decl;
472   *slot = node;
473   if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
474     {
475       node->origin = cgraph_node (DECL_CONTEXT (decl));
476       node->next_nested = node->origin->nested;
477       node->origin->nested = node;
478     }
479   if (assembler_name_hash)
480     {
481       void **aslot;
482       tree name = DECL_ASSEMBLER_NAME (decl);
483
484       aslot = htab_find_slot_with_hash (assembler_name_hash, name,
485                                         decl_assembler_name_hash (name),
486                                         INSERT);
487       /* We can have multiple declarations with same assembler name. For C++
488          it is __builtin_strlen and strlen, for instance.  Do we need to
489          record them all?  Original implementation marked just first one
490          so lets hope for the best.  */
491       if (*aslot == NULL)
492         *aslot = node;
493     }
494   return node;
495 }
496
497 /* Insert already constructed node into hashtable.  */
498
499 void
500 cgraph_insert_node_to_hashtable (struct cgraph_node *node)
501 {
502   struct cgraph_node **slot;
503
504   slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, node, INSERT);
505
506   gcc_assert (!*slot);
507   *slot = node;
508 }
509
510 /* Returns a hash code for P.  */
511
512 static hashval_t
513 hash_node_by_assembler_name (const void *p)
514 {
515   const struct cgraph_node *n = (const struct cgraph_node *) p;
516   return (hashval_t) decl_assembler_name_hash (DECL_ASSEMBLER_NAME (n->decl));
517 }
518
519 /* Returns nonzero if P1 and P2 are equal.  */
520
521 static int
522 eq_assembler_name (const void *p1, const void *p2)
523 {
524   const struct cgraph_node *n1 = (const struct cgraph_node *) p1;
525   const_tree name = (const_tree)p2;
526   return (decl_assembler_name_equal (n1->decl, name));
527 }
528
529 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
530    Return NULL if there's no such node.  */
531
532 struct cgraph_node *
533 cgraph_node_for_asm (tree asmname)
534 {
535   struct cgraph_node *node;
536   void **slot;
537
538   if (!assembler_name_hash)
539     {
540       assembler_name_hash =
541         htab_create_ggc (10, hash_node_by_assembler_name, eq_assembler_name,
542                          NULL);
543       for (node = cgraph_nodes; node; node = node->next)
544         if (!node->global.inlined_to)
545           {
546             tree name = DECL_ASSEMBLER_NAME (node->decl);
547             slot = htab_find_slot_with_hash (assembler_name_hash, name,
548                                              decl_assembler_name_hash (name),
549                                              INSERT);
550             /* We can have multiple declarations with same assembler name. For C++
551                it is __builtin_strlen and strlen, for instance.  Do we need to
552                record them all?  Original implementation marked just first one
553                so lets hope for the best.  */
554             if (*slot)
555               continue;
556             *slot = node;
557           }
558     }
559
560   slot = htab_find_slot_with_hash (assembler_name_hash, asmname,
561                                    decl_assembler_name_hash (asmname),
562                                    NO_INSERT);
563
564   if (slot)
565     return (struct cgraph_node *) *slot;
566   return NULL;
567 }
568
569 /* Returns a hash value for X (which really is a die_struct).  */
570
571 static hashval_t
572 edge_hash (const void *x)
573 {
574   return htab_hash_pointer (((const struct cgraph_edge *) x)->call_stmt);
575 }
576
577 /* Return nonzero if decl_id of die_struct X is the same as UID of decl *Y.  */
578
579 static int
580 edge_eq (const void *x, const void *y)
581 {
582   return ((const struct cgraph_edge *) x)->call_stmt == y;
583 }
584
585
586 /* Return the callgraph edge representing the GIMPLE_CALL statement
587    CALL_STMT.  */
588
589 struct cgraph_edge *
590 cgraph_edge (struct cgraph_node *node, gimple call_stmt)
591 {
592   struct cgraph_edge *e, *e2;
593   int n = 0;
594
595   if (node->call_site_hash)
596     return (struct cgraph_edge *)
597       htab_find_with_hash (node->call_site_hash, call_stmt,
598                            htab_hash_pointer (call_stmt));
599
600   /* This loop may turn out to be performance problem.  In such case adding
601      hashtables into call nodes with very many edges is probably best
602      solution.  It is not good idea to add pointer into CALL_EXPR itself
603      because we want to make possible having multiple cgraph nodes representing
604      different clones of the same body before the body is actually cloned.  */
605   for (e = node->callees; e; e= e->next_callee)
606     {
607       if (e->call_stmt == call_stmt)
608         break;
609       n++;
610     }
611
612   if (n > 100)
613     {
614       node->call_site_hash = htab_create_ggc (120, edge_hash, edge_eq, NULL);
615       for (e2 = node->callees; e2; e2 = e2->next_callee)
616         {
617           void **slot;
618           slot = htab_find_slot_with_hash (node->call_site_hash,
619                                            e2->call_stmt,
620                                            htab_hash_pointer (e2->call_stmt),
621                                            INSERT);
622           gcc_assert (!*slot);
623           *slot = e2;
624         }
625     }
626
627   return e;
628 }
629
630
631 /* Change field call_smt of edge E to NEW_STMT.  */
632
633 void
634 cgraph_set_call_stmt (struct cgraph_edge *e, gimple new_stmt)
635 {
636   if (e->caller->call_site_hash)
637     {
638       htab_remove_elt_with_hash (e->caller->call_site_hash,
639                                  e->call_stmt,
640                                  htab_hash_pointer (e->call_stmt));
641     }
642   e->call_stmt = new_stmt;
643   push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
644   e->can_throw_external = stmt_can_throw_external (new_stmt);
645   pop_cfun ();
646   if (e->caller->call_site_hash)
647     {
648       void **slot;
649       slot = htab_find_slot_with_hash (e->caller->call_site_hash,
650                                        e->call_stmt,
651                                        htab_hash_pointer
652                                        (e->call_stmt), INSERT);
653       gcc_assert (!*slot);
654       *slot = e;
655     }
656 }
657
658 /* Give initial reasons why inlining would fail on EDGE.  This gets either
659    nullified or usually overwritten by more precise reasons later.  */
660
661 static void
662 initialize_inline_failed (struct cgraph_edge *e)
663 {
664   struct cgraph_node *callee = e->callee;
665
666   if (!callee->analyzed)
667     e->inline_failed = CIF_BODY_NOT_AVAILABLE;
668   else if (callee->local.redefined_extern_inline)
669     e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
670   else if (!callee->local.inlinable)
671     e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
672   else if (gimple_call_cannot_inline_p (e->call_stmt))
673     e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
674   else
675     e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
676 }
677
678 /* Create edge from CALLER to CALLEE in the cgraph.  */
679
680 struct cgraph_edge *
681 cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
682                     gimple call_stmt, gcov_type count, int freq, int nest)
683 {
684   struct cgraph_edge *edge;
685
686 #ifdef ENABLE_CHECKING
687   /* This is rather pricely check possibly trigerring construction of call stmt
688      hashtable.  */
689   gcc_assert (!cgraph_edge (caller, call_stmt));
690 #endif
691
692   gcc_assert (is_gimple_call (call_stmt));
693
694   if (free_edges)
695     {
696       edge = free_edges;
697       free_edges = NEXT_FREE_EDGE (edge);
698     }
699   else
700     {
701       edge = GGC_NEW (struct cgraph_edge);
702       edge->uid = cgraph_edge_max_uid++;
703     }
704
705   edge->aux = NULL;
706
707   edge->caller = caller;
708   edge->callee = callee;
709   edge->call_stmt = call_stmt;
710   push_cfun (DECL_STRUCT_FUNCTION (caller->decl));
711   edge->can_throw_external = stmt_can_throw_external (call_stmt);
712   pop_cfun ();
713   edge->prev_caller = NULL;
714   edge->next_caller = callee->callers;
715   if (callee->callers)
716     callee->callers->prev_caller = edge;
717   edge->prev_callee = NULL;
718   edge->next_callee = caller->callees;
719   if (caller->callees)
720     caller->callees->prev_callee = edge;
721   caller->callees = edge;
722   callee->callers = edge;
723   edge->count = count;
724   gcc_assert (count >= 0);
725   edge->frequency = freq;
726   gcc_assert (freq >= 0);
727   gcc_assert (freq <= CGRAPH_FREQ_MAX);
728   edge->loop_nest = nest;
729   edge->indirect_call = 0;
730   if (caller->call_site_hash)
731     {
732       void **slot;
733       slot = htab_find_slot_with_hash (caller->call_site_hash,
734                                        edge->call_stmt,
735                                        htab_hash_pointer
736                                          (edge->call_stmt),
737                                        INSERT);
738       gcc_assert (!*slot);
739       *slot = edge;
740     }
741
742   initialize_inline_failed (edge);
743
744   return edge;
745 }
746
747 /* Remove the edge E from the list of the callers of the callee.  */
748
749 static inline void
750 cgraph_edge_remove_callee (struct cgraph_edge *e)
751 {
752   if (e->prev_caller)
753     e->prev_caller->next_caller = e->next_caller;
754   if (e->next_caller)
755     e->next_caller->prev_caller = e->prev_caller;
756   if (!e->prev_caller)
757     e->callee->callers = e->next_caller;
758 }
759
760 /* Remove the edge E from the list of the callees of the caller.  */
761
762 static inline void
763 cgraph_edge_remove_caller (struct cgraph_edge *e)
764 {
765   if (e->prev_callee)
766     e->prev_callee->next_callee = e->next_callee;
767   if (e->next_callee)
768     e->next_callee->prev_callee = e->prev_callee;
769   if (!e->prev_callee)
770     e->caller->callees = e->next_callee;
771   if (e->caller->call_site_hash)
772     htab_remove_elt_with_hash (e->caller->call_site_hash,
773                                e->call_stmt,
774                                htab_hash_pointer (e->call_stmt));
775 }
776
777 /* Put the edge onto the free list.  */
778
779 static void
780 cgraph_free_edge (struct cgraph_edge *e)
781 {
782   int uid = e->uid;
783
784   /* Clear out the edge so we do not dangle pointers.  */
785   memset (e, 0, sizeof (*e));
786   e->uid = uid;
787   NEXT_FREE_EDGE (e) = free_edges;
788   free_edges = e;
789 }
790
791 /* Remove the edge E in the cgraph.  */
792
793 void
794 cgraph_remove_edge (struct cgraph_edge *e)
795 {
796   /* Call all edge removal hooks.  */
797   cgraph_call_edge_removal_hooks (e);
798
799   /* Remove from callers list of the callee.  */
800   cgraph_edge_remove_callee (e);
801
802   /* Remove from callees list of the callers.  */
803   cgraph_edge_remove_caller (e);
804
805   /* Put the edge onto the free list.  */
806   cgraph_free_edge (e);
807 }
808
809 /* Redirect callee of E to N.  The function does not update underlying
810    call expression.  */
811
812 void
813 cgraph_redirect_edge_callee (struct cgraph_edge *e, struct cgraph_node *n)
814 {
815   /* Remove from callers list of the current callee.  */
816   cgraph_edge_remove_callee (e);
817
818   /* Insert to callers list of the new callee.  */
819   e->prev_caller = NULL;
820   if (n->callers)
821     n->callers->prev_caller = e;
822   e->next_caller = n->callers;
823   n->callers = e;
824   e->callee = n;
825 }
826
827
828 /* Update or remove the corresponding cgraph edge if a GIMPLE_CALL
829    OLD_STMT changed into NEW_STMT.  */
830
831 void
832 cgraph_update_edges_for_call_stmt (gimple old_stmt, gimple new_stmt)
833 {
834   tree new_call = (is_gimple_call (new_stmt)) ? gimple_call_fn (new_stmt) : 0;
835   tree old_call = (is_gimple_call (old_stmt)) ? gimple_call_fn (old_stmt) : 0;
836   struct cgraph_node *node = cgraph_node (cfun->decl);
837
838   if (old_call != new_call)
839     {
840       struct cgraph_edge *e = cgraph_edge (node, old_stmt);
841       struct cgraph_edge *ne = NULL;
842       tree new_decl;
843
844       if (e)
845         {
846           gcov_type count = e->count;
847           int frequency = e->frequency;
848           int loop_nest = e->loop_nest;
849
850           cgraph_remove_edge (e);
851           if (new_call)
852             {
853               new_decl = gimple_call_fndecl (new_stmt);
854               if (new_decl)
855                 {
856                   ne = cgraph_create_edge (node, cgraph_node (new_decl),
857                                            new_stmt, count, frequency,
858                                            loop_nest);
859                   gcc_assert (ne->inline_failed);
860                 }
861             }
862         }
863     }
864   else if (old_stmt != new_stmt)
865     {
866       struct cgraph_edge *e = cgraph_edge (node, old_stmt);
867
868       if (e)
869         cgraph_set_call_stmt (e, new_stmt);
870     }
871 }
872
873
874 /* Remove all callees from the node.  */
875
876 void
877 cgraph_node_remove_callees (struct cgraph_node *node)
878 {
879   struct cgraph_edge *e, *f;
880
881   /* It is sufficient to remove the edges from the lists of callers of
882      the callees.  The callee list of the node can be zapped with one
883      assignment.  */
884   for (e = node->callees; e; e = f)
885     {
886       f = e->next_callee;
887       cgraph_call_edge_removal_hooks (e);
888       cgraph_edge_remove_callee (e);
889       cgraph_free_edge (e);
890     }
891   node->callees = NULL;
892   if (node->call_site_hash)
893     {
894       htab_delete (node->call_site_hash);
895       node->call_site_hash = NULL;
896     }
897 }
898
899 /* Remove all callers from the node.  */
900
901 static void
902 cgraph_node_remove_callers (struct cgraph_node *node)
903 {
904   struct cgraph_edge *e, *f;
905
906   /* It is sufficient to remove the edges from the lists of callees of
907      the callers.  The caller list of the node can be zapped with one
908      assignment.  */
909   for (e = node->callers; e; e = f)
910     {
911       f = e->next_caller;
912       cgraph_call_edge_removal_hooks (e);
913       cgraph_edge_remove_caller (e);
914       cgraph_free_edge (e);
915     }
916   node->callers = NULL;
917 }
918
919 /* Release memory used to represent body of function NODE.  */
920
921 void
922 cgraph_release_function_body (struct cgraph_node *node)
923 {
924   if (DECL_STRUCT_FUNCTION (node->decl))
925     {
926       tree old_decl = current_function_decl;
927       push_cfun (DECL_STRUCT_FUNCTION (node->decl));
928       if (cfun->gimple_df)
929         {
930           current_function_decl = node->decl;
931           delete_tree_ssa ();
932           delete_tree_cfg_annotations ();
933           cfun->eh = NULL;
934           current_function_decl = old_decl;
935         }
936       if (cfun->cfg)
937         {
938           gcc_assert (dom_computed[0] == DOM_NONE);
939           gcc_assert (dom_computed[1] == DOM_NONE);
940           clear_edges ();
941         }
942       if (cfun->value_histograms)
943         free_histograms ();
944       gcc_assert (!current_loops);
945       pop_cfun();
946       gimple_set_body (node->decl, NULL);
947       VEC_free (ipa_opt_pass, heap,
948                 DECL_STRUCT_FUNCTION (node->decl)->ipa_transforms_to_apply);
949       /* Struct function hangs a lot of data that would leak if we didn't
950          removed all pointers to it.   */
951       ggc_free (DECL_STRUCT_FUNCTION (node->decl));
952       DECL_STRUCT_FUNCTION (node->decl) = NULL;
953     }
954   DECL_SAVED_TREE (node->decl) = NULL;
955   /* If the node is abstract and needed, then do not clear DECL_INITIAL
956      of its associated function function declaration because it's
957      needed to emit debug info later.  */
958   if (!node->abstract_and_needed)
959     DECL_INITIAL (node->decl) = error_mark_node;
960 }
961
962 /* Remove the node from cgraph.  */
963
964 void
965 cgraph_remove_node (struct cgraph_node *node)
966 {
967   void **slot;
968   bool kill_body = false;
969   struct cgraph_node *n;
970   int uid = node->uid;
971
972   cgraph_call_node_removal_hooks (node);
973   cgraph_node_remove_callers (node);
974   cgraph_node_remove_callees (node);
975
976   /* Incremental inlining access removed nodes stored in the postorder list.
977      */
978   node->needed = node->reachable = false;
979   for (n = node->nested; n; n = n->next_nested)
980     n->origin = NULL;
981   node->nested = NULL;
982   if (node->origin)
983     {
984       struct cgraph_node **node2 = &node->origin->nested;
985
986       while (*node2 != node)
987         node2 = &(*node2)->next_nested;
988       *node2 = node->next_nested;
989     }
990   if (node->previous)
991     node->previous->next = node->next;
992   else
993     cgraph_nodes = node->next;
994   if (node->next)
995     node->next->previous = node->previous;
996   node->next = NULL;
997   node->previous = NULL;
998   slot = htab_find_slot (cgraph_hash, node, NO_INSERT);
999   if (*slot == node)
1000     {
1001       if (node->next_clone)
1002       {
1003         struct cgraph_node *new_node = node->next_clone;
1004
1005         *slot = new_node;
1006         node->next_clone->prev_clone = NULL;
1007       }
1008       else
1009         {
1010           htab_clear_slot (cgraph_hash, slot);
1011           kill_body = true;
1012         }
1013     }
1014   else
1015     {
1016       node->prev_clone->next_clone = node->next_clone;
1017       if (node->next_clone)
1018         node->next_clone->prev_clone = node->prev_clone;
1019     }
1020
1021   /* While all the clones are removed after being proceeded, the function
1022      itself is kept in the cgraph even after it is compiled.  Check whether
1023      we are done with this body and reclaim it proactively if this is the case.
1024      */
1025   if (!kill_body && *slot)
1026     {
1027       struct cgraph_node *n = (struct cgraph_node *) *slot;
1028       if (!n->next_clone && !n->global.inlined_to
1029           && (cgraph_global_info_ready
1030               && (TREE_ASM_WRITTEN (n->decl) || DECL_EXTERNAL (n->decl))))
1031         kill_body = true;
1032     }
1033   if (assembler_name_hash)
1034     {
1035       tree name = DECL_ASSEMBLER_NAME (node->decl);
1036       slot = htab_find_slot_with_hash (assembler_name_hash, name,
1037                                        decl_assembler_name_hash (name),
1038                                        NO_INSERT);
1039       /* Inline clones are not hashed.  */
1040       if (slot && *slot == node)
1041         htab_clear_slot (assembler_name_hash, slot);
1042     }
1043
1044   if (kill_body)
1045     cgraph_release_function_body (node);
1046   node->decl = NULL;
1047   if (node->call_site_hash)
1048     {
1049       htab_delete (node->call_site_hash);
1050       node->call_site_hash = NULL;
1051     }
1052   cgraph_n_nodes--;
1053
1054   /* Clear out the node to NULL all pointers and add the node to the free
1055      list.  */
1056   memset (node, 0, sizeof(*node));
1057   node->uid = uid;
1058   NEXT_FREE_NODE (node) = free_nodes;
1059   free_nodes = node;
1060 }
1061
1062 /* Notify finalize_compilation_unit that given node is reachable.  */
1063
1064 void
1065 cgraph_mark_reachable_node (struct cgraph_node *node)
1066 {
1067   if (!node->reachable && node->local.finalized)
1068     {
1069       notice_global_symbol (node->decl);
1070       node->reachable = 1;
1071       gcc_assert (!cgraph_global_info_ready);
1072
1073       node->next_needed = cgraph_nodes_queue;
1074       cgraph_nodes_queue = node;
1075     }
1076 }
1077
1078 /* Likewise indicate that a node is needed, i.e. reachable via some
1079    external means.  */
1080
1081 void
1082 cgraph_mark_needed_node (struct cgraph_node *node)
1083 {
1084   node->needed = 1;
1085   cgraph_mark_reachable_node (node);
1086 }
1087
1088 /* Return local info for the compiled function.  */
1089
1090 struct cgraph_local_info *
1091 cgraph_local_info (tree decl)
1092 {
1093   struct cgraph_node *node;
1094
1095   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1096   node = cgraph_node (decl);
1097   return &node->local;
1098 }
1099
1100 /* Return local info for the compiled function.  */
1101
1102 struct cgraph_global_info *
1103 cgraph_global_info (tree decl)
1104 {
1105   struct cgraph_node *node;
1106
1107   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL && cgraph_global_info_ready);
1108   node = cgraph_node (decl);
1109   return &node->global;
1110 }
1111
1112 /* Return local info for the compiled function.  */
1113
1114 struct cgraph_rtl_info *
1115 cgraph_rtl_info (tree decl)
1116 {
1117   struct cgraph_node *node;
1118
1119   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1120   node = cgraph_node (decl);
1121   if (decl != current_function_decl
1122       && !TREE_ASM_WRITTEN (node->decl))
1123     return NULL;
1124   return &node->rtl;
1125 }
1126
1127 /* Return a string describing the failure REASON.  */
1128
1129 const char*
1130 cgraph_inline_failed_string (cgraph_inline_failed_t reason)
1131 {
1132 #undef DEFCIFCODE
1133 #define DEFCIFCODE(code, string)        string,
1134
1135   static const char *cif_string_table[CIF_N_REASONS] = {
1136 #include "cif-code.def"
1137   };
1138
1139   /* Signedness of an enum type is implementation defined, so cast it
1140      to unsigned before testing. */
1141   gcc_assert ((unsigned) reason < CIF_N_REASONS);
1142   return cif_string_table[reason];
1143 }
1144
1145 /* Return name of the node used in debug output.  */
1146 const char *
1147 cgraph_node_name (struct cgraph_node *node)
1148 {
1149   return lang_hooks.decl_printable_name (node->decl, 2);
1150 }
1151
1152 /* Names used to print out the availability enum.  */
1153 const char * const cgraph_availability_names[] =
1154   {"unset", "not_available", "overwritable", "available", "local"};
1155
1156
1157 /* Dump call graph node NODE to file F.  */
1158
1159 void
1160 dump_cgraph_node (FILE *f, struct cgraph_node *node)
1161 {
1162   struct cgraph_edge *edge;
1163   fprintf (f, "%s/%i(%i) [%p]:", cgraph_node_name (node), node->uid,
1164            node->pid, (void *) node);
1165   if (node->global.inlined_to)
1166     fprintf (f, " (inline copy in %s/%i)",
1167              cgraph_node_name (node->global.inlined_to),
1168              node->global.inlined_to->uid);
1169   if (cgraph_function_flags_ready)
1170     fprintf (f, " availability:%s",
1171              cgraph_availability_names [cgraph_function_body_availability (node)]);
1172   if (node->count)
1173     fprintf (f, " executed "HOST_WIDEST_INT_PRINT_DEC"x",
1174              (HOST_WIDEST_INT)node->count);
1175   if (node->local.inline_summary.self_insns)
1176     fprintf (f, " %i insns", node->local.inline_summary.self_insns);
1177   if (node->global.insns && node->global.insns
1178       != node->local.inline_summary.self_insns)
1179     fprintf (f, " (%i after inlining)", node->global.insns);
1180   if (node->local.inline_summary.estimated_self_stack_size)
1181     fprintf (f, " %i bytes stack usage", (int)node->local.inline_summary.estimated_self_stack_size);
1182   if (node->global.estimated_stack_size != node->local.inline_summary.estimated_self_stack_size)
1183     fprintf (f, " %i bytes after inlining", (int)node->global.estimated_stack_size);
1184   if (node->origin)
1185     fprintf (f, " nested in: %s", cgraph_node_name (node->origin));
1186   if (node->needed)
1187     fprintf (f, " needed");
1188   else if (node->reachable)
1189     fprintf (f, " reachable");
1190   if (gimple_has_body_p (node->decl))
1191     fprintf (f, " body");
1192   if (node->process)
1193     fprintf (f, " process");
1194   if (node->local.local)
1195     fprintf (f, " local");
1196   if (node->local.externally_visible)
1197     fprintf (f, " externally_visible");
1198   if (node->local.finalized)
1199     fprintf (f, " finalized");
1200   if (node->local.disregard_inline_limits)
1201     fprintf (f, " always_inline");
1202   else if (node->local.inlinable)
1203     fprintf (f, " inlinable");
1204   if (node->local.redefined_extern_inline)
1205     fprintf (f, " redefined_extern_inline");
1206   if (TREE_ASM_WRITTEN (node->decl))
1207     fprintf (f, " asm_written");
1208
1209   fprintf (f, "\n  called by: ");
1210   for (edge = node->callers; edge; edge = edge->next_caller)
1211     {
1212       fprintf (f, "%s/%i ", cgraph_node_name (edge->caller),
1213                edge->caller->uid);
1214       if (edge->count)
1215         fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ",
1216                  (HOST_WIDEST_INT)edge->count);
1217       if (edge->frequency)
1218         fprintf (f, "(%.2f per call) ",
1219                  edge->frequency / (double)CGRAPH_FREQ_BASE);
1220       if (!edge->inline_failed)
1221         fprintf(f, "(inlined) ");
1222       if (edge->indirect_call)
1223         fprintf(f, "(indirect) ");
1224       if (edge->can_throw_external)
1225         fprintf(f, "(can throw external) ");
1226     }
1227
1228   fprintf (f, "\n  calls: ");
1229   for (edge = node->callees; edge; edge = edge->next_callee)
1230     {
1231       fprintf (f, "%s/%i ", cgraph_node_name (edge->callee),
1232                edge->callee->uid);
1233       if (!edge->inline_failed)
1234         fprintf(f, "(inlined) ");
1235       if (edge->indirect_call)
1236         fprintf(f, "(indirect) ");
1237       if (edge->count)
1238         fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ",
1239                  (HOST_WIDEST_INT)edge->count);
1240       if (edge->frequency)
1241         fprintf (f, "(%.2f per call) ",
1242                  edge->frequency / (double)CGRAPH_FREQ_BASE);
1243       if (edge->loop_nest)
1244         fprintf (f, "(nested in %i loops) ", edge->loop_nest);
1245       if (edge->can_throw_external)
1246         fprintf(f, "(can throw external) ");
1247     }
1248   fprintf (f, "\n");
1249 }
1250
1251
1252 /* Dump call graph node NODE to stderr.  */
1253
1254 void
1255 debug_cgraph_node (struct cgraph_node *node)
1256 {
1257   dump_cgraph_node (stderr, node);
1258 }
1259
1260
1261 /* Dump the callgraph to file F.  */
1262
1263 void
1264 dump_cgraph (FILE *f)
1265 {
1266   struct cgraph_node *node;
1267
1268   fprintf (f, "callgraph:\n\n");
1269   for (node = cgraph_nodes; node; node = node->next)
1270     dump_cgraph_node (f, node);
1271 }
1272
1273
1274 /* Dump the call graph to stderr.  */
1275
1276 void
1277 debug_cgraph (void)
1278 {
1279   dump_cgraph (stderr);
1280 }
1281
1282
1283 /* Set the DECL_ASSEMBLER_NAME and update cgraph hashtables.  */
1284
1285 void
1286 change_decl_assembler_name (tree decl, tree name)
1287 {
1288   gcc_assert (!assembler_name_hash);
1289   if (!DECL_ASSEMBLER_NAME_SET_P (decl))
1290     {
1291       SET_DECL_ASSEMBLER_NAME (decl, name);
1292       return;
1293     }
1294   if (name == DECL_ASSEMBLER_NAME (decl))
1295     return;
1296
1297   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
1298       && DECL_RTL_SET_P (decl))
1299     warning (0, "%D renamed after being referenced in assembly", decl);
1300
1301   SET_DECL_ASSEMBLER_NAME (decl, name);
1302 }
1303
1304 /* Add a top-level asm statement to the list.  */
1305
1306 struct cgraph_asm_node *
1307 cgraph_add_asm_node (tree asm_str)
1308 {
1309   struct cgraph_asm_node *node;
1310
1311   node = GGC_CNEW (struct cgraph_asm_node);
1312   node->asm_str = asm_str;
1313   node->order = cgraph_order++;
1314   node->next = NULL;
1315   if (cgraph_asm_nodes == NULL)
1316     cgraph_asm_nodes = node;
1317   else
1318     cgraph_asm_last_node->next = node;
1319   cgraph_asm_last_node = node;
1320   return node;
1321 }
1322
1323 /* Return true when the DECL can possibly be inlined.  */
1324 bool
1325 cgraph_function_possibly_inlined_p (tree decl)
1326 {
1327   if (!cgraph_global_info_ready)
1328     return !DECL_UNINLINABLE (decl);
1329   return DECL_POSSIBLY_INLINED (decl);
1330 }
1331
1332 /* Create clone of E in the node N represented by CALL_EXPR the callgraph.  */
1333 struct cgraph_edge *
1334 cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n,
1335                    gimple call_stmt, gcov_type count_scale, int freq_scale,
1336                    int loop_nest, bool update_original)
1337 {
1338   struct cgraph_edge *new_edge;
1339   gcov_type count = e->count * count_scale / REG_BR_PROB_BASE;
1340   gcov_type freq = e->frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE;
1341
1342   if (freq > CGRAPH_FREQ_MAX)
1343     freq = CGRAPH_FREQ_MAX;
1344   new_edge = cgraph_create_edge (n, e->callee, call_stmt, count, freq,
1345                             e->loop_nest + loop_nest);
1346
1347   new_edge->inline_failed = e->inline_failed;
1348   new_edge->indirect_call = e->indirect_call;
1349   if (update_original)
1350     {
1351       e->count -= new_edge->count;
1352       if (e->count < 0)
1353         e->count = 0;
1354     }
1355   cgraph_call_edge_duplication_hooks (e, new_edge);
1356   return new_edge;
1357 }
1358
1359 /* Create node representing clone of N executed COUNT times.  Decrease
1360    the execution counts from original node too.
1361
1362    When UPDATE_ORIGINAL is true, the counts are subtracted from the original
1363    function's profile to reflect the fact that part of execution is handled
1364    by node.  */
1365 struct cgraph_node *
1366 cgraph_clone_node (struct cgraph_node *n, gcov_type count, int freq,
1367                    int loop_nest, bool update_original)
1368 {
1369   struct cgraph_node *new_node = cgraph_create_node ();
1370   struct cgraph_edge *e;
1371   gcov_type count_scale;
1372
1373   new_node->decl = n->decl;
1374   new_node->origin = n->origin;
1375   if (new_node->origin)
1376     {
1377       new_node->next_nested = new_node->origin->nested;
1378       new_node->origin->nested = new_node;
1379     }
1380   new_node->analyzed = n->analyzed;
1381   new_node->local = n->local;
1382   new_node->global = n->global;
1383   new_node->rtl = n->rtl;
1384   new_node->count = count;
1385   if (n->count)
1386     {
1387       if (new_node->count > n->count)
1388         count_scale = REG_BR_PROB_BASE;
1389       else
1390         count_scale = new_node->count * REG_BR_PROB_BASE / n->count;
1391     }
1392   else
1393     count_scale = 0;
1394   if (update_original)
1395     {
1396       n->count -= count;
1397       if (n->count < 0)
1398         n->count = 0;
1399     }
1400
1401   for (e = n->callees;e; e=e->next_callee)
1402     cgraph_clone_edge (e, new_node, e->call_stmt, count_scale, freq, loop_nest,
1403                        update_original);
1404
1405   new_node->next_clone = n->next_clone;
1406   new_node->prev_clone = n;
1407   n->next_clone = new_node;
1408   if (new_node->next_clone)
1409     new_node->next_clone->prev_clone = new_node;
1410
1411   cgraph_call_node_duplication_hooks (n, new_node);
1412   return new_node;
1413 }
1414
1415 /* NODE is no longer nested function; update cgraph accordingly.  */
1416 void
1417 cgraph_unnest_node (struct cgraph_node *node)
1418 {
1419   struct cgraph_node **node2 = &node->origin->nested;
1420   gcc_assert (node->origin);
1421
1422   while (*node2 != node)
1423     node2 = &(*node2)->next_nested;
1424   *node2 = node->next_nested;
1425   node->origin = NULL;
1426 }
1427
1428 /* Return function availability.  See cgraph.h for description of individual
1429    return values.  */
1430 enum availability
1431 cgraph_function_body_availability (struct cgraph_node *node)
1432 {
1433   enum availability avail;
1434   gcc_assert (cgraph_function_flags_ready);
1435   if (!node->analyzed)
1436     avail = AVAIL_NOT_AVAILABLE;
1437   else if (node->local.local)
1438     avail = AVAIL_LOCAL;
1439   else if (!node->local.externally_visible)
1440     avail = AVAIL_AVAILABLE;
1441   /* Inline functions are safe to be analyzed even if their sybol can
1442      be overwritten at runtime.  It is not meaningful to enfore any sane
1443      behaviour on replacing inline function by different body.  */
1444   else if (DECL_DECLARED_INLINE_P (node->decl))
1445     avail = AVAIL_AVAILABLE;
1446
1447   /* If the function can be overwritten, return OVERWRITABLE.  Take
1448      care at least of two notable extensions - the COMDAT functions
1449      used to share template instantiations in C++ (this is symmetric
1450      to code cp_cannot_inline_tree_fn and probably shall be shared and
1451      the inlinability hooks completely eliminated).
1452
1453      ??? Does the C++ one definition rule allow us to always return
1454      AVAIL_AVAILABLE here?  That would be good reason to preserve this
1455      bit.  */
1456
1457   else if (DECL_REPLACEABLE_P (node->decl) && !DECL_EXTERNAL (node->decl))
1458     avail = AVAIL_OVERWRITABLE;
1459   else avail = AVAIL_AVAILABLE;
1460
1461   return avail;
1462 }
1463
1464 /* Add the function FNDECL to the call graph.
1465    Unlike cgraph_finalize_function, this function is intended to be used
1466    by middle end and allows insertion of new function at arbitrary point
1467    of compilation.  The function can be either in high, low or SSA form
1468    GIMPLE.
1469
1470    The function is assumed to be reachable and have address taken (so no
1471    API breaking optimizations are performed on it).  
1472
1473    Main work done by this function is to enqueue the function for later
1474    processing to avoid need the passes to be re-entrant.  */
1475
1476 void
1477 cgraph_add_new_function (tree fndecl, bool lowered)
1478 {
1479   struct cgraph_node *node;
1480   switch (cgraph_state)
1481     {
1482       case CGRAPH_STATE_CONSTRUCTION:
1483         /* Just enqueue function to be processed at nearest occurrence.  */
1484         node = cgraph_node (fndecl);
1485         node->next_needed = cgraph_new_nodes;
1486         if (lowered)
1487           node->lowered = true;
1488         cgraph_new_nodes = node;
1489         break;
1490
1491       case CGRAPH_STATE_IPA:
1492       case CGRAPH_STATE_IPA_SSA:
1493       case CGRAPH_STATE_EXPANSION:
1494         /* Bring the function into finalized state and enqueue for later
1495            analyzing and compilation.  */
1496         node = cgraph_node (fndecl);
1497         node->local.local = false;
1498         node->local.finalized = true;
1499         node->reachable = node->needed = true;
1500         if (!lowered && cgraph_state == CGRAPH_STATE_EXPANSION)
1501           {
1502             push_cfun (DECL_STRUCT_FUNCTION (fndecl));
1503             current_function_decl = fndecl;
1504             gimple_register_cfg_hooks ();
1505             tree_lowering_passes (fndecl);
1506             bitmap_obstack_initialize (NULL);
1507             if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
1508               execute_pass_list (pass_early_local_passes.pass.sub);
1509             bitmap_obstack_release (NULL);
1510             pop_cfun ();
1511             current_function_decl = NULL;
1512
1513             lowered = true;
1514           }
1515         if (lowered)
1516           node->lowered = true;
1517         node->next_needed = cgraph_new_nodes;
1518         cgraph_new_nodes = node;
1519         break;
1520
1521       case CGRAPH_STATE_FINISHED:
1522         /* At the very end of compilation we have to do all the work up
1523            to expansion.  */
1524         push_cfun (DECL_STRUCT_FUNCTION (fndecl));
1525         current_function_decl = fndecl;
1526         gimple_register_cfg_hooks ();
1527         if (!lowered)
1528           tree_lowering_passes (fndecl);
1529         bitmap_obstack_initialize (NULL);
1530         if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
1531           execute_pass_list (pass_early_local_passes.pass.sub);
1532         bitmap_obstack_release (NULL);
1533         tree_rest_of_compilation (fndecl);
1534         pop_cfun ();
1535         current_function_decl = NULL;
1536         break;
1537     }
1538 }
1539
1540 #include "gt-cgraph.h"