Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / ia64-tdep.c
index c3611a9524ec6355236eb713039adcfa80907f14..aa47b211db5231687050a62ecfd37261a37aebe2 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for the IA-64 for GDB, the GNU debugger.
 
-   Copyright (C) 1999-2013 Free Software Foundation, Inc.
+   Copyright (C) 1999-2021 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -28,9 +28,8 @@
 #include "frame.h"
 #include "frame-base.h"
 #include "frame-unwind.h"
-#include "doublest.h"
+#include "target-float.h"
 #include "value.h"
-#include "gdb_assert.h"
 #include "objfiles.h"
 #include "elf/common.h"                /* for DT_PLTGOT value */
 #include "elf-bfd.h"
 #include "ia64-libunwind-tdep.h"
 
 /* Note: KERNEL_START is supposed to be an address which is not going
-         to ever contain any valid unwind info.  For ia64 linux, the choice
-         of 0xc000000000000000 is fairly safe since that's uncached space.
+        to ever contain any valid unwind info.  For ia64 linux, the choice
+        of 0xc000000000000000 is fairly safe since that's uncached space.
  
-         We use KERNEL_START as follows: after obtaining the kernel's
-         unwind table via getunwind(), we project its unwind data into
-         address-range KERNEL_START-(KERNEL_START+ktab_size) and then
-         when ia64_access_mem() sees a memory access to this
-         address-range, we redirect it to ktab instead.
+        We use KERNEL_START as follows: after obtaining the kernel's
+        unwind table via getunwind(), we project its unwind data into
+        address-range KERNEL_START-(KERNEL_START+ktab_size) and then
+        when ia64_access_mem() sees a memory access to this
+        address-range, we redirect it to ktab instead.
 
-         None of this hackery is needed with a modern kernel/libcs
-         which uses the kernel virtual DSO to provide access to the
-         kernel's unwind info.  In that case, ktab_size remains 0 and
-         hence the value of KERNEL_START doesn't matter.  */
+        None of this hackery is needed with a modern kernel/libcs
+        which uses the kernel virtual DSO to provide access to the
+        kernel's unwind info.  In that case, ktab_size remains 0 and
+        hence the value of KERNEL_START doesn't matter.  */
 
 #define KERNEL_START 0xc000000000000000ULL
 
@@ -70,6 +69,7 @@ struct ia64_table_entry
   };
 
 static struct ia64_table_entry *ktab = NULL;
+static gdb::optional<gdb::byte_vector> ktab_buf;
 
 #endif
 
