Home | History | Annotate | Line # | Download | only in gdb
target-descriptions.c revision 1.1.1.8
      1      1.1  christos /* Target description support for GDB.
      2      1.1  christos 
      3  1.1.1.8  christos    Copyright (C) 2006-2023 Free Software Foundation, Inc.
      4      1.1  christos 
      5      1.1  christos    Contributed by CodeSourcery.
      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 "arch-utils.h"
     24      1.1  christos #include "gdbcmd.h"
     25      1.1  christos #include "gdbtypes.h"
     26      1.1  christos #include "reggroups.h"
     27      1.1  christos #include "target.h"
     28      1.1  christos #include "target-descriptions.h"
     29      1.1  christos #include "xml-support.h"
     30      1.1  christos #include "xml-tdesc.h"
     31      1.1  christos #include "osabi.h"
     32      1.1  christos 
     33  1.1.1.8  christos #include "gdbsupport/gdb_obstack.h"
     34      1.1  christos #include "hashtab.h"
     35      1.1  christos #include "inferior.h"
     36  1.1.1.6  christos #include <algorithm>
     37  1.1.1.6  christos #include "completer.h"
     38  1.1.1.6  christos #include "readline/tilde.h" /* tilde_expand */
     39      1.1  christos 
     40      1.1  christos /* Types.  */
     41      1.1  christos 
     42  1.1.1.6  christos struct property
     43      1.1  christos {
     44  1.1.1.6  christos   property (const std::string &key_, const std::string &value_)
     45  1.1.1.6  christos   : key (key_), value (value_)
     46  1.1.1.6  christos   {}
     47  1.1.1.6  christos 
     48  1.1.1.6  christos   std::string key;
     49  1.1.1.6  christos   std::string value;
     50  1.1.1.3  christos };
     51  1.1.1.3  christos 
     52  1.1.1.6  christos /* Convert a tdesc_type to a gdb type.  */
     53  1.1.1.6  christos 
     54  1.1.1.6  christos static type *
     55  1.1.1.6  christos make_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *ttype)
     56      1.1  christos {
     57  1.1.1.6  christos   class gdb_type_creator : public tdesc_element_visitor
     58  1.1.1.6  christos   {
     59  1.1.1.6  christos   public:
     60  1.1.1.6  christos     gdb_type_creator (struct gdbarch *gdbarch)
     61  1.1.1.6  christos       : m_gdbarch (gdbarch)
     62  1.1.1.6  christos     {}
     63      1.1  christos 
     64  1.1.1.6  christos     type *get_type ()
     65  1.1.1.6  christos     {
     66  1.1.1.6  christos       return m_type;
     67  1.1.1.6  christos     }
     68      1.1  christos 
     69  1.1.1.6  christos     void visit (const tdesc_type_builtin *e) override
     70  1.1.1.6  christos     {
     71  1.1.1.6  christos       switch (e->kind)
     72  1.1.1.6  christos 	{
     73  1.1.1.6  christos 	  /* Predefined types.  */
     74  1.1.1.6  christos 	case TDESC_TYPE_BOOL:
     75  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_bool;
     76  1.1.1.6  christos 	  return;
     77  1.1.1.6  christos 	case TDESC_TYPE_INT8:
     78  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_int8;
     79  1.1.1.6  christos 	  return;
     80  1.1.1.6  christos 	case TDESC_TYPE_INT16:
     81  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_int16;
     82  1.1.1.6  christos 	  return;
     83  1.1.1.6  christos 	case TDESC_TYPE_INT32:
     84  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_int32;
     85  1.1.1.6  christos 	  return;
     86  1.1.1.6  christos 	case TDESC_TYPE_INT64:
     87  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_int64;
     88  1.1.1.6  christos 	  return;
     89  1.1.1.6  christos 	case TDESC_TYPE_INT128:
     90  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_int128;
     91  1.1.1.6  christos 	  return;
     92  1.1.1.6  christos 	case TDESC_TYPE_UINT8:
     93  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_uint8;
     94  1.1.1.6  christos 	  return;
     95  1.1.1.6  christos 	case TDESC_TYPE_UINT16:
     96  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_uint16;
     97  1.1.1.6  christos 	  return;
     98  1.1.1.6  christos 	case TDESC_TYPE_UINT32:
     99  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_uint32;
    100  1.1.1.6  christos 	  return;
    101  1.1.1.6  christos 	case TDESC_TYPE_UINT64:
    102  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_uint64;
    103  1.1.1.6  christos 	  return;
    104  1.1.1.6  christos 	case TDESC_TYPE_UINT128:
    105  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_uint128;
    106  1.1.1.6  christos 	  return;
    107  1.1.1.6  christos 	case TDESC_TYPE_CODE_PTR:
    108  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_func_ptr;
    109  1.1.1.6  christos 	  return;
    110  1.1.1.6  christos 	case TDESC_TYPE_DATA_PTR:
    111  1.1.1.6  christos 	  m_type = builtin_type (m_gdbarch)->builtin_data_ptr;
    112  1.1.1.6  christos 	  return;
    113  1.1.1.6  christos 	}
    114  1.1.1.6  christos 
    115  1.1.1.6  christos       m_type = tdesc_find_type (m_gdbarch, e->name.c_str ());
    116  1.1.1.6  christos       if (m_type != NULL)
    117  1.1.1.6  christos 	return;
    118  1.1.1.6  christos 
    119  1.1.1.6  christos       switch (e->kind)
    120  1.1.1.6  christos 	{
    121  1.1.1.7  christos 	case TDESC_TYPE_IEEE_HALF:
    122  1.1.1.7  christos 	  m_type = arch_float_type (m_gdbarch, -1, "builtin_type_ieee_half",
    123  1.1.1.7  christos 				    floatformats_ieee_half);
    124  1.1.1.7  christos 	  return;
    125  1.1.1.7  christos 
    126  1.1.1.6  christos 	case TDESC_TYPE_IEEE_SINGLE:
    127  1.1.1.6  christos 	  m_type = arch_float_type (m_gdbarch, -1, "builtin_type_ieee_single",
    128  1.1.1.6  christos 				    floatformats_ieee_single);
    129  1.1.1.6  christos 	  return;
    130  1.1.1.6  christos 
    131  1.1.1.6  christos 	case TDESC_TYPE_IEEE_DOUBLE:
    132  1.1.1.6  christos 	  m_type = arch_float_type (m_gdbarch, -1, "builtin_type_ieee_double",
    133  1.1.1.6  christos 				    floatformats_ieee_double);
    134  1.1.1.6  christos 	  return;
    135  1.1.1.6  christos 	case TDESC_TYPE_ARM_FPA_EXT:
    136  1.1.1.6  christos 	  m_type = arch_float_type (m_gdbarch, -1, "builtin_type_arm_ext",
    137  1.1.1.6  christos 				    floatformats_arm_ext);
    138  1.1.1.6  christos 	  return;
    139  1.1.1.6  christos 
    140  1.1.1.6  christos 	case TDESC_TYPE_I387_EXT:
    141  1.1.1.6  christos 	  m_type = arch_float_type (m_gdbarch, -1, "builtin_type_i387_ext",
    142  1.1.1.6  christos 				    floatformats_i387_ext);
    143  1.1.1.6  christos 	  return;
    144  1.1.1.7  christos 
    145  1.1.1.7  christos 	case TDESC_TYPE_BFLOAT16:
    146  1.1.1.7  christos 	  m_type = arch_float_type (m_gdbarch, -1, "builtin_type_bfloat16",
    147  1.1.1.7  christos 				    floatformats_bfloat16);
    148  1.1.1.7  christos 	  return;
    149  1.1.1.6  christos 	}
    150  1.1.1.6  christos 
    151  1.1.1.8  christos       internal_error ("Type \"%s\" has an unknown kind %d",
    152  1.1.1.6  christos 		      e->name.c_str (), e->kind);
    153  1.1.1.6  christos     }
    154  1.1.1.6  christos 
    155  1.1.1.6  christos     void visit (const tdesc_type_vector *e) override
    156  1.1.1.6  christos     {
    157  1.1.1.6  christos       m_type = tdesc_find_type (m_gdbarch, e->name.c_str ());
    158  1.1.1.6  christos       if (m_type != NULL)
    159  1.1.1.6  christos 	return;
    160  1.1.1.6  christos 
    161  1.1.1.6  christos       type *element_gdb_type = make_gdb_type (m_gdbarch, e->element_type);
    162  1.1.1.6  christos       m_type = init_vector_type (element_gdb_type, e->count);
    163  1.1.1.7  christos       m_type->set_name (xstrdup (e->name.c_str ()));
    164  1.1.1.6  christos       return;
    165  1.1.1.6  christos     }
    166  1.1.1.6  christos 
    167  1.1.1.6  christos     void visit (const tdesc_type_with_fields *e) override
    168  1.1.1.6  christos     {
    169  1.1.1.6  christos       m_type = tdesc_find_type (m_gdbarch, e->name.c_str ());
    170  1.1.1.6  christos       if (m_type != NULL)
    171  1.1.1.6  christos 	return;
    172  1.1.1.6  christos 
    173  1.1.1.6  christos       switch (e->kind)
    174  1.1.1.6  christos 	{
    175  1.1.1.6  christos 	case TDESC_TYPE_STRUCT:
    176  1.1.1.6  christos 	  make_gdb_type_struct (e);
    177  1.1.1.6  christos 	  return;
    178  1.1.1.6  christos 	case TDESC_TYPE_UNION:
    179  1.1.1.6  christos 	  make_gdb_type_union (e);
    180  1.1.1.6  christos 	  return;
    181  1.1.1.6  christos 	case TDESC_TYPE_FLAGS:
    182  1.1.1.6  christos 	  make_gdb_type_flags (e);
    183  1.1.1.6  christos 	  return;
    184  1.1.1.6  christos 	case TDESC_TYPE_ENUM:
    185  1.1.1.6  christos 	  make_gdb_type_enum (e);
    186  1.1.1.6  christos 	  return;
    187  1.1.1.6  christos 	}
    188  1.1.1.6  christos 
    189  1.1.1.8  christos       internal_error ("Type \"%s\" has an unknown kind %d",
    190  1.1.1.6  christos 		      e->name.c_str (), e->kind);
    191  1.1.1.6  christos     }
    192  1.1.1.6  christos 
    193  1.1.1.6  christos   private:
    194  1.1.1.6  christos 
    195  1.1.1.6  christos     void make_gdb_type_struct (const tdesc_type_with_fields *e)
    196  1.1.1.6  christos     {
    197  1.1.1.6  christos       m_type = arch_composite_type (m_gdbarch, NULL, TYPE_CODE_STRUCT);
    198  1.1.1.7  christos       m_type->set_name (xstrdup (e->name.c_str ()));
    199  1.1.1.6  christos 
    200  1.1.1.6  christos       for (const tdesc_type_field &f : e->fields)
    201  1.1.1.6  christos 	{
    202  1.1.1.6  christos 	  if (f.start != -1 && f.end != -1)
    203  1.1.1.6  christos 	    {
    204  1.1.1.6  christos 	      /* Bitfield.  */
    205  1.1.1.6  christos 	      struct field *fld;
    206  1.1.1.6  christos 	      struct type *field_gdb_type;
    207  1.1.1.6  christos 	      int bitsize, total_size;
    208  1.1.1.6  christos 
    209  1.1.1.6  christos 	      /* This invariant should be preserved while creating types.  */
    210  1.1.1.6  christos 	      gdb_assert (e->size != 0);
    211  1.1.1.6  christos 	      if (f.type != NULL)
    212  1.1.1.6  christos 		field_gdb_type = make_gdb_type (m_gdbarch, f.type);
    213  1.1.1.6  christos 	      else if (e->size > 4)
    214  1.1.1.6  christos 		field_gdb_type = builtin_type (m_gdbarch)->builtin_uint64;
    215  1.1.1.6  christos 	      else
    216  1.1.1.6  christos 		field_gdb_type = builtin_type (m_gdbarch)->builtin_uint32;
    217  1.1.1.6  christos 
    218  1.1.1.6  christos 	      fld = append_composite_type_field_raw
    219  1.1.1.6  christos 		      (m_type, xstrdup (f.name.c_str ()), field_gdb_type);
    220  1.1.1.6  christos 
    221  1.1.1.6  christos 	      /* For little-endian, BITPOS counts from the LSB of
    222  1.1.1.6  christos 		 the structure and marks the LSB of the field.  For
    223  1.1.1.6  christos 		 big-endian, BITPOS counts from the MSB of the
    224  1.1.1.6  christos 		 structure and marks the MSB of the field.  Either
    225  1.1.1.6  christos 		 way, it is the number of bits to the "left" of the
    226  1.1.1.6  christos 		 field.  To calculate this in big-endian, we need
    227  1.1.1.6  christos 		 the total size of the structure.  */
    228  1.1.1.6  christos 	      bitsize = f.end - f.start + 1;
    229  1.1.1.6  christos 	      total_size = e->size * TARGET_CHAR_BIT;
    230  1.1.1.7  christos 	      if (gdbarch_byte_order (m_gdbarch) == BFD_ENDIAN_BIG)
    231  1.1.1.8  christos 		fld->set_loc_bitpos (total_size - f.start - bitsize);
    232  1.1.1.6  christos 	      else
    233  1.1.1.8  christos 		fld->set_loc_bitpos (f.start);
    234  1.1.1.6  christos 	      FIELD_BITSIZE (fld[0]) = bitsize;
    235  1.1.1.6  christos 	    }
    236  1.1.1.6  christos 	  else
    237  1.1.1.6  christos 	    {
    238  1.1.1.6  christos 	      gdb_assert (f.start == -1 && f.end == -1);
    239  1.1.1.6  christos 	      type *field_gdb_type = make_gdb_type (m_gdbarch, f.type);
    240  1.1.1.6  christos 	      append_composite_type_field (m_type,
    241  1.1.1.6  christos 					   xstrdup (f.name.c_str ()),
    242  1.1.1.6  christos 					   field_gdb_type);
    243  1.1.1.6  christos 	    }
    244  1.1.1.6  christos 	}
    245  1.1.1.6  christos 
    246  1.1.1.6  christos       if (e->size != 0)
    247  1.1.1.8  christos 	m_type->set_length (e->size);
    248  1.1.1.6  christos     }
    249  1.1.1.6  christos 
    250  1.1.1.6  christos     void make_gdb_type_union (const tdesc_type_with_fields *e)
    251  1.1.1.6  christos     {
    252  1.1.1.6  christos       m_type = arch_composite_type (m_gdbarch, NULL, TYPE_CODE_UNION);
    253  1.1.1.7  christos       m_type->set_name (xstrdup (e->name.c_str ()));
    254  1.1.1.6  christos 
    255  1.1.1.6  christos       for (const tdesc_type_field &f : e->fields)
    256  1.1.1.6  christos 	{
    257  1.1.1.6  christos 	  type* field_gdb_type = make_gdb_type (m_gdbarch, f.type);
    258  1.1.1.6  christos 	  append_composite_type_field (m_type, xstrdup (f.name.c_str ()),
    259  1.1.1.6  christos 				       field_gdb_type);
    260  1.1.1.6  christos 
    261  1.1.1.6  christos 	  /* If any of the children of a union are vectors, flag the
    262  1.1.1.6  christos 	     union as a vector also.  This allows e.g. a union of two
    263  1.1.1.6  christos 	     vector types to show up automatically in "info vector".  */
    264  1.1.1.8  christos 	  if (field_gdb_type->is_vector ())
    265  1.1.1.8  christos 	    m_type->set_is_vector (true);
    266  1.1.1.6  christos 	}
    267  1.1.1.6  christos     }
    268  1.1.1.6  christos 
    269  1.1.1.6  christos     void make_gdb_type_flags (const tdesc_type_with_fields *e)
    270  1.1.1.6  christos     {
    271  1.1.1.6  christos       m_type = arch_flags_type (m_gdbarch, e->name.c_str (),
    272  1.1.1.6  christos 				e->size * TARGET_CHAR_BIT);
    273  1.1.1.6  christos 
    274  1.1.1.6  christos       for (const tdesc_type_field &f : e->fields)
    275  1.1.1.6  christos 	{
    276  1.1.1.6  christos 	  int bitsize = f.end - f.start + 1;
    277  1.1.1.6  christos 
    278  1.1.1.6  christos 	  gdb_assert (f.type != NULL);
    279  1.1.1.6  christos 	  type *field_gdb_type = make_gdb_type (m_gdbarch, f.type);
    280  1.1.1.6  christos 	  append_flags_type_field (m_type, f.start, bitsize,
    281  1.1.1.6  christos 				   field_gdb_type, f.name.c_str ());
    282  1.1.1.6  christos 	}
    283  1.1.1.6  christos     }
    284  1.1.1.6  christos 
    285  1.1.1.6  christos     void make_gdb_type_enum (const tdesc_type_with_fields *e)
    286      1.1  christos     {
    287  1.1.1.6  christos       m_type = arch_type (m_gdbarch, TYPE_CODE_ENUM, e->size * TARGET_CHAR_BIT,
    288  1.1.1.6  christos 			  e->name.c_str ());
    289  1.1.1.6  christos 
    290  1.1.1.8  christos       m_type->set_is_unsigned (true);
    291  1.1.1.8  christos 
    292  1.1.1.6  christos       for (const tdesc_type_field &f : e->fields)
    293  1.1.1.6  christos 	{
    294  1.1.1.6  christos 	  struct field *fld
    295  1.1.1.6  christos 	    = append_composite_type_field_raw (m_type,
    296  1.1.1.6  christos 					       xstrdup (f.name.c_str ()),
    297  1.1.1.6  christos 					       NULL);
    298  1.1.1.6  christos 
    299  1.1.1.8  christos 	  fld->set_loc_enumval (f.start);
    300  1.1.1.6  christos 	}
    301  1.1.1.6  christos     }
    302  1.1.1.6  christos 
    303  1.1.1.6  christos     /* The gdbarch used.  */
    304  1.1.1.6  christos     struct gdbarch *m_gdbarch;
    305  1.1.1.6  christos 
    306  1.1.1.6  christos     /* The type created.  */
    307  1.1.1.6  christos     type *m_type;
    308  1.1.1.6  christos   };
    309  1.1.1.6  christos 
    310  1.1.1.6  christos   gdb_type_creator gdb_type (gdbarch);
    311  1.1.1.6  christos   ttype->accept (gdb_type);
    312  1.1.1.6  christos   return gdb_type.get_type ();
    313  1.1.1.6  christos }
    314      1.1  christos 
    315  1.1.1.7  christos /* Wrapper around bfd_arch_info_type.  A class with this name is used in
    316  1.1.1.7  christos    the API that is shared between gdb and gdbserver code, but gdbserver
    317  1.1.1.7  christos    doesn't use compatibility information, so its version of this class is
    318  1.1.1.7  christos    empty.  */
    319  1.1.1.7  christos 
    320  1.1.1.7  christos class tdesc_compatible_info
    321  1.1.1.7  christos {
    322  1.1.1.7  christos public:
    323  1.1.1.7  christos   /* Constructor.  */
    324  1.1.1.7  christos   explicit tdesc_compatible_info (const bfd_arch_info_type *arch)
    325  1.1.1.7  christos     : m_arch (arch)
    326  1.1.1.7  christos   { /* Nothing.  */ }
    327  1.1.1.7  christos 
    328  1.1.1.7  christos   /* Access the contained pointer.  */
    329  1.1.1.7  christos   const bfd_arch_info_type *arch () const
    330  1.1.1.7  christos   { return m_arch; }
    331  1.1.1.7  christos 
    332  1.1.1.7  christos private:
    333  1.1.1.7  christos   /* Architecture information looked up from the <compatible> entity within
    334  1.1.1.7  christos      a target description.  */
    335  1.1.1.7  christos   const bfd_arch_info_type *m_arch;
    336  1.1.1.7  christos };
    337  1.1.1.7  christos 
    338      1.1  christos /* A target description.  */
    339      1.1  christos 
    340  1.1.1.6  christos struct target_desc : tdesc_element
    341      1.1  christos {
    342  1.1.1.6  christos   target_desc ()
    343  1.1.1.6  christos   {}
    344  1.1.1.6  christos 
    345  1.1.1.6  christos   virtual ~target_desc () = default;
    346  1.1.1.6  christos 
    347  1.1.1.6  christos   target_desc (const target_desc &) = delete;
    348  1.1.1.6  christos   void operator= (const target_desc &) = delete;
    349  1.1.1.6  christos 
    350      1.1  christos   /* The architecture reported by the target, if any.  */
    351  1.1.1.6  christos   const struct bfd_arch_info *arch = NULL;
    352      1.1  christos 
    353      1.1  christos   /* The osabi reported by the target, if any; GDB_OSABI_UNKNOWN
    354      1.1  christos      otherwise.  */
    355  1.1.1.6  christos   enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
    356      1.1  christos 
    357      1.1  christos   /* The list of compatible architectures reported by the target.  */
    358  1.1.1.7  christos   std::vector<tdesc_compatible_info_up> compatible;
    359      1.1  christos 
    360      1.1  christos   /* Any architecture-specific properties specified by the target.  */
    361  1.1.1.6  christos   std::vector<property> properties;
    362      1.1  christos 
    363      1.1  christos   /* The features associated with this target.  */
    364  1.1.1.6  christos   std::vector<tdesc_feature_up> features;
    365  1.1.1.6  christos 
    366  1.1.1.6  christos   /* Used to cache the generated xml version of the target description.  */
    367  1.1.1.6  christos   mutable char *xmltarget = nullptr;
    368  1.1.1.6  christos 
    369  1.1.1.6  christos   void accept (tdesc_element_visitor &v) const override
    370  1.1.1.6  christos   {
    371  1.1.1.6  christos     v.visit_pre (this);
    372  1.1.1.6  christos 
    373  1.1.1.6  christos     for (const tdesc_feature_up &feature : features)
    374  1.1.1.6  christos       feature->accept (v);
    375  1.1.1.6  christos 
    376  1.1.1.6  christos     v.visit_post (this);
    377  1.1.1.6  christos   }
    378  1.1.1.6  christos 
    379  1.1.1.6  christos   bool operator== (const target_desc &other) const
    380  1.1.1.6  christos   {
    381  1.1.1.6  christos     if (arch != other.arch)
    382  1.1.1.6  christos       return false;
    383  1.1.1.6  christos 
    384  1.1.1.6  christos     if (osabi != other.osabi)
    385  1.1.1.6  christos       return false;
    386  1.1.1.6  christos 
    387  1.1.1.6  christos     if (features.size () != other.features.size ())
    388  1.1.1.6  christos       return false;
    389  1.1.1.6  christos 
    390  1.1.1.6  christos     for (int ix = 0; ix < features.size (); ix++)
    391  1.1.1.6  christos       {
    392  1.1.1.6  christos 	const tdesc_feature_up &feature1 = features[ix];
    393  1.1.1.6  christos 	const tdesc_feature_up &feature2 = other.features[ix];
    394  1.1.1.6  christos 
    395  1.1.1.6  christos 	if (feature1 != feature2 && *feature1 != *feature2)
    396  1.1.1.6  christos 	  return false;
    397  1.1.1.6  christos       }
    398  1.1.1.6  christos 
    399  1.1.1.6  christos     return true;
    400  1.1.1.6  christos   }
    401  1.1.1.6  christos 
    402  1.1.1.6  christos   bool operator!= (const target_desc &other) const
    403  1.1.1.6  christos   {
    404  1.1.1.6  christos     return !(*this == other);
    405  1.1.1.6  christos   }
    406      1.1  christos };
    407      1.1  christos 
    408      1.1  christos /* Per-architecture data associated with a target description.  The
    409      1.1  christos    target description may be shared by multiple architectures, but
    410      1.1  christos    this data is private to one gdbarch.  */
    411      1.1  christos 
    412  1.1.1.6  christos struct tdesc_arch_reg
    413      1.1  christos {
    414  1.1.1.6  christos   tdesc_arch_reg (tdesc_reg *reg_, struct type *type_)
    415  1.1.1.6  christos   : reg (reg_), type (type_)
    416  1.1.1.6  christos   {}
    417  1.1.1.6  christos 
    418      1.1  christos   struct tdesc_reg *reg;
    419      1.1  christos   struct type *type;
    420  1.1.1.6  christos };
    421      1.1  christos 
    422      1.1  christos struct tdesc_arch_data
    423      1.1  christos {
    424      1.1  christos   /* A list of register/type pairs, indexed by GDB's internal register number.
    425      1.1  christos      During initialization of the gdbarch this list is used to store
    426      1.1  christos      registers which the architecture assigns a fixed register number.
    427      1.1  christos      Registers which are NULL in this array, or off the end, are
    428      1.1  christos      treated as zero-sized and nameless (i.e. placeholders in the
    429      1.1  christos      numbering).  */
    430  1.1.1.6  christos   std::vector<tdesc_arch_reg> arch_regs;
    431      1.1  christos 
    432      1.1  christos   /* Functions which report the register name, type, and reggroups for
    433      1.1  christos      pseudo-registers.  */
    434  1.1.1.6  christos   gdbarch_register_name_ftype *pseudo_register_name = NULL;
    435  1.1.1.6  christos   gdbarch_register_type_ftype *pseudo_register_type = NULL;
    436  1.1.1.6  christos   gdbarch_register_reggroup_p_ftype *pseudo_register_reggroup_p = NULL;
    437      1.1  christos };
    438      1.1  christos 
    439      1.1  christos /* Info about an inferior's target description.  There's one of these
    440      1.1  christos    for each inferior.  */
    441      1.1  christos 
    442      1.1  christos struct target_desc_info
    443      1.1  christos {
    444      1.1  christos   /* A flag indicating that a description has already been fetched
    445      1.1  christos      from the target, so it should not be queried again.  */
    446      1.1  christos 
    447  1.1.1.8  christos   bool fetched = false;
    448      1.1  christos 
    449      1.1  christos   /* The description fetched from the target, or NULL if the target
    450      1.1  christos      did not supply any description.  Only valid when
    451  1.1.1.8  christos      FETCHED is set.  Only the description initialization
    452      1.1  christos      code should access this; normally, the description should be
    453      1.1  christos      accessed through the gdbarch object.  */
    454      1.1  christos 
    455  1.1.1.8  christos   const struct target_desc *tdesc = nullptr;
    456      1.1  christos 
    457  1.1.1.8  christos   /* If not empty, the filename to read a target description from, as set by
    458  1.1.1.8  christos      "set tdesc filename ...".
    459      1.1  christos 
    460  1.1.1.8  christos      If empty, there is not filename specified by the user.  */
    461  1.1.1.8  christos 
    462  1.1.1.8  christos   std::string filename;
    463      1.1  christos };
    464      1.1  christos 
    465      1.1  christos /* Get the inferior INF's target description info, allocating one on
    466      1.1  christos    the stop if necessary.  */
    467      1.1  christos 
    468      1.1  christos static struct target_desc_info *
    469      1.1  christos get_tdesc_info (struct inferior *inf)
    470      1.1  christos {
    471      1.1  christos   if (inf->tdesc_info == NULL)
    472  1.1.1.8  christos     inf->tdesc_info = new target_desc_info;
    473  1.1.1.8  christos 
    474      1.1  christos   return inf->tdesc_info;
    475      1.1  christos }
    476      1.1  christos 
    477      1.1  christos /* A handle for architecture-specific data associated with the
    478      1.1  christos    target description (see struct tdesc_arch_data).  */
    479      1.1  christos 
    480  1.1.1.8  christos static const registry<gdbarch>::key<tdesc_arch_data> tdesc_data;
    481  1.1.1.8  christos 
    482  1.1.1.8  christos /* Get or create the tdesc_data.  */
    483  1.1.1.8  christos static tdesc_arch_data *
    484  1.1.1.8  christos get_arch_data (struct gdbarch *gdbarch)
    485  1.1.1.8  christos {
    486  1.1.1.8  christos   tdesc_arch_data *result = tdesc_data.get (gdbarch);
    487  1.1.1.8  christos   if (result == nullptr)
    488  1.1.1.8  christos     result = tdesc_data.emplace (gdbarch);
    489  1.1.1.8  christos   return result;
    490  1.1.1.8  christos }
    491      1.1  christos 
    492      1.1  christos /* See target-descriptions.h.  */
    493      1.1  christos 
    494      1.1  christos int
    495      1.1  christos target_desc_info_from_user_p (struct target_desc_info *info)
    496      1.1  christos {
    497  1.1.1.8  christos   return info != nullptr && !info->filename.empty ();
    498      1.1  christos }
    499      1.1  christos 
    500      1.1  christos /* See target-descriptions.h.  */
    501      1.1  christos 
    502      1.1  christos void
    503      1.1  christos copy_inferior_target_desc_info (struct inferior *destinf, struct inferior *srcinf)
    504      1.1  christos {
    505      1.1  christos   struct target_desc_info *src = get_tdesc_info (srcinf);
    506      1.1  christos   struct target_desc_info *dest = get_tdesc_info (destinf);
    507      1.1  christos 
    508  1.1.1.8  christos   *dest = *src;
    509      1.1  christos }
    510      1.1  christos 
    511      1.1  christos /* See target-descriptions.h.  */
    512      1.1  christos 
    513      1.1  christos void
    514      1.1  christos target_desc_info_free (struct target_desc_info *tdesc_info)
    515      1.1  christos {
    516  1.1.1.8  christos   delete tdesc_info;
    517      1.1  christos }
    518      1.1  christos 
    519      1.1  christos /* The string manipulated by the "set tdesc filename ..." command.  */
    520      1.1  christos 
    521  1.1.1.8  christos static std::string tdesc_filename_cmd_string;
    522      1.1  christos 
    523      1.1  christos /* Fetch the current target's description, and switch the current
    524      1.1  christos    architecture to one which incorporates that description.  */
    525      1.1  christos 
    526      1.1  christos void
    527      1.1  christos target_find_description (void)
    528      1.1  christos {
    529  1.1.1.8  christos   target_desc_info *tdesc_info = get_tdesc_info (current_inferior ());
    530  1.1.1.8  christos 
    531      1.1  christos   /* If we've already fetched a description from the target, don't do
    532      1.1  christos      it again.  This allows a target to fetch the description early,
    533      1.1  christos      during its to_open or to_create_inferior, if it needs extra
    534      1.1  christos      information about the target to initialize.  */
    535  1.1.1.8  christos   if (tdesc_info->fetched)
    536      1.1  christos     return;
    537      1.1  christos 
    538      1.1  christos   /* The current architecture should not have any target description
    539      1.1  christos      specified.  It should have been cleared, e.g. when we
    540      1.1  christos      disconnected from the previous target.  */
    541      1.1  christos   gdb_assert (gdbarch_target_desc (target_gdbarch ()) == NULL);
    542      1.1  christos 
    543      1.1  christos   /* First try to fetch an XML description from the user-specified
    544      1.1  christos      file.  */
    545  1.1.1.8  christos   tdesc_info->tdesc = nullptr;
    546  1.1.1.8  christos   if (!tdesc_info->filename.empty ())
    547  1.1.1.8  christos     tdesc_info->tdesc = file_read_description_xml (tdesc_info->filename.data ());
    548      1.1  christos 
    549      1.1  christos   /* Next try to read the description from the current target using
    550      1.1  christos      target objects.  */
    551  1.1.1.8  christos   if (tdesc_info->tdesc == nullptr)
    552  1.1.1.8  christos     tdesc_info->tdesc = target_read_description_xml
    553  1.1.1.8  christos       (current_inferior ()->top_target ());
    554      1.1  christos 
    555      1.1  christos   /* If that failed try a target-specific hook.  */
    556  1.1.1.8  christos   if (tdesc_info->tdesc == nullptr)
    557  1.1.1.8  christos     tdesc_info->tdesc = target_read_description
    558  1.1.1.8  christos       (current_inferior ()->top_target ());
    559      1.1  christos 
    560      1.1  christos   /* If a non-NULL description was returned, then update the current
    561      1.1  christos      architecture.  */
    562  1.1.1.8  christos   if (tdesc_info->tdesc != nullptr)
    563      1.1  christos     {
    564      1.1  christos       struct gdbarch_info info;
    565      1.1  christos 
    566  1.1.1.8  christos       info.target_desc = tdesc_info->tdesc;
    567      1.1  christos       if (!gdbarch_update_p (info))
    568      1.1  christos 	warning (_("Architecture rejected target-supplied description"));
    569      1.1  christos       else
    570      1.1  christos 	{
    571      1.1  christos 	  struct tdesc_arch_data *data;
    572      1.1  christos 
    573  1.1.1.8  christos 	  data = get_arch_data (target_gdbarch ());
    574  1.1.1.8  christos 	  if (tdesc_has_registers (tdesc_info->tdesc)
    575  1.1.1.6  christos 	      && data->arch_regs.empty ())
    576      1.1  christos 	    warning (_("Target-supplied registers are not supported "
    577      1.1  christos 		       "by the current architecture"));
    578      1.1  christos 	}
    579      1.1  christos     }
    580      1.1  christos 
    581      1.1  christos   /* Now that we know this description is usable, record that we
    582      1.1  christos      fetched it.  */
    583  1.1.1.8  christos   tdesc_info->fetched = true;
    584      1.1  christos }
    585      1.1  christos 
    586      1.1  christos /* Discard any description fetched from the current target, and switch
    587      1.1  christos    the current architecture to one with no target description.  */
    588      1.1  christos 
    589      1.1  christos void
    590      1.1  christos target_clear_description (void)
    591      1.1  christos {
    592  1.1.1.8  christos   target_desc_info *tdesc_info = get_tdesc_info (current_inferior ());
    593      1.1  christos 
    594  1.1.1.8  christos   if (!tdesc_info->fetched)
    595      1.1  christos     return;
    596      1.1  christos 
    597  1.1.1.8  christos   tdesc_info->fetched = false;
    598  1.1.1.8  christos   tdesc_info->tdesc = nullptr;
    599      1.1  christos 
    600  1.1.1.8  christos   gdbarch_info info;
    601      1.1  christos   if (!gdbarch_update_p (info))
    602  1.1.1.8  christos     internal_error (_("Could not remove target-supplied description"));
    603      1.1  christos }
    604      1.1  christos 
    605      1.1  christos /* Return the global current target description.  This should only be
    606      1.1  christos    used by gdbarch initialization code; most access should be through
    607      1.1  christos    an existing gdbarch.  */
    608      1.1  christos 
    609      1.1  christos const struct target_desc *
    610      1.1  christos target_current_description (void)
    611      1.1  christos {
    612  1.1.1.8  christos   target_desc_info *tdesc_info = get_tdesc_info (current_inferior ());
    613  1.1.1.8  christos 
    614  1.1.1.8  christos   if (tdesc_info->fetched)
    615  1.1.1.8  christos     return tdesc_info->tdesc;
    616      1.1  christos 
    617      1.1  christos   return NULL;
    618      1.1  christos }
    619      1.1  christos 
    620      1.1  christos /* Return non-zero if this target description is compatible
    621      1.1  christos    with the given BFD architecture.  */
    622      1.1  christos 
    623      1.1  christos int
    624      1.1  christos tdesc_compatible_p (const struct target_desc *target_desc,
    625      1.1  christos 		    const struct bfd_arch_info *arch)
    626      1.1  christos {
    627  1.1.1.7  christos   for (const tdesc_compatible_info_up &compat : target_desc->compatible)
    628      1.1  christos     {
    629  1.1.1.7  christos       if (compat->arch () == arch
    630  1.1.1.7  christos 	  || arch->compatible (arch, compat->arch ())
    631  1.1.1.7  christos 	  || compat->arch ()->compatible (compat->arch (), arch))
    632      1.1  christos 	return 1;
    633      1.1  christos     }
    634      1.1  christos 
    635      1.1  christos   return 0;
    636      1.1  christos }
    637      1.1  christos 
    638      1.1  christos 
    640      1.1  christos /* Direct accessors for target descriptions.  */
    641      1.1  christos 
    642      1.1  christos /* Return the string value of a property named KEY, or NULL if the
    643      1.1  christos    property was not specified.  */
    644      1.1  christos 
    645      1.1  christos const char *
    646      1.1  christos tdesc_property (const struct target_desc *target_desc, const char *key)
    647  1.1.1.6  christos {
    648  1.1.1.6  christos   for (const property &prop : target_desc->properties)
    649  1.1.1.6  christos     if (prop.key == key)
    650      1.1  christos       return prop.value.c_str ();
    651      1.1  christos 
    652      1.1  christos   return NULL;
    653      1.1  christos }
    654      1.1  christos 
    655      1.1  christos /* Return the BFD architecture associated with this target
    656      1.1  christos    description, or NULL if no architecture was specified.  */
    657      1.1  christos 
    658      1.1  christos const struct bfd_arch_info *
    659      1.1  christos tdesc_architecture (const struct target_desc *target_desc)
    660      1.1  christos {
    661      1.1  christos   return target_desc->arch;
    662      1.1  christos }
    663  1.1.1.7  christos 
    664  1.1.1.6  christos /* See gdbsupport/tdesc.h.  */
    665  1.1.1.6  christos 
    666  1.1.1.6  christos const char *
    667  1.1.1.6  christos tdesc_architecture_name (const struct target_desc *target_desc)
    668  1.1.1.7  christos {
    669  1.1.1.7  christos   if (target_desc->arch != NULL)
    670  1.1.1.7  christos     return target_desc->arch->printable_name;
    671  1.1.1.7  christos   return NULL;
    672  1.1.1.7  christos }
    673  1.1.1.7  christos 
    674  1.1.1.7  christos /* See gdbsupport/tdesc.h.  */
    675  1.1.1.7  christos 
    676  1.1.1.7  christos const std::vector<tdesc_compatible_info_up> &
    677  1.1.1.7  christos tdesc_compatible_info_list (const target_desc *target_desc)
    678  1.1.1.7  christos {
    679  1.1.1.7  christos   return target_desc->compatible;
    680  1.1.1.7  christos }
    681  1.1.1.7  christos 
    682  1.1.1.7  christos /* See gdbsupport/tdesc.h.  */
    683  1.1.1.7  christos 
    684  1.1.1.7  christos const char *
    685  1.1.1.7  christos tdesc_compatible_info_arch_name (const tdesc_compatible_info_up &compatible)
    686  1.1.1.7  christos {
    687  1.1.1.6  christos   return compatible->arch ()->printable_name;
    688  1.1.1.6  christos }
    689      1.1  christos 
    690      1.1  christos /* Return the OSABI associated with this target description, or
    691      1.1  christos    GDB_OSABI_UNKNOWN if no osabi was specified.  */
    692      1.1  christos 
    693      1.1  christos enum gdb_osabi
    694      1.1  christos tdesc_osabi (const struct target_desc *target_desc)
    695      1.1  christos {
    696      1.1  christos   return target_desc->osabi;
    697      1.1  christos }
    698  1.1.1.7  christos 
    699  1.1.1.6  christos /* See gdbsupport/tdesc.h.  */
    700  1.1.1.6  christos 
    701  1.1.1.6  christos const char *
    702  1.1.1.6  christos tdesc_osabi_name (const struct target_desc *target_desc)
    703  1.1.1.6  christos {
    704  1.1.1.6  christos   enum gdb_osabi osabi = tdesc_osabi (target_desc);
    705  1.1.1.6  christos   if (osabi > GDB_OSABI_UNKNOWN && osabi < GDB_OSABI_INVALID)
    706  1.1.1.6  christos     return gdbarch_osabi_name (osabi);
    707  1.1.1.6  christos   return nullptr;
    708      1.1  christos }
    709      1.1  christos 
    710      1.1  christos /* Return 1 if this target description includes any registers.  */
    711      1.1  christos 
    712      1.1  christos int
    713      1.1  christos tdesc_has_registers (const struct target_desc *target_desc)
    714      1.1  christos {
    715      1.1  christos   if (target_desc == NULL)
    716      1.1  christos     return 0;
    717  1.1.1.6  christos 
    718  1.1.1.6  christos   for (const tdesc_feature_up &feature : target_desc->features)
    719      1.1  christos     if (!feature->registers.empty ())
    720      1.1  christos       return 1;
    721      1.1  christos 
    722      1.1  christos   return 0;
    723      1.1  christos }
    724      1.1  christos 
    725      1.1  christos /* Return the feature with the given name, if present, or NULL if
    726      1.1  christos    the named feature is not found.  */
    727      1.1  christos 
    728      1.1  christos const struct tdesc_feature *
    729      1.1  christos tdesc_find_feature (const struct target_desc *target_desc,
    730      1.1  christos 		    const char *name)
    731  1.1.1.6  christos {
    732  1.1.1.6  christos   for (const tdesc_feature_up &feature : target_desc->features)
    733  1.1.1.6  christos     if (feature->name == name)
    734      1.1  christos       return feature.get ();
    735      1.1  christos 
    736      1.1  christos   return NULL;
    737      1.1  christos }
    738      1.1  christos 
    739      1.1  christos /* Return the name of FEATURE.  */
    740      1.1  christos 
    741      1.1  christos const char *
    742      1.1  christos tdesc_feature_name (const struct tdesc_feature *feature)
    743  1.1.1.6  christos {
    744      1.1  christos   return feature->name.c_str ();
    745      1.1  christos }
    746      1.1  christos 
    747      1.1  christos /* Lookup type associated with ID.  */
    748      1.1  christos 
    749      1.1  christos struct type *
    750      1.1  christos tdesc_find_type (struct gdbarch *gdbarch, const char *id)
    751  1.1.1.8  christos {
    752      1.1  christos   tdesc_arch_data *data = get_arch_data (gdbarch);
    753  1.1.1.6  christos 
    754      1.1  christos   for (const tdesc_arch_reg &reg : data->arch_regs)
    755  1.1.1.6  christos     {
    756  1.1.1.6  christos       if (reg.reg
    757  1.1.1.6  christos 	  && reg.reg->tdesc_type
    758  1.1.1.6  christos 	  && reg.type
    759  1.1.1.6  christos 	  && reg.reg->tdesc_type->name == id)
    760      1.1  christos 	return reg.type;
    761      1.1  christos     }
    762      1.1  christos 
    763      1.1  christos   return NULL;
    764      1.1  christos }
    765      1.1  christos 
    766      1.1  christos /* Support for registers from target descriptions.  */
    767      1.1  christos 
    768      1.1  christos /* Construct the per-gdbarch data.  */
    769  1.1.1.8  christos 
    770      1.1  christos tdesc_arch_data_up
    771      1.1  christos tdesc_data_alloc (void)
    772  1.1.1.8  christos {
    773      1.1  christos   return tdesc_arch_data_up (new tdesc_arch_data ());
    774      1.1  christos }
    775  1.1.1.8  christos 
    776      1.1  christos /* See target-descriptions.h.  */
    777      1.1  christos 
    778  1.1.1.8  christos void
    779      1.1  christos tdesc_arch_data_deleter::operator() (struct tdesc_arch_data *data) const
    780  1.1.1.6  christos {
    781      1.1  christos   delete data;
    782      1.1  christos }
    783      1.1  christos 
    784      1.1  christos /* Search FEATURE for a register named NAME.  */
    785      1.1  christos 
    786      1.1  christos static struct tdesc_reg *
    787      1.1  christos tdesc_find_register_early (const struct tdesc_feature *feature,
    788      1.1  christos 			   const char *name)
    789  1.1.1.6  christos {
    790  1.1.1.6  christos   for (const tdesc_reg_up &reg : feature->registers)
    791  1.1.1.6  christos     if (strcasecmp (reg->name.c_str (), name) == 0)
    792      1.1  christos       return reg.get ();
    793      1.1  christos 
    794      1.1  christos   return NULL;
    795      1.1  christos }
    796      1.1  christos 
    797      1.1  christos /* Search FEATURE for a register named NAME.  Assign REGNO to it.  */
    798      1.1  christos 
    799      1.1  christos int
    800      1.1  christos tdesc_numbered_register (const struct tdesc_feature *feature,
    801      1.1  christos 			 struct tdesc_arch_data *data,
    802      1.1  christos 			 int regno, const char *name)
    803      1.1  christos {
    804      1.1  christos   struct tdesc_reg *reg = tdesc_find_register_early (feature, name);
    805      1.1  christos 
    806      1.1  christos   if (reg == NULL)
    807      1.1  christos     return 0;
    808      1.1  christos 
    809  1.1.1.6  christos   /* Make sure the vector includes a REGNO'th element.  */
    810  1.1.1.6  christos   while (regno >= data->arch_regs.size ())
    811  1.1.1.6  christos     data->arch_regs.emplace_back (nullptr, nullptr);
    812  1.1.1.6  christos 
    813      1.1  christos   data->arch_regs[regno] = tdesc_arch_reg (reg, NULL);
    814      1.1  christos 
    815      1.1  christos   return 1;
    816      1.1  christos }
    817      1.1  christos 
    818      1.1  christos /* Search FEATURE for a register named NAME, but do not assign a fixed
    819      1.1  christos    register number to it.  */
    820      1.1  christos 
    821      1.1  christos int
    822      1.1  christos tdesc_unnumbered_register (const struct tdesc_feature *feature,
    823      1.1  christos 			   const char *name)
    824      1.1  christos {
    825      1.1  christos   struct tdesc_reg *reg = tdesc_find_register_early (feature, name);
    826      1.1  christos 
    827      1.1  christos   if (reg == NULL)
    828      1.1  christos     return 0;
    829      1.1  christos 
    830      1.1  christos   return 1;
    831      1.1  christos }
    832      1.1  christos 
    833      1.1  christos /* Search FEATURE for a register whose name is in NAMES and assign
    834      1.1  christos    REGNO to it.  */
    835      1.1  christos 
    836      1.1  christos int
    837      1.1  christos tdesc_numbered_register_choices (const struct tdesc_feature *feature,
    838      1.1  christos 				 struct tdesc_arch_data *data,
    839      1.1  christos 				 int regno, const char *const names[])
    840      1.1  christos {
    841      1.1  christos   int i;
    842      1.1  christos 
    843      1.1  christos   for (i = 0; names[i] != NULL; i++)
    844      1.1  christos     if (tdesc_numbered_register (feature, data, regno, names[i]))
    845      1.1  christos       return 1;
    846      1.1  christos 
    847      1.1  christos   return 0;
    848      1.1  christos }
    849  1.1.1.8  christos 
    850  1.1.1.8  christos /* See target-descriptions.h.  */
    851  1.1.1.8  christos 
    852  1.1.1.8  christos bool
    853  1.1.1.8  christos tdesc_found_register (struct tdesc_arch_data *data, int regno)
    854  1.1.1.8  christos {
    855  1.1.1.8  christos   gdb_assert (regno >= 0);
    856  1.1.1.8  christos 
    857  1.1.1.8  christos   return (regno < data->arch_regs.size ()
    858  1.1.1.8  christos 	  && data->arch_regs[regno].reg != nullptr);
    859  1.1.1.8  christos }
    860      1.1  christos 
    861      1.1  christos /* Search FEATURE for a register named NAME, and return its size in
    862      1.1  christos    bits.  The register must exist.  */
    863      1.1  christos 
    864  1.1.1.6  christos int
    865      1.1  christos tdesc_register_bitsize (const struct tdesc_feature *feature, const char *name)
    866      1.1  christos {
    867      1.1  christos   struct tdesc_reg *reg = tdesc_find_register_early (feature, name);
    868      1.1  christos 
    869      1.1  christos   gdb_assert (reg != NULL);
    870      1.1  christos   return reg->bitsize;
    871      1.1  christos }
    872      1.1  christos 
    873      1.1  christos /* Look up a register by its GDB internal register number.  */
    874      1.1  christos 
    875      1.1  christos static struct tdesc_arch_reg *
    876      1.1  christos tdesc_find_arch_register (struct gdbarch *gdbarch, int regno)
    877  1.1.1.8  christos {
    878      1.1  christos   struct tdesc_arch_data *data = get_arch_data (gdbarch);
    879  1.1.1.6  christos 
    880  1.1.1.6  christos   if (regno < data->arch_regs.size ())
    881      1.1  christos     return &data->arch_regs[regno];
    882      1.1  christos   else
    883      1.1  christos     return NULL;
    884      1.1  christos }
    885      1.1  christos 
    886      1.1  christos static struct tdesc_reg *
    887      1.1  christos tdesc_find_register (struct gdbarch *gdbarch, int regno)
    888      1.1  christos {
    889      1.1  christos   struct tdesc_arch_reg *reg = tdesc_find_arch_register (gdbarch, regno);
    890      1.1  christos 
    891      1.1  christos   return reg? reg->reg : NULL;
    892      1.1  christos }
    893      1.1  christos 
    894      1.1  christos /* Return the name of register REGNO, from the target description or
    895      1.1  christos    from an architecture-provided pseudo_register_name method.  */
    896      1.1  christos 
    897      1.1  christos const char *
    898      1.1  christos tdesc_register_name (struct gdbarch *gdbarch, int regno)
    899      1.1  christos {
    900      1.1  christos   struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
    901      1.1  christos   int num_regs = gdbarch_num_regs (gdbarch);
    902      1.1  christos 
    903  1.1.1.6  christos   if (reg != NULL)
    904      1.1  christos     return reg->name.c_str ();
    905  1.1.1.6  christos 
    906      1.1  christos   if (regno >= num_regs && regno < gdbarch_num_cooked_regs (gdbarch))
    907  1.1.1.8  christos     {
    908      1.1  christos       struct tdesc_arch_data *data = get_arch_data (gdbarch);
    909      1.1  christos 
    910      1.1  christos       gdb_assert (data->pseudo_register_name != NULL);
    911      1.1  christos       return data->pseudo_register_name (gdbarch, regno);
    912      1.1  christos     }
    913      1.1  christos 
    914      1.1  christos   return "";
    915      1.1  christos }
    916      1.1  christos 
    917      1.1  christos struct type *
    918      1.1  christos tdesc_register_type (struct gdbarch *gdbarch, int regno)
    919      1.1  christos {
    920      1.1  christos   struct tdesc_arch_reg *arch_reg = tdesc_find_arch_register (gdbarch, regno);
    921      1.1  christos   struct tdesc_reg *reg = arch_reg? arch_reg->reg : NULL;
    922      1.1  christos   int num_regs = gdbarch_num_regs (gdbarch);
    923      1.1  christos   int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
    924      1.1  christos 
    925      1.1  christos   if (reg == NULL && regno >= num_regs && regno < num_regs + num_pseudo_regs)
    926  1.1.1.8  christos     {
    927      1.1  christos       struct tdesc_arch_data *data = get_arch_data (gdbarch);
    928      1.1  christos 
    929      1.1  christos       gdb_assert (data->pseudo_register_type != NULL);
    930      1.1  christos       return data->pseudo_register_type (gdbarch, regno);
    931      1.1  christos     }
    932      1.1  christos 
    933      1.1  christos   if (reg == NULL)
    934      1.1  christos     /* Return "int0_t", since "void" has a misleading size of one.  */
    935      1.1  christos     return builtin_type (gdbarch)->builtin_int0;
    936      1.1  christos 
    937      1.1  christos   if (arch_reg->type == NULL)
    938      1.1  christos     {
    939      1.1  christos       /* First check for a predefined or target defined type.  */
    940  1.1.1.6  christos       if (reg->tdesc_type)
    941      1.1  christos 	arch_reg->type = make_gdb_type (gdbarch, reg->tdesc_type);
    942      1.1  christos 
    943  1.1.1.6  christos       /* Next try size-sensitive type shortcuts.  */
    944      1.1  christos       else if (reg->type == "float")
    945      1.1  christos 	{
    946      1.1  christos 	  if (reg->bitsize == gdbarch_float_bit (gdbarch))
    947      1.1  christos 	    arch_reg->type = builtin_type (gdbarch)->builtin_float;
    948      1.1  christos 	  else if (reg->bitsize == gdbarch_double_bit (gdbarch))
    949      1.1  christos 	    arch_reg->type = builtin_type (gdbarch)->builtin_double;
    950      1.1  christos 	  else if (reg->bitsize == gdbarch_long_double_bit (gdbarch))
    951      1.1  christos 	    arch_reg->type = builtin_type (gdbarch)->builtin_long_double;
    952      1.1  christos 	  else
    953      1.1  christos 	    {
    954  1.1.1.6  christos 	      warning (_("Register \"%s\" has an unsupported size (%d bits)"),
    955      1.1  christos 		       reg->name.c_str (), reg->bitsize);
    956      1.1  christos 	      arch_reg->type = builtin_type (gdbarch)->builtin_double;
    957      1.1  christos 	    }
    958  1.1.1.6  christos 	}
    959      1.1  christos       else if (reg->type == "int")
    960      1.1  christos 	{
    961      1.1  christos 	  if (reg->bitsize == gdbarch_long_bit (gdbarch))
    962      1.1  christos 	    arch_reg->type = builtin_type (gdbarch)->builtin_long;
    963      1.1  christos 	  else if (reg->bitsize == TARGET_CHAR_BIT)
    964      1.1  christos 	    arch_reg->type = builtin_type (gdbarch)->builtin_char;
    965      1.1  christos 	  else if (reg->bitsize == gdbarch_short_bit (gdbarch))
    966      1.1  christos 	    arch_reg->type = builtin_type (gdbarch)->builtin_short;
    967      1.1  christos 	  else if (reg->bitsize == gdbarch_int_bit (gdbarch))
    968      1.1  christos 	    arch_reg->type = builtin_type (gdbarch)->builtin_int;
    969      1.1  christos 	  else if (reg->bitsize == gdbarch_long_long_bit (gdbarch))
    970      1.1  christos 	    arch_reg->type = builtin_type (gdbarch)->builtin_long_long;
    971      1.1  christos 	  else if (reg->bitsize == gdbarch_ptr_bit (gdbarch))
    972      1.1  christos 	  /* A bit desperate by this point...  */
    973      1.1  christos 	    arch_reg->type = builtin_type (gdbarch)->builtin_data_ptr;
    974      1.1  christos 	  else
    975      1.1  christos 	    {
    976  1.1.1.6  christos 	      warning (_("Register \"%s\" has an unsupported size (%d bits)"),
    977      1.1  christos 		       reg->name.c_str (), reg->bitsize);
    978      1.1  christos 	      arch_reg->type = builtin_type (gdbarch)->builtin_long;
    979      1.1  christos 	    }
    980      1.1  christos 	}
    981      1.1  christos 
    982  1.1.1.8  christos       if (arch_reg->type == NULL)
    983  1.1.1.6  christos 	internal_error ("Register \"%s\" has an unknown type \"%s\"",
    984      1.1  christos 			reg->name.c_str (), reg->type.c_str ());
    985      1.1  christos     }
    986      1.1  christos 
    987      1.1  christos   return arch_reg->type;
    988      1.1  christos }
    989      1.1  christos 
    990      1.1  christos static int
    991      1.1  christos tdesc_remote_register_number (struct gdbarch *gdbarch, int regno)
    992      1.1  christos {
    993      1.1  christos   struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
    994      1.1  christos 
    995      1.1  christos   if (reg != NULL)
    996      1.1  christos     return reg->target_regnum;
    997      1.1  christos   else
    998      1.1  christos     return -1;
    999      1.1  christos }
   1000      1.1  christos 
   1001  1.1.1.6  christos /* Check whether REGNUM is a member of REGGROUP.  Registers from the
   1002  1.1.1.6  christos    target description may be classified as general, float, vector or other
   1003  1.1.1.6  christos    register groups registered with reggroup_add().  Unlike a gdbarch
   1004  1.1.1.6  christos    register_reggroup_p method, this function will return -1 if it does not
   1005  1.1.1.6  christos    know; the caller should handle registers with no specified group.
   1006  1.1.1.6  christos 
   1007  1.1.1.6  christos    The names of containing features are not used.  This might be extended
   1008      1.1  christos    to display registers in some more useful groupings.
   1009      1.1  christos 
   1010      1.1  christos    The save-restore flag is also implemented here.  */
   1011      1.1  christos 
   1012      1.1  christos int
   1013  1.1.1.8  christos tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno,
   1014      1.1  christos 			      const struct reggroup *reggroup)
   1015      1.1  christos {
   1016      1.1  christos   struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
   1017  1.1.1.6  christos 
   1018  1.1.1.8  christos   if (reg != NULL && !reg->group.empty ()
   1019  1.1.1.6  christos       && (reg->group == reggroup->name ()))
   1020      1.1  christos 	return 1;
   1021      1.1  christos 
   1022      1.1  christos   if (reg != NULL
   1023      1.1  christos       && (reggroup == save_reggroup || reggroup == restore_reggroup))
   1024      1.1  christos     return reg->save_restore;
   1025      1.1  christos 
   1026      1.1  christos   return -1;
   1027      1.1  christos }
   1028      1.1  christos 
   1029      1.1  christos /* Check whether REGNUM is a member of REGGROUP.  Registers with no
   1030      1.1  christos    group specified go to the default reggroup function and are handled
   1031      1.1  christos    by type.  */
   1032      1.1  christos 
   1033      1.1  christos static int
   1034  1.1.1.8  christos tdesc_register_reggroup_p (struct gdbarch *gdbarch, int regno,
   1035      1.1  christos 			   const struct reggroup *reggroup)
   1036      1.1  christos {
   1037      1.1  christos   int num_regs = gdbarch_num_regs (gdbarch);
   1038      1.1  christos   int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
   1039      1.1  christos   int ret;
   1040      1.1  christos 
   1041      1.1  christos   if (regno >= num_regs && regno < num_regs + num_pseudo_regs)
   1042  1.1.1.8  christos     {
   1043      1.1  christos       struct tdesc_arch_data *data = get_arch_data (gdbarch);
   1044      1.1  christos 
   1045      1.1  christos       if (data->pseudo_register_reggroup_p != NULL)
   1046      1.1  christos 	return data->pseudo_register_reggroup_p (gdbarch, regno, reggroup);
   1047      1.1  christos       /* Otherwise fall through to the default reggroup_p.  */
   1048      1.1  christos     }
   1049      1.1  christos 
   1050      1.1  christos   ret = tdesc_register_in_reggroup_p (gdbarch, regno, reggroup);
   1051      1.1  christos   if (ret != -1)
   1052      1.1  christos     return ret;
   1053      1.1  christos 
   1054      1.1  christos   return default_register_reggroup_p (gdbarch, regno, reggroup);
   1055      1.1  christos }
   1056      1.1  christos 
   1057      1.1  christos /* Record architecture-specific functions to call for pseudo-register
   1058      1.1  christos    support.  */
   1059      1.1  christos 
   1060      1.1  christos void
   1061      1.1  christos set_tdesc_pseudo_register_name (struct gdbarch *gdbarch,
   1062      1.1  christos 				gdbarch_register_name_ftype *pseudo_name)
   1063  1.1.1.8  christos {
   1064      1.1  christos   struct tdesc_arch_data *data = get_arch_data (gdbarch);
   1065      1.1  christos 
   1066      1.1  christos   data->pseudo_register_name = pseudo_name;
   1067      1.1  christos }
   1068      1.1  christos 
   1069      1.1  christos void
   1070      1.1  christos set_tdesc_pseudo_register_type (struct gdbarch *gdbarch,
   1071      1.1  christos 				gdbarch_register_type_ftype *pseudo_type)
   1072  1.1.1.8  christos {
   1073      1.1  christos   struct tdesc_arch_data *data = get_arch_data (gdbarch);
   1074      1.1  christos 
   1075      1.1  christos   data->pseudo_register_type = pseudo_type;
   1076      1.1  christos }
   1077      1.1  christos 
   1078      1.1  christos void
   1079      1.1  christos set_tdesc_pseudo_register_reggroup_p
   1080      1.1  christos   (struct gdbarch *gdbarch,
   1081      1.1  christos    gdbarch_register_reggroup_p_ftype *pseudo_reggroup_p)
   1082  1.1.1.8  christos {
   1083      1.1  christos   struct tdesc_arch_data *data = get_arch_data (gdbarch);
   1084      1.1  christos 
   1085      1.1  christos   data->pseudo_register_reggroup_p = pseudo_reggroup_p;
   1086      1.1  christos }
   1087      1.1  christos 
   1088      1.1  christos /* Update GDBARCH to use the target description for registers.  */
   1089      1.1  christos 
   1090      1.1  christos void
   1091      1.1  christos tdesc_use_registers (struct gdbarch *gdbarch,
   1092  1.1.1.8  christos 		     const struct target_desc *target_desc,
   1093  1.1.1.7  christos 		     tdesc_arch_data_up &&early_data,
   1094      1.1  christos 		     tdesc_unknown_register_ftype unk_reg_cb)
   1095      1.1  christos {
   1096      1.1  christos   int num_regs = gdbarch_num_regs (gdbarch);
   1097      1.1  christos   struct tdesc_arch_data *data;
   1098      1.1  christos 
   1099      1.1  christos   /* We can't use the description for registers if it doesn't describe
   1100      1.1  christos      any.  This function should only be called after validating
   1101      1.1  christos      registers, so the caller should know that registers are
   1102      1.1  christos      included.  */
   1103      1.1  christos   gdb_assert (tdesc_has_registers (target_desc));
   1104  1.1.1.8  christos 
   1105  1.1.1.8  christos   data = get_arch_data (gdbarch);
   1106      1.1  christos   data->arch_regs = std::move (early_data->arch_regs);
   1107      1.1  christos 
   1108      1.1  christos   /* Build up a set of all registers, so that we can assign register
   1109      1.1  christos      numbers where needed.  The hash table expands as necessary, so
   1110  1.1.1.8  christos      the initial size is arbitrary.  */
   1111  1.1.1.8  christos   htab_up reg_hash (htab_create (37, htab_hash_pointer, htab_eq_pointer,
   1112  1.1.1.6  christos 				 NULL));
   1113  1.1.1.6  christos   for (const tdesc_feature_up &feature : target_desc->features)
   1114      1.1  christos     for (const tdesc_reg_up &reg : feature->registers)
   1115  1.1.1.8  christos       {
   1116      1.1  christos 	void **slot = htab_find_slot (reg_hash.get (), reg.get (), INSERT);
   1117  1.1.1.6  christos 
   1118  1.1.1.6  christos 	*slot = reg.get ();
   1119  1.1.1.6  christos 	/* Add reggroup if its new.  */
   1120  1.1.1.6  christos 	if (!reg->group.empty ())
   1121  1.1.1.6  christos 	  if (reggroup_find (gdbarch, reg->group.c_str ()) == NULL)
   1122  1.1.1.6  christos 	    reggroup_add (gdbarch, reggroup_gdbarch_new (gdbarch,
   1123  1.1.1.6  christos 							 reg->group.c_str (),
   1124      1.1  christos 							 USER_REGGROUP));
   1125      1.1  christos       }
   1126      1.1  christos 
   1127      1.1  christos   /* Remove any registers which were assigned numbers by the
   1128  1.1.1.6  christos      architecture.  */
   1129  1.1.1.6  christos   for (const tdesc_arch_reg &arch_reg : data->arch_regs)
   1130  1.1.1.8  christos     if (arch_reg.reg != NULL)
   1131      1.1  christos       htab_remove_elt (reg_hash.get (), arch_reg.reg);
   1132      1.1  christos 
   1133      1.1  christos   /* Assign numbers to the remaining registers and add them to the
   1134      1.1  christos      list of registers.  The new numbers are always above gdbarch_num_regs.
   1135      1.1  christos      Iterate over the features, not the hash table, so that the order
   1136      1.1  christos      matches that in the target description.  */
   1137  1.1.1.6  christos 
   1138  1.1.1.6  christos   gdb_assert (data->arch_regs.size () <= num_regs);
   1139  1.1.1.6  christos   while (data->arch_regs.size () < num_regs)
   1140  1.1.1.6  christos     data->arch_regs.emplace_back (nullptr, nullptr);
   1141  1.1.1.7  christos 
   1142  1.1.1.7  christos   /* First we give the target a chance to number previously unknown
   1143  1.1.1.7  christos      registers.  This allows targets to record the numbers assigned based
   1144  1.1.1.7  christos      on which feature the register was from.  */
   1145  1.1.1.7  christos   if (unk_reg_cb != NULL)
   1146  1.1.1.7  christos     {
   1147  1.1.1.7  christos       for (const tdesc_feature_up &feature : target_desc->features)
   1148  1.1.1.8  christos 	for (const tdesc_reg_up &reg : feature->registers)
   1149  1.1.1.7  christos 	  if (htab_find (reg_hash.get (), reg.get ()) != NULL)
   1150  1.1.1.7  christos 	    {
   1151  1.1.1.7  christos 	      int regno = unk_reg_cb (gdbarch, feature.get (),
   1152  1.1.1.7  christos 				      reg->name.c_str (), num_regs);
   1153  1.1.1.7  christos 	      gdb_assert (regno == -1 || regno >= num_regs);
   1154  1.1.1.7  christos 	      if (regno != -1)
   1155  1.1.1.7  christos 		{
   1156  1.1.1.7  christos 		  while (regno >= data->arch_regs.size ())
   1157  1.1.1.7  christos 		    data->arch_regs.emplace_back (nullptr, nullptr);
   1158  1.1.1.7  christos 		  data->arch_regs[regno] = tdesc_arch_reg (reg.get (), NULL);
   1159  1.1.1.8  christos 		  num_regs = regno + 1;
   1160  1.1.1.7  christos 		  htab_remove_elt (reg_hash.get (), reg.get ());
   1161  1.1.1.7  christos 		}
   1162  1.1.1.7  christos 	    }
   1163  1.1.1.7  christos     }
   1164  1.1.1.7  christos 
   1165  1.1.1.7  christos   /* Ensure the array was sized correctly above.  */
   1166  1.1.1.7  christos   gdb_assert (data->arch_regs.size () == num_regs);
   1167  1.1.1.7  christos 
   1168  1.1.1.7  christos   /* Now in a final pass we assign register numbers to any remaining
   1169  1.1.1.6  christos      unnumbered registers.  */
   1170  1.1.1.6  christos   for (const tdesc_feature_up &feature : target_desc->features)
   1171  1.1.1.8  christos     for (const tdesc_reg_up &reg : feature->registers)
   1172      1.1  christos       if (htab_find (reg_hash.get (), reg.get ()) != NULL)
   1173  1.1.1.6  christos 	{
   1174      1.1  christos 	  data->arch_regs.emplace_back (reg.get (), nullptr);
   1175      1.1  christos 	  num_regs++;
   1176      1.1  christos 	}
   1177      1.1  christos 
   1178      1.1  christos   /* Update the architecture.  */
   1179      1.1  christos   set_gdbarch_num_regs (gdbarch, num_regs);
   1180      1.1  christos   set_gdbarch_register_name (gdbarch, tdesc_register_name);
   1181      1.1  christos   set_gdbarch_register_type (gdbarch, tdesc_register_type);
   1182      1.1  christos   set_gdbarch_remote_register_number (gdbarch,
   1183      1.1  christos 				      tdesc_remote_register_number);
   1184      1.1  christos   set_gdbarch_register_reggroup_p (gdbarch, tdesc_register_reggroup_p);
   1185      1.1  christos }
   1186  1.1.1.7  christos 
   1187  1.1.1.4  christos /* See gdbsupport/tdesc.h.  */
   1188  1.1.1.6  christos 
   1189  1.1.1.6  christos struct tdesc_feature *
   1190      1.1  christos tdesc_create_feature (struct target_desc *tdesc, const char *name)
   1191  1.1.1.6  christos {
   1192      1.1  christos   struct tdesc_feature *new_feature = new tdesc_feature (name);
   1193  1.1.1.6  christos 
   1194      1.1  christos   tdesc->features.emplace_back (new_feature);
   1195  1.1.1.6  christos 
   1196  1.1.1.6  christos   return new_feature;
   1197      1.1  christos }
   1198  1.1.1.7  christos 
   1199  1.1.1.7  christos /* See gdbsupport/tdesc.h.  */
   1200  1.1.1.8  christos 
   1201  1.1.1.6  christos target_desc_up
   1202  1.1.1.6  christos allocate_target_description (void)
   1203  1.1.1.8  christos {
   1204  1.1.1.6  christos   return target_desc_up (new target_desc ());
   1205      1.1  christos }
   1206  1.1.1.7  christos 
   1207  1.1.1.7  christos /* See gdbsupport/tdesc.h.  */
   1208  1.1.1.6  christos 
   1209  1.1.1.6  christos void
   1210  1.1.1.6  christos target_desc_deleter::operator() (struct target_desc *target_desc) const
   1211  1.1.1.6  christos {
   1212      1.1  christos   delete target_desc;
   1213      1.1  christos }
   1214  1.1.1.6  christos 
   1215  1.1.1.6  christos void
   1216  1.1.1.6  christos tdesc_add_compatible (struct target_desc *target_desc,
   1217      1.1  christos 		      const struct bfd_arch_info *compatible)
   1218  1.1.1.6  christos {
   1219  1.1.1.6  christos   /* If this instance of GDB is compiled without BFD support for the
   1220  1.1.1.6  christos      compatible architecture, simply ignore it -- we would not be able
   1221  1.1.1.6  christos      to handle it anyway.  */
   1222  1.1.1.6  christos   if (compatible == NULL)
   1223      1.1  christos     return;
   1224  1.1.1.7  christos 
   1225  1.1.1.7  christos   for (const tdesc_compatible_info_up &compat : target_desc->compatible)
   1226  1.1.1.8  christos     if (compat->arch () == compatible)
   1227  1.1.1.6  christos       internal_error (_("Attempted to add duplicate "
   1228  1.1.1.6  christos 			"compatible architecture \"%s\""),
   1229      1.1  christos 		      compatible->printable_name);
   1230  1.1.1.7  christos 
   1231  1.1.1.7  christos   target_desc->compatible.push_back
   1232  1.1.1.7  christos     (std::unique_ptr<tdesc_compatible_info>
   1233      1.1  christos      (new tdesc_compatible_info (compatible)));
   1234      1.1  christos }
   1235  1.1.1.6  christos 
   1236  1.1.1.6  christos void
   1237  1.1.1.6  christos set_tdesc_property (struct target_desc *target_desc,
   1238      1.1  christos 		    const char *key, const char *value)
   1239  1.1.1.6  christos {
   1240      1.1  christos   gdb_assert (key != NULL && value != NULL);
   1241  1.1.1.6  christos 
   1242  1.1.1.8  christos   if (tdesc_property (target_desc, key) != NULL)
   1243      1.1  christos     internal_error (_("Attempted to add duplicate property \"%s\""), key);
   1244  1.1.1.6  christos 
   1245      1.1  christos   target_desc->properties.emplace_back (key, value);
   1246      1.1  christos }
   1247  1.1.1.7  christos 
   1248      1.1  christos /* See gdbsupport/tdesc.h.  */
   1249      1.1  christos 
   1250  1.1.1.6  christos void
   1251  1.1.1.6  christos set_tdesc_architecture (struct target_desc *target_desc,
   1252      1.1  christos 			const char *name)
   1253  1.1.1.6  christos {
   1254      1.1  christos   set_tdesc_architecture (target_desc, bfd_scan_arch (name));
   1255      1.1  christos }
   1256  1.1.1.6  christos 
   1257  1.1.1.6  christos void
   1258  1.1.1.6  christos set_tdesc_architecture (struct target_desc *target_desc,
   1259      1.1  christos 			const struct bfd_arch_info *arch)
   1260  1.1.1.6  christos {
   1261      1.1  christos   target_desc->arch = arch;
   1262      1.1  christos }
   1263  1.1.1.7  christos 
   1264  1.1.1.6  christos /* See gdbsupport/tdesc.h.  */
   1265  1.1.1.6  christos 
   1266  1.1.1.6  christos void
   1267  1.1.1.6  christos set_tdesc_osabi (struct target_desc *target_desc, const char *name)
   1268  1.1.1.6  christos {
   1269  1.1.1.6  christos   set_tdesc_osabi (target_desc, osabi_from_tdesc_string (name));
   1270  1.1.1.6  christos }
   1271  1.1.1.6  christos 
   1272  1.1.1.6  christos void
   1273      1.1  christos set_tdesc_osabi (struct target_desc *target_desc, enum gdb_osabi osabi)
   1274  1.1.1.6  christos {
   1275  1.1.1.6  christos   target_desc->osabi = osabi;
   1276  1.1.1.6  christos }
   1277      1.1  christos 
   1278  1.1.1.6  christos 
   1280  1.1.1.4  christos static struct cmd_list_element *tdesc_set_cmdlist, *tdesc_show_cmdlist;
   1281  1.1.1.6  christos static struct cmd_list_element *tdesc_unset_cmdlist;
   1282  1.1.1.4  christos 
   1283  1.1.1.6  christos /* Helper functions for the CLI commands.  */
   1284  1.1.1.6  christos 
   1285  1.1.1.6  christos static void
   1286  1.1.1.6  christos set_tdesc_filename_cmd (const char *args, int from_tty,
   1287  1.1.1.8  christos 			struct cmd_list_element *c)
   1288  1.1.1.8  christos {
   1289  1.1.1.8  christos   target_desc_info *tdesc_info = get_tdesc_info (current_inferior ());
   1290      1.1  christos 
   1291  1.1.1.6  christos   tdesc_info->filename = tdesc_filename_cmd_string;
   1292  1.1.1.6  christos 
   1293      1.1  christos   target_clear_description ();
   1294      1.1  christos   target_find_description ();
   1295  1.1.1.6  christos }
   1296  1.1.1.6  christos 
   1297  1.1.1.6  christos static void
   1298  1.1.1.6  christos show_tdesc_filename_cmd (struct ui_file *file, int from_tty,
   1299      1.1  christos 			 struct cmd_list_element *c,
   1300  1.1.1.8  christos 			 const char *value)
   1301      1.1  christos {
   1302  1.1.1.6  christos   value = get_tdesc_info (current_inferior ())->filename.data ();
   1303  1.1.1.8  christos 
   1304  1.1.1.8  christos   if (value != NULL && *value != '\0')
   1305  1.1.1.8  christos     gdb_printf (file,
   1306  1.1.1.6  christos 		_("The target description will be read from \"%s\".\n"),
   1307  1.1.1.8  christos 		value);
   1308  1.1.1.8  christos   else
   1309  1.1.1.8  christos     gdb_printf (file,
   1310  1.1.1.6  christos 		_("The target description will be "
   1311      1.1  christos 		  "read from the target.\n"));
   1312  1.1.1.6  christos }
   1313  1.1.1.6  christos 
   1314  1.1.1.6  christos static void
   1315  1.1.1.8  christos unset_tdesc_filename_cmd (const char *args, int from_tty)
   1316  1.1.1.8  christos {
   1317  1.1.1.8  christos   target_desc_info *tdesc_info = get_tdesc_info (current_inferior ());
   1318  1.1.1.6  christos 
   1319  1.1.1.6  christos   tdesc_info->filename.clear ();
   1320      1.1  christos   target_clear_description ();
   1321      1.1  christos   target_find_description ();
   1322  1.1.1.6  christos }
   1323      1.1  christos 
   1324  1.1.1.6  christos /* Print target description in C.  */
   1325      1.1  christos 
   1326  1.1.1.6  christos class print_c_tdesc : public tdesc_element_visitor
   1327  1.1.1.6  christos {
   1328  1.1.1.6  christos public:
   1329  1.1.1.6  christos   print_c_tdesc (std::string &filename_after_features)
   1330  1.1.1.6  christos     : m_filename_after_features (filename_after_features)
   1331  1.1.1.6  christos   {
   1332  1.1.1.6  christos     const char *inp;
   1333  1.1.1.6  christos     char *outp;
   1334  1.1.1.6  christos     const char *filename = lbasename (m_filename_after_features.c_str ());
   1335  1.1.1.6  christos 
   1336  1.1.1.6  christos     m_function = (char *) xmalloc (strlen (filename) + 1);
   1337  1.1.1.6  christos     for (inp = filename, outp = m_function; *inp != '\0'; inp++)
   1338  1.1.1.6  christos       if (*inp == '.')
   1339  1.1.1.6  christos 	break;
   1340  1.1.1.7  christos       else if (*inp == '-')
   1341  1.1.1.7  christos 	*outp++ = '_';
   1342  1.1.1.6  christos       else if (*inp == ' ')
   1343  1.1.1.6  christos 	*outp++ = '_';
   1344  1.1.1.6  christos       else
   1345      1.1  christos 	*outp++ = *inp;
   1346  1.1.1.6  christos     *outp = '\0';
   1347  1.1.1.8  christos 
   1348  1.1.1.8  christos     /* Standard boilerplate.  */
   1349  1.1.1.8  christos     gdb_printf ("/* THIS FILE IS GENERATED.  "
   1350  1.1.1.6  christos 		"-*- buffer-read-only: t -*- vi"
   1351      1.1  christos 		":set ro:\n");
   1352  1.1.1.6  christos   }
   1353  1.1.1.6  christos 
   1354  1.1.1.6  christos   ~print_c_tdesc ()
   1355  1.1.1.6  christos   {
   1356      1.1  christos     xfree (m_function);
   1357  1.1.1.6  christos   }
   1358  1.1.1.6  christos 
   1359  1.1.1.8  christos   void visit_pre (const target_desc *e) override
   1360  1.1.1.8  christos   {
   1361      1.1  christos     gdb_printf ("  Original: %s */\n\n",
   1362  1.1.1.8  christos 		lbasename (m_filename_after_features.c_str ()));
   1363  1.1.1.8  christos 
   1364  1.1.1.8  christos     gdb_printf ("#include \"defs.h\"\n");
   1365  1.1.1.8  christos     gdb_printf ("#include \"osabi.h\"\n");
   1366  1.1.1.8  christos     gdb_printf ("#include \"target-descriptions.h\"\n");
   1367  1.1.1.8  christos     gdb_printf ("\n");
   1368  1.1.1.8  christos 
   1369  1.1.1.8  christos     gdb_printf ("const struct target_desc *tdesc_%s;\n", m_function);
   1370  1.1.1.8  christos     gdb_printf ("static void\n");
   1371  1.1.1.8  christos     gdb_printf ("initialize_tdesc_%s (void)\n", m_function);
   1372  1.1.1.8  christos     gdb_printf ("{\n");
   1373  1.1.1.4  christos     gdb_printf
   1374  1.1.1.6  christos       ("  target_desc_up result = allocate_target_description ();\n");
   1375  1.1.1.6  christos 
   1376  1.1.1.8  christos     if (tdesc_architecture (e) != NULL)
   1377  1.1.1.8  christos       {
   1378  1.1.1.6  christos 	gdb_printf
   1379  1.1.1.8  christos 	  ("  set_tdesc_architecture (result.get (), bfd_scan_arch (\"%s\"));\n",
   1380  1.1.1.6  christos 	   tdesc_architecture (e)->printable_name);
   1381  1.1.1.6  christos 	gdb_printf ("\n");
   1382  1.1.1.6  christos       }
   1383  1.1.1.6  christos     if (tdesc_osabi (e) > GDB_OSABI_UNKNOWN
   1384  1.1.1.8  christos 	&& tdesc_osabi (e) < GDB_OSABI_INVALID)
   1385  1.1.1.8  christos       {
   1386  1.1.1.6  christos 	gdb_printf
   1387  1.1.1.8  christos 	  ("  set_tdesc_osabi (result.get (), osabi_from_tdesc_string (\"%s\"));\n",
   1388  1.1.1.6  christos 	   gdbarch_osabi_name (tdesc_osabi (e)));
   1389  1.1.1.4  christos 	gdb_printf ("\n");
   1390  1.1.1.7  christos       }
   1391  1.1.1.8  christos 
   1392  1.1.1.8  christos     for (const tdesc_compatible_info_up &compatible : e->compatible)
   1393  1.1.1.7  christos       gdb_printf
   1394  1.1.1.4  christos 	("  tdesc_add_compatible (result.get (), bfd_scan_arch (\"%s\"));\n",
   1395  1.1.1.6  christos 	 compatible->arch ()->printable_name);
   1396  1.1.1.8  christos 
   1397  1.1.1.4  christos     if (!e->compatible.empty ())
   1398  1.1.1.6  christos       gdb_printf ("\n");
   1399  1.1.1.8  christos 
   1400  1.1.1.8  christos     for (const property &prop : e->properties)
   1401  1.1.1.4  christos       gdb_printf ("  set_tdesc_property (result.get (), \"%s\", \"%s\");\n",
   1402  1.1.1.8  christos 		  prop.key.c_str (), prop.value.c_str ());
   1403  1.1.1.6  christos 
   1404      1.1  christos     gdb_printf ("  struct tdesc_feature *feature;\n");
   1405  1.1.1.6  christos   }
   1406  1.1.1.6  christos 
   1407  1.1.1.8  christos   void visit_pre (const tdesc_feature *e) override
   1408  1.1.1.8  christos   {
   1409  1.1.1.6  christos     gdb_printf ("\n  feature = tdesc_create_feature (result.get (), \"%s\");\n",
   1410      1.1  christos 		e->name.c_str ());
   1411  1.1.1.6  christos   }
   1412  1.1.1.6  christos 
   1413      1.1  christos   void visit_post (const tdesc_feature *e) override
   1414  1.1.1.6  christos   {}
   1415  1.1.1.6  christos 
   1416  1.1.1.8  christos   void visit_post (const target_desc *e) override
   1417  1.1.1.8  christos   {
   1418  1.1.1.6  christos     gdb_printf ("\n  tdesc_%s = result.release ();\n", m_function);
   1419  1.1.1.4  christos     gdb_printf ("}\n");
   1420  1.1.1.6  christos   }
   1421  1.1.1.6  christos 
   1422  1.1.1.6  christos   void visit (const tdesc_type_builtin *type) override
   1423  1.1.1.6  christos   {
   1424  1.1.1.4  christos     error (_("C output is not supported type \"%s\"."), type->name.c_str ());
   1425  1.1.1.6  christos   }
   1426  1.1.1.6  christos 
   1427  1.1.1.6  christos   void visit (const tdesc_type_vector *type) override
   1428  1.1.1.6  christos   {
   1429  1.1.1.8  christos     if (!m_printed_element_type)
   1430  1.1.1.6  christos       {
   1431  1.1.1.6  christos 	gdb_printf ("  tdesc_type *element_type;\n");
   1432  1.1.1.4  christos 	m_printed_element_type = true;
   1433  1.1.1.8  christos       }
   1434  1.1.1.6  christos 
   1435  1.1.1.6  christos     gdb_printf
   1436  1.1.1.8  christos       ("  element_type = tdesc_named_type (feature, \"%s\");\n",
   1437  1.1.1.6  christos        type->element_type->name.c_str ());
   1438  1.1.1.6  christos     gdb_printf
   1439  1.1.1.4  christos       ("  tdesc_create_vector (feature, \"%s\", element_type, %d);\n",
   1440  1.1.1.8  christos        type->name.c_str (), type->count);
   1441  1.1.1.6  christos 
   1442      1.1  christos     gdb_printf ("\n");
   1443  1.1.1.6  christos   }
   1444  1.1.1.6  christos 
   1445  1.1.1.6  christos   void visit (const tdesc_type_with_fields *type) override
   1446  1.1.1.6  christos   {
   1447  1.1.1.8  christos     if (!m_printed_type_with_fields)
   1448  1.1.1.6  christos       {
   1449  1.1.1.6  christos 	gdb_printf ("  tdesc_type_with_fields *type_with_fields;\n");
   1450      1.1  christos 	m_printed_type_with_fields = true;
   1451  1.1.1.6  christos       }
   1452  1.1.1.6  christos 
   1453  1.1.1.6  christos     switch (type->kind)
   1454  1.1.1.6  christos       {
   1455  1.1.1.6  christos       case TDESC_TYPE_STRUCT:
   1456  1.1.1.6  christos       case TDESC_TYPE_FLAGS:
   1457  1.1.1.8  christos 	if (type->kind == TDESC_TYPE_STRUCT)
   1458  1.1.1.6  christos 	  {
   1459  1.1.1.6  christos 	    gdb_printf
   1460  1.1.1.6  christos 	      ("  type_with_fields = tdesc_create_struct (feature, \"%s\");\n",
   1461  1.1.1.8  christos 	       type->name.c_str ());
   1462  1.1.1.6  christos 	    if (type->size != 0)
   1463  1.1.1.6  christos 	      gdb_printf
   1464  1.1.1.6  christos 		("  tdesc_set_struct_size (type_with_fields, %d);\n", type->size);
   1465  1.1.1.6  christos 	  }
   1466  1.1.1.8  christos 	else
   1467  1.1.1.6  christos 	  {
   1468  1.1.1.6  christos 	    gdb_printf
   1469  1.1.1.6  christos 	      ("  type_with_fields = tdesc_create_flags (feature, \"%s\", %d);\n",
   1470  1.1.1.6  christos 	       type->name.c_str (), type->size);
   1471  1.1.1.6  christos 	  }
   1472  1.1.1.6  christos 	for (const tdesc_type_field &f : type->fields)
   1473      1.1  christos 	  {
   1474  1.1.1.6  christos 	    const char *type_name;
   1475  1.1.1.6  christos 
   1476      1.1  christos 	    gdb_assert (f.type != NULL);
   1477  1.1.1.6  christos 	    type_name = f.type->name.c_str ();
   1478  1.1.1.6  christos 
   1479  1.1.1.6  christos 	    /* To minimize changes to generated files, don't emit type
   1480  1.1.1.6  christos 	       info for fields that have defaulted types.  */
   1481  1.1.1.6  christos 	    if (f.start != -1)
   1482  1.1.1.6  christos 	      {
   1483  1.1.1.6  christos 		gdb_assert (f.end != -1);
   1484  1.1.1.6  christos 		if (f.type->kind == TDESC_TYPE_BOOL)
   1485  1.1.1.8  christos 		  {
   1486  1.1.1.6  christos 		    gdb_assert (f.start == f.end);
   1487  1.1.1.6  christos 		    gdb_printf
   1488  1.1.1.6  christos 		      ("  tdesc_add_flag (type_with_fields, %d, \"%s\");\n",
   1489  1.1.1.6  christos 		       f.start, f.name.c_str ());
   1490  1.1.1.6  christos 		  }
   1491  1.1.1.6  christos 		else if ((type->size == 4 && f.type->kind == TDESC_TYPE_UINT32)
   1492  1.1.1.6  christos 			 || (type->size == 8
   1493  1.1.1.8  christos 			     && f.type->kind == TDESC_TYPE_UINT64))
   1494  1.1.1.6  christos 		  {
   1495  1.1.1.6  christos 		    gdb_printf
   1496  1.1.1.6  christos 		      ("  tdesc_add_bitfield (type_with_fields, \"%s\", %d, %d);\n",
   1497  1.1.1.6  christos 		       f.name.c_str (), f.start, f.end);
   1498  1.1.1.6  christos 		  }
   1499  1.1.1.6  christos 		else
   1500  1.1.1.6  christos 		  {
   1501  1.1.1.6  christos 		    printf_field_type_assignment
   1502  1.1.1.8  christos 		      ("tdesc_named_type (feature, \"%s\");\n",
   1503  1.1.1.6  christos 		       type_name);
   1504  1.1.1.6  christos 		    gdb_printf
   1505  1.1.1.6  christos 		      ("  tdesc_add_typed_bitfield (type_with_fields, \"%s\","
   1506  1.1.1.6  christos 		       " %d, %d, field_type);\n",
   1507  1.1.1.6  christos 		       f.name.c_str (), f.start, f.end);
   1508  1.1.1.6  christos 		  }
   1509  1.1.1.6  christos 	      }
   1510  1.1.1.6  christos 	    else /* Not a bitfield.  */
   1511  1.1.1.6  christos 	      {
   1512  1.1.1.6  christos 		gdb_assert (f.end == -1);
   1513  1.1.1.6  christos 		gdb_assert (type->kind == TDESC_TYPE_STRUCT);
   1514  1.1.1.8  christos 		printf_field_type_assignment
   1515  1.1.1.6  christos 		  ("tdesc_named_type (feature, \"%s\");\n", type_name);
   1516  1.1.1.6  christos 		gdb_printf
   1517  1.1.1.6  christos 		  ("  tdesc_add_field (type_with_fields, \"%s\", field_type);\n",
   1518  1.1.1.6  christos 		   f.name.c_str ());
   1519  1.1.1.6  christos 	      }
   1520  1.1.1.6  christos 	  }
   1521  1.1.1.8  christos 	break;
   1522  1.1.1.6  christos       case TDESC_TYPE_UNION:
   1523  1.1.1.6  christos 	gdb_printf
   1524  1.1.1.6  christos 	  ("  type_with_fields = tdesc_create_union (feature, \"%s\");\n",
   1525  1.1.1.6  christos 	   type->name.c_str ());
   1526  1.1.1.6  christos 	for (const tdesc_type_field &f : type->fields)
   1527  1.1.1.6  christos 	  {
   1528  1.1.1.8  christos 	    printf_field_type_assignment
   1529  1.1.1.6  christos 	      ("tdesc_named_type (feature, \"%s\");\n", f.type->name.c_str ());
   1530  1.1.1.6  christos 	    gdb_printf
   1531  1.1.1.6  christos 	      ("  tdesc_add_field (type_with_fields, \"%s\", field_type);\n",
   1532  1.1.1.6  christos 	       f.name.c_str ());
   1533  1.1.1.6  christos 	  }
   1534  1.1.1.8  christos 	break;
   1535  1.1.1.6  christos       case TDESC_TYPE_ENUM:
   1536  1.1.1.6  christos 	gdb_printf
   1537  1.1.1.6  christos 	  ("  type_with_fields = tdesc_create_enum (feature, \"%s\", %d);\n",
   1538  1.1.1.8  christos 	   type->name.c_str (), type->size);
   1539  1.1.1.6  christos 	for (const tdesc_type_field &f : type->fields)
   1540  1.1.1.6  christos 	  gdb_printf
   1541  1.1.1.6  christos 	    ("  tdesc_add_enum_value (type_with_fields, %d, \"%s\");\n",
   1542  1.1.1.6  christos 	     f.start, f.name.c_str ());
   1543  1.1.1.6  christos 	break;
   1544  1.1.1.6  christos       default:
   1545      1.1  christos 	error (_("C output is not supported type \"%s\"."), type->name.c_str ());
   1546  1.1.1.8  christos       }
   1547  1.1.1.6  christos 
   1548      1.1  christos     gdb_printf ("\n");
   1549  1.1.1.6  christos   }
   1550  1.1.1.6  christos 
   1551  1.1.1.8  christos   void visit (const tdesc_reg *reg) override
   1552  1.1.1.8  christos   {
   1553  1.1.1.8  christos     gdb_printf ("  tdesc_create_reg (feature, \"%s\", %ld, %d, ",
   1554  1.1.1.6  christos 		reg->name.c_str (), reg->target_regnum,
   1555  1.1.1.8  christos 		reg->save_restore);
   1556  1.1.1.6  christos     if (!reg->group.empty ())
   1557  1.1.1.8  christos       gdb_printf ("\"%s\", ", reg->group.c_str ());
   1558  1.1.1.8  christos     else
   1559  1.1.1.6  christos       gdb_printf ("NULL, ");
   1560  1.1.1.6  christos     gdb_printf ("%d, \"%s\");\n", reg->bitsize, reg->type.c_str ());
   1561  1.1.1.6  christos   }
   1562  1.1.1.6  christos 
   1563  1.1.1.6  christos protected:
   1564  1.1.1.6  christos   std::string m_filename_after_features;
   1565  1.1.1.6  christos 
   1566  1.1.1.6  christos private:
   1567  1.1.1.6  christos 
   1568  1.1.1.6  christos   /* Print an assignment to the field_type variable.  Print the declaration
   1569  1.1.1.6  christos      of field_type if that has not been done yet.  */
   1570  1.1.1.6  christos   ATTRIBUTE_PRINTF (2, 3)
   1571  1.1.1.6  christos   void printf_field_type_assignment (const char *fmt, ...)
   1572  1.1.1.6  christos   {
   1573  1.1.1.8  christos     if (!m_printed_field_type)
   1574  1.1.1.6  christos       {
   1575  1.1.1.6  christos 	gdb_printf ("  tdesc_type *field_type;\n");
   1576      1.1  christos 	m_printed_field_type = true;
   1577  1.1.1.8  christos       }
   1578      1.1  christos 
   1579  1.1.1.6  christos     gdb_printf ("  field_type = ");
   1580  1.1.1.6  christos 
   1581  1.1.1.8  christos     va_list args;
   1582  1.1.1.6  christos     va_start (args, fmt);
   1583  1.1.1.6  christos     gdb_vprintf (fmt, args);
   1584      1.1  christos     va_end (args);
   1585  1.1.1.6  christos   }
   1586      1.1  christos 
   1587  1.1.1.6  christos   char *m_function;
   1588  1.1.1.6  christos 
   1589      1.1  christos   /* Did we print "struct tdesc_type *element_type;" yet?  */
   1590  1.1.1.6  christos   bool m_printed_element_type = false;
   1591  1.1.1.6  christos 
   1592      1.1  christos   /* Did we print "struct tdesc_type_with_fields *element_type;" yet?  */
   1593  1.1.1.6  christos   bool m_printed_type_with_fields = false;
   1594  1.1.1.6  christos 
   1595  1.1.1.6  christos   /* Did we print "struct tdesc_type *field_type;" yet?  */
   1596      1.1  christos   bool m_printed_field_type = false;
   1597  1.1.1.6  christos };
   1598      1.1  christos 
   1599  1.1.1.6  christos /* Print target description feature in C.  */
   1600      1.1  christos 
   1601  1.1.1.6  christos class print_c_feature : public print_c_tdesc
   1602  1.1.1.6  christos {
   1603  1.1.1.6  christos public:
   1604  1.1.1.6  christos   print_c_feature (std::string &file)
   1605  1.1.1.6  christos     : print_c_tdesc (file)
   1606  1.1.1.6  christos   {
   1607      1.1  christos     /* Trim ".tmp".  */
   1608  1.1.1.6  christos     auto const pos = m_filename_after_features.find_last_of ('.');
   1609  1.1.1.6  christos 
   1610      1.1  christos     m_filename_after_features = m_filename_after_features.substr (0, pos);
   1611  1.1.1.6  christos   }
   1612  1.1.1.6  christos 
   1613  1.1.1.8  christos   void visit_pre (const target_desc *e) override
   1614  1.1.1.8  christos   {
   1615      1.1  christos     gdb_printf ("  Original: %s */\n\n",
   1616  1.1.1.8  christos 		lbasename (m_filename_after_features.c_str ()));
   1617  1.1.1.8  christos 
   1618  1.1.1.6  christos     gdb_printf ("#include \"gdbsupport/tdesc.h\"\n");
   1619      1.1  christos     gdb_printf ("\n");
   1620  1.1.1.6  christos   }
   1621  1.1.1.6  christos 
   1622      1.1  christos   void visit_post (const target_desc *e) override
   1623  1.1.1.6  christos   {}
   1624  1.1.1.6  christos 
   1625  1.1.1.6  christos   void visit_pre (const tdesc_feature *e) override
   1626      1.1  christos   {
   1627  1.1.1.6  christos     std::string name (m_filename_after_features);
   1628      1.1  christos 
   1629  1.1.1.6  christos     auto pos = name.find_first_of ('.');
   1630  1.1.1.6  christos 
   1631  1.1.1.6  christos     name = name.substr (0, pos);
   1632      1.1  christos     std::replace (name.begin (), name.end (), '/', '_');
   1633  1.1.1.8  christos     std::replace (name.begin (), name.end (), '-', '_');
   1634  1.1.1.8  christos 
   1635  1.1.1.8  christos     gdb_printf ("static int\n");
   1636      1.1  christos     gdb_printf ("create_feature_%s ", name.c_str ());
   1637  1.1.1.8  christos     gdb_printf ("(struct target_desc *result, long regnum)\n");
   1638  1.1.1.8  christos 
   1639      1.1  christos     gdb_printf ("{\n");
   1640  1.1.1.8  christos     gdb_printf ("  struct tdesc_feature *feature;\n");
   1641  1.1.1.6  christos 
   1642  1.1.1.6  christos     gdb_printf
   1643  1.1.1.6  christos       ("\n  feature = tdesc_create_feature (result, \"%s\");\n",
   1644      1.1  christos        e->name.c_str ());
   1645  1.1.1.6  christos   }
   1646  1.1.1.6  christos 
   1647  1.1.1.8  christos   void visit_post (const tdesc_feature *e) override
   1648  1.1.1.8  christos   {
   1649  1.1.1.6  christos     gdb_printf ("  return regnum;\n");
   1650      1.1  christos     gdb_printf ("}\n");
   1651  1.1.1.6  christos   }
   1652  1.1.1.6  christos 
   1653  1.1.1.6  christos   void visit (const tdesc_reg *reg) override
   1654  1.1.1.6  christos   {
   1655  1.1.1.6  christos     /* Most "reg" in XML target descriptions don't have "regnum"
   1656  1.1.1.6  christos        attribute, so the register number is allocated sequentially.
   1657      1.1  christos        In case that reg has "regnum" attribute, register number
   1658  1.1.1.6  christos        should be set by that explicitly.  */
   1659  1.1.1.6  christos 
   1660  1.1.1.6  christos     if (reg->target_regnum < m_next_regnum)
   1661  1.1.1.6  christos       {
   1662      1.1  christos 	/* The integrity check, it can catch some errors on register
   1663  1.1.1.6  christos 	   number collision, like this,
   1664  1.1.1.6  christos 
   1665  1.1.1.6  christos 	  <reg name="x0" bitsize="32"/>
   1666  1.1.1.6  christos 	  <reg name="x1" bitsize="32"/>
   1667  1.1.1.6  christos 	  <reg name="x2" bitsize="32"/>
   1668  1.1.1.6  christos 	  <reg name="x3" bitsize="32"/>
   1669  1.1.1.6  christos 	  <reg name="ps" bitsize="32" regnum="3"/>
   1670  1.1.1.6  christos 
   1671  1.1.1.6  christos 	  but it also has false negatives.  The target description
   1672  1.1.1.6  christos 	  below is correct,
   1673  1.1.1.6  christos 
   1674  1.1.1.6  christos 	  <reg name="x1" bitsize="32" regnum="1"/>
   1675  1.1.1.6  christos 	  <reg name="x3" bitsize="32" regnum="3"/>
   1676  1.1.1.6  christos 	  <reg name="x2" bitsize="32" regnum="2"/>
   1677  1.1.1.6  christos 	  <reg name="x4" bitsize="32" regnum="4"/>
   1678  1.1.1.6  christos 
   1679  1.1.1.6  christos 	  but it is not a good practice, so still error on this,
   1680  1.1.1.6  christos 	  and also print the message so that it can be saved in the
   1681  1.1.1.8  christos 	  generated c file.  */
   1682  1.1.1.8  christos 
   1683  1.1.1.8  christos 	gdb_printf ("ERROR: \"regnum\" attribute %ld ",
   1684  1.1.1.8  christos 		    reg->target_regnum);
   1685  1.1.1.6  christos 	gdb_printf ("is not the largest number (%d).\n",
   1686  1.1.1.6  christos 		    m_next_regnum);
   1687  1.1.1.6  christos 	error (_("\"regnum\" attribute %ld is not the largest number (%d)."),
   1688      1.1  christos 	       reg->target_regnum, m_next_regnum);
   1689  1.1.1.6  christos       }
   1690  1.1.1.6  christos 
   1691  1.1.1.8  christos     if (reg->target_regnum > m_next_regnum)
   1692  1.1.1.6  christos       {
   1693  1.1.1.6  christos 	gdb_printf ("  regnum = %ld;\n", reg->target_regnum);
   1694      1.1  christos 	m_next_regnum = reg->target_regnum;
   1695  1.1.1.8  christos       }
   1696  1.1.1.8  christos 
   1697  1.1.1.6  christos     gdb_printf ("  tdesc_create_reg (feature, \"%s\", regnum++, %d, ",
   1698  1.1.1.8  christos 		reg->name.c_str (), reg->save_restore);
   1699  1.1.1.6  christos     if (!reg->group.empty ())
   1700  1.1.1.8  christos       gdb_printf ("\"%s\", ", reg->group.c_str ());
   1701  1.1.1.8  christos     else
   1702      1.1  christos       gdb_printf ("NULL, ");
   1703  1.1.1.6  christos     gdb_printf ("%d, \"%s\");\n", reg->bitsize, reg->type.c_str ());
   1704  1.1.1.6  christos 
   1705      1.1  christos     m_next_regnum++;
   1706  1.1.1.6  christos   }
   1707  1.1.1.6  christos 
   1708  1.1.1.6  christos private:
   1709  1.1.1.6  christos   /* The register number to use for the next register we see.  */
   1710      1.1  christos   int m_next_regnum = 0;
   1711  1.1.1.7  christos };
   1712  1.1.1.6  christos 
   1713  1.1.1.6  christos /* See gdbsupport/tdesc.h.  */
   1714  1.1.1.6  christos 
   1715      1.1  christos const char *
   1716  1.1.1.6  christos tdesc_get_features_xml (const target_desc *tdesc)
   1717  1.1.1.6  christos {
   1718  1.1.1.6  christos   if (tdesc->xmltarget == nullptr)
   1719  1.1.1.6  christos     {
   1720  1.1.1.6  christos       std::string buffer ("@");
   1721  1.1.1.6  christos       print_xml_feature v (&buffer);
   1722  1.1.1.6  christos       tdesc->accept (v);
   1723  1.1.1.6  christos       tdesc->xmltarget = xstrdup (buffer.c_str ());
   1724      1.1  christos     }
   1725      1.1  christos   return tdesc->xmltarget;
   1726  1.1.1.8  christos }
   1727  1.1.1.8  christos 
   1728  1.1.1.8  christos /* Data structures and functions to setup the option flags for 'maintenance
   1729  1.1.1.8  christos    print c-tdesc command.  */
   1730  1.1.1.8  christos 
   1731  1.1.1.8  christos struct maint_print_c_tdesc_options
   1732  1.1.1.8  christos {
   1733  1.1.1.8  christos   /* True when the '-single-feature' flag was passed.  */
   1734  1.1.1.8  christos   bool single_feature = false;
   1735  1.1.1.8  christos };
   1736  1.1.1.8  christos 
   1737  1.1.1.8  christos using maint_print_c_tdesc_opt_def
   1738  1.1.1.8  christos   = gdb::option::flag_option_def<maint_print_c_tdesc_options>;
   1739  1.1.1.8  christos 
   1740  1.1.1.8  christos static const gdb::option::option_def maint_print_c_tdesc_opt_defs[] = {
   1741  1.1.1.8  christos   maint_print_c_tdesc_opt_def {
   1742  1.1.1.8  christos     "single-feature",
   1743  1.1.1.8  christos     [] (maint_print_c_tdesc_options *opt) { return &opt->single_feature; },
   1744  1.1.1.8  christos     N_("Print C description of just a single feature.")
   1745  1.1.1.8  christos   },
   1746  1.1.1.8  christos };
   1747  1.1.1.8  christos 
   1748  1.1.1.8  christos static inline gdb::option::option_def_group
   1749  1.1.1.8  christos make_maint_print_c_tdesc_options_def_group (maint_print_c_tdesc_options *opts)
   1750  1.1.1.8  christos {
   1751  1.1.1.8  christos   return {{maint_print_c_tdesc_opt_defs}, opts};
   1752  1.1.1.8  christos }
   1753  1.1.1.8  christos 
   1754      1.1  christos /* Implement 'maintenance print c-tdesc' command.  */
   1755  1.1.1.6  christos 
   1756      1.1  christos static void
   1757      1.1  christos maint_print_c_tdesc_cmd (const char *args, int from_tty)
   1758  1.1.1.6  christos {
   1759  1.1.1.6  christos   const struct target_desc *tdesc;
   1760  1.1.1.8  christos   const char *filename;
   1761  1.1.1.8  christos 
   1762  1.1.1.8  christos   maint_print_c_tdesc_options opts;
   1763  1.1.1.8  christos   auto grp = make_maint_print_c_tdesc_options_def_group (&opts);
   1764  1.1.1.8  christos   gdb::option::process_options
   1765  1.1.1.6  christos     (&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp);
   1766  1.1.1.6  christos 
   1767  1.1.1.6  christos   if (args == NULL)
   1768  1.1.1.6  christos     {
   1769  1.1.1.6  christos       /* Use the global target-supplied description, not the current
   1770  1.1.1.6  christos 	 architecture's.  This lets a GDB for one architecture generate C
   1771  1.1.1.8  christos 	 for another architecture's description, even though the gdbarch
   1772  1.1.1.8  christos 	 initialization code will reject the new description.  */
   1773  1.1.1.8  christos       target_desc_info *tdesc_info = get_tdesc_info (current_inferior ());
   1774  1.1.1.6  christos       tdesc = tdesc_info->tdesc;
   1775  1.1.1.6  christos       filename = tdesc_info->filename.data ();
   1776  1.1.1.6  christos     }
   1777  1.1.1.6  christos   else
   1778  1.1.1.6  christos     {
   1779  1.1.1.6  christos       /* Use the target description from the XML file.  */
   1780  1.1.1.6  christos       filename = args;
   1781  1.1.1.6  christos       tdesc = file_read_description_xml (filename);
   1782      1.1  christos     }
   1783      1.1  christos 
   1784      1.1  christos   if (tdesc == NULL)
   1785  1.1.1.6  christos     error (_("There is no target description to print."));
   1786  1.1.1.7  christos 
   1787      1.1  christos   if (filename == NULL)
   1788  1.1.1.6  christos     filename = "fetched from target";
   1789  1.1.1.6  christos 
   1790      1.1  christos   std::string filename_after_features (filename);
   1791  1.1.1.6  christos   auto loc = filename_after_features.rfind ("/features/");
   1792  1.1.1.6  christos 
   1793      1.1  christos   if (loc != std::string::npos)
   1794  1.1.1.6  christos     filename_after_features = filename_after_features.substr (loc + 10);
   1795  1.1.1.6  christos 
   1796  1.1.1.6  christos   /* Print c files for target features instead of target descriptions,
   1797  1.1.1.8  christos      because c files got from target features are more flexible than the
   1798  1.1.1.6  christos      counterparts.  */
   1799  1.1.1.8  christos   if (opts.single_feature)
   1800  1.1.1.8  christos     {
   1801  1.1.1.8  christos       if (tdesc->features.size () != 1)
   1802  1.1.1.8  christos 	error (_("only target descriptions with 1 feature can be used "
   1803  1.1.1.6  christos 		 "with -single-feature option"));
   1804      1.1  christos 
   1805  1.1.1.6  christos       print_c_feature v (filename_after_features);
   1806      1.1  christos 
   1807  1.1.1.6  christos       tdesc->accept (v);
   1808      1.1  christos     }
   1809  1.1.1.6  christos   else
   1810  1.1.1.6  christos     {
   1811  1.1.1.6  christos       print_c_tdesc v (filename_after_features);
   1812      1.1  christos 
   1813  1.1.1.6  christos       tdesc->accept (v);
   1814  1.1.1.6  christos     }
   1815  1.1.1.8  christos }
   1816  1.1.1.8  christos 
   1817  1.1.1.8  christos /* Completer for the "backtrace" command.  */
   1818  1.1.1.8  christos 
   1819  1.1.1.8  christos static void
   1820  1.1.1.8  christos maint_print_c_tdesc_cmd_completer (struct cmd_list_element *ignore,
   1821  1.1.1.8  christos 				   completion_tracker &tracker,
   1822  1.1.1.8  christos 				   const char *text, const char *word)
   1823  1.1.1.8  christos {
   1824  1.1.1.8  christos   auto grp = make_maint_print_c_tdesc_options_def_group (nullptr);
   1825  1.1.1.8  christos   if (gdb::option::complete_options
   1826  1.1.1.8  christos       (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp))
   1827  1.1.1.8  christos     return;
   1828  1.1.1.8  christos 
   1829  1.1.1.8  christos   word = advance_to_filename_complete_word_point (tracker, text);
   1830  1.1.1.8  christos   filename_completer (ignore, tracker, text, word);
   1831  1.1.1.7  christos }
   1832  1.1.1.7  christos 
   1833  1.1.1.7  christos /* Implement the maintenance print xml-tdesc command.  */
   1834  1.1.1.7  christos 
   1835  1.1.1.7  christos static void
   1836  1.1.1.7  christos maint_print_xml_tdesc_cmd (const char *args, int from_tty)
   1837  1.1.1.7  christos {
   1838  1.1.1.7  christos   const struct target_desc *tdesc;
   1839  1.1.1.7  christos 
   1840  1.1.1.7  christos   if (args == NULL)
   1841  1.1.1.7  christos     {
   1842  1.1.1.7  christos       /* Use the global target-supplied description, not the current
   1843  1.1.1.7  christos 	 architecture's.  This lets a GDB for one architecture generate XML
   1844  1.1.1.8  christos 	 for another architecture's description, even though the gdbarch
   1845  1.1.1.7  christos 	 initialization code will reject the new description.  */
   1846  1.1.1.7  christos       tdesc = get_tdesc_info (current_inferior ())->tdesc;
   1847  1.1.1.7  christos     }
   1848  1.1.1.7  christos   else
   1849  1.1.1.7  christos     {
   1850  1.1.1.7  christos       /* Use the target description from the XML file.  */
   1851  1.1.1.7  christos       tdesc = file_read_description_xml (args);
   1852  1.1.1.7  christos     }
   1853  1.1.1.7  christos 
   1854  1.1.1.7  christos   if (tdesc == NULL)
   1855  1.1.1.7  christos     error (_("There is no target description to print."));
   1856  1.1.1.7  christos 
   1857  1.1.1.7  christos   std::string buf;
   1858  1.1.1.8  christos   print_xml_feature v (&buf);
   1859  1.1.1.7  christos   tdesc->accept (v);
   1860  1.1.1.7  christos   gdb_puts (buf.c_str ());
   1861  1.1.1.6  christos }
   1862  1.1.1.6  christos 
   1863  1.1.1.6  christos namespace selftests {
   1864  1.1.1.6  christos 
   1865  1.1.1.6  christos /* A reference target description, used for testing (see record_xml_tdesc).  */
   1866  1.1.1.6  christos 
   1867  1.1.1.6  christos struct xml_test_tdesc
   1868  1.1.1.6  christos {
   1869  1.1.1.6  christos   xml_test_tdesc (const char *name, std::unique_ptr<const target_desc> &&tdesc)
   1870  1.1.1.6  christos     : name (name), tdesc (std::move (tdesc))
   1871  1.1.1.6  christos   {}
   1872  1.1.1.6  christos 
   1873  1.1.1.6  christos   const char *name;
   1874  1.1.1.6  christos   std::unique_ptr<const target_desc> tdesc;
   1875  1.1.1.6  christos };
   1876  1.1.1.6  christos 
   1877  1.1.1.6  christos static std::vector<xml_test_tdesc> xml_tdesc;
   1878  1.1.1.6  christos 
   1879  1.1.1.7  christos #if GDB_SELF_TEST
   1880  1.1.1.6  christos 
   1881  1.1.1.6  christos /* See target-descriptions.h.  */
   1882  1.1.1.6  christos 
   1883  1.1.1.6  christos void
   1884  1.1.1.6  christos record_xml_tdesc (const char *xml_file, const struct target_desc *tdesc)
   1885  1.1.1.6  christos {
   1886  1.1.1.6  christos   xml_tdesc.emplace_back (xml_file, std::unique_ptr<const target_desc> (tdesc));
   1887  1.1.1.6  christos }
   1888  1.1.1.6  christos #endif
   1889  1.1.1.6  christos 
   1890  1.1.1.7  christos }
   1891  1.1.1.6  christos 
   1892  1.1.1.6  christos /* Test the conversion process of a target description to/from xml: Take a target
   1893  1.1.1.6  christos    description TDESC, convert to xml, back to a description, and confirm the new
   1894  1.1.1.6  christos    tdesc is identical to the original.  */
   1895  1.1.1.6  christos static bool
   1896  1.1.1.6  christos maintenance_check_tdesc_xml_convert (const target_desc *tdesc, const char *name)
   1897      1.1  christos {
   1898  1.1.1.6  christos   const char *xml = tdesc_get_features_xml (tdesc);
   1899      1.1  christos 
   1900  1.1.1.8  christos   if (xml == nullptr || *xml != '@')
   1901  1.1.1.8  christos     {
   1902  1.1.1.6  christos       gdb_printf (_("Could not convert description for %s to xml.\n"),
   1903      1.1  christos 		  name);
   1904      1.1  christos       return false;
   1905  1.1.1.6  christos     }
   1906  1.1.1.6  christos 
   1907  1.1.1.6  christos   const target_desc *tdesc_trans = string_read_description_xml (xml + 1);
   1908      1.1  christos 
   1909  1.1.1.8  christos   if (tdesc_trans == nullptr)
   1910  1.1.1.8  christos     {
   1911  1.1.1.6  christos       gdb_printf (_("Could not convert description for %s from xml.\n"),
   1912      1.1  christos 		  name);
   1913  1.1.1.6  christos       return false;
   1914      1.1  christos     }
   1915  1.1.1.8  christos   else if (*tdesc != *tdesc_trans)
   1916  1.1.1.8  christos     {
   1917  1.1.1.6  christos       gdb_printf (_("Converted description for %s does not match.\n"),
   1918      1.1  christos 		  name);
   1919  1.1.1.6  christos       return false;
   1920  1.1.1.6  christos     }
   1921      1.1  christos   return true;
   1922      1.1  christos }
   1923  1.1.1.6  christos 
   1924  1.1.1.6  christos 
   1925  1.1.1.6  christos /* Check that the target descriptions created dynamically by
   1926  1.1.1.6  christos    architecture-specific code equal the descriptions created from XML files
   1927  1.1.1.6  christos    found in the specified directory DIR.  */
   1928  1.1.1.6  christos 
   1929  1.1.1.6  christos static void
   1930  1.1.1.6  christos maintenance_check_xml_descriptions (const char *dir, int from_tty)
   1931  1.1.1.6  christos {
   1932  1.1.1.6  christos   if (dir == NULL)
   1933  1.1.1.6  christos     error (_("Missing dir name"));
   1934  1.1.1.6  christos 
   1935  1.1.1.6  christos   gdb::unique_xmalloc_ptr<char> dir1 (tilde_expand (dir));
   1936      1.1  christos   std::string feature_dir (dir1.get ());
   1937  1.1.1.6  christos   unsigned int failed = 0;
   1938  1.1.1.6  christos 
   1939  1.1.1.6  christos   for (auto const &e : selftests::xml_tdesc)
   1940  1.1.1.6  christos     {
   1941  1.1.1.6  christos       std::string tdesc_xml = (feature_dir + SLASH_STRING + e.name);
   1942  1.1.1.6  christos       const target_desc *tdesc
   1943  1.1.1.6  christos 	= file_read_description_xml (tdesc_xml.data ());
   1944      1.1  christos 
   1945  1.1.1.8  christos       if (tdesc == NULL || *tdesc != *e.tdesc)
   1946  1.1.1.6  christos 	{
   1947      1.1  christos 	  gdb_printf ( _("Descriptions for %s do not match.\n"), e.name);
   1948  1.1.1.6  christos 	  failed++;
   1949  1.1.1.6  christos 	}
   1950  1.1.1.6  christos       else if (!maintenance_check_tdesc_xml_convert (tdesc, e.name)
   1951      1.1  christos 	       || !maintenance_check_tdesc_xml_convert (e.tdesc.get (), e.name))
   1952  1.1.1.8  christos 	failed++;
   1953  1.1.1.8  christos     }
   1954      1.1  christos   gdb_printf (_("Tested %lu XML files, %d failed\n"),
   1955      1.1  christos 	      (long) selftests::xml_tdesc.size (), failed);
   1956  1.1.1.7  christos }
   1957      1.1  christos 
   1958  1.1.1.7  christos void _initialize_target_descriptions ();
   1959      1.1  christos void
   1960  1.1.1.7  christos _initialize_target_descriptions ()
   1961  1.1.1.7  christos {
   1962  1.1.1.8  christos   cmd_list_element *cmd;
   1963  1.1.1.8  christos 
   1964  1.1.1.8  christos   add_setshow_prefix_cmd ("tdesc", class_maintenance,
   1965  1.1.1.8  christos 			  _("Set target description specific variables."),
   1966  1.1.1.8  christos 			  _("Show target description specific variables."),
   1967      1.1  christos 			  &tdesc_set_cmdlist, &tdesc_show_cmdlist,
   1968  1.1.1.7  christos 			  &setlist, &showlist);
   1969      1.1  christos 
   1970  1.1.1.8  christos   add_basic_prefix_cmd ("tdesc", class_maintenance, _("\
   1971  1.1.1.7  christos Unset target description specific variables."),
   1972      1.1  christos 			&tdesc_unset_cmdlist,
   1973      1.1  christos 			0 /* allow-unknown */, &unsetlist);
   1974      1.1  christos 
   1975      1.1  christos   add_setshow_filename_cmd ("filename", class_obscure,
   1976  1.1.1.7  christos 			    &tdesc_filename_cmd_string,
   1977  1.1.1.7  christos 			    _("\
   1978      1.1  christos Set the file to read for an XML target description."), _("\
   1979      1.1  christos Show the file to read for an XML target description."), _("\
   1980      1.1  christos When set, GDB will read the target description from a local\n\
   1981      1.1  christos file instead of querying the remote target."),
   1982      1.1  christos 			    set_tdesc_filename_cmd,
   1983      1.1  christos 			    show_tdesc_filename_cmd,
   1984      1.1  christos 			    &tdesc_set_cmdlist, &tdesc_show_cmdlist);
   1985  1.1.1.7  christos 
   1986  1.1.1.7  christos   add_cmd ("filename", class_obscure, unset_tdesc_filename_cmd, _("\
   1987      1.1  christos Unset the file to read for an XML target description.\n\
   1988      1.1  christos When unset, GDB will read the description from the target."),
   1989  1.1.1.8  christos 	   &tdesc_unset_cmdlist);
   1990  1.1.1.8  christos 
   1991  1.1.1.8  christos   auto grp = make_maint_print_c_tdesc_options_def_group (nullptr);
   1992  1.1.1.8  christos   static std::string help_text
   1993  1.1.1.8  christos     = gdb::option::build_help (_("\
   1994  1.1.1.8  christos Print the current target description as a C source file.\n\
   1995  1.1.1.8  christos Usage: maintenance print c-tdesc [OPTION] [FILENAME]\n\
   1996  1.1.1.8  christos \n\
   1997  1.1.1.8  christos Options:\n\
   1998  1.1.1.8  christos %OPTIONS%\n\
   1999  1.1.1.8  christos \n\
   2000  1.1.1.8  christos When FILENAME is not provided then print the current target\n\
   2001  1.1.1.8  christos description, otherwise an XML target description is read from\n\
   2002  1.1.1.8  christos FILENAME and printed as a C function.\n\
   2003  1.1.1.8  christos \n\
   2004  1.1.1.8  christos When '-single-feature' is used then the target description should\n\
   2005  1.1.1.8  christos contain a single feature and the generated C code will only create\n\
   2006  1.1.1.8  christos that feature within an already existing target_desc object."), grp);
   2007  1.1.1.8  christos   cmd = add_cmd ("c-tdesc", class_maintenance, maint_print_c_tdesc_cmd,
   2008  1.1.1.6  christos 		 help_text.c_str (), &maintenanceprintlist);
   2009  1.1.1.7  christos   set_cmd_completer_handle_brkchars (cmd, maint_print_c_tdesc_cmd_completer);
   2010  1.1.1.7  christos 
   2011  1.1.1.7  christos   cmd = add_cmd ("xml-tdesc", class_maintenance, maint_print_xml_tdesc_cmd, _("\
   2012  1.1.1.7  christos Print the current target description as an XML file."),
   2013  1.1.1.6  christos 		 &maintenanceprintlist);
   2014  1.1.1.6  christos   set_cmd_completer (cmd, filename_completer);
   2015  1.1.1.6  christos 
   2016  1.1.1.7  christos   cmd = add_cmd ("xml-descriptions", class_maintenance,
   2017  1.1.1.6  christos 		 maintenance_check_xml_descriptions, _("\
   2018  1.1.1.6  christos Check equality of GDB target descriptions and XML created descriptions.\n\
   2019  1.1.1.6  christos Check the target descriptions created in GDB equal the descriptions\n\
   2020  1.1.1.6  christos created from XML files in the directory.\n\
   2021  1.1.1.6  christos The parameter is the directory name."),
   2022      1.1  christos 		 &maintenancechecklist);
   2023                      set_cmd_completer (cmd, filename_completer);
   2024                    }
   2025