Patch from David Mosberger.
[deliverable/binutils-gdb.git] / gdb / z8k-tdep.c
index fa043a2ec1d763aa3a9696e2e30b8d678f365926..5b309402d166653da1183efbb2ce7fbb08571ce4 100644 (file)
@@ -1,7 +1,7 @@
 /* Target-machine dependent code for Zilog Z8000, for GDB.
 
    Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-   2002 Free Software Foundation, Inc.
+   2002, 2003 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -27,7 +27,6 @@
 
 #include "defs.h"
 #include "frame.h"
-#include "obstack.h"
 #include "symtab.h"
 #include "gdbcmd.h"
 #include "gdbtypes.h"
@@ -160,23 +159,13 @@ read_memory_pointer (CORE_ADDR x)
 CORE_ADDR
 z8k_frame_chain (struct frame_info *thisframe)
 {
-  if (thisframe->prev == 0)
-    {
-      /* This is the top of the stack, let's get the sp for real */
-    }
-  if (!inside_entry_file (thisframe->pc))
+  if (!inside_entry_file (get_frame_pc (thisframe)))
     {
       return read_memory_pointer (thisframe->frame);
     }
   return 0;
 }
 
-void
-init_frame_pc (void)
-{
-  internal_error (__FILE__, __LINE__, "failed internal consistency check");
-}
-
 /* Put here the code to store, into a struct frame_saved_regs,
    the addresses of the saved registers of frame described by FRAME_INFO.
    This includes special registers such as pc and fp saved in special
@@ -190,7 +179,7 @@ z8k_frame_init_saved_regs (struct frame_info *frame_info)
   int w;
 
   frame_saved_regs_zalloc (frame_info);
-  pc = get_pc_function_start (frame_info->pc);
+  pc = get_pc_function_start (get_frame_pc (frame_info));
 
   /* wander down the instruction stream */
   examine_frame (pc, frame_info->saved_regs, frame_info->frame);
@@ -251,10 +240,10 @@ frame_find_saved_regs (struct frame_info *fip, struct frame_saved_regs *fsrp)
 
   memset (fsrp, 0, sizeof *fsrp);
 
-  pc = skip_adjust (get_pc_function_start (fip->pc), &locals);
+  pc = skip_adjust (get_pc_function_start (get_frame_pc (fip)), &locals);
 
   {
-    adr = FRAME_FP (fip) - locals;
+    adr = get_frame_base (fip) - locals;
     for (i = 0; i < 8; i++)
       {
        int word = read_memory_short (pc);
@@ -314,7 +303,8 @@ write_return_value (struct type *type, char *valbuf)
   int len;
 
   for (len = 0; len < TYPE_LENGTH (type); len += 2)
-    write_register_bytes (REGISTER_BYTE (len / 2 + 2), valbuf + len, 2);
+    deprecated_write_register_bytes (REGISTER_BYTE (len / 2 + 2),
+                                    valbuf + len, 2);
 }
 
 void
@@ -324,37 +314,38 @@ store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
 }
 
 
-void
+static void
 z8k_print_register_hook (int regno)
 {
   if ((regno & 1) == 0 && regno < 16)
     {
-      unsigned short l[2];
+      unsigned char l[4];
 
-      frame_register_read (selected_frame, regno, (char *) (l + 0));
-      frame_register_read (selected_frame, regno + 1, (char *) (l + 1));
+      frame_register_read (deprecated_selected_frame, regno, l + 0);
+      frame_register_read (deprecated_selected_frame, regno + 1, l + 2);
       printf_unfiltered ("\t");
-      printf_unfiltered ("%04x%04x", l[0], l[1]);
+      printf_unfiltered ("0x%02x%02x%02x%02x", l[0], l[1], l[2], l[3]);
     }
 
   if ((regno & 3) == 0 && regno < 16)
     {
-      unsigned short l[4];
+      unsigned char l[8];
 
-      frame_register_read (selected_frame, regno, (char *) (l + 0));
-      frame_register_read (selected_frame, regno + 1, (char *) (l + 1));
-      frame_register_read (selected_frame, regno + 2, (char *) (l + 2));
-      frame_register_read (selected_frame, regno + 3, (char *) (l + 3));
+      frame_register_read (deprecated_selected_frame, regno, l + 0);
+      frame_register_read (deprecated_selected_frame, regno + 1, l + 2);
+      frame_register_read (deprecated_selected_frame, regno + 2, l + 4);
+      frame_register_read (deprecated_selected_frame, regno + 3, l + 6);
 
       printf_unfiltered ("\t");
-      printf_unfiltered ("%04x%04x%04x%04x", l[0], l[1], l[2], l[3]);
+      printf_unfiltered ("0x%02x%02x%02x%02x%02x%02x%02x%02x",
+                         l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7]);
     }
   if (regno == 15)
     {
       unsigned short rval;
       int i;
 
-      frame_register_read (selected_frame, regno, (char *) (&rval));
+      frame_register_read (deprecated_selected_frame, regno, (char *) (&rval));
 
       printf_unfiltered ("\n");
       for (i = 0; i < 10; i += 2)
@@ -363,7 +354,117 @@ z8k_print_register_hook (int regno)
                             (unsigned int)read_memory_short (rval + i));
        }
     }
