X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fnds32-tdep.c;h=f85485618538f27831d675120fb0d6c0f7d5cc6a;hb=7124770976d3f051532faf864013b76ab36249bf;hp=d3481e2000bb78d52bad6fecf54d901a3c42a38c;hpb=ecbc06d2a687f369da7c304201c9f2cbfed80ec6;p=binutils-gdb.git diff --git a/gdb/nds32-tdep.c b/gdb/nds32-tdep.c index d3481e2000b..f8548561853 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-2019 Free Software Foundation, Inc. + Copyright (C) 2013-2022 Free Software Foundation, Inc. Contributed by Andes Technology Corporation. This file is part of GDB. @@ -34,7 +34,7 @@ #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" @@ -289,7 +289,7 @@ typedef BP_MANIPULATION (nds32_break_insn) nds32_breakpoint; static int nds32_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int num) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch); const int FSR = 38; const int FDR = FSR + 32; @@ -440,7 +440,7 @@ nds32_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache, int regnum, gdb_byte *buf) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch); gdb_byte reg_buf[8]; int offset, fdr_regnum; enum register_status status; @@ -479,7 +479,7 @@ nds32_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, int regnum, const gdb_byte *buf) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch); gdb_byte reg_buf[8]; int offset, fdr_regnum; @@ -616,7 +616,7 @@ static CORE_ADDR nds32_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR limit_pc, struct nds32_frame_cache *cache) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch); int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi); /* Current scanning status. */ int in_prologue_bb = 0; @@ -997,6 +997,7 @@ nds32_frame_prev_register (struct frame_info *this_frame, void **this_cache, static const struct frame_unwind nds32_frame_unwind = { + "nds32 prologue", NORMAL_FRAME, default_frame_unwind_stop_reason, nds32_frame_this_id, @@ -1176,7 +1177,7 @@ static int nds32_analyze_epilogue (struct gdbarch *gdbarch, CORE_ADDR pc, struct nds32_frame_cache *cache) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch); int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi); CORE_ADDR limit_pc; uint32_t insn, insn_len; @@ -1227,7 +1228,7 @@ nds32_analyze_epilogue (struct gdbarch *gdbarch, CORE_ADDR pc, static int nds32_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR addr) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch); int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi); int insn_type = INSN_NORMAL; int ret_found = 0; @@ -1380,6 +1381,7 @@ nds32_epilogue_frame_prev_register (struct frame_info *this_frame, static const struct frame_unwind nds32_epilogue_frame_unwind = { + "nds32 epilogue", NORMAL_FRAME, default_frame_unwind_stop_reason, nds32_epilogue_frame_this_id, @@ -1387,32 +1389,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). */ @@ -1427,13 +1404,13 @@ nds32_check_calling_use_fpr (struct type *type) 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; @@ -1455,7 +1432,7 @@ nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function, int i; ULONGEST regval; enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch); struct type *func_type = value_type (function); int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi); int abi_split = nds32_abi_split (tdep->elf_abi); @@ -1504,7 +1481,7 @@ nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function, calling_use_fpr = nds32_check_calling_use_fpr (type); len = TYPE_LENGTH (type); align = type_align (type); - val = value_contents (args[i]); + val = value_contents (args[i]).data (); /* The size of a composite type larger than 4 bytes will be rounded up to the nearest multiple of 4. */ @@ -1520,8 +1497,8 @@ nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function, 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 @@ -1683,7 +1660,7 @@ nds32_extract_return_value (struct gdbarch *gdbarch, struct type *type, struct regcache *regcache, gdb_byte *valbuf) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch); int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi); int calling_use_fpr; int len; @@ -1773,7 +1750,7 @@ nds32_store_return_value (struct gdbarch *gdbarch, struct type *type, struct regcache *regcache, const gdb_byte *valbuf) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + nds32_gdbarch_tdep *tdep = (nds32_gdbarch_tdep *) gdbarch_tdep (gdbarch); int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi); int calling_use_fpr; int len; @@ -1978,9 +1955,8 @@ static struct gdbarch * nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { 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; @@ -1996,7 +1972,8 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) best_arch != NULL; best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info)) { - struct gdbarch_tdep *idep = gdbarch_tdep (best_arch->gdbarch); + nds32_gdbarch_tdep *idep + = (nds32_gdbarch_tdep *) gdbarch_tdep (best_arch->gdbarch); if (idep->elf_abi != elf_abi) continue; @@ -2013,14 +1990,12 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) 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); + nds32_gdbarch_tdep *tdep = new nds32_gdbarch_tdep; tdep->fpu_freg = fpu_freg; tdep->use_pseudo_fsrs = use_pseudo_fsrs; tdep->fs0_regnum = -1; @@ -2047,7 +2022,7 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) 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) @@ -2086,7 +2061,7 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) 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. */ @@ -2094,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); @@ -2124,8 +2096,9 @@ nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) 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);