gdb/
[deliverable/binutils-gdb.git] / gdb / xtensa-tdep.c
index a6181dad27ed8f1191054cf6aba6cd36216549db..c3ed28327b4d4f12d1d5bcb599d72ea7cf7185d6 100644 (file)
@@ -1,6 +1,7 @@
 /* Target-dependent code for the Xtensa port of GDB, the GNU debugger.
 
-   Copyright (C) 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -34,7 +35,7 @@
 #include "regset.h"
 
 #include "dummy-frame.h"
-#include "elf/dwarf2.h"
+#include "dwarf2.h"
 #include "dwarf2-frame.h"
 #include "dwarf2loc.h"
 #include "frame.h"
@@ -115,7 +116,8 @@ static int xtensa_debug_level = 0;
 #define PS_WOE                 (1<<18)
 #define PS_EXC                 (1<<4)
 
-/* Convert a live A-register number to the corresponding AR-register number.  */
+/* Convert a live A-register number to the corresponding AR-register
+   number.  */
 static int
 arreg_number (struct gdbarch *gdbarch, int a_regnum, ULONGEST wb)
 {
@@ -164,6 +166,7 @@ windowing_enabled (CORE_ADDR ps)
 static int
 extract_call_winsize (struct gdbarch *gdbarch, CORE_ADDR pc)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int winsize = 4;
   int insn;
   gdb_byte buf[4];
@@ -172,7 +175,7 @@ extract_call_winsize (struct gdbarch *gdbarch, CORE_ADDR pc)
 
   /* Read the previous instruction (should be a call[x]{4|8|12}.  */
   read_memory (pc-3, buf, 3);
-  insn = extract_unsigned_integer (buf, 3);
+  insn = extract_unsigned_integer (buf, 3, byte_order);
 
   /* Decode call instruction:
      Little Endian
@@ -182,7 +185,7 @@ extract_call_winsize (struct gdbarch *gdbarch, CORE_ADDR pc)
        call{0,4,8,12}   0101 || {00,01,10,11} || OFFSET
        callx{0,4,8,12}  0000 || {00,01,10,11} || 11 || OFFSET.  */
 
-  if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
+  if (byte_order == BFD_ENDIAN_LITTLE)
     {
       if (((insn & 0xf) == 0x5) || ((insn & 0xcf) == 0xc0))
        winsize = (insn & 0x30) >> 2;   /* 0, 4, 8, 12.  */
@@ -211,44 +214,29 @@ xtensa_register_name (struct gdbarch *gdbarch, int regnum)
   return 0;
 }
 
-static unsigned long
-xtensa_read_register (int regnum)
-{
-  ULONGEST value;
-
-  regcache_raw_read_unsigned (get_current_regcache (), regnum, &value);
-  return (unsigned long) value;
-}
-
 /* Return the type of a register.  Create a new type, if necessary.  */
 
-static struct ctype_cache
-{
-  struct ctype_cache *next;
-  int size;
-  struct type *virtual_type;
-} *type_entries = NULL;
-
 static struct type *
 xtensa_register_type (struct gdbarch *gdbarch, int regnum)
 {
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
   /* Return signed integer for ARx and Ax registers.  */
-  if ((regnum >= gdbarch_tdep (gdbarch)->ar_base
-      && regnum < gdbarch_tdep (gdbarch)->ar_base
-                   + gdbarch_tdep (gdbarch)->num_aregs)
-      || (regnum >= gdbarch_tdep (gdbarch)->a0_base
-      && regnum < gdbarch_tdep (gdbarch)->a0_base + 16))
-    return builtin_type_int;
+  if ((regnum >= tdep->ar_base
+       && regnum < tdep->ar_base + tdep->num_aregs)
+      || (regnum >= tdep->a0_base
+         && regnum < tdep->a0_base + 16))
+    return builtin_type (gdbarch)->builtin_int;
 
   if (regnum == gdbarch_pc_regnum (gdbarch)
-      || regnum == gdbarch_tdep (gdbarch)->a0_base + 1)
-    return lookup_pointer_type (builtin_type_void);
+      || regnum == tdep->a0_base + 1)
+    return builtin_type (gdbarch)->builtin_data_ptr;
 
   /* Return the stored type for all other registers.  */
   else if (regnum >= 0 && regnum < gdbarch_num_regs (gdbarch)
                                   + gdbarch_num_pseudo_regs (gdbarch))
     {
-      xtensa_register_t* reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
+      xtensa_register_t* reg = &tdep->regmap[regnum];
 
       /* Set ctype for this register (only the first time).  */
 
@@ -262,27 +250,27 @@ xtensa_register_type (struct gdbarch *gdbarch, int regnum)
          switch (size)
            {
            case 1:
-             reg->ctype = builtin_type_uint8;
+             reg->ctype = builtin_type (gdbarch)->builtin_uint8;
              break;
 
            case 2:
-             reg->ctype = builtin_type_uint16;
+             reg->ctype = builtin_type (gdbarch)->builtin_uint16;
              break;
 
            case 4:
-             reg->ctype = builtin_type_uint32;
+             reg->ctype = builtin_type (gdbarch)->builtin_uint32;
              break;
 
            case 8:
-             reg->ctype = builtin_type_uint64;
+             reg->ctype = builtin_type (gdbarch)->builtin_uint64;
              break;
 
            case 16:
-             reg->ctype = builtin_type_uint128;
+             reg->ctype = builtin_type (gdbarch)->builtin_uint128;
              break;
 
            default:
-             for (tp = type_entries; tp != NULL; tp = tp->next)
+             for (tp = tdep->type_entries; tp != NULL; tp = tp->next)
                if (tp->size == size)
                  break;
 
@@ -290,14 +278,13 @@ xtensa_register_type (struct gdbarch *gdbarch, int regnum)
                {
                  char *name = xmalloc (16);
                  tp = xmalloc (sizeof (struct ctype_cache));
-                 tp->next = type_entries;
-                 type_entries = tp;
+                 tp->next = tdep->type_entries;
+                 tdep->type_entries = tp;
                  tp->size = size;
 
                  sprintf (name, "int%d", size * 8);
-                 tp->virtual_type = init_type (TYPE_CODE_INT, size,
-                                               TYPE_FLAG_UNSIGNED, name,
-                                               NULL);
+                 tp->virtual_type
+                   = arch_integer_type (gdbarch, size * 8, 1, xstrdup (name));
                }
 
              reg->ctype = tp->virtual_type;
@@ -517,6 +504,8 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
                             int regnum,
                             gdb_byte *buffer)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+
   DEBUGTRACE ("xtensa_pseudo_register_read (... regnum = %d (%s) ...)\n",
              regnum, xtensa_register_name (gdbarch, regnum));
 
@@ -533,7 +522,7 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
 
       regcache_raw_read (regcache, gdbarch_tdep (gdbarch)->wb_regnum, buf);
       regnum = arreg_number (gdbarch, regnum,
-                            extract_unsigned_integer (buf, 4));
+                            extract_unsigned_integer (buf, 4, byte_order));
     }
 
   /* We can always read non-pseudo registers.  */
