* i386-tdep.h (struct gdbarch_tdep): Add i386_eflags_type and
authorUlrich Weigand <uweigand@de.ibm.com>
Thu, 2 Jul 2009 12:52:52 +0000 (12:52 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Thu, 2 Jul 2009 12:52:52 +0000 (12:52 +0000)
i386_mxcsr_type members.
(i386_eflags_type): Make into function.
(i386_mxcsr_type): Likewise.
* i386-tdep.c (i386_eflags_type): Make into function.
(i386_mxcsr_type): Likewise.
(i386_register_type): Update uses.
(i386_init_types): Remove.
(_initialize_i386_tdep): Do not call it.
* amd64-tdep.c (amd64_register_type): Update uses.

* m68k-tdep.h (struct gdbarch_tdep): Add m68k_ps_type member.
* m68k-tdep.c (m68k_ps_type): Make into function.
(m68k_register_type): Update use.
(m68k_init_types): Remove.
(_initialize_m68k_tdep): Do not call it.

* sparc-tdep.h (struct gdbarch_tdep): Add sparc_psr_type,
sparc_fsr_type, sparc64_pstate_type, sparc64_fsr_type, and
sparc64_fprs_type members.
* sparc-tdep.c (sparc_psr_type): Make into function.
(sparc_fsr_type): Likewise.
(sparc32_register_type): Update uses.
(sparc_init_types): Remove.
(_initialize_sparc_tdep): Do not call it.
* sparc64-tdep.c (sparc64_pstate_type): Make into function.
(sparc64_fsr_type): Likewise.
(sparc64_fprs_type): Likewise.
(sparc64_register_type): Update uses.
(sparc64_init_types): Remove.
(_initialize_sparc64_tdep): Likewise.

gdb/ChangeLog
gdb/amd64-tdep.c
gdb/i386-tdep.c
gdb/i386-tdep.h
gdb/m68k-tdep.c
gdb/m68k-tdep.h
gdb/sparc-tdep.c
gdb/sparc-tdep.h
gdb/sparc64-tdep.c

index c0755e225f2a8edb8388be1da620c64ea09512ad..f95d74b7f8a20c7eed70a22170f89e9a5e2eaa3b 100644 (file)
@@ -1,3 +1,37 @@
+2009-07-02  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * i386-tdep.h (struct gdbarch_tdep): Add i386_eflags_type and
+       i386_mxcsr_type members.
+       (i386_eflags_type): Make into function.
+       (i386_mxcsr_type): Likewise.
+       * i386-tdep.c (i386_eflags_type): Make into function.
+       (i386_mxcsr_type): Likewise.
+       (i386_register_type): Update uses.
+       (i386_init_types): Remove.
+       (_initialize_i386_tdep): Do not call it.
+       * amd64-tdep.c (amd64_register_type): Update uses.
+
+       * m68k-tdep.h (struct gdbarch_tdep): Add m68k_ps_type member.
+       * m68k-tdep.c (m68k_ps_type): Make into function.
+       (m68k_register_type): Update use.
+       (m68k_init_types): Remove.
+       (_initialize_m68k_tdep): Do not call it.
+
+       * sparc-tdep.h (struct gdbarch_tdep): Add sparc_psr_type,
+       sparc_fsr_type, sparc64_pstate_type, sparc64_fsr_type, and
+       sparc64_fprs_type members.
+       * sparc-tdep.c (sparc_psr_type): Make into function.
+       (sparc_fsr_type): Likewise.
+       (sparc32_register_type): Update uses.
+       (sparc_init_types): Remove.
+       (_initialize_sparc_tdep): Do not call it.
+       * sparc64-tdep.c (sparc64_pstate_type): Make into function.
+       (sparc64_fsr_type): Likewise.
+       (sparc64_fprs_type): Likewise.
+       (sparc64_register_type): Update uses.
+       (sparc64_init_types): Remove.
+       (_initialize_sparc64_tdep): Likewise.
+
 2009-07-02  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * gdbtypes.h (builtin_type_ieee_single, builtin_type_ieee_double,
index 904915ed84343978ab190b64e1cb7178b5a34534..59434e2b360d7cf2c00a83c4b21e9b19616dcbec 100644 (file)
@@ -98,7 +98,7 @@ amd64_register_type (struct gdbarch *gdbarch, int regnum)
   if (regnum == AMD64_RIP_REGNUM)
     return builtin_type (gdbarch)->builtin_func_ptr;
   if (regnum == AMD64_EFLAGS_REGNUM)
-    return i386_eflags_type;
+    return i386_eflags_type (gdbarch);
   if (regnum >= AMD64_CS_REGNUM && regnum <= AMD64_GS_REGNUM)
     return builtin_type (gdbarch)->builtin_int32;
   if (regnum >= AMD64_ST0_REGNUM && regnum <= AMD64_ST0_REGNUM + 7)
@@ -108,7 +108,7 @@ amd64_register_type (struct gdbarch *gdbarch, int regnum)
   if (regnum >= AMD64_XMM0_REGNUM && regnum <= AMD64_XMM0_REGNUM + 15)
     return i386_sse_type (gdbarch);
   if (regnum == AMD64_MXCSR_REGNUM)
-    return i386_mxcsr_type;
+    return i386_mxcsr_type (gdbarch);
 
   internal_error (__FILE__, __LINE__, _("invalid regnum"));
 }
index cd7fe4c8480797a1bb88a7b1be08bb32bfc38684..a5b1b497c8a608f8a7a46f360332b9aa56478789 100644 (file)
@@ -1994,54 +1994,70 @@ i386_return_value (struct gdbarch *gdbarch, struct type *func_type,
 }
 \f
 
-/* Type for %eflags.  */
-struct type *i386_eflags_type;
+/* Construct types for ISA-specific registers.  */
+struct type *
+i386_eflags_type (struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-/* Type for %mxcsr.  */
-struct type *i386_mxcsr_type;
+  if (!tdep->i386_eflags_type)
+    {
+      struct type *type;
+
+      type = init_flags_type ("builtin_type_i386_eflags", 4);
+      append_flags_type_flag (type, 0, "CF");
+      append_flags_type_flag (type, 1, NULL);
+      append_flags_type_flag (type, 2, "PF");
+      append_flags_type_flag (type, 4, "AF");
+      append_flags_type_flag (type, 6, "ZF");
+      append_flags_type_flag (type, 7, "SF");
+      append_flags_type_flag (type, 8, "TF");
+      append_flags_type_flag (type, 9, "IF");
+      append_flags_type_flag (type, 10, "DF");
+      append_flags_type_flag (type, 11, "OF");
+      append_flags_type_flag (type, 14, "NT");
+      append_flags_type_flag (type, 16, "RF");
+      append_flags_type_flag (type, 17, "VM");
+      append_flags_type_flag (type, 18, "AC");
+      append_flags_type_flag (type, 19, "VIF");
+      append_flags_type_flag (type, 20, "VIP");
+      append_flags_type_flag (type, 21, "ID");
+
+      tdep->i386_eflags_type = type;
+    }
 
-/* Construct types for ISA-specific registers.  */
-static void
-i386_init_types (void)
+  return tdep->i386_eflags_type;
+}
+
+struct type *
+i386_mxcsr_type (struct gdbarch *gdbarch)
 {
-  struct type *type;
-
-  type = init_flags_type ("builtin_type_i386_eflags", 4);
-  append_flags_type_flag (type, 0, "CF");
-  append_flags_type_flag (type, 1, NULL);
-  append_flags_type_flag (type, 2, "PF");
-  append_flags_type_flag (type, 4, "AF");
-  append_flags_type_flag (type, 6, "ZF");
-  append_flags_type_flag (type, 7, "SF");
-  append_flags_type_flag (type, 8, "TF");
-  append_flags_type_flag (type, 9, "IF");
-  append_flags_type_flag (type, 10, "DF");
-  append_flags_type_flag (type, 11, "OF");
-  append_flags_type_flag (type, 14, "NT");
-  append_flags_type_flag (type, 16, "RF");
-  append_flags_type_flag (type, 17, "VM");
-  append_flags_type_flag (type, 18, "AC");
-  append_flags_type_flag (type, 19, "VIF");
-  append_flags_type_flag (type, 20, "VIP");
-  append_flags_type_flag (type, 21, "ID");
-  i386_eflags_type = type;
-
-  type = init_flags_type ("builtin_type_i386_mxcsr", 4);
-  append_flags_type_flag (type, 0, "IE");
-  append_flags_type_flag (type, 1, "DE");
-  append_flags_type_flag (type, 2, "ZE");
-  append_flags_type_flag (type, 3, "OE");
-  append_flags_type_flag (type, 4, "UE");
-  append_flags_type_flag (type, 5, "PE");
-  append_flags_type_flag (type, 6, "DAZ");
-  append_flags_type_flag (type, 7, "IM");
-  append_flags_type_flag (type, 8, "DM");
-  append_flags_type_flag (type, 9, "ZM");
-  append_flags_type_flag (type, 10, "OM");
-  append_flags_type_flag (type, 11, "UM");
-  append_flags_type_flag (type, 12, "PM");
-  append_flags_type_flag (type, 15, "FZ");
-  i386_mxcsr_type = type;
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  if (!tdep->i386_mxcsr_type)
+    {
+      struct type *type;
+
+      type = init_flags_type ("builtin_type_i386_mxcsr", 4);
+      append_flags_type_flag (type, 0, "IE");
+      append_flags_type_flag (type, 1, "DE");
+      append_flags_type_flag (type, 2, "ZE");
+      append_flags_type_flag (type, 3, "OE");
+      append_flags_type_flag (type, 4, "UE");
+      append_flags_type_flag (type, 5, "PE");
+      append_flags_type_flag (type, 6, "DAZ");
+      append_flags_type_flag (type, 7, "IM");
+      append_flags_type_flag (type, 8, "DM");
+      append_flags_type_flag (type, 9, "ZM");
+      append_flags_type_flag (type, 10, "OM");
+      append_flags_type_flag (type, 11, "UM");
+      append_flags_type_flag (type, 12, "PM");
+      append_flags_type_flag (type, 15, "FZ");
+
+      tdep->i386_mxcsr_type = type;
+    }
+
+  return tdep->i386_mxcsr_type;
 }
 
 struct type *
@@ -2157,7 +2173,7 @@ i386_register_type (struct gdbarch *gdbarch, int regnum)
     return builtin_type (gdbarch)->builtin_func_ptr;
 
   if (regnum == I386_EFLAGS_REGNUM)
-    return i386_eflags_type;
+    return i386_eflags_type (gdbarch);
 
   if (regnum == I386_EBP_REGNUM || regnum == I386_ESP_REGNUM)
     return builtin_type (gdbarch)->builtin_data_ptr;
@@ -2172,7 +2188,7 @@ i386_register_type (struct gdbarch *gdbarch, int regnum)
     return i386_sse_type (gdbarch);
 
   if (regnum == I387_MXCSR_REGNUM (gdbarch_tdep (gdbarch)))
-    return i386_mxcsr_type;
+    return i386_mxcsr_type (gdbarch);
 
   return builtin_type (gdbarch)->builtin_int;
 }
