Restrict m68k_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)
We need to convert register if the type is float.  Suppose we get a value
from float point register, but its type is integer, we don't have to convert.
This case may not exist in real code, but exist in my unit test case.

warning: Cannot convert floating-point register value to non-floating-point type.
Self test failed: arch m68k: self-test failed at gdb/git/gdb/findvar.c:1072

              ok = gdbarch_register_to_value (gdbarch, frame, regnum, type,
                                              buf.data (), &optim, &unavail);

1072:         SELF_CHECK (ok);

gdb:

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

* m68k-tdep.c (m68k_convert_register_p): Check type's code is
TYPE_CODE_FLT or not.

gdb/ChangeLog
gdb/m68k-tdep.c

index 0f076f032f99430368c730a5837ce7d6aa85f362..b0d3c2e14ac5cc3a8be3f7128811850c56fe0131 100644 (file)
@@ -1,3 +1,8 @@
+2017-05-24  Yao Qi  <yao.qi@linaro.org>
+
+       * m68k-tdep.c (m68k_convert_register_p): Check type's code is
+       TYPE_CODE_FLT or not.
+
 2017-05-24  Yao Qi  <yao.qi@linaro.org>
 
        * alpha-tdep.c (alpha_gdbarch_init): Use XCNEW instead of XNEW.
index 5b4736da67e21d890040ff490cb330419b9df55b..f0934465543a074f8e40115134446cd91054a1f7 100644 (file)
@@ -188,6 +188,8 @@ m68k_convert_register_p (struct gdbarch *gdbarch,
   if (!gdbarch_tdep (gdbarch)->fpregs_present)
     return 0;
   return (regnum >= M68K_FP0_REGNUM && regnum <= M68K_FP0_REGNUM + 7
+         /* We only support floating-point values.  */
+         && TYPE_CODE (type) == TYPE_CODE_FLT
          && type != register_type (gdbarch, M68K_FP0_REGNUM));
 }
 
@@ -200,19 +202,9 @@ m68k_register_to_value (struct frame_info *frame, int regnum,
                        int *optimizedp, int *unavailablep)
 {
   gdb_byte from[M68K_MAX_REGISTER_SIZE];
-  struct type *fpreg_type = register_type (get_frame_arch (frame),
-                                          M68K_FP0_REGNUM);
+  struct type *fpreg_type = register_type (gdbarch, M68K_FP0_REGNUM);
 
-  /* We only support floating-point values.  */
-  if (TYPE_CODE (type) != TYPE_CODE_FLT)
-    {
-      warning (_("Cannot convert floating-point register value "
-              "to non-floating-point type."));
-      *optimizedp = *unavailablep = 0;
-      return 0;
-    }
-
-  /* Convert to TYPE.  */
+  gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
 
   /* Convert to TYPE.  */
   if (!get_frame_register_bytes (frame, regnum, 0, TYPE_LENGTH (type),