* defilep.y (def_name, def_library): Combine into...
[deliverable/binutils-gdb.git] / gdb / hppa-tdep.c
index 7c9ece370eacc0f2dc82c3258fb35a19fdad078f..7b12e7d119179a1c5061482d4a43f8eefe4f39f2 100644 (file)
@@ -72,102 +72,6 @@ const struct objfile_data *hppa_objfile_priv_data = NULL;
    following functions static, once we hppa is partially multiarched.  */
 int hppa_pc_requires_run_before_use (CORE_ADDR pc);
 
-/* Handle 32/64-bit struct return conventions.  */
-
-static enum return_value_convention
-hppa32_return_value (struct gdbarch *gdbarch,
-                    struct type *type, struct regcache *regcache,
-                    void *readbuf, const void *writebuf)
-{
-  if (TYPE_LENGTH (type) <= 2 * 4)
-    {
-      /* The value always lives in the right hand end of the register
-        (or register pair)?  */
-      int b;
-      int reg = TYPE_CODE (type) == TYPE_CODE_FLT ? HPPA_FP4_REGNUM : 28;
-      int part = TYPE_LENGTH (type) % 4;
-      /* The left hand register contains only part of the value,
-        transfer that first so that the rest can be xfered as entire
-        4-byte registers.  */
-      if (part > 0)
-       {
-         if (readbuf != NULL)
-           regcache_cooked_read_part (regcache, reg, 4 - part,
-                                      part, readbuf);
-         if (writebuf != NULL)
-           regcache_cooked_write_part (regcache, reg, 4 - part,
-                                       part, writebuf);
-         reg++;
-       }
-      /* Now transfer the remaining register values.  */
-      for (b = part; b < TYPE_LENGTH (type); b += 4)
-       {
-         if (readbuf != NULL)
-           regcache_cooked_read (regcache, reg, (char *) readbuf + b);
-         if (writebuf != NULL)
-           regcache_cooked_write (regcache, reg, (const char *) writebuf + b);
-         reg++;
-       }
-      return RETURN_VALUE_REGISTER_CONVENTION;
-    }
-  else
-    return RETURN_VALUE_STRUCT_CONVENTION;
-}
-
-static enum return_value_convention
-hppa64_return_value (struct gdbarch *gdbarch,
-                    struct type *type, struct regcache *regcache,
-                    void *readbuf, const void *writebuf)
-{
-  /* RM: Floats are returned in FR4R, doubles in FR4.  Integral values
-     are in r28, padded on the left.  Aggregates less that 65 bits are
-     in r28, right padded.  Aggregates upto 128 bits are in r28 and
-     r29, right padded.  */ 
-  if (TYPE_CODE (type) == TYPE_CODE_FLT
-      && TYPE_LENGTH (type) <= 8)
-    {
-      /* Floats are right aligned?  */
-      int offset = register_size (gdbarch, HPPA_FP4_REGNUM) - TYPE_LENGTH (type);
-      if (readbuf != NULL)
-       regcache_cooked_read_part (regcache, HPPA_FP4_REGNUM, offset,
-                                  TYPE_LENGTH (type), readbuf);
-      if (writebuf != NULL)
-       regcache_cooked_write_part (regcache, HPPA_FP4_REGNUM, offset,
-                                   TYPE_LENGTH (type), writebuf);
-      return RETURN_VALUE_REGISTER_CONVENTION;
-    }
-  else if (TYPE_LENGTH (type) <= 8 && is_integral_type (type))
-    {
-      /* Integrals are right aligned.  */
-      int offset = register_size (gdbarch, HPPA_FP4_REGNUM) - TYPE_LENGTH (type);
-      if (readbuf != NULL)
-       regcache_cooked_read_part (regcache, 28, offset,
-                                  TYPE_LENGTH (type), readbuf);
-      if (writebuf != NULL)
-       regcache_cooked_write_part (regcache, 28, offset,
-                                   TYPE_LENGTH (type), writebuf);
-      return RETURN_VALUE_REGISTER_CONVENTION;
-    }
-  else if (TYPE_LENGTH (type) <= 2 * 8)
-    {
-      /* Composite values are left aligned.  */
-      int b;
-      for (b = 0; b < TYPE_LENGTH (type); b += 8)
-       {
-         int part = min (8, TYPE_LENGTH (type) - b);
-         if (readbuf != NULL)
-           regcache_cooked_read_part (regcache, 28 + b / 8, 0, part,
-                                      (char *) readbuf + b);
-         if (writebuf != NULL)
-           regcache_cooked_write_part (regcache, 28 + b / 8, 0, part,
-                                       (const char *) writebuf + b);
-       }
-      return RETURN_VALUE_REGISTER_CONVENTION;
-    }
-  else
-    return RETURN_VALUE_STRUCT_CONVENTION;
-}
-
 /* Routines to extract various sized constants out of hppa 
    instructions. */
 