@@ -5352,7 +5368,6 @@ is \"default\"."),
   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_GO32,
                          i386_go32_init_abi);
 
-  /* Initialize the i386-specific register groups & types.  */
+  /* Initialize the i386-specific register groups.  */
   i386_init_reggroups ();
-  i386_init_types();
 }
index f0582731f54eb9594a91ba48d4b23c690ca330f4..8b436d76788657c5d7972a50ba3f0ffe70a843ad 100644 (file)
@@ -104,6 +104,8 @@ struct gdbarch_tdep
   int sc_sp_offset;
 
   /* ISA-specific data types.  */
+  struct type *i386_eflags_type;
+  struct type *i386_mxcsr_type;
   struct type *i386_mmx_type;
   struct type *i386_sse_type;
   struct type *i387_ext_type;
@@ -160,9 +162,8 @@ enum i386_regnum
 #define I386_MAX_REGISTER_SIZE 16
 
 /* Types for i386-specific registers.  */
-extern struct type *i386_eflags_type;
-extern struct type *i386_mxcsr_type;
-
+extern struct type *i386_eflags_type (struct gdbarch *gdbarch);
+extern struct type *i386_mxcsr_type (struct gdbarch *gdbarch);
 extern struct type *i386_mmx_type (struct gdbarch *gdbarch);
 extern struct type *i386_sse_type (struct gdbarch *gdbarch);
 extern struct type *i387_ext_type (struct gdbarch *gdbarch);