@@ -126,9 +126,10 @@ static CORE_ADDR ia64_find_global_pointer (struct gdbarch *gdbarch,
 
 #define NUM_IA64_RAW_REGS 462
 
+/* Big enough to hold a FP register in bytes.  */
+#define IA64_FP_REGISTER_SIZE 16
+
 static int sp_regnum = IA64_GR12_REGNUM;
-static int fp_regnum = IA64_VFP_REGNUM;
-static int lr_regnum = IA64_VRAP_REGNUM;
 
 /* NOTE: we treat the register stack registers r32-r127 as
    pseudo-registers because they may not be accessible via the ptrace
@@ -143,7 +144,7 @@ enum pseudo_regs { FIRST_PSEUDO_REGNUM = NUM_IA64_RAW_REGS,
 /* Array of register names; There should be ia64_num_regs strings in
    the initializer.  */
 
-static char *ia64_register_names[] = 
+static const char * const ia64_register_names[] =
 { "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
   "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
   "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
@@ -328,8 +329,8 @@ ia64_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
   int raw_p;
   if (group == all_reggroup)
     return 1;
-  vector_p = TYPE_VECTOR (register_type (gdbarch, regnum));
-  float_p = TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT;
+  vector_p = register_type (gdbarch, regnum)->is_vector ();
+  float_p = register_type (gdbarch, regnum)->code () == TYPE_CODE_FLT;
   raw_p = regnum < NUM_IA64_RAW_REGS;
   if (group == float_reggroup)
     return float_p;
@@ -370,7 +371,7 @@ ia64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
    bit ``from''.  */
 
 static long long
-extract_bit_field (const char *bundle, int from, int len)
+extract_bit_field (const gdb_byte *bundle, int from, int len)
 {
   long long result = 0LL;
   int to = from + len;
@@ -406,7 +407,7 @@ extract_bit_field (const char *bundle, int from, int len)
 /* Replace the specified bits in an instruction bundle.  */
 
 static void
-replace_bit_field (char *bundle, long long val, int from, int len)
+replace_bit_field (gdb_byte *bundle, long long val, int from, int len)
 {
   int to = from + len;
   int from_byte = from / 8;
@@ -456,7 +457,7 @@ replace_bit_field (char *bundle, long long val, int from, int len)
    and instruction bundle.  */
 
 static long long
-slotN_contents (char *bundle, int slotnum)
+slotN_contents (gdb_byte *bundle, int slotnum)
 {
   return extract_bit_field (bundle, 5+41*slotnum, 41);
 }
@@ -464,7 +465,7 @@ slotN_contents (char *bundle, int slotnum)
 /* Store an instruction in an instruction bundle.  */
 
 static void
-replace_slotN_contents (char *bundle, long long instr, int slotnum)
+replace_slotN_contents (gdb_byte *bundle, long long instr, int slotnum)
 {
   replace_bit_field (bundle, instr, 5+41*slotnum, 41);
 }
@@ -511,9 +512,9 @@ static const enum instruction_type template_encoding_table[32][3] =
 static CORE_ADDR
 fetch_instruction (CORE_ADDR addr, instruction_type *it, long long *instr)
 {
-  char bundle[BUNDLE_LEN];
+  gdb_byte bundle[BUNDLE_LEN];
   int slotnum = (int) (addr & 0x0f) / SLOT_MULTIPLIER;
-  long long template;
+  long long templ;
   int val;
 
   /* Warn about slot numbers greater than 2.  We used to generate
@@ -544,8 +545,8 @@ fetch_instruction (CORE_ADDR addr, instruction_type *it, long long *instr)
     return 0;
 
   *instr = slotN_contents (bundle, slotnum);
-  template = extract_bit_field (bundle, 0, 5);
-  *it = template_encoding_table[(int)template][slotnum];
+  templ = extract_bit_field (bundle, 0, 5);
+  *it = template_encoding_table[(int)templ][slotnum];
 
   if (slotnum == 2 || (slotnum == 1 && *it == L))
     addr += 16;
@@ -617,7 +618,7 @@ fetch_instruction (CORE_ADDR addr, instruction_type *it, long long *instr)
    
    The current addressing used by the code below:
    original PC   placed_address   placed_size             required    covered
-                                  == bp_tgt->shadow_len   reqd \subset covered
+                                 == bp_tgt->shadow_len   reqd \subset covered
    0xABCDE0      0xABCDE0         0x10                    <0x0...0x5> <0x0..0xF>
    0xABCDE1      0xABCDE1         0xF                     <0x5...0xA> <0x1..0xF>
    0xABCDE2      0xABCDE2         0xE                     <0xA...0xF> <0x2..0xF>
@@ -638,13 +639,12 @@ static int
 ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
                               struct bp_target_info *bp_tgt)
 {
-  CORE_ADDR addr = bp_tgt->placed_address;
+  CORE_ADDR addr = bp_tgt->placed_address = bp_tgt->reqstd_address;
   gdb_byte bundle[BUNDLE_LEN];
   int slotnum = (int) (addr & 0x0f) / SLOT_MULTIPLIER, shadow_slotnum;
   long long instr_breakpoint;
   int val;
-  int template;
-  struct cleanup *cleanup;
+  int templ;
 
   if (slotnum > 2)
     error (_("Can't insert breakpoint for slot numbers greater than 2."));
@@ -656,13 +656,11 @@ ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
      Otherwise, we could possibly store into the shadow parts of the adjacent
      placed breakpoints.  It is due to our SHADOW_CONTENTS overlapping the real
      breakpoint instruction bits region.  */
-  cleanup = make_show_memory_breakpoints_cleanup (0);
+  scoped_restore restore_memory_0
+    = make_scoped_restore_show_memory_breakpoints (0);
   val = target_read_memory (addr, bundle, BUNDLE_LEN);
   if (val != 0)
-    {
-      do_cleanups (cleanup);
-      return val;
-    }
+    return val;
 
   /* SHADOW_SLOTNUM saves the original slot number as expected by the caller
      for addressing the SHADOW_CONTENTS placement.  */
@@ -672,8 +670,8 @@ ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
      a breakpoint on an L-X instruction.  */
   bp_tgt->shadow_len = BUNDLE_LEN - shadow_slotnum;
 
-  template = extract_bit_field (bundle, 0, 5);
-  if (template_encoding_table[template][slotnum] == X)
+  templ = extract_bit_field (bundle, 0, 5);
+  if (template_encoding_table[templ][slotnum] == X)
     {
       /* X unit types can only be used in slot 2, and are actually
         part of a 2-slot L-X instruction.  We cannot break at this
@@ -682,7 +680,7 @@ ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
       gdb_assert (slotnum == 2);
       error (_("Can't insert breakpoint for non-existing slot X"));
     }
-  if (template_encoding_table[template][slotnum] == L)
+  if (template_encoding_table[templ][slotnum] == L)
     {
       /* L unit types can only be used in slot 1.  But the associated
         opcode for that instruction is in slot 2, so bump the slot number
@@ -703,15 +701,13 @@ ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
      restoration mechanism kicks in and we would possibly remove parts of the
      adjacent placed breakpoints.  It is due to our SHADOW_CONTENTS overlapping
      the real breakpoint instruction bits region.  */
-  make_show_memory_breakpoints_cleanup (1);
+  scoped_restore restore_memory_1
+    = make_scoped_restore_show_memory_breakpoints (1);
   val = target_read_memory (addr, bundle, BUNDLE_LEN);
   if (val != 0)
-    {
-      do_cleanups (cleanup);
-      return val;
-    }
+    return val;
 
-  /* Breakpoints already present in the code will get deteacted and not get
+  /* Breakpoints already present in the code will get detected and not get
      reinserted by bp_loc_is_permanent.  Multiple breakpoints at the same
      location cannot induce the internal error as they are optimized into
      a single instance by update_global_location_list.  */
@@ -722,12 +718,9 @@ ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
                    paddress (gdbarch, bp_tgt->placed_address));
   replace_slotN_contents (bundle, IA64_BREAKPOINT, slotnum);
 
-  bp_tgt->placed_size = bp_tgt->shadow_len;
-
   val = target_write_memory (addr + shadow_slotnum, bundle + shadow_slotnum,
                             bp_tgt->shadow_len);
 
-  do_cleanups (cleanup);
   return val;
 }
 
@@ -740,8 +733,7 @@ ia64_memory_remove_breakpoint (struct gdbarch *gdbarch,
   int slotnum = (addr & 0x0f) / SLOT_MULTIPLIER, shadow_slotnum;
   long long instr_breakpoint, instr_saved;
   int val;
-  int template;
-  struct cleanup *cleanup;
+  int templ;
 
   addr &= ~0x0f;
 
@@ -750,20 +742,18 @@ ia64_memory_remove_breakpoint (struct gdbarch *gdbarch,
      mechanism kicks in and we would possibly remove parts of the adjacent
      placed breakpoints.  It is due to our SHADOW_CONTENTS overlapping the real
      breakpoint instruction bits region.  */
-  cleanup = make_show_memory_breakpoints_cleanup (1);
+  scoped_restore restore_memory_1
+    = make_scoped_restore_show_memory_breakpoints (1);
   val = target_read_memory (addr, bundle_mem, BUNDLE_LEN);
   if (val != 0)
-    {
-      do_cleanups (cleanup);
-      return val;
-    }
+    return val;
 
   /* SHADOW_SLOTNUM saves the original slot number as expected by the caller
      for addressing the SHADOW_CONTENTS placement.  */
   shadow_slotnum = slotnum;
 
-  template = extract_bit_field (bundle_mem, 0, 5);
-  if (template_encoding_table[template][slotnum] == X)
+  templ = extract_bit_field (bundle_mem, 0, 5);
+  if (template_encoding_table[templ][slotnum] == X)
     {
       /* X unit types can only be used in slot 2, and are actually
         part of a 2-slot L-X instruction.  We refuse to insert
@@ -774,10 +764,9 @@ ia64_memory_remove_breakpoint (struct gdbarch *gdbarch,
       warning (_("Cannot remove breakpoint at address %s from non-existing "
                 "X-type slot, memory has changed underneath"),
               paddress (gdbarch, bp_tgt->placed_address));
-      do_cleanups (cleanup);
       return -1;
     }
-  if (template_encoding_table[template][slotnum] == L)
+  if (template_encoding_table[templ][slotnum] == L)
     {
       /* L unit types can only be used in slot 1.  But the breakpoint
         was actually saved using slot 2, so update the slot number
@@ -786,8 +775,7 @@ ia64_memory_remove_breakpoint (struct gdbarch *gdbarch,
       slotnum = 2;
     }
 
-  gdb_assert (bp_tgt->placed_size == BUNDLE_LEN - shadow_slotnum);
-  gdb_assert (bp_tgt->placed_size == bp_tgt->shadow_len);
+  gdb_assert (bp_tgt->shadow_len == BUNDLE_LEN - shadow_slotnum);
 
   instr_breakpoint = slotN_contents (bundle_mem, slotnum);
   if (instr_breakpoint != IA64_BREAKPOINT)
@@ -795,7 +783,6 @@ ia64_memory_remove_breakpoint (struct gdbarch *gdbarch,
       warning (_("Cannot remove breakpoint at address %s, "
                 "no break instruction at such address."),
               paddress (gdbarch, bp_tgt->placed_address));
-      do_cleanups (cleanup);
       return -1;
     }
 
@@ -811,10 +798,18 @@ ia64_memory_remove_breakpoint (struct gdbarch *gdbarch,
   replace_slotN_contents (bundle_mem, instr_saved, slotnum);
   val = target_write_raw_memory (addr, bundle_mem, BUNDLE_LEN);
 
-  do_cleanups (cleanup);
   return val;
 }
 
+/* Implement the breakpoint_kind_from_pc gdbarch method.  */
+
+static int
+ia64_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
+{
+  /* A place holder of gdbarch method breakpoint_kind_from_pc.   */
+  return 0;
+}
+
 /* As gdbarch_breakpoint_from_pc ranges have byte granularity and ia64
    instruction slots ranges are bit-granular (41 bits) we have to provide an
    extended range as described for ia64_memory_insert_breakpoint.  We also take
@@ -830,8 +825,7 @@ ia64_breakpoint_from_pc (struct gdbarch *gdbarch,
   int slotnum = (int) (*pcptr & 0x0f) / SLOT_MULTIPLIER, shadow_slotnum;
   long long instr_fetched;
   int val;
-  int template;
-  struct cleanup *cleanup;
+  int templ;
 
   if (slotnum > 2)
     error (_("Can't insert breakpoint for slot numbers greater than 2."));
@@ -840,9 +834,11 @@ ia64_breakpoint_from_pc (struct gdbarch *gdbarch,
 
   /* Enable the automatic memory restoration from breakpoints while
      we read our instruction bundle to match bp_loc_is_permanent.  */
-  cleanup = make_show_memory_breakpoints_cleanup (0);
-  val = target_read_memory (addr, bundle, BUNDLE_LEN);
-  do_cleanups (cleanup);
+  {
+    scoped_restore restore_memory_0
+      = make_scoped_restore_show_memory_breakpoints (0);
+    val = target_read_memory (addr, bundle, BUNDLE_LEN);
+  }
 
   /* The memory might be unreachable.  This can happen, for instance,
      when the user inserts a breakpoint at an invalid address.  */
@@ -858,13 +854,13 @@ ia64_breakpoint_from_pc (struct gdbarch *gdbarch,
 
   /* Check for L type instruction in slot 1, if present then bump up the slot
      number to the slot 2.  */
-  template = extract_bit_field (bundle, 0, 5);
-  if (template_encoding_table[template][slotnum] == X)
+  templ = extract_bit_field (bundle, 0, 5);
+  if (template_encoding_table[templ][slotnum] == X)
     {
       gdb_assert (slotnum == 2);
       error (_("Can't insert breakpoint for non-existing slot X"));
     }
-  if (template_encoding_table[template][slotnum] == L)
+  if (template_encoding_table[templ][slotnum] == L)
     {
       gdb_assert (slotnum == 1);
       slotnum = 2;
@@ -881,13 +877,13 @@ ia64_breakpoint_from_pc (struct gdbarch *gdbarch,
 }
 
 static CORE_ADDR
-ia64_read_pc (struct regcache *regcache)
+ia64_read_pc (readable_regcache *regcache)
 {
   ULONGEST psr_value, pc_value;
   int slot_num;
 
-  regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr_value);
-  regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &pc_value);
+  regcache->cooked_read (IA64_PSR_REGNUM, &psr_value);
+  regcache->cooked_read (IA64_IP_REGNUM, &pc_value);
   slot_num = (psr_value >> 41) & 3;
 
   return pc_value | (slot_num * SLOT_MULTIPLIER);
@@ -932,8 +928,8 @@ rse_address_add(CORE_ADDR addr, int nslots)
 }
 
 static enum register_status
-ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
-                           int regnum, gdb_byte *buf)
+ia64_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
+                          int regnum, gdb_byte *buf)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   enum register_status status;
@@ -951,18 +947,15 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
             found sequentially in memory starting at $bof.  This
             isn't always true, but without libunwind, this is the
             best we can do.  */
-         enum register_status status;
          ULONGEST cfm;
          ULONGEST bsp;
          CORE_ADDR reg;
 
-         status = regcache_cooked_read_unsigned (regcache,
-                                                 IA64_BSP_REGNUM, &bsp);
+         status = regcache->cooked_read (IA64_BSP_REGNUM, &bsp);
          if (status != REG_VALID)
            return status;
 
-         status = regcache_cooked_read_unsigned (regcache,
-                                                 IA64_CFM_REGNUM, &cfm);
+         status = regcache->cooked_read (IA64_CFM_REGNUM, &cfm);
          if (status != REG_VALID)
            return status;
 
@@ -987,7 +980,8 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
     {
       ULONGEST unatN_val;
       ULONGEST unat;
-      status = regcache_cooked_read_unsigned (regcache, IA64_UNAT_REGNUM, &unat);
+
+      status = regcache->cooked_read (IA64_UNAT_REGNUM, &unat);
       if (status != REG_VALID)
        return status;
       unatN_val = (unat & (1LL << (regnum - IA64_NAT0_REGNUM))) != 0;
@@ -1000,10 +994,12 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
       ULONGEST bsp;
       ULONGEST cfm;
       CORE_ADDR gr_addr = 0;
-      status = regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp);
+
+      status = regcache->cooked_read (IA64_BSP_REGNUM, &bsp);
       if (status != REG_VALID)
        return status;
-      status = regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm);
+
+      status = regcache->cooked_read (IA64_CFM_REGNUM, &cfm);
       if (status != REG_VALID)
        return status;
 
@@ -1018,14 +1014,13 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
        {
          /* Compute address of nat collection bits.  */
          CORE_ADDR nat_addr = gr_addr | 0x1f8;
-         CORE_ADDR nat_collection;
+         ULONGEST nat_collection;
          int nat_bit;
          /* If our nat collection address is bigger than bsp, we have to get
             the nat collection from rnat.  Otherwise, we fetch the nat
             collection from the computed address.  */
          if (nat_addr >= bsp)
-           regcache_cooked_read_unsigned (regcache, IA64_RNAT_REGNUM,
-                                          &nat_collection);
+           regcache->cooked_read (IA64_RNAT_REGNUM, &nat_collection);
          else
            nat_collection = read_memory_integer (nat_addr, 8, byte_order);
          nat_bit = (gr_addr >> 3) & 0x3f;
@@ -1038,13 +1033,14 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
   else if (regnum == VBOF_REGNUM)
     {
       /* A virtual register frame start is provided for user convenience.
-         It can be calculated as the bsp - sof (sizeof frame).  */
+        It can be calculated as the bsp - sof (sizeof frame).  */
       ULONGEST bsp, vbsp;
       ULONGEST cfm;
-      status = regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp);
+
+      status = regcache->cooked_read (IA64_BSP_REGNUM, &bsp);
       if (status != REG_VALID)
        return status;
-      status = regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm);
+      status = regcache->cooked_read (IA64_CFM_REGNUM, &cfm);
       if (status != REG_VALID)
        return status;
 
@@ -1059,10 +1055,11 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
       ULONGEST pr;
       ULONGEST cfm;
       ULONGEST prN_val;
-      status = regcache_cooked_read_unsigned (regcache, IA64_PR_REGNUM, &pr);
+
+      status = regcache->cooked_read (IA64_PR_REGNUM, &pr);
       if (status != REG_VALID)
        return status;
-      status = regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm);
+      status = regcache->cooked_read (IA64_CFM_REGNUM, &cfm);
       if (status != REG_VALID)
        return status;
 
@@ -1074,7 +1071,7 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
 
          /* Adjust the register number to account for register rotation.  */
          regnum = VP16_REGNUM 
-                + ((regnum - VP16_REGNUM) + rrb_pr) % 48;
+                + ((regnum - VP16_REGNUM) + rrb_pr) % 48;
        }
       prN_val = (pr & (1LL << (regnum - VP0_REGNUM))) != 0;
       store_unsigned_integer (buf, register_size (gdbarch, regnum),
@@ -1104,7 +1101,7 @@ ia64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
       if ((cfm & 0x7f) > regnum - V32_REGNUM) 
        {
          ULONGEST reg_addr = rse_address_add (bsp, (regnum - V32_REGNUM));
-         write_memory (reg_addr, (void *) buf, 8);
+         write_memory (reg_addr, buf, 8);
        }
     }
   else if (IA64_NAT0_REGNUM <= regnum && regnum <= IA64_NAT31_REGNUM)
@@ -1165,7 +1162,7 @@ ia64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
            }
          else
            {
-             char nat_buf[8];
+             gdb_byte nat_buf[8];
              nat_collection = read_memory_integer (nat_addr, 8, byte_order);
              if (natN_val)
                nat_collection |= natN_mask;
@@ -1195,7 +1192,7 @@ ia64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
 
          /* Adjust the register number to account for register rotation.  */
          regnum = VP16_REGNUM 
-                + ((regnum - VP16_REGNUM) + rrb_pr) % 48;
+                + ((regnum - VP16_REGNUM) + rrb_pr) % 48;
        }
       prN_val = extract_unsigned_integer (buf, register_size (gdbarch, regnum),
                                          byte_order);
@@ -1215,6 +1212,7 @@ static int
 ia64_convert_register_p (struct gdbarch *gdbarch, int regno, struct type *type)
 {
   return (regno >= IA64_FR0_REGNUM && regno <= IA64_FR127_REGNUM
+         && type->code () == TYPE_CODE_FLT
          && type != ia64_ext_type (gdbarch));
 }
 
@@ -1224,26 +1222,28 @@ ia64_register_to_value (struct frame_info *frame, int regnum,
                        int *optimizedp, int *unavailablep)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  char in[MAX_REGISTER_SIZE];
+  gdb_byte in[IA64_FP_REGISTER_SIZE];
 
   /* Convert to TYPE.  */
   if (!get_frame_register_bytes (frame, regnum, 0,
-                                register_size (gdbarch, regnum),
-                                in, optimizedp, unavailablep))
+                                gdb::make_array_view (in,
+                                                      register_size (gdbarch,
+                                                                     regnum)),
+                                optimizedp, unavailablep))
     return 0;
 
