]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/ctfread.c
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / gdb / ctfread.c
CommitLineData
30d1f018
WP
1/* Compact ANSI-C Type Format (CTF) support in GDB.
2
213516ef 3 Copyright (C) 2019-2023 Free Software Foundation, Inc.
30d1f018
WP
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
09f2921c 48 CTF data, a reference to that data also appears in the header. This
30d1f018
WP
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"
1776e3e5
NA
84
85#if ENABLE_LIBCTF
86
30d1f018
WP
87#include "ctf.h"
88#include "ctf-api.h"
89
08b8a139 90static const registry<objfile>::key<htab, htab_deleter> ctf_tid_key;
1c7148dd
WP
91
92struct ctf_fp_info
93{
139633c3 94 explicit ctf_fp_info (ctf_dict_t *cfp) : fp (cfp) {}
168f8c6b 95 ~ctf_fp_info ();
139633c3 96 ctf_dict_t *fp;
1c7148dd
WP
97};
98
139633c3 99/* Cleanup function for the ctf_dict_key data. */
1c7148dd
WP
100ctf_fp_info::~ctf_fp_info ()
101{
844be3f2 102 if (fp == nullptr)
1c7148dd
WP
103 return;
104
105 ctf_archive_t *arc = ctf_get_arc (fp);
139633c3 106 ctf_dict_close (fp);
1c7148dd
WP
107 ctf_close (arc);
108}
109
08b8a139 110static const registry<objfile>::key<ctf_fp_info> ctf_dict_key;
30d1f018
WP
111
112/* A CTF context consists of a file pointer and an objfile pointer. */
113
1c7148dd 114struct ctf_context
30d1f018 115{
139633c3 116 ctf_dict_t *fp;
30d1f018 117 struct objfile *of;
7b249e47 118 psymtab_storage *partial_symtabs;
932539d7 119 partial_symtab *pst;
ffb3f587 120 ctf_archive_t *arc;
30d1f018 121 struct buildsym_compunit *builder;
1c7148dd 122};
30d1f018 123
891813be 124/* A partial symtab, specialized for this module. */
128a391f 125struct ctf_psymtab : public standard_psymtab
891813be 126{
7b249e47
TT
127 ctf_psymtab (const char *filename,
128 psymtab_storage *partial_symtabs,
0072c873 129 objfile_per_bfd_storage *objfile_per_bfd,
7b249e47 130 CORE_ADDR addr)
0072c873 131 : standard_psymtab (filename, partial_symtabs, objfile_per_bfd, addr)
891813be
TT
132 {
133 }
134
135 void read_symtab (struct objfile *) override;
8566b89b 136 void expand_psymtab (struct objfile *) override;
891813be 137
ffb3f587 138 struct ctf_context context;
891813be
TT
139};
140
30d1f018
WP
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
b2caee6a 143 ctf_field_info structure. It is derived from dwarf2read.c. */
30d1f018 144
b2caee6a 145struct ctf_nextfield
30d1f018
WP
146{
147 struct field field {};
148};
149
b2caee6a 150struct ctf_field_info
30d1f018
WP
151{
152 /* List of data member fields. */
b2caee6a 153 std::vector<struct ctf_nextfield> fields;
30d1f018
WP
154
155 /* Context. */
1c7148dd 156 struct ctf_context *cur_context;
30d1f018
WP
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
ffb3f587
WP
170/* Data held for a translation unit. */
171
172struct 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};
30d1f018
WP
180
181/* Local function prototypes */
182
30d1f018
WP
183static int ctf_add_type_cb (ctf_id_t tid, void *arg);
184
1c7148dd 185static struct type *read_array_type (struct ctf_context *cp, ctf_id_t tid);
30d1f018 186
1c7148dd 187static struct type *read_pointer_type (struct ctf_context *cp, ctf_id_t tid,
30d1f018
WP
188 ctf_id_t btid);
189
1c7148dd 190static struct type *read_structure_type (struct ctf_context *cp, ctf_id_t tid);
30d1f018 191
1c7148dd 192static struct type *read_enum_type (struct ctf_context *cp, ctf_id_t tid);
30d1f018 193
1c7148dd 194static struct type *read_typedef_type (struct ctf_context *cp, ctf_id_t tid,
30d1f018
WP
195 ctf_id_t btid, const char *name);
196
1c7148dd 197static struct type *read_type_record (struct ctf_context *cp, ctf_id_t tid);
30d1f018 198
1c7148dd 199static void process_structure_type (struct ctf_context *cp, ctf_id_t tid);
30d1f018 200
1c7148dd 201static void process_struct_members (struct ctf_context *cp, ctf_id_t tid,
30d1f018
WP
202 struct type *type);
203
dc2b480f
WP
204static struct type *read_forward_type (struct ctf_context *cp, ctf_id_t tid);
205
1c7148dd 206static struct symbol *new_symbol (struct ctf_context *cp, struct type *type,
30d1f018
WP
207 ctf_id_t tid);
208
209struct 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
217static hashval_t
218tid_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
228static int
229tid_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
241static struct type *
242set_tid_type (struct objfile *of, ctf_id_t tid, struct type *typ)
243{
244 htab_t htab;
245
08b8a139 246 htab = ctf_tid_key.get (of);
30d1f018
WP
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);
ffb3f587
WP
259 if (*slot == nullptr)
260 *slot = XOBNEW (&of->objfile_obstack, struct ctf_tid_and_type);
30d1f018
WP
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
268static struct type *
269get_tid_type (struct objfile *of, ctf_id_t tid)
270{
271 struct ctf_tid_and_type *slot, ids;
272 htab_t htab;
273
08b8a139 274 htab = ctf_tid_key.get (of);
30d1f018 275 if (htab == NULL)
844be3f2 276 return nullptr;
30d1f018
WP
277
278 ids.tid = tid;
844be3f2 279 ids.type = nullptr;
30d1f018
WP
280 slot = (struct ctf_tid_and_type *) htab_find (htab, &ids);
281 if (slot)
282 return slot->type;
283 else
844be3f2 284 return nullptr;
30d1f018
WP
285}
286
dc2b480f
WP
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
290static struct type *
291fetch_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
30d1f018
WP
306/* Return the size of storage in bits for INTEGER, FLOAT, or ENUM. */
307
308static int
139633c3 309get_bitsize (ctf_dict_t *fp, ctf_id_t tid, uint32_t kind)
30d1f018
WP
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
324static void
325set_symbol_address (struct objfile *of, struct symbol *sym, const char *name)
326{
327 struct bound_minimal_symbol msym;
328
844be3f2 329 msym = lookup_minimal_symbol (name, nullptr, of);
30d1f018
WP
330 if (msym.minsym != NULL)
331 {
4aeddc50 332 sym->set_value_address (msym.value_address ());
ba44b1a3 333 sym->set_aclass_index (LOC_STATIC);
a52d653e 334 sym->set_section_index (msym.minsym->section_index ());
30d1f018
WP
335 }
336}
337
338/* Create the vector of fields, and attach it to TYPE. */
339
340static void
b2caee6a 341attach_fields_to_type (struct ctf_field_info *fip, struct type *type)
30d1f018
WP
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. */
5e33d5f4 349 type->set_num_fields (nfields);
3cabb6b0
SM
350 type->set_fields
351 ((struct field *) TYPE_ZALLOC (type, sizeof (struct field) * nfields));
30d1f018
WP
352
353 /* Copy the saved-up fields into the field vector. */
354 for (int i = 0; i < nfields; ++i)
355 {
b2caee6a 356 struct ctf_nextfield &field = fip->fields[i];
ceacbf6e 357 type->field (i) = field.field;
30d1f018
WP
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
365static struct type *
366ctf_init_float_type (struct objfile *objfile,
367 int bits,
368 const char *name,
369 const char *name_hint)
370{
08feed99 371 struct gdbarch *gdbarch = objfile->arch ();
30d1f018
WP
372 const struct floatformat **format;
373 struct type *type;
374
375 format = gdbarch_floatformat_for_type (gdbarch, name_hint, bits);
844be3f2 376 if (format != nullptr)
30d1f018
WP
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,
b2caee6a 386 and ARG contains the ctf_field_info. */
30d1f018
WP
387
388static int
389ctf_add_member_cb (const char *name,
390 ctf_id_t tid,
391 unsigned long offset,
392 void *arg)
393{
b2caee6a 394 struct ctf_field_info *fip = (struct ctf_field_info *) arg;
1c7148dd 395 struct ctf_context *ccp = fip->cur_context;
b2caee6a 396 struct ctf_nextfield new_field;
30d1f018
WP
397 struct field *fp;
398 struct type *t;
399 uint32_t kind;
400
401 fp = &new_field.field;
d3fd12df 402 fp->set_name (name);
30d1f018
WP
403
404 kind = ctf_type_kind (ccp->fp, tid);
dc2b480f 405 t = fetch_tid_type (ccp, tid);
844be3f2 406 if (t == nullptr)
30d1f018
WP
407 {
408 t = read_type_record (ccp, tid);
844be3f2 409 if (t == nullptr)
30d1f018
WP
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
5d14b6e5 420 fp->set_type (t);
cd3f655c 421 fp->set_loc_bitpos (offset / TARGET_CHAR_BIT);
30d1f018
WP
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.
b2caee6a 430 ARG contains the ctf_field_info. */
30d1f018
WP
431
432static int
433ctf_add_enum_member_cb (const char *name, int enum_value, void *arg)
434{
b2caee6a
AB
435 struct ctf_field_info *fip = (struct ctf_field_info *) arg;
436 struct ctf_nextfield new_field;
30d1f018 437 struct field *fp;
1c7148dd 438 struct ctf_context *ccp = fip->cur_context;
30d1f018
WP
439
440 fp = &new_field.field;
d3fd12df 441 fp->set_name (name);
844be3f2 442 fp->set_type (nullptr);
cd3f655c 443 fp->set_loc_enumval (enum_value);
30d1f018
WP
444 FIELD_BITSIZE (*fp) = 0;
445
844be3f2 446 if (name != nullptr)
30d1f018 447 {
8c14c3a3 448 struct symbol *sym = new (&ccp->of->objfile_obstack) symbol;
30d1f018
WP
449 OBJSTAT (ccp->of, n_syms++);
450
d3ecddab 451 sym->set_language (language_c, &ccp->of->objfile_obstack);
4d4eaa30 452 sym->compute_and_set_names (name, false, ccp->of->per_bfd);
ba44b1a3 453 sym->set_aclass_index (LOC_CONST);
6c9c307c 454 sym->set_domain (VAR_DOMAIN);
5f9c5a63 455 sym->set_type (fip->ptype);
30d1f018
WP
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
467static struct symbol *
1c7148dd 468new_symbol (struct ctf_context *ccp, struct type *type, ctf_id_t tid)
30d1f018
WP
469{
470 struct objfile *objfile = ccp->of;
139633c3 471 ctf_dict_t *fp = ccp->fp;
844be3f2 472 struct symbol *sym = nullptr;
30d1f018 473
ea11a98d 474 const char *name = ctf_type_name_raw (fp, tid);
844be3f2 475 if (name != nullptr)
30d1f018 476 {
8c14c3a3 477 sym = new (&objfile->objfile_obstack) symbol;
30d1f018
WP
478 OBJSTAT (objfile, n_syms++);
479
d3ecddab 480 sym->set_language (language_c, &objfile->objfile_obstack);
ea11a98d 481 sym->compute_and_set_names (name, false, objfile->per_bfd);
6c9c307c 482 sym->set_domain (VAR_DOMAIN);
ba44b1a3 483 sym->set_aclass_index (LOC_OPTIMIZED_OUT);
30d1f018 484
844be3f2 485 if (type != nullptr)
5f9c5a63 486 sym->set_type (type);
30d1f018
WP
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:
ba44b1a3 494 sym->set_aclass_index (LOC_TYPEDEF);
6c9c307c 495 sym->set_domain (STRUCT_DOMAIN);
30d1f018
WP
496 break;
497 case CTF_K_FUNCTION:
ba44b1a3 498 sym->set_aclass_index (LOC_STATIC);
ea11a98d 499 set_symbol_address (objfile, sym, sym->linkage_name ());
30d1f018
WP
500 break;
501 case CTF_K_CONST:
5f9c5a63
SM
502 if (sym->type ()->code () == TYPE_CODE_VOID)
503 sym->set_type (objfile_type (objfile)->builtin_int);
30d1f018
WP
504 break;
505 case CTF_K_TYPEDEF:
506 case CTF_K_INTEGER:
507 case CTF_K_FLOAT:
ba44b1a3 508 sym->set_aclass_index (LOC_TYPEDEF);
6c9c307c 509 sym->set_domain (VAR_DOMAIN);
30d1f018
WP
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
ffb3f587 522 add_symbol_to_list (sym, ccp->builder->get_file_symbols ());
30d1f018
WP
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
531static struct type *
1c7148dd 532read_base_type (struct ctf_context *ccp, ctf_id_t tid)
30d1f018
WP
533{
534 struct objfile *of = ccp->of;
139633c3 535 ctf_dict_t *fp = ccp->fp;
30d1f018 536 ctf_encoding_t cet;
844be3f2 537 struct type *type = nullptr;
ea11a98d 538 const char *name;
30d1f018
WP
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)));
844be3f2 545 return nullptr;
30d1f018
WP
546 }
547
ea11a98d
WP
548 name = ctf_type_name_raw (fp, tid);
549 if (name == nullptr || strlen (name) == 0)
30d1f018
WP
550 {
551 name = ctf_type_aname (fp, tid);
844be3f2 552 if (name == nullptr)
30d1f018
WP
553 complaint (_("ctf_type_aname read_base_type failed - %s"),
554 ctf_errmsg (ctf_errno (fp)));
555 }
30d1f018
WP
556
557 kind = ctf_type_kind (fp, tid);
558 if (kind == CTF_K_INTEGER)
559 {
560 uint32_t issigned, ischar, isbool;
08feed99 561 struct gdbarch *gdbarch = of->arch ();
30d1f018
WP
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);
5b930b45 593 type = init_complex_type (name, t);
30d1f018
WP
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
844be3f2 602 if (name != nullptr && strcmp (name, "char") == 0)
15152a54 603 type->set_has_no_signedness (true);
30d1f018
WP
604
605 return set_tid_type (of, tid, type);
606}
607
608static void
1c7148dd 609process_base_type (struct ctf_context *ccp, ctf_id_t tid)
30d1f018
WP
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
624static struct type *
1c7148dd 625read_structure_type (struct ctf_context *ccp, ctf_id_t tid)
30d1f018
WP
626{
627 struct objfile *of = ccp->of;
139633c3 628 ctf_dict_t *fp = ccp->fp;
30d1f018
WP
629 struct type *type;
630 uint32_t kind;
631
632 type = alloc_type (of);
633
ea11a98d
WP
634 const char *name = ctf_type_name_raw (fp, tid);
635 if (name != nullptr && strlen (name) != 0)
636 type->set_name (name);
30d1f018
WP
637
638 kind = ctf_type_kind (fp, tid);
639 if (kind == CTF_K_UNION)
67607e24 640 type->set_code (TYPE_CODE_UNION);
30d1f018 641 else
67607e24 642 type->set_code (TYPE_CODE_STRUCT);
30d1f018 643
b6cdbc9a 644 type->set_length (ctf_type_size (fp, tid));
30d1f018
WP
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
653static void
1c7148dd 654process_struct_members (struct ctf_context *ccp,
30d1f018
WP
655 ctf_id_t tid,
656 struct type *type)
657{
b2caee6a 658 struct ctf_field_info fi;
30d1f018
WP
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
671static void
1c7148dd 672process_structure_type (struct ctf_context *ccp, ctf_id_t tid)
30d1f018
WP
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
682static struct type *
1c7148dd 683read_func_kind_type (struct ctf_context *ccp, ctf_id_t tid)
30d1f018
WP
684{
685 struct objfile *of = ccp->of;
139633c3 686 ctf_dict_t *fp = ccp->fp;
844be3f2 687 struct type *type, *rettype, *atype;
30d1f018 688 ctf_funcinfo_t cfi;
844be3f2 689 uint32_t argc;
30d1f018
WP
690
691 type = alloc_type (of);
692
67607e24 693 type->set_code (TYPE_CODE_FUNC);
b3a01ce2
WP
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 }
dc2b480f 700 rettype = fetch_tid_type (ccp, cfi.ctc_return);
8a50fdce 701 type->set_target_type (rettype);
30d1f018
WP
702 set_type_align (type, ctf_type_align (fp, tid));
703
844be3f2
WP
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 {
ffb3f587 722 atype = fetch_tid_type (ccp, argv[iparam]);
844be3f2
WP
723 if (atype != nullptr)
724 type->field (iparam).set_type (atype);
725 else
726 type->field (iparam).set_type (void_type);
727 }
728 }
729
30d1f018
WP
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
736static struct type *
1c7148dd 737read_enum_type (struct ctf_context *ccp, ctf_id_t tid)
30d1f018
WP
738{
739 struct objfile *of = ccp->of;
139633c3 740 ctf_dict_t *fp = ccp->fp;
b3a01ce2 741 struct type *type;
30d1f018
WP
742
743 type = alloc_type (of);
744
ea11a98d
WP
745 const char *name = ctf_type_name_raw (fp, tid);
746 if (name != nullptr && strlen (name) != 0)
747 type->set_name (name);
30d1f018 748
67607e24 749 type->set_code (TYPE_CODE_ENUM);
b6cdbc9a 750 type->set_length (ctf_type_size (fp, tid));
b3a01ce2 751 /* Set the underlying type based on its ctf_type_size bits. */
df86565b 752 type->set_target_type (objfile_int_type (of, type->length (), false));
30d1f018
WP
753 set_type_align (type, ctf_type_align (fp, tid));
754
755 return set_tid_type (of, tid, type);
756}
757
758static void
1c7148dd 759process_enum_type (struct ctf_context *ccp, ctf_id_t tid)
30d1f018
WP
760{
761 struct type *type;
b2caee6a 762 struct ctf_field_info fi;
30d1f018
WP
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
780static struct type *
1c7148dd 781add_array_cv_type (struct ctf_context *ccp,
30d1f018
WP
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
27710edb 792 while (inner_array->target_type ()->code () == TYPE_CODE_ARRAY)
30d1f018 793 {
27710edb
SM
794 inner_array->set_target_type (copy_type (inner_array->target_type ()));
795 inner_array = inner_array->target_type ();
30d1f018
WP
796 }
797
27710edb 798 el_type = inner_array->target_type ();
30d1f018
WP
799 cnst |= TYPE_CONST (el_type);
800 voltl |= TYPE_VOLATILE (el_type);
8a50fdce 801 inner_array->set_target_type (make_cv_type (cnst, voltl, el_type, nullptr));
30d1f018
WP
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
808static struct type *
1c7148dd 809read_array_type (struct ctf_context *ccp, ctf_id_t tid)
30d1f018
WP
810{
811 struct objfile *objfile = ccp->of;
139633c3 812 ctf_dict_t *fp = ccp->fp;
30d1f018
WP
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)));
844be3f2 821 return nullptr;
30d1f018
WP
822 }
823
dc2b480f 824 element_type = fetch_tid_type (ccp, ar.ctr_contents);
844be3f2
WP
825 if (element_type == nullptr)
826 return nullptr;
30d1f018 827
dc2b480f 828 idx_type = fetch_tid_type (ccp, ar.ctr_index);
844be3f2 829 if (idx_type == nullptr)
30d1f018
WP
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 {
8c2e4e06 836 range_type->bounds ()->high.set_undefined ();
b6cdbc9a 837 type->set_length (0);
8f53807e 838 type->set_target_is_stub (true);
30d1f018
WP
839 }
840 else
b6cdbc9a 841 type->set_length (ctf_type_size (fp, tid));
30d1f018
WP
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
850static struct type *
1c7148dd 851read_const_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
30d1f018
WP
852{
853 struct objfile *objfile = ccp->of;
854 struct type *base_type, *cv_type;
855
dc2b480f 856 base_type = fetch_tid_type (ccp, btid);
844be3f2 857 if (base_type == nullptr)
30d1f018
WP
858 {
859 base_type = read_type_record (ccp, btid);
844be3f2 860 if (base_type == nullptr)
30d1f018
WP
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
873static struct type *
1c7148dd 874read_volatile_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
30d1f018
WP
875{
876 struct objfile *objfile = ccp->of;
139633c3 877 ctf_dict_t *fp = ccp->fp;
30d1f018
WP
878 struct type *base_type, *cv_type;
879
dc2b480f 880 base_type = fetch_tid_type (ccp, btid);
844be3f2 881 if (base_type == nullptr)
30d1f018
WP
882 {
883 base_type = read_type_record (ccp, btid);
844be3f2 884 if (base_type == nullptr)
30d1f018
WP
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
900static struct type *
1c7148dd 901read_restrict_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
30d1f018
WP
902{
903 struct objfile *objfile = ccp->of;
904 struct type *base_type, *cv_type;
905
dc2b480f 906 base_type = fetch_tid_type (ccp, btid);
844be3f2 907 if (base_type == nullptr)
30d1f018
WP
908 {
909 base_type = read_type_record (ccp, btid);
844be3f2 910 if (base_type == nullptr)
30d1f018
WP
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
923static struct type *
1c7148dd 924read_typedef_type (struct ctf_context *ccp, ctf_id_t tid,
30d1f018
WP
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);
dc2b480f 933 target_type = fetch_tid_type (ccp, btid);
30d1f018 934 if (target_type != this_type)
8a50fdce 935 this_type->set_target_type (target_type);
30d1f018 936 else
8a50fdce 937 this_type->set_target_type (nullptr);
8f53807e 938
27710edb 939 this_type->set_target_is_stub (this_type->target_type () != nullptr);
30d1f018
WP
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
946static struct type *
1c7148dd 947read_pointer_type (struct ctf_context *ccp, ctf_id_t tid, ctf_id_t btid)
30d1f018
WP
948{
949 struct objfile *of = ccp->of;
950 struct type *target_type, *type;
951
dc2b480f 952 target_type = fetch_tid_type (ccp, btid);
844be3f2 953 if (target_type == nullptr)
30d1f018
WP
954 {
955 target_type = read_type_record (ccp, btid);
844be3f2 956 if (target_type == nullptr)
30d1f018
WP
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
dc2b480f
WP
969/* Read information from a TID of CTF_K_FORWARD. */
970
971static struct type *
972read_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
ea11a98d
WP
981 const char *name = ctf_type_name_raw (fp, tid);
982 if (name != nullptr && strlen (name) != 0)
983 type->set_name (name);
dc2b480f
WP
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
b6cdbc9a 991 type->set_length (0);
dc2b480f
WP
992 type->set_is_stub (true);
993
994 return set_tid_type (of, tid, type);
995}
996
30d1f018
WP
997/* Read information associated with type TID. */
998
999static struct type *
1c7148dd 1000read_type_record (struct ctf_context *ccp, ctf_id_t tid)
30d1f018 1001{
139633c3 1002 ctf_dict_t *fp = ccp->fp;
30d1f018 1003 uint32_t kind;
844be3f2 1004 struct type *type = nullptr;
30d1f018
WP
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 {
ea11a98d 1026 const char *name = ctf_type_name_raw (fp, tid);
30d1f018 1027 btid = ctf_type_reference (fp, tid);
ea11a98d 1028 type = read_typedef_type (ccp, tid, btid, name);
30d1f018
WP
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;
dc2b480f
WP
1050 case CTF_K_FORWARD:
1051 type = read_forward_type (ccp, tid);
1052 break;
30d1f018
WP
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
1064static int
1065ctf_add_type_cb (ctf_id_t tid, void *arg)
1066{
1c7148dd 1067 struct ctf_context *ccp = (struct ctf_context *) arg;
30d1f018
WP
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);
844be3f2 1073 if (type != nullptr)
30d1f018
WP
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
1129static int
1130ctf_add_var_cb (const char *name, ctf_id_t id, void *arg)
1131{
1c7148dd 1132 struct ctf_context *ccp = (struct ctf_context *) arg;
844be3f2 1133 struct symbol *sym = nullptr;
30d1f018
WP
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:
844be3f2 1143 if (name != nullptr && strcmp (name, "main") == 0)
30d1f018
WP
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:
ffb3f587 1154 if (type != nullptr)
30d1f018
WP
1155 {
1156 sym = new_symbol (ccp, type, id);
ffb3f587
WP
1157 if (sym != nullptr)
1158 sym->compute_and_set_names (name, false, ccp->of->per_bfd);
30d1f018
WP
1159 }
1160 break;
1161 case CTF_K_STRUCT:
1162 case CTF_K_UNION:
1163 case CTF_K_ENUM:
844be3f2 1164 if (type == nullptr)
01add95b
SM
1165 {
1166 complaint (_("ctf_add_var_cb: %s has NO type (%ld)"), name, id);
1167 type = objfile_type (ccp->of)->builtin_error;
1168 }
8c14c3a3 1169 sym = new (&ccp->of->objfile_obstack) symbol;
30d1f018 1170 OBJSTAT (ccp->of, n_syms++);
5f9c5a63 1171 sym->set_type (type);
6c9c307c 1172 sym->set_domain (VAR_DOMAIN);
ba44b1a3 1173 sym->set_aclass_index (LOC_OPTIMIZED_OUT);
4d4eaa30 1174 sym->compute_and_set_names (name, false, ccp->of->per_bfd);
ffb3f587 1175 add_symbol_to_list (sym, ccp->builder->get_file_symbols ());
30d1f018
WP
1176 break;
1177 default:
1178 complaint (_("ctf_add_var_cb: kind unsupported (%d)"), kind);
1179 break;
1180 }
1181
844be3f2 1182 if (sym != nullptr)
30d1f018
WP
1183 set_symbol_address (ccp->of, sym, name);
1184
1185 return 0;
1186}
1187
ffb3f587
WP
1188/* Add entries in either data objects or function info section, controlled
1189 by FUNCTIONS. */
30d1f018 1190
ffb3f587
WP
1191static void
1192add_stt_entries (struct ctf_context *ccp, int functions)
30d1f018 1193{
ffb3f587
WP
1194 ctf_next_t *i = nullptr;
1195 const char *tname;
30d1f018 1196 ctf_id_t tid;
ffb3f587
WP
1197 struct symbol *sym = nullptr;
1198 struct type *type;
30d1f018 1199
ffb3f587
WP
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++);
5f9c5a63 1207 sym->set_type (type);
6c9c307c 1208 sym->set_domain (VAR_DOMAIN);
ba44b1a3 1209 sym->set_aclass_index (LOC_STATIC);
ffb3f587
WP
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 }
30d1f018
WP
1214}
1215
ffb3f587 1216/* Add entries in data objects section. */
30d1f018 1217
ffb3f587
WP
1218static void
1219add_stt_obj (struct ctf_context *ccp)
30d1f018 1220{
ffb3f587
WP
1221 add_stt_entries (ccp, 0);
1222}
30d1f018 1223
ffb3f587 1224/* Add entries in function info section. */
30d1f018 1225
ffb3f587
WP
1226static void
1227add_stt_func (struct ctf_context *ccp)
1228{
1229 add_stt_entries (ccp, 1);
30d1f018
WP
1230}
1231
1232/* Get text segment base for OBJFILE, TSIZE contains the segment size. */
1233
1234static CORE_ADDR
1235get_objfile_text_range (struct objfile *of, int *tsize)
1236{
98badbfd 1237 bfd *abfd = of->obfd.get ();
30d1f018
WP
1238 const asection *codes;
1239
1240 codes = bfd_get_section_by_name (abfd, ".text");
1c7148dd 1241 *tsize = codes ? bfd_section_size (codes) : 0;
b3b3bada 1242 return of->text_section_offset ();
30d1f018
WP
1243}
1244
1245/* Start a symtab for OBJFILE in CTF format. */
1246
1247static void
59dfe8ad
SM
1248ctf_start_compunit_symtab (ctf_psymtab *pst,
1249 struct objfile *of, CORE_ADDR text_offset)
30d1f018 1250{
1c7148dd 1251 struct ctf_context *ccp;
30d1f018 1252
ffb3f587 1253 ccp = &pst->context;
30d1f018 1254 ccp->builder = new buildsym_compunit
89ab947e 1255 (of, pst->filename, nullptr,
30d1f018
WP
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
1264static struct compunit_symtab *
59dfe8ad
SM
1265ctf_end_compunit_symtab (ctf_psymtab *pst,
1266 CORE_ADDR end_addr, int section)
30d1f018 1267{
1c7148dd 1268 struct ctf_context *ccp;
30d1f018 1269
ffb3f587 1270 ccp = &pst->context;
30d1f018 1271 struct compunit_symtab *result
59dfe8ad 1272 = ccp->builder->end_compunit_symtab (end_addr, section);
30d1f018 1273 delete ccp->builder;
844be3f2 1274 ccp->builder = nullptr;
30d1f018
WP
1275 return result;
1276}
1277
dd99cf0c
WP
1278/* Add all members of an enum with type TID to partial symbol table. */
1279
1280static void
1281ctf_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,
7b249e47 1292 0, language_c, ccp->partial_symtabs, ccp->of);
dd99cf0c
WP
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
ffb3f587
WP
1299/* Add entries in either data objects or function info section, controlled
1300 by FUNCTIONS, to psymtab. */
1301
1302static void
1303ctf_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
1343static void
1344ctf_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
1352static void
1353ctf_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
30d1f018
WP
1359/* Read in full symbols for PST, and anything it depends on. */
1360
8566b89b
TT
1361void
1362ctf_psymtab::expand_psymtab (struct objfile *objfile)
30d1f018 1363{
1c7148dd 1364 struct ctf_context *ccp;
30d1f018 1365
8566b89b 1366 gdb_assert (!readin);
30d1f018 1367
ffb3f587 1368 ccp = &context;
30d1f018
WP
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. */
ffb3f587
WP
1382 add_stt_obj (ccp);
1383 add_stt_func (ccp);
30d1f018 1384
8566b89b 1385 readin = true;
30d1f018
WP
1386}
1387
1388/* Expand partial symbol table PST into a full symbol table.
1389 PST is not NULL. */
1390
891813be
TT
1391void
1392ctf_psymtab::read_symtab (struct objfile *objfile)
30d1f018 1393{
891813be
TT
1394 if (readin)
1395 warning (_("bug: psymtab for %s is already read in."), filename);
30d1f018
WP
1396 else
1397 {
1398 if (info_verbose)
1399 {
6cb06a8c 1400 gdb_printf (_("Reading in CTF data for %s..."), filename);
30d1f018
WP
1401 gdb_flush (gdb_stdout);
1402 }
1403
1404 /* Start a symtab. */
891813be 1405 CORE_ADDR offset; /* Start of text segment. */
30d1f018
WP
1406 int tsize;
1407
891813be 1408 offset = get_objfile_text_range (objfile, &tsize);
59dfe8ad 1409 ctf_start_compunit_symtab (this, objfile, offset);
8566b89b 1410 expand_psymtab (objfile);
30d1f018 1411
891813be
TT
1412 set_text_low (offset);
1413 set_text_high (offset + tsize);
59dfe8ad
SM
1414 compunit_symtab = ctf_end_compunit_symtab (this, offset + tsize,
1415 SECT_OFF_TEXT (objfile));
30d1f018
WP
1416
1417 /* Finish up the debug error message. */
1418 if (info_verbose)
6cb06a8c 1419 gdb_printf (_("done.\n"));
30d1f018
WP
1420 }
1421}
1422
30d1f018
WP
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
891813be 1435static ctf_psymtab *
30d1f018 1436create_partial_symtab (const char *name,
ffb3f587 1437 ctf_archive_t *arc,
139633c3 1438 ctf_dict_t *cfp,
7b249e47 1439 psymtab_storage *partial_symtabs,
30d1f018
WP
1440 struct objfile *objfile)
1441{
891813be 1442 ctf_psymtab *pst;
30d1f018 1443
0072c873 1444 pst = new ctf_psymtab (name, partial_symtabs, objfile->per_bfd, 0);
30d1f018 1445
ffb3f587
WP
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;
59f837cb 1451 pst->context.builder = nullptr;
30d1f018
WP
1452
1453 return pst;
1454}
1455
1456/* Callback to add type TID to partial symbol table. */
1457
1458static int
1459ctf_psymtab_type_cb (ctf_id_t tid, void *arg)
1460{
1c7148dd 1461 struct ctf_context *ccp;
30d1f018
WP
1462 uint32_t kind;
1463 short section = -1;
1464
1c7148dd 1465 ccp = (struct ctf_context *) arg;
30d1f018
WP
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 {
dd99cf0c
WP
1472 case CTF_K_ENUM:
1473 ctf_psymtab_add_enums (ccp, tid);
1474 /* FALL THROUGH */
30d1f018
WP
1475 case CTF_K_STRUCT:
1476 case CTF_K_UNION:
30d1f018
WP
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
ea11a98d
WP
1507 const char *name = ctf_type_name_raw (ccp->fp, tid);
1508 if (name == nullptr || strlen (name) == 0)
dd99cf0c
WP
1509 return 0;
1510
ea11a98d 1511 ccp->pst->add_psymbol (name, false,
30d1f018 1512 domain, aclass, section,
ffb3f587 1513 psymbol_placement::STATIC,
7b249e47 1514 0, language_c, ccp->partial_symtabs, ccp->of);
30d1f018
WP
1515
1516 return 0;
1517}
1518
1519/* Callback to add variable NAME with ID to partial symbol table. */
1520
1521static int
1522ctf_psymtab_var_cb (const char *name, ctf_id_t id, void *arg)
1523{
1c7148dd 1524 struct ctf_context *ccp = (struct ctf_context *) arg;
30d1f018 1525
932539d7
TT
1526 ccp->pst->add_psymbol (name, true,
1527 VAR_DOMAIN, LOC_STATIC, -1,
1528 psymbol_placement::GLOBAL,
7b249e47 1529 0, language_c, ccp->partial_symtabs, ccp->of);
30d1f018
WP
1530 return 0;
1531}
1532
1533/* Setup partial_symtab's describing each source file for which
1534 debugging information is available. */
1535
1536static void
7b249e47 1537scan_partial_symbols (ctf_dict_t *cfp, psymtab_storage *partial_symtabs,
ffb3f587 1538 struct ctf_per_tu_data *tup, const char *fname)
30d1f018 1539{
ffb3f587
WP
1540 struct objfile *of = tup->of;
1541 bool isparent = false;
1542
1543 if (strcmp (fname, ".ctf") == 0)
1544 {
98badbfd 1545 fname = bfd_get_filename (of->obfd.get ());
ffb3f587
WP
1546 isparent = true;
1547 }
30d1f018 1548
ffb3f587
WP
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)
8458fb44 1554 ccx->pst = pst;
30d1f018 1555
932539d7 1556 if (ctf_type_iter (cfp, ctf_psymtab_type_cb, ccx) == CTF_ERR)
30d1f018
WP
1557 complaint (_("ctf_type_iter scan_partial_symbols failed - %s"),
1558 ctf_errmsg (ctf_errno (cfp)));
1559
932539d7 1560 if (ctf_variable_iter (cfp, ctf_psymtab_var_cb, ccx) == CTF_ERR)
30d1f018
WP
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. */
ffb3f587
WP
1567 ctf_psymtab_add_stt_obj (cfp, pst, of);
1568 ctf_psymtab_add_stt_func (cfp, pst, of);
30d1f018 1569
ffb3f587
WP
1570 pst->end ();
1571}
30d1f018 1572
ffb3f587
WP
1573/* Callback to build the psymtab for archive member NAME. */
1574
1575static int
1576build_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 {
6cb06a8c 1586 gdb_printf (_("Scanning archive member %s..."), name);
ffb3f587 1587 gdb_flush (gdb_stdout);
30d1f018
WP
1588 }
1589
ffb3f587
WP
1590 psymtab_storage *pss = tup->psf->get_partial_symtabs ().get ();
1591 scan_partial_symbols (ctf, pss, tup, name);
1592
1593 return 0;
30d1f018
WP
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
1600void
1601elfctf_build_psymtabs (struct objfile *of)
1602{
ffb3f587 1603 struct ctf_per_tu_data pcu;
98badbfd 1604 bfd *abfd = of->obfd.get ();
30d1f018
WP
1605 int err;
1606
1607 ctf_archive_t *arc = ctf_bfdopen (abfd, &err);
844be3f2 1608 if (arc == nullptr)
30d1f018
WP
1609 error (_("ctf_bfdopen failed on %s - %s"),
1610 bfd_get_filename (abfd), ctf_errmsg (err));
1611
ae41200b 1612 ctf_dict_t *fp = ctf_dict_open (arc, NULL, &err);
844be3f2 1613 if (fp == nullptr)
ae41200b 1614 error (_("ctf_dict_open failed on %s - %s"),
30d1f018 1615 bfd_get_filename (abfd), ctf_errmsg (err));
139633c3 1616 ctf_dict_key.emplace (of, fp);
30d1f018 1617
ffb3f587
WP
1618 pcu.fp = fp;
1619 pcu.of = of;
1620 pcu.arc = arc;
1621
eb36a3eb 1622 psymbol_functions *psf = new psymbol_functions ();
eb36a3eb 1623 of->qf.emplace_front (psf);
ffb3f587
WP
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));
30d1f018 1629}
1776e3e5
NA
1630
1631#else
1632
1633void
1634elfctf_build_psymtabs (struct objfile *of)
1635{
1636 /* Nothing to do if CTF is disabled. */
1637}
1638
1639#endif /* ENABLE_LIBCTF */