diff options
Diffstat (limited to 'gdb/s390-tdep.c')
-rw-r--r-- | gdb/s390-tdep.c | 62 |
1 files changed, 56 insertions, 6 deletions
diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c index d030a4d..0cef5f4 100644 --- a/gdb/s390-tdep.c +++ b/gdb/s390-tdep.c @@ -41,6 +41,8 @@ #include "value.h" #include "inferior.h" #include "dwarf2/loc.h" +#include "gdbsupport/selftest.h" +#include "gdb/disasm-selftests.h" #include "features/s390-linux32.c" #include "features/s390x-linux64.c" @@ -7055,10 +7057,10 @@ s390_gnu_triplet_regexp (struct gdbarch *gdbarch) static int s390_stap_is_single_operand (struct gdbarch *gdbarch, const char *s) { - return ((isdigit (*s) && s[1] == '(' && s[2] == '%') /* Displacement + return ((c_isdigit (*s) && s[1] == '(' && s[2] == '%') /* Displacement or indirection. */ || *s == '%' /* Register access. */ - || isdigit (*s)); /* Literal number. */ + || c_isdigit (*s)); /* Literal number. */ } /* gdbarch init. */ @@ -7298,7 +7300,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) s390_displaced_step_copy_insn); set_gdbarch_displaced_step_fixup (gdbarch, s390_displaced_step_fixup); set_gdbarch_displaced_step_hw_singlestep (gdbarch, s390_displaced_step_hw_singlestep); - set_gdbarch_software_single_step (gdbarch, s390_software_single_step); + set_gdbarch_get_next_pcs (gdbarch, s390_software_single_step); set_gdbarch_max_insn_length (gdbarch, S390_MAX_INSTR_SIZE); /* Prologue analysis. */ @@ -7468,13 +7470,61 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) return gdbarch; } -void _initialize_s390_tdep (); -void -_initialize_s390_tdep () +#if GDB_SELF_TEST +namespace selftests { + +/* Return bfd_arch_info representing s390x. */ + +static const bfd_arch_info * +bfd_arch_info_s390x () +{ + return bfd_lookup_arch (bfd_arch_s390, bfd_mach_s390_64); +} + +/* Return gdbarch representing s390x. */ + +static gdbarch * +gdbarch_s390x () +{ + struct gdbarch_info info; + info.bfd_arch_info = bfd_arch_info_s390x (); + if (info.bfd_arch_info == nullptr) + return nullptr; + + info.osabi = GDB_OSABI_NONE; + return gdbarch_find_by_info (info); +} + +/* Check disassembly of s390x instructions. */ + +static void +disassemble_s390x () +{ + gdbarch *gdbarch = gdbarch_s390x (); + if (gdbarch == nullptr) + return; + + scoped_restore disassembler_options_restore + = make_scoped_restore (&s390_disassembler_options, "zarch"); + + gdb::byte_vector insn = { 0xb9, 0x68, 0x00, 0x03 }; + disassemble_insn (gdbarch, insn, "clzg\t%r0,%r3"); +} + +} /* namespace selftests */ + +#endif /* GDB_SELF_TEST */ + +INIT_GDB_FILE (s390_tdep) { /* Hook us into the gdbarch mechanism. */ gdbarch_register (bfd_arch_s390, s390_gdbarch_init); initialize_tdesc_s390_linux32 (); initialize_tdesc_s390x_linux64 (); + +#if GDB_SELF_TEST + selftests::register_test ("disassemble-s390x", + selftests::disassemble_s390x); +#endif /* GDB_SELF_TEST */ } |