OSDN Git Service

* configure: Rebuilt.
[pf3gnuchains/gcc-fork.git] / gcc / cgraphunit.c
1 /* Callgraph based interprocedural optimizations.
2    Copyright (C) 2003, 2004, 2005, 2006 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 interprocedural 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
36         function.)
37
38     - varpool_finalize_variable
39
40       This function has same behavior as the above but is used for static
41       variables.
42
43     - cgraph_finalize_compilation_unit
44
45       This function is called once (source level) compilation unit is finalized
46       and it will no longer change.
47
48       In the unit-at-a-time the call-graph construction and local function
49       analysis takes place here.  Bodies of unreachable functions are released
50       to conserve memory usage.
51
52       The function can be called multiple times when multiple source level
53       compilation units are combined (such as in C frontend)
54
55     - cgraph_optimize
56
57       In this unit-at-a-time compilation the intra procedural analysis takes
58       place here.  In particular the static functions whose address is never
59       taken are marked as local.  Backend can then use this information to
60       modify calling conventions, do better inlining or similar optimizations.
61
62     - cgraph_mark_needed_node
63     - varpool_mark_needed_node
64
65       When function or variable is referenced by some hidden way the call-graph
66       data structure must be updated accordingly by this function.
67       There should be little need to call this function and all the references
68       should be made explicit to cgraph code.  At present these functions are
69       used by C++ frontend to explicitly mark the keyed methods.
70
71     - analyze_expr callback
72
73       This function is responsible for lowering tree nodes not understood by
74       generic code into understandable ones or alternatively marking
75       callgraph and varpool nodes referenced by the as needed.
76
77       ??? On the tree-ssa genericizing should take place here and we will avoid
78       need for these hooks (replacing them by genericizing hook)
79
80     - expand_function callback
81
82       This function is used to expand function and pass it into RTL back-end.
83       Front-end should not make any assumptions about when this function can be
84       called.  In particular cgraph_assemble_pending_functions,
85       varpool_assemble_pending_variables, cgraph_finalize_function,
86       varpool_finalize_function, cgraph_optimize can cause arbitrarily
87       previously finalized functions to be expanded.
88
89     We implement two compilation modes.
90
91       - unit-at-a-time:  In this mode analyzing of all functions is deferred
92         to cgraph_finalize_compilation_unit and expansion into cgraph_optimize.
93
94         In cgraph_finalize_compilation_unit the reachable functions are
95         analyzed.  During analysis the call-graph edges from reachable
96         functions are constructed and their destinations are marked as
97         reachable.  References to functions and variables are discovered too
98         and variables found to be needed output to the assembly file.  Via
99         mark_referenced call in assemble_variable functions referenced by
100         static variables are noticed too.
101
102         The intra-procedural information is produced and its existence
103         indicated by global_info_ready.  Once this flag is set it is impossible
104         to change function from !reachable to reachable and thus
105         assemble_variable no longer call mark_referenced.
106
107         Finally the call-graph is topologically sorted and all reachable functions
108         that has not been completely inlined or are not external are output.
109
110         ??? It is possible that reference to function or variable is optimized
111         out.  We can not deal with this nicely because topological order is not
112         suitable for it.  For tree-ssa we may consider another pass doing
113         optimization and re-discovering reachable functions.
114
115         ??? Reorganize code so variables are output very last and only if they
116         really has been referenced by produced code, so we catch more cases
117         where reference has been optimized out.
118
119       - non-unit-at-a-time
120
121         All functions are variables are output as early as possible to conserve
122         memory consumption.  This may or may not result in less memory used but
123         it is still needed for some legacy code that rely on particular ordering
124         of things output from the compiler.
125
126         Varpool data structures are not used and variables are output directly.
127
128         Functions are output early using call of
129         cgraph_assemble_pending_function from cgraph_finalize_function.  The
130         decision on whether function is needed is made more conservative so
131         uninlininable static functions are needed too.  During the call-graph
132         construction the edge destinations are not marked as reachable and it
133         is completely relied upn assemble_variable to mark them.  */
134
135
136 #include "config.h"
137 #include "system.h"
138 #include "coretypes.h"
139 #include "tm.h"
140 #include "tree.h"
141 #include "rtl.h"
142 #include "tree-flow.h"
143 #include "tree-inline.h"
144 #include "langhooks.h"
145 #include "pointer-set.h"
146 #include "toplev.h"
147 #include "flags.h"
148 #include "ggc.h"
149 #include "debug.h"
150 #include "target.h"
151 #include "cgraph.h"
152 #include "diagnostic.h"
153 #include "timevar.h"
154 #include "params.h"
155 #include "fibheap.h"
156 #include "c-common.h"
157 #include "intl.h"
158 #include "function.h"
159 #include "ipa-prop.h"
160 #include "tree-gimple.h"
161 #include "tree-pass.h"
162 #include "output.h"
163
164 static void cgraph_expand_all_functions (void);
165 static void cgraph_mark_functions_to_output (void);
166 static void cgraph_expand_function (struct cgraph_node *);
167 static void cgraph_output_pending_asms (void);
168
169 static FILE *cgraph_dump_file;
170
171 /* Determine if function DECL is needed.  That is, visible to something
172    either outside this translation unit, something magic in the system
173    configury, or (if not doing unit-at-a-time) to something we havn't
174    seen yet.  */
175
176 static bool
177 decide_is_function_needed (struct cgraph_node *node, tree decl)
178 {
179   tree origin;
180   if (MAIN_NAME_P (DECL_NAME (decl))
181       && TREE_PUBLIC (decl))
182     {
183       node->local.externally_visible = true;
184       return true;
185     }
186
187   /* If the user told us it is used, then it must be so.  */
188   if (node->local.externally_visible)
189     return true;
190
191   if (!flag_unit_at_a_time && lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
192     return true;
193
194   /* ??? If the assembler name is set by hand, it is possible to assemble
195      the name later after finalizing the function and the fact is noticed
196      in assemble_name then.  This is arguably a bug.  */
197   if (DECL_ASSEMBLER_NAME_SET_P (decl)
198       && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
199     return true;
200
201   /* If we decided it was needed before, but at the time we didn't have
202      the body of the function available, then it's still needed.  We have
203      to go back and re-check its dependencies now.  */
204   if (node->needed)
205     return true;
206
207   /* Externally visible functions must be output.  The exception is
208      COMDAT functions that must be output only when they are needed.
209
210      When not optimizing, also output the static functions. (see
211      PR24561), but don't do so for always_inline functions, functions
212      declared inline and nested functions.  These was optimized out
213      in the original implementation and it is unclear whether we want
214      to change the behavior here.  */
215   if (((TREE_PUBLIC (decl)
216         || (!optimize && !node->local.disregard_inline_limits
217             && !DECL_DECLARED_INLINE_P (decl)
218             && !node->origin))
219       && !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, NULL))))
252     return true;
253
254   return false;
255 }
256
257 /* Process CGRAPH_NEW_FUNCTIONS and perform actions necessary to add these
258    functions into callgraph in a way so they look like ordinary reachable
259    functions inserted into callgraph already at construction time.  */
260
261 bool
262 cgraph_process_new_functions (void)
263 {
264   bool output = false;
265   tree fndecl;
266   struct cgraph_node *node;
267
268   /*  Note that this queue may grow as its being processed, as the new
269       functions may generate new ones.  */
270   while (cgraph_new_nodes)
271     {
272       node = cgraph_new_nodes;
273       fndecl = node->decl;
274       cgraph_new_nodes = cgraph_new_nodes->next_needed;
275       switch (cgraph_state)
276         {
277         case CGRAPH_STATE_CONSTRUCTION:
278           /* At construction time we just need to finalize function and move
279              it into reachable functions list.  */
280
281           node->next_needed = NULL;
282           node->needed = node->reachable = false;
283           cgraph_finalize_function (fndecl, false);
284           cgraph_mark_reachable_node (node);
285           output = true;
286           break;
287
288         case CGRAPH_STATE_IPA:
289         case CGRAPH_STATE_IPA_SSA:
290           /* When IPA optimization already started, do all essential
291              transformations that has been already performed on the whole
292              cgraph but not on this function.  */
293
294           tree_register_cfg_hooks ();
295           if (!node->analyzed)
296             cgraph_analyze_function (node);
297           push_cfun (DECL_STRUCT_FUNCTION (fndecl));
298           current_function_decl = fndecl;
299           node->local.inlinable = tree_inlinable_function_p (fndecl);
300           node->local.self_insns = estimate_num_insns (fndecl);
301           node->local.disregard_inline_limits
302             = lang_hooks.tree_inlining.disregard_inline_limits (fndecl);
303           /* Inlining characteristics are maintained by the
304              cgraph_mark_inline.  */
305           node->global.insns = node->local.self_insns;
306           if (flag_really_no_inline && !node->local.disregard_inline_limits)
307              node->local.inlinable = 0;
308           if ((cgraph_state == CGRAPH_STATE_IPA_SSA
309               && !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
310               /* When not optimizing, be sure we run early local passes anyway
311                  to expand OMP.  */
312               || !optimize)
313             execute_pass_list (pass_early_local_passes.sub);
314           free_dominance_info (CDI_POST_DOMINATORS);
315           free_dominance_info (CDI_DOMINATORS);
316           pop_cfun ();
317           current_function_decl = NULL;
318           break;
319
320         case CGRAPH_STATE_EXPANSION:
321           /* Functions created during expansion shall be compiled
322              directly.  */
323           node->output = 0;
324           cgraph_expand_function (node);
325           break;
326
327         default:
328           gcc_unreachable ();
329           break;
330         }
331     }
332   return output;
333 }
334
335 /* When not doing unit-at-a-time, output all functions enqueued.
336    Return true when such a functions were found.  */
337
338 static bool
339 cgraph_assemble_pending_functions (void)
340 {
341   bool output = false;
342
343   if (flag_unit_at_a_time)
344     return false;
345
346   cgraph_output_pending_asms ();
347
348   while (cgraph_nodes_queue)
349     {
350       struct cgraph_node *n = cgraph_nodes_queue;
351
352       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
353       n->next_needed = NULL;
354       if (!n->global.inlined_to
355           && !n->alias
356           && !DECL_EXTERNAL (n->decl))
357         {
358           cgraph_expand_function (n);
359           output = true;
360         }
361       output |= cgraph_process_new_functions ();
362     }
363
364   return output;
365 }
366
367
368 /* As an GCC extension we allow redefinition of the function.  The
369    semantics when both copies of bodies differ is not well defined.
370    We replace the old body with new body so in unit at a time mode
371    we always use new body, while in normal mode we may end up with
372    old body inlined into some functions and new body expanded and
373    inlined in others.
374
375    ??? It may make more sense to use one body for inlining and other
376    body for expanding the function but this is difficult to do.  */
377
378 static void
379 cgraph_reset_node (struct cgraph_node *node)
380 {
381   /* If node->output is set, then this is a unit-at-a-time compilation
382      and we have already begun whole-unit analysis.  This is *not*
383      testing for whether we've already emitted the function.  That
384      case can be sort-of legitimately seen with real function
385      redefinition errors.  I would argue that the front end should
386      never present us with such a case, but don't enforce that for now.  */
387   gcc_assert (!node->output);
388
389   /* Reset our data structures so we can analyze the function again.  */
390   memset (&node->local, 0, sizeof (node->local));
391   memset (&node->global, 0, sizeof (node->global));
392   memset (&node->rtl, 0, sizeof (node->rtl));
393   node->analyzed = false;
394   node->local.redefined_extern_inline = true;
395   node->local.finalized = false;
396
397   if (!flag_unit_at_a_time)
398     {
399       struct cgraph_node *n, *next;
400
401       for (n = cgraph_nodes; n; n = next)
402         {
403           next = n->next;
404           if (n->global.inlined_to == node)
405             cgraph_remove_node (n);
406         }
407     }
408
409   cgraph_node_remove_callees (node);
410
411   /* We may need to re-queue the node for assembling in case
412      we already proceeded it and ignored as not needed.  */
413   if (node->reachable && !flag_unit_at_a_time)
414     {
415       struct cgraph_node *n;
416
417       for (n = cgraph_nodes_queue; n; n = n->next_needed)
418         if (n == node)
419           break;
420       if (!n)
421         node->reachable = 0;
422     }
423 }
424
425 static void
426 cgraph_lower_function (struct cgraph_node *node)
427 {
428   if (node->lowered)
429     return;
430   tree_lowering_passes (node->decl);
431   node->lowered = true;
432 }
433
434 /* DECL has been parsed.  Take it, queue it, compile it at the whim of the
435    logic in effect.  If NESTED is true, then our caller cannot stand to have
436    the garbage collector run at the moment.  We would need to either create
437    a new GC context, or just not compile right now.  */
438
439 void
440 cgraph_finalize_function (tree decl, bool nested)
441 {
442   struct cgraph_node *node = cgraph_node (decl);
443
444   if (node->local.finalized)
445     cgraph_reset_node (node);
446
447   notice_global_symbol (decl);
448   node->decl = decl;
449   node->local.finalized = true;
450   node->lowered = DECL_STRUCT_FUNCTION (decl)->cfg != NULL;
451   if (node->nested)
452     lower_nested_functions (decl);
453   gcc_assert (!node->nested);
454
455   /* If not unit at a time, then we need to create the call graph
456      now, so that called functions can be queued and emitted now.  */
457   if (!flag_unit_at_a_time)
458     {
459       cgraph_analyze_function (node);
460       cgraph_decide_inlining_incrementally (node, false);
461     }
462
463   if (decide_is_function_needed (node, decl))
464     cgraph_mark_needed_node (node);
465
466   /* Since we reclaim unreachable nodes at the end of every language
467      level unit, we need to be conservative about possible entry points
468      there.  */
469   if ((TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl)))
470     cgraph_mark_reachable_node (node);
471
472   /* If not unit at a time, go ahead and emit everything we've found
473      to be reachable at this time.  */
474   if (!nested)
475     {
476       if (!cgraph_assemble_pending_functions ())
477         ggc_collect ();
478     }
479
480   /* If we've not yet emitted decl, tell the debug info about it.  */
481   if (!TREE_ASM_WRITTEN (decl))
482     (*debug_hooks->deferred_inline_function) (decl);
483
484   /* Possibly warn about unused parameters.  */
485   if (warn_unused_parameter)
486     do_warn_unused_parameter (decl);
487 }
488
489 /* Verify cgraph nodes of given cgraph node.  */
490 void
491 verify_cgraph_node (struct cgraph_node *node)
492 {
493   struct cgraph_edge *e;
494   struct cgraph_node *main_clone;
495   struct function *this_cfun = DECL_STRUCT_FUNCTION (node->decl);
496   basic_block this_block;
497   block_stmt_iterator bsi;
498   bool error_found = false;
499
500   if (errorcount || sorrycount)
501     return;
502
503   timevar_push (TV_CGRAPH_VERIFY);
504   for (e = node->callees; e; e = e->next_callee)
505     if (e->aux)
506       {
507         error ("aux field set for edge %s->%s",
508                cgraph_node_name (e->caller), cgraph_node_name (e->callee));
509         error_found = true;
510       }
511   if (node->count < 0)
512     {
513       error ("Execution count is negative");
514       error_found = true;
515     }
516   for (e = node->callers; e; e = e->next_caller)
517     {
518       if (e->count < 0)
519         {
520           error ("caller edge count is negative");
521           error_found = true;
522         }
523       if (!e->inline_failed)
524         {
525           if (node->global.inlined_to
526               != (e->caller->global.inlined_to
527                   ? e->caller->global.inlined_to : e->caller))
528             {
529               error ("inlined_to pointer is wrong");
530               error_found = true;
531             }
532           if (node->callers->next_caller)
533             {
534               error ("multiple inline callers");
535               error_found = true;
536             }
537         }
538       else
539         if (node->global.inlined_to)
540           {
541             error ("inlined_to pointer set for noninline callers");
542             error_found = true;
543           }
544     }
545   if (!node->callers && node->global.inlined_to)
546     {
547       error ("inlined_to pointer is set but no predecessors found");
548       error_found = true;
549     }
550   if (node->global.inlined_to == node)
551     {
552       error ("inlined_to pointer refers to itself");
553       error_found = true;
554     }
555
556   for (main_clone = cgraph_node (node->decl); main_clone;
557        main_clone = main_clone->next_clone)
558     if (main_clone == node)
559       break;
560   if (!cgraph_node (node->decl))
561     {
562       error ("node not found in cgraph_hash");
563       error_found = true;
564     }
565
566   if (node->analyzed
567       && DECL_SAVED_TREE (node->decl) && !TREE_ASM_WRITTEN (node->decl)
568       && (!DECL_EXTERNAL (node->decl) || node->global.inlined_to))
569     {
570       if (this_cfun->cfg)
571         {
572           /* The nodes we're interested in are never shared, so walk
573              the tree ignoring duplicates.  */
574           struct pointer_set_t *visited_nodes = pointer_set_create ();
575           /* Reach the trees by walking over the CFG, and note the
576              enclosing basic-blocks in the call edges.  */
577           FOR_EACH_BB_FN (this_block, this_cfun)
578             for (bsi = bsi_start (this_block); !bsi_end_p (bsi); bsi_next (&bsi))
579               {
580                 tree stmt = bsi_stmt (bsi);
581                 tree call = get_call_expr_in (stmt);
582                 tree decl;
583                 if (call && (decl = get_callee_fndecl (call)))
584                   {
585                     struct cgraph_edge *e = cgraph_edge (node, stmt);
586                     if (e)
587                       {
588                         if (e->aux)
589                           {
590                             error ("shared call_stmt:");
591                             debug_generic_stmt (stmt);
592                             error_found = true;
593                           }
594                         if (e->callee->decl != cgraph_node (decl)->decl
595                             && e->inline_failed)
596                           {
597                             error ("edge points to wrong declaration:");
598                             debug_tree (e->callee->decl);
599                             fprintf (stderr," Instead of:");
600                             debug_tree (decl);
601                           }
602                         e->aux = (void *)1;
603                       }
604                     else
605                       {
606                         error ("missing callgraph edge for call stmt:");
607                         debug_generic_stmt (stmt);
608                         error_found = true;
609                       }
610                   }
611               }
612           pointer_set_destroy (visited_nodes);
613         }
614       else
615         /* No CFG available?!  */
616         gcc_unreachable ();
617
618       for (e = node->callees; e; e = e->next_callee)
619         {
620           if (!e->aux)
621             {
622               error ("edge %s->%s has no corresponding call_stmt",
623                      cgraph_node_name (e->caller),
624                      cgraph_node_name (e->callee));
625               debug_generic_stmt (e->call_stmt);
626               error_found = true;
627             }
628           e->aux = 0;
629         }
630     }
631   if (error_found)
632     {
633       dump_cgraph_node (stderr, node);
634       internal_error ("verify_cgraph_node failed");
635     }
636   timevar_pop (TV_CGRAPH_VERIFY);
637 }
638
639 /* Verify whole cgraph structure.  */
640 void
641 verify_cgraph (void)
642 {
643   struct cgraph_node *node;
644
645   if (sorrycount || errorcount)
646     return;
647
648   for (node = cgraph_nodes; node; node = node->next)
649     verify_cgraph_node (node);
650 }
651
652 /* Output all asm statements we have stored up to be output.  */
653
654 static void
655 cgraph_output_pending_asms (void)
656 {
657   struct cgraph_asm_node *can;
658
659   if (errorcount || sorrycount)
660     return;
661
662   for (can = cgraph_asm_nodes; can; can = can->next)
663     assemble_asm (can->asm_str);
664   cgraph_asm_nodes = NULL;
665 }
666
667 /* Analyze the function scheduled to be output.  */
668 void
669 cgraph_analyze_function (struct cgraph_node *node)
670 {
671   tree decl = node->decl;
672
673   current_function_decl = decl;
674   push_cfun (DECL_STRUCT_FUNCTION (decl));
675   cgraph_lower_function (node);
676
677   node->local.estimated_self_stack_size = estimated_stack_frame_size ();
678   node->global.estimated_stack_size = node->local.estimated_self_stack_size;
679   node->global.stack_frame_offset = 0;
680   node->local.inlinable = tree_inlinable_function_p (decl);
681   if (!flag_unit_at_a_time)
682     node->local.self_insns = estimate_num_insns (decl);
683   if (node->local.inlinable)
684     node->local.disregard_inline_limits
685       = lang_hooks.tree_inlining.disregard_inline_limits (decl);
686   if (flag_really_no_inline && !node->local.disregard_inline_limits)
687     node->local.inlinable = 0;
688   /* Inlining characteristics are maintained by the cgraph_mark_inline.  */
689   node->global.insns = node->local.self_insns;
690   if (!flag_unit_at_a_time)
691     {
692       bitmap_obstack_initialize (NULL);
693       tree_register_cfg_hooks ();
694       execute_pass_list (pass_early_local_passes.sub);
695       free_dominance_info (CDI_POST_DOMINATORS);
696       free_dominance_info (CDI_DOMINATORS);
697       bitmap_obstack_release (NULL);
698     }
699
700   node->analyzed = true;
701   pop_cfun ();
702   current_function_decl = NULL;
703 }
704
705 /* Look for externally_visible and used attributes and mark cgraph nodes
706    accordingly.
707
708    We cannot mark the nodes at the point the attributes are processed (in
709    handle_*_attribute) because the copy of the declarations available at that
710    point may not be canonical.  For example, in:
711
712     void f();
713     void f() __attribute__((used));
714
715    the declaration we see in handle_used_attribute will be the second
716    declaration -- but the front end will subsequently merge that declaration
717    with the original declaration and discard the second declaration.
718
719    Furthermore, we can't mark these nodes in cgraph_finalize_function because:
720
721     void f() {}
722     void f() __attribute__((externally_visible));
723
724    is valid.
725
726    So, we walk the nodes at the end of the translation unit, applying the
727    attributes at that point.  */
728
729 static void
730 process_function_and_variable_attributes (struct cgraph_node *first,
731                                           struct varpool_node *first_var)
732 {
733   struct cgraph_node *node;
734   struct varpool_node *vnode;
735
736   for (node = cgraph_nodes; node != first; node = node->next)
737     {
738       tree decl = node->decl;
739       if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
740         {
741           mark_decl_referenced (decl);
742           if (node->local.finalized)
743              cgraph_mark_needed_node (node);
744         }
745       if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
746         {
747           if (! TREE_PUBLIC (node->decl))
748             warning (OPT_Wattributes,
749                      "%J%<externally_visible%> attribute have effect only on public objects",
750                      node->decl);
751           else
752             {
753               if (node->local.finalized)
754                 cgraph_mark_needed_node (node);
755               node->local.externally_visible = true;
756             }
757         }
758     }
759   for (vnode = varpool_nodes; vnode != first_var; vnode = vnode->next)
760     {
761       tree decl = vnode->decl;
762       if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
763         {
764           mark_decl_referenced (decl);
765           if (vnode->finalized)
766             varpool_mark_needed_node (vnode);
767         }
768       if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
769         {
770           if (! TREE_PUBLIC (vnode->decl))
771             warning (OPT_Wattributes,
772                      "%J%<externally_visible%> attribute have effect only on public objects",
773                      vnode->decl);
774           else
775             {
776               if (vnode->finalized)
777                 varpool_mark_needed_node (vnode);
778               vnode->externally_visible = true;
779             }
780         }
781     }
782 }
783
784 /* Process CGRAPH_NODES_NEEDED queue, analyze each function (and transitively
785    each reachable functions) and build cgraph.
786    The function can be called multiple times after inserting new nodes
787    into beggining of queue.  Just the new part of queue is re-scanned then.  */
788
789 static void
790 cgraph_analyze_functions (void)
791 {
792   /* Keep track of already processed nodes when called multiple times for
793      intermodule optimization.  */
794   static struct cgraph_node *first_analyzed;
795   struct cgraph_node *first_processed = first_analyzed;
796   static struct varpool_node *first_analyzed_var;
797   struct cgraph_node *node, *next;
798
799   process_function_and_variable_attributes (first_processed,
800                                             first_analyzed_var);
801   first_processed = cgraph_nodes;
802   first_analyzed_var = varpool_nodes;
803   varpool_analyze_pending_decls ();
804   if (cgraph_dump_file)
805     {
806       fprintf (cgraph_dump_file, "Initial entry points:");
807       for (node = cgraph_nodes; node != first_analyzed; node = node->next)
808         if (node->needed && DECL_SAVED_TREE (node->decl))
809           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
810       fprintf (cgraph_dump_file, "\n");
811     }
812   cgraph_process_new_functions ();
813
814   /* Propagate reachability flag and lower representation of all reachable
815      functions.  In the future, lowering will introduce new functions and
816      new entry points on the way (by template instantiation and virtual
817      method table generation for instance).  */
818   while (cgraph_nodes_queue)
819     {
820       struct cgraph_edge *edge;
821       tree decl = cgraph_nodes_queue->decl;
822
823       node = cgraph_nodes_queue;
824       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
825       node->next_needed = NULL;
826
827       /* ??? It is possible to create extern inline function and later using
828          weak alias attribute to kill its body. See
829          gcc.c-torture/compile/20011119-1.c  */
830       if (!DECL_SAVED_TREE (decl))
831         {
832           cgraph_reset_node (node);
833           continue;
834         }
835
836       gcc_assert (!node->analyzed && node->reachable);
837       gcc_assert (DECL_SAVED_TREE (decl));
838
839       cgraph_analyze_function (node);
840
841       for (edge = node->callees; edge; edge = edge->next_callee)
842         if (!edge->callee->reachable)
843           cgraph_mark_reachable_node (edge->callee);
844
845       /* We finalize local static variables during constructing callgraph
846          edges.  Process their attributes too.  */
847       process_function_and_variable_attributes (first_processed,
848                                                 first_analyzed_var);
849       first_processed = cgraph_nodes;
850       first_analyzed_var = varpool_nodes;
851       varpool_analyze_pending_decls ();
852       cgraph_process_new_functions ();
853     }
854
855   /* Collect entry points to the unit.  */
856   if (cgraph_dump_file)
857     {
858       fprintf (cgraph_dump_file, "Unit entry points:");
859       for (node = cgraph_nodes; node != first_analyzed; node = node->next)
860         if (node->needed && DECL_SAVED_TREE (node->decl))
861           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
862       fprintf (cgraph_dump_file, "\n\nInitial ");
863       dump_cgraph (cgraph_dump_file);
864     }
865
866   if (cgraph_dump_file)
867     fprintf (cgraph_dump_file, "\nReclaiming functions:");
868
869   for (node = cgraph_nodes; node != first_analyzed; node = next)
870     {
871       tree decl = node->decl;
872       next = node->next;
873
874       if (node->local.finalized && !DECL_SAVED_TREE (decl))
875         cgraph_reset_node (node);
876
877       if (!node->reachable && DECL_SAVED_TREE (decl))
878         {
879           if (cgraph_dump_file)
880             fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
881           cgraph_remove_node (node);
882           continue;
883         }
884       else
885         node->next_needed = NULL;
886       gcc_assert (!node->local.finalized || DECL_SAVED_TREE (decl));
887       gcc_assert (node->analyzed == node->local.finalized);
888     }
889   if (cgraph_dump_file)
890     {
891       fprintf (cgraph_dump_file, "\n\nReclaimed ");
892       dump_cgraph (cgraph_dump_file);
893     }
894   first_analyzed = cgraph_nodes;
895   ggc_collect ();
896 }
897
898 /* Analyze the whole compilation unit once it is parsed completely.  */
899
900 void
901 cgraph_finalize_compilation_unit (void)
902 {
903   if (errorcount || sorrycount)
904     return;
905
906   finish_aliases_1 ();
907
908   if (!flag_unit_at_a_time)
909     {
910       cgraph_output_pending_asms ();
911       cgraph_assemble_pending_functions ();
912       varpool_output_debug_info ();
913       return;
914     }
915
916   if (!quiet_flag)
917     {
918       fprintf (stderr, "\nAnalyzing compilation unit\n");
919       fflush (stderr);
920     }
921
922   timevar_push (TV_CGRAPH);
923   cgraph_analyze_functions ();
924   timevar_pop (TV_CGRAPH);
925 }
926 /* Figure out what functions we want to assemble.  */
927
928 static void
929 cgraph_mark_functions_to_output (void)
930 {
931   struct cgraph_node *node;
932
933   for (node = cgraph_nodes; node; node = node->next)
934     {
935       tree decl = node->decl;
936       struct cgraph_edge *e;
937
938       gcc_assert (!node->output);
939
940       for (e = node->callers; e; e = e->next_caller)
941         if (e->inline_failed)
942           break;
943
944       /* We need to output all local functions that are used and not
945          always inlined, as well as those that are reachable from
946          outside the current compilation unit.  */
947       if (DECL_SAVED_TREE (decl)
948           && !node->global.inlined_to
949           && (node->needed
950               || (e && node->reachable))
951           && !TREE_ASM_WRITTEN (decl)
952           && !DECL_EXTERNAL (decl))
953         node->output = 1;
954       else
955         {
956           /* We should've reclaimed all functions that are not needed.  */
957 #ifdef ENABLE_CHECKING
958           if (!node->global.inlined_to && DECL_SAVED_TREE (decl)
959               && !DECL_EXTERNAL (decl))
960             {
961               dump_cgraph_node (stderr, node);
962               internal_error ("failed to reclaim unneeded function");
963             }
964 #endif
965           gcc_assert (node->global.inlined_to || !DECL_SAVED_TREE (decl)
966                       || DECL_EXTERNAL (decl));
967
968         }
969
970     }
971 }
972
973 /* Expand function specified by NODE.  */
974
975 static void
976 cgraph_expand_function (struct cgraph_node *node)
977 {
978   tree decl = node->decl;
979
980   /* We ought to not compile any inline clones.  */
981   gcc_assert (!node->global.inlined_to);
982
983   if (flag_unit_at_a_time)
984     announce_function (decl);
985
986   gcc_assert (node->lowered);
987
988   /* Generate RTL for the body of DECL.  */
989   lang_hooks.callgraph.expand_function (decl);
990
991   /* Make sure that BE didn't give up on compiling.  */
992   /* ??? Can happen with nested function of extern inline.  */
993   gcc_assert (TREE_ASM_WRITTEN (node->decl));
994
995   current_function_decl = NULL;
996   if (!cgraph_preserve_function_body_p (node->decl))
997     {
998       cgraph_release_function_body (node);
999       /* Eliminate all call edges.  This is important so the call_expr no longer
1000          points to the dead function body.  */
1001       cgraph_node_remove_callees (node);
1002     }
1003
1004   cgraph_function_flags_ready = true;
1005 }
1006
1007 /* Return true when CALLER_DECL should be inlined into CALLEE_DECL.  */
1008
1009 bool
1010 cgraph_inline_p (struct cgraph_edge *e, const char **reason)
1011 {
1012   *reason = e->inline_failed;
1013   return !e->inline_failed;
1014 }
1015
1016
1017
1018 /* Expand all functions that must be output.
1019
1020    Attempt to topologically sort the nodes so function is output when
1021    all called functions are already assembled to allow data to be
1022    propagated across the callgraph.  Use a stack to get smaller distance
1023    between a function and its callees (later we may choose to use a more
1024    sophisticated algorithm for function reordering; we will likely want
1025    to use subsections to make the output functions appear in top-down
1026    order).  */
1027
1028 static void
1029 cgraph_expand_all_functions (void)
1030 {
1031   struct cgraph_node *node;
1032   struct cgraph_node **order = XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
1033   int order_pos = 0, new_order_pos = 0;
1034   int i;
1035
1036   order_pos = cgraph_postorder (order);
1037   gcc_assert (order_pos == cgraph_n_nodes);
1038
1039   /* Garbage collector may remove inline clones we eliminate during
1040      optimization.  So we must be sure to not reference them.  */
1041   for (i = 0; i < order_pos; i++)
1042     if (order[i]->output)
1043       order[new_order_pos++] = order[i];
1044
1045   for (i = new_order_pos - 1; i >= 0; i--)
1046     {
1047       node = order[i];
1048       if (node->output)
1049         {
1050           gcc_assert (node->reachable);
1051           node->output = 0;
1052           cgraph_expand_function (node);
1053         }
1054     }
1055   cgraph_process_new_functions ();
1056
1057   free (order);
1058
1059 }
1060
1061 /* This is used to sort the node types by the cgraph order number.  */
1062
1063 struct cgraph_order_sort
1064 {
1065   enum { ORDER_UNDEFINED = 0, ORDER_FUNCTION, ORDER_VAR, ORDER_ASM } kind;
1066   union
1067   {
1068     struct cgraph_node *f;
1069     struct varpool_node *v;
1070     struct cgraph_asm_node *a;
1071   } u;
1072 };
1073
1074 /* Output all functions, variables, and asm statements in the order
1075    according to their order fields, which is the order in which they
1076    appeared in the file.  This implements -fno-toplevel-reorder.  In
1077    this mode we may output functions and variables which don't really
1078    need to be output.  */
1079
1080 static void
1081 cgraph_output_in_order (void)
1082 {
1083   int max;
1084   size_t size;
1085   struct cgraph_order_sort *nodes;
1086   int i;
1087   struct cgraph_node *pf;
1088   struct varpool_node *pv;
1089   struct cgraph_asm_node *pa;
1090
1091   max = cgraph_order;
1092   size = max * sizeof (struct cgraph_order_sort);
1093   nodes = (struct cgraph_order_sort *) alloca (size);
1094   memset (nodes, 0, size);
1095
1096   varpool_analyze_pending_decls ();
1097
1098   for (pf = cgraph_nodes; pf; pf = pf->next)
1099     {
1100       if (pf->output)
1101         {
1102           i = pf->order;
1103           gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
1104           nodes[i].kind = ORDER_FUNCTION;
1105           nodes[i].u.f = pf;
1106         }
1107     }
1108
1109   for (pv = varpool_nodes_queue; pv; pv = pv->next_needed)
1110     {
1111       i = pv->order;
1112       gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
1113       nodes[i].kind = ORDER_VAR;
1114       nodes[i].u.v = pv;
1115     }
1116
1117   for (pa = cgraph_asm_nodes; pa; pa = pa->next)
1118     {
1119       i = pa->order;
1120       gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
1121       nodes[i].kind = ORDER_ASM;
1122       nodes[i].u.a = pa;
1123     }
1124
1125   for (i = 0; i < max; ++i)
1126     {
1127       switch (nodes[i].kind)
1128         {
1129         case ORDER_FUNCTION:
1130           nodes[i].u.f->output = 0;
1131           cgraph_expand_function (nodes[i].u.f);
1132           break;
1133
1134         case ORDER_VAR:
1135           varpool_assemble_decl (nodes[i].u.v);
1136           break;
1137
1138         case ORDER_ASM:
1139           assemble_asm (nodes[i].u.a->asm_str);
1140           break;
1141
1142         case ORDER_UNDEFINED:
1143           break;
1144
1145         default:
1146           gcc_unreachable ();
1147         }
1148     }
1149
1150   cgraph_asm_nodes = NULL;
1151 }
1152
1153 /* Return true when function body of DECL still needs to be kept around
1154    for later re-use.  */
1155 bool
1156 cgraph_preserve_function_body_p (tree decl)
1157 {
1158   struct cgraph_node *node;
1159   if (!cgraph_global_info_ready)
1160     return (flag_really_no_inline
1161             ? lang_hooks.tree_inlining.disregard_inline_limits (decl)
1162             : DECL_INLINE (decl));
1163   /* Look if there is any clone around.  */
1164   for (node = cgraph_node (decl); node; node = node->next_clone)
1165     if (node->global.inlined_to)
1166       return true;
1167   return false;
1168 }
1169
1170 static void
1171 ipa_passes (void)
1172 {
1173   cfun = NULL;
1174   current_function_decl = NULL;
1175   tree_register_cfg_hooks ();
1176   bitmap_obstack_initialize (NULL);
1177   execute_ipa_pass_list (all_ipa_passes);
1178   bitmap_obstack_release (NULL);
1179 }
1180
1181 /* Perform simple optimizations based on callgraph.  */
1182
1183 void
1184 cgraph_optimize (void)
1185 {
1186   if (errorcount || sorrycount)
1187     return;
1188
1189 #ifdef ENABLE_CHECKING
1190   verify_cgraph ();
1191 #endif
1192   if (!flag_unit_at_a_time)
1193     {
1194       cgraph_assemble_pending_functions ();
1195       cgraph_process_new_functions ();
1196       cgraph_state = CGRAPH_STATE_FINISHED;
1197       cgraph_output_pending_asms ();
1198       varpool_assemble_pending_decls ();
1199       varpool_output_debug_info ();
1200       return;
1201     }
1202
1203   /* Frontend may output common variables after the unit has been finalized.
1204      It is safe to deal with them here as they are always zero initialized.  */
1205   varpool_analyze_pending_decls ();
1206   cgraph_analyze_functions ();
1207
1208   timevar_push (TV_CGRAPHOPT);
1209   if (pre_ipa_mem_report)
1210     {
1211       fprintf (stderr, "Memory consumption before IPA\n");
1212       dump_memory_report (false);
1213     }
1214   if (!quiet_flag)
1215     fprintf (stderr, "Performing interprocedural optimizations\n");
1216   cgraph_state = CGRAPH_STATE_IPA;
1217     
1218   /* Don't run the IPA passes if there was any error or sorry messages.  */
1219   if (errorcount == 0 && sorrycount == 0)
1220     ipa_passes ();
1221
1222   /* This pass remove bodies of extern inline functions we never inlined.
1223      Do this later so other IPA passes see what is really going on.  */
1224   cgraph_remove_unreachable_nodes (false, dump_file);
1225   cgraph_global_info_ready = true;
1226   if (cgraph_dump_file)
1227     {
1228       fprintf (cgraph_dump_file, "Optimized ");
1229       dump_cgraph (cgraph_dump_file);
1230       dump_varpool (cgraph_dump_file);
1231     }
1232   if (post_ipa_mem_report)
1233     {
1234       fprintf (stderr, "Memory consumption after IPA\n");
1235       dump_memory_report (false);
1236     }
1237   timevar_pop (TV_CGRAPHOPT);
1238
1239   /* Output everything.  */
1240   if (!quiet_flag)
1241     fprintf (stderr, "Assembling functions:\n");
1242 #ifdef ENABLE_CHECKING
1243   verify_cgraph ();
1244 #endif
1245
1246   cgraph_mark_functions_to_output ();
1247
1248   cgraph_state = CGRAPH_STATE_EXPANSION;
1249   if (!flag_toplevel_reorder)
1250     cgraph_output_in_order ();
1251   else
1252     {
1253       cgraph_output_pending_asms ();
1254
1255       cgraph_expand_all_functions ();
1256       varpool_remove_unreferenced_decls ();
1257
1258       varpool_assemble_pending_decls ();
1259       varpool_output_debug_info ();
1260     }
1261   cgraph_process_new_functions ();
1262   cgraph_state = CGRAPH_STATE_FINISHED;
1263
1264   if (cgraph_dump_file)
1265     {
1266       fprintf (cgraph_dump_file, "\nFinal ");
1267       dump_cgraph (cgraph_dump_file);
1268     }
1269 #ifdef ENABLE_CHECKING
1270   verify_cgraph ();
1271   /* Double check that all inline clones are gone and that all
1272      function bodies have been released from memory.  */
1273   if (flag_unit_at_a_time
1274       && !(sorrycount || errorcount))
1275     {
1276       struct cgraph_node *node;
1277       bool error_found = false;
1278
1279       for (node = cgraph_nodes; node; node = node->next)
1280         if (node->analyzed
1281             && (node->global.inlined_to
1282                 || DECL_SAVED_TREE (node->decl)))
1283           {
1284             error_found = true;
1285             dump_cgraph_node (stderr, node);
1286           }
1287       if (error_found)
1288         internal_error ("nodes with no released memory found");
1289     }
1290 #endif
1291 }
1292 /* Generate and emit a static constructor or destructor.  WHICH must be
1293    one of 'I' or 'D'.  BODY should be a STATEMENT_LIST containing
1294    GENERIC statements.  */
1295
1296 void
1297 cgraph_build_static_cdtor (char which, tree body, int priority)
1298 {
1299   static int counter = 0;
1300   char which_buf[16];
1301   tree decl, name, resdecl;
1302
1303   sprintf (which_buf, "%c_%d", which, counter++);
1304   name = get_file_function_name (which_buf);
1305
1306   decl = build_decl (FUNCTION_DECL, name,
1307                      build_function_type (void_type_node, void_list_node));
1308   current_function_decl = decl;
1309
1310   resdecl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
1311   DECL_ARTIFICIAL (resdecl) = 1;
1312   DECL_IGNORED_P (resdecl) = 1;
1313   DECL_RESULT (decl) = resdecl;
1314
1315   allocate_struct_function (decl);
1316
1317   TREE_STATIC (decl) = 1;
1318   TREE_USED (decl) = 1;
1319   DECL_ARTIFICIAL (decl) = 1;
1320   DECL_IGNORED_P (decl) = 1;
1321   DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
1322   DECL_SAVED_TREE (decl) = body;
1323   TREE_PUBLIC (decl) = ! targetm.have_ctors_dtors;
1324   DECL_UNINLINABLE (decl) = 1;
1325
1326   DECL_INITIAL (decl) = make_node (BLOCK);
1327   TREE_USED (DECL_INITIAL (decl)) = 1;
1328
1329   DECL_SOURCE_LOCATION (decl) = input_location;
1330   cfun->function_end_locus = input_location;
1331
1332   switch (which)
1333     {
1334     case 'I':
1335       DECL_STATIC_CONSTRUCTOR (decl) = 1;
1336       break;
1337     case 'D':
1338       DECL_STATIC_DESTRUCTOR (decl) = 1;
1339       break;
1340     default:
1341       gcc_unreachable ();
1342     }
1343
1344   gimplify_function_tree (decl);
1345
1346   cgraph_add_new_function (decl, false);
1347   cgraph_mark_needed_node (cgraph_node (decl));
1348
1349   if (targetm.have_ctors_dtors)
1350     {
1351       void (*fn) (rtx, int);
1352
1353       if (which == 'I')
1354         fn = targetm.asm_out.constructor;
1355       else
1356         fn = targetm.asm_out.destructor;
1357       fn (XEXP (DECL_RTL (decl), 0), priority);
1358     }
1359 }
1360
1361 void
1362 init_cgraph (void)
1363 {
1364   cgraph_dump_file = dump_begin (TDI_cgraph, NULL);
1365 }
1366
1367 /* The edges representing the callers of the NEW_VERSION node were
1368    fixed by cgraph_function_versioning (), now the call_expr in their
1369    respective tree code should be updated to call the NEW_VERSION.  */
1370
1371 static void
1372 update_call_expr (struct cgraph_node *new_version)
1373 {
1374   struct cgraph_edge *e;
1375
1376   gcc_assert (new_version);
1377   for (e = new_version->callers; e; e = e->next_caller)
1378     /* Update the call expr on the edges
1379        to call the new version.  */
1380     TREE_OPERAND (TREE_OPERAND (get_call_expr_in (e->call_stmt), 0), 0) = new_version->decl;
1381 }
1382
1383
1384 /* Create a new cgraph node which is the new version of
1385    OLD_VERSION node.  REDIRECT_CALLERS holds the callers
1386    edges which should be redirected to point to
1387    NEW_VERSION.  ALL the callees edges of OLD_VERSION
1388    are cloned to the new version node.  Return the new
1389    version node.  */
1390
1391 static struct cgraph_node *
1392 cgraph_copy_node_for_versioning (struct cgraph_node *old_version,
1393                                  tree new_decl,
1394                                  VEC(cgraph_edge_p,heap) *redirect_callers)
1395  {
1396    struct cgraph_node *new_version;
1397    struct cgraph_edge *e, *new_e;
1398    struct cgraph_edge *next_callee;
1399    unsigned i;
1400
1401    gcc_assert (old_version);
1402
1403    new_version = cgraph_node (new_decl);
1404
1405    new_version->analyzed = true;
1406    new_version->local = old_version->local;
1407    new_version->global = old_version->global;
1408    new_version->rtl = new_version->rtl;
1409    new_version->reachable = true;
1410    new_version->count = old_version->count;
1411
1412    /* Clone the old node callees.  Recursive calls are
1413       also cloned.  */
1414    for (e = old_version->callees;e; e=e->next_callee)
1415      {
1416        new_e = cgraph_clone_edge (e, new_version, e->call_stmt, 0, e->loop_nest, true);
1417        new_e->count = e->count;
1418      }
1419    /* Fix recursive calls.
1420       If OLD_VERSION has a recursive call after the
1421       previous edge cloning, the new version will have an edge
1422       pointing to the old version, which is wrong;
1423       Redirect it to point to the new version. */
1424    for (e = new_version->callees ; e; e = next_callee)
1425      {
1426        next_callee = e->next_callee;
1427        if (e->callee == old_version)
1428          cgraph_redirect_edge_callee (e, new_version);
1429
1430        if (!next_callee)
1431          break;
1432      }
1433    for (i = 0; VEC_iterate (cgraph_edge_p, redirect_callers, i, e); i++)
1434      {
1435        /* Redirect calls to the old version node to point to its new
1436           version.  */
1437        cgraph_redirect_edge_callee (e, new_version);
1438      }
1439
1440    return new_version;
1441  }
1442
1443  /* Perform function versioning.
1444     Function versioning includes copying of the tree and
1445     a callgraph update (creating a new cgraph node and updating
1446     its callees and callers).
1447
1448     REDIRECT_CALLERS varray includes the edges to be redirected
1449     to the new version.
1450
1451     TREE_MAP is a mapping of tree nodes we want to replace with
1452     new ones (according to results of prior analysis).
1453     OLD_VERSION_NODE is the node that is versioned.
1454     It returns the new version's cgraph node.  */
1455
1456 struct cgraph_node *
1457 cgraph_function_versioning (struct cgraph_node *old_version_node,
1458                             VEC(cgraph_edge_p,heap) *redirect_callers,
1459                             varray_type tree_map)
1460 {
1461   tree old_decl = old_version_node->decl;
1462   struct cgraph_node *new_version_node = NULL;
1463   tree new_decl;
1464
1465   if (!tree_versionable_function_p (old_decl))
1466     return NULL;
1467
1468   /* Make a new FUNCTION_DECL tree node for the
1469      new version. */
1470   new_decl = copy_node (old_decl);
1471
1472   /* Create the new version's call-graph node.
1473      and update the edges of the new node. */
1474   new_version_node =
1475     cgraph_copy_node_for_versioning (old_version_node, new_decl,
1476                                      redirect_callers);
1477
1478   /* Copy the OLD_VERSION_NODE function tree to the new version.  */
1479   tree_function_versioning (old_decl, new_decl, tree_map, false);
1480   /* Update the call_expr on the edges to call the new version node. */
1481   update_call_expr (new_version_node);
1482
1483   /* Update the new version's properties.
1484      Make The new version visible only within this translation unit.
1485      ??? We cannot use COMDAT linkage because there is no
1486      ABI support for this.  */
1487   DECL_EXTERNAL (new_version_node->decl) = 0;
1488   DECL_ONE_ONLY (new_version_node->decl) = 0;
1489   TREE_PUBLIC (new_version_node->decl) = 0;
1490   DECL_COMDAT (new_version_node->decl) = 0;
1491   new_version_node->local.externally_visible = 0;
1492   new_version_node->local.local = 1;
1493   new_version_node->lowered = true;
1494   return new_version_node;
1495 }
1496
1497 /* Produce separate function body for inline clones so the offline copy can be
1498    modified without affecting them.  */
1499 struct cgraph_node *
1500 save_inline_function_body (struct cgraph_node *node)
1501 {
1502   struct cgraph_node *first_clone;
1503
1504   gcc_assert (node == cgraph_node (node->decl));
1505
1506   cgraph_lower_function (node);
1507
1508   /* In non-unit-at-a-time we construct full fledged clone we never output to
1509      assembly file.  This clone is pointed out by inline_decl of original function
1510      and inlining infrastructure knows how to deal with this.  */
1511   if (!flag_unit_at_a_time)
1512     {
1513       struct cgraph_edge *e;
1514
1515       first_clone = cgraph_clone_node (node, node->count, 0, false);
1516       first_clone->needed = 0;
1517       first_clone->reachable = 1;
1518       /* Recursively clone all bodies.  */
1519       for (e = first_clone->callees; e; e = e->next_callee)
1520         if (!e->inline_failed)
1521           cgraph_clone_inlined_nodes (e, true, false);
1522     }
1523   else
1524     first_clone = node->next_clone;
1525
1526   first_clone->decl = copy_node (node->decl);
1527   node->next_clone = NULL;
1528   if (!flag_unit_at_a_time)
1529     node->inline_decl = first_clone->decl;
1530   first_clone->prev_clone = NULL;
1531   cgraph_insert_node_to_hashtable (first_clone);
1532   gcc_assert (first_clone == cgraph_node (first_clone->decl));
1533
1534   /* Copy the OLD_VERSION_NODE function tree to the new version.  */
1535   tree_function_versioning (node->decl, first_clone->decl, NULL, true);
1536
1537   DECL_EXTERNAL (first_clone->decl) = 0;
1538   DECL_ONE_ONLY (first_clone->decl) = 0;
1539   TREE_PUBLIC (first_clone->decl) = 0;
1540   DECL_COMDAT (first_clone->decl) = 0;
1541
1542   for (node = first_clone->next_clone; node; node = node->next_clone)
1543     node->decl = first_clone->decl;
1544 #ifdef ENABLE_CHECKING
1545   verify_cgraph_node (first_clone);
1546 #endif
1547   return first_clone;
1548 }