index dda67e3aa83c62da3da3374fd5cae5ef14b58e73..0c551c6155d6a906c3aeece1432c06fff45e9713 100644 (file)
@@ -71,29 +71,34 @@ m68k_local_breakpoint_from_pc (struct gdbarch *gdbarch,
 }
 \f
 
-/* Type for %ps.  */
-struct type *m68k_ps_type;
-
 /* Construct types for ISA-specific registers.  */
-static void
-m68k_init_types (void)
+static struct type *
+m68k_ps_type (struct gdbarch *gdbarch)
 {
-  struct type *type;
-
-  type = init_flags_type ("builtin_type_m68k_ps", 4);
-  append_flags_type_flag (type, 0, "C");
-  append_flags_type_flag (type, 1, "V");
-  append_flags_type_flag (type, 2, "Z");
-  append_flags_type_flag (type, 3, "N");
-  append_flags_type_flag (type, 4, "X");
-  append_flags_type_flag (type, 8, "I0");
-  append_flags_type_flag (type, 9, "I1");
-  append_flags_type_flag (type, 10, "I2");
-  append_flags_type_flag (type, 12, "M");
-  append_flags_type_flag (type, 13, "S");
-  append_flags_type_flag (type, 14, "T0");
-  append_flags_type_flag (type, 15, "T1");
-  m68k_ps_type = type;
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  if (!tdep->m68k_ps_type)
+    {
+      struct type *type;
+
+      type = init_flags_type ("builtin_type_m68k_ps", 4);
+      append_flags_type_flag (type, 0, "C");
+      append_flags_type_flag (type, 1, "V");
+      append_flags_type_flag (type, 2, "Z");
+      append_flags_type_flag (type, 3, "N");
+      append_flags_type_flag (type, 4, "X");
+      append_flags_type_flag (type, 8, "I0");
+      append_flags_type_flag (type, 9, "I1");
+      append_flags_type_flag (type, 10, "I2");
+      append_flags_type_flag (type, 12, "M");
+      append_flags_type_flag (type, 13, "S");
+      append_flags_type_flag (type, 14, "T0");
+      append_flags_type_flag (type, 15, "T1");
+
+      tdep->m68k_ps_type = type;
+    }
+
+  return tdep->m68k_ps_type;
 }
 
 static struct type *
