Restrict alpha_convert_register_p
authorYao Qi <yao.qi@linaro.org>
Wed, 24 May 2017 21:15:23 +0000 (22:15 +0100)
committerYao Qi <yao.qi@linaro.org>
Wed, 24 May 2017 21:15:23 +0000 (22:15 +0100)
This patch restricts alpha_convert_register_p from
"TYPE_LENGTH (type) != 8" to "TYPE_LENGTH (type) == 4", because,

 - we have check "TYPE_LENGTH (valtype) == 4" in alpha_register_to_value
   and alpha_value_to_register,
 - alpha lds and sts instruction access 4 bytes,
 - comments "It might need to convert the [float] register into the
   corresponding [integer] type (see Alpha)" and integer is 4-byte on
   alpha,

I think it is the right restrict condition to "TYPE_LENGTH (valtype) == 4".

gdb:

2017-05-24  Yao Qi  <yao.qi@linaro.org>

* alpha-tdep.c (alpha_convert_register_p): Return true if type
length is 4.
(alpha_register_to_value): Remove type length check.
(alpha_value_to_register): Likewise.

gdb/ChangeLog
gdb/alpha-tdep.c

index 0cb8e36d7b9e40c1ed7a3466151f05dd39cc3195..1234e1473af5a65e6b190981360707a74b82d712 100644 (file)
@@ -1,3 +1,10 @@
+2017-05-24  Yao Qi  <yao.qi@linaro.org>
+
+       * alpha-tdep.c (alpha_convert_register_p): Return true if type
+       length is 4.
+       (alpha_register_to_value): Remove type length check.
+       (alpha_value_to_register): Likewise.
+
 2017-05-24  Yao Qi  <yao.qi@linaro.org>
 
        * ia64-tdep.c (ia64_convert_register_p): Check type's code is
index 672e578ff1d1fe48d9e3f5d90ba4583bac6ad082..d7cc0f4974362af89c2b42f4d5934fa8cd5d8a39 100644 (file)
@@ -227,7 +227,7 @@ alpha_sts (struct gdbarch *gdbarch, void *out, const void *in)
 /* The alpha needs a conversion between register and memory format if the
    register is a floating point register and memory format is float, as the
    register format must be double or memory format is an integer with 4
-   bytes or less, as the representation of integers in floating point
+   bytes, as the representation of integers in floating point
    registers is different.  */
 
 static int
@@ -235,7 +235,7 @@ alpha_convert_register_p (struct gdbarch *gdbarch, int regno,
                          struct type *type)
 {
   return (regno >= ALPHA_FP0_REGNUM && regno < ALPHA_FP0_REGNUM + 31
-         && TYPE_LENGTH (type) != 8);
+         && TYPE_LENGTH (type) == 4);
 }
 
 static int
@@ -252,14 +252,10 @@ alpha_register_to_value (struct frame_info *frame, int regnum,
                                 in, optimizedp, unavailablep))
     return 0;
 
-  if (TYPE_LENGTH (valtype) == 4)
-    {
-      alpha_sts (gdbarch, out, in);
-      *optimizedp = *unavailablep = 0;
-      return 1;
-    }
-
-  error (_("Cannot retrieve value from floating point register"));
+  gdb_assert (TYPE_LENGTH (valtype) == 4);
+  alpha_sts (gdbarch, out, in);
+  *optimizedp = *unavailablep = 0;
+  return 1;
 }
 
 static void
@@ -268,14 +264,9 @@ alpha_value_to_register (struct frame_info *frame, int regnum,
 {
   gdb_byte out[MAX_REGISTER_SIZE];
 
-  switch (TYPE_LENGTH (valtype))
-    {
-    case 4:
-      alpha_lds (get_frame_arch (frame), out, in);
-      break;
-    default:
-      error (_("Cannot store value in floating point register"));
-    }
+  gdb_assert (TYPE_LENGTH (valtype) == 4);
+  alpha_lds (get_frame_arch (frame), out, in);
+
   put_frame_register (frame, regnum, out);
 }