@@ -613,6 +602,8 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
                              int regnum,
                              const gdb_byte *buffer)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+
   DEBUGTRACE ("xtensa_pseudo_register_write (... regnum = %d (%s) ...)\n",
              regnum, xtensa_register_name (gdbarch, regnum));
 
@@ -631,7 +622,7 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
       regcache_raw_read (regcache,
                         gdbarch_tdep (gdbarch)->wb_regnum, buf);
       regnum = arreg_number (gdbarch, regnum,
-                            extract_unsigned_integer (buf, 4));
+                            extract_unsigned_integer (buf, 4, byte_order));
     }
 
   /* We can always write 'core' registers.
@@ -821,7 +812,7 @@ xtensa_supply_gregset (const struct regset *regset,
   struct gdbarch *gdbarch = get_regcache_arch (rc);
   int i;
 
-  DEBUGTRACE ("xtensa_supply_gregset (..., regnum==%d, ...) \n", regnum);
+  DEBUGTRACE ("xtensa_supply_gregset (..., regnum==%d, ...)\n", regnum);
 
   if (regnum == gdbarch_pc_regnum (gdbarch) || regnum == -1)
     regcache_raw_supply (rc, gdbarch_pc_regnum (gdbarch), (char *) &regs->pc);
@@ -879,7 +870,7 @@ xtensa_regset_from_core_section (struct gdbarch *core_arch,
                                 size_t sect_size)
 {
   DEBUGTRACE ("xtensa_regset_from_core_section "
-             "(..., sect_name==\"%s\", sect_size==%x) \n",
+             "(..., sect_name==\"%s\", sect_size==%x)\n",
              sect_name, (unsigned int) sect_size);
 
   if (strcmp (sect_name, ".reg") == 0
@@ -900,10 +891,11 @@ typedef struct xtensa_windowed_frame_cache
 {
   int wb;              /* WINDOWBASE of the previous frame.  */
   int callsize;                /* Call size of this frame.  */
-  int ws;              /* WINDOWSTART of the previous frame.  It keeps track of
-                          life windows only.  If there is no bit set for the
-                          window, that means it had been already spilled
-                          because of window overflow.  */
+  int ws;              /* WINDOWSTART of the previous frame.  It
+                          keeps track of life windows only.  If there
+                          is no bit set for the window, that means it
+                          had been already spilled because of window
+                          overflow.  */
 
   /* Spilled A-registers from the previous frame.
      AREGS[i] == -1, if corresponding AR is alive.  */
@@ -912,7 +904,8 @@ typedef struct xtensa_windowed_frame_cache
 
 /* Call0 ABI Definitions.  */
 
-#define C0_MAXOPDS  3  /* Maximum number of operands for prologue analysis.  */
+#define C0_MAXOPDS  3  /* Maximum number of operands for prologue
+                          analysis.  */
 #define C0_NREGS   16  /* Number of A-registers to track.  */
 #define C0_CLESV   12  /* Callee-saved registers are here and up.  */
 #define C0_SP      1   /* Register used as SP.  */
