OSDN Git Service

*** empty log message ***
[pf3gnuchains/sourceware.git] / gdb / vax-tdep.c
index 00d44d1..b84977a 100644 (file)
@@ -1,7 +1,8 @@
 /* Target-dependent code for the VAX.
 
    Copyright (C) 1986, 1989, 1991, 1992, 1995, 1996, 1998, 1999, 2000, 2002,
-   2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -56,12 +57,12 @@ vax_register_name (struct gdbarch *gdbarch, int regnum)
 }
 
 /* Return the GDB type object for the "standard" data type of data in
-   register REGNUM. */
+   register REGNUM.  */
 
 static struct type *
 vax_register_type (struct gdbarch *gdbarch, int regnum)
 {
-  return builtin_type_int;
+  return builtin_type (gdbarch)->builtin_int;
 }
 \f
 /* Core file support.  */
@@ -113,6 +114,8 @@ static CORE_ADDR
 vax_store_arguments (struct regcache *regcache, int nargs,
                     struct value **args, CORE_ADDR sp)
 {
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   gdb_byte buf[4];
   int count = 0;
   int i;
@@ -132,11 +135,11 @@ vax_store_arguments (struct regcache *regcache, int nargs,
 
   /* Push argument count.  */
   sp -= 4;
-  store_unsigned_integer (buf, 4, count);
+  store_unsigned_integer (buf, 4, byte_order, count);
   write_memory (sp, buf, 4);
 
   /* Update the argument pointer.  */
-  store_unsigned_integer (buf, 4, sp);
+  store_unsigned_integer (buf, 4, byte_order, sp);
   regcache_cooked_write (regcache, VAX_AP_REGNUM, buf);
 
   return sp;
@@ -148,6 +151,7 @@ vax_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                     struct value **args, CORE_ADDR sp, int struct_return,
                     CORE_ADDR struct_addr)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR fp = sp;
   gdb_byte buf[4];
 
@@ -160,12 +164,12 @@ vax_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
   /* Store return address in the PC slot.  */
   sp -= 4;
-  store_unsigned_integer (buf, 4, bp_addr);
+  store_unsigned_integer (buf, 4, byte_order, bp_addr);
   write_memory (sp, buf, 4);
 
   /* Store the (fake) frame pointer in the FP slot.  */
   sp -= 4;
-  store_unsigned_integer (buf, 4, fp);
+  store_unsigned_integer (buf, 4, byte_order, fp);
   write_memory (sp, buf, 4);
 
   /* Skip the AP slot.  */
@@ -173,16 +177,16 @@ vax_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
   /* Store register save mask and control bits.  */
   sp -= 4;
-  store_unsigned_integer (buf, 4, 0);
+  store_unsigned_integer (buf, 4, byte_order, 0);
   write_memory (sp, buf, 4);
 
   /* Store condition handler.  */
   sp -= 4;
-  store_unsigned_integer (buf, 4, 0);
+  store_unsigned_integer (buf, 4, byte_order, 0);
   write_memory (sp, buf, 4);
 
   /* Update the stack pointer and frame pointer.  */
-  store_unsigned_integer (buf, 4, sp);
+  store_unsigned_integer (buf, 4, byte_order, sp);
   regcache_cooked_write (regcache, VAX_SP_REGNUM, buf);
   regcache_cooked_write (regcache, VAX_FP_REGNUM, buf);
 
@@ -191,19 +195,19 @@ vax_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 }
 
 static struct frame_id
-vax_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
+vax_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
 {
   CORE_ADDR fp;
 
-  fp = frame_unwind_register_unsigned (next_frame, VAX_FP_REGNUM);
-  return frame_id_build (fp, frame_pc_unwind (next_frame));
+  fp = get_frame_register_unsigned (this_frame, VAX_FP_REGNUM);
+  return frame_id_build (fp, get_frame_pc (this_frame));
 }
 \f
 
 static enum return_value_convention
