Home | History | Annotate | Line # | Download | only in gdb
xstormy16-tdep.c revision 1.10
      1   1.1  christos /* Target-dependent code for the Sanyo Xstormy16a (LC590000) processor.
      2   1.1  christos 
      3  1.10  christos    Copyright (C) 2001-2023 Free Software Foundation, Inc.
      4   1.1  christos 
      5   1.1  christos    This file is part of GDB.
      6   1.1  christos 
      7   1.1  christos    This program is free software; you can redistribute it and/or modify
      8   1.1  christos    it under the terms of the GNU General Public License as published by
      9   1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10   1.1  christos    (at your option) any later version.
     11   1.1  christos 
     12   1.1  christos    This program is distributed in the hope that it will be useful,
     13   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15   1.1  christos    GNU General Public License for more details.
     16   1.1  christos 
     17   1.1  christos    You should have received a copy of the GNU General Public License
     18   1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19   1.1  christos 
     20   1.1  christos #include "defs.h"
     21   1.1  christos #include "frame.h"
     22   1.1  christos #include "frame-base.h"
     23   1.1  christos #include "frame-unwind.h"
     24   1.9  christos #include "dwarf2/frame.h"
     25   1.1  christos #include "symtab.h"
     26   1.1  christos #include "gdbtypes.h"
     27   1.1  christos #include "gdbcmd.h"
     28   1.1  christos #include "gdbcore.h"
     29   1.1  christos #include "value.h"
     30   1.1  christos #include "dis-asm.h"
     31   1.1  christos #include "inferior.h"
     32   1.1  christos #include "arch-utils.h"
     33   1.1  christos #include "regcache.h"
     34   1.1  christos #include "osabi.h"
     35   1.1  christos #include "objfiles.h"
     36   1.9  christos #include "gdbsupport/byte-vector.h"
     37   1.1  christos 
     38   1.1  christos enum gdb_regnum
     39   1.1  christos {
     40   1.1  christos   /* Xstormy16 has 16 general purpose registers (R0-R15) plus PC.
     41   1.1  christos      Functions will return their values in register R2-R7 as they fit.
     42   1.1  christos      Otherwise a hidden pointer to an big enough area is given as argument
     43   1.1  christos      to the function in r2.  Further arguments are beginning in r3 then.
     44   1.1  christos      R13 is used as frame pointer when GCC compiles w/o optimization
     45   1.1  christos      R14 is used as "PSW", displaying the CPU status.
     46   1.9  christos      R15 is used implicitly as stack pointer.  */
     47   1.1  christos   E_R0_REGNUM,
     48   1.1  christos   E_R1_REGNUM,
     49   1.1  christos   E_R2_REGNUM, E_1ST_ARG_REGNUM = E_R2_REGNUM, E_PTR_RET_REGNUM = E_R2_REGNUM,
     50   1.1  christos   E_R3_REGNUM,
     51   1.1  christos   E_R4_REGNUM,
     52   1.1  christos   E_R5_REGNUM,
     53   1.1  christos   E_R6_REGNUM,
     54   1.1  christos   E_R7_REGNUM, E_LST_ARG_REGNUM = E_R7_REGNUM,
     55   1.1  christos   E_R8_REGNUM,
     56   1.1  christos   E_R9_REGNUM,
     57   1.1  christos   E_R10_REGNUM,
     58   1.1  christos   E_R11_REGNUM,
     59   1.1  christos   E_R12_REGNUM,
     60   1.1  christos   E_R13_REGNUM, E_FP_REGNUM = E_R13_REGNUM,
     61   1.1  christos   E_R14_REGNUM, E_PSW_REGNUM = E_R14_REGNUM,
     62   1.1  christos   E_R15_REGNUM, E_SP_REGNUM = E_R15_REGNUM,
     63   1.1  christos   E_PC_REGNUM,
     64   1.1  christos   E_NUM_REGS
     65   1.1  christos };
     66   1.1  christos 
     67   1.1  christos /* Use an invalid address value as 'not available' marker.  */
     68   1.1  christos enum { REG_UNAVAIL = (CORE_ADDR) -1 };
     69   1.1  christos 
     70   1.1  christos struct xstormy16_frame_cache
     71   1.1  christos {
     72   1.1  christos   /* Base address.  */
     73   1.1  christos   CORE_ADDR base;
     74   1.1  christos   CORE_ADDR pc;
     75   1.1  christos   LONGEST framesize;
     76   1.1  christos   int uses_fp;
     77   1.1  christos   CORE_ADDR saved_regs[E_NUM_REGS];
     78   1.1  christos   CORE_ADDR saved_sp;
     79   1.1  christos };
     80   1.1  christos 
     81   1.1  christos /* Size of instructions, registers, etc.  */
     82   1.1  christos enum
     83   1.1  christos {
     84   1.1  christos   xstormy16_inst_size = 2,
     85   1.1  christos   xstormy16_reg_size = 2,
     86   1.1  christos   xstormy16_pc_size = 4
     87   1.1  christos };
     88   1.1  christos 
     89   1.1  christos /* Size of return datatype which fits into the remaining return registers.  */
     90   1.1  christos #define E_MAX_RETTYPE_SIZE(regnum)	((E_LST_ARG_REGNUM - (regnum) + 1) \
     91   1.1  christos 					* xstormy16_reg_size)
     92   1.1  christos 
     93   1.1  christos /* Size of return datatype which fits into all return registers.  */
     94   1.1  christos enum
     95   1.1  christos {
     96   1.1  christos   E_MAX_RETTYPE_SIZE_IN_REGS = E_MAX_RETTYPE_SIZE (E_R2_REGNUM)
     97   1.1  christos };
     98   1.1  christos 
     99   1.1  christos /* Function: xstormy16_register_name
    100   1.1  christos    Returns the name of the standard Xstormy16 register N.  */
    101   1.1  christos 
    102   1.1  christos static const char *
    103   1.1  christos xstormy16_register_name (struct gdbarch *gdbarch, int regnum)
    104   1.1  christos {
    105   1.7  christos   static const char *register_names[] = {
    106   1.1  christos     "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
    107   1.1  christos     "r8", "r9", "r10", "r11", "r12", "r13",
    108   1.1  christos     "psw", "sp", "pc"
    109   1.1  christos   };
    110   1.1  christos 
    111  1.10  christos   gdb_static_assert (ARRAY_SIZE (register_names) == E_NUM_REGS);
    112  1.10  christos   return register_names[regnum];
    113   1.1  christos }
    114   1.1  christos 
    115   1.1  christos static struct type *
    116   1.1  christos xstormy16_register_type (struct gdbarch *gdbarch, int regnum)
    117   1.1  christos {
    118   1.1  christos   if (regnum == E_PC_REGNUM)
    119   1.1  christos     return builtin_type (gdbarch)->builtin_uint32;
    120   1.1  christos   else
    121   1.1  christos     return builtin_type (gdbarch)->builtin_uint16;
    122   1.1  christos }
    123   1.1  christos 
    124   1.1  christos /* Function: xstormy16_type_is_scalar
    125   1.1  christos    Makes the decision if a given type is a scalar types.  Scalar
    126   1.1  christos    types are returned in the registers r2-r7 as they fit.  */
    127   1.1  christos 
    128   1.1  christos static int
    129   1.1  christos xstormy16_type_is_scalar (struct type *t)
    130   1.1  christos {
    131   1.9  christos   return (t->code () != TYPE_CODE_STRUCT
    132   1.9  christos 	  && t->code () != TYPE_CODE_UNION
    133   1.9  christos 	  && t->code () != TYPE_CODE_ARRAY);
    134   1.1  christos }
    135   1.1  christos 
    136   1.1  christos /* Function: xstormy16_use_struct_convention
    137   1.1  christos    Returns non-zero if the given struct type will be returned using
    138   1.1  christos    a special convention, rather than the normal function return method.
    139   1.1  christos    7sed in the contexts of the "return" command, and of
    140   1.1  christos    target function calls from the debugger.  */
    141   1.1  christos 
    142   1.1  christos static int
    143   1.1  christos xstormy16_use_struct_convention (struct type *type)
    144   1.1  christos {
    145   1.1  christos   return !xstormy16_type_is_scalar (type)
    146  1.10  christos 	 || type->length () > E_MAX_RETTYPE_SIZE_IN_REGS;
    147   1.1  christos }
    148   1.1  christos 
    149   1.1  christos /* Function: xstormy16_extract_return_value
    150   1.1  christos    Find a function's return value in the appropriate registers (in
    151   1.1  christos    regbuf), and copy it into valbuf.  */
    152   1.1  christos 
    153   1.1  christos static void
    154   1.1  christos xstormy16_extract_return_value (struct type *type, struct regcache *regcache,
    155   1.1  christos 				gdb_byte *valbuf)
    156   1.1  christos {
    157  1.10  christos   int len = type->length ();
    158   1.1  christos   int i, regnum = E_1ST_ARG_REGNUM;
    159   1.1  christos 
    160   1.1  christos   for (i = 0; i < len; i += xstormy16_reg_size)
    161   1.8  christos     regcache->raw_read (regnum++, valbuf + i);
    162   1.1  christos }
    163   1.1  christos 
    164   1.1  christos /* Function: xstormy16_store_return_value
    165   1.1  christos    Copy the function return value from VALBUF into the
    166   1.1  christos    proper location for a function return.
    167   1.1  christos    Called only in the context of the "return" command.  */
    168   1.1  christos 
    169   1.1  christos static void
    170   1.1  christos xstormy16_store_return_value (struct type *type, struct regcache *regcache,
    171   1.1  christos 			      const gdb_byte *valbuf)
    172   1.1  christos {
    173  1.10  christos   if (type->length () == 1)
    174   1.1  christos     {
    175   1.1  christos       /* Add leading zeros to the value.  */
    176   1.1  christos       gdb_byte buf[xstormy16_reg_size];
    177   1.1  christos       memset (buf, 0, xstormy16_reg_size);
    178   1.1  christos       memcpy (buf, valbuf, 1);
    179   1.8  christos       regcache->raw_write (E_1ST_ARG_REGNUM, buf);
    180   1.1  christos     }
    181   1.1  christos   else
    182   1.1  christos     {
    183  1.10  christos       int len = type->length ();
    184   1.1  christos       int i, regnum = E_1ST_ARG_REGNUM;
    185   1.1  christos 
    186   1.1  christos       for (i = 0; i < len; i += xstormy16_reg_size)
    187  1.10  christos 	regcache->raw_write (regnum++, valbuf + i);
    188   1.1  christos     }
    189   1.1  christos }
    190   1.1  christos 
    191   1.1  christos static enum return_value_convention
    192   1.1  christos xstormy16_return_value (struct gdbarch *gdbarch, struct value *function,
    193   1.1  christos 			struct type *type, struct regcache *regcache,
    194   1.1  christos 			gdb_byte *readbuf, const gdb_byte *writebuf)
    195   1.1  christos {
    196   1.1  christos   if (xstormy16_use_struct_convention (type))
    197   1.1  christos     return RETURN_VALUE_STRUCT_CONVENTION;
    198   1.1  christos   if (writebuf)
    199   1.1  christos     xstormy16_store_return_value (type, regcache, writebuf);
    200   1.1  christos   else if (readbuf)
    201   1.1  christos     xstormy16_extract_return_value (type, regcache, readbuf);
    202   1.1  christos   return RETURN_VALUE_REGISTER_CONVENTION;
    203   1.1  christos }
    204   1.1  christos 
    205   1.1  christos static CORE_ADDR
    206   1.1  christos xstormy16_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
    207   1.1  christos {
    208   1.1  christos   if (addr & 1)
    209   1.1  christos     ++addr;
    210   1.1  christos   return addr;
    211   1.1  christos }
    212   1.1  christos 
    213   1.1  christos /* Function: xstormy16_push_dummy_call
    214   1.1  christos    Setup the function arguments for GDB to call a function in the inferior.
    215   1.1  christos    Called only in the context of a target function call from the debugger.
    216   1.1  christos    Returns the value of the SP register after the args are pushed.  */
    217   1.1  christos 
    218   1.1  christos static CORE_ADDR
    219   1.1  christos xstormy16_push_dummy_call (struct gdbarch *gdbarch,
    220   1.1  christos 			   struct value *function,
    221   1.1  christos 			   struct regcache *regcache,
    222   1.1  christos 			   CORE_ADDR bp_addr, int nargs,
    223   1.1  christos 			   struct value **args,
    224   1.8  christos 			   CORE_ADDR sp,
    225   1.8  christos 			   function_call_return_method return_method,
    226   1.1  christos 			   CORE_ADDR struct_addr)
    227   1.1  christos {
    228   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    229   1.1  christos   CORE_ADDR stack_dest = sp;
    230   1.1  christos   int argreg = E_1ST_ARG_REGNUM;
    231   1.1  christos   int i, j;
    232   1.1  christos   int typelen, slacklen;
    233   1.1  christos   gdb_byte buf[xstormy16_pc_size];
    234   1.1  christos 
    235   1.8  christos   /* If returning a struct using target ABI method, then the struct return
    236   1.8  christos      address will consume one argument-passing register.  */
    237   1.8  christos   if (return_method == return_method_struct)
    238   1.1  christos     {
    239   1.1  christos       regcache_cooked_write_unsigned (regcache, E_PTR_RET_REGNUM, struct_addr);
    240   1.1  christos       argreg++;
    241   1.1  christos     }
    242   1.1  christos 
    243   1.1  christos   /* Arguments are passed in R2-R7 as they fit.  If an argument doesn't
    244   1.1  christos      fit in the remaining registers we're switching over to the stack.
    245   1.1  christos      No argument is put on stack partially and as soon as we switched
    246   1.1  christos      over to stack no further argument is put in a register even if it
    247   1.1  christos      would fit in the remaining unused registers.  */
    248   1.1  christos   for (i = 0; i < nargs && argreg <= E_LST_ARG_REGNUM; i++)
    249   1.1  christos     {
    250  1.10  christos       typelen = value_enclosing_type (args[i])->length ();
    251   1.1  christos       if (typelen > E_MAX_RETTYPE_SIZE (argreg))
    252   1.1  christos 	break;
    253   1.1  christos 
    254   1.1  christos       /* Put argument into registers wordwise.  */
    255  1.10  christos       const gdb_byte *val = value_contents (args[i]).data ();
    256   1.1  christos       for (j = 0; j < typelen; j += xstormy16_reg_size)
    257   1.1  christos 	{
    258   1.1  christos 	  ULONGEST regval;
    259   1.1  christos 	  int size = (typelen - j == 1) ? 1 : xstormy16_reg_size;
    260   1.1  christos 
    261   1.1  christos 	  regval = extract_unsigned_integer (val + j, size, byte_order);
    262   1.1  christos 	  regcache_cooked_write_unsigned (regcache, argreg++, regval);
    263   1.1  christos 	}
    264   1.1  christos     }
    265   1.1  christos 
    266   1.1  christos   /* Align SP */
    267   1.1  christos   stack_dest = xstormy16_frame_align (gdbarch, stack_dest);
    268   1.1  christos 
    269   1.1  christos   /* Loop backwards through remaining arguments and push them on the stack,
    270   1.1  christos      wordaligned.  */
    271   1.1  christos   for (j = nargs - 1; j >= i; j--)
    272   1.1  christos     {
    273  1.10  christos       const gdb_byte *bytes = value_contents (args[j]).data ();
    274   1.1  christos 
    275  1.10  christos       typelen = value_enclosing_type (args[j])->length ();
    276   1.1  christos       slacklen = typelen & 1;
    277   1.8  christos       gdb::byte_vector val (typelen + slacklen);
    278   1.8  christos       memcpy (val.data (), bytes, typelen);
    279   1.8  christos       memset (val.data () + typelen, 0, slacklen);
    280   1.1  christos 
    281   1.1  christos       /* Now write this data to the stack.  The stack grows upwards.  */
    282   1.8  christos       write_memory (stack_dest, val.data (), typelen + slacklen);
    283   1.1  christos       stack_dest += typelen + slacklen;
    284   1.1  christos     }
    285   1.1  christos 
    286   1.1  christos   store_unsigned_integer (buf, xstormy16_pc_size, byte_order, bp_addr);
    287   1.1  christos   write_memory (stack_dest, buf, xstormy16_pc_size);
    288   1.1  christos   stack_dest += xstormy16_pc_size;
    289   1.1  christos 
    290   1.1  christos   /* Update stack pointer.  */
    291   1.1  christos   regcache_cooked_write_unsigned (regcache, E_SP_REGNUM, stack_dest);
    292   1.1  christos 
    293   1.1  christos   /* Return the new stack pointer minus the return address slot since
    294   1.1  christos      that's what DWARF2/GCC uses as the frame's CFA.  */
    295   1.1  christos   return stack_dest - xstormy16_pc_size;
    296   1.1  christos }
    297   1.1  christos 
    298   1.1  christos /* Function: xstormy16_scan_prologue
    299   1.1  christos    Decode the instructions within the given address range.
    300   1.1  christos    Decide when we must have reached the end of the function prologue.
    301   1.1  christos    If a frame_info pointer is provided, fill in its saved_regs etc.
    302   1.1  christos 
    303   1.1  christos    Returns the address of the first instruction after the prologue.  */
    304   1.1  christos 
    305   1.1  christos static CORE_ADDR
    306   1.1  christos xstormy16_analyze_prologue (struct gdbarch *gdbarch,
    307   1.1  christos 			    CORE_ADDR start_addr, CORE_ADDR end_addr,
    308   1.1  christos 			    struct xstormy16_frame_cache *cache,
    309  1.10  christos 			    frame_info_ptr this_frame)
    310   1.1  christos {
    311   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    312   1.1  christos   CORE_ADDR next_addr;
    313   1.1  christos   ULONGEST inst, inst2;
    314   1.1  christos   LONGEST offset;
    315   1.1  christos   int regnum;
    316   1.1  christos 
    317   1.1  christos   /* Initialize framesize with size of PC put on stack by CALLF inst.  */
    318   1.1  christos   cache->saved_regs[E_PC_REGNUM] = 0;
    319   1.1  christos   cache->framesize = xstormy16_pc_size;
    320   1.1  christos 
    321   1.1  christos   if (start_addr >= end_addr)
    322   1.1  christos     return end_addr;
    323   1.1  christos 
    324   1.1  christos   for (next_addr = start_addr;
    325   1.1  christos        next_addr < end_addr; next_addr += xstormy16_inst_size)
    326   1.1  christos     {
    327   1.1  christos       inst = read_memory_unsigned_integer (next_addr,
    328   1.1  christos 					   xstormy16_inst_size, byte_order);
    329   1.1  christos       inst2 = read_memory_unsigned_integer (next_addr + xstormy16_inst_size,
    330   1.1  christos 					    xstormy16_inst_size, byte_order);
    331   1.1  christos 
    332   1.1  christos       if (inst >= 0x0082 && inst <= 0x008d)	/* push r2 .. push r13 */
    333   1.1  christos 	{
    334   1.1  christos 	  regnum = inst & 0x000f;
    335   1.1  christos 	  cache->saved_regs[regnum] = cache->framesize;
    336   1.1  christos 	  cache->framesize += xstormy16_reg_size;
    337   1.1  christos 	}
    338   1.1  christos 
    339   1.1  christos       /* Optional stack allocation for args and local vars <= 4 byte.  */
    340   1.1  christos       else if (inst == 0x301f || inst == 0x303f)       /* inc r15, #0x1/#0x3 */
    341   1.1  christos 	{
    342   1.1  christos 	  cache->framesize += ((inst & 0x0030) >> 4) + 1;
    343   1.1  christos 	}
    344   1.1  christos 
    345   1.1  christos       /* optional stack allocation for args and local vars > 4 && < 16 byte */
    346   1.1  christos       else if ((inst & 0xff0f) == 0x510f)	/* 51Hf   add r15, #0xH */
    347   1.1  christos 	{
    348   1.1  christos 	  cache->framesize += (inst & 0x00f0) >> 4;
    349   1.1  christos 	}
    350   1.1  christos 
    351   1.1  christos       /* Optional stack allocation for args and local vars >= 16 byte.  */
    352   1.1  christos       else if (inst == 0x314f && inst2 >= 0x0010) /* 314f HHHH add r15, #0xH */
    353   1.1  christos 	{
    354   1.1  christos 	  cache->framesize += inst2;
    355   1.1  christos 	  next_addr += xstormy16_inst_size;
    356   1.1  christos 	}
    357   1.1  christos 
    358   1.1  christos       else if (inst == 0x46fd)	/* mov r13, r15 */
    359   1.1  christos 	{
    360   1.1  christos 	  cache->uses_fp = 1;
    361   1.1  christos 	}
    362   1.1  christos 
    363   1.1  christos       /* optional copying of args in r2-r7 to r10-r13.  */
    364   1.1  christos       /* Probably only in optimized case but legal action for prologue.  */
    365   1.1  christos       else if ((inst & 0xff00) == 0x4600	/* 46SD   mov rD, rS */
    366   1.1  christos 	       && (inst & 0x00f0) >= 0x0020 && (inst & 0x00f0) <= 0x0070
    367   1.3  christos 	       && (inst & 0x000f) >= 0x000a && (inst & 0x000f) <= 0x000d)
    368   1.1  christos 	;
    369   1.1  christos 
    370   1.1  christos       /* Optional copying of args in r2-r7 to stack.  */
    371   1.1  christos       /* 72DS HHHH   mov.b (rD, 0xHHHH), r(S-8)
    372   1.1  christos 	 (bit3 always 1, bit2-0 = reg) */
    373   1.1  christos       /* 73DS HHHH   mov.w (rD, 0xHHHH), r(S-8) */
    374   1.1  christos       else if ((inst & 0xfed8) == 0x72d8 && (inst & 0x0007) >= 2)
    375   1.1  christos 	{
    376   1.1  christos 	  regnum = inst & 0x0007;
    377   1.1  christos 	  /* Only 12 of 16 bits of the argument are used for the
    378   1.1  christos 	     signed offset.  */
    379   1.1  christos 	  offset = (LONGEST) (inst2 & 0x0fff);
    380   1.1  christos 	  if (offset & 0x0800)
    381   1.1  christos 	    offset -= 0x1000;
    382   1.1  christos 
    383   1.1  christos 	  cache->saved_regs[regnum] = cache->framesize + offset;
    384   1.1  christos 	  next_addr += xstormy16_inst_size;
    385   1.1  christos 	}
    386   1.1  christos 
    387   1.1  christos       else			/* Not a prologue instruction.  */
    388   1.1  christos 	break;
    389   1.1  christos     }
    390   1.1  christos 
    391   1.1  christos   return next_addr;
    392   1.1  christos }
    393   1.1  christos 
    394   1.1  christos /* Function: xstormy16_skip_prologue
    395   1.1  christos    If the input address is in a function prologue,
    396   1.1  christos    returns the address of the end of the prologue;
    397   1.1  christos    else returns the input address.
    398   1.1  christos 
    399   1.1  christos    Note: the input address is likely to be the function start,
    400   1.1  christos    since this function is mainly used for advancing a breakpoint
    401   1.1  christos    to the first line, or stepping to the first line when we have
    402   1.1  christos    stepped into a function call.  */
    403   1.1  christos 
    404   1.1  christos static CORE_ADDR
    405   1.1  christos xstormy16_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
    406   1.1  christos {
    407   1.1  christos   CORE_ADDR func_addr = 0, func_end = 0;
    408   1.1  christos   const char *func_name;
    409   1.1  christos 
    410   1.1  christos   if (find_pc_partial_function (pc, &func_name, &func_addr, &func_end))
    411   1.1  christos     {
    412   1.1  christos       struct symtab_and_line sal;
    413   1.1  christos       struct symbol *sym;
    414   1.1  christos       struct xstormy16_frame_cache cache;
    415   1.1  christos       CORE_ADDR plg_end;
    416   1.1  christos 
    417   1.1  christos       memset (&cache, 0, sizeof cache);
    418   1.1  christos 
    419   1.1  christos       /* Don't trust line number debug info in frameless functions.  */
    420   1.1  christos       plg_end = xstormy16_analyze_prologue (gdbarch, func_addr, func_end,
    421   1.1  christos 					    &cache, NULL);
    422   1.1  christos       if (!cache.uses_fp)
    423  1.10  christos 	return plg_end;
    424   1.1  christos 
    425   1.1  christos       /* Found a function.  */
    426   1.6  christos       sym = lookup_symbol (func_name, NULL, VAR_DOMAIN, NULL).symbol;
    427   1.1  christos       /* Don't use line number debug info for assembly source files.  */
    428   1.9  christos       if (sym && sym->language () != language_asm)
    429   1.1  christos 	{
    430   1.1  christos 	  sal = find_pc_line (func_addr, 0);
    431   1.1  christos 	  if (sal.end && sal.end < func_end)
    432   1.1  christos 	    {
    433   1.1  christos 	      /* Found a line number, use it as end of prologue.  */
    434   1.1  christos 	      return sal.end;
    435   1.1  christos 	    }
    436   1.1  christos 	}
    437   1.1  christos       /* No useable line symbol.  Use result of prologue parsing method.  */
    438   1.1  christos       return plg_end;
    439   1.1  christos     }
    440   1.1  christos 
    441   1.1  christos   /* No function symbol -- just return the PC.  */
    442   1.1  christos 
    443   1.1  christos   return (CORE_ADDR) pc;
    444   1.1  christos }
    445   1.1  christos 
    446   1.5  christos /* Implement the stack_frame_destroyed_p gdbarch method.
    447   1.5  christos 
    448   1.5  christos    The epilogue is defined here as the area at the end of a function,
    449   1.1  christos    either on the `ret' instruction itself or after an instruction which
    450   1.1  christos    destroys the function's stack frame.  */
    451   1.5  christos 
    452   1.1  christos static int
    453   1.5  christos xstormy16_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
    454   1.1  christos {
    455   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    456   1.1  christos   CORE_ADDR func_addr = 0, func_end = 0;
    457   1.1  christos 
    458   1.1  christos   if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
    459   1.1  christos     {
    460   1.1  christos       ULONGEST inst, inst2;
    461   1.1  christos       CORE_ADDR addr = func_end - xstormy16_inst_size;
    462   1.1  christos 
    463   1.1  christos       /* The Xstormy16 epilogue is max. 14 bytes long.  */
    464   1.1  christos       if (pc < func_end - 7 * xstormy16_inst_size)
    465   1.1  christos 	return 0;
    466   1.1  christos 
    467   1.1  christos       /* Check if we're on a `ret' instruction.  Otherwise it's
    468  1.10  christos 	 too dangerous to proceed.  */
    469   1.1  christos       inst = read_memory_unsigned_integer (addr,
    470   1.1  christos 					   xstormy16_inst_size, byte_order);
    471   1.1  christos       if (inst != 0x0003)
    472   1.1  christos 	return 0;
    473   1.1  christos 
    474   1.1  christos       while ((addr -= xstormy16_inst_size) >= func_addr)
    475   1.1  christos 	{
    476   1.1  christos 	  inst = read_memory_unsigned_integer (addr,
    477   1.1  christos 					       xstormy16_inst_size,
    478   1.1  christos 					       byte_order);
    479   1.1  christos 	  if (inst >= 0x009a && inst <= 0x009d)	/* pop r10...r13 */
    480   1.1  christos 	    continue;
    481   1.1  christos 	  if (inst == 0x305f || inst == 0x307f)	/* dec r15, #0x1/#0x3 */
    482   1.1  christos 	    break;
    483   1.1  christos 	  inst2 = read_memory_unsigned_integer (addr - xstormy16_inst_size,
    484   1.1  christos 						xstormy16_inst_size,
    485   1.1  christos 						byte_order);
    486   1.1  christos 	  if (inst2 == 0x314f && inst >= 0x8000)      /* add r15, neg. value */
    487   1.1  christos 	    {
    488   1.1  christos 	      addr -= xstormy16_inst_size;
    489   1.1  christos 	      break;
    490   1.1  christos 	    }
    491   1.1  christos 	  return 0;
    492   1.1  christos 	}
    493   1.1  christos       if (pc > addr)
    494   1.1  christos 	return 1;
    495   1.1  christos     }
    496   1.1  christos   return 0;
    497   1.1  christos }
    498   1.1  christos 
    499   1.7  christos constexpr gdb_byte xstormy16_break_insn[] = { 0x06, 0x0 };
    500   1.7  christos 
    501   1.7  christos typedef BP_MANIPULATION (xstormy16_break_insn) xstormy16_breakpoint;
    502   1.1  christos 
    503   1.1  christos /* Given a pointer to a jump table entry, return the address
    504   1.1  christos    of the function it jumps to.  Return 0 if not found.  */
    505   1.1  christos static CORE_ADDR
    506   1.1  christos xstormy16_resolve_jmp_table_entry (struct gdbarch *gdbarch, CORE_ADDR faddr)
    507   1.1  christos {
    508   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    509   1.1  christos   struct obj_section *faddr_sect = find_pc_section (faddr);
    510   1.1  christos 
    511   1.1  christos   if (faddr_sect)
    512   1.1  christos     {
    513   1.1  christos       LONGEST inst, inst2, addr;
    514   1.1  christos       gdb_byte buf[2 * xstormy16_inst_size];
    515   1.1  christos 
    516   1.1  christos       /* Return faddr if it's not pointing into the jump table.  */
    517   1.1  christos       if (strcmp (faddr_sect->the_bfd_section->name, ".plt"))
    518   1.1  christos 	return faddr;
    519   1.1  christos 
    520   1.1  christos       if (!target_read_memory (faddr, buf, sizeof buf))
    521   1.1  christos 	{
    522   1.1  christos 	  inst = extract_unsigned_integer (buf,
    523   1.1  christos 					   xstormy16_inst_size, byte_order);
    524   1.1  christos 	  inst2 = extract_unsigned_integer (buf + xstormy16_inst_size,
    525   1.1  christos 					    xstormy16_inst_size, byte_order);
    526   1.1  christos 	  addr = inst2 << 8 | (inst & 0xff);
    527   1.1  christos 	  return addr;
    528   1.1  christos 	}
    529   1.1  christos     }
    530   1.1  christos   return 0;
    531   1.1  christos }
    532   1.1  christos 
    533   1.1  christos /* Given a function's address, attempt to find (and return) the
    534   1.1  christos    address of the corresponding jump table entry.  Return 0 if
    535   1.1  christos    not found.  */
    536   1.1  christos static CORE_ADDR
    537   1.1  christos xstormy16_find_jmp_table_entry (struct gdbarch *gdbarch, CORE_ADDR faddr)
    538   1.1  christos {
    539   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    540   1.1  christos   struct obj_section *faddr_sect = find_pc_section (faddr);
    541   1.1  christos 
    542   1.1  christos   if (faddr_sect)
    543   1.1  christos     {
    544   1.1  christos       struct obj_section *osect;
    545   1.1  christos 
    546   1.1  christos       /* Return faddr if it's already a pointer to a jump table entry.  */
    547   1.1  christos       if (!strcmp (faddr_sect->the_bfd_section->name, ".plt"))
    548   1.1  christos 	return faddr;
    549   1.1  christos 
    550   1.1  christos       ALL_OBJFILE_OSECTIONS (faddr_sect->objfile, osect)
    551   1.1  christos       {
    552   1.1  christos 	if (!strcmp (osect->the_bfd_section->name, ".plt"))
    553   1.1  christos 	  break;
    554   1.1  christos       }
    555   1.1  christos 
    556   1.1  christos       if (osect < faddr_sect->objfile->sections_end)
    557   1.1  christos 	{
    558   1.1  christos 	  CORE_ADDR addr, endaddr;
    559   1.1  christos 
    560  1.10  christos 	  addr = osect->addr ();
    561  1.10  christos 	  endaddr = osect->endaddr ();
    562   1.1  christos 
    563   1.1  christos 	  for (; addr < endaddr; addr += 2 * xstormy16_inst_size)
    564   1.1  christos 	    {
    565   1.1  christos 	      LONGEST inst, inst2, faddr2;
    566   1.1  christos 	      gdb_byte buf[2 * xstormy16_inst_size];
    567   1.1  christos 
    568   1.1  christos 	      if (target_read_memory (addr, buf, sizeof buf))
    569   1.1  christos 		return 0;
    570   1.1  christos 	      inst = extract_unsigned_integer (buf,
    571   1.1  christos 					       xstormy16_inst_size,
    572   1.1  christos 					       byte_order);
    573   1.1  christos 	      inst2 = extract_unsigned_integer (buf + xstormy16_inst_size,
    574  1.10  christos 						xstormy16_inst_size,
    575   1.1  christos 						byte_order);
    576   1.1  christos 	      faddr2 = inst2 << 8 | (inst & 0xff);
    577   1.1  christos 	      if (faddr == faddr2)
    578   1.1  christos 		return addr;
    579   1.1  christos 	    }
    580   1.1  christos 	}
    581   1.1  christos     }
    582   1.1  christos   return 0;
    583   1.1  christos }
    584   1.1  christos 
    585   1.1  christos static CORE_ADDR
    586  1.10  christos xstormy16_skip_trampoline_code (frame_info_ptr frame, CORE_ADDR pc)
    587   1.1  christos {
    588   1.1  christos   struct gdbarch *gdbarch = get_frame_arch (frame);
    589   1.1  christos   CORE_ADDR tmp = xstormy16_resolve_jmp_table_entry (gdbarch, pc);
    590   1.1  christos 
    591   1.1  christos   if (tmp && tmp != pc)
    592   1.1  christos     return tmp;
    593   1.1  christos   return 0;
    594   1.1  christos }
    595   1.1  christos 
    596   1.1  christos /* Function pointers are 16 bit.  The address space is 24 bit, using
    597   1.1  christos    32 bit addresses.  Pointers to functions on the XStormy16 are implemented
    598   1.1  christos    by using 16 bit pointers, which are either direct pointers in case the
    599   1.1  christos    function begins below 0x10000, or indirect pointers into a jump table.
    600   1.1  christos    The next two functions convert 16 bit pointers into 24 (32) bit addresses
    601   1.1  christos    and vice versa.  */
    602   1.1  christos 
    603   1.1  christos static CORE_ADDR
    604   1.1  christos xstormy16_pointer_to_address (struct gdbarch *gdbarch,
    605   1.1  christos 			      struct type *type, const gdb_byte *buf)
    606   1.1  christos {
    607   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    608  1.10  christos   enum type_code target = type->target_type ()->code ();
    609   1.1  christos   CORE_ADDR addr
    610  1.10  christos     = extract_unsigned_integer (buf, type->length (), byte_order);
    611   1.1  christos 
    612   1.1  christos   if (target == TYPE_CODE_FUNC || target == TYPE_CODE_METHOD)
    613   1.1  christos     {
    614   1.1  christos       CORE_ADDR addr2 = xstormy16_resolve_jmp_table_entry (gdbarch, addr);
    615   1.1  christos       if (addr2)
    616   1.1  christos 	addr = addr2;
    617   1.1  christos     }
    618   1.1  christos 
    619   1.1  christos   return addr;
    620   1.1  christos }
    621   1.1  christos 
    622   1.1  christos static void
    623   1.1  christos xstormy16_address_to_pointer (struct gdbarch *gdbarch,
    624   1.1  christos 			      struct type *type, gdb_byte *buf, CORE_ADDR addr)
    625   1.1  christos {
    626   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    627  1.10  christos   enum type_code target = type->target_type ()->code ();
    628   1.1  christos 
    629   1.1  christos   if (target == TYPE_CODE_FUNC || target == TYPE_CODE_METHOD)
    630   1.1  christos     {
    631   1.1  christos       CORE_ADDR addr2 = xstormy16_find_jmp_table_entry (gdbarch, addr);
    632   1.1  christos       if (addr2)
    633   1.1  christos 	addr = addr2;
    634   1.1  christos     }
    635  1.10  christos   store_unsigned_integer (buf, type->length (), byte_order, addr);
    636   1.1  christos }
    637   1.1  christos 
    638   1.1  christos static struct xstormy16_frame_cache *
    639   1.1  christos xstormy16_alloc_frame_cache (void)
    640   1.1  christos {
    641   1.1  christos   struct xstormy16_frame_cache *cache;
    642   1.1  christos   int i;
    643   1.1  christos 
    644   1.1  christos   cache = FRAME_OBSTACK_ZALLOC (struct xstormy16_frame_cache);
    645   1.1  christos 
    646   1.1  christos   cache->base = 0;
    647   1.1  christos   cache->saved_sp = 0;
    648   1.1  christos   cache->pc = 0;
    649   1.1  christos   cache->uses_fp = 0;
    650   1.1  christos   cache->framesize = 0;
    651   1.1  christos   for (i = 0; i < E_NUM_REGS; ++i)
    652   1.1  christos     cache->saved_regs[i] = REG_UNAVAIL;
    653   1.1  christos 
    654   1.1  christos   return cache;
    655   1.1  christos }
    656   1.1  christos 
    657   1.1  christos static struct xstormy16_frame_cache *
    658  1.10  christos xstormy16_frame_cache (frame_info_ptr this_frame, void **this_cache)
    659   1.1  christos {
    660   1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
    661   1.1  christos   struct xstormy16_frame_cache *cache;
    662   1.1  christos   CORE_ADDR current_pc;
    663   1.1  christos   int i;
    664   1.1  christos 
    665   1.1  christos   if (*this_cache)
    666   1.6  christos     return (struct xstormy16_frame_cache *) *this_cache;
    667   1.1  christos 
    668   1.1  christos   cache = xstormy16_alloc_frame_cache ();
    669   1.1  christos   *this_cache = cache;
    670   1.1  christos 
    671   1.1  christos   cache->base = get_frame_register_unsigned (this_frame, E_FP_REGNUM);
    672   1.1  christos   if (cache->base == 0)
    673   1.1  christos     return cache;
    674   1.1  christos 
    675   1.1  christos   cache->pc = get_frame_func (this_frame);
    676   1.1  christos   current_pc = get_frame_pc (this_frame);
    677   1.1  christos   if (cache->pc)
    678   1.1  christos     xstormy16_analyze_prologue (gdbarch, cache->pc, current_pc,
    679   1.1  christos 				cache, this_frame);
    680   1.1  christos 
    681   1.1  christos   if (!cache->uses_fp)
    682   1.1  christos     cache->base = get_frame_register_unsigned (this_frame, E_SP_REGNUM);
    683   1.1  christos 
    684   1.1  christos   cache->saved_sp = cache->base - cache->framesize;
    685   1.1  christos 
    686   1.1  christos   for (i = 0; i < E_NUM_REGS; ++i)
    687   1.1  christos     if (cache->saved_regs[i] != REG_UNAVAIL)
    688   1.1  christos       cache->saved_regs[i] += cache->saved_sp;
    689   1.1  christos 
    690   1.1  christos   return cache;
    691   1.1  christos }
    692   1.1  christos 
    693   1.1  christos static struct value *
    694  1.10  christos xstormy16_frame_prev_register (frame_info_ptr this_frame,
    695   1.1  christos 			       void **this_cache, int regnum)
    696   1.1  christos {
    697   1.1  christos   struct xstormy16_frame_cache *cache = xstormy16_frame_cache (this_frame,
    698  1.10  christos 							       this_cache);
    699   1.1  christos   gdb_assert (regnum >= 0);
    700   1.1  christos 
    701   1.1  christos   if (regnum == E_SP_REGNUM && cache->saved_sp)
    702   1.1  christos     return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
    703   1.1  christos 
    704   1.1  christos   if (regnum < E_NUM_REGS && cache->saved_regs[regnum] != REG_UNAVAIL)
    705   1.1  christos     return frame_unwind_got_memory (this_frame, regnum,
    706   1.1  christos 				    cache->saved_regs[regnum]);
    707   1.1  christos 
    708   1.1  christos   return frame_unwind_got_register (this_frame, regnum, regnum);
    709   1.1  christos }
    710   1.1  christos 
    711   1.1  christos static void
    712  1.10  christos xstormy16_frame_this_id (frame_info_ptr this_frame, void **this_cache,
    713   1.1  christos 			 struct frame_id *this_id)
    714   1.1  christos {
    715   1.1  christos   struct xstormy16_frame_cache *cache = xstormy16_frame_cache (this_frame,
    716   1.1  christos 							       this_cache);
    717   1.1  christos 
    718   1.1  christos   /* This marks the outermost frame.  */
    719   1.1  christos   if (cache->base == 0)
    720   1.1  christos     return;
    721   1.1  christos 
    722   1.1  christos   *this_id = frame_id_build (cache->saved_sp, cache->pc);
    723   1.1  christos }
    724   1.1  christos 
    725   1.1  christos static CORE_ADDR
    726  1.10  christos xstormy16_frame_base_address (frame_info_ptr this_frame, void **this_cache)
    727   1.1  christos {
    728   1.1  christos   struct xstormy16_frame_cache *cache = xstormy16_frame_cache (this_frame,
    729   1.1  christos 							       this_cache);
    730   1.1  christos   return cache->base;
    731   1.1  christos }
    732   1.1  christos 
    733   1.1  christos static const struct frame_unwind xstormy16_frame_unwind = {
    734  1.10  christos   "xstormy16 prologue",
    735   1.1  christos   NORMAL_FRAME,
    736   1.1  christos   default_frame_unwind_stop_reason,
    737   1.1  christos   xstormy16_frame_this_id,
    738   1.1  christos   xstormy16_frame_prev_register,
    739   1.1  christos   NULL,
    740   1.1  christos   default_frame_sniffer
    741   1.1  christos };
    742   1.1  christos 
    743   1.1  christos static const struct frame_base xstormy16_frame_base = {
    744   1.1  christos   &xstormy16_frame_unwind,
    745   1.1  christos   xstormy16_frame_base_address,
    746   1.1  christos   xstormy16_frame_base_address,
    747   1.1  christos   xstormy16_frame_base_address
    748   1.1  christos };
    749   1.1  christos 
    750   1.1  christos /* Function: xstormy16_gdbarch_init
    751   1.1  christos    Initializer function for the xstormy16 gdbarch vector.
    752   1.1  christos    Called by gdbarch.  Sets up the gdbarch vector(s) for this target.  */
    753   1.1  christos 
    754   1.1  christos static struct gdbarch *
    755   1.1  christos xstormy16_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
    756   1.1  christos {
    757   1.1  christos   struct gdbarch *gdbarch;
    758   1.1  christos 
    759   1.1  christos   /* find a candidate among the list of pre-declared architectures.  */
    760   1.1  christos   arches = gdbarch_list_lookup_by_info (arches, &info);
    761   1.1  christos   if (arches != NULL)
    762   1.1  christos     return (arches->gdbarch);
    763   1.1  christos 
    764   1.1  christos   gdbarch = gdbarch_alloc (&info, NULL);
    765   1.1  christos 
    766   1.1  christos   /*
    767   1.1  christos    * Basic register fields and methods, datatype sizes and stuff.
    768   1.1  christos    */
    769   1.1  christos 
    770   1.1  christos   set_gdbarch_num_regs (gdbarch, E_NUM_REGS);
    771   1.1  christos   set_gdbarch_num_pseudo_regs (gdbarch, 0);
    772   1.1  christos   set_gdbarch_sp_regnum (gdbarch, E_SP_REGNUM);
    773   1.1  christos   set_gdbarch_pc_regnum (gdbarch, E_PC_REGNUM);
    774   1.1  christos   set_gdbarch_register_name (gdbarch, xstormy16_register_name);
    775   1.1  christos   set_gdbarch_register_type (gdbarch, xstormy16_register_type);
    776   1.1  christos 
    777   1.1  christos   set_gdbarch_char_signed (gdbarch, 0);
    778   1.1  christos   set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
    779   1.1  christos   set_gdbarch_int_bit (gdbarch, 2 * TARGET_CHAR_BIT);
    780   1.1  christos   set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
    781   1.1  christos   set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
    782   1.1  christos 
    783   1.7  christos   set_gdbarch_wchar_bit (gdbarch, 2 * TARGET_CHAR_BIT);
    784   1.7  christos   set_gdbarch_wchar_signed (gdbarch, 1);
    785   1.7  christos 
    786   1.1  christos   set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
    787   1.1  christos   set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
    788   1.1  christos   set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
    789   1.1  christos 
    790   1.1  christos   set_gdbarch_ptr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
    791   1.1  christos   set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
    792   1.1  christos   set_gdbarch_dwarf2_addr_size (gdbarch, 4);
    793   1.1  christos 
    794   1.1  christos   set_gdbarch_address_to_pointer (gdbarch, xstormy16_address_to_pointer);
    795   1.1  christos   set_gdbarch_pointer_to_address (gdbarch, xstormy16_pointer_to_address);
    796   1.1  christos 
    797   1.1  christos   /* Stack grows up.  */
    798   1.1  christos   set_gdbarch_inner_than (gdbarch, core_addr_greaterthan);
    799   1.1  christos 
    800   1.1  christos   /*
    801   1.1  christos    * Frame Info
    802   1.1  christos    */
    803   1.1  christos   set_gdbarch_frame_align (gdbarch, xstormy16_frame_align);
    804   1.1  christos   frame_base_set_default (gdbarch, &xstormy16_frame_base);
    805   1.1  christos 
    806   1.1  christos   set_gdbarch_skip_prologue (gdbarch, xstormy16_skip_prologue);
    807   1.5  christos   set_gdbarch_stack_frame_destroyed_p (gdbarch,
    808   1.5  christos 				       xstormy16_stack_frame_destroyed_p);
    809   1.1  christos 
    810   1.1  christos   /* These values and methods are used when gdb calls a target function.  */
    811   1.1  christos   set_gdbarch_push_dummy_call (gdbarch, xstormy16_push_dummy_call);
    812   1.7  christos   set_gdbarch_breakpoint_kind_from_pc (gdbarch,
    813   1.7  christos 				       xstormy16_breakpoint::kind_from_pc);
    814   1.7  christos   set_gdbarch_sw_breakpoint_from_kind (gdbarch,
    815   1.7  christos 				       xstormy16_breakpoint::bp_from_kind);
    816   1.1  christos   set_gdbarch_return_value (gdbarch, xstormy16_return_value);
    817   1.1  christos 
    818   1.1  christos   set_gdbarch_skip_trampoline_code (gdbarch, xstormy16_skip_trampoline_code);
    819   1.1  christos 
    820   1.1  christos   gdbarch_init_osabi (info, gdbarch);
    821   1.1  christos 
    822   1.1  christos   dwarf2_append_unwinders (gdbarch);
    823   1.1  christos   frame_unwind_append_unwinder (gdbarch, &xstormy16_frame_unwind);
    824   1.1  christos 
    825   1.1  christos   return gdbarch;
    826   1.1  christos }
    827   1.1  christos 
    828   1.1  christos /* Function: _initialize_xstormy16_tdep
    829   1.1  christos    Initializer function for the Sanyo Xstormy16a module.
    830   1.1  christos    Called by gdb at start-up.  */
    831   1.1  christos 
    832   1.9  christos void _initialize_xstormy16_tdep ();
    833   1.1  christos void
    834   1.9  christos _initialize_xstormy16_tdep ()
    835   1.1  christos {
    836  1.10  christos   gdbarch_register (bfd_arch_xstormy16, xstormy16_gdbarch_init);
    837   1.1  christos }
    838