-  convert_typed_floating (in, ia64_ext_type (gdbarch), out, valtype);
+  target_float_convert (in, ia64_ext_type (gdbarch), out, valtype);
   *optimizedp = *unavailablep = 0;
   return 1;
 }
 
 static void
 ia64_value_to_register (struct frame_info *frame, int regnum,
-                         struct type *valtype, const gdb_byte *in)
+                        struct type *valtype, const gdb_byte *in)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  char out[MAX_REGISTER_SIZE];
-  convert_typed_floating (in, valtype, out, ia64_ext_type (gdbarch));
+  gdb_byte out[IA64_FP_REGISTER_SIZE];
+  target_float_convert (in, valtype, out, ia64_ext_type (gdbarch));
   put_frame_register (frame, regnum, out);
 }
 
@@ -1287,16 +1287,16 @@ refine_prologue_limit (CORE_ADDR pc, CORE_ADDR lim_pc, int *trust_limit)
       CORE_ADDR addr = prologue_sal.end;
 
       /* Handle the case in which compiler's optimizer/scheduler
-         has moved instructions into the prologue.  We scan ahead
+        has moved instructions into the prologue.  We scan ahead
         in the function looking for address ranges whose corresponding
         line number is less than or equal to the first one that we
         found for the function.  (It can be less than when the
         scheduler puts a body instruction before the first prologue
         instruction.)  */
       for (i = 2 * max_skip_non_prologue_insns; 
-           i > 0 && (lim_pc == 0 || addr < lim_pc);
+          i > 0 && (lim_pc == 0 || addr < lim_pc);
           i--)
-        {
+       {
          struct symtab_and_line sal;
 
          sal = find_pc_line (addr, 0);
@@ -1358,8 +1358,8 @@ ia64_alloc_frame_cache (void)
 
 static CORE_ADDR
 examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
-                  struct frame_info *this_frame,
-                  struct ia64_frame_cache *cache)
+                 struct frame_info *this_frame,
+                 struct ia64_frame_cache *cache)
 {
   CORE_ADDR next_pc;
   CORE_ADDR last_prologue_pc = pc;
@@ -1380,7 +1380,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
   int frameless = 1;
   int i;
   CORE_ADDR addr;
-  char buf[8];
+  gdb_byte buf[8];
   CORE_ADDR bof, sor, sol, sof, cfm, rrb_gr;
 
   memset (instores, 0, sizeof instores);
@@ -1400,9 +1400,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
       && it == M && ((instr & 0x1ee0000003fLL) == 0x02c00000000LL))
     {
       /* alloc - start of a regular function.  */
-      int sor = (int) ((instr & 0x00078000000LL) >> 27);
-      int sol = (int) ((instr & 0x00007f00000LL) >> 20);
-      int sof = (int) ((instr & 0x000000fe000LL) >> 13);
+      int sol_bits = (int) ((instr & 0x00007f00000LL) >> 20);
+      int sof_bits = (int) ((instr & 0x000000fe000LL) >> 13);
       int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
 
       /* Verify that the current cfm matches what we think is the
@@ -1411,8 +1410,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
         addresses of various registers such as the return address.
         We will instead treat the frame as frameless.  */
       if (!this_frame ||
-         (sof == (cache->cfm & 0x7f) &&
-          sol == ((cache->cfm >> 7) & 0x7f)))
+         (sof_bits == (cache->cfm & 0x7f) &&
+          sol_bits == ((cache->cfm >> 7) & 0x7f)))
        frameless = 0;
 
       cfm_reg = rN;
@@ -1424,12 +1423,12 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
       /* Look for a leaf routine.  */
       if (pc < lim_pc && next_pc
          && (it == I || it == M) 
-          && ((instr & 0x1ee00000000LL) == 0x10800000000LL))
+         && ((instr & 0x1ee00000000LL) == 0x10800000000LL))
        {
          /* adds rN = imm14, rM   (or mov rN, rM  when imm14 is 0) */
          int imm = (int) ((((instr & 0x01000000000LL) ? -1 : 0) << 13) 
-                          | ((instr & 0x001f8000000LL) >> 20)
-                          | ((instr & 0x000000fe000LL) >> 13));
+                          | ((instr & 0x001f8000000LL) >> 20)
+                          | ((instr & 0x000000fe000LL) >> 13));
          int rM = (int) ((instr & 0x00007f00000LL) >> 20);
          int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
          int qp = (int) (instr & 0x0000000003fLL);
@@ -1476,7 +1475,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
          break;
        }
       else if (it == I && ((instr & 0x1eff8000000LL) == 0x00188000000LL))
-        {
+       {
          /* Move from BR */
          int b2 = (int) ((instr & 0x0000000e000LL) >> 13);
          int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
@@ -1489,12 +1488,12 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
            }
        }
       else if ((it == I || it == M) 
-          && ((instr & 0x1ee00000000LL) == 0x10800000000LL))
+         && ((instr & 0x1ee00000000LL) == 0x10800000000LL))
        {
          /* adds rN = imm14, rM   (or mov rN, rM  when imm14 is 0) */
          int imm = (int) ((((instr & 0x01000000000LL) ? -1 : 0) << 13) 
-                          | ((instr & 0x001f8000000LL) >> 20)
-                          | ((instr & 0x000000fe000LL) >> 13));
+                          | ((instr & 0x001f8000000LL) >> 20)
+                          | ((instr & 0x000000fe000LL) >> 13));
          int rM = (int) ((instr & 0x00007f00000LL) >> 20);
          int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
          int qp = (int) (instr & 0x0000000003fLL);