+}
+
+static void
+z8k_print_registers_info (struct gdbarch *gdbarch,
+                         struct ui_file *file,
+                         struct frame_info *frame,
+                         int regnum, int print_all)
+{
+  int i;
+  const int numregs = NUM_REGS + NUM_PSEUDO_REGS;
+  char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
+  char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE);
+
+  for (i = 0; i < numregs; i++)
+    {
+      /* Decide between printing all regs, non-float / vector regs, or
+         specific reg.  */
+      if (regnum == -1)
+       {
+         if (!print_all)
+           {
+             if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
+               continue;
+             if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)))
+               continue;
+           }
+       }
+      else
+       {
+         if (i != regnum)
+           continue;
+       }
+
+      /* If the register name is empty, it is undefined for this
+         processor, so don't display anything.  */
+      if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0')
+       continue;
+
+      fputs_filtered (REGISTER_NAME (i), file);
+      print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file);
+
+      /* Get the data in raw format.  */
+      if (! frame_register_read (frame, i, raw_buffer))
+       {
+         fprintf_filtered (file, "*value not available*\n");
+         continue;
+       }
+
+      /* FIXME: cagney/2002-08-03: This code shouldn't be necessary.
+         The function frame_register_read() should have returned the
+         pre-cooked register so no conversion is necessary.  */
+      /* Convert raw data to virtual format if necessary.  */
+      if (REGISTER_CONVERTIBLE (i))
+       {
+         REGISTER_CONVERT_TO_VIRTUAL (i, REGISTER_VIRTUAL_TYPE (i),
+                                      raw_buffer, virtual_buffer);
+       }
+      else
+       {
+         memcpy (virtual_buffer, raw_buffer,
+                 REGISTER_VIRTUAL_SIZE (i));
+       }
+
+      /* If virtual format is floating, print it that way, and in raw
+         hex.  */
+      if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
+       {
+         int j;
+
+         val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+                    file, 0, 1, 0, Val_pretty_default);
+
+         fprintf_filtered (file, "\t(raw 0x");
+         for (j = 0; j < REGISTER_RAW_SIZE (i); j++)
+           {
+             int idx;
+             if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+               idx = j;
+             else
+               idx = REGISTER_RAW_SIZE (i) - 1 - j;
+             fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]);
+           }
+         fprintf_filtered (file, ")");
+       }
+      else
+       {
+         /* Print the register in hex.  */
+         val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+                    file, 'x', 1, 0, Val_pretty_default);
+          /* If not a vector register, print it also according to its
+             natural format.  */
+         if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)) == 0)
+           {
+             fprintf_filtered (file, "\t");
+             val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+                        file, 0, 1, 0, Val_pretty_default);
+           }
+       }
+
+      /* Some z8k specific info.  */
+      z8k_print_register_hook (i);
+
+      fprintf_filtered (file, "\n");
+    }
+}
 
+void
+z8k_do_registers_info (int regnum, int all)
+{
+  z8k_print_registers_info (current_gdbarch, gdb_stdout,
+                           deprecated_selected_frame, regnum, all);
 }
 
 void
This page took 0.02746 seconds and 4 git commands to generate.