OSDN Git Service

2005-05-24 Andrew Pinski <pinskia@physics.uc.edu>
[pf3gnuchains/gcc-fork.git] / gcc / cgraphunit.c
1 /* Callgraph based intraprocedural optimizations.
2    Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
3    Contributed by Jan Hubicka
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 /* This module implements main driver of compilation process as well as
23    few basic intraprocedural optimizers.
24
25    The main scope of this file is to act as an interface in between
26    tree based frontends and the backend (and middle end)
27
28    The front-end is supposed to use following functionality:
29
30     - cgraph_finalize_function
31
32       This function is called once front-end has parsed whole body of function
33       and it is certain that the function body nor the declaration will change.
34
35       (There is one exception needed for implementing GCC extern inline function.)
36
37     - cgraph_varpool_finalize_variable
38
39       This function has same behavior as the above but is used for static
40       variables.
41
42     - cgraph_finalize_compilation_unit
43
44       This function is called once compilation unit is finalized and it will
45       no longer change.
46
47       In the unit-at-a-time the call-graph construction and local function
48       analysis takes place here.  Bodies of unreachable functions are released
49       to conserve memory usage.
50
51       ???  The compilation unit in this point of view should be compilation
52       unit as defined by the language - for instance C frontend allows multiple
53       compilation units to be parsed at once and it should call function each
54       time parsing is done so we save memory.
55
56     - cgraph_optimize
57
58       In this unit-at-a-time compilation the intra procedural analysis takes
59       place here.  In particular the static functions whose address is never
60       taken are marked as local.  Backend can then use this information to
61       modify calling conventions, do better inlining or similar optimizations.
62
63     - cgraph_assemble_pending_functions
64     - cgraph_varpool_assemble_pending_variables
65
66       In non-unit-at-a-time mode these functions can be used to force compilation
67       of functions or variables that are known to be needed at given stage
68       of compilation
69
70     - cgraph_mark_needed_node
71     - cgraph_varpool_mark_needed_node
72
73       When function or variable is referenced by some hidden way (for instance
74       via assembly code and marked by attribute "used"), the call-graph data structure
75       must be updated accordingly by this function.
76
77     - analyze_expr callback
78
79       This function is responsible for lowering tree nodes not understood by
80       generic code into understandable ones or alternatively marking
81       callgraph and varpool nodes referenced by the as needed.
82
83       ??? On the tree-ssa genericizing should take place here and we will avoid
84       need for these hooks (replacing them by genericizing hook)
85
86     - expand_function callback
87
88       This function is used to expand function and pass it into RTL back-end.
89       Front-end should not make any assumptions about when this function can be
90       called.  In particular cgraph_assemble_pending_functions,
91       cgraph_varpool_assemble_pending_variables, cgraph_finalize_function,
92       cgraph_varpool_finalize_function, cgraph_optimize can cause arbitrarily
93       previously finalized functions to be expanded.
94
95     We implement two compilation modes.
96
97       - unit-at-a-time:  In this mode analyzing of all functions is deferred
98         to cgraph_finalize_compilation_unit and expansion into cgraph_optimize.
99
100         In cgraph_finalize_compilation_unit the reachable functions are
101         analyzed.  During analysis the call-graph edges from reachable
102         functions are constructed and their destinations are marked as
103         reachable.  References to functions and variables are discovered too
104         and variables found to be needed output to the assembly file.  Via
105         mark_referenced call in assemble_variable functions referenced by
106         static variables are noticed too.
107
108         The intra-procedural information is produced and its existence
109         indicated by global_info_ready.  Once this flag is set it is impossible
110         to change function from !reachable to reachable and thus
111         assemble_variable no longer call mark_referenced.
112
113         Finally the call-graph is topologically sorted and all reachable functions
114         that has not been completely inlined or are not external are output.
115
116         ??? It is possible that reference to function or variable is optimized
117         out.  We can not deal with this nicely because topological order is not
118         suitable for it.  For tree-ssa we may consider another pass doing
119         optimization and re-discovering reachable functions.
120
121         ??? Reorganize code so variables are output very last and only if they
122         really has been referenced by produced code, so we catch more cases
123         where reference has been optimized out.
124
125       - non-unit-at-a-time
126
127         All functions are variables are output as early as possible to conserve
128         memory consumption.  This may or may not result in less memory used but
129         it is still needed for some legacy code that rely on particular ordering
130         of things output from the compiler.
131
132         Varpool data structures are not used and variables are output directly.
133
134         Functions are output early using call of
135         cgraph_assemble_pending_function from cgraph_finalize_function.  The
136         decision on whether function is needed is made more conservative so
137         uninlininable static functions are needed too.  During the call-graph
138         construction the edge destinations are not marked as reachable and it
139         is completely relied upn assemble_variable to mark them.  */
140
141
142 #include "config.h"
143 #include "system.h"
144 #include "coretypes.h"
145 #include "tm.h"
146 #include "tree.h"
147 #include "rtl.h"
148 #include "tree-flow.h"
149 #include "tree-inline.h"
150 #include "langhooks.h"
151 #include "pointer-set.h"
152 #include "toplev.h"
153 #include "flags.h"
154 #include "ggc.h"
155 #include "debug.h"
156 #include "target.h"
157 #include "cgraph.h"
158 #include "diagnostic.h"
159 #include "timevar.h"
160 #include "params.h"
161 #include "fibheap.h"
162 #include "c-common.h"
163 #include "intl.h"
164 #include "function.h"
165 #include "tree-gimple.h"
166 #include "tree-pass.h"
167 #include "output.h"
168
169 static void cgraph_expand_all_functions (void);
170 static void cgraph_mark_functions_to_output (void);
171 static void cgraph_expand_function (struct cgraph_node *);
172 static tree record_call_1 (tree *, int *, void *);
173 static void cgraph_mark_local_functions (void);
174 static void cgraph_analyze_function (struct cgraph_node *node);
175 static void cgraph_create_edges (struct cgraph_node *node, tree body);
176
177 /* Records tree nodes seen in cgraph_create_edges.  Simply using
178    walk_tree_without_duplicates doesn't guarantee each node is visited
179    once because it gets a new htab upon each recursive call from
180    record_calls_1.  */
181 static struct pointer_set_t *visited_nodes;
182
183 static FILE *cgraph_dump_file;
184
185 /* Determine if function DECL is needed.  That is, visible to something
186    either outside this translation unit, something magic in the system
187    configury, or (if not doing unit-at-a-time) to something we havn't
188    seen yet.  */
189
190 static bool
191 decide_is_function_needed (struct cgraph_node *node, tree decl)
192 {
193   tree origin;
194
195   /* If we decided it was needed before, but at the time we didn't have
196      the body of the function available, then it's still needed.  We have
197      to go back and re-check its dependencies now.  */
198   if (node->needed)
199     return true;
200
201   /* Externally visible functions must be output.  The exception is
202      COMDAT functions that must be output only when they are needed.  */
203   if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
204     return true;
205
206   /* Constructors and destructors are reachable from the runtime by
207      some mechanism.  */
208   if (DECL_STATIC_CONSTRUCTOR (decl) || DECL_STATIC_DESTRUCTOR (decl))
209     return true;
210
211   /* If the user told us it is used, then it must be so.  */
212   if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
213     return true;
214
215   /* ??? If the assembler name is set by hand, it is possible to assemble
216      the name later after finalizing the function and the fact is noticed
217      in assemble_name then.  This is arguably a bug.  */
218   if (DECL_ASSEMBLER_NAME_SET_P (decl)
219       && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
220     return true;
221
222   if (flag_unit_at_a_time)
223     return false;
224
225   /* If not doing unit at a time, then we'll only defer this function
226      if its marked for inlining.  Otherwise we want to emit it now.  */
227
228   /* "extern inline" functions are never output locally.  */
229   if (DECL_EXTERNAL (decl))
230     return false;
231   /* Nested functions of extern inline function shall not be emit unless
232      we inlined the origin.  */
233   for (origin = decl_function_context (decl); origin;
234        origin = decl_function_context (origin))
235     if (DECL_EXTERNAL (origin))
236       return false;
237   /* We want to emit COMDAT functions only when absolutely necessary.  */
238   if (DECL_COMDAT (decl))
239     return false;
240   if (!DECL_INLINE (decl)
241       || (!node->local.disregard_inline_limits
242           /* When declared inline, defer even the uninlinable functions.
243              This allows them to be eliminated when unused.  */
244           && !DECL_DECLARED_INLINE_P (decl) 
245           && (!node->local.inlinable || !cgraph_default_inline_p (node))))
246     return true;
247
248   return false;
249 }
250
251 /* Walk the decls we marked as necessary and see if they reference new
252    variables or functions and add them into the worklists.  */
253 static bool
254 cgraph_varpool_analyze_pending_decls (void)
255 {
256   bool changed = false;
257   timevar_push (TV_CGRAPH);
258
259   while (cgraph_varpool_first_unanalyzed_node)
260     {
261       tree decl = cgraph_varpool_first_unanalyzed_node->decl;
262
263       cgraph_varpool_first_unanalyzed_node->analyzed = true;
264
265       cgraph_varpool_first_unanalyzed_node = cgraph_varpool_first_unanalyzed_node->next_needed;
266
267       if (DECL_INITIAL (decl))
268         cgraph_create_edges (NULL, DECL_INITIAL (decl));
269       changed = true;
270     }
271   timevar_pop (TV_CGRAPH);
272   return changed;
273 }
274
275 /* Optimization of function bodies might've rendered some variables as
276    unnecessary so we want to avoid these from being compiled.
277
278    This is done by prunning the queue and keeping only the variables that
279    really appear needed (ie they are either externally visible or referenced
280    by compiled function). Re-doing the reachability analysis on variables
281    brings back the remaining variables referenced by these.  */
282 static void
283 cgraph_varpool_remove_unreferenced_decls (void)
284 {
285   struct cgraph_varpool_node *next, *node = cgraph_varpool_nodes_queue;
286
287   cgraph_varpool_reset_queue ();
288
289   if (errorcount || sorrycount)
290     return;
291
292   while (node)
293     {
294       tree decl = node->decl;
295       next = node->next_needed;
296       node->needed = 0;
297
298       if (node->finalized
299           && ((DECL_ASSEMBLER_NAME_SET_P (decl)
300                && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
301               || node->force_output
302               || decide_is_variable_needed (node, decl)))
303         cgraph_varpool_mark_needed_node (node);
304
305       node = next;
306     }
307   cgraph_varpool_analyze_pending_decls ();
308 }
309
310
311 /* When not doing unit-at-a-time, output all functions enqueued.
312    Return true when such a functions were found.  */
313
314 bool
315 cgraph_assemble_pending_functions (void)
316 {
317   bool output = false;
318
319   if (flag_unit_at_a_time)
320     return false;
321
322   while (cgraph_nodes_queue)
323     {
324       struct cgraph_node *n = cgraph_nodes_queue;
325
326       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
327       n->next_needed = NULL;
328       if (!n->global.inlined_to
329           && !n->alias
330           && !DECL_EXTERNAL (n->decl))
331         {
332           cgraph_expand_function (n);
333           output = true;
334         }
335     }
336
337   return output;
338 }
339
340 /* DECL has been parsed.  Take it, queue it, compile it at the whim of the
341    logic in effect.  If NESTED is true, then our caller cannot stand to have
342    the garbage collector run at the moment.  We would need to either create
343    a new GC context, or just not compile right now.  */
344
345 void
346 cgraph_finalize_function (tree decl, bool nested)
347 {
348   struct cgraph_node *node = cgraph_node (decl);
349
350   if (node->local.finalized)
351     {
352       /* As an GCC extension we allow redefinition of the function.  The
353          semantics when both copies of bodies differ is not well defined.
354          We replace the old body with new body so in unit at a time mode
355          we always use new body, while in normal mode we may end up with
356          old body inlined into some functions and new body expanded and
357          inlined in others.
358          
359          ??? It may make more sense to use one body for inlining and other
360          body for expanding the function but this is difficult to do.  */
361
362       /* If node->output is set, then this is a unit-at-a-time compilation
363          and we have already begun whole-unit analysis.  This is *not*
364          testing for whether we've already emitted the function.  That
365          case can be sort-of legitimately seen with real function 
366          redefinition errors.  I would argue that the front end should
367          never present us with such a case, but don't enforce that for now.  */
368       gcc_assert (!node->output);
369
370       /* Reset our data structures so we can analyze the function again.  */
371       memset (&node->local, 0, sizeof (node->local));
372       memset (&node->global, 0, sizeof (node->global));
373       memset (&node->rtl, 0, sizeof (node->rtl));
374       node->analyzed = false;
375       node->local.redefined_extern_inline = true;
376
377       if (!flag_unit_at_a_time)
378         {
379           struct cgraph_node *n;
380
381           for (n = cgraph_nodes; n; n = n->next)
382             if (n->global.inlined_to == node)
383               cgraph_remove_node (n);
384         }
385
386       cgraph_node_remove_callees (node);
387
388       /* We may need to re-queue the node for assembling in case
389          we already proceeded it and ignored as not needed.  */
390       if (node->reachable && !flag_unit_at_a_time)
391         {
392           struct cgraph_node *n;
393
394           for (n = cgraph_nodes_queue; n; n = n->next_needed)
395             if (n == node)
396               break;
397           if (!n)
398             node->reachable = 0;
399         }
400     }
401
402   notice_global_symbol (decl);
403   node->decl = decl;
404   node->local.finalized = true;
405   node->lowered = DECL_STRUCT_FUNCTION (decl)->cfg != NULL;
406   if (node->nested)
407     lower_nested_functions (decl);
408   gcc_assert (!node->nested);
409
410   /* If not unit at a time, then we need to create the call graph
411      now, so that called functions can be queued and emitted now.  */
412   if (!flag_unit_at_a_time)
413     {
414       cgraph_analyze_function (node);
415       cgraph_decide_inlining_incrementally (node);
416     }
417
418   if (decide_is_function_needed (node, decl))
419     cgraph_mark_needed_node (node);
420
421   /* If not unit at a time, go ahead and emit everything we've found
422      to be reachable at this time.  */
423   if (!nested)
424     {
425       if (!cgraph_assemble_pending_functions ())
426         ggc_collect ();
427     }
428
429   /* If we've not yet emitted decl, tell the debug info about it.  */
430   if (!TREE_ASM_WRITTEN (decl))
431     (*debug_hooks->deferred_inline_function) (decl);
432
433   /* Possibly warn about unused parameters.  */
434   if (warn_unused_parameter)
435     do_warn_unused_parameter (decl);
436 }
437
438 /* Used only while constructing the callgraph.  */
439 static basic_block current_basic_block;
440
441 void
442 cgraph_lower_function (struct cgraph_node *node)
443 {
444   if (node->lowered)
445     return;
446   tree_lowering_passes (node->decl);
447   node->lowered = true;
448 }
449
450 /* Walk tree and record all calls.  Called via walk_tree.  */
451 static tree
452 record_call_1 (tree *tp, int *walk_subtrees, void *data)
453 {
454   tree t = *tp;
455
456   switch (TREE_CODE (t))
457     {
458     case VAR_DECL:
459       /* ??? Really, we should mark this decl as *potentially* referenced
460          by this function and re-examine whether the decl is actually used
461          after rtl has been generated.  */
462       if (TREE_STATIC (t) || DECL_EXTERNAL (t))
463         {
464           cgraph_varpool_mark_needed_node (cgraph_varpool_node (t));
465           if (lang_hooks.callgraph.analyze_expr)
466             return lang_hooks.callgraph.analyze_expr (tp, walk_subtrees, 
467                                                       data);
468         }
469       break;
470
471     case FDESC_EXPR:
472     case ADDR_EXPR:
473       if (flag_unit_at_a_time)
474         {
475           /* Record dereferences to the functions.  This makes the
476              functions reachable unconditionally.  */
477           tree decl = TREE_OPERAND (*tp, 0);
478           if (TREE_CODE (decl) == FUNCTION_DECL)
479             cgraph_mark_needed_node (cgraph_node (decl));
480         }
481       break;
482
483     case CALL_EXPR:
484       {
485         tree decl = get_callee_fndecl (*tp);
486         if (decl && TREE_CODE (decl) == FUNCTION_DECL)
487           {
488             cgraph_create_edge (data, cgraph_node (decl), *tp,
489                                 current_basic_block->count,
490                                 current_basic_block->loop_depth);
491
492             /* When we see a function call, we don't want to look at the
493                function reference in the ADDR_EXPR that is hanging from
494                the CALL_EXPR we're examining here, because we would
495                conclude incorrectly that the function's address could be
496                taken by something that is not a function call.  So only
497                walk the function parameter list, skip the other subtrees.  */
498
499             walk_tree (&TREE_OPERAND (*tp, 1), record_call_1, data,
500                        visited_nodes);
501             *walk_subtrees = 0;
502           }
503         break;
504       }
505
506     default:
507       /* Save some cycles by not walking types and declaration as we
508          won't find anything useful there anyway.  */
509       if (IS_TYPE_OR_DECL_P (*tp))
510         {
511           *walk_subtrees = 0;
512           break;
513         }
514
515       if ((unsigned int) TREE_CODE (t) >= LAST_AND_UNUSED_TREE_CODE)
516         return lang_hooks.callgraph.analyze_expr (tp, walk_subtrees, data);
517       break;
518     }
519
520   return NULL;
521 }
522
523 /* Create cgraph edges for function calls inside BODY from NODE.  */
524
525 static void
526 cgraph_create_edges (struct cgraph_node *node, tree body)
527 {
528   /* The nodes we're interested in are never shared, so walk
529      the tree ignoring duplicates.  */
530   visited_nodes = pointer_set_create ();
531   gcc_assert (current_basic_block == NULL);
532   if (TREE_CODE (body) == FUNCTION_DECL)
533     {
534       struct function *this_cfun = DECL_STRUCT_FUNCTION (body);
535       block_stmt_iterator bsi;
536       tree step;
537
538       /* Reach the trees by walking over the CFG, and note the 
539          enclosing basic-blocks in the call edges.  */
540       FOR_EACH_BB_FN (current_basic_block, this_cfun)
541         for (bsi = bsi_start (current_basic_block); !bsi_end_p (bsi); bsi_next (&bsi))
542           walk_tree (bsi_stmt_ptr (bsi), record_call_1, node, visited_nodes);
543       current_basic_block = NULL;
544
545       /* Walk over any private statics that may take addresses of functions.  */
546       if (TREE_CODE (DECL_INITIAL (body)) == BLOCK)
547         {
548           for (step = BLOCK_VARS (DECL_INITIAL (body));
549                step;
550                step = TREE_CHAIN (step))
551             if (DECL_INITIAL (step))
552               walk_tree (&DECL_INITIAL (step), record_call_1, node, visited_nodes);
553         }
554
555       /* Also look here for private statics.  */
556       if (DECL_STRUCT_FUNCTION (body))
557         for (step = DECL_STRUCT_FUNCTION (body)->unexpanded_var_list;
558              step;
559              step = TREE_CHAIN (step))
560           {
561             tree decl = TREE_VALUE (step);
562             if (DECL_INITIAL (decl) && TREE_STATIC (decl))
563               walk_tree (&DECL_INITIAL (decl), record_call_1, node, visited_nodes);
564           }
565     }
566   else
567     walk_tree (&body, record_call_1, node, visited_nodes);
568     
569   pointer_set_destroy (visited_nodes);
570   visited_nodes = NULL;
571 }
572
573 static bool error_found;
574
575 /* Callback of verify_cgraph_node.  Check that all call_exprs have
576    cgraph nodes.  */
577
578 static tree
579 verify_cgraph_node_1 (tree *tp, int *walk_subtrees, void *data)
580 {
581   tree t = *tp;
582   tree decl;
583
584   if (TREE_CODE (t) == CALL_EXPR && (decl = get_callee_fndecl (t)))
585     {
586       struct cgraph_edge *e = cgraph_edge (data, t);
587       if (e)
588         {
589           if (e->aux)
590             {
591               error ("Shared call_expr:");
592               debug_tree (t);
593               error_found = true;
594             }
595           if (e->callee->decl != cgraph_node (decl)->decl)
596             {
597               error ("Edge points to wrong declaration:");
598               debug_tree (e->callee->decl);
599               fprintf (stderr," Instead of:");
600               debug_tree (decl);
601             }
602           e->aux = (void *)1;
603         }
604       else
605         {
606           error ("Missing callgraph edge for call expr:");
607           debug_tree (t);
608           error_found = true;
609         }
610     }
611
612   /* Save some cycles by not walking types and declaration as we
613      won't find anything useful there anyway.  */
614   if (IS_TYPE_OR_DECL_P (*tp))
615     *walk_subtrees = 0;
616
617   return NULL_TREE;
618 }
619
620 /* Verify cgraph nodes of given cgraph node.  */
621 void
622 verify_cgraph_node (struct cgraph_node *node)
623 {
624   struct cgraph_edge *e;
625   struct cgraph_node *main_clone;
626   struct function *this_cfun = DECL_STRUCT_FUNCTION (node->decl);
627   basic_block this_block;
628   block_stmt_iterator bsi;
629
630   timevar_push (TV_CGRAPH_VERIFY);
631   error_found = false;
632   for (e = node->callees; e; e = e->next_callee)
633     if (e->aux)
634       {
635         error ("Aux field set for edge %s->%s",
636                cgraph_node_name (e->caller), cgraph_node_name (e->callee));
637         error_found = true;
638       }
639   for (e = node->callers; e; e = e->next_caller)
640     {
641       if (!e->inline_failed)
642         {
643           if (node->global.inlined_to
644               != (e->caller->global.inlined_to
645                   ? e->caller->global.inlined_to : e->caller))
646             {
647               error ("Inlined_to pointer is wrong");
648               error_found = true;
649             }
650           if (node->callers->next_caller)
651             {
652               error ("Multiple inline callers");
653               error_found = true;
654             }
655         }
656       else
657         if (node->global.inlined_to)
658           {
659             error ("Inlined_to pointer set for noninline callers");
660             error_found = true;
661           }
662     }
663   if (!node->callers && node->global.inlined_to)
664     {
665       error ("Inlined_to pointer is set but no predecesors found");
666       error_found = true;
667     }
668   if (node->global.inlined_to == node)
669     {
670       error ("Inlined_to pointer reffers to itself");
671       error_found = true;
672     }
673
674   for (main_clone = cgraph_node (node->decl); main_clone;
675        main_clone = main_clone->next_clone)
676     if (main_clone == node)
677       break;
678   if (!node)
679     {
680       error ("Node not found in DECL_ASSEMBLER_NAME hash");
681       error_found = true;
682     }
683   
684   if (node->analyzed
685       && DECL_SAVED_TREE (node->decl) && !TREE_ASM_WRITTEN (node->decl)
686       && (!DECL_EXTERNAL (node->decl) || node->global.inlined_to))
687     {
688       if (this_cfun->cfg)
689         {
690           /* The nodes we're interested in are never shared, so walk
691              the tree ignoring duplicates.  */
692           visited_nodes = pointer_set_create ();
693           /* Reach the trees by walking over the CFG, and note the
694              enclosing basic-blocks in the call edges.  */
695           FOR_EACH_BB_FN (this_block, this_cfun)
696             for (bsi = bsi_start (this_block); !bsi_end_p (bsi); bsi_next (&bsi))
697               walk_tree (bsi_stmt_ptr (bsi), verify_cgraph_node_1, node, visited_nodes);
698           pointer_set_destroy (visited_nodes);
699           visited_nodes = NULL;
700         }
701       else
702         /* No CFG available?!  */
703         gcc_unreachable ();
704
705       for (e = node->callees; e; e = e->next_callee)
706         {
707           if (!e->aux)
708             {
709               error ("Edge %s->%s has no corresponding call_expr",
710                      cgraph_node_name (e->caller),
711                      cgraph_node_name (e->callee));
712               error_found = true;
713             }
714           e->aux = 0;
715         }
716     }
717   if (error_found)
718     {
719       dump_cgraph_node (stderr, node);
720       internal_error ("verify_cgraph_node failed.");
721     }
722   timevar_pop (TV_CGRAPH_VERIFY);
723 }
724
725 /* Verify whole cgraph structure.  */
726 void
727 verify_cgraph (void)
728 {
729   struct cgraph_node *node;
730
731   if (sorrycount || errorcount)
732     return;
733
734   for (node = cgraph_nodes; node; node = node->next)
735     verify_cgraph_node (node);
736 }
737
738
739 /* Output all variables enqueued to be assembled.  */
740 bool
741 cgraph_varpool_assemble_pending_decls (void)
742 {
743   bool changed = false;
744
745   if (errorcount || sorrycount)
746     return false;
747  
748   /* EH might mark decls as needed during expansion.  This should be safe since
749      we don't create references to new function, but it should not be used
750      elsewhere.  */
751   cgraph_varpool_analyze_pending_decls ();
752
753   while (cgraph_varpool_nodes_queue)
754     {
755       tree decl = cgraph_varpool_nodes_queue->decl;
756       struct cgraph_varpool_node *node = cgraph_varpool_nodes_queue;
757
758       cgraph_varpool_nodes_queue = cgraph_varpool_nodes_queue->next_needed;
759       if (!TREE_ASM_WRITTEN (decl) && !node->alias && !DECL_EXTERNAL (decl))
760         {
761           assemble_variable (decl, 0, 1, 0);
762           changed = true;
763         }
764       node->next_needed = NULL;
765     }
766   return changed;
767 }
768
769 /* Analyze the function scheduled to be output.  */
770 static void
771 cgraph_analyze_function (struct cgraph_node *node)
772 {
773   tree decl = node->decl;
774   struct cgraph_edge *e;
775
776   current_function_decl = decl;
777   push_cfun (DECL_STRUCT_FUNCTION (decl));
778   cgraph_lower_function (node);
779
780   /* First kill forward declaration so reverse inlining works properly.  */
781   cgraph_create_edges (node, decl);
782
783   node->local.inlinable = tree_inlinable_function_p (decl);
784   node->local.self_insns = estimate_num_insns (decl);
785   if (node->local.inlinable)
786     node->local.disregard_inline_limits
787       = lang_hooks.tree_inlining.disregard_inline_limits (decl);
788   for (e = node->callers; e; e = e->next_caller)
789     {
790       if (node->local.redefined_extern_inline)
791         e->inline_failed = N_("redefined extern inline functions are not "
792                            "considered for inlining");
793       else if (!node->local.inlinable)
794         e->inline_failed = N_("function not inlinable");
795       else
796         e->inline_failed = N_("function not considered for inlining");
797     }
798   if (flag_really_no_inline && !node->local.disregard_inline_limits)
799     node->local.inlinable = 0;
800   /* Inlining characteristics are maintained by the cgraph_mark_inline.  */
801   node->global.insns = node->local.self_insns;
802
803   node->analyzed = true;
804   pop_cfun ();
805   current_function_decl = NULL;
806 }
807
808 /* Analyze the whole compilation unit once it is parsed completely.  */
809
810 void
811 cgraph_finalize_compilation_unit (void)
812 {
813   struct cgraph_node *node;
814   /* Keep track of already processed nodes when called multiple times for
815      intermodule optimization.  */
816   static struct cgraph_node *first_analyzed;
817
818   finish_aliases_1 ();
819
820   if (!flag_unit_at_a_time)
821     {
822       cgraph_assemble_pending_functions ();
823       return;
824     }
825
826   if (!quiet_flag)
827     {
828       fprintf (stderr, "\nAnalyzing compilation unit");
829       fflush (stderr);
830     }
831
832   timevar_push (TV_CGRAPH);
833   cgraph_varpool_analyze_pending_decls ();
834   if (cgraph_dump_file)
835     {
836       fprintf (cgraph_dump_file, "Initial entry points:");
837       for (node = cgraph_nodes; node != first_analyzed; node = node->next)
838         if (node->needed && DECL_SAVED_TREE (node->decl))
839           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
840       fprintf (cgraph_dump_file, "\n");
841     }
842
843   /* Propagate reachability flag and lower representation of all reachable
844      functions.  In the future, lowering will introduce new functions and
845      new entry points on the way (by template instantiation and virtual
846      method table generation for instance).  */
847   while (cgraph_nodes_queue)
848     {
849       struct cgraph_edge *edge;
850       tree decl = cgraph_nodes_queue->decl;
851
852       node = cgraph_nodes_queue;
853       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
854       node->next_needed = NULL;
855
856       /* ??? It is possible to create extern inline function and later using
857          weak alias attribute to kill its body. See
858          gcc.c-torture/compile/20011119-1.c  */
859       if (!DECL_SAVED_TREE (decl))
860         continue;
861
862       gcc_assert (!node->analyzed && node->reachable);
863       gcc_assert (DECL_SAVED_TREE (decl));
864
865       cgraph_analyze_function (node);
866
867       for (edge = node->callees; edge; edge = edge->next_callee)
868         if (!edge->callee->reachable)
869           cgraph_mark_reachable_node (edge->callee);
870
871       cgraph_varpool_analyze_pending_decls ();
872     }
873
874   /* Collect entry points to the unit.  */
875
876   if (cgraph_dump_file)
877     {
878       fprintf (cgraph_dump_file, "Unit entry points:");
879       for (node = cgraph_nodes; node != first_analyzed; node = node->next)
880         if (node->needed && DECL_SAVED_TREE (node->decl))
881           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
882       fprintf (cgraph_dump_file, "\n\nInitial ");
883       dump_cgraph (cgraph_dump_file);
884     }
885
886   if (cgraph_dump_file)
887     fprintf (cgraph_dump_file, "\nReclaiming functions:");
888
889   for (node = cgraph_nodes; node != first_analyzed; node = node->next)
890     {
891       tree decl = node->decl;
892
893       if (!node->reachable && DECL_SAVED_TREE (decl))
894         {
895           if (cgraph_dump_file)
896             fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
897           cgraph_remove_node (node);
898         }
899       else
900         node->next_needed = NULL;
901     }
902   if (cgraph_dump_file)
903     {
904       fprintf (cgraph_dump_file, "\n\nReclaimed ");
905       dump_cgraph (cgraph_dump_file);
906     }
907   first_analyzed = cgraph_nodes;
908   ggc_collect ();
909   timevar_pop (TV_CGRAPH);
910 }
911 /* Figure out what functions we want to assemble.  */
912
913 static void
914 cgraph_mark_functions_to_output (void)
915 {
916   struct cgraph_node *node;
917
918   for (node = cgraph_nodes; node; node = node->next)
919     {
920       tree decl = node->decl;
921       struct cgraph_edge *e;
922       
923       gcc_assert (!node->output);
924
925       for (e = node->callers; e; e = e->next_caller)
926         if (e->inline_failed)
927           break;
928
929       /* We need to output all local functions that are used and not
930          always inlined, as well as those that are reachable from
931          outside the current compilation unit.  */
932       if (DECL_SAVED_TREE (decl)
933           && !node->global.inlined_to
934           && (node->needed
935               || (e && node->reachable))
936           && !TREE_ASM_WRITTEN (decl)
937           && !DECL_EXTERNAL (decl))
938         node->output = 1;
939       else
940         {
941           /* We should've reclaimed all functions that are not needed.  */
942 #ifdef ENABLE_CHECKING
943           if (!node->global.inlined_to && DECL_SAVED_TREE (decl)
944               && !DECL_EXTERNAL (decl))
945             {
946               dump_cgraph_node (stderr, node);
947               internal_error ("failed to reclaim unneeded function");
948             }
949 #endif
950           gcc_assert (node->global.inlined_to || !DECL_SAVED_TREE (decl)
951                       || DECL_EXTERNAL (decl));
952
953         }
954       
955     }
956 }
957
958 /* Expand function specified by NODE.  */
959
960 static void
961 cgraph_expand_function (struct cgraph_node *node)
962 {
963   tree decl = node->decl;
964
965   /* We ought to not compile any inline clones.  */
966   gcc_assert (!node->global.inlined_to);
967
968   if (flag_unit_at_a_time)
969     announce_function (decl);
970
971   cgraph_lower_function (node);
972
973   /* Generate RTL for the body of DECL.  */
974   lang_hooks.callgraph.expand_function (decl);
975
976   /* Make sure that BE didn't give up on compiling.  */
977   /* ??? Can happen with nested function of extern inline.  */
978   gcc_assert (TREE_ASM_WRITTEN (node->decl));
979
980   current_function_decl = NULL;
981   if (!cgraph_preserve_function_body_p (node->decl))
982     {
983       DECL_SAVED_TREE (node->decl) = NULL;
984       DECL_STRUCT_FUNCTION (node->decl) = NULL;
985       DECL_INITIAL (node->decl) = error_mark_node;
986       /* Eliminate all call edges.  This is important so the call_expr no longer
987          points to the dead function body.  */
988       cgraph_node_remove_callees (node);
989     }
990 }
991
992 /* Return true when CALLER_DECL should be inlined into CALLEE_DECL.  */
993
994 bool
995 cgraph_inline_p (struct cgraph_edge *e, const char **reason)
996 {
997   *reason = e->inline_failed;
998   return !e->inline_failed;
999 }
1000
1001
1002
1003 /* Expand all functions that must be output.
1004
1005    Attempt to topologically sort the nodes so function is output when
1006    all called functions are already assembled to allow data to be
1007    propagated across the callgraph.  Use a stack to get smaller distance
1008    between a function and its callees (later we may choose to use a more
1009    sophisticated algorithm for function reordering; we will likely want
1010    to use subsections to make the output functions appear in top-down
1011    order).  */
1012
1013 static void
1014 cgraph_expand_all_functions (void)
1015 {
1016   struct cgraph_node *node;
1017   struct cgraph_node **order =
1018     xcalloc (cgraph_n_nodes, sizeof (struct cgraph_node *));
1019   int order_pos = 0, new_order_pos = 0;
1020   int i;
1021
1022   order_pos = cgraph_postorder (order);
1023   gcc_assert (order_pos == cgraph_n_nodes);
1024
1025   /* Garbage collector may remove inline clones we eliminate during
1026      optimization.  So we must be sure to not reference them.  */
1027   for (i = 0; i < order_pos; i++)
1028     if (order[i]->output)
1029       order[new_order_pos++] = order[i];
1030
1031   for (i = new_order_pos - 1; i >= 0; i--)
1032     {
1033       node = order[i];
1034       if (node->output)
1035         {
1036           gcc_assert (node->reachable);
1037           node->output = 0;
1038           cgraph_expand_function (node);
1039         }
1040     }
1041   free (order);
1042 }
1043
1044 /* Mark all local functions.
1045    
1046    A local function is one whose calls can occur only in the current
1047    compilation unit and all its calls are explicit, so we can change
1048    its calling convention.  We simply mark all static functions whose
1049    address is not taken as local.  */
1050
1051 static void
1052 cgraph_mark_local_functions (void)
1053 {
1054   struct cgraph_node *node;
1055
1056   /* Figure out functions we want to assemble.  */
1057   for (node = cgraph_nodes; node; node = node->next)
1058     {
1059       node->local.local = (!node->needed
1060                            && DECL_SAVED_TREE (node->decl)
1061                            && !TREE_PUBLIC (node->decl));
1062     }
1063
1064   if (cgraph_dump_file)
1065     {
1066       fprintf (cgraph_dump_file, "\nMarking local functions:");
1067       for (node = cgraph_nodes; node; node = node->next)
1068         if (node->local.local)
1069           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
1070       fprintf (cgraph_dump_file, "\n\n");
1071     }
1072 }
1073
1074 /* Return true when function body of DECL still needs to be kept around
1075    for later re-use.  */
1076 bool
1077 cgraph_preserve_function_body_p (tree decl)
1078 {
1079   struct cgraph_node *node;
1080   /* Keep the body; we're going to dump it.  */
1081   if (dump_enabled_p (TDI_tree_all))
1082     return true;
1083   if (!cgraph_global_info_ready)
1084     return (DECL_INLINE (decl) && !flag_really_no_inline);
1085   /* Look if there is any clone around.  */
1086   for (node = cgraph_node (decl); node; node = node->next_clone)
1087     if (node->global.inlined_to)
1088       return true;
1089   return false;
1090 }
1091
1092 /* Perform simple optimizations based on callgraph.  */
1093
1094 void
1095 cgraph_optimize (void)
1096 {
1097 #ifdef ENABLE_CHECKING
1098   verify_cgraph ();
1099 #endif
1100   if (!flag_unit_at_a_time)
1101     {
1102       cgraph_varpool_assemble_pending_decls ();
1103       return;
1104     }
1105
1106   process_pending_assemble_externals ();
1107   
1108   /* Frontend may output common variables after the unit has been finalized.
1109      It is safe to deal with them here as they are always zero initialized.  */
1110   cgraph_varpool_analyze_pending_decls ();
1111
1112   timevar_push (TV_CGRAPHOPT);
1113   if (!quiet_flag)
1114     fprintf (stderr, "Performing intraprocedural optimizations\n");
1115
1116   cgraph_mark_local_functions ();
1117   if (cgraph_dump_file)
1118     {
1119       fprintf (cgraph_dump_file, "Marked ");
1120       dump_cgraph (cgraph_dump_file);
1121     }
1122   ipa_passes ();
1123   cgraph_global_info_ready = true;
1124   if (cgraph_dump_file)
1125     {
1126       fprintf (cgraph_dump_file, "Optimized ");
1127       dump_cgraph (cgraph_dump_file);
1128       dump_varpool (cgraph_dump_file);
1129     }
1130   timevar_pop (TV_CGRAPHOPT);
1131
1132   /* Output everything.  */
1133   if (!quiet_flag)
1134     fprintf (stderr, "Assembling functions:\n");
1135 #ifdef ENABLE_CHECKING
1136   verify_cgraph ();
1137 #endif
1138   
1139   cgraph_mark_functions_to_output ();
1140   cgraph_expand_all_functions ();
1141   cgraph_varpool_remove_unreferenced_decls ();
1142
1143   cgraph_varpool_assemble_pending_decls ();
1144
1145   if (cgraph_dump_file)
1146     {
1147       fprintf (cgraph_dump_file, "\nFinal ");
1148       dump_cgraph (cgraph_dump_file);
1149     }
1150 #ifdef ENABLE_CHECKING
1151   verify_cgraph ();
1152   /* Double check that all inline clones are gone and that all
1153      function bodies have been released from memory.  */
1154   if (flag_unit_at_a_time
1155       && !dump_enabled_p (TDI_tree_all)
1156       && !(sorrycount || errorcount))
1157     {
1158       struct cgraph_node *node;
1159       bool error_found = false;
1160
1161       for (node = cgraph_nodes; node; node = node->next)
1162         if (node->analyzed
1163             && (node->global.inlined_to
1164                 || DECL_SAVED_TREE (node->decl)))
1165           {
1166             error_found = true;
1167             dump_cgraph_node (stderr, node);
1168           }
1169       if (error_found)
1170         internal_error ("Nodes with no released memory found.");
1171     }
1172 #endif
1173 }
1174
1175 /* Generate and emit a static constructor or destructor.  WHICH must be
1176    one of 'I' or 'D'.  BODY should be a STATEMENT_LIST containing 
1177    GENERIC statements.  */
1178
1179 void
1180 cgraph_build_static_cdtor (char which, tree body, int priority)
1181 {
1182   static int counter = 0;
1183   char which_buf[16];
1184   tree decl, name, resdecl;
1185
1186   sprintf (which_buf, "%c_%d", which, counter++);
1187   name = get_file_function_name_long (which_buf);
1188
1189   decl = build_decl (FUNCTION_DECL, name,
1190                      build_function_type (void_type_node, void_list_node));
1191   current_function_decl = decl;
1192
1193   resdecl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
1194   DECL_ARTIFICIAL (resdecl) = 1;
1195   DECL_IGNORED_P (resdecl) = 1;
1196   DECL_RESULT (decl) = resdecl;
1197
1198   allocate_struct_function (decl);
1199
1200   TREE_STATIC (decl) = 1;
1201   TREE_USED (decl) = 1;
1202   DECL_ARTIFICIAL (decl) = 1;
1203   DECL_IGNORED_P (decl) = 1;
1204   DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
1205   DECL_SAVED_TREE (decl) = body;
1206   TREE_PUBLIC (decl) = ! targetm.have_ctors_dtors;
1207   DECL_UNINLINABLE (decl) = 1;
1208
1209   DECL_INITIAL (decl) = make_node (BLOCK);
1210   TREE_USED (DECL_INITIAL (decl)) = 1;
1211
1212   DECL_SOURCE_LOCATION (decl) = input_location;
1213   cfun->function_end_locus = input_location;
1214
1215   switch (which)
1216     {
1217     case 'I':
1218       DECL_STATIC_CONSTRUCTOR (decl) = 1;
1219       break;
1220     case 'D':
1221       DECL_STATIC_DESTRUCTOR (decl) = 1;
1222       break;
1223     default:
1224       gcc_unreachable ();
1225     }
1226
1227   gimplify_function_tree (decl);
1228
1229   /* ??? We will get called LATE in the compilation process.  */
1230   if (cgraph_global_info_ready)
1231     {
1232       tree_lowering_passes (decl);
1233       tree_rest_of_compilation (decl);
1234     }
1235   else
1236     cgraph_finalize_function (decl, 0);
1237   
1238   if (targetm.have_ctors_dtors)
1239     {
1240       void (*fn) (rtx, int);
1241
1242       if (which == 'I')
1243         fn = targetm.asm_out.constructor;
1244       else
1245         fn = targetm.asm_out.destructor;
1246       fn (XEXP (DECL_RTL (decl), 0), priority);
1247     }
1248 }
1249
1250 void
1251 init_cgraph (void)
1252 {
1253   cgraph_dump_file = dump_begin (TDI_cgraph, NULL);
1254 }