@@ -1512,31 +1511,26 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
              last_prologue_pc = next_pc;
            }
          else if (qp == 0 && rN == 2 
-               && ((rM == fp_reg && fp_reg != 0) || rM == 12))
+               && ((rM == fp_reg && fp_reg != 0) || rM == 12))
            {
-             char buf[MAX_REGISTER_SIZE];
              CORE_ADDR saved_sp = 0;
              /* adds r2, spilloffset, rFramePointer 
-                  or
+                  or
                 adds r2, spilloffset, r12
 
-                Get ready for stf.spill or st8.spill instructions.
+                Get ready for stf.spill or st8.spill instructions.
                 The address to start spilling at is loaded into r2.
                 FIXME:  Why r2?  That's what gcc currently uses; it
                 could well be different for other compilers.  */
 
              /* Hmm...  whether or not this will work will depend on
-                where the pc is.  If it's still early in the prologue
+                where the pc is.  If it's still early in the prologue
                 this'll be wrong.  FIXME */
              if (this_frame)
-               {
-                 struct gdbarch *gdbarch = get_frame_arch (this_frame);
-                 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-                 get_frame_register (this_frame, sp_regnum, buf);
-                 saved_sp = extract_unsigned_integer (buf, 8, byte_order);
-               }
+               saved_sp = get_frame_register_unsigned (this_frame,
+                                                       sp_regnum);
              spill_addr  = saved_sp
-                         + (rM == 12 ? 0 : mem_stack_frame_size) 
+                         + (rM == 12 ? 0 : mem_stack_frame_size) 
                          + imm;
              spill_reg   = rN;
              last_prologue_pc = next_pc;
@@ -1557,8 +1551,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
            }
        }
       else if (it == M 
-            && (   ((instr & 0x1efc0000000LL) == 0x0eec0000000LL)
-                || ((instr & 0x1ffc8000000LL) == 0x0cec0000000LL) ))
+           && (   ((instr & 0x1efc0000000LL) == 0x0eec0000000LL)
+               || ((instr & 0x1ffc8000000LL) == 0x0cec0000000LL) ))
        {
          /* stf.spill [rN] = fM, imm9
             or
@@ -1573,7 +1567,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
            {
              cache->saved_regs[IA64_FR0_REGNUM + fM] = spill_addr;
 
-              if ((instr & 0x1efc0000000LL) == 0x0eec0000000LL)
+             if ((instr & 0x1efc0000000LL) == 0x0eec0000000LL)
                spill_addr += imm;
              else
                spill_addr = 0;         /* last one; must be done.  */
@@ -1581,7 +1575,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
            }
        }
       else if ((it == M && ((instr & 0x1eff8000000LL) == 0x02110000000LL))
-            || (it == I && ((instr & 0x1eff8000000LL) == 0x00050000000LL)) )
+           || (it == I && ((instr & 0x1eff8000000LL) == 0x00050000000LL)) )
        {
          /* mov.m rN = arM   
               or 
@@ -1610,8 +1604,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
            }
        }
       else if (it == M 
-            && (   ((instr & 0x1ffc8000000LL) == 0x08cc0000000LL)
-               || ((instr & 0x1efc0000000LL) == 0x0acc0000000LL)))
+           && (   ((instr & 0x1ffc8000000LL) == 0x08cc0000000LL)
+               || ((instr & 0x1efc0000000LL) == 0x0acc0000000LL)))
        {
          /* st8 [rN] = rM 
              or
@@ -1624,7 +1618,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
              && (rM == unat_save_reg || rM == pr_save_reg))
            {
              /* We've found a spill of either the UNAT register or the PR
-                register.  (Well, not exactly; what we've actually found is
+                register.  (Well, not exactly; what we've actually found is
                 a spill of the register that UNAT or PR was moved to).
                 Record that fact and move on...  */
              if (rM == unat_save_reg)
@@ -1634,7 +1628,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
                  unat_save_reg = 0;
                }
              else
-               {
+               {
                  /* Track PR register.  */
                  cache->saved_regs[IA64_PR_REGNUM] = spill_addr;
                  pr_save_reg = 0;
@@ -1688,7 +1682,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
            }
        }
       else if (it == M && ((instr & 0x1ff88000000LL) == 0x0cc80000000LL))
-        {
+       {
          /* Either
               stfs [rN] = fM
             or
@@ -1705,8 +1699,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
            }
        }
       else if (it == M
-            && (   ((instr & 0x1ffc8000000LL) == 0x08ec0000000LL)
-               || ((instr & 0x1efc0000000LL) == 0x0aec0000000LL)))
+           && (   ((instr & 0x1ffc8000000LL) == 0x08ec0000000LL)
+               || ((instr & 0x1efc0000000LL) == 0x0aec0000000LL)))
        {
          /* st8.spill [rN] = rM
               or
@@ -1717,11 +1711,11 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
          if (qp == 0 && rN == spill_reg && 4 <= rM && rM <= 7)
            {
              /* We've found a spill of one of the preserved general purpose
-                regs.  Record the spill address and advance the spill
+                regs.  Record the spill address and advance the spill
                 register if appropriate.  */
              cache->saved_regs[IA64_GR0_REGNUM + rM] = spill_addr;
              if ((instr & 0x1efc0000000LL) == 0x0aec0000000LL)
-               /* st8.spill [rN] = rM, imm9 */
+               /* st8.spill [rN] = rM, imm9 */
                spill_addr += imm9(instr);
              else
                spill_addr = 0;         /* Done spilling.  */
@@ -1792,8 +1786,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc,
          rrb_gr = (cfm >> 18) & 0x7f;
 
          /* The previous bof only requires subtraction of the sol (size of
-             locals) due to the overlap between output and input of
-             subsequent frames.  */
+            locals) due to the overlap between output and input of
+            subsequent frames.  */
          bof = rse_address_add (bof, -sol);
          
          for (i = 0, addr = bof;
@@ -1850,11 +1844,11 @@ ia64_frame_cache (struct frame_info *this_frame, void **this_cache)
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct ia64_frame_cache *cache;
-  char buf[8];
-  CORE_ADDR cfm, psr;
+  gdb_byte buf[8];
+  CORE_ADDR cfm;
 
   if (*this_cache)
-    return *this_cache;
+    return (struct ia64_frame_cache *) *this_cache;
 
   cache = ia64_alloc_frame_cache ();
   *this_cache = cache;
@@ -1869,7 +1863,6 @@ ia64_frame_cache (struct frame_info *this_frame, void **this_cache)
   cache->bsp = extract_unsigned_integer (buf, 8, byte_order);
   
   get_frame_register (this_frame, IA64_PSR_REGNUM, buf);
-  psr = extract_unsigned_integer (buf, 8, byte_order);
 
   get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
   cfm = extract_unsigned_integer (buf, 8, byte_order);
@@ -1918,11 +1911,11 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct ia64_frame_cache *cache = ia64_frame_cache (this_frame, this_cache);
-  char buf[8];
+  gdb_byte buf[8];
 
   gdb_assert (regnum >= 0);
 
-  if (!target_has_registers)
+  if (!target_has_registers ())
     error (_("No registers."));
 
   if (regnum == gdbarch_sp_regnum (gdbarch))
@@ -1934,19 +1927,19 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
       CORE_ADDR prev_cfm, bsp, prev_bsp;
 
       /* We want to calculate the previous bsp as the end of the previous
-         register stack frame.  This corresponds to what the hardware bsp
-         register will be if we pop the frame back which is why we might
-         have been called.  We know the beginning of the current frame is
-         cache->bsp - cache->sof.  This value in the previous frame points
-         to the start of the output registers.  We can calculate the end of
-         that frame by adding the size of output:
-            (sof (size of frame) - sol (size of locals)).  */
+        register stack frame.  This corresponds to what the hardware bsp
+        register will be if we pop the frame back which is why we might
+        have been called.  We know the beginning of the current frame is
+        cache->bsp - cache->sof.  This value in the previous frame points
+        to the start of the output registers.  We can calculate the end of
+        that frame by adding the size of output:
+           (sof (size of frame) - sol (size of locals)).  */
       val = ia64_frame_prev_register (this_frame, this_cache, IA64_CFM_REGNUM);
       prev_cfm = extract_unsigned_integer (value_contents_all (val),
                                           8, byte_order);
       bsp = rse_address_add (cache->bsp, -(cache->sof));
       prev_bsp =
-        rse_address_add (bsp, (prev_cfm & 0x7f) - ((prev_cfm >> 7) & 0x7f));
+       rse_address_add (bsp, (prev_cfm & 0x7f) - ((prev_cfm >> 7) & 0x7f));
 
       return frame_unwind_got_constant (this_frame, regnum, prev_bsp);
     }
@@ -1956,21 +1949,21 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
       CORE_ADDR addr = cache->saved_regs[IA64_CFM_REGNUM];
       
       if (addr != 0)
-        return frame_unwind_got_memory (this_frame, regnum, addr);
+       return frame_unwind_got_memory (this_frame, regnum, addr);
 
       if (cache->prev_cfm)
-        return frame_unwind_got_constant (this_frame, regnum, cache->prev_cfm);
+       return frame_unwind_got_constant (this_frame, regnum, cache->prev_cfm);
 
       if (cache->frameless)
-        return frame_unwind_got_register (this_frame, IA64_PFS_REGNUM,
-                                          IA64_PFS_REGNUM);
+       return frame_unwind_got_register (this_frame, IA64_PFS_REGNUM,
+                                         IA64_PFS_REGNUM);
       return frame_unwind_got_register (this_frame, regnum, 0);
     }
 
   else if (regnum == IA64_VFP_REGNUM)
     {
       /* If the function in question uses an automatic register (r32-r127)
-         for the frame pointer, it'll be found by ia64_find_saved_register()
+        for the frame pointer, it'll be found by ia64_find_saved_register()
         above.  If the function lacks one of these frame pointers, we can
         still provide a value since we know the size of the frame.  */
       return frame_unwind_got_constant (this_frame, regnum, cache->base);
@@ -1982,7 +1975,7 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
       ULONGEST prN;
       
       pr_val = ia64_frame_prev_register (this_frame, this_cache,
-                                         IA64_PR_REGNUM);
+                                        IA64_PR_REGNUM);
       if (VP16_REGNUM <= regnum && regnum <= VP63_REGNUM)
        {
          /* Fetch predicate register rename base from current frame
@@ -1993,7 +1986,7 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
          regnum = VP16_REGNUM + ((regnum - VP16_REGNUM) + rrb_pr) % 48;
        }
       prN = extract_bit_field (value_contents_all (pr_val),
-                               regnum - VP0_REGNUM, 1);
+                              regnum - VP0_REGNUM, 1);
       return frame_unwind_got_constant (this_frame, regnum, prN);
     }
 
@@ -2002,9 +1995,9 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
       struct value *unat_val;
       ULONGEST unatN;
       unat_val = ia64_frame_prev_register (this_frame, this_cache,
-                                           IA64_UNAT_REGNUM);
+                                          IA64_UNAT_REGNUM);
       unatN = extract_bit_field (value_contents_all (unat_val),
-                                 regnum - IA64_NAT0_REGNUM, 1);
+                                regnum - IA64_NAT0_REGNUM, 1);
       return frame_unwind_got_constant (this_frame, regnum, unatN);
     }
 
@@ -2012,7 +2005,7 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
     {
       int natval = 0;
       /* Find address of general register corresponding to nat bit we're
-         interested in.  */
+        interested in.  */
       CORE_ADDR gr_addr;
 
       gr_addr = cache->saved_regs[regnum - IA64_NAT0_REGNUM + IA64_GR0_REGNUM];
@@ -2050,10 +2043,10 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
       CORE_ADDR addr = cache->saved_regs[IA64_VRAP_REGNUM];
 
       if (addr != 0)
-        {
-          read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
-          pc = extract_unsigned_integer (buf, 8, byte_order);
-        }
+       {
+         read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
+         pc = extract_unsigned_integer (buf, 8, byte_order);
+       }
       else if (cache->frameless)
        {
          get_frame_register (this_frame, IA64_BR0_REGNUM, buf);
@@ -2066,9 +2059,9 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
   else if (regnum == IA64_PSR_REGNUM)
     {
       /* We don't know how to get the complete previous PSR, but we need it
-         for the slot information when we unwind the pc (pc is formed of IP
-         register plus slot information from PSR).  To get the previous
-         slot information, we mask it off the return address.  */
+        for the slot information when we unwind the pc (pc is formed of IP
+        register plus slot information from PSR).  To get the previous
+        slot information, we mask it off the return address.  */
       ULONGEST slot_num = 0;
       CORE_ADDR pc = 0;
       CORE_ADDR psr = 0;
@@ -2098,13 +2091,13 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
       CORE_ADDR addr = cache->saved_regs[IA64_BR0_REGNUM];
 
       if (addr != 0)
-        return frame_unwind_got_memory (this_frame, regnum, addr);
+       return frame_unwind_got_memory (this_frame, regnum, addr);
 
       return frame_unwind_got_constant (this_frame, regnum, 0);
     }
 
   else if ((regnum >= IA64_GR32_REGNUM && regnum <= IA64_GR127_REGNUM)
-           || (regnum >= V32_REGNUM && regnum <= V127_REGNUM))
+          || (regnum >= V32_REGNUM && regnum <= V127_REGNUM))
     {
       CORE_ADDR addr = 0;
 
@@ -2112,30 +2105,30 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
        regnum = IA64_GR32_REGNUM + (regnum - V32_REGNUM);
       addr = cache->saved_regs[regnum];
       if (addr != 0)
-        return frame_unwind_got_memory (this_frame, regnum, addr);
+       return frame_unwind_got_memory (this_frame, regnum, addr);
 
       if (cache->frameless)
-        {
-          struct value *reg_val;
-          CORE_ADDR prev_cfm, prev_bsp, prev_bof;
+       {
+         struct value *reg_val;
+         CORE_ADDR prev_cfm, prev_bsp, prev_bof;
 
-          /* FIXME: brobecker/2008-05-01: Doesn't this seem redundant
-             with the same code above?  */
+         /* FIXME: brobecker/2008-05-01: Doesn't this seem redundant
+            with the same code above?  */
          if (regnum >= V32_REGNUM)
            regnum = IA64_GR32_REGNUM + (regnum - V32_REGNUM);
-          reg_val = ia64_frame_prev_register (this_frame, this_cache,
-                                              IA64_CFM_REGNUM);
+         reg_val = ia64_frame_prev_register (this_frame, this_cache,
+                                             IA64_CFM_REGNUM);
          prev_cfm = extract_unsigned_integer (value_contents_all (reg_val),
-                                               8, byte_order);
+                                              8, byte_order);
          reg_val = ia64_frame_prev_register (this_frame, this_cache,
-                                              IA64_BSP_REGNUM);
+                                             IA64_BSP_REGNUM);
          prev_bsp = extract_unsigned_integer (value_contents_all (reg_val),
-                                               8, byte_order);
+                                              8, byte_order);
          prev_bof = rse_address_add (prev_bsp, -(prev_cfm & 0x7f));
 
          addr = rse_address_add (prev_bof, (regnum - IA64_GR32_REGNUM));
-          return frame_unwind_got_memory (this_frame, regnum, addr);
-        }
+         return frame_unwind_got_memory (this_frame, regnum, addr);
+       }
       
       return frame_unwind_got_constant (this_frame, regnum, 0);
     }
