Multiarch REGISTER_VIRTUAL_TYPE for Irix 6.
authorKevin Buettner <kevinb@redhat.com>
Thu, 1 Aug 2002 19:57:41 +0000 (19:57 +0000)
committerKevin Buettner <kevinb@redhat.com>
Thu, 1 Aug 2002 19:57:41 +0000 (19:57 +0000)
gdb/ChangeLog
gdb/config/mips/tm-irix6.h
gdb/mips-tdep.c

index 236e969a1af6f0f0c4ef26e73c3feb756b7beb4d..14c000dde2c455fef730a8f82cbe4a3014ea93d9 100644 (file)
@@ -1,3 +1,14 @@
+2002-08-01  Kevin Buettner  <kevinb@redhat.com>
+
+       * mips-tdep.c (mips_register_virtual_type): New function.
+       (mips_gdbarch_init): Register mips_register_virtual_type()
+       with gdbarch machinery.
+       * config/mips/tm-irix6.h (mips/tm-bigmips64.h): Include
+       this file instead of tm-bigmips.h.
+       (MIPS_REGSIZE): Delete this macro.
+       (REGISTER_VIRTUAL_TYPE): Delete macro.  Undef macro so that
+       multiarch version in mips-tdep.c will be found.
+
 2002-08-01  Andrew Cagney  <cagney@redhat.com>
 
        * NEWS: Menion that CHILL has been made obsolete.
index 1d2ed392bbbc7e6c53d4907b1958c109f2afbb93..1230a9bd96a8c4cb9a1dfb08e9e54f8c9c9c25c5 100644 (file)
    Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include "mips/tm-bigmips.h"
-
-#undef MIPS_REGSIZE
-#define MIPS_REGSIZE 8
+#include "mips/tm-bigmips64.h"
 
 /* SGI's assembler doesn't grok dollar signs in identifiers.
    So we use dots instead.  This item must be coordinated with G++. */
       ((N) - FP0_REGNUM) * sizeof(double) : \
       32 * sizeof(double) + ((N) - 32) * MIPS_REGSIZE)
 
-#undef  REGISTER_VIRTUAL_TYPE
-/* define 8 byte register type */
-#define REGISTER_VIRTUAL_TYPE(N) \
-       (((N) >= FP0_REGNUM && (N) < FP0_REGNUM+32) ? builtin_type_double \
-        : ((N) == 32 /*SR*/) ? builtin_type_uint32 \
-        : ((N) >= 70 && (N) <= 89) ? builtin_type_uint32 \
-        : builtin_type_long_long)
-
 /* Force N32 ABI as the default. */
 #define MIPS_DEFAULT_ABI MIPS_ABI_N32
 
 /* Select the disassembler */
 #undef TM_PRINT_INSN_MACH
 #define TM_PRINT_INSN_MACH bfd_mach_mips8000
+
+/* Undefine those methods which have been multiarched.  */
+#undef REGISTER_VIRTUAL_TYPE
index ff00aa7167e830149b5aaf1af2d64ae58cd28220..d3c97460302b4d674f7262e5c844c4a100fa77a2 100644 (file)
@@ -483,6 +483,36 @@ mips_register_convert_to_raw (struct type *virtual_type, int n,
            TYPE_LENGTH (virtual_type));
 }
 
+/* Return the GDB type object for the "standard" data type
+   of data in register REG.  
+   
+   Note: kevinb/2002-08-01: The definition below should faithfully
+   reproduce the behavior of each of the REGISTER_VIRTUAL_TYPE
+   definitions found in config/mips/tm-*.h.  I'm concerned about
+   the ``FCRCS_REGNUM <= reg && reg <= LAST_EMBED_REGNUM'' clause
+   though.  In some cases FP_REGNUM is in this range, and I doubt
+   that this code is correct for the 64-bit case.  */
+
+static struct type *
+mips_register_virtual_type (int reg)
+{
+  if (FP0_REGNUM <= reg && reg < FP0_REGNUM + 32)
+    return builtin_type_double;
+  else if (reg == PS_REGNUM /* CR */)
+    return builtin_type_uint32;
+  else if (FCRCS_REGNUM <= reg && reg <= LAST_EMBED_REGNUM)
+    return builtin_type_uint32;
+  else
+    {
+      /* Everything else... return ``long long'' when registers
+         are 64-bits wide, ``int'' otherwise.  */
+      if (MIPS_REGSIZE == TYPE_LENGTH (builtin_type_long_long))
+       return builtin_type_long_long;
+      else
+       return builtin_type_int;
+    }
+}
+
 /* Should the upper word of 64-bit addresses be zeroed? */
 enum auto_boolean mask_address_var = AUTO_BOOLEAN_AUTO;
 
@@ -4635,6 +4665,8 @@ mips_gdbarch_init (struct gdbarch_info info,
   set_gdbarch_address_to_pointer (gdbarch, address_to_signed_pointer);
   set_gdbarch_integer_to_address (gdbarch, mips_integer_to_address);
 
+  set_gdbarch_register_virtual_type (gdbarch, mips_register_virtual_type);
+
   /* Hook in OS ABI-specific overrides, if they have been registered.  */
   gdbarch_init_osabi (info, gdbarch, osabi);