@@ -939,8 +932,9 @@ typedef struct xtensa_c0reg
     int            fr_reg;     /* original register from which register content
                           is derived, or C0_CONST, or C0_INEXP.  */
     int            fr_ofs;     /* constant offset from reg, or immediate value.  */
-    int            to_stk;     /* offset from original SP to register (4-byte aligned),
-                          or C0_NOSTK if register has not been saved.  */
+    int            to_stk;     /* offset from original SP to register (4-byte
+                          aligned), or C0_NOSTK if register has not
+                          been saved.  */
 } xtensa_c0reg_t;
 
 
@@ -948,7 +942,8 @@ typedef struct xtensa_c0reg
 typedef struct xtensa_call0_frame_cache
 {
   int c0_frmsz;                                /* Stack frame size.  */
-  int c0_hasfp;                                /* Current frame uses frame pointer.  */
+  int c0_hasfp;                                /* Current frame uses frame
+                                          pointer.  */
   int fp_regnum;                       /* A-register used as FP.  */
   int c0_fp;                           /* Actual value of frame pointer.  */
   xtensa_c0reg_t c0_rt[C0_NREGS];      /* Register tracking information.  */
@@ -959,7 +954,7 @@ typedef struct xtensa_frame_cache
   CORE_ADDR base;      /* Stack pointer of this frame.  */
   CORE_ADDR pc;                /* PC at the entry point to the function.  */
   CORE_ADDR ra;                /* The raw return address (without CALLINC).  */
-  CORE_ADDR ps;                /* The PS register of the previous frame.  */
+  CORE_ADDR ps;                /* The PS register of this frame.  */
   CORE_ADDR prev_sp;   /* Stack Pointer of the previous frame.  */
   int call0;           /* It's a call0 framework (else windowed).  */
   union
@@ -1024,15 +1019,17 @@ static CORE_ADDR
 xtensa_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
 {
   gdb_byte buf[8];
+  CORE_ADDR pc;
 
-  DEBUGTRACE ("xtensa_unwind_pc (next_frame = %p)\n", next_frame);
+  DEBUGTRACE ("xtensa_unwind_pc (next_frame = %s)\n", 
+               host_address_to_string (next_frame));
 
   frame_unwind_register (next_frame, gdbarch_pc_regnum (gdbarch), buf);
+  pc = extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
 
-  DEBUGINFO ("[xtensa_unwind_pc] pc = 0x%08x\n", (unsigned int)
-            extract_typed_address (buf, builtin_type_void_func_ptr));
+  DEBUGINFO ("[xtensa_unwind_pc] pc = 0x%08x\n", (unsigned int) pc);
 
-  return extract_typed_address (buf, builtin_type_void_func_ptr);
+  return pc;
 }
 
 
@@ -1054,7 +1051,8 @@ xtensa_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
 /* Returns the best guess about which register is a frame pointer
    for the function containing CURRENT_PC.  */
 
-#define XTENSA_ISA_BSZ 32          /* Instruction buffer size.  */
+#define XTENSA_ISA_BSZ         32              /* Instruction buffer size.  */
+#define XTENSA_ISA_BADPC       ((CORE_ADDR)0)  /* Bad PC value.  */
 
 static unsigned int
 xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc)
@@ -1091,7 +1089,8 @@ xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc)
          ba = ia;
          bt = (ba + XTENSA_ISA_BSZ) < current_pc
            ? ba + XTENSA_ISA_BSZ : current_pc;
-         read_memory (ba, ibuf, bt - ba);
+         if (target_read_memory (ba, ibuf, bt - ba) != 0)
+           RETURN_FP;
        }
 
       xtensa_insnbuf_from_chars (isa, ins, &ibuf[ia-ba], 0);
@@ -1122,7 +1121,7 @@ xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc)
              unsigned int register_operand;
 
              /* Possible candidate for setting frame pointer
-                from A1. This is what we are looking for.  */
+                from A1.  This is what we are looking for.  */
 
              if (xtensa_operand_get_field (isa, opc, 1, ifmt, 
                                            is, slot, &register_operand) != 0)
@@ -1138,7 +1137,8 @@ xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc)
                                             &register_operand) != 0)
                    RETURN_FP;
 
-                 fp_regnum = gdbarch_tdep (gdbarch)->a0_base + register_operand;
+                 fp_regnum
+                   = gdbarch_tdep (gdbarch)->a0_base + register_operand;
                  RETURN_FP;
                }
            }
@@ -1172,13 +1172,12 @@ done:
 
        cache->base    = SP (or best guess about FP) of this frame;
        cache->pc      = entry-PC (entry point of the frame function);
-       cache->prev_sp = SP of the previous frame.
-*/
+       cache->prev_sp = SP of the previous frame.  */
 
 static void
 call0_frame_cache (struct frame_info *this_frame,
                   xtensa_frame_cache_t *cache,
-                  CORE_ADDR pc);
+                  CORE_ADDR pc, CORE_ADDR litbase);
 
 static struct xtensa_frame_cache *
 xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
