/* Target-dependent code for the NDS32 architecture, for GDB.
- Copyright (C) 2013-2018 Free Software Foundation, Inc.
+ Copyright (C) 2013-2020 Free Software Foundation, Inc.
Contributed by Andes Technology Corporation.
This file is part of GDB.
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). */
return typecode == TYPE_CODE_FLT;
}
-/* Return the alignment (in bytes) of the given type. */
-
-static int
-nds32_type_align (struct type *type)
-{
- int n;
- int align;
- int falign;
-
- type = check_typedef (type);
- switch (TYPE_CODE (type))
- {
- default:
- /* Should never happen. */
- internal_error (__FILE__, __LINE__, _("unknown type alignment"));
- return 4;
-
- case TYPE_CODE_PTR:
- case TYPE_CODE_ENUM:
- case TYPE_CODE_INT:
- case TYPE_CODE_FLT:
- case TYPE_CODE_SET:
- case TYPE_CODE_RANGE:
- case TYPE_CODE_REF:
- case TYPE_CODE_CHAR:
- case TYPE_CODE_BOOL:
- return TYPE_LENGTH (type);
-
- case TYPE_CODE_ARRAY:
- case TYPE_CODE_COMPLEX:
- return nds32_type_align (TYPE_TARGET_TYPE (type));
-
- case TYPE_CODE_STRUCT:
- case TYPE_CODE_UNION:
- align = 1;
- for (n = 0; n < TYPE_NFIELDS (type); n++)
- {
- falign = nds32_type_align (TYPE_FIELD_TYPE (type, n));
- if (falign > align)
- align = falign;
- }
- return align;
- }
-}
-
/* Implement the "push_dummy_call" gdbarch method. */
static CORE_ADDR
nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
struct regcache *regcache, CORE_ADDR bp_addr,
int nargs, struct value **args, CORE_ADDR sp,
- int struct_return, CORE_ADDR struct_addr)
+ function_call_return_method return_method,
+ CORE_ADDR struct_addr)
{
const int REND = 6; /* End for register offset. */
int goff = 0; /* Current gpr offset for argument. */
/* If STRUCT_RETURN is true, then the struct return address (in
STRUCT_ADDR) will consume the first argument-passing register.
Both adjust the register count and store that value. */
- if (struct_return)
+ if (return_method == return_method_struct)
{
regcache_cooked_write_unsigned (regcache, NDS32_R0_REGNUM, struct_addr);
goff++;
for (i = 0; i < nargs; i++)
{
struct type *type = value_type (args[i]);
- int align = nds32_type_align (type);
+ int align = type_align (type);
/* If align is zero, it may be an empty struct.
Just ignore the argument of empty struct. */
type = value_type (args[i]);
calling_use_fpr = nds32_check_calling_use_fpr (type);
len = TYPE_LENGTH (type);
- align = nds32_type_align (type);
+ align = type_align (type);
val = value_contents (args[i]);
/* The size of a composite type larger than 4 bytes will be rounded
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);