/* Target-dependent code for the Fujitsu FR-V, for GDB, the GNU Debugger.
- Copyright (C) 2002-2022 Free Software Foundation, Inc.
+ Copyright (C) 2002-2023 Free Software Foundation, Inc.
This file is part of GDB.
#include "trad-frame.h"
#include "dis-asm.h"
#include "sim-regno.h"
-#include "gdb/sim-frv.h"
-#include "opcodes/frv-desc.h" /* for the H_SPR_... enums */
+#include "sim/sim-frv.h"
#include "symtab.h"
#include "elf-bfd.h"
#include "elf/frv.h"
#include "objfiles.h"
#include "gdbarch.h"
+/* Make cgen names unique to prevent ODR conflicts with other targets. */
+#define GDB_CGEN_REMAP_PREFIX frv
+#include "cgen-remap.h"
+#include "opcodes/frv-desc.h"
+
struct frv_unwind_cache /* was struct frame_extra_info */
{
/* The previous frame's inner-most stack address. Used as this
const char **register_names = nullptr;
};
+using frv_gdbarch_tdep_up = std::unique_ptr<frv_gdbarch_tdep>;
+
/* Return the FR-V ABI associated with GDBARCH. */
enum frv_abi
frv_abi (struct gdbarch *gdbarch)
/* Allocate a new variant structure, and set up default values for all
the fields. */
-static frv_gdbarch_tdep *
-new_variant (void)
+static frv_gdbarch_tdep_up
+new_variant ()
{
int r;
- frv_gdbarch_tdep *var = new frv_gdbarch_tdep;
+ frv_gdbarch_tdep_up var (new frv_gdbarch_tdep);
var->frv_abi = FRV_ABI_EABI;
var->num_gprs = 64;
static const char *
frv_register_name (struct gdbarch *gdbarch, int reg)
{
- if (reg < 0)
- return "?toosmall?";
-
- if (reg >= frv_num_regs + frv_num_pseudo_regs)
- return "?toolarge?";
-
frv_gdbarch_tdep *tdep = gdbarch_tdep<frv_gdbarch_tdep> (gdbarch);
return tdep->register_names[reg];
}
return SIM_FRV_SPR0_REGNUM + spr_reg_offset;
}
- internal_error (__FILE__, __LINE__, _("Bad register number %d"), reg);
+ internal_error (_("Bad register number %d"), reg);
}
constexpr gdb_byte frv_break_insn[] = {0xc0, 0x70, 0x00, 0x01};
prologue analysis. */
static CORE_ADDR
frv_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
- struct frame_info *this_frame,
+ frame_info_ptr this_frame,
struct frv_unwind_cache *info)
{
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
static struct frv_unwind_cache *
-frv_frame_unwind_cache (struct frame_info *this_frame,
+frv_frame_unwind_cache (frame_info_ptr this_frame,
void **this_prologue_cache)
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
{
struct gdbarch *gdbarch = regcache->arch ();
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
- int len = TYPE_LENGTH (type);
+ int len = type->length ();
if (len <= 4)
{
store_unsigned_integer ((bfd_byte *) valbuf + 4, 4, byte_order, regval);
}
else
- internal_error (__FILE__, __LINE__,
- _("Illegal return value length: %d"), len);
+ internal_error (_("Illegal return value length: %d"), len);
}
static CORE_ADDR
stack_space = 0;
for (argnum = 0; argnum < nargs; ++argnum)
- stack_space += align_up (TYPE_LENGTH (value_type (args[argnum])), 4);
+ stack_space += align_up (args[argnum]->type ()->length (), 4);
stack_space -= (6 * 4);
if (stack_space > 0)
for (argnum = 0; argnum < nargs; ++argnum)
{
arg = args[argnum];
- arg_type = check_typedef (value_type (arg));
- len = TYPE_LENGTH (arg_type);
+ arg_type = check_typedef (arg->type ());
+ len = arg_type->length ();
typecode = arg_type->code ();
if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
{
store_unsigned_integer (valbuf, 4, byte_order,
- value_address (arg));
+ arg->address ());
typecode = TYPE_CODE_PTR;
len = 4;
val = valbuf;
else if (abi == FRV_ABI_FDPIC
&& len == 4
&& typecode == TYPE_CODE_PTR
- && TYPE_TARGET_TYPE (arg_type)->code () == TYPE_CODE_FUNC)
+ && arg_type->target_type ()->code () == TYPE_CODE_FUNC)
{
/* The FDPIC ABI requires function descriptors to be passed instead
of entry points. */
CORE_ADDR addr = extract_unsigned_integer
- (value_contents (arg).data (), 4, byte_order);
+ (arg->contents ().data (), 4, byte_order);
addr = find_func_descr (gdbarch, addr);
store_unsigned_integer (valbuf, 4, byte_order, addr);
typecode = TYPE_CODE_PTR;
}
else
{
- val = value_contents (arg).data ();
+ val = arg->contents ().data ();
}
while (len > 0)
frv_store_return_value (struct type *type, struct regcache *regcache,
const gdb_byte *valbuf)
{
- int len = TYPE_LENGTH (type);
+ int len = type->length ();
if (len <= 4)
{
regcache->cooked_write (9, (bfd_byte *) valbuf + 4);
}
else
- internal_error (__FILE__, __LINE__,
- _("Don't know how to return a %d-byte value."), len);
+ internal_error (_("Don't know how to return a %d-byte value."), len);
}
static enum return_value_convention
frame. This will be used to create a new GDB frame struct. */
static void
-frv_frame_this_id (struct frame_info *this_frame,
+frv_frame_this_id (frame_info_ptr this_frame,
void **this_prologue_cache, struct frame_id *this_id)
{
struct frv_unwind_cache *info
}
static struct value *
-frv_frame_prev_register (struct frame_info *this_frame,
+frv_frame_prev_register (frame_info_ptr this_frame,
void **this_prologue_cache, int regnum)
{
struct frv_unwind_cache *info
};
static CORE_ADDR
-frv_frame_base_address (struct frame_info *this_frame, void **this_cache)
+frv_frame_base_address (frame_info_ptr this_frame, void **this_cache)
{
struct frv_unwind_cache *info
= frv_frame_unwind_cache (this_frame, this_cache);
static struct gdbarch *
frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
{
- struct gdbarch *gdbarch;
int elf_flags = 0;
/* Check to see if we've already built an appropriate architecture
return arches->gdbarch;
/* Select the right tdep structure for this variant. */
- frv_gdbarch_tdep *var = new_variant ();
+ gdbarch *gdbarch = gdbarch_alloc (&info, new_variant ());
+ frv_gdbarch_tdep *var = gdbarch_tdep<frv_gdbarch_tdep> (gdbarch);
+
switch (info.bfd_arch_info->mach)
{
case bfd_mach_frv:
if (elf_flags & EF_FRV_CPU_FR450)
set_variant_scratch_registers (var);
- gdbarch = gdbarch_alloc (&info, var);
-
set_gdbarch_short_bit (gdbarch, 16);
set_gdbarch_int_bit (gdbarch, 32);
set_gdbarch_long_bit (gdbarch, 32);
set_gdbarch_convert_from_func_ptr_addr (gdbarch,
frv_convert_from_func_ptr_addr);
- set_solib_ops (gdbarch, &frv_so_ops);
+ set_gdbarch_so_ops (gdbarch, &frv_so_ops);
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
void
_initialize_frv_tdep ()
{
- register_gdbarch_init (bfd_arch_frv, frv_gdbarch_init);
+ gdbarch_register (bfd_arch_frv, frv_gdbarch_init);
}