@@ -1186,7 +1185,7 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
   xtensa_frame_cache_t *cache;
   CORE_ADDR ra, wb, ws, pc, sp, ps;
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  unsigned int ps_regnum = gdbarch_ps_regnum (gdbarch);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   unsigned int fp_regnum;
   char op1;
   int  windowed;
@@ -1194,14 +1193,14 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
   if (*this_cache)
     return *this_cache;
 
-  windowed = windowing_enabled (xtensa_read_register (ps_regnum));
+  ps = get_frame_register_unsigned (this_frame, gdbarch_ps_regnum (gdbarch));
+  windowed = windowing_enabled (ps);
 
   /* Get pristine xtensa-frame.  */
   cache = xtensa_alloc_frame_cache (windowed);
   *this_cache = cache;
 
-  pc = get_frame_register_unsigned (this_frame,
-                                   gdbarch_pc_regnum (gdbarch));
+  pc = get_frame_register_unsigned (this_frame, gdbarch_pc_regnum (gdbarch));
 
   if (windowed)
     {
@@ -1210,9 +1209,8 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
                                        gdbarch_tdep (gdbarch)->wb_regnum);
       ws = get_frame_register_unsigned (this_frame,
                                        gdbarch_tdep (gdbarch)->ws_regnum);
-      ps = get_frame_register_unsigned (this_frame, ps_regnum);
 
-      op1 = read_memory_integer (pc, 1);
+      op1 = read_memory_integer (pc, 1, byte_order);
       if (XTENSA_IS_ENTRY (gdbarch, op1))
        {
          int callinc = CALLINC (ps);
@@ -1250,7 +1248,7 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
          cache->wd.ws = ws & ~(1 << wb);
 
          cache->pc = get_frame_func (this_frame);
-         cache->ra = (cache->pc & 0xc0000000) | (ra & 0x3fffffff);
+         cache->ra = (pc & 0xc0000000) | (ra & 0x3fffffff);
          cache->ps = (ps & ~PS_CALLINC_MASK)
            | ((WINSIZE(ra)/4) << PS_CALLINC_SHIFT);
        }
@@ -1273,8 +1271,8 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
              /* Set A4...A7/A11.  */
              /* Get the SP of the frame previous to the previous one.
                 To achieve this, we have to dereference SP twice.  */
-             sp = (CORE_ADDR) read_memory_integer (sp - 12, 4);
-             sp = (CORE_ADDR) read_memory_integer (sp - 12, 4);
+             sp = (CORE_ADDR) read_memory_integer (sp - 12, 4, byte_order);
+             sp = (CORE_ADDR) read_memory_integer (sp - 12, 4, byte_order);
              sp -= cache->wd.callsize * 4;
 
              for ( i = 4; i < cache->wd.callsize; i++, sp += 4)
@@ -1285,8 +1283,9 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
        }
 
       if ((cache->prev_sp == 0) && ( ra != 0 ))
-       /* If RA is equal to 0 this frame is an outermost frame.  Leave
-          cache->prev_sp unchanged marking the boundary of the frame stack.  */
+       /* If RA is equal to 0 this frame is an outermost frame.
+          Leave cache->prev_sp unchanged marking the boundary of the
+          frame stack.  */
        {
          if ((cache->wd.ws & (1 << cache->wd.wb)) == 0)
            {
@@ -1294,7 +1293,7 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
                 We can read caller's SP from the proper spill loction.  */
              sp = get_frame_register_unsigned
                (this_frame, gdbarch_tdep (gdbarch)->a0_base + 1);
-             cache->prev_sp = read_memory_integer (sp - 12, 4); 
+             cache->prev_sp = read_memory_integer (sp - 12, 4, byte_order);
            }
          else
            {
@@ -1303,13 +1302,18 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
                             (gdbarch, gdbarch_tdep (gdbarch)->a0_base + 1,
                              cache->wd.wb);
 
-             cache->prev_sp = xtensa_read_register (regnum);
+             cache->prev_sp = get_frame_register_unsigned (this_frame,
+                                                           regnum);
            }
        }
     }
   else /* Call0 framework.  */
     {
-      call0_frame_cache (this_frame, cache, pc);
+      unsigned int litbase_regnum = gdbarch_tdep (gdbarch)->litbase_regnum;
+      CORE_ADDR litbase = (litbase_regnum == -1)
+       ? 0 : get_frame_register_unsigned (this_frame, litbase_regnum);
+
+      call0_frame_cache (this_frame, cache, pc, litbase);
       fp_regnum = cache->c0.fp_regnum;
     }
 
@@ -1409,7 +1413,8 @@ xtensa_frame_prev_register (struct frame_info *this_frame,
              spe = cache->c0.c0_fp
                - cache->c0.c0_rt[cache->c0.fp_regnum].fr_ofs;
 
-             return frame_unwind_got_memory (this_frame, regnum, spe + stkofs);
+             return frame_unwind_got_memory (this_frame, regnum,
+                                             spe + stkofs);
            }
        }
     }