@@ -2153,21 +2146,22 @@ ia64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
          /* Adjust the floating point register number to account for
             register rotation.  */
          regnum = IA64_FR32_REGNUM
-                + ((regnum - IA64_FR32_REGNUM) + rrb_fr) % 96;
+                + ((regnum - IA64_FR32_REGNUM) + rrb_fr) % 96;
        }
 
       /* If we have stored a memory address, access the register.  */
       addr = cache->saved_regs[regnum];
       if (addr != 0)
-        return frame_unwind_got_memory (this_frame, regnum, addr);
+       return frame_unwind_got_memory (this_frame, regnum, addr);
       /* Otherwise, punt and get the current value of the register.  */
       else 
-        return frame_unwind_got_register (this_frame, regnum, regnum);
+       return frame_unwind_got_register (this_frame, regnum, regnum);
     }
 }
  
 static const struct frame_unwind ia64_frame_unwind =
 {
+  "ia64 prologue",
   NORMAL_FRAME,
   default_frame_unwind_stop_reason,
   &ia64_frame_this_id,
@@ -2238,10 +2232,10 @@ ia64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct ia64_frame_cache *cache;
-  char buf[8];
+  gdb_byte buf[8];
 
   if (*this_cache)
-    return *this_cache;
+    return (struct ia64_frame_cache *) *this_cache;
 
   cache = ia64_alloc_frame_cache ();
 
@@ -2272,8 +2266,8 @@ ia64_sigtramp_frame_this_id (struct frame_info *this_frame,
     ia64_sigtramp_frame_cache (this_frame, this_cache);
 
   (*this_id) = frame_id_build_special (cache->base,
-                                       get_frame_pc (this_frame),
-                                       cache->bsp);
+                                      get_frame_pc (this_frame),
+                                      cache->bsp);
   if (gdbarch_debug >= 1)
     fprintf_unfiltered (gdb_stdlog,
                        "sigtramp frame id: code %s, stack %s, "
@@ -2288,16 +2282,12 @@ static struct value *
 ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
                                   void **this_cache, int regnum)
 {
-  char buf[MAX_REGISTER_SIZE];
-
-  struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct ia64_frame_cache *cache =
     ia64_sigtramp_frame_cache (this_frame, this_cache);
 
   gdb_assert (regnum >= 0);
 
-  if (!target_has_registers)
+  if (!target_has_registers ())
     error (_("No registers."));
 
   if (regnum == IA64_IP_REGNUM)
@@ -2307,15 +2297,16 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
       if (addr != 0)
        {
-         read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM));
-         pc = extract_unsigned_integer (buf, 8, byte_order);
+         struct gdbarch *gdbarch = get_frame_arch (this_frame);
+         enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+         pc = read_memory_unsigned_integer (addr, 8, byte_order);
        }
       pc &= ~0xf;
       return frame_unwind_got_constant (this_frame, regnum, pc);
     }
 
   else if ((regnum >= IA64_GR32_REGNUM && regnum <= IA64_GR127_REGNUM)
-           || (regnum >= V32_REGNUM && regnum <= V127_REGNUM))
+          || (regnum >= V32_REGNUM && regnum <= V127_REGNUM))
     {
       CORE_ADDR addr = 0;
 
@@ -2323,7 +2314,7 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
        regnum = IA64_GR32_REGNUM + (regnum - V32_REGNUM);
       addr = cache->saved_regs[regnum];
       if (addr != 0)
-        return frame_unwind_got_memory (this_frame, regnum, addr);
+       return frame_unwind_got_memory (this_frame, regnum, addr);
 
       return frame_unwind_got_constant (this_frame, regnum, 0);
     }
@@ -2333,7 +2324,7 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
       CORE_ADDR addr = cache->saved_regs[regnum];
 
       if (addr != 0)
-        return frame_unwind_got_memory (this_frame, regnum, addr);
+       return frame_unwind_got_memory (this_frame, regnum, addr);
 
       return frame_unwind_got_constant (this_frame, regnum, 0);
     }
@@ -2341,8 +2332,8 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 ia64_sigtramp_frame_sniffer (const struct frame_unwind *self,
-                             struct frame_info *this_frame,
-                             void **this_cache)
+                            struct frame_info *this_frame,
+                            void **this_cache)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
   if (tdep->pc_in_sigtramp)
@@ -2358,6 +2349,7 @@ ia64_sigtramp_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind ia64_sigtramp_frame_unwind =
 {
+  "ia64 sigtramp",
   SIGTRAMP_FRAME,
   default_frame_unwind_stop_reason,
   ia64_sigtramp_frame_this_id,
@@ -2489,12 +2481,9 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
                 int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  unw_word_t bsp, sof, sol, cfm, psr, ip;
-  struct frame_info *this_frame = arg;
+  unw_word_t bsp, sof, cfm, psr, ip;
+  struct frame_info *this_frame = (struct frame_info *) arg;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  long new_sof, old_sof;
-  char buf[MAX_REGISTER_SIZE];
   
   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2504,10 +2493,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
       case UNW_REG_IP:
        /* Libunwind expects to see the pc value which means the slot number
           from the psr must be merged with the ip word address.  */
-       get_frame_register (this_frame, IA64_IP_REGNUM, buf);
-       ip = extract_unsigned_integer (buf, 8, byte_order);
-       get_frame_register (this_frame, IA64_PSR_REGNUM, buf);
-       psr = extract_unsigned_integer (buf, 8, byte_order);
+       ip = get_frame_register_unsigned (this_frame, IA64_IP_REGNUM);
+       psr = get_frame_register_unsigned (this_frame, IA64_PSR_REGNUM);
        *val = ip | ((psr >> 41) & 0x3);
        break;
  
@@ -2516,10 +2503,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
           register frame so we must account for the fact that
           ptrace() will return a value for bsp that points *after*
           the current register frame.  */
-       get_frame_register (this_frame, IA64_BSP_REGNUM, buf);
-       bsp = extract_unsigned_integer (buf, 8, byte_order);
-       get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
-       cfm = extract_unsigned_integer (buf, 8, byte_order);
+       bsp = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
+       cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
        sof = gdbarch_tdep (gdbarch)->size_of_register_frame (this_frame, cfm);
        *val = ia64_rse_skip_regs (bsp, -sof);
        break;
@@ -2527,14 +2512,12 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val,
       case UNW_IA64_AR_BSPSTORE:
        /* Libunwind wants bspstore to be after the current register frame.
           This is what ptrace() and gdb treats as the regular bsp value.  */
-       get_frame_register (this_frame, IA64_BSP_REGNUM, buf);
-       *val = extract_unsigned_integer (buf, 8, byte_order);
+       *val = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM);
        break;
 
       default:
        /* For all other registers, just unwind the value directly.  */
-       get_frame_register (this_frame, regnum, buf);
-       *val = extract_unsigned_integer (buf, 8, byte_order);
+       *val = get_frame_register_unsigned (this_frame, regnum);
        break;
     }
       
