Don't include sys/personality.h in linux-low.cc anymore
[deliverable/binutils-gdb.git] / gdb / xtensa-tdep.c
index 49a7f023e7d9ec6d0ad3f2ca0dec294eb813b6d4..d1c24a16f2a71047bbb179d59c0a918bb5ecbffb 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for the Xtensa port of GDB, the GNU debugger.
 
-   Copyright (C) 2003-2018 Free Software Foundation, Inc.
+   Copyright (C) 2003-2021 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "frame.h"
 #include "solib-svr4.h"
 #include "symtab.h"
-#include "symfile.h"
-#include "objfiles.h"
 #include "gdbtypes.h"
 #include "gdbcore.h"
 #include "value.h"
-#include "dis-asm.h"
-#include "inferior.h"
 #include "osabi.h"
 #include "regcache.h"
 #include "reggroups.h"
 #include "regset.h"
 
-#include "dummy-frame.h"
-#include "dwarf2.h"
-#include "dwarf2-frame.h"
-#include "dwarf2loc.h"
+#include "dwarf2/frame.h"
 #include "frame-base.h"
 #include "frame-unwind.h"
 
 #include "arch-utils.h"
 #include "gdbarch.h"
-#include "remote.h"
-#include "serial.h"
 
 #include "command.h"
 #include "gdbcmd.h"
@@ -234,9 +225,7 @@ xtensa_find_register_by_name (struct gdbarch *gdbarch, const char *name)
 {
   int i;
 
-  for (i = 0; i < gdbarch_num_regs (gdbarch)
-        + gdbarch_num_pseudo_regs (gdbarch);
-       i++)
+  for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
 
     if (strcasecmp (gdbarch_tdep (gdbarch)->regmap[i].name, name) == 0)
       return i;
@@ -249,8 +238,7 @@ static const char *
 xtensa_register_name (struct gdbarch *gdbarch, int regnum)
 {
   /* Return the name stored in the register map.  */
-  if (regnum >= 0 && regnum < gdbarch_num_regs (gdbarch)
-                             + gdbarch_num_pseudo_regs (gdbarch))
+  if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
     return gdbarch_tdep (gdbarch)->regmap[regnum].name;
 
   internal_error (__FILE__, __LINE__, _("invalid register %d"), regnum);
@@ -276,8 +264,7 @@ xtensa_register_type (struct gdbarch *gdbarch, int regnum)
     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))
+  else if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
     {
       xtensa_register_t* reg = &tdep->regmap[regnum];
 
@@ -352,9 +339,7 @@ xtensa_reg_to_regnum (struct gdbarch *gdbarch, int regnum)
   if (regnum >= 0 && regnum < 16)
     return gdbarch_tdep (gdbarch)->a0_base + regnum;
 
-  for (i = 0;
-       i < gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
-       i++)
+  for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
     if (regnum == gdbarch_tdep (gdbarch)->regmap[i].target_number)
       return i;
 
@@ -585,9 +570,7 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
       return REG_VALID;
     }
   /* Pseudo registers.  */
