110d565efSmrg /* pass_manager.h - The pipeline of optimization passes
2*ec02198aSmrg    Copyright (C) 2013-2020 Free Software Foundation, Inc.
310d565efSmrg 
410d565efSmrg This file is part of GCC.
510d565efSmrg 
610d565efSmrg GCC is free software; you can redistribute it and/or modify it under
710d565efSmrg the terms of the GNU General Public License as published by the Free
810d565efSmrg Software Foundation; either version 3, or (at your option) any later
910d565efSmrg version.
1010d565efSmrg 
1110d565efSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
1210d565efSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
1310d565efSmrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1410d565efSmrg for more details.
1510d565efSmrg 
1610d565efSmrg You should have received a copy of the GNU General Public License
1710d565efSmrg along with GCC; see the file COPYING3.  If not see
1810d565efSmrg <http://www.gnu.org/licenses/>.  */
1910d565efSmrg 
2010d565efSmrg #ifndef GCC_PASS_MANAGER_H
2110d565efSmrg #define GCC_PASS_MANAGER_H
2210d565efSmrg 
2310d565efSmrg class opt_pass;
2410d565efSmrg struct register_pass_info;
2510d565efSmrg 
2610d565efSmrg /* Define a list of pass lists so that both passes.c and plugins can easily
2710d565efSmrg    find all the pass lists.  */
2810d565efSmrg #define GCC_PASS_LISTS \
2910d565efSmrg   DEF_PASS_LIST (all_lowering_passes) \
3010d565efSmrg   DEF_PASS_LIST (all_small_ipa_passes) \
3110d565efSmrg   DEF_PASS_LIST (all_regular_ipa_passes) \
3210d565efSmrg   DEF_PASS_LIST (all_late_ipa_passes) \
3310d565efSmrg   DEF_PASS_LIST (all_passes)
3410d565efSmrg 
3510d565efSmrg #define DEF_PASS_LIST(LIST) PASS_LIST_NO_##LIST,
3610d565efSmrg enum pass_list
3710d565efSmrg {
3810d565efSmrg   GCC_PASS_LISTS
3910d565efSmrg   PASS_LIST_NUM
4010d565efSmrg };
4110d565efSmrg #undef DEF_PASS_LIST
4210d565efSmrg 
4310d565efSmrg namespace gcc {
4410d565efSmrg 
4510d565efSmrg class context;
4610d565efSmrg 
4710d565efSmrg class pass_manager
4810d565efSmrg {
4910d565efSmrg public:
5010d565efSmrg   pass_manager (context *ctxt);
5110d565efSmrg   ~pass_manager ();
5210d565efSmrg 
5310d565efSmrg   void register_pass (struct register_pass_info *pass_info);
5410d565efSmrg   void register_one_dump_file (opt_pass *pass);
5510d565efSmrg 
5610d565efSmrg   opt_pass *get_pass_for_id (int id) const;
5710d565efSmrg 
5810d565efSmrg   void dump_passes () const;
5910d565efSmrg 
6010d565efSmrg   void dump_profile_report () const;
6110d565efSmrg 
6210d565efSmrg   void finish_optimization_passes ();
6310d565efSmrg 
6410d565efSmrg   /* Access to specific passes, so that the majority can be private.  */
6510d565efSmrg   void execute_early_local_passes ();
6610d565efSmrg   unsigned int execute_pass_mode_switching ();
6710d565efSmrg 
6810d565efSmrg   /* Various passes are manually cloned by epiphany. */
get_pass_split_all_insns()6910d565efSmrg   opt_pass *get_pass_split_all_insns () const {
7010d565efSmrg     return pass_split_all_insns_1;
7110d565efSmrg   }
get_pass_mode_switching()7210d565efSmrg   opt_pass *get_pass_mode_switching () const {
7310d565efSmrg     return pass_mode_switching_1;
7410d565efSmrg   }
get_pass_peephole2()7510d565efSmrg   opt_pass *get_pass_peephole2 () const { return pass_peephole2_1; }
get_pass_profile()7610d565efSmrg   opt_pass *get_pass_profile () const { return pass_profile_1; }
7710d565efSmrg 
7810d565efSmrg   void register_pass_name (opt_pass *pass, const char *name);
7910d565efSmrg 
8010d565efSmrg   opt_pass *get_pass_by_name (const char *name);
8110d565efSmrg 
get_rest_of_compilation()8210d565efSmrg   opt_pass *get_rest_of_compilation () const
8310d565efSmrg   {
8410d565efSmrg     return pass_rest_of_compilation_1;
8510d565efSmrg   }
get_clean_slate()8610d565efSmrg   opt_pass *get_clean_slate () const { return pass_clean_state_1; }
8710d565efSmrg 
8810d565efSmrg public:
8910d565efSmrg   /* The root of the compilation pass tree, once constructed.  */
9010d565efSmrg   opt_pass *all_passes;
9110d565efSmrg   opt_pass *all_small_ipa_passes;
9210d565efSmrg   opt_pass *all_lowering_passes;
9310d565efSmrg   opt_pass *all_regular_ipa_passes;
9410d565efSmrg   opt_pass *all_late_ipa_passes;
9510d565efSmrg 
9610d565efSmrg   /* A map from static pass id to optimization pass.  */
9710d565efSmrg   opt_pass **passes_by_id;
9810d565efSmrg   int passes_by_id_size;
9910d565efSmrg 
10010d565efSmrg   opt_pass **pass_lists[PASS_LIST_NUM];
10110d565efSmrg 
10210d565efSmrg private:
10310d565efSmrg   void set_pass_for_id (int id, opt_pass *pass);
10410d565efSmrg   void register_dump_files (opt_pass *pass);
10510d565efSmrg   void create_pass_tab () const;
10610d565efSmrg 
10710d565efSmrg private:
10810d565efSmrg   context *m_ctxt;
10910d565efSmrg   hash_map<nofree_string_hash, opt_pass *> *m_name_to_pass_map;
11010d565efSmrg 
11110d565efSmrg   /* References to all of the individual passes.
11210d565efSmrg      These fields are generated via macro expansion.
11310d565efSmrg 
11410d565efSmrg      For example:
11510d565efSmrg          NEXT_PASS (pass_build_cfg, 1);
11610d565efSmrg      within pass-instances.def means that there is a field:
11710d565efSmrg          opt_pass *pass_build_cfg_1;
11810d565efSmrg 
11910d565efSmrg      Similarly, the various:
12010d565efSmrg         NEXT_PASS (pass_copy_prop, 1);
12110d565efSmrg         ...
12210d565efSmrg         NEXT_PASS (pass_copy_prop, 8);
12310d565efSmrg      in pass-instances.def lead to fields:
12410d565efSmrg         opt_pass *pass_copy_prop_1;
12510d565efSmrg         ...
12610d565efSmrg         opt_pass *pass_copy_prop_8;  */
12710d565efSmrg 
12810d565efSmrg #define INSERT_PASSES_AFTER(PASS)
12910d565efSmrg #define PUSH_INSERT_PASSES_WITHIN(PASS)
13010d565efSmrg #define POP_INSERT_PASSES()
13110d565efSmrg #define NEXT_PASS(PASS, NUM) opt_pass *PASS ## _ ## NUM
13210d565efSmrg #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) NEXT_PASS (PASS, NUM)
13310d565efSmrg #define TERMINATE_PASS_LIST(PASS)
13410d565efSmrg 
13510d565efSmrg #include "pass-instances.def"
13610d565efSmrg 
13710d565efSmrg #undef INSERT_PASSES_AFTER
13810d565efSmrg #undef PUSH_INSERT_PASSES_WITHIN
13910d565efSmrg #undef POP_INSERT_PASSES
14010d565efSmrg #undef NEXT_PASS
14110d565efSmrg #undef NEXT_PASS_WITH_ARG
14210d565efSmrg #undef TERMINATE_PASS_LIST
14310d565efSmrg 
14410d565efSmrg }; // class pass_manager
14510d565efSmrg 
14610d565efSmrg } // namespace gcc
14710d565efSmrg 
14810d565efSmrg #endif /* ! GCC_PASS_MANAGER_H */
14910d565efSmrg 
150