diff options
author | David Malcolm <dmalcolm@redhat.com> | 2018-11-19 16:42:03 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2018-11-19 16:42:03 +0000 |
commit | c95c552804da90c830941111706e623106a7728a (patch) | |
tree | 42bd6ec09491b80d40c3f59d6bfbf4458b5abe5b /gcc/dumpfile.c | |
parent | 8d1af516844f94784d9a3a7ffc59f9ab3daa1f5d (diff) | |
download | gcc-c95c552804da90c830941111706e623106a7728a.zip gcc-c95c552804da90c830941111706e623106a7728a.tar.gz gcc-c95c552804da90c830941111706e623106a7728a.tar.bz2 |
Fix -fsave-optimization-record ICE (PR tree-optimization/87025)
PR tree-optimization/87025 reports an ICE within
-fsave-optimization-record's optrecord_json_writer.
The issue is that dump_context::begin_scope creates an optinfo
of kind OPTINFO_KIND_SCOPE, but fails to call
dump_context::end_any_optinfo, so the optinfo for the scope remains
pending.
The JSON writer would normally push a JSON array for the "scope" optinfo
when the latter is emitted. However, if a dump_* call happens that
doesn't flush the "scope" optinfo e.g. dump_printf (as opposed to
dump_printf_loc), that dump_ call is added to the pending optinfo, and
optinfo::handle_dump_file_kind changes the pending optinfo's m_kind
(e.g. to OPTINFO_KIND_NOTE). Hence when the pending optinfo is
eventually emitted, it isn't OPTINFO_KIND_SCOPE anymore, and hence
the JSON writer doesn't create and push a JSON array for it, leading
to dump_context's view of scopes getting out-of-sync with that of
the JSON writer's.
Later, dump_context::end_scope unconditionally tries to pop the JSON scope
array, but no JSON scope array was added, leading to an assertion
failure (or crash).
The fix is to call dump_context::end_any_optinfo immediately after
creating the scope optinfo, so that it is emitted immediately, ensuring
that the JSON writer stays in-sync with the dump_context.
gcc/ChangeLog:
PR tree-optimization/87025
* dumpfile.c (dump_context::begin_scope): Call end_any_optinfo
immediately after creating the scope optinfo.
(selftest::test_pr87025): New function.
(selftest::dumpfile_c_tests): Call it.
* optinfo-emit-json.cc (optrecord_json_writer::pop_scope): Assert
that we're not popping the top-level records array.
* optinfo.cc (optinfo::handle_dump_file_kind): Assert that we're
not changing the kind of a "scope" optinfo.
gcc/testsuite/ChangeLog:
PR tree-optimization/87025
* gcc.dg/pr87025.c: New test.
From-SVN: r266280
Diffstat (limited to 'gcc/dumpfile.c')
-rw-r--r-- | gcc/dumpfile.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c index 014acf1..e125650 100644 --- a/gcc/dumpfile.c +++ b/gcc/dumpfile.c @@ -1131,6 +1131,7 @@ dump_context::begin_scope (const char *name, const dump_location_t &loc) optinfo &info = begin_next_optinfo (loc); info.m_kind = OPTINFO_KIND_SCOPE; info.add_item (item); + end_any_optinfo (); } else delete item; @@ -2575,6 +2576,20 @@ test_capture_of_dump_calls (const line_table_case &case_) } } +static void +test_pr87025 () +{ + dump_user_location_t loc + = dump_user_location_t::from_location_t (UNKNOWN_LOCATION); + + temp_dump_context tmp (true, true, + MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING); + { + AUTO_DUMP_SCOPE ("outer scope", loc); + dump_printf (MSG_NOTE, "msg1\n"); + } +} + /* Run all of the selftests within this file. */ void @@ -2582,6 +2597,7 @@ dumpfile_c_tests () { test_impl_location (); for_each_line_table_case (test_capture_of_dump_calls); + test_pr87025 (); } } // namespace selftest |