Backport from GCC mainline.
[platform/upstream/linaro-gcc.git] / gcc / passes.c
1 /* Top level of GCC compilers (cc1, cc1plus, etc.)
2    Copyright (C) 1987-2016 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 /* This is the top level of cc1/c++.
21    It parses command args, opens files, invokes the various passes
22    in the proper order, and counts the time used by each.
23    Error messages and low-level interface to malloc also handled here.  */
24
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "backend.h"
29 #include "target.h"
30 #include "rtl.h"
31 #include "tree.h"
32 #include "gimple.h"
33 #include "cfghooks.h"
34 #include "df.h"
35 #include "tm_p.h"
36 #include "ssa.h"
37 #include "emit-rtl.h"
38 #include "cgraph.h"
39 #include "lto-streamer.h"
40 #include "fold-const.h"
41 #include "varasm.h"
42 #include "output.h"
43 #include "graph.h"
44 #include "debug.h"
45 #include "cfgloop.h"
46 #include "value-prof.h"
47 #include "tree-cfg.h"
48 #include "tree-ssa-loop-manip.h"
49 #include "tree-into-ssa.h"
50 #include "tree-dfa.h"
51 #include "tree-ssa.h"
52 #include "tree-pass.h"
53 #include "plugin.h"
54 #include "ipa-utils.h"
55 #include "tree-pretty-print.h" /* for dump_function_header */
56 #include "context.h"
57 #include "pass_manager.h"
58 #include "cfgrtl.h"
59 #include "tree-ssa-live.h"  /* For remove_unused_locals.  */
60 #include "tree-cfgcleanup.h"
61
62 using namespace gcc;
63
64 /* This is used for debugging.  It allows the current pass to printed
65    from anywhere in compilation.
66    The variable current_pass is also used for statistics and plugins.  */
67 opt_pass *current_pass;
68
69 static void register_pass_name (opt_pass *, const char *);
70
71 /* Most passes are single-instance (within their context) and thus don't
72    need to implement cloning, but passes that support multiple instances
73    *must* provide their own implementation of the clone method.
74
75    Handle this by providing a default implemenation, but make it a fatal
76    error to call it.  */
77
78 opt_pass *
79 opt_pass::clone ()
80 {
81   internal_error ("pass %s does not support cloning", name);
82 }
83
84 void
85 opt_pass::set_pass_param (unsigned int, bool)
86 {
87   internal_error ("pass %s needs a set_pass_param implementation to handle the"
88                   " extra argument in NEXT_PASS", name);
89 }
90
91 bool
92 opt_pass::gate (function *)
93 {
94   return true;
95 }
96
97 unsigned int
98 opt_pass::execute (function *)
99 {
100   return 0;
101 }
102
103 opt_pass::opt_pass (const pass_data &data, context *ctxt)
104   : pass_data (data),
105     sub (NULL),
106     next (NULL),
107     static_pass_number (0),
108     m_ctxt (ctxt)
109 {
110 }
111
112
113 void
114 pass_manager::execute_early_local_passes ()
115 {
116   execute_pass_list (cfun, pass_build_ssa_passes_1->sub);
117   if (flag_check_pointer_bounds)
118     execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub);
119   execute_pass_list (cfun, pass_local_optimization_passes_1->sub);
120 }
121
122 unsigned int
123 pass_manager::execute_pass_mode_switching ()
124 {
125   return pass_mode_switching_1->execute (cfun);
126 }
127
128
129 /* Call from anywhere to find out what pass this is.  Useful for
130    printing out debugging information deep inside an service
131    routine.  */
132 void
133 print_current_pass (FILE *file)
134 {
135   if (current_pass)
136     fprintf (file, "current pass = %s (%d)\n",
137              current_pass->name, current_pass->static_pass_number);
138   else
139     fprintf (file, "no current pass.\n");
140 }
141
142
143 /* Call from the debugger to get the current pass name.  */
144 DEBUG_FUNCTION void
145 debug_pass (void)
146 {
147   print_current_pass (stderr);
148 }
149
150
151
152 /* Global variables used to communicate with passes.  */
153 bool in_gimple_form;
154
155
156 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
157    and TYPE_DECL nodes.
158
159    This does nothing for local (non-static) variables, unless the
160    variable is a register variable with DECL_ASSEMBLER_NAME set.  In
161    that case, or if the variable is not an automatic, it sets up the
162    RTL and outputs any assembler code (label definition, storage
163    allocation and initialization).
164
165    DECL is the declaration.  TOP_LEVEL is nonzero
166    if this declaration is not within a function.  */
167
168 void
169 rest_of_decl_compilation (tree decl,
170                           int top_level,
171                           int at_end)
172 {
173   bool finalize = true;
174
175   /* We deferred calling assemble_alias so that we could collect
176      other attributes such as visibility.  Emit the alias now.  */
177   if (!in_lto_p)
178   {
179     tree alias;
180     alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
181     if (alias)
182       {
183         alias = TREE_VALUE (TREE_VALUE (alias));
184         alias = get_identifier (TREE_STRING_POINTER (alias));
185         /* A quirk of the initial implementation of aliases required that the
186            user add "extern" to all of them.  Which is silly, but now
187            historical.  Do note that the symbol is in fact locally defined.  */
188         DECL_EXTERNAL (decl) = 0;
189         TREE_STATIC (decl) = 1;
190         assemble_alias (decl, alias);
191         finalize = false;
192       }
193   }
194
195   /* Can't defer this, because it needs to happen before any
196      later function definitions are processed.  */
197   if (DECL_ASSEMBLER_NAME_SET_P (decl) && DECL_REGISTER (decl))
198     make_decl_rtl (decl);
199
200   /* Forward declarations for nested functions are not "external",
201      but we need to treat them as if they were.  */
202   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
203       || TREE_CODE (decl) == FUNCTION_DECL)
204     {
205       timevar_push (TV_VARCONST);
206
207       /* Don't output anything when a tentative file-scope definition
208          is seen.  But at end of compilation, do output code for them.
209
210          We do output all variables and rely on
211          callgraph code to defer them except for forward declarations
212          (see gcc.c-torture/compile/920624-1.c) */
213       if ((at_end
214            || !DECL_DEFER_OUTPUT (decl)
215            || DECL_INITIAL (decl))
216           && (TREE_CODE (decl) != VAR_DECL || !DECL_HAS_VALUE_EXPR_P (decl))
217           && !DECL_EXTERNAL (decl))
218         {
219           /* When reading LTO unit, we also read varpool, so do not
220              rebuild it.  */
221           if (in_lto_p && !at_end)
222             ;
223           else if (finalize && TREE_CODE (decl) != FUNCTION_DECL)
224             varpool_node::finalize_decl (decl);
225         }
226
227 #ifdef ASM_FINISH_DECLARE_OBJECT
228       if (decl == last_assemble_variable_decl)
229         {
230           ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
231                                      top_level, at_end);
232         }
233 #endif
234
235       /* Now that we have activated any function-specific attributes
236          that might affect function decl, particularly align, relayout it.  */
237       if (TREE_CODE (decl) == FUNCTION_DECL)
238         targetm.target_option.relayout_function (decl);
239
240       timevar_pop (TV_VARCONST);
241     }
242   else if (TREE_CODE (decl) == TYPE_DECL
243            /* Like in rest_of_type_compilation, avoid confusing the debug
244               information machinery when there are errors.  */
245            && !seen_error ())
246     {
247       timevar_push (TV_SYMOUT);
248       debug_hooks->type_decl (decl, !top_level);
249       timevar_pop (TV_SYMOUT);
250     }
251
252   /* Let cgraph know about the existence of variables.  */
253   if (in_lto_p && !at_end)
254     ;
255   else if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl)
256            && TREE_STATIC (decl))
257     varpool_node::get_create (decl);
258
259   /* Generate early debug for global variables.  Any local variables will
260      be handled by either handling reachable functions from
261      finalize_compilation_unit (and by consequence, locally scoped
262      symbols), or by rest_of_type_compilation below.
263
264      Also, pick up function prototypes, which will be mostly ignored
265      by the different early_global_decl() hooks, but will at least be
266      used by Go's hijack of the debug_hooks to implement
267      -fdump-go-spec.  */
268   if (!in_lto_p
269       && (TREE_CODE (decl) != FUNCTION_DECL
270           /* This will pick up function prototypes with no bodies,
271              which are not visible in finalize_compilation_unit()
272              while iterating with FOR_EACH_*_FUNCTION through the
273              symbol table.  */
274           || !DECL_SAVED_TREE (decl))
275
276       /* We need to check both decl_function_context and
277          current_function_decl here to make sure local extern
278          declarations end up with the correct context.
279
280          For local extern declarations, decl_function_context is
281          empty, but current_function_decl is set to the function where
282          the extern was declared .  Without the check for
283          !current_function_decl below, the local extern ends up
284          incorrectly with a top-level context.
285
286          For example:
287
288          namespace S
289          {
290            int
291            f()
292            {
293              {
294                int i = 42;
295                {
296                  extern int i; // Local extern declaration.
297                  return i;
298                }
299              }
300            }
301          }
302       */
303       && !decl_function_context (decl)
304       && !current_function_decl
305       && DECL_SOURCE_LOCATION (decl) != BUILTINS_LOCATION
306       && (!decl_type_context (decl)
307           /* If we created a varpool node for the decl make sure to
308              call early_global_decl.  Otherwise we miss changes
309              introduced by member definitions like
310                 struct A { static int staticdatamember; };
311                 int A::staticdatamember;
312              and thus have incomplete early debug and late debug
313              called from varpool node removal fails to handle it
314              properly.  */
315           || (finalize
316               && TREE_CODE (decl) == VAR_DECL
317               && TREE_STATIC (decl) && !DECL_EXTERNAL (decl)))
318       /* Avoid confusing the debug information machinery when there are
319          errors.  */
320       && !seen_error ())
321     (*debug_hooks->early_global_decl) (decl);
322 }
323
324 /* Called after finishing a record, union or enumeral type.  */
325
326 void
327 rest_of_type_compilation (tree type, int toplev)
328 {
329   /* Avoid confusing the debug information machinery when there are
330      errors.  */
331   if (seen_error ())
332     return;
333
334   timevar_push (TV_SYMOUT);
335   debug_hooks->type_decl (TYPE_STUB_DECL (type), !toplev);
336   timevar_pop (TV_SYMOUT);
337 }
338
339 \f
340
341 void
342 pass_manager::
343 finish_optimization_passes (void)
344 {
345   int i;
346   struct dump_file_info *dfi;
347   char *name;
348   gcc::dump_manager *dumps = m_ctxt->get_dumps ();
349
350   timevar_push (TV_DUMP);
351   if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
352     {
353       dumps->dump_start (pass_profile_1->static_pass_number, NULL);
354       end_branch_prob ();
355       dumps->dump_finish (pass_profile_1->static_pass_number);
356     }
357
358   if (optimize > 0)
359     {
360       dumps->dump_start (pass_profile_1->static_pass_number, NULL);
361       print_combine_total_stats ();
362       dumps->dump_finish (pass_profile_1->static_pass_number);
363     }
364
365   /* Do whatever is necessary to finish printing the graphs.  */
366   for (i = TDI_end; (dfi = dumps->get_dump_file_info (i)) != NULL; ++i)
367     if (dumps->dump_initialized_p (i)
368         && (dfi->pflags & TDF_GRAPH) != 0
369         && (name = dumps->get_dump_file_name (i)) != NULL)
370       {
371         finish_graph_dump_file (name);
372         free (name);
373       }
374
375   timevar_pop (TV_DUMP);
376 }
377
378 static unsigned int
379 execute_build_ssa_passes (void)
380 {
381   /* Once this pass (and its sub-passes) are complete, all functions
382      will be in SSA form.  Technically this state change is happening
383      a tad early, since the sub-passes have not yet run, but since
384      none of the sub-passes are IPA passes and do not create new
385      functions, this is ok.  We're setting this value for the benefit
386      of IPA passes that follow.  */
387   if (symtab->state < IPA_SSA)
388     symtab->state = IPA_SSA;
389   return 0;
390 }
391
392 namespace {
393
394 const pass_data pass_data_build_ssa_passes =
395 {
396   SIMPLE_IPA_PASS, /* type */
397   "build_ssa_passes", /* name */
398   OPTGROUP_NONE, /* optinfo_flags */
399   TV_EARLY_LOCAL, /* tv_id */
400   0, /* properties_required */
401   0, /* properties_provided */
402   0, /* properties_destroyed */
403   0, /* todo_flags_start */
404   /* todo_flags_finish is executed before subpases. For this reason
405      it makes no sense to remove unreachable functions here.  */
406   0, /* todo_flags_finish */
407 };
408
409 class pass_build_ssa_passes : public simple_ipa_opt_pass
410 {
411 public:
412   pass_build_ssa_passes (gcc::context *ctxt)
413     : simple_ipa_opt_pass (pass_data_build_ssa_passes, ctxt)
414   {}
415
416   /* opt_pass methods: */
417   virtual bool gate (function *)
418     {
419       /* Don't bother doing anything if the program has errors.  */
420       return (!seen_error () && !in_lto_p);
421     }
422
423   virtual unsigned int execute (function *)
424     {
425       return execute_build_ssa_passes ();
426     }
427
428 }; // class pass_build_ssa_passes
429
430 const pass_data pass_data_chkp_instrumentation_passes =
431 {
432   SIMPLE_IPA_PASS, /* type */
433   "chkp_passes", /* name */
434   OPTGROUP_NONE, /* optinfo_flags */
435   TV_NONE, /* tv_id */
436   0, /* properties_required */
437   0, /* properties_provided */
438   0, /* properties_destroyed */
439   0, /* todo_flags_start */
440   0, /* todo_flags_finish */
441 };
442
443 class pass_chkp_instrumentation_passes : public simple_ipa_opt_pass
444 {
445 public:
446   pass_chkp_instrumentation_passes (gcc::context *ctxt)
447     : simple_ipa_opt_pass (pass_data_chkp_instrumentation_passes, ctxt)
448   {}
449
450   /* opt_pass methods: */
451   virtual bool gate (function *)
452     {
453       /* Don't bother doing anything if the program has errors.  */
454       return (flag_check_pointer_bounds
455               && !seen_error () && !in_lto_p);
456     }
457
458 }; // class pass_chkp_instrumentation_passes
459
460 const pass_data pass_data_local_optimization_passes =
461 {
462   SIMPLE_IPA_PASS, /* type */
463   "opt_local_passes", /* name */
464   OPTGROUP_NONE, /* optinfo_flags */
465   TV_NONE, /* tv_id */
466   0, /* properties_required */
467   0, /* properties_provided */
468   0, /* properties_destroyed */
469   0, /* todo_flags_start */
470   0, /* todo_flags_finish */
471 };
472
473 class pass_local_optimization_passes : public simple_ipa_opt_pass
474 {
475 public:
476   pass_local_optimization_passes (gcc::context *ctxt)
477     : simple_ipa_opt_pass (pass_data_local_optimization_passes, ctxt)
478   {}
479
480   /* opt_pass methods: */
481   virtual bool gate (function *)
482     {
483       /* Don't bother doing anything if the program has errors.  */
484       return (!seen_error () && !in_lto_p);
485     }
486
487 }; // class pass_local_optimization_passes
488
489 } // anon namespace
490
491 simple_ipa_opt_pass *
492 make_pass_build_ssa_passes (gcc::context *ctxt)
493 {
494   return new pass_build_ssa_passes (ctxt);
495 }
496
497 simple_ipa_opt_pass *
498 make_pass_chkp_instrumentation_passes (gcc::context *ctxt)
499 {
500   return new pass_chkp_instrumentation_passes (ctxt);
501 }
502
503 simple_ipa_opt_pass *
504 make_pass_local_optimization_passes (gcc::context *ctxt)
505 {
506   return new pass_local_optimization_passes (ctxt);
507 }
508
509 namespace {
510
511 const pass_data pass_data_all_early_optimizations =
512 {
513   GIMPLE_PASS, /* type */
514   "early_optimizations", /* name */
515   OPTGROUP_NONE, /* optinfo_flags */
516   TV_NONE, /* tv_id */
517   0, /* properties_required */
518   0, /* properties_provided */
519   0, /* properties_destroyed */
520   0, /* todo_flags_start */
521   0, /* todo_flags_finish */
522 };
523
524 class pass_all_early_optimizations : public gimple_opt_pass
525 {
526 public:
527   pass_all_early_optimizations (gcc::context *ctxt)
528     : gimple_opt_pass (pass_data_all_early_optimizations, ctxt)
529   {}
530
531   /* opt_pass methods: */
532   virtual bool gate (function *)
533     {
534       return (optimize >= 1
535               /* Don't bother doing anything if the program has errors.  */
536               && !seen_error ());
537     }
538
539 }; // class pass_all_early_optimizations
540
541 } // anon namespace
542
543 static gimple_opt_pass *
544 make_pass_all_early_optimizations (gcc::context *ctxt)
545 {
546   return new pass_all_early_optimizations (ctxt);
547 }
548
549 namespace {
550
551 const pass_data pass_data_all_optimizations =
552 {
553   GIMPLE_PASS, /* type */
554   "*all_optimizations", /* name */
555   OPTGROUP_NONE, /* optinfo_flags */
556   TV_OPTIMIZE, /* tv_id */
557   0, /* properties_required */
558   0, /* properties_provided */
559   0, /* properties_destroyed */
560   0, /* todo_flags_start */
561   0, /* todo_flags_finish */
562 };
563
564 class pass_all_optimizations : public gimple_opt_pass
565 {
566 public:
567   pass_all_optimizations (gcc::context *ctxt)
568     : gimple_opt_pass (pass_data_all_optimizations, ctxt)
569   {}
570
571   /* opt_pass methods: */
572   virtual bool gate (function *) { return optimize >= 1 && !optimize_debug; }
573
574 }; // class pass_all_optimizations
575
576 } // anon namespace
577
578 static gimple_opt_pass *
579 make_pass_all_optimizations (gcc::context *ctxt)
580 {
581   return new pass_all_optimizations (ctxt);
582 }
583
584 namespace {
585
586 const pass_data pass_data_all_optimizations_g =
587 {
588   GIMPLE_PASS, /* type */
589   "*all_optimizations_g", /* name */
590   OPTGROUP_NONE, /* optinfo_flags */
591   TV_OPTIMIZE, /* tv_id */
592   0, /* properties_required */
593   0, /* properties_provided */
594   0, /* properties_destroyed */
595   0, /* todo_flags_start */
596   0, /* todo_flags_finish */
597 };
598
599 class pass_all_optimizations_g : public gimple_opt_pass
600 {
601 public:
602   pass_all_optimizations_g (gcc::context *ctxt)
603     : gimple_opt_pass (pass_data_all_optimizations_g, ctxt)
604   {}
605
606   /* opt_pass methods: */
607   virtual bool gate (function *) { return optimize >= 1 && optimize_debug; }
608
609 }; // class pass_all_optimizations_g
610
611 } // anon namespace
612
613 static gimple_opt_pass *
614 make_pass_all_optimizations_g (gcc::context *ctxt)
615 {
616   return new pass_all_optimizations_g (ctxt);
617 }
618
619 namespace {
620
621 const pass_data pass_data_rest_of_compilation =
622 {
623   RTL_PASS, /* type */
624   "*rest_of_compilation", /* name */
625   OPTGROUP_NONE, /* optinfo_flags */
626   TV_REST_OF_COMPILATION, /* tv_id */
627   PROP_rtl, /* properties_required */
628   0, /* properties_provided */
629   0, /* properties_destroyed */
630   0, /* todo_flags_start */
631   0, /* todo_flags_finish */
632 };
633
634 class pass_rest_of_compilation : public rtl_opt_pass
635 {
636 public:
637   pass_rest_of_compilation (gcc::context *ctxt)
638     : rtl_opt_pass (pass_data_rest_of_compilation, ctxt)
639   {}
640
641   /* opt_pass methods: */
642   virtual bool gate (function *)
643     {
644       /* Early return if there were errors.  We can run afoul of our
645          consistency checks, and there's not really much point in fixing them.  */
646       return !(rtl_dump_and_exit || flag_syntax_only || seen_error ());
647     }
648
649 }; // class pass_rest_of_compilation
650
651 } // anon namespace
652
653 static rtl_opt_pass *
654 make_pass_rest_of_compilation (gcc::context *ctxt)
655 {
656   return new pass_rest_of_compilation (ctxt);
657 }
658
659 namespace {
660
661 const pass_data pass_data_postreload =
662 {
663   RTL_PASS, /* type */
664   "*all-postreload", /* name */
665   OPTGROUP_NONE, /* optinfo_flags */
666   TV_POSTRELOAD, /* tv_id */
667   PROP_rtl, /* properties_required */
668   0, /* properties_provided */
669   0, /* properties_destroyed */
670   0, /* todo_flags_start */
671   0, /* todo_flags_finish */
672 };
673
674 class pass_postreload : public rtl_opt_pass
675 {
676 public:
677   pass_postreload (gcc::context *ctxt)
678     : rtl_opt_pass (pass_data_postreload, ctxt)
679   {}
680
681   /* opt_pass methods: */
682   virtual bool gate (function *) { return reload_completed; }
683
684 }; // class pass_postreload
685
686 } // anon namespace
687
688 static rtl_opt_pass *
689 make_pass_postreload (gcc::context *ctxt)
690 {
691   return new pass_postreload (ctxt);
692 }
693
694 namespace {
695
696 const pass_data pass_data_late_compilation =
697 {
698   RTL_PASS, /* type */
699   "*all-late_compilation", /* name */
700   OPTGROUP_NONE, /* optinfo_flags */
701   TV_LATE_COMPILATION, /* tv_id */
702   PROP_rtl, /* properties_required */
703   0, /* properties_provided */
704   0, /* properties_destroyed */
705   0, /* todo_flags_start */
706   0, /* todo_flags_finish */
707 };
708
709 class pass_late_compilation : public rtl_opt_pass
710 {
711 public:
712   pass_late_compilation (gcc::context *ctxt)
713     : rtl_opt_pass (pass_data_late_compilation, ctxt)
714   {}
715
716   /* opt_pass methods: */
717   virtual bool gate (function *)
718   {
719     return reload_completed || targetm.no_register_allocation;
720   }
721
722 }; // class pass_late_compilation
723
724 } // anon namespace
725
726 static rtl_opt_pass *
727 make_pass_late_compilation (gcc::context *ctxt)
728 {
729   return new pass_late_compilation (ctxt);
730 }
731
732
733
734 /* Set the static pass number of pass PASS to ID and record that
735    in the mapping from static pass number to pass.  */
736
737 void
738 pass_manager::
739 set_pass_for_id (int id, opt_pass *pass)
740 {
741   pass->static_pass_number = id;
742   if (passes_by_id_size <= id)
743     {
744       passes_by_id = XRESIZEVEC (opt_pass *, passes_by_id, id + 1);
745       memset (passes_by_id + passes_by_id_size, 0,
746               (id + 1 - passes_by_id_size) * sizeof (void *));
747       passes_by_id_size = id + 1;
748     }
749   passes_by_id[id] = pass;
750 }
751
752 /* Return the pass with the static pass number ID.  */
753
754 opt_pass *
755 pass_manager::get_pass_for_id (int id) const
756 {
757   if (id >= passes_by_id_size)
758     return NULL;
759   return passes_by_id[id];
760 }
761
762 /* Iterate over the pass tree allocating dump file numbers.  We want
763    to do this depth first, and independent of whether the pass is
764    enabled or not.  */
765
766 void
767 register_one_dump_file (opt_pass *pass)
768 {
769   g->get_passes ()->register_one_dump_file (pass);
770 }
771
772 void
773 pass_manager::register_one_dump_file (opt_pass *pass)
774 {
775   char *dot_name, *flag_name, *glob_name;
776   const char *name, *full_name, *prefix;
777   char num[10];
778   int flags, id;
779   int optgroup_flags = OPTGROUP_NONE;
780   gcc::dump_manager *dumps = m_ctxt->get_dumps ();
781
782   /* See below in next_pass_1.  */
783   num[0] = '\0';
784   if (pass->static_pass_number != -1)
785     sprintf (num, "%d", ((int) pass->static_pass_number < 0
786                          ? 1 : pass->static_pass_number));
787
788   /* The name is both used to identify the pass for the purposes of plugins,
789      and to specify dump file name and option.
790      The latter two might want something short which is not quite unique; for
791      that reason, we may have a disambiguating prefix, followed by a space
792      to mark the start of the following dump file name / option string.  */
793   name = strchr (pass->name, ' ');
794   name = name ? name + 1 : pass->name;
795   dot_name = concat (".", name, num, NULL);
796   if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
797     {
798       prefix = "ipa-";
799       flags = TDF_IPA;
800       optgroup_flags |= OPTGROUP_IPA;
801     }
802   else if (pass->type == GIMPLE_PASS)
803     {
804       prefix = "tree-";
805       flags = TDF_TREE;
806     }
807   else
808     {
809       prefix = "rtl-";
810       flags = TDF_RTL;
811     }
812
813   flag_name = concat (prefix, name, num, NULL);
814   glob_name = concat (prefix, name, NULL);
815   optgroup_flags |= pass->optinfo_flags;
816   /* For any passes that do not have an optgroup set, and which are not
817      IPA passes setup above, set the optgroup to OPTGROUP_OTHER so that
818      any dump messages are emitted properly under -fopt-info(-optall).  */
819   if (optgroup_flags == OPTGROUP_NONE)
820     optgroup_flags = OPTGROUP_OTHER;
821   id = dumps->dump_register (dot_name, flag_name, glob_name, flags,
822                              optgroup_flags,
823                              true);
824   set_pass_for_id (id, pass);
825   full_name = concat (prefix, pass->name, num, NULL);
826   register_pass_name (pass, full_name);
827   free (CONST_CAST (char *, full_name));
828 }
829
830 /* Register the dump files for the pass_manager starting at PASS. */
831
832 void
833 pass_manager::register_dump_files (opt_pass *pass)
834 {
835   do
836     {
837       if (pass->name && pass->name[0] != '*')
838         register_one_dump_file (pass);
839
840       if (pass->sub)
841         register_dump_files (pass->sub);
842
843       pass = pass->next;
844     }
845   while (pass);
846 }
847
848 static hash_map<nofree_string_hash, opt_pass *> *name_to_pass_map;
849
850 /* Register PASS with NAME.  */
851
852 static void
853 register_pass_name (opt_pass *pass, const char *name)
854 {
855   if (!name_to_pass_map)
856     name_to_pass_map = new hash_map<nofree_string_hash, opt_pass *> (256);
857
858   if (name_to_pass_map->get (name))
859     return; /* Ignore plugin passes.  */
860
861       const char *unique_name = xstrdup (name);
862       name_to_pass_map->put (unique_name, pass);
863 }
864
865 /* Map from pass id to canonicalized pass name.  */
866
867 typedef const char *char_ptr;
868 static vec<char_ptr> pass_tab = vNULL;
869
870 /* Callback function for traversing NAME_TO_PASS_MAP.  */
871
872 bool
873 passes_pass_traverse (const char *const &name, opt_pass *const &pass, void *)
874 {
875   gcc_assert (pass->static_pass_number > 0);
876   gcc_assert (pass_tab.exists ());
877
878   pass_tab[pass->static_pass_number] = name;
879
880   return 1;
881 }
882
883 /* The function traverses NAME_TO_PASS_MAP and creates a pass info
884    table for dumping purpose.  */
885
886 static void
887 create_pass_tab (void)
888 {
889   if (!flag_dump_passes)
890     return;
891
892   pass_tab.safe_grow_cleared (g->get_passes ()->passes_by_id_size + 1);
893   name_to_pass_map->traverse <void *, passes_pass_traverse> (NULL);
894 }
895
896 static bool override_gate_status (opt_pass *, tree, bool);
897
898 /* Dump the instantiated name for PASS. IS_ON indicates if PASS
899    is turned on or not.  */
900
901 static void
902 dump_one_pass (opt_pass *pass, int pass_indent)
903 {
904   int indent = 3 * pass_indent;
905   const char *pn;
906   bool is_on, is_really_on;
907
908   is_on = pass->gate (cfun);
909   is_really_on = override_gate_status (pass, current_function_decl, is_on);
910
911   if (pass->static_pass_number <= 0)
912     pn = pass->name;
913   else
914     pn = pass_tab[pass->static_pass_number];
915
916   fprintf (stderr, "%*s%-40s%*s:%s%s\n", indent, " ", pn,
917            (15 - indent < 0 ? 0 : 15 - indent), " ",
918            is_on ? "  ON" : "  OFF",
919            ((!is_on) == (!is_really_on) ? ""
920             : (is_really_on ? " (FORCED_ON)" : " (FORCED_OFF)")));
921 }
922
923 /* Dump pass list PASS with indentation INDENT.  */
924
925 static void
926 dump_pass_list (opt_pass *pass, int indent)
927 {
928   do
929     {
930       dump_one_pass (pass, indent);
931       if (pass->sub)
932         dump_pass_list (pass->sub, indent + 1);
933       pass = pass->next;
934     }
935   while (pass);
936 }
937
938 /* Dump all optimization passes.  */
939
940 void
941 dump_passes (void)
942 {
943   g->get_passes ()->dump_passes ();
944 }
945
946 void
947 pass_manager::dump_passes () const
948 {
949   push_dummy_function (true);
950
951   create_pass_tab ();
952
953   dump_pass_list (all_lowering_passes, 1);
954   dump_pass_list (all_small_ipa_passes, 1);
955   dump_pass_list (all_regular_ipa_passes, 1);
956   dump_pass_list (all_late_ipa_passes, 1);
957   dump_pass_list (all_passes, 1);
958
959   pop_dummy_function ();
960 }
961
962 /* Returns the pass with NAME.  */
963
964 static opt_pass *
965 get_pass_by_name (const char *name)
966 {
967   opt_pass **p = name_to_pass_map->get (name);
968   if (p)
969     return *p;
970
971   return NULL;
972 }
973
974
975 /* Range [start, last].  */
976
977 struct uid_range
978 {
979   unsigned int start;
980   unsigned int last;
981   const char *assem_name;
982   struct uid_range *next;
983 };
984
985 typedef struct uid_range *uid_range_p;
986
987
988 static vec<uid_range_p>
989       enabled_pass_uid_range_tab = vNULL;
990 static vec<uid_range_p>
991       disabled_pass_uid_range_tab = vNULL;
992
993
994 /* Parse option string for -fdisable- and -fenable-
995    The syntax of the options:
996
997    -fenable-<pass_name>
998    -fdisable-<pass_name>
999
1000    -fenable-<pass_name>=s1:e1,s2:e2,...
1001    -fdisable-<pass_name>=s1:e1,s2:e2,...
1002 */
1003
1004 static void
1005 enable_disable_pass (const char *arg, bool is_enable)
1006 {
1007   opt_pass *pass;
1008   char *range_str, *phase_name;
1009   char *argstr = xstrdup (arg);
1010   vec<uid_range_p> *tab = 0;
1011
1012   range_str = strchr (argstr,'=');
1013   if (range_str)
1014     {
1015       *range_str = '\0';
1016       range_str++;
1017     }
1018
1019   phase_name = argstr;
1020   if (!*phase_name)
1021     {
1022       if (is_enable)
1023         error ("unrecognized option -fenable");
1024       else
1025         error ("unrecognized option -fdisable");
1026       free (argstr);
1027       return;
1028     }
1029   pass = get_pass_by_name (phase_name);
1030   if (!pass || pass->static_pass_number == -1)
1031     {
1032       if (is_enable)
1033         error ("unknown pass %s specified in -fenable", phase_name);
1034       else
1035         error ("unknown pass %s specified in -fdisable", phase_name);
1036       free (argstr);
1037       return;
1038     }
1039
1040   if (is_enable)
1041     tab = &enabled_pass_uid_range_tab;
1042   else
1043     tab = &disabled_pass_uid_range_tab;
1044
1045   if ((unsigned) pass->static_pass_number >= tab->length ())
1046     tab->safe_grow_cleared (pass->static_pass_number + 1);
1047
1048   if (!range_str)
1049     {
1050       uid_range_p slot;
1051       uid_range_p new_range = XCNEW (struct uid_range);
1052
1053       new_range->start = 0;
1054       new_range->last = (unsigned)-1;
1055
1056       slot = (*tab)[pass->static_pass_number];
1057       new_range->next = slot;
1058       (*tab)[pass->static_pass_number] = new_range;
1059       if (is_enable)
1060         inform (UNKNOWN_LOCATION, "enable pass %s for functions in the range "
1061                 "of [%u, %u]", phase_name, new_range->start, new_range->last);
1062       else
1063         inform (UNKNOWN_LOCATION, "disable pass %s for functions in the range "
1064                 "of [%u, %u]", phase_name, new_range->start, new_range->last);
1065     }
1066   else
1067     {
1068       char *next_range = NULL;
1069       char *one_range = range_str;
1070       char *end_val = NULL;
1071
1072       do
1073         {
1074           uid_range_p slot;
1075           uid_range_p new_range;
1076           char *invalid = NULL;
1077           long start;
1078           char *func_name = NULL;
1079
1080           next_range = strchr (one_range, ',');
1081           if (next_range)
1082             {
1083               *next_range = '\0';
1084               next_range++;
1085             }
1086
1087           end_val = strchr (one_range, ':');
1088           if (end_val)
1089             {
1090               *end_val = '\0';
1091               end_val++;
1092             }
1093           start = strtol (one_range, &invalid, 10);
1094           if (*invalid || start < 0)
1095             {
1096               if (end_val || (one_range[0] >= '0'
1097                               && one_range[0] <= '9'))
1098                 {
1099                   error ("Invalid range %s in option %s",
1100                          one_range,
1101                          is_enable ? "-fenable" : "-fdisable");
1102                   free (argstr);
1103                   return;
1104                 }
1105               func_name = one_range;
1106             }
1107           if (!end_val)
1108             {
1109               new_range = XCNEW (struct uid_range);
1110               if (!func_name)
1111                 {
1112                   new_range->start = (unsigned) start;
1113                   new_range->last = (unsigned) start;
1114                 }
1115               else
1116                 {
1117                   new_range->start = (unsigned) -1;
1118                   new_range->last = (unsigned) -1;
1119                   new_range->assem_name = xstrdup (func_name);
1120                 }
1121             }
1122           else
1123             {
1124               long last = strtol (end_val, &invalid, 10);
1125               if (*invalid || last < start)
1126                 {
1127                   error ("Invalid range %s in option %s",
1128                          end_val,
1129                          is_enable ? "-fenable" : "-fdisable");
1130                   free (argstr);
1131                   return;
1132                 }
1133               new_range = XCNEW (struct uid_range);
1134               new_range->start = (unsigned) start;
1135               new_range->last = (unsigned) last;
1136             }
1137
1138           slot = (*tab)[pass->static_pass_number];
1139           new_range->next = slot;
1140           (*tab)[pass->static_pass_number] = new_range;
1141           if (is_enable)
1142             {
1143               if (new_range->assem_name)
1144                 inform (UNKNOWN_LOCATION,
1145                         "enable pass %s for function %s",
1146                         phase_name, new_range->assem_name);
1147               else
1148                 inform (UNKNOWN_LOCATION,
1149                         "enable pass %s for functions in the range of [%u, %u]",
1150                         phase_name, new_range->start, new_range->last);
1151             }
1152           else
1153             {
1154               if (new_range->assem_name)
1155                 inform (UNKNOWN_LOCATION,
1156                         "disable pass %s for function %s",
1157                         phase_name, new_range->assem_name);
1158               else
1159                 inform (UNKNOWN_LOCATION,
1160                         "disable pass %s for functions in the range of [%u, %u]",
1161                         phase_name, new_range->start, new_range->last);
1162             }
1163
1164           one_range = next_range;
1165         } while (next_range);
1166     }
1167
1168   free (argstr);
1169 }
1170
1171 /* Enable pass specified by ARG.  */
1172
1173 void
1174 enable_pass (const char *arg)
1175 {
1176   enable_disable_pass (arg, true);
1177 }
1178
1179 /* Disable pass specified by ARG.  */
1180
1181 void
1182 disable_pass (const char *arg)
1183 {
1184   enable_disable_pass (arg, false);
1185 }
1186
1187 /* Returns true if PASS is explicitly enabled/disabled for FUNC.  */
1188
1189 static bool
1190 is_pass_explicitly_enabled_or_disabled (opt_pass *pass,
1191                                         tree func,
1192                                         vec<uid_range_p> tab)
1193 {
1194   uid_range_p slot, range;
1195   int cgraph_uid;
1196   const char *aname = NULL;
1197
1198   if (!tab.exists ()
1199       || (unsigned) pass->static_pass_number >= tab.length ()
1200       || pass->static_pass_number == -1)
1201     return false;
1202
1203   slot = tab[pass->static_pass_number];
1204   if (!slot)
1205     return false;
1206
1207   cgraph_uid = func ? cgraph_node::get (func)->uid : 0;
1208   if (func && DECL_ASSEMBLER_NAME_SET_P (func))
1209     aname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (func));
1210
1211   range = slot;
1212   while (range)
1213     {
1214       if ((unsigned) cgraph_uid >= range->start
1215           && (unsigned) cgraph_uid <= range->last)
1216         return true;
1217       if (range->assem_name && aname
1218           && !strcmp (range->assem_name, aname))
1219         return true;
1220       range = range->next;
1221     }
1222
1223   return false;
1224 }
1225
1226
1227 /* Update static_pass_number for passes (and the flag
1228    TODO_mark_first_instance).
1229
1230    Passes are constructed with static_pass_number preinitialized to 0
1231
1232    This field is used in two different ways: initially as instance numbers
1233    of their kind, and then as ids within the entire pass manager.
1234
1235    Within pass_manager::pass_manager:
1236
1237    * In add_pass_instance(), as called by next_pass_1 in
1238      NEXT_PASS in init_optimization_passes
1239
1240    * When the initial instance of a pass within a pass manager is seen,
1241      it is flagged, and its static_pass_number is set to -1
1242
1243    * On subsequent times that it is seen, the static pass number
1244      is decremented each time, so that if there are e.g. 4 dups,
1245      they have static_pass_number -4, 2, 3, 4 respectively (note
1246      how the initial one is negative and gives the count); these
1247      can be thought of as instance numbers of the specific pass
1248
1249    * Within the register_dump_files () traversal, set_pass_for_id()
1250      is called on each pass, using these instance numbers to create
1251      dumpfile switches, and then overwriting them with a pass id,
1252      which are global to the whole pass manager (based on
1253      (TDI_end + current value of extra_dump_files_in_use) )  */
1254
1255 static void
1256 add_pass_instance (opt_pass *new_pass, bool track_duplicates,
1257                    opt_pass *initial_pass)
1258 {
1259   /* Are we dealing with the first pass of its kind, or a clone?  */
1260   if (new_pass != initial_pass)
1261     {
1262       /* We're dealing with a clone.  */
1263       new_pass->todo_flags_start &= ~TODO_mark_first_instance;
1264
1265       /* Indicate to register_dump_files that this pass has duplicates,
1266          and so it should rename the dump file.  The first instance will
1267          be -1, and be number of duplicates = -static_pass_number - 1.
1268          Subsequent instances will be > 0 and just the duplicate number.  */
1269       if ((new_pass->name && new_pass->name[0] != '*') || track_duplicates)
1270         {
1271           initial_pass->static_pass_number -= 1;
1272           new_pass->static_pass_number = -initial_pass->static_pass_number;
1273         }
1274     }
1275   else
1276     {
1277       /* We're dealing with the first pass of its kind.  */
1278       new_pass->todo_flags_start |= TODO_mark_first_instance;
1279       new_pass->static_pass_number = -1;
1280
1281       invoke_plugin_callbacks (PLUGIN_NEW_PASS, new_pass);
1282     }
1283 }
1284
1285 /* Add a pass to the pass list. Duplicate the pass if it's already
1286    in the list.  */
1287
1288 static opt_pass **
1289 next_pass_1 (opt_pass **list, opt_pass *pass, opt_pass *initial_pass)
1290 {
1291   /* Every pass should have a name so that plugins can refer to them.  */
1292   gcc_assert (pass->name != NULL);
1293
1294   add_pass_instance (pass, false, initial_pass);
1295   *list = pass;
1296
1297   return &(*list)->next;
1298 }
1299
1300 /* List node for an inserted pass instance. We need to keep track of all
1301    the newly-added pass instances (with 'added_pass_nodes' defined below)
1302    so that we can register their dump files after pass-positioning is finished.
1303    Registering dumping files needs to be post-processed or the
1304    static_pass_number of the opt_pass object would be modified and mess up
1305    the dump file names of future pass instances to be added.  */
1306
1307 struct pass_list_node
1308 {
1309   opt_pass *pass;
1310   struct pass_list_node *next;
1311 };
1312
1313 static struct pass_list_node *added_pass_nodes = NULL;
1314 static struct pass_list_node *prev_added_pass_node;
1315
1316 /* Insert the pass at the proper position. Return true if the pass
1317    is successfully added.
1318
1319    NEW_PASS_INFO - new pass to be inserted
1320    PASS_LIST - root of the pass list to insert the new pass to  */
1321
1322 static bool
1323 position_pass (struct register_pass_info *new_pass_info, opt_pass **pass_list)
1324 {
1325   opt_pass *pass = *pass_list, *prev_pass = NULL;
1326   bool success = false;
1327
1328   for ( ; pass; prev_pass = pass, pass = pass->next)
1329     {
1330       /* Check if the current pass is of the same type as the new pass and
1331          matches the name and the instance number of the reference pass.  */
1332       if (pass->type == new_pass_info->pass->type
1333           && pass->name
1334           && !strcmp (pass->name, new_pass_info->reference_pass_name)
1335           && ((new_pass_info->ref_pass_instance_number == 0)
1336               || (new_pass_info->ref_pass_instance_number ==
1337                   pass->static_pass_number)
1338               || (new_pass_info->ref_pass_instance_number == 1
1339                   && pass->todo_flags_start & TODO_mark_first_instance)))
1340         {
1341           opt_pass *new_pass;
1342           struct pass_list_node *new_pass_node;
1343
1344           if (new_pass_info->ref_pass_instance_number == 0)
1345             {
1346               new_pass = new_pass_info->pass->clone ();
1347               add_pass_instance (new_pass, true, new_pass_info->pass);
1348             }
1349           else
1350             {
1351               new_pass = new_pass_info->pass;
1352               add_pass_instance (new_pass, true, new_pass);
1353             }
1354
1355           /* Insert the new pass instance based on the positioning op.  */
1356           switch (new_pass_info->pos_op)
1357             {
1358               case PASS_POS_INSERT_AFTER:
1359                 new_pass->next = pass->next;
1360                 pass->next = new_pass;
1361
1362                 /* Skip newly inserted pass to avoid repeated
1363                    insertions in the case where the new pass and the
1364                    existing one have the same name.  */
1365                 pass = new_pass;
1366                 break;
1367               case PASS_POS_INSERT_BEFORE:
1368                 new_pass->next = pass;
1369                 if (prev_pass)
1370                   prev_pass->next = new_pass;
1371                 else
1372                   *pass_list = new_pass;
1373                 break;
1374               case PASS_POS_REPLACE:
1375                 new_pass->next = pass->next;
1376                 if (prev_pass)
1377                   prev_pass->next = new_pass;
1378                 else
1379                   *pass_list = new_pass;
1380                 new_pass->sub = pass->sub;
1381                 new_pass->tv_id = pass->tv_id;
1382                 pass = new_pass;
1383                 break;
1384               default:
1385                 error ("invalid pass positioning operation");
1386                 return false;
1387             }
1388
1389           /* Save the newly added pass (instance) in the added_pass_nodes
1390              list so that we can register its dump file later. Note that
1391              we cannot register the dump file now because doing so will modify
1392              the static_pass_number of the opt_pass object and therefore
1393              mess up the dump file name of future instances.  */
1394           new_pass_node = XCNEW (struct pass_list_node);
1395           new_pass_node->pass = new_pass;
1396           if (!added_pass_nodes)
1397             added_pass_nodes = new_pass_node;
1398           else
1399             prev_added_pass_node->next = new_pass_node;
1400           prev_added_pass_node = new_pass_node;
1401
1402           success = true;
1403         }
1404
1405       if (pass->sub && position_pass (new_pass_info, &pass->sub))
1406         success = true;
1407     }
1408
1409   return success;
1410 }
1411
1412 /* Hooks a new pass into the pass lists.
1413
1414    PASS_INFO   - pass information that specifies the opt_pass object,
1415                  reference pass, instance number, and how to position
1416                  the pass  */
1417
1418 void
1419 register_pass (struct register_pass_info *pass_info)
1420 {
1421   g->get_passes ()->register_pass (pass_info);
1422 }
1423
1424 void
1425 register_pass (opt_pass* pass, pass_positioning_ops pos,
1426                const char* ref_pass_name, int ref_pass_inst_number)
1427 {
1428   register_pass_info i;
1429   i.pass = pass;
1430   i.reference_pass_name = ref_pass_name;
1431   i.ref_pass_instance_number = ref_pass_inst_number;
1432   i.pos_op = pos;
1433
1434   g->get_passes ()->register_pass (&i);
1435 }
1436
1437 void
1438 pass_manager::register_pass (struct register_pass_info *pass_info)
1439 {
1440   bool all_instances, success;
1441   gcc::dump_manager *dumps = m_ctxt->get_dumps ();
1442
1443   /* The checks below could fail in buggy plugins.  Existing GCC
1444      passes should never fail these checks, so we mention plugin in
1445      the messages.  */
1446   if (!pass_info->pass)
1447       fatal_error (input_location, "plugin cannot register a missing pass");
1448
1449   if (!pass_info->pass->name)
1450       fatal_error (input_location, "plugin cannot register an unnamed pass");
1451
1452   if (!pass_info->reference_pass_name)
1453       fatal_error
1454         (input_location,
1455          "plugin cannot register pass %qs without reference pass name",
1456          pass_info->pass->name);
1457
1458   /* Try to insert the new pass to the pass lists.  We need to check
1459      all five lists as the reference pass could be in one (or all) of
1460      them.  */
1461   all_instances = pass_info->ref_pass_instance_number == 0;
1462   success = position_pass (pass_info, &all_lowering_passes);
1463   if (!success || all_instances)
1464     success |= position_pass (pass_info, &all_small_ipa_passes);
1465   if (!success || all_instances)
1466     success |= position_pass (pass_info, &all_regular_ipa_passes);
1467   if (!success || all_instances)
1468     success |= position_pass (pass_info, &all_late_ipa_passes);
1469   if (!success || all_instances)
1470     success |= position_pass (pass_info, &all_passes);
1471   if (!success)
1472     fatal_error
1473       (input_location,
1474        "pass %qs not found but is referenced by new pass %qs",
1475        pass_info->reference_pass_name, pass_info->pass->name);
1476
1477   /* OK, we have successfully inserted the new pass. We need to register
1478      the dump files for the newly added pass and its duplicates (if any).
1479      Because the registration of plugin/backend passes happens after the
1480      command-line options are parsed, the options that specify single
1481      pass dumping (e.g. -fdump-tree-PASSNAME) cannot be used for new
1482      passes. Therefore we currently can only enable dumping of
1483      new passes when the 'dump-all' flags (e.g. -fdump-tree-all)
1484      are specified. While doing so, we also delete the pass_list_node
1485      objects created during pass positioning.  */
1486   while (added_pass_nodes)
1487     {
1488       struct pass_list_node *next_node = added_pass_nodes->next;
1489       enum tree_dump_index tdi;
1490       register_one_dump_file (added_pass_nodes->pass);
1491       if (added_pass_nodes->pass->type == SIMPLE_IPA_PASS
1492           || added_pass_nodes->pass->type == IPA_PASS)
1493         tdi = TDI_ipa_all;
1494       else if (added_pass_nodes->pass->type == GIMPLE_PASS)
1495         tdi = TDI_tree_all;
1496       else
1497         tdi = TDI_rtl_all;
1498       /* Check if dump-all flag is specified.  */
1499       if (dumps->get_dump_file_info (tdi)->pstate)
1500         dumps->get_dump_file_info (added_pass_nodes->pass->static_pass_number)
1501             ->pstate = dumps->get_dump_file_info (tdi)->pstate;
1502       XDELETE (added_pass_nodes);
1503       added_pass_nodes = next_node;
1504     }
1505 }
1506
1507 /* Construct the pass tree.  The sequencing of passes is driven by
1508    the cgraph routines:
1509
1510    finalize_compilation_unit ()
1511        for each node N in the cgraph
1512            cgraph_analyze_function (N)
1513                cgraph_lower_function (N) -> all_lowering_passes
1514
1515    If we are optimizing, compile is then invoked:
1516
1517    compile ()
1518        ipa_passes ()                    -> all_small_ipa_passes
1519                                         -> Analysis of all_regular_ipa_passes
1520         * possible LTO streaming at copmilation time *
1521                                         -> Execution of all_regular_ipa_passes
1522         * possible LTO streaming at link time *
1523                                         -> all_late_ipa_passes
1524        expand_all_functions ()
1525            for each node N in the cgraph
1526                expand_function (N)      -> Transformation of all_regular_ipa_passes
1527                                         -> all_passes
1528 */
1529
1530 void *
1531 pass_manager::operator new (size_t sz)
1532 {
1533   /* Ensure that all fields of the pass manager are zero-initialized.  */
1534   return xcalloc (1, sz);
1535 }
1536
1537 void
1538 pass_manager::operator delete (void *ptr)
1539 {
1540   free (ptr);
1541 }
1542
1543 pass_manager::pass_manager (context *ctxt)
1544 : all_passes (NULL), all_small_ipa_passes (NULL), all_lowering_passes (NULL),
1545   all_regular_ipa_passes (NULL),
1546   all_late_ipa_passes (NULL), passes_by_id (NULL), passes_by_id_size (0),
1547   m_ctxt (ctxt)
1548 {
1549   opt_pass **p;
1550
1551   /* Initialize the pass_lists array.  */
1552 #define DEF_PASS_LIST(LIST) pass_lists[PASS_LIST_NO_##LIST] = &LIST;
1553   GCC_PASS_LISTS
1554 #undef DEF_PASS_LIST
1555
1556   /* Build the tree of passes.  */
1557
1558 #define INSERT_PASSES_AFTER(PASS) \
1559   p = &(PASS);
1560
1561 #define PUSH_INSERT_PASSES_WITHIN(PASS) \
1562   { \
1563     opt_pass **p = &(PASS ## _1)->sub;
1564
1565 #define POP_INSERT_PASSES() \
1566   }
1567
1568 #define NEXT_PASS(PASS, NUM) \
1569   do { \
1570     gcc_assert (NULL == PASS ## _ ## NUM); \
1571     if ((NUM) == 1)                              \
1572       PASS ## _1 = make_##PASS (m_ctxt);          \
1573     else                                         \
1574       {                                          \
1575         gcc_assert (PASS ## _1);                 \
1576         PASS ## _ ## NUM = PASS ## _1->clone (); \
1577       }                                          \
1578     p = next_pass_1 (p, PASS ## _ ## NUM, PASS ## _1);  \
1579   } while (0)
1580
1581 #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG)              \
1582     do {                                                \
1583       NEXT_PASS (PASS, NUM);                            \
1584       PASS ## _ ## NUM->set_pass_param (0, ARG);        \
1585     } while (0)
1586
1587 #define TERMINATE_PASS_LIST() \
1588   *p = NULL;
1589
1590 #include "pass-instances.def"
1591
1592 #undef INSERT_PASSES_AFTER
1593 #undef PUSH_INSERT_PASSES_WITHIN
1594 #undef POP_INSERT_PASSES
1595 #undef NEXT_PASS
1596 #undef NEXT_PASS_WITH_ARG
1597 #undef TERMINATE_PASS_LIST
1598
1599   /* Register the passes with the tree dump code.  */
1600   register_dump_files (all_lowering_passes);
1601   register_dump_files (all_small_ipa_passes);
1602   register_dump_files (all_regular_ipa_passes);
1603   register_dump_files (all_late_ipa_passes);
1604   register_dump_files (all_passes);
1605 }
1606
1607 static void
1608 delete_pass_tree (opt_pass *pass)
1609 {
1610   while (pass)
1611     {
1612       /* Recurse into child passes.  */
1613       delete_pass_tree (pass->sub);
1614
1615       opt_pass *next = pass->next;
1616
1617       /* Delete this pass.  */
1618       delete pass;
1619
1620       /* Iterate onto sibling passes.  */
1621       pass = next;
1622     }
1623 }
1624
1625 pass_manager::~pass_manager ()
1626 {
1627   XDELETEVEC (passes_by_id);
1628
1629   /* Call delete_pass_tree on each of the pass_lists.  */
1630 #define DEF_PASS_LIST(LIST) \
1631     delete_pass_tree (*pass_lists[PASS_LIST_NO_##LIST]);
1632   GCC_PASS_LISTS
1633 #undef DEF_PASS_LIST
1634
1635 }
1636
1637 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
1638    function CALLBACK for every function in the call graph.  Otherwise,
1639    call CALLBACK on the current function.  */
1640
1641 static void
1642 do_per_function (void (*callback) (function *, void *data), void *data)
1643 {
1644   if (current_function_decl)
1645     callback (cfun, data);
1646   else
1647     {
1648       struct cgraph_node *node;
1649       FOR_EACH_DEFINED_FUNCTION (node)
1650         if (node->analyzed && (gimple_has_body_p (node->decl) && !in_lto_p)
1651             && (!node->clone_of || node->decl != node->clone_of->decl))
1652           callback (DECL_STRUCT_FUNCTION (node->decl), data);
1653     }
1654 }
1655
1656 /* Because inlining might remove no-longer reachable nodes, we need to
1657    keep the array visible to garbage collector to avoid reading collected
1658    out nodes.  */
1659 static int nnodes;
1660 static GTY ((length ("nnodes"))) cgraph_node **order;
1661
1662 /* Hook called when NODE is removed and therefore should be
1663    excluded from order vector.  DATA is an array of integers.
1664    DATA[0] holds max index it may be accessed by.  For cgraph
1665    node DATA[node->uid + 1] holds index of this node in order
1666    vector.  */
1667 static void
1668 remove_cgraph_node_from_order (cgraph_node *node, void *data)
1669 {
1670   int *order_idx = (int *)data;
1671
1672   if (node->uid >= order_idx[0])
1673     return;
1674
1675   int idx = order_idx[node->uid + 1];
1676   if (idx >= 0 && idx < nnodes && order[idx] == node)
1677     order[idx] = NULL;
1678 }
1679
1680 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
1681    function CALLBACK for every function in the call graph.  Otherwise,
1682    call CALLBACK on the current function.
1683    This function is global so that plugins can use it.  */
1684 void
1685 do_per_function_toporder (void (*callback) (function *, void *data), void *data)
1686 {
1687   int i;
1688
1689   if (current_function_decl)
1690     callback (cfun, data);
1691   else
1692     {
1693       cgraph_node_hook_list *hook;
1694       int *order_idx;
1695       gcc_assert (!order);
1696       order = ggc_vec_alloc<cgraph_node *> (symtab->cgraph_count);
1697
1698       order_idx = XALLOCAVEC (int, symtab->cgraph_max_uid + 1);
1699       memset (order_idx + 1, -1, sizeof (int) * symtab->cgraph_max_uid);
1700       order_idx[0] = symtab->cgraph_max_uid;
1701
1702       nnodes = ipa_reverse_postorder (order);
1703       for (i = nnodes - 1; i >= 0; i--)
1704         {
1705           order[i]->process = 1;
1706           order_idx[order[i]->uid + 1] = i;
1707         }
1708       hook = symtab->add_cgraph_removal_hook (remove_cgraph_node_from_order,
1709                                               order_idx);
1710       for (i = nnodes - 1; i >= 0; i--)
1711         {
1712           /* Function could be inlined and removed as unreachable.  */
1713           if (!order[i])
1714             continue;
1715
1716           struct cgraph_node *node = order[i];
1717
1718           /* Allow possibly removed nodes to be garbage collected.  */
1719           order[i] = NULL;
1720           node->process = 0;
1721           if (node->has_gimple_body_p ())
1722             {
1723               struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
1724               push_cfun (fn);
1725               callback (fn, data);
1726               pop_cfun ();
1727             }
1728         }
1729       symtab->remove_cgraph_removal_hook (hook);
1730     }
1731   ggc_free (order);
1732   order = NULL;
1733   nnodes = 0;
1734 }
1735
1736 /* Helper function to perform function body dump.  */
1737
1738 static void
1739 execute_function_dump (function *fn, void *data)
1740 {
1741   opt_pass *pass = (opt_pass *)data;
1742
1743   if (dump_file)
1744     {
1745       push_cfun (fn);
1746
1747       if (fn->curr_properties & PROP_trees)
1748         dump_function_to_file (fn->decl, dump_file, dump_flags);
1749       else
1750         print_rtl_with_bb (dump_file, get_insns (), dump_flags);
1751
1752       /* Flush the file.  If verification fails, we won't be able to
1753          close the file before aborting.  */
1754       fflush (dump_file);
1755
1756       if ((fn->curr_properties & PROP_cfg)
1757           && (dump_flags & TDF_GRAPH))
1758         {
1759           if (!pass->graph_dump_initialized)
1760             {
1761               clean_graph_dump_file (dump_file_name);
1762               pass->graph_dump_initialized = true;
1763             }
1764           print_graph_cfg (dump_file_name, fn);
1765         }
1766
1767       pop_cfun ();
1768     }
1769 }
1770
1771 static struct profile_record *profile_record;
1772
1773 /* Do profile consistency book-keeping for the pass with static number INDEX.
1774    If SUBPASS is zero, we run _before_ the pass, and if SUBPASS is one, then
1775    we run _after_ the pass.  RUN is true if the pass really runs, or FALSE
1776    if we are only book-keeping on passes that may have selectively disabled
1777    themselves on a given function.  */
1778 static void
1779 check_profile_consistency (int index, int subpass, bool run)
1780 {
1781   pass_manager *passes = g->get_passes ();
1782   if (index == -1)
1783     return;
1784   if (!profile_record)
1785     profile_record = XCNEWVEC (struct profile_record,
1786                                passes->passes_by_id_size);
1787   gcc_assert (index < passes->passes_by_id_size && index >= 0);
1788   gcc_assert (subpass < 2);
1789   profile_record[index].run |= run;
1790   account_profile_record (&profile_record[index], subpass);
1791 }
1792
1793 /* Output profile consistency.  */
1794
1795 void
1796 dump_profile_report (void)
1797 {
1798   g->get_passes ()->dump_profile_report ();
1799 }
1800
1801 void
1802 pass_manager::dump_profile_report () const
1803 {
1804   int i, j;
1805   int last_freq_in = 0, last_count_in = 0, last_freq_out = 0, last_count_out = 0;
1806   gcov_type last_time = 0, last_size = 0;
1807   double rel_time_change, rel_size_change;
1808   int last_reported = 0;
1809
1810   if (!profile_record)
1811     return;
1812   fprintf (stderr, "\nProfile consistency report:\n\n");
1813   fprintf (stderr, "Pass name                        |mismatch in |mismated out|Overall\n");
1814   fprintf (stderr, "                                 |freq count  |freq count  |size      time\n");
1815            
1816   for (i = 0; i < passes_by_id_size; i++)
1817     for (j = 0 ; j < 2; j++)
1818       if (profile_record[i].run)
1819         {
1820           if (last_time)
1821             rel_time_change = (profile_record[i].time[j]
1822                                - (double)last_time) * 100 / (double)last_time;
1823           else
1824             rel_time_change = 0;
1825           if (last_size)
1826             rel_size_change = (profile_record[i].size[j]
1827                                - (double)last_size) * 100 / (double)last_size;
1828           else
1829             rel_size_change = 0;
1830
1831           if (profile_record[i].num_mismatched_freq_in[j] != last_freq_in
1832               || profile_record[i].num_mismatched_freq_out[j] != last_freq_out
1833               || profile_record[i].num_mismatched_count_in[j] != last_count_in
1834               || profile_record[i].num_mismatched_count_out[j] != last_count_out
1835               || rel_time_change || rel_size_change)
1836             {
1837               last_reported = i;
1838               fprintf (stderr, "%-20s %s",
1839                        passes_by_id [i]->name,
1840                        j ? "(after TODO)" : "            ");
1841               if (profile_record[i].num_mismatched_freq_in[j] != last_freq_in)
1842                 fprintf (stderr, "| %+5i",
1843                          profile_record[i].num_mismatched_freq_in[j]
1844                           - last_freq_in);
1845               else
1846                 fprintf (stderr, "|      ");
1847               if (profile_record[i].num_mismatched_count_in[j] != last_count_in)
1848                 fprintf (stderr, " %+5i",
1849                          profile_record[i].num_mismatched_count_in[j]
1850                           - last_count_in);
1851               else
1852                 fprintf (stderr, "      ");
1853               if (profile_record[i].num_mismatched_freq_out[j] != last_freq_out)
1854                 fprintf (stderr, "| %+5i",
1855                          profile_record[i].num_mismatched_freq_out[j]
1856                           - last_freq_out);
1857               else
1858                 fprintf (stderr, "|      ");
1859               if (profile_record[i].num_mismatched_count_out[j] != last_count_out)
1860                 fprintf (stderr, " %+5i",
1861                          profile_record[i].num_mismatched_count_out[j]
1862                           - last_count_out);
1863               else
1864                 fprintf (stderr, "      ");
1865
1866               /* Size/time units change across gimple and RTL.  */
1867               if (i == pass_expand_1->static_pass_number)
1868                 fprintf (stderr, "|----------");
1869               else
1870                 {
1871                   if (rel_size_change)
1872                     fprintf (stderr, "| %+8.4f%%", rel_size_change);
1873                   else
1874                     fprintf (stderr, "|          ");
1875                   if (rel_time_change)
1876                     fprintf (stderr, " %+8.4f%%", rel_time_change);
1877                 }
1878               fprintf (stderr, "\n");
1879               last_freq_in = profile_record[i].num_mismatched_freq_in[j];
1880               last_freq_out = profile_record[i].num_mismatched_freq_out[j];
1881               last_count_in = profile_record[i].num_mismatched_count_in[j];
1882               last_count_out = profile_record[i].num_mismatched_count_out[j];
1883             }
1884           else if (j && last_reported != i)
1885             {
1886               last_reported = i;
1887               fprintf (stderr, "%-20s ------------|            |            |\n",
1888                        passes_by_id [i]->name);
1889             }
1890           last_time = profile_record[i].time[j];
1891           last_size = profile_record[i].size[j];
1892         }
1893 }
1894
1895 /* Perform all TODO actions that ought to be done on each function.  */
1896
1897 static void
1898 execute_function_todo (function *fn, void *data)
1899 {
1900   bool from_ipa_pass = (cfun == NULL);
1901   unsigned int flags = (size_t)data;
1902   flags &= ~fn->last_verified;
1903   if (!flags)
1904     return;
1905
1906   push_cfun (fn);
1907
1908   /* Always cleanup the CFG before trying to update SSA.  */
1909   if (flags & TODO_cleanup_cfg)
1910     {
1911       cleanup_tree_cfg ();
1912
1913       /* When cleanup_tree_cfg merges consecutive blocks, it may
1914          perform some simplistic propagation when removing single
1915          valued PHI nodes.  This propagation may, in turn, cause the
1916          SSA form to become out-of-date (see PR 22037).  So, even
1917          if the parent pass had not scheduled an SSA update, we may
1918          still need to do one.  */
1919       if (!(flags & TODO_update_ssa_any) && need_ssa_update_p (cfun))
1920         flags |= TODO_update_ssa;
1921     }
1922
1923   if (flags & TODO_update_ssa_any)
1924     {
1925       unsigned update_flags = flags & TODO_update_ssa_any;
1926       update_ssa (update_flags);
1927     }
1928
1929   if (flag_tree_pta && (flags & TODO_rebuild_alias))
1930     compute_may_aliases ();
1931
1932   if (optimize && (flags & TODO_update_address_taken))
1933     execute_update_addresses_taken ();
1934
1935   if (flags & TODO_remove_unused_locals)
1936     remove_unused_locals ();
1937
1938   if (flags & TODO_rebuild_frequencies)
1939     rebuild_frequencies ();
1940
1941   if (flags & TODO_rebuild_cgraph_edges)
1942     cgraph_edge::rebuild_edges ();
1943
1944   gcc_assert (dom_info_state (fn, CDI_POST_DOMINATORS) == DOM_NONE);
1945   /* If we've seen errors do not bother running any verifiers.  */
1946   if (flag_checking && !seen_error ())
1947     {
1948       dom_state pre_verify_state = dom_info_state (fn, CDI_DOMINATORS);
1949       dom_state pre_verify_pstate = dom_info_state (fn, CDI_POST_DOMINATORS);
1950
1951       if (flags & TODO_verify_il)
1952         {
1953           if (cfun->curr_properties & PROP_trees)
1954             {
1955               if (cfun->curr_properties & PROP_cfg)
1956                 /* IPA passes leave stmts to be fixed up, so make sure to
1957                    not verify stmts really throw.  */
1958                 verify_gimple_in_cfg (cfun, !from_ipa_pass);
1959               else
1960                 verify_gimple_in_seq (gimple_body (cfun->decl));
1961             }
1962           if (cfun->curr_properties & PROP_ssa)
1963             /* IPA passes leave stmts to be fixed up, so make sure to
1964                not verify SSA operands whose verifier will choke on that.  */
1965             verify_ssa (true, !from_ipa_pass);
1966           /* IPA passes leave basic-blocks unsplit, so make sure to
1967              not trip on that.  */
1968           if ((cfun->curr_properties & PROP_cfg)
1969               && !from_ipa_pass)
1970             verify_flow_info ();
1971           if (current_loops
1972               && loops_state_satisfies_p (LOOP_CLOSED_SSA))
1973             verify_loop_closed_ssa (false);
1974           if (cfun->curr_properties & PROP_rtl)
1975             verify_rtl_sharing ();
1976         }
1977
1978       /* Make sure verifiers don't change dominator state.  */
1979       gcc_assert (dom_info_state (fn, CDI_DOMINATORS) == pre_verify_state);
1980       gcc_assert (dom_info_state (fn, CDI_POST_DOMINATORS) == pre_verify_pstate);
1981     }
1982
1983   fn->last_verified = flags & TODO_verify_all;
1984
1985   pop_cfun ();
1986
1987   /* For IPA passes make sure to release dominator info, it can be
1988      computed by non-verifying TODOs.  */
1989   if (from_ipa_pass)
1990     {
1991       free_dominance_info (fn, CDI_DOMINATORS);
1992       free_dominance_info (fn, CDI_POST_DOMINATORS);
1993     }
1994 }
1995
1996 /* Perform all TODO actions.  */
1997 static void
1998 execute_todo (unsigned int flags)
1999 {
2000   if (flag_checking
2001       && cfun
2002       && need_ssa_update_p (cfun))
2003     gcc_assert (flags & TODO_update_ssa_any);
2004
2005   timevar_push (TV_TODO);
2006
2007   statistics_fini_pass ();
2008
2009   if (flags)
2010     do_per_function (execute_function_todo, (void *)(size_t) flags);
2011
2012   /* At this point we should not have any unreachable code in the
2013      CFG, so it is safe to flush the pending freelist for SSA_NAMES.  */
2014   if (cfun && cfun->gimple_df)
2015     flush_ssaname_freelist ();
2016
2017   /* Always remove functions just as before inlining: IPA passes might be
2018      interested to see bodies of extern inline functions that are not inlined
2019      to analyze side effects.  The full removal is done just at the end
2020      of IPA pass queue.  */
2021   if (flags & TODO_remove_functions)
2022     {
2023       gcc_assert (!cfun);
2024       symtab->remove_unreachable_nodes (dump_file);
2025     }
2026
2027   if ((flags & TODO_dump_symtab) && dump_file && !current_function_decl)
2028     {
2029       gcc_assert (!cfun);
2030       symtab_node::dump_table (dump_file);
2031       /* Flush the file.  If verification fails, we won't be able to
2032          close the file before aborting.  */
2033       fflush (dump_file);
2034     }
2035
2036   /* Now that the dumping has been done, we can get rid of the optional
2037      df problems.  */
2038   if (flags & TODO_df_finish)
2039     df_finish_pass ((flags & TODO_df_verify) != 0);
2040
2041   timevar_pop (TV_TODO);
2042 }
2043
2044 /* Verify invariants that should hold between passes.  This is a place
2045    to put simple sanity checks.  */
2046
2047 static void
2048 verify_interpass_invariants (void)
2049 {
2050   gcc_checking_assert (!fold_deferring_overflow_warnings_p ());
2051 }
2052
2053 /* Clear the last verified flag.  */
2054
2055 static void
2056 clear_last_verified (function *fn, void *data ATTRIBUTE_UNUSED)
2057 {
2058   fn->last_verified = 0;
2059 }
2060
2061 /* Helper function. Verify that the properties has been turn into the
2062    properties expected by the pass.  */
2063
2064 static void
2065 verify_curr_properties (function *fn, void *data)
2066 {
2067   unsigned int props = (size_t)data;
2068   gcc_assert ((fn->curr_properties & props) == props);
2069 }
2070
2071 /* Release dump file name if set.  */
2072
2073 static void
2074 release_dump_file_name (void)
2075 {
2076   if (dump_file_name)
2077     {
2078       free (CONST_CAST (char *, dump_file_name));
2079       dump_file_name = NULL;
2080     }
2081 }
2082
2083 /* Initialize pass dump file.  */
2084 /* This is non-static so that the plugins can use it.  */
2085
2086 bool
2087 pass_init_dump_file (opt_pass *pass)
2088 {
2089   /* If a dump file name is present, open it if enabled.  */
2090   if (pass->static_pass_number != -1)
2091     {
2092       timevar_push (TV_DUMP);
2093       gcc::dump_manager *dumps = g->get_dumps ();
2094       bool initializing_dump =
2095         !dumps->dump_initialized_p (pass->static_pass_number);
2096       release_dump_file_name ();
2097       dump_file_name = dumps->get_dump_file_name (pass->static_pass_number);
2098       dumps->dump_start (pass->static_pass_number, &dump_flags);
2099       if (dump_file && current_function_decl)
2100         dump_function_header (dump_file, current_function_decl, dump_flags);
2101       if (initializing_dump
2102           && dump_file && (dump_flags & TDF_GRAPH)
2103           && cfun && (cfun->curr_properties & PROP_cfg))
2104         {
2105           clean_graph_dump_file (dump_file_name);
2106           pass->graph_dump_initialized = true;
2107         }
2108       timevar_pop (TV_DUMP);
2109       return initializing_dump;
2110     }
2111   else
2112     return false;
2113 }
2114
2115 /* Flush PASS dump file.  */
2116 /* This is non-static so that plugins can use it.  */
2117
2118 void
2119 pass_fini_dump_file (opt_pass *pass)
2120 {
2121   timevar_push (TV_DUMP);
2122
2123   /* Flush and close dump file.  */
2124   release_dump_file_name ();
2125
2126   g->get_dumps ()->dump_finish (pass->static_pass_number);
2127   timevar_pop (TV_DUMP);
2128 }
2129
2130 /* After executing the pass, apply expected changes to the function
2131    properties. */
2132
2133 static void
2134 update_properties_after_pass (function *fn, void *data)
2135 {
2136   opt_pass *pass = (opt_pass *) data;
2137   fn->curr_properties = (fn->curr_properties | pass->properties_provided)
2138                          & ~pass->properties_destroyed;
2139 }
2140
2141 /* Execute summary generation for all of the passes in IPA_PASS.  */
2142
2143 void
2144 execute_ipa_summary_passes (ipa_opt_pass_d *ipa_pass)
2145 {
2146   while (ipa_pass)
2147     {
2148       opt_pass *pass = ipa_pass;
2149
2150       /* Execute all of the IPA_PASSes in the list.  */
2151       if (ipa_pass->type == IPA_PASS
2152           && pass->gate (cfun)
2153           && ipa_pass->generate_summary)
2154         {
2155           pass_init_dump_file (pass);
2156
2157           /* If a timevar is present, start it.  */
2158           if (pass->tv_id)
2159             timevar_push (pass->tv_id);
2160
2161           current_pass = pass;
2162           ipa_pass->generate_summary ();
2163
2164           /* Stop timevar.  */
2165           if (pass->tv_id)
2166             timevar_pop (pass->tv_id);
2167
2168           pass_fini_dump_file (pass);
2169         }
2170       ipa_pass = (ipa_opt_pass_d *)ipa_pass->next;
2171     }
2172 }
2173
2174 /* Execute IPA_PASS function transform on NODE.  */
2175
2176 static void
2177 execute_one_ipa_transform_pass (struct cgraph_node *node,
2178                                 ipa_opt_pass_d *ipa_pass)
2179 {
2180   opt_pass *pass = ipa_pass;
2181   unsigned int todo_after = 0;
2182
2183   current_pass = pass;
2184   if (!ipa_pass->function_transform)
2185     return;
2186
2187   /* Note that the folders should only create gimple expressions.
2188      This is a hack until the new folder is ready.  */
2189   in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
2190
2191   pass_init_dump_file (pass);
2192
2193   /* Run pre-pass verification.  */
2194   execute_todo (ipa_pass->function_transform_todo_flags_start);
2195
2196   /* If a timevar is present, start it.  */
2197   if (pass->tv_id != TV_NONE)
2198     timevar_push (pass->tv_id);
2199
2200   /* Do it!  */
2201   todo_after = ipa_pass->function_transform (node);
2202
2203   /* Stop timevar.  */
2204   if (pass->tv_id != TV_NONE)
2205     timevar_pop (pass->tv_id);
2206
2207   if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
2208     check_profile_consistency (pass->static_pass_number, 0, true);
2209
2210   /* Run post-pass cleanup and verification.  */
2211   execute_todo (todo_after);
2212   verify_interpass_invariants ();
2213   if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
2214     check_profile_consistency (pass->static_pass_number, 1, true);
2215
2216   if (dump_file)
2217     do_per_function (execute_function_dump, pass);
2218   pass_fini_dump_file (pass);
2219
2220   current_pass = NULL;
2221   redirect_edge_var_map_empty ();
2222
2223   /* Signal this is a suitable GC collection point.  */
2224   if (!(todo_after & TODO_do_not_ggc_collect))
2225     ggc_collect ();
2226 }
2227
2228 /* For the current function, execute all ipa transforms. */
2229
2230 void
2231 execute_all_ipa_transforms (void)
2232 {
2233   struct cgraph_node *node;
2234   if (!cfun)
2235     return;
2236   node = cgraph_node::get (current_function_decl);
2237
2238   if (node->ipa_transforms_to_apply.exists ())
2239     {
2240       unsigned int i;
2241
2242       for (i = 0; i < node->ipa_transforms_to_apply.length (); i++)
2243         execute_one_ipa_transform_pass (node, node->ipa_transforms_to_apply[i]);
2244       node->ipa_transforms_to_apply.release ();
2245     }
2246 }
2247
2248 /* Check if PASS is explicitly disabled or enabled and return
2249    the gate status.  FUNC is the function to be processed, and
2250    GATE_STATUS is the gate status determined by pass manager by
2251    default.  */
2252
2253 static bool
2254 override_gate_status (opt_pass *pass, tree func, bool gate_status)
2255 {
2256   bool explicitly_enabled = false;
2257   bool explicitly_disabled = false;
2258
2259   explicitly_enabled
2260    = is_pass_explicitly_enabled_or_disabled (pass, func,
2261                                              enabled_pass_uid_range_tab);
2262   explicitly_disabled
2263    = is_pass_explicitly_enabled_or_disabled (pass, func,
2264                                              disabled_pass_uid_range_tab);
2265
2266   gate_status = !explicitly_disabled && (gate_status || explicitly_enabled);
2267
2268   return gate_status;
2269 }
2270
2271
2272 /* Execute PASS. */
2273
2274 bool
2275 execute_one_pass (opt_pass *pass)
2276 {
2277   unsigned int todo_after = 0;
2278
2279   bool gate_status;
2280
2281   /* IPA passes are executed on whole program, so cfun should be NULL.
2282      Other passes need function context set.  */
2283   if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
2284     gcc_assert (!cfun && !current_function_decl);
2285   else
2286     gcc_assert (cfun && current_function_decl);
2287
2288   current_pass = pass;
2289
2290   /* Check whether gate check should be avoided.
2291      User controls the value of the gate through the parameter "gate_status". */
2292   gate_status = pass->gate (cfun);
2293   gate_status = override_gate_status (pass, current_function_decl, gate_status);
2294
2295   /* Override gate with plugin.  */
2296   invoke_plugin_callbacks (PLUGIN_OVERRIDE_GATE, &gate_status);
2297
2298   if (!gate_status)
2299     {
2300       /* Run so passes selectively disabling themselves on a given function
2301          are not miscounted.  */
2302       if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
2303         {
2304           check_profile_consistency (pass->static_pass_number, 0, false);
2305           check_profile_consistency (pass->static_pass_number, 1, false);
2306         }
2307       current_pass = NULL;
2308       return false;
2309     }
2310
2311   /* Pass execution event trigger: useful to identify passes being
2312      executed.  */
2313   invoke_plugin_callbacks (PLUGIN_PASS_EXECUTION, pass);
2314
2315   if (!quiet_flag && !cfun)
2316     fprintf (stderr, " <%s>", pass->name ? pass->name : "");
2317
2318   /* Note that the folders should only create gimple expressions.
2319      This is a hack until the new folder is ready.  */
2320   in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
2321
2322   pass_init_dump_file (pass);
2323
2324   /* Run pre-pass verification.  */
2325   execute_todo (pass->todo_flags_start);
2326
2327   if (flag_checking)
2328     do_per_function (verify_curr_properties,
2329                      (void *)(size_t)pass->properties_required);
2330
2331   /* If a timevar is present, start it.  */
2332   if (pass->tv_id != TV_NONE)
2333     timevar_push (pass->tv_id);
2334
2335   /* Do it!  */
2336   todo_after = pass->execute (cfun);
2337
2338   if (todo_after & TODO_discard_function)
2339     {
2340       pass_fini_dump_file (pass);
2341
2342       gcc_assert (cfun);
2343       /* As cgraph_node::release_body expects release dominators info,
2344          we have to release it.  */
2345       if (dom_info_available_p (CDI_DOMINATORS))
2346        free_dominance_info (CDI_DOMINATORS);
2347
2348       if (dom_info_available_p (CDI_POST_DOMINATORS))
2349        free_dominance_info (CDI_POST_DOMINATORS);
2350
2351       tree fn = cfun->decl;
2352       pop_cfun ();
2353       gcc_assert (!cfun);
2354       cgraph_node::get (fn)->release_body ();
2355
2356       current_pass = NULL;
2357       redirect_edge_var_map_empty ();
2358
2359       ggc_collect ();
2360
2361       return true;
2362     }
2363
2364   do_per_function (clear_last_verified, NULL);
2365
2366   /* Stop timevar.  */
2367   if (pass->tv_id != TV_NONE)
2368     timevar_pop (pass->tv_id);
2369
2370   do_per_function (update_properties_after_pass, pass);
2371
2372   if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
2373     check_profile_consistency (pass->static_pass_number, 0, true);
2374
2375   /* Run post-pass cleanup and verification.  */
2376   execute_todo (todo_after | pass->todo_flags_finish | TODO_verify_il);
2377   if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
2378     check_profile_consistency (pass->static_pass_number, 1, true);
2379
2380   verify_interpass_invariants ();
2381   if (pass->type == IPA_PASS
2382       && ((ipa_opt_pass_d *)pass)->function_transform)
2383     {
2384       struct cgraph_node *node;
2385       FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
2386         node->ipa_transforms_to_apply.safe_push ((ipa_opt_pass_d *)pass);
2387     }
2388   else if (dump_file)
2389     do_per_function (execute_function_dump, pass);
2390
2391   if (!current_function_decl)
2392     symtab->process_new_functions ();
2393
2394   pass_fini_dump_file (pass);
2395
2396   if (pass->type != SIMPLE_IPA_PASS && pass->type != IPA_PASS)
2397     gcc_assert (!(cfun->curr_properties & PROP_trees)
2398                 || pass->type != RTL_PASS);
2399
2400   current_pass = NULL;
2401   redirect_edge_var_map_empty ();
2402
2403   /* Signal this is a suitable GC collection point.  */
2404   if (!((todo_after | pass->todo_flags_finish) & TODO_do_not_ggc_collect))
2405     ggc_collect ();
2406
2407   return true;
2408 }
2409
2410 static void
2411 execute_pass_list_1 (opt_pass *pass)
2412 {
2413   do
2414     {
2415       gcc_assert (pass->type == GIMPLE_PASS
2416                   || pass->type == RTL_PASS);
2417
2418       if (cfun == NULL)
2419         return;
2420       if (execute_one_pass (pass) && pass->sub)
2421         execute_pass_list_1 (pass->sub);
2422       pass = pass->next;
2423     }
2424   while (pass);
2425 }
2426
2427 void
2428 execute_pass_list (function *fn, opt_pass *pass)
2429 {
2430   gcc_assert (fn == cfun);
2431   execute_pass_list_1 (pass);
2432   if (cfun && fn->cfg)
2433     {
2434       free_dominance_info (CDI_DOMINATORS);
2435       free_dominance_info (CDI_POST_DOMINATORS);
2436     }
2437 }
2438
2439 /* Write out all LTO data.  */
2440 static void
2441 write_lto (void)
2442 {
2443   timevar_push (TV_IPA_LTO_GIMPLE_OUT);
2444   lto_output ();
2445   timevar_pop (TV_IPA_LTO_GIMPLE_OUT);
2446   timevar_push (TV_IPA_LTO_DECL_OUT);
2447   produce_asm_for_decls ();
2448   timevar_pop (TV_IPA_LTO_DECL_OUT);
2449 }
2450
2451 /* Same as execute_pass_list but assume that subpasses of IPA passes
2452    are local passes. If SET is not NULL, write out summaries of only
2453    those node in SET. */
2454
2455 static void
2456 ipa_write_summaries_2 (opt_pass *pass, struct lto_out_decl_state *state)
2457 {
2458   while (pass)
2459     {
2460       ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *)pass;
2461       gcc_assert (!current_function_decl);
2462       gcc_assert (!cfun);
2463       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2464       if (pass->type == IPA_PASS
2465           && ipa_pass->write_summary
2466           && pass->gate (cfun))
2467         {
2468           /* If a timevar is present, start it.  */
2469           if (pass->tv_id)
2470             timevar_push (pass->tv_id);
2471
2472           pass_init_dump_file (pass);
2473
2474           current_pass = pass;
2475           ipa_pass->write_summary ();
2476
2477           pass_fini_dump_file (pass);
2478
2479           /* If a timevar is present, start it.  */
2480           if (pass->tv_id)
2481             timevar_pop (pass->tv_id);
2482         }
2483
2484       if (pass->sub && pass->sub->type != GIMPLE_PASS)
2485         ipa_write_summaries_2 (pass->sub, state);
2486
2487       pass = pass->next;
2488     }
2489 }
2490
2491 /* Helper function of ipa_write_summaries. Creates and destroys the
2492    decl state and calls ipa_write_summaries_2 for all passes that have
2493    summaries.  SET is the set of nodes to be written.  */
2494
2495 static void
2496 ipa_write_summaries_1 (lto_symtab_encoder_t encoder)
2497 {
2498   pass_manager *passes = g->get_passes ();
2499   struct lto_out_decl_state *state = lto_new_out_decl_state ();
2500   state->symtab_node_encoder = encoder;
2501
2502   lto_output_init_mode_table ();
2503   lto_push_out_decl_state (state);
2504
2505   gcc_assert (!flag_wpa);
2506   ipa_write_summaries_2 (passes->all_regular_ipa_passes, state);
2507
2508   write_lto ();
2509
2510   gcc_assert (lto_get_out_decl_state () == state);
2511   lto_pop_out_decl_state ();
2512   lto_delete_out_decl_state (state);
2513 }
2514
2515 /* Write out summaries for all the nodes in the callgraph.  */
2516
2517 void
2518 ipa_write_summaries (void)
2519 {
2520   lto_symtab_encoder_t encoder;
2521   int i, order_pos;
2522   varpool_node *vnode;
2523   struct cgraph_node *node;
2524   struct cgraph_node **order;
2525
2526   if ((!flag_generate_lto && !flag_generate_offload) || seen_error ())
2527     return;
2528
2529   select_what_to_stream ();
2530
2531   encoder = lto_symtab_encoder_new (false);
2532
2533   /* Create the callgraph set in the same order used in
2534      cgraph_expand_all_functions.  This mostly facilitates debugging,
2535      since it causes the gimple file to be processed in the same order
2536      as the source code.  */
2537   order = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count);
2538   order_pos = ipa_reverse_postorder (order);
2539   gcc_assert (order_pos == symtab->cgraph_count);
2540
2541   for (i = order_pos - 1; i >= 0; i--)
2542     {
2543       struct cgraph_node *node = order[i];
2544
2545       if (node->has_gimple_body_p ())
2546         {
2547           /* When streaming out references to statements as part of some IPA
2548              pass summary, the statements need to have uids assigned and the
2549              following does that for all the IPA passes here. Naturally, this
2550              ordering then matches the one IPA-passes get in their stmt_fixup
2551              hooks.  */
2552
2553           push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2554           renumber_gimple_stmt_uids ();
2555           pop_cfun ();
2556         }
2557       if (node->definition && node->need_lto_streaming)
2558         lto_set_symtab_encoder_in_partition (encoder, node);
2559     }
2560
2561   FOR_EACH_DEFINED_FUNCTION (node)
2562     if (node->alias && node->need_lto_streaming)
2563       lto_set_symtab_encoder_in_partition (encoder, node);
2564   FOR_EACH_DEFINED_VARIABLE (vnode)
2565     if (vnode->need_lto_streaming)
2566       lto_set_symtab_encoder_in_partition (encoder, vnode);
2567
2568   ipa_write_summaries_1 (compute_ltrans_boundary (encoder));
2569
2570   free (order);
2571 }
2572
2573 /* Same as execute_pass_list but assume that subpasses of IPA passes
2574    are local passes. If SET is not NULL, write out optimization summaries of
2575    only those node in SET. */
2576
2577 static void
2578 ipa_write_optimization_summaries_1 (opt_pass *pass,
2579                                     struct lto_out_decl_state *state)
2580 {
2581   while (pass)
2582     {
2583       ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *)pass;
2584       gcc_assert (!current_function_decl);
2585       gcc_assert (!cfun);
2586       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2587       if (pass->type == IPA_PASS
2588           && ipa_pass->write_optimization_summary
2589           && pass->gate (cfun))
2590         {
2591           /* If a timevar is present, start it.  */
2592           if (pass->tv_id)
2593             timevar_push (pass->tv_id);
2594
2595           pass_init_dump_file (pass);
2596
2597           current_pass = pass;
2598           ipa_pass->write_optimization_summary ();
2599
2600           pass_fini_dump_file (pass);
2601
2602           /* If a timevar is present, start it.  */
2603           if (pass->tv_id)
2604             timevar_pop (pass->tv_id);
2605         }
2606
2607       if (pass->sub && pass->sub->type != GIMPLE_PASS)
2608         ipa_write_optimization_summaries_1 (pass->sub, state);
2609
2610       pass = pass->next;
2611     }
2612 }
2613
2614 /* Write all the optimization summaries for the cgraph nodes in SET.  If SET is
2615    NULL, write out all summaries of all nodes. */
2616
2617 void
2618 ipa_write_optimization_summaries (lto_symtab_encoder_t encoder)
2619 {
2620   struct lto_out_decl_state *state = lto_new_out_decl_state ();
2621   lto_symtab_encoder_iterator lsei;
2622   state->symtab_node_encoder = encoder;
2623
2624   lto_output_init_mode_table ();
2625   lto_push_out_decl_state (state);
2626   for (lsei = lsei_start_function_in_partition (encoder);
2627        !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei))
2628     {
2629       struct cgraph_node *node = lsei_cgraph_node (lsei);
2630       /* When streaming out references to statements as part of some IPA
2631          pass summary, the statements need to have uids assigned.
2632
2633          For functions newly born at WPA stage we need to initialize
2634          the uids here.  */
2635       if (node->definition
2636           && gimple_has_body_p (node->decl))
2637         {
2638           push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2639           renumber_gimple_stmt_uids ();
2640           pop_cfun ();
2641         }
2642     }
2643
2644   gcc_assert (flag_wpa);
2645   pass_manager *passes = g->get_passes ();
2646   ipa_write_optimization_summaries_1 (passes->all_regular_ipa_passes, state);
2647
2648   write_lto ();
2649
2650   gcc_assert (lto_get_out_decl_state () == state);
2651   lto_pop_out_decl_state ();
2652   lto_delete_out_decl_state (state);
2653 }
2654
2655 /* Same as execute_pass_list but assume that subpasses of IPA passes
2656    are local passes.  */
2657
2658 static void
2659 ipa_read_summaries_1 (opt_pass *pass)
2660 {
2661   while (pass)
2662     {
2663       ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *) pass;
2664
2665       gcc_assert (!current_function_decl);
2666       gcc_assert (!cfun);
2667       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2668
2669       if (pass->gate (cfun))
2670         {
2671           if (pass->type == IPA_PASS && ipa_pass->read_summary)
2672             {
2673               /* If a timevar is present, start it.  */
2674               if (pass->tv_id)
2675                 timevar_push (pass->tv_id);
2676
2677               pass_init_dump_file (pass);
2678
2679               current_pass = pass;
2680               ipa_pass->read_summary ();
2681
2682               pass_fini_dump_file (pass);
2683
2684               /* Stop timevar.  */
2685               if (pass->tv_id)
2686                 timevar_pop (pass->tv_id);
2687             }
2688
2689           if (pass->sub && pass->sub->type != GIMPLE_PASS)
2690             ipa_read_summaries_1 (pass->sub);
2691         }
2692       pass = pass->next;
2693     }
2694 }
2695
2696
2697 /* Read all the summaries for all_regular_ipa_passes.  */
2698
2699 void
2700 ipa_read_summaries (void)
2701 {
2702   pass_manager *passes = g->get_passes ();
2703   ipa_read_summaries_1 (passes->all_regular_ipa_passes);
2704 }
2705
2706 /* Same as execute_pass_list but assume that subpasses of IPA passes
2707    are local passes.  */
2708
2709 static void
2710 ipa_read_optimization_summaries_1 (opt_pass *pass)
2711 {
2712   while (pass)
2713     {
2714       ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *) pass;
2715
2716       gcc_assert (!current_function_decl);
2717       gcc_assert (!cfun);
2718       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2719
2720       if (pass->gate (cfun))
2721         {
2722           if (pass->type == IPA_PASS && ipa_pass->read_optimization_summary)
2723             {
2724               /* If a timevar is present, start it.  */
2725               if (pass->tv_id)
2726                 timevar_push (pass->tv_id);
2727
2728               pass_init_dump_file (pass);
2729
2730               current_pass = pass;
2731               ipa_pass->read_optimization_summary ();
2732
2733               pass_fini_dump_file (pass);
2734
2735               /* Stop timevar.  */
2736               if (pass->tv_id)
2737                 timevar_pop (pass->tv_id);
2738             }
2739
2740           if (pass->sub && pass->sub->type != GIMPLE_PASS)
2741             ipa_read_optimization_summaries_1 (pass->sub);
2742         }
2743       pass = pass->next;
2744     }
2745 }
2746
2747 /* Read all the summaries for all_regular_ipa_passes.  */
2748
2749 void
2750 ipa_read_optimization_summaries (void)
2751 {
2752   pass_manager *passes = g->get_passes ();
2753   ipa_read_optimization_summaries_1 (passes->all_regular_ipa_passes);
2754 }
2755
2756 /* Same as execute_pass_list but assume that subpasses of IPA passes
2757    are local passes.  */
2758 void
2759 execute_ipa_pass_list (opt_pass *pass)
2760 {
2761   do
2762     {
2763       gcc_assert (!current_function_decl);
2764       gcc_assert (!cfun);
2765       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2766       if (execute_one_pass (pass) && pass->sub)
2767         {
2768           if (pass->sub->type == GIMPLE_PASS)
2769             {
2770               invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_START, NULL);
2771               do_per_function_toporder ((void (*)(function *, void *))
2772                                           execute_pass_list,
2773                                         pass->sub);
2774               invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_END, NULL);
2775             }
2776           else if (pass->sub->type == SIMPLE_IPA_PASS
2777                    || pass->sub->type == IPA_PASS)
2778             execute_ipa_pass_list (pass->sub);
2779           else
2780             gcc_unreachable ();
2781         }
2782       gcc_assert (!current_function_decl);
2783       symtab->process_new_functions ();
2784       pass = pass->next;
2785     }
2786   while (pass);
2787 }
2788
2789 /* Execute stmt fixup hooks of all passes in PASS for NODE and STMTS.  */
2790
2791 static void
2792 execute_ipa_stmt_fixups (opt_pass *pass,
2793                          struct cgraph_node *node, gimple **stmts)
2794 {
2795   while (pass)
2796     {
2797       /* Execute all of the IPA_PASSes in the list.  */
2798       if (pass->type == IPA_PASS
2799           && pass->gate (cfun))
2800         {
2801           ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *) pass;
2802
2803           if (ipa_pass->stmt_fixup)
2804             {
2805               pass_init_dump_file (pass);
2806               /* If a timevar is present, start it.  */
2807               if (pass->tv_id)
2808                 timevar_push (pass->tv_id);
2809
2810               current_pass = pass;
2811               ipa_pass->stmt_fixup (node, stmts);
2812
2813               /* Stop timevar.  */
2814               if (pass->tv_id)
2815                 timevar_pop (pass->tv_id);
2816               pass_fini_dump_file (pass);
2817             }
2818           if (pass->sub)
2819             execute_ipa_stmt_fixups (pass->sub, node, stmts);
2820         }
2821       pass = pass->next;
2822     }
2823 }
2824
2825 /* Execute stmt fixup hooks of all IPA passes for NODE and STMTS.  */
2826
2827 void
2828 execute_all_ipa_stmt_fixups (struct cgraph_node *node, gimple **stmts)
2829 {
2830   pass_manager *passes = g->get_passes ();
2831   execute_ipa_stmt_fixups (passes->all_regular_ipa_passes, node, stmts);
2832 }
2833
2834
2835 extern void debug_properties (unsigned int);
2836 extern void dump_properties (FILE *, unsigned int);
2837
2838 DEBUG_FUNCTION void
2839 dump_properties (FILE *dump, unsigned int props)
2840 {
2841   fprintf (dump, "Properties:\n");
2842   if (props & PROP_gimple_any)
2843     fprintf (dump, "PROP_gimple_any\n");
2844   if (props & PROP_gimple_lcf)
2845     fprintf (dump, "PROP_gimple_lcf\n");
2846   if (props & PROP_gimple_leh)
2847     fprintf (dump, "PROP_gimple_leh\n");
2848   if (props & PROP_cfg)
2849     fprintf (dump, "PROP_cfg\n");
2850   if (props & PROP_ssa)
2851     fprintf (dump, "PROP_ssa\n");
2852   if (props & PROP_no_crit_edges)
2853     fprintf (dump, "PROP_no_crit_edges\n");
2854   if (props & PROP_rtl)
2855     fprintf (dump, "PROP_rtl\n");
2856   if (props & PROP_gimple_lomp)
2857     fprintf (dump, "PROP_gimple_lomp\n");
2858   if (props & PROP_gimple_lcx)
2859     fprintf (dump, "PROP_gimple_lcx\n");
2860   if (props & PROP_gimple_lvec)
2861     fprintf (dump, "PROP_gimple_lvec\n");
2862   if (props & PROP_cfglayout)
2863     fprintf (dump, "PROP_cfglayout\n");
2864 }
2865
2866 DEBUG_FUNCTION void
2867 debug_properties (unsigned int props)
2868 {
2869   dump_properties (stderr, props);
2870 }
2871
2872 /* Called by local passes to see if function is called by already processed nodes.
2873    Because we process nodes in topological order, this means that function is
2874    in recursive cycle or we introduced new direct calls.  */
2875 bool
2876 function_called_by_processed_nodes_p (void)
2877 {
2878   struct cgraph_edge *e;
2879   for (e = cgraph_node::get (current_function_decl)->callers;
2880        e;
2881        e = e->next_caller)
2882     {
2883       if (e->caller->decl == current_function_decl)
2884         continue;
2885       if (!e->caller->has_gimple_body_p ())
2886         continue;
2887       if (TREE_ASM_WRITTEN (e->caller->decl))
2888         continue;
2889       if (!e->caller->process && !e->caller->global.inlined_to)
2890         break;
2891     }
2892   if (dump_file && e)
2893     {
2894       fprintf (dump_file, "Already processed call to:\n");
2895       e->caller->dump (dump_file);
2896     }
2897   return e != NULL;
2898 }
2899
2900 #include "gt-passes.h"