aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/rx-tdep.c103
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);