On Wed, May 24, 2017 at 08:00:30AM -0400, Nathan Sidwell wrote: > On 05/24/2017 07:57 AM, Jakub Jelinek wrote: > > > The numbering is not to differentiate between dumps of the same name, that > > is done through numbered suffixes of the dump names, but to make the order > > of passes visible to the user and for sorted file listing to be provided in > > that order. So, rather than having lang files unnumbered, I think it is > > better to number them and just have a maximum of lang dumps and if some FE > > registers fewers, bump m_next_dump accordingly (create a hole). > > That is pretty much the standard behavior, if some dump is registered, but > > for whatever reason not dumped, you also get a hole. > > oh, ok. Seems fine to me.
Here is a patch to implement that. I chose to keep the 3 dumps predefined dumps and just tweak their registered number, otherwise the changes would be bigger. The patch additionally renames TDI_generic to TDI_gimple (to match the dump name and content) and because we have more than 256 dumps these days and we register them all even at -O0, the patch avoids 4 unnecessary reallocations. Ok for trunk if testing passes? 2017-06-05 Jakub Jelinek <ja...@redhat.com> * dumpfile.h (enum tree_dump_index): Rename TDI_generic to TDI_gimple. (class dump_manager): Add register_dumps method. * dumpfile.c: Include langhooks.h. (dump_files): Use 0 instead of 3/4/5 for TDI_{original,gimple,nested}. (FIRST_AUTO_NUMBERED_DUMP): Decrease to 1. (FIRST_ME_AUTO_NUMBERED_DUMP): Define. (dump_manager::dump_register): Start with 512 entries instead of 32. (dump_manager::register_dumps): New method. * toplev.c (general_init): Instead of invoking register_dumps langhook, invoke register_dumps method on the dump manager. * gimplify.c (gimplify_function_tree): Use TDI_gimple instead of TDI_generic. * gimple-parser.c (c_parser_parse_gimple_body): Use TDI_gimple instead of TDI_generic. --- gcc/dumpfile.h.jj 2017-06-02 09:01:10.000000000 +0200 +++ gcc/dumpfile.h 2017-06-05 11:20:07.563008969 +0200 @@ -31,7 +31,7 @@ enum tree_dump_index TDI_inheritance, /* dump type inheritance graph. */ TDI_clones, /* dump IPA cloning decisions. */ TDI_original, /* dump each function before optimizing it */ - TDI_generic, /* dump each function after genericizing it */ + TDI_gimple, /* dump each function after gimplifying it */ TDI_nested, /* dump each function after unnesting it */ TDI_lang_all, /* enable all the language dumps. */ @@ -212,6 +212,11 @@ public: dump_register (const char *suffix, const char *swtch, const char *glob, dump_kind dkind, int optgroup_flags, bool take_ownership); + /* Allow languages and middle-end to register their dumps before the + optimization passes. */ + void + register_dumps (); + /* Return the dump_file_info for the given phase. */ struct dump_file_info * get_dump_file_info (int phase) const; --- gcc/dumpfile.c.jj 2017-06-02 09:01:10.000000000 +0200 +++ gcc/dumpfile.c 2017-06-05 11:21:27.381013150 +0200 @@ -27,6 +27,7 @@ along with GCC; see the file COPYING3. #include "dumpfile.h" #include "context.h" #include "tree-cfg.h" +#include "langhooks.h" /* If non-NULL, return one past-the-end of the matching SUBPART of the WHOLE string. */ @@ -59,10 +60,11 @@ static struct dump_file_info dump_files[ DUMP_FILE_INFO (".cgraph", "ipa-cgraph", DK_ipa, 0), DUMP_FILE_INFO (".type-inheritance", "ipa-type-inheritance", DK_ipa, 0), DUMP_FILE_INFO (".ipa-clones", "ipa-clones", DK_ipa, 0), - DUMP_FILE_INFO (".original", "tree-original", DK_tree, 3), - DUMP_FILE_INFO (".gimple", "tree-gimple", DK_tree, 4), - DUMP_FILE_INFO (".nested", "tree-nested", DK_tree, 5), -#define FIRST_AUTO_NUMBERED_DUMP 3 + DUMP_FILE_INFO (".original", "tree-original", DK_tree, 0), + DUMP_FILE_INFO (".gimple", "tree-gimple", DK_tree, 0), + DUMP_FILE_INFO (".nested", "tree-nested", DK_tree, 0), +#define FIRST_AUTO_NUMBERED_DUMP 1 +#define FIRST_ME_AUTO_NUMBERED_DUMP 3 DUMP_FILE_INFO (NULL, "lang-all", DK_lang, 0), DUMP_FILE_INFO (NULL, "tree-all", DK_tree, 0), @@ -179,7 +181,7 @@ dump_register (const char *suffix, const if (count >= m_extra_dump_files_alloced) { if (m_extra_dump_files_alloced == 0) - m_extra_dump_files_alloced = 32; + m_extra_dump_files_alloced = 512; else m_extra_dump_files_alloced *= 2; m_extra_dump_files = XRESIZEVEC (struct dump_file_info, @@ -200,6 +202,25 @@ dump_register (const char *suffix, const } +/* Allow languages and middle-end to register their dumps before the + optimization passes. */ +void +gcc::dump_manager:: +register_dumps () +{ + lang_hooks.register_dumps (this); + /* If this assert fails, some FE registered more than + FIRST_ME_AUTO_NUMBERED_DUMP - FIRST_AUTO_NUMBERED_DUMP + dump files. Bump FIRST_ME_AUTO_NUMBERED_DUMP accordingly. */ + gcc_assert (m_next_dump <= FIRST_ME_AUTO_NUMBERED_DUMP); + if (m_next_dump < FIRST_ME_AUTO_NUMBERED_DUMP) + m_next_dump = FIRST_ME_AUTO_NUMBERED_DUMP; + dump_files[TDI_original].num = m_next_dump++; + dump_files[TDI_gimple].num = m_next_dump++; + dump_files[TDI_nested].num = m_next_dump++; +} + + /* Return the dump_file_info for the given phase. */ struct dump_file_info * --- gcc/toplev.c.jj 2017-06-02 09:01:10.000000000 +0200 +++ gcc/toplev.c 2017-06-05 11:04:04.085038583 +0200 @@ -1168,9 +1168,9 @@ general_init (const char *argv0, bool in dump manager. */ g = new gcc::context (); - /* Allow languages to register their dumps before the optimization - passes. */ - lang_hooks.register_dumps (g->get_dumps ()); + /* Allow languages and middle-end to register their dumps before the + optimization passes. */ + g->get_dumps ()->register_dumps (); /* Create the passes. */ g->set_passes (new gcc::pass_manager (g)); --- gcc/gimplify.c.jj 2017-06-02 09:01:20.000000000 +0200 +++ gcc/gimplify.c 2017-06-05 11:21:45.097792114 +0200 @@ -12732,7 +12732,7 @@ gimplify_function_tree (tree fndecl) pop_cfun (); - dump_function (TDI_generic, fndecl); + dump_function (TDI_gimple, fndecl); } /* Return a dummy expression of type TYPE in order to keep going after an --- gcc/c/gimple-parser.c.jj 2017-06-02 09:01:07.000000000 +0200 +++ gcc/c/gimple-parser.c 2017-06-05 11:22:04.636548346 +0200 @@ -116,7 +116,7 @@ c_parser_parse_gimple_body (c_parser *pa we have to go through lowering again. */ cfun->curr_properties = PROP_gimple_any; - dump_function (TDI_generic, current_function_decl); + dump_function (TDI_gimple, current_function_decl); } /* Parse a compound statement in gimple function body. Jakub