/* Target-machine dependent code for Nios II, for GDB.
- Copyright (C) 2012-2020 Free Software Foundation, Inc.
+ Copyright (C) 2012-2021 Free Software Foundation, Inc.
Contributed by Peter Brookes (pbrookes@altera.com)
and Andrew Draper (adraper@altera.com).
Contributed by Mentor Graphics, Inc.
int i;
for (i = 0; i < NIOS2_NUM_REGS; i++)
- {
- /* All registers start off holding their previous values. */
- cache->reg_value[i].reg = i;
- cache->reg_value[i].offset = 0;
-
- /* All registers start off not saved. */
- cache->reg_saved[i].basereg = -1;
- cache->reg_saved[i].addr = 0;
- }
+ {
+ /* All registers start off holding their previous values. */
+ cache->reg_value[i].reg = i;
+ cache->reg_value[i].offset = 0;
+
+ /* All registers start off not saved. */
+ cache->reg_saved[i].basereg = -1;
+ cache->reg_saved[i].addr = 0;
+ }
}
/* Initialize the unwind cache. */
mov ra, r8
2) A stack adjustment and save of R4-R7 for varargs functions.
- For R2 CDX this is typically handled with a STWM, otherwise
+ For R2 CDX this is typically handled with a STWM, otherwise
this is typically merged with item 3.
3) A stack adjustment and save of the callee-saved registers.
- For R2 CDX these are typically handled with a PUSH.N or STWM,
+ For R2 CDX these are typically handled with a PUSH.N or STWM,
otherwise as an explicit SP decrement and individual register
saves.
- There may also be a stack switch here in an exception handler
+ There may also be a stack switch here in an exception handler
in place of a stack adjustment. It looks like:
movhi rx, %hiadj(newstack)
addhi rx, rx, %lo(newstack)
4) A frame pointer save, which can be either a MOV or ADDI.
5) A further stack pointer adjustment. This is normally included
- adjustment in step 3 unless the total adjustment is too large
+ adjustment in step 3 unless the total adjustment is too large
to be done in one step.
7) A stack overflow check, which can take either of these forms:
enum branch_condition cond;
if (pc == current_pc)
- {
- /* When we reach the current PC we must save the current
- register state (for the backtrace) but keep analysing
- because there might be more to find out (eg. is this an
- exception handler). */
- memcpy (temp_value, value, sizeof (temp_value));
- value = temp_value;
- if (nios2_debug)
- fprintf_unfiltered (gdb_stdlog, "*");
- }
+ {
+ /* When we reach the current PC we must save the current
+ register state (for the backtrace) but keep analysing
+ because there might be more to find out (eg. is this an
+ exception handler). */
+ memcpy (temp_value, value, sizeof (temp_value));
+ value = temp_value;
+ if (nios2_debug)
+ fprintf_unfiltered (gdb_stdlog, "*");
+ }
op = nios2_fetch_insn (gdbarch, pc, &insn);
/* ORHI rb, ra, uimm (also used for MOVHI) */
if (rb != 0)
{
- value[rb].reg = (value[ra].reg == 0) ? 0 : -1;
+ value[rb].reg = (value[ra].reg == 0) ? 0 : -1;
value[rb].offset = value[ra].offset | (uimm << 16);
}
}
else if (nios2_match_stw (insn, op, mach, &ra, &rb, &imm))
- {
+ {
/* STW rb, imm(ra) */
/* Are we storing the original value of a register to the stack?
else
/* Non-stack memory writes cannot appear in the prologue. */
break;
- }
+ }
else if (nios2_match_stwm (insn, op, mach,
®list, &ra, &imm, &wb, &id))
value[rc].reg = NIOS2_STATUS_REGNUM + ra;
value[rc].offset = 0;
}
- }
+ }
else if (nios2_match_calli (insn, op, mach, &uimm))
{
if (find_pc_partial_function (start_pc, NULL, &func_addr, NULL))
{
CORE_ADDR post_prologue_pc
- = skip_prologue_using_sal (gdbarch, func_addr);
+ = skip_prologue_using_sal (gdbarch, func_addr);
if (post_prologue_pc != 0)
- return std::max (start_pc, post_prologue_pc);
+ return std::max (start_pc, post_prologue_pc);
}
/* Prologue analysis does the rest.... */
static CORE_ADDR
nios2_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
- struct regcache *regcache, CORE_ADDR bp_addr,
- int nargs, struct value **args, CORE_ADDR sp,
+ struct regcache *regcache, CORE_ADDR bp_addr,
+ int nargs, struct value **args, CORE_ADDR sp,
function_call_return_method return_method,
CORE_ADDR struct_addr)
{
val = value_contents (arg);
/* Copy the argument to general registers or the stack in
- register-sized pieces. Large arguments are split between
- registers and stack. */
+ register-sized pieces. Large arguments are split between
+ registers and stack. */
while (len > 0)
- {
+ {
int partial_len = (len < 4 ? len : 4);
if (argreg <= NIOS2_LAST_ARGREG)
/* The return address is in the link register. */
trad_frame_set_reg_realreg (this_trad_cache,
- gdbarch_pc_regnum (gdbarch),
- NIOS2_RA_REGNUM);
+ gdbarch_pc_regnum (gdbarch),
+ NIOS2_RA_REGNUM);
/* Frame ID, since it's a frameless / stackless function, no stack
space is allocated and SP on entry is the current SP. */
static void
nios2_stub_frame_this_id (struct frame_info *this_frame, void **this_cache,
- struct frame_id *this_id)
+ struct frame_id *this_id)
{
struct trad_frame_cache *this_trad_cache
= nios2_stub_frame_cache (this_frame, this_cache);
static struct value *
nios2_stub_frame_prev_register (struct frame_info *this_frame,
- void **this_cache, int regnum)
+ void **this_cache, int regnum)
{
struct trad_frame_cache *this_trad_cache
= nios2_stub_frame_cache (this_frame, this_cache);
static ULONGEST
nios2_type_align (struct gdbarch *gdbarch, struct type *type)
{
- switch (TYPE_CODE (type))
+ switch (type->code ())
{
case TYPE_CODE_PTR:
case TYPE_CODE_FUNC:
struct gdbarch *gdbarch;
struct gdbarch_tdep *tdep;
int i;
- struct tdesc_arch_data *tdesc_data = NULL;
+ tdesc_arch_data_up tdesc_data;
const struct target_desc *tdesc = info.target_desc;
if (!tdesc_has_registers (tdesc))
valid_p = 1;
for (i = 0; i < NIOS2_NUM_REGS; i++)
- valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
+ valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
nios2_reg_names[i]);
if (!valid_p)
- {
- tdesc_data_cleanup (tdesc_data);
- return NULL;
- }
+ return NULL;
}
/* Find a candidate among the list of pre-declared architectures. */
/* Enable inferior call support. */
set_gdbarch_push_dummy_call (gdbarch, nios2_push_dummy_call);
- if (tdesc_data)
- tdesc_use_registers (gdbarch, tdesc, tdesc_data);
+ if (tdesc_data != nullptr)
+ tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
return gdbarch;
}