xref: /netbsd/external/gpl3/gdb/dist/gdb/ctfread.c (revision 1424dfb3)
1 /* Compact ANSI-C Type Format (CTF) support in GDB.
2 
3    Copyright (C) 2019-2020 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 struct objfile_key<htab, htab_deleter> ctf_tid_key;
91 
92 struct ctf_fp_info
93 {
94   explicit ctf_fp_info (ctf_file_t *cfp) : fp (cfp) {}
95   ~ctf_fp_info ();
96   ctf_file_t *fp;
97 };
98 
99 /* Cleanup function for the ctf_file_key data.  */
100 ctf_fp_info::~ctf_fp_info ()
101 {
102   if (!fp)
103     return;
104 
105   ctf_archive_t *arc = ctf_get_arc (fp);
106   ctf_file_close (fp);
107   ctf_close (arc);
108 }
109 
110 static const objfile_key<ctf_fp_info> ctf_file_key;
111 
112 /* A CTF context consists of a file pointer and an objfile pointer.  */
113 
114 struct ctf_context
115 {
116   ctf_file_t *fp;
117   struct objfile *of;
118   struct buildsym_compunit *builder;
119 };
120 
121 /* A partial symtab, specialized for this module.  */
122 struct ctf_psymtab : public standard_psymtab
123 {
124   ctf_psymtab (const char *filename, struct objfile *objfile, CORE_ADDR addr)
125     : standard_psymtab (filename, objfile, addr)
126   {
127   }
128 
129   void read_symtab (struct objfile *) override;
130   void expand_psymtab (struct objfile *) override;
131 
132   struct ctf_context *context;
133 };
134 
135 /* The routines that read and process fields/members of a C struct, union,
136    or enumeration, pass lists of data member fields in an instance of a
137    ctf_field_info structure. It is derived from dwarf2read.c.  */
138 
139 struct ctf_nextfield
140 {
141   struct field field {};
142 };
143 
144 struct ctf_field_info
145 {
146   /* List of data member fields.  */
147   std::vector<struct ctf_nextfield> fields;
148 
149   /* Context.  */
150   struct ctf_context *cur_context;
151 
152   /* Parent type.  */
153   struct type *ptype;
154 
155   /* typedefs defined inside this class.  TYPEDEF_FIELD_LIST contains head
156      of a NULL terminated list of TYPEDEF_FIELD_LIST_COUNT elements.  */
157   std::vector<struct decl_field> typedef_field_list;
158 
159   /* Nested types defined by this struct and the number of elements in
160      this list.  */
161   std::vector<struct decl_field> nested_types_list;
162 };
163 
164 
165 /* Local function prototypes */
166 
167 static int ctf_add_type_cb (ctf_id_t tid, void *arg);
168 
169 static struct type *read_array_type (struct ctf_context *cp, ctf_id_t tid);
170 
171 static struct type *read_pointer_type (struct ctf_context *cp, ctf_id_t tid,
172 				       ctf_id_t btid);
173 
174 static struct type *read_structure_type (struct ctf_context *cp, ctf_id_t tid);
175 
176 static struct type *read_enum_type (struct ctf_context *cp, ctf_id_t tid);
177 
178 static struct type *read_typedef_type (struct ctf_context *cp, ctf_id_t tid,
179 				       ctf_id_t btid, const char *name);
180 
181 static struct type *read_type_record (struct ctf_context *cp, ctf_id_t tid);
182 
183 static void process_structure_type (struct ctf_context *cp, ctf_id_t tid);
184 
185 static void process_struct_members (struct ctf_context *cp, ctf_id_t tid,
186 				    struct type *type);
187 
188 static struct symbol *new_symbol (struct ctf_context *cp, struct type *type,
189 				  ctf_id_t tid);
190 
191 struct ctf_tid_and_type
192 {
193   ctf_id_t tid;
194   struct type *type;
195 };
196 
197 /* Hash function for a ctf_tid_and_type.  */
198 
199 static hashval_t
200 tid_and_type_hash (const void *item)
201 {
202   const struct ctf_tid_and_type *ids
203     = (const struct ctf_tid_and_type *) item;
204 
205   return ids->tid;
206 }
207 
208 /* Equality function for a ctf_tid_and_type.  */
209 
210 static int
211 tid_and_type_eq (const void *item_lhs, const void *item_rhs)
212 {
213   const struct ctf_tid_and_type *ids_lhs
214     = (const struct ctf_tid_and_type *) item_lhs;
215   const struct ctf_tid_and_type *ids_rhs
216     = (const struct ctf_tid_and_type *) item_rhs;
217 
218   return ids_lhs->tid == ids_rhs->tid;
219 }
220 
221 /* Set the type associated with TID to TYP.  */
222 
223 static struct type *
224 set_tid_type (struct objfile *of, ctf_id_t tid, struct type *typ)
225 {
226   htab_t htab;
227 
228   htab = (htab_t) ctf_tid_key.get (of);
229   if (htab == NULL)
230     {
231       htab = htab_create_alloc (1, tid_and_type_hash,
232 				tid_and_type_eq,
233 				NULL, xcalloc, xfree);
234       ctf_tid_key.set (of, htab);
235     }
236 
237   struct ctf_tid_and_type **slot, ids;
238   ids.tid = tid;
239   ids.type = typ;
240   slot = (struct ctf_tid_and_type **) htab_find_slot (htab, &ids, INSERT);
241   if (*slot)
242     complaint (_("An internal GDB problem: ctf_ id_t %ld type already set"),
243 	       (tid));
244   *slot = XOBNEW (&of->objfile_obstack, struct ctf_tid_and_type);
245   **slot = ids;
246   return typ;
247 }
248 
249 /* Look up the type for TID in tid_and_type hash, return NULL if hash is
250    empty or TID does not have a saved type.  */
251 
252 static struct type *
253 get_tid_type (struct objfile *of, ctf_id_t tid)
254 {
255   struct ctf_tid_and_type *slot, ids;
256   htab_t htab;
257 
258   htab = (htab_t) ctf_tid_key.get (of);
259   if (htab == NULL)
260     return NULL;
261 
262   ids.tid = tid;
263   ids.type = NULL;
264   slot = (struct ctf_tid_and_type *) htab_find (htab, &ids);
265   if (slot)
266     return slot->type;
267   else
268     return NULL;
269 }
270 
271 /* Return the size of storage in bits for INTEGER, FLOAT, or ENUM.  */
272 
273 static int
274 get_bitsize (ctf_file_t *fp, ctf_id_t tid, uint32_t kind)
275 {
276   ctf_encoding_t cet;
277 
278   if ((kind == CTF_K_INTEGER || kind == CTF_K_ENUM
279       || kind == CTF_K_FLOAT)
280       && ctf_type_reference (fp, tid) != CTF_ERR
281       && ctf_type_encoding (fp, tid, &cet) != CTF_ERR)
282     return cet.cte_bits;
283 
284   return 0;
285 }
286 
287 /* Set SYM's address, with NAME, from its minimal symbol entry.  */
288 
289 static void
290 set_symbol_address (struct objfile *of, struct symbol *sym, const char *name)
291 {
292   struct bound_minimal_symbol msym;
293 
294   msym = lookup_minimal_symbol (name, NULL, of);
295   if (msym.minsym != NULL)
296     {
297       SET_SYMBOL_VALUE_ADDRESS (sym, BMSYMBOL_VALUE_ADDRESS (msym));
298       SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC;
299       SYMBOL_SECTION (sym) = MSYMBOL_SECTION (msym.minsym);
300     }
301 }
302 
303 /* Create the vector of fields, and attach it to TYPE.  */
304 
305 static void
306 attach_fields_to_type (struct ctf_field_info *fip, struct type *type)
307 {
308   int nfields = fip->fields.size ();
309 
310   if (nfields == 0)
311     return;
312 
313   /* Record the field count, allocate space for the array of fields.  */
314   type->set_num_fields (nfields);
315   type->set_fields
316     ((struct field *) TYPE_ZALLOC (type, sizeof (struct field) * nfields));
317 
318   /* Copy the saved-up fields into the field vector.  */
319   for (int i = 0; i < nfields; ++i)
320     {
321       struct ctf_nextfield &field = fip->fields[i];
322       type->field (i) = field.field;
323     }
324 }
325 
326 /* Allocate a floating-point type of size BITS and name NAME.  Pass NAME_HINT
327    (which may be different from NAME) to the architecture back-end to allow
328    it to guess the correct format if necessary.  */
329 
330 static struct type *
331 ctf_init_float_type (struct objfile *objfile,
332 		     int bits,
333 		     const char *name,
334 		     const char *name_hint)
335 {
336   struct gdbarch *gdbarch = objfile->arch ();
337   const struct floatformat **format;
338   struct type *type;
339 
340   format = gdbarch_floatformat_for_type (gdbarch, name_hint, bits);
341   if (format != NULL)
342     type = init_float_type (objfile, bits, name, format);
343   else
344     type = init_type (objfile, TYPE_CODE_ERROR, bits, name);
345 
346   return type;
347 }
348 
349 /* Callback to add member NAME to a struct/union type. TID is the type
350    of struct/union member, OFFSET is the offset of member in bits,
351    and ARG contains the ctf_field_info.  */
352 
353 static int
354 ctf_add_member_cb (const char *name,
355 		   ctf_id_t tid,
356 		   unsigned long offset,
357 		   void *arg)
358 {
359   struct ctf_field_info *fip = (struct ctf_field_info *) arg;
360   struct ctf_context *ccp = fip->cur_context;
361   struct ctf_nextfield new_field;
362   struct field *fp;
363   struct type *t;
364   uint32_t kind;
365 
366   fp = &new_field.field;
367   FIELD_NAME (*fp) = name;
368 
369   kind = ctf_type_kind (ccp->fp, tid);
370   t = get_tid_type (ccp->of, tid);
371   if (t == NULL)
372     {
373       t = read_type_record (ccp, tid);
374       if (t == NULL)
375 	{
376 	  complaint (_("ctf_add_member_cb: %s has NO type (%ld)"), name, tid);
377 	  t = objfile_type (ccp->of)->builtin_error;
378 	  set_tid_type (ccp->of, tid, t);
379 	}
380     }
381 
382   if (kind == CTF_K_STRUCT || kind == CTF_K_UNION)
383     process_struct_members (ccp, tid, t);
384 
385   fp->set_type (t);
386   SET_FIELD_BITPOS (*fp, offset / TARGET_CHAR_BIT);
387   FIELD_BITSIZE (*fp) = get_bitsize (ccp->fp, tid, kind);
388 
389   fip->fields.emplace_back (new_field);
390 
391   return 0;
392 }
393 
394 /* Callback to add member NAME of EVAL to an enumeration type.
395    ARG contains the ctf_field_info.  */
396 
397 static int
398 ctf_add_enum_member_cb (const char *name, int enum_value, void *arg)
399 {
400   struct ctf_field_info *fip = (struct ctf_field_info *) arg;
401   struct ctf_nextfield new_field;
402   struct field *fp;
403   struct ctf_context *ccp = fip->cur_context;
404 
405   fp = &new_field.field;
406   FIELD_NAME (*fp) = name;
407   fp->set_type (NULL);
408   SET_FIELD_ENUMVAL (*fp, enum_value);
409   FIELD_BITSIZE (*fp) = 0;
410 
411   if (name != NULL)
412     {
413       struct symbol *sym = new (&ccp->of->objfile_obstack) symbol;
414       OBJSTAT (ccp->of, n_syms++);
415 
416       sym->set_language (language_c, &ccp->of->objfile_obstack);
417       sym->compute_and_set_names (name, false, ccp->of->per_bfd);
418       SYMBOL_ACLASS_INDEX (sym) = LOC_CONST;
419       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
420       SYMBOL_TYPE (sym) = fip->ptype;
421       add_symbol_to_list (sym, ccp->builder->get_global_symbols ());
422     }
423 
424   fip->fields.emplace_back (new_field);
425 
426   return 0;
427 }
428 
429 /* Add a new symbol entry, with its name from TID, its access index and
430    domain from TID's kind, and its type from TYPE.  */
431 
432 static struct symbol *
433 new_symbol (struct ctf_context *ccp, struct type *type, ctf_id_t tid)
434 {
435   struct objfile *objfile = ccp->of;
436   ctf_file_t *fp = ccp->fp;
437   struct symbol *sym = NULL;
438 
439   gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
440   if (name != NULL)
441     {
442       sym = new (&objfile->objfile_obstack) symbol;
443       OBJSTAT (objfile, n_syms++);
444 
445       sym->set_language (language_c, &objfile->objfile_obstack);
446       sym->compute_and_set_names (name.get (), true, objfile->per_bfd);
447       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
448       SYMBOL_ACLASS_INDEX (sym) = LOC_OPTIMIZED_OUT;
449 
450       if (type != NULL)
451 	SYMBOL_TYPE (sym) = type;
452 
453       uint32_t kind = ctf_type_kind (fp, tid);
454       switch (kind)
455 	{
456 	  case CTF_K_STRUCT:
457 	  case CTF_K_UNION:
458 	  case CTF_K_ENUM:
459 	    SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
460 	    SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
461 	    break;
462 	  case CTF_K_FUNCTION:
463 	    SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC;
464 	    break;
465 	  case CTF_K_CONST:
466 	    if (SYMBOL_TYPE (sym)->code () == TYPE_CODE_VOID)
467 	      SYMBOL_TYPE (sym) = objfile_type (objfile)->builtin_int;
468 	    break;
469 	  case CTF_K_TYPEDEF:
470 	  case CTF_K_INTEGER:
471 	  case CTF_K_FLOAT:
472 	    SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
473 	    SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
474 	    break;
475 	  case CTF_K_POINTER:
476 	    break;
477 	  case CTF_K_VOLATILE:
478 	  case CTF_K_RESTRICT:
479 	    break;
480 	  case CTF_K_SLICE:
481 	  case CTF_K_ARRAY:
482 	  case CTF_K_UNKNOWN:
483 	    break;
484 	}
485 
486       add_symbol_to_list (sym, ccp->builder->get_global_symbols ());
487     }
488 
489   return sym;
490 }
491 
492 /* Given a TID of kind CTF_K_INTEGER or CTF_K_FLOAT, find a representation
493    and create the symbol for it.  */
494 
495 static struct type *
496 read_base_type (struct ctf_context *ccp, ctf_id_t tid)
497 {
498   struct objfile *of = ccp->of;
499   ctf_file_t *fp = ccp->fp;
500   ctf_encoding_t cet;
501   struct type *type = NULL;
502   char *name;
503   uint32_t kind;
504 
505   if (ctf_type_encoding (fp, tid, &cet))
506     {
507       complaint (_("ctf_type_encoding read_base_type failed - %s"),
508 		 ctf_errmsg (ctf_errno (fp)));
509       return NULL;
510     }
511 
512   gdb::unique_xmalloc_ptr<char> copied_name (ctf_type_aname_raw (fp, tid));
513   if (copied_name == NULL || strlen (copied_name.get ()) == 0)
514     {
515       name = ctf_type_aname (fp, tid);
516       if (name == NULL)
517 	complaint (_("ctf_type_aname read_base_type failed - %s"),
518 		   ctf_errmsg (ctf_errno (fp)));
519     }
520   else
521     name = obstack_strdup (&of->objfile_obstack, copied_name.get ());
522 
523   kind = ctf_type_kind (fp, tid);
524   if (kind == CTF_K_INTEGER)
525     {
526       uint32_t issigned, ischar, isbool;
527       struct gdbarch *gdbarch = of->arch ();
528 
529       issigned = cet.cte_format & CTF_INT_SIGNED;
530       ischar = cet.cte_format & CTF_INT_CHAR;
531       isbool = cet.cte_format & CTF_INT_BOOL;
532       if (ischar)
533 	type = init_character_type (of, TARGET_CHAR_BIT, !issigned, name);
534       else if (isbool)
535 	type = init_boolean_type (of, gdbarch_int_bit (gdbarch),
536 				  !issigned, name);
537       else
538 	{
539 	  int bits;
540 	  if (cet.cte_bits && ((cet.cte_bits % TARGET_CHAR_BIT) == 0))
541 	    bits = cet.cte_bits;
542 	  else
543 	    bits = gdbarch_int_bit (gdbarch);
544 	  type = init_integer_type (of, bits, !issigned, name);
545 	}
546     }
547   else if (kind == CTF_K_FLOAT)
548     {
549       uint32_t isflt;
550       isflt = !((cet.cte_format & CTF_FP_IMAGRY) == CTF_FP_IMAGRY
551 		 || (cet.cte_format & CTF_FP_DIMAGRY) == CTF_FP_DIMAGRY
552 		 || (cet.cte_format & CTF_FP_LDIMAGRY) == CTF_FP_LDIMAGRY);
553       if (isflt)
554 	type = ctf_init_float_type (of, cet.cte_bits, name, name);
555       else
556 	{
557 	  struct type *t
558 	    = ctf_init_float_type (of, cet.cte_bits / 2, NULL, name);
559 	  type = init_complex_type (name, t);
560 	}
561     }
562   else
563     {
564       complaint (_("read_base_type: unsupported base kind (%d)"), kind);
565       type = init_type (of, TYPE_CODE_ERROR, cet.cte_bits, name);
566     }
567 
568   if (name != NULL && strcmp (name, "char") == 0)
569     TYPE_NOSIGN (type) = 1;
570 
571   return set_tid_type (of, tid, type);
572 }
573 
574 static void
575 process_base_type (struct ctf_context *ccp, ctf_id_t tid)
576 {
577   struct type *type;
578 
579   type = read_base_type (ccp, tid);
580   new_symbol (ccp, type, tid);
581 }
582 
583 /* Start a structure or union scope (definition) with TID to create a type
584    for the structure or union.
585 
586    Fill in the type's name and general properties. The members will not be
587    processed, nor a symbol table entry be done until process_structure_type
588    (assuming the type has a name).  */
589 
590 static struct type *
591 read_structure_type (struct ctf_context *ccp, ctf_id_t tid)
592 {
593   struct objfile *of = ccp->of;
594   ctf_file_t *fp = ccp->fp;
595   struct type *type;
596   uint32_t kind;
597 
598   type = alloc_type (of);
599 
600   gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
601   if (name != NULL && strlen (name.get() ) != 0)
602     type->set_name (obstack_strdup (&of->objfile_obstack, name.get ()));
603 
604   kind = ctf_type_kind (fp, tid);
605   if (kind == CTF_K_UNION)
606     type->set_code (TYPE_CODE_UNION);
607   else
608     type->set_code (TYPE_CODE_STRUCT);
609 
610   TYPE_LENGTH (type) = ctf_type_size (fp, tid);
611   set_type_align (type, ctf_type_align (fp, tid));
612 
613   return set_tid_type (ccp->of, tid, type);
614 }
615 
616 /* Given a tid of CTF_K_STRUCT or CTF_K_UNION, process all its members
617    and create the symbol for it.  */
618 
619 static void
620 process_struct_members (struct ctf_context *ccp,
621 			ctf_id_t tid,
622 			struct type *type)
623 {
624   struct ctf_field_info fi;
625 
626   fi.cur_context = ccp;
627   if (ctf_member_iter (ccp->fp, tid, ctf_add_member_cb, &fi) == CTF_ERR)
628     complaint (_("ctf_member_iter process_struct_members failed - %s"),
629 	       ctf_errmsg (ctf_errno (ccp->fp)));
630 
631   /* Attach fields to the type.  */
632   attach_fields_to_type (&fi, type);
633 
634   new_symbol (ccp, type, tid);
635 }
636 
637 static void
638 process_structure_type (struct ctf_context *ccp, ctf_id_t tid)
639 {
640   struct type *type;
641 
642   type = read_structure_type (ccp, tid);
643   process_struct_members (ccp, tid, type);
644 }
645 
646 /* Create a function type for TID and set its return type.  */
647 
648 static struct type *
649 read_func_kind_type (struct ctf_context *ccp, ctf_id_t tid)
650 {
651   struct objfile *of = ccp->of;
652   ctf_file_t *fp = ccp->fp;
653   struct type *type, *rettype;
654   ctf_funcinfo_t cfi;
655 
656   type = alloc_type (of);
657 
658   gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
659   if (name != NULL && strlen (name.get ()) != 0)
660     type->set_name (obstack_strdup (&of->objfile_obstack, name.get ()));
661 
662   type->set_code (TYPE_CODE_FUNC);
663   ctf_func_type_info (fp, tid, &cfi);
664   rettype = get_tid_type (of, cfi.ctc_return);
665   TYPE_TARGET_TYPE (type) = rettype;
666   set_type_align (type, ctf_type_align (fp, tid));
667 
668   return set_tid_type (of, tid, type);
669 }
670 
671 /* Given a TID of CTF_K_ENUM, process all the members of the
672    enumeration, and create the symbol for the enumeration type.  */
673 
674 static struct type *
675 read_enum_type (struct ctf_context *ccp, ctf_id_t tid)
676 {
677   struct objfile *of = ccp->of;
678   ctf_file_t *fp = ccp->fp;
679   struct type *type, *target_type;
680   ctf_funcinfo_t fi;
681 
682   type = alloc_type (of);
683 
684   gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
685   if (name != NULL && strlen (name.get ()) != 0)
686     type->set_name (obstack_strdup (&of->objfile_obstack, name.get ()));
687 
688   type->set_code (TYPE_CODE_ENUM);
689   TYPE_LENGTH (type) = ctf_type_size (fp, tid);
690   ctf_func_type_info (fp, tid, &fi);
691   target_type = get_tid_type (of, fi.ctc_return);
692   TYPE_TARGET_TYPE (type) = target_type;
693   set_type_align (type, ctf_type_align (fp, tid));
694 
695   return set_tid_type (of, tid, type);
696 }
697 
698 static void
699 process_enum_type (struct ctf_context *ccp, ctf_id_t tid)
700 {
701   struct type *type;
702   struct ctf_field_info fi;
703 
704   type = read_enum_type (ccp, tid);
705 
706   fi.cur_context = ccp;
707   fi.ptype = type;
708   if (ctf_enum_iter (ccp->fp, tid, ctf_add_enum_member_cb, &fi) == CTF_ERR)
709     complaint (_("ctf_enum_iter process_enum_type failed - %s"),
710 	       ctf_errmsg (ctf_errno (ccp->fp)));
711 
712   /* Attach fields to the type.  */
713   attach_fields_to_type (&fi, type);
714 
715   new_symbol (ccp, type, tid);
716 }
717 
718 /* Add given cv-qualifiers CNST+VOLTL to the BASE_TYPE of array TID.  */
719 
720 static struct type *
721 add_array_cv_type (struct ctf_context *ccp,
722 		   ctf_id_t tid,
723 		   struct type *base_type,
724 		   int cnst,
725 		   int voltl)
726 {
727   struct type *el_type, *inner_array;
728 
729   base_type = copy_type (base_type);
730   inner_array = base_type;
731 
732   while (TYPE_TARGET_TYPE (inner_array)->code () == TYPE_CODE_ARRAY)
733     {
734       TYPE_TARGET_TYPE (inner_array)
735 	= copy_type (TYPE_TARGET_TYPE (inner_array));
736       inner_array = TYPE_TARGET_TYPE (inner_array);
737     }
738 
739   el_type = TYPE_TARGET_TYPE (inner_array);
740   cnst |= TYPE_CONST (el_type);
741   voltl |= TYPE_VOLATILE (el_type);
742   TYPE_TARGET_TYPE (inner_array) = make_cv_type (cnst, voltl, el_type, NULL);
743 
744   return set_tid_type (ccp->of, tid, base_type);
745 }
746 
747 /* Read all information from a TID of CTF_K_ARRAY.  */
748 
749 static struct type *
750 read_array_type (struct ctf_context *ccp, ctf_id_t tid)
751 {
752   struct objfile *objfile = ccp->of;
753   ctf_file_t *fp = ccp->fp;
754   struct type *element_type, *range_type, *idx_type;
755   struct type *type;
756   ctf_arinfo_t ar;
757 
758   if (ctf_array_info (fp, tid, &ar) == CTF_ERR)
759     {
760       complaint (_("ctf_array_info read_array_type failed - %s"),
761 		 ctf_errmsg (ctf_errno (fp)));
762       return NULL;
763     }
764 
765   element_type = get_tid_type (objfile, ar.ctr_contents);
766   if (element_type == NULL)
767     return NULL;
768 
769   idx_type = get_tid_type (objfile, ar.ctr_index);
770   if (idx_type == NULL)
771     idx_type = objfile_type (objfile)->builtin_int;
772 
773   range_type = create_static_range_type (NULL, idx_type, 0, ar.ctr_nelems - 1);
774   type = create_array_type (NULL, element_type, range_type);
775   if (ar.ctr_nelems <= 1)	/* Check if undefined upper bound.  */
776     {
777       range_type->bounds ()->high.set_undefined ();
778       TYPE_LENGTH (type) = 0;
779       TYPE_TARGET_STUB (type) = 1;
780     }
781   else
782     TYPE_LENGTH (type) = ctf_type_size (fp, tid);
783 
784   set_type_align (type, ctf_type_align (fp, tid));
785 
786   return set_tid_type (objfile, tid, type);
787 }
788 
789 /* Read TID of kind CTF_K_CONST with base type BTID.  */
790 
791 static struct type *
792 read_const_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
793 {
794   struct objfile *objfile = ccp->of;
795   struct type *base_type, *cv_type;
796 
797   base_type = get_tid_type (objfile, btid);
798   if (base_type == NULL)
799     {
800       base_type = read_type_record (ccp, btid);
801       if (base_type == NULL)
802 	{
803 	  complaint (_("read_const_type: NULL base type (%ld)"), btid);
804 	  base_type = objfile_type (objfile)->builtin_error;
805 	}
806     }
807   cv_type = make_cv_type (1, TYPE_VOLATILE (base_type), base_type, 0);
808 
809   return set_tid_type (objfile, tid, cv_type);
810 }
811 
812 /* Read TID of kind CTF_K_VOLATILE with base type BTID.  */
813 
814 static struct type *
815 read_volatile_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
816 {
817   struct objfile *objfile = ccp->of;
818   ctf_file_t *fp = ccp->fp;
819   struct type *base_type, *cv_type;
820 
821   base_type = get_tid_type (objfile, btid);
822   if (base_type == NULL)
823     {
824       base_type = read_type_record (ccp, btid);
825       if (base_type == NULL)
826 	{
827 	  complaint (_("read_volatile_type: NULL base type (%ld)"), btid);
828 	  base_type = objfile_type (objfile)->builtin_error;
829 	}
830     }
831 
832   if (ctf_type_kind (fp, btid) == CTF_K_ARRAY)
833     return add_array_cv_type (ccp, tid, base_type, 0, 1);
834   cv_type = make_cv_type (TYPE_CONST (base_type), 1, base_type, 0);
835 
836   return set_tid_type (objfile, tid, cv_type);
837 }
838 
839 /* Read TID of kind CTF_K_RESTRICT with base type BTID.  */
840 
841 static struct type *
842 read_restrict_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
843 {
844   struct objfile *objfile = ccp->of;
845   struct type *base_type, *cv_type;
846 
847   base_type = get_tid_type (objfile, btid);
848   if (base_type == NULL)
849     {
850       base_type = read_type_record (ccp, btid);
851       if (base_type == NULL)
852 	{
853 	  complaint (_("read_restrict_type: NULL base type (%ld)"), btid);
854 	  base_type = objfile_type (objfile)->builtin_error;
855 	}
856     }
857   cv_type = make_restrict_type (base_type);
858 
859   return set_tid_type (objfile, tid, cv_type);
860 }
861 
862 /* Read TID of kind CTF_K_TYPEDEF with its NAME and base type BTID.  */
863 
864 static struct type *
865 read_typedef_type (struct ctf_context *ccp, ctf_id_t tid,
866 		   ctf_id_t btid, const char *name)
867 {
868   struct objfile *objfile = ccp->of;
869   struct type *this_type, *target_type;
870 
871   char *aname = obstack_strdup (&objfile->objfile_obstack, name);
872   this_type = init_type (objfile, TYPE_CODE_TYPEDEF, 0, aname);
873   set_tid_type (objfile, tid, this_type);
874   target_type = get_tid_type (objfile, btid);
875   if (target_type != this_type)
876     TYPE_TARGET_TYPE (this_type) = target_type;
877   else
878     TYPE_TARGET_TYPE (this_type) = NULL;
879   TYPE_TARGET_STUB (this_type) = TYPE_TARGET_TYPE (this_type) ? 1 : 0;
880 
881   return set_tid_type (objfile, tid, this_type);
882 }
883 
884 /* Read TID of kind CTF_K_POINTER with base type BTID.  */
885 
886 static struct type *
887 read_pointer_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
888 {
889   struct objfile *of = ccp->of;
890   struct type *target_type, *type;
891 
892   target_type = get_tid_type (of, btid);
893   if (target_type == NULL)
894     {
895       target_type = read_type_record (ccp, btid);
896       if (target_type == NULL)
897 	{
898 	  complaint (_("read_pointer_type: NULL target type (%ld)"), btid);
899 	  target_type = objfile_type (ccp->of)->builtin_error;
900 	}
901     }
902 
903   type = lookup_pointer_type (target_type);
904   set_type_align (type, ctf_type_align (ccp->fp, tid));
905 
906   return set_tid_type (of, tid, type);
907 }
908 
909 /* Read information associated with type TID.  */
910 
911 static struct type *
912 read_type_record (struct ctf_context *ccp, ctf_id_t tid)
913 {
914   ctf_file_t *fp = ccp->fp;
915   uint32_t kind;
916   struct type *type = NULL;
917   ctf_id_t btid;
918 
919   kind = ctf_type_kind (fp, tid);
920   switch (kind)
921     {
922       case CTF_K_STRUCT:
923       case CTF_K_UNION:
924 	type = read_structure_type (ccp, tid);
925 	break;
926       case CTF_K_ENUM:
927 	type = read_enum_type (ccp, tid);
928 	break;
929       case CTF_K_FUNCTION:
930 	type = read_func_kind_type (ccp, tid);
931 	break;
932       case CTF_K_CONST:
933 	btid = ctf_type_reference (fp, tid);
934 	type = read_const_type (ccp, tid, btid);
935 	break;
936       case CTF_K_TYPEDEF:
937 	{
938 	  gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
939 	  btid = ctf_type_reference (fp, tid);
940 	  type = read_typedef_type (ccp, tid, btid, name.get ());
941 	}
942 	break;
943       case CTF_K_VOLATILE:
944 	btid = ctf_type_reference (fp, tid);
945 	type = read_volatile_type (ccp, tid, btid);
946 	break;
947       case CTF_K_RESTRICT:
948 	btid = ctf_type_reference (fp, tid);
949 	type = read_restrict_type (ccp, tid, btid);
950 	break;
951       case CTF_K_POINTER:
952 	btid = ctf_type_reference (fp, tid);
953 	type = read_pointer_type (ccp, tid, btid);
954 	break;
955       case CTF_K_INTEGER:
956       case CTF_K_FLOAT:
957 	type = read_base_type (ccp, tid);
958 	break;
959       case CTF_K_ARRAY:
960 	type = read_array_type (ccp, tid);
961 	break;
962       case CTF_K_UNKNOWN:
963 	break;
964       default:
965 	break;
966     }
967 
968   return type;
969 }
970 
971 /* Callback to add type TID to the symbol table.  */
972 
973 static int
974 ctf_add_type_cb (ctf_id_t tid, void *arg)
975 {
976   struct ctf_context *ccp = (struct ctf_context *) arg;
977   struct type *type;
978   uint32_t kind;
979 
980   /* Check if tid's type has already been defined.  */
981   type = get_tid_type (ccp->of, tid);
982   if (type != NULL)
983     return 0;
984 
985   ctf_id_t btid = ctf_type_reference (ccp->fp, tid);
986   kind = ctf_type_kind (ccp->fp, tid);
987   switch (kind)
988     {
989       case CTF_K_STRUCT:
990       case CTF_K_UNION:
991 	process_structure_type (ccp, tid);
992 	break;
993       case CTF_K_ENUM:
994 	process_enum_type (ccp, tid);
995 	break;
996       case CTF_K_FUNCTION:
997 	type = read_func_kind_type (ccp, tid);
998 	new_symbol (ccp, type, tid);
999 	break;
1000       case CTF_K_INTEGER:
1001       case CTF_K_FLOAT:
1002 	process_base_type (ccp, tid);
1003 	break;
1004       case CTF_K_TYPEDEF:
1005 	new_symbol (ccp, read_type_record (ccp, tid), tid);
1006 	break;
1007       case CTF_K_CONST:
1008 	type = read_const_type (ccp, tid, btid);
1009 	new_symbol (ccp, type, tid);
1010 	break;
1011       case CTF_K_VOLATILE:
1012 	type = read_volatile_type (ccp, tid, btid);
1013 	new_symbol (ccp, type, tid);
1014 	break;
1015       case CTF_K_RESTRICT:
1016 	type = read_restrict_type (ccp, tid, btid);
1017 	new_symbol (ccp, type, tid);
1018 	break;
1019       case CTF_K_POINTER:
1020 	type = read_pointer_type (ccp, tid, btid);
1021 	new_symbol (ccp, type, tid);
1022 	break;
1023       case CTF_K_ARRAY:
1024 	type = read_array_type (ccp, tid);
1025 	new_symbol (ccp, type, tid);
1026 	break;
1027       case CTF_K_UNKNOWN:
1028 	break;
1029       default:
1030 	break;
1031     }
1032 
1033   return 0;
1034 }
1035 
1036 /* Callback to add variable NAME with TID to the symbol table.  */
1037 
1038 static int
1039 ctf_add_var_cb (const char *name, ctf_id_t id, void *arg)
1040 {
1041   struct ctf_context *ccp = (struct ctf_context *) arg;
1042   struct symbol *sym = NULL;
1043   struct type *type;
1044   uint32_t kind;
1045 
1046   type = get_tid_type (ccp->of, id);
1047 
1048   kind = ctf_type_kind (ccp->fp, id);
1049   switch (kind)
1050     {
1051       case CTF_K_FUNCTION:
1052 	if (name && !strcmp(name, "main"))
1053 	  set_objfile_main_name (ccp->of, name, language_c);
1054 	break;
1055       case CTF_K_INTEGER:
1056       case CTF_K_FLOAT:
1057       case CTF_K_VOLATILE:
1058       case CTF_K_RESTRICT:
1059       case CTF_K_TYPEDEF:
1060       case CTF_K_CONST:
1061       case CTF_K_POINTER:
1062       case CTF_K_ARRAY:
1063 	if (type)
1064 	  {
1065 	    sym = new_symbol (ccp, type, id);
1066 	    sym->compute_and_set_names (name, false, ccp->of->per_bfd);
1067 	  }
1068 	break;
1069       case CTF_K_STRUCT:
1070       case CTF_K_UNION:
1071       case CTF_K_ENUM:
1072 	if (type == NULL)
1073 	{
1074 	  complaint (_("ctf_add_var_cb: %s has NO type (%ld)"), name, id);
1075 	  type = objfile_type (ccp->of)->builtin_error;
1076 	}
1077 	sym = new (&ccp->of->objfile_obstack) symbol;
1078 	OBJSTAT (ccp->of, n_syms++);
1079 	SYMBOL_TYPE (sym) = type;
1080 	SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
1081 	SYMBOL_ACLASS_INDEX (sym) = LOC_OPTIMIZED_OUT;
1082 	sym->compute_and_set_names (name, false, ccp->of->per_bfd);
1083 	add_symbol_to_list (sym, ccp->builder->get_global_symbols ());
1084 	break;
1085       default:
1086 	complaint (_("ctf_add_var_cb: kind unsupported (%d)"), kind);
1087 	break;
1088     }
1089 
1090   if (sym)
1091     set_symbol_address (ccp->of, sym, name);
1092 
1093   return 0;
1094 }
1095 
1096 /* Add an ELF STT_OBJ symbol with index IDX to the symbol table.  */
1097 
1098 static struct symbol *
1099 add_stt_obj (struct ctf_context *ccp, unsigned long idx)
1100 {
1101   struct symbol *sym;
1102   struct type *type;
1103   ctf_id_t tid;
1104 
1105   if ((tid = ctf_lookup_by_symbol (ccp->fp, idx)) == CTF_ERR)
1106     return NULL;
1107 
1108   type = get_tid_type (ccp->of, tid);
1109   if (type == NULL)
1110     return NULL;
1111 
1112   sym = new_symbol (ccp, type, tid);
1113 
1114   return sym;
1115 }
1116 
1117 /* Add an ELF STT_FUNC symbol with index IDX to the symbol table.  */
1118 
1119 static struct symbol *
1120 add_stt_func (struct ctf_context *ccp, unsigned long idx)
1121 {
1122   struct type *ftype, *atyp, *rettyp;
1123   struct symbol *sym;
1124   ctf_funcinfo_t finfo;
1125   ctf_id_t argv[32];
1126   uint32_t argc;
1127   ctf_id_t tid;
1128   struct type *void_type = objfile_type (ccp->of)->builtin_void;
1129 
1130   if (ctf_func_info (ccp->fp, idx, &finfo) == CTF_ERR)
1131     return NULL;
1132 
1133   argc = finfo.ctc_argc;
1134   if (ctf_func_args (ccp->fp, idx, argc, argv) == CTF_ERR)
1135     return NULL;
1136 
1137   gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (ccp->fp, idx));
1138   if (name == NULL)
1139     return NULL;
1140 
1141   tid = ctf_lookup_by_symbol (ccp->fp, idx);
1142   ftype = get_tid_type (ccp->of, tid);
1143   if (finfo.ctc_flags & CTF_FUNC_VARARG)
1144     TYPE_VARARGS (ftype) = 1;
1145   ftype->set_num_fields (argc);
1146 
1147   /* If argc is 0, it has a "void" type.  */
1148   if (argc != 0)
1149     ftype->set_fields
1150       ((struct field *) TYPE_ZALLOC (ftype, argc * sizeof (struct field)));
1151 
1152   /* TYPE_FIELD_TYPE must never be NULL.  Fill it with void_type, if failed
1153      to find the argument type.  */
1154   for (int iparam = 0; iparam < argc; iparam++)
1155     {
1156       atyp = get_tid_type (ccp->of, argv[iparam]);
1157       if (atyp)
1158 	ftype->field (iparam).set_type (atyp);
1159       else
1160 	ftype->field (iparam).set_type (void_type);
1161     }
1162 
1163   sym = new_symbol (ccp, ftype, tid);
1164   rettyp = get_tid_type (ccp->of, finfo.ctc_return);
1165   if (rettyp != NULL)
1166     SYMBOL_TYPE (sym) = rettyp;
1167   else
1168     SYMBOL_TYPE (sym) = void_type;
1169 
1170   return sym;
1171 }
1172 
1173 /* Get text segment base for OBJFILE, TSIZE contains the segment size.  */
1174 
1175 static CORE_ADDR
1176 get_objfile_text_range (struct objfile *of, int *tsize)
1177 {
1178   bfd *abfd = of->obfd;
1179   const asection *codes;
1180 
1181   codes = bfd_get_section_by_name (abfd, ".text");
1182   *tsize = codes ? bfd_section_size (codes) : 0;
1183   return of->text_section_offset ();
1184 }
1185 
1186 /* Start a symtab for OBJFILE in CTF format.  */
1187 
1188 static void
1189 ctf_start_symtab (ctf_psymtab *pst,
1190 		  struct objfile *of, CORE_ADDR text_offset)
1191 {
1192   struct ctf_context *ccp;
1193 
1194   ccp = pst->context;
1195   ccp->builder = new buildsym_compunit
1196 		       (of, of->original_name, NULL,
1197 		       language_c, text_offset);
1198   ccp->builder->record_debugformat ("ctf");
1199 }
1200 
1201 /* Finish reading symbol/type definitions in CTF format.
1202    END_ADDR is the end address of the file's text.  SECTION is
1203    the .text section number.  */
1204 
1205 static struct compunit_symtab *
1206 ctf_end_symtab (ctf_psymtab *pst,
1207 		CORE_ADDR end_addr, int section)
1208 {
1209   struct ctf_context *ccp;
1210 
1211   ccp = pst->context;
1212   struct compunit_symtab *result
1213     = ccp->builder->end_symtab (end_addr, section);
1214   delete ccp->builder;
1215   ccp->builder = NULL;
1216   return result;
1217 }
1218 
1219 /* Read in full symbols for PST, and anything it depends on.  */
1220 
1221 void
1222 ctf_psymtab::expand_psymtab (struct objfile *objfile)
1223 {
1224   struct symbol *sym;
1225   struct ctf_context *ccp;
1226 
1227   gdb_assert (!readin);
1228 
1229   ccp = context;
1230 
1231   /* Iterate over entries in data types section.  */
1232   if (ctf_type_iter (ccp->fp, ctf_add_type_cb, ccp) == CTF_ERR)
1233     complaint (_("ctf_type_iter psymtab_to_symtab failed - %s"),
1234 	       ctf_errmsg (ctf_errno (ccp->fp)));
1235 
1236 
1237   /* Iterate over entries in variable info section.  */
1238   if (ctf_variable_iter (ccp->fp, ctf_add_var_cb, ccp) == CTF_ERR)
1239     complaint (_("ctf_variable_iter psymtab_to_symtab failed - %s"),
1240 	       ctf_errmsg (ctf_errno (ccp->fp)));
1241 
1242   /* Add entries in data objects and function info sections.  */
1243   for (unsigned long i = 0; ; i++)
1244     {
1245       sym = add_stt_obj (ccp, i);
1246       if (sym == NULL)
1247 	{
1248 	  if (ctf_errno (ccp->fp) == EINVAL
1249 	      || ctf_errno (ccp->fp) == ECTF_NOSYMTAB)
1250 	    break;
1251 	  sym = add_stt_func (ccp, i);
1252 	}
1253       if (sym == NULL)
1254 	continue;
1255 
1256       set_symbol_address (ccp->of, sym, sym->linkage_name ());
1257     }
1258 
1259   readin = true;
1260 }
1261 
1262 /* Expand partial symbol table PST into a full symbol table.
1263    PST is not NULL.  */
1264 
1265 void
1266 ctf_psymtab::read_symtab (struct objfile *objfile)
1267 {
1268   if (readin)
1269     warning (_("bug: psymtab for %s is already read in."), filename);
1270   else
1271     {
1272       if (info_verbose)
1273 	{
1274 	  printf_filtered (_("Reading in CTF data for %s..."), filename);
1275 	  gdb_flush (gdb_stdout);
1276 	}
1277 
1278       /* Start a symtab.  */
1279       CORE_ADDR offset;        /* Start of text segment.  */
1280       int tsize;
1281 
1282       offset = get_objfile_text_range (objfile, &tsize);
1283       ctf_start_symtab (this, objfile, offset);
1284       expand_psymtab (objfile);
1285 
1286       set_text_low (offset);
1287       set_text_high (offset + tsize);
1288       compunit_symtab = ctf_end_symtab (this, offset + tsize,
1289 					SECT_OFF_TEXT (objfile));
1290 
1291       /* Finish up the debug error message.  */
1292       if (info_verbose)
1293 	printf_filtered (_("done.\n"));
1294     }
1295 }
1296 
1297 /* Allocate a new partial_symtab NAME.
1298 
1299    Each source file that has not been fully read in is represented by
1300    a partial_symtab.  This contains the information on where in the
1301    executable the debugging symbols for a specific file are, and a
1302    list of names of global symbols which are located in this file.
1303    They are all chained on partial symtab lists.
1304 
1305    Even after the source file has been read into a symtab, the
1306    partial_symtab remains around.  They are allocated on an obstack,
1307    objfile_obstack.  */
1308 
1309 static ctf_psymtab *
1310 create_partial_symtab (const char *name,
1311 		       ctf_file_t *cfp,
1312 		       struct objfile *objfile)
1313 {
1314   ctf_psymtab *pst;
1315   struct ctf_context *ccx;
1316 
1317   pst = new ctf_psymtab (name, objfile, 0);
1318 
1319   ccx = XOBNEW (&objfile->objfile_obstack, struct ctf_context);
1320   ccx->fp = cfp;
1321   ccx->of = objfile;
1322   pst->context = ccx;
1323 
1324   return pst;
1325 }
1326 
1327 /* Callback to add type TID to partial symbol table.  */
1328 
1329 static int
1330 ctf_psymtab_type_cb (ctf_id_t tid, void *arg)
1331 {
1332   struct ctf_context *ccp;
1333   uint32_t kind;
1334   short section = -1;
1335 
1336   ccp = (struct ctf_context *) arg;
1337   gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (ccp->fp, tid));
1338   if (name == NULL || strlen (name.get ()) == 0)
1339     return 0;
1340 
1341   domain_enum domain = UNDEF_DOMAIN;
1342   enum address_class aclass = LOC_UNDEF;
1343   kind = ctf_type_kind (ccp->fp, tid);
1344   switch (kind)
1345     {
1346       case CTF_K_STRUCT:
1347       case CTF_K_UNION:
1348       case CTF_K_ENUM:
1349 	domain = STRUCT_DOMAIN;
1350 	aclass = LOC_TYPEDEF;
1351 	break;
1352       case CTF_K_FUNCTION:
1353       case CTF_K_FORWARD:
1354 	domain = VAR_DOMAIN;
1355 	aclass = LOC_STATIC;
1356 	section = SECT_OFF_TEXT (ccp->of);
1357 	break;
1358       case CTF_K_CONST:
1359 	domain = VAR_DOMAIN;
1360 	aclass = LOC_STATIC;
1361 	break;
1362       case CTF_K_TYPEDEF:
1363       case CTF_K_POINTER:
1364       case CTF_K_VOLATILE:
1365       case CTF_K_RESTRICT:
1366 	domain = VAR_DOMAIN;
1367 	aclass = LOC_TYPEDEF;
1368 	break;
1369       case CTF_K_INTEGER:
1370       case CTF_K_FLOAT:
1371 	domain = VAR_DOMAIN;
1372 	aclass = LOC_TYPEDEF;
1373 	break;
1374       case CTF_K_ARRAY:
1375       case CTF_K_UNKNOWN:
1376 	return 0;
1377     }
1378 
1379     add_psymbol_to_list (name.get (), true,
1380 			 domain, aclass, section,
1381 			 psymbol_placement::GLOBAL,
1382 			 0, language_c, ccp->of);
1383 
1384   return 0;
1385 }
1386 
1387 /* Callback to add variable NAME with ID to partial symbol table.  */
1388 
1389 static int
1390 ctf_psymtab_var_cb (const char *name, ctf_id_t id, void *arg)
1391 {
1392   struct ctf_context *ccp = (struct ctf_context *) arg;
1393 
1394   add_psymbol_to_list (name, true,
1395 		       VAR_DOMAIN, LOC_STATIC, -1,
1396 		       psymbol_placement::GLOBAL,
1397 		       0, language_c, ccp->of);
1398   return 0;
1399 }
1400 
1401 /* Setup partial_symtab's describing each source file for which
1402    debugging information is available.  */
1403 
1404 static void
1405 scan_partial_symbols (ctf_file_t *cfp, struct objfile *of)
1406 {
1407   struct ctf_context ccx;
1408   bfd *abfd = of->obfd;
1409   const char *name = bfd_get_filename (abfd);
1410   ctf_psymtab *pst = create_partial_symtab (name, cfp, of);
1411 
1412   ccx.fp = cfp;
1413   ccx.of = of;
1414 
1415   if (ctf_type_iter (cfp, ctf_psymtab_type_cb, &ccx) == CTF_ERR)
1416     complaint (_("ctf_type_iter scan_partial_symbols failed - %s"),
1417 	       ctf_errmsg (ctf_errno (cfp)));
1418 
1419   if (ctf_variable_iter (cfp, ctf_psymtab_var_cb, &ccx) == CTF_ERR)
1420     complaint (_("ctf_variable_iter scan_partial_symbols failed - %s"),
1421 	       ctf_errmsg (ctf_errno (cfp)));
1422 
1423   /* Scan CTF object and function sections which correspond to each
1424      STT_FUNC or STT_OBJECT entry in the symbol table,
1425      pick up what init_symtab has done.  */
1426   for (unsigned long idx = 0; ; idx++)
1427     {
1428       ctf_id_t tid;
1429       if ((tid = ctf_lookup_by_symbol (cfp, idx)) == CTF_ERR)
1430 	{
1431 	if (ctf_errno (cfp) == EINVAL || ctf_errno (cfp) == ECTF_NOSYMTAB)
1432 	  break;	// Done, reach end of the section.
1433 	else
1434 	  continue;
1435 	}
1436       gdb::unique_xmalloc_ptr<char> tname (ctf_type_aname_raw (cfp, tid));
1437       uint32_t kind = ctf_type_kind (cfp, tid);
1438       address_class aclass;
1439       domain_enum tdomain;
1440       switch (kind)
1441 	{
1442 	  case CTF_K_STRUCT:
1443 	  case CTF_K_UNION:
1444 	  case CTF_K_ENUM:
1445 	    tdomain = STRUCT_DOMAIN;
1446 	    break;
1447 	  default:
1448 	    tdomain = VAR_DOMAIN;
1449 	    break;
1450 	}
1451 
1452       if (kind == CTF_K_FUNCTION)
1453 	aclass = LOC_STATIC;
1454       else if (kind == CTF_K_CONST)
1455 	aclass = LOC_CONST;
1456       else
1457 	aclass = LOC_TYPEDEF;
1458 
1459       add_psymbol_to_list (tname.get (), true,
1460 			   tdomain, aclass, -1,
1461 			   psymbol_placement::STATIC,
1462 			   0, language_c, of);
1463     }
1464 
1465   end_psymtab_common (of, pst);
1466 }
1467 
1468 /* Read CTF debugging information from a BFD section.  This is
1469    called from elfread.c.  It does a quick pass through the
1470    .ctf section to set up the partial symbol table.  */
1471 
1472 void
1473 elfctf_build_psymtabs (struct objfile *of)
1474 {
1475   bfd *abfd = of->obfd;
1476   int err;
1477 
1478   ctf_archive_t *arc = ctf_bfdopen (abfd, &err);
1479   if (arc == NULL)
1480     error (_("ctf_bfdopen failed on %s - %s"),
1481 	   bfd_get_filename (abfd), ctf_errmsg (err));
1482 
1483   ctf_file_t *fp = ctf_arc_open_by_name (arc, NULL, &err);
1484   if (fp == NULL)
1485     error (_("ctf_arc_open_by_name failed on %s - %s"),
1486 	   bfd_get_filename (abfd), ctf_errmsg (err));
1487   ctf_file_key.emplace (of, fp);
1488 
1489   scan_partial_symbols (fp, of);
1490 }
1491 
1492 #else
1493 
1494 void
1495 elfctf_build_psymtabs (struct objfile *of)
1496 {
1497   /* Nothing to do if CTF is disabled.  */
1498 }
1499 
1500 #endif /* ENABLE_LIBCTF */
1501