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