OSDN Git Service

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