Home | History | Annotate | Line # | Download | only in gdb
tic6x-tdep.c revision 1.1
      1  1.1  christos /* Target dependent code for GDB on TI C6x systems.
      2  1.1  christos 
      3  1.1  christos    Copyright (C) 2010-2014 Free Software Foundation, Inc.
      4  1.1  christos    Contributed by Andrew Jenner <andrew (at) codesourcery.com>
      5  1.1  christos    Contributed by Yao Qi <yao (at) codesourcery.com>
      6  1.1  christos 
      7  1.1  christos    This file is part of GDB.
      8  1.1  christos 
      9  1.1  christos    This program is free software; you can redistribute it and/or modify
     10  1.1  christos    it under the terms of the GNU General Public License as published by
     11  1.1  christos    the Free Software Foundation; either version 3 of the License, or
     12  1.1  christos    (at your option) any later version.
     13  1.1  christos 
     14  1.1  christos    This program is distributed in the hope that it will be useful,
     15  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     16  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17  1.1  christos    GNU General Public License for more details.
     18  1.1  christos 
     19  1.1  christos    You should have received a copy of the GNU General Public License
     20  1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     21  1.1  christos 
     22  1.1  christos #include "defs.h"
     23  1.1  christos #include "frame.h"
     24  1.1  christos #include "frame-unwind.h"
     25  1.1  christos #include "frame-base.h"
     26  1.1  christos #include "trad-frame.h"
     27  1.1  christos #include "dwarf2-frame.h"
     28  1.1  christos #include "symtab.h"
     29  1.1  christos #include "inferior.h"
     30  1.1  christos #include "gdbtypes.h"
     31  1.1  christos #include "gdbcore.h"
     32  1.1  christos #include "gdbcmd.h"
     33  1.1  christos #include "target.h"
     34  1.1  christos #include "dis-asm.h"
     35  1.1  christos #include "regcache.h"
     36  1.1  christos #include "value.h"
     37  1.1  christos #include "symfile.h"
     38  1.1  christos #include "arch-utils.h"
     39  1.1  christos #include "floatformat.h"
     40  1.1  christos #include "glibc-tdep.h"
     41  1.1  christos #include "infcall.h"
     42  1.1  christos #include "regset.h"
     43  1.1  christos #include "tramp-frame.h"
     44  1.1  christos #include "linux-tdep.h"
     45  1.1  christos #include "solib.h"
     46  1.1  christos #include "objfiles.h"
     47  1.1  christos #include "gdb_assert.h"
     48  1.1  christos #include "osabi.h"
     49  1.1  christos #include "tic6x-tdep.h"
     50  1.1  christos #include "language.h"
     51  1.1  christos #include "target-descriptions.h"
     52  1.1  christos 
     53  1.1  christos #include "features/tic6x-c64xp.c"
     54  1.1  christos #include "features/tic6x-c64x.c"
     55  1.1  christos #include "features/tic6x-c62x.c"
     56  1.1  christos 
     57  1.1  christos #define TIC6X_OPCODE_SIZE 4
     58  1.1  christos #define TIC6X_FETCH_PACKET_SIZE 32
     59  1.1  christos 
     60  1.1  christos #define INST_S_BIT(INST) ((INST >> 1) & 1)
     61  1.1  christos #define INST_X_BIT(INST) ((INST >> 12) & 1)
     62  1.1  christos 
     63  1.1  christos const gdb_byte tic6x_bkpt_illegal_opcode_be[] = { 0x56, 0x45, 0x43, 0x14 };
     64  1.1  christos const gdb_byte tic6x_bkpt_illegal_opcode_le[] = { 0x14, 0x43, 0x45, 0x56 };
     65  1.1  christos 
     66  1.1  christos struct tic6x_unwind_cache
     67  1.1  christos {
     68  1.1  christos   /* The frame's base, optionally used by the high-level debug info.  */
     69  1.1  christos   CORE_ADDR base;
     70  1.1  christos 
     71  1.1  christos   /* The previous frame's inner most stack address.  Used as this
     72  1.1  christos      frame ID's stack_addr.  */
     73  1.1  christos   CORE_ADDR cfa;
     74  1.1  christos 
     75  1.1  christos   /* The address of the first instruction in this function */
     76  1.1  christos   CORE_ADDR pc;
     77  1.1  christos 
     78  1.1  christos   /* Which register holds the return address for the frame.  */
     79  1.1  christos   int return_regnum;
     80  1.1  christos 
     81  1.1  christos   /* The offset of register saved on stack.  If register is not saved, the
     82  1.1  christos      corresponding element is -1.  */
     83  1.1  christos   CORE_ADDR reg_saved[TIC6X_NUM_CORE_REGS];
     84  1.1  christos };
     85  1.1  christos 
     86  1.1  christos 
     87  1.1  christos /* Name of TI C6x core registers.  */
     88  1.1  christos static const char *const tic6x_register_names[] =
     89  1.1  christos {
     90  1.1  christos   "A0",  "A1",  "A2",  "A3",  /*  0  1  2  3 */
     91  1.1  christos   "A4",  "A5",  "A6",  "A7",  /*  4  5  6  7 */
     92  1.1  christos   "A8",  "A9",  "A10", "A11", /*  8  9 10 11 */
     93  1.1  christos   "A12", "A13", "A14", "A15", /* 12 13 14 15 */
     94  1.1  christos   "B0",  "B1",  "B2",  "B3",  /* 16 17 18 19 */
     95  1.1  christos   "B4",  "B5",  "B6",  "B7",  /* 20 21 22 23 */
     96  1.1  christos   "B8",  "B9",  "B10", "B11", /* 24 25 26 27 */
     97  1.1  christos   "B12", "B13", "B14", "B15", /* 28 29 30 31 */
     98  1.1  christos   "CSR", "PC",                /* 32 33       */
     99  1.1  christos };
    100  1.1  christos 
    101  1.1  christos /* This array maps the arguments to the register number which passes argument
    102  1.1  christos    in function call according to C6000 ELF ABI.  */
    103  1.1  christos static const int arg_regs[] = { 4, 20, 6, 22, 8, 24, 10, 26, 12, 28 };
    104  1.1  christos 
    105  1.1  christos /* This is the implementation of gdbarch method register_name.  */
    106  1.1  christos 
    107  1.1  christos static const char *
    108  1.1  christos tic6x_register_name (struct gdbarch *gdbarch, int regno)
    109  1.1  christos {
    110  1.1  christos   if (regno < 0)
    111  1.1  christos     return NULL;
    112  1.1  christos 
    113  1.1  christos   if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
    114  1.1  christos     return tdesc_register_name (gdbarch, regno);
    115  1.1  christos   else if (regno >= ARRAY_SIZE (tic6x_register_names))
    116  1.1  christos     return "";
    117  1.1  christos   else
    118  1.1  christos     return tic6x_register_names[regno];
    119  1.1  christos }
    120  1.1  christos 
    121  1.1  christos /* This is the implementation of gdbarch method register_type.  */
    122  1.1  christos 
    123  1.1  christos static struct type *
    124  1.1  christos tic6x_register_type (struct gdbarch *gdbarch, int regno)
    125  1.1  christos {
    126  1.1  christos 
    127  1.1  christos   if (regno == TIC6X_PC_REGNUM)
    128  1.1  christos     return builtin_type (gdbarch)->builtin_func_ptr;
    129  1.1  christos   else
    130  1.1  christos     return builtin_type (gdbarch)->builtin_uint32;
    131  1.1  christos }
    132  1.1  christos 
    133  1.1  christos static void
    134  1.1  christos tic6x_setup_default (struct tic6x_unwind_cache *cache)
    135  1.1  christos {
    136  1.1  christos   int i;
    137  1.1  christos 
    138  1.1  christos   for (i = 0; i < TIC6X_NUM_CORE_REGS; i++)
    139  1.1  christos     cache->reg_saved[i] = -1;
    140  1.1  christos }
    141  1.1  christos 
    142  1.1  christos static unsigned long tic6x_fetch_instruction (struct gdbarch *, CORE_ADDR);
    143  1.1  christos static int tic6x_register_number (int reg, int side, int crosspath);
    144  1.1  christos 
    145  1.1  christos /* Do a full analysis of the prologue at START_PC and update CACHE accordingly.
    146  1.1  christos    Bail out early if CURRENT_PC is reached.  Returns the address of the first
    147  1.1  christos    instruction after the prologue.  */
    148  1.1  christos 
    149  1.1  christos static CORE_ADDR
    150  1.1  christos tic6x_analyze_prologue (struct gdbarch *gdbarch, const CORE_ADDR start_pc,
    151  1.1  christos 			const CORE_ADDR current_pc,
    152  1.1  christos 			struct tic6x_unwind_cache *cache,
    153  1.1  christos 			struct frame_info *this_frame)
    154  1.1  christos {
    155  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    156  1.1  christos   unsigned long inst;
    157  1.1  christos   unsigned int src_reg, base_reg, dst_reg;
    158  1.1  christos   int i;
    159  1.1  christos   CORE_ADDR pc = start_pc;
    160  1.1  christos   CORE_ADDR return_pc = start_pc;
    161  1.1  christos   int frame_base_offset_to_sp = 0;
    162  1.1  christos   /* Counter of non-stw instructions after first insn ` sub sp, xxx, sp'.  */
    163  1.1  christos   int non_stw_insn_counter = 0;
    164  1.1  christos 
    165  1.1  christos   if (start_pc >= current_pc)
    166  1.1  christos     return_pc = current_pc;
    167  1.1  christos 
    168  1.1  christos   cache->base = 0;
    169  1.1  christos 
    170  1.1  christos   /* The landmarks in prologue is one or two SUB instructions to SP.
    171  1.1  christos      Instructions on setting up dsbt are in the last part of prologue, if
    172  1.1  christos      needed.  In maxim, prologue can be divided to three parts by two
    173  1.1  christos      `sub sp, xx, sp' insns.  */
    174  1.1  christos 
    175  1.1  christos   /* Step 1: Look for the 1st and 2nd insn `sub sp, xx, sp',  in which, the
    176  1.1  christos      2nd one is optional.  */
    177  1.1  christos   while (pc < current_pc)
    178  1.1  christos     {
    179  1.1  christos       int offset = 0;
    180  1.1  christos 
    181  1.1  christos       unsigned long inst = tic6x_fetch_instruction (gdbarch, pc);
    182  1.1  christos 
    183  1.1  christos       if ((inst & 0x1ffc) == 0x1dc0 || (inst & 0x1ffc) == 0x1bc0
    184  1.1  christos 	  || (inst & 0x0ffc) == 0x9c0)
    185  1.1  christos 	{
    186  1.1  christos 	  /* SUBAW/SUBAH/SUB, and src1 is ucst 5.  */
    187  1.1  christos 	  unsigned int src2 = tic6x_register_number ((inst >> 18) & 0x1f,
    188  1.1  christos 						     INST_S_BIT (inst), 0);
    189  1.1  christos 	  unsigned int dst = tic6x_register_number ((inst >> 23) & 0x1f,
    190  1.1  christos 						    INST_S_BIT (inst), 0);
    191  1.1  christos 
    192  1.1  christos 	  if (src2 == TIC6X_SP_REGNUM && dst == TIC6X_SP_REGNUM)
    193  1.1  christos 	    {
    194  1.1  christos 	      /* Extract const from insn SUBAW/SUBAH/SUB, and translate it to
    195  1.1  christos 		 offset.  The constant offset is decoded in bit 13-17 in all
    196  1.1  christos 		 these three kinds of instructions.  */
    197  1.1  christos 	      unsigned int ucst5 = (inst >> 13) & 0x1f;
    198  1.1  christos 
    199  1.1  christos 	      if ((inst & 0x1ffc) == 0x1dc0)	/* SUBAW */
    200  1.1  christos 		frame_base_offset_to_sp += ucst5 << 2;
    201  1.1  christos 	      else if ((inst & 0x1ffc) == 0x1bc0)	/* SUBAH */
    202  1.1  christos 		frame_base_offset_to_sp += ucst5 << 1;
    203  1.1  christos 	      else if ((inst & 0x0ffc) == 0x9c0)	/* SUB */
    204  1.1  christos 		frame_base_offset_to_sp += ucst5;
    205  1.1  christos 	      else
    206  1.1  christos 		gdb_assert_not_reached ("unexpected instruction");
    207  1.1  christos 
    208  1.1  christos 	      return_pc = pc + 4;
    209  1.1  christos 	    }
    210  1.1  christos 	}
    211  1.1  christos       else if ((inst & 0x174) == 0x74)	/* stw SRC, *+b15(uconst) */
    212  1.1  christos 	{
    213  1.1  christos 	  /* The y bit determines which file base is read from.  */
    214  1.1  christos 	  base_reg = tic6x_register_number ((inst >> 18) & 0x1f,
    215  1.1  christos 					    (inst >> 7) & 1, 0);
    216  1.1  christos 
    217  1.1  christos 	  if (base_reg == TIC6X_SP_REGNUM)
    218  1.1  christos 	    {
    219  1.1  christos 	      src_reg = tic6x_register_number ((inst >> 23) & 0x1f,
    220  1.1  christos 					       INST_S_BIT (inst), 0);
    221  1.1  christos 
    222  1.1  christos 	      cache->reg_saved[src_reg] = ((inst >> 13) & 0x1f) << 2;
    223  1.1  christos 
    224  1.1  christos 	      return_pc = pc + 4;
    225  1.1  christos 	    }
    226  1.1  christos 	  non_stw_insn_counter = 0;
    227  1.1  christos 	}
    228  1.1  christos       else
    229  1.1  christos 	{
    230  1.1  christos 	  non_stw_insn_counter++;
    231  1.1  christos 	  /* Following instruction sequence may be emitted in prologue:
    232  1.1  christos 
    233  1.1  christos 	     <+0>: subah .D2 b15,28,b15
    234  1.1  christos 	     <+4>: or .L2X 0,a4,b0
    235  1.1  christos 	     <+8>: || stw .D2T2 b14,*+b15(56)
    236  1.1  christos 	     <+12>:[!b0] b .S1 0xe50e4c1c <sleep+220>
    237  1.1  christos 	     <+16>:|| stw .D2T1 a10,*+b15(48)
    238  1.1  christos 	     <+20>:stw .D2T2 b3,*+b15(52)
    239  1.1  christos 	     <+24>:stw .D2T1 a4,*+b15(40)
    240  1.1  christos 
    241  1.1  christos 	     we should look forward for next instruction instead of breaking loop
    242  1.1  christos 	     here.  So far, we allow almost two sequential non-stw instructions
    243  1.1  christos 	     in prologue.  */
    244  1.1  christos 	  if (non_stw_insn_counter >= 2)
    245  1.1  christos 	    break;
    246  1.1  christos 	}
    247  1.1  christos 
    248  1.1  christos 
    249  1.1  christos       pc += 4;
    250  1.1  christos     }
    251  1.1  christos   /* Step 2: Skip insn on setting up dsbt if it is.  Usually, it looks like,
    252  1.1  christos      ldw .D2T2 *+b14(0),b14 */
    253  1.1  christos   inst = tic6x_fetch_instruction (gdbarch, pc);
    254  1.1  christos   /* The s bit determines which file dst will be loaded into, same effect as
    255  1.1  christos      other places.  */
    256  1.1  christos   dst_reg = tic6x_register_number ((inst >> 23) & 0x1f, (inst >> 1) & 1, 0);
    257  1.1  christos   /* The y bit (bit 7), instead of s bit, determines which file base be
    258  1.1  christos      used.  */
    259  1.1  christos   base_reg = tic6x_register_number ((inst >> 18) & 0x1f, (inst >> 7) & 1, 0);
    260  1.1  christos 
    261  1.1  christos   if ((inst & 0x164) == 0x64	/* ldw */
    262  1.1  christos       && dst_reg == TIC6X_DP_REGNUM	/* dst is B14 */
    263  1.1  christos       && base_reg == TIC6X_DP_REGNUM)	/* baseR is B14 */
    264  1.1  christos     {
    265  1.1  christos       return_pc = pc + 4;
    266  1.1  christos     }
    267  1.1  christos 
    268  1.1  christos   if (this_frame)
    269  1.1  christos     {
    270  1.1  christos       cache->base = get_frame_register_unsigned (this_frame, TIC6X_SP_REGNUM);
    271  1.1  christos 
    272  1.1  christos       if (cache->reg_saved[TIC6X_FP_REGNUM] != -1)
    273  1.1  christos 	{
    274  1.1  christos 	  /* If the FP now holds an offset from the CFA then this is a frame
    275  1.1  christos 	     which uses the frame pointer.  */
    276  1.1  christos 
    277  1.1  christos 	  cache->cfa = get_frame_register_unsigned (this_frame,
    278  1.1  christos 						    TIC6X_FP_REGNUM);
    279  1.1  christos 	}
    280  1.1  christos       else
    281  1.1  christos 	{
    282  1.1  christos 	  /* FP doesn't hold an offset from the CFA.  If SP still holds an
    283  1.1  christos 	     offset from the CFA then we might be in a function which omits
    284  1.1  christos 	     the frame pointer.  */
    285  1.1  christos 
    286  1.1  christos 	  cache->cfa = cache->base + frame_base_offset_to_sp;
    287  1.1  christos 	}
    288  1.1  christos     }
    289  1.1  christos 
    290  1.1  christos   /* Adjust all the saved registers such that they contain addresses
    291  1.1  christos      instead of offsets.  */
    292  1.1  christos   for (i = 0; i < TIC6X_NUM_CORE_REGS; i++)
    293  1.1  christos     if (cache->reg_saved[i] != -1)
    294  1.1  christos       cache->reg_saved[i] = cache->base + cache->reg_saved[i];
    295  1.1  christos 
    296  1.1  christos   return return_pc;
    297  1.1  christos }
    298  1.1  christos 
    299  1.1  christos /* This is the implementation of gdbarch method skip_prologue.  */
    300  1.1  christos 
    301  1.1  christos static CORE_ADDR
    302  1.1  christos tic6x_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
    303  1.1  christos {
    304  1.1  christos   CORE_ADDR func_addr;
    305  1.1  christos   struct tic6x_unwind_cache cache;
    306  1.1  christos 
    307  1.1  christos   /* See if we can determine the end of the prologue via the symbol table.
    308  1.1  christos      If so, then return either PC, or the PC after the prologue, whichever is
    309  1.1  christos      greater.  */
    310  1.1  christos   if (find_pc_partial_function (start_pc, NULL, &func_addr, NULL))
    311  1.1  christos     {
    312  1.1  christos       CORE_ADDR post_prologue_pc
    313  1.1  christos 	= skip_prologue_using_sal (gdbarch, func_addr);
    314  1.1  christos       if (post_prologue_pc != 0)
    315  1.1  christos 	return max (start_pc, post_prologue_pc);
    316  1.1  christos     }
    317  1.1  christos 
    318  1.1  christos   /* Can't determine prologue from the symbol table, need to examine
    319  1.1  christos      instructions.  */
    320  1.1  christos   return tic6x_analyze_prologue (gdbarch, start_pc, (CORE_ADDR) -1, &cache,
    321  1.1  christos 				 NULL);
    322  1.1  christos }
    323  1.1  christos 
    324  1.1  christos /* This is the implementation of gdbarch method breakpiont_from_pc.  */
    325  1.1  christos 
    326  1.1  christos static const gdb_byte *
    327  1.1  christos tic6x_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *bp_addr,
    328  1.1  christos 			  int *bp_size)
    329  1.1  christos {
    330  1.1  christos   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
    331  1.1  christos 
    332  1.1  christos   *bp_size = 4;
    333  1.1  christos 
    334  1.1  christos   if (tdep == NULL || tdep->breakpoint == NULL)
    335  1.1  christos     {
    336  1.1  christos       if (BFD_ENDIAN_BIG == gdbarch_byte_order_for_code (gdbarch))
    337  1.1  christos 	return tic6x_bkpt_illegal_opcode_be;
    338  1.1  christos       else
    339  1.1  christos 	return tic6x_bkpt_illegal_opcode_le;
    340  1.1  christos     }
    341  1.1  christos   else
    342  1.1  christos     return tdep->breakpoint;
    343  1.1  christos }
    344  1.1  christos 
    345  1.1  christos /* This is the implementation of gdbarch method print_insn.  */
    346  1.1  christos 
    347  1.1  christos static int
    348  1.1  christos tic6x_print_insn (bfd_vma memaddr, disassemble_info *info)
    349  1.1  christos {
    350  1.1  christos   return print_insn_tic6x (memaddr, info);
    351  1.1  christos }
    352  1.1  christos 
    353  1.1  christos static void
    354  1.1  christos tic6x_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
    355  1.1  christos 			     struct dwarf2_frame_state_reg *reg,
    356  1.1  christos 			     struct frame_info *this_frame)
    357  1.1  christos {
    358  1.1  christos   /* Mark the PC as the destination for the return address.  */
    359  1.1  christos   if (regnum == gdbarch_pc_regnum (gdbarch))
    360  1.1  christos     reg->how = DWARF2_FRAME_REG_RA;
    361  1.1  christos 
    362  1.1  christos   /* Mark the stack pointer as the call frame address.  */
    363  1.1  christos   else if (regnum == gdbarch_sp_regnum (gdbarch))
    364  1.1  christos     reg->how = DWARF2_FRAME_REG_CFA;
    365  1.1  christos 
    366  1.1  christos   /* The above was taken from the default init_reg in dwarf2-frame.c
    367  1.1  christos      while the below is c6x specific.  */
    368  1.1  christos 
    369  1.1  christos   /* Callee save registers.  The ABI designates A10-A15 and B10-B15 as
    370  1.1  christos      callee-save.  */
    371  1.1  christos   else if ((regnum >= 10 && regnum <= 15) || (regnum >= 26 && regnum <= 31))
    372  1.1  christos     reg->how = DWARF2_FRAME_REG_SAME_VALUE;
    373  1.1  christos   else
    374  1.1  christos     /* All other registers are caller-save.  */
    375  1.1  christos     reg->how = DWARF2_FRAME_REG_UNDEFINED;
    376  1.1  christos }
    377  1.1  christos 
    378  1.1  christos /* This is the implementation of gdbarch method unwind_pc.  */
    379  1.1  christos 
    380  1.1  christos static CORE_ADDR
    381  1.1  christos tic6x_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
    382  1.1  christos {
    383  1.1  christos   gdb_byte buf[8];
    384  1.1  christos 
    385  1.1  christos   frame_unwind_register (next_frame,  TIC6X_PC_REGNUM, buf);
    386  1.1  christos   return extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
    387  1.1  christos }
    388  1.1  christos 
    389  1.1  christos /* This is the implementation of gdbarch method unwind_sp.  */
    390  1.1  christos 
    391  1.1  christos static CORE_ADDR
    392  1.1  christos tic6x_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame)
    393  1.1  christos {
    394  1.1  christos   return frame_unwind_register_unsigned (this_frame, TIC6X_SP_REGNUM);
    395  1.1  christos }
    396  1.1  christos 
    397  1.1  christos 
    398  1.1  christos /* Frame base handling.  */
    399  1.1  christos 
    400  1.1  christos static struct tic6x_unwind_cache*
    401  1.1  christos tic6x_frame_unwind_cache (struct frame_info *this_frame,
    402  1.1  christos 			  void **this_prologue_cache)
    403  1.1  christos {
    404  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
    405  1.1  christos   CORE_ADDR current_pc;
    406  1.1  christos   struct tic6x_unwind_cache *cache;
    407  1.1  christos 
    408  1.1  christos   if (*this_prologue_cache)
    409  1.1  christos     return *this_prologue_cache;
    410  1.1  christos 
    411  1.1  christos   cache = FRAME_OBSTACK_ZALLOC (struct tic6x_unwind_cache);
    412  1.1  christos   (*this_prologue_cache) = cache;
    413  1.1  christos 
    414  1.1  christos   cache->return_regnum = TIC6X_RA_REGNUM;
    415  1.1  christos 
    416  1.1  christos   tic6x_setup_default (cache);
    417  1.1  christos 
    418  1.1  christos   cache->pc = get_frame_func (this_frame);
    419  1.1  christos   current_pc = get_frame_pc (this_frame);
    420  1.1  christos 
    421  1.1  christos   /* Prologue analysis does the rest...  */
    422  1.1  christos   if (cache->pc != 0)
    423  1.1  christos     tic6x_analyze_prologue (gdbarch, cache->pc, current_pc, cache, this_frame);
    424  1.1  christos 
    425  1.1  christos   return cache;
    426  1.1  christos }
    427  1.1  christos 
    428  1.1  christos static void
    429  1.1  christos tic6x_frame_this_id (struct frame_info *this_frame, void **this_cache,
    430  1.1  christos 		     struct frame_id *this_id)
    431  1.1  christos {
    432  1.1  christos   struct tic6x_unwind_cache *cache =
    433  1.1  christos     tic6x_frame_unwind_cache (this_frame, this_cache);
    434  1.1  christos 
    435  1.1  christos   /* This marks the outermost frame.  */
    436  1.1  christos   if (cache->base == 0)
    437  1.1  christos     return;
    438  1.1  christos 
    439  1.1  christos   (*this_id) = frame_id_build (cache->cfa, cache->pc);
    440  1.1  christos }
    441  1.1  christos 
    442  1.1  christos static struct value *
    443  1.1  christos tic6x_frame_prev_register (struct frame_info *this_frame, void **this_cache,
    444  1.1  christos 			   int regnum)
    445  1.1  christos {
    446  1.1  christos   struct tic6x_unwind_cache *cache =
    447  1.1  christos     tic6x_frame_unwind_cache (this_frame, this_cache);
    448  1.1  christos 
    449  1.1  christos   gdb_assert (regnum >= 0);
    450  1.1  christos 
    451  1.1  christos   /* The PC of the previous frame is stored in the RA register of
    452  1.1  christos      the current frame.  Frob regnum so that we pull the value from
    453  1.1  christos      the correct place.  */
    454  1.1  christos   if (regnum == TIC6X_PC_REGNUM)
    455  1.1  christos     regnum = cache->return_regnum;
    456  1.1  christos 
    457  1.1  christos   if (regnum == TIC6X_SP_REGNUM && cache->cfa)
    458  1.1  christos     return frame_unwind_got_constant (this_frame, regnum, cache->cfa);
    459  1.1  christos 
    460  1.1  christos   /* If we've worked out where a register is stored then load it from
    461  1.1  christos      there.  */
    462  1.1  christos   if (regnum < TIC6X_NUM_CORE_REGS && cache->reg_saved[regnum] != -1)
    463  1.1  christos     return frame_unwind_got_memory (this_frame, regnum,
    464  1.1  christos 				    cache->reg_saved[regnum]);
    465  1.1  christos 
    466  1.1  christos   return frame_unwind_got_register (this_frame, regnum, regnum);
    467  1.1  christos }
    468  1.1  christos 
    469  1.1  christos static CORE_ADDR
    470  1.1  christos tic6x_frame_base_address (struct frame_info *this_frame, void **this_cache)
    471  1.1  christos {
    472  1.1  christos   struct tic6x_unwind_cache *info
    473  1.1  christos     = tic6x_frame_unwind_cache (this_frame, this_cache);
    474  1.1  christos   return info->base;
    475  1.1  christos }
    476  1.1  christos 
    477  1.1  christos static const struct frame_unwind tic6x_frame_unwind =
    478  1.1  christos {
    479  1.1  christos   NORMAL_FRAME,
    480  1.1  christos   default_frame_unwind_stop_reason,
    481  1.1  christos   tic6x_frame_this_id,
    482  1.1  christos   tic6x_frame_prev_register,
    483  1.1  christos   NULL,
    484  1.1  christos   default_frame_sniffer
    485  1.1  christos };
    486  1.1  christos 
    487  1.1  christos static const struct frame_base tic6x_frame_base =
    488  1.1  christos {
    489  1.1  christos   &tic6x_frame_unwind,
    490  1.1  christos   tic6x_frame_base_address,
    491  1.1  christos   tic6x_frame_base_address,
    492  1.1  christos   tic6x_frame_base_address
    493  1.1  christos };
    494  1.1  christos 
    495  1.1  christos 
    496  1.1  christos static struct tic6x_unwind_cache *
    497  1.1  christos tic6x_make_stub_cache (struct frame_info *this_frame)
    498  1.1  christos {
    499  1.1  christos   struct tic6x_unwind_cache *cache;
    500  1.1  christos 
    501  1.1  christos   cache = FRAME_OBSTACK_ZALLOC (struct tic6x_unwind_cache);
    502  1.1  christos 
    503  1.1  christos   cache->return_regnum = TIC6X_RA_REGNUM;
    504  1.1  christos 
    505  1.1  christos   tic6x_setup_default (cache);
    506  1.1  christos 
    507  1.1  christos   cache->cfa = get_frame_register_unsigned (this_frame, TIC6X_SP_REGNUM);
    508  1.1  christos 
    509  1.1  christos   return cache;
    510  1.1  christos }
    511  1.1  christos 
    512  1.1  christos static void
    513  1.1  christos tic6x_stub_this_id (struct frame_info *this_frame, void **this_cache,
    514  1.1  christos 		    struct frame_id *this_id)
    515  1.1  christos {
    516  1.1  christos   struct tic6x_unwind_cache *cache;
    517  1.1  christos 
    518  1.1  christos   if (*this_cache == NULL)
    519  1.1  christos     *this_cache = tic6x_make_stub_cache (this_frame);
    520  1.1  christos   cache = *this_cache;
    521  1.1  christos 
    522  1.1  christos   *this_id = frame_id_build (cache->cfa, get_frame_pc (this_frame));
    523  1.1  christos }
    524  1.1  christos 
    525  1.1  christos static int
    526  1.1  christos tic6x_stub_unwind_sniffer (const struct frame_unwind *self,
    527  1.1  christos 			   struct frame_info *this_frame,
    528  1.1  christos 			   void **this_prologue_cache)
    529  1.1  christos {
    530  1.1  christos   CORE_ADDR addr_in_block;
    531  1.1  christos 
    532  1.1  christos   addr_in_block = get_frame_address_in_block (this_frame);
    533  1.1  christos   if (in_plt_section (addr_in_block))
    534  1.1  christos     return 1;
    535  1.1  christos 
    536  1.1  christos   return 0;
    537  1.1  christos }
    538  1.1  christos 
    539  1.1  christos static const struct frame_unwind tic6x_stub_unwind =
    540  1.1  christos {
    541  1.1  christos   NORMAL_FRAME,
    542  1.1  christos   default_frame_unwind_stop_reason,
    543  1.1  christos   tic6x_stub_this_id,
    544  1.1  christos   tic6x_frame_prev_register,
    545  1.1  christos   NULL,
    546  1.1  christos   tic6x_stub_unwind_sniffer
    547  1.1  christos };
    548  1.1  christos 
    549  1.1  christos /* Return the instruction on address PC.  */
    550  1.1  christos 
    551  1.1  christos static unsigned long
    552  1.1  christos tic6x_fetch_instruction (struct gdbarch *gdbarch, CORE_ADDR pc)
    553  1.1  christos {
    554  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    555  1.1  christos   return read_memory_unsigned_integer (pc, TIC6X_OPCODE_SIZE, byte_order);
    556  1.1  christos }
    557  1.1  christos 
    558  1.1  christos /* Compute the condition of INST if it is a conditional instruction.  Always
    559  1.1  christos    return 1 if INST is not a conditional instruction.  */
    560  1.1  christos 
    561  1.1  christos static int
    562  1.1  christos tic6x_condition_true (struct frame_info *frame, unsigned long inst)
    563  1.1  christos {
    564  1.1  christos   int register_number;
    565  1.1  christos   int register_value;
    566  1.1  christos   static const int register_numbers[8] = { -1, 16, 17, 18, 1, 2, 0, -1 };
    567  1.1  christos 
    568  1.1  christos   register_number = register_numbers[(inst >> 29) & 7];
    569  1.1  christos   if (register_number == -1)
    570  1.1  christos     return 1;
    571  1.1  christos 
    572  1.1  christos   register_value = get_frame_register_signed (frame, register_number);
    573  1.1  christos   if ((inst & 0x10000000) != 0)
    574  1.1  christos     return register_value == 0;
    575  1.1  christos   return register_value != 0;
    576  1.1  christos }
    577  1.1  christos 
    578  1.1  christos /* Get the register number by decoding raw bits REG, SIDE, and CROSSPATH in
    579  1.1  christos    instruction.  */
    580  1.1  christos 
    581  1.1  christos static int
    582  1.1  christos tic6x_register_number (int reg, int side, int crosspath)
    583  1.1  christos {
    584  1.1  christos   int r = (reg & 15) | ((crosspath ^ side) << 4);
    585  1.1  christos   if ((reg & 16) != 0) /* A16 - A31, B16 - B31 */
    586  1.1  christos     r += 37;
    587  1.1  christos   return r;
    588  1.1  christos }
    589  1.1  christos 
    590  1.1  christos static int
    591  1.1  christos tic6x_extract_signed_field (int value, int low_bit, int bits)
    592  1.1  christos {
    593  1.1  christos   int mask = (1 << bits) - 1;
    594  1.1  christos   int r = (value >> low_bit) & mask;
    595  1.1  christos   if ((r & (1 << (bits - 1))) != 0)
    596  1.1  christos     r -= mask + 1;
    597  1.1  christos   return r;
    598  1.1  christos }
    599  1.1  christos 
    600  1.1  christos /* Determine where to set a single step breakpoint.  */
    601  1.1  christos 
    602  1.1  christos static CORE_ADDR
    603  1.1  christos tic6x_get_next_pc (struct frame_info *frame, CORE_ADDR pc)
    604  1.1  christos {
    605  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (frame);
    606  1.1  christos   unsigned long inst;
    607  1.1  christos   int register_number;
    608  1.1  christos   int last = 0;
    609  1.1  christos 
    610  1.1  christos   do
    611  1.1  christos     {
    612  1.1  christos       inst = tic6x_fetch_instruction (gdbarch, pc);
    613  1.1  christos 
    614  1.1  christos       last = !(inst & 1);
    615  1.1  christos 
    616  1.1  christos       if (inst == TIC6X_INST_SWE)
    617  1.1  christos 	{
    618  1.1  christos 	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
    619  1.1  christos 
    620  1.1  christos 	  if (tdep->syscall_next_pc != NULL)
    621  1.1  christos 	    return tdep->syscall_next_pc (frame);
    622  1.1  christos 	}
    623  1.1  christos 
    624  1.1  christos       if (tic6x_condition_true (frame, inst))
    625  1.1  christos 	{
    626  1.1  christos 	  if ((inst & 0x0000007c) == 0x00000010)
    627  1.1  christos 	    {
    628  1.1  christos 	      /* B with displacement */
    629  1.1  christos 	      pc &= ~(TIC6X_FETCH_PACKET_SIZE - 1);
    630  1.1  christos 	      pc += tic6x_extract_signed_field (inst, 7, 21) << 2;
    631  1.1  christos 	      break;
    632  1.1  christos 	    }
    633  1.1  christos 	  if ((inst & 0x0f83effc) == 0x00000360)
    634  1.1  christos 	    {
    635  1.1  christos 	      /* B with register */
    636  1.1  christos 
    637  1.1  christos 	      register_number = tic6x_register_number ((inst >> 18) & 0x1f,
    638  1.1  christos 						       INST_S_BIT (inst),
    639  1.1  christos 						       INST_X_BIT (inst));
    640  1.1  christos 	      pc = get_frame_register_unsigned (frame, register_number);
    641  1.1  christos 	      break;
    642  1.1  christos 	    }
    643  1.1  christos 	  if ((inst & 0x00001ffc) == 0x00001020)
    644  1.1  christos 	    {
    645  1.1  christos 	      /* BDEC */
    646  1.1  christos 	      register_number = tic6x_register_number ((inst >> 23) & 0x1f,
    647  1.1  christos 						       INST_S_BIT (inst), 0);
    648  1.1  christos 	      if (get_frame_register_signed (frame, register_number) >= 0)
    649  1.1  christos 		{
    650  1.1  christos 		  pc &= ~(TIC6X_FETCH_PACKET_SIZE - 1);
    651  1.1  christos 		  pc += tic6x_extract_signed_field (inst, 7, 10) << 2;
    652  1.1  christos 		}
    653  1.1  christos 	      break;
    654  1.1  christos 	    }
    655  1.1  christos 	  if ((inst & 0x00001ffc) == 0x00000120)
    656  1.1  christos 	    {
    657  1.1  christos 	      /* BNOP with displacement */
    658  1.1  christos 	      pc &= ~(TIC6X_FETCH_PACKET_SIZE - 1);
    659  1.1  christos 	      pc += tic6x_extract_signed_field (inst, 16, 12) << 2;
    660  1.1  christos 	      break;
    661  1.1  christos 	    }
    662  1.1  christos 	  if ((inst & 0x0f830ffe) == 0x00800362)
    663  1.1  christos 	    {
    664  1.1  christos 	      /* BNOP with register */
    665  1.1  christos 	      register_number = tic6x_register_number ((inst >> 18) & 0x1f,
    666  1.1  christos 						       1, INST_X_BIT (inst));
    667  1.1  christos 	      pc = get_frame_register_unsigned (frame, register_number);
    668  1.1  christos 	      break;
    669  1.1  christos 	    }
    670  1.1  christos 	  if ((inst & 0x00001ffc) == 0x00000020)
    671  1.1  christos 	    {
    672  1.1  christos 	      /* BPOS */
    673  1.1  christos 	      register_number = tic6x_register_number ((inst >> 23) & 0x1f,
    674  1.1  christos 						       INST_S_BIT (inst), 0);
    675  1.1  christos 	      if (get_frame_register_signed (frame, register_number) >= 0)
    676  1.1  christos 		{
    677  1.1  christos 		  pc &= ~(TIC6X_FETCH_PACKET_SIZE - 1);
    678  1.1  christos 		  pc += tic6x_extract_signed_field (inst, 13, 10) << 2;
    679  1.1  christos 		}
    680  1.1  christos 	      break;
    681  1.1  christos 	    }
    682  1.1  christos 	  if ((inst & 0xf000007c) == 0x10000010)
    683  1.1  christos 	    {
    684  1.1  christos 	      /* CALLP */
    685  1.1  christos 	      pc &= ~(TIC6X_FETCH_PACKET_SIZE - 1);
    686  1.1  christos 	      pc += tic6x_extract_signed_field (inst, 7, 21) << 2;
    687  1.1  christos 	      break;
    688  1.1  christos 	    }
    689  1.1  christos 	}
    690  1.1  christos       pc += TIC6X_OPCODE_SIZE;
    691  1.1  christos     }
    692  1.1  christos   while (!last);
    693  1.1  christos   return pc;
    694  1.1  christos }
    695  1.1  christos 
    696  1.1  christos /* This is the implementation of gdbarch method software_single_step.  */
    697  1.1  christos 
    698  1.1  christos static int
    699  1.1  christos tic6x_software_single_step (struct frame_info *frame)
    700  1.1  christos {
    701  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (frame);
    702  1.1  christos   struct address_space *aspace = get_frame_address_space (frame);
    703  1.1  christos   CORE_ADDR next_pc = tic6x_get_next_pc (frame, get_frame_pc (frame));
    704  1.1  christos 
    705  1.1  christos   insert_single_step_breakpoint (gdbarch, aspace, next_pc);
    706  1.1  christos 
    707  1.1  christos   return 1;
    708  1.1  christos }
    709  1.1  christos 
    710  1.1  christos /* This is the implementation of gdbarch method frame_align.  */
    711  1.1  christos 
    712  1.1  christos static CORE_ADDR
    713  1.1  christos tic6x_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
    714  1.1  christos {
    715  1.1  christos   return align_down (addr, 8);
    716  1.1  christos }
    717  1.1  christos 
    718  1.1  christos /* Given a return value in REGCACHE with a type VALTYPE, extract and copy its
    719  1.1  christos    value into VALBUF.  */
    720  1.1  christos 
    721  1.1  christos static void
    722  1.1  christos tic6x_extract_return_value (struct type *valtype, struct regcache *regcache,
    723  1.1  christos 			    enum bfd_endian byte_order, gdb_byte *valbuf)
    724  1.1  christos {
    725  1.1  christos   int len = TYPE_LENGTH (valtype);
    726  1.1  christos 
    727  1.1  christos   /* pointer types are returned in register A4,
    728  1.1  christos      up to 32-bit types in A4
    729  1.1  christos      up to 64-bit types in A5:A4  */
    730  1.1  christos   if (len <= 4)
    731  1.1  christos     {
    732  1.1  christos       /* In big-endian,
    733  1.1  christos 	 - one-byte structure or union occupies the LSB of single even register.
    734  1.1  christos 	 - for two-byte structure or union, the first byte occupies byte 1 of
    735  1.1  christos 	 register and the second byte occupies byte 0.
    736  1.1  christos 	 so, we read the contents in VAL from the LSBs of register.  */
    737  1.1  christos       if (len < 3 && byte_order == BFD_ENDIAN_BIG)
    738  1.1  christos 	regcache_cooked_read_part (regcache, TIC6X_A4_REGNUM, 4 - len, len,
    739  1.1  christos 				   valbuf);
    740  1.1  christos       else
    741  1.1  christos 	regcache_cooked_read (regcache, TIC6X_A4_REGNUM, valbuf);
    742  1.1  christos     }
    743  1.1  christos   else if (len <= 8)
    744  1.1  christos     {
    745  1.1  christos       /* For a 5-8 byte structure or union in big-endian, the first byte
    746  1.1  christos 	 occupies byte 3 (the MSB) of the upper (odd) register and the
    747  1.1  christos 	 remaining bytes fill the decreasingly significant bytes.  5-7
    748  1.1  christos 	 byte structures or unions have padding in the LSBs of the
    749  1.1  christos 	 lower (even) register.  */
    750  1.1  christos       if (byte_order == BFD_ENDIAN_BIG)
    751  1.1  christos 	{
    752  1.1  christos 	  regcache_cooked_read (regcache, TIC6X_A4_REGNUM, valbuf + 4);
    753  1.1  christos 	  regcache_cooked_read (regcache, TIC6X_A5_REGNUM, valbuf);
    754  1.1  christos 	}
    755  1.1  christos       else
    756  1.1  christos 	{
    757  1.1  christos 	  regcache_cooked_read (regcache, TIC6X_A4_REGNUM, valbuf);
    758  1.1  christos 	  regcache_cooked_read (regcache, TIC6X_A5_REGNUM, valbuf + 4);
    759  1.1  christos 	}
    760  1.1  christos     }
    761  1.1  christos }
    762  1.1  christos 
    763  1.1  christos /* Write into appropriate registers a function return value
    764  1.1  christos    of type TYPE, given in virtual format.  */
    765  1.1  christos 
    766  1.1  christos static void
    767  1.1  christos tic6x_store_return_value (struct type *valtype, struct regcache *regcache,
    768  1.1  christos 			  enum bfd_endian byte_order, const gdb_byte *valbuf)
    769  1.1  christos {
    770  1.1  christos   int len = TYPE_LENGTH (valtype);
    771  1.1  christos 
    772  1.1  christos   /* return values of up to 8 bytes are returned in A5:A4 */
    773  1.1  christos 
    774  1.1  christos   if (len <= 4)
    775  1.1  christos     {
    776  1.1  christos       if (len < 3 && byte_order == BFD_ENDIAN_BIG)
    777  1.1  christos 	regcache_cooked_write_part (regcache, TIC6X_A4_REGNUM, 4 - len, len,
    778  1.1  christos 				    valbuf);
    779  1.1  christos       else
    780  1.1  christos 	regcache_cooked_write (regcache, TIC6X_A4_REGNUM, valbuf);
    781  1.1  christos     }
    782  1.1  christos   else if (len <= 8)
    783  1.1  christos     {
    784  1.1  christos       if (byte_order == BFD_ENDIAN_BIG)
    785  1.1  christos 	{
    786  1.1  christos 	  regcache_cooked_write (regcache, TIC6X_A4_REGNUM, valbuf + 4);
    787  1.1  christos 	  regcache_cooked_write (regcache, TIC6X_A5_REGNUM, valbuf);
    788  1.1  christos 	}
    789  1.1  christos       else
    790  1.1  christos 	{
    791  1.1  christos 	  regcache_cooked_write (regcache, TIC6X_A4_REGNUM, valbuf);
    792  1.1  christos 	  regcache_cooked_write (regcache, TIC6X_A5_REGNUM, valbuf + 4);
    793  1.1  christos 	}
    794  1.1  christos     }
    795  1.1  christos }
    796  1.1  christos 
    797  1.1  christos /* This is the implementation of gdbarch method return_value.  */
    798  1.1  christos 
    799  1.1  christos static enum return_value_convention
    800  1.1  christos tic6x_return_value (struct gdbarch *gdbarch, struct value *function,
    801  1.1  christos 		    struct type *type, struct regcache *regcache,
    802  1.1  christos 		    gdb_byte *readbuf, const gdb_byte *writebuf)
    803  1.1  christos {
    804  1.1  christos   /* In C++, when function returns an object, even its size is small
    805  1.1  christos      enough, it stii has to be passed via reference, pointed by register
    806  1.1  christos      A3.  */
    807  1.1  christos   if (current_language->la_language == language_cplus)
    808  1.1  christos     {
    809  1.1  christos       if (type != NULL)
    810  1.1  christos 	{
    811  1.1  christos 	  CHECK_TYPEDEF (type);
    812  1.1  christos 	  if (language_pass_by_reference (type))
    813  1.1  christos 	    return RETURN_VALUE_STRUCT_CONVENTION;
    814  1.1  christos 	}
    815  1.1  christos     }
    816  1.1  christos 
    817  1.1  christos   if (TYPE_LENGTH (type) > 8)
    818  1.1  christos     return RETURN_VALUE_STRUCT_CONVENTION;
    819  1.1  christos 
    820  1.1  christos   if (readbuf)
    821  1.1  christos     tic6x_extract_return_value (type, regcache,
    822  1.1  christos 				gdbarch_byte_order (gdbarch), readbuf);
    823  1.1  christos   if (writebuf)
    824  1.1  christos     tic6x_store_return_value (type, regcache,
    825  1.1  christos 			      gdbarch_byte_order (gdbarch), writebuf);
    826  1.1  christos 
    827  1.1  christos   return RETURN_VALUE_REGISTER_CONVENTION;
    828  1.1  christos }
    829  1.1  christos 
    830  1.1  christos /* This is the implementation of gdbarch method dummy_id.  */
    831  1.1  christos 
    832  1.1  christos static struct frame_id
    833  1.1  christos tic6x_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
    834  1.1  christos {
    835  1.1  christos   return frame_id_build
    836  1.1  christos     (get_frame_register_unsigned (this_frame, TIC6X_SP_REGNUM),
    837  1.1  christos      get_frame_pc (this_frame));
    838  1.1  christos }
    839  1.1  christos 
    840  1.1  christos /* Get the alignment requirement of TYPE.  */
    841  1.1  christos 
    842  1.1  christos static int
    843  1.1  christos tic6x_arg_type_alignment (struct type *type)
    844  1.1  christos {
    845  1.1  christos   int len = TYPE_LENGTH (check_typedef (type));
    846  1.1  christos   enum type_code typecode = TYPE_CODE (check_typedef (type));
    847  1.1  christos 
    848  1.1  christos   if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
    849  1.1  christos     {
    850  1.1  christos       /* The stack alignment of a structure (and union) passed by value is the
    851  1.1  christos 	 smallest power of two greater than or equal to its size.
    852  1.1  christos 	 This cannot exceed 8 bytes, which is the largest allowable size for
    853  1.1  christos 	 a structure passed by value.  */
    854  1.1  christos 
    855  1.1  christos       if (len <= 2)
    856  1.1  christos 	return len;
    857  1.1  christos       else if (len <= 4)
    858  1.1  christos 	return 4;
    859  1.1  christos       else if (len <= 8)
    860  1.1  christos 	return 8;
    861  1.1  christos       else
    862  1.1  christos 	gdb_assert_not_reached ("unexpected length of data");
    863  1.1  christos     }
    864  1.1  christos   else
    865  1.1  christos     {
    866  1.1  christos       if (len <= 4)
    867  1.1  christos 	return 4;
    868  1.1  christos       else if (len == 8)
    869  1.1  christos 	{
    870  1.1  christos 	  if (typecode == TYPE_CODE_COMPLEX)
    871  1.1  christos 	    return 4;
    872  1.1  christos 	  else
    873  1.1  christos 	    return 8;
    874  1.1  christos 	}
    875  1.1  christos       else if (len == 16)
    876  1.1  christos 	{
    877  1.1  christos 	  if (typecode == TYPE_CODE_COMPLEX)
    878  1.1  christos 	    return 8;
    879  1.1  christos 	  else
    880  1.1  christos 	    return 16;
    881  1.1  christos 	}
    882  1.1  christos       else
    883  1.1  christos 	internal_error (__FILE__, __LINE__, _("unexpected length %d of type"),
    884  1.1  christos 			len);
    885  1.1  christos     }
    886  1.1  christos }
    887  1.1  christos 
    888  1.1  christos /* This is the implementation of gdbarch method push_dummy_call.  */
    889  1.1  christos 
    890  1.1  christos static CORE_ADDR
    891  1.1  christos tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
    892  1.1  christos 		       struct regcache *regcache, CORE_ADDR bp_addr,
    893  1.1  christos 		       int nargs, struct value **args, CORE_ADDR sp,
    894  1.1  christos 		       int struct_return, CORE_ADDR struct_addr)
    895  1.1  christos {
    896  1.1  christos   int argreg = 0;
    897  1.1  christos   int argnum;
    898  1.1  christos   int stack_offset = 4;
    899  1.1  christos   int references_offset = 4;
    900  1.1  christos   CORE_ADDR func_addr = find_function_addr (function, NULL);
    901  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    902  1.1  christos   struct type *func_type = value_type (function);
    903  1.1  christos   /* The first arg passed on stack.  Mostly the first 10 args are passed by
    904  1.1  christos      registers.  */
    905  1.1  christos   int first_arg_on_stack = 10;
    906  1.1  christos 
    907  1.1  christos   /* Set the return address register to point to the entry point of
    908  1.1  christos      the program, where a breakpoint lies in wait.  */
    909  1.1  christos   regcache_cooked_write_unsigned (regcache, TIC6X_RA_REGNUM, bp_addr);
    910  1.1  christos 
    911  1.1  christos   /* The caller must pass an argument in A3 containing a destination address
    912  1.1  christos      for the returned value.  The callee returns the object by copying it to
    913  1.1  christos      the address in A3.  */
    914  1.1  christos   if (struct_return)
    915  1.1  christos     regcache_cooked_write_unsigned (regcache, 3, struct_addr);
    916  1.1  christos 
    917  1.1  christos   /* Determine the type of this function.  */
    918  1.1  christos   func_type = check_typedef (func_type);
    919  1.1  christos   if (TYPE_CODE (func_type) == TYPE_CODE_PTR)
    920  1.1  christos     func_type = check_typedef (TYPE_TARGET_TYPE (func_type));
    921  1.1  christos 
    922  1.1  christos   gdb_assert (TYPE_CODE (func_type) == TYPE_CODE_FUNC
    923  1.1  christos 	      || TYPE_CODE (func_type) == TYPE_CODE_METHOD);
    924  1.1  christos 
    925  1.1  christos   /* For a variadic C function, the last explicitly declared argument and all
    926  1.1  christos      remaining arguments are passed on the stack.  */
    927  1.1  christos   if (TYPE_VARARGS (func_type))
    928  1.1  christos     first_arg_on_stack = TYPE_NFIELDS (func_type) - 1;
    929  1.1  christos 
    930  1.1  christos   /* Now make space on the stack for the args.  */
    931  1.1  christos   for (argnum = 0; argnum < nargs; argnum++)
    932  1.1  christos     {
    933  1.1  christos       int len = align_up (TYPE_LENGTH (value_type (args[argnum])), 4);
    934  1.1  christos       if (argnum >= 10 - argreg)
    935  1.1  christos 	references_offset += len;
    936  1.1  christos       stack_offset += len;
    937  1.1  christos     }
    938  1.1  christos   sp -= stack_offset;
    939  1.1  christos   /* SP should be 8-byte aligned, see C6000 ABI section 4.4.1
    940  1.1  christos      Stack Alignment.  */
    941  1.1  christos   sp = align_down (sp, 8);
    942  1.1  christos   stack_offset = 4;
    943  1.1  christos 
    944  1.1  christos   /* Now load as many as possible of the first arguments into
    945  1.1  christos      registers, and push the rest onto the stack.  Loop through args
    946  1.1  christos      from first to last.  */
    947  1.1  christos   for (argnum = 0; argnum < nargs; argnum++)
    948  1.1  christos     {
    949  1.1  christos       const gdb_byte *val;
    950  1.1  christos       struct value *arg = args[argnum];
    951  1.1  christos       struct type *arg_type = check_typedef (value_type (arg));
    952  1.1  christos       int len = TYPE_LENGTH (arg_type);
    953  1.1  christos       enum type_code typecode = TYPE_CODE (arg_type);
    954  1.1  christos 
    955  1.1  christos       val = value_contents (arg);
    956  1.1  christos 
    957  1.1  christos       /* Copy the argument to general registers or the stack in
    958  1.1  christos          register-sized pieces.  */
    959  1.1  christos       if (argreg < first_arg_on_stack)
    960  1.1  christos 	{
    961  1.1  christos 	  if (len <= 4)
    962  1.1  christos 	    {
    963  1.1  christos 	      if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
    964  1.1  christos 		{
    965  1.1  christos 		  /* In big-endian,
    966  1.1  christos 		     - one-byte structure or union occupies the LSB of single
    967  1.1  christos 		     even register.
    968  1.1  christos 		     - for two-byte structure or union, the first byte
    969  1.1  christos 		     occupies byte 1 of register and the second byte occupies
    970  1.1  christos 		     byte 0.
    971  1.1  christos 		     so, we write the contents in VAL to the lsp of
    972  1.1  christos 		     register.  */
    973  1.1  christos 		  if (len < 3 && byte_order == BFD_ENDIAN_BIG)
    974  1.1  christos 		    regcache_cooked_write_part (regcache, arg_regs[argreg],
    975  1.1  christos 						4 - len, len, val);
    976  1.1  christos 		  else
    977  1.1  christos 		    regcache_cooked_write (regcache, arg_regs[argreg], val);
    978  1.1  christos 		}
    979  1.1  christos 	      else
    980  1.1  christos 		{
    981  1.1  christos 		  /* The argument is being passed by value in a single
    982  1.1  christos 		     register.  */
    983  1.1  christos 		  CORE_ADDR regval = extract_unsigned_integer (val, len,
    984  1.1  christos 							       byte_order);
    985  1.1  christos 
    986  1.1  christos 		  regcache_cooked_write_unsigned (regcache, arg_regs[argreg],
    987  1.1  christos 						  regval);
    988  1.1  christos 		}
    989  1.1  christos 	    }
    990  1.1  christos 	  else
    991  1.1  christos 	    {
    992  1.1  christos 	      if (len <= 8)
    993  1.1  christos 		{
    994  1.1  christos 		  if (typecode == TYPE_CODE_STRUCT
    995  1.1  christos 		      || typecode == TYPE_CODE_UNION)
    996  1.1  christos 		    {
    997  1.1  christos 		      /* For a 5-8 byte structure or union in big-endian, the
    998  1.1  christos 		         first byte occupies byte 3 (the MSB) of the upper (odd)
    999  1.1  christos 		         register and the remaining bytes fill the decreasingly
   1000  1.1  christos 		         significant bytes.  5-7 byte structures or unions have
   1001  1.1  christos 		         padding in the LSBs of the lower (even) register.  */
   1002  1.1  christos 		      if (byte_order == BFD_ENDIAN_BIG)
   1003  1.1  christos 			{
   1004  1.1  christos 			  regcache_cooked_write (regcache,
   1005  1.1  christos 						 arg_regs[argreg] + 1, val);
   1006  1.1  christos 			  regcache_cooked_write_part (regcache,
   1007  1.1  christos 						      arg_regs[argreg], 0,
   1008  1.1  christos 						      len - 4, val + 4);
   1009  1.1  christos 			}
   1010  1.1  christos 		      else
   1011  1.1  christos 			{
   1012  1.1  christos 			  regcache_cooked_write (regcache, arg_regs[argreg],
   1013  1.1  christos 						 val);
   1014  1.1  christos 			  regcache_cooked_write_part (regcache,
   1015  1.1  christos 						      arg_regs[argreg] + 1, 0,
   1016  1.1  christos 						      len - 4, val + 4);
   1017  1.1  christos 			}
   1018  1.1  christos 		    }
   1019  1.1  christos 		  else
   1020  1.1  christos 		    {
   1021  1.1  christos 		      /* The argument is being passed by value in a pair of
   1022  1.1  christos 		         registers.  */
   1023  1.1  christos 		      ULONGEST regval = extract_unsigned_integer (val, len,
   1024  1.1  christos 								  byte_order);
   1025  1.1  christos 
   1026  1.1  christos 		      regcache_cooked_write_unsigned (regcache,
   1027  1.1  christos 						      arg_regs[argreg],
   1028  1.1  christos 						      regval);
   1029  1.1  christos 		      regcache_cooked_write_unsigned (regcache,
   1030  1.1  christos 						      arg_regs[argreg] + 1,
   1031  1.1  christos 						      regval >> 32);
   1032  1.1  christos 		    }
   1033  1.1  christos 		}
   1034  1.1  christos 	      else
   1035  1.1  christos 		{
   1036  1.1  christos 		  /* The argument is being passed by reference in a single
   1037  1.1  christos 		     register.  */
   1038  1.1  christos 		  CORE_ADDR addr;
   1039  1.1  christos 
   1040  1.1  christos 		  /* It is not necessary to adjust REFERENCES_OFFSET to
   1041  1.1  christos 		     8-byte aligned in some cases, in which 4-byte alignment
   1042  1.1  christos 		     is sufficient.  For simplicity, we adjust
   1043  1.1  christos 		     REFERENCES_OFFSET to 8-byte aligned.  */
   1044  1.1  christos 		  references_offset = align_up (references_offset, 8);
   1045  1.1  christos 
   1046  1.1  christos 		  addr = sp + references_offset;
   1047  1.1  christos 		  write_memory (addr, val, len);
   1048  1.1  christos 		  references_offset += align_up (len, 4);
   1049  1.1  christos 		  regcache_cooked_write_unsigned (regcache, arg_regs[argreg],
   1050  1.1  christos 						  addr);
   1051  1.1  christos 		}
   1052  1.1  christos 	    }
   1053  1.1  christos 	  argreg++;
   1054  1.1  christos 	}
   1055  1.1  christos       else
   1056  1.1  christos 	{
   1057  1.1  christos 	  /* The argument is being passed on the stack.  */
   1058  1.1  christos 	  CORE_ADDR addr;
   1059  1.1  christos 
   1060  1.1  christos 	  /* There are six different cases of alignment, and these rules can
   1061  1.1  christos 	     be found in tic6x_arg_type_alignment:
   1062  1.1  christos 
   1063  1.1  christos 	     1) 4-byte aligned if size is less than or equal to 4 byte, such
   1064  1.1  christos 	     as short, int, struct, union etc.
   1065  1.1  christos 	     2) 8-byte aligned if size is less than or equal to 8-byte, such
   1066  1.1  christos 	     as double, long long,
   1067  1.1  christos 	     3) 4-byte aligned if it is of type _Complex float, even its size
   1068  1.1  christos 	     is 8-byte.
   1069  1.1  christos 	     4) 8-byte aligned if it is of type _Complex double or _Complex
   1070  1.1  christos 	     long double, even its size is 16-byte.  Because, the address of
   1071  1.1  christos 	     variable is passed as reference.
   1072  1.1  christos 	     5) struct and union larger than 8-byte are passed by reference, so
   1073  1.1  christos 	     it is 4-byte aligned.
   1074  1.1  christos 	     6) struct and union of size between 4 byte and 8 byte varies.
   1075  1.1  christos 	     alignment of struct variable is the alignment of its first field,
   1076  1.1  christos 	     while alignment of union variable is the max of all its fields'
   1077  1.1  christos 	     alignment.  */
   1078  1.1  christos 
   1079  1.1  christos 	  if (len <= 4)
   1080  1.1  christos 	    ; /* Default is 4-byte aligned.  Nothing to be done.  */
   1081  1.1  christos 	  else if (len <= 8)
   1082  1.1  christos 	    stack_offset = align_up (stack_offset,
   1083  1.1  christos 				     tic6x_arg_type_alignment (arg_type));
   1084  1.1  christos 	  else if (len == 16)
   1085  1.1  christos 	    {
   1086  1.1  christos 	      /* _Complex double or _Complex long double */
   1087  1.1  christos 	      if (typecode == TYPE_CODE_COMPLEX)
   1088  1.1  christos 		{
   1089  1.1  christos 		  /* The argument is being passed by reference on stack.  */
   1090  1.1  christos 		  CORE_ADDR addr;
   1091  1.1  christos 		  references_offset = align_up (references_offset, 8);
   1092  1.1  christos 
   1093  1.1  christos 		  addr = sp + references_offset;
   1094  1.1  christos 		  /* Store variable on stack.  */
   1095  1.1  christos 		  write_memory (addr, val, len);
   1096  1.1  christos 
   1097  1.1  christos 		  references_offset += align_up (len, 4);
   1098  1.1  christos 
   1099  1.1  christos 		  /* Pass the address of variable on stack as reference.  */
   1100  1.1  christos 		  store_unsigned_integer ((gdb_byte *) val, 4, byte_order,
   1101  1.1  christos 					  addr);
   1102  1.1  christos 		  len = 4;
   1103  1.1  christos 
   1104  1.1  christos 		}
   1105  1.1  christos 	      else
   1106  1.1  christos 		internal_error (__FILE__, __LINE__,
   1107  1.1  christos 				_("unexpected type %d of arg %d"),
   1108  1.1  christos 				typecode, argnum);
   1109  1.1  christos 	    }
   1110  1.1  christos 	  else
   1111  1.1  christos 	    internal_error (__FILE__, __LINE__,
   1112  1.1  christos 			    _("unexpected length %d of arg %d"), len, argnum);
   1113  1.1  christos 
   1114  1.1  christos 	  addr = sp + stack_offset;
   1115  1.1  christos 	  write_memory (addr, val, len);
   1116  1.1  christos 	  stack_offset += align_up (len, 4);
   1117  1.1  christos 	}
   1118  1.1  christos     }
   1119  1.1  christos 
   1120  1.1  christos   regcache_cooked_write_signed (regcache, TIC6X_SP_REGNUM, sp);
   1121  1.1  christos 
   1122  1.1  christos   /* Return adjusted stack pointer.  */
   1123  1.1  christos   return sp;
   1124  1.1  christos }
   1125  1.1  christos 
   1126  1.1  christos /* This is the implementation of gdbarch method in_function_epilogue_p.  */
   1127  1.1  christos 
   1128  1.1  christos static int
   1129  1.1  christos tic6x_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
   1130  1.1  christos {
   1131  1.1  christos   unsigned long inst = tic6x_fetch_instruction (gdbarch, pc);
   1132  1.1  christos   /* Normally, the epilogue is composed by instruction `b .S2 b3'.  */
   1133  1.1  christos   if ((inst & 0x0f83effc) == 0x360)
   1134  1.1  christos     {
   1135  1.1  christos       unsigned int src2 = tic6x_register_number ((inst >> 18) & 0x1f,
   1136  1.1  christos 						 INST_S_BIT (inst),
   1137  1.1  christos 						 INST_X_BIT (inst));
   1138  1.1  christos       if (src2 == TIC6X_RA_REGNUM)
   1139  1.1  christos 	return 1;
   1140  1.1  christos     }
   1141  1.1  christos 
   1142  1.1  christos   return 0;
   1143  1.1  christos }
   1144  1.1  christos 
   1145  1.1  christos /* This is the implementation of gdbarch method get_longjmp_target.  */
   1146  1.1  christos 
   1147  1.1  christos static int
   1148  1.1  christos tic6x_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
   1149  1.1  christos {
   1150  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (frame);
   1151  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   1152  1.1  christos   CORE_ADDR jb_addr;
   1153  1.1  christos   gdb_byte buf[4];
   1154  1.1  christos 
   1155  1.1  christos   /* JMP_BUF is passed by reference in A4.  */
   1156  1.1  christos   jb_addr = get_frame_register_unsigned (frame, 4);
   1157  1.1  christos 
   1158  1.1  christos   /* JMP_BUF contains 13 elements of type int, and return address is stored
   1159  1.1  christos      in the last slot.  */
   1160  1.1  christos   if (target_read_memory (jb_addr + 12 * 4, buf, 4))
   1161  1.1  christos     return 0;
   1162  1.1  christos 
   1163  1.1  christos   *pc = extract_unsigned_integer (buf, 4, byte_order);
   1164  1.1  christos 
   1165  1.1  christos   return 1;
   1166  1.1  christos }
   1167  1.1  christos 
   1168  1.1  christos /* This is the implementation of gdbarch method
   1169  1.1  christos    return_in_first_hidden_param_p.  */
   1170  1.1  christos 
   1171  1.1  christos static int
   1172  1.1  christos tic6x_return_in_first_hidden_param_p (struct gdbarch *gdbarch,
   1173  1.1  christos 				      struct type *type)
   1174  1.1  christos {
   1175  1.1  christos   return 0;
   1176  1.1  christos }
   1177  1.1  christos 
   1178  1.1  christos static struct gdbarch *
   1179  1.1  christos tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   1180  1.1  christos {
   1181  1.1  christos   struct gdbarch *gdbarch;
   1182  1.1  christos   struct gdbarch_tdep *tdep;
   1183  1.1  christos   struct tdesc_arch_data *tdesc_data = NULL;
   1184  1.1  christos   const struct target_desc *tdesc = info.target_desc;
   1185  1.1  christos   int has_gp = 0;
   1186  1.1  christos 
   1187  1.1  christos   /* Check any target description for validity.  */
   1188  1.1  christos   if (tdesc_has_registers (tdesc))
   1189  1.1  christos     {
   1190  1.1  christos       const struct tdesc_feature *feature;
   1191  1.1  christos       int valid_p, i;
   1192  1.1  christos 
   1193  1.1  christos       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.core");
   1194  1.1  christos 
   1195  1.1  christos       if (feature == NULL)
   1196  1.1  christos 	return NULL;
   1197  1.1  christos 
   1198  1.1  christos       tdesc_data = tdesc_data_alloc ();
   1199  1.1  christos 
   1200  1.1  christos       valid_p = 1;
   1201  1.1  christos       for (i = 0; i < 32; i++)	/* A0 - A15, B0 - B15 */
   1202  1.1  christos 	valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
   1203  1.1  christos 					    tic6x_register_names[i]);
   1204  1.1  christos 
   1205  1.1  christos       /* CSR */
   1206  1.1  christos       valid_p &= tdesc_numbered_register (feature, tdesc_data, i++,
   1207  1.1  christos 					  tic6x_register_names[TIC6X_CSR_REGNUM]);
   1208  1.1  christos       valid_p &= tdesc_numbered_register (feature, tdesc_data, i++,
   1209  1.1  christos 					  tic6x_register_names[TIC6X_PC_REGNUM]);
   1210  1.1  christos 
   1211  1.1  christos       if (!valid_p)
   1212  1.1  christos 	{
   1213  1.1  christos 	  tdesc_data_cleanup (tdesc_data);
   1214  1.1  christos 	  return NULL;
   1215  1.1  christos 	}
   1216  1.1  christos 
   1217  1.1  christos       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.gp");
   1218  1.1  christos       if (feature)
   1219  1.1  christos 	{
   1220  1.1  christos 	  int j = 0;
   1221  1.1  christos 	  static const char *const gp[] =
   1222  1.1  christos 	    {
   1223  1.1  christos 	      "A16", "A17", "A18", "A19", "A20", "A21", "A22", "A23",
   1224  1.1  christos 	      "A24", "A25", "A26", "A27", "A28", "A29", "A30", "A31",
   1225  1.1  christos 	      "B16", "B17", "B18", "B19", "B20", "B21", "B22", "B23",
   1226  1.1  christos 	      "B24", "B25", "B26", "B27", "B28", "B29", "B30", "B31",
   1227  1.1  christos 	    };
   1228  1.1  christos 
   1229  1.1  christos 	  has_gp = 1;
   1230  1.1  christos 	  valid_p = 1;
   1231  1.1  christos 	  for (j = 0; j < 32; j++)	/* A16 - A31, B16 - B31 */
   1232  1.1  christos 	    valid_p &= tdesc_numbered_register (feature, tdesc_data, i++,
   1233  1.1  christos 						gp[j]);
   1234  1.1  christos 
   1235  1.1  christos 	  if (!valid_p)
   1236  1.1  christos 	    {
   1237  1.1  christos 	      tdesc_data_cleanup (tdesc_data);
   1238  1.1  christos 	      return NULL;
   1239  1.1  christos 	    }
   1240  1.1  christos 	}
   1241  1.1  christos 
   1242  1.1  christos       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.c6xp");
   1243  1.1  christos       if (feature)
   1244  1.1  christos 	{
   1245  1.1  christos 	  valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "TSR");
   1246  1.1  christos 	  valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "ILC");
   1247  1.1  christos 	  valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "RILC");
   1248  1.1  christos 
   1249  1.1  christos 	  if (!valid_p)
   1250  1.1  christos 	    {
   1251  1.1  christos 	      tdesc_data_cleanup (tdesc_data);
   1252  1.1  christos 	      return NULL;
   1253  1.1  christos 	    }
   1254  1.1  christos 	}
   1255  1.1  christos 
   1256  1.1  christos     }
   1257  1.1  christos 
   1258  1.1  christos   /* Find a candidate among extant architectures.  */
   1259  1.1  christos   for (arches = gdbarch_list_lookup_by_info (arches, &info);
   1260  1.1  christos        arches != NULL;
   1261  1.1  christos        arches = gdbarch_list_lookup_by_info (arches->next, &info))
   1262  1.1  christos     {
   1263  1.1  christos       tdep = gdbarch_tdep (arches->gdbarch);
   1264  1.1  christos 
   1265  1.1  christos       if (has_gp != tdep->has_gp)
   1266  1.1  christos 	continue;
   1267  1.1  christos 
   1268  1.1  christos       if (tdep && tdep->breakpoint)
   1269  1.1  christos 	return arches->gdbarch;
   1270  1.1  christos     }
   1271  1.1  christos 
   1272  1.1  christos   tdep = xcalloc (1, sizeof (struct gdbarch_tdep));
   1273  1.1  christos 
   1274  1.1  christos   tdep->has_gp = has_gp;
   1275  1.1  christos   gdbarch = gdbarch_alloc (&info, tdep);
   1276  1.1  christos 
   1277  1.1  christos   /* Data type sizes.  */
   1278  1.1  christos   set_gdbarch_ptr_bit (gdbarch, 32);
   1279  1.1  christos   set_gdbarch_addr_bit (gdbarch, 32);
   1280  1.1  christos   set_gdbarch_short_bit (gdbarch, 16);
   1281  1.1  christos   set_gdbarch_int_bit (gdbarch, 32);
   1282  1.1  christos   set_gdbarch_long_bit (gdbarch, 32);
   1283  1.1  christos   set_gdbarch_long_long_bit (gdbarch, 64);
   1284  1.1  christos   set_gdbarch_float_bit (gdbarch, 32);
   1285  1.1  christos   set_gdbarch_double_bit (gdbarch, 64);
   1286  1.1  christos 
   1287  1.1  christos   set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
   1288  1.1  christos   set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
   1289  1.1  christos 
   1290  1.1  christos   /* The register set.  */
   1291  1.1  christos   set_gdbarch_num_regs (gdbarch, TIC6X_NUM_REGS);
   1292  1.1  christos   set_gdbarch_sp_regnum (gdbarch, TIC6X_SP_REGNUM);
   1293  1.1  christos   set_gdbarch_pc_regnum (gdbarch, TIC6X_PC_REGNUM);
   1294  1.1  christos 
   1295  1.1  christos   set_gdbarch_register_name (gdbarch, tic6x_register_name);
   1296  1.1  christos   set_gdbarch_register_type (gdbarch, tic6x_register_type);
   1297  1.1  christos 
   1298  1.1  christos   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
   1299  1.1  christos 
   1300  1.1  christos   set_gdbarch_skip_prologue (gdbarch, tic6x_skip_prologue);
   1301  1.1  christos   set_gdbarch_breakpoint_from_pc (gdbarch, tic6x_breakpoint_from_pc);
   1302  1.1  christos 
   1303  1.1  christos   set_gdbarch_unwind_pc (gdbarch, tic6x_unwind_pc);
   1304  1.1  christos   set_gdbarch_unwind_sp (gdbarch, tic6x_unwind_sp);
   1305  1.1  christos 
   1306  1.1  christos   /* Unwinding.  */
   1307  1.1  christos   dwarf2_append_unwinders (gdbarch);
   1308  1.1  christos 
   1309  1.1  christos   frame_unwind_append_unwinder (gdbarch, &tic6x_stub_unwind);
   1310  1.1  christos   frame_unwind_append_unwinder (gdbarch, &tic6x_frame_unwind);
   1311  1.1  christos 
   1312  1.1  christos   dwarf2_frame_set_init_reg (gdbarch, tic6x_dwarf2_frame_init_reg);
   1313  1.1  christos 
   1314  1.1  christos   /* Single stepping.  */
   1315  1.1  christos   set_gdbarch_software_single_step (gdbarch, tic6x_software_single_step);
   1316  1.1  christos 
   1317  1.1  christos   set_gdbarch_print_insn (gdbarch, tic6x_print_insn);
   1318  1.1  christos 
   1319  1.1  christos   /* Call dummy code.  */
   1320  1.1  christos   set_gdbarch_frame_align (gdbarch, tic6x_frame_align);
   1321  1.1  christos 
   1322  1.1  christos   set_gdbarch_return_value (gdbarch, tic6x_return_value);
   1323  1.1  christos 
   1324  1.1  christos   set_gdbarch_dummy_id (gdbarch, tic6x_dummy_id);
   1325  1.1  christos 
   1326  1.1  christos   /* Enable inferior call support.  */
   1327  1.1  christos   set_gdbarch_push_dummy_call (gdbarch, tic6x_push_dummy_call);
   1328  1.1  christos 
   1329  1.1  christos   set_gdbarch_get_longjmp_target (gdbarch, tic6x_get_longjmp_target);
   1330  1.1  christos 
   1331  1.1  christos   set_gdbarch_in_function_epilogue_p (gdbarch, tic6x_in_function_epilogue_p);
   1332  1.1  christos 
   1333  1.1  christos   set_gdbarch_return_in_first_hidden_param_p (gdbarch,
   1334  1.1  christos 					      tic6x_return_in_first_hidden_param_p);
   1335  1.1  christos 
   1336  1.1  christos   /* Hook in ABI-specific overrides, if they have been registered.  */
   1337  1.1  christos   gdbarch_init_osabi (info, gdbarch);
   1338  1.1  christos 
   1339  1.1  christos   if (tdesc_data)
   1340  1.1  christos     tdesc_use_registers (gdbarch, tdesc, tdesc_data);
   1341  1.1  christos 
   1342  1.1  christos   return gdbarch;
   1343  1.1  christos }
   1344  1.1  christos 
   1345  1.1  christos /* -Wmissing-prototypes */
   1346  1.1  christos extern initialize_file_ftype _initialize_tic6x_tdep;
   1347  1.1  christos 
   1348  1.1  christos void
   1349  1.1  christos _initialize_tic6x_tdep (void)
   1350  1.1  christos {
   1351  1.1  christos   register_gdbarch_init (bfd_arch_tic6x, tic6x_gdbarch_init);
   1352  1.1  christos 
   1353  1.1  christos   initialize_tdesc_tic6x_c64xp ();
   1354  1.1  christos   initialize_tdesc_tic6x_c64x ();
   1355  1.1  christos   initialize_tdesc_tic6x_c62x ();
   1356  1.1  christos }
   1357