X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fnds32-tdep.c;h=8e126cb7a58f4b33851adb10bd97f213430d61df;hb=401e101e0274d401e90e50cd8280a9ff36006477;hp=14b091c0b5914df4048960e260b6390619736b46;hpb=10eaee5f56611ce5f92ccd305849c0cc6addd130;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/nds32-tdep.c b/gdb/nds32-tdep.c index 14b091c0b5..8e126cb7a5 100644 --- a/gdb/nds32-tdep.c +++ b/gdb/nds32-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the NDS32 architecture, for GDB. - Copyright (C) 2013-2018 Free Software Foundation, Inc. + Copyright (C) 2013-2019 Free Software Foundation, Inc. Contributed by Andes Technology Corporation. This file is part of GDB. @@ -1387,32 +1387,7 @@ static const struct frame_unwind nds32_epilogue_frame_unwind = NULL, nds32_epilogue_frame_sniffer }; - -/* 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); -} /* Floating type and struct type that has only one floating type member can pass value using FPU registers (when FPU ABI is used). */ @@ -1439,58 +1414,14 @@ nds32_check_calling_use_fpr (struct type *type) 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. */ @@ -1511,7 +1442,7 @@ nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* 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++; @@ -1521,7 +1452,7 @@ nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function, 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. */ @@ -1547,7 +1478,7 @@ nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function, 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 @@ -1587,13 +1518,11 @@ nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function, switch (len) { case 4: - regcache_cooked_write (regcache, - tdep->fs0_regnum + foff, val); + regcache->cooked_write (tdep->fs0_regnum + foff, val); foff++; break; case 8: - regcache_cooked_write (regcache, - NDS32_FD0_REGNUM + (foff >> 1), val); + regcache->cooked_write (NDS32_FD0_REGNUM + (foff >> 1), val); foff += 2; break; default: @@ -1740,9 +1669,9 @@ nds32_extract_return_value (struct gdbarch *gdbarch, struct type *type, if (abi_use_fpr && calling_use_fpr) { if (len == 4) - regcache_cooked_read (regcache, tdep->fs0_regnum, valbuf); + regcache->cooked_read (tdep->fs0_regnum, valbuf); else if (len == 8) - regcache_cooked_read (regcache, NDS32_FD0_REGNUM, valbuf); + regcache->cooked_read (NDS32_FD0_REGNUM, valbuf); else internal_error (__FILE__, __LINE__, _("Cannot extract return value of %d bytes " @@ -1788,7 +1717,7 @@ nds32_extract_return_value (struct gdbarch *gdbarch, struct type *type, } else if (len == 4) { - regcache_cooked_read (regcache, NDS32_R0_REGNUM, valbuf); + regcache->cooked_read (NDS32_R0_REGNUM, valbuf); } else if (len < 8) { @@ -1805,8 +1734,8 @@ nds32_extract_return_value (struct gdbarch *gdbarch, struct type *type, } else { - regcache_cooked_read (regcache, NDS32_R0_REGNUM, valbuf); - regcache_cooked_read (regcache, NDS32_R0_REGNUM + 1, valbuf + 4); + regcache->cooked_read (NDS32_R0_REGNUM, valbuf); + regcache->cooked_read (NDS32_R0_REGNUM + 1, valbuf + 4); } } } @@ -1830,9 +1759,9 @@ nds32_store_return_value (struct gdbarch *gdbarch, struct type *type, if (abi_use_fpr && calling_use_fpr) { if (len == 4) - regcache_cooked_write (regcache, tdep->fs0_regnum, valbuf); + regcache->cooked_write (tdep->fs0_regnum, valbuf); else if (len == 8) - regcache_cooked_write (regcache, NDS32_FD0_REGNUM, valbuf); + regcache->cooked_write (NDS32_FD0_REGNUM, valbuf); else internal_error (__FILE__, __LINE__, _("Cannot store return value of %d bytes " @@ -1849,7 +1778,7 @@ nds32_store_return_value (struct gdbarch *gdbarch, struct type *type, } else if (len == 4) { - regcache_cooked_write (regcache, NDS32_R0_REGNUM, valbuf); + regcache->cooked_write (NDS32_R0_REGNUM, valbuf); } else if (len < 8) { @@ -1867,8 +1796,8 @@ nds32_store_return_value (struct gdbarch *gdbarch, struct type *type, } else { - regcache_cooked_write (regcache, NDS32_R0_REGNUM, valbuf); - regcache_cooked_write (regcache, NDS32_R0_REGNUM + 1, valbuf + 4); + regcache->cooked_write (NDS32_R0_REGNUM, valbuf); + regcache->cooked_write (NDS32_R0_REGNUM + 1, valbuf + 4); } } } @@ -2101,7 +2030,7 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Add NDS32 register aliases. To avoid search in user register name space, user_reg_map_name_to_regnum is not used. */ - maxregs = (gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch)); + maxregs = gdbarch_num_cooked_regs (gdbarch); for (i = 0; i < ARRAY_SIZE (nds32_register_aliases); i++) { int regnum, j; @@ -2140,14 +2069,11 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) 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);