mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 06:45:56 +08:00
[gdb] Fix warning in foreach_arch selftests
When running the selftests, I run into: ... $ gdb -q -batch -ex "maint selftest" ... Running selftest execute_cfa_program::aarch64:ilp32. warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration of GDB. Attempting to continue with the default aarch64:ilp32 settings. ... and likewise for execute_cfa_program::i8086 and execute_cfa_program::ia64-elf32. The warning can easily be reproduced outside the selftests by doing: ... $ gdb -q -batch -ex "set arch aarch64:ilp32" ... and can be prevented by first doing "set osabi none". Fix the warning by setting osabi to none while doing selftests that iterate over all architectures. This causes a regression in the print_one_insn selftests for the ARC architecture. The problem is pre-existing, and can be demonstrated (already without this patch) using: ... $ gdb -q -batch -ex "set osabi none" -ex "maint selftest print_one_insn::A6" Running selftest print_one_insn::A6. Self test failed: Cannot access memory at address 0x0 Ran 1 unit tests, 1 failed $ ... For ARC, we use the generic case in print_one_insn_test, containing this code: ... int kind = gdbarch_breakpoint_kind_from_pc (gdbarch, &pc); ... insn = gdbarch_sw_breakpoint_from_kind (gdbarch, kind, &bplen); ... The problem is that with osabi linux we trigger: ... static int arc_linux_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr) { return trap_size; } ... but with osabi none: ... arc_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr) { size_t length_with_limm = gdb_insn_length (gdbarch, *pcptr); ... which needs access to memory, and will consequently fail. Fix this in print_one_insn_test, in the default case, by iterating over supported osabi's to makes sure we trigger arc_linux_breakpoint_kind_from_pc which will give us a usable instruction to disassemble. Tested on x86_64-linux.
This commit is contained in:
@ -101,12 +101,52 @@ print_one_insn_test (struct gdbarch *gdbarch)
|
||||
{
|
||||
/* Test disassemble breakpoint instruction. */
|
||||
CORE_ADDR pc = 0;
|
||||
int kind = gdbarch_breakpoint_kind_from_pc (gdbarch, &pc);
|
||||
int kind;
|
||||
int bplen;
|
||||
|
||||
insn = gdbarch_sw_breakpoint_from_kind (gdbarch, kind, &bplen);
|
||||
len = bplen;
|
||||
struct gdbarch_info info;
|
||||
info.bfd_arch_info = gdbarch_bfd_arch_info (gdbarch);
|
||||
|
||||
enum gdb_osabi it;
|
||||
bool found = false;
|
||||
for (it = GDB_OSABI_UNKNOWN; it != GDB_OSABI_INVALID;
|
||||
it = static_cast<enum gdb_osabi>(static_cast<int>(it) + 1))
|
||||
{
|
||||
if (it == GDB_OSABI_UNKNOWN)
|
||||
continue;
|
||||
|
||||
info.osabi = it;
|
||||
|
||||
if (it != GDB_OSABI_NONE)
|
||||
{
|
||||
if (!has_gdb_osabi_handler (info))
|
||||
/* Unsupported. Skip to prevent warnings like:
|
||||
A handler for the OS ABI <x> is not built into this
|
||||
configuration of GDB. Attempting to continue with the
|
||||
default <y> settings. */
|
||||
continue;
|
||||
}
|
||||
|
||||
gdbarch = gdbarch_find_by_info (info);
|
||||
SELF_CHECK (gdbarch != NULL);
|
||||
|
||||
try
|
||||
{
|
||||
kind = gdbarch_breakpoint_kind_from_pc (gdbarch, &pc);
|
||||
insn = gdbarch_sw_breakpoint_from_kind (gdbarch, kind, &bplen);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Assert that we have found an instruction to disassemble. */
|
||||
SELF_CHECK (found);
|
||||
|
||||
len = bplen;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
35
gdb/osabi.c
35
gdb/osabi.c
@ -332,9 +332,10 @@ can_run_code_for (const struct bfd_arch_info *a, const struct bfd_arch_info *b)
|
||||
return (a == b || a->compatible (a, b) == a);
|
||||
}
|
||||
|
||||
/* Return OS ABI handler for INFO. */
|
||||
|
||||
void
|
||||
gdbarch_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
static struct gdb_osabi_handler *
|
||||
gdbarch_osabi_handler (struct gdbarch_info info)
|
||||
{
|
||||
struct gdb_osabi_handler *handler;
|
||||
|
||||
@ -367,10 +368,32 @@ gdbarch_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
ISA"). BFD doesn't normally consider 32-bit and 64-bit
|
||||
"compatible" so it doesn't succeed. */
|
||||
if (can_run_code_for (info.bfd_arch_info, handler->arch_info))
|
||||
{
|
||||
(*handler->init_osabi) (info, gdbarch);
|
||||
return;
|
||||
}
|
||||
return handler;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/* See osabi.h. */
|
||||
|
||||
bool
|
||||
has_gdb_osabi_handler (struct gdbarch_info info)
|
||||
{
|
||||
return gdbarch_osabi_handler (info) != nullptr;
|
||||
}
|
||||
|
||||
void
|
||||
gdbarch_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
struct gdb_osabi_handler *handler;
|
||||
|
||||
gdb_assert (info.osabi != GDB_OSABI_UNKNOWN);
|
||||
handler = gdbarch_osabi_handler (info);
|
||||
|
||||
if (handler != nullptr)
|
||||
{
|
||||
(*handler->init_osabi) (info, gdbarch);
|
||||
return;
|
||||
}
|
||||
|
||||
if (info.osabi == GDB_OSABI_NONE)
|
||||
|
@ -74,6 +74,9 @@ enum gdb_osabi gdbarch_lookup_osabi (bfd *);
|
||||
string. */
|
||||
enum gdb_osabi osabi_from_tdesc_string (const char *text);
|
||||
|
||||
/* Return true if there's an OS ABI handler for INFO. */
|
||||
bool has_gdb_osabi_handler (struct gdbarch_info info);
|
||||
|
||||
/* Initialize the gdbarch for the specified OS ABI variant. */
|
||||
void gdbarch_init_osabi (struct gdbarch_info, struct gdbarch *);
|
||||
|
||||
|
@ -68,6 +68,7 @@ foreach_arch_test_generator (const std::string &name,
|
||||
{
|
||||
struct gdbarch_info info;
|
||||
info.bfd_arch_info = bfd_scan_arch (arch);
|
||||
info.osabi = GDB_OSABI_NONE;
|
||||
struct gdbarch *gdbarch = gdbarch_find_by_info (info);
|
||||
SELF_CHECK (gdbarch != NULL);
|
||||
function (gdbarch);
|
||||
|
Reference in New Issue
Block a user