@@ -928,138 +832,340 @@ hppa32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   return param_end;
 }
 
-/* This function pushes a stack frame with arguments as part of the
-   inferior function calling mechanism.
+/* The 64-bit PA-RISC calling conventions are documented in "64-Bit
+   Runtime Architecture for PA-RISC 2.0", which is distributed as part
+   as of the HP-UX Software Transition Kit (STK).  This implementation
+   is based on version 3.3, dated October 6, 1997.  */
 
-   This is the version for the PA64, in which later arguments appear
-   at higher addresses.  (The stack always grows towards higher
-   addresses.)
+/* Check whether TYPE is an "Integral or Pointer Scalar Type".  */
 
-   We simply allocate the appropriate amount of stack space and put
-   arguments into their proper slots.
+static int
+hppa64_integral_or_pointer_p (const struct type *type)
+{
+  switch (TYPE_CODE (type))
+    {
+    case TYPE_CODE_INT:
+    case TYPE_CODE_BOOL:
+    case TYPE_CODE_CHAR:
+    case TYPE_CODE_ENUM:
+    case TYPE_CODE_RANGE:
+      {
+       int len = TYPE_LENGTH (type);
+       return (len == 1 || len == 2 || len == 4 || len == 8);
+      }
+    case TYPE_CODE_PTR:
+    case TYPE_CODE_REF:
+      return (TYPE_LENGTH (type) == 8);
+    default:
+      break;
+    }
+
+  return 0;
+}
+
+/* Check whether TYPE is a "Floating Scalar Type".  */
+
+static int
+hppa64_floating_p (const struct type *type)
+{
+  switch (TYPE_CODE (type))
+    {
+    case TYPE_CODE_FLT:
+      {
+       int len = TYPE_LENGTH (type);
+       return (len == 4 || len == 8 || len == 16);
+      }
+    default:
+      break;
+    }
+
+  return 0;
+}
 
