OSDN Git Service

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