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