Cort Dougan <cort@cs.nmt.edu>
[deliverable/binutils-gdb.git] / gdb / convex-tdep.c
index 8eeb2b348a0e2ec5fa5fa375cc3524a1864354c1..66161e7930e486fb5633166c8ae9fa7f122a2670 100644 (file)
@@ -42,6 +42,66 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "gdbcmd.h"
 
+CORE_ADDR
+convex_skip_prologue (pc)
+     CORE_ADDR pc;
+{
+  int op, ix;
+  op = read_memory_integer (pc, 2);
+  if ((op & 0xffc7) == 0x5ac0)
+    pc += 2;
+  else if (op == 0x1580)
+    pc += 4;
+  else if (op == 0x15c0)
+    pc += 6;
+  if ((read_memory_integer (pc, 2) & 0xfff8) == 0x7c40
+      && (read_memory_integer (pc + 2, 2) & 0xfff8) == 0x1240
+      && (read_memory_integer (pc + 8, 2) & 0xfff8) == 0x7c48)
+    pc += 10;
+  if (read_memory_integer (pc, 2) == 0x1240)
+    pc += 6;
+  for (;;)
+    {
+      op = read_memory_integer (pc, 2);
+      ix = (op >> 3) & 7;
+      if (ix != 6)
+       break;
+      if ((op & 0xfcc0) == 0x3000)
+       pc += 4;
+      else if ((op & 0xfcc0) == 0x3040)
+       pc += 6;
+      else if ((op & 0xfcc0) == 0x2800)
+       pc += 4;
+      else if ((op & 0xfcc0) == 0x2840)
+       pc += 6;
+      else
+       break;
+    }
+  return pc;
+}
+
+int
+convex_frameless_function_invocation (fi)
+     struct frame_info *fi;
+{
+  int frameless;
+  extern CORE_ADDR text_start, text_end;
+  CORE_ADDR call_addr = SAVED_PC_AFTER_CALL (FI);
+  frameless = (call_addr >= text_start && call_addr < text_end
+              && read_memory_integer (call_addr - 6, 1) == 0x22);
+  return frameless;
+}
+
+int
+convex_frame_num_args (fi)
+     struct frame_info *fi;
+{
+  int numargs = read_memory_integer (FRAME_ARGS_ADDRESS (fi) - 4, 4);
+  if (numargs < 0 || numargs >= 256)
+    numargs = -1;
+  return numargs;
+}
+
 exec_file_command (filename, from_tty)
      char *filename;
      int from_tty;
This page took 0.039089 seconds and 4 git commands to generate.