40#include "opcode/ft32.h"
43#include "sim/sim-ft32.h"
46#define RAM_BIAS 0x800000
84static const char *
const ft32_register_names[] =
87 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
88 "r8",
"r9",
"r10",
"r11",
"r12",
"r13",
"r14",
"r15",
89 "r16",
"r17",
"r18",
"r19",
"r20",
"r21",
"r22",
"r23",
90 "r24",
"r25",
"r26",
"r27",
"r28",
"cc",
100 return ft32_register_names[reg_nr];
108 if (reg_nr == FT32_PC_REGNUM)
113 else if (reg_nr == FT32_SP_REGNUM || reg_nr == FT32_FP_REGNUM)
124 const gdb_byte *valbuf)
137 len - 4, byte_order);
147 enum bfd_endian byte_order)
152 CORE_ADDR a4 = a & ~3;
154 *isize = ft32_decode_shortcode (a4, inst, sc) ? 2 : 4;
156 return sc[1 & (a >> 1)];
178 const int first_saved_reg = 13;
187 CORE_ADDR prologs[32];
194 char prolog_symbol[32];
196 snprintf (prolog_symbol,
sizeof (prolog_symbol),
"__prolog_$r%02d",
205 if (start_addr >= end_addr)
209 for (next_addr = start_addr; next_addr < end_addr; next_addr += isize)
213 if (FT32_IS_PUSH (inst))
215 pushreg = FT32_PUSH_REG (inst);
219 else if (FT32_IS_CALL (inst))
223 if ((4 * (inst & 0x3ffff)) == prologs[
regnum])
225 for (pushreg = first_saved_reg; pushreg <=
regnum;
248 if (next_addr < end_addr)
251 if (FT32_IS_LINK (inst))
261 cache->
framesize += FT32_LINK_SIZE (inst);
274 CORE_ADDR func_addr = 0, func_end = 0;
275 const char *func_name;
282 CORE_ADDR post_prologue_pc
284 if (post_prologue_pc != 0)
285 return std::max (pc, post_prologue_pc);
295 memset (&cache, 0,
sizeof cache);
305 if (sal.
end && sal.
end < func_end)
327 struct type *
type,
const gdb_byte *buf)
344static type_instance_flags
350 if (dwarf2_addr_class == 1)
361 type_instance_flags type_flags)
376 type_instance_flags *type_flags_ptr)
378 if (strcmp (
name,
"flash") == 0)
396 bfd_byte *valbuf = dst;
419 gdb_byte *readbuf,
const gdb_byte *writebuf)
421 if (valtype->
length () > 8)
427 if (writebuf != NULL)
443 for (i = 0; i < FT32_NUM_REGS; ++i)
455 CORE_ADDR current_pc;
465 if (cache->
base == 0)
481 for (i = 0; i < FT32_NUM_REGS; ++i)
493 void **this_prologue_cache,
struct frame_id *this_id)
496 this_prologue_cache);
499 if (cache->
base == 0)
509 void **this_prologue_cache,
int regnum)
512 this_prologue_cache);
561 struct type *void_type;
562 struct type *func_void_type;
577 void_type = alloc.
new_type (TYPE_CODE_VOID, TARGET_CHAR_BIT,
"void");
gdb_static_assert(sizeof(splay_tree_key) >=sizeof(CORE_ADDR *))
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)
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)
ULONGEST read_code_unsigned_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 frame_base_set_default(struct gdbarch *gdbarch, const struct frame_base *default_base)
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)
CORE_ADDR get_frame_pc(frame_info_ptr frame)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
struct gdbarch * get_frame_arch(frame_info_ptr this_frame)
CORE_ADDR get_frame_func(frame_info_ptr this_frame)
#define FRAME_OBSTACK_ZALLOC(TYPE)
static const struct frame_base ft32_frame_base
static CORE_ADDR ft32_frame_align(struct gdbarch *gdbarch, CORE_ADDR sp)
static void ft32_frame_this_id(frame_info_ptr this_frame, void **this_prologue_cache, struct frame_id *this_id)
static struct ft32_frame_cache * ft32_alloc_frame_cache(void)
static struct gdbarch * ft32_gdbarch_init(struct gdbarch_info info, struct gdbarch_list *arches)
void _initialize_ft32_tdep()
static CORE_ADDR ft32_skip_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
static const char * ft32_register_name(struct gdbarch *gdbarch, int reg_nr)
static struct type * ft32_register_type(struct gdbarch *gdbarch, int reg_nr)
static void ft32_extract_return_value(struct type *type, struct regcache *regcache, gdb_byte *dst)
static struct value * ft32_frame_prev_register(frame_info_ptr this_frame, void **this_prologue_cache, int regnum)
static CORE_ADDR ft32_pointer_to_address(struct gdbarch *gdbarch, struct type *type, const gdb_byte *buf)
static bool ft32_address_class_name_to_type_flags(struct gdbarch *gdbarch, const char *name, type_instance_flags *type_flags_ptr)
constexpr gdb_byte ft32_break_insn[]
static const char * ft32_address_class_type_flags_to_name(struct gdbarch *gdbarch, type_instance_flags type_flags)
static const struct frame_unwind ft32_frame_unwind
static ULONGEST ft32_fetch_instruction(CORE_ADDR a, int *isize, enum bfd_endian byte_order)
static void ft32_store_return_value(struct type *type, struct regcache *regcache, const gdb_byte *valbuf)
static CORE_ADDR ft32_frame_base_address(frame_info_ptr this_frame, void **this_cache)
static enum return_value_convention ft32_return_value(struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)
static CORE_ADDR ft32_analyze_prologue(CORE_ADDR start_addr, CORE_ADDR end_addr, struct ft32_frame_cache *cache, struct gdbarch *gdbarch)
static type_instance_flags ft32_address_class_type_flags(int byte_size, int dwarf2_addr_class)
static struct ft32_frame_cache * ft32_frame_cache(frame_info_ptr this_frame, void **this_cache)
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_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_address_class_type_flags_to_name(struct gdbarch *gdbarch, gdbarch_address_class_type_flags_to_name_ftype *address_class_type_flags_to_name)
void set_gdbarch_register_name(struct gdbarch *gdbarch, gdbarch_register_name_ftype *register_name)
void set_gdbarch_overlay_update(struct gdbarch *gdbarch, gdbarch_overlay_update_ftype *overlay_update)
void set_gdbarch_address_class_type_flags(struct gdbarch *gdbarch, gdbarch_address_class_type_flags_ftype *address_class_type_flags)
void set_gdbarch_return_value(struct gdbarch *gdbarch, gdbarch_return_value_ftype *return_value)
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_pc_regnum(struct gdbarch *gdbarch, int pc_regnum)
void set_gdbarch_address_class_name_to_type_flags(struct gdbarch *gdbarch, gdbarch_address_class_name_to_type_flags_ftype *address_class_name_to_type_flags)
void set_gdbarch_register_type(struct gdbarch *gdbarch, gdbarch_register_type_ftype *register_type)
void set_gdbarch_num_regs(struct gdbarch *gdbarch, int num_regs)
void set_gdbarch_sw_breakpoint_from_kind(struct gdbarch *gdbarch, gdbarch_sw_breakpoint_from_kind_ftype *sw_breakpoint_from_kind)
void set_gdbarch_pointer_to_address(struct gdbarch *gdbarch, gdbarch_pointer_to_address_ftype *pointer_to_address)
struct gdbarch * gdbarch_alloc(const struct gdbarch_info *info, gdbarch_tdep_up tdep)
std::unique_ptr< gdbarch_tdep_base > gdbarch_tdep_up
struct type * init_pointer_type(type_allocator &alloc, int bit, const char *name, struct type *target_type)
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
struct type * make_function_type(struct type *type, struct type **typeptr)
@ TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1
#define TYPE_ADDRESS_CLASS_1(t)
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
void gdbarch_init_osabi(struct gdbarch_info info, struct gdbarch *gdbarch)
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)
CORE_ADDR value_address() const
struct minimal_symbol * minsym
struct type * builtin_data_ptr
struct type * builtin_int32
CORE_ADDR saved_regs[FT32_NUM_REGS]
enum language language() const
void set_instance_flags(type_instance_flags flags)
const type_instance_flags instance_flags() const
void simple_overlay_update(struct obj_section *osect)
struct block_symbol lookup_symbol(const char *name, const struct block *block, domain_enum domain, struct field_of_this_result *is_a_field_of_this)
CORE_ADDR skip_prologue_using_sal(struct gdbarch *gdbarch, CORE_ADDR func_addr)
struct symtab_and_line find_pc_line(CORE_ADDR pc, int notcurrent)