-vax_return_value (struct gdbarch *gdbarch, struct type *type,
-                 struct regcache *regcache, gdb_byte *readbuf,
-                 const gdb_byte *writebuf)
+vax_return_value (struct gdbarch *gdbarch, struct type *func_type,
+                 struct type *type, struct regcache *regcache,
+                 gdb_byte *readbuf, const gdb_byte *writebuf)
 {
   int len = TYPE_LENGTH (type);
   gdb_byte buf[8];
@@ -267,28 +271,29 @@ vax_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pc, int *len)
    to reach some "real" code.  */
 
 static CORE_ADDR
-vax_skip_prologue (CORE_ADDR pc)
+vax_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
-  gdb_byte op = read_memory_unsigned_integer (pc, 1);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  gdb_byte op = read_memory_unsigned_integer (pc, 1, byte_order);
 
   if (op == 0x11)
     pc += 2;                   /* skip brb */
   if (op == 0x31)
     pc += 3;                   /* skip brw */
   if (op == 0xC2
-      && (read_memory_unsigned_integer (pc + 2, 1)) == 0x5E)
+      && read_memory_unsigned_integer (pc + 2, 1, byte_order) == 0x5E)
     pc += 3;                   /* skip subl2 */
   if (op == 0x9E
-      && (read_memory_unsigned_integer (pc + 1, 1)) == 0xAE
-      && (read_memory_unsigned_integer (pc + 3, 1)) == 0x5E)
+      && read_memory_unsigned_integer (pc + 1, 1, byte_order) == 0xAE
+      && read_memory_unsigned_integer (pc + 3, 1, byte_order) == 0x5E)
     pc += 4;                   /* skip movab */
   if (op == 0x9E
-      && (read_memory_unsigned_integer (pc + 1, 1)) == 0xCE
-      && (read_memory_unsigned_integer (pc + 4, 1)) == 0x5E)
+      && read_memory_unsigned_integer (pc + 1, 1, byte_order) == 0xCE
+      && read_memory_unsigned_integer (pc + 4, 1, byte_order) == 0x5E)
     pc += 5;                   /* skip movab */
   if (op == 0x9E
-      && (read_memory_unsigned_integer (pc + 1, 1)) == 0xEE
-      && (read_memory_unsigned_integer (pc + 6, 1)) == 0x5E)
+      && read_memory_unsigned_integer (pc + 1, 1, byte_order) == 0xEE
+      && read_memory_unsigned_integer (pc + 6, 1, byte_order) == 0x5E)
     pc += 7;                   /* skip movab */
 
   return pc;
@@ -310,8 +315,8 @@ struct vax_frame_cache
   struct trad_frame_saved_reg *saved_regs;
 };
 
-struct vax_frame_cache *
-vax_frame_cache (struct frame_info *next_frame, void **this_cache)
+static struct vax_frame_cache *
+vax_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct vax_frame_cache *cache;
   CORE_ADDR addr;
@@ -323,16 +328,16 @@ vax_frame_cache (struct frame_info *next_frame, void **this_cache)
 
   /* Allocate a new cache.  */
   cache = FRAME_OBSTACK_ZALLOC (struct vax_frame_cache);
-  cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
+  cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
 
   /* The frame pointer is used as the base for the frame.  */
-  cache->base = frame_unwind_register_unsigned (next_frame, VAX_FP_REGNUM);
+  cache->base = get_frame_register_unsigned (this_frame, VAX_FP_REGNUM);
   if (cache->base == 0)
     return cache;
 
   /* The register save mask and control bits determine the layout of
      the stack frame.  */
-  mask = get_frame_memory_unsigned (next_frame, cache->base + 4, 4) >> 16;
+  mask = get_frame_memory_unsigned (this_frame, cache->base + 4, 4) >> 16;
 
   /* These are always saved.  */
   cache->saved_regs[VAX_PC_REGNUM].addr = cache->base + 16;