-  else if (regnum >= 0
-           && regnum < gdbarch_num_regs (gdbarch)
-                       + gdbarch_num_pseudo_regs (gdbarch))
+  else if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
     {
       xtensa_register_t *reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
       xtensa_register_type_t type = reg->type;
@@ -606,7 +589,7 @@ xtensa_pseudo_register_read (struct gdbarch *gdbarch,
 
       /* Some targets cannot read TIE register files.  */
       else if (type == xtRegisterTypeTieRegfile)
-        {
+       {
          /* Use 'fetch' to get register?  */
          if (flags & xtTargetFlagsUseFetchStore)
            {
@@ -646,7 +629,7 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
   DEBUGTRACE ("xtensa_pseudo_register_write (... regnum = %d (%s) ...)\n",
              regnum, xtensa_register_name (gdbarch, regnum));
 
-  /* Renumber register, if aliase a0..a15 on Windowed ABI.  */
+  /* Renumber register, if aliases a0..a15 on Windowed ABI.  */
   if (gdbarch_tdep (gdbarch)->isa_use_windowed_registers
       && (regnum >= gdbarch_tdep (gdbarch)->a0_base)
       && (regnum <= gdbarch_tdep (gdbarch)->a0_base + 15))
@@ -670,9 +653,7 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
       return;
     }
   /* Pseudo registers.  */
-  else if (regnum >= 0
-          && regnum < gdbarch_num_regs (gdbarch)
-                      + gdbarch_num_pseudo_regs (gdbarch))
+  else if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
     {
       xtensa_register_t *reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
       xtensa_register_type_t type = reg->type;
@@ -681,7 +662,7 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
       /* On most targets, we cannot write registers
         of type "Unknown" or "Unmapped".  */
       if (type == xtRegisterTypeUnmapped || type == xtRegisterTypeUnknown)
-        {
+       {
          if ((flags & xtTargetFlagsNonVisibleRegs) == 0)
            {
              warning (_("cannot write register %s"),
@@ -692,7 +673,7 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
 
       /* Some targets cannot read TIE register files.  */
       else if (type == xtRegisterTypeTieRegfile)
-        {
+       {
          /* Use 'store' to get register?  */
          if (flags & xtTargetFlagsUseFetchStore)
            {
@@ -711,7 +692,7 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
 
       /* We can always write mapped registers.  */
       else if (type == xtRegisterTypeMapped || type == xtRegisterTypeTieState)
-        {
+       {
          xtensa_register_write_masked (regcache, reg, buffer);
          return;
        }
@@ -941,7 +922,7 @@ typedef struct xtensa_windowed_frame_cache
 /* Each element of xtensa_call0_frame_cache.c0_rt[] describes for each
    A-register where the current content of the reg came from (in terms
    of an original reg and a constant).  Negative values of c0_rt[n].fp_reg
-   mean that the orignal content of the register was saved to the stack.
+   mean that the original content of the register was saved to the stack.
    c0_rt[n].fr.ofs is NOT the offset from the frame base because we don't 
    know where SP will end up until the entire prologue has been analyzed.  */
 
@@ -967,7 +948,7 @@ typedef struct xtensa_call0_frame_cache
   int c0_hasfp;                           /* Current frame uses frame pointer.  */
   int fp_regnum;                  /* A-register used as FP.  */
   int c0_fp;                      /* Actual value of frame pointer.  */
-  int c0_fpalign;                 /* Dinamic adjustment for the stack
+  int c0_fpalign;                 /* Dynamic adjustment for the stack
                                      pointer. It's an AND mask. Zero,
                                      if alignment was not adjusted.  */
   int c0_old_sp;                  /* In case of dynamic adjustment, it is
@@ -1148,7 +1129,7 @@ xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc)
   for (ia = start_addr, bt = ia; ia < current_pc ; ia += ilen)
     {
       if (ia + xtensa_isa_maxlength (isa) > bt)
-        {
+       {
          ba = ia;
          bt = (ba + XTENSA_ISA_BSZ) < current_pc
            ? ba + XTENSA_ISA_BSZ : current_pc;
@@ -1340,7 +1321,7 @@ 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.  */
+                To achieve this, we have to dereference SP twice.  */
              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;
@@ -1359,7 +1340,7 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
          if ((cache->wd.ws & (1 << cache->wd.wb)) == 0)
            {
              /* Register window overflow already happened.
-                We can read caller's SP from the proper spill loction.  */
+                We can read caller's SP from the proper spill location.  */
              sp = get_frame_register_unsigned
                (this_frame, gdbarch_tdep (gdbarch)->a0_base + 1);
              cache->prev_sp = read_memory_integer (sp - 12, 4, byte_order);
@@ -1397,7 +1378,7 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache)
 static int xtensa_session_once_reported = 1;
 
 /* Report a problem with prologue analysis while doing backtracing.
-   But, do it only once to avoid annoyng repeated messages.  */
+   But, do it only once to avoid annoying repeated messages.  */
 
 static void
 warning_once (void)
@@ -1465,7 +1446,7 @@ xtensa_frame_prev_register (struct frame_info *this_frame,
       /* Convert A-register numbers to AR-register numbers,
         if we deal with A-register.  */
       if (regnum >= gdbarch_tdep (gdbarch)->a0_base
-          && regnum <= gdbarch_tdep (gdbarch)->a0_base + 15)
+         && regnum <= gdbarch_tdep (gdbarch)->a0_base + 15)
        regnum = arreg_number (gdbarch, regnum, cache->wd.wb);
 
       /* Check, if we deal with AR-register saved on stack.  */
@@ -1625,13 +1606,13 @@ xtensa_store_return_value (struct type *type,
 
       if (len > (callsize > 8 ? 8 : 16))
        internal_error (__FILE__, __LINE__,
-                       _("unimplemented for this length: %d"),
-                       TYPE_LENGTH (type));
+                       _("unimplemented for this length: %s"),
+                       pulongest (TYPE_LENGTH (type)));
       areg = arreg_number (gdbarch,
                           gdbarch_tdep (gdbarch)->a0_base + 2 + callsize, wb);
 
       DEBUGTRACE ("[xtensa_store_return_value] callsize %d wb %d\n",
-              callsize, (int) wb);
+             callsize, (int) wb);
     }
   else
     {
@@ -1661,9 +1642,9 @@ xtensa_return_value (struct gdbarch *gdbarch,
 {
   /* Structures up to 16 bytes are returned in registers.  */
 
-  int struct_return = ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT
-                       || TYPE_CODE (valtype) == TYPE_CODE_UNION
-                       || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
+  int struct_return = ((valtype->code () == TYPE_CODE_STRUCT
+                       || valtype->code () == TYPE_CODE_UNION
+                       || valtype->code () == TYPE_CODE_ARRAY)
                       && TYPE_LENGTH (valtype) > 16);
 
   if (struct_return)
@@ -1695,11 +1676,10 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
                        int nargs,
                        struct value **args,
                        CORE_ADDR sp,
-                       int struct_return,
+                       function_call_return_method return_method,
                        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);
   CORE_ADDR ra, ps;
@@ -1725,20 +1705,19 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
 
   if (xtensa_debug_level > 3)
     {
-      int i;
       DEBUGINFO ("[xtensa_push_dummy_call] nargs = %d\n", nargs);
-      DEBUGINFO ("[xtensa_push_dummy_call] sp=0x%x, struct_return=%d, "
+      DEBUGINFO ("[xtensa_push_dummy_call] sp=0x%x, return_method=%d, "
                 "struct_addr=0x%x\n",
-                (int) sp, (int) struct_return, (int) struct_addr);
+                (int) sp, (int) return_method, (int) struct_addr);
 
-      for (i = 0; i < nargs; i++)
-        {
+      for (int i = 0; i < nargs; i++)
+       {
          struct value *arg = args[i];
          struct type *arg_type = check_typedef (value_type (arg));
-         fprintf_unfiltered (gdb_stdlog, "%2d: %s %3d ", i,
+         fprintf_unfiltered (gdb_stdlog, "%2d: %s %3s ", i,
                              host_address_to_string (arg),
-                             TYPE_LENGTH (arg_type));
-         switch (TYPE_CODE (arg_type))
+                             pulongest (TYPE_LENGTH (arg_type)));
+         switch (arg_type->code ())
            {
            case TYPE_CODE_INT:
              fprintf_unfiltered (gdb_stdlog, "int");
@@ -1747,7 +1726,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
              fprintf_unfiltered (gdb_stdlog, "struct");
              break;
            default:
-             fprintf_unfiltered (gdb_stdlog, "%3d", TYPE_CODE (arg_type));
+             fprintf_unfiltered (gdb_stdlog, "%3d", arg_type->code ());
              break;
            }
          fprintf_unfiltered (gdb_stdlog, " %s\n",
@@ -1762,18 +1741,17 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
 
   size = 0;
   onstack_size = 0;
-  i = 0;
 
-  if (struct_return)
+  if (return_method == return_method_struct)
     size = REGISTER_SIZE;
 
-  for (i = 0; i < nargs; i++)
+  for (int i = 0; i < nargs; i++)
     {
       struct argument_info *info = &arg_info[i];
       struct value *arg = args[i];
       struct type *arg_type = check_typedef (value_type (arg));
 
-      switch (TYPE_CODE (arg_type))
+      switch (arg_type->code ())
        {
        case TYPE_CODE_INT:
        case TYPE_CODE_BOOL:
@@ -1841,13 +1819,13 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
 
   /* Second Loop: Load arguments.  */
 
-  if (struct_return)
+  if (return_method == return_method_struct)
     {
       store_unsigned_integer (buf, REGISTER_SIZE, byte_order, struct_addr);
       regcache->cooked_write (ARG_1ST (gdbarch), buf);
     }
 
-  for (i = 0; i < nargs; i++)
+  for (int i = 0; i < nargs; i++)
     {
       struct argument_info *info = &arg_info[i];
 
@@ -1906,7 +1884,7 @@ xtensa_push_dummy_call (struct gdbarch *gdbarch,
 
   /* Set the return address of dummy frame to the dummy address.
      The return address for the current function (in A0) is
-     saved in the dummy frame, so we can savely overwrite A0 here.  */
+     saved in the dummy frame, so we can safely overwrite A0 here.  */
 
   if (gdbarch_tdep (gdbarch)->call_abi != CallAbiCall0Only)
     {
@@ -2022,7 +2000,7 @@ call0_ret (CORE_ADDR start_pc, CORE_ADDR finish_pc)
   for (ia = start_pc, bt = ia; ia < finish_pc ; ia += ilen)
     {
       if (ia + xtensa_isa_maxlength (isa) > bt)
-        {
+       {
          ba = ia;
          bt = (ba + XTENSA_ISA_BSZ) < finish_pc
            ? ba + XTENSA_ISA_BSZ : finish_pc;
@@ -2185,7 +2163,7 @@ call0_classify_opcode (xtensa_isa isa, xtensa_opcode opc)
    be within a bundle.  Updates the destination register tracking info
    accordingly.  The pc is needed only for pc-relative load instructions
    (eg. l32r).  The SP register number is needed to identify stores to
-   the stack frame.  Returns 0, if analysis was succesfull, non-zero
+   the stack frame.  Returns 0, if analysis was successful, non-zero
    otherwise.  */
 
 static int
@@ -2208,12 +2186,12 @@ call0_track_op (struct gdbarch *gdbarch, xtensa_c0reg_t dst[], xtensa_c0reg_t sr
       /* 3 operands: dst, src1, src2.  */
       gdb_assert (nods == 3); 
       if      (src[odv[1]].fr_reg == C0_CONST)
-        {
+       {
          dst[odv[0]].fr_reg = src[odv[2]].fr_reg;
          dst[odv[0]].fr_ofs = src[odv[2]].fr_ofs + src[odv[1]].fr_ofs;
        }
       else if (src[odv[2]].fr_reg == C0_CONST)
-        {
+       {
          dst[odv[0]].fr_reg = src[odv[1]].fr_reg;
          dst[odv[0]].fr_ofs = src[odv[1]].fr_ofs + src[odv[2]].fr_ofs;
        }
@@ -2241,12 +2219,12 @@ call0_track_op (struct gdbarch *gdbarch, xtensa_c0reg_t dst[], xtensa_c0reg_t sr
          /* else fall through.  */
        }
       if      (src[odv[1]].fr_reg == C0_CONST)
-        {
+       {
          dst[odv[0]].fr_reg = src[odv[2]].fr_reg;
          dst[odv[0]].fr_ofs = src[odv[2]].fr_ofs & src[odv[1]].fr_ofs;
        }
       else if (src[odv[2]].fr_reg == C0_CONST)
-        {
+       {
          dst[odv[0]].fr_reg = src[odv[1]].fr_reg;
          dst[odv[0]].fr_ofs = src[odv[1]].fr_ofs & src[odv[2]].fr_ofs;
        }
@@ -2256,7 +2234,7 @@ call0_track_op (struct gdbarch *gdbarch, xtensa_c0reg_t dst[], xtensa_c0reg_t sr
       /* 3 operands: dst, src1, src2.  */
       gdb_assert (nods == 3);
       if      (src[odv[2]].fr_reg == C0_CONST)
-        {
+       {
          dst[odv[0]].fr_reg = src[odv[1]].fr_reg;
          dst[odv[0]].fr_ofs = src[odv[1]].fr_ofs - src[odv[2]].fr_ofs;
        }
@@ -2310,7 +2288,7 @@ call0_track_op (struct gdbarch *gdbarch, xtensa_c0reg_t dst[], xtensa_c0reg_t sr
          &&  src[odv[0]].fr_reg >= 0        /* Value is from a register.  */
          &&  src[odv[0]].fr_ofs == 0        /* Value hasn't been modified.  */
          &&  src[src[odv[0]].fr_reg].to_stk == C0_NOSTK) /* First time.  */
-        {
+       {
          /* ISA encoding guarantees alignment.  But, check it anyway.  */
          gdb_assert ((odv[2] & 3) == 0);
          dst[src[odv[0]].fr_reg].to_stk = src[odv[1]].fr_ofs + odv[2];
@@ -2401,7 +2379,7 @@ call0_analyze_prologue (struct gdbarch *gdbarch,
     body_pc = prologue_sal.end;
 
   /* If we are going to analyze the prologue in general without knowing about
-     the current PC, make the best assumtion for the end of the prologue.  */
+     the current PC, make the best assumption for the end of the prologue.  */
   if (pc == 0)
     {
       find_pc_partial_function (start, 0, NULL, &end_pc);
@@ -2421,11 +2399,11 @@ call0_analyze_prologue (struct gdbarch *gdbarch,
   for (ia = start, bt = ia; ia < body_pc ; ia += ilen)
     {
       /* (Re)fill instruction buffer from memory if necessary, but do not
-         read memory beyond PC to be sure we stay within text section
+        read memory beyond PC to be sure we stay within text section
         (this protection only works if a non-zero pc is supplied).  */
 
       if (ia + xtensa_isa_maxlength (isa) > bt)
-        {
+       {
          ba = ia;
          bt = (ba + XTENSA_ISA_BSZ) < body_pc ? ba + XTENSA_ISA_BSZ : body_pc;
          if (target_read_memory (ba, ibuf, bt - ba) != 0 )
@@ -2455,14 +2433,14 @@ call0_analyze_prologue (struct gdbarch *gdbarch,
        }
 
       /* Analyze a bundle or a single instruction, using a snapshot of 
-         the register tracking info as input for the entire bundle so that
+        the register tracking info as input for the entire bundle so that
         register changes do not take effect within this bundle.  */
 
       for (j = 0; j < nregs; ++j)
        rtmp[j] = cache->c0.c0_rt[j];
 
       for (is = 0; is < islots; ++is)
-        {
+       {
          /* Decode a slot and classify the opcode.  */
 
          fail = xtensa_format_get_slot (isa, ifmt, is, ins, slot);
@@ -2598,7 +2576,7 @@ call0_frame_cache (struct frame_info *this_frame,
   if (body_pc <= pc)
     {
       /* Prologue analysis was successful up to the PC.
-         It includes the cases when PC == START_PC.  */
+        It includes the cases when PC == START_PC.  */
       c0_hasfp = cache->c0.c0_rt[C0_FP].fr_reg == C0_SP;
       /* c0_hasfp == true means there is a frame pointer because
         we analyzed the prologue and found that cache->c0.c0_rt[C0_FP]
@@ -2804,7 +2782,7 @@ execute_code (struct gdbarch *gdbarch, CORE_ADDR current_pc, CORE_ADDR wb)
   while (insn_num++ < XTENSA_MAX_WINDOW_INTERRUPT_HANDLER_LEN)
     {
       if (ia + xtensa_isa_maxlength (isa) > bt)
-        {
+       {
          ba = ia;
          bt = (ba + XTENSA_ISA_BSZ);
          if (target_read_memory (ba, ibuf, bt - ba) != 0)
@@ -3266,8 +3244,9 @@ xtensa_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
   error (_("xtensa_dump_tdep(): not implemented"));
 }
 
+void _initialize_xtensa_tdep ();
 void
-_initialize_xtensa_tdep (void)
+_initialize_xtensa_tdep ()
 {
   gdbarch_register (bfd_arch_xtensa, xtensa_gdbarch_init, xtensa_dump_tdep);
   xtensa_init_reggroups ();
This page took 0.031501 seconds and 4 git commands to generate.