From 2a8a8d7bd28ef295b15f5b1c0cd17e73409c80a6 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 19 May 2017 13:10:36 +0000 Subject: [PATCH] toplev.c (general_init): Call register dump lang hook. LANG_HOOK_REGISTER_DUMPS gcc/ * toplev.c (general_init): Call register dump lang hook. * doc/invoke.texi: Document -fdump-lang option family. * dumpfile.c (dump_files): Remove class dump here. (FIRST_AUTO_NUMBERED_DUMP): Adjust. * dumpfile.h (tree_dump_index): Remove TDI_class. * langhooks-def.h (lhd_register_dumps): Declare. (LANG_HOOKS_REGISTER_DUMPS): Define. (LANG_HOOKS_INITIALIZER): Add it. * langhooks.c (lhd_register_dumps): Define. * langhooks.h (struct lang_hooks): Add register_dumps. c-family/ * c-opts.c (class_dump_file, class_dump_flags): Delete. (c_common_parse_file): Remove class dump handling. (get_dump_info): Likewise. cp/ * class.c (class_dump_id): Define. (dump_class_hierarchy, dump_vtable, dump_vtt): Use it. * cp-objcp-common.c (cp_register_dumps): New. * cp-objcp-common.h (cp_register_dumps): Declare. (LANG_HOOKS_REGISTER_DUMPS): Override. * cp-tree.h (class_dump_id): Declare. testsuite/ * g++.dg/inherit/covariant7.C: Adjust. From-SVN: r248271 --- gcc/ChangeLog | 14 +++++++++++++ gcc/c-family/ChangeLog | 6 ++++++ gcc/c-family/c-opts.c | 26 ++++++------------------ gcc/cp/ChangeLog | 9 +++++++++ gcc/cp/class.c | 16 ++++++++++----- gcc/cp/cp-objcp-common.c | 9 +++++++++ gcc/cp/cp-objcp-common.h | 3 +++ gcc/cp/cp-tree.h | 3 +++ gcc/doc/invoke.texi | 33 ++++++++++++++++++++----------- gcc/dumpfile.c | 3 +-- gcc/dumpfile.h | 1 - gcc/langhooks-def.h | 3 +++ gcc/langhooks.c | 6 ++++++ gcc/langhooks.h | 3 +++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/inherit/covariant7.C | 2 +- gcc/toplev.c | 4 ++++ 17 files changed, 105 insertions(+), 40 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b11d20d..44ff617 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,19 @@ 2017-05-19 Nathan Sidwell + LANG_HOOK_REGISTER_DUMPS + * toplev.c (general_init): Call register dump lang hook. + * doc/invoke.texi: Document -fdump-lang option family. + * dumpfile.c (dump_files): Remove class dump here. + (FIRST_AUTO_NUMBERED_DUMP): Adjust. + * dumpfile.h (tree_dump_index): Remove TDI_class. + * langhooks-def.h (lhd_register_dumps): Declare. + (LANG_HOOKS_REGISTER_DUMPS): Define. + (LANG_HOOKS_INITIALIZER): Add it. + * langhooks.c (lhd_register_dumps): Define. + * langhooks.h (struct lang_hooks): Add register_dumps. + +2017-05-19 Nathan Sidwell + * context.h (context::set_passes): New. * context.c (context::context): Do not create pass manager. * toplev.c (general_init): Create pass manager here. diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 4ce70e4..5a842bd 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2017-05-19 Nathan Sidwell + + * c-opts.c (class_dump_file, class_dump_flags): Delete. + (c_common_parse_file): Remove class dump handling. + (get_dump_info): Likewise. + 2017-05-19 Richard Biener PR c++/80593 diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index d294c37..be4478f 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -102,8 +102,6 @@ static size_t include_cursor; /* Dump files/flags to use during parsing. */ static FILE *original_dump_file = NULL; static dump_flags_t original_dump_flags; -static FILE *class_dump_file = NULL; -static dump_flags_t class_dump_flags; /* Whether any standard preincluded header has been preincluded. */ static bool done_preinclude; @@ -1098,10 +1096,9 @@ c_common_parse_file (void) for (;;) { c_finish_options (); - /* Open the dump files to use for the original and class dump output + /* Open the dump file to use for the original dump output here, to be used during parsing for the current file. */ original_dump_file = dump_begin (TDI_original, &original_dump_flags); - class_dump_file = dump_begin (TDI_class, &class_dump_flags); pch_init (); push_file_scope (); c_parse_file (); @@ -1120,11 +1117,6 @@ c_common_parse_file (void) dump_end (TDI_original, original_dump_file); original_dump_file = NULL; } - if (class_dump_file) - { - dump_end (TDI_class, class_dump_file); - class_dump_file = NULL; - } /* If an input file is missing, abandon further compilation. cpplib has issued a diagnostic. */ if (!this_input_filename) @@ -1135,20 +1127,14 @@ c_common_parse_file (void) } /* Returns the appropriate dump file for PHASE to dump with FLAGS. */ + FILE * get_dump_info (int phase, dump_flags_t *flags) { - gcc_assert (phase == TDI_original || phase == TDI_class); - if (phase == TDI_original) - { - *flags = original_dump_flags; - return original_dump_file; - } - else - { - *flags = class_dump_flags; - return class_dump_file; - } + gcc_assert (phase == TDI_original); + + *flags = original_dump_flags; + return original_dump_file; } /* Common finish hook for the C, ObjC and C++ front ends. */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e903bfd..09c8269 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2017-05-19 Nathan Sidwell + + * class.c (class_dump_id): Define. + (dump_class_hierarchy, dump_vtable, dump_vtt): Use it. + * cp-objcp-common.c (cp_register_dumps): New. + * cp-objcp-common.h (cp_register_dumps): Declare. + (LANG_HOOKS_REGISTER_DUMPS): Override. + * cp-tree.h (class_dump_id): Declare. + 2017-05-18 Nathan Sidwell * cp-tree.h (OVL_ARG_DEPENDENT): Delete. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 6f3f3e6..c0eb945 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -37,6 +37,9 @@ along with GCC; see the file COPYING3. If not see #include "gimplify.h" #include "intl.h" +/* Id for dumping the class hierarchy. */ +int class_dump_id; + /* The number of nested classes being processed. If we are not in the scope of any class, this is zero. */ @@ -8914,11 +8917,10 @@ static void dump_class_hierarchy (tree t) { dump_flags_t flags; - FILE *stream = get_dump_info (TDI_class, &flags); - - if (stream) + if (FILE *stream = dump_begin (class_dump_id, &flags)) { dump_class_hierarchy_1 (stream, flags, t); + dump_end (class_dump_id, stream); } } @@ -8948,7 +8950,7 @@ static void dump_vtable (tree t, tree binfo, tree vtable) { dump_flags_t flags; - FILE *stream = get_dump_info (TDI_class, &flags); + FILE *stream = dump_begin (class_dump_id, &flags); if (!stream) return; @@ -8971,13 +8973,15 @@ dump_vtable (tree t, tree binfo, tree vtable) dump_array (stream, vtable); fprintf (stream, "\n"); } + + dump_end (class_dump_id, stream); } static void dump_vtt (tree t, tree vtt) { dump_flags_t flags; - FILE *stream = get_dump_info (TDI_class, &flags); + FILE *stream = dump_begin (class_dump_id, &flags); if (!stream) return; @@ -8989,6 +8993,8 @@ dump_vtt (tree t, tree vtt) dump_array (stream, vtt); fprintf (stream, "\n"); } + + dump_end (class_dump_id, stream); } /* Dump a function or thunk and its thunkees. */ diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c index 8627978..40e9ccb 100644 --- a/gcc/cp/cp-objcp-common.c +++ b/gcc/cp/cp-objcp-common.c @@ -352,6 +352,15 @@ cp_pushdecl (tree decl) return pushdecl (decl); } +/* Register c++-specific dumps. */ + +void +cp_register_dumps (gcc::dump_manager *dumps) +{ + class_dump_id = dumps->dump_register + (".class", "lang-class", "lang-class", DK_lang, OPTGROUP_NONE, false); +} + void cp_common_init_ts (void) { diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h index 0d752a7..10fcdf3 100644 --- a/gcc/cp/cp-objcp-common.h +++ b/gcc/cp/cp-objcp-common.h @@ -33,6 +33,7 @@ extern void cp_common_init_ts (void); extern tree cp_unit_size_without_reusable_padding (tree); extern tree cp_get_global_decls (); extern tree cp_pushdecl (tree); +extern void cp_register_dumps (gcc::dump_manager *); /* Lang hooks that are shared between C++ and ObjC++ are defined here. Hooks specific to C++ or ObjC++ go in cp/cp-lang.c and objcp/objcp-lang.c, @@ -56,6 +57,8 @@ extern tree cp_pushdecl (tree); #define LANG_HOOKS_INIT_OPTIONS c_common_init_options #undef LANG_HOOKS_INITIALIZE_DIAGNOSTICS #define LANG_HOOKS_INITIALIZE_DIAGNOSTICS cxx_initialize_diagnostics +#undef LANG_HOOKS_REGISTER_DUMPS +#define LANG_HOOKS_REGISTER_DUMPS cp_register_dumps #undef LANG_HOOKS_HANDLE_OPTION #define LANG_HOOKS_HANDLE_OPTION c_common_handle_option #undef LANG_HOOKS_HANDLE_FILENAME diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 82bb965..e9e4b00 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5749,6 +5749,9 @@ concept_template_p (tree t) e.g "int f(void)". */ extern cp_parameter_declarator *no_parameters; +/* Various dump ids. */ +extern int class_dump_id; + /* in call.c */ extern bool check_dtor_name (tree, tree); int magic_varargs_p (tree); diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 715830a..4b7304e 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -544,6 +544,9 @@ Objective-C and Objective-C++ Dialects}. -fdump-final-insns@r{[}=@var{file}@r{]} -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline @gol -fdump-lang-all @gol +-fdump-lang-@var{switch} @gol +-fdump-lang-@var{switch}-@var{options} @gol +-fdump-lang-@var{switch}-@var{options}=@var{filename} @gol -fdump-passes @gol -fdump-rtl-@var{pass} -fdump-rtl-@var{pass}=@var{filename} @gol -fdump-statistics @gol @@ -12940,16 +12943,6 @@ When doing debugging dumps (see @option{-d} option above), suppress instruction numbers for the links to the previous and next instructions in a sequence. -@item -fdump-class-hierarchy @r{(C++ only)} -@itemx -fdump-class-hierarchy-@var{options} @r{(C++ only)} -@opindex fdump-class-hierarchy -Dump a representation of each class's hierarchy and virtual function -table layout to a file. The file name is made by appending -@file{.class} to the source file name, and the file is created in the -same directory as the output file. If the @samp{-@var{options}} form -is used, @var{options} controls the details of the dump as described -for the @option{-fdump-tree} options. - @item -fdump-ipa-@var{switch} @opindex fdump-ipa Control the dumping at various stages of inter-procedural analysis @@ -12972,8 +12965,26 @@ Dump after function inlining. @end table @item -fdump-lang-all +@itemx -fdump-lang-@var{switch} +@itemx -fdump-lang-@var{switch}-@var{options} +@itemx -fdump-lang-@var{switch}-@var{options}=@var{filename} @opindex fdump-lang-all -Control the dumping of language-specific information. +@opindex fdump-lang +Control the dumping of language-specific information. The @var{options} +and @var{filename} portions behave as described in the +`@option{-fdump-tree} option. The following @var{switch} values are +accepted: + +@table @samp +@item all + +Enable all language-specific dumps. + +@item class +Dump class hierarchy information. Virtual table information is emitted +unless '@option{slim}' is specified. This option is applicable to C++ only. + +@end table @item -fdump-passes @opindex fdump-passes diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c index d5a0e70..45e47b2 100644 --- a/gcc/dumpfile.c +++ b/gcc/dumpfile.c @@ -74,11 +74,10 @@ static struct dump_file_info dump_files[TDI_end] = dump_file_info (".type-inheritance", "ipa-type-inheritance", DK_ipa, 0), dump_file_info (".ipa-clones", "ipa-clones", DK_ipa, 0), dump_file_info (".tu", "translation-unit", DK_lang, 1), - dump_file_info (".class", "class-hierarchy", DK_lang, 2), 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 6 +#define FIRST_AUTO_NUMBERED_DUMP 4 dump_file_info (NULL, "lang-all", DK_lang, 0), dump_file_info (NULL, "tree-all", DK_tree, 0), diff --git a/gcc/dumpfile.h b/gcc/dumpfile.h index bec2fa2..1f7c8de 100644 --- a/gcc/dumpfile.h +++ b/gcc/dumpfile.h @@ -31,7 +31,6 @@ enum tree_dump_index TDI_inheritance, /* dump type inheritance graph. */ TDI_clones, /* dump IPA cloning decisions. */ TDI_tu, /* dump the whole translation unit. */ - TDI_class, /* dump class hierarchy. */ TDI_original, /* dump each function before optimizing it */ TDI_generic, /* dump each function after genericizing it */ TDI_nested, /* dump each function after unnesting it */ diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h index eb68084..ea2006c 100644 --- a/gcc/langhooks-def.h +++ b/gcc/langhooks-def.h @@ -39,6 +39,7 @@ extern void lhd_do_nothing (void); extern void lhd_do_nothing_t (tree); extern void lhd_do_nothing_f (struct function *); extern tree lhd_pass_through_t (tree); +extern void lhd_register_dumps (gcc::dump_manager *); extern bool lhd_post_options (const char **); extern alias_set_type lhd_get_alias_set (tree); extern tree lhd_return_null_tree (tree); @@ -97,6 +98,7 @@ extern int lhd_type_dwarf_attribute (const_tree, int); #define LANG_HOOKS_INIT_OPTIONS_STRUCT hook_void_gcc_optionsp #define LANG_HOOKS_INIT_OPTIONS lhd_init_options #define LANG_HOOKS_INITIALIZE_DIAGNOSTICS lhd_initialize_diagnostics +#define LANG_HOOKS_REGISTER_DUMPS lhd_register_dumps #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P lhd_complain_wrong_lang_p #define LANG_HOOKS_HANDLE_OPTION lhd_handle_option #define LANG_HOOKS_POST_OPTIONS lhd_post_options @@ -294,6 +296,7 @@ extern void lhd_end_section (void); LANG_HOOKS_INIT_OPTIONS_STRUCT, \ LANG_HOOKS_INIT_OPTIONS, \ LANG_HOOKS_INITIALIZE_DIAGNOSTICS, \ + LANG_HOOKS_REGISTER_DUMPS, \ LANG_HOOKS_COMPLAIN_WRONG_LANG_P, \ LANG_HOOKS_HANDLE_OPTION, \ LANG_HOOKS_POST_OPTIONS, \ diff --git a/gcc/langhooks.c b/gcc/langhooks.c index dc19db7..c54b790 100644 --- a/gcc/langhooks.c +++ b/gcc/langhooks.c @@ -322,6 +322,12 @@ lhd_initialize_diagnostics (diagnostic_context *ctx ATTRIBUTE_UNUSED) { } +/* Called to register dumps. */ +void +lhd_register_dumps (gcc::dump_manager *) +{ +} + /* Called to perform language-specific options initialization. */ void lhd_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED, diff --git a/gcc/langhooks.h b/gcc/langhooks.h index 2a2ef8a..b2f0f92 100644 --- a/gcc/langhooks.h +++ b/gcc/langhooks.h @@ -326,6 +326,9 @@ struct lang_hooks global diagnostic context structure. */ void (*initialize_diagnostics) (diagnostic_context *); + /* Register language-specific dumps. */ + void (*register_dumps) (gcc::dump_manager *); + /* Return true if a warning should be given about option OPTION, which is for the wrong language, false if it should be quietly ignored. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 01319bd..5f0fe80 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-05-19 Nathan Sidwell + + * g++.dg/inherit/covariant7.C: Adjust. + 2017-05-19 Prakhar Bahuguna * gcc.target/arm/tls-disable-literal-pool.c: Change diff --git a/gcc/testsuite/g++.dg/inherit/covariant7.C b/gcc/testsuite/g++.dg/inherit/covariant7.C index b8c5c8e..73663bd 100644 --- a/gcc/testsuite/g++.dg/inherit/covariant7.C +++ b/gcc/testsuite/g++.dg/inherit/covariant7.C @@ -1,6 +1,6 @@ // { dg-do compile } // { dg-prune-output "direct base" } -// { dg-options "-fdump-class-hierarchy" } +// { dg-options "-fdump-lang-class" } // Copyright (C) 2002 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 27 Dec 2002 diff --git a/gcc/toplev.c b/gcc/toplev.c index 814193a..425315c 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1158,6 +1158,10 @@ general_init (const char *argv0, bool init_signals) dump manager. */ g = new gcc::context (); + /* Allow languages to register their dumps before the optimization + passes. */ + lang_hooks.register_dumps (g->get_dumps ()); + /* Create the passes. */ g->set_passes (new gcc::pass_manager (g)); -- 2.7.4