OSDN Git Service

add missing full stops in the changelog of a previous patch
[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, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, 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 "ipa-prop.h"
166 #include "tree-gimple.h"
167 #include "tree-pass.h"
168 #include "output.h"
169
170 static void cgraph_expand_all_functions (void);
171 static void cgraph_mark_functions_to_output (void);
172 static void cgraph_expand_function (struct cgraph_node *);
173 static tree record_reference (tree *, int *, void *);
174 static void cgraph_output_pending_asms (void);
175
176 /* Records tree nodes seen in record_reference.  Simply using
177    walk_tree_without_duplicates doesn't guarantee each node is visited
178    once because it gets a new htab upon each recursive call from
179    record_reference itself.  */
180 static struct pointer_set_t *visited_nodes;
181
182 static FILE *cgraph_dump_file;
183
184 /* Determine if function DECL is needed.  That is, visible to something
185    either outside this translation unit, something magic in the system
186    configury, or (if not doing unit-at-a-time) to something we havn't
187    seen yet.  */
188
189 static bool
190 decide_is_function_needed (struct cgraph_node *node, tree decl)
191 {
192   tree origin;
193   if (MAIN_NAME_P (DECL_NAME (decl))
194       && TREE_PUBLIC (decl))
195     {
196       node->local.externally_visible = true;
197       return true;
198     }
199
200   /* If the user told us it is used, then it must be so.  */
201   if (node->local.externally_visible
202       || lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
203     return true;
204
205   /* ??? If the assembler name is set by hand, it is possible to assemble
206      the name later after finalizing the function and the fact is noticed
207      in assemble_name then.  This is arguably a bug.  */
208   if (DECL_ASSEMBLER_NAME_SET_P (decl)
209       && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
210     return true;
211
212   /* If we decided it was needed before, but at the time we didn't have
213      the body of the function available, then it's still needed.  We have
214      to go back and re-check its dependencies now.  */
215   if (node->needed)
216     return true;
217
218   /* Externally visible functions must be output.  The exception is
219      COMDAT functions that must be output only when they are needed.  */
220   if ((TREE_PUBLIC (decl) && !flag_whole_program)
221       && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
222     return true;
223
224   /* Constructors and destructors are reachable from the runtime by
225      some mechanism.  */
226   if (DECL_STATIC_CONSTRUCTOR (decl) || DECL_STATIC_DESTRUCTOR (decl))
227     return true;
228
229   if (flag_unit_at_a_time)
230     return false;
231
232   /* If not doing unit at a time, then we'll only defer this function
233      if its marked for inlining.  Otherwise we want to emit it now.  */
234
235   /* "extern inline" functions are never output locally.  */
236   if (DECL_EXTERNAL (decl))
237     return false;
238   /* Nested functions of extern inline function shall not be emit unless
239      we inlined the origin.  */
240   for (origin = decl_function_context (decl); origin;
241        origin = decl_function_context (origin))
242     if (DECL_EXTERNAL (origin))
243       return false;
244   /* We want to emit COMDAT functions only when absolutely necessary.  */
245   if (DECL_COMDAT (decl))
246     return false;
247   if (!DECL_INLINE (decl)
248       || (!node->local.disregard_inline_limits
249           /* When declared inline, defer even the uninlinable functions.
250              This allows them to be eliminated when unused.  */
251           && !DECL_DECLARED_INLINE_P (decl) 
252           && (!node->local.inlinable || !cgraph_default_inline_p (node, NULL))))
253     return true;
254
255   return false;
256 }
257
258 /* Walk the decls we marked as necessary and see if they reference new
259    variables or functions and add them into the worklists.  */
260 static bool
261 cgraph_varpool_analyze_pending_decls (void)
262 {
263   bool changed = false;
264   timevar_push (TV_CGRAPH);
265
266   while (cgraph_varpool_first_unanalyzed_node)
267     {
268       tree decl = cgraph_varpool_first_unanalyzed_node->decl;
269
270       cgraph_varpool_first_unanalyzed_node->analyzed = true;
271
272       cgraph_varpool_first_unanalyzed_node = cgraph_varpool_first_unanalyzed_node->next_needed;
273
274       if (DECL_INITIAL (decl))
275         {
276           visited_nodes = pointer_set_create ();
277           walk_tree (&DECL_INITIAL (decl), record_reference, NULL, visited_nodes);
278           pointer_set_destroy (visited_nodes);
279           visited_nodes = NULL;
280         }
281       changed = true;
282     }
283   timevar_pop (TV_CGRAPH);
284   return changed;
285 }
286
287 /* Optimization of function bodies might've rendered some variables as
288    unnecessary so we want to avoid these from being compiled.
289
290    This is done by pruning the queue and keeping only the variables that
291    really appear needed (ie they are either externally visible or referenced
292    by compiled function). Re-doing the reachability analysis on variables
293    brings back the remaining variables referenced by these.  */
294 static void
295 cgraph_varpool_remove_unreferenced_decls (void)
296 {
297   struct cgraph_varpool_node *next, *node = cgraph_varpool_nodes_queue;
298
299   cgraph_varpool_reset_queue ();
300
301   if (errorcount || sorrycount)
302     return;
303
304   while (node)
305     {
306       tree decl = node->decl;
307       next = node->next_needed;
308       node->needed = 0;
309
310       if (node->finalized
311           && ((DECL_ASSEMBLER_NAME_SET_P (decl)
312                && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
313               || node->force_output
314               || decide_is_variable_needed (node, decl)
315               /* ??? Cgraph does not yet rule the world with an iron hand, 
316                  and does not control the emission of debug information.
317                  After a variable has its DECL_RTL set, we must assume that
318                  it may be referenced by the debug information, and we can
319                  no longer elide it.  */
320               || DECL_RTL_SET_P (decl)))
321         cgraph_varpool_mark_needed_node (node);
322
323       node = next;
324     }
325   /* Make sure we mark alias targets as used targets.  */
326   finish_aliases_1 ();
327   cgraph_varpool_analyze_pending_decls ();
328 }
329
330
331 /* When not doing unit-at-a-time, output all functions enqueued.
332    Return true when such a functions were found.  */
333
334 bool
335 cgraph_assemble_pending_functions (void)
336 {
337   bool output = false;
338
339   if (flag_unit_at_a_time)
340     return false;
341
342   cgraph_output_pending_asms ();
343
344   while (cgraph_nodes_queue)
345     {
346       struct cgraph_node *n = cgraph_nodes_queue;
347
348       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
349       n->next_needed = NULL;
350       if (!n->global.inlined_to
351           && !n->alias
352           && !DECL_EXTERNAL (n->decl))
353         {
354           cgraph_expand_function (n);
355           output = true;
356         }
357     }
358
359   /* Process CGRAPH_EXPAND_QUEUE, these are functions created during
360      the expansion process.  Note that this queue may grow as its
361      being processed, as the new functions may generate new ones.  */
362   while (cgraph_expand_queue)
363     {
364       struct cgraph_node *n = cgraph_expand_queue;
365       cgraph_expand_queue = cgraph_expand_queue->next_needed;
366       n->next_needed = NULL;
367       cgraph_finalize_function (n->decl, false);
368       output = true;
369     }
370
371   return output;
372 }
373
374
375 /* As an GCC extension we allow redefinition of the function.  The
376    semantics when both copies of bodies differ is not well defined.
377    We replace the old body with new body so in unit at a time mode
378    we always use new body, while in normal mode we may end up with
379    old body inlined into some functions and new body expanded and
380    inlined in others.
381
382    ??? It may make more sense to use one body for inlining and other
383    body for expanding the function but this is difficult to do.  */
384
385 static void
386 cgraph_reset_node (struct cgraph_node *node)
387 {
388   /* If node->output is set, then this is a unit-at-a-time compilation
389      and we have already begun whole-unit analysis.  This is *not*
390      testing for whether we've already emitted the function.  That
391      case can be sort-of legitimately seen with real function 
392      redefinition errors.  I would argue that the front end should
393      never present us with such a case, but don't enforce that for now.  */
394   gcc_assert (!node->output);
395
396   /* Reset our data structures so we can analyze the function again.  */
397   memset (&node->local, 0, sizeof (node->local));
398   memset (&node->global, 0, sizeof (node->global));
399   memset (&node->rtl, 0, sizeof (node->rtl));
400   node->analyzed = false;
401   node->local.redefined_extern_inline = true;
402   node->local.finalized = false;
403
404   if (!flag_unit_at_a_time)
405     {
406       struct cgraph_node *n;
407
408       for (n = cgraph_nodes; n; n = n->next)
409         if (n->global.inlined_to == node)
410           cgraph_remove_node (n);
411     }
412
413   cgraph_node_remove_callees (node);
414
415   /* We may need to re-queue the node for assembling in case
416      we already proceeded it and ignored as not needed.  */
417   if (node->reachable && !flag_unit_at_a_time)
418     {
419       struct cgraph_node *n;
420
421       for (n = cgraph_nodes_queue; n; n = n->next_needed)
422         if (n == node)
423           break;
424       if (!n)
425         node->reachable = 0;
426     }
427 }
428
429 static void
430 cgraph_lower_function (struct cgraph_node *node)
431 {
432   if (node->lowered)
433     return;
434   tree_lowering_passes (node->decl);
435   node->lowered = true;
436 }
437
438 /* DECL has been parsed.  Take it, queue it, compile it at the whim of the
439    logic in effect.  If NESTED is true, then our caller cannot stand to have
440    the garbage collector run at the moment.  We would need to either create
441    a new GC context, or just not compile right now.  */
442
443 void
444 cgraph_finalize_function (tree decl, bool nested)
445 {
446   struct cgraph_node *node = cgraph_node (decl);
447
448   if (node->local.finalized)
449     cgraph_reset_node (node);
450
451   notice_global_symbol (decl);
452   node->decl = decl;
453   node->local.finalized = true;
454   node->lowered = DECL_STRUCT_FUNCTION (decl)->cfg != NULL;
455   if (node->nested)
456     lower_nested_functions (decl);
457   gcc_assert (!node->nested);
458
459   /* If not unit at a time, then we need to create the call graph
460      now, so that called functions can be queued and emitted now.  */
461   if (!flag_unit_at_a_time)
462     {
463       cgraph_analyze_function (node);
464       cgraph_decide_inlining_incrementally (node, false);
465     }
466
467   if (decide_is_function_needed (node, decl))
468     cgraph_mark_needed_node (node);
469
470   /* Since we reclaim unreachable nodes at the end of every language
471      level unit, we need to be conservative about possible entry points
472      there.  */
473   if ((TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl)))
474     cgraph_mark_reachable_node (node);
475
476   /* If not unit at a time, go ahead and emit everything we've found
477      to be reachable at this time.  */
478   if (!nested)
479     {
480       if (!cgraph_assemble_pending_functions ())
481         ggc_collect ();
482     }
483
484   /* If we've not yet emitted decl, tell the debug info about it.  */
485   if (!TREE_ASM_WRITTEN (decl))
486     (*debug_hooks->deferred_inline_function) (decl);
487
488   /* Possibly warn about unused parameters.  */
489   if (warn_unused_parameter)
490     do_warn_unused_parameter (decl);
491 }
492
493 /* Walk tree and record all calls.  Called via walk_tree.  */
494 static tree
495 record_reference (tree *tp, int *walk_subtrees, void *data)
496 {
497   tree t = *tp;
498
499   switch (TREE_CODE (t))
500     {
501     case VAR_DECL:
502       /* ??? Really, we should mark this decl as *potentially* referenced
503          by this function and re-examine whether the decl is actually used
504          after rtl has been generated.  */
505       if (TREE_STATIC (t) || DECL_EXTERNAL (t))
506         {
507           cgraph_varpool_mark_needed_node (cgraph_varpool_node (t));
508           if (lang_hooks.callgraph.analyze_expr)
509             return lang_hooks.callgraph.analyze_expr (tp, walk_subtrees, 
510                                                       data);
511         }
512       break;
513
514     case FDESC_EXPR:
515     case ADDR_EXPR:
516       if (flag_unit_at_a_time)
517         {
518           /* Record dereferences to the functions.  This makes the
519              functions reachable unconditionally.  */
520           tree decl = TREE_OPERAND (*tp, 0);
521           if (TREE_CODE (decl) == FUNCTION_DECL)
522             cgraph_mark_needed_node (cgraph_node (decl));
523         }
524       break;
525
526     default:
527       /* Save some cycles by not walking types and declaration as we
528          won't find anything useful there anyway.  */
529       if (IS_TYPE_OR_DECL_P (*tp))
530         {
531           *walk_subtrees = 0;
532           break;
533         }
534
535       if ((unsigned int) TREE_CODE (t) >= LAST_AND_UNUSED_TREE_CODE)
536         return lang_hooks.callgraph.analyze_expr (tp, walk_subtrees, data);
537       break;
538     }
539
540   return NULL;
541 }
542
543 /* Create cgraph edges for function calls inside BODY from NODE.  */
544
545 static void
546 cgraph_create_edges (struct cgraph_node *node, tree body)
547 {
548   basic_block bb;
549
550   struct function *this_cfun = DECL_STRUCT_FUNCTION (body);
551   block_stmt_iterator bsi;
552   tree step;
553   visited_nodes = pointer_set_create ();
554
555   /* Reach the trees by walking over the CFG, and note the 
556      enclosing basic-blocks in the call edges.  */
557   FOR_EACH_BB_FN (bb, this_cfun)
558     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
559       {
560         tree stmt = bsi_stmt (bsi);
561         tree call = get_call_expr_in (stmt);
562         tree decl;
563
564         if (call && (decl = get_callee_fndecl (call)))
565           {
566             cgraph_create_edge (node, cgraph_node (decl), stmt,
567                                 bb->count,
568                                 bb->loop_depth);
569             walk_tree (&TREE_OPERAND (call, 1),
570                        record_reference, node, visited_nodes);
571             if (TREE_CODE (stmt) == MODIFY_EXPR)
572               walk_tree (&TREE_OPERAND (stmt, 0),
573                          record_reference, node, visited_nodes);
574           }
575         else 
576           walk_tree (bsi_stmt_ptr (bsi), record_reference, node, visited_nodes);
577       }
578
579   /* Look for initializers of constant variables and private statics.  */
580   for (step = DECL_STRUCT_FUNCTION (body)->unexpanded_var_list;
581        step;
582        step = TREE_CHAIN (step))
583     {
584       tree decl = TREE_VALUE (step);
585       if (TREE_CODE (decl) == VAR_DECL
586           && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
587           && flag_unit_at_a_time)
588         cgraph_varpool_finalize_decl (decl);
589       else if (TREE_CODE (decl) == VAR_DECL && DECL_INITIAL (decl))
590         walk_tree (&DECL_INITIAL (decl), record_reference, node, visited_nodes);
591     }
592     
593   pointer_set_destroy (visited_nodes);
594   visited_nodes = NULL;
595 }
596
597 /* Give initial reasons why inlining would fail.  Those gets
598    either NULLified or usually overwritten by more precise reason
599    later.  */
600 static void
601 initialize_inline_failed (struct cgraph_node *node)
602 {
603   struct cgraph_edge *e;
604
605   for (e = node->callers; e; e = e->next_caller)
606     {
607       gcc_assert (!e->callee->global.inlined_to);
608       gcc_assert (e->inline_failed);
609       if (node->local.redefined_extern_inline)
610         e->inline_failed = N_("redefined extern inline functions are not "
611                            "considered for inlining");
612       else if (!node->local.inlinable)
613         e->inline_failed = N_("function not inlinable");
614       else
615         e->inline_failed = N_("function not considered for inlining");
616     }
617 }
618
619 /* Rebuild call edges from current function after a passes not aware
620    of cgraph updating.  */
621 static void
622 rebuild_cgraph_edges (void)
623 {
624   basic_block bb;
625   struct cgraph_node *node = cgraph_node (current_function_decl);
626   block_stmt_iterator bsi;
627
628   cgraph_node_remove_callees (node);
629
630   node->count = ENTRY_BLOCK_PTR->count;
631
632   FOR_EACH_BB (bb)
633     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
634       {
635         tree stmt = bsi_stmt (bsi);
636         tree call = get_call_expr_in (stmt);
637         tree decl;
638
639         if (call && (decl = get_callee_fndecl (call)))
640           cgraph_create_edge (node, cgraph_node (decl), stmt,
641                               bb->count,
642                               bb->loop_depth);
643       }
644   initialize_inline_failed (node);
645   gcc_assert (!node->global.inlined_to);
646 }
647
648 struct tree_opt_pass pass_rebuild_cgraph_edges =
649 {
650   NULL,                                 /* name */
651   NULL,                                 /* gate */
652   rebuild_cgraph_edges,                 /* execute */
653   NULL,                                 /* sub */
654   NULL,                                 /* next */
655   0,                                    /* static_pass_number */
656   0,                                    /* tv_id */
657   PROP_cfg,                             /* properties_required */
658   0,                                    /* properties_provided */
659   0,                                    /* properties_destroyed */
660   0,                                    /* todo_flags_start */
661   0,                                    /* todo_flags_finish */
662   0                                     /* letter */
663 };
664
665 /* Verify cgraph nodes of given cgraph node.  */
666 void
667 verify_cgraph_node (struct cgraph_node *node)
668 {
669   struct cgraph_edge *e;
670   struct cgraph_node *main_clone;
671   struct function *this_cfun = DECL_STRUCT_FUNCTION (node->decl);
672   basic_block this_block;
673   block_stmt_iterator bsi;
674   bool error_found = false;
675
676   timevar_push (TV_CGRAPH_VERIFY);
677   for (e = node->callees; e; e = e->next_callee)
678     if (e->aux)
679       {
680         error ("aux field set for edge %s->%s",
681                cgraph_node_name (e->caller), cgraph_node_name (e->callee));
682         error_found = true;
683       }
684   if (node->count < 0)
685     {
686       error ("Execution count is negative");
687       error_found = true;
688     }
689   for (e = node->callers; e; e = e->next_caller)
690     {
691       if (e->count < 0)
692         {
693           error ("caller edge count is negative");
694           error_found = true;
695         }
696       if (!e->inline_failed)
697         {
698           if (node->global.inlined_to
699               != (e->caller->global.inlined_to
700                   ? e->caller->global.inlined_to : e->caller))
701             {
702               error ("inlined_to pointer is wrong");
703               error_found = true;
704             }
705           if (node->callers->next_caller)
706             {
707               error ("multiple inline callers");
708               error_found = true;
709             }
710         }
711       else
712         if (node->global.inlined_to)
713           {
714             error ("inlined_to pointer set for noninline callers");
715             error_found = true;
716           }
717     }
718   if (!node->callers && node->global.inlined_to)
719     {
720       error ("inlined_to pointer is set but no predecesors found");
721       error_found = true;
722     }
723   if (node->global.inlined_to == node)
724     {
725       error ("inlined_to pointer refers to itself");
726       error_found = true;
727     }
728
729   for (main_clone = cgraph_node (node->decl); main_clone;
730        main_clone = main_clone->next_clone)
731     if (main_clone == node)
732       break;
733   if (!node)
734     {
735       error ("node not found in DECL_ASSEMBLER_NAME hash");
736       error_found = true;
737     }
738   
739   if (node->analyzed
740       && DECL_SAVED_TREE (node->decl) && !TREE_ASM_WRITTEN (node->decl)
741       && (!DECL_EXTERNAL (node->decl) || node->global.inlined_to))
742     {
743       if (this_cfun->cfg)
744         {
745           /* The nodes we're interested in are never shared, so walk
746              the tree ignoring duplicates.  */
747           visited_nodes = pointer_set_create ();
748           /* Reach the trees by walking over the CFG, and note the
749              enclosing basic-blocks in the call edges.  */
750           FOR_EACH_BB_FN (this_block, this_cfun)
751             for (bsi = bsi_start (this_block); !bsi_end_p (bsi); bsi_next (&bsi))
752               {
753                 tree stmt = bsi_stmt (bsi);
754                 tree call = get_call_expr_in (stmt);
755                 tree decl;
756                 if (call && (decl = get_callee_fndecl (call)))
757                   {
758                     struct cgraph_edge *e = cgraph_edge (node, stmt);
759                     if (e)
760                       {
761                         if (e->aux)
762                           {
763                             error ("shared call_stmt:");
764                             debug_generic_stmt (stmt);
765                             error_found = true;
766                           }
767                         if (e->callee->decl != cgraph_node (decl)->decl
768                             && e->inline_failed)
769                           {
770                             error ("edge points to wrong declaration:");
771                             debug_tree (e->callee->decl);
772                             fprintf (stderr," Instead of:");
773                             debug_tree (decl);
774                           }
775                         e->aux = (void *)1;
776                       }
777                     else
778                       {
779                         error ("missing callgraph edge for call stmt:");
780                         debug_generic_stmt (stmt);
781                         error_found = true;
782                       }
783                   }
784               }
785           pointer_set_destroy (visited_nodes);
786           visited_nodes = NULL;
787         }
788       else
789         /* No CFG available?!  */
790         gcc_unreachable ();
791
792       for (e = node->callees; e; e = e->next_callee)
793         {
794           if (!e->aux)
795             {
796               error ("edge %s->%s has no corresponding call_stmt",
797                      cgraph_node_name (e->caller),
798                      cgraph_node_name (e->callee));
799               debug_generic_stmt (e->call_stmt);
800               error_found = true;
801             }
802           e->aux = 0;
803         }
804     }
805   if (error_found)
806     {
807       dump_cgraph_node (stderr, node);
808       internal_error ("verify_cgraph_node failed");
809     }
810   timevar_pop (TV_CGRAPH_VERIFY);
811 }
812
813 /* Verify whole cgraph structure.  */
814 void
815 verify_cgraph (void)
816 {
817   struct cgraph_node *node;
818
819   if (sorrycount || errorcount)
820     return;
821
822   for (node = cgraph_nodes; node; node = node->next)
823     verify_cgraph_node (node);
824 }
825
826 /* Output one variable, if necessary.  Return whether we output it.  */
827 static bool
828 cgraph_varpool_assemble_decl (struct cgraph_varpool_node *node)
829 {
830   tree decl = node->decl;
831
832   if (!TREE_ASM_WRITTEN (decl)
833       && !node->alias
834       && !DECL_EXTERNAL (decl)
835       && (TREE_CODE (decl) != VAR_DECL || !DECL_HAS_VALUE_EXPR_P (decl)))
836     {
837       assemble_variable (decl, 0, 1, 0);
838       /* Local static variables are never seen by check_global_declarations
839          so we need to output debug info by hand.  */
840       if (DECL_CONTEXT (decl) 
841           && (TREE_CODE (DECL_CONTEXT (decl)) == BLOCK
842               || TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
843           && errorcount == 0 && sorrycount == 0)
844         {
845           timevar_push (TV_SYMOUT);
846           (*debug_hooks->global_decl) (decl);
847           timevar_pop (TV_SYMOUT);
848         }
849       return true;
850     }
851
852   return false;
853 }
854
855 /* Output all variables enqueued to be assembled.  */
856 bool
857 cgraph_varpool_assemble_pending_decls (void)
858 {
859   bool changed = false;
860
861   if (errorcount || sorrycount)
862     return false;
863  
864   /* EH might mark decls as needed during expansion.  This should be safe since
865      we don't create references to new function, but it should not be used
866      elsewhere.  */
867   cgraph_varpool_analyze_pending_decls ();
868
869   while (cgraph_varpool_nodes_queue)
870     {
871       struct cgraph_varpool_node *node = cgraph_varpool_nodes_queue;
872
873       cgraph_varpool_nodes_queue = cgraph_varpool_nodes_queue->next_needed;
874       if (cgraph_varpool_assemble_decl (node))
875         changed = true;
876       node->next_needed = NULL;
877     }
878   return changed;
879 }
880
881 /* Output all asm statements we have stored up to be output.  */
882
883 static void
884 cgraph_output_pending_asms (void)
885 {
886   struct cgraph_asm_node *can;
887
888   if (errorcount || sorrycount)
889     return;
890
891   for (can = cgraph_asm_nodes; can; can = can->next)
892     assemble_asm (can->asm_str);
893   cgraph_asm_nodes = NULL;
894 }
895
896 /* Analyze the function scheduled to be output.  */
897 void
898 cgraph_analyze_function (struct cgraph_node *node)
899 {
900   tree decl = node->decl;
901
902   current_function_decl = decl;
903   push_cfun (DECL_STRUCT_FUNCTION (decl));
904   cgraph_lower_function (node);
905
906   /* First kill forward declaration so reverse inlining works properly.  */
907   cgraph_create_edges (node, decl);
908
909   node->local.inlinable = tree_inlinable_function_p (decl);
910   node->local.self_insns = estimate_num_insns (decl);
911   if (node->local.inlinable)
912     node->local.disregard_inline_limits
913       = lang_hooks.tree_inlining.disregard_inline_limits (decl);
914   initialize_inline_failed (node);
915   if (flag_really_no_inline && !node->local.disregard_inline_limits)
916     node->local.inlinable = 0;
917   /* Inlining characteristics are maintained by the cgraph_mark_inline.  */
918   node->global.insns = node->local.self_insns;
919
920   node->analyzed = true;
921   pop_cfun ();
922   current_function_decl = NULL;
923 }
924
925 /* Analyze the whole compilation unit once it is parsed completely.  */
926
927 void
928 cgraph_finalize_compilation_unit (void)
929 {
930   struct cgraph_node *node;
931   /* Keep track of already processed nodes when called multiple times for
932      intermodule optimization.  */
933   static struct cgraph_node *first_analyzed;
934
935   finish_aliases_1 ();
936
937   if (!flag_unit_at_a_time)
938     {
939       cgraph_output_pending_asms ();
940       cgraph_assemble_pending_functions ();
941       return;
942     }
943
944   if (!quiet_flag)
945     {
946       fprintf (stderr, "\nAnalyzing compilation unit");
947       fflush (stderr);
948     }
949
950   timevar_push (TV_CGRAPH);
951   cgraph_varpool_analyze_pending_decls ();
952   if (cgraph_dump_file)
953     {
954       fprintf (cgraph_dump_file, "Initial entry points:");
955       for (node = cgraph_nodes; node != first_analyzed; node = node->next)
956         if (node->needed && DECL_SAVED_TREE (node->decl))
957           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
958       fprintf (cgraph_dump_file, "\n");
959     }
960
961   /* Propagate reachability flag and lower representation of all reachable
962      functions.  In the future, lowering will introduce new functions and
963      new entry points on the way (by template instantiation and virtual
964      method table generation for instance).  */
965   while (cgraph_nodes_queue)
966     {
967       struct cgraph_edge *edge;
968       tree decl = cgraph_nodes_queue->decl;
969
970       node = cgraph_nodes_queue;
971       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
972       node->next_needed = NULL;
973
974       /* ??? It is possible to create extern inline function and later using
975          weak alias attribute to kill its body. See
976          gcc.c-torture/compile/20011119-1.c  */
977       if (!DECL_SAVED_TREE (decl))
978         {
979           cgraph_reset_node (node);
980           continue;
981         }
982
983       gcc_assert (!node->analyzed && node->reachable);
984       gcc_assert (DECL_SAVED_TREE (decl));
985
986       cgraph_analyze_function (node);
987
988       for (edge = node->callees; edge; edge = edge->next_callee)
989         if (!edge->callee->reachable)
990           cgraph_mark_reachable_node (edge->callee);
991
992       cgraph_varpool_analyze_pending_decls ();
993     }
994
995   /* Collect entry points to the unit.  */
996
997   if (cgraph_dump_file)
998     {
999       fprintf (cgraph_dump_file, "Unit entry points:");
1000       for (node = cgraph_nodes; node != first_analyzed; node = node->next)
1001         if (node->needed && DECL_SAVED_TREE (node->decl))
1002           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
1003       fprintf (cgraph_dump_file, "\n\nInitial ");
1004       dump_cgraph (cgraph_dump_file);
1005     }
1006
1007   if (cgraph_dump_file)
1008     fprintf (cgraph_dump_file, "\nReclaiming functions:");
1009
1010   for (node = cgraph_nodes; node != first_analyzed; node = node->next)
1011     {
1012       tree decl = node->decl;
1013
1014       if (node->local.finalized && !DECL_SAVED_TREE (decl))
1015         cgraph_reset_node (node);
1016
1017       if (!node->reachable && DECL_SAVED_TREE (decl))
1018         {
1019           if (cgraph_dump_file)
1020             fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
1021           cgraph_remove_node (node);
1022           continue;
1023         }
1024       else
1025         node->next_needed = NULL;
1026       gcc_assert (!node->local.finalized || DECL_SAVED_TREE (decl));
1027       gcc_assert (node->analyzed == node->local.finalized);
1028     }
1029   if (cgraph_dump_file)
1030     {
1031       fprintf (cgraph_dump_file, "\n\nReclaimed ");
1032       dump_cgraph (cgraph_dump_file);
1033     }
1034   first_analyzed = cgraph_nodes;
1035   ggc_collect ();
1036   timevar_pop (TV_CGRAPH);
1037 }
1038 /* Figure out what functions we want to assemble.  */
1039
1040 static void
1041 cgraph_mark_functions_to_output (void)
1042 {
1043   struct cgraph_node *node;
1044
1045   for (node = cgraph_nodes; node; node = node->next)
1046     {
1047       tree decl = node->decl;
1048       struct cgraph_edge *e;
1049       
1050       gcc_assert (!node->output);
1051
1052       for (e = node->callers; e; e = e->next_caller)
1053         if (e->inline_failed)
1054           break;
1055
1056       /* We need to output all local functions that are used and not
1057          always inlined, as well as those that are reachable from
1058          outside the current compilation unit.  */
1059       if (DECL_SAVED_TREE (decl)
1060           && !node->global.inlined_to
1061           && (node->needed
1062               || (e && node->reachable))
1063           && !TREE_ASM_WRITTEN (decl)
1064           && !DECL_EXTERNAL (decl))
1065         node->output = 1;
1066       else
1067         {
1068           /* We should've reclaimed all functions that are not needed.  */
1069 #ifdef ENABLE_CHECKING
1070           if (!node->global.inlined_to && DECL_SAVED_TREE (decl)
1071               && !DECL_EXTERNAL (decl))
1072             {
1073               dump_cgraph_node (stderr, node);
1074               internal_error ("failed to reclaim unneeded function");
1075             }
1076 #endif
1077           gcc_assert (node->global.inlined_to || !DECL_SAVED_TREE (decl)
1078                       || DECL_EXTERNAL (decl));
1079
1080         }
1081       
1082     }
1083 }
1084
1085 /* Expand function specified by NODE.  */
1086
1087 static void
1088 cgraph_expand_function (struct cgraph_node *node)
1089 {
1090   tree decl = node->decl;
1091
1092   /* We ought to not compile any inline clones.  */
1093   gcc_assert (!node->global.inlined_to);
1094
1095   if (flag_unit_at_a_time)
1096     announce_function (decl);
1097
1098   cgraph_lower_function (node);
1099
1100   /* Generate RTL for the body of DECL.  */
1101   lang_hooks.callgraph.expand_function (decl);
1102
1103   /* Make sure that BE didn't give up on compiling.  */
1104   /* ??? Can happen with nested function of extern inline.  */
1105   gcc_assert (TREE_ASM_WRITTEN (node->decl));
1106
1107   current_function_decl = NULL;
1108   if (!cgraph_preserve_function_body_p (node->decl))
1109     {
1110       DECL_SAVED_TREE (node->decl) = NULL;
1111       DECL_STRUCT_FUNCTION (node->decl) = NULL;
1112       DECL_INITIAL (node->decl) = error_mark_node;
1113       /* Eliminate all call edges.  This is important so the call_expr no longer
1114          points to the dead function body.  */
1115       cgraph_node_remove_callees (node);
1116     }
1117
1118   cgraph_function_flags_ready = true;
1119 }
1120
1121 /* Return true when CALLER_DECL should be inlined into CALLEE_DECL.  */
1122
1123 bool
1124 cgraph_inline_p (struct cgraph_edge *e, const char **reason)
1125 {
1126   *reason = e->inline_failed;
1127   return !e->inline_failed;
1128 }
1129
1130
1131
1132 /* Expand all functions that must be output.
1133
1134    Attempt to topologically sort the nodes so function is output when
1135    all called functions are already assembled to allow data to be
1136    propagated across the callgraph.  Use a stack to get smaller distance
1137    between a function and its callees (later we may choose to use a more
1138    sophisticated algorithm for function reordering; we will likely want
1139    to use subsections to make the output functions appear in top-down
1140    order).  */
1141
1142 static void
1143 cgraph_expand_all_functions (void)
1144 {
1145   struct cgraph_node *node;
1146   struct cgraph_node **order = XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
1147   int order_pos = 0, new_order_pos = 0;
1148   int i;
1149
1150   order_pos = cgraph_postorder (order);
1151   gcc_assert (order_pos == cgraph_n_nodes);
1152
1153   /* Garbage collector may remove inline clones we eliminate during
1154      optimization.  So we must be sure to not reference them.  */
1155   for (i = 0; i < order_pos; i++)
1156     if (order[i]->output)
1157       order[new_order_pos++] = order[i];
1158
1159   for (i = new_order_pos - 1; i >= 0; i--)
1160     {
1161       node = order[i];
1162       if (node->output)
1163         {
1164           gcc_assert (node->reachable);
1165           node->output = 0;
1166           cgraph_expand_function (node);
1167         }
1168     }
1169
1170   free (order);
1171
1172   /* Process CGRAPH_EXPAND_QUEUE, these are functions created during
1173      the expansion process.  Note that this queue may grow as its
1174      being processed, as the new functions may generate new ones.  */
1175   while (cgraph_expand_queue)
1176     {
1177       node = cgraph_expand_queue;
1178       cgraph_expand_queue = cgraph_expand_queue->next_needed;
1179       node->next_needed = NULL;
1180       node->output = 0;
1181       node->lowered = DECL_STRUCT_FUNCTION (node->decl)->cfg != NULL;
1182       cgraph_expand_function (node);
1183     }
1184 }
1185
1186 /* This is used to sort the node types by the cgraph order number.  */
1187
1188 struct cgraph_order_sort
1189 {
1190   enum { ORDER_UNDEFINED = 0, ORDER_FUNCTION, ORDER_VAR, ORDER_ASM } kind;
1191   union
1192   {
1193     struct cgraph_node *f;
1194     struct cgraph_varpool_node *v;
1195     struct cgraph_asm_node *a;
1196   } u;
1197 };
1198
1199 /* Output all functions, variables, and asm statements in the order
1200    according to their order fields, which is the order in which they
1201    appeared in the file.  This implements -fno-toplevel-reorder.  In
1202    this mode we may output functions and variables which don't really
1203    need to be output.  */
1204
1205 static void
1206 cgraph_output_in_order (void)
1207 {
1208   int max;
1209   size_t size;
1210   struct cgraph_order_sort *nodes;
1211   int i;
1212   struct cgraph_node *pf;
1213   struct cgraph_varpool_node *pv;
1214   struct cgraph_asm_node *pa;
1215
1216   max = cgraph_order;
1217   size = max * sizeof (struct cgraph_order_sort);
1218   nodes = (struct cgraph_order_sort *) alloca (size);
1219   memset (nodes, 0, size);
1220
1221   cgraph_varpool_analyze_pending_decls ();
1222
1223   for (pf = cgraph_nodes; pf; pf = pf->next)
1224     {
1225       if (pf->output)
1226         {
1227           i = pf->order;
1228           gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
1229           nodes[i].kind = ORDER_FUNCTION;
1230           nodes[i].u.f = pf;
1231         }
1232     }
1233
1234   for (pv = cgraph_varpool_nodes_queue; pv; pv = pv->next_needed)
1235     {
1236       i = pv->order;
1237       gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
1238       nodes[i].kind = ORDER_VAR;
1239       nodes[i].u.v = pv;
1240     }
1241
1242   for (pa = cgraph_asm_nodes; pa; pa = pa->next)
1243     {
1244       i = pa->order;
1245       gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
1246       nodes[i].kind = ORDER_ASM;
1247       nodes[i].u.a = pa;
1248     }
1249
1250   for (i = 0; i < max; ++i)
1251     {
1252       switch (nodes[i].kind)
1253         {
1254         case ORDER_FUNCTION:
1255           nodes[i].u.f->output = 0;
1256           cgraph_expand_function (nodes[i].u.f);
1257           break;
1258
1259         case ORDER_VAR:
1260           cgraph_varpool_assemble_decl (nodes[i].u.v);
1261           break;
1262
1263         case ORDER_ASM:
1264           assemble_asm (nodes[i].u.a->asm_str);
1265           break;
1266
1267         case ORDER_UNDEFINED:
1268           break;
1269
1270         default:
1271           gcc_unreachable ();
1272         }
1273     }
1274
1275   cgraph_asm_nodes = NULL;
1276 }
1277
1278 /* Mark visibility of all functions.
1279    
1280    A local function is one whose calls can occur only in the current
1281    compilation unit and all its calls are explicit, so we can change
1282    its calling convention.  We simply mark all static functions whose
1283    address is not taken as local.
1284
1285    We also change the TREE_PUBLIC flag of all declarations that are public
1286    in language point of view but we want to overwrite this default
1287    via visibilities for the backend point of view.  */
1288
1289 static void
1290 cgraph_function_and_variable_visibility (void)
1291 {
1292   struct cgraph_node *node;
1293   struct cgraph_varpool_node *vnode;
1294
1295   for (node = cgraph_nodes; node; node = node->next)
1296     {
1297       if (node->reachable
1298           && (DECL_COMDAT (node->decl)
1299               || (!flag_whole_program
1300                   && TREE_PUBLIC (node->decl) && !DECL_EXTERNAL (node->decl))))
1301         node->local.externally_visible = true;
1302       if (!node->local.externally_visible && node->analyzed
1303           && !DECL_EXTERNAL (node->decl))
1304         {
1305           gcc_assert (flag_whole_program || !TREE_PUBLIC (node->decl));
1306           TREE_PUBLIC (node->decl) = 0;
1307         }
1308       node->local.local = (!node->needed
1309                            && node->analyzed
1310                            && !DECL_EXTERNAL (node->decl)
1311                            && !node->local.externally_visible);
1312     }
1313   for (vnode = cgraph_varpool_nodes_queue; vnode; vnode = vnode->next_needed)
1314     {
1315       if (vnode->needed
1316           && !flag_whole_program
1317           && (DECL_COMDAT (vnode->decl) || TREE_PUBLIC (vnode->decl)))
1318         vnode->externally_visible = 1;
1319       if (!vnode->externally_visible)
1320         {
1321           gcc_assert (flag_whole_program || !TREE_PUBLIC (vnode->decl));
1322           TREE_PUBLIC (vnode->decl) = 0;
1323         }
1324      gcc_assert (TREE_STATIC (vnode->decl));
1325     }
1326
1327   /* Because we have to be conservative on the boundaries of source
1328      level units, it is possible that we marked some functions in
1329      reachable just because they might be used later via external
1330      linkage, but after making them local they are really unreachable
1331      now.  */
1332   cgraph_remove_unreachable_nodes (true, cgraph_dump_file);
1333
1334   if (cgraph_dump_file)
1335     {
1336       fprintf (cgraph_dump_file, "\nMarking local functions:");
1337       for (node = cgraph_nodes; node; node = node->next)
1338         if (node->local.local)
1339           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
1340       fprintf (cgraph_dump_file, "\n\n");
1341       fprintf (cgraph_dump_file, "\nMarking externally visible functions:");
1342       for (node = cgraph_nodes; node; node = node->next)
1343         if (node->local.externally_visible)
1344           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
1345       fprintf (cgraph_dump_file, "\n\n");
1346     }
1347   cgraph_function_flags_ready = true;
1348 }
1349
1350 /* Return true when function body of DECL still needs to be kept around
1351    for later re-use.  */
1352 bool
1353 cgraph_preserve_function_body_p (tree decl)
1354 {
1355   struct cgraph_node *node;
1356   if (!cgraph_global_info_ready)
1357     return (DECL_INLINE (decl) && !flag_really_no_inline);
1358   /* Look if there is any clone around.  */
1359   for (node = cgraph_node (decl); node; node = node->next_clone)
1360     if (node->global.inlined_to)
1361       return true;
1362   return false;
1363 }
1364
1365 static void
1366 ipa_passes (void)
1367 {
1368   cfun = NULL;
1369   tree_register_cfg_hooks ();
1370   bitmap_obstack_initialize (NULL);
1371   execute_ipa_pass_list (all_ipa_passes);
1372   bitmap_obstack_release (NULL);
1373 }
1374
1375 /* Perform simple optimizations based on callgraph.  */
1376
1377 void
1378 cgraph_optimize (void)
1379 {
1380 #ifdef ENABLE_CHECKING
1381   verify_cgraph ();
1382 #endif
1383   if (!flag_unit_at_a_time)
1384     {
1385       cgraph_output_pending_asms ();
1386       cgraph_varpool_assemble_pending_decls ();
1387       return;
1388     }
1389
1390   process_pending_assemble_externals ();
1391   
1392   /* Frontend may output common variables after the unit has been finalized.
1393      It is safe to deal with them here as they are always zero initialized.  */
1394   cgraph_varpool_analyze_pending_decls ();
1395
1396   timevar_push (TV_CGRAPHOPT);
1397   if (!quiet_flag)
1398     fprintf (stderr, "Performing intraprocedural optimizations\n");
1399
1400   cgraph_function_and_variable_visibility ();
1401   if (cgraph_dump_file)
1402     {
1403       fprintf (cgraph_dump_file, "Marked ");
1404       dump_cgraph (cgraph_dump_file);
1405     }
1406   ipa_passes ();
1407   /* This pass remove bodies of extern inline functions we never inlined.
1408      Do this later so other IPA passes see what is really going on.  */
1409   cgraph_remove_unreachable_nodes (false, dump_file);
1410   cgraph_global_info_ready = true;
1411   if (cgraph_dump_file)
1412     {
1413       fprintf (cgraph_dump_file, "Optimized ");
1414       dump_cgraph (cgraph_dump_file);
1415       dump_varpool (cgraph_dump_file);
1416     }
1417   timevar_pop (TV_CGRAPHOPT);
1418
1419   /* Output everything.  */
1420   if (!quiet_flag)
1421     fprintf (stderr, "Assembling functions:\n");
1422 #ifdef ENABLE_CHECKING
1423   verify_cgraph ();
1424 #endif
1425
1426   cgraph_mark_functions_to_output ();
1427
1428   if (!flag_toplevel_reorder)
1429     cgraph_output_in_order ();
1430   else
1431     {
1432       cgraph_output_pending_asms ();
1433
1434       cgraph_expand_all_functions ();
1435       cgraph_varpool_remove_unreferenced_decls ();
1436
1437       cgraph_varpool_assemble_pending_decls ();
1438     }
1439
1440   if (cgraph_dump_file)
1441     {
1442       fprintf (cgraph_dump_file, "\nFinal ");
1443       dump_cgraph (cgraph_dump_file);
1444     }
1445 #ifdef ENABLE_CHECKING
1446   verify_cgraph ();
1447   /* Double check that all inline clones are gone and that all
1448      function bodies have been released from memory.  */
1449   if (flag_unit_at_a_time
1450       && !dump_enabled_p (TDI_tree_all)
1451       && !(sorrycount || errorcount))
1452     {
1453       struct cgraph_node *node;
1454       bool error_found = false;
1455
1456       for (node = cgraph_nodes; node; node = node->next)
1457         if (node->analyzed
1458             && (node->global.inlined_to
1459                 || DECL_SAVED_TREE (node->decl)))
1460           {
1461             error_found = true;
1462             dump_cgraph_node (stderr, node);
1463           }
1464       if (error_found)
1465         internal_error ("nodes with no released memory found");
1466     }
1467 #endif
1468 }
1469
1470 /* Generate and emit a static constructor or destructor.  WHICH must be
1471    one of 'I' or 'D'.  BODY should be a STATEMENT_LIST containing 
1472    GENERIC statements.  */
1473
1474 void
1475 cgraph_build_static_cdtor (char which, tree body, int priority)
1476 {
1477   static int counter = 0;
1478   char which_buf[16];
1479   tree decl, name, resdecl;
1480
1481   sprintf (which_buf, "%c_%d", which, counter++);
1482   name = get_file_function_name_long (which_buf);
1483
1484   decl = build_decl (FUNCTION_DECL, name,
1485                      build_function_type (void_type_node, void_list_node));
1486   current_function_decl = decl;
1487
1488   resdecl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
1489   DECL_ARTIFICIAL (resdecl) = 1;
1490   DECL_IGNORED_P (resdecl) = 1;
1491   DECL_RESULT (decl) = resdecl;
1492
1493   allocate_struct_function (decl);
1494
1495   TREE_STATIC (decl) = 1;
1496   TREE_USED (decl) = 1;
1497   DECL_ARTIFICIAL (decl) = 1;
1498   DECL_IGNORED_P (decl) = 1;
1499   DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
1500   DECL_SAVED_TREE (decl) = body;
1501   TREE_PUBLIC (decl) = ! targetm.have_ctors_dtors;
1502   DECL_UNINLINABLE (decl) = 1;
1503
1504   DECL_INITIAL (decl) = make_node (BLOCK);
1505   TREE_USED (DECL_INITIAL (decl)) = 1;
1506
1507   DECL_SOURCE_LOCATION (decl) = input_location;
1508   cfun->function_end_locus = input_location;
1509
1510   switch (which)
1511     {
1512     case 'I':
1513       DECL_STATIC_CONSTRUCTOR (decl) = 1;
1514       break;
1515     case 'D':
1516       DECL_STATIC_DESTRUCTOR (decl) = 1;
1517       break;
1518     default:
1519       gcc_unreachable ();
1520     }
1521
1522   gimplify_function_tree (decl);
1523
1524   /* ??? We will get called LATE in the compilation process.  */
1525   if (cgraph_global_info_ready)
1526     {
1527       tree_lowering_passes (decl);
1528       tree_rest_of_compilation (decl);
1529     }
1530   else
1531     cgraph_finalize_function (decl, 0);
1532   
1533   if (targetm.have_ctors_dtors)
1534     {
1535       void (*fn) (rtx, int);
1536
1537       if (which == 'I')
1538         fn = targetm.asm_out.constructor;
1539       else
1540         fn = targetm.asm_out.destructor;
1541       fn (XEXP (DECL_RTL (decl), 0), priority);
1542     }
1543 }
1544
1545 void
1546 init_cgraph (void)
1547 {
1548   cgraph_dump_file = dump_begin (TDI_cgraph, NULL);
1549 }
1550
1551 /* The edges representing the callers of the NEW_VERSION node were 
1552    fixed by cgraph_function_versioning (), now the call_expr in their
1553    respective tree code should be updated to call the NEW_VERSION.  */
1554
1555 static void
1556 update_call_expr (struct cgraph_node *new_version)
1557 {
1558   struct cgraph_edge *e;
1559
1560   gcc_assert (new_version);
1561   for (e = new_version->callers; e; e = e->next_caller)
1562     /* Update the call expr on the edges
1563        to call the new version.  */
1564     TREE_OPERAND (TREE_OPERAND (get_call_expr_in (e->call_stmt), 0), 0) = new_version->decl;
1565 }
1566
1567
1568 /* Create a new cgraph node which is the new version of
1569    OLD_VERSION node.  REDIRECT_CALLERS holds the callers
1570    edges which should be redirected to point to
1571    NEW_VERSION.  ALL the callees edges of OLD_VERSION
1572    are cloned to the new version node.  Return the new
1573    version node.  */
1574
1575 static struct cgraph_node *
1576 cgraph_copy_node_for_versioning (struct cgraph_node *old_version,
1577                                  tree new_decl, varray_type redirect_callers)
1578  {
1579    struct cgraph_node *new_version;
1580    struct cgraph_edge *e, *new_e;
1581    struct cgraph_edge *next_callee;
1582    unsigned i;
1583
1584    gcc_assert (old_version);
1585    
1586    new_version = cgraph_node (new_decl);
1587
1588    new_version->analyzed = true;
1589    new_version->local = old_version->local;
1590    new_version->global = old_version->global;
1591    new_version->rtl = new_version->rtl;
1592    new_version->reachable = true;
1593    new_version->count = old_version->count;
1594
1595    /* Clone the old node callees.  Recursive calls are
1596       also cloned.  */
1597    for (e = old_version->callees;e; e=e->next_callee)
1598      {
1599        new_e = cgraph_clone_edge (e, new_version, e->call_stmt, 0, e->loop_nest, true);
1600        new_e->count = e->count;
1601      }
1602    /* Fix recursive calls.
1603       If OLD_VERSION has a recursive call after the
1604       previous edge cloning, the new version will have an edge
1605       pointing to the old version, which is wrong;
1606       Redirect it to point to the new version. */
1607    for (e = new_version->callees ; e; e = next_callee)
1608      {
1609        next_callee = e->next_callee;
1610        if (e->callee == old_version)
1611          cgraph_redirect_edge_callee (e, new_version);
1612          
1613        if (!next_callee)
1614          break;
1615      }
1616    if (redirect_callers)
1617      for (i = 0; i < VARRAY_ACTIVE_SIZE (redirect_callers); i++)
1618        {
1619          e = VARRAY_GENERIC_PTR (redirect_callers, i);
1620          /* Redirect calls to the old version node
1621             to point to it's new version.  */
1622          cgraph_redirect_edge_callee (e, new_version);
1623        }
1624
1625    return new_version;
1626  }
1627
1628  /* Perform function versioning.
1629     Function versioning includes copying of the tree and 
1630     a callgraph update (creating a new cgraph node and updating
1631     its callees and callers).
1632
1633     REDIRECT_CALLERS varray includes the edges to be redirected
1634     to the new version.
1635
1636     TREE_MAP is a mapping of tree nodes we want to replace with
1637     new ones (according to results of prior analysis).
1638     OLD_VERSION_NODE is the node that is versioned.
1639     It returns the new version's cgraph node.  */
1640
1641 struct cgraph_node *
1642 cgraph_function_versioning (struct cgraph_node *old_version_node,
1643                             varray_type redirect_callers,
1644                             varray_type tree_map)
1645 {
1646   tree old_decl = old_version_node->decl;
1647   struct cgraph_node *new_version_node = NULL;
1648   tree new_decl;
1649
1650   if (!tree_versionable_function_p (old_decl))
1651     return NULL;
1652
1653   /* Make a new FUNCTION_DECL tree node for the
1654      new version. */
1655   new_decl = copy_node (old_decl);
1656
1657   /* Create the new version's call-graph node.
1658      and update the edges of the new node. */
1659   new_version_node =
1660     cgraph_copy_node_for_versioning (old_version_node, new_decl,
1661                                      redirect_callers);
1662
1663   /* Copy the OLD_VERSION_NODE function tree to the new version.  */
1664   tree_function_versioning (old_decl, new_decl, tree_map, false);
1665   /* Update the call_expr on the edges to call the new version node. */
1666   update_call_expr (new_version_node);
1667
1668   /* Update the new version's properties.  
1669      Make The new version visible only within this translation unit.
1670      ??? We cannot use COMDAT linkage because there is no 
1671      ABI support for this.  */
1672   DECL_EXTERNAL (new_version_node->decl) = 0;
1673   DECL_ONE_ONLY (new_version_node->decl) = 0;
1674   TREE_PUBLIC (new_version_node->decl) = 0;
1675   DECL_COMDAT (new_version_node->decl) = 0;
1676   new_version_node->local.externally_visible = 0;
1677   new_version_node->local.local = 1;
1678   new_version_node->lowered = true;
1679   return new_version_node;
1680 }
1681
1682 /* Produce separate function body for inline clones so the offline copy can be
1683    modified without affecting them.  */
1684 struct cgraph_node *
1685 save_inline_function_body (struct cgraph_node *node)
1686 {
1687   struct cgraph_node *first_clone;
1688
1689   gcc_assert (node == cgraph_node (node->decl));
1690
1691   cgraph_lower_function (node);
1692
1693   /* In non-unit-at-a-time we construct full fledged clone we never output to
1694      assembly file.  This clone is pointed out by inline_decl of orginal function
1695      and inlining infrastructure knows how to deal with this.  */
1696   if (!flag_unit_at_a_time)
1697     {
1698       struct cgraph_edge *e;
1699
1700       first_clone = cgraph_clone_node (node, node->count, 0, false);
1701       first_clone->needed = 0;
1702       first_clone->reachable = 1;
1703       /* Recursively clone all bodies.  */
1704       for (e = first_clone->callees; e; e = e->next_callee)
1705         if (!e->inline_failed)
1706           cgraph_clone_inlined_nodes (e, true, false);
1707     }
1708   else
1709     first_clone = node->next_clone;
1710
1711   first_clone->decl = copy_node (node->decl);
1712   node->next_clone = NULL;
1713   if (!flag_unit_at_a_time)
1714     node->inline_decl = first_clone->decl;
1715   first_clone->prev_clone = NULL;
1716   cgraph_insert_node_to_hashtable (first_clone);
1717   gcc_assert (first_clone == cgraph_node (first_clone->decl));
1718
1719   /* Copy the OLD_VERSION_NODE function tree to the new version.  */
1720   tree_function_versioning (node->decl, first_clone->decl, NULL, true);
1721
1722   DECL_EXTERNAL (first_clone->decl) = 0;
1723   DECL_ONE_ONLY (first_clone->decl) = 0;
1724   TREE_PUBLIC (first_clone->decl) = 0;
1725   DECL_COMDAT (first_clone->decl) = 0;
1726
1727   for (node = first_clone->next_clone; node; node = node->next_clone)
1728     node->decl = first_clone->decl;
1729 #ifdef ENABLE_CHECKING
1730   verify_cgraph_node (first_clone);
1731 #endif
1732   return first_clone;
1733 }
1734