X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Falpha-tdep.c;h=d0df72be3565af5eb1b391b8b5e58df09f62cba6;hb=ea764154c27a11619ba764a4c92f395ba5007234;hp=aabd202b1ccd02df6a2daf836d092ff71f1403e4;hpb=82ca895718becbd1be898a86e4a6d1217fa496c6;p=binutils-gdb.git diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c index aabd202b1cc..d0df72be356 100644 --- a/gdb/alpha-tdep.c +++ b/gdb/alpha-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the ALPHA architecture, for GDB, the GNU Debugger. - Copyright (C) 1993-2020 Free Software Foundation, Inc. + Copyright (C) 1993-2022 Free Software Foundation, Inc. This file is part of GDB. @@ -116,7 +116,7 @@ static int alpha_cannot_store_register (struct gdbarch *gdbarch, int regno) { return (regno == ALPHA_ZERO_REGNUM - || strlen (alpha_register_name (gdbarch, regno)) == 0); + || strlen (alpha_register_name (gdbarch, regno)) == 0); } static struct type * @@ -258,7 +258,7 @@ alpha_register_to_value (struct frame_info *frame, int regnum, /* Convert to VALTYPE. */ gdb_assert (TYPE_LENGTH (valtype) == 4); - alpha_sts (gdbarch, out, value_contents_all (value)); + alpha_sts (gdbarch, out, value_contents_all (value).data ()); release_value (value); return 1; @@ -327,7 +327,7 @@ alpha_push_dummy_call (struct gdbarch *gdbarch, struct value *function, struct type *arg_type = check_typedef (value_type (arg)); /* Cast argument to long if necessary as the compiler does it too. */ - switch (TYPE_CODE (arg_type)) + switch (arg_type->code ()) { case TYPE_CODE_INT: case TYPE_CODE_BOOL: @@ -365,7 +365,7 @@ alpha_push_dummy_call (struct gdbarch *gdbarch, struct value *function, sp = (sp & -16) - 16; /* Write the real data into the stack. */ - write_memory (sp, value_contents (arg), 16); + write_memory (sp, value_contents (arg).data (), 16); /* Construct the indirection. */ arg_type = lookup_pointer_type (arg_type); @@ -386,7 +386,7 @@ alpha_push_dummy_call (struct gdbarch *gdbarch, struct value *function, sp = (sp & -16) - 16; /* Write the real data into the stack. */ - write_memory (sp, value_contents (arg), 32); + write_memory (sp, value_contents (arg).data (), 32); /* Construct the indirection. */ arg_type = lookup_pointer_type (arg_type); @@ -400,7 +400,7 @@ alpha_push_dummy_call (struct gdbarch *gdbarch, struct value *function, m_arg->len = TYPE_LENGTH (arg_type); m_arg->offset = accumulate_size; accumulate_size = (accumulate_size + m_arg->len + 7) & ~7; - m_arg->contents = value_contents (arg); + m_arg->contents = value_contents (arg).data (); } /* Determine required argument register loads, loading an argument register @@ -478,7 +478,7 @@ alpha_extract_return_value (struct type *valtype, struct regcache *regcache, gdb_byte raw_buffer[ALPHA_REGISTER_SIZE]; ULONGEST l; - switch (TYPE_CODE (valtype)) + switch (valtype->code ()) { case TYPE_CODE_FLT: switch (TYPE_LENGTH (valtype)) @@ -546,7 +546,7 @@ alpha_store_return_value (struct type *valtype, struct regcache *regcache, gdb_byte raw_buffer[ALPHA_REGISTER_SIZE]; ULONGEST l; - switch (TYPE_CODE (valtype)) + switch (valtype->code ()) { case TYPE_CODE_FLT: switch (TYPE_LENGTH (valtype)) @@ -614,12 +614,13 @@ alpha_return_value (struct gdbarch *gdbarch, struct value *function, struct type *type, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf) { - enum type_code code = TYPE_CODE (type); + enum type_code code = type->code (); + alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch); if ((code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION || code == TYPE_CODE_ARRAY) - && gdbarch_tdep (gdbarch)->return_in_memory (type)) + && tdep->return_in_memory (type)) { if (readbuf) { @@ -850,7 +851,7 @@ static int alpha_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc) { struct gdbarch *gdbarch = get_frame_arch (frame); - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR jb_addr; gdb_byte raw_buffer[ALPHA_REGISTER_SIZE]; @@ -882,7 +883,6 @@ alpha_sigtramp_frame_unwind_cache (struct frame_info *this_frame, void **this_prologue_cache) { struct alpha_sigtramp_unwind_cache *info; - struct gdbarch_tdep *tdep; if (*this_prologue_cache) return (struct alpha_sigtramp_unwind_cache *) *this_prologue_cache; @@ -890,7 +890,8 @@ alpha_sigtramp_frame_unwind_cache (struct frame_info *this_frame, info = FRAME_OBSTACK_ZALLOC (struct alpha_sigtramp_unwind_cache); *this_prologue_cache = info; - tdep = gdbarch_tdep (get_frame_arch (this_frame)); + gdbarch *arch = get_frame_arch (this_frame); + alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (arch); info->sigcontext_addr = tdep->sigcontext_addr (this_frame); return info; @@ -903,7 +904,7 @@ static CORE_ADDR alpha_sigtramp_register_address (struct gdbarch *gdbarch, CORE_ADDR sigcontext_addr, int regnum) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch); if (regnum >= 0 && regnum < 32) return sigcontext_addr + tdep->sc_regs_offset + regnum * 8; @@ -924,7 +925,7 @@ alpha_sigtramp_frame_this_id (struct frame_info *this_frame, struct frame_id *this_id) { struct gdbarch *gdbarch = get_frame_arch (this_frame); - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch); struct alpha_sigtramp_unwind_cache *info = alpha_sigtramp_frame_unwind_cache (this_frame, this_prologue_cache); CORE_ADDR stack_addr, code_addr; @@ -974,7 +975,7 @@ alpha_sigtramp_frame_prev_register (struct frame_info *this_frame, addr = alpha_sigtramp_register_address (get_frame_arch (this_frame), info->sigcontext_addr, regnum); if (addr != 0) - return frame_unwind_got_memory (this_frame, regnum, addr); + return frame_unwind_got_memory (this_frame, regnum, addr); } /* This extra register may actually be in the sigcontext, but our @@ -986,8 +987,8 @@ alpha_sigtramp_frame_prev_register (struct frame_info *this_frame, static int alpha_sigtramp_frame_sniffer (const struct frame_unwind *self, - struct frame_info *this_frame, - void **this_prologue_cache) + struct frame_info *this_frame, + void **this_prologue_cache) { struct gdbarch *gdbarch = get_frame_arch (this_frame); CORE_ADDR pc = get_frame_pc (this_frame); @@ -999,20 +1000,24 @@ alpha_sigtramp_frame_sniffer (const struct frame_unwind *self, /* We shouldn't even bother to try if the OSABI didn't register a sigcontext_addr handler or pc_in_sigtramp handler. */ - if (gdbarch_tdep (gdbarch)->sigcontext_addr == NULL) + alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch); + if (tdep->sigcontext_addr == NULL) return 0; - if (gdbarch_tdep (gdbarch)->pc_in_sigtramp == NULL) + + if (tdep->pc_in_sigtramp == NULL) return 0; /* Otherwise we should be in a signal frame. */ find_pc_partial_function (pc, &name, NULL, NULL); - if (gdbarch_tdep (gdbarch)->pc_in_sigtramp (gdbarch, pc, name)) + if (tdep->pc_in_sigtramp (gdbarch, pc, name)) return 1; return 0; } -static const struct frame_unwind alpha_sigtramp_frame_unwind = { +static const struct frame_unwind alpha_sigtramp_frame_unwind = +{ + "alpha sigtramp", SIGTRAMP_FRAME, default_frame_unwind_stop_reason, alpha_sigtramp_frame_this_id, @@ -1036,7 +1041,7 @@ static int heuristic_fence_post = 0; static CORE_ADDR alpha_heuristic_proc_start (struct gdbarch *gdbarch, CORE_ADDR pc) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + alpha_gdbarch_tdep *tdep = (alpha_gdbarch_tdep *) gdbarch_tdep (gdbarch); CORE_ADDR last_non_nop = pc; CORE_ADDR fence = pc - heuristic_fence_post; CORE_ADDR orig_pc = pc; @@ -1118,7 +1123,7 @@ struct alpha_heuristic_unwind_cache { CORE_ADDR vfp; CORE_ADDR start_pc; - struct trad_frame_saved_reg *saved_regs; + trad_frame_saved_reg *saved_regs; int return_reg; }; @@ -1137,16 +1142,16 @@ alpha_heuristic_analyze_probing_loop (struct gdbarch *gdbarch, CORE_ADDR *pc, /* The following pattern is recognized as a probing loop: - lda REG_INDEX,NB_OF_ITERATIONS - lda REG_PROBE,(sp) + lda REG_INDEX,NB_OF_ITERATIONS + lda REG_PROBE,(sp) LOOP_START: - stq zero,(REG_PROBE) - subq REG_INDEX,0x1,REG_INDEX - lda REG_PROBE,(REG_PROBE) - bne REG_INDEX, LOOP_START + stq zero,(REG_PROBE) + subq REG_INDEX,0x1,REG_INDEX + lda REG_PROBE,(REG_PROBE) + bne REG_INDEX, LOOP_START - lda sp,(REG_PROBE) + lda sp,(REG_PROBE) If anything different is found, the function returns without changing PC and FRAME_SIZE. Otherwise, PC will point immediately @@ -1282,15 +1287,15 @@ alpha_heuristic_frame_unwind_cache (struct frame_info *this_frame, { reg = (word & 0x03e00000) >> 21; - /* Ignore this instruction if we have already encountered - an instruction saving the same register earlier in the - function code. The current instruction does not tell - us where the original value upon function entry is saved. - All it says is that the function we are scanning reused - that register for some computation of its own, and is now - saving its result. */ - if (trad_frame_addr_p(info->saved_regs, reg)) - continue; + /* Ignore this instruction if we have already encountered + an instruction saving the same register earlier in the + function code. The current instruction does not tell + us where the original value upon function entry is saved. + All it says is that the function we are scanning reused + that register for some computation of its own, and is now + saving its result. */ + if (info->saved_regs[reg].is_addr ()) + continue; if (reg == 31) continue; @@ -1305,7 +1310,7 @@ alpha_heuristic_frame_unwind_cache (struct frame_info *this_frame, pointer or not. */ /* Hack: temporarily add one, so that the offset is non-zero and we can tell which registers have save offsets below. */ - info->saved_regs[reg].addr = (word & 0xffff) + 1; + info->saved_regs[reg].set_addr ((word & 0xffff) + 1); /* Starting with OSF/1-3.2C, the system libraries are shipped without local symbols, but they still contain procedure @@ -1385,13 +1390,14 @@ alpha_heuristic_frame_unwind_cache (struct frame_info *this_frame, /* Convert offsets to absolute addresses. See above about adding one to the offsets to make all detected offsets non-zero. */ for (reg = 0; reg < ALPHA_NUM_REGS; ++reg) - if (trad_frame_addr_p(info->saved_regs, reg)) - info->saved_regs[reg].addr += val - 1; + if (info->saved_regs[reg].is_addr ()) + info->saved_regs[reg].set_addr (info->saved_regs[reg].addr () + + val - 1); /* The stack pointer of the previous frame is computed by popping the current stack frame. */ - if (!trad_frame_addr_p (info->saved_regs, ALPHA_SP_REGNUM)) - trad_frame_set_value (info->saved_regs, ALPHA_SP_REGNUM, info->vfp); + if (!info->saved_regs[ALPHA_SP_REGNUM].is_addr ()) + info->saved_regs[ALPHA_SP_REGNUM].set_value (info->vfp); return info; } @@ -1428,7 +1434,9 @@ alpha_heuristic_frame_prev_register (struct frame_info *this_frame, return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum); } -static const struct frame_unwind alpha_heuristic_frame_unwind = { +static const struct frame_unwind alpha_heuristic_frame_unwind = +{ + "alpha prologue", NORMAL_FRAME, default_frame_unwind_stop_reason, alpha_heuristic_frame_this_id, @@ -1601,7 +1609,7 @@ alpha_next_pc (struct regcache *regcache, CORE_ADDR pc) || op == 0x34) /* BSR */ { branch_taken: - offset = (insn & 0x001fffff); + offset = (insn & 0x001fffff); if (offset & 0x00100000) offset |= 0xffe00000; offset *= ALPHA_INSN_SIZE; @@ -1611,14 +1619,14 @@ alpha_next_pc (struct regcache *regcache, CORE_ADDR pc) /* Need to determine if branch is taken; read RA. */ regno = (insn >> 21) & 0x1f; switch (op) - { - case 0x31: /* FBEQ */ - case 0x36: /* FBGE */ - case 0x37: /* FBGT */ - case 0x33: /* FBLE */ - case 0x32: /* FBLT */ - case 0x35: /* FBNE */ - regno += gdbarch_fp0_regnum (gdbarch); + { + case 0x31: /* FBEQ */ + case 0x36: /* FBGE */ + case 0x37: /* FBGT */ + case 0x33: /* FBLE */ + case 0x32: /* FBLT */ + case 0x35: /* FBNE */ + regno += gdbarch_fp0_regnum (gdbarch); } rav = regcache_raw_get_signed (regcache, regno); @@ -1658,32 +1666,32 @@ alpha_next_pc (struct regcache *regcache, CORE_ADDR pc) goto branch_taken; break; - /* Floating point branches. */ - - case 0x31: /* FBEQ */ - if (fp_register_zero_p (rav)) - goto branch_taken; - break; - case 0x36: /* FBGE */ - if (fp_register_sign_bit (rav) == 0 || fp_register_zero_p (rav)) - goto branch_taken; - break; - case 0x37: /* FBGT */ - if (fp_register_sign_bit (rav) == 0 && ! fp_register_zero_p (rav)) - goto branch_taken; - break; - case 0x33: /* FBLE */ - if (fp_register_sign_bit (rav) == 1 || fp_register_zero_p (rav)) - goto branch_taken; - break; - case 0x32: /* FBLT */ - if (fp_register_sign_bit (rav) == 1 && ! fp_register_zero_p (rav)) - goto branch_taken; - break; - case 0x35: /* FBNE */ - if (! fp_register_zero_p (rav)) - goto branch_taken; - break; + /* Floating point branches. */ + + case 0x31: /* FBEQ */ + if (fp_register_zero_p (rav)) + goto branch_taken; + break; + case 0x36: /* FBGE */ + if (fp_register_sign_bit (rav) == 0 || fp_register_zero_p (rav)) + goto branch_taken; + break; + case 0x37: /* FBGT */ + if (fp_register_sign_bit (rav) == 0 && ! fp_register_zero_p (rav)) + goto branch_taken; + break; + case 0x33: /* FBLE */ + if (fp_register_sign_bit (rav) == 1 || fp_register_zero_p (rav)) + goto branch_taken; + break; + case 0x32: /* FBLT */ + if (fp_register_sign_bit (rav) == 1 && ! fp_register_zero_p (rav)) + goto branch_taken; + break; + case 0x35: /* FBNE */ + if (! fp_register_zero_p (rav)) + goto branch_taken; + break; } } @@ -1719,7 +1727,6 @@ alpha_software_single_step (struct regcache *regcache) static struct gdbarch * alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { - struct gdbarch_tdep *tdep; struct gdbarch *gdbarch; /* Find a candidate among extant architectures. */ @@ -1727,7 +1734,7 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) if (arches != NULL) return arches->gdbarch; - tdep = XCNEW (struct gdbarch_tdep); + alpha_gdbarch_tdep *tdep = new alpha_gdbarch_tdep; gdbarch = gdbarch_alloc (&info, tdep); /* Lowest text address. This is used by heuristic_proc_start()