@@ -362,7 +367,7 @@ vax_frame_cache (struct frame_info *next_frame, void **this_cache)
          stack address for the arguments that were pushed onto the
          stack.  The return instruction will automatically pop the
          arguments from the stack.  */
-      numarg = get_frame_memory_unsigned (next_frame, addr, 1);
+      numarg = get_frame_memory_unsigned (this_frame, addr, 1);
       addr += 4 + numarg * 4;
     }
 
@@ -373,57 +378,49 @@ vax_frame_cache (struct frame_info *next_frame, void **this_cache)
 }
 
 static void
-vax_frame_this_id (struct frame_info *next_frame, void **this_cache,
+vax_frame_this_id (struct frame_info *this_frame, void **this_cache,
                   struct frame_id *this_id)
 {
-  struct vax_frame_cache *cache = vax_frame_cache (next_frame, this_cache);
+  struct vax_frame_cache *cache = vax_frame_cache (this_frame, this_cache);
 
   /* This marks the outermost frame.  */
   if (cache->base == 0)
     return;
 
-  (*this_id) = frame_id_build (cache->base,
-                              frame_func_unwind (next_frame, NORMAL_FRAME));
+  (*this_id) = frame_id_build (cache->base, get_frame_func (this_frame));
 }
 
-static void
-vax_frame_prev_register (struct frame_info *next_frame, void **this_cache,
-                        int regnum, int *optimizedp,
-                        enum lval_type *lvalp, CORE_ADDR *addrp,
-                        int *realnump, gdb_byte *valuep)
+static struct value *
+vax_frame_prev_register (struct frame_info *this_frame,
+                        void **this_cache, int regnum)
 {
-  struct vax_frame_cache *cache = vax_frame_cache (next_frame, this_cache);
+  struct vax_frame_cache *cache = vax_frame_cache (this_frame, this_cache);
 
-  trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
-                               optimizedp, lvalp, addrp, realnump, valuep);
+  return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
 }
 
 static const struct frame_unwind vax_frame_unwind =
 {
   NORMAL_FRAME,
   vax_frame_this_id,
-  vax_frame_prev_register
+  vax_frame_prev_register,
+  NULL,
+  default_frame_sniffer
 };
-
-static const struct frame_unwind *
-vax_frame_sniffer (struct frame_info *next_frame)
-{
-  return &vax_frame_unwind;
-}
 \f
 
 static CORE_ADDR
-vax_frame_base_address (struct frame_info *next_frame, void **this_cache)
+vax_frame_base_address (struct frame_info *this_frame, void **this_cache)
 {
-  struct vax_frame_cache *cache = vax_frame_cache (next_frame, this_cache);
+  struct vax_frame_cache *cache = vax_frame_cache (this_frame, this_cache);
 
   return cache->base;
 }
 
 static CORE_ADDR
-vax_frame_args_address (struct frame_info *next_frame, void **this_cache)
+vax_frame_args_address (struct frame_info *this_frame, void **this_cache)
 {
-  return frame_unwind_register_unsigned (next_frame, VAX_AP_REGNUM);
+  return get_frame_register_unsigned (this_frame, VAX_AP_REGNUM);
 }
 
 static const struct frame_base vax_frame_base =
@@ -505,7 +502,7 @@ vax_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* Call dummy code.  */
   set_gdbarch_push_dummy_call (gdbarch, vax_push_dummy_call);
-  set_gdbarch_unwind_dummy_id (gdbarch, vax_unwind_dummy_id);
+  set_gdbarch_dummy_id (gdbarch, vax_dummy_id);
 
   /* Breakpoint info */
   set_gdbarch_breakpoint_from_pc (gdbarch, vax_breakpoint_from_pc);
@@ -523,7 +520,7 @@ vax_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Hook in ABI-specific overrides, if they have been registered.  */
   gdbarch_init_osabi (info, gdbarch);
 
-  frame_unwind_append_sniffer (gdbarch, vax_frame_sniffer);
+  frame_unwind_append_unwinder (gdbarch, &vax_frame_unwind);
 
   return (gdbarch);
 }