-   This ABI also requires that the caller provide an argument pointer
-   to the callee, so we do that too.  */
-   
 static CORE_ADDR
 hppa64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                        struct regcache *regcache, CORE_ADDR bp_addr,
                        int nargs, struct value **args, CORE_ADDR sp,
                        int struct_return, CORE_ADDR struct_addr)
 {
-  /* NOTE: cagney/2004-02-27: This is a guess - its implemented by
-     reverse engineering testsuite failures.  */
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  int i, offset = 0;
+  CORE_ADDR gp;
 
-  /* Stack base address at which any pass-by-reference parameters are
-     stored.  */
-  CORE_ADDR struct_end = 0;
-  /* Stack base address at which the first parameter is stored.  */
-  CORE_ADDR param_end = 0;
+  /* "The outgoing parameter area [...] must be aligned at a 16-byte
+     boundary."  */
+  sp = align_up (sp, 16);
 
-  /* The inner most end of the stack after all the parameters have
-     been pushed.  */
-  CORE_ADDR new_sp = 0;
+  for (i = 0; i < nargs; i++)
+    {
+      struct value *arg = args[i];
+      struct type *type = value_type (arg);
+      int len = TYPE_LENGTH (type);
+      char *valbuf;
+      int regnum;
 
-  /* Global pointer (r27) of the function we are trying to call.  */
-  CORE_ADDR gp;
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+      /* "Each parameter begins on a 64-bit (8-byte) boundary."  */
+      offset = align_up (offset, 8);
 
-  /* Two passes.  First pass computes the location of everything,
-     second pass writes the bytes out.  */
-  int write_pass;
-  for (write_pass = 0; write_pass < 2; write_pass++)
-    {
-      CORE_ADDR struct_ptr = 0;
-      CORE_ADDR param_ptr = 0;
-      int i;
-      for (i = 0; i < nargs; i++)
+      if (hppa64_integral_or_pointer_p (type))
        {
-         struct value *arg = args[i];
-         struct type *type = check_typedef (value_type (arg));
-         if ((TYPE_CODE (type) == TYPE_CODE_INT
-              || TYPE_CODE (type) == TYPE_CODE_ENUM)
-             && TYPE_LENGTH (type) <= 8)
+         /* "Integral scalar parameters smaller than 64 bits are
+             padded on the left (i.e., the value is in the
+             least-significant bits of the 64-bit storage unit, and
+             the high-order bits are undefined)."  Therefore we can
+             safely sign-extend them.  */
+         if (len < 8)
            {
-             /* Integer value store, right aligned.  "unpack_long"
-                takes care of any sign-extension problems.  */
-             param_ptr += 8;
-             if (write_pass)
-               {
-                 ULONGEST val = unpack_long (type, VALUE_CONTENTS (arg));
-                 int reg = 27 - param_ptr / 8;
-                 write_memory_unsigned_integer (param_end - param_ptr,
-                                                val, 8);
-                 if (reg >= 19)
-                   regcache_cooked_write_unsigned (regcache, reg, val);
-               }
+             arg = value_cast (builtin_type_int64, arg);
+             len = 8;
+           }
+       }
+      else if (hppa64_floating_p (type))
+       {
+         if (len > 8)
+           {
+             /* "Quad-precision (128-bit) floating-point scalar
+                parameters are aligned on a 16-byte boundary."  */
+             offset = align_up (offset, 16);
+
+             /* "Double-extended- and quad-precision floating-point
+                 parameters within the first 64 bytes of the parameter
+                 list are always passed in general registers."  */
            }
          else
            {
-             /* Small struct value, store left aligned?  */
-             int reg;
-             if (TYPE_LENGTH (type) > 8)
-               {
-                 param_ptr = align_up (param_ptr, 16);
-                 reg = 26 - param_ptr / 8;
-                 param_ptr += align_up (TYPE_LENGTH (type), 16);
-               }
-             else
+             if (len == 4)
                {
-                 param_ptr = align_up (param_ptr, 8);
-                 reg = 26 - param_ptr / 8;
-                 param_ptr += align_up (TYPE_LENGTH (type), 8);
+                 /* "Single-precision (32-bit) floating-point scalar
+                    parameters are padded on the left with 32 bits of
+                    garbage (i.e., the floating-point value is in the
+                    least-significant 32 bits of a 64-bit storage
+                    unit)."  */
+                 offset += 4;
                }
-             if (write_pass)
+
+             /* "Single- and double-precision floating-point
+                 parameters in this area are passed according to the
+                 available formal parameter information in a function
+                 prototype.  [...]  If no prototype is in scope,
+                 floating-point parameters must be passed both in the
+                 corresponding general registers and in the
+                 corresponding floating-point registers."  */
+             regnum = HPPA64_FP4_REGNUM + offset / 8;
+
+             if (regnum < HPPA64_FP4_REGNUM + 8)
                {
-                 int byte;
-                 write_memory (param_end - param_ptr, VALUE_CONTENTS (arg),
-                               TYPE_LENGTH (type));
-                 for (byte = 0; byte < TYPE_LENGTH (type); byte += 8)
-                   {
-                     if (reg >= 19)
-                       {
-                         int len = min (8, TYPE_LENGTH (type) - byte);
-                         regcache_cooked_write_part (regcache, reg, 0, len,
-                                                     VALUE_CONTENTS (arg) + byte);
-                       }
-                     reg--;
-                   }
+                 /* "Single-precision floating-point parameters, when
+                    passed in floating-point registers, are passed in
+                    the right halves of the floating point registers;
+                    the left halves are unused."  */
+                 regcache_cooked_write_part (regcache, regnum, offset % 8,
+                                             len, VALUE_CONTENTS (arg));
                }
            }
        }
-      /* Update the various stack pointers.  */
-      if (!write_pass)
+      else
        {
-         struct_end = sp + struct_ptr;
-         /* PARAM_PTR already accounts for all the arguments passed
-            by the user.  However, the ABI mandates minimum stack
-            space allocations for outgoing arguments.  The ABI also
-            mandates minimum stack alignments which we must
-            preserve.  */
-         param_end = struct_end + max (align_up (param_ptr, 16), 64);
+         if (len > 8)
+           {
+             /* "Aggregates larger than 8 bytes are aligned on a
+                16-byte boundary, possibly leaving an unused argument
+                slot, which is filled with garbage. If necessary,
+                they are padded on the right (with garbage), to a
+                multiple of 8 bytes."  */
+             offset = align_up (offset, 16);
+           }
        }
+
+      /* Always store the argument in memory.  */
+      write_memory (sp + offset, VALUE_CONTENTS (arg), len);
+
+      valbuf = VALUE_CONTENTS (arg);
+      regnum = HPPA_ARG0_REGNUM - offset / 8;
+      while (regnum > HPPA_ARG0_REGNUM - 8 && len > 0)
+       {
+         regcache_cooked_write_part (regcache, regnum,
+                                     offset % 8, min (len, 8), valbuf);
+         offset += min (len, 8);
+         valbuf += min (len, 8);
+         len -= min (len, 8);
+         regnum--;
+       }
+
+      offset += len;
     }
 
-  /* If a structure has to be returned, set up register 28 to hold its
-     address */
+  /* Set up GR29 (%ret1) to hold the argument pointer (ap).  */
+  regcache_cooked_write_unsigned (regcache, HPPA_RET1_REGNUM, sp + 64);
+
+  /* Allocate the outgoing parameter area.  Make sure the outgoing
+     parameter area is multiple of 16 bytes in length.  */
+  sp += max (align_up (offset, 16), 64);
+
+  /* Allocate 32-bytes of scratch space.  The documentation doesn't
+     mention this, but it seems to be needed.  */
+  sp += 32;
+
+  /* Allocate the frame marker area.  */
+  sp += 16;
+
+  /* If a structure has to be returned, set up GR 28 (%ret0) to hold
+     its address.  */
   if (struct_return)
-    write_register (28, struct_addr);
+    regcache_cooked_write_unsigned (regcache, HPPA_RET0_REGNUM, struct_addr);
 
+  /* Set up GR27 (%dp) to hold the global pointer (gp).  */
   gp = tdep->find_global_pointer (function);
-
   if (gp != 0)
-    write_register (27, gp);
+    regcache_cooked_write_unsigned (regcache, HPPA_DP_REGNUM, gp);
 
-  /* Set the return address.  */
+  /* Set up GR2 (%rp) to hold the return pointer (rp).  */
   if (!gdbarch_push_dummy_code_p (gdbarch))
     regcache_cooked_write_unsigned (regcache, HPPA_RP_REGNUM, bp_addr);
 
-  /* Update the Stack Pointer.  */
-  regcache_cooked_write_unsigned (regcache, HPPA_SP_REGNUM, param_end + 64);
+  /* Set up GR30 to hold the stack pointer (sp).  */
+  regcache_cooked_write_unsigned (regcache, HPPA_SP_REGNUM, sp);
+
+  return sp;
+}
+\f
+
+/* Handle 32/64-bit struct return conventions.  */
+
+static enum return_value_convention
+hppa32_return_value (struct gdbarch *gdbarch,
+                    struct type *type, struct regcache *regcache,
+                    void *readbuf, const void *writebuf)
+{
+  if (TYPE_LENGTH (type) <= 2 * 4)
+    {
+      /* The value always lives in the right hand end of the register
+        (or register pair)?  */
+      int b;
+      int reg = TYPE_CODE (type) == TYPE_CODE_FLT ? HPPA_FP4_REGNUM : 28;
+      int part = TYPE_LENGTH (type) % 4;
+      /* The left hand register contains only part of the value,
+        transfer that first so that the rest can be xfered as entire
+        4-byte registers.  */
+      if (part > 0)
+       {
+         if (readbuf != NULL)
+           regcache_cooked_read_part (regcache, reg, 4 - part,
+                                      part, readbuf);
+         if (writebuf != NULL)
+           regcache_cooked_write_part (regcache, reg, 4 - part,
+                                       part, writebuf);
+         reg++;
+       }
+      /* Now transfer the remaining register values.  */
+      for (b = part; b < TYPE_LENGTH (type); b += 4)
+       {
+         if (readbuf != NULL)
+           regcache_cooked_read (regcache, reg, (char *) readbuf + b);
+         if (writebuf != NULL)
+           regcache_cooked_write (regcache, reg, (const char *) writebuf + b);
+         reg++;
+       }
+      return RETURN_VALUE_REGISTER_CONVENTION;
+    }
+  else
+    return RETURN_VALUE_STRUCT_CONVENTION;
+}
+
+static enum return_value_convention
+hppa64_return_value (struct gdbarch *gdbarch,
+                    struct type *type, struct regcache *regcache,
+                    void *readbuf, const void *writebuf)
+{
+  int len = TYPE_LENGTH (type);
+  int regnum, offset;
+
+  if (len > 16)
+    {
+      /* All return values larget than 128 bits must be aggregate
+         return values.  */
+      gdb_assert (!hppa64_integral_or_pointer_p (type));
+      gdb_assert (!hppa64_floating_p (type));
+
+      /* "Aggregate return values larger than 128 bits are returned in
+        a buffer allocated by the caller.  The address of the buffer
+        must be passed in GR 28."  */
+      return RETURN_VALUE_STRUCT_CONVENTION;
+    }
+
+  if (hppa64_integral_or_pointer_p (type))
+    {
+      /* "Integral return values are returned in GR 28.  Values
+         smaller than 64 bits are padded on the left (with garbage)."  */
+      regnum = HPPA_RET0_REGNUM;
+      offset = 8 - len;
+    }
+  else if (hppa64_floating_p (type))
+    {
+      if (len > 8)
+       {
+         /* "Double-extended- and quad-precision floating-point
+            values are returned in GRs 28 and 29.  The sign,
+            exponent, and most-significant bits of the mantissa are
+            returned in GR 28; the least-significant bits of the
+            mantissa are passed in GR 29.  For double-extended
+            precision values, GR 29 is padded on the right with 48
+            bits of garbage."  */
+         regnum = HPPA_RET0_REGNUM;
+         offset = 0;
+       }
+      else
+       {
+         /* "Single-precision and double-precision floating-point
+            return values are returned in FR 4R (single precision) or
+            FR 4 (double-precision)."  */
+         regnum = HPPA64_FP4_REGNUM;
+         offset = 8 - len;
+       }
+    }
+  else
+    {
+      /* "Aggregate return values up to 64 bits in size are returned
+         in GR 28.  Aggregates smaller than 64 bits are left aligned
+         in the register; the pad bits on the right are undefined."
+
+        "Aggregate return values between 65 and 128 bits are returned
+        in GRs 28 and 29.  The first 64 bits are placed in GR 28, and
+        the remaining bits are placed, left aligned, in GR 29.  The
+        pad bits on the right of GR 29 (if any) are undefined."  */
+      regnum = HPPA_RET0_REGNUM;
+      offset = 0;
+    }
 
-  /* The stack will have 32 bytes of additional space for a frame marker.  */
-  return param_end + 64;
+  if (readbuf)
+    {
+      char *buf = readbuf;
+      while (len > 0)
+       {
+         regcache_cooked_read_part (regcache, regnum, offset,
+                                    min (len, 8), buf);
+         buf += min (len, 8);
+         len -= min (len, 8);
+         regnum++;
+       }
+    }
+
+  if (writebuf)
+    {
+      const char *buf = writebuf;
+      while (len > 0)
+       {
+         regcache_cooked_write_part (regcache, regnum, offset,
+                                     min (len, 8), buf);
+         buf += min (len, 8);
+         len -= min (len, 8);
+         regnum++;
+       }
+    }
+
+  return RETURN_VALUE_REGISTER_CONVENTION;
 }
+\f
 
 static CORE_ADDR
 hppa32_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
@@ -1179,9 +1285,9 @@ prologue_inst_adjust_sp (unsigned long inst)
   if ((inst & 0xffe00008) == 0x73c00008)
     return (inst & 0x1 ? -1 << 13 : 0) | (((inst >> 4) & 0x3ff) << 3);
 
-  /* addil high21,%r1; ldo low11,(%r1),%r30)
+  /* addil high21,%r30; ldo low11,(%r1),%r30)
      save high bits in save_high21 for later use.  */
-  if ((inst & 0xffe00000) == 0x28200000)
+  if ((inst & 0xffe00000) == 0x2bc00000)
     {
       save_high21 = hppa_extract_21 (inst);
       return 0;
@@ -2426,41 +2532,46 @@ hppa_pc_requires_run_before_use (CORE_ADDR pc)
   return (!target_has_stack && (pc & 0xFF000000));
 }
 
-/* Return the GDB type object for the "standard" data type of data
-   in register N.  */
+/* Return the GDB type object for the "standard" data type of data in
+   register REGNUM.  */
 
 static struct type *
-hppa32_register_type (struct gdbarch *gdbarch, int reg_nr)
+hppa32_register_type (struct gdbarch *gdbarch, int regnum)
 {
-   if (reg_nr < HPPA_FP4_REGNUM)
+   if (regnum < HPPA_FP4_REGNUM)
      return builtin_type_uint32;
    else
      return builtin_type_ieee_single_big;
 }
 
-/* Return the GDB type object for the "standard" data type of data
-   in register N.  hppa64 version.  */
-
 static struct type *
-hppa64_register_type (struct gdbarch *gdbarch, int reg_nr)
+hppa64_register_type (struct gdbarch *gdbarch, int regnum)
 {
-   if (reg_nr < HPPA_FP4_REGNUM)
+   if (regnum < HPPA64_FP4_REGNUM)
      return builtin_type_uint64;
    else
      return builtin_type_ieee_double_big;
 }
 
-/* Return True if REGNUM is not a register available to the user
-   through ptrace().  */
+/* Return non-zero if REGNUM is not a register available to the user
+   through ptrace/ttrace.  */
 
 static int
-hppa_cannot_store_register (int regnum)
+hppa32_cannot_store_register (int regnum)
 {
   return (regnum == 0
           || regnum == HPPA_PCSQ_HEAD_REGNUM
           || (regnum >= HPPA_PCSQ_TAIL_REGNUM && regnum < HPPA_IPSW_REGNUM)
           || (regnum > HPPA_IPSW_REGNUM && regnum < HPPA_FP4_REGNUM));
+}
 
+static int
+hppa64_cannot_store_register (int regnum)
+{
+  return (regnum == 0
+          || regnum == HPPA_PCSQ_HEAD_REGNUM
+          || (regnum >= HPPA_PCSQ_TAIL_REGNUM && regnum < HPPA_IPSW_REGNUM)
+          || (regnum > HPPA_IPSW_REGNUM && regnum < HPPA64_FP4_REGNUM));
 }
 
 static CORE_ADDR
@@ -2511,18 +2622,21 @@ hppa_frame_prev_register_helper (struct frame_info *next_frame,
                                 enum lval_type *lvalp, CORE_ADDR *addrp,
                                 int *realnump, void *valuep)
 {
+  struct gdbarch *arch = get_frame_arch (next_frame);
+
   if (regnum == HPPA_PCOQ_TAIL_REGNUM)
     {
       if (valuep)
        {
+         int size = register_size (arch, HPPA_PCOQ_HEAD_REGNUM);
          CORE_ADDR pc;
 
          trad_frame_get_prev_register (next_frame, saved_regs,
                                        HPPA_PCOQ_HEAD_REGNUM, optimizedp,
                                        lvalp, addrp, realnump, valuep);
 
-         pc = extract_unsigned_integer (valuep, 4);
-         store_unsigned_integer (valuep, 4, pc + 4);
+         pc = extract_unsigned_integer (valuep, size);
+         store_unsigned_integer (valuep, size, pc + 4);
        }
 
       /* It's a computed value.  */
@@ -2541,10 +2655,7 @@ hppa_frame_prev_register_helper (struct frame_info *next_frame,
   if (regnum == HPPA_FLAGS_REGNUM)
     {
       if (valuep)
-       store_unsigned_integer (valuep, 
-                               register_size (get_frame_arch (next_frame), 
-                                              regnum), 
-                               0);
+       store_unsigned_integer (valuep, register_size (arch, regnum), 0);
 
       /* It's a computed value.  */
       *optimizedp = 0;
@@ -2636,11 +2747,19 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
         set_gdbarch_num_regs (gdbarch, hppa32_num_regs);
         set_gdbarch_register_name (gdbarch, hppa32_register_name);
         set_gdbarch_register_type (gdbarch, hppa32_register_type);
+       set_gdbarch_cannot_store_register (gdbarch,
+                                          hppa32_cannot_store_register);
+       set_gdbarch_cannot_fetch_register (gdbarch,
+                                          hppa32_cannot_store_register);
         break;
       case 8:
         set_gdbarch_num_regs (gdbarch, hppa64_num_regs);
         set_gdbarch_register_name (gdbarch, hppa64_register_name);
         set_gdbarch_register_type (gdbarch, hppa64_register_type);
+       set_gdbarch_cannot_store_register (gdbarch,
+                                          hppa64_cannot_store_register);
+       set_gdbarch_cannot_fetch_register (gdbarch,
+                                          hppa64_cannot_store_register);
         break;
       default:
         internal_error (__FILE__, __LINE__, "Unsupported address size: %d",
@@ -2664,8 +2783,6 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_inner_than (gdbarch, core_addr_greaterthan);
   set_gdbarch_sp_regnum (gdbarch, HPPA_SP_REGNUM);
   set_gdbarch_fp0_regnum (gdbarch, HPPA_FP0_REGNUM);
-  set_gdbarch_cannot_store_register (gdbarch, hppa_cannot_store_register);
-  set_gdbarch_cannot_fetch_register (gdbarch, hppa_cannot_store_register);
   set_gdbarch_addr_bits_remove (gdbarch, hppa_smash_text_address);
   set_gdbarch_smash_text_address (gdbarch, hppa_smash_text_address);
   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
This page took 0.030925 seconds and 4 git commands to generate.