/* Dynamic architecture support for GDB, the GNU debugger.
- Copyright (C) 1998-2020 Free Software Foundation, Inc.
+ Copyright (C) 1998-2021 Free Software Foundation, Inc.
This file is part of GDB.
#include "dis-asm.h"
-int
-default_displaced_step_hw_singlestep (struct gdbarch *gdbarch,
- struct displaced_step_closure *closure)
+bool
+default_displaced_step_hw_singlestep (struct gdbarch *gdbarch)
{
return !gdbarch_software_single_step_p (gdbarch);
}
return LEGACY_SIM_REGNO_IGNORE;
}
+
+/* See arch-utils.h */
+
+std::string
+default_memtag_to_string (struct gdbarch *gdbarch, struct value *tag)
+{
+ error (_("This architecture has no method to convert a memory tag to"
+ " a string."));
+}
+
+/* See arch-utils.h */
+
+bool
+default_tagged_address_p (struct gdbarch *gdbarch, struct value *address)
+{
+ /* By default, assume the address is untagged. */
+ return false;
+}
+
+/* See arch-utils.h */
+
+bool
+default_memtag_matches_p (struct gdbarch *gdbarch, struct value *address)
+{
+ /* By default, assume the tags match. */
+ return true;
+}
+
+/* See arch-utils.h */
+
+bool
+default_set_memtags (struct gdbarch *gdbarch, struct value *address,
+ size_t length, const gdb::byte_vector &tags,
+ memtag_type tag_type)
+{
+ /* By default, return true (successful); */
+ return true;
+}
+
+/* See arch-utils.h */
+
+struct value *
+default_get_memtag (struct gdbarch *gdbarch, struct value *address,
+ memtag_type tag_type)
+{
+ /* By default, return no tag. */
+ return nullptr;
+}
+
CORE_ADDR
generic_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
{
*frame_regnum = gdbarch_deprecated_fp_regnum (gdbarch);
else if (gdbarch_sp_regnum (gdbarch) >= 0
&& gdbarch_sp_regnum (gdbarch)
- < gdbarch_num_regs (gdbarch))
+ < gdbarch_num_regs (gdbarch))
*frame_regnum = gdbarch_sp_regnum (gdbarch);
else
/* Should this be an internal error? I guess so, it is reflecting
{
const struct floatformat **format = NULL;
- if (len == gdbarch_half_bit (gdbarch))
+ /* Check if this is a bfloat16 type. It has the same size as the
+ IEEE half float type, so we use the base type name to tell them
+ apart. */
+ if (name != nullptr && strcmp (name, "__bf16") == 0
+ && len == gdbarch_bfloat16_bit (gdbarch))
+ format = gdbarch_bfloat16_format (gdbarch);
+ else if (len == gdbarch_half_bit (gdbarch))
format = gdbarch_half_format (gdbarch);
else if (len == gdbarch_float_bit (gdbarch))
format = gdbarch_float_format (gdbarch);
if (target_byte_order_user == BFD_ENDIAN_UNKNOWN)
if (gdbarch_byte_order (get_current_arch ()) == BFD_ENDIAN_BIG)
fprintf_unfiltered (file, _("The target endianness is set automatically "
- "(currently big endian)\n"));
+ "(currently big endian).\n"));
else
fprintf_unfiltered (file, _("The target endianness is set automatically "
- "(currently little endian)\n"));
+ "(currently little endian).\n"));
else
if (target_byte_order_user == BFD_ENDIAN_BIG)
fprintf_unfiltered (file,
- _("The target is assumed to be big endian\n"));
+ _("The target is set to big endian.\n"));
else
fprintf_unfiltered (file,
- _("The target is assumed to be little endian\n"));
+ _("The target is set to little endian.\n"));
}
static void
struct cmd_list_element *c, const char *value)
{
if (target_architecture_user == NULL)
- fprintf_filtered (file, _("The target architecture is set "
- "automatically (currently %s)\n"),
+ fprintf_filtered (file, _("The target architecture is set to "
+ "\"auto\" (currently \"%s\").\n"),
gdbarch_bfd_arch_info (get_current_arch ())->printable_name);
else
- fprintf_filtered (file, _("The target architecture is assumed to be %s\n"),
+ fprintf_filtered (file, _("The target architecture is set to \"%s\".\n"),
set_architecture_string);
}
/* Check for the current file. */
if (info.abfd == NULL)
- info.abfd = exec_bfd;
+ info.abfd = current_program_space->exec_bfd ();
if (info.abfd == NULL)
info.abfd = core_bfd;
return 0;
}
+/* See arch-utils.h. */
+
+bool
+default_program_breakpoint_here_p (struct gdbarch *gdbarch,
+ CORE_ADDR address)
+{
+ int len;
+ const gdb_byte *bpoint = gdbarch_breakpoint_from_pc (gdbarch, &address, &len);
+
+ /* Software breakpoints unsupported? */
+ if (bpoint == nullptr)
+ return false;
+
+ gdb_byte *target_mem = (gdb_byte *) alloca (len);
+
+ /* Enable the automatic memory restoration from breakpoints while
+ we read the memory. Otherwise we may find temporary breakpoints, ones
+ inserted by GDB, and flag them as permanent breakpoints. */
+ scoped_restore restore_memory
+ = make_scoped_restore_show_memory_breakpoints (0);
+
+ if (target_read_memory (address, target_mem, len) == 0)
+ {
+ /* Check if this is a breakpoint instruction for this architecture,
+ including ones used by GDB. */
+ if (memcmp (target_mem, bpoint, len) == 0)
+ return true;
+ }
+
+ return false;
+}
+
void
default_skip_permanent_breakpoint (struct regcache *regcache)
{
return gdbarch_bfd_arch_info (gdbarch)->arch_name;
}
-/* Default method for gdbarch_addressable_memory_unit_size. By default, a memory byte has
- a size of 1 octet. */
+/* Default method for gdbarch_addressable_memory_unit_size. The default is
+ based on the bits_per_byte defined in the bfd library for the current
+ architecture, this is usually 8-bits, and so this function will usually
+ return 1 indicating 1 byte is 1 octet. */
int
default_addressable_memory_unit_size (struct gdbarch *gdbarch)
{
- return 1;
+ return gdbarch_bfd_arch_info (gdbarch)->bits_per_byte / 8;
}
void
disassembler_ftype disassemble_fn;
disassemble_fn = disassembler (info->arch, info->endian == BFD_ENDIAN_BIG,
- info->mach, exec_bfd);
+ info->mach, current_program_space->exec_bfd ());
gdb_assert (disassemble_fn != NULL);
return (*disassemble_fn) (memaddr, info);
return "";
}
+/* See arch-utils.h. */
+void
+default_read_core_file_mappings (struct gdbarch *gdbarch,
+ struct bfd *cbfd,
+ gdb::function_view<void (ULONGEST count)>
+ pre_loop_cb,
+ gdb::function_view<void (int num,
+ ULONGEST start,
+ ULONGEST end,
+ ULONGEST file_ofs,
+ const char *filename)>
+ loop_cb)
+{
+}
+
void _initialize_gdbarch_utils ();
void
_initialize_gdbarch_utils ()