@@ -1475,7 +1480,8 @@ xtensa_extract_return_value (struct type *type,
       /* On Xtensa, we can return up to 4 words (or 2 for call12).  */
       if (len > (callsize > 8 ? 8 : 16))
        internal_error (__FILE__, __LINE__,
-                       _("cannot extract return value of %d bytes long"), len);
+                       _("cannot extract return value of %d bytes long"),
+                       len);
 
       /* Get the register offset of the return
         register (A2) in the caller window.  */
@@ -1602,6 +1608,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
                        int struct_return,
                        CORE_ADDR struct_addr)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int i;
   int size, onstack_size;
   gdb_byte *buf = (gdb_byte *) alloca (16);
@@ -1614,8 +1621,8 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
     int align;                 /* alignment */
     union
     {
-      int offset;              /* stack offset if on stack */
-      int regno;               /* regno if in register */
+      int offset;              /* stack offset if on stack */
+      int regno;               /* regno if in register */
     } u;
   };
 
@@ -1638,8 +1645,9 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
         {
          struct value *arg = args[i];
          struct type *arg_type = check_typedef (value_type (arg));
-         fprintf_unfiltered (gdb_stdlog, "%2d: 0x%lx %3d ",
-                             i, (unsigned long) arg, TYPE_LENGTH (arg_type));
+         fprintf_unfiltered (gdb_stdlog, "%2d: %s %3d ", i,
+                             host_address_to_string (arg),
+                             TYPE_LENGTH (arg_type));
          switch (TYPE_CODE (arg_type))
            {
            case TYPE_CODE_INT:
@@ -1652,8 +1660,8 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
              fprintf_unfiltered (gdb_stdlog, "%3d", TYPE_CODE (arg_type));
              break;
            }
-         fprintf_unfiltered (gdb_stdlog, " 0x%lx\n",
-                             (unsigned long) value_contents (arg));
+         fprintf_unfiltered (gdb_stdlog, " %s\n",
+                             host_address_to_string (value_contents (arg)));
        }
     }
 
@@ -1684,9 +1692,10 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
        case TYPE_CODE_ENUM:
 
          /* Cast argument to long if necessary as the mask does it too.  */
-         if (TYPE_LENGTH (arg_type) < TYPE_LENGTH (builtin_type_long))
+         if (TYPE_LENGTH (arg_type)
+             < TYPE_LENGTH (builtin_type (gdbarch)->builtin_long))
            {
-             arg_type = builtin_type_long;
+             arg_type = builtin_type (gdbarch)->builtin_long;
              arg = value_cast (arg_type, arg);
            }
          /* Aligment is equal to the type length for the basic types.  */
@@ -1696,15 +1705,16 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
        case TYPE_CODE_FLT:
 
          /* Align doubles correctly.  */
-         if (TYPE_LENGTH (arg_type) == TYPE_LENGTH (builtin_type_double))
-           info->align = TYPE_LENGTH (builtin_type_double);
+         if (TYPE_LENGTH (arg_type)
+             == TYPE_LENGTH (builtin_type (gdbarch)->builtin_double))
+           info->align = TYPE_LENGTH (builtin_type (gdbarch)->builtin_double);
          else
-           info->align = TYPE_LENGTH (builtin_type_long);
+           info->align = TYPE_LENGTH (builtin_type (gdbarch)->builtin_long);
          break;
 
        case TYPE_CODE_STRUCT:
        default:
-         info->align = TYPE_LENGTH (builtin_type_long);
+         info->align = TYPE_LENGTH (builtin_type (gdbarch)->builtin_long);
          break;
        }
       info->length = TYPE_LENGTH (arg_type);
@@ -1743,7 +1753,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
 
   if (struct_return)
     {
-      store_unsigned_integer (buf, REGISTER_SIZE, struct_addr);
+      store_unsigned_integer (buf, REGISTER_SIZE, byte_order, struct_addr);
       regcache_cooked_write (regcache, ARG_1ST (gdbarch), buf);
     }
 
@@ -1779,13 +1789,13 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
             than REGISTER_SIZE; for larger odd-sized structures the excess
             will be left-aligned in the register on both endiannesses.  */
 
