27#include "opcode/rl78.h"
209#define RL78_SP_ADDR 0xffff8
275 "builtin_type_rl78_psw", 8);
320 static const char *
const reg_names[] =
444 "",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
447 return reg_names[regnr];
455 static const char *
const reg_names[] =
579 "",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
582 return reg_names[regnr];
629 return addr & 0xffffff;
637 return (addr & 0xffff) | 0xf0000;
642static enum register_status
645 int reg, gdb_byte *buffer)
647 enum register_status
status;
685 memcpy (buffer, rawbuf, 3);
695 int bank = ((psw >> 3) & 1) | ((psw >> 4) & 1);
709 int bank = ((psw >> 3) & 1) | ((psw >> 4) & 1);
718 gdb_assert_not_reached (
"invalid pseudo register number");
727 int reg,
const gdb_byte *buffer)
761 memcpy (rawbuf, buffer, 3);
772 bank = ((psw >> 3) & 1) | ((psw >> 4) & 1);
781 int bank, raw_regnum;
784 bank = ((psw >> 3) & 1) | ((psw >> 4) & 1);
792 gdb_assert_not_reached (
"invalid pseudo register number");
805struct rl78_get_opcode_byte_handle
852 internal_error (_(
"Undefined mapping for opc reg %d"),
869 struct rl78_get_opcode_byte_handle *opcdata
870 = (
struct rl78_get_opcode_byte_handle *) handle;
911 CORE_ADDR pc, next_pc;
914 CORE_ADDR after_last_frame_setup_insn = start_pc;
917 memset (result, 0,
sizeof (*result));
932 while (pc < limit_pc)
935 struct rl78_get_opcode_byte_handle opcode_handle;
936 RL78_Opcode_Decoded opc;
938 opcode_handle.pc = pc;
940 &opcode_handle, RL78_ISA_DEFAULT);
941 next_pc = pc + bytes_read;
943 if (opc.id == RLO_sel)
945 bank = opc.op[1].addend;
947 else if (opc.id == RLO_mov
948 && opc.op[0].type == RL78_Operand_PreDec
949 && opc.op[0].reg == RL78_Reg_SP
950 && opc.op[1].type == RL78_Operand_Register)
953 + 2 * (opc.op[1].reg - RL78_Reg_AX);
959 after_last_frame_setup_insn = next_pc;
961 else if (opc.id == RLO_sub
962 && opc.op[0].type == RL78_Operand_Register
963 && opc.op[0].reg == RL78_Reg_SP
964 && opc.op[1].type == RL78_Operand_Immediate)
966 int addend = opc.op[1].addend;
970 after_last_frame_setup_insn = next_pc;
972 else if (opc.id == RLO_mov
973 && opc.size == RL78_Word
974 && opc.op[0].type == RL78_Operand_Register
975 && opc.op[1].type == RL78_Operand_Indirect
981 else if (opc.id == RLO_sub
982 && opc.size == RL78_Word
983 && opc.op[0].type == RL78_Operand_Register
984 && opc.op[1].type == RL78_Operand_Immediate)
986 int addend = opc.op[1].addend;
991 else if (opc.id == RLO_mov
992 && opc.size == RL78_Word
993 && opc.op[0].type == RL78_Operand_Indirect
995 && opc.op[1].type == RL78_Operand_Register)
999 after_last_frame_setup_insn = next_pc;
1025 return addr & 0xffffff;
1032 struct type *
type, gdb_byte *buf, CORE_ADDR addr)
1044 struct type *
type,
const gdb_byte *buf)
1066 CORE_ADDR func_addr, func_end;
1094 void **this_prologue_cache)
1096 if (!*this_prologue_cache)
1098 CORE_ADDR func_start, stop_addr;
1108 stop_addr = func_start;
1133 void **this_prologue_cache,
struct frame_id *this_id)
1136 this_prologue_cache),
1142static struct value *
1144 void **this_prologue_cache,
int regnum)
1200 if (0 <= reg && reg <= 31)
1243 struct value *function,
1244 struct type *valtype,
1246 gdb_byte *readbuf,
const gdb_byte *writebuf)
1249 ULONGEST valtype_len = valtype->
length ();
1251 int is_g10 = tdep->
elf_flags & E_FLAG_RL78_G10;
1253 if (valtype_len > 8)
1260 CORE_ADDR g10_raddr = 0xffec8;
1263 while (valtype_len > 0)
1282 CORE_ADDR g10_raddr = 0xffec8;
1285 while (valtype_len > 0)
1289 gdb_byte b = u & 0xff;
1332 int nargs,
struct value **args, CORE_ADDR sp,
1334 CORE_ADDR struct_addr)
1341 for (i = nargs - 1; i >= 0; i--)
1343 struct type *value_type = args[i]->enclosing_type ();
1344 int len = value_type->
length ();
1345 int container_len = (len + 1) & ~1;
1347 sp -= container_len;
1349 args[i]->contents_all ().data (), len);
1381 if (
info.abfd != NULL
1382 && bfd_get_flavour (
info.abfd) == bfd_target_elf_flavour)
1383 elf_flags = elf_elfheader (
info.abfd)->e_flags;
1395 = gdbarch_tdep<rl78_gdbarch_tdep> (
arches->gdbarch);
void gdbarch_register(enum bfd_architecture bfd_architecture, gdbarch_init_ftype *init, gdbarch_dump_tdep_ftype *dump_tdep, gdbarch_supports_arch_info_ftype *supports_arch_info)
struct gdbarch * target_gdbarch(void)
static std::vector< const char * > arches
int core_addr_lessthan(CORE_ADDR lhs, CORE_ADDR rhs)
struct gdbarch_list * gdbarch_list_lookup_by_info(struct gdbarch_list *arches, const struct gdbarch_info *info)
#define BP_MANIPULATION(BREAK_INSN)
bool find_pc_partial_function(CORE_ADDR pc, const char **name, CORE_ADDR *address, CORE_ADDR *endaddr, const struct block **block)
void scan(void(*func)(void *closure, pv_t addr, CORE_ADDR size, pv_t value), void *closure)
void store(pv_t addr, CORE_ADDR size, pv_t value)
enum register_status raw_read(int regnum, gdb_byte *buf)
void raw_write(int regnum, const gdb_byte *buf)
void write_memory(CORE_ADDR memaddr, const bfd_byte *myaddr, ssize_t len)
LONGEST read_memory_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
static void store_unsigned_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, ULONGEST val)
static ULONGEST extract_unsigned_integer(gdb::array_view< const gdb_byte > buf, enum bfd_endian byte_order)
@ RETURN_VALUE_REGISTER_CONVENTION
@ RETURN_VALUE_STRUCT_CONVENTION
void dwarf2_append_unwinders(struct gdbarch *gdbarch)
int default_frame_sniffer(const struct frame_unwind *self, frame_info_ptr this_frame, void **this_prologue_cache)
struct value * frame_unwind_got_memory(frame_info_ptr frame, int regnum, CORE_ADDR addr)
struct value * frame_unwind_got_register(frame_info_ptr frame, int regnum, int new_regnum)
enum unwind_stop_reason default_frame_unwind_stop_reason(frame_info_ptr this_frame, void **this_cache)
struct value * frame_unwind_got_constant(frame_info_ptr frame, int regnum, ULONGEST val)
void frame_unwind_append_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
ULONGEST get_frame_register_unsigned(frame_info_ptr frame, int regnum)
ULONGEST frame_unwind_register_unsigned(frame_info_ptr next_frame, int regnum)
CORE_ADDR get_frame_pc(frame_info_ptr frame)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
CORE_ADDR get_frame_func(frame_info_ptr this_frame)
#define FRAME_OBSTACK_ZALLOC(TYPE)
void set_gdbarch_long_long_bit(struct gdbarch *gdbarch, int long_long_bit)
void set_gdbarch_addr_bit(struct gdbarch *gdbarch, int addr_bit)
void set_gdbarch_address_to_pointer(struct gdbarch *gdbarch, gdbarch_address_to_pointer_ftype *address_to_pointer)
void set_gdbarch_char_signed(struct gdbarch *gdbarch, int char_signed)
void set_gdbarch_unwind_pc(struct gdbarch *gdbarch, gdbarch_unwind_pc_ftype *unwind_pc)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
void set_gdbarch_breakpoint_kind_from_pc(struct gdbarch *gdbarch, gdbarch_breakpoint_kind_from_pc_ftype *breakpoint_kind_from_pc)
void set_gdbarch_register_sim_regno(struct gdbarch *gdbarch, gdbarch_register_sim_regno_ftype *register_sim_regno)
void set_gdbarch_frame_align(struct gdbarch *gdbarch, gdbarch_frame_align_ftype *frame_align)
void set_gdbarch_skip_prologue(struct gdbarch *gdbarch, gdbarch_skip_prologue_ftype *skip_prologue)
void set_gdbarch_addr_bits_remove(struct gdbarch *gdbarch, gdbarch_addr_bits_remove_ftype *addr_bits_remove)
int gdbarch_addr_bit(struct gdbarch *gdbarch)
void set_gdbarch_register_name(struct gdbarch *gdbarch, gdbarch_register_name_ftype *register_name)
void set_gdbarch_int_bit(struct gdbarch *gdbarch, int int_bit)
void set_gdbarch_return_value(struct gdbarch *gdbarch, gdbarch_return_value_ftype *return_value)
void set_gdbarch_decr_pc_after_break(struct gdbarch *gdbarch, CORE_ADDR decr_pc_after_break)
void set_gdbarch_double_bit(struct gdbarch *gdbarch, int double_bit)
void set_gdbarch_inner_than(struct gdbarch *gdbarch, gdbarch_inner_than_ftype *inner_than)
void set_gdbarch_sp_regnum(struct gdbarch *gdbarch, int sp_regnum)
void set_gdbarch_register_reggroup_p(struct gdbarch *gdbarch, gdbarch_register_reggroup_p_ftype *register_reggroup_p)
void set_gdbarch_long_double_format(struct gdbarch *gdbarch, const struct floatformat **long_double_format)
void set_gdbarch_pc_regnum(struct gdbarch *gdbarch, int pc_regnum)
void set_gdbarch_register_type(struct gdbarch *gdbarch, gdbarch_register_type_ftype *register_type)
void set_gdbarch_float_bit(struct gdbarch *gdbarch, int float_bit)
void set_gdbarch_short_bit(struct gdbarch *gdbarch, int short_bit)
void set_gdbarch_pseudo_register_write(struct gdbarch *gdbarch, gdbarch_pseudo_register_write_ftype *pseudo_register_write)
void set_gdbarch_num_pseudo_regs(struct gdbarch *gdbarch, int num_pseudo_regs)
void set_gdbarch_dwarf2_addr_size(struct gdbarch *gdbarch, int dwarf2_addr_size)
void set_gdbarch_dwarf2_reg_to_regnum(struct gdbarch *gdbarch, gdbarch_dwarf2_reg_to_regnum_ftype *dwarf2_reg_to_regnum)
void set_gdbarch_long_bit(struct gdbarch *gdbarch, int long_bit)
void set_gdbarch_ptr_bit(struct gdbarch *gdbarch, int ptr_bit)
void set_gdbarch_pseudo_register_read(struct gdbarch *gdbarch, gdbarch_pseudo_register_read_ftype *pseudo_register_read)
void set_gdbarch_num_regs(struct gdbarch *gdbarch, int num_regs)
void set_gdbarch_long_double_bit(struct gdbarch *gdbarch, int long_double_bit)
void set_gdbarch_sw_breakpoint_from_kind(struct gdbarch *gdbarch, gdbarch_sw_breakpoint_from_kind_ftype *sw_breakpoint_from_kind)
void set_gdbarch_dummy_id(struct gdbarch *gdbarch, gdbarch_dummy_id_ftype *dummy_id)
void set_gdbarch_double_format(struct gdbarch *gdbarch, const struct floatformat **double_format)
void set_gdbarch_pointer_to_address(struct gdbarch *gdbarch, gdbarch_pointer_to_address_ftype *pointer_to_address)
void set_gdbarch_float_format(struct gdbarch *gdbarch, const struct floatformat **float_format)
void set_gdbarch_push_dummy_call(struct gdbarch *gdbarch, gdbarch_push_dummy_call_ftype *push_dummy_call)
void set_gdbarch_vbit_in_delta(struct gdbarch *gdbarch, int vbit_in_delta)
struct gdbarch * gdbarch_alloc(const struct gdbarch_info *info, gdbarch_tdep_up tdep)
std::unique_ptr< gdbarch_tdep_base > gdbarch_tdep_up
function_call_return_method
struct type * init_integer_type(type_allocator &alloc, int bit, int unsigned_p, const char *name)
void append_flags_type_flag(struct type *type, int bitpos, const char *name)
struct type * arch_flags_type(struct gdbarch *gdbarch, const char *name, int bit)
struct type * init_pointer_type(type_allocator &alloc, int bit, const char *name, struct type *target_type)
const struct floatformat * floatformats_ieee_single[BFD_ENDIAN_UNKNOWN]
const struct floatformat * floatformats_ieee_double[BFD_ENDIAN_UNKNOWN]
#define TYPE_CODE_SPACE(t)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
pv_t pv_register(int reg, CORE_ADDR k)
pv_t pv_add_constant(pv_t v, CORE_ADDR k)
int pv_is_register(pv_t a, int r)
enum register_status regcache_raw_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
int register_size(struct gdbarch *gdbarch, int regnum)
enum register_status regcache_cooked_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
void regcache_cooked_write_unsigned(struct regcache *regcache, int regnum, ULONGEST val)
const reggroup *const general_reggroup
const reggroup *const system_reggroup
const reggroup *const save_reggroup
const reggroup *const all_reggroup
const reggroup *const restore_reggroup
static int rl78_dwarf_reg_to_regnum(struct gdbarch *gdbarch, int reg)
static void check_for_saved(void *result_untyped, pv_t addr, CORE_ADDR size, pv_t value)
constexpr gdb_byte rl78_break_insn[]
static CORE_ADDR rl78_unwind_pc(struct gdbarch *arch, frame_info_ptr next_frame)
static CORE_ADDR rl78_push_dummy_call(struct gdbarch *gdbarch, struct value *function, 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)
static int rl78_register_sim_regno(struct gdbarch *gdbarch, int regnum)
void _initialize_rl78_tdep()
static struct rl78_prologue * rl78_analyze_frame_prologue(frame_info_ptr this_frame, void **this_prologue_cache)
static void rl78_analyze_prologue(CORE_ADDR start_pc, CORE_ADDR limit_pc, struct rl78_prologue *result)
static int rl78_register_reggroup_p(struct gdbarch *gdbarch, int regnum, const struct reggroup *group)
static CORE_ADDR rl78_addr_bits_remove(struct gdbarch *gdbarch, CORE_ADDR addr)
static int opc_reg_to_gdb_regnum(int opcreg)
static enum return_value_convention rl78_return_value(struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)
static const char * rl78_g10_register_name(struct gdbarch *gdbarch, int regnr)
static CORE_ADDR rl78_frame_base(frame_info_ptr this_frame, void **this_prologue_cache)
static struct type * rl78_register_type(struct gdbarch *gdbarch, int reg_nr)
static CORE_ADDR rl78_frame_align(struct gdbarch *gdbarch, CORE_ADDR sp)
static struct gdbarch * rl78_gdbarch_init(struct gdbarch_info info, struct gdbarch_list *arches)
static enum register_status rl78_pseudo_register_read(struct gdbarch *gdbarch, readable_regcache *regcache, int reg, gdb_byte *buffer)
static struct type * rl78_psw_type(struct gdbarch *gdbarch)
static const char * rl78_register_name(struct gdbarch *gdbarch, int regnr)
static struct value * rl78_prev_register(frame_info_ptr this_frame, void **this_prologue_cache, int regnum)
static CORE_ADDR rl78_make_instruction_address(CORE_ADDR addr)
@ RL78_RAW_BANK2_R7_REGNUM
@ RL78_RAW_BANK0_R2_REGNUM
@ RL78_RAW_BANK0_R1_REGNUM
@ RL78_BANK1_RP1_PTR_REGNUM
@ RL78_RAW_BANK2_R2_REGNUM
@ RL78_RAW_BANK0_R5_REGNUM
@ RL78_BANK3_RP0_PTR_REGNUM
@ RL78_BANK0_RP1_PTR_REGNUM
@ RL78_RAW_BANK0_R6_REGNUM
@ RL78_RAW_BANK2_R4_REGNUM
@ RL78_RAW_BANK2_R5_REGNUM
@ RL78_RAW_BANK1_R5_REGNUM
@ RL78_BANK2_RP3_PTR_REGNUM
@ RL78_RAW_BANK1_R6_REGNUM
@ RL78_RAW_BANK2_R0_REGNUM
@ RL78_BANK2_RP1_PTR_REGNUM
@ RL78_BANK2_RP2_PTR_REGNUM
@ RL78_BANK0_RP0_PTR_REGNUM
@ RL78_RAW_BANK3_R6_REGNUM
@ RL78_BANK3_RP3_PTR_REGNUM
@ RL78_BANK1_RP2_PTR_REGNUM
@ RL78_RAW_BANK3_R7_REGNUM
@ RL78_RAW_BANK3_R5_REGNUM
@ RL78_RAW_BANK2_R3_REGNUM
@ RL78_RAW_BANK2_R1_REGNUM
@ RL78_RAW_BANK3_R4_REGNUM
@ RL78_RAW_BANK3_R3_REGNUM
@ RL78_RAW_BANK0_R0_REGNUM
@ RL78_RAW_BANK0_R4_REGNUM
@ RL78_RAW_BANK2_R6_REGNUM
@ RL78_BANK3_RP1_PTR_REGNUM
@ RL78_BANK1_RP3_PTR_REGNUM
@ RL78_RAW_BANK1_R7_REGNUM
@ RL78_BANK1_RP0_PTR_REGNUM
@ RL78_RAW_BANK0_R7_REGNUM
@ RL78_RAW_BANK1_R2_REGNUM
@ RL78_RAW_BANK3_R0_REGNUM
@ RL78_BANK0_RP3_PTR_REGNUM
@ RL78_BANK2_RP0_PTR_REGNUM
@ RL78_RAW_BANK3_R1_REGNUM
@ RL78_BANK0_RP2_PTR_REGNUM
@ RL78_RAW_BANK1_R1_REGNUM
@ RL78_BANK3_RP2_PTR_REGNUM
@ RL78_RAW_BANK1_R3_REGNUM
@ RL78_RAW_BANK3_R2_REGNUM
@ RL78_RAW_BANK1_R4_REGNUM
@ RL78_RAW_BANK1_R0_REGNUM
@ RL78_RAW_BANK0_R3_REGNUM
static const struct frame_unwind rl78_unwind
static int rl78_get_opcode_byte(void *handle)
static void rl78_address_to_pointer(struct gdbarch *gdbarch, struct type *type, gdb_byte *buf, CORE_ADDR addr)
static CORE_ADDR rl78_make_data_address(CORE_ADDR addr)
static void rl78_this_id(frame_info_ptr this_frame, void **this_prologue_cache, struct frame_id *this_id)
static CORE_ADDR rl78_pointer_to_address(struct gdbarch *gdbarch, struct type *type, const gdb_byte *buf)
static CORE_ADDR rl78_skip_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
static void rl78_pseudo_register_write(struct gdbarch *gdbarch, struct regcache *regcache, int reg, const gdb_byte *buffer)
static struct frame_id rl78_dummy_id(struct gdbarch *gdbarch, frame_info_ptr this_frame)
struct type * rl78_psw_type
struct type * rl78_code_pointer
struct type * rl78_data_pointer
struct type * rl78_uint16
struct type * rl78_uint32
int reg_offset[RL78_NUM_TOTAL_REGS]
struct type * target_type() const
struct value::@203::@204 reg
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
LONGEST value_as_long(struct value *val)