@@ -2553,12 +2536,12 @@ ia64_access_fpreg (unw_addr_space_t as, unw_regnum_t uw_regnum,
                   unw_fpreg_t *val, int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  struct frame_info *this_frame = arg;
+  struct frame_info *this_frame = (struct frame_info *) arg;
   
   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
 
-  get_frame_register (this_frame, regnum, (char *) val);
+  get_frame_register (this_frame, regnum, (gdb_byte *) val);
 
   return 0;
 }
@@ -2569,12 +2552,9 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
                     unw_word_t *val, int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  unw_word_t bsp, sof, sol, cfm, psr, ip;
-  struct regcache *regcache = arg;
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
-  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  long new_sof, old_sof;
-  char buf[MAX_REGISTER_SIZE];
+  unw_word_t bsp, sof, cfm, psr, ip;
+  struct regcache *regcache = (struct regcache *) arg;
+  struct gdbarch *gdbarch = regcache->arch ();
   
   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
@@ -2584,10 +2564,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
       case UNW_REG_IP:
        /* Libunwind expects to see the pc value which means the slot number
           from the psr must be merged with the ip word address.  */
-       regcache_cooked_read (regcache, IA64_IP_REGNUM, buf);
-       ip = extract_unsigned_integer (buf, 8, byte_order);
-       regcache_cooked_read (regcache, IA64_PSR_REGNUM, buf);
-       psr = extract_unsigned_integer (buf, 8, byte_order);
+       regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip);
+       regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr);
        *val = ip | ((psr >> 41) & 0x3);
        break;
          
@@ -2596,10 +2574,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
           register frame so we must account for the fact that
           ptrace() will return a value for bsp that points *after*
           the current register frame.  */
-       regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf);
-       bsp = extract_unsigned_integer (buf, 8, byte_order);
-       regcache_cooked_read (regcache, IA64_CFM_REGNUM, buf);
-       cfm = extract_unsigned_integer (buf, 8, byte_order);
+       regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp);
+       regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm);
        sof = (cfm & 0x7f);
        *val = ia64_rse_skip_regs (bsp, -sof);
        break;
@@ -2607,14 +2583,12 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum,
       case UNW_IA64_AR_BSPSTORE:
        /* Libunwind wants bspstore to be after the current register frame.
           This is what ptrace() and gdb treats as the regular bsp value.  */
-       regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf);
-       *val = extract_unsigned_integer (buf, 8, byte_order);
+       regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, val);
        break;
 
       default:
-        /* For all other registers, just unwind the value directly.  */
-       regcache_cooked_read (regcache, regnum, buf);
-       *val = extract_unsigned_integer (buf, 8, byte_order);
+       /* For all other registers, just unwind the value directly.  */
+       regcache_cooked_read_unsigned (regcache, regnum, val);
        break;
     }
       
@@ -2634,12 +2608,12 @@ ia64_access_rse_fpreg (unw_addr_space_t as, unw_regnum_t uw_regnum,
                       unw_fpreg_t *val, int write, void *arg)
 {
   int regnum = ia64_uw2gdb_regnum (uw_regnum);
-  struct regcache *regcache = arg;
+  struct regcache *regcache = (struct regcache *) arg;
   
   /* We never call any libunwind routines that need to write registers.  */
   gdb_assert (!write);
 
-  regcache_cooked_read (regcache, regnum, (char *) val);
+  regcache->cooked_read (regnum, (gdb_byte *) val);
 
   return 0;
 }
@@ -2653,28 +2627,26 @@ ia64_access_mem (unw_addr_space_t as,
   if (addr - KERNEL_START < ktab_size)
     {
       unw_word_t *laddr = (unw_word_t*) ((char *) ktab
-                          + (addr - KERNEL_START));
+                         + (addr - KERNEL_START));
                
       if (write)
-        *laddr = *val; 
+       *laddr = *val; 
       else 
-        *val = *laddr;
+       *val = *laddr;
       return 0;
     }
 
   /* XXX do we need to normalize byte-order here?  */
   if (write)
-    return target_write_memory (addr, (char *) val, sizeof (unw_word_t));
+    return target_write_memory (addr, (gdb_byte *) val, sizeof (unw_word_t));
   else
-    return target_read_memory (addr, (char *) val, sizeof (unw_word_t));
+    return target_read_memory (addr, (gdb_byte *) val, sizeof (unw_word_t));
 }
 
 /* Call low-level function to access the kernel unwind table.  */
-static LONGEST
-getunwind_table (gdb_byte **buf_p)
+static gdb::optional<gdb::byte_vector>
+getunwind_table ()
 {
-  LONGEST x;
-
   /* FIXME drow/2005-09-10: This code used to call
      ia64_linux_xfer_unwind_table directly to fetch the unwind table
      for the currently running ia64-linux kernel.  That data should
@@ -2683,10 +2655,8 @@ getunwind_table (gdb_byte **buf_p)
      we should find a way to override the corefile layer's
      xfer_partial method.  */
 
-  x = target_read_alloc (&current_target, TARGET_OBJECT_UNWIND_TABLE,
-                        NULL, buf_p);
-
-  return x;
+  return target_read_alloc (current_inferior ()->top_target (),
+                           TARGET_OBJECT_UNWIND_TABLE, NULL);
 }
 
 /* Get the kernel unwind table.  */                             
@@ -2697,18 +2667,15 @@ get_kernel_table (unw_word_t ip, unw_dyn_info_t *di)
 
   if (!ktab) 
     {
-      gdb_byte *ktab_buf;
-      LONGEST size;
-
-      size = getunwind_table (&ktab_buf);
-      if (size <= 0)
+      ktab_buf = getunwind_table ();
+      if (!ktab_buf)
        return -UNW_ENOINFO;
 
-      ktab = (struct ia64_table_entry *) ktab_buf;
-      ktab_size = size;
+      ktab = (struct ia64_table_entry *) ktab_buf->data ();
+      ktab_size = ktab_buf->size ();
 
       for (etab = ktab; etab->start_offset; ++etab)
-        etab->info_offset += KERNEL_START;
+       etab->info_offset += KERNEL_START;
     }
   
   if (ip < ktab[0].start_offset || ip >= etab[-1].end_offset)
