/* Target-dependent code for the NDS32 architecture, for GDB.
- Copyright (C) 2013-2019 Free Software Foundation, Inc.
+ Copyright (C) 2013-2021 Free Software Foundation, Inc.
Contributed by Andes Technology Corporation.
This file is part of GDB.
#include "dis-asm.h"
#include "user-regs.h"
#include "elf-bfd.h"
-#include "dwarf2-frame.h"
+#include "dwarf2/frame.h"
#include "remote.h"
#include "target-descriptions.h"
NULL,
nds32_epilogue_frame_sniffer
};
-\f
-/* Implement the "dummy_id" gdbarch method. */
-
-static struct frame_id
-nds32_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
-{
- CORE_ADDR sp = get_frame_register_unsigned (this_frame, NDS32_SP_REGNUM);
-
- return frame_id_build (sp, get_frame_pc (this_frame));
-}
-
-/* Implement the "unwind_pc" gdbarch method. */
-
-static CORE_ADDR
-nds32_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
-{
- return frame_unwind_register_unsigned (next_frame, NDS32_PC_REGNUM);
-}
-/* Implement the "unwind_sp" gdbarch method. */
-
-static CORE_ADDR
-nds32_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
-{
- return frame_unwind_register_unsigned (next_frame, NDS32_SP_REGNUM);
-}
\f
/* Floating type and struct type that has only one floating type member
can pass value using FPU registers (when FPU ABI is used). */
while (1)
{
t = check_typedef (t);
- typecode = TYPE_CODE (t);
+ typecode = t->code ();
if (typecode != TYPE_CODE_STRUCT)
break;
- else if (TYPE_NFIELDS (t) != 1)
+ else if (t->num_fields () != 1)
return 0;
else
- t = TYPE_FIELD_TYPE (t, 0);
+ t = t->field (0).type ();
}
return typecode == TYPE_CODE_FLT;
For ABI2FP+, the caller pushes only named arguments in registers
and pushes all unnamed arguments in stack. */
- if (abi_use_fpr && TYPE_VARARGS (func_type)
- && i >= TYPE_NFIELDS (func_type))
+ if (abi_use_fpr && func_type->has_varargs ()
+ && i >= func_type->num_fields ())
goto use_stack;
/* Try to use FPRs to pass arguments only when
struct gdbarch *gdbarch;
struct gdbarch_tdep *tdep;
struct gdbarch_list *best_arch;
- struct tdesc_arch_data *tdesc_data = NULL;
+ tdesc_arch_data_up tdesc_data;
const struct target_desc *tdesc = info.target_desc;
int elf_abi = E_NDS_ABI_AABI;
int fpu_freg = -1;
tdesc_data = tdesc_data_alloc ();
- if (!nds32_validate_tdesc_p (tdesc, tdesc_data, &fpu_freg, &use_pseudo_fsrs))
- {
- tdesc_data_cleanup (tdesc_data);
- return NULL;
- }
+ if (!nds32_validate_tdesc_p (tdesc, tdesc_data.get (), &fpu_freg,
+ &use_pseudo_fsrs))
+ return NULL;
/* Allocate space for the new architecture. */
tdep = XCNEW (struct gdbarch_tdep);
num_regs = NDS32_NUM_REGS + num_fdr_map[fpu_freg] + num_fsr_map[fpu_freg];
set_gdbarch_num_regs (gdbarch, num_regs);
- tdesc_use_registers (gdbarch, tdesc, tdesc_data);
+ tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
/* Cache the register number of fs0. */
if (fpu_freg != -1)
nds32_add_reggroups (gdbarch);
/* Hook in ABI-specific overrides, if they have been registered. */
- info.tdesc_data = tdesc_data;
+ info.tdesc_data = tdesc_data.get ();
gdbarch_init_osabi (info, gdbarch);
/* Override tdesc_register callbacks for system registers. */
set_gdbarch_sp_regnum (gdbarch, NDS32_SP_REGNUM);
set_gdbarch_pc_regnum (gdbarch, NDS32_PC_REGNUM);
- set_gdbarch_unwind_sp (gdbarch, nds32_unwind_sp);
- set_gdbarch_unwind_pc (gdbarch, nds32_unwind_pc);
set_gdbarch_stack_frame_destroyed_p (gdbarch, nds32_stack_frame_destroyed_p);
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, nds32_dwarf2_reg_to_regnum);
set_gdbarch_push_dummy_call (gdbarch, nds32_push_dummy_call);
set_gdbarch_return_value (gdbarch, nds32_return_value);
- set_gdbarch_dummy_id (gdbarch, nds32_dummy_id);
set_gdbarch_skip_prologue (gdbarch, nds32_skip_prologue);
set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
return gdbarch;
}
+void _initialize_nds32_tdep ();
void
-_initialize_nds32_tdep (void)
+_initialize_nds32_tdep ()
{
/* Initialize gdbarch. */
register_gdbarch_init (bfd_arch_nds32, nds32_gdbarch_init);