Home | History | Annotate | Line # | Download | only in gdb
ctfread.c revision 1.1.1.4
      1      1.1  christos /* Compact ANSI-C Type Format (CTF) support in GDB.
      2      1.1  christos 
      3  1.1.1.3  christos    Copyright (C) 2019-2024 Free Software Foundation, Inc.
      4      1.1  christos 
      5      1.1  christos    This file is part of GDB.
      6      1.1  christos 
      7      1.1  christos    This program is free software; you can redistribute it and/or modify
      8      1.1  christos    it under the terms of the GNU General Public License as published by
      9      1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10      1.1  christos    (at your option) any later version.
     11      1.1  christos 
     12      1.1  christos    This program is distributed in the hope that it will be useful,
     13      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15      1.1  christos    GNU General Public License for more details.
     16      1.1  christos 
     17      1.1  christos    You should have received a copy of the GNU General Public License
     18      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19      1.1  christos 
     20      1.1  christos /* This file format can be used to compactly represent the information needed
     21      1.1  christos    by a debugger to interpret the ANSI-C types used by a given program.
     22      1.1  christos    Traditionally, this kind of information is generated by the compiler when
     23      1.1  christos    invoked with the -g flag and is stored in "stabs" strings or in the more
     24      1.1  christos    modern DWARF format. A new -gtLEVEL option has been added in gcc to generate
     25      1.1  christos    such information. CTF provides a representation of only the information
     26      1.1  christos    that is relevant to debugging a complex, optimized C program such as the
     27      1.1  christos    operating system kernel in a form that is significantly more compact than
     28      1.1  christos    the equivalent stabs or DWARF representation.  The format is data-model
     29      1.1  christos    independent, so consumers do not need different code depending on whether
     30      1.1  christos    they are 32-bit or 64-bit programs.  CTF assumes that a standard ELF symbol
     31      1.1  christos    table is available for use in the debugger, and uses the structure and data
     32      1.1  christos    of the symbol table to avoid storing redundant information.  The CTF data
     33      1.1  christos    may be compressed on disk or in memory, indicated by a bit in the header.
     34      1.1  christos    CTF may be interpreted in a raw disk file, or it may be stored in an ELF
     35      1.1  christos    section, typically named .ctf.  Data structures are aligned so that a raw
     36      1.1  christos    CTF file or CTF ELF section may be manipulated using mmap(2).
     37      1.1  christos 
     38      1.1  christos    The CTF file or section itself has the following structure:
     39      1.1  christos 
     40      1.1  christos    +--------+--------+---------+----------+----------+-------+--------+
     41      1.1  christos    |  file  |  type  |  data   | function | variable | data  | string |
     42      1.1  christos    | header | labels | objects |   info   |   info   | types | table  |
     43      1.1  christos    +--------+--------+---------+----------+----------+-------+--------+
     44      1.1  christos 
     45      1.1  christos    The file header stores a magic number and version information, encoding
     46      1.1  christos    flags, and the byte offset of each of the sections relative to the end of the
     47      1.1  christos    header itself.  If the CTF data has been uniquified against another set of
     48      1.1  christos    CTF data, a reference to that data also appears in the header.  This
     49      1.1  christos    reference is the name of the label corresponding to the types uniquified
     50      1.1  christos    against.
     51      1.1  christos 
     52      1.1  christos    Following the header is a list of labels, used to group the types included in
     53      1.1  christos    the data types section.  Each label is accompanied by a type ID i.  A given
     54      1.1  christos    label refers to the group of types whose IDs are in the range [0, i].
     55      1.1  christos 
     56      1.1  christos    Data object and function records are stored in the same order as they appear
     57      1.1  christos    in the corresponding symbol table, except that symbols marked SHN_UNDEF are
     58      1.1  christos    not stored and symbols that have no type data are padded out with zeroes.
     59      1.1  christos    For each data object, the type ID (a small integer) is recorded.  For each
     60      1.1  christos    function, the type ID of the return type and argument types is recorded.
     61      1.1  christos 
     62      1.1  christos    Variable records (as distinct from data objects) provide a modicum of support
     63      1.1  christos    for non-ELF systems, mapping a variable name to a CTF type ID.  The variable
     64      1.1  christos    names are sorted into ASCIIbetical order, permitting binary searching.
     65      1.1  christos 
     66      1.1  christos    The data types section is a list of variable size records that represent each
     67      1.1  christos    type, in order by their ID.  The types themselves form a directed graph,
     68      1.1  christos    where each node may contain one or more outgoing edges to other type nodes,
     69      1.1  christos    denoted by their ID.
     70      1.1  christos 
     71      1.1  christos    Strings are recorded as a string table ID (0 or 1) and a byte offset into the
     72      1.1  christos    string table.  String table 0 is the internal CTF string table.  String table
     73      1.1  christos    1 is the external string table, which is the string table associated with the
     74      1.1  christos    ELF symbol table for this object.  CTF does not record any strings that are
     75      1.1  christos    already in the symbol table, and the CTF string table does not contain any
     76      1.1  christos    duplicated strings.  */
     77      1.1  christos 
     78      1.1  christos #include "buildsym.h"
     79      1.1  christos #include "complaints.h"
     80      1.1  christos #include "block.h"
     81      1.1  christos #include "ctfread.h"
     82  1.1.1.3  christos #include "psymtab.h"
     83      1.1  christos 
     84      1.1  christos #if ENABLE_LIBCTF
     85      1.1  christos 
     86      1.1  christos #include "ctf.h"
     87      1.1  christos #include "ctf-api.h"
     88      1.1  christos 
     89  1.1.1.2  christos static const registry<objfile>::key<htab, htab_deleter> ctf_tid_key;
     90      1.1  christos 
     91      1.1  christos struct ctf_fp_info
     92      1.1  christos {
     93  1.1.1.2  christos   explicit ctf_fp_info (ctf_dict_t *cfp) : fp (cfp) {}
     94      1.1  christos   ~ctf_fp_info ();
     95  1.1.1.2  christos   ctf_dict_t *fp;
     96      1.1  christos };
     97      1.1  christos 
     98  1.1.1.2  christos /* Cleanup function for the ctf_dict_key data.  */
     99      1.1  christos ctf_fp_info::~ctf_fp_info ()
    100      1.1  christos {
    101  1.1.1.2  christos   if (fp == nullptr)
    102      1.1  christos     return;
    103      1.1  christos 
    104      1.1  christos   ctf_archive_t *arc = ctf_get_arc (fp);
    105  1.1.1.2  christos   ctf_dict_close (fp);
    106      1.1  christos   ctf_close (arc);
    107      1.1  christos }
    108      1.1  christos 
    109  1.1.1.2  christos static const registry<objfile>::key<ctf_fp_info> ctf_dict_key;
    110      1.1  christos 
    111      1.1  christos /* A CTF context consists of a file pointer and an objfile pointer.  */
    112      1.1  christos 
    113      1.1  christos struct ctf_context
    114      1.1  christos {
    115  1.1.1.2  christos   ctf_dict_t *fp;
    116      1.1  christos   struct objfile *of;
    117  1.1.1.2  christos   psymtab_storage *partial_symtabs;
    118  1.1.1.2  christos   partial_symtab *pst;
    119  1.1.1.2  christos   ctf_archive_t *arc;
    120      1.1  christos   struct buildsym_compunit *builder;
    121      1.1  christos };
    122      1.1  christos 
    123      1.1  christos /* A partial symtab, specialized for this module.  */
    124      1.1  christos struct ctf_psymtab : public standard_psymtab
    125      1.1  christos {
    126  1.1.1.2  christos   ctf_psymtab (const char *filename,
    127  1.1.1.2  christos 	       psymtab_storage *partial_symtabs,
    128  1.1.1.2  christos 	       objfile_per_bfd_storage *objfile_per_bfd,
    129  1.1.1.3  christos 	       unrelocated_addr addr)
    130  1.1.1.2  christos     : standard_psymtab (filename, partial_symtabs, objfile_per_bfd, addr)
    131      1.1  christos   {
    132      1.1  christos   }
    133      1.1  christos 
    134      1.1  christos   void read_symtab (struct objfile *) override;
    135      1.1  christos   void expand_psymtab (struct objfile *) override;
    136      1.1  christos 
    137  1.1.1.2  christos   struct ctf_context context;
    138      1.1  christos };
    139      1.1  christos 
    140      1.1  christos /* The routines that read and process fields/members of a C struct, union,
    141      1.1  christos    or enumeration, pass lists of data member fields in an instance of a
    142      1.1  christos    ctf_field_info structure. It is derived from dwarf2read.c.  */
    143      1.1  christos 
    144      1.1  christos struct ctf_nextfield
    145      1.1  christos {
    146      1.1  christos   struct field field {};
    147      1.1  christos };
    148      1.1  christos 
    149      1.1  christos struct ctf_field_info
    150      1.1  christos {
    151      1.1  christos   /* List of data member fields.  */
    152      1.1  christos   std::vector<struct ctf_nextfield> fields;
    153      1.1  christos 
    154      1.1  christos   /* Context.  */
    155      1.1  christos   struct ctf_context *cur_context;
    156      1.1  christos 
    157      1.1  christos   /* Parent type.  */
    158      1.1  christos   struct type *ptype;
    159      1.1  christos 
    160      1.1  christos   /* typedefs defined inside this class.  TYPEDEF_FIELD_LIST contains head
    161      1.1  christos      of a NULL terminated list of TYPEDEF_FIELD_LIST_COUNT elements.  */
    162      1.1  christos   std::vector<struct decl_field> typedef_field_list;
    163      1.1  christos 
    164      1.1  christos   /* Nested types defined by this struct and the number of elements in
    165      1.1  christos      this list.  */
    166      1.1  christos   std::vector<struct decl_field> nested_types_list;
    167      1.1  christos };
    168      1.1  christos 
    169  1.1.1.2  christos /* Data held for a translation unit.  */
    170  1.1.1.2  christos 
    171  1.1.1.2  christos struct ctf_per_tu_data
    172  1.1.1.2  christos {
    173  1.1.1.2  christos   ctf_dict_t *fp;
    174  1.1.1.2  christos   struct objfile *of;
    175  1.1.1.2  christos   ctf_archive_t *arc;
    176  1.1.1.2  christos   psymtab_storage *pss;
    177  1.1.1.2  christos   psymbol_functions *psf;
    178  1.1.1.2  christos };
    179      1.1  christos 
    180      1.1  christos /* Local function prototypes */
    181      1.1  christos 
    182      1.1  christos static int ctf_add_type_cb (ctf_id_t tid, void *arg);
    183      1.1  christos 
    184      1.1  christos static struct type *read_array_type (struct ctf_context *cp, ctf_id_t tid);
    185      1.1  christos 
    186      1.1  christos static struct type *read_pointer_type (struct ctf_context *cp, ctf_id_t tid,
    187      1.1  christos 				       ctf_id_t btid);
    188      1.1  christos 
    189      1.1  christos static struct type *read_structure_type (struct ctf_context *cp, ctf_id_t tid);
    190      1.1  christos 
    191      1.1  christos static struct type *read_enum_type (struct ctf_context *cp, ctf_id_t tid);
    192      1.1  christos 
    193      1.1  christos static struct type *read_typedef_type (struct ctf_context *cp, ctf_id_t tid,
    194      1.1  christos 				       ctf_id_t btid, const char *name);
    195      1.1  christos 
    196      1.1  christos static struct type *read_type_record (struct ctf_context *cp, ctf_id_t tid);
    197      1.1  christos 
    198      1.1  christos static void process_structure_type (struct ctf_context *cp, ctf_id_t tid);
    199      1.1  christos 
    200      1.1  christos static void process_struct_members (struct ctf_context *cp, ctf_id_t tid,
    201      1.1  christos 				    struct type *type);
    202      1.1  christos 
    203  1.1.1.2  christos static struct type *read_forward_type (struct ctf_context *cp, ctf_id_t tid);
    204  1.1.1.2  christos 
    205      1.1  christos static struct symbol *new_symbol (struct ctf_context *cp, struct type *type,
    206      1.1  christos 				  ctf_id_t tid);
    207      1.1  christos 
    208      1.1  christos struct ctf_tid_and_type
    209      1.1  christos {
    210      1.1  christos   ctf_id_t tid;
    211      1.1  christos   struct type *type;
    212      1.1  christos };
    213      1.1  christos 
    214      1.1  christos /* Hash function for a ctf_tid_and_type.  */
    215      1.1  christos 
    216      1.1  christos static hashval_t
    217      1.1  christos tid_and_type_hash (const void *item)
    218      1.1  christos {
    219      1.1  christos   const struct ctf_tid_and_type *ids
    220      1.1  christos     = (const struct ctf_tid_and_type *) item;
    221      1.1  christos 
    222      1.1  christos   return ids->tid;
    223      1.1  christos }
    224      1.1  christos 
    225      1.1  christos /* Equality function for a ctf_tid_and_type.  */
    226      1.1  christos 
    227      1.1  christos static int
    228      1.1  christos tid_and_type_eq (const void *item_lhs, const void *item_rhs)
    229      1.1  christos {
    230      1.1  christos   const struct ctf_tid_and_type *ids_lhs
    231      1.1  christos     = (const struct ctf_tid_and_type *) item_lhs;
    232      1.1  christos   const struct ctf_tid_and_type *ids_rhs
    233      1.1  christos     = (const struct ctf_tid_and_type *) item_rhs;
    234      1.1  christos 
    235      1.1  christos   return ids_lhs->tid == ids_rhs->tid;
    236      1.1  christos }
    237      1.1  christos 
    238      1.1  christos /* Set the type associated with TID to TYP.  */
    239      1.1  christos 
    240      1.1  christos static struct type *
    241      1.1  christos set_tid_type (struct objfile *of, ctf_id_t tid, struct type *typ)
    242      1.1  christos {
    243      1.1  christos   htab_t htab;
    244      1.1  christos 
    245  1.1.1.2  christos   htab = ctf_tid_key.get (of);
    246      1.1  christos   if (htab == NULL)
    247      1.1  christos     {
    248      1.1  christos       htab = htab_create_alloc (1, tid_and_type_hash,
    249      1.1  christos 				tid_and_type_eq,
    250      1.1  christos 				NULL, xcalloc, xfree);
    251      1.1  christos       ctf_tid_key.set (of, htab);
    252      1.1  christos     }
    253      1.1  christos 
    254      1.1  christos   struct ctf_tid_and_type **slot, ids;
    255      1.1  christos   ids.tid = tid;
    256      1.1  christos   ids.type = typ;
    257      1.1  christos   slot = (struct ctf_tid_and_type **) htab_find_slot (htab, &ids, INSERT);
    258  1.1.1.2  christos   if (*slot == nullptr)
    259  1.1.1.2  christos     *slot = XOBNEW (&of->objfile_obstack, struct ctf_tid_and_type);
    260      1.1  christos   **slot = ids;
    261      1.1  christos   return typ;
    262      1.1  christos }
    263      1.1  christos 
    264      1.1  christos /* Look up the type for TID in tid_and_type hash, return NULL if hash is
    265      1.1  christos    empty or TID does not have a saved type.  */
    266      1.1  christos 
    267      1.1  christos static struct type *
    268      1.1  christos get_tid_type (struct objfile *of, ctf_id_t tid)
    269      1.1  christos {
    270      1.1  christos   struct ctf_tid_and_type *slot, ids;
    271      1.1  christos   htab_t htab;
    272      1.1  christos 
    273  1.1.1.2  christos   htab = ctf_tid_key.get (of);
    274      1.1  christos   if (htab == NULL)
    275  1.1.1.2  christos     return nullptr;
    276      1.1  christos 
    277      1.1  christos   ids.tid = tid;
    278  1.1.1.2  christos   ids.type = nullptr;
    279      1.1  christos   slot = (struct ctf_tid_and_type *) htab_find (htab, &ids);
    280      1.1  christos   if (slot)
    281      1.1  christos     return slot->type;
    282      1.1  christos   else
    283  1.1.1.2  christos     return nullptr;
    284  1.1.1.2  christos }
    285  1.1.1.2  christos 
    286  1.1.1.2  christos /* Fetch the type for TID in CCP OF's tid_and_type hash, add the type to
    287  1.1.1.2  christos  *    context CCP if hash is empty or TID does not have a saved type.  */
    288  1.1.1.2  christos 
    289  1.1.1.2  christos static struct type *
    290  1.1.1.2  christos fetch_tid_type (struct ctf_context *ccp, ctf_id_t tid)
    291  1.1.1.2  christos {
    292  1.1.1.2  christos   struct objfile *of = ccp->of;
    293  1.1.1.2  christos   struct type *typ;
    294  1.1.1.2  christos 
    295  1.1.1.2  christos   typ = get_tid_type (of, tid);
    296  1.1.1.2  christos   if (typ == nullptr)
    297  1.1.1.2  christos     {
    298  1.1.1.2  christos       ctf_add_type_cb (tid, ccp);
    299  1.1.1.2  christos       typ = get_tid_type (of, tid);
    300  1.1.1.2  christos     }
    301  1.1.1.2  christos 
    302  1.1.1.2  christos   return typ;
    303      1.1  christos }
    304      1.1  christos 
    305      1.1  christos /* Return the size of storage in bits for INTEGER, FLOAT, or ENUM.  */
    306      1.1  christos 
    307      1.1  christos static int
    308  1.1.1.2  christos get_bitsize (ctf_dict_t *fp, ctf_id_t tid, uint32_t kind)
    309      1.1  christos {
    310      1.1  christos   ctf_encoding_t cet;
    311      1.1  christos 
    312      1.1  christos   if ((kind == CTF_K_INTEGER || kind == CTF_K_ENUM
    313      1.1  christos       || kind == CTF_K_FLOAT)
    314      1.1  christos       && ctf_type_reference (fp, tid) != CTF_ERR
    315      1.1  christos       && ctf_type_encoding (fp, tid, &cet) != CTF_ERR)
    316      1.1  christos     return cet.cte_bits;
    317      1.1  christos 
    318      1.1  christos   return 0;
    319      1.1  christos }
    320      1.1  christos 
    321      1.1  christos /* Set SYM's address, with NAME, from its minimal symbol entry.  */
    322      1.1  christos 
    323      1.1  christos static void
    324      1.1  christos set_symbol_address (struct objfile *of, struct symbol *sym, const char *name)
    325      1.1  christos {
    326  1.1.1.4  christos   bound_minimal_symbol msym
    327  1.1.1.4  christos     = lookup_minimal_symbol (current_program_space, name, of);
    328      1.1  christos   if (msym.minsym != NULL)
    329      1.1  christos     {
    330  1.1.1.2  christos       sym->set_value_address (msym.value_address ());
    331  1.1.1.2  christos       sym->set_aclass_index (LOC_STATIC);
    332  1.1.1.2  christos       sym->set_section_index (msym.minsym->section_index ());
    333      1.1  christos     }
    334      1.1  christos }
    335      1.1  christos 
    336      1.1  christos /* Create the vector of fields, and attach it to TYPE.  */
    337      1.1  christos 
    338      1.1  christos static void
    339      1.1  christos attach_fields_to_type (struct ctf_field_info *fip, struct type *type)
    340      1.1  christos {
    341      1.1  christos   int nfields = fip->fields.size ();
    342      1.1  christos 
    343      1.1  christos   if (nfields == 0)
    344      1.1  christos     return;
    345      1.1  christos 
    346      1.1  christos   /* Record the field count, allocate space for the array of fields.  */
    347  1.1.1.3  christos   type->alloc_fields (nfields);
    348      1.1  christos 
    349      1.1  christos   /* Copy the saved-up fields into the field vector.  */
    350      1.1  christos   for (int i = 0; i < nfields; ++i)
    351      1.1  christos     {
    352      1.1  christos       struct ctf_nextfield &field = fip->fields[i];
    353      1.1  christos       type->field (i) = field.field;
    354      1.1  christos     }
    355      1.1  christos }
    356      1.1  christos 
    357      1.1  christos /* Allocate a floating-point type of size BITS and name NAME.  Pass NAME_HINT
    358      1.1  christos    (which may be different from NAME) to the architecture back-end to allow
    359      1.1  christos    it to guess the correct format if necessary.  */
    360      1.1  christos 
    361      1.1  christos static struct type *
    362      1.1  christos ctf_init_float_type (struct objfile *objfile,
    363      1.1  christos 		     int bits,
    364      1.1  christos 		     const char *name,
    365      1.1  christos 		     const char *name_hint)
    366      1.1  christos {
    367      1.1  christos   struct gdbarch *gdbarch = objfile->arch ();
    368      1.1  christos   const struct floatformat **format;
    369      1.1  christos   struct type *type;
    370      1.1  christos 
    371  1.1.1.3  christos   type_allocator alloc (objfile, language_c);
    372      1.1  christos   format = gdbarch_floatformat_for_type (gdbarch, name_hint, bits);
    373  1.1.1.2  christos   if (format != nullptr)
    374  1.1.1.3  christos     type = init_float_type (alloc, bits, name, format);
    375      1.1  christos   else
    376  1.1.1.3  christos     type = alloc.new_type (TYPE_CODE_ERROR, bits, name);
    377      1.1  christos 
    378      1.1  christos   return type;
    379      1.1  christos }
    380      1.1  christos 
    381      1.1  christos /* Callback to add member NAME to a struct/union type. TID is the type
    382      1.1  christos    of struct/union member, OFFSET is the offset of member in bits,
    383      1.1  christos    and ARG contains the ctf_field_info.  */
    384      1.1  christos 
    385      1.1  christos static int
    386      1.1  christos ctf_add_member_cb (const char *name,
    387      1.1  christos 		   ctf_id_t tid,
    388      1.1  christos 		   unsigned long offset,
    389      1.1  christos 		   void *arg)
    390      1.1  christos {
    391      1.1  christos   struct ctf_field_info *fip = (struct ctf_field_info *) arg;
    392      1.1  christos   struct ctf_context *ccp = fip->cur_context;
    393      1.1  christos   struct ctf_nextfield new_field;
    394      1.1  christos   struct field *fp;
    395      1.1  christos   struct type *t;
    396      1.1  christos   uint32_t kind;
    397      1.1  christos 
    398      1.1  christos   fp = &new_field.field;
    399  1.1.1.2  christos   fp->set_name (name);
    400      1.1  christos 
    401      1.1  christos   kind = ctf_type_kind (ccp->fp, tid);
    402  1.1.1.2  christos   t = fetch_tid_type (ccp, tid);
    403  1.1.1.2  christos   if (t == nullptr)
    404      1.1  christos     {
    405      1.1  christos       t = read_type_record (ccp, tid);
    406  1.1.1.2  christos       if (t == nullptr)
    407      1.1  christos 	{
    408      1.1  christos 	  complaint (_("ctf_add_member_cb: %s has NO type (%ld)"), name, tid);
    409  1.1.1.3  christos 	  t = builtin_type (ccp->of)->builtin_error;
    410      1.1  christos 	  set_tid_type (ccp->of, tid, t);
    411      1.1  christos 	}
    412      1.1  christos     }
    413      1.1  christos 
    414      1.1  christos   if (kind == CTF_K_STRUCT || kind == CTF_K_UNION)
    415      1.1  christos     process_struct_members (ccp, tid, t);
    416      1.1  christos 
    417      1.1  christos   fp->set_type (t);
    418  1.1.1.2  christos   fp->set_loc_bitpos (offset / TARGET_CHAR_BIT);
    419  1.1.1.3  christos   fp->set_bitsize (get_bitsize (ccp->fp, tid, kind));
    420      1.1  christos 
    421      1.1  christos   fip->fields.emplace_back (new_field);
    422      1.1  christos 
    423      1.1  christos   return 0;
    424      1.1  christos }
    425      1.1  christos 
    426      1.1  christos /* Callback to add member NAME of EVAL to an enumeration type.
    427      1.1  christos    ARG contains the ctf_field_info.  */
    428      1.1  christos 
    429      1.1  christos static int
    430      1.1  christos ctf_add_enum_member_cb (const char *name, int enum_value, void *arg)
    431      1.1  christos {
    432      1.1  christos   struct ctf_field_info *fip = (struct ctf_field_info *) arg;
    433      1.1  christos   struct ctf_nextfield new_field;
    434      1.1  christos   struct field *fp;
    435      1.1  christos   struct ctf_context *ccp = fip->cur_context;
    436      1.1  christos 
    437      1.1  christos   fp = &new_field.field;
    438  1.1.1.2  christos   fp->set_name (name);
    439  1.1.1.2  christos   fp->set_type (nullptr);
    440  1.1.1.2  christos   fp->set_loc_enumval (enum_value);
    441  1.1.1.3  christos   fp->set_bitsize (0);
    442      1.1  christos 
    443  1.1.1.2  christos   if (name != nullptr)
    444      1.1  christos     {
    445      1.1  christos       struct symbol *sym = new (&ccp->of->objfile_obstack) symbol;
    446      1.1  christos       OBJSTAT (ccp->of, n_syms++);
    447      1.1  christos 
    448      1.1  christos       sym->set_language (language_c, &ccp->of->objfile_obstack);
    449      1.1  christos       sym->compute_and_set_names (name, false, ccp->of->per_bfd);
    450  1.1.1.2  christos       sym->set_aclass_index (LOC_CONST);
    451  1.1.1.2  christos       sym->set_domain (VAR_DOMAIN);
    452  1.1.1.2  christos       sym->set_type (fip->ptype);
    453      1.1  christos       add_symbol_to_list (sym, ccp->builder->get_global_symbols ());
    454      1.1  christos     }
    455      1.1  christos 
    456      1.1  christos   fip->fields.emplace_back (new_field);
    457      1.1  christos 
    458      1.1  christos   return 0;
    459      1.1  christos }
    460      1.1  christos 
    461      1.1  christos /* Add a new symbol entry, with its name from TID, its access index and
    462      1.1  christos    domain from TID's kind, and its type from TYPE.  */
    463      1.1  christos 
    464      1.1  christos static struct symbol *
    465      1.1  christos new_symbol (struct ctf_context *ccp, struct type *type, ctf_id_t tid)
    466      1.1  christos {
    467      1.1  christos   struct objfile *objfile = ccp->of;
    468  1.1.1.2  christos   ctf_dict_t *fp = ccp->fp;
    469  1.1.1.2  christos   struct symbol *sym = nullptr;
    470      1.1  christos 
    471  1.1.1.2  christos   const char *name = ctf_type_name_raw (fp, tid);
    472  1.1.1.2  christos   if (name != nullptr)
    473      1.1  christos     {
    474      1.1  christos       sym = new (&objfile->objfile_obstack) symbol;
    475      1.1  christos       OBJSTAT (objfile, n_syms++);
    476      1.1  christos 
    477      1.1  christos       sym->set_language (language_c, &objfile->objfile_obstack);
    478  1.1.1.2  christos       sym->compute_and_set_names (name, false, objfile->per_bfd);
    479  1.1.1.2  christos       sym->set_domain (VAR_DOMAIN);
    480  1.1.1.2  christos       sym->set_aclass_index (LOC_OPTIMIZED_OUT);
    481      1.1  christos 
    482  1.1.1.2  christos       if (type != nullptr)
    483  1.1.1.2  christos 	sym->set_type (type);
    484      1.1  christos 
    485      1.1  christos       uint32_t kind = ctf_type_kind (fp, tid);
    486      1.1  christos       switch (kind)
    487      1.1  christos 	{
    488      1.1  christos 	  case CTF_K_STRUCT:
    489      1.1  christos 	  case CTF_K_UNION:
    490      1.1  christos 	  case CTF_K_ENUM:
    491  1.1.1.2  christos 	    sym->set_aclass_index (LOC_TYPEDEF);
    492  1.1.1.2  christos 	    sym->set_domain (STRUCT_DOMAIN);
    493      1.1  christos 	    break;
    494      1.1  christos 	  case CTF_K_FUNCTION:
    495  1.1.1.2  christos 	    sym->set_aclass_index (LOC_STATIC);
    496  1.1.1.2  christos 	    set_symbol_address (objfile, sym, sym->linkage_name ());
    497      1.1  christos 	    break;
    498      1.1  christos 	  case CTF_K_CONST:
    499  1.1.1.2  christos 	    if (sym->type ()->code () == TYPE_CODE_VOID)
    500  1.1.1.3  christos 	      sym->set_type (builtin_type (objfile)->builtin_int);
    501      1.1  christos 	    break;
    502      1.1  christos 	  case CTF_K_TYPEDEF:
    503      1.1  christos 	  case CTF_K_INTEGER:
    504      1.1  christos 	  case CTF_K_FLOAT:
    505  1.1.1.2  christos 	    sym->set_aclass_index (LOC_TYPEDEF);
    506  1.1.1.3  christos 	    sym->set_domain (TYPE_DOMAIN);
    507      1.1  christos 	    break;
    508      1.1  christos 	  case CTF_K_POINTER:
    509      1.1  christos 	    break;
    510      1.1  christos 	  case CTF_K_VOLATILE:
    511      1.1  christos 	  case CTF_K_RESTRICT:
    512      1.1  christos 	    break;
    513      1.1  christos 	  case CTF_K_SLICE:
    514      1.1  christos 	  case CTF_K_ARRAY:
    515      1.1  christos 	  case CTF_K_UNKNOWN:
    516      1.1  christos 	    break;
    517      1.1  christos 	}
    518      1.1  christos 
    519  1.1.1.2  christos       add_symbol_to_list (sym, ccp->builder->get_file_symbols ());
    520      1.1  christos     }
    521      1.1  christos 
    522      1.1  christos   return sym;
    523      1.1  christos }
    524      1.1  christos 
    525      1.1  christos /* Given a TID of kind CTF_K_INTEGER or CTF_K_FLOAT, find a representation
    526      1.1  christos    and create the symbol for it.  */
    527      1.1  christos 
    528      1.1  christos static struct type *
    529      1.1  christos read_base_type (struct ctf_context *ccp, ctf_id_t tid)
    530      1.1  christos {
    531      1.1  christos   struct objfile *of = ccp->of;
    532  1.1.1.2  christos   ctf_dict_t *fp = ccp->fp;
    533      1.1  christos   ctf_encoding_t cet;
    534  1.1.1.2  christos   struct type *type = nullptr;
    535  1.1.1.2  christos   const char *name;
    536      1.1  christos   uint32_t kind;
    537      1.1  christos 
    538      1.1  christos   if (ctf_type_encoding (fp, tid, &cet))
    539      1.1  christos     {
    540      1.1  christos       complaint (_("ctf_type_encoding read_base_type failed - %s"),
    541      1.1  christos 		 ctf_errmsg (ctf_errno (fp)));
    542  1.1.1.2  christos       return nullptr;
    543      1.1  christos     }
    544      1.1  christos 
    545  1.1.1.2  christos   name = ctf_type_name_raw (fp, tid);
    546  1.1.1.2  christos   if (name == nullptr || strlen (name) == 0)
    547      1.1  christos     {
    548      1.1  christos       name = ctf_type_aname (fp, tid);
    549  1.1.1.2  christos       if (name == nullptr)
    550      1.1  christos 	complaint (_("ctf_type_aname read_base_type failed - %s"),
    551      1.1  christos 		   ctf_errmsg (ctf_errno (fp)));
    552      1.1  christos     }
    553      1.1  christos 
    554  1.1.1.3  christos   type_allocator alloc (of, language_c);
    555      1.1  christos   kind = ctf_type_kind (fp, tid);
    556      1.1  christos   if (kind == CTF_K_INTEGER)
    557      1.1  christos     {
    558      1.1  christos       uint32_t issigned, ischar, isbool;
    559      1.1  christos       struct gdbarch *gdbarch = of->arch ();
    560      1.1  christos 
    561      1.1  christos       issigned = cet.cte_format & CTF_INT_SIGNED;
    562      1.1  christos       ischar = cet.cte_format & CTF_INT_CHAR;
    563      1.1  christos       isbool = cet.cte_format & CTF_INT_BOOL;
    564      1.1  christos       if (ischar)
    565  1.1.1.3  christos 	type = init_character_type (alloc, TARGET_CHAR_BIT, !issigned, name);
    566      1.1  christos       else if (isbool)
    567  1.1.1.3  christos 	type = init_boolean_type (alloc, gdbarch_int_bit (gdbarch),
    568      1.1  christos 				  !issigned, name);
    569      1.1  christos       else
    570      1.1  christos 	{
    571      1.1  christos 	  int bits;
    572      1.1  christos 	  if (cet.cte_bits && ((cet.cte_bits % TARGET_CHAR_BIT) == 0))
    573      1.1  christos 	    bits = cet.cte_bits;
    574      1.1  christos 	  else
    575      1.1  christos 	    bits = gdbarch_int_bit (gdbarch);
    576  1.1.1.3  christos 	  type = init_integer_type (alloc, bits, !issigned, name);
    577      1.1  christos 	}
    578      1.1  christos     }
    579      1.1  christos   else if (kind == CTF_K_FLOAT)
    580      1.1  christos     {
    581      1.1  christos       uint32_t isflt;
    582      1.1  christos       isflt = !((cet.cte_format & CTF_FP_IMAGRY) == CTF_FP_IMAGRY
    583      1.1  christos 		 || (cet.cte_format & CTF_FP_DIMAGRY) == CTF_FP_DIMAGRY
    584      1.1  christos 		 || (cet.cte_format & CTF_FP_LDIMAGRY) == CTF_FP_LDIMAGRY);
    585      1.1  christos       if (isflt)
    586      1.1  christos 	type = ctf_init_float_type (of, cet.cte_bits, name, name);
    587      1.1  christos       else
    588      1.1  christos 	{
    589      1.1  christos 	  struct type *t
    590      1.1  christos 	    = ctf_init_float_type (of, cet.cte_bits / 2, NULL, name);
    591      1.1  christos 	  type = init_complex_type (name, t);
    592      1.1  christos 	}
    593      1.1  christos     }
    594      1.1  christos   else
    595      1.1  christos     {
    596      1.1  christos       complaint (_("read_base_type: unsupported base kind (%d)"), kind);
    597  1.1.1.3  christos       type = alloc.new_type (TYPE_CODE_ERROR, cet.cte_bits, name);
    598      1.1  christos     }
    599      1.1  christos 
    600  1.1.1.2  christos   if (name != nullptr && strcmp (name, "char") == 0)
    601  1.1.1.2  christos     type->set_has_no_signedness (true);
    602      1.1  christos 
    603      1.1  christos   return set_tid_type (of, tid, type);
    604      1.1  christos }
    605      1.1  christos 
    606      1.1  christos static void
    607      1.1  christos process_base_type (struct ctf_context *ccp, ctf_id_t tid)
    608      1.1  christos {
    609      1.1  christos   struct type *type;
    610      1.1  christos 
    611      1.1  christos   type = read_base_type (ccp, tid);
    612      1.1  christos   new_symbol (ccp, type, tid);
    613      1.1  christos }
    614      1.1  christos 
    615      1.1  christos /* Start a structure or union scope (definition) with TID to create a type
    616      1.1  christos    for the structure or union.
    617      1.1  christos 
    618      1.1  christos    Fill in the type's name and general properties. The members will not be
    619      1.1  christos    processed, nor a symbol table entry be done until process_structure_type
    620      1.1  christos    (assuming the type has a name).  */
    621      1.1  christos 
    622      1.1  christos static struct type *
    623      1.1  christos read_structure_type (struct ctf_context *ccp, ctf_id_t tid)
    624      1.1  christos {
    625      1.1  christos   struct objfile *of = ccp->of;
    626  1.1.1.2  christos   ctf_dict_t *fp = ccp->fp;
    627      1.1  christos   struct type *type;
    628      1.1  christos   uint32_t kind;
    629      1.1  christos 
    630  1.1.1.3  christos   type = type_allocator (of, language_c).new_type ();
    631      1.1  christos 
    632  1.1.1.2  christos   const char *name = ctf_type_name_raw (fp, tid);
    633  1.1.1.2  christos   if (name != nullptr && strlen (name) != 0)
    634  1.1.1.2  christos     type->set_name (name);
    635      1.1  christos 
    636      1.1  christos   kind = ctf_type_kind (fp, tid);
    637      1.1  christos   if (kind == CTF_K_UNION)
    638      1.1  christos     type->set_code (TYPE_CODE_UNION);
    639      1.1  christos   else
    640      1.1  christos     type->set_code (TYPE_CODE_STRUCT);
    641      1.1  christos 
    642  1.1.1.2  christos   type->set_length (ctf_type_size (fp, tid));
    643      1.1  christos   set_type_align (type, ctf_type_align (fp, tid));
    644      1.1  christos 
    645      1.1  christos   return set_tid_type (ccp->of, tid, type);
    646      1.1  christos }
    647      1.1  christos 
    648      1.1  christos /* Given a tid of CTF_K_STRUCT or CTF_K_UNION, process all its members
    649      1.1  christos    and create the symbol for it.  */
    650      1.1  christos 
    651      1.1  christos static void
    652      1.1  christos process_struct_members (struct ctf_context *ccp,
    653      1.1  christos 			ctf_id_t tid,
    654      1.1  christos 			struct type *type)
    655      1.1  christos {
    656      1.1  christos   struct ctf_field_info fi;
    657      1.1  christos 
    658      1.1  christos   fi.cur_context = ccp;
    659      1.1  christos   if (ctf_member_iter (ccp->fp, tid, ctf_add_member_cb, &fi) == CTF_ERR)
    660      1.1  christos     complaint (_("ctf_member_iter process_struct_members failed - %s"),
    661      1.1  christos 	       ctf_errmsg (ctf_errno (ccp->fp)));
    662      1.1  christos 
    663      1.1  christos   /* Attach fields to the type.  */
    664      1.1  christos   attach_fields_to_type (&fi, type);
    665      1.1  christos 
    666      1.1  christos   new_symbol (ccp, type, tid);
    667      1.1  christos }
    668      1.1  christos 
    669      1.1  christos static void
    670      1.1  christos process_structure_type (struct ctf_context *ccp, ctf_id_t tid)
    671      1.1  christos {
    672      1.1  christos   struct type *type;
    673      1.1  christos 
    674      1.1  christos   type = read_structure_type (ccp, tid);
    675      1.1  christos   process_struct_members (ccp, tid, type);
    676      1.1  christos }
    677      1.1  christos 
    678      1.1  christos /* Create a function type for TID and set its return type.  */
    679      1.1  christos 
    680      1.1  christos static struct type *
    681      1.1  christos read_func_kind_type (struct ctf_context *ccp, ctf_id_t tid)
    682      1.1  christos {
    683      1.1  christos   struct objfile *of = ccp->of;
    684  1.1.1.2  christos   ctf_dict_t *fp = ccp->fp;
    685  1.1.1.2  christos   struct type *type, *rettype, *atype;
    686      1.1  christos   ctf_funcinfo_t cfi;
    687  1.1.1.2  christos   uint32_t argc;
    688      1.1  christos 
    689  1.1.1.3  christos   type = type_allocator (of, language_c).new_type ();
    690      1.1  christos 
    691      1.1  christos   type->set_code (TYPE_CODE_FUNC);
    692  1.1.1.2  christos   if (ctf_func_type_info (fp, tid, &cfi) < 0)
    693  1.1.1.2  christos     {
    694  1.1.1.2  christos       const char *fname = ctf_type_name_raw (fp, tid);
    695  1.1.1.2  christos       error (_("Error getting function type info: %s"),
    696  1.1.1.2  christos 	     fname == nullptr ? "noname" : fname);
    697  1.1.1.2  christos     }
    698  1.1.1.2  christos   rettype = fetch_tid_type (ccp, cfi.ctc_return);
    699  1.1.1.2  christos   type->set_target_type (rettype);
    700      1.1  christos   set_type_align (type, ctf_type_align (fp, tid));
    701      1.1  christos 
    702  1.1.1.2  christos   /* Set up function's arguments.  */
    703  1.1.1.2  christos   argc = cfi.ctc_argc;
    704  1.1.1.2  christos   type->set_num_fields (argc);
    705  1.1.1.2  christos   if ((cfi.ctc_flags & CTF_FUNC_VARARG) != 0)
    706  1.1.1.2  christos     type->set_has_varargs (true);
    707  1.1.1.2  christos 
    708  1.1.1.2  christos   if (argc != 0)
    709  1.1.1.2  christos     {
    710  1.1.1.2  christos       std::vector<ctf_id_t> argv (argc);
    711  1.1.1.2  christos       if (ctf_func_type_args (fp, tid, argc, argv.data ()) == CTF_ERR)
    712  1.1.1.2  christos 	return nullptr;
    713  1.1.1.2  christos 
    714  1.1.1.3  christos       type->alloc_fields (argc);
    715  1.1.1.3  christos       struct type *void_type = builtin_type (of)->builtin_void;
    716  1.1.1.2  christos       /* If failed to find the argument type, fill it with void_type.  */
    717  1.1.1.2  christos       for (int iparam = 0; iparam < argc; iparam++)
    718  1.1.1.2  christos 	{
    719  1.1.1.2  christos 	  atype = fetch_tid_type (ccp, argv[iparam]);
    720  1.1.1.2  christos 	  if (atype != nullptr)
    721  1.1.1.2  christos 	    type->field (iparam).set_type (atype);
    722  1.1.1.2  christos 	  else
    723  1.1.1.2  christos 	    type->field (iparam).set_type (void_type);
    724  1.1.1.2  christos 	}
    725  1.1.1.2  christos     }
    726  1.1.1.2  christos 
    727      1.1  christos   return set_tid_type (of, tid, type);
    728      1.1  christos }
    729      1.1  christos 
    730      1.1  christos /* Given a TID of CTF_K_ENUM, process all the members of the
    731      1.1  christos    enumeration, and create the symbol for the enumeration type.  */
    732      1.1  christos 
    733      1.1  christos static struct type *
    734      1.1  christos read_enum_type (struct ctf_context *ccp, ctf_id_t tid)
    735      1.1  christos {
    736      1.1  christos   struct objfile *of = ccp->of;
    737  1.1.1.2  christos   ctf_dict_t *fp = ccp->fp;
    738  1.1.1.2  christos   struct type *type;
    739      1.1  christos 
    740  1.1.1.3  christos   type = type_allocator (of, language_c).new_type ();
    741      1.1  christos 
    742  1.1.1.2  christos   const char *name = ctf_type_name_raw (fp, tid);
    743  1.1.1.2  christos   if (name != nullptr && strlen (name) != 0)
    744  1.1.1.2  christos     type->set_name (name);
    745      1.1  christos 
    746      1.1  christos   type->set_code (TYPE_CODE_ENUM);
    747  1.1.1.2  christos   type->set_length (ctf_type_size (fp, tid));
    748  1.1.1.2  christos   /* Set the underlying type based on its ctf_type_size bits.  */
    749  1.1.1.2  christos   type->set_target_type (objfile_int_type (of, type->length (), false));
    750      1.1  christos   set_type_align (type, ctf_type_align (fp, tid));
    751      1.1  christos 
    752      1.1  christos   return set_tid_type (of, tid, type);
    753      1.1  christos }
    754      1.1  christos 
    755      1.1  christos static void
    756      1.1  christos process_enum_type (struct ctf_context *ccp, ctf_id_t tid)
    757      1.1  christos {
    758      1.1  christos   struct type *type;
    759      1.1  christos   struct ctf_field_info fi;
    760      1.1  christos 
    761      1.1  christos   type = read_enum_type (ccp, tid);
    762      1.1  christos 
    763      1.1  christos   fi.cur_context = ccp;
    764      1.1  christos   fi.ptype = type;
    765      1.1  christos   if (ctf_enum_iter (ccp->fp, tid, ctf_add_enum_member_cb, &fi) == CTF_ERR)
    766      1.1  christos     complaint (_("ctf_enum_iter process_enum_type failed - %s"),
    767      1.1  christos 	       ctf_errmsg (ctf_errno (ccp->fp)));
    768      1.1  christos 
    769      1.1  christos   /* Attach fields to the type.  */
    770      1.1  christos   attach_fields_to_type (&fi, type);
    771      1.1  christos 
    772      1.1  christos   new_symbol (ccp, type, tid);
    773      1.1  christos }
    774      1.1  christos 
    775      1.1  christos /* Add given cv-qualifiers CNST+VOLTL to the BASE_TYPE of array TID.  */
    776      1.1  christos 
    777      1.1  christos static struct type *
    778      1.1  christos add_array_cv_type (struct ctf_context *ccp,
    779      1.1  christos 		   ctf_id_t tid,
    780      1.1  christos 		   struct type *base_type,
    781      1.1  christos 		   int cnst,
    782      1.1  christos 		   int voltl)
    783      1.1  christos {
    784      1.1  christos   struct type *el_type, *inner_array;
    785      1.1  christos 
    786      1.1  christos   base_type = copy_type (base_type);
    787      1.1  christos   inner_array = base_type;
    788      1.1  christos 
    789  1.1.1.2  christos   while (inner_array->target_type ()->code () == TYPE_CODE_ARRAY)
    790      1.1  christos     {
    791  1.1.1.2  christos       inner_array->set_target_type (copy_type (inner_array->target_type ()));
    792  1.1.1.2  christos       inner_array = inner_array->target_type ();
    793      1.1  christos     }
    794      1.1  christos 
    795  1.1.1.2  christos   el_type = inner_array->target_type ();
    796      1.1  christos   cnst |= TYPE_CONST (el_type);
    797      1.1  christos   voltl |= TYPE_VOLATILE (el_type);
    798  1.1.1.2  christos   inner_array->set_target_type (make_cv_type (cnst, voltl, el_type, nullptr));
    799      1.1  christos 
    800      1.1  christos   return set_tid_type (ccp->of, tid, base_type);
    801      1.1  christos }
    802      1.1  christos 
    803      1.1  christos /* Read all information from a TID of CTF_K_ARRAY.  */
    804      1.1  christos 
    805      1.1  christos static struct type *
    806      1.1  christos read_array_type (struct ctf_context *ccp, ctf_id_t tid)
    807      1.1  christos {
    808      1.1  christos   struct objfile *objfile = ccp->of;
    809  1.1.1.2  christos   ctf_dict_t *fp = ccp->fp;
    810      1.1  christos   struct type *element_type, *range_type, *idx_type;
    811      1.1  christos   struct type *type;
    812      1.1  christos   ctf_arinfo_t ar;
    813      1.1  christos 
    814      1.1  christos   if (ctf_array_info (fp, tid, &ar) == CTF_ERR)
    815      1.1  christos     {
    816      1.1  christos       complaint (_("ctf_array_info read_array_type failed - %s"),
    817      1.1  christos 		 ctf_errmsg (ctf_errno (fp)));
    818  1.1.1.2  christos       return nullptr;
    819      1.1  christos     }
    820      1.1  christos 
    821  1.1.1.2  christos   element_type = fetch_tid_type (ccp, ar.ctr_contents);
    822  1.1.1.2  christos   if (element_type == nullptr)
    823  1.1.1.2  christos     return nullptr;
    824      1.1  christos 
    825  1.1.1.2  christos   idx_type = fetch_tid_type (ccp, ar.ctr_index);
    826  1.1.1.2  christos   if (idx_type == nullptr)
    827  1.1.1.3  christos     idx_type = builtin_type (objfile)->builtin_int;
    828      1.1  christos 
    829  1.1.1.3  christos   type_allocator alloc (objfile, language_c);
    830  1.1.1.3  christos   range_type = create_static_range_type (alloc, idx_type, 0, ar.ctr_nelems - 1);
    831  1.1.1.3  christos   type = create_array_type (alloc, element_type, range_type);
    832      1.1  christos   if (ar.ctr_nelems <= 1)	/* Check if undefined upper bound.  */
    833      1.1  christos     {
    834      1.1  christos       range_type->bounds ()->high.set_undefined ();
    835  1.1.1.2  christos       type->set_length (0);
    836  1.1.1.2  christos       type->set_target_is_stub (true);
    837      1.1  christos     }
    838      1.1  christos   else
    839  1.1.1.2  christos     type->set_length (ctf_type_size (fp, tid));
    840      1.1  christos 
    841      1.1  christos   set_type_align (type, ctf_type_align (fp, tid));
    842      1.1  christos 
    843      1.1  christos   return set_tid_type (objfile, tid, type);
    844      1.1  christos }
    845      1.1  christos 
    846      1.1  christos /* Read TID of kind CTF_K_CONST with base type BTID.  */
    847      1.1  christos 
    848      1.1  christos static struct type *
    849      1.1  christos read_const_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
    850      1.1  christos {
    851      1.1  christos   struct objfile *objfile = ccp->of;
    852      1.1  christos   struct type *base_type, *cv_type;
    853      1.1  christos 
    854  1.1.1.2  christos   base_type = fetch_tid_type (ccp, btid);
    855  1.1.1.2  christos   if (base_type == nullptr)
    856      1.1  christos     {
    857      1.1  christos       base_type = read_type_record (ccp, btid);
    858  1.1.1.2  christos       if (base_type == nullptr)
    859      1.1  christos 	{
    860      1.1  christos 	  complaint (_("read_const_type: NULL base type (%ld)"), btid);
    861  1.1.1.3  christos 	  base_type = builtin_type (objfile)->builtin_error;
    862      1.1  christos 	}
    863      1.1  christos     }
    864      1.1  christos   cv_type = make_cv_type (1, TYPE_VOLATILE (base_type), base_type, 0);
    865      1.1  christos 
    866      1.1  christos   return set_tid_type (objfile, tid, cv_type);
    867      1.1  christos }
    868      1.1  christos 
    869      1.1  christos /* Read TID of kind CTF_K_VOLATILE with base type BTID.  */
    870      1.1  christos 
    871      1.1  christos static struct type *
    872      1.1  christos read_volatile_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
    873      1.1  christos {
    874      1.1  christos   struct objfile *objfile = ccp->of;
    875  1.1.1.2  christos   ctf_dict_t *fp = ccp->fp;
    876      1.1  christos   struct type *base_type, *cv_type;
    877      1.1  christos 
    878  1.1.1.2  christos   base_type = fetch_tid_type (ccp, btid);
    879  1.1.1.2  christos   if (base_type == nullptr)
    880      1.1  christos     {
    881      1.1  christos       base_type = read_type_record (ccp, btid);
    882  1.1.1.2  christos       if (base_type == nullptr)
    883      1.1  christos 	{
    884      1.1  christos 	  complaint (_("read_volatile_type: NULL base type (%ld)"), btid);
    885  1.1.1.3  christos 	  base_type = builtin_type (objfile)->builtin_error;
    886      1.1  christos 	}
    887      1.1  christos     }
    888      1.1  christos 
    889      1.1  christos   if (ctf_type_kind (fp, btid) == CTF_K_ARRAY)
    890      1.1  christos     return add_array_cv_type (ccp, tid, base_type, 0, 1);
    891      1.1  christos   cv_type = make_cv_type (TYPE_CONST (base_type), 1, base_type, 0);
    892      1.1  christos 
    893      1.1  christos   return set_tid_type (objfile, tid, cv_type);
    894      1.1  christos }
    895      1.1  christos 
    896      1.1  christos /* Read TID of kind CTF_K_RESTRICT with base type BTID.  */
    897      1.1  christos 
    898      1.1  christos static struct type *
    899      1.1  christos read_restrict_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
    900      1.1  christos {
    901      1.1  christos   struct objfile *objfile = ccp->of;
    902      1.1  christos   struct type *base_type, *cv_type;
    903      1.1  christos 
    904  1.1.1.2  christos   base_type = fetch_tid_type (ccp, btid);
    905  1.1.1.2  christos   if (base_type == nullptr)
    906      1.1  christos     {
    907      1.1  christos       base_type = read_type_record (ccp, btid);
    908  1.1.1.2  christos       if (base_type == nullptr)
    909      1.1  christos 	{
    910      1.1  christos 	  complaint (_("read_restrict_type: NULL base type (%ld)"), btid);
    911  1.1.1.3  christos 	  base_type = builtin_type (objfile)->builtin_error;
    912      1.1  christos 	}
    913      1.1  christos     }
    914      1.1  christos   cv_type = make_restrict_type (base_type);
    915      1.1  christos 
    916      1.1  christos   return set_tid_type (objfile, tid, cv_type);
    917      1.1  christos }
    918      1.1  christos 
    919      1.1  christos /* Read TID of kind CTF_K_TYPEDEF with its NAME and base type BTID.  */
    920      1.1  christos 
    921      1.1  christos static struct type *
    922      1.1  christos read_typedef_type (struct ctf_context *ccp, ctf_id_t tid,
    923      1.1  christos 		   ctf_id_t btid, const char *name)
    924      1.1  christos {
    925      1.1  christos   struct objfile *objfile = ccp->of;
    926      1.1  christos   struct type *this_type, *target_type;
    927      1.1  christos 
    928      1.1  christos   char *aname = obstack_strdup (&objfile->objfile_obstack, name);
    929  1.1.1.3  christos   this_type = type_allocator (objfile, language_c).new_type (TYPE_CODE_TYPEDEF,
    930  1.1.1.3  christos 							     0, aname);
    931      1.1  christos   set_tid_type (objfile, tid, this_type);
    932  1.1.1.2  christos   target_type = fetch_tid_type (ccp, btid);
    933      1.1  christos   if (target_type != this_type)
    934  1.1.1.2  christos     this_type->set_target_type (target_type);
    935      1.1  christos   else
    936  1.1.1.2  christos     this_type->set_target_type (nullptr);
    937  1.1.1.2  christos 
    938  1.1.1.2  christos   this_type->set_target_is_stub (this_type->target_type () != nullptr);
    939      1.1  christos 
    940      1.1  christos   return set_tid_type (objfile, tid, this_type);
    941      1.1  christos }
    942      1.1  christos 
    943      1.1  christos /* Read TID of kind CTF_K_POINTER with base type BTID.  */
    944      1.1  christos 
    945      1.1  christos static struct type *
    946      1.1  christos read_pointer_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
    947      1.1  christos {
    948      1.1  christos   struct objfile *of = ccp->of;
    949      1.1  christos   struct type *target_type, *type;
    950      1.1  christos 
    951  1.1.1.2  christos   target_type = fetch_tid_type (ccp, btid);
    952  1.1.1.2  christos   if (target_type == nullptr)
    953      1.1  christos     {
    954      1.1  christos       target_type = read_type_record (ccp, btid);
    955  1.1.1.2  christos       if (target_type == nullptr)
    956      1.1  christos 	{
    957      1.1  christos 	  complaint (_("read_pointer_type: NULL target type (%ld)"), btid);
    958  1.1.1.3  christos 	  target_type = builtin_type (ccp->of)->builtin_error;
    959      1.1  christos 	}
    960      1.1  christos     }
    961      1.1  christos 
    962      1.1  christos   type = lookup_pointer_type (target_type);
    963      1.1  christos   set_type_align (type, ctf_type_align (ccp->fp, tid));
    964      1.1  christos 
    965      1.1  christos   return set_tid_type (of, tid, type);
    966      1.1  christos }
    967      1.1  christos 
    968  1.1.1.2  christos /* Read information from a TID of CTF_K_FORWARD.  */
    969  1.1.1.2  christos 
    970  1.1.1.2  christos static struct type *
    971  1.1.1.2  christos read_forward_type (struct ctf_context *ccp, ctf_id_t tid)
    972  1.1.1.2  christos {
    973  1.1.1.2  christos   struct objfile *of = ccp->of;
    974  1.1.1.2  christos   ctf_dict_t *fp = ccp->fp;
    975  1.1.1.2  christos   struct type *type;
    976  1.1.1.2  christos   uint32_t kind;
    977  1.1.1.2  christos 
    978  1.1.1.3  christos   type = type_allocator (of, language_c).new_type ();
    979  1.1.1.2  christos 
    980  1.1.1.2  christos   const char *name = ctf_type_name_raw (fp, tid);
    981  1.1.1.2  christos   if (name != nullptr && strlen (name) != 0)
    982  1.1.1.2  christos     type->set_name (name);
    983  1.1.1.2  christos 
    984  1.1.1.2  christos   kind = ctf_type_kind_forwarded (fp, tid);
    985  1.1.1.2  christos   if (kind == CTF_K_UNION)
    986  1.1.1.2  christos     type->set_code (TYPE_CODE_UNION);
    987  1.1.1.2  christos   else
    988  1.1.1.2  christos     type->set_code (TYPE_CODE_STRUCT);
    989  1.1.1.2  christos 
    990  1.1.1.2  christos   type->set_length (0);
    991  1.1.1.2  christos   type->set_is_stub (true);
    992  1.1.1.2  christos 
    993  1.1.1.2  christos   return set_tid_type (of, tid, type);
    994  1.1.1.2  christos }
    995  1.1.1.2  christos 
    996      1.1  christos /* Read information associated with type TID.  */
    997      1.1  christos 
    998      1.1  christos static struct type *
    999      1.1  christos read_type_record (struct ctf_context *ccp, ctf_id_t tid)
   1000      1.1  christos {
   1001  1.1.1.2  christos   ctf_dict_t *fp = ccp->fp;
   1002      1.1  christos   uint32_t kind;
   1003  1.1.1.2  christos   struct type *type = nullptr;
   1004      1.1  christos   ctf_id_t btid;
   1005      1.1  christos 
   1006      1.1  christos   kind = ctf_type_kind (fp, tid);
   1007      1.1  christos   switch (kind)
   1008      1.1  christos     {
   1009      1.1  christos       case CTF_K_STRUCT:
   1010      1.1  christos       case CTF_K_UNION:
   1011      1.1  christos 	type = read_structure_type (ccp, tid);
   1012      1.1  christos 	break;
   1013      1.1  christos       case CTF_K_ENUM:
   1014      1.1  christos 	type = read_enum_type (ccp, tid);
   1015      1.1  christos 	break;
   1016      1.1  christos       case CTF_K_FUNCTION:
   1017      1.1  christos 	type = read_func_kind_type (ccp, tid);
   1018      1.1  christos 	break;
   1019      1.1  christos       case CTF_K_CONST:
   1020      1.1  christos 	btid = ctf_type_reference (fp, tid);
   1021      1.1  christos 	type = read_const_type (ccp, tid, btid);
   1022      1.1  christos 	break;
   1023      1.1  christos       case CTF_K_TYPEDEF:
   1024      1.1  christos 	{
   1025  1.1.1.2  christos 	  const char *name = ctf_type_name_raw (fp, tid);
   1026      1.1  christos 	  btid = ctf_type_reference (fp, tid);
   1027  1.1.1.2  christos 	  type = read_typedef_type (ccp, tid, btid, name);
   1028      1.1  christos 	}
   1029      1.1  christos 	break;
   1030      1.1  christos       case CTF_K_VOLATILE:
   1031      1.1  christos 	btid = ctf_type_reference (fp, tid);
   1032      1.1  christos 	type = read_volatile_type (ccp, tid, btid);
   1033      1.1  christos 	break;
   1034      1.1  christos       case CTF_K_RESTRICT:
   1035      1.1  christos 	btid = ctf_type_reference (fp, tid);
   1036      1.1  christos 	type = read_restrict_type (ccp, tid, btid);
   1037      1.1  christos 	break;
   1038      1.1  christos       case CTF_K_POINTER:
   1039      1.1  christos 	btid = ctf_type_reference (fp, tid);
   1040      1.1  christos 	type = read_pointer_type (ccp, tid, btid);
   1041      1.1  christos 	break;
   1042      1.1  christos       case CTF_K_INTEGER:
   1043      1.1  christos       case CTF_K_FLOAT:
   1044      1.1  christos 	type = read_base_type (ccp, tid);
   1045      1.1  christos 	break;
   1046      1.1  christos       case CTF_K_ARRAY:
   1047      1.1  christos 	type = read_array_type (ccp, tid);
   1048      1.1  christos 	break;
   1049  1.1.1.2  christos       case CTF_K_FORWARD:
   1050  1.1.1.2  christos 	type = read_forward_type (ccp, tid);
   1051  1.1.1.2  christos 	break;
   1052      1.1  christos       case CTF_K_UNKNOWN:
   1053      1.1  christos 	break;
   1054      1.1  christos       default:
   1055      1.1  christos 	break;
   1056      1.1  christos     }
   1057      1.1  christos 
   1058      1.1  christos   return type;
   1059      1.1  christos }
   1060      1.1  christos 
   1061      1.1  christos /* Callback to add type TID to the symbol table.  */
   1062      1.1  christos 
   1063      1.1  christos static int
   1064      1.1  christos ctf_add_type_cb (ctf_id_t tid, void *arg)
   1065      1.1  christos {
   1066      1.1  christos   struct ctf_context *ccp = (struct ctf_context *) arg;
   1067      1.1  christos   struct type *type;
   1068      1.1  christos   uint32_t kind;
   1069      1.1  christos 
   1070      1.1  christos   /* Check if tid's type has already been defined.  */
   1071      1.1  christos   type = get_tid_type (ccp->of, tid);
   1072  1.1.1.2  christos   if (type != nullptr)
   1073      1.1  christos     return 0;
   1074      1.1  christos 
   1075      1.1  christos   ctf_id_t btid = ctf_type_reference (ccp->fp, tid);
   1076      1.1  christos   kind = ctf_type_kind (ccp->fp, tid);
   1077      1.1  christos   switch (kind)
   1078      1.1  christos     {
   1079      1.1  christos       case CTF_K_STRUCT:
   1080      1.1  christos       case CTF_K_UNION:
   1081      1.1  christos 	process_structure_type (ccp, tid);
   1082      1.1  christos 	break;
   1083      1.1  christos       case CTF_K_ENUM:
   1084      1.1  christos 	process_enum_type (ccp, tid);
   1085      1.1  christos 	break;
   1086      1.1  christos       case CTF_K_FUNCTION:
   1087      1.1  christos 	type = read_func_kind_type (ccp, tid);
   1088      1.1  christos 	new_symbol (ccp, type, tid);
   1089      1.1  christos 	break;
   1090      1.1  christos       case CTF_K_INTEGER:
   1091      1.1  christos       case CTF_K_FLOAT:
   1092      1.1  christos 	process_base_type (ccp, tid);
   1093      1.1  christos 	break;
   1094      1.1  christos       case CTF_K_TYPEDEF:
   1095      1.1  christos 	new_symbol (ccp, read_type_record (ccp, tid), tid);
   1096      1.1  christos 	break;
   1097      1.1  christos       case CTF_K_CONST:
   1098      1.1  christos 	type = read_const_type (ccp, tid, btid);
   1099      1.1  christos 	new_symbol (ccp, type, tid);
   1100      1.1  christos 	break;
   1101      1.1  christos       case CTF_K_VOLATILE:
   1102      1.1  christos 	type = read_volatile_type (ccp, tid, btid);
   1103      1.1  christos 	new_symbol (ccp, type, tid);
   1104      1.1  christos 	break;
   1105      1.1  christos       case CTF_K_RESTRICT:
   1106      1.1  christos 	type = read_restrict_type (ccp, tid, btid);
   1107      1.1  christos 	new_symbol (ccp, type, tid);
   1108      1.1  christos 	break;
   1109      1.1  christos       case CTF_K_POINTER:
   1110      1.1  christos 	type = read_pointer_type (ccp, tid, btid);
   1111      1.1  christos 	new_symbol (ccp, type, tid);
   1112      1.1  christos 	break;
   1113      1.1  christos       case CTF_K_ARRAY:
   1114      1.1  christos 	type = read_array_type (ccp, tid);
   1115      1.1  christos 	new_symbol (ccp, type, tid);
   1116      1.1  christos 	break;
   1117      1.1  christos       case CTF_K_UNKNOWN:
   1118      1.1  christos 	break;
   1119      1.1  christos       default:
   1120      1.1  christos 	break;
   1121      1.1  christos     }
   1122      1.1  christos 
   1123      1.1  christos   return 0;
   1124      1.1  christos }
   1125      1.1  christos 
   1126      1.1  christos /* Callback to add variable NAME with TID to the symbol table.  */
   1127      1.1  christos 
   1128      1.1  christos static int
   1129      1.1  christos ctf_add_var_cb (const char *name, ctf_id_t id, void *arg)
   1130      1.1  christos {
   1131      1.1  christos   struct ctf_context *ccp = (struct ctf_context *) arg;
   1132  1.1.1.2  christos   struct symbol *sym = nullptr;
   1133      1.1  christos   struct type *type;
   1134      1.1  christos   uint32_t kind;
   1135      1.1  christos 
   1136      1.1  christos   type = get_tid_type (ccp->of, id);
   1137      1.1  christos 
   1138      1.1  christos   kind = ctf_type_kind (ccp->fp, id);
   1139      1.1  christos   switch (kind)
   1140      1.1  christos     {
   1141      1.1  christos       case CTF_K_FUNCTION:
   1142  1.1.1.2  christos 	if (name != nullptr && strcmp (name, "main") == 0)
   1143      1.1  christos 	  set_objfile_main_name (ccp->of, name, language_c);
   1144      1.1  christos 	break;
   1145      1.1  christos       case CTF_K_INTEGER:
   1146      1.1  christos       case CTF_K_FLOAT:
   1147      1.1  christos       case CTF_K_VOLATILE:
   1148      1.1  christos       case CTF_K_RESTRICT:
   1149      1.1  christos       case CTF_K_TYPEDEF:
   1150      1.1  christos       case CTF_K_CONST:
   1151      1.1  christos       case CTF_K_POINTER:
   1152      1.1  christos       case CTF_K_ARRAY:
   1153  1.1.1.2  christos 	if (type != nullptr)
   1154      1.1  christos 	  {
   1155      1.1  christos 	    sym = new_symbol (ccp, type, id);
   1156  1.1.1.2  christos 	    if (sym != nullptr)
   1157  1.1.1.2  christos 	      sym->compute_and_set_names (name, false, ccp->of->per_bfd);
   1158      1.1  christos 	  }
   1159      1.1  christos 	break;
   1160      1.1  christos       case CTF_K_STRUCT:
   1161      1.1  christos       case CTF_K_UNION:
   1162      1.1  christos       case CTF_K_ENUM:
   1163  1.1.1.2  christos 	if (type == nullptr)
   1164  1.1.1.2  christos 	  {
   1165  1.1.1.2  christos 	    complaint (_("ctf_add_var_cb: %s has NO type (%ld)"), name, id);
   1166  1.1.1.3  christos 	    type = builtin_type (ccp->of)->builtin_error;
   1167  1.1.1.2  christos 	  }
   1168      1.1  christos 	sym = new (&ccp->of->objfile_obstack) symbol;
   1169      1.1  christos 	OBJSTAT (ccp->of, n_syms++);
   1170  1.1.1.2  christos 	sym->set_type (type);
   1171  1.1.1.2  christos 	sym->set_domain (VAR_DOMAIN);
   1172  1.1.1.2  christos 	sym->set_aclass_index (LOC_OPTIMIZED_OUT);
   1173      1.1  christos 	sym->compute_and_set_names (name, false, ccp->of->per_bfd);
   1174  1.1.1.2  christos 	add_symbol_to_list (sym, ccp->builder->get_file_symbols ());
   1175      1.1  christos 	break;
   1176      1.1  christos       default:
   1177      1.1  christos 	complaint (_("ctf_add_var_cb: kind unsupported (%d)"), kind);
   1178      1.1  christos 	break;
   1179      1.1  christos     }
   1180      1.1  christos 
   1181  1.1.1.2  christos   if (sym != nullptr)
   1182      1.1  christos     set_symbol_address (ccp->of, sym, name);
   1183      1.1  christos 
   1184      1.1  christos   return 0;
   1185      1.1  christos }
   1186      1.1  christos 
   1187  1.1.1.2  christos /* Add entries in either data objects or function info section, controlled
   1188  1.1.1.2  christos    by FUNCTIONS.  */
   1189      1.1  christos 
   1190  1.1.1.2  christos static void
   1191  1.1.1.2  christos add_stt_entries (struct ctf_context *ccp, int functions)
   1192      1.1  christos {
   1193  1.1.1.2  christos   ctf_next_t *i = nullptr;
   1194  1.1.1.2  christos   const char *tname;
   1195      1.1  christos   ctf_id_t tid;
   1196  1.1.1.2  christos   struct symbol *sym = nullptr;
   1197  1.1.1.2  christos   struct type *type;
   1198      1.1  christos 
   1199  1.1.1.2  christos   while ((tid = ctf_symbol_next (ccp->fp, &i, &tname, functions)) != CTF_ERR)
   1200  1.1.1.2  christos     {
   1201  1.1.1.2  christos       type = get_tid_type (ccp->of, tid);
   1202  1.1.1.2  christos       if (type == nullptr)
   1203  1.1.1.2  christos 	continue;
   1204  1.1.1.2  christos       sym = new (&ccp->of->objfile_obstack) symbol;
   1205  1.1.1.2  christos       OBJSTAT (ccp->of, n_syms++);
   1206  1.1.1.2  christos       sym->set_type (type);
   1207  1.1.1.2  christos       sym->set_domain (VAR_DOMAIN);
   1208  1.1.1.2  christos       sym->set_aclass_index (LOC_STATIC);
   1209  1.1.1.2  christos       sym->compute_and_set_names (tname, false, ccp->of->per_bfd);
   1210  1.1.1.2  christos       add_symbol_to_list (sym, ccp->builder->get_global_symbols ());
   1211  1.1.1.2  christos       set_symbol_address (ccp->of, sym, tname);
   1212  1.1.1.2  christos     }
   1213      1.1  christos }
   1214      1.1  christos 
   1215  1.1.1.2  christos /* Add entries in data objects section.  */
   1216      1.1  christos 
   1217  1.1.1.2  christos static void
   1218  1.1.1.2  christos add_stt_obj (struct ctf_context *ccp)
   1219      1.1  christos {
   1220  1.1.1.2  christos   add_stt_entries (ccp, 0);
   1221  1.1.1.2  christos }
   1222      1.1  christos 
   1223  1.1.1.2  christos /* Add entries in function info section.  */
   1224      1.1  christos 
   1225  1.1.1.2  christos static void
   1226  1.1.1.2  christos add_stt_func (struct ctf_context *ccp)
   1227  1.1.1.2  christos {
   1228  1.1.1.2  christos   add_stt_entries (ccp, 1);
   1229      1.1  christos }
   1230      1.1  christos 
   1231  1.1.1.3  christos /* Get text section base for OBJFILE, TSIZE contains the size.  */
   1232      1.1  christos 
   1233      1.1  christos static CORE_ADDR
   1234  1.1.1.3  christos get_objfile_text_range (struct objfile *of, size_t *tsize)
   1235      1.1  christos {
   1236  1.1.1.2  christos   bfd *abfd = of->obfd.get ();
   1237      1.1  christos   const asection *codes;
   1238      1.1  christos 
   1239      1.1  christos   codes = bfd_get_section_by_name (abfd, ".text");
   1240      1.1  christos   *tsize = codes ? bfd_section_size (codes) : 0;
   1241      1.1  christos   return of->text_section_offset ();
   1242      1.1  christos }
   1243      1.1  christos 
   1244      1.1  christos /* Start a symtab for OBJFILE in CTF format.  */
   1245      1.1  christos 
   1246      1.1  christos static void
   1247  1.1.1.2  christos ctf_start_compunit_symtab (ctf_psymtab *pst,
   1248  1.1.1.2  christos 			   struct objfile *of, CORE_ADDR text_offset)
   1249      1.1  christos {
   1250      1.1  christos   struct ctf_context *ccp;
   1251      1.1  christos 
   1252  1.1.1.2  christos   ccp = &pst->context;
   1253      1.1  christos   ccp->builder = new buildsym_compunit
   1254  1.1.1.2  christos 		       (of, pst->filename, nullptr,
   1255      1.1  christos 		       language_c, text_offset);
   1256      1.1  christos   ccp->builder->record_debugformat ("ctf");
   1257      1.1  christos }
   1258      1.1  christos 
   1259      1.1  christos /* Finish reading symbol/type definitions in CTF format.
   1260  1.1.1.3  christos    END_ADDR is the end address of the file's text.  */
   1261      1.1  christos 
   1262      1.1  christos static struct compunit_symtab *
   1263  1.1.1.2  christos ctf_end_compunit_symtab (ctf_psymtab *pst,
   1264  1.1.1.3  christos 			 CORE_ADDR end_addr)
   1265      1.1  christos {
   1266      1.1  christos   struct ctf_context *ccp;
   1267      1.1  christos 
   1268  1.1.1.2  christos   ccp = &pst->context;
   1269      1.1  christos   struct compunit_symtab *result
   1270  1.1.1.3  christos     = ccp->builder->end_compunit_symtab (end_addr);
   1271      1.1  christos   delete ccp->builder;
   1272  1.1.1.2  christos   ccp->builder = nullptr;
   1273      1.1  christos   return result;
   1274      1.1  christos }
   1275      1.1  christos 
   1276  1.1.1.2  christos /* Add all members of an enum with type TID to partial symbol table.  */
   1277  1.1.1.2  christos 
   1278  1.1.1.2  christos static void
   1279  1.1.1.2  christos ctf_psymtab_add_enums (struct ctf_context *ccp, ctf_id_t tid)
   1280  1.1.1.2  christos {
   1281  1.1.1.2  christos   int val;
   1282  1.1.1.2  christos   const char *ename;
   1283  1.1.1.2  christos   ctf_next_t *i = nullptr;
   1284  1.1.1.2  christos 
   1285  1.1.1.2  christos   while ((ename = ctf_enum_next (ccp->fp, tid, &i, &val)) != nullptr)
   1286  1.1.1.2  christos     {
   1287  1.1.1.2  christos       ccp->pst->add_psymbol (ename, true,
   1288  1.1.1.2  christos 			     VAR_DOMAIN, LOC_CONST, -1,
   1289  1.1.1.2  christos 			     psymbol_placement::GLOBAL,
   1290  1.1.1.3  christos 			     unrelocated_addr (0),
   1291  1.1.1.3  christos 			     language_c, ccp->partial_symtabs, ccp->of);
   1292  1.1.1.2  christos     }
   1293  1.1.1.2  christos   if (ctf_errno (ccp->fp) != ECTF_NEXT_END)
   1294  1.1.1.2  christos     complaint (_("ctf_enum_next ctf_psymtab_add_enums failed - %s"),
   1295  1.1.1.2  christos 	       ctf_errmsg (ctf_errno (ccp->fp)));
   1296  1.1.1.2  christos }
   1297  1.1.1.2  christos 
   1298  1.1.1.2  christos /* Add entries in either data objects or function info section, controlled
   1299  1.1.1.2  christos    by FUNCTIONS, to psymtab.  */
   1300  1.1.1.2  christos 
   1301  1.1.1.2  christos static void
   1302  1.1.1.2  christos ctf_psymtab_add_stt_entries (ctf_dict_t *cfp, ctf_psymtab *pst,
   1303  1.1.1.2  christos 			     struct objfile *of, int functions)
   1304  1.1.1.2  christos {
   1305  1.1.1.2  christos   ctf_next_t *i = nullptr;
   1306  1.1.1.2  christos   ctf_id_t tid;
   1307  1.1.1.2  christos   const char *tname;
   1308  1.1.1.2  christos 
   1309  1.1.1.2  christos   while ((tid = ctf_symbol_next (cfp, &i, &tname, functions)) != CTF_ERR)
   1310  1.1.1.2  christos     {
   1311  1.1.1.2  christos       uint32_t kind = ctf_type_kind (cfp, tid);
   1312  1.1.1.2  christos       address_class aclass;
   1313  1.1.1.2  christos       domain_enum tdomain;
   1314  1.1.1.2  christos       switch (kind)
   1315  1.1.1.2  christos 	{
   1316  1.1.1.2  christos 	  case CTF_K_STRUCT:
   1317  1.1.1.2  christos 	  case CTF_K_UNION:
   1318  1.1.1.2  christos 	  case CTF_K_ENUM:
   1319  1.1.1.2  christos 	    tdomain = STRUCT_DOMAIN;
   1320  1.1.1.2  christos 	    break;
   1321  1.1.1.2  christos 	  default:
   1322  1.1.1.2  christos 	    tdomain = VAR_DOMAIN;
   1323  1.1.1.2  christos 	    break;
   1324  1.1.1.2  christos 	}
   1325  1.1.1.2  christos 
   1326  1.1.1.2  christos       if (kind == CTF_K_FUNCTION)
   1327  1.1.1.2  christos 	aclass = LOC_STATIC;
   1328  1.1.1.2  christos       else if (kind == CTF_K_CONST)
   1329  1.1.1.2  christos 	aclass = LOC_CONST;
   1330  1.1.1.2  christos       else
   1331  1.1.1.2  christos 	aclass = LOC_TYPEDEF;
   1332  1.1.1.2  christos 
   1333  1.1.1.2  christos       pst->add_psymbol (tname, true,
   1334  1.1.1.2  christos 			tdomain, aclass, -1,
   1335  1.1.1.2  christos 			psymbol_placement::GLOBAL,
   1336  1.1.1.3  christos 			unrelocated_addr (0),
   1337  1.1.1.3  christos 			language_c, pst->context.partial_symtabs, of);
   1338  1.1.1.2  christos     }
   1339  1.1.1.2  christos }
   1340  1.1.1.2  christos 
   1341  1.1.1.2  christos /* Add entries in data objects section to psymtab.  */
   1342  1.1.1.2  christos 
   1343  1.1.1.2  christos static void
   1344  1.1.1.2  christos ctf_psymtab_add_stt_obj (ctf_dict_t *cfp, ctf_psymtab *pst,
   1345  1.1.1.2  christos 			 struct objfile *of)
   1346  1.1.1.2  christos {
   1347  1.1.1.2  christos   ctf_psymtab_add_stt_entries (cfp, pst, of, 0);
   1348  1.1.1.2  christos }
   1349  1.1.1.2  christos 
   1350  1.1.1.2  christos /* Add entries in function info section to psymtab.  */
   1351  1.1.1.2  christos 
   1352  1.1.1.2  christos static void
   1353  1.1.1.2  christos ctf_psymtab_add_stt_func (ctf_dict_t *cfp, ctf_psymtab *pst,
   1354  1.1.1.2  christos 			  struct objfile *of)
   1355  1.1.1.2  christos {
   1356  1.1.1.2  christos   ctf_psymtab_add_stt_entries (cfp, pst, of, 1);
   1357  1.1.1.2  christos }
   1358  1.1.1.2  christos 
   1359      1.1  christos /* Read in full symbols for PST, and anything it depends on.  */
   1360      1.1  christos 
   1361      1.1  christos void
   1362      1.1  christos ctf_psymtab::expand_psymtab (struct objfile *objfile)
   1363      1.1  christos {
   1364      1.1  christos   struct ctf_context *ccp;
   1365      1.1  christos 
   1366      1.1  christos   gdb_assert (!readin);
   1367      1.1  christos 
   1368  1.1.1.2  christos   ccp = &context;
   1369      1.1  christos 
   1370      1.1  christos   /* Iterate over entries in data types section.  */
   1371      1.1  christos   if (ctf_type_iter (ccp->fp, ctf_add_type_cb, ccp) == CTF_ERR)
   1372      1.1  christos     complaint (_("ctf_type_iter psymtab_to_symtab failed - %s"),
   1373      1.1  christos 	       ctf_errmsg (ctf_errno (ccp->fp)));
   1374      1.1  christos 
   1375      1.1  christos 
   1376      1.1  christos   /* Iterate over entries in variable info section.  */
   1377      1.1  christos   if (ctf_variable_iter (ccp->fp, ctf_add_var_cb, ccp) == CTF_ERR)
   1378      1.1  christos     complaint (_("ctf_variable_iter psymtab_to_symtab failed - %s"),
   1379      1.1  christos 	       ctf_errmsg (ctf_errno (ccp->fp)));
   1380      1.1  christos 
   1381      1.1  christos   /* Add entries in data objects and function info sections.  */
   1382  1.1.1.2  christos   add_stt_obj (ccp);
   1383  1.1.1.2  christos   add_stt_func (ccp);
   1384      1.1  christos 
   1385      1.1  christos   readin = true;
   1386      1.1  christos }
   1387      1.1  christos 
   1388      1.1  christos /* Expand partial symbol table PST into a full symbol table.
   1389      1.1  christos    PST is not NULL.  */
   1390      1.1  christos 
   1391      1.1  christos void
   1392      1.1  christos ctf_psymtab::read_symtab (struct objfile *objfile)
   1393      1.1  christos {
   1394      1.1  christos   if (readin)
   1395      1.1  christos     warning (_("bug: psymtab for %s is already read in."), filename);
   1396      1.1  christos   else
   1397      1.1  christos     {
   1398      1.1  christos       if (info_verbose)
   1399      1.1  christos 	{
   1400  1.1.1.2  christos 	  gdb_printf (_("Reading in CTF data for %s..."), filename);
   1401      1.1  christos 	  gdb_flush (gdb_stdout);
   1402      1.1  christos 	}
   1403      1.1  christos 
   1404      1.1  christos       /* Start a symtab.  */
   1405      1.1  christos       CORE_ADDR offset;        /* Start of text segment.  */
   1406  1.1.1.3  christos       size_t tsize;
   1407      1.1  christos 
   1408      1.1  christos       offset = get_objfile_text_range (objfile, &tsize);
   1409  1.1.1.2  christos       ctf_start_compunit_symtab (this, objfile, offset);
   1410      1.1  christos       expand_psymtab (objfile);
   1411      1.1  christos 
   1412  1.1.1.3  christos       set_text_low (unrelocated_addr (0));
   1413  1.1.1.3  christos       set_text_high (unrelocated_addr (tsize));
   1414  1.1.1.3  christos       compunit_symtab = ctf_end_compunit_symtab (this, offset + tsize);
   1415      1.1  christos 
   1416      1.1  christos       /* Finish up the debug error message.  */
   1417      1.1  christos       if (info_verbose)
   1418  1.1.1.2  christos 	gdb_printf (_("done.\n"));
   1419      1.1  christos     }
   1420      1.1  christos }
   1421      1.1  christos 
   1422      1.1  christos /* Allocate a new partial_symtab NAME.
   1423      1.1  christos 
   1424      1.1  christos    Each source file that has not been fully read in is represented by
   1425      1.1  christos    a partial_symtab.  This contains the information on where in the
   1426      1.1  christos    executable the debugging symbols for a specific file are, and a
   1427      1.1  christos    list of names of global symbols which are located in this file.
   1428      1.1  christos    They are all chained on partial symtab lists.
   1429      1.1  christos 
   1430      1.1  christos    Even after the source file has been read into a symtab, the
   1431      1.1  christos    partial_symtab remains around.  They are allocated on an obstack,
   1432      1.1  christos    objfile_obstack.  */
   1433      1.1  christos 
   1434      1.1  christos static ctf_psymtab *
   1435      1.1  christos create_partial_symtab (const char *name,
   1436  1.1.1.2  christos 		       ctf_archive_t *arc,
   1437  1.1.1.2  christos 		       ctf_dict_t *cfp,
   1438  1.1.1.2  christos 		       psymtab_storage *partial_symtabs,
   1439      1.1  christos 		       struct objfile *objfile)
   1440      1.1  christos {
   1441      1.1  christos   ctf_psymtab *pst;
   1442      1.1  christos 
   1443  1.1.1.3  christos   pst = new ctf_psymtab (name, partial_symtabs, objfile->per_bfd,
   1444  1.1.1.3  christos 			 unrelocated_addr (0));
   1445      1.1  christos 
   1446  1.1.1.2  christos   pst->context.arc = arc;
   1447  1.1.1.2  christos   pst->context.fp = cfp;
   1448  1.1.1.2  christos   pst->context.of = objfile;
   1449  1.1.1.2  christos   pst->context.partial_symtabs = partial_symtabs;
   1450  1.1.1.2  christos   pst->context.pst = pst;
   1451  1.1.1.2  christos   pst->context.builder = nullptr;
   1452      1.1  christos 
   1453      1.1  christos   return pst;
   1454      1.1  christos }
   1455      1.1  christos 
   1456      1.1  christos /* Callback to add type TID to partial symbol table.  */
   1457      1.1  christos 
   1458      1.1  christos static int
   1459      1.1  christos ctf_psymtab_type_cb (ctf_id_t tid, void *arg)
   1460      1.1  christos {
   1461      1.1  christos   struct ctf_context *ccp;
   1462      1.1  christos   uint32_t kind;
   1463  1.1.1.4  christos   int section = -1;
   1464      1.1  christos 
   1465      1.1  christos   ccp = (struct ctf_context *) arg;
   1466      1.1  christos 
   1467      1.1  christos   domain_enum domain = UNDEF_DOMAIN;
   1468      1.1  christos   enum address_class aclass = LOC_UNDEF;
   1469      1.1  christos   kind = ctf_type_kind (ccp->fp, tid);
   1470      1.1  christos   switch (kind)
   1471      1.1  christos     {
   1472  1.1.1.2  christos       case CTF_K_ENUM:
   1473  1.1.1.2  christos 	ctf_psymtab_add_enums (ccp, tid);
   1474  1.1.1.3  christos 	[[fallthrough]];
   1475      1.1  christos       case CTF_K_STRUCT:
   1476      1.1  christos       case CTF_K_UNION:
   1477      1.1  christos 	domain = STRUCT_DOMAIN;
   1478      1.1  christos 	aclass = LOC_TYPEDEF;
   1479      1.1  christos 	break;
   1480      1.1  christos       case CTF_K_FUNCTION:
   1481      1.1  christos       case CTF_K_FORWARD:
   1482      1.1  christos 	domain = VAR_DOMAIN;
   1483      1.1  christos 	aclass = LOC_STATIC;
   1484      1.1  christos 	section = SECT_OFF_TEXT (ccp->of);
   1485      1.1  christos 	break;
   1486      1.1  christos       case CTF_K_CONST:
   1487      1.1  christos 	domain = VAR_DOMAIN;
   1488      1.1  christos 	aclass = LOC_STATIC;
   1489      1.1  christos 	break;
   1490      1.1  christos       case CTF_K_TYPEDEF:
   1491      1.1  christos       case CTF_K_POINTER:
   1492      1.1  christos       case CTF_K_VOLATILE:
   1493      1.1  christos       case CTF_K_RESTRICT:
   1494      1.1  christos 	domain = VAR_DOMAIN;
   1495      1.1  christos 	aclass = LOC_TYPEDEF;
   1496      1.1  christos 	break;
   1497      1.1  christos       case CTF_K_INTEGER:
   1498      1.1  christos       case CTF_K_FLOAT:
   1499      1.1  christos 	domain = VAR_DOMAIN;
   1500      1.1  christos 	aclass = LOC_TYPEDEF;
   1501      1.1  christos 	break;
   1502      1.1  christos       case CTF_K_ARRAY:
   1503      1.1  christos       case CTF_K_UNKNOWN:
   1504      1.1  christos 	return 0;
   1505      1.1  christos     }
   1506      1.1  christos 
   1507  1.1.1.2  christos   const char *name = ctf_type_name_raw (ccp->fp, tid);
   1508  1.1.1.2  christos   if (name == nullptr || strlen (name) == 0)
   1509  1.1.1.2  christos     return 0;
   1510  1.1.1.2  christos 
   1511  1.1.1.2  christos   ccp->pst->add_psymbol (name, false,
   1512      1.1  christos 			 domain, aclass, section,
   1513  1.1.1.2  christos 			 psymbol_placement::STATIC,
   1514  1.1.1.3  christos 			 unrelocated_addr (0),
   1515  1.1.1.3  christos 			 language_c, ccp->partial_symtabs, ccp->of);
   1516      1.1  christos 
   1517      1.1  christos   return 0;
   1518      1.1  christos }
   1519      1.1  christos 
   1520      1.1  christos /* Callback to add variable NAME with ID to partial symbol table.  */
   1521      1.1  christos 
   1522      1.1  christos static int
   1523      1.1  christos ctf_psymtab_var_cb (const char *name, ctf_id_t id, void *arg)
   1524      1.1  christos {
   1525      1.1  christos   struct ctf_context *ccp = (struct ctf_context *) arg;
   1526      1.1  christos 
   1527  1.1.1.2  christos   ccp->pst->add_psymbol (name, true,
   1528  1.1.1.2  christos 			 VAR_DOMAIN, LOC_STATIC, -1,
   1529  1.1.1.2  christos 			 psymbol_placement::GLOBAL,
   1530  1.1.1.3  christos 			 unrelocated_addr (0),
   1531  1.1.1.3  christos 			 language_c, ccp->partial_symtabs, ccp->of);
   1532      1.1  christos   return 0;
   1533      1.1  christos }
   1534      1.1  christos 
   1535      1.1  christos /* Setup partial_symtab's describing each source file for which
   1536      1.1  christos    debugging information is available.  */
   1537      1.1  christos 
   1538      1.1  christos static void
   1539  1.1.1.2  christos scan_partial_symbols (ctf_dict_t *cfp, psymtab_storage *partial_symtabs,
   1540  1.1.1.2  christos 		      struct ctf_per_tu_data *tup, const char *fname)
   1541      1.1  christos {
   1542  1.1.1.2  christos   struct objfile *of = tup->of;
   1543  1.1.1.2  christos   bool isparent = false;
   1544  1.1.1.2  christos 
   1545  1.1.1.2  christos   if (strcmp (fname, ".ctf") == 0)
   1546  1.1.1.2  christos     {
   1547  1.1.1.2  christos       fname = bfd_get_filename (of->obfd.get ());
   1548  1.1.1.2  christos       isparent = true;
   1549  1.1.1.2  christos     }
   1550      1.1  christos 
   1551  1.1.1.2  christos   ctf_psymtab *pst = create_partial_symtab (fname, tup->arc, cfp,
   1552  1.1.1.2  christos 					    partial_symtabs, of);
   1553      1.1  christos 
   1554  1.1.1.2  christos   struct ctf_context *ccx = &pst->context;
   1555  1.1.1.2  christos   if (isparent == false)
   1556  1.1.1.2  christos     ccx->pst = pst;
   1557  1.1.1.2  christos 
   1558  1.1.1.2  christos   if (ctf_type_iter (cfp, ctf_psymtab_type_cb, ccx) == CTF_ERR)
   1559      1.1  christos     complaint (_("ctf_type_iter scan_partial_symbols failed - %s"),
   1560      1.1  christos 	       ctf_errmsg (ctf_errno (cfp)));
   1561      1.1  christos 
   1562  1.1.1.2  christos   if (ctf_variable_iter (cfp, ctf_psymtab_var_cb, ccx) == CTF_ERR)
   1563      1.1  christos     complaint (_("ctf_variable_iter scan_partial_symbols failed - %s"),
   1564      1.1  christos 	       ctf_errmsg (ctf_errno (cfp)));
   1565      1.1  christos 
   1566      1.1  christos   /* Scan CTF object and function sections which correspond to each
   1567      1.1  christos      STT_FUNC or STT_OBJECT entry in the symbol table,
   1568      1.1  christos      pick up what init_symtab has done.  */
   1569  1.1.1.2  christos   ctf_psymtab_add_stt_obj (cfp, pst, of);
   1570  1.1.1.2  christos   ctf_psymtab_add_stt_func (cfp, pst, of);
   1571      1.1  christos 
   1572  1.1.1.2  christos   pst->end ();
   1573  1.1.1.2  christos }
   1574  1.1.1.2  christos 
   1575  1.1.1.2  christos /* Callback to build the psymtab for archive member NAME.  */
   1576  1.1.1.2  christos 
   1577  1.1.1.2  christos static int
   1578  1.1.1.2  christos build_ctf_archive_member (ctf_dict_t *ctf, const char *name, void *arg)
   1579  1.1.1.2  christos {
   1580  1.1.1.2  christos   struct ctf_per_tu_data *tup = (struct ctf_per_tu_data *) arg;
   1581  1.1.1.2  christos   ctf_dict_t *parent = tup->fp;
   1582  1.1.1.2  christos 
   1583  1.1.1.2  christos   if (strcmp (name, ".ctf") != 0)
   1584  1.1.1.2  christos     ctf_import (ctf, parent);
   1585      1.1  christos 
   1586  1.1.1.2  christos   if (info_verbose)
   1587  1.1.1.2  christos     {
   1588  1.1.1.2  christos       gdb_printf (_("Scanning archive member %s..."), name);
   1589  1.1.1.2  christos       gdb_flush (gdb_stdout);
   1590      1.1  christos     }
   1591      1.1  christos 
   1592  1.1.1.2  christos   psymtab_storage *pss = tup->psf->get_partial_symtabs ().get ();
   1593  1.1.1.2  christos   scan_partial_symbols (ctf, pss, tup, name);
   1594  1.1.1.2  christos 
   1595  1.1.1.2  christos   return 0;
   1596      1.1  christos }
   1597      1.1  christos 
   1598      1.1  christos /* Read CTF debugging information from a BFD section.  This is
   1599      1.1  christos    called from elfread.c.  It does a quick pass through the
   1600      1.1  christos    .ctf section to set up the partial symbol table.  */
   1601      1.1  christos 
   1602      1.1  christos void
   1603      1.1  christos elfctf_build_psymtabs (struct objfile *of)
   1604      1.1  christos {
   1605  1.1.1.2  christos   struct ctf_per_tu_data pcu;
   1606  1.1.1.2  christos   bfd *abfd = of->obfd.get ();
   1607      1.1  christos   int err;
   1608      1.1  christos 
   1609      1.1  christos   ctf_archive_t *arc = ctf_bfdopen (abfd, &err);
   1610  1.1.1.2  christos   if (arc == nullptr)
   1611      1.1  christos     error (_("ctf_bfdopen failed on %s - %s"),
   1612      1.1  christos 	   bfd_get_filename (abfd), ctf_errmsg (err));
   1613      1.1  christos 
   1614  1.1.1.2  christos   ctf_dict_t *fp = ctf_dict_open (arc, NULL, &err);
   1615  1.1.1.2  christos   if (fp == nullptr)
   1616  1.1.1.2  christos     error (_("ctf_dict_open failed on %s - %s"),
   1617      1.1  christos 	   bfd_get_filename (abfd), ctf_errmsg (err));
   1618  1.1.1.2  christos   ctf_dict_key.emplace (of, fp);
   1619      1.1  christos 
   1620  1.1.1.2  christos   pcu.fp = fp;
   1621  1.1.1.2  christos   pcu.of = of;
   1622  1.1.1.2  christos   pcu.arc = arc;
   1623  1.1.1.2  christos 
   1624  1.1.1.2  christos   psymbol_functions *psf = new psymbol_functions ();
   1625  1.1.1.2  christos   of->qf.emplace_front (psf);
   1626  1.1.1.2  christos   pcu.psf = psf;
   1627  1.1.1.2  christos 
   1628  1.1.1.2  christos   if (ctf_archive_iter (arc, build_ctf_archive_member, &pcu) < 0)
   1629  1.1.1.2  christos     error (_("ctf_archive_iter failed in input file %s: - %s"),
   1630  1.1.1.2  christos 	   bfd_get_filename (abfd), ctf_errmsg (err));
   1631      1.1  christos }
   1632      1.1  christos 
   1633      1.1  christos #else
   1634      1.1  christos 
   1635      1.1  christos void
   1636      1.1  christos elfctf_build_psymtabs (struct objfile *of)
   1637      1.1  christos {
   1638      1.1  christos   /* Nothing to do if CTF is disabled.  */
   1639      1.1  christos }
   1640      1.1  christos 
   1641      1.1  christos #endif /* ENABLE_LIBCTF */
   1642