mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-30 12:44:10 +08:00
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:
parent
cc06b66897
commit
c6fdd8b205
@ -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.
|
||||||
|
@ -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. */
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user