@@ -2750,7 +2717,7 @@ ia64_find_unwind_table (struct objfile *objfile, unw_word_t ip,
   ehdr = elf_tdata (bfd)->elf_header;
   phdr = elf_tdata (bfd)->phdr;
 
-  load_base = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+  load_base = objfile->text_section_offset ();
 
   for (i = 0; i < ehdr->e_phnum; ++i)
     {
@@ -2785,23 +2752,23 @@ ia64_find_unwind_table (struct objfile *objfile, unw_word_t ip,
     {
       int ok = 0;
       for (i = 0; i < ehdr->e_phnum; ++i)
-        {
-          if (phdr[i].p_type == PT_LOAD
+       {
+         if (phdr[i].p_type == PT_LOAD
              && (p_unwind->p_vaddr - phdr[i].p_vaddr) < phdr[i].p_memsz)
            {
-              ok = 1;
+             ok = 1;
              /* Get the segbase from the section containing the
                 libunwind table.  */
              segbase = phdr[i].p_vaddr + load_base;
            }
        }
       if (!ok)
-        return -UNW_ENOINFO;
+       return -UNW_ENOINFO;
     }
 
   dip->start_ip = p_text->p_vaddr + load_base;
   dip->end_ip = dip->start_ip + p_text->p_memsz;
-  dip->gp = ia64_find_global_pointer (get_objfile_arch (objfile), ip);
+  dip->gp = ia64_find_global_pointer (objfile->arch (), ip);
   dip->format = UNW_INFO_FORMAT_REMOTE_TABLE;
   dip->u.rti.name_ptr = (unw_word_t) bfd_get_filename (bfd);
   dip->u.rti.segbase = segbase;
@@ -2882,7 +2849,6 @@ ia64_get_dyn_info_list (unw_addr_space_t as,
                        unw_word_t *dilap, void *arg)
 {
   struct obj_section *text_sec;
-  struct objfile *objfile;
   unw_word_t ip, addr;
   unw_dyn_info_t di;
   int ret;
@@ -2890,12 +2856,12 @@ ia64_get_dyn_info_list (unw_addr_space_t as,
   if (!libunwind_is_initialized ())
     return -UNW_ENOINFO;
 
-  for (objfile = object_files; objfile; objfile = objfile->next)
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       void *buf = NULL;
 
       text_sec = objfile->sections + SECT_OFF_TEXT (objfile);
-      ip = obj_section_addr (text_sec);
+      ip = text_sec->addr ();
       ret = ia64_find_unwind_table (objfile, ip, &di, &buf);
       if (ret >= 0)
        {
@@ -2929,7 +2895,7 @@ ia64_libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache,
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct frame_id id = outer_frame_id;
-  char buf[8];
+  gdb_byte buf[8];
   CORE_ADDR bsp;
 
   libunwind_frame_this_id (this_frame, this_cache, &id);
@@ -2981,12 +2947,10 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
        {
          int rrb_pr = 0;
          ULONGEST cfm;
-         unsigned char buf[MAX_REGISTER_SIZE];
 
          /* Fetch predicate register rename base from current frame
             marker for this frame.  */
-         get_frame_register (this_frame, IA64_CFM_REGNUM, buf);
-         cfm = extract_unsigned_integer (buf, 8, byte_order);
+         cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM);
          rrb_pr = (cfm >> 32) & 0x3f;
          
          /* Adjust the register number to account for register rotation.  */
@@ -3002,7 +2966,7 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
       ULONGEST unatN_val;
 
       unatN_val = extract_bit_field (value_contents_all (val),
-                                     regnum - IA64_NAT0_REGNUM, 1);
+                                    regnum - IA64_NAT0_REGNUM, 1);
       return frame_unwind_got_constant (this_frame, regnum, unatN_val);
     }
 
@@ -3012,14 +2976,14 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
       CORE_ADDR prev_bsp, prev_cfm;
 
       /* We want to calculate the previous bsp as the end of the previous
-         register stack frame.  This corresponds to what the hardware bsp
-         register will be if we pop the frame back which is why we might
-         have been called.  We know that libunwind will pass us back the
-         beginning of the current frame so we should just add sof to it.  */
+        register stack frame.  This corresponds to what the hardware bsp
+        register will be if we pop the frame back which is why we might
+        have been called.  We know that libunwind will pass us back the
+        beginning of the current frame so we should just add sof to it.  */
       prev_bsp = extract_unsigned_integer (value_contents_all (val),
                                           8, byte_order);
       cfm_val = libunwind_frame_prev_register (this_frame, this_cache,
-                                               IA64_CFM_REGNUM);
+                                              IA64_CFM_REGNUM);
       prev_cfm = extract_unsigned_integer (value_contents_all (cfm_val),
                                           8, byte_order);
       prev_bsp = rse_address_add (prev_bsp, (prev_cfm & 0x7f));
@@ -3032,8 +2996,8 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame,
 
 static int
 ia64_libunwind_frame_sniffer (const struct frame_unwind *self,
-                              struct frame_info *this_frame,
-                              void **this_cache)
+                             struct frame_info *this_frame,
+                             void **this_cache)
 {
   if (libunwind_is_initialized ()
       && libunwind_frame_sniffer (self, this_frame, this_cache))
@@ -3044,6 +3008,7 @@ ia64_libunwind_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind ia64_libunwind_frame_unwind =
 {
+  "ia64 libunwind",
   NORMAL_FRAME,
   default_frame_unwind_stop_reason,
   ia64_libunwind_frame_this_id,
@@ -3055,15 +3020,14 @@ static const struct frame_unwind ia64_libunwind_frame_unwind =
 
 static void
 ia64_libunwind_sigtramp_frame_this_id (struct frame_info *this_frame,
-                                       void **this_cache,
+                                      void **this_cache,
                                       struct frame_id *this_id)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  char buf[8];
+  gdb_byte buf[8];
   CORE_ADDR bsp;
   struct frame_id id = outer_frame_id;
-  CORE_ADDR prev_ip;
 
   libunwind_frame_this_id (this_frame, this_cache, &id);
   if (frame_id_eq (id, outer_frame_id))
@@ -3102,7 +3066,7 @@ ia64_libunwind_sigtramp_frame_prev_register (struct frame_info *this_frame,
   /* If the previous frame pc value is 0, then we want to use the SIGCONTEXT
      method of getting previous registers.  */
   prev_ip_val = libunwind_frame_prev_register (this_frame, this_cache,
-                                               IA64_IP_REGNUM);
+                                              IA64_IP_REGNUM);
   prev_ip = extract_unsigned_integer (value_contents_all (prev_ip_val),
                                      8, byte_order);
 
@@ -3110,7 +3074,7 @@ ia64_libunwind_sigtramp_frame_prev_register (struct frame_info *this_frame,
     {
       void *tmp_cache = NULL;
       return ia64_sigtramp_frame_prev_register (this_frame, &tmp_cache,
-                                                regnum);
+                                               regnum);
     }
   else
     return ia64_libunwind_frame_prev_register (this_frame, this_cache, regnum);
@@ -3118,13 +3082,13 @@ ia64_libunwind_sigtramp_frame_prev_register (struct frame_info *this_frame,
 
 static int
 ia64_libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
-                                       struct frame_info *this_frame,
-                                       void **this_cache)
+                                      struct frame_info *this_frame,
+                                      void **this_cache)
 {
   if (libunwind_is_initialized ())
     {
       if (libunwind_sigtramp_frame_sniffer (self, this_frame, this_cache))
-        return 1;
+       return 1;
       return 0;
     }
   else
@@ -3133,6 +3097,7 @@ ia64_libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind ia64_libunwind_sigtramp_frame_unwind =
 {
+  "ia64 libunwind sigtramp",
   SIGTRAMP_FRAME,
   default_frame_unwind_stop_reason,
   ia64_libunwind_sigtramp_frame_this_id,
@@ -3190,9 +3155,9 @@ ia64_use_struct_convention (struct type *type)
 
   /* Don't use the struct convention for anything but structure,
      union, or array types.  */
-  if (!(TYPE_CODE (type) == TYPE_CODE_STRUCT
-       || TYPE_CODE (type) == TYPE_CODE_UNION
-       || TYPE_CODE (type) == TYPE_CODE_ARRAY))
+  if (!(type->code () == TYPE_CODE_STRUCT
+       || type->code () == TYPE_CODE_UNION
+       || type->code () == TYPE_CODE_ARRAY))
     return 0;
 
   /* HFAs are structures (or arrays) consisting entirely of floating
@@ -3214,30 +3179,30 @@ ia64_use_struct_convention (struct type *type)
 static int
 ia64_struct_type_p (const struct type *type)
 {
-  return (TYPE_CODE (type) == TYPE_CODE_STRUCT
-          || TYPE_CODE (type) == TYPE_CODE_UNION);
+  return (type->code () == TYPE_CODE_STRUCT
+         || type->code () == TYPE_CODE_UNION);
 }
 
 static void
 ia64_extract_return_value (struct type *type, struct regcache *regcache,
                           gdb_byte *valbuf)
 {
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  struct gdbarch *gdbarch = regcache->arch ();
   struct type *float_elt_type;
 
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      char from[MAX_REGISTER_SIZE];
+      gdb_byte from[IA64_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
 
       while (n-- > 0)
        {
-         regcache_cooked_read (regcache, regnum, from);
-         convert_typed_floating (from, ia64_ext_type (gdbarch),
-                                 (char *)valbuf + offset, float_elt_type);
+         regcache->cooked_read (regnum, from);
+         target_float_convert (from, ia64_ext_type (gdbarch),
+                               valbuf + offset, float_elt_type);
          offset += TYPE_LENGTH (float_elt_type);
          regnum++;
        }
@@ -3245,8 +3210,8 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache,
   else if (!ia64_struct_type_p (type) && TYPE_LENGTH (type) < 8)
     {
       /* This is an integral value, and its size is less than 8 bytes.
-         These values are LSB-aligned, so extract the relevant bytes,
-         and copy them into VALBUF.  */
+        These values are LSB-aligned, so extract the relevant bytes,
+        and copy them into VALBUF.  */
       /* brobecker/2005-12-30: Actually, all integral values are LSB aligned,
         so I suppose we should also add handling here for integral values
         whose size is greater than 8.  But I wasn't able to create such
@@ -3268,16 +3233,16 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache,
 
       while (n-- > 0)
        {
-         ULONGEST val;
-         regcache_cooked_read_unsigned (regcache, regnum, &val);
-         memcpy ((char *)valbuf + offset, &val, reglen);
+         ULONGEST regval;
+         regcache_cooked_read_unsigned (regcache, regnum, &regval);
+         memcpy ((char *)valbuf + offset, &regval, reglen);
          offset += reglen;
          regnum++;
        }
 
       if (m)
        {
-          regcache_cooked_read_unsigned (regcache, regnum, &val);
+         regcache_cooked_read_unsigned (regcache, regnum, &val);
          memcpy ((char *)valbuf + offset, &val, m);
        }
     }
@@ -3287,29 +3252,28 @@ static void
 ia64_store_return_value (struct type *type, struct regcache *regcache, 
                         const gdb_byte *valbuf)
 {
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  struct gdbarch *gdbarch = regcache->arch ();
   struct type *float_elt_type;
 
   float_elt_type = is_float_or_hfa_type (type);
   if (float_elt_type != NULL)
     {
-      char to[MAX_REGISTER_SIZE];
+      gdb_byte to[IA64_FP_REGISTER_SIZE];
       int offset = 0;
       int regnum = IA64_FR8_REGNUM;
       int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
 
       while (n-- > 0)
        {
-         convert_typed_floating ((char *)valbuf + offset, float_elt_type,
-                                 to, ia64_ext_type (gdbarch));
-         regcache_cooked_write (regcache, regnum, to);
+         target_float_convert (valbuf + offset, float_elt_type,
+                               to, ia64_ext_type (gdbarch));
+         regcache->cooked_write (regnum, to);
          offset += TYPE_LENGTH (float_elt_type);
          regnum++;
        }
     }
   else
     {
-      ULONGEST val;
       int offset = 0;
       int regnum = IA64_GR8_REGNUM;
       int reglen = TYPE_LENGTH (register_type (gdbarch, IA64_GR8_REGNUM));
@@ -3327,8 +3291,9 @@ ia64_store_return_value (struct type *type, struct regcache *regcache,
 
       if (m)
        {
+         ULONGEST val;
          memcpy (&val, (char *)valbuf + offset, m);
-          regcache_cooked_write_unsigned (regcache, regnum, val);
+         regcache_cooked_write_unsigned (regcache, regnum, val);
        }
     }
 }
@@ -3361,7 +3326,7 @@ ia64_return_value (struct gdbarch *gdbarch, struct value *function,
 static int
 is_float_or_hfa_type_recurse (struct type *t, struct type **etp)
 {
-  switch (TYPE_CODE (t))
+  switch (t->code ())
     {
     case TYPE_CODE_FLT:
       if (*etp)
@@ -3381,9 +3346,9 @@ is_float_or_hfa_type_recurse (struct type *t, struct type **etp)
       {
        int i;
 
-       for (i = 0; i < TYPE_NFIELDS (t); i++)
+       for (i = 0; i < t->num_fields (); i++)
          if (!is_float_or_hfa_type_recurse
-             (check_typedef (TYPE_FIELD_TYPE (t, i)), etp))
+             (check_typedef (t->field (i).type ()), etp))
            return 0;
        return 1;
       }
@@ -3415,7 +3380,7 @@ is_float_or_hfa_type (struct type *t)
 static int
 slot_alignment_is_next_even (struct type *t)
 {
-  switch (TYPE_CODE (t))
+  switch (t->code ())
     {
     case TYPE_CODE_INT:
     case TYPE_CODE_FLT:
@@ -3430,9 +3395,9 @@ slot_alignment_is_next_even (struct type *t)
       {
        int i;
 
-       for (i = 0; i < TYPE_NFIELDS (t); i++)
+       for (i = 0; i < t->num_fields (); i++)
          if (slot_alignment_is_next_even
-             (check_typedef (TYPE_FIELD_TYPE (t, i))))
+             (check_typedef (t->field (i).type ())))
            return 1;
        return 0;
       }
@@ -3471,16 +3436,14 @@ ia64_find_global_pointer_from_dynamic_section (struct gdbarch *gdbarch,
 
       if (osect < faddr_sect->objfile->sections_end)
        {
-         CORE_ADDR addr, endaddr;
-
-         addr = obj_section_addr (osect);
-         endaddr = obj_section_endaddr (osect);
+         CORE_ADDR addr = osect->addr ();
+         CORE_ADDR endaddr = osect->endaddr ();
 
          while (addr < endaddr)
            {
              int status;
              LONGEST tag;
-             char buf[8];
+             gdb_byte buf[8];
 
              status = target_read_memory (addr, buf, sizeof (buf));
              if (status != 0)
@@ -3554,16 +3517,14 @@ find_extant_func_descr (struct gdbarch *gdbarch, CORE_ADDR faddr)
 
       if (osect < faddr_sect->objfile->sections_end)
        {
-         CORE_ADDR addr, endaddr;
-
-         addr = obj_section_addr (osect);
-         endaddr = obj_section_endaddr (osect);
+         CORE_ADDR addr = osect->addr ();
+         CORE_ADDR endaddr = osect->endaddr ();
 
          while (addr < endaddr)
            {
              int status;
              LONGEST faddr2;
-             char buf[8];
+             gdb_byte buf[8];
 
              status = target_read_memory (addr, buf, sizeof (buf));
              if (status != 0)
@@ -3587,7 +3548,7 @@ find_extant_func_descr (struct gdbarch *gdbarch, CORE_ADDR faddr)
 static CORE_ADDR
 find_func_descr (struct regcache *regcache, CORE_ADDR faddr, CORE_ADDR *fdaptr)
 {
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  struct gdbarch *gdbarch = regcache->arch ();
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR fdesc;
 
@@ -3596,7 +3557,7 @@ find_func_descr (struct regcache *regcache, CORE_ADDR faddr, CORE_ADDR *fdaptr)
   if (fdesc == 0)
     {
       ULONGEST global_pointer;
-      char buf[16];
+      gdb_byte buf[16];
 
       fdesc = *fdaptr;
       *fdaptr += 16;
@@ -3645,17 +3606,18 @@ ia64_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr,
       struct obj_section *pc_section = find_pc_section (pc);
 
       if (pc_section && (pc_section->the_bfd_section->flags & SEC_CODE))
-        return pc;
+       return pc;
     }
 
   /* There are also descriptors embedded in vtables.  */
   if (s)
     {
-      struct minimal_symbol *minsym;
+      struct bound_minimal_symbol minsym;
 
       minsym = lookup_minimal_symbol_by_pc (addr);
 
-      if (minsym && is_vtable_name (SYMBOL_LINKAGE_NAME (minsym)))
+      if (minsym.minsym
+         && is_vtable_name (minsym.minsym->linkage_name ()))
        return read_memory_unsigned_integer (addr, 8, byte_order);
     }
 
@@ -3712,7 +3674,8 @@ static CORE_ADDR
 ia64_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)
+                     function_call_return_method return_method,
+                     CORE_ADDR struct_addr)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
@@ -3723,7 +3686,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   int nslots, rseslots, memslots, slotnum, nfuncargs;
   int floatreg;
   ULONGEST bsp;
-  CORE_ADDR funcdescaddr, pc, global_pointer;
+  CORE_ADDR funcdescaddr, global_pointer;
   CORE_ADDR func_addr = find_function_addr (function, NULL);
 
   nslots = 0;
@@ -3738,7 +3701,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
       if ((nslots & 1) && slot_alignment_is_next_even (type))
        nslots++;
 
-      if (TYPE_CODE (type) == TYPE_CODE_FUNC)
+      if (type->code () == TYPE_CODE_FUNC)
        nfuncargs++;
 
       nslots += (len + 7) / 8;
@@ -3779,11 +3742,11 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
       len = TYPE_LENGTH (type);
 
       /* Special handling for function parameters.  */
-      if (len == 8 
-          && TYPE_CODE (type) == TYPE_CODE_PTR 
-         && TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC)
+      if (len == 8
+         && type->code () == TYPE_CODE_PTR
+         && TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_FUNC)
        {
-         char val_buf[8];
+         gdb_byte val_buf[8];
          ULONGEST faddr = extract_unsigned_integer (value_contents (arg),
                                                     8, byte_order);
          store_unsigned_integer (val_buf, 8, byte_order,
@@ -3807,33 +3770,33 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
       argoffset = 0;
       while (len > 0)
        {
-         char val_buf[8];
+         gdb_byte val_buf[8];
 
          memset (val_buf, 0, 8);
-          if (!ia64_struct_type_p (type) && len < 8)
-            {
-              /* Integral types are LSB-aligned, so we have to be careful
-                 to insert the argument on the correct side of the buffer.
-                 This is why we use store_unsigned_integer.  */
-              store_unsigned_integer
-                (val_buf, 8, byte_order,
-                 extract_unsigned_integer (value_contents (arg), len,
+         if (!ia64_struct_type_p (type) && len < 8)
+           {
+             /* Integral types are LSB-aligned, so we have to be careful
+                to insert the argument on the correct side of the buffer.
+                This is why we use store_unsigned_integer.  */
+             store_unsigned_integer
+               (val_buf, 8, byte_order,
+                extract_unsigned_integer (value_contents (arg), len,
                                           byte_order));
-            }
-          else
-            {
-              /* This is either an 8bit integral type, or an aggregate.
-                 For 8bit integral type, there is no problem, we just
-                 copy the value over.
-
-                 For aggregates, the only potentially tricky portion
-                 is to write the last one if it is less than 8 bytes.
-                 In this case, the data is Byte0-aligned.  Happy news,
-                 this means that we don't need to differentiate the
-                 handling of 8byte blocks and less-than-8bytes blocks.  */
-              memcpy (val_buf, value_contents (arg) + argoffset,
-                      (len > 8) ? 8 : len);
-            }
+           }
+         else
+           {
+             /* This is either an 8bit integral type, or an aggregate.
+                For 8bit integral type, there is no problem, we just
+                copy the value over.
+
+                For aggregates, the only potentially tricky portion
+                is to write the last one if it is less than 8 bytes.
+                In this case, the data is Byte0-aligned.  Happy news,
+                this means that we don't need to differentiate the
+                handling of 8byte blocks and less-than-8bytes blocks.  */
+             memcpy (val_buf, value_contents (arg) + argoffset,
+                     (len > 8) ? 8 : len);
+           }
 
          if (slotnum < rseslots)
            tdep->infcall_ops.store_argument_in_slot (regcache, bsp,
@@ -3854,11 +3817,11 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
          len = TYPE_LENGTH (type);
          while (len > 0 && floatreg < IA64_FR16_REGNUM)
            {
-             char to[MAX_REGISTER_SIZE];
-             convert_typed_floating (value_contents (arg) + argoffset,
-                                     float_elt_type, to,
-                                     ia64_ext_type (gdbarch));
-             regcache_cooked_write (regcache, floatreg, (void *)to);
+             gdb_byte to[IA64_FP_REGISTER_SIZE];
+             target_float_convert (value_contents (arg) + argoffset,
+                                   float_elt_type, to,
+                                   ia64_ext_type (gdbarch));
+             regcache->cooked_write (floatreg, to);
              floatreg++;
              argoffset += TYPE_LENGTH (float_elt_type);
              len -= TYPE_LENGTH (float_elt_type);
@@ -3867,11 +3830,9 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
     }
 
   /* Store the struct return value in r8 if necessary.  */
-  if (struct_return)
-    {
-      regcache_cooked_write_unsigned (regcache, IA64_GR8_REGNUM,
-                                     (ULONGEST) struct_addr);
-    }
+  if (return_method == return_method_struct)
+    regcache_cooked_write_unsigned (regcache, IA64_GR8_REGNUM,
+                                   (ULONGEST) struct_addr);
 
   global_pointer = ia64_find_global_pointer (gdbarch, func_addr);
 
@@ -3903,7 +3864,7 @@ static struct frame_id
 ia64_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  char buf[8];
+  gdb_byte buf[8];
   CORE_ADDR sp, bsp;
 
   get_frame_register (this_frame, sp_regnum, buf);
@@ -3925,7 +3886,7 @@ static CORE_ADDR
 ia64_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-  char buf[8];
+  gdb_byte buf[8];
   CORE_ADDR ip, psr, pc;
 
   frame_unwind_register (next_frame, IA64_IP_REGNUM, buf);
@@ -3941,7 +3902,7 @@ static int
 ia64_print_insn (bfd_vma memaddr, struct disassemble_info *info)
 {
   info->bytes_per_line = SLOT_MULTIPLIER;
-  return print_insn_ia64 (memaddr, info);
+  return default_print_insn (memaddr, info);
 }
 
 /* The default "size_of_register_frame" gdbarch_tdep routine for ia64.  */
@@ -3963,7 +3924,7 @@ ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   if (arches != NULL)
     return arches->gdbarch;
 
-  tdep = xzalloc (sizeof (struct gdbarch_tdep));
+  tdep = XCNEW (struct gdbarch_tdep);
   gdbarch = gdbarch_alloc (&info, tdep);
 
   tdep->size_of_register_frame = ia64_size_of_register_frame;
@@ -4013,6 +3974,7 @@ ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_memory_remove_breakpoint (gdbarch,
                                        ia64_memory_remove_breakpoint);
   set_gdbarch_breakpoint_from_pc (gdbarch, ia64_breakpoint_from_pc);
+  set_gdbarch_breakpoint_kind_from_pc (gdbarch, ia64_breakpoint_kind_from_pc);
   set_gdbarch_read_pc (gdbarch, ia64_read_pc);
   set_gdbarch_write_pc (gdbarch, ia64_write_pc);
 
@@ -4025,7 +3987,7 @@ ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_unwind_pc (gdbarch, ia64_unwind_pc);
 #ifdef HAVE_LIBUNWIND_IA64_H
   frame_unwind_append_unwinder (gdbarch,
-                                &ia64_libunwind_sigtramp_frame_unwind);
+                               &ia64_libunwind_sigtramp_frame_unwind);
   frame_unwind_append_unwinder (gdbarch, &ia64_libunwind_frame_unwind);
   frame_unwind_append_unwinder (gdbarch, &ia64_sigtramp_frame_unwind);
   libunwind_frame_set_descr (gdbarch, &ia64_libunwind_descr);
@@ -4052,10 +4014,9 @@ ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   return gdbarch;
 }
 
-extern initialize_file_ftype _initialize_ia64_tdep; /* -Wmissing-prototypes */
-
+void _initialize_ia64_tdep ();
 void
-_initialize_ia64_tdep (void)
+_initialize_ia64_tdep ()
 {
   gdbarch_register (bfd_arch_ia64, ia64_gdbarch_init, NULL);
 }
This page took 0.054732 seconds and 4 git commands to generate.