-         if (n < REGISTER_SIZE
-             && gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
+         if (n < REGISTER_SIZE && byte_order == BFD_ENDIAN_BIG)
            {
-             ULONGEST v = extract_unsigned_integer (cp, REGISTER_SIZE);
+             ULONGEST v;
+             v = extract_unsigned_integer (cp, REGISTER_SIZE, byte_order);
              v = v >> ((REGISTER_SIZE - n) * TARGET_CHAR_BIT);
 
-             store_unsigned_integer (buf, REGISTER_SIZE, v);
+             store_unsigned_integer (buf, REGISTER_SIZE, byte_order, v);
              regcache_cooked_write (regcache, r, buf);
 
              cp += REGISTER_SIZE;
@@ -1812,7 +1822,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
     {
       ra = (bp_addr & 0x3fffffff) | 0x40000000;
       regcache_raw_read (regcache, gdbarch_ps_regnum (gdbarch), buf);
-      ps = extract_unsigned_integer (buf, 4) & ~0x00030000;
+      ps = extract_unsigned_integer (buf, 4, byte_order) & ~0x00030000;
       regcache_cooked_write_unsigned
        (regcache, gdbarch_tdep (gdbarch)->a0_base + 4, ra);
       regcache_cooked_write_unsigned (regcache,
@@ -1825,9 +1835,9 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
         is only one register window corresponding to WINDOWEBASE.  */
 
       regcache_raw_read (regcache, gdbarch_tdep (gdbarch)->wb_regnum, buf);
-      regcache_cooked_write_unsigned (regcache,
-                                     gdbarch_tdep (gdbarch)->ws_regnum,
-                                     1 << extract_unsigned_integer (buf, 4));
+      regcache_cooked_write_unsigned
+       (regcache, gdbarch_tdep (gdbarch)->ws_regnum,
+        1 << extract_unsigned_integer (buf, 4, byte_order));
     }
   else
     {
@@ -1911,7 +1921,8 @@ typedef enum {
   c0opc_mov,          /* Moving a register to a register.  */
   c0opc_movi,         /* Moving an immediate to a register.  */
   c0opc_l32r,         /* Loading a literal.  */
-  c0opc_s32i,         /* Storing word at fixed offset from a base register.  */
+  c0opc_s32i,         /* Storing word at fixed offset from a base
+                         register.  */
   c0opc_NrOf          /* Number of opcode classifications.  */
 } xtensa_insn_kind;
 
@@ -1979,11 +1990,13 @@ call0_classify_opcode (xtensa_isa isa, xtensa_opcode opc)
    the stack frame.  */
 
 static void
-call0_track_op (xtensa_c0reg_t dst[], xtensa_c0reg_t src[],
+call0_track_op (struct gdbarch *gdbarch,
+               xtensa_c0reg_t dst[], xtensa_c0reg_t src[],
                xtensa_insn_kind opclass, int nods, unsigned odv[],
-               CORE_ADDR pc, int spreg)
+               CORE_ADDR pc, CORE_ADDR litbase, int spreg)
 {
-  unsigned litbase, litaddr, litval;
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  unsigned litaddr, litval;
 
   switch (opclass)
     {
@@ -2033,14 +2046,10 @@ call0_track_op (xtensa_c0reg_t dst[], xtensa_c0reg_t src[],
     case c0opc_l32r:
       /* 2 operands: dst, literal offset.  */
       gdb_assert (nods == 2);
-      /* litbase = xtensa_get_litbase (pc); can be also used.  */
-      litbase = (gdbarch_tdep (current_gdbarch)->litbase_regnum == -1)
-       ? 0 : xtensa_read_register
-               (gdbarch_tdep (current_gdbarch)->litbase_regnum);
       litaddr = litbase & 1
                  ? (litbase & ~1) + (signed)odv[1]
                  : (pc + 3  + (signed)odv[1]) & ~3;
-      litval = read_memory_integer(litaddr, 4);
+      litval = read_memory_integer (litaddr, 4, byte_order);
       dst[odv[0]].fr_reg = C0_CONST;
       dst[odv[0]].fr_ofs = litval;
       break;
@@ -2059,7 +2068,7 @@ call0_track_op (xtensa_c0reg_t dst[], xtensa_c0reg_t src[],
        }
       break;
     default:
-       gdb_assert (0);
+       gdb_assert_not_reached ("unexpected instruction kind");
     }
 }
 
@@ -2093,14 +2102,14 @@ call0_track_op (xtensa_c0reg_t dst[], xtensa_c0reg_t src[],
       because they begin with default assumptions that analysis may change.  */
 
 static CORE_ADDR
-call0_analyze_prologue (CORE_ADDR start, CORE_ADDR pc,
+call0_analyze_prologue (struct gdbarch *gdbarch,
+                       CORE_ADDR start, CORE_ADDR pc, CORE_ADDR litbase,
                        int nregs, xtensa_c0reg_t rt[], int *call0)
 {
   CORE_ADDR ia;                    /* Current insn address in prologue.  */
   CORE_ADDR ba = 0;        /* Current address at base of insn buffer.  */
   CORE_ADDR bt;                    /* Current address at top+1 of insn buffer.  */
-  #define BSZ 32           /* Instruction buffer size.  */
-  char ibuf[BSZ];          /* Instruction buffer for decoding prologue.  */
+  char ibuf[XTENSA_ISA_BSZ];/* Instruction buffer for decoding prologue.  */
   xtensa_isa isa;          /* libisa ISA handle.  */
   xtensa_insnbuf ins, slot; /* libisa handle to decoded insn, slot.  */
   xtensa_format ifmt;      /* libisa instruction format.  */
@@ -2129,7 +2138,7 @@ call0_analyze_prologue (CORE_ADDR start, CORE_ADDR pc,
      Assume we may be in the prologue until we hit a flow control instr.  */
 
   rtmp = NULL;
-  body_pc = INT_MAX;
+  body_pc = UINT_MAX;
   end_pc = 0;
 
   /* Find out, if we have an information about the prologue from DWARF.  */
@@ -2160,7 +2169,7 @@ call0_analyze_prologue (CORE_ADDR start, CORE_ADDR pc,
   if (!xtensa_default_isa)
     xtensa_default_isa = xtensa_isa_init (0, 0);
   isa = xtensa_default_isa;
-  gdb_assert (BSZ >= xtensa_isa_maxlength (isa));
+  gdb_assert (XTENSA_ISA_BSZ >= xtensa_isa_maxlength (isa));
   ins = xtensa_insnbuf_alloc (isa);
   slot = xtensa_insnbuf_alloc (isa);
 
@@ -2173,8 +2182,10 @@ call0_analyze_prologue (CORE_ADDR start, CORE_ADDR pc,
       if (ia + xtensa_isa_maxlength (isa) > bt)
         {
          ba = ia;
-         bt = (ba + BSZ) < body_pc ? ba + BSZ : body_pc;
+         bt = (ba + XTENSA_ISA_BSZ) < body_pc ? ba + XTENSA_ISA_BSZ : body_pc;
          read_memory (ba, ibuf, bt - ba);
+         /* If there is a memory reading error read_memory () will report it
+            and then throw an exception, stopping command execution.  */
        }
 
       /* Decode format information.  */
@@ -2215,7 +2226,8 @@ call0_analyze_prologue (CORE_ADDR start, CORE_ADDR pc,
            goto done;
 
          opc = xtensa_opcode_decode (isa, ifmt, is, slot);
-         DEBUGVERB ("[call0_analyze_prologue] instr addr = 0x%08x, opc = %d\n", 
+         DEBUGVERB ("[call0_analyze_prologue] instr "
+                    "addr = 0x%08x, opc = %d\n", 
                     (unsigned)ia, opc);
          if (opc == XTENSA_UNDEFINED) 
            opclass = c0opc_illegal;
@@ -2285,7 +2297,8 @@ call0_analyze_prologue (CORE_ADDR start, CORE_ADDR pc,
            }
 
          /* Track register movement and modification for this operation.  */
-         call0_track_op (rt, rtmp, opclass, nods, odv, ia, 1);
+         call0_track_op (gdbarch, rt, rtmp, opclass,
+                         nods, odv, ia, litbase, 1);
        }
     }
 done:
@@ -2293,16 +2306,18 @@ done:
             (unsigned)ia, fail ? "failed" : "succeeded");
   xtensa_insnbuf_free(isa, slot);
   xtensa_insnbuf_free(isa, ins);
-  return fail ? 0 : ia;
+  return fail ? XTENSA_ISA_BADPC : ia;
 }
 
 /* Initialize frame cache for the current frame in CALL0 ABI.  */
 
 static void
 call0_frame_cache (struct frame_info *this_frame,
-                  xtensa_frame_cache_t *cache, CORE_ADDR pc)
+                  xtensa_frame_cache_t *cache,
+                  CORE_ADDR pc, CORE_ADDR litbase)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR start_pc;          /* The beginning of the function.  */
   CORE_ADDR body_pc=UINT_MAX;  /* PC, where prologue analysis stopped.  */
   CORE_ADDR sp, fp, ra;
@@ -2313,9 +2328,14 @@ call0_frame_cache (struct frame_info *this_frame,
 
   if (find_pc_partial_function (pc, NULL, &start_pc, NULL))
     {
-      body_pc = call0_analyze_prologue (start_pc, pc, C0_NREGS,
+      body_pc = call0_analyze_prologue (gdbarch, start_pc, pc, litbase,
+                                       C0_NREGS,
                                        &cache->c0.c0_rt[0],
                                        &cache->call0);
+
+      if (body_pc == XTENSA_ISA_BADPC)
+       error (_("Xtensa-specific internal error: CALL0 prologue \
+analysis failed in this frame. GDB command execution stopped."));
     }
   
   sp = get_frame_register_unsigned
@@ -2368,26 +2388,29 @@ call0_frame_cache (struct frame_info *this_frame,
   to_stk = cache->c0.c0_rt[C0_RA].to_stk;
   if (to_stk != C0_NOSTK)
     ra = (CORE_ADDR) 
-      read_memory_integer (sp + c0_frmsz + cache->c0.c0_rt[C0_RA].to_stk, 4);
+      read_memory_integer (sp + c0_frmsz + cache->c0.c0_rt[C0_RA].to_stk,
+                          4, byte_order);
 
   else if (cache->c0.c0_rt[C0_RA].fr_reg == C0_CONST
           && cache->c0.c0_rt[C0_RA].fr_ofs == 0)
     {
-      /* Special case for terminating backtrace at a function that wants to
-        be seen as the outermost.  Such a function will clear it's RA (A0)
-        register to 0 in the prologue instead of saving its original value.  */
+      /* Special case for terminating backtrace at a function that
+        wants to be seen as the outermost.  Such a function will
+        clear it's RA (A0) register to 0 in the prologue instead of
+        saving its original value.  */
       ra = 0;
     }
   else
     {
-      /* RA was copied to another register or (before any function call) may
-        still be in the original RA register.  This is not always reliable:
-        even in a leaf function, register tracking stops after prologue, and
-        even in prologue, non-prologue instructions (not tracked) may overwrite
-        RA or any register it was copied to.  If likely in prologue or before
-        any call, use retracking info and hope for the best (compiler should
-        have saved RA in stack if not in a leaf function).  If not in prologue,
-        too bad.  */
+      /* RA was copied to another register or (before any function
+        call) may still be in the original RA register.  This is not
+        always reliable: even in a leaf function, register tracking
+        stops after prologue, and even in prologue, non-prologue
+        instructions (not tracked) may overwrite RA or any register
+        it was copied to.  If likely in prologue or before any call,
+        use retracking info and hope for the best (compiler should
+        have saved RA in stack if not in a leaf function).  If not in
+        prologue, too bad.  */
 
       int i;
       for (i = 0; 
@@ -2453,7 +2476,7 @@ call0_frame_cache (struct frame_info *this_frame,
 
 /* #define DONT_SKIP_PROLOGUE  */
 
-CORE_ADDR
+static CORE_ADDR
 xtensa_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
 {
   struct symtab_and_line prologue_sal;
@@ -2487,7 +2510,7 @@ xtensa_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
     }
 
   /* No debug line info.  Analyze prologue for Call0 or simply skip ENTRY.  */
-  body_pc = call0_analyze_prologue(start_pc, 0, 0, NULL, NULL);
+  body_pc = call0_analyze_prologue (gdbarch, start_pc, 0, 0, 0, NULL, NULL);
   return body_pc != 0 ? body_pc : start_pc;
 }
 
@@ -2498,7 +2521,7 @@ xtensa_verify_config (struct gdbarch *gdbarch)
   struct ui_file *log;
   struct cleanup *cleanups;
   struct gdbarch_tdep *tdep;
-  long dummy;
+  long length;
   char *buf;
 
   tdep = gdbarch_tdep (gdbarch);
@@ -2531,9 +2554,9 @@ xtensa_verify_config (struct gdbarch *gdbarch)
   if (tdep->a0_base == -1)
     fprintf_unfiltered (log, _("\n\ta0_base: No Ax registers"));
 
-  buf = ui_file_xstrdup (log, &dummy);
+  buf = ui_file_xstrdup (log, &length);
   make_cleanup (xfree, buf);
-  if (strlen (buf) > 0)
+  if (length > 0)
     internal_error (__FILE__, __LINE__,
                    _("the following are invalid: %s"), buf);
   do_cleanups (cleanups);
@@ -2542,7 +2565,7 @@ xtensa_verify_config (struct gdbarch *gdbarch)
 
 /* Derive specific register numbers from the array of registers.  */
 
-void
+static void
 xtensa_derive_tdep (struct gdbarch_tdep *tdep)
 {
   xtensa_register_t* rmap;
@@ -2650,16 +2673,15 @@ xtensa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_pc_regnum (gdbarch, tdep->pc_regnum);
   set_gdbarch_ps_regnum (gdbarch, tdep->ps_regnum);
 
-  /* Renumber registers for known formats (stab, dwarf, and dwarf2).  */
+  /* Renumber registers for known formats (stabs and dwarf2).  */
   set_gdbarch_stab_reg_to_regnum (gdbarch, xtensa_reg_to_regnum);
-  set_gdbarch_dwarf_reg_to_regnum (gdbarch, xtensa_reg_to_regnum);
   set_gdbarch_dwarf2_reg_to_regnum (gdbarch, xtensa_reg_to_regnum);
 
   /* We provide our own function to get register information.  */
   set_gdbarch_register_name (gdbarch, xtensa_register_name);
   set_gdbarch_register_type (gdbarch, xtensa_register_type);
 
-  /* To call functions from GDB using dummy frame */
+  /* To call functions from GDB using dummy frame */
   set_gdbarch_push_dummy_call (gdbarch, xtensa_push_dummy_call);
 
   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
@@ -2715,6 +2737,9 @@ xtensa_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
   error (_("xtensa_dump_tdep(): not implemented"));
 }
 
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern initialize_file_ftype _initialize_xtensa_tdep;
+
 void
 _initialize_xtensa_tdep (void)
 {
@@ -2725,9 +2750,9 @@ _initialize_xtensa_tdep (void)
 
   add_setshow_zinteger_cmd ("xtensa",
                            class_maintenance,
-                           &xtensa_debug_level, _("\
-Set Xtensa debugging."), _("\
-Show Xtensa debugging."), _("\
+                           &xtensa_debug_level,
+                           _("Set Xtensa debugging."),
+                           _("Show Xtensa debugging."), _("\
 When non-zero, Xtensa-specific debugging is enabled. \
 Can be 1, 2, 3, or 4 indicating the level of debugging."),
                            NULL,
This page took 0.036088 seconds and 4 git commands to generate.