[PATCH mainline/7.12.1] Create tdep->rx_psw_type and tdep->rx_fpsw_type lazily

Yao Qi qiyaoltc@gmail.com
Fri Dec 9 12:54:00 GMT 2016


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.
---
 gdb/rx-tdep.c | 103 +++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 62 insertions(+), 41 deletions(-)

diff --git a/gdb/rx-tdep.c b/gdb/rx-tdep.c
index 6b8d8d5..eb3dc47 100644
--- a/gdb/rx-tdep.c
+++ b/gdb/rx-tdep.c
@@ -150,6 +150,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)
@@ -159,9 +219,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
@@ -1045,45 +1105,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);
-- 
1.9.1



More information about the Gdb-patches mailing list