@@ -152,7 +157,7 @@ m68k_register_type (struct gdbarch *gdbarch, int regnum)
     return builtin_type (gdbarch)->builtin_data_ptr;
 
   if (regnum == M68K_PS_REGNUM)
-    return m68k_ps_type;
+    return m68k_ps_type (gdbarch);
 
   return builtin_type (gdbarch)->builtin_int32;
 }
@@ -1257,7 +1262,4 @@ void
 _initialize_m68k_tdep (void)
 {
   gdbarch_register (bfd_arch_m68k, m68k_gdbarch_init, m68k_dump_tdep);
-
-  /* Initialize the m68k-specific register types.  */
-  m68k_init_types ();
 }
index 986def19c9022e3f04b2ad2421f6fcd340fb8c2d..7825094999479c0d83634f8b040b1039c1b894b8 100644 (file)
@@ -94,6 +94,7 @@ struct gdbarch_tdep
   int fpregs_present;
 
    /* ISA-specific data types.  */
+  struct type *m68k_ps_type;
   struct type *m68881_ext_type;
 };
 
index 9a60ff8009d61f779e7a53baa6c2cc97bf7390d0..f6dbf3f5aba011aa87bd1c61b13ecebf06ff2971 100644 (file)
@@ -283,46 +283,61 @@ sparc32_register_name (struct gdbarch *gdbarch, int regnum)
   return NULL;
 }
 \f
+/* Construct types for ISA-specific registers.  */
 
