* coredep.c (fetch_core_registers): Remove premature warning,
authorJohn Gilmore <gnu@cygnus>
Wed, 20 May 1992 08:25:56 +0000 (08:25 +0000)
committerJohn Gilmore <gnu@cygnus>
Wed, 20 May 1992 08:25:56 +0000 (08:25 +0000)
which triggers on DECstation even though all regs are accessible.

* m68k-pinsn.c (print_insn_arg):  Use new macros to get
sign-extension of instruction fields even on unsigned-char hosts.
Bug found by Fred J Roeber, fjr@sgfb.ssd.ray.com.

gdb/coredep.c
gdb/m68k-pinsn.c

index 52b4f776d37f671254b1a11af177f129b7834c34..059d23e73ab19caa249c94cdc247b4f6a878fae1 100644 (file)
@@ -67,8 +67,6 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
      NOP.  */
   if (reg_ptr > core_reg_size)
     reg_ptr -= KERNEL_U_ADDR;
-  if (reg_ptr > core_reg_size)
-    fprintf (stderr, "Can't find registers in core file\n");
 
   for (regno = 0; regno < NUM_REGS; regno++)
     {
index 17a56bf54af1d51f2ddaf79778389a1cd43182e8..bef5eb890dcc0d6dd391a7603570edb7f49863d6 100644 (file)
@@ -1,5 +1,5 @@
 /* Print Motorola 68k instructions for GDB, the GNU debugger.
-   Copyright 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -21,6 +21,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "symtab.h"
 #include "opcode/m68k.h"
 #include "gdbcore.h"
+#include "ieee-float.h"
 
 /* Local function prototypes */
 
@@ -47,30 +48,30 @@ extern char *reg_names[];
 char *fpcr_names[] = { "", "fpiar", "fpsr", "fpiar/fpsr", "fpcr",
                     "fpiar/fpcr", "fpsr/fpcr", "fpiar-fpcr"};
 
+/* Define accessors for 68K's 1, 2, and 4-byte signed quantities.
+   The _SHIFT values move the quantity to the high order end of an
+   `int' value, so it will sign-extend.  Probably a few more casts
+   are needed to make it compile without warnings on finicky systems.  */
+#define        BITS_PER_BYTE   8
+#define        BYTE_SHIFT (BITS_PER_BYTE * ((sizeof (int)) - 1))
+#define        WORD_SHIFT (BITS_PER_BYTE * ((sizeof (int)) - 2))
+#define        LONG_SHIFT (BITS_PER_BYTE * ((sizeof (int)) - 4))
 
-#define NEXTBYTE(p)  (p += 2, ((char *)p)[-1])
+#define NEXTBYTE(p)  (p += 2, ((int)(p[-1]) << BYTE_SHIFT) >> BYTE_SHIFT)
 
 #define NEXTWORD(p)  \
-  (p += 2, ((((char *)p)[-2]) << 8) + p[-1])
+  (p += 2, (((int)((p[-2] << 8) + p[-1])) << WORD_SHIFT) >> WORD_SHIFT)
 
 #define NEXTLONG(p)  \
-  (p += 4, (((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])
+  (p += 4, (((int)((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])) \
+                                  << LONG_SHIFT) >> LONG_SHIFT)
 
+/* Ecch -- assumes host == target float formats.  FIXME.  */
 #define NEXTSINGLE(p) \
   (p += 4, *((float *)(p - 4)))
 
 #define NEXTDOUBLE(p) \
   (p += 8, *((double *)(p - 8)))
-
-#define NEXTEXTEND(p) \
-  (p += 12, 0.0)       /* Need a function to convert from extended to double
-                          precision... */
-
-#define NEXTPACKED(p) \
-  (p += 12, 0.0)       /* Need a function to convert from packed to double
-                          precision.   Actually, it's easier to print a
-                          packed number than a double anyway, so maybe
-                          there should be a special case to handle this... */
 \f
 /* Print the m68k instruction at address MEMADDR in debugged memory,
    on STREAM.  Returns length of the instruction, in bytes.  */
@@ -182,7 +183,7 @@ print_insn_arg (d, buffer, p, addr, stream)
   int regno;
   register char *regname;
   register unsigned char *p1;
-  register double flval;
+  double flval;
   int flt_p;
 
   switch (*d)
@@ -315,14 +316,14 @@ print_insn_arg (d, buffer, p, addr, stream)
       if (place == 'b')
        val = NEXTBYTE (p);
       else if (place == 'B')
-       val = ((char *)buffer)[1];
+       val = NEXTBYTE (buffer);        /* from the opcode word */
       else if (place == 'w' || place == 'W')
        val = NEXTWORD (p);
       else if (place == 'l' || place == 'L')
        val = NEXTLONG (p);
       else if (place == 'g')
        {
-         val = ((char *)buffer)[1];
+         val = NEXTBYTE (buffer);
          if (val == 0)
            val = NEXTWORD (p);
          else if (val == -1)
@@ -466,11 +467,13 @@ print_insn_arg (d, buffer, p, addr, stream)
                  break;
 
                case 'x':
-                 flval = NEXTEXTEND(p);
+                 ieee_extended_to_double (ext_format_68881, p, &flval);
+                 p += 12;
                  break;
 
                case 'p':
-                 flval = NEXTPACKED(p);
+                 p += 12;
+                 flval = 0;    /* FIXME, handle packed decimal someday.  */
                  break;
 
                default:
@@ -565,10 +568,10 @@ print_insn_arg (d, buffer, p, addr, stream)
                }
          }
        else
-         abort ();
+         goto de_fault;
       break;
 
-    default:
+    default:  de_fault:
       error ("Invalid arg format in opcode table: \"%c\".", *d);
     }