/* Target-machine dependent code for Renesas H8/300, for GDB.
- Copyright (C) 1988-2019 Free Software Foundation, Inc.
+ Copyright (C) 1988-2021 Free Software Foundation, Inc.
This file is part of GDB.
#include "gdbcore.h"
#include "objfiles.h"
#include "dis-asm.h"
-#include "dwarf2-frame.h"
+#include "dwarf2/frame.h"
#include "frame-base.h"
#include "frame-unwind.h"
if (IS_MOVB_Rn24_SP (read_memory_unsigned_integer (pc + 2,
2, byte_order)))
{
- LONGEST disp = read_memory_integer (pc + 4, 4, byte_order);
+ ULONGEST disp = read_memory_unsigned_integer (pc + 4, 4, byte_order);
/* ... and d:24 is negative. */
- if (disp < 0 && disp > 0xffffff)
+ if ((disp & 0x00800000) != 0)
return 8;
}
}
if (IS_MOVW_Rn24_SP (read_memory_unsigned_integer (pc + 2,
2, byte_order)))
{
- LONGEST disp = read_memory_integer (pc + 4, 4, byte_order);
+ ULONGEST disp = read_memory_unsigned_integer (pc + 4, 4, byte_order);
/* ... and d:24 is negative. */
- if (disp < 0 && disp > 0xffffff)
+ if ((disp & 0x00800000) != 0)
return 8;
}
}
{
if (IS_MOVL_Rn24_SP (read_memory_integer (pc + 4, 2, byte_order)))
{
- LONGEST disp = read_memory_integer (pc + 6, 4, byte_order);
+ ULONGEST disp = read_memory_unsigned_integer (pc + 6, 4,
+ byte_order);
/* ... and d:24 is negative. */
- if (disp < 0 && disp > 0xffffff)
+ if ((disp & 0x00800000) != 0)
return 10;
}
}
cache->saved_regs[E_FP_REGNUM] = 0;
pc += 4;
if (pc >= current_pc)
- return current_pc;
+ return current_pc;
op = read_memory_unsigned_integer (pc, 2, byte_order);
if (IS_MOV_SP_FP (op))
{
pc += 2;
}
else if (IS_MOV_IMM_Rn (op))
- {
+ {
int offset = read_memory_integer (pc + 2, 2, byte_order);
regno = op & 0x000f;
op = read_memory_unsigned_integer (pc + 4, 2, byte_order);
if (IS_PUSH (op1))
{
/* Since the prefix is 0x01x0, this is not a simple pushm but a
- stm.l reglist,@-sp */
+ stm.l reglist,@-sp */
i = ((op & 0x0030) >> 4) + 1;
regno = op1 & 0x000f;
for (; i > 0; regno++, --i)
This could also be an initializing store from non-prologue code,
but I don't think there's any harm in skipping that. */
while ((spill_size = h8300_is_argument_spill (gdbarch, pc)) > 0
- && pc + spill_size <= current_pc)
+ && pc + spill_size <= current_pc)
pc += spill_size;
return pc;
if (!cache->uses_fp)
{
/* We didn't find a valid frame, which means that CACHE->base
- currently holds the frame pointer for our calling frame. If
- we're at the start of a function, or somewhere half-way its
- prologue, the function's frame probably hasn't been fully
- setup yet. Try to reconstruct the base address for the stack
- frame by looking at the stack pointer. For truly "frameless"
- functions this might work too. */
+ currently holds the frame pointer for our calling frame. If
+ we're at the start of a function, or somewhere half-way its
+ prologue, the function's frame probably hasn't been fully
+ setup yet. Try to reconstruct the base address for the stack
+ frame by looking at the stack pointer. For truly "frameless"
+ functions this might work too. */
cache->base = get_frame_register_unsigned (this_frame, E_SP_REGNUM)
+ cache->sp_offset;
if (regnum < gdbarch_num_regs (gdbarch)
&& cache->saved_regs[regnum] != -1)
return frame_unwind_got_memory (this_frame, regnum,
- cache->saved_regs[regnum]);
+ cache->saved_regs[regnum]);
return frame_unwind_got_register (this_frame, regnum, regnum);
}
/* Found a function. */
sal = find_pc_line (func_addr, 0);
if (sal.end && sal.end < func_end)
- /* Found a line number, use it as end of prologue. */
- return sal.end;
+ /* Found a line number, use it as end of prologue. */
+ return sal.end;
/* No useable line symbol. Use prologue parsing method. */
h8300_init_frame_cache (gdbarch, &cache);
stack_offset += padded_len;
/* That's right --- even though we passed the argument
- on the stack, we consume the registers anyway! Love
- me, love my dog. */
+ on the stack, we consume the registers anyway! Love
+ me, love my dog. */
reg += padded_len / wordsize;
}
else
{
/* Heavens to Betsy --- it's really going in registers!
- Note that on the h8/300s, there are gaps between the
- registers in the register file. */
+ Note that on the h8/300s, there are gaps between the
+ registers in the register file. */
int offset;
for (offset = 0; offset < padded_len; offset += wordsize)
store_unsigned_integer (valbuf + 2, 2, byte_order, c);
break;
case 8: /* long long is now 8 bytes. */
- if (TYPE_CODE (type) == TYPE_CODE_INT)
+ if (type->code () == TYPE_CODE_INT)
{
regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &addr);
c = read_memory_unsigned_integer ((CORE_ADDR) addr, len, byte_order);
store_unsigned_integer (valbuf, TYPE_LENGTH (type), byte_order, c);
break;
case 8: /* long long is now 8 bytes. */
- if (TYPE_CODE (type) == TYPE_CODE_INT)
+ if (type->code () == TYPE_CODE_INT)
{
regcache_cooked_read_unsigned (regcache, E_RET0_REGNUM, &c);
store_unsigned_integer (valbuf, 4, byte_order, c);
/* Types of 1, 2 or 4 bytes are returned in R0/R1, everything else on the
stack. */
- if (TYPE_CODE (value_type) == TYPE_CODE_STRUCT
- || TYPE_CODE (value_type) == TYPE_CODE_UNION)
+ if (value_type->code () == TYPE_CODE_STRUCT
+ || value_type->code () == TYPE_CODE_UNION)
return 1;
return !(TYPE_LENGTH (value_type) == 1
|| TYPE_LENGTH (value_type) == 2
{
/* Types of 1, 2 or 4 bytes are returned in R0, INT types of 8 bytes are
returned in R0/R1, everything else on the stack. */
- if (TYPE_CODE (value_type) == TYPE_CODE_STRUCT
- || TYPE_CODE (value_type) == TYPE_CODE_UNION)
+ if (value_type->code () == TYPE_CODE_STRUCT
+ || value_type->code () == TYPE_CODE_UNION)
return 1;
return !(TYPE_LENGTH (value_type) == 1
|| TYPE_LENGTH (value_type) == 2
|| TYPE_LENGTH (value_type) == 4
|| (TYPE_LENGTH (value_type) == 8
- && TYPE_CODE (value_type) == TYPE_CODE_INT));
+ && value_type->code () == TYPE_CODE_INT));
}
/* Function: store_return_value
frame_base_set_default (gdbarch, &h8300_frame_base);
/*
- * Miscelany
+ * Miscellany
*/
/* Stack grows up. */
set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
}
+void _initialize_h8300_tdep ();
void
-_initialize_h8300_tdep (void)
+_initialize_h8300_tdep ()
{
register_gdbarch_init (bfd_arch_h8300, h8300_gdbarch_init);
}