aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2016-12-09 15:53:58 +0000
committerYao Qi <yao.qi@linaro.org>2016-12-09 15:55:23 +0000
commitfa897675de62473e5c04330c5d5b782cd1ae04e9 (patch)
tree675d8f0a7333fc3e4bd393ce5d5d102d61b3567b /gdb
parent68647b569da041a33a6504cd80f51fbd43bfa134 (diff)
downloadgdb-fa897675de62473e5c04330c5d5b782cd1ae04e9.zip
gdb-fa897675de62473e5c04330c5d5b782cd1ae04e9.tar.gz
gdb-fa897675de62473e5c04330c5d5b782cd1ae04e9.tar.bz2
Create tdep->rx_psw_type and tdep->rx_fpsw_type lazily
I build GDB with all targets enabled, and "set architecture rx", GDB crashes, (gdb) set architecture rx Program received signal SIGSEGV, Segmentation fault. append_flags_type_flag (type=0x20cc360, bitpos=bitpos@entry=0, name=name@entry=0xd27529 "C") at ../../binutils-gdb/gdb/gdbtypes.c:4926 4926 name); (gdb) bt 10 #0 append_flags_type_flag (type=0x20cc360, bitpos=bitpos@entry=0, name=name@entry=0xd27529 "C") at ../../binutils-gdb/gdb/gdbtypes.c:4926 #1 0x00000000004ce725 in rx_gdbarch_init (info=..., arches=<optimized out>) at ../../binutils-gdb/gdb/rx-tdep.c:1051 #2 0x00000000006b05a4 in gdbarch_find_by_info (info=...) at ../../binutils-gdb/gdb/gdbarch.c:5269 #3 0x000000000060eee4 in gdbarch_update_p (info=...) at ../../binutils-gdb/gdb/arch-utils.c:557 #4 0x000000000060f8a8 in set_architecture (ignore_args=<optimized out>, from_tty=1, c=<optimized out>) at ../../binutils-gdb/gdb/arch-utils.c:531 #5 0x0000000000593d0b in do_set_command (arg=<optimized out>, arg@entry=0x20bee81 "rx ", from_tty=from_tty@entry=1, c=c@entry=0x20b1540) at ../../binutils-gdb/gdb/cli/cli-setshow.c:455 #6 0x00000000007665c3 in execute_command (p=<optimized out>, p@entry=0x20bee70 "set architecture rx ", from_tty=1) at ../../binutils-gdb/gdb/top.c:666 #7 0x00000000006935f4 in command_handler (command=0x20bee70 "set architecture rx ") at ../../binutils-gdb/gdb/event-top.c:577 #8 0x00000000006938d8 in command_line_handler (rl=<optimized out>) at ../../binutils-gdb/gdb/event-top.c:767 #9 0x0000000000692c2c in gdb_rl_callback_handler (rl=0x20be7f0 "") at ../../binutils-gdb/gdb/event-top.c:200 The cause is that we want to access some builtin types in gdbarch init, but it is not initialized yet. I fix it by creating the type when it is to be used. We've already done this in sparc, sparc64 and m68k. gdb: 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.
Diffstat (limited to 'gdb')
-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);