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