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