OSDN Git Service

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