From 0561fea48c107b271308a013c485c29cbd5c13b5 Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Thu, 2 Jul 2015 15:02:56 -0700 Subject: [PATCH] rx: Create and use flags types for psw, bpsw, and fpsw registers. This change adds two flags types for the (Renesas RX) psw, bpsw, and fpsw registers. As a result, symbolic flags are displayed for these registers in the output of GDB's "info registers" command as well as in output from other commands, such as "print". gdb/ChangeLog: * rx-tdep.c (RX_BPSW_REGNUM, RX_FPSW_REGNUM): New constants. (struct gdbarch_tdep): Add fields rx_psw_type and rx_fpsw_type. (rx_register_type): Add cases for RX_PSW_REGNUM, RX_BPSW_REGNUM, and RX_FPSW_REGNUM. (rx_gdbarch_init): Initialize PSW, BPSW, and FPSW flags types. --- gdb/ChangeLog | 8 ++++++++ gdb/rx-tdep.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9dc21e8f6f..1dbae2065e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2015-07-02 Kevin Buettner + + * rx-tdep.c (RX_BPSW_REGNUM, RX_FPSW_REGNUM): New constants. + (struct gdbarch_tdep): Add fields rx_psw_type and rx_fpsw_type. + (rx_register_type): Add cases for RX_PSW_REGNUM, RX_BPSW_REGNUM, + and RX_FPSW_REGNUM. + (rx_gdbarch_init): Initialize PSW, BPSW, and FPSW flags types. + 2015-07-02 Jan Kratochvil Fix GCC false warning. diff --git a/gdb/rx-tdep.c b/gdb/rx-tdep.c index 11d390b47c..15c4cdedad 100644 --- a/gdb/rx-tdep.c +++ b/gdb/rx-tdep.c @@ -47,6 +47,8 @@ enum RX_R15_REGNUM = 15, RX_PSW_REGNUM = 18, RX_PC_REGNUM = 19, + RX_BPSW_REGNUM = 21, + RX_FPSW_REGNUM = 24, RX_ACC_REGNUM = 25, RX_NUM_REGS = 26 }; @@ -56,6 +58,12 @@ struct gdbarch_tdep { /* The ELF header flags specify the multilib used. */ int elf_flags; + + /* Type of PSW and BPSW. */ + struct type *rx_psw_type; + + /* Type of FPSW. */ + struct type *rx_fpsw_type; }; /* This structure holds the results of a prologue analysis. */ @@ -132,8 +140,14 @@ rx_register_name (struct gdbarch *gdbarch, int regnr) static struct type * rx_register_type (struct gdbarch *gdbarch, int reg_nr) { + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + if (reg_nr == RX_PC_REGNUM) return builtin_type (gdbarch)->builtin_func_ptr; + else if (reg_nr == RX_PSW_REGNUM || reg_nr == RX_BPSW_REGNUM) + return tdep->rx_psw_type; + else if (reg_nr == RX_FPSW_REGNUM) + return tdep->rx_fpsw_type; else if (reg_nr == RX_ACC_REGNUM) return builtin_type (gdbarch)->builtin_unsigned_long_long; else @@ -816,6 +830,45 @@ rx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) gdbarch = gdbarch_alloc (&info, tdep); tdep->elf_flags = elf_flags; + /* Initialize the flags type for PSW and BPSW. */ + + tdep->rx_psw_type = arch_flags_type (gdbarch, "rx_psw_type", 4); + append_flags_type_flag (tdep->rx_psw_type, 0, "C"); + append_flags_type_flag (tdep->rx_psw_type, 1, "Z"); + append_flags_type_flag (tdep->rx_psw_type, 2, "S"); + append_flags_type_flag (tdep->rx_psw_type, 3, "O"); + append_flags_type_flag (tdep->rx_psw_type, 16, "I"); + append_flags_type_flag (tdep->rx_psw_type, 17, "U"); + append_flags_type_flag (tdep->rx_psw_type, 20, "PM"); + append_flags_type_flag (tdep->rx_psw_type, 24, "IPL0"); + append_flags_type_flag (tdep->rx_psw_type, 25, "IPL1"); + append_flags_type_flag (tdep->rx_psw_type, 26, "IPL2"); + append_flags_type_flag (tdep->rx_psw_type, 27, "IPL3"); + + /* Initialize flags type for FPSW. */ + + tdep->rx_fpsw_type = arch_flags_type (gdbarch, "rx_fpsw_type", 4); + append_flags_type_flag (tdep->rx_fpsw_type, 0, "RM0"); + append_flags_type_flag (tdep->rx_fpsw_type, 1, "RM1"); + append_flags_type_flag (tdep->rx_fpsw_type, 2, "CV"); + append_flags_type_flag (tdep->rx_fpsw_type, 3, "CO"); + append_flags_type_flag (tdep->rx_fpsw_type, 4, "CZ"); + append_flags_type_flag (tdep->rx_fpsw_type, 5, "CU"); + append_flags_type_flag (tdep->rx_fpsw_type, 6, "CX"); + append_flags_type_flag (tdep->rx_fpsw_type, 7, "CE"); + append_flags_type_flag (tdep->rx_fpsw_type, 8, "DN"); + append_flags_type_flag (tdep->rx_fpsw_type, 10, "EV"); + append_flags_type_flag (tdep->rx_fpsw_type, 11, "EO"); + append_flags_type_flag (tdep->rx_fpsw_type, 12, "EZ"); + append_flags_type_flag (tdep->rx_fpsw_type, 13, "EU"); + append_flags_type_flag (tdep->rx_fpsw_type, 14, "EX"); + append_flags_type_flag (tdep->rx_fpsw_type, 26, "FV"); + append_flags_type_flag (tdep->rx_fpsw_type, 27, "FO"); + append_flags_type_flag (tdep->rx_fpsw_type, 28, "FZ"); + append_flags_type_flag (tdep->rx_fpsw_type, 29, "FU"); + append_flags_type_flag (tdep->rx_fpsw_type, 30, "FX"); + append_flags_type_flag (tdep->rx_fpsw_type, 31, "FS"); + set_gdbarch_num_regs (gdbarch, RX_NUM_REGS); set_gdbarch_num_pseudo_regs (gdbarch, 0); set_gdbarch_register_name (gdbarch, rx_register_name);