* Rename remote-es1800.c to remote-es.c
[deliverable/binutils-gdb.git] / gdb / mips-tdep.c
index 2e960d3fa3580579c724d937f433a7799585bf13..a853cd6f7cca6fbdff90cfde79de059c08bc99ba 100644 (file)
@@ -32,7 +32,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #endif
 
 #include <sys/param.h>
-#include <sys/dir.h>
 #include <signal.h>
 #include <sys/ioctl.h>
 
@@ -96,9 +95,11 @@ read_next_frame_reg(fi, regno)
      immediately below the frame and we get the saved registers from there.
      If the stack layout for sigtramp changes we might have to change these
      constants and the companion fixup_sigtramp in mipsread.c  */
+#ifndef SIGFRAME_BASE
 #define SIGFRAME_BASE          0x12c   /* sizeof(sigcontext) */
 #define SIGFRAME_PC_OFF                (-SIGFRAME_BASE + 2 * 4)
 #define SIGFRAME_REGSAVE_OFF   (-SIGFRAME_BASE + 3 * 4)
+#endif
   for (; fi; fi = fi->next)
       if (in_sigtramp(fi->pc, 0)) {
          int offset;
@@ -613,7 +614,7 @@ static void
 mips_print_register (regnum, all)
      int regnum, all;
 {
-      unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE * 2]; /* *2 for doubles */
+      unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE];
       REGISTER_TYPE val;
 
       /* Get the data in raw format.  */
@@ -626,9 +627,15 @@ mips_print_register (regnum, all)
       /* If an even floating pointer register, also print as double. */
       if (regnum >= FP0_REGNUM && regnum < FP0_REGNUM+32
          && !((regnum-FP0_REGNUM) & 1)) {
-         read_relative_register_raw_bytes (regnum+1, raw_buffer+4);
+         char dbuffer[MAX_REGISTER_RAW_SIZE]; 
+
+         read_relative_register_raw_bytes (regnum, dbuffer);
+         read_relative_register_raw_bytes (regnum+1, dbuffer+4);
+#ifdef REGISTER_CONVERT_TO_TYPE
+          REGISTER_CONVERT_TO_TYPE(regnum, builtin_type_double, dbuffer);
+#endif
          printf_filtered ("(d%d: ", regnum-FP0_REGNUM);
-         val_print (builtin_type_double, raw_buffer, 0,
+         val_print (builtin_type_double, dbuffer, 0,
                     stdout, 0, 1, 0, Val_pretty_default);
          printf_filtered ("); ");
       }
@@ -766,6 +773,8 @@ mips_skip_prologue(pc)
            continue;                           /* reg != $zero */
        else if (inst == 0x03A0F021)            /* move $s8,$sp */
            continue;
+       else if ((inst & 0xFF9F07FF) == 0x00800021) /* move reg,$a0-$a3 */
+           continue;
        else
            break;
     }
@@ -801,6 +810,44 @@ mips_skip_prologue(pc)
 #endif
 }
 
+/* Given a return value in `regbuf' with a type `valtype', 
+   extract and copy its value into `valbuf'.  */
+void
+mips_extract_return_value (valtype, regbuf, valbuf)
+    struct type *valtype;
+    char regbuf[REGISTER_BYTES];
+    char *valbuf;
+{
+  int regnum;
+  
+  regnum = TYPE_CODE (valtype) == TYPE_CODE_FLT && mips_fpu ? FP0_REGNUM : 2;
+
+  memcpy (valbuf, regbuf + REGISTER_BYTE (regnum), TYPE_LENGTH (valtype));
+#ifdef REGISTER_CONVERT_TO_TYPE
+  REGISTER_CONVERT_TO_TYPE(regnum, valtype, valbuf);
+#endif
+}
+
+/* Given a return value in `regbuf' with a type `valtype', 
+   write it's value into the appropriate register.  */
+void
+mips_store_return_value (valtype, valbuf)
+    struct type *valtype;
+    char *valbuf;
+{
+  int regnum;
+  char raw_buffer[MAX_REGISTER_RAW_SIZE];
+  
+  regnum = TYPE_CODE (valtype) == TYPE_CODE_FLT && mips_fpu ? FP0_REGNUM : 2;
+  memcpy(raw_buffer, valbuf, TYPE_LENGTH (valtype));
+
+#ifdef REGISTER_CONVERT_FROM_TYPE
+  REGISTER_CONVERT_FROM_TYPE(regnum, valtype, raw_buffer);
+#endif
+
+  write_register_bytes(REGISTER_BYTE (regnum), raw_buffer, TYPE_LENGTH (valtype));
+}
+
 /* Let the user turn off floating point and set the fence post for
    heuristic_proc_start.  */
 
@@ -819,7 +866,7 @@ or dealing with return values.", &setlist),
     (add_set_cmd ("heuristic-fence-post", class_support, var_uinteger,
                  (char *) &heuristic_fence_post,
                  "Set the distance searched for the start of a function.\n\
-Set number of bytes to be searched backward to find the beginning of a
+Set number of bytes to be searched backward to find the beginning of a\n\
 function without symbols.", &setlist),
      &showlist);
 }
This page took 0.02403 seconds and 4 git commands to generate.