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