24#include "opcode/arc.h"
30#include "opcodes/arc-dis.h"
37#define arc_linux_debug_printf(fmt, ...) \
38 debug_prefixed_printf_cond (arc_debug, "arc-linux", fmt, ##__VA_ARGS__)
40#define REGOFF(offset) (offset * ARC_REGISTER_SIZE)
169 static const gdb_byte insns_be_hs[] = {
170 0x20, 0x8a, 0x12, 0xc2,
173 static const gdb_byte insns_be_700[] = {
174 0x20, 0x8a, 0x12, 0xc2,
175 0x22, 0x6f, 0x00, 0x3f
178 gdb_byte arc_sigtramp_insns[
sizeof (insns_be_700)];
182 insns_sz =
sizeof (insns_be_hs);
183 memcpy (arc_sigtramp_insns, insns_be_hs, insns_sz);
187 insns_sz =
sizeof (insns_be_700);
188 memcpy (arc_sigtramp_insns, insns_be_700, insns_sz);
199 gdb_assert ((insns_sz % 2) == 0);
200 for (
int i = 0; i < insns_sz; i += 2)
201 std::swap (arc_sigtramp_insns[i], arc_sigtramp_insns[i+1]);
204 gdb_byte buf[insns_sz];
215 if (memcmp (buf, arc_sigtramp_insns, insns_sz) == 0)
225 return (memcmp (buf, arc_sigtramp_insns, insns_sz) == 0);
262 const int ucontext_offset = 0x80;
263 const int sigcontext_offset = 0x14;
264 return get_frame_sp (this_frame) + ucontext_offset + sigcontext_offset;
325static const gdb_byte *
358static std::vector<CORE_ADDR>
361 const int atomic_seq_len = 24;
362 std::vector<CORE_ADDR> next_pcs;
365 gdb_assert (insn.insn_class == LLOCK);
368 arc_ldst_data_size llock_data_size_mode = insn.data_size_mode;
370 bool found_bc =
false;
372 bool is_pattern_valid =
false;
374 for (
int insn_count = 0; insn_count < atomic_seq_len; ++insn_count)
379 if (insn.insn_class == BRCC)
390 if (insn.insn_class == SCOND)
393 if (insn.data_size_mode == llock_data_size_mode)
394 is_pattern_valid =
true;
399 if (is_pattern_valid)
402 next_pcs.push_back (insn.address + insn.length);
410static std::vector<CORE_ADDR>
418 struct arc_instruction curr_insn;
422 if (curr_insn.insn_class == LLOCK)
426 std::vector<CORE_ADDR> next_pcs;
431 if (curr_insn.has_delay_slot)
433 struct arc_instruction next_insn;
439 next_pcs.push_back (next_pc);
445 if (curr_insn.is_control_flow)
448 if (branch_pc != next_pc)
449 next_pcs.push_back (branch_pc);
457 ULONGEST lp_end, lp_start, lp_count;
465 "lp_count = %s, next_pc = %s",
468 pulongest (lp_count),
471 if (next_pc == lp_end && lp_count > 1)
475 next_pcs.push_back (lp_start);
485 next_pcs.push_back (bta);
511 if (resolver.
minsym !=
nullptr)
555 const bfd_byte *buf = (
const bfd_byte *) gregs;
564 gdb_assert_not_reached (
"Invalid regnum in arc_linux_supply_gregset.");
570 const void *v2_regs,
size_t size)
572 const bfd_byte *buf = (
const bfd_byte *) v2_regs;
587 int regnum, gdb_byte *buf)
618 gdb_byte *buf = (gdb_byte *) gregs;
628 gdb_assert_not_reached (
"Invalid regnum in arc_linux_collect_gregset.");
634 void *v2_regs,
size_t size)
636 bfd_byte *buf = (bfd_byte *) v2_regs;
gdb_static_assert(sizeof(splay_tree_key) >=sizeof(CORE_ADDR *))
static int arc_linux_cannot_store_register(struct gdbarch *gdbarch, int regnum)
initialize_file_ftype _initialize_arc_linux_tdep
void arc_linux_collect_gregset(const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs, size_t size)
static CORE_ADDR arc_linux_skip_solib_resolver(struct gdbarch *gdbarch, CORE_ADDR pc)
static void collect_register(const struct regcache *regcache, struct gdbarch *gdbarch, int regnum, gdb_byte *buf)
static CORE_ADDR arc_linux_sigcontext_addr(frame_info_ptr this_frame)
static std::vector< CORE_ADDR > handle_atomic_sequence(arc_instruction insn, disassemble_info *di)
static void arc_linux_init_osabi(struct gdbarch_info info, struct gdbarch *gdbarch)
static const gdb_byte arc_linux_trap_s_be[]
static int arc_linux_breakpoint_kind_from_pc(struct gdbarch *gdbarch, CORE_ADDR *pcptr)
static std::vector< CORE_ADDR > arc_linux_software_single_step(struct regcache *regcache)
static bool arc_linux_is_sigtramp(frame_info_ptr this_frame)
static int arc_linux_cannot_fetch_register(struct gdbarch *gdbarch, int regnum)
static const int arc_linux_sc_reg_offsets[]
void arc_linux_supply_gregset(const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t size)
static const gdb_byte arc_linux_trap_s_le[]
static const int trap_size
static const struct target_desc * arc_linux_core_read_description(struct gdbarch *gdbarch, struct target_ops *target, bfd *abfd)
static void arc_linux_iterate_over_regset_sections(struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache)
static const gdb_byte * arc_linux_sw_breakpoint_from_kind(struct gdbarch *gdbarch, int kind, int *size)
static void supply_register(struct regcache *regcache, int regnum, const gdb_byte *buf)
void arc_linux_supply_v2_regset(const struct regset *regset, struct regcache *regcache, int regnum, const void *v2_regs, size_t size)
static const int arc_linux_core_reg_offsets[]
static const struct regset arc_linux_v2_regset
#define arc_linux_debug_printf(fmt,...)
void arc_linux_collect_v2_regset(const struct regset *regset, const struct regcache *regcache, int regnum, void *v2_regs, size_t size)
static const struct regset arc_linux_gregset
#define ARC_LINUX_SIZEOF_V2_REGSET
CORE_ADDR arc_insn_get_linear_next_pc(const struct arc_instruction &insn)
arc_arch_features arc_arch_features_create(const bfd *abfd, const unsigned long mach)
int arc_delayed_print_insn(bfd_vma addr, struct disassemble_info *info)
CORE_ADDR arc_insn_get_branch_target(const struct arc_instruction &insn)
#define ARC_STATUS32_DE_MASK
#define ARC_STATUS32_L_MASK
#define ARC_REGISTER_SIZE
static int arc_mach_is_arcv2(struct gdbarch *gdbarch)
#define ARC_OFFSET_NO_REGISTER
const target_desc * arc_lookup_target_description(const struct arc_arch_features &features)
void raw_collect(int regnum, void *buf) const override
void raw_supply(int regnum, const void *buf) override
void initialize_file_ftype(void)
CORE_ADDR frame_unwind_caller_pc(frame_info_ptr this_frame)
CORE_ADDR get_frame_pc(frame_info_ptr frame)
CORE_ADDR get_frame_sp(frame_info_ptr this_frame)
struct gdbarch * get_frame_arch(frame_info_ptr this_frame)
frame_info_ptr get_current_frame(void)
bool safe_frame_unwind_memory(frame_info_ptr this_frame, CORE_ADDR addr, gdb::array_view< gdb_byte > buffer)
int gdbarch_pc_regnum(struct gdbarch *gdbarch)
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_software_single_step(struct gdbarch *gdbarch, gdbarch_software_single_step_ftype *software_single_step)
void set_gdbarch_core_read_description(struct gdbarch *gdbarch, gdbarch_core_read_description_ftype *core_read_description)
void set_gdbarch_skip_trampoline_code(struct gdbarch *gdbarch, gdbarch_skip_trampoline_code_ftype *skip_trampoline_code)
int gdbarch_ps_regnum(struct gdbarch *gdbarch)
void set_gdbarch_fetch_tls_load_module_address(struct gdbarch *gdbarch, gdbarch_fetch_tls_load_module_address_ftype *fetch_tls_load_module_address)
void set_gdbarch_cannot_store_register(struct gdbarch *gdbarch, gdbarch_cannot_store_register_ftype *cannot_store_register)
void set_gdbarch_cannot_fetch_register(struct gdbarch *gdbarch, gdbarch_cannot_fetch_register_ftype *cannot_fetch_register)
const struct bfd_arch_info * gdbarch_bfd_arch_info(struct gdbarch *gdbarch)
void set_gdbarch_sw_breakpoint_from_kind(struct gdbarch *gdbarch, gdbarch_sw_breakpoint_from_kind_ftype *sw_breakpoint_from_kind)
void set_gdbarch_skip_solib_resolver(struct gdbarch *gdbarch, gdbarch_skip_solib_resolver_ftype *skip_solib_resolver)
void set_gdbarch_iterate_over_regset_sections(struct gdbarch *gdbarch, gdbarch_iterate_over_regset_sections_ftype *iterate_over_regset_sections)
void iterate_over_regset_sections_cb(const char *sect_name, int supply_size, int collect_size, const struct regset *regset, const char *human_name, void *cb_data)
link_map_offsets * linux_ilp32_fetch_link_map_offsets()
void linux_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch, int num_disp_step_buffers)
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
CORE_ADDR find_solib_trampoline_target(frame_info_ptr frame, CORE_ADDR pc)
void gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
CORE_ADDR regcache_read_pc(struct regcache *regcache)
enum register_status regcache_cooked_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
CORE_ADDR svr4_fetch_objfile_link_map(struct objfile *objfile)
const int * sc_reg_offset
bool(* is_sigtramp)(frame_info_ptr)
CORE_ADDR(* sigcontext_addr)(frame_info_ptr)
CORE_ADDR value_address() const
struct minimal_symbol * minsym
struct disassemble_info * disasm_info()
std::vector< tdesc_feature_up > features
const char * print_core_address(struct gdbarch *gdbarch, CORE_ADDR address)
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)