mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-12 12:16:04 +08:00
94aeb44b00
This makes exception handling more efficient in a few spots, through the use of const- and rvalue-references. I wrote this patch by commenting out the gdb_exception copy constructor and then examining the resulting error messages one by one, introducing the use of std::move where appropriate. gdb/ChangeLog 2019-04-25 Tom Tromey <tromey@adacore.com> * xml-support.c (struct gdb_xml_parser) <set_error>: Take an rvalue reference. (gdb_xml_start_element_wrapper, gdb_xml_end_element_wrapper) (gdb_xml_parser::parse): Use std::move. * python/python-internal.h (gdbpy_convert_exception): Take a const reference. * python/py-value.c (valpy_getitem, valpy_nonzero): Use std::move. * python/py-utils.c (gdbpy_convert_exception): Take a const reference. * python/py-inferior.c (infpy_write_memory, infpy_search_memory): Use std::move. * python/py-breakpoint.c (bppy_set_condition, bppy_set_commands): Use std::move. * mi/mi-main.c (mi_print_exception): Take a const reference. * main.c (handle_command_errors): Take a const reference. * linespec.c (parse_linespec): Use std::move. * infcall.c (run_inferior_call): Use std::move. (call_function_by_hand_dummy): Use std::move. * exec.c (try_open_exec_file): Use std::move. * exceptions.h (exception_print, exception_fprintf) (exception_print_same): Update. * exceptions.c (print_exception, exception_print) (exception_fprintf, exception_print_same): Change parameters to const reference. * event-top.c (gdb_rl_callback_read_char_wrapper): Update. * common/new-op.c: Use std::move. * common/common-exceptions.h (struct gdb_exception): Add move constructor. (struct gdb_exception_error, struct gdb_exception_quit, struct gdb_quit_bad_alloc): Change constructor to move constructor. (throw_exception): Change parameter to rvalue reference. * common/common-exceptions.c (throw_exception): Take rvalue reference. * cli/cli-interp.c (safe_execute_command): Use std::move. * breakpoint.c (insert_bp_location, location_to_sals): Use std::move.
96 lines
2.9 KiB
C
96 lines
2.9 KiB
C
/* Replace operator new/new[], for GDB, the GNU debugger.
|
|
|
|
Copyright (C) 2016-2019 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
/* GCC does not understand __has_feature. */
|
|
#if !defined(__has_feature)
|
|
# define __has_feature(x) 0
|
|
#endif
|
|
|
|
#if !__has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__)
|
|
#include "common-defs.h"
|
|
#include "host-defs.h"
|
|
#include <new>
|
|
|
|
/* Override operator new / operator new[], in order to internal_error
|
|
on allocation failure and thus query the user for abort/core
|
|
dump/continue, just like xmalloc does. We don't do this from a
|
|
new-handler function instead (std::set_new_handler) because we want
|
|
to catch allocation errors from within global constructors too.
|
|
|
|
Skip overriding if building with -fsanitize=address though.
|
|
Address sanitizer wants to override operator new/delete too in
|
|
order to detect malloc+delete and new+free mismatches. Our
|
|
versions would mask out ASan's, with the result of losing that
|
|
useful mismatch detection.
|
|
|
|
Note that C++ implementations could either have their throw
|
|
versions call the nothrow versions (libstdc++), or the other way
|
|
around (clang/libc++). For that reason, we replace both throw and
|
|
nothrow variants and call malloc directly. */
|
|
|
|
void *
|
|
operator new (std::size_t sz)
|
|
{
|
|
/* malloc (0) is unpredictable; avoid it. */
|
|
if (sz == 0)
|
|
sz = 1;
|
|
|
|
void *p = malloc (sz); /* ARI: malloc */
|
|
if (p == NULL)
|
|
{
|
|
/* If the user decides to continue debugging, throw a
|
|
gdb_quit_bad_alloc exception instead of a regular QUIT
|
|
gdb_exception. The former extends both std::bad_alloc and a
|
|
QUIT gdb_exception. This is necessary because operator new
|
|
can only ever throw std::bad_alloc, or something that extends
|
|
it. */
|
|
try
|
|
{
|
|
malloc_failure (sz);
|
|
}
|
|
catch (gdb_exception &ex)
|
|
{
|
|
throw gdb_quit_bad_alloc (std::move (ex));
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
|
|
void *
|
|
operator new (std::size_t sz, const std::nothrow_t&) noexcept
|
|
{
|
|
/* malloc (0) is unpredictable; avoid it. */
|
|
if (sz == 0)
|
|
sz = 1;
|
|
return malloc (sz); /* ARI: malloc */
|
|
}
|
|
|
|
void *
|
|
operator new[] (std::size_t sz)
|
|
{
|
|
return ::operator new (sz);
|
|
}
|
|
|
|
void*
|
|
operator new[] (std::size_t sz, const std::nothrow_t&) noexcept
|
|
{
|
|
return ::operator new (sz, std::nothrow);
|
|
}
|
|
#endif
|