OSDN Git Service

Oops, forgot predicates.md line in last Changelog.
[pf3gnuchains/gcc-fork.git] / gcc / cgraphunit.c
1 /* Callgraph based interprocedural optimizations.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
3    2011 Free Software Foundation, Inc.
4    Contributed by Jan Hubicka
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* This 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 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         Analyzing of all functions is deferred
81         to cgraph_finalize_compilation_unit and expansion into cgraph_optimize.
82
83         In cgraph_finalize_compilation_unit the reachable functions are
84         analyzed.  During analysis the call-graph edges from reachable
85         functions are constructed and their destinations are marked as
86         reachable.  References to functions and variables are discovered too
87         and variables found to be needed output to the assembly file.  Via
88         mark_referenced call in assemble_variable functions referenced by
89         static variables are noticed too.
90
91         The intra-procedural information is produced and its existence
92         indicated by global_info_ready.  Once this flag is set it is impossible
93         to change function from !reachable to reachable and thus
94         assemble_variable no longer call mark_referenced.
95
96         Finally the call-graph is topologically sorted and all reachable functions
97         that has not been completely inlined or are not external are output.
98
99         ??? It is possible that reference to function or variable is optimized
100         out.  We can not deal with this nicely because topological order is not
101         suitable for it.  For tree-ssa we may consider another pass doing
102         optimization and re-discovering reachable functions.
103
104         ??? Reorganize code so variables are output very last and only if they
105         really has been referenced by produced code, so we catch more cases
106         where reference has been optimized out.  */
107
108
109 #include "config.h"
110 #include "system.h"
111 #include "coretypes.h"
112 #include "tm.h"
113 #include "tree.h"
114 #include "rtl.h"
115 #include "tree-flow.h"
116 #include "tree-inline.h"
117 #include "langhooks.h"
118 #include "pointer-set.h"
119 #include "toplev.h"
120 #include "flags.h"
121 #include "ggc.h"
122 #include "debug.h"
123 #include "target.h"
124 #include "cgraph.h"
125 #include "diagnostic.h"
126 #include "tree-pretty-print.h"
127 #include "gimple-pretty-print.h"
128 #include "timevar.h"
129 #include "params.h"
130 #include "fibheap.h"
131 #include "intl.h"
132 #include "function.h"
133 #include "ipa-prop.h"
134 #include "gimple.h"
135 #include "tree-iterator.h"
136 #include "tree-pass.h"
137 #include "tree-dump.h"
138 #include "output.h"
139 #include "coverage.h"
140 #include "plugin.h"
141
142 static void cgraph_expand_all_functions (void);
143 static void cgraph_mark_functions_to_output (void);
144 static void cgraph_expand_function (struct cgraph_node *);
145 static void cgraph_output_pending_asms (void);
146 static void cgraph_analyze_function (struct cgraph_node *);
147
148 FILE *cgraph_dump_file;
149
150 /* Used for vtable lookup in thunk adjusting.  */
151 static GTY (()) tree vtable_entry_type;
152
153 /* Determine if function DECL is needed.  That is, visible to something
154    either outside this translation unit, something magic in the system
155    configury.  */
156
157 bool
158 cgraph_decide_is_function_needed (struct cgraph_node *node, tree decl)
159 {
160   /* If the user told us it is used, then it must be so.  */
161   if (node->local.externally_visible)
162     return true;
163
164   /* ??? If the assembler name is set by hand, it is possible to assemble
165      the name later after finalizing the function and the fact is noticed
166      in assemble_name then.  This is arguably a bug.  */
167   if (DECL_ASSEMBLER_NAME_SET_P (decl)
168       && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
169     return true;
170
171   /* With -fkeep-inline-functions we are keeping all inline functions except
172      for extern inline ones.  */
173   if (flag_keep_inline_functions
174       && DECL_DECLARED_INLINE_P (decl)
175       && !DECL_EXTERNAL (decl)
176       && !lookup_attribute ("always_inline", DECL_ATTRIBUTES (decl)))
177      return true;
178
179   /* If we decided it was needed before, but at the time we didn't have
180      the body of the function available, then it's still needed.  We have
181      to go back and re-check its dependencies now.  */
182   if (node->needed)
183     return true;
184
185   /* Externally visible functions must be output.  The exception is
186      COMDAT functions that must be output only when they are needed.
187
188      When not optimizing, also output the static functions. (see
189      PR24561), but don't do so for always_inline functions, functions
190      declared inline and nested functions.  These were optimized out
191      in the original implementation and it is unclear whether we want
192      to change the behavior here.  */
193   if (((TREE_PUBLIC (decl)
194         || (!optimize
195             && !node->local.disregard_inline_limits
196             && !DECL_DECLARED_INLINE_P (decl)
197             && !(DECL_CONTEXT (decl)
198                  && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)))
199        && !flag_whole_program
200        && !flag_lto)
201       && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
202     return true;
203
204   return false;
205 }
206
207 /* Process CGRAPH_NEW_FUNCTIONS and perform actions necessary to add these
208    functions into callgraph in a way so they look like ordinary reachable
209    functions inserted into callgraph already at construction time.  */
210
211 bool
212 cgraph_process_new_functions (void)
213 {
214   bool output = false;
215   tree fndecl;
216   struct cgraph_node *node;
217
218   varpool_analyze_pending_decls ();
219   /*  Note that this queue may grow as its being processed, as the new
220       functions may generate new ones.  */
221   while (cgraph_new_nodes)
222     {
223       node = cgraph_new_nodes;
224       fndecl = node->decl;
225       cgraph_new_nodes = cgraph_new_nodes->next_needed;
226       switch (cgraph_state)
227         {
228         case CGRAPH_STATE_CONSTRUCTION:
229           /* At construction time we just need to finalize function and move
230              it into reachable functions list.  */
231
232           node->next_needed = NULL;
233           cgraph_finalize_function (fndecl, false);
234           cgraph_mark_reachable_node (node);
235           output = true;
236           break;
237
238         case CGRAPH_STATE_IPA:
239         case CGRAPH_STATE_IPA_SSA:
240           /* When IPA optimization already started, do all essential
241              transformations that has been already performed on the whole
242              cgraph but not on this function.  */
243
244           gimple_register_cfg_hooks ();
245           if (!node->analyzed)
246             cgraph_analyze_function (node);
247           push_cfun (DECL_STRUCT_FUNCTION (fndecl));
248           current_function_decl = fndecl;
249           compute_inline_parameters (node);
250           if ((cgraph_state == CGRAPH_STATE_IPA_SSA
251               && !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (fndecl)))
252               /* When not optimizing, be sure we run early local passes anyway
253                  to expand OMP.  */
254               || !optimize)
255             execute_pass_list (pass_early_local_passes.pass.sub);
256           free_dominance_info (CDI_POST_DOMINATORS);
257           free_dominance_info (CDI_DOMINATORS);
258           pop_cfun ();
259           current_function_decl = NULL;
260           break;
261
262         case CGRAPH_STATE_EXPANSION:
263           /* Functions created during expansion shall be compiled
264              directly.  */
265           node->process = 0;
266           cgraph_expand_function (node);
267           break;
268
269         default:
270           gcc_unreachable ();
271           break;
272         }
273       cgraph_call_function_insertion_hooks (node);
274       varpool_analyze_pending_decls ();
275     }
276   return output;
277 }
278
279 /* As an GCC extension we allow redefinition of the function.  The
280    semantics when both copies of bodies differ is not well defined.
281    We replace the old body with new body so in unit at a time mode
282    we always use new body, while in normal mode we may end up with
283    old body inlined into some functions and new body expanded and
284    inlined in others.
285
286    ??? It may make more sense to use one body for inlining and other
287    body for expanding the function but this is difficult to do.  */
288
289 static void
290 cgraph_reset_node (struct cgraph_node *node)
291 {
292   /* If node->process is set, then we have already begun whole-unit analysis.
293      This is *not* testing for whether we've already emitted the function.
294      That case can be sort-of legitimately seen with real function redefinition
295      errors.  I would argue that the front end should never present us with
296      such a case, but don't enforce that for now.  */
297   gcc_assert (!node->process);
298
299   /* Reset our data structures so we can analyze the function again.  */
300   memset (&node->local, 0, sizeof (node->local));
301   memset (&node->global, 0, sizeof (node->global));
302   memset (&node->rtl, 0, sizeof (node->rtl));
303   node->analyzed = false;
304   node->local.redefined_extern_inline = true;
305   node->local.finalized = false;
306
307   cgraph_node_remove_callees (node);
308
309   /* We may need to re-queue the node for assembling in case
310      we already proceeded it and ignored as not needed or got
311      a re-declaration in IMA mode.  */
312   if (node->reachable)
313     {
314       struct cgraph_node *n;
315
316       for (n = cgraph_nodes_queue; n; n = n->next_needed)
317         if (n == node)
318           break;
319       if (!n)
320         node->reachable = 0;
321     }
322 }
323
324 static void
325 cgraph_lower_function (struct cgraph_node *node)
326 {
327   if (node->lowered)
328     return;
329
330   if (node->nested)
331     lower_nested_functions (node->decl);
332   gcc_assert (!node->nested);
333
334   tree_lowering_passes (node->decl);
335   node->lowered = true;
336 }
337
338 /* DECL has been parsed.  Take it, queue it, compile it at the whim of the
339    logic in effect.  If NESTED is true, then our caller cannot stand to have
340    the garbage collector run at the moment.  We would need to either create
341    a new GC context, or just not compile right now.  */
342
343 void
344 cgraph_finalize_function (tree decl, bool nested)
345 {
346   struct cgraph_node *node = cgraph_node (decl);
347
348   if (node->local.finalized)
349     cgraph_reset_node (node);
350
351   node->pid = cgraph_max_pid ++;
352   notice_global_symbol (decl);
353   node->local.finalized = true;
354   node->lowered = DECL_STRUCT_FUNCTION (decl)->cfg != NULL;
355   node->finalized_by_frontend = true;
356
357   if (cgraph_decide_is_function_needed (node, decl))
358     cgraph_mark_needed_node (node);
359
360   /* Since we reclaim unreachable nodes at the end of every language
361      level unit, we need to be conservative about possible entry points
362      there.  */
363   if ((TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
364       || DECL_STATIC_CONSTRUCTOR (decl)
365       || DECL_STATIC_DESTRUCTOR (decl)
366       /* COMDAT virtual functions may be referenced by vtable from
367          other compilatoin unit.  Still we want to devirtualize calls
368          to those so we need to analyze them.
369          FIXME: We should introduce may edges for this purpose and update
370          their handling in unreachable function removal and inliner too.  */
371       || (DECL_VIRTUAL_P (decl) && (DECL_COMDAT (decl) || DECL_EXTERNAL (decl))))
372     cgraph_mark_reachable_node (node);
373
374   /* If we've not yet emitted decl, tell the debug info about it.  */
375   if (!TREE_ASM_WRITTEN (decl))
376     (*debug_hooks->deferred_inline_function) (decl);
377
378   /* Possibly warn about unused parameters.  */
379   if (warn_unused_parameter)
380     do_warn_unused_parameter (decl);
381
382   if (!nested)
383     ggc_collect ();
384 }
385
386 /* C99 extern inline keywords allow changing of declaration after function
387    has been finalized.  We need to re-decide if we want to mark the function as
388    needed then.   */
389
390 void
391 cgraph_mark_if_needed (tree decl)
392 {
393   struct cgraph_node *node = cgraph_node (decl);
394   if (node->local.finalized && cgraph_decide_is_function_needed (node, decl))
395     cgraph_mark_needed_node (node);
396 }
397
398 /* Return TRUE if NODE2 is equivalent to NODE or its clone.  */
399 static bool
400 clone_of_p (struct cgraph_node *node, struct cgraph_node *node2)
401 {
402   while (node != node2 && node2)
403     node2 = node2->clone_of;
404   return node2 != NULL;
405 }
406
407 /* Verify edge E count and frequency.  */
408
409 static bool
410 verify_edge_count_and_frequency (struct cgraph_edge *e)
411 {
412   bool error_found = false;
413   if (e->count < 0)
414     {
415       error ("caller edge count is negative");
416       error_found = true;
417     }
418   if (e->frequency < 0)
419     {
420       error ("caller edge frequency is negative");
421       error_found = true;
422     }
423   if (e->frequency > CGRAPH_FREQ_MAX)
424     {
425       error ("caller edge frequency is too large");
426       error_found = true;
427     }
428   if (gimple_has_body_p (e->caller->decl)
429       && !e->caller->global.inlined_to
430       && (e->frequency
431           != compute_call_stmt_bb_frequency (e->caller->decl,
432                                              gimple_bb (e->call_stmt))))
433     {
434       error ("caller edge frequency %i does not match BB freqency %i",
435              e->frequency,
436              compute_call_stmt_bb_frequency (e->caller->decl,
437                                              gimple_bb (e->call_stmt)));
438       error_found = true;
439     }
440   return error_found;
441 }
442
443 /* Verify cgraph nodes of given cgraph node.  */
444 DEBUG_FUNCTION void
445 verify_cgraph_node (struct cgraph_node *node)
446 {
447   struct cgraph_edge *e;
448   struct function *this_cfun = DECL_STRUCT_FUNCTION (node->decl);
449   struct function *saved_cfun = cfun;
450   basic_block this_block;
451   gimple_stmt_iterator gsi;
452   bool error_found = false;
453
454   if (seen_error ())
455     return;
456
457   timevar_push (TV_CGRAPH_VERIFY);
458   /* debug_generic_stmt needs correct cfun */
459   set_cfun (this_cfun);
460   for (e = node->callees; e; e = e->next_callee)
461     if (e->aux)
462       {
463         error ("aux field set for edge %s->%s",
464                identifier_to_locale (cgraph_node_name (e->caller)),
465                identifier_to_locale (cgraph_node_name (e->callee)));
466         error_found = true;
467       }
468   if (node->count < 0)
469     {
470       error ("execution count is negative");
471       error_found = true;
472     }
473   if (node->global.inlined_to && node->local.externally_visible)
474     {
475       error ("externally visible inline clone");
476       error_found = true;
477     }
478   if (node->global.inlined_to && node->address_taken)
479     {
480       error ("inline clone with address taken");
481       error_found = true;
482     }
483   if (node->global.inlined_to && node->needed)
484     {
485       error ("inline clone is needed");
486       error_found = true;
487     }
488   for (e = node->indirect_calls; e; e = e->next_callee)
489     {
490       if (e->aux)
491         {
492           error ("aux field set for indirect edge from %s",
493                  identifier_to_locale (cgraph_node_name (e->caller)));
494           error_found = true;
495         }
496       if (!e->indirect_unknown_callee
497           || !e->indirect_info)
498         {
499           error ("An indirect edge from %s is not marked as indirect or has "
500                  "associated indirect_info, the corresponding statement is: ",
501                  identifier_to_locale (cgraph_node_name (e->caller)));
502           debug_gimple_stmt (e->call_stmt);
503           error_found = true;
504         }
505     }
506   for (e = node->callers; e; e = e->next_caller)
507     {
508       if (verify_edge_count_and_frequency (e))
509         error_found = true;
510       if (!e->inline_failed)
511         {
512           if (node->global.inlined_to
513               != (e->caller->global.inlined_to
514                   ? e->caller->global.inlined_to : e->caller))
515             {
516               error ("inlined_to pointer is wrong");
517               error_found = true;
518             }
519           if (node->callers->next_caller)
520             {
521               error ("multiple inline callers");
522               error_found = true;
523             }
524         }
525       else
526         if (node->global.inlined_to)
527           {
528             error ("inlined_to pointer set for noninline callers");
529             error_found = true;
530           }
531     }
532   for (e = node->indirect_calls; e; e = e->next_callee)
533     if (verify_edge_count_and_frequency (e))
534       error_found = true;
535   if (!node->callers && node->global.inlined_to)
536     {
537       error ("inlined_to pointer is set but no predecessors found");
538       error_found = true;
539     }
540   if (node->global.inlined_to == node)
541     {
542       error ("inlined_to pointer refers to itself");
543       error_found = true;
544     }
545
546   if (!cgraph_node (node->decl))
547     {
548       error ("node not found in cgraph_hash");
549       error_found = true;
550     }
551
552   if (node->clone_of)
553     {
554       struct cgraph_node *n;
555       for (n = node->clone_of->clones; n; n = n->next_sibling_clone)
556         if (n == node)
557           break;
558       if (!n)
559         {
560           error ("node has wrong clone_of");
561           error_found = true;
562         }
563     }
564   if (node->clones)
565     {
566       struct cgraph_node *n;
567       for (n = node->clones; n; n = n->next_sibling_clone)
568         if (n->clone_of != node)
569           break;
570       if (n)
571         {
572           error ("node has wrong clone list");
573           error_found = true;
574         }
575     }
576   if ((node->prev_sibling_clone || node->next_sibling_clone) && !node->clone_of)
577     {
578        error ("node is in clone list but it is not clone");
579        error_found = true;
580     }
581   if (!node->prev_sibling_clone && node->clone_of && node->clone_of->clones != node)
582     {
583       error ("node has wrong prev_clone pointer");
584       error_found = true;
585     }
586   if (node->prev_sibling_clone && node->prev_sibling_clone->next_sibling_clone != node)
587     {
588       error ("double linked list of clones corrupted");
589       error_found = true;
590     }
591   if (node->same_comdat_group)
592     {
593       struct cgraph_node *n = node->same_comdat_group;
594
595       if (!DECL_ONE_ONLY (node->decl))
596         {
597           error ("non-DECL_ONE_ONLY node in a same_comdat_group list");
598           error_found = true;
599         }
600       if (n == node)
601         {
602           error ("node is alone in a comdat group");
603           error_found = true;
604         }
605       do
606         {
607           if (!n->same_comdat_group)
608             {
609               error ("same_comdat_group is not a circular list");
610               error_found = true;
611               break;
612             }
613           n = n->same_comdat_group;
614         }
615       while (n != node);
616     }
617
618   if (node->analyzed && gimple_has_body_p (node->decl)
619       && !TREE_ASM_WRITTEN (node->decl)
620       && (!DECL_EXTERNAL (node->decl) || node->global.inlined_to)
621       && !flag_wpa)
622     {
623       if (this_cfun->cfg)
624         {
625           /* The nodes we're interested in are never shared, so walk
626              the tree ignoring duplicates.  */
627           struct pointer_set_t *visited_nodes = pointer_set_create ();
628           /* Reach the trees by walking over the CFG, and note the
629              enclosing basic-blocks in the call edges.  */
630           FOR_EACH_BB_FN (this_block, this_cfun)
631             for (gsi = gsi_start_bb (this_block);
632                  !gsi_end_p (gsi);
633                  gsi_next (&gsi))
634               {
635                 gimple stmt = gsi_stmt (gsi);
636                 if (is_gimple_call (stmt))
637                   {
638                     struct cgraph_edge *e = cgraph_edge (node, stmt);
639                     tree decl = gimple_call_fndecl (stmt);
640                     if (e)
641                       {
642                         if (e->aux)
643                           {
644                             error ("shared call_stmt:");
645                             debug_gimple_stmt (stmt);
646                             error_found = true;
647                           }
648                         if (!e->indirect_unknown_callee)
649                           {
650                             struct cgraph_node *n;
651
652                             if (e->callee->same_body_alias)
653                               {
654                                 error ("edge points to same body alias:");
655                                 debug_tree (e->callee->decl);
656                                 error_found = true;
657                               }
658                             else if (!e->callee->global.inlined_to
659                                      && decl
660                                      && cgraph_get_node (decl)
661                                      && (e->callee->former_clone_of
662                                          != cgraph_get_node (decl)->decl)
663                                      && !clone_of_p (cgraph_node (decl),
664                                                      e->callee))
665                               {
666                                 error ("edge points to wrong declaration:");
667                                 debug_tree (e->callee->decl);
668                                 fprintf (stderr," Instead of:");
669                                 debug_tree (decl);
670                                 error_found = true;
671                               }
672                             else if (decl
673                                      && (n = cgraph_get_node_or_alias (decl))
674                                      && (n->same_body_alias
675                                          && n->thunk.thunk_p))
676                               {
677                                 error ("a call to thunk improperly represented "
678                                        "in the call graph:");
679                                 debug_gimple_stmt (stmt);
680                               }
681                           }
682                         else if (decl)
683                           {
684                             error ("an indirect edge with unknown callee "
685                                    "corresponding to a call_stmt with "
686                                    "a known declaration:");
687                             error_found = true;
688                             debug_gimple_stmt (e->call_stmt);
689                           }
690                         e->aux = (void *)1;
691                       }
692                     else if (decl)
693                       {
694                         error ("missing callgraph edge for call stmt:");
695                         debug_gimple_stmt (stmt);
696                         error_found = true;
697                       }
698                   }
699               }
700           pointer_set_destroy (visited_nodes);
701         }
702       else
703         /* No CFG available?!  */
704         gcc_unreachable ();
705
706       for (e = node->callees; e; e = e->next_callee)
707         {
708           if (!e->aux)
709             {
710               error ("edge %s->%s has no corresponding call_stmt",
711                      identifier_to_locale (cgraph_node_name (e->caller)),
712                      identifier_to_locale (cgraph_node_name (e->callee)));
713               debug_gimple_stmt (e->call_stmt);
714               error_found = true;
715             }
716           e->aux = 0;
717         }
718       for (e = node->indirect_calls; e; e = e->next_callee)
719         {
720           if (!e->aux)
721             {
722               error ("an indirect edge from %s has no corresponding call_stmt",
723                      identifier_to_locale (cgraph_node_name (e->caller)));
724               debug_gimple_stmt (e->call_stmt);
725               error_found = true;
726             }
727           e->aux = 0;
728         }
729     }
730   if (error_found)
731     {
732       dump_cgraph_node (stderr, node);
733       internal_error ("verify_cgraph_node failed");
734     }
735   set_cfun (saved_cfun);
736   timevar_pop (TV_CGRAPH_VERIFY);
737 }
738
739 /* Verify whole cgraph structure.  */
740 DEBUG_FUNCTION void
741 verify_cgraph (void)
742 {
743   struct cgraph_node *node;
744
745   if (seen_error ())
746     return;
747
748   for (node = cgraph_nodes; node; node = node->next)
749     verify_cgraph_node (node);
750 }
751
752 /* Output all asm statements we have stored up to be output.  */
753
754 static void
755 cgraph_output_pending_asms (void)
756 {
757   struct cgraph_asm_node *can;
758
759   if (seen_error ())
760     return;
761
762   for (can = cgraph_asm_nodes; can; can = can->next)
763     assemble_asm (can->asm_str);
764   cgraph_asm_nodes = NULL;
765 }
766
767 /* Analyze the function scheduled to be output.  */
768 static void
769 cgraph_analyze_function (struct cgraph_node *node)
770 {
771   tree save = current_function_decl;
772   tree decl = node->decl;
773
774   current_function_decl = decl;
775   push_cfun (DECL_STRUCT_FUNCTION (decl));
776
777   assign_assembler_name_if_neeeded (node->decl);
778
779   /* Make sure to gimplify bodies only once.  During analyzing a
780      function we lower it, which will require gimplified nested
781      functions, so we can end up here with an already gimplified
782      body.  */
783   if (!gimple_body (decl))
784     gimplify_function_tree (decl);
785   dump_function (TDI_generic, decl);
786
787   cgraph_lower_function (node);
788   node->analyzed = true;
789
790   pop_cfun ();
791   current_function_decl = save;
792 }
793
794 /* Look for externally_visible and used attributes and mark cgraph nodes
795    accordingly.
796
797    We cannot mark the nodes at the point the attributes are processed (in
798    handle_*_attribute) because the copy of the declarations available at that
799    point may not be canonical.  For example, in:
800
801     void f();
802     void f() __attribute__((used));
803
804    the declaration we see in handle_used_attribute will be the second
805    declaration -- but the front end will subsequently merge that declaration
806    with the original declaration and discard the second declaration.
807
808    Furthermore, we can't mark these nodes in cgraph_finalize_function because:
809
810     void f() {}
811     void f() __attribute__((externally_visible));
812
813    is valid.
814
815    So, we walk the nodes at the end of the translation unit, applying the
816    attributes at that point.  */
817
818 static void
819 process_function_and_variable_attributes (struct cgraph_node *first,
820                                           struct varpool_node *first_var)
821 {
822   struct cgraph_node *node;
823   struct varpool_node *vnode;
824
825   for (node = cgraph_nodes; node != first; node = node->next)
826     {
827       tree decl = node->decl;
828       if (DECL_PRESERVE_P (decl))
829         cgraph_mark_needed_node (node);
830       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
831           && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl))
832           && TREE_PUBLIC (node->decl))
833         {
834           if (node->local.finalized)
835             cgraph_mark_needed_node (node);
836         }
837       else if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
838         {
839           if (! TREE_PUBLIC (node->decl))
840             warning_at (DECL_SOURCE_LOCATION (node->decl), OPT_Wattributes,
841                         "%<externally_visible%>"
842                         " attribute have effect only on public objects");
843           else if (node->local.finalized)
844              cgraph_mark_needed_node (node);
845         }
846     }
847   for (vnode = varpool_nodes; vnode != first_var; vnode = vnode->next)
848     {
849       tree decl = vnode->decl;
850       if (DECL_PRESERVE_P (decl))
851         {
852           vnode->force_output = true;
853           if (vnode->finalized)
854             varpool_mark_needed_node (vnode);
855         }
856       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
857           && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl))
858           && TREE_PUBLIC (vnode->decl))
859         {
860           if (vnode->finalized)
861             varpool_mark_needed_node (vnode);
862         }
863       else if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
864         {
865           if (! TREE_PUBLIC (vnode->decl))
866             warning_at (DECL_SOURCE_LOCATION (vnode->decl), OPT_Wattributes,
867                         "%<externally_visible%>"
868                         " attribute have effect only on public objects");
869           else if (vnode->finalized)
870             varpool_mark_needed_node (vnode);
871         }
872     }
873 }
874
875 /* Process CGRAPH_NODES_NEEDED queue, analyze each function (and transitively
876    each reachable functions) and build cgraph.
877    The function can be called multiple times after inserting new nodes
878    into beginning of queue.  Just the new part of queue is re-scanned then.  */
879
880 static void
881 cgraph_analyze_functions (void)
882 {
883   /* Keep track of already processed nodes when called multiple times for
884      intermodule optimization.  */
885   static struct cgraph_node *first_analyzed;
886   struct cgraph_node *first_processed = first_analyzed;
887   static struct varpool_node *first_analyzed_var;
888   struct cgraph_node *node, *next;
889
890   bitmap_obstack_initialize (NULL);
891   process_function_and_variable_attributes (first_processed,
892                                             first_analyzed_var);
893   first_processed = cgraph_nodes;
894   first_analyzed_var = varpool_nodes;
895   varpool_analyze_pending_decls ();
896   if (cgraph_dump_file)
897     {
898       fprintf (cgraph_dump_file, "Initial entry points:");
899       for (node = cgraph_nodes; node != first_analyzed; node = node->next)
900         if (node->needed)
901           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
902       fprintf (cgraph_dump_file, "\n");
903     }
904   cgraph_process_new_functions ();
905
906   /* Propagate reachability flag and lower representation of all reachable
907      functions.  In the future, lowering will introduce new functions and
908      new entry points on the way (by template instantiation and virtual
909      method table generation for instance).  */
910   while (cgraph_nodes_queue)
911     {
912       struct cgraph_edge *edge;
913       tree decl = cgraph_nodes_queue->decl;
914
915       node = cgraph_nodes_queue;
916       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
917       node->next_needed = NULL;
918
919       /* ??? It is possible to create extern inline function and later using
920          weak alias attribute to kill its body. See
921          gcc.c-torture/compile/20011119-1.c  */
922       if (!DECL_STRUCT_FUNCTION (decl))
923         {
924           cgraph_reset_node (node);
925           continue;
926         }
927
928       if (!node->analyzed)
929         cgraph_analyze_function (node);
930
931       for (edge = node->callees; edge; edge = edge->next_callee)
932         if (!edge->callee->reachable)
933           cgraph_mark_reachable_node (edge->callee);
934
935       if (node->same_comdat_group)
936         {
937           for (next = node->same_comdat_group;
938                next != node;
939                next = next->same_comdat_group)
940             cgraph_mark_reachable_node (next);
941         }
942
943       /* If decl is a clone of an abstract function, mark that abstract
944          function so that we don't release its body. The DECL_INITIAL() of that
945          abstract function declaration will be later needed to output debug info.  */
946       if (DECL_ABSTRACT_ORIGIN (decl))
947         {
948           struct cgraph_node *origin_node = cgraph_node (DECL_ABSTRACT_ORIGIN (decl));
949           origin_node->abstract_and_needed = true;
950         }
951
952       /* We finalize local static variables during constructing callgraph
953          edges.  Process their attributes too.  */
954       process_function_and_variable_attributes (first_processed,
955                                                 first_analyzed_var);
956       first_processed = cgraph_nodes;
957       first_analyzed_var = varpool_nodes;
958       varpool_analyze_pending_decls ();
959       cgraph_process_new_functions ();
960     }
961
962   /* Collect entry points to the unit.  */
963   if (cgraph_dump_file)
964     {
965       fprintf (cgraph_dump_file, "Unit entry points:");
966       for (node = cgraph_nodes; node != first_analyzed; node = node->next)
967         if (node->needed)
968           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
969       fprintf (cgraph_dump_file, "\n\nInitial ");
970       dump_cgraph (cgraph_dump_file);
971       dump_varpool (cgraph_dump_file);
972     }
973
974   if (cgraph_dump_file)
975     fprintf (cgraph_dump_file, "\nReclaiming functions:");
976
977   for (node = cgraph_nodes; node != first_analyzed; node = next)
978     {
979       tree decl = node->decl;
980       next = node->next;
981
982       if (node->local.finalized && !gimple_has_body_p (decl))
983         cgraph_reset_node (node);
984
985       if (!node->reachable && gimple_has_body_p (decl))
986         {
987           if (cgraph_dump_file)
988             fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
989           cgraph_remove_node (node);
990           continue;
991         }
992       else
993         node->next_needed = NULL;
994       gcc_assert (!node->local.finalized || gimple_has_body_p (decl));
995       gcc_assert (node->analyzed == node->local.finalized);
996     }
997   if (cgraph_dump_file)
998     {
999       fprintf (cgraph_dump_file, "\n\nReclaimed ");
1000       dump_cgraph (cgraph_dump_file);
1001       dump_varpool (cgraph_dump_file);
1002     }
1003   bitmap_obstack_release (NULL);
1004   first_analyzed = cgraph_nodes;
1005   ggc_collect ();
1006 }
1007
1008
1009 /* Analyze the whole compilation unit once it is parsed completely.  */
1010
1011 void
1012 cgraph_finalize_compilation_unit (void)
1013 {
1014   timevar_push (TV_CGRAPH);
1015
1016   /* Do not skip analyzing the functions if there were errors, we
1017      miss diagnostics for following functions otherwise.  */
1018
1019   /* Emit size functions we didn't inline.  */
1020   finalize_size_functions ();
1021
1022   /* Mark alias targets necessary and emit diagnostics.  */
1023   finish_aliases_1 ();
1024
1025   if (!quiet_flag)
1026     {
1027       fprintf (stderr, "\nAnalyzing compilation unit\n");
1028       fflush (stderr);
1029     }
1030
1031   /* Gimplify and lower all functions, compute reachability and
1032      remove unreachable nodes.  */
1033   cgraph_analyze_functions ();
1034
1035   /* Mark alias targets necessary and emit diagnostics.  */
1036   finish_aliases_1 ();
1037
1038   /* Gimplify and lower thunks.  */
1039   cgraph_analyze_functions ();
1040
1041   /* Finally drive the pass manager.  */
1042   cgraph_optimize ();
1043
1044   timevar_pop (TV_CGRAPH);
1045 }
1046
1047
1048 /* Figure out what functions we want to assemble.  */
1049
1050 static void
1051 cgraph_mark_functions_to_output (void)
1052 {
1053   struct cgraph_node *node;
1054 #ifdef ENABLE_CHECKING
1055   bool check_same_comdat_groups = false;
1056
1057   for (node = cgraph_nodes; node; node = node->next)
1058     gcc_assert (!node->process);
1059 #endif
1060
1061   for (node = cgraph_nodes; node; node = node->next)
1062     {
1063       tree decl = node->decl;
1064       struct cgraph_edge *e;
1065
1066       gcc_assert (!node->process || node->same_comdat_group);
1067       if (node->process)
1068         continue;
1069
1070       for (e = node->callers; e; e = e->next_caller)
1071         if (e->inline_failed)
1072           break;
1073
1074       /* We need to output all local functions that are used and not
1075          always inlined, as well as those that are reachable from
1076          outside the current compilation unit.  */
1077       if (node->analyzed
1078           && !node->global.inlined_to
1079           && (!cgraph_only_called_directly_p (node)
1080               || (e && node->reachable))
1081           && !TREE_ASM_WRITTEN (decl)
1082           && !DECL_EXTERNAL (decl))
1083         {
1084           node->process = 1;
1085           if (node->same_comdat_group)
1086             {
1087               struct cgraph_node *next;
1088               for (next = node->same_comdat_group;
1089                    next != node;
1090                    next = next->same_comdat_group)
1091                 next->process = 1;
1092             }
1093         }
1094       else if (node->same_comdat_group)
1095         {
1096 #ifdef ENABLE_CHECKING
1097           check_same_comdat_groups = true;
1098 #endif
1099         }
1100       else
1101         {
1102           /* We should've reclaimed all functions that are not needed.  */
1103 #ifdef ENABLE_CHECKING
1104           if (!node->global.inlined_to
1105               && gimple_has_body_p (decl)
1106               /* FIXME: in ltrans unit when offline copy is outside partition but inline copies
1107                  are inside partition, we can end up not removing the body since we no longer
1108                  have analyzed node pointing to it.  */
1109               && !node->in_other_partition
1110               && !DECL_EXTERNAL (decl))
1111             {
1112               dump_cgraph_node (stderr, node);
1113               internal_error ("failed to reclaim unneeded function");
1114             }
1115 #endif
1116           gcc_assert (node->global.inlined_to
1117                       || !gimple_has_body_p (decl)
1118                       || node->in_other_partition
1119                       || DECL_EXTERNAL (decl));
1120
1121         }
1122
1123     }
1124 #ifdef ENABLE_CHECKING
1125   if (check_same_comdat_groups)
1126     for (node = cgraph_nodes; node; node = node->next)
1127       if (node->same_comdat_group && !node->process)
1128         {
1129           tree decl = node->decl;
1130           if (!node->global.inlined_to
1131               && gimple_has_body_p (decl)
1132               /* FIXME: in ltrans unit when offline copy is outside partition but inline copies
1133                  are inside partition, we can end up not removing the body since we no longer
1134                  have analyzed node pointing to it.  */
1135               && !node->in_other_partition
1136               && !DECL_EXTERNAL (decl))
1137             {
1138               dump_cgraph_node (stderr, node);
1139               internal_error ("failed to reclaim unneeded function");
1140             }
1141         }
1142 #endif
1143 }
1144
1145 /* DECL is FUNCTION_DECL.  Initialize datastructures so DECL is a function
1146    in lowered gimple form.
1147    
1148    Set current_function_decl and cfun to newly constructed empty function body.
1149    return basic block in the function body.  */
1150
1151 static basic_block
1152 init_lowered_empty_function (tree decl)
1153 {
1154   basic_block bb;
1155
1156   current_function_decl = decl;
1157   allocate_struct_function (decl, false);
1158   gimple_register_cfg_hooks ();
1159   init_empty_tree_cfg ();
1160   init_tree_ssa (cfun);
1161   init_ssa_operands ();
1162   cfun->gimple_df->in_ssa_p = true;
1163   DECL_INITIAL (decl) = make_node (BLOCK);
1164
1165   DECL_SAVED_TREE (decl) = error_mark_node;
1166   cfun->curr_properties |=
1167     (PROP_gimple_lcf | PROP_gimple_leh | PROP_cfg | PROP_referenced_vars |
1168      PROP_ssa);
1169
1170   /* Create BB for body of the function and connect it properly.  */
1171   bb = create_basic_block (NULL, (void *) 0, ENTRY_BLOCK_PTR);
1172   make_edge (ENTRY_BLOCK_PTR, bb, 0);
1173   make_edge (bb, EXIT_BLOCK_PTR, 0);
1174
1175   return bb;
1176 }
1177
1178 /* Adjust PTR by the constant FIXED_OFFSET, and by the vtable
1179    offset indicated by VIRTUAL_OFFSET, if that is
1180    non-null. THIS_ADJUSTING is nonzero for a this adjusting thunk and
1181    zero for a result adjusting thunk.  */
1182
1183 static tree
1184 thunk_adjust (gimple_stmt_iterator * bsi,
1185               tree ptr, bool this_adjusting,
1186               HOST_WIDE_INT fixed_offset, tree virtual_offset)
1187 {
1188   gimple stmt;
1189   tree ret;
1190
1191   if (this_adjusting
1192       && fixed_offset != 0)
1193     {
1194       stmt = gimple_build_assign (ptr,
1195                                   fold_build2_loc (input_location,
1196                                                    POINTER_PLUS_EXPR,
1197                                                    TREE_TYPE (ptr), ptr,
1198                                                    size_int (fixed_offset)));
1199       gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1200     }
1201
1202   /* If there's a virtual offset, look up that value in the vtable and
1203      adjust the pointer again.  */
1204   if (virtual_offset)
1205     {
1206       tree vtabletmp;
1207       tree vtabletmp2;
1208       tree vtabletmp3;
1209       tree offsettmp;
1210
1211       if (!vtable_entry_type)
1212         {
1213           tree vfunc_type = make_node (FUNCTION_TYPE);
1214           TREE_TYPE (vfunc_type) = integer_type_node;
1215           TYPE_ARG_TYPES (vfunc_type) = NULL_TREE;
1216           layout_type (vfunc_type);
1217
1218           vtable_entry_type = build_pointer_type (vfunc_type);
1219         }
1220
1221       vtabletmp =
1222         create_tmp_var (build_pointer_type
1223                         (build_pointer_type (vtable_entry_type)), "vptr");
1224
1225       /* The vptr is always at offset zero in the object.  */
1226       stmt = gimple_build_assign (vtabletmp,
1227                                   build1 (NOP_EXPR, TREE_TYPE (vtabletmp),
1228                                           ptr));
1229       gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1230       mark_symbols_for_renaming (stmt);
1231       find_referenced_vars_in (stmt);
1232
1233       /* Form the vtable address.  */
1234       vtabletmp2 = create_tmp_var (TREE_TYPE (TREE_TYPE (vtabletmp)),
1235                                    "vtableaddr");
1236       stmt = gimple_build_assign (vtabletmp2,
1237                                   build_simple_mem_ref (vtabletmp));
1238       gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1239       mark_symbols_for_renaming (stmt);
1240       find_referenced_vars_in (stmt);
1241
1242       /* Find the entry with the vcall offset.  */
1243       stmt = gimple_build_assign (vtabletmp2,
1244                                   fold_build2_loc (input_location,
1245                                                    POINTER_PLUS_EXPR,
1246                                                    TREE_TYPE (vtabletmp2),
1247                                                    vtabletmp2,
1248                                                    fold_convert (sizetype,
1249                                                                  virtual_offset)));
1250       gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1251
1252       /* Get the offset itself.  */
1253       vtabletmp3 = create_tmp_var (TREE_TYPE (TREE_TYPE (vtabletmp2)),
1254                                    "vcalloffset");
1255       stmt = gimple_build_assign (vtabletmp3,
1256                                   build_simple_mem_ref (vtabletmp2));
1257       gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1258       mark_symbols_for_renaming (stmt);
1259       find_referenced_vars_in (stmt);
1260
1261       /* Cast to sizetype.  */
1262       offsettmp = create_tmp_var (sizetype, "offset");
1263       stmt = gimple_build_assign (offsettmp, fold_convert (sizetype, vtabletmp3));
1264       gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1265       mark_symbols_for_renaming (stmt);
1266       find_referenced_vars_in (stmt);
1267
1268       /* Adjust the `this' pointer.  */
1269       ptr = fold_build2_loc (input_location,
1270                              POINTER_PLUS_EXPR, TREE_TYPE (ptr), ptr,
1271                              offsettmp);
1272     }
1273
1274   if (!this_adjusting
1275       && fixed_offset != 0)
1276     /* Adjust the pointer by the constant.  */
1277     {
1278       tree ptrtmp;
1279
1280       if (TREE_CODE (ptr) == VAR_DECL)
1281         ptrtmp = ptr;
1282       else
1283         {
1284           ptrtmp = create_tmp_var (TREE_TYPE (ptr), "ptr");
1285           stmt = gimple_build_assign (ptrtmp, ptr);
1286           gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1287           mark_symbols_for_renaming (stmt);
1288           find_referenced_vars_in (stmt);
1289         }
1290       ptr = fold_build2_loc (input_location,
1291                              POINTER_PLUS_EXPR, TREE_TYPE (ptrtmp), ptrtmp,
1292                              size_int (fixed_offset));
1293     }
1294
1295   /* Emit the statement and gimplify the adjustment expression.  */
1296   ret = create_tmp_var (TREE_TYPE (ptr), "adjusted_this");
1297   stmt = gimple_build_assign (ret, ptr);
1298   mark_symbols_for_renaming (stmt);
1299   find_referenced_vars_in (stmt);
1300   gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
1301
1302   return ret;
1303 }
1304
1305 /* Produce assembler for thunk NODE.  */
1306
1307 static void
1308 assemble_thunk (struct cgraph_node *node)
1309 {
1310   bool this_adjusting = node->thunk.this_adjusting;
1311   HOST_WIDE_INT fixed_offset = node->thunk.fixed_offset;
1312   HOST_WIDE_INT virtual_value = node->thunk.virtual_value;
1313   tree virtual_offset = NULL;
1314   tree alias = node->thunk.alias;
1315   tree thunk_fndecl = node->decl;
1316   tree a = DECL_ARGUMENTS (thunk_fndecl);
1317
1318   current_function_decl = thunk_fndecl;
1319
1320   /* Ensure thunks are emitted in their correct sections.  */
1321   resolve_unique_section (thunk_fndecl, 0, flag_function_sections);
1322
1323   if (this_adjusting
1324       && targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
1325                                               virtual_value, alias))
1326     {
1327       const char *fnname;
1328       tree fn_block;
1329       
1330       DECL_RESULT (thunk_fndecl)
1331         = build_decl (DECL_SOURCE_LOCATION (thunk_fndecl),
1332                       RESULT_DECL, 0, integer_type_node);
1333       fnname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk_fndecl));
1334
1335       /* The back end expects DECL_INITIAL to contain a BLOCK, so we
1336          create one.  */
1337       fn_block = make_node (BLOCK);
1338       BLOCK_VARS (fn_block) = a;
1339       DECL_INITIAL (thunk_fndecl) = fn_block;
1340       init_function_start (thunk_fndecl);
1341       cfun->is_thunk = 1;
1342       assemble_start_function (thunk_fndecl, fnname);
1343
1344       targetm.asm_out.output_mi_thunk (asm_out_file, thunk_fndecl,
1345                                        fixed_offset, virtual_value, alias);
1346
1347       assemble_end_function (thunk_fndecl, fnname);
1348       init_insn_lengths ();
1349       free_after_compilation (cfun);
1350       set_cfun (NULL);
1351       TREE_ASM_WRITTEN (thunk_fndecl) = 1;
1352     }
1353   else
1354     {
1355       tree restype;
1356       basic_block bb, then_bb, else_bb, return_bb;
1357       gimple_stmt_iterator bsi;
1358       int nargs = 0;
1359       tree arg;
1360       int i;
1361       tree resdecl;
1362       tree restmp = NULL;
1363       VEC(tree, heap) *vargs;
1364
1365       gimple call;
1366       gimple ret;
1367
1368       DECL_IGNORED_P (thunk_fndecl) = 1;
1369       bitmap_obstack_initialize (NULL);
1370
1371       if (node->thunk.virtual_offset_p)
1372         virtual_offset = size_int (virtual_value);
1373
1374       /* Build the return declaration for the function.  */
1375       restype = TREE_TYPE (TREE_TYPE (thunk_fndecl));
1376       if (DECL_RESULT (thunk_fndecl) == NULL_TREE)
1377         {
1378           resdecl = build_decl (input_location, RESULT_DECL, 0, restype);
1379           DECL_ARTIFICIAL (resdecl) = 1;
1380           DECL_IGNORED_P (resdecl) = 1;
1381           DECL_RESULT (thunk_fndecl) = resdecl;
1382         }
1383       else
1384         resdecl = DECL_RESULT (thunk_fndecl);
1385
1386       bb = then_bb = else_bb = return_bb = init_lowered_empty_function (thunk_fndecl);
1387
1388       bsi = gsi_start_bb (bb);
1389
1390       /* Build call to the function being thunked.  */
1391       if (!VOID_TYPE_P (restype))
1392         {
1393           if (!is_gimple_reg_type (restype))
1394             {
1395               restmp = resdecl;
1396               add_local_decl (cfun, restmp);
1397               BLOCK_VARS (DECL_INITIAL (current_function_decl)) = restmp;
1398             }
1399           else
1400             restmp = create_tmp_var_raw (restype, "retval");
1401         }
1402
1403       for (arg = a; arg; arg = DECL_CHAIN (arg))
1404         nargs++;
1405       vargs = VEC_alloc (tree, heap, nargs);
1406       if (this_adjusting)
1407         VEC_quick_push (tree, vargs,
1408                         thunk_adjust (&bsi,
1409                                       a, 1, fixed_offset,
1410                                       virtual_offset));
1411       else
1412         VEC_quick_push (tree, vargs, a);
1413       for (i = 1, arg = DECL_CHAIN (a); i < nargs; i++, arg = DECL_CHAIN (arg))
1414         VEC_quick_push (tree, vargs, arg);
1415       call = gimple_build_call_vec (build_fold_addr_expr_loc (0, alias), vargs);
1416       VEC_free (tree, heap, vargs);
1417       gimple_call_set_cannot_inline (call, true);
1418       gimple_call_set_from_thunk (call, true);
1419       if (restmp)
1420         gimple_call_set_lhs (call, restmp);
1421       gsi_insert_after (&bsi, call, GSI_NEW_STMT);
1422       mark_symbols_for_renaming (call);
1423       find_referenced_vars_in (call);
1424       update_stmt (call);
1425
1426       if (restmp && !this_adjusting)
1427         {
1428           tree true_label = NULL_TREE;
1429
1430           if (TREE_CODE (TREE_TYPE (restmp)) == POINTER_TYPE)
1431             {
1432               gimple stmt;
1433               /* If the return type is a pointer, we need to
1434                  protect against NULL.  We know there will be an
1435                  adjustment, because that's why we're emitting a
1436                  thunk.  */
1437               then_bb = create_basic_block (NULL, (void *) 0, bb);
1438               return_bb = create_basic_block (NULL, (void *) 0, then_bb);
1439               else_bb = create_basic_block (NULL, (void *) 0, else_bb);
1440               remove_edge (single_succ_edge (bb));
1441               true_label = gimple_block_label (then_bb);
1442               stmt = gimple_build_cond (NE_EXPR, restmp,
1443                                         build_zero_cst (TREE_TYPE (restmp)),
1444                                         NULL_TREE, NULL_TREE);
1445               gsi_insert_after (&bsi, stmt, GSI_NEW_STMT);
1446               make_edge (bb, then_bb, EDGE_TRUE_VALUE);
1447               make_edge (bb, else_bb, EDGE_FALSE_VALUE);
1448               make_edge (return_bb, EXIT_BLOCK_PTR, 0);
1449               make_edge (then_bb, return_bb, EDGE_FALLTHRU);
1450               make_edge (else_bb, return_bb, EDGE_FALLTHRU);
1451               bsi = gsi_last_bb (then_bb);
1452             }
1453
1454           restmp = thunk_adjust (&bsi, restmp, /*this_adjusting=*/0,
1455                                  fixed_offset, virtual_offset);
1456           if (true_label)
1457             {
1458               gimple stmt;
1459               bsi = gsi_last_bb (else_bb);
1460               stmt = gimple_build_assign (restmp,
1461                                           build_zero_cst (TREE_TYPE (restmp)));
1462               gsi_insert_after (&bsi, stmt, GSI_NEW_STMT);
1463               bsi = gsi_last_bb (return_bb);
1464             }
1465         }
1466       else
1467         gimple_call_set_tail (call, true);
1468
1469       /* Build return value.  */
1470       ret = gimple_build_return (restmp);
1471       gsi_insert_after (&bsi, ret, GSI_NEW_STMT);
1472
1473       delete_unreachable_blocks ();
1474       update_ssa (TODO_update_ssa);
1475
1476       cgraph_remove_same_body_alias (node);
1477       /* Since we want to emit the thunk, we explicitly mark its name as
1478          referenced.  */
1479       cgraph_add_new_function (thunk_fndecl, true);
1480       bitmap_obstack_release (NULL);
1481     }
1482   current_function_decl = NULL;
1483 }
1484
1485 /* Expand function specified by NODE.  */
1486
1487 static void
1488 cgraph_expand_function (struct cgraph_node *node)
1489 {
1490   tree decl = node->decl;
1491
1492   /* We ought to not compile any inline clones.  */
1493   gcc_assert (!node->global.inlined_to);
1494
1495   announce_function (decl);
1496   node->process = 0;
1497   if (node->same_body)
1498     {
1499       struct cgraph_node *alias, *next;
1500       bool saved_alias = node->alias;
1501       for (alias = node->same_body;
1502            alias && alias->next; alias = alias->next)
1503         ;
1504       /* Walk aliases in the order they were created; it is possible that
1505          thunks reffers to the aliases made earlier.  */
1506       for (; alias; alias = next)
1507         {
1508           next = alias->previous;
1509           if (!alias->thunk.thunk_p)
1510             assemble_alias (alias->decl,
1511                             DECL_ASSEMBLER_NAME (alias->thunk.alias));
1512           else
1513             assemble_thunk (alias);
1514         }
1515       node->alias = saved_alias;
1516       cgraph_process_new_functions ();
1517     }
1518
1519   gcc_assert (node->lowered);
1520
1521   /* Generate RTL for the body of DECL.  */
1522   tree_rest_of_compilation (decl);
1523
1524   /* Make sure that BE didn't give up on compiling.  */
1525   gcc_assert (TREE_ASM_WRITTEN (decl));
1526   current_function_decl = NULL;
1527   gcc_assert (!cgraph_preserve_function_body_p (decl));
1528   cgraph_release_function_body (node);
1529   /* Eliminate all call edges.  This is important so the GIMPLE_CALL no longer
1530      points to the dead function body.  */
1531   cgraph_node_remove_callees (node);
1532
1533   cgraph_function_flags_ready = true;
1534 }
1535
1536 /* Return true when CALLER_DECL should be inlined into CALLEE_DECL.  */
1537
1538 bool
1539 cgraph_inline_p (struct cgraph_edge *e, cgraph_inline_failed_t *reason)
1540 {
1541   *reason = e->inline_failed;
1542   return !e->inline_failed;
1543 }
1544
1545
1546
1547 /* Expand all functions that must be output.
1548
1549    Attempt to topologically sort the nodes so function is output when
1550    all called functions are already assembled to allow data to be
1551    propagated across the callgraph.  Use a stack to get smaller distance
1552    between a function and its callees (later we may choose to use a more
1553    sophisticated algorithm for function reordering; we will likely want
1554    to use subsections to make the output functions appear in top-down
1555    order).  */
1556
1557 static void
1558 cgraph_expand_all_functions (void)
1559 {
1560   struct cgraph_node *node;
1561   struct cgraph_node **order = XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
1562   int order_pos, new_order_pos = 0;
1563   int i;
1564
1565   order_pos = cgraph_postorder (order);
1566   gcc_assert (order_pos == cgraph_n_nodes);
1567
1568   /* Garbage collector may remove inline clones we eliminate during
1569      optimization.  So we must be sure to not reference them.  */
1570   for (i = 0; i < order_pos; i++)
1571     if (order[i]->process)
1572       order[new_order_pos++] = order[i];
1573
1574   for (i = new_order_pos - 1; i >= 0; i--)
1575     {
1576       node = order[i];
1577       if (node->process)
1578         {
1579           gcc_assert (node->reachable);
1580           node->process = 0;
1581           cgraph_expand_function (node);
1582         }
1583     }
1584   cgraph_process_new_functions ();
1585
1586   free (order);
1587
1588 }
1589
1590 /* This is used to sort the node types by the cgraph order number.  */
1591
1592 enum cgraph_order_sort_kind
1593 {
1594   ORDER_UNDEFINED = 0,
1595   ORDER_FUNCTION,
1596   ORDER_VAR,
1597   ORDER_ASM
1598 };
1599
1600 struct cgraph_order_sort
1601 {
1602   enum cgraph_order_sort_kind kind;
1603   union
1604   {
1605     struct cgraph_node *f;
1606     struct varpool_node *v;
1607     struct cgraph_asm_node *a;
1608   } u;
1609 };
1610
1611 /* Output all functions, variables, and asm statements in the order
1612    according to their order fields, which is the order in which they
1613    appeared in the file.  This implements -fno-toplevel-reorder.  In
1614    this mode we may output functions and variables which don't really
1615    need to be output.  */
1616
1617 static void
1618 cgraph_output_in_order (void)
1619 {
1620   int max;
1621   struct cgraph_order_sort *nodes;
1622   int i;
1623   struct cgraph_node *pf;
1624   struct varpool_node *pv;
1625   struct cgraph_asm_node *pa;
1626
1627   max = cgraph_order;
1628   nodes = XCNEWVEC (struct cgraph_order_sort, max);
1629
1630   varpool_analyze_pending_decls ();
1631
1632   for (pf = cgraph_nodes; pf; pf = pf->next)
1633     {
1634       if (pf->process)
1635         {
1636           i = pf->order;
1637           gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
1638           nodes[i].kind = ORDER_FUNCTION;
1639           nodes[i].u.f = pf;
1640         }
1641     }
1642
1643   for (pv = varpool_nodes_queue; pv; pv = pv->next_needed)
1644     {
1645       i = pv->order;
1646       gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
1647       nodes[i].kind = ORDER_VAR;
1648       nodes[i].u.v = pv;
1649     }
1650
1651   for (pa = cgraph_asm_nodes; pa; pa = pa->next)
1652     {
1653       i = pa->order;
1654       gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
1655       nodes[i].kind = ORDER_ASM;
1656       nodes[i].u.a = pa;
1657     }
1658
1659   /* In toplevel reorder mode we output all statics; mark them as needed.  */
1660   for (i = 0; i < max; ++i)
1661     {
1662       if (nodes[i].kind == ORDER_VAR)
1663         {
1664           varpool_mark_needed_node (nodes[i].u.v);
1665         }
1666     }
1667   varpool_empty_needed_queue ();
1668
1669   for (i = 0; i < max; ++i)
1670     {
1671       switch (nodes[i].kind)
1672         {
1673         case ORDER_FUNCTION:
1674           nodes[i].u.f->process = 0;
1675           cgraph_expand_function (nodes[i].u.f);
1676           break;
1677
1678         case ORDER_VAR:
1679           varpool_assemble_decl (nodes[i].u.v);
1680           break;
1681
1682         case ORDER_ASM:
1683           assemble_asm (nodes[i].u.a->asm_str);
1684           break;
1685
1686         case ORDER_UNDEFINED:
1687           break;
1688
1689         default:
1690           gcc_unreachable ();
1691         }
1692     }
1693
1694   cgraph_asm_nodes = NULL;
1695   free (nodes);
1696 }
1697
1698 /* Return true when function body of DECL still needs to be kept around
1699    for later re-use.  */
1700 bool
1701 cgraph_preserve_function_body_p (tree decl)
1702 {
1703   struct cgraph_node *node;
1704
1705   gcc_assert (cgraph_global_info_ready);
1706   /* Look if there is any clone around.  */
1707   node = cgraph_node (decl);
1708   if (node->clones)
1709     return true;
1710   return false;
1711 }
1712
1713 static void
1714 ipa_passes (void)
1715 {
1716   set_cfun (NULL);
1717   current_function_decl = NULL;
1718   gimple_register_cfg_hooks ();
1719   bitmap_obstack_initialize (NULL);
1720
1721   invoke_plugin_callbacks (PLUGIN_ALL_IPA_PASSES_START, NULL);
1722
1723   if (!in_lto_p)
1724     {
1725       execute_ipa_pass_list (all_small_ipa_passes);
1726       if (seen_error ())
1727         return;
1728     }
1729
1730   /* If pass_all_early_optimizations was not scheduled, the state of
1731      the cgraph will not be properly updated.  Update it now.  */
1732   if (cgraph_state < CGRAPH_STATE_IPA_SSA)
1733     cgraph_state = CGRAPH_STATE_IPA_SSA;
1734
1735   if (!in_lto_p)
1736     {
1737       /* Generate coverage variables and constructors.  */
1738       coverage_finish ();
1739
1740       /* Process new functions added.  */
1741       set_cfun (NULL);
1742       current_function_decl = NULL;
1743       cgraph_process_new_functions ();
1744
1745       execute_ipa_summary_passes
1746         ((struct ipa_opt_pass_d *) all_regular_ipa_passes);
1747     }
1748
1749   /* Some targets need to handle LTO assembler output specially.  */
1750   if (flag_generate_lto)
1751     targetm.asm_out.lto_start ();
1752
1753   execute_ipa_summary_passes ((struct ipa_opt_pass_d *) all_lto_gen_passes);
1754
1755   if (!in_lto_p)
1756     ipa_write_summaries ();
1757
1758   if (flag_generate_lto)
1759     targetm.asm_out.lto_end ();
1760
1761   if (!flag_ltrans)
1762     execute_ipa_pass_list (all_regular_ipa_passes);
1763   invoke_plugin_callbacks (PLUGIN_ALL_IPA_PASSES_END, NULL);
1764
1765   bitmap_obstack_release (NULL);
1766 }
1767
1768
1769 /* Perform simple optimizations based on callgraph.  */
1770
1771 void
1772 cgraph_optimize (void)
1773 {
1774   if (seen_error ())
1775     return;
1776
1777 #ifdef ENABLE_CHECKING
1778   verify_cgraph ();
1779 #endif
1780
1781   /* Frontend may output common variables after the unit has been finalized.
1782      It is safe to deal with them here as they are always zero initialized.  */
1783   varpool_analyze_pending_decls ();
1784
1785   timevar_push (TV_CGRAPHOPT);
1786   if (pre_ipa_mem_report)
1787     {
1788       fprintf (stderr, "Memory consumption before IPA\n");
1789       dump_memory_report (false);
1790     }
1791   if (!quiet_flag)
1792     fprintf (stderr, "Performing interprocedural optimizations\n");
1793   cgraph_state = CGRAPH_STATE_IPA;
1794
1795   /* Don't run the IPA passes if there was any error or sorry messages.  */
1796   if (!seen_error ())
1797     ipa_passes ();
1798
1799   /* Do nothing else if any IPA pass found errors.  */
1800   if (seen_error ())
1801     {
1802       timevar_pop (TV_CGRAPHOPT);
1803       return;
1804     }
1805
1806   /* This pass remove bodies of extern inline functions we never inlined.
1807      Do this later so other IPA passes see what is really going on.  */
1808   cgraph_remove_unreachable_nodes (false, dump_file);
1809   cgraph_global_info_ready = true;
1810   if (cgraph_dump_file)
1811     {
1812       fprintf (cgraph_dump_file, "Optimized ");
1813       dump_cgraph (cgraph_dump_file);
1814       dump_varpool (cgraph_dump_file);
1815     }
1816   if (post_ipa_mem_report)
1817     {
1818       fprintf (stderr, "Memory consumption after IPA\n");
1819       dump_memory_report (false);
1820     }
1821   timevar_pop (TV_CGRAPHOPT);
1822
1823   /* Output everything.  */
1824   (*debug_hooks->assembly_start) ();
1825   if (!quiet_flag)
1826     fprintf (stderr, "Assembling functions:\n");
1827 #ifdef ENABLE_CHECKING
1828   verify_cgraph ();
1829 #endif
1830
1831   cgraph_materialize_all_clones ();
1832   cgraph_mark_functions_to_output ();
1833
1834   cgraph_state = CGRAPH_STATE_EXPANSION;
1835   if (!flag_toplevel_reorder)
1836     cgraph_output_in_order ();
1837   else
1838     {
1839       cgraph_output_pending_asms ();
1840
1841       cgraph_expand_all_functions ();
1842       varpool_remove_unreferenced_decls ();
1843
1844       varpool_assemble_pending_decls ();
1845     }
1846   cgraph_process_new_functions ();
1847   cgraph_state = CGRAPH_STATE_FINISHED;
1848
1849   if (cgraph_dump_file)
1850     {
1851       fprintf (cgraph_dump_file, "\nFinal ");
1852       dump_cgraph (cgraph_dump_file);
1853       dump_varpool (cgraph_dump_file);
1854     }
1855 #ifdef ENABLE_CHECKING
1856   verify_cgraph ();
1857   /* Double check that all inline clones are gone and that all
1858      function bodies have been released from memory.  */
1859   if (!seen_error ())
1860     {
1861       struct cgraph_node *node;
1862       bool error_found = false;
1863
1864       for (node = cgraph_nodes; node; node = node->next)
1865         if (node->analyzed
1866             && (node->global.inlined_to
1867                 || gimple_has_body_p (node->decl)))
1868           {
1869             error_found = true;
1870             dump_cgraph_node (stderr, node);
1871           }
1872       if (error_found)
1873         internal_error ("nodes with unreleased memory found");
1874     }
1875 #endif
1876 }
1877
1878 void
1879 init_cgraph (void)
1880 {
1881   if (!cgraph_dump_file)
1882     cgraph_dump_file = dump_begin (TDI_cgraph, NULL);
1883 }
1884
1885 /* The edges representing the callers of the NEW_VERSION node were
1886    fixed by cgraph_function_versioning (), now the call_expr in their
1887    respective tree code should be updated to call the NEW_VERSION.  */
1888
1889 static void
1890 update_call_expr (struct cgraph_node *new_version)
1891 {
1892   struct cgraph_edge *e;
1893
1894   gcc_assert (new_version);
1895
1896   /* Update the call expr on the edges to call the new version.  */
1897   for (e = new_version->callers; e; e = e->next_caller)
1898     {
1899       struct function *inner_function = DECL_STRUCT_FUNCTION (e->caller->decl);
1900       gimple_call_set_fndecl (e->call_stmt, new_version->decl);
1901       maybe_clean_eh_stmt_fn (inner_function, e->call_stmt);
1902     }
1903 }
1904
1905
1906 /* Create a new cgraph node which is the new version of
1907    OLD_VERSION node.  REDIRECT_CALLERS holds the callers
1908    edges which should be redirected to point to
1909    NEW_VERSION.  ALL the callees edges of OLD_VERSION
1910    are cloned to the new version node.  Return the new
1911    version node. 
1912
1913    If non-NULL BLOCK_TO_COPY determine what basic blocks 
1914    was copied to prevent duplications of calls that are dead
1915    in the clone.  */
1916
1917 static struct cgraph_node *
1918 cgraph_copy_node_for_versioning (struct cgraph_node *old_version,
1919                                  tree new_decl,
1920                                  VEC(cgraph_edge_p,heap) *redirect_callers,
1921                                  bitmap bbs_to_copy)
1922  {
1923    struct cgraph_node *new_version;
1924    struct cgraph_edge *e;
1925    unsigned i;
1926
1927    gcc_assert (old_version);
1928
1929    new_version = cgraph_node (new_decl);
1930
1931    new_version->analyzed = true;
1932    new_version->local = old_version->local;
1933    new_version->local.externally_visible = false;
1934    new_version->local.local = true;
1935    new_version->local.vtable_method = false;
1936    new_version->global = old_version->global;
1937    new_version->rtl = old_version->rtl;
1938    new_version->reachable = true;
1939    new_version->count = old_version->count;
1940
1941    for (e = old_version->callees; e; e=e->next_callee)
1942      if (!bbs_to_copy
1943          || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index))
1944        cgraph_clone_edge (e, new_version, e->call_stmt,
1945                           e->lto_stmt_uid, REG_BR_PROB_BASE,
1946                           CGRAPH_FREQ_BASE,
1947                           e->loop_nest, true);
1948    for (e = old_version->indirect_calls; e; e=e->next_callee)
1949      if (!bbs_to_copy
1950          || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index))
1951        cgraph_clone_edge (e, new_version, e->call_stmt,
1952                           e->lto_stmt_uid, REG_BR_PROB_BASE,
1953                           CGRAPH_FREQ_BASE,
1954                           e->loop_nest, true);
1955    FOR_EACH_VEC_ELT (cgraph_edge_p, redirect_callers, i, e)
1956      {
1957        /* Redirect calls to the old version node to point to its new
1958           version.  */
1959        cgraph_redirect_edge_callee (e, new_version);
1960      }
1961
1962    return new_version;
1963  }
1964
1965  /* Perform function versioning.
1966     Function versioning includes copying of the tree and
1967     a callgraph update (creating a new cgraph node and updating
1968     its callees and callers).
1969
1970     REDIRECT_CALLERS varray includes the edges to be redirected
1971     to the new version.
1972
1973     TREE_MAP is a mapping of tree nodes we want to replace with
1974     new ones (according to results of prior analysis).
1975     OLD_VERSION_NODE is the node that is versioned.
1976     It returns the new version's cgraph node.
1977     If non-NULL ARGS_TO_SKIP determine function parameters to remove
1978     from new version.
1979     If non-NULL BLOCK_TO_COPY determine what basic blocks to copy.
1980     If non_NULL NEW_ENTRY determine new entry BB of the clone.  */
1981
1982 struct cgraph_node *
1983 cgraph_function_versioning (struct cgraph_node *old_version_node,
1984                             VEC(cgraph_edge_p,heap) *redirect_callers,
1985                             VEC (ipa_replace_map_p,gc)* tree_map,
1986                             bitmap args_to_skip,
1987                             bitmap bbs_to_copy,
1988                             basic_block new_entry_block,
1989                             const char *clone_name)
1990 {
1991   tree old_decl = old_version_node->decl;
1992   struct cgraph_node *new_version_node = NULL;
1993   tree new_decl;
1994
1995   if (!tree_versionable_function_p (old_decl))
1996     return NULL;
1997
1998   /* Make a new FUNCTION_DECL tree node for the
1999      new version. */
2000   if (!args_to_skip)
2001     new_decl = copy_node (old_decl);
2002   else
2003     new_decl = build_function_decl_skip_args (old_decl, args_to_skip);
2004
2005   /* Generate a new name for the new version. */
2006   DECL_NAME (new_decl) = clone_function_name (old_decl, clone_name);
2007   SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
2008   SET_DECL_RTL (new_decl, NULL);
2009
2010   /* Create the new version's call-graph node.
2011      and update the edges of the new node. */
2012   new_version_node =
2013     cgraph_copy_node_for_versioning (old_version_node, new_decl,
2014                                      redirect_callers, bbs_to_copy);
2015
2016   /* Copy the OLD_VERSION_NODE function tree to the new version.  */
2017   tree_function_versioning (old_decl, new_decl, tree_map, false, args_to_skip,
2018                             bbs_to_copy, new_entry_block);
2019
2020   /* Update the new version's properties.
2021      Make The new version visible only within this translation unit.  Make sure
2022      that is not weak also.
2023      ??? We cannot use COMDAT linkage because there is no
2024      ABI support for this.  */
2025   cgraph_make_decl_local (new_version_node->decl);
2026   DECL_VIRTUAL_P (new_version_node->decl) = 0;
2027   new_version_node->local.externally_visible = 0;
2028   new_version_node->local.local = 1;
2029   new_version_node->lowered = true;
2030
2031   /* Update the call_expr on the edges to call the new version node. */
2032   update_call_expr (new_version_node);
2033
2034   cgraph_call_function_insertion_hooks (new_version_node);
2035   return new_version_node;
2036 }
2037
2038 /* Produce separate function body for inline clones so the offline copy can be
2039    modified without affecting them.  */
2040 struct cgraph_node *
2041 save_inline_function_body (struct cgraph_node *node)
2042 {
2043   struct cgraph_node *first_clone, *n;
2044
2045   gcc_assert (node == cgraph_node (node->decl));
2046
2047   cgraph_lower_function (node);
2048
2049   first_clone = node->clones;
2050
2051   first_clone->decl = copy_node (node->decl);
2052   cgraph_insert_node_to_hashtable (first_clone);
2053   gcc_assert (first_clone == cgraph_node (first_clone->decl));
2054   if (first_clone->next_sibling_clone)
2055     {
2056       for (n = first_clone->next_sibling_clone; n->next_sibling_clone; n = n->next_sibling_clone)
2057         n->clone_of = first_clone;
2058       n->clone_of = first_clone;
2059       n->next_sibling_clone = first_clone->clones;
2060       if (first_clone->clones)
2061         first_clone->clones->prev_sibling_clone = n;
2062       first_clone->clones = first_clone->next_sibling_clone;
2063       first_clone->next_sibling_clone->prev_sibling_clone = NULL;
2064       first_clone->next_sibling_clone = NULL;
2065       gcc_assert (!first_clone->prev_sibling_clone);
2066     }
2067   first_clone->clone_of = NULL;
2068   node->clones = NULL;
2069
2070   if (first_clone->clones)
2071     for (n = first_clone->clones; n != first_clone;)
2072       {
2073         gcc_assert (n->decl == node->decl);
2074         n->decl = first_clone->decl;
2075         if (n->clones)
2076           n = n->clones;
2077         else if (n->next_sibling_clone)
2078           n = n->next_sibling_clone;
2079         else
2080           {
2081             while (n != first_clone && !n->next_sibling_clone)
2082               n = n->clone_of;
2083             if (n != first_clone)
2084               n = n->next_sibling_clone;
2085           }
2086       }
2087
2088   /* Copy the OLD_VERSION_NODE function tree to the new version.  */
2089   tree_function_versioning (node->decl, first_clone->decl, NULL, true, NULL,
2090                             NULL, NULL);
2091
2092   DECL_EXTERNAL (first_clone->decl) = 0;
2093   DECL_COMDAT_GROUP (first_clone->decl) = NULL_TREE;
2094   TREE_PUBLIC (first_clone->decl) = 0;
2095   DECL_COMDAT (first_clone->decl) = 0;
2096   VEC_free (ipa_opt_pass, heap,
2097             first_clone->ipa_transforms_to_apply);
2098   first_clone->ipa_transforms_to_apply = NULL;
2099
2100 #ifdef ENABLE_CHECKING
2101   verify_cgraph_node (first_clone);
2102 #endif
2103   return first_clone;
2104 }
2105
2106 /* Given virtual clone, turn it into actual clone.  */
2107 static void
2108 cgraph_materialize_clone (struct cgraph_node *node)
2109 {
2110   bitmap_obstack_initialize (NULL);
2111   node->former_clone_of = node->clone_of->decl;
2112   if (node->clone_of->former_clone_of)
2113     node->former_clone_of = node->clone_of->former_clone_of;
2114   /* Copy the OLD_VERSION_NODE function tree to the new version.  */
2115   tree_function_versioning (node->clone_of->decl, node->decl,
2116                             node->clone.tree_map, true,
2117                             node->clone.args_to_skip, NULL, NULL);
2118   if (cgraph_dump_file)
2119     {
2120       dump_function_to_file (node->clone_of->decl, cgraph_dump_file, dump_flags);
2121       dump_function_to_file (node->decl, cgraph_dump_file, dump_flags);
2122     }
2123
2124   /* Function is no longer clone.  */
2125   if (node->next_sibling_clone)
2126     node->next_sibling_clone->prev_sibling_clone = node->prev_sibling_clone;
2127   if (node->prev_sibling_clone)
2128     node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone;
2129   else
2130     node->clone_of->clones = node->next_sibling_clone;
2131   node->next_sibling_clone = NULL;
2132   node->prev_sibling_clone = NULL;
2133   if (!node->clone_of->analyzed && !node->clone_of->clones)
2134     {
2135       cgraph_release_function_body (node->clone_of);
2136       cgraph_node_remove_callees (node->clone_of);
2137       ipa_remove_all_references (&node->clone_of->ref_list);
2138     }
2139   node->clone_of = NULL;
2140   bitmap_obstack_release (NULL);
2141 }
2142
2143 /* If necessary, change the function declaration in the call statement
2144    associated with E so that it corresponds to the edge callee.  */
2145
2146 gimple
2147 cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e)
2148 {
2149   tree decl = gimple_call_fndecl (e->call_stmt);
2150   gimple new_stmt;
2151   gimple_stmt_iterator gsi;
2152   bool gsi_computed = false;
2153 #ifdef ENABLE_CHECKING
2154   struct cgraph_node *node;
2155 #endif
2156
2157   if (e->indirect_unknown_callee
2158       || decl == e->callee->decl
2159       /* Don't update call from same body alias to the real function.  */
2160       || (decl && cgraph_get_node (decl) == cgraph_get_node (e->callee->decl)))
2161     return e->call_stmt;
2162
2163 #ifdef ENABLE_CHECKING
2164   if (decl)
2165     {
2166       node = cgraph_get_node (decl);
2167       gcc_assert (!node || !node->clone.combined_args_to_skip);
2168     }
2169 #endif
2170
2171   if (cgraph_dump_file)
2172     {
2173       fprintf (cgraph_dump_file, "updating call of %s/%i -> %s/%i: ",
2174                cgraph_node_name (e->caller), e->caller->uid,
2175                cgraph_node_name (e->callee), e->callee->uid);
2176       print_gimple_stmt (cgraph_dump_file, e->call_stmt, 0, dump_flags);
2177       if (e->callee->clone.combined_args_to_skip)
2178         {
2179           fprintf (cgraph_dump_file, " combined args to skip: ");
2180           dump_bitmap (cgraph_dump_file,
2181                        e->callee->clone.combined_args_to_skip);
2182         }
2183     }
2184
2185   if (e->indirect_info &&
2186       e->indirect_info->thunk_delta != 0
2187       && (!e->callee->clone.combined_args_to_skip
2188           || !bitmap_bit_p (e->callee->clone.combined_args_to_skip, 0)))
2189     {
2190       if (cgraph_dump_file)
2191         fprintf (cgraph_dump_file, "          Thunk delta is "
2192                  HOST_WIDE_INT_PRINT_DEC "\n", e->indirect_info->thunk_delta);
2193       gsi = gsi_for_stmt (e->call_stmt);
2194       gsi_computed = true;
2195       gimple_adjust_this_by_delta (&gsi,
2196                                    build_int_cst (sizetype,
2197                                                e->indirect_info->thunk_delta));
2198       e->indirect_info->thunk_delta = 0;
2199     }
2200
2201   if (e->callee->clone.combined_args_to_skip)
2202     {
2203       int lp_nr;
2204
2205       new_stmt
2206         = gimple_call_copy_skip_args (e->call_stmt,
2207                                       e->callee->clone.combined_args_to_skip);
2208       gimple_call_set_fndecl (new_stmt, e->callee->decl);
2209
2210       if (gimple_vdef (new_stmt)
2211           && TREE_CODE (gimple_vdef (new_stmt)) == SSA_NAME)
2212         SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
2213
2214       if (!gsi_computed)
2215         gsi = gsi_for_stmt (e->call_stmt);
2216       gsi_replace (&gsi, new_stmt, false);
2217       /* We need to defer cleaning EH info on the new statement to
2218          fixup-cfg.  We may not have dominator information at this point
2219          and thus would end up with unreachable blocks and have no way
2220          to communicate that we need to run CFG cleanup then.  */
2221       lp_nr = lookup_stmt_eh_lp (e->call_stmt);
2222       if (lp_nr != 0)
2223         {
2224           remove_stmt_from_eh_lp (e->call_stmt);
2225           add_stmt_to_eh_lp (new_stmt, lp_nr);
2226         }
2227     }
2228   else
2229     {
2230       new_stmt = e->call_stmt;
2231       gimple_call_set_fndecl (new_stmt, e->callee->decl);
2232       update_stmt (new_stmt);
2233     }
2234
2235   cgraph_set_call_stmt_including_clones (e->caller, e->call_stmt, new_stmt);
2236
2237   if (cgraph_dump_file)
2238     {
2239       fprintf (cgraph_dump_file, "  updated to:");
2240       print_gimple_stmt (cgraph_dump_file, e->call_stmt, 0, dump_flags);
2241     }
2242   return new_stmt;
2243 }
2244
2245 /* Once all functions from compilation unit are in memory, produce all clones
2246    and update all calls.  We might also do this on demand if we don't want to
2247    bring all functions to memory prior compilation, but current WHOPR
2248    implementation does that and it is is bit easier to keep everything right in
2249    this order.  */
2250 void
2251 cgraph_materialize_all_clones (void)
2252 {
2253   struct cgraph_node *node;
2254   bool stabilized = false;
2255
2256   if (cgraph_dump_file)
2257     fprintf (cgraph_dump_file, "Materializing clones\n");
2258 #ifdef ENABLE_CHECKING
2259   verify_cgraph ();
2260 #endif
2261
2262   /* We can also do topological order, but number of iterations should be
2263      bounded by number of IPA passes since single IPA pass is probably not
2264      going to create clones of clones it created itself.  */
2265   while (!stabilized)
2266     {
2267       stabilized = true;
2268       for (node = cgraph_nodes; node; node = node->next)
2269         {
2270           if (node->clone_of && node->decl != node->clone_of->decl
2271               && !gimple_has_body_p (node->decl))
2272             {
2273               if (gimple_has_body_p (node->clone_of->decl))
2274                 {
2275                   if (cgraph_dump_file)
2276                     {
2277                       fprintf (cgraph_dump_file, "clonning %s to %s\n",
2278                                cgraph_node_name (node->clone_of),
2279                                cgraph_node_name (node));
2280                       if (node->clone.tree_map)
2281                         {
2282                           unsigned int i;
2283                           fprintf (cgraph_dump_file, "   replace map: ");
2284                           for (i = 0; i < VEC_length (ipa_replace_map_p,
2285                                                       node->clone.tree_map);
2286                                                       i++)
2287                             {
2288                               struct ipa_replace_map *replace_info;
2289                               replace_info = VEC_index (ipa_replace_map_p,
2290                                                         node->clone.tree_map,
2291                                                         i);
2292                               print_generic_expr (cgraph_dump_file, replace_info->old_tree, 0);
2293                               fprintf (cgraph_dump_file, " -> ");
2294                               print_generic_expr (cgraph_dump_file, replace_info->new_tree, 0);
2295                               fprintf (cgraph_dump_file, "%s%s;",
2296                                        replace_info->replace_p ? "(replace)":"",
2297                                        replace_info->ref_p ? "(ref)":"");
2298                             }
2299                           fprintf (cgraph_dump_file, "\n");
2300                         }
2301                       if (node->clone.args_to_skip)
2302                         {
2303                           fprintf (cgraph_dump_file, "   args_to_skip: ");
2304                           dump_bitmap (cgraph_dump_file, node->clone.args_to_skip);
2305                         }
2306                       if (node->clone.args_to_skip)
2307                         {
2308                           fprintf (cgraph_dump_file, "   combined_args_to_skip:");
2309                           dump_bitmap (cgraph_dump_file, node->clone.combined_args_to_skip);
2310                         }
2311                     }
2312                   cgraph_materialize_clone (node);
2313                   stabilized = false;
2314                 }
2315             }
2316         }
2317     }
2318   for (node = cgraph_nodes; node; node = node->next)
2319     if (!node->analyzed && node->callees)
2320       cgraph_node_remove_callees (node);
2321   if (cgraph_dump_file)
2322     fprintf (cgraph_dump_file, "Materialization Call site updates done.\n");
2323 #ifdef ENABLE_CHECKING
2324   verify_cgraph ();
2325 #endif
2326   cgraph_remove_unreachable_nodes (false, cgraph_dump_file);
2327 }
2328
2329 #include "gt-cgraphunit.h"