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> 2019-04-25 Tom Tromey <tromey@adacore.com>
* xml-support.c (gdb_xml_parser::gdb_xml_parser): Update. * 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. */ /* Return EXCEPTION to the nearest containing CATCH_SJLJ block. */
void 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 /* Jump to the nearest CATCH_SJLJ block, communicating REASON to
that call via setjmp's return value. Note that REASON can't be that call via setjmp's return value. Note that REASON can't be
zero, by definition in common-exceptions.h. */ zero, by definition in common-exceptions.h. */
exceptions_state_mc (CATCH_THROWING); exceptions_state_mc (CATCH_THROWING);
enum return_reason reason = exception.reason;
catchers.front ().exception = exception; catchers.front ().exception = exception;
longjmp (catchers.front ().buf, exception.reason); longjmp (catchers.front ().buf, reason);
} }
/* Implementation of throw_exception that uses C++ try/catch. */ /* Implementation of throw_exception that uses C++ try/catch. */

View File

@ -152,6 +152,8 @@ struct gdb_exception
return *this; return *this;
} }
gdb_exception &operator= (gdb_exception &&other) noexcept = default;
/* Return the contents of the exception message, as a C string. The /* Return the contents of the exception message, as a C string. The
string remains owned by the exception object. */ string remains owned by the exception object. */
const char *what () const noexcept 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 containing exception handler established using TRY_SJLJ. Necessary
in some cases where we need to throw GDB exceptions across in some cases where we need to throw GDB exceptions across
third-party library code (e.g., readline). */ 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; ATTRIBUTE_NORETURN;
/* Convenience wrappers around throw_exception that throw GDB /* 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) CATCH_SJLJ (ex, RETURN_MASK_ALL)
{ {
gdb_expt = ex; gdb_expt = std::move (ex);
} }
END_CATCH_SJLJ END_CATCH_SJLJ
@ -212,9 +212,9 @@ gdb_rl_callback_handler (char *rl) noexcept
{ {
ui->input_handler (gdb::unique_xmalloc_ptr<char> (rl)); 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 /* If we caught a GDB exception, longjmp out of the readline