/* Target-dependent code for the CSKY architecture, for GDB.
- Copyright (C) 2010-2018 Free Software Foundation, Inc.
+ Copyright (C) 2010-2019 Free Software Foundation, Inc.
Contributed by C-SKY Microsystems and Mentor Graphics.
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
-#include "gdb_assert.h"
+#include "common/gdb_assert.h"
#include "frame.h"
#include "inferior.h"
#include "symtab.h"
#include "dwarf2-frame.h"
#include "user-regs.h"
#include "valprint.h"
-#include "reggroups.h"
#include "csky-tdep.h"
#include "regset.h"
-#include "block.h"
#include "opcode/csky.h"
#include <algorithm>
#include <vector>
regcache_cooked_write_unsigned (regcache, CSKY_PC_REGNUM, val);
}
-/* Implement the unwind_sp gdbarch method. */
-
-static CORE_ADDR
-csky_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
-{
- return frame_unwind_register_unsigned (next_frame, CSKY_SP_REGNUM);
-}
-
/* C-Sky ABI register names. */
static const char *csky_register_names[] =
csky_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)
{
int argnum;
int argreg = CSKY_ABI_A0_REGNUM;
/* The struct_return pointer occupies the first parameter
passing register. */
- if (struct_return)
+ if (return_method == return_method_struct)
{
if (csky_debug)
{
"csky: found stack adjustment of"
" 0x%x bytes.\n", adjust);
fprintf_unfiltered (gdb_stdlog,
- "csky: skipping to new address "
- "0x%lx\n", addr);
+ "csky: skipping to new address %s\n",
+ core_addr_to_string_nz (addr));
fprintf_unfiltered (gdb_stdlog,
"csky: continuing\n");
}
else if (CSKY_16_IS_LRW4 (insn) || CSKY_16_IS_MOVI4 (insn))
{
int adjust = 0;
- int offset = 0;
unsigned int insn2;
if (csky_debug)
fprintf_unfiltered (gdb_stdlog,
"csky: looking for r4 adjusters...\n");
}
- offset = 2;
+ int offset = 2;
insn_len = csky_get_insn (gdbarch, addr + offset, &insn2);
while (CSKY_IS_R4_ADJUSTER (insn2))
{
"found stack adjustment of 0x%x"
" bytes.\n", adjust);
fprintf_unfiltered (gdb_stdlog, "csky: "
- "skipping to new address 0x%lx\n",
- addr);
+ "skipping to new address %s\n",
+ core_addr_to_string_nz (addr));
fprintf_unfiltered (gdb_stdlog, "csky: continuing\n");
}
continue;
/* Sanity-check bp_address. */
if (bp_tgt->reqstd_address % 2)
- warning (_("Invalid breakpoint address 0x%x is an odd number.\n"),
+ warning (_("Invalid breakpoint address 0x%x is an odd number."),
(unsigned int) bp_tgt->reqstd_address);
scoped_restore restore_memory
= make_scoped_restore_show_memory_breakpoints (1);
return cache;
}
-/* Implement the unwind_pc gdbarch method. */
-
-static CORE_ADDR
-csky_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
-{
- return frame_unwind_register_unsigned (next_frame, CSKY_PC_REGNUM);
-}
-
/* Implement the this_id function for the normal unwinder. */
static void
csky_frame_base_address
};
-/* Implement the dummy_id gdbarch method. The frame ID's base
- needs to match the TOS value saved by save_dummy_frame_tos,
- and the PC should match the dummy frame's breakpoint. */
-
-static struct frame_id
-csky_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
-{
- unsigned int sp_regnum = CSKY_SP_REGNUM;
-
- CORE_ADDR sp = get_frame_register_unsigned (this_frame, sp_regnum);
- return frame_id_build (sp, get_frame_pc (this_frame));
-}
-
/* Initialize register access method. */
static void
set_gdbarch_frame_align (gdbarch, csky_frame_align);
set_gdbarch_stack_frame_destroyed_p (gdbarch, csky_stack_frame_destroyed_p);
- /* Functions to access frame data. */
- set_gdbarch_unwind_pc (gdbarch, csky_unwind_pc);
- set_gdbarch_unwind_sp (gdbarch, csky_unwind_sp);
-
/* Functions handling dummy frames. */
set_gdbarch_push_dummy_call (gdbarch, csky_push_dummy_call);
- set_gdbarch_dummy_id (gdbarch, csky_dummy_id);
/* Frame unwinders. Use DWARF debug info if available,
otherwise use our own unwinder. */