Make SJLJ exceptions more efficient

This changes the SJLJ exception handling code to be a bit more
efficient, by using rvalue references and move assignment when
possible.

Tested by the buildbot.

gdb/ChangeLog
2019-04-25  Tom Tromey  <tromey@adacore.com>

	* event-top.c (gdb_rl_callback_read_char_wrapper_noexcept)
	(gdb_rl_callback_handler): Use std::move.
	* common/common-exceptions.h (struct gdb_exception): Add move
	assignment operator.
	(throw_exception_sjlj): Change "exception" to const reference.
	* common/common-exceptions.c (exceptions_state_mc_catch): Update.
	(throw_exception_sjlj): Change "exception" to const reference.
This commit is contained in:
Tom Tromey 2019-04-23 07:29:49 -06:00
parent cc06b66897
commit c6fdd8b205
4 changed files with 19 additions and 6 deletions

View File

@ -1,3 +1,13 @@
2019-04-25 Tom Tromey <tromey@adacore.com>
* event-top.c (gdb_rl_callback_read_char_wrapper_noexcept)
(gdb_rl_callback_handler): Use std::move.
* common/common-exceptions.h (struct gdb_exception): Add move
assignment operator.
(throw_exception_sjlj): Change "exception" to const reference.
* common/common-exceptions.c (exceptions_state_mc_catch): Update.
(throw_exception_sjlj): Change "exception" to const reference.
2019-04-25 Tom Tromey <tromey@adacore.com>
* xml-support.c (gdb_xml_parser::gdb_xml_parser): Update.

View File

@ -166,14 +166,15 @@ exceptions_state_mc_action_iter_1 (void)
/* Return EXCEPTION to the nearest containing CATCH_SJLJ block. */
void
throw_exception_sjlj (struct gdb_exception exception)
throw_exception_sjlj (const struct gdb_exception &exception)
{
/* Jump to the nearest CATCH_SJLJ block, communicating REASON to
that call via setjmp's return value. Note that REASON can't be
zero, by definition in common-exceptions.h. */
exceptions_state_mc (CATCH_THROWING);
enum return_reason reason = exception.reason;
catchers.front ().exception = exception;
longjmp (catchers.front ().buf, exception.reason);
longjmp (catchers.front ().buf, reason);
}
/* Implementation of throw_exception that uses C++ try/catch. */

View File

@ -152,6 +152,8 @@ struct gdb_exception
return *this;
}
gdb_exception &operator= (gdb_exception &&other) noexcept = default;
/* Return the contents of the exception message, as a C string. The
string remains owned by the exception object. */
const char *what () const noexcept
@ -281,7 +283,7 @@ extern void throw_exception (const gdb_exception &exception)
containing exception handler established using TRY_SJLJ. Necessary
in some cases where we need to throw GDB exceptions across
third-party library code (e.g., readline). */
extern void throw_exception_sjlj (struct gdb_exception exception)
extern void throw_exception_sjlj (const struct gdb_exception &exception)
ATTRIBUTE_NORETURN;
/* Convenience wrappers around throw_exception that throw GDB

View File

@ -178,7 +178,7 @@ gdb_rl_callback_read_char_wrapper_noexcept () noexcept
}
CATCH_SJLJ (ex, RETURN_MASK_ALL)
{
gdb_expt = ex;
gdb_expt = std::move (ex);
}
END_CATCH_SJLJ
@ -212,9 +212,9 @@ gdb_rl_callback_handler (char *rl) noexcept
{
ui->input_handler (gdb::unique_xmalloc_ptr<char> (rl));
}
catch (const gdb_exception &ex)
catch (gdb_exception &ex)
{
gdb_rl_expt = ex;
gdb_rl_expt = std::move (ex);
}
/* If we caught a GDB exception, longjmp out of the readline