-/* Type for %psr.  */
-struct type *sparc_psr_type;
+static struct type *
+sparc_psr_type (struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-/* Type for %fsr.  */
-struct type *sparc_fsr_type;
+  if (!tdep->sparc_psr_type)
+    {
+      struct type *type;
 
-/* Construct types for ISA-specific registers.  */
+      type = init_flags_type ("builtin_type_sparc_psr", 4);
+      append_flags_type_flag (type, 5, "ET");
+      append_flags_type_flag (type, 6, "PS");
+      append_flags_type_flag (type, 7, "S");
+      append_flags_type_flag (type, 12, "EF");
+      append_flags_type_flag (type, 13, "EC");
 
-static void
-sparc_init_types (void)
+      tdep->sparc_psr_type = type;
+    }
+
+  return tdep->sparc_psr_type;
+}
+
+static struct type *
+sparc_fsr_type (struct gdbarch *gdbarch)
 {
-  struct type *type;
-
-  type = init_flags_type ("builtin_type_sparc_psr", 4);
-  append_flags_type_flag (type, 5, "ET");
-  append_flags_type_flag (type, 6, "PS");
-  append_flags_type_flag (type, 7, "S");
-  append_flags_type_flag (type, 12, "EF");
-  append_flags_type_flag (type, 13, "EC");
-  sparc_psr_type = type;
-
-  type = init_flags_type ("builtin_type_sparc_fsr", 4);
-  append_flags_type_flag (type, 0, "NXA");
-  append_flags_type_flag (type, 1, "DZA");
-  append_flags_type_flag (type, 2, "UFA");
-  append_flags_type_flag (type, 3, "OFA");
-  append_flags_type_flag (type, 4, "NVA");
-  append_flags_type_flag (type, 5, "NXC");
-  append_flags_type_flag (type, 6, "DZC");
-  append_flags_type_flag (type, 7, "UFC");
-  append_flags_type_flag (type, 8, "OFC");
-  append_flags_type_flag (type, 9, "NVC");
-  append_flags_type_flag (type, 22, "NS");
-  append_flags_type_flag (type, 23, "NXM");
-  append_flags_type_flag (type, 24, "DZM");
-  append_flags_type_flag (type, 25, "UFM");
-  append_flags_type_flag (type, 26, "OFM");
-  append_flags_type_flag (type, 27, "NVM");
-  sparc_fsr_type = type;
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  if (!tdep->sparc_fsr_type)
+    {
+      struct type *type;
+
+      type = init_flags_type ("builtin_type_sparc_fsr", 4);
+      append_flags_type_flag (type, 0, "NXA");
+      append_flags_type_flag (type, 1, "DZA");
+      append_flags_type_flag (type, 2, "UFA");
+      append_flags_type_flag (type, 3, "OFA");
+      append_flags_type_flag (type, 4, "NVA");
+      append_flags_type_flag (type, 5, "NXC");
+      append_flags_type_flag (type, 6, "DZC");
+      append_flags_type_flag (type, 7, "UFC");
+      append_flags_type_flag (type, 8, "OFC");
+      append_flags_type_flag (type, 9, "NVC");
+      append_flags_type_flag (type, 22, "NS");
+      append_flags_type_flag (type, 23, "NXM");
+      append_flags_type_flag (type, 24, "DZM");
+      append_flags_type_flag (type, 25, "UFM");
+      append_flags_type_flag (type, 26, "OFM");
+      append_flags_type_flag (type, 27, "NVM");
+
+      tdep->sparc_fsr_type = type;
+    }
+
+  return tdep->sparc_fsr_type;
 }
 
 /* Return the GDB type object for the "standard" data type of data in
@@ -344,10 +359,10 @@ sparc32_register_type (struct gdbarch *gdbarch, int regnum)
     return builtin_type (gdbarch)->builtin_func_ptr;
 
   if (regnum == SPARC32_PSR_REGNUM)
-    return sparc_psr_type;
+    return sparc_psr_type (gdbarch);
 
   if (regnum == SPARC32_FSR_REGNUM)
-    return sparc_fsr_type;
+    return sparc_fsr_type (gdbarch);
 
   return builtin_type (gdbarch)->builtin_int32;
 }
@@ -1740,7 +1755,4 @@ void
 _initialize_sparc_tdep (void)
 {
   register_gdbarch_init (bfd_arch_sparc, sparc32_gdbarch_init);
-
-  /* Initialize the SPARC-specific register types.  */
-  sparc_init_types();
 }
