OSDN Git Service

f3d718d8bcf63ce7e532c8e4065c38a09a5c775d
[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_reference (tree *, int *, void *);
173 static void cgraph_analyze_function (struct cgraph_node *node);
174
175 /* Records tree nodes seen in record_reference.  Simply using
176    walk_tree_without_duplicates doesn't guarantee each node is visited
177    once because it gets a new htab upon each recursive call from
178    record_reference itself.  */
179 static struct pointer_set_t *visited_nodes;
180
181 static FILE *cgraph_dump_file;
182
183 /* Determine if function DECL is needed.  That is, visible to something
184    either outside this translation unit, something magic in the system
185    configury, or (if not doing unit-at-a-time) to something we havn't
186    seen yet.  */
187
188 static bool
189 decide_is_function_needed (struct cgraph_node *node, tree decl)
190 {
191   tree origin;
192   if (MAIN_NAME_P (DECL_NAME (decl))
193       && TREE_PUBLIC (decl))
194     {
195       node->local.externally_visible = true;
196       return true;
197     }
198
199   /* If the user told us it is used, then it must be so.  */
200   if (node->local.externally_visible
201       || lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
202     return true;
203
204   /* ??? If the assembler name is set by hand, it is possible to assemble
205      the name later after finalizing the function and the fact is noticed
206      in assemble_name then.  This is arguably a bug.  */
207   if (DECL_ASSEMBLER_NAME_SET_P (decl)
208       && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
209     return true;
210
211   /* If we decided it was needed before, but at the time we didn't have
212      the body of the function available, then it's still needed.  We have
213      to go back and re-check its dependencies now.  */
214   if (node->needed)
215     return true;
216
217   /* Externally visible functions must be output.  The exception is
218      COMDAT functions that must be output only when they are needed.  */
219   if ((TREE_PUBLIC (decl) && !flag_whole_program)
220       && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
221     return true;
222
223   /* Constructors and destructors are reachable from the runtime by
224      some mechanism.  */
225   if (DECL_STATIC_CONSTRUCTOR (decl) || DECL_STATIC_DESTRUCTOR (decl))
226     return true;
227
228   if (flag_unit_at_a_time)
229     return false;
230
231   /* If not doing unit at a time, then we'll only defer this function
232      if its marked for inlining.  Otherwise we want to emit it now.  */
233
234   /* "extern inline" functions are never output locally.  */
235   if (DECL_EXTERNAL (decl))
236     return false;
237   /* Nested functions of extern inline function shall not be emit unless
238      we inlined the origin.  */
239   for (origin = decl_function_context (decl); origin;
240        origin = decl_function_context (origin))
241     if (DECL_EXTERNAL (origin))
242       return false;
243   /* We want to emit COMDAT functions only when absolutely necessary.  */
244   if (DECL_COMDAT (decl))
245     return false;
246   if (!DECL_INLINE (decl)
247       || (!node->local.disregard_inline_limits
248           /* When declared inline, defer even the uninlinable functions.
249              This allows them to be eliminated when unused.  */
250           && !DECL_DECLARED_INLINE_P (decl) 
251           && (!node->local.inlinable || !cgraph_default_inline_p (node))))
252     return true;
253
254   return false;
255 }
256
257 /* Walk the decls we marked as necessary and see if they reference new
258    variables or functions and add them into the worklists.  */
259 static bool
260 cgraph_varpool_analyze_pending_decls (void)
261 {
262   bool changed = false;
263   timevar_push (TV_CGRAPH);
264
265   while (cgraph_varpool_first_unanalyzed_node)
266     {
267       tree decl = cgraph_varpool_first_unanalyzed_node->decl;
268
269       cgraph_varpool_first_unanalyzed_node->analyzed = true;
270
271       cgraph_varpool_first_unanalyzed_node = cgraph_varpool_first_unanalyzed_node->next_needed;
272
273       if (DECL_INITIAL (decl))
274         {
275           visited_nodes = pointer_set_create ();
276           walk_tree (&DECL_INITIAL (decl), record_reference, NULL, visited_nodes);
277           pointer_set_destroy (visited_nodes);
278           visited_nodes = NULL;
279         }
280       changed = true;
281     }
282   timevar_pop (TV_CGRAPH);
283   return changed;
284 }
285
286 /* Optimization of function bodies might've rendered some variables as
287    unnecessary so we want to avoid these from being compiled.
288
289    This is done by pruning the queue and keeping only the variables that
290    really appear needed (ie they are either externally visible or referenced
291    by compiled function). Re-doing the reachability analysis on variables
292    brings back the remaining variables referenced by these.  */
293 static void
294 cgraph_varpool_remove_unreferenced_decls (void)
295 {
296   struct cgraph_varpool_node *next, *node = cgraph_varpool_nodes_queue;
297
298   cgraph_varpool_reset_queue ();
299
300   if (errorcount || sorrycount)
301     return;
302
303   while (node)
304     {
305       tree decl = node->decl;
306       next = node->next_needed;
307       node->needed = 0;
308
309       if (node->finalized
310           && ((DECL_ASSEMBLER_NAME_SET_P (decl)
311                && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
312               || node->force_output
313               || decide_is_variable_needed (node, decl)))
314         cgraph_varpool_mark_needed_node (node);
315
316       node = next;
317     }
318   cgraph_varpool_analyze_pending_decls ();
319 }
320
321
322 /* When not doing unit-at-a-time, output all functions enqueued.
323    Return true when such a functions were found.  */
324
325 bool
326 cgraph_assemble_pending_functions (void)
327 {
328   bool output = false;
329
330   if (flag_unit_at_a_time)
331     return false;
332
333   while (cgraph_nodes_queue)
334     {
335       struct cgraph_node *n = cgraph_nodes_queue;
336
337       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
338       n->next_needed = NULL;
339       if (!n->global.inlined_to
340           && !n->alias
341           && !DECL_EXTERNAL (n->decl))
342         {
343           cgraph_expand_function (n);
344           output = true;
345         }
346     }
347
348   return output;
349 }
350 /* As an GCC extension we allow redefinition of the function.  The
351    semantics when both copies of bodies differ is not well defined.
352    We replace the old body with new body so in unit at a time mode
353    we always use new body, while in normal mode we may end up with
354    old body inlined into some functions and new body expanded and
355    inlined in others.
356
357    ??? It may make more sense to use one body for inlining and other
358    body for expanding the function but this is difficult to do.  */
359
360 static void
361 cgraph_reset_node (struct cgraph_node *node)
362 {
363   /* If node->output is set, then this is a unit-at-a-time compilation
364      and we have already begun whole-unit analysis.  This is *not*
365      testing for whether we've already emitted the function.  That
366      case can be sort-of legitimately seen with real function 
367      redefinition errors.  I would argue that the front end should
368      never present us with such a case, but don't enforce that for now.  */
369   gcc_assert (!node->output);
370
371   /* Reset our data structures so we can analyze the function again.  */
372   memset (&node->local, 0, sizeof (node->local));
373   memset (&node->global, 0, sizeof (node->global));
374   memset (&node->rtl, 0, sizeof (node->rtl));
375   node->analyzed = false;
376   node->local.redefined_extern_inline = true;
377   node->local.finalized = false;
378
379   if (!flag_unit_at_a_time)
380     {
381       struct cgraph_node *n;
382
383       for (n = cgraph_nodes; n; n = n->next)
384         if (n->global.inlined_to == node)
385           cgraph_remove_node (n);
386     }
387
388   cgraph_node_remove_callees (node);
389
390   /* We may need to re-queue the node for assembling in case
391      we already proceeded it and ignored as not needed.  */
392   if (node->reachable && !flag_unit_at_a_time)
393     {
394       struct cgraph_node *n;
395
396       for (n = cgraph_nodes_queue; n; n = n->next_needed)
397         if (n == node)
398           break;
399       if (!n)
400         node->reachable = 0;
401     }
402 }
403
404 /* DECL has been parsed.  Take it, queue it, compile it at the whim of the
405    logic in effect.  If NESTED is true, then our caller cannot stand to have
406    the garbage collector run at the moment.  We would need to either create
407    a new GC context, or just not compile right now.  */
408
409 void
410 cgraph_finalize_function (tree decl, bool nested)
411 {
412   struct cgraph_node *node = cgraph_node (decl);
413
414   if (node->local.finalized)
415     cgraph_reset_node (node);
416
417   notice_global_symbol (decl);
418   node->decl = decl;
419   node->local.finalized = true;
420   node->lowered = DECL_STRUCT_FUNCTION (decl)->cfg != NULL;
421   if (node->nested)
422     lower_nested_functions (decl);
423   gcc_assert (!node->nested);
424
425   /* If not unit at a time, then we need to create the call graph
426      now, so that called functions can be queued and emitted now.  */
427   if (!flag_unit_at_a_time)
428     {
429       cgraph_analyze_function (node);
430       cgraph_decide_inlining_incrementally (node);
431     }
432
433   if (decide_is_function_needed (node, decl))
434     cgraph_mark_needed_node (node);
435
436   /* Since we reclaim unreachable nodes at the end of every language
437      level unit, we need to be conservative about possible entry points
438      there.  */
439   if ((TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl)))
440     cgraph_mark_reachable_node (node);
441
442   /* If not unit at a time, go ahead and emit everything we've found
443      to be reachable at this time.  */
444   if (!nested)
445     {
446       if (!cgraph_assemble_pending_functions ())
447         ggc_collect ();
448     }
449
450   /* If we've not yet emitted decl, tell the debug info about it.  */
451   if (!TREE_ASM_WRITTEN (decl))
452     (*debug_hooks->deferred_inline_function) (decl);
453
454   /* Possibly warn about unused parameters.  */
455   if (warn_unused_parameter)
456     do_warn_unused_parameter (decl);
457 }
458
459 void
460 cgraph_lower_function (struct cgraph_node *node)
461 {
462   if (node->lowered)
463     return;
464   tree_lowering_passes (node->decl);
465   node->lowered = true;
466 }
467
468 /* Walk tree and record all calls.  Called via walk_tree.  */
469 static tree
470 record_reference (tree *tp, int *walk_subtrees, void *data)
471 {
472   tree t = *tp;
473
474   switch (TREE_CODE (t))
475     {
476     case VAR_DECL:
477       /* ??? Really, we should mark this decl as *potentially* referenced
478          by this function and re-examine whether the decl is actually used
479          after rtl has been generated.  */
480       if (TREE_STATIC (t) || DECL_EXTERNAL (t))
481         {
482           cgraph_varpool_mark_needed_node (cgraph_varpool_node (t));
483           if (lang_hooks.callgraph.analyze_expr)
484             return lang_hooks.callgraph.analyze_expr (tp, walk_subtrees, 
485                                                       data);
486         }
487       break;
488
489     case FDESC_EXPR:
490     case ADDR_EXPR:
491       if (flag_unit_at_a_time)
492         {
493           /* Record dereferences to the functions.  This makes the
494              functions reachable unconditionally.  */
495           tree decl = TREE_OPERAND (*tp, 0);
496           if (TREE_CODE (decl) == FUNCTION_DECL)
497             cgraph_mark_needed_node (cgraph_node (decl));
498         }
499       break;
500
501     default:
502       /* Save some cycles by not walking types and declaration as we
503          won't find anything useful there anyway.  */
504       if (IS_TYPE_OR_DECL_P (*tp))
505         {
506           *walk_subtrees = 0;
507           break;
508         }
509
510       if ((unsigned int) TREE_CODE (t) >= LAST_AND_UNUSED_TREE_CODE)
511         return lang_hooks.callgraph.analyze_expr (tp, walk_subtrees, data);
512       break;
513     }
514
515   return NULL;
516 }
517
518 /* Create cgraph edges for function calls inside BODY from NODE.  */
519
520 static void
521 cgraph_create_edges (struct cgraph_node *node, tree body)
522 {
523   basic_block bb;
524
525   struct function *this_cfun = DECL_STRUCT_FUNCTION (body);
526   block_stmt_iterator bsi;
527   tree step;
528   visited_nodes = pointer_set_create ();
529
530   /* Reach the trees by walking over the CFG, and note the 
531      enclosing basic-blocks in the call edges.  */
532   FOR_EACH_BB_FN (bb, this_cfun)
533     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
534       {
535         tree stmt = bsi_stmt (bsi);
536         tree call = get_call_expr_in (stmt);
537         tree decl;
538
539         if (call && (decl = get_callee_fndecl (call)))
540           {
541             cgraph_create_edge (node, cgraph_node (decl), stmt,
542                                 bb->count,
543                                 bb->loop_depth);
544             walk_tree (&TREE_OPERAND (call, 1),
545                        record_reference, node, visited_nodes);
546             if (TREE_CODE (stmt) == MODIFY_EXPR)
547               walk_tree (&TREE_OPERAND (stmt, 0),
548                          record_reference, node, visited_nodes);
549           }
550         else 
551           walk_tree (bsi_stmt_ptr (bsi), record_reference, node, visited_nodes);
552       }
553
554   /* Look for initializers of constant variables and private statics.  */
555   for (step = DECL_STRUCT_FUNCTION (body)->unexpanded_var_list;
556        step;
557        step = TREE_CHAIN (step))
558     {
559       tree decl = TREE_VALUE (step);
560       if (TREE_CODE (decl) == VAR_DECL
561           && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
562           && flag_unit_at_a_time)
563         cgraph_varpool_finalize_decl (decl);
564       else if (TREE_CODE (decl) == VAR_DECL && DECL_INITIAL (decl))
565         walk_tree (&DECL_INITIAL (decl), record_reference, node, visited_nodes);
566     }
567     
568   pointer_set_destroy (visited_nodes);
569   visited_nodes = NULL;
570 }
571
572
573 /* Verify cgraph nodes of given cgraph node.  */
574 void
575 verify_cgraph_node (struct cgraph_node *node)
576 {
577   struct cgraph_edge *e;
578   struct cgraph_node *main_clone;
579   struct function *this_cfun = DECL_STRUCT_FUNCTION (node->decl);
580   basic_block this_block;
581   block_stmt_iterator bsi;
582   bool error_found = false;
583
584   timevar_push (TV_CGRAPH_VERIFY);
585   for (e = node->callees; e; e = e->next_callee)
586     if (e->aux)
587       {
588         error ("Aux field set for edge %s->%s",
589                cgraph_node_name (e->caller), cgraph_node_name (e->callee));
590         error_found = true;
591       }
592   for (e = node->callers; e; e = e->next_caller)
593     {
594       if (!e->inline_failed)
595         {
596           if (node->global.inlined_to
597               != (e->caller->global.inlined_to
598                   ? e->caller->global.inlined_to : e->caller))
599             {
600               error ("Inlined_to pointer is wrong");
601               error_found = true;
602             }
603           if (node->callers->next_caller)
604             {
605               error ("Multiple inline callers");
606               error_found = true;
607             }
608         }
609       else
610         if (node->global.inlined_to)
611           {
612             error ("Inlined_to pointer set for noninline callers");
613             error_found = true;
614           }
615     }
616   if (!node->callers && node->global.inlined_to)
617     {
618       error ("Inlined_to pointer is set but no predecesors found");
619       error_found = true;
620     }
621   if (node->global.inlined_to == node)
622     {
623       error ("Inlined_to pointer refers to itself");
624       error_found = true;
625     }
626
627   for (main_clone = cgraph_node (node->decl); main_clone;
628        main_clone = main_clone->next_clone)
629     if (main_clone == node)
630       break;
631   if (!node)
632     {
633       error ("Node not found in DECL_ASSEMBLER_NAME hash");
634       error_found = true;
635     }
636   
637   if (node->analyzed
638       && DECL_SAVED_TREE (node->decl) && !TREE_ASM_WRITTEN (node->decl)
639       && (!DECL_EXTERNAL (node->decl) || node->global.inlined_to))
640     {
641       if (this_cfun->cfg)
642         {
643           /* The nodes we're interested in are never shared, so walk
644              the tree ignoring duplicates.  */
645           visited_nodes = pointer_set_create ();
646           /* Reach the trees by walking over the CFG, and note the
647              enclosing basic-blocks in the call edges.  */
648           FOR_EACH_BB_FN (this_block, this_cfun)
649             for (bsi = bsi_start (this_block); !bsi_end_p (bsi); bsi_next (&bsi))
650               {
651                 tree stmt = bsi_stmt (bsi);
652                 tree call = get_call_expr_in (stmt);
653                 tree decl;
654                 if (call && (decl = get_callee_fndecl (call)))
655                   {
656                     struct cgraph_edge *e = cgraph_edge (node, stmt);
657                     if (e)
658                       {
659                         if (e->aux)
660                           {
661                             error ("Shared call_stmt:");
662                             debug_generic_stmt (stmt);
663                             error_found = true;
664                           }
665                         if (e->callee->decl != cgraph_node (decl)->decl)
666                           {
667                             error ("Edge points to wrong declaration:");
668                             debug_tree (e->callee->decl);
669                             fprintf (stderr," Instead of:");
670                             debug_tree (decl);
671                           }
672                         e->aux = (void *)1;
673                       }
674                     else
675                       {
676                         error ("Missing callgraph edge for call stmt:");
677                         debug_generic_stmt (stmt);
678                         error_found = true;
679                       }
680                   }
681               }
682           pointer_set_destroy (visited_nodes);
683           visited_nodes = NULL;
684         }
685       else
686         /* No CFG available?!  */
687         gcc_unreachable ();
688
689       for (e = node->callees; e; e = e->next_callee)
690         {
691           if (!e->aux)
692             {
693               error ("Edge %s->%s has no corresponding call_stmt",
694                      cgraph_node_name (e->caller),
695                      cgraph_node_name (e->callee));
696               debug_generic_stmt (e->call_stmt);
697               error_found = true;
698             }
699           e->aux = 0;
700         }
701     }
702   if (error_found)
703     {
704       dump_cgraph_node (stderr, node);
705       internal_error ("verify_cgraph_node failed.");
706     }
707   timevar_pop (TV_CGRAPH_VERIFY);
708 }
709
710 /* Verify whole cgraph structure.  */
711 void
712 verify_cgraph (void)
713 {
714   struct cgraph_node *node;
715
716   if (sorrycount || errorcount)
717     return;
718
719   for (node = cgraph_nodes; node; node = node->next)
720     verify_cgraph_node (node);
721 }
722
723
724 /* Output all variables enqueued to be assembled.  */
725 bool
726 cgraph_varpool_assemble_pending_decls (void)
727 {
728   bool changed = false;
729
730   if (errorcount || sorrycount)
731     return false;
732  
733   /* EH might mark decls as needed during expansion.  This should be safe since
734      we don't create references to new function, but it should not be used
735      elsewhere.  */
736   cgraph_varpool_analyze_pending_decls ();
737
738   while (cgraph_varpool_nodes_queue)
739     {
740       tree decl = cgraph_varpool_nodes_queue->decl;
741       struct cgraph_varpool_node *node = cgraph_varpool_nodes_queue;
742
743       cgraph_varpool_nodes_queue = cgraph_varpool_nodes_queue->next_needed;
744       if (!TREE_ASM_WRITTEN (decl) && !node->alias && !DECL_EXTERNAL (decl))
745         {
746           assemble_variable (decl, 0, 1, 0);
747           /* Local static variables are never seen by check_global_declarations
748              so we need to output debug info by hand.  */
749           if (decl_function_context (decl) && errorcount == 0 && sorrycount == 0)
750             {
751               timevar_push (TV_SYMOUT);
752               (*debug_hooks->global_decl) (decl);
753               timevar_pop (TV_SYMOUT);
754             }
755           changed = true;
756         }
757       node->next_needed = NULL;
758     }
759   return changed;
760 }
761
762 /* Analyze the function scheduled to be output.  */
763 static void
764 cgraph_analyze_function (struct cgraph_node *node)
765 {
766   tree decl = node->decl;
767   struct cgraph_edge *e;
768
769   current_function_decl = decl;
770   push_cfun (DECL_STRUCT_FUNCTION (decl));
771   cgraph_lower_function (node);
772
773   /* First kill forward declaration so reverse inlining works properly.  */
774   cgraph_create_edges (node, decl);
775
776   node->local.inlinable = tree_inlinable_function_p (decl);
777   node->local.self_insns = estimate_num_insns (decl);
778   if (node->local.inlinable)
779     node->local.disregard_inline_limits
780       = lang_hooks.tree_inlining.disregard_inline_limits (decl);
781   for (e = node->callers; e; e = e->next_caller)
782     {
783       if (node->local.redefined_extern_inline)
784         e->inline_failed = N_("redefined extern inline functions are not "
785                            "considered for inlining");
786       else if (!node->local.inlinable)
787         e->inline_failed = N_("function not inlinable");
788       else
789         e->inline_failed = N_("function not considered for inlining");
790     }
791   if (flag_really_no_inline && !node->local.disregard_inline_limits)
792     node->local.inlinable = 0;
793   /* Inlining characteristics are maintained by the cgraph_mark_inline.  */
794   node->global.insns = node->local.self_insns;
795
796   node->analyzed = true;
797   pop_cfun ();
798   current_function_decl = NULL;
799 }
800
801 /* Analyze the whole compilation unit once it is parsed completely.  */
802
803 void
804 cgraph_finalize_compilation_unit (void)
805 {
806   struct cgraph_node *node;
807   /* Keep track of already processed nodes when called multiple times for
808      intermodule optimization.  */
809   static struct cgraph_node *first_analyzed;
810
811   finish_aliases_1 ();
812
813   if (!flag_unit_at_a_time)
814     {
815       cgraph_assemble_pending_functions ();
816       return;
817     }
818
819   if (!quiet_flag)
820     {
821       fprintf (stderr, "\nAnalyzing compilation unit");
822       fflush (stderr);
823     }
824
825   timevar_push (TV_CGRAPH);
826   cgraph_varpool_analyze_pending_decls ();
827   if (cgraph_dump_file)
828     {
829       fprintf (cgraph_dump_file, "Initial entry points:");
830       for (node = cgraph_nodes; node != first_analyzed; node = node->next)
831         if (node->needed && DECL_SAVED_TREE (node->decl))
832           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
833       fprintf (cgraph_dump_file, "\n");
834     }
835
836   /* Propagate reachability flag and lower representation of all reachable
837      functions.  In the future, lowering will introduce new functions and
838      new entry points on the way (by template instantiation and virtual
839      method table generation for instance).  */
840   while (cgraph_nodes_queue)
841     {
842       struct cgraph_edge *edge;
843       tree decl = cgraph_nodes_queue->decl;
844
845       node = cgraph_nodes_queue;
846       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
847       node->next_needed = NULL;
848
849       /* ??? It is possible to create extern inline function and later using
850          weak alias attribute to kill its body. See
851          gcc.c-torture/compile/20011119-1.c  */
852       if (!DECL_SAVED_TREE (decl))
853         {
854           cgraph_reset_node (node);
855           continue;
856         }
857
858       gcc_assert (!node->analyzed && node->reachable);
859       gcc_assert (DECL_SAVED_TREE (decl));
860
861       cgraph_analyze_function (node);
862
863       for (edge = node->callees; edge; edge = edge->next_callee)
864         if (!edge->callee->reachable)
865           cgraph_mark_reachable_node (edge->callee);
866
867       cgraph_varpool_analyze_pending_decls ();
868     }
869
870   /* Collect entry points to the unit.  */
871
872   if (cgraph_dump_file)
873     {
874       fprintf (cgraph_dump_file, "Unit entry points:");
875       for (node = cgraph_nodes; node != first_analyzed; node = node->next)
876         if (node->needed && DECL_SAVED_TREE (node->decl))
877           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
878       fprintf (cgraph_dump_file, "\n\nInitial ");
879       dump_cgraph (cgraph_dump_file);
880     }
881
882   if (cgraph_dump_file)
883     fprintf (cgraph_dump_file, "\nReclaiming functions:");
884
885   for (node = cgraph_nodes; node != first_analyzed; node = node->next)
886     {
887       tree decl = node->decl;
888
889       if (node->local.finalized && !DECL_SAVED_TREE (decl))
890         cgraph_reset_node (node);
891
892       if (!node->reachable && DECL_SAVED_TREE (decl))
893         {
894           if (cgraph_dump_file)
895             fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
896           cgraph_remove_node (node);
897           continue;
898         }
899       else
900         node->next_needed = NULL;
901       gcc_assert (!node->local.finalized || DECL_SAVED_TREE (decl));
902       gcc_assert (node->analyzed == node->local.finalized);
903     }
904   if (cgraph_dump_file)
905     {
906       fprintf (cgraph_dump_file, "\n\nReclaimed ");
907       dump_cgraph (cgraph_dump_file);
908     }
909   first_analyzed = cgraph_nodes;
910   ggc_collect ();
911   timevar_pop (TV_CGRAPH);
912 }
913 /* Figure out what functions we want to assemble.  */
914
915 static void
916 cgraph_mark_functions_to_output (void)
917 {
918   struct cgraph_node *node;
919
920   for (node = cgraph_nodes; node; node = node->next)
921     {
922       tree decl = node->decl;
923       struct cgraph_edge *e;
924       
925       gcc_assert (!node->output);
926
927       for (e = node->callers; e; e = e->next_caller)
928         if (e->inline_failed)
929           break;
930
931       /* We need to output all local functions that are used and not
932          always inlined, as well as those that are reachable from
933          outside the current compilation unit.  */
934       if (DECL_SAVED_TREE (decl)
935           && !node->global.inlined_to
936           && (node->needed
937               || (e && node->reachable))
938           && !TREE_ASM_WRITTEN (decl)
939           && !DECL_EXTERNAL (decl))
940         node->output = 1;
941       else
942         {
943           /* We should've reclaimed all functions that are not needed.  */
944 #ifdef ENABLE_CHECKING
945           if (!node->global.inlined_to && DECL_SAVED_TREE (decl)
946               && !DECL_EXTERNAL (decl))
947             {
948               dump_cgraph_node (stderr, node);
949               internal_error ("failed to reclaim unneeded function");
950             }
951 #endif
952           gcc_assert (node->global.inlined_to || !DECL_SAVED_TREE (decl)
953                       || DECL_EXTERNAL (decl));
954
955         }
956       
957     }
958 }
959
960 /* Expand function specified by NODE.  */
961
962 static void
963 cgraph_expand_function (struct cgraph_node *node)
964 {
965   tree decl = node->decl;
966
967   /* We ought to not compile any inline clones.  */
968   gcc_assert (!node->global.inlined_to);
969
970   if (flag_unit_at_a_time)
971     announce_function (decl);
972
973   cgraph_lower_function (node);
974
975   /* Generate RTL for the body of DECL.  */
976   lang_hooks.callgraph.expand_function (decl);
977
978   /* Make sure that BE didn't give up on compiling.  */
979   /* ??? Can happen with nested function of extern inline.  */
980   gcc_assert (TREE_ASM_WRITTEN (node->decl));
981
982   current_function_decl = NULL;
983   if (!cgraph_preserve_function_body_p (node->decl))
984     {
985       DECL_SAVED_TREE (node->decl) = NULL;
986       DECL_STRUCT_FUNCTION (node->decl) = NULL;
987       DECL_INITIAL (node->decl) = error_mark_node;
988       /* Eliminate all call edges.  This is important so the call_expr no longer
989          points to the dead function body.  */
990       cgraph_node_remove_callees (node);
991     }
992
993   cgraph_function_flags_ready = true;
994 }
995
996 /* Return true when CALLER_DECL should be inlined into CALLEE_DECL.  */
997
998 bool
999 cgraph_inline_p (struct cgraph_edge *e, const char **reason)
1000 {
1001   *reason = e->inline_failed;
1002   return !e->inline_failed;
1003 }
1004
1005
1006
1007 /* Expand all functions that must be output.
1008
1009    Attempt to topologically sort the nodes so function is output when
1010    all called functions are already assembled to allow data to be
1011    propagated across the callgraph.  Use a stack to get smaller distance
1012    between a function and its callees (later we may choose to use a more
1013    sophisticated algorithm for function reordering; we will likely want
1014    to use subsections to make the output functions appear in top-down
1015    order).  */
1016
1017 static void
1018 cgraph_expand_all_functions (void)
1019 {
1020   struct cgraph_node *node;
1021   struct cgraph_node **order =
1022     xcalloc (cgraph_n_nodes, sizeof (struct cgraph_node *));
1023   int order_pos = 0, new_order_pos = 0;
1024   int i;
1025
1026   order_pos = cgraph_postorder (order);
1027   gcc_assert (order_pos == cgraph_n_nodes);
1028
1029   /* Garbage collector may remove inline clones we eliminate during
1030      optimization.  So we must be sure to not reference them.  */
1031   for (i = 0; i < order_pos; i++)
1032     if (order[i]->output)
1033       order[new_order_pos++] = order[i];
1034
1035   for (i = new_order_pos - 1; i >= 0; i--)
1036     {
1037       node = order[i];
1038       if (node->output)
1039         {
1040           gcc_assert (node->reachable);
1041           node->output = 0;
1042           cgraph_expand_function (node);
1043         }
1044     }
1045   free (order);
1046 }
1047
1048 /* Mark visibility of all functions.
1049    
1050    A local function is one whose calls can occur only in the current
1051    compilation unit and all its calls are explicit, so we can change
1052    its calling convention.  We simply mark all static functions whose
1053    address is not taken as local.
1054
1055    We also change the TREE_PUBLIC flag of all declarations that are public
1056    in language point of view but we want to overwrite this default
1057    via visibilities for the backend point of view.  */
1058
1059 static void
1060 cgraph_function_and_variable_visibility (void)
1061 {
1062   struct cgraph_node *node;
1063   struct cgraph_varpool_node *vnode;
1064
1065   for (node = cgraph_nodes; node; node = node->next)
1066     {
1067       if (node->reachable
1068           && (DECL_COMDAT (node->decl)
1069               || (TREE_PUBLIC (node->decl) && !DECL_EXTERNAL (node->decl))))
1070         node->local.externally_visible = true;
1071       if (!node->local.externally_visible && node->analyzed
1072           && !DECL_EXTERNAL (node->decl))
1073         {
1074           gcc_assert (flag_whole_program || !TREE_PUBLIC (node->decl));
1075           TREE_PUBLIC (node->decl) = 0;
1076         }
1077       node->local.local = (!node->needed
1078                            && node->analyzed
1079                            && !DECL_EXTERNAL (node->decl)
1080                            && !node->local.externally_visible);
1081     }
1082   for (vnode = cgraph_varpool_nodes_queue; vnode; vnode = vnode->next_needed)
1083     {
1084       if (vnode->needed
1085           && (DECL_COMDAT (vnode->decl) || TREE_PUBLIC (vnode->decl)))
1086         vnode->externally_visible = 1;
1087       if (!vnode->externally_visible)
1088         {
1089           gcc_assert (flag_whole_program || !TREE_PUBLIC (vnode->decl));
1090           TREE_PUBLIC (vnode->decl) = 0;
1091         }
1092      gcc_assert (TREE_STATIC (vnode->decl));
1093     }
1094
1095   /* Because we have to be conservative on the boundaries of source
1096      level units, it is possible that we marked some functions in
1097      reachable just because they might be used later via external
1098      linkage, but after making them local they are really unreachable
1099      now.  */
1100   cgraph_remove_unreachable_nodes (true, cgraph_dump_file);
1101
1102   if (cgraph_dump_file)
1103     {
1104       fprintf (cgraph_dump_file, "\nMarking local functions:");
1105       for (node = cgraph_nodes; node; node = node->next)
1106         if (node->local.local)
1107           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
1108       fprintf (cgraph_dump_file, "\n\n");
1109       fprintf (cgraph_dump_file, "\nMarking externally visible functions:");
1110       for (node = cgraph_nodes; node; node = node->next)
1111         if (node->local.externally_visible)
1112           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
1113       fprintf (cgraph_dump_file, "\n\n");
1114     }
1115   cgraph_function_flags_ready = true;
1116 }
1117
1118 /* Return true when function body of DECL still needs to be kept around
1119    for later re-use.  */
1120 bool
1121 cgraph_preserve_function_body_p (tree decl)
1122 {
1123   struct cgraph_node *node;
1124   /* Keep the body; we're going to dump it.  */
1125   if (dump_enabled_p (TDI_tree_all))
1126     return true;
1127   if (!cgraph_global_info_ready)
1128     return (DECL_INLINE (decl) && !flag_really_no_inline);
1129   /* Look if there is any clone around.  */
1130   for (node = cgraph_node (decl); node; node = node->next_clone)
1131     if (node->global.inlined_to)
1132       return true;
1133   return false;
1134 }
1135
1136 /* Perform simple optimizations based on callgraph.  */
1137
1138 void
1139 cgraph_optimize (void)
1140 {
1141 #ifdef ENABLE_CHECKING
1142   verify_cgraph ();
1143 #endif
1144   if (!flag_unit_at_a_time)
1145     {
1146       cgraph_varpool_assemble_pending_decls ();
1147       return;
1148     }
1149
1150   process_pending_assemble_externals ();
1151   
1152   /* Frontend may output common variables after the unit has been finalized.
1153      It is safe to deal with them here as they are always zero initialized.  */
1154   cgraph_varpool_analyze_pending_decls ();
1155
1156   timevar_push (TV_CGRAPHOPT);
1157   if (!quiet_flag)
1158     fprintf (stderr, "Performing intraprocedural optimizations\n");
1159
1160   cgraph_function_and_variable_visibility ();
1161   if (cgraph_dump_file)
1162     {
1163       fprintf (cgraph_dump_file, "Marked ");
1164       dump_cgraph (cgraph_dump_file);
1165     }
1166   ipa_passes ();
1167   /* This pass remove bodies of extern inline functions we never inlined.
1168      Do this later so other IPA passes see what is really going on.  */
1169   cgraph_remove_unreachable_nodes (false, dump_file);
1170   cgraph_global_info_ready = true;
1171   if (cgraph_dump_file)
1172     {
1173       fprintf (cgraph_dump_file, "Optimized ");
1174       dump_cgraph (cgraph_dump_file);
1175       dump_varpool (cgraph_dump_file);
1176     }
1177   timevar_pop (TV_CGRAPHOPT);
1178
1179   /* Output everything.  */
1180   if (!quiet_flag)
1181     fprintf (stderr, "Assembling functions:\n");
1182 #ifdef ENABLE_CHECKING
1183   verify_cgraph ();
1184 #endif
1185   
1186   cgraph_mark_functions_to_output ();
1187   cgraph_expand_all_functions ();
1188   cgraph_varpool_remove_unreferenced_decls ();
1189
1190   cgraph_varpool_assemble_pending_decls ();
1191
1192   if (cgraph_dump_file)
1193     {
1194       fprintf (cgraph_dump_file, "\nFinal ");
1195       dump_cgraph (cgraph_dump_file);
1196     }
1197 #ifdef ENABLE_CHECKING
1198   verify_cgraph ();
1199   /* Double check that all inline clones are gone and that all
1200      function bodies have been released from memory.  */
1201   if (flag_unit_at_a_time
1202       && !dump_enabled_p (TDI_tree_all)
1203       && !(sorrycount || errorcount))
1204     {
1205       struct cgraph_node *node;
1206       bool error_found = false;
1207
1208       for (node = cgraph_nodes; node; node = node->next)
1209         if (node->analyzed
1210             && (node->global.inlined_to
1211                 || DECL_SAVED_TREE (node->decl)))
1212           {
1213             error_found = true;
1214             dump_cgraph_node (stderr, node);
1215           }
1216       if (error_found)
1217         internal_error ("Nodes with no released memory found.");
1218     }
1219 #endif
1220 }
1221
1222 /* Generate and emit a static constructor or destructor.  WHICH must be
1223    one of 'I' or 'D'.  BODY should be a STATEMENT_LIST containing 
1224    GENERIC statements.  */
1225
1226 void
1227 cgraph_build_static_cdtor (char which, tree body, int priority)
1228 {
1229   static int counter = 0;
1230   char which_buf[16];
1231   tree decl, name, resdecl;
1232
1233   sprintf (which_buf, "%c_%d", which, counter++);
1234   name = get_file_function_name_long (which_buf);
1235
1236   decl = build_decl (FUNCTION_DECL, name,
1237                      build_function_type (void_type_node, void_list_node));
1238   current_function_decl = decl;
1239
1240   resdecl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
1241   DECL_ARTIFICIAL (resdecl) = 1;
1242   DECL_IGNORED_P (resdecl) = 1;
1243   DECL_RESULT (decl) = resdecl;
1244
1245   allocate_struct_function (decl);
1246
1247   TREE_STATIC (decl) = 1;
1248   TREE_USED (decl) = 1;
1249   DECL_ARTIFICIAL (decl) = 1;
1250   DECL_IGNORED_P (decl) = 1;
1251   DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
1252   DECL_SAVED_TREE (decl) = body;
1253   TREE_PUBLIC (decl) = ! targetm.have_ctors_dtors;
1254   DECL_UNINLINABLE (decl) = 1;
1255
1256   DECL_INITIAL (decl) = make_node (BLOCK);
1257   TREE_USED (DECL_INITIAL (decl)) = 1;
1258
1259   DECL_SOURCE_LOCATION (decl) = input_location;
1260   cfun->function_end_locus = input_location;
1261
1262   switch (which)
1263     {
1264     case 'I':
1265       DECL_STATIC_CONSTRUCTOR (decl) = 1;
1266       break;
1267     case 'D':
1268       DECL_STATIC_DESTRUCTOR (decl) = 1;
1269       break;
1270     default:
1271       gcc_unreachable ();
1272     }
1273
1274   gimplify_function_tree (decl);
1275
1276   /* ??? We will get called LATE in the compilation process.  */
1277   if (cgraph_global_info_ready)
1278     {
1279       tree_lowering_passes (decl);
1280       tree_rest_of_compilation (decl);
1281     }
1282   else
1283     cgraph_finalize_function (decl, 0);
1284   
1285   if (targetm.have_ctors_dtors)
1286     {
1287       void (*fn) (rtx, int);
1288
1289       if (which == 'I')
1290         fn = targetm.asm_out.constructor;
1291       else
1292         fn = targetm.asm_out.destructor;
1293       fn (XEXP (DECL_RTL (decl), 0), priority);
1294     }
1295 }
1296
1297 void
1298 init_cgraph (void)
1299 {
1300   cgraph_dump_file = dump_begin (TDI_cgraph, NULL);
1301 }