/* Target dependent code for GDB on TI C6x systems.
- Copyright (C) 2010-2018 Free Software Foundation, Inc.
+ Copyright (C) 2010-2021 Free Software Foundation, Inc.
Contributed by Andrew Jenner <andrew@codesourcery.com>
Contributed by Yao Qi <yao@codesourcery.com>
#include "frame-unwind.h"
#include "frame-base.h"
#include "trad-frame.h"
-#include "dwarf2-frame.h"
+#include "dwarf2/frame.h"
#include "symtab.h"
#include "inferior.h"
#include "gdbtypes.h"
return extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
}
-/* This is the implementation of gdbarch method unwind_sp. */
-
-static CORE_ADDR
-tic6x_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame)
-{
- return frame_unwind_register_unsigned (this_frame, TIC6X_SP_REGNUM);
-}
-
-
/* Frame base handling. */
static struct tic6x_unwind_cache*
static const struct frame_unwind tic6x_frame_unwind =
{
+ "tic6x prologue",
NORMAL_FRAME,
default_frame_unwind_stop_reason,
tic6x_frame_this_id,
static const struct frame_unwind tic6x_stub_unwind =
{
+ "tic6x stub",
NORMAL_FRAME,
default_frame_unwind_stop_reason,
tic6x_stub_this_id,
if (type != NULL)
{
type = check_typedef (type);
- if (language_pass_by_reference (type))
+ if (!(language_pass_by_reference (type).trivially_copyable))
return RETURN_VALUE_STRUCT_CONVENTION;
}
}
return RETURN_VALUE_REGISTER_CONVENTION;
}
-/* This is the implementation of gdbarch method dummy_id. */
-
-static struct frame_id
-tic6x_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
-{
- return frame_id_build
- (get_frame_register_unsigned (this_frame, TIC6X_SP_REGNUM),
- get_frame_pc (this_frame));
-}
-
/* Get the alignment requirement of TYPE. */
static int
tic6x_arg_type_alignment (struct type *type)
{
int len = TYPE_LENGTH (check_typedef (type));
- enum type_code typecode = TYPE_CODE (check_typedef (type));
+ enum type_code typecode = check_typedef (type)->code ();
if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
{
/* Determine the type of this function. */
func_type = check_typedef (func_type);
- if (TYPE_CODE (func_type) == TYPE_CODE_PTR)
+ if (func_type->code () == TYPE_CODE_PTR)
func_type = check_typedef (TYPE_TARGET_TYPE (func_type));
- gdb_assert (TYPE_CODE (func_type) == TYPE_CODE_FUNC
- || TYPE_CODE (func_type) == TYPE_CODE_METHOD);
+ gdb_assert (func_type->code () == TYPE_CODE_FUNC
+ || func_type->code () == TYPE_CODE_METHOD);
/* For a variadic C function, the last explicitly declared argument and all
remaining arguments are passed on the stack. */
- if (TYPE_VARARGS (func_type))
- first_arg_on_stack = TYPE_NFIELDS (func_type) - 1;
+ if (func_type->has_varargs ())
+ first_arg_on_stack = func_type->num_fields () - 1;
/* Now make space on the stack for the args. */
for (argnum = 0; argnum < nargs; argnum++)
struct value *arg = args[argnum];
struct type *arg_type = check_typedef (value_type (arg));
int len = TYPE_LENGTH (arg_type);
- enum type_code typecode = TYPE_CODE (arg_type);
+ enum type_code typecode = arg_type->code ();
val = value_contents (arg);
/* Copy the argument to general registers or the stack in
- register-sized pieces. */
+ register-sized pieces. */
if (argreg < first_arg_on_stack)
{
if (len <= 4)
|| typecode == TYPE_CODE_UNION)
{
/* For a 5-8 byte structure or union in big-endian, the
- first byte occupies byte 3 (the MSB) of the upper (odd)
- register and the remaining bytes fill the decreasingly
- significant bytes. 5-7 byte structures or unions have
- padding in the LSBs of the lower (even) register. */
+ first byte occupies byte 3 (the MSB) of the upper (odd)
+ register and the remaining bytes fill the decreasingly
+ significant bytes. 5-7 byte structures or unions have
+ padding in the LSBs of the lower (even) register. */
if (byte_order == BFD_ENDIAN_BIG)
{
regcache->cooked_write (arg_regs[argreg] + 1, val);
else
{
/* The argument is being passed by value in a pair of
- registers. */
+ registers. */
ULONGEST regval = extract_unsigned_integer (val, len,
byte_order);
{
struct gdbarch *gdbarch;
struct gdbarch_tdep *tdep;
- struct tdesc_arch_data *tdesc_data = NULL;
+ tdesc_arch_data_up tdesc_data;
const struct target_desc *tdesc = info.target_desc;
int has_gp = 0;
valid_p = 1;
for (i = 0; i < 32; i++) /* A0 - A15, B0 - B15 */
- valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
+ valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
tic6x_register_names[i]);
/* CSR */
- valid_p &= tdesc_numbered_register (feature, tdesc_data, i++,
+ valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i++,
tic6x_register_names[TIC6X_CSR_REGNUM]);
- valid_p &= tdesc_numbered_register (feature, tdesc_data, i++,
+ valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i++,
tic6x_register_names[TIC6X_PC_REGNUM]);
if (!valid_p)
- {
- tdesc_data_cleanup (tdesc_data);
- return NULL;
- }
+ return NULL;
feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.gp");
if (feature)
has_gp = 1;
valid_p = 1;
for (j = 0; j < 32; j++) /* A16 - A31, B16 - B31 */
- valid_p &= tdesc_numbered_register (feature, tdesc_data, i++,
- gp[j]);
+ valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
+ i++, gp[j]);
if (!valid_p)
- {
- tdesc_data_cleanup (tdesc_data);
- return NULL;
- }
+ return NULL;
}
feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.c6xp");
if (feature)
{
- valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "TSR");
- valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "ILC");
- valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "RILC");
+ valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
+ i++, "TSR");
+ valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
+ i++, "ILC");
+ valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
+ i++, "RILC");
if (!valid_p)
- {
- tdesc_data_cleanup (tdesc_data);
- return NULL;
- }
+ return NULL;
}
}
tic6x_sw_breakpoint_from_kind);
set_gdbarch_unwind_pc (gdbarch, tic6x_unwind_pc);
- set_gdbarch_unwind_sp (gdbarch, tic6x_unwind_sp);
/* Unwinding. */
dwarf2_append_unwinders (gdbarch);
set_gdbarch_return_value (gdbarch, tic6x_return_value);
- set_gdbarch_dummy_id (gdbarch, tic6x_dummy_id);
-
/* Enable inferior call support. */
set_gdbarch_push_dummy_call (gdbarch, tic6x_push_dummy_call);
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
- if (tdesc_data)
- tdesc_use_registers (gdbarch, tdesc, tdesc_data);
+ if (tdesc_data != nullptr)
+ tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
return gdbarch;
}
+void _initialize_tic6x_tdep ();
void
-_initialize_tic6x_tdep (void)
+_initialize_tic6x_tdep ()
{
register_gdbarch_init (bfd_arch_tic6x, tic6x_gdbarch_init);
}