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