diff options
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/rx-tdep.c | 103 |
2 files changed, 71 insertions, 41 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7773e56..2f5a978 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 2016-12-09 Yao Qi <yao.qi@linaro.org> + PR tdep/20954 + * rx-tdep.c (rx_psw_type): New function. + (rx_fpsw_type): New function. + (rx_register_type): Call rx_psw_type and rx_fpsw_type. + (rx_gdbarch_init): Move code to rx_psw_type and + rx_fpsw_type. + +2016-12-09 Yao Qi <yao.qi@linaro.org> + PR tdep/20953 * rl78-tdep.c (rl78_psw_type): New function. (rl78_register_type): Call rl78_psw_type. diff --git a/gdb/rx-tdep.c b/gdb/rx-tdep.c index 904aebd..d47dd60 100644 --- a/gdb/rx-tdep.c +++ b/gdb/rx-tdep.c @@ -149,6 +149,66 @@ rx_register_name (struct gdbarch *gdbarch, int regnr) return reg_names[regnr]; } +/* Construct the flags type for PSW and BPSW. */ + +static struct type * +rx_psw_type (struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (tdep->rx_psw_type == NULL) + { + 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"); + } + return tdep->rx_psw_type; +} + +/* Construct flags type for FPSW. */ + +static struct type * +rx_fpsw_type (struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (tdep->rx_psw_type == NULL) + { + 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"); + } + + return tdep->rx_fpsw_type; +} + /* Implement the "register_type" gdbarch method. */ static struct type * rx_register_type (struct gdbarch *gdbarch, int reg_nr) @@ -158,9 +218,9 @@ rx_register_type (struct gdbarch *gdbarch, int reg_nr) 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; + return rx_psw_type (gdbarch); else if (reg_nr == RX_FPSW_REGNUM) - return tdep->rx_fpsw_type; + return rx_fpsw_type (gdbarch); else if (reg_nr == RX_ACC_REGNUM) return builtin_type (gdbarch)->builtin_unsigned_long_long; else @@ -1049,45 +1109,6 @@ 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); |