OSDN Git Service

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