index 6df6e7ee1d434200dca110c196548822b09df9e2..77a4578d9edfb3c94a40a3a24d3f004e6bf118d2 100644 (file)
@@ -67,6 +67,13 @@ struct gdbarch_tdep
 
   /* Alternative location for trap return.  Used for single-stepping.  */
   CORE_ADDR (*step_trap) (struct frame_info *frame, unsigned long insn);
+
+  /* ISA-specific data types.  */
+  struct type *sparc_psr_type;
+  struct type *sparc_fsr_type;
+  struct type *sparc64_pstate_type;
+  struct type *sparc64_fsr_type;
+  struct type *sparc64_fprs_type;
 };
 
 /* Register numbers of various important registers.  */
index d1b04d7d01a08ff01afe90faffb99157d2de8a8c..acfbace3eaf20ce56e2b2fd3d60cb7d79143020e 100644 (file)
@@ -121,61 +121,89 @@ sparc64_structure_or_union_p (const struct type *type)
 }
 \f
 
-/* Type for %pstate.  */
-struct type *sparc64_pstate_type;
+/* Construct types for ISA-specific registers.  */
 
-/* Type for %fsr.  */
-struct type *sparc64_fsr_type;
+static struct type *
+sparc64_pstate_type (struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-/* Type for %fprs.  */
-struct type *sparc64_fprs_type;
+  if (!tdep->sparc64_pstate_type)
+    {
+      struct type *type;
+
+      type = init_flags_type ("builtin_type_sparc64_pstate", 8);
+      append_flags_type_flag (type, 0, "AG");
+      append_flags_type_flag (type, 1, "IE");
+      append_flags_type_flag (type, 2, "PRIV");
+      append_flags_type_flag (type, 3, "AM");
+      append_flags_type_flag (type, 4, "PEF");
+      append_flags_type_flag (type, 5, "RED");
+      append_flags_type_flag (type, 8, "TLE");
+      append_flags_type_flag (type, 9, "CLE");
+      append_flags_type_flag (type, 10, "PID0");
+      append_flags_type_flag (type, 11, "PID1");
+
+      tdep->sparc64_pstate_type = type;
+    }
 
-/* Construct types for ISA-specific registers.  */
+  return tdep->sparc64_pstate_type;
+}
 
