diff options
author | David Malcolm <dmalcolm@redhat.com> | 2018-10-04 14:33:47 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2018-10-04 14:33:47 +0000 |
commit | 5d98e5a6bc715cc865b9110ff0255572ac22570d (patch) | |
tree | 7f7ee75a6d43b65b14261ebf6740d5d18c39f684 /gcc/dumpfile.h | |
parent | c19bc1a0832c01c0162aaba829b24609f60bba91 (diff) | |
download | gcc-5d98e5a6bc715cc865b9110ff0255572ac22570d.zip gcc-5d98e5a6bc715cc865b9110ff0255572ac22570d.tar.gz gcc-5d98e5a6bc715cc865b9110ff0255572ac22570d.tar.bz2 |
Fix -fopt-info for plugin passes
Attempts to dump via -fopt-info from a plugin pass fail, due
to the dfi->alt_state for such passes never being set.
This is because the -fopt-info options were being set up per-pass
during option-parsing (via gcc::dump_manager::opt_info_enable_passes),
but this data was not retained or used it for passes created later
(for plugins and target-specific passes).
This patch fixes the issue by storing the -fopt-info options into
gcc::dump_manager, refactoring the dfi-setup code out of
opt_info_enable_passes, and reusing it for such passes, fixing the
issue. The patch adds a demo plugin to test that dumping from a
plugin works.
gcc/ChangeLog:
* dumpfile.c (gcc::dump_manager::dump_manager): Initialize new
fields.
(gcc::dump_manager::~dump_manager): Free m_optinfo_filename.
(gcc::dump_manager::register_pass): New member function, adapted
from loop body in gcc::pass_manager::register_pass, adding a
call to update_dfi_for_opt_info.
(gcc::dump_manager::opt_info_enable_passes): Store the
-fopt-info options into the new fields. Move the loop
bodies into...
(gcc::dump_manager::update_dfi_for_opt_info): ...this new member
function.
* dumpfile.h (struct opt_pass): New forward decl.
(gcc::dump_manager::register_pass): New decl.
(gcc::dump_manager::update_dfi_for_opt_info): New decl.
(class gcc::dump_manager): Add fields "m_optgroup_flags",
"m_optinfo_flags", and "m_optinfo_filename".
* passes.c (gcc::pass_manager::register_pass): Move all of the
dump-handling code to gcc::dump_manager::register_pass.
gcc/testsuite/ChangeLog:
* gcc.dg/plugin/dump-1.c: New test.
* gcc.dg/plugin/dump_plugin.c: New test plugin.
* gcc.dg/plugin/plugin.exp (plugin_test_list): Add the above.
From-SVN: r264844
Diffstat (limited to 'gcc/dumpfile.h')
-rw-r--r-- | gcc/dumpfile.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/dumpfile.h b/gcc/dumpfile.h index 671b7b9..057ca46 100644 --- a/gcc/dumpfile.h +++ b/gcc/dumpfile.h @@ -566,6 +566,8 @@ extern void dump_combine_total_stats (FILE *); /* In cfghooks.c */ extern void dump_bb (FILE *, basic_block, int, dump_flags_t); +struct opt_pass; + namespace gcc { /* A class for managing all of the various dump files used by the @@ -634,6 +636,8 @@ public: const char * dump_flag_name (int phase) const; + void register_pass (opt_pass *pass); + private: int @@ -649,6 +653,8 @@ private: opt_info_enable_passes (optgroup_flags_t optgroup_flags, dump_flags_t flags, const char *filename); + bool update_dfi_for_opt_info (dump_file_info *dfi) const; + private: /* Dynamically registered dump files and switches. */ @@ -657,6 +663,12 @@ private: size_t m_extra_dump_files_in_use; size_t m_extra_dump_files_alloced; + /* Stored values from -fopt-info, for handling passes created after + option-parsing (by backends and by plugins). */ + optgroup_flags_t m_optgroup_flags; + dump_flags_t m_optinfo_flags; + char *m_optinfo_filename; + /* Grant access to dump_enable_all. */ friend bool ::enable_rtl_dump_file (void); |