aboutsummaryrefslogtreecommitdiff
path: root/gcc/dumpfile.c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2018-11-19 16:31:03 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2018-11-19 16:31:03 +0000
commit8d1af516844f94784d9a3a7ffc59f9ab3daa1f5d (patch)
treec32e504ef3de3abf09e0126e75c2712a7de83e6e /gcc/dumpfile.c
parent4fea820523334138d7165f20333ef30ba8e01c1d (diff)
downloadgcc-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.c55
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 ();