-static void
-sparc64_init_types (void)
+static struct type *
+sparc64_fsr_type (struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  if (!tdep->sparc64_fsr_type)
+    {
+      struct type *type;
+
+      type = init_flags_type ("builtin_type_sparc64_fsr", 8);
+      append_flags_type_flag (type, 0, "NXA");
+      append_flags_type_flag (type, 1, "DZA");
+      append_flags_type_flag (type, 2, "UFA");
+      append_flags_type_flag (type, 3, "OFA");
+      append_flags_type_flag (type, 4, "NVA");
+      append_flags_type_flag (type, 5, "NXC");
+      append_flags_type_flag (type, 6, "DZC");
+      append_flags_type_flag (type, 7, "UFC");
+      append_flags_type_flag (type, 8, "OFC");
+      append_flags_type_flag (type, 9, "NVC");
+      append_flags_type_flag (type, 22, "NS");
+      append_flags_type_flag (type, 23, "NXM");
+      append_flags_type_flag (type, 24, "DZM");
+      append_flags_type_flag (type, 25, "UFM");
+      append_flags_type_flag (type, 26, "OFM");
+      append_flags_type_flag (type, 27, "NVM");
+
+      tdep->sparc64_fsr_type = type;
+    }
+
+  return tdep->sparc64_fsr_type;
+}
+
+static struct type *
+sparc64_fprs_type (struct gdbarch *gdbarch)
 {
-  struct type *type;
-
-  type = init_flags_type ("builtin_type_sparc64_pstate", 8);
-  append_flags_type_flag (type, 0, "AG");
-  append_flags_type_flag (type, 1, "IE");
-  append_flags_type_flag (type, 2, "PRIV");
-  append_flags_type_flag (type, 3, "AM");
-  append_flags_type_flag (type, 4, "PEF");
-  append_flags_type_flag (type, 5, "RED");
-  append_flags_type_flag (type, 8, "TLE");
-  append_flags_type_flag (type, 9, "CLE");
-  append_flags_type_flag (type, 10, "PID0");
-  append_flags_type_flag (type, 11, "PID1");
-  sparc64_pstate_type = type;
-
-  type = init_flags_type ("builtin_type_sparc64_fsr", 8);
-  append_flags_type_flag (type, 0, "NXA");
-  append_flags_type_flag (type, 1, "DZA");
-  append_flags_type_flag (type, 2, "UFA");
-  append_flags_type_flag (type, 3, "OFA");
-  append_flags_type_flag (type, 4, "NVA");
-  append_flags_type_flag (type, 5, "NXC");
-  append_flags_type_flag (type, 6, "DZC");
-  append_flags_type_flag (type, 7, "UFC");
-  append_flags_type_flag (type, 8, "OFC");
-  append_flags_type_flag (type, 9, "NVC");
-  append_flags_type_flag (type, 22, "NS");
-  append_flags_type_flag (type, 23, "NXM");
-  append_flags_type_flag (type, 24, "DZM");
-  append_flags_type_flag (type, 25, "UFM");
-  append_flags_type_flag (type, 26, "OFM");
-  append_flags_type_flag (type, 27, "NVM");
-  sparc64_fsr_type = type;
-
-  type = init_flags_type ("builtin_type_sparc64_fprs", 8);
-  append_flags_type_flag (type, 0, "DL");
-  append_flags_type_flag (type, 1, "DU");
-  append_flags_type_flag (type, 2, "FEF");
-  sparc64_fprs_type = type;
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  if (!tdep->sparc64_fprs_type)
+    {
+      struct type *type;
+
+      type = init_flags_type ("builtin_type_sparc64_fprs", 8);
+      append_flags_type_flag (type, 0, "DL");
+      append_flags_type_flag (type, 1, "DU");
+      append_flags_type_flag (type, 2, "FEF");
+
+      tdep->sparc64_fprs_type = type;
+    }
+
+  return tdep->sparc64_fprs_type;
 }
 
+
 /* Register information.  */
 
 static const char *sparc64_register_names[] =
@@ -261,9 +289,9 @@ sparc64_register_type (struct gdbarch *gdbarch, int regnum)
   if (regnum == SPARC64_STATE_REGNUM)
     return builtin_type (gdbarch)->builtin_int64;
   if (regnum == SPARC64_FSR_REGNUM)
-    return sparc64_fsr_type;
+    return sparc64_fsr_type (gdbarch);
   if (regnum == SPARC64_FPRS_REGNUM)
-    return sparc64_fprs_type;
+    return sparc64_fprs_type (gdbarch);
   /* "Although Y is a 64-bit register, its high-order 32 bits are
      reserved and always read as 0."  */
   if (regnum == SPARC64_Y_REGNUM)
@@ -274,7 +302,7 @@ sparc64_register_type (struct gdbarch *gdbarch, int regnum)
   if (regnum == SPARC64_CWP_REGNUM)
     return builtin_type (gdbarch)->builtin_int64;
   if (regnum == SPARC64_PSTATE_REGNUM)
-    return sparc64_pstate_type;
+    return sparc64_pstate_type (gdbarch);
   if (regnum == SPARC64_ASI_REGNUM)
     return builtin_type (gdbarch)->builtin_int64;
   if (regnum == SPARC64_CCR_REGNUM)
@@ -1425,13 +1453,3 @@ sparc64_collect_fpregset (const struct regcache *regcache,
     }
 }
 
-
-/* Provide a prototype to silence -Wmissing-prototypes.  */
-void _initialize_sparc64_tdep (void);
-
-void
-_initialize_sparc64_tdep (void)
-{
-  /* Initialize the UltraSPARC-specific register types.  */
-  sparc64_init_types();
-}