diff options
author | David Malcolm <dmalcolm@redhat.com> | 2018-11-19 16:31:03 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2018-11-19 16:31:03 +0000 |
commit | 8d1af516844f94784d9a3a7ffc59f9ab3daa1f5d (patch) | |
tree | c32e504ef3de3abf09e0126e75c2712a7de83e6e /gcc/dumpfile.c | |
parent | 4fea820523334138d7165f20333ef30ba8e01c1d (diff) | |
download | gcc-8d1af516844f94784d9a3a7ffc59f9ab3daa1f5d.zip gcc-8d1af516844f94784d9a3a7ffc59f9ab3daa1f5d.tar.gz gcc-8d1af516844f94784d9a3a7ffc59f9ab3daa1f5d.tar.bz2 |
Eliminate global state from -fsave-optimization-record
As work towards fixing PR tree-optimization/87025, this patch
eliminates global state from optinfo-emit-json.cc in favor
of adding an optional m_json_writer field to dump_context,
replacing the m_forcibly_enable_optinfo flag.
This allows for writing selftests for the interaction of the
JSON-building code with the dumpfile.c code.
In particular, the existing selftest that created optinfo
instances now exercise the JSON-building code (although no
JSON is actually written out).
The patch also simplifies the layering by replacing optinfo::emit ()
with dump_context::emit_optinfo, so that dump_context has
responsibility for keeping track of dump destinations.
gcc/ChangeLog:
PR tree-optimization/87025
* dump-context.h: Include "optinfo.h".
(class optrecord_json_writer): New forward decl.
(dump_context::forcibly_enable_optinfo_p): Delete.
(dump_context::optinfo_enabled_p): New member function.
(dump_context::optimization_records_enabled_p): New member
function.
(dump_context::set_json_writer): New member function.
(dump_context::emit_optinfo): New member function.
(dump_context::m_forcibly_enable_optinfo): Delete.
(dump_context::m_json_writer): New member data.
* dumpfile.c (dump_context::set_json_writer): New member function.
(dump_context::finish_any_json_writer): New member function.
(dump_context::end_scope): Replace call to
optimization_records_maybe_pop_dump_scope with call to
m_json_writer->pop_scope.
(dump_context::optinfo_enabled_p): New member function.
(dump_context::end_any_optinfo): Replace call to optinfo::emit with call
to dump_context::emit_optinfo.
(dump_context::emit_optinfo): New member function.
(temp_dump_context::temp_dump_context): Replace
m_forcibly_enable_optinfo with call to set_json_writer.
(temp_dump_context::~temp_dump_context): Clean up any json writer.
* optinfo-emit-json.cc (class optrecord_json_writer): Move to
optinfo-emit-json.h
(the_json_writer): Delete.
(optimization_records_start): Delete.
(optimization_records_finish): Delete.
(optimization_records_enabled_p): Delete, in favor of
dump_context::optimization_records_enabled_p.
(optimization_records_maybe_record_optinfo): Delete.
(optimization_records_maybe_pop_dump_scope): Delete.
* optinfo-emit-json.h: Include "json.h". Delete forward
decl of opt_pass.
(optimization_records_start): Delete.
(optimization_records_finish): Delete.
(optimization_records_enabled_p): Delete.
(optimization_records_maybe_record_optinfo): Delete.
(optimization_records_maybe_pop_dump_scope): Delete.
(class optrecord_json_writer): Move here from
optinfo-emit-json.cc.
* optinfo.cc (optinfo::emit_for_opt_problem): Replace call
to optinfo::emit with call to dump_context::emit_optinfo.
(optinfo::emit): Delete, in favor of dump_context::emit_optinfo.
(optinfo_enabled_p): Delete, in favor of
dump_context::optinfo_enabled_p.
(optinfo_wants_inlining_info_p): Update for conversion o
optimization_records_enabled_p to a member function of
dump_context.
* optinfo.h (optinfo_enabled_p): Delete, in favor of
dump_context::optinfo_enabled_p.
(optinfo::emit): Delete, in favor of dump_context::emit_optinfo.
* toplev.c: Include "dump-context.h".
(compile_file): Replace call to optimization_records_finish with
dump_context::finish_any_json_writer.
(do_compile): Replace call to optimization_records_start with
conditionally creating a optrecord_json_writer for the
dump_context.
From-SVN: r266279
Diffstat (limited to 'gcc/dumpfile.c')
-rw-r--r-- | gcc/dumpfile.c | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c index 86651df..014acf1 100644 --- a/gcc/dumpfile.c +++ b/gcc/dumpfile.c @@ -515,6 +515,28 @@ dump_context::~dump_context () delete m_pending; } +void +dump_context::set_json_writer (optrecord_json_writer *writer) +{ + delete m_json_writer; + m_json_writer = writer; +} + +/* Perform cleanup activity for -fsave-optimization-record. + Currently, the file is written out here in one go, before cleaning + up. */ + +void +dump_context::finish_any_json_writer () +{ + if (!m_json_writer) + return; + + m_json_writer->write (); + delete m_json_writer; + m_json_writer = NULL; +} + /* Update the "dumps_are_enabled" global; to be called whenever dump_file or alt_dump_file change, or when changing dump_context in selftests. */ @@ -1121,7 +1143,19 @@ dump_context::end_scope () { end_any_optinfo (); m_scope_depth--; - optimization_records_maybe_pop_dump_scope (); + + if (m_json_writer) + m_json_writer->pop_scope (); +} + +/* Should optinfo instances be created? + All creation of optinfos should be guarded by this predicate. + Return true if any optinfo destinations are active. */ + +bool +dump_context::optinfo_enabled_p () const +{ + return (optimization_records_enabled_p ()); } /* Return the optinfo currently being accumulated, creating one if @@ -1154,11 +1188,23 @@ void dump_context::end_any_optinfo () { if (m_pending) - m_pending->emit (); + emit_optinfo (m_pending); delete m_pending; m_pending = NULL; } +/* Emit the optinfo to all of the "non-immediate" destinations + (emission to "immediate" destinations is done by + dump_context::emit_item). */ + +void +dump_context::emit_optinfo (const optinfo *info) +{ + /* -fsave-optimization-record. */ + if (m_json_writer) + m_json_writer->add_record (info); +} + /* Emit ITEM to all item destinations (those that don't require consolidation into optinfo instances). */ @@ -2004,7 +2050,8 @@ temp_dump_context::temp_dump_context (bool forcibly_enable_optinfo, m_saved (&dump_context ().get ()) { dump_context::s_current = &m_context; - m_context.m_forcibly_enable_optinfo = forcibly_enable_optinfo; + if (forcibly_enable_optinfo) + m_context.set_json_writer (new optrecord_json_writer ()); /* Conditionally enable the test dump, so that we can verify both the dump_enabled_p and the !dump_enabled_p cases in selftests. */ if (forcibly_enable_dumping) @@ -2020,6 +2067,8 @@ temp_dump_context::temp_dump_context (bool forcibly_enable_optinfo, temp_dump_context::~temp_dump_context () { + m_context.set_json_writer (NULL); + dump_context::s_current = m_saved; dump_context::get ().refresh_dumps_are_enabled (); |