1 /* Compact ANSI-C Type Format (CTF) support in GDB.
3 Copyright (C) 2019-2023 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
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).
38 The CTF file or section itself has the following structure:
40 +--------+--------+---------+----------+----------+-------+--------+
41 | file | type | data | function | variable | data | string |
42 | header | labels | objects | info | info | types | table |
43 +--------+--------+---------+----------+----------+-------+--------+
45 The file header stores a magic number and version information, encoding
46 flags, and the byte offset of each of the sections relative to the end of the
47 header itself. If the CTF data has been uniquified against another set of
48 CTF data, a reference to that data also appears in the header. This
49 reference is the name of the label corresponding to the types uniquified
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].
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.
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.
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,
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. */
80 #include "complaints.h"
90 static const registry
<objfile
>::key
<htab
, htab_deleter
> ctf_tid_key
;
94 explicit ctf_fp_info (ctf_dict_t
*cfp
) : fp (cfp
) {}
99 /* Cleanup function for the ctf_dict_key data. */
100 ctf_fp_info::~ctf_fp_info ()
105 ctf_archive_t
*arc
= ctf_get_arc (fp
);
110 static const registry
<objfile
>::key
<ctf_fp_info
> ctf_dict_key
;
112 /* A CTF context consists of a file pointer and an objfile pointer. */
118 psymtab_storage
*partial_symtabs
;
121 struct buildsym_compunit
*builder
;
124 /* A partial symtab, specialized for this module. */
125 struct ctf_psymtab
: public standard_psymtab
127 ctf_psymtab (const char *filename
,
128 psymtab_storage
*partial_symtabs
,
129 objfile_per_bfd_storage
*objfile_per_bfd
,
131 : standard_psymtab (filename
, partial_symtabs
, objfile_per_bfd
, addr
)
135 void read_symtab (struct objfile
*) override
;
136 void expand_psymtab (struct objfile
*) override
;
138 struct ctf_context context
;
141 /* The routines that read and process fields/members of a C struct, union,
142 or enumeration, pass lists of data member fields in an instance of a
143 ctf_field_info structure. It is derived from dwarf2read.c. */
147 struct field field
{};
150 struct ctf_field_info
152 /* List of data member fields. */
153 std::vector
<struct ctf_nextfield
> fields
;
156 struct ctf_context
*cur_context
;
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
;
165 /* Nested types defined by this struct and the number of elements in
167 std::vector
<struct decl_field
> nested_types_list
;
170 /* Data held for a translation unit. */
172 struct ctf_per_tu_data
177 psymtab_storage
*pss
;
178 psymbol_functions
*psf
;
181 /* Local function prototypes */
183 static int ctf_add_type_cb (ctf_id_t tid
, void *arg
);
185 static struct type
*read_array_type (struct ctf_context
*cp
, ctf_id_t tid
);
187 static struct type
*read_pointer_type (struct ctf_context
*cp
, ctf_id_t tid
,
190 static struct type
*read_structure_type (struct ctf_context
*cp
, ctf_id_t tid
);
192 static struct type
*read_enum_type (struct ctf_context
*cp
, ctf_id_t tid
);
194 static struct type
*read_typedef_type (struct ctf_context
*cp
, ctf_id_t tid
,
195 ctf_id_t btid
, const char *name
);
197 static struct type
*read_type_record (struct ctf_context
*cp
, ctf_id_t tid
);
199 static void process_structure_type (struct ctf_context
*cp
, ctf_id_t tid
);
201 static void process_struct_members (struct ctf_context
*cp
, ctf_id_t tid
,
204 static struct type
*read_forward_type (struct ctf_context
*cp
, ctf_id_t tid
);
206 static struct symbol
*new_symbol (struct ctf_context
*cp
, struct type
*type
,
209 struct ctf_tid_and_type
215 /* Hash function for a ctf_tid_and_type. */
218 tid_and_type_hash (const void *item
)
220 const struct ctf_tid_and_type
*ids
221 = (const struct ctf_tid_and_type
*) item
;
226 /* Equality function for a ctf_tid_and_type. */
229 tid_and_type_eq (const void *item_lhs
, const void *item_rhs
)
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
;
236 return ids_lhs
->tid
== ids_rhs
->tid
;
239 /* Set the type associated with TID to TYP. */
242 set_tid_type (struct objfile
*of
, ctf_id_t tid
, struct type
*typ
)
246 htab
= ctf_tid_key
.get (of
);
249 htab
= htab_create_alloc (1, tid_and_type_hash
,
251 NULL
, xcalloc
, xfree
);
252 ctf_tid_key
.set (of
, htab
);
255 struct ctf_tid_and_type
**slot
, ids
;
258 slot
= (struct ctf_tid_and_type
**) htab_find_slot (htab
, &ids
, INSERT
);
259 if (*slot
== nullptr)
260 *slot
= XOBNEW (&of
->objfile_obstack
, struct ctf_tid_and_type
);
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. */
269 get_tid_type (struct objfile
*of
, ctf_id_t tid
)
271 struct ctf_tid_and_type
*slot
, ids
;
274 htab
= ctf_tid_key
.get (of
);
280 slot
= (struct ctf_tid_and_type
*) htab_find (htab
, &ids
);
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. */
291 fetch_tid_type (struct ctf_context
*ccp
, ctf_id_t tid
)
293 struct objfile
*of
= ccp
->of
;
296 typ
= get_tid_type (of
, tid
);
299 ctf_add_type_cb (tid
, ccp
);
300 typ
= get_tid_type (of
, tid
);
306 /* Return the size of storage in bits for INTEGER, FLOAT, or ENUM. */
309 get_bitsize (ctf_dict_t
*fp
, ctf_id_t tid
, uint32_t kind
)
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
)
322 /* Set SYM's address, with NAME, from its minimal symbol entry. */
325 set_symbol_address (struct objfile
*of
, struct symbol
*sym
, const char *name
)
327 struct bound_minimal_symbol msym
;
329 msym
= lookup_minimal_symbol (name
, nullptr, of
);
330 if (msym
.minsym
!= NULL
)
332 sym
->set_value_address (msym
.value_address ());
333 sym
->set_aclass_index (LOC_STATIC
);
334 sym
->set_section_index (msym
.minsym
->section_index ());
338 /* Create the vector of fields, and attach it to TYPE. */
341 attach_fields_to_type (struct ctf_field_info
*fip
, struct type
*type
)
343 int nfields
= fip
->fields
.size ();
348 /* Record the field count, allocate space for the array of fields. */
349 type
->set_num_fields (nfields
);
351 ((struct field
*) TYPE_ZALLOC (type
, sizeof (struct field
) * nfields
));
353 /* Copy the saved-up fields into the field vector. */
354 for (int i
= 0; i
< nfields
; ++i
)
356 struct ctf_nextfield
&field
= fip
->fields
[i
];
357 type
->field (i
) = field
.field
;
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. */
366 ctf_init_float_type (struct objfile
*objfile
,
369 const char *name_hint
)
371 struct gdbarch
*gdbarch
= objfile
->arch ();
372 const struct floatformat
**format
;
375 type_allocator
alloc (objfile
);
376 format
= gdbarch_floatformat_for_type (gdbarch
, name_hint
, bits
);
377 if (format
!= nullptr)
378 type
= init_float_type (alloc
, bits
, name
, format
);
380 type
= alloc
.new_type (TYPE_CODE_ERROR
, bits
, name
);
385 /* Callback to add member NAME to a struct/union type. TID is the type
386 of struct/union member, OFFSET is the offset of member in bits,
387 and ARG contains the ctf_field_info. */
390 ctf_add_member_cb (const char *name
,
392 unsigned long offset
,
395 struct ctf_field_info
*fip
= (struct ctf_field_info
*) arg
;
396 struct ctf_context
*ccp
= fip
->cur_context
;
397 struct ctf_nextfield new_field
;
402 fp
= &new_field
.field
;
405 kind
= ctf_type_kind (ccp
->fp
, tid
);
406 t
= fetch_tid_type (ccp
, tid
);
409 t
= read_type_record (ccp
, tid
);
412 complaint (_("ctf_add_member_cb: %s has NO type (%ld)"), name
, tid
);
413 t
= objfile_type (ccp
->of
)->builtin_error
;
414 set_tid_type (ccp
->of
, tid
, t
);
418 if (kind
== CTF_K_STRUCT
|| kind
== CTF_K_UNION
)
419 process_struct_members (ccp
, tid
, t
);
422 fp
->set_loc_bitpos (offset
/ TARGET_CHAR_BIT
);
423 FIELD_BITSIZE (*fp
) = get_bitsize (ccp
->fp
, tid
, kind
);
425 fip
->fields
.emplace_back (new_field
);
430 /* Callback to add member NAME of EVAL to an enumeration type.
431 ARG contains the ctf_field_info. */
434 ctf_add_enum_member_cb (const char *name
, int enum_value
, void *arg
)
436 struct ctf_field_info
*fip
= (struct ctf_field_info
*) arg
;
437 struct ctf_nextfield new_field
;
439 struct ctf_context
*ccp
= fip
->cur_context
;
441 fp
= &new_field
.field
;
443 fp
->set_type (nullptr);
444 fp
->set_loc_enumval (enum_value
);
445 FIELD_BITSIZE (*fp
) = 0;
449 struct symbol
*sym
= new (&ccp
->of
->objfile_obstack
) symbol
;
450 OBJSTAT (ccp
->of
, n_syms
++);
452 sym
->set_language (language_c
, &ccp
->of
->objfile_obstack
);
453 sym
->compute_and_set_names (name
, false, ccp
->of
->per_bfd
);
454 sym
->set_aclass_index (LOC_CONST
);
455 sym
->set_domain (VAR_DOMAIN
);
456 sym
->set_type (fip
->ptype
);
457 add_symbol_to_list (sym
, ccp
->builder
->get_global_symbols ());
460 fip
->fields
.emplace_back (new_field
);
465 /* Add a new symbol entry, with its name from TID, its access index and
466 domain from TID's kind, and its type from TYPE. */
468 static struct symbol
*
469 new_symbol (struct ctf_context
*ccp
, struct type
*type
, ctf_id_t tid
)
471 struct objfile
*objfile
= ccp
->of
;
472 ctf_dict_t
*fp
= ccp
->fp
;
473 struct symbol
*sym
= nullptr;
475 const char *name
= ctf_type_name_raw (fp
, tid
);
478 sym
= new (&objfile
->objfile_obstack
) symbol
;
479 OBJSTAT (objfile
, n_syms
++);
481 sym
->set_language (language_c
, &objfile
->objfile_obstack
);
482 sym
->compute_and_set_names (name
, false, objfile
->per_bfd
);
483 sym
->set_domain (VAR_DOMAIN
);
484 sym
->set_aclass_index (LOC_OPTIMIZED_OUT
);
487 sym
->set_type (type
);
489 uint32_t kind
= ctf_type_kind (fp
, tid
);
495 sym
->set_aclass_index (LOC_TYPEDEF
);
496 sym
->set_domain (STRUCT_DOMAIN
);
499 sym
->set_aclass_index (LOC_STATIC
);
500 set_symbol_address (objfile
, sym
, sym
->linkage_name ());
503 if (sym
->type ()->code () == TYPE_CODE_VOID
)
504 sym
->set_type (objfile_type (objfile
)->builtin_int
);
509 sym
->set_aclass_index (LOC_TYPEDEF
);
510 sym
->set_domain (VAR_DOMAIN
);
523 add_symbol_to_list (sym
, ccp
->builder
->get_file_symbols ());
529 /* Given a TID of kind CTF_K_INTEGER or CTF_K_FLOAT, find a representation
530 and create the symbol for it. */
533 read_base_type (struct ctf_context
*ccp
, ctf_id_t tid
)
535 struct objfile
*of
= ccp
->of
;
536 ctf_dict_t
*fp
= ccp
->fp
;
538 struct type
*type
= nullptr;
542 if (ctf_type_encoding (fp
, tid
, &cet
))
544 complaint (_("ctf_type_encoding read_base_type failed - %s"),
545 ctf_errmsg (ctf_errno (fp
)));
549 name
= ctf_type_name_raw (fp
, tid
);
550 if (name
== nullptr || strlen (name
) == 0)
552 name
= ctf_type_aname (fp
, tid
);
554 complaint (_("ctf_type_aname read_base_type failed - %s"),
555 ctf_errmsg (ctf_errno (fp
)));
558 type_allocator
alloc (of
);
559 kind
= ctf_type_kind (fp
, tid
);
560 if (kind
== CTF_K_INTEGER
)
562 uint32_t issigned
, ischar
, isbool
;
563 struct gdbarch
*gdbarch
= of
->arch ();
565 issigned
= cet
.cte_format
& CTF_INT_SIGNED
;
566 ischar
= cet
.cte_format
& CTF_INT_CHAR
;
567 isbool
= cet
.cte_format
& CTF_INT_BOOL
;
569 type
= init_character_type (alloc
, TARGET_CHAR_BIT
, !issigned
, name
);
571 type
= init_boolean_type (alloc
, gdbarch_int_bit (gdbarch
),
576 if (cet
.cte_bits
&& ((cet
.cte_bits
% TARGET_CHAR_BIT
) == 0))
579 bits
= gdbarch_int_bit (gdbarch
);
580 type
= init_integer_type (alloc
, bits
, !issigned
, name
);
583 else if (kind
== CTF_K_FLOAT
)
586 isflt
= !((cet
.cte_format
& CTF_FP_IMAGRY
) == CTF_FP_IMAGRY
587 || (cet
.cte_format
& CTF_FP_DIMAGRY
) == CTF_FP_DIMAGRY
588 || (cet
.cte_format
& CTF_FP_LDIMAGRY
) == CTF_FP_LDIMAGRY
);
590 type
= ctf_init_float_type (of
, cet
.cte_bits
, name
, name
);
594 = ctf_init_float_type (of
, cet
.cte_bits
/ 2, NULL
, name
);
595 type
= init_complex_type (name
, t
);
600 complaint (_("read_base_type: unsupported base kind (%d)"), kind
);
601 type
= alloc
.new_type (TYPE_CODE_ERROR
, cet
.cte_bits
, name
);
604 if (name
!= nullptr && strcmp (name
, "char") == 0)
605 type
->set_has_no_signedness (true);
607 return set_tid_type (of
, tid
, type
);
611 process_base_type (struct ctf_context
*ccp
, ctf_id_t tid
)
615 type
= read_base_type (ccp
, tid
);
616 new_symbol (ccp
, type
, tid
);
619 /* Start a structure or union scope (definition) with TID to create a type
620 for the structure or union.
622 Fill in the type's name and general properties. The members will not be
623 processed, nor a symbol table entry be done until process_structure_type
624 (assuming the type has a name). */
627 read_structure_type (struct ctf_context
*ccp
, ctf_id_t tid
)
629 struct objfile
*of
= ccp
->of
;
630 ctf_dict_t
*fp
= ccp
->fp
;
634 type
= type_allocator (of
).new_type ();
636 const char *name
= ctf_type_name_raw (fp
, tid
);
637 if (name
!= nullptr && strlen (name
) != 0)
638 type
->set_name (name
);
640 kind
= ctf_type_kind (fp
, tid
);
641 if (kind
== CTF_K_UNION
)
642 type
->set_code (TYPE_CODE_UNION
);
644 type
->set_code (TYPE_CODE_STRUCT
);
646 type
->set_length (ctf_type_size (fp
, tid
));
647 set_type_align (type
, ctf_type_align (fp
, tid
));
649 return set_tid_type (ccp
->of
, tid
, type
);
652 /* Given a tid of CTF_K_STRUCT or CTF_K_UNION, process all its members
653 and create the symbol for it. */
656 process_struct_members (struct ctf_context
*ccp
,
660 struct ctf_field_info fi
;
662 fi
.cur_context
= ccp
;
663 if (ctf_member_iter (ccp
->fp
, tid
, ctf_add_member_cb
, &fi
) == CTF_ERR
)
664 complaint (_("ctf_member_iter process_struct_members failed - %s"),
665 ctf_errmsg (ctf_errno (ccp
->fp
)));
667 /* Attach fields to the type. */
668 attach_fields_to_type (&fi
, type
);
670 new_symbol (ccp
, type
, tid
);
674 process_structure_type (struct ctf_context
*ccp
, ctf_id_t tid
)
678 type
= read_structure_type (ccp
, tid
);
679 process_struct_members (ccp
, tid
, type
);
682 /* Create a function type for TID and set its return type. */
685 read_func_kind_type (struct ctf_context
*ccp
, ctf_id_t tid
)
687 struct objfile
*of
= ccp
->of
;
688 ctf_dict_t
*fp
= ccp
->fp
;
689 struct type
*type
, *rettype
, *atype
;
693 type
= type_allocator (of
).new_type ();
695 type
->set_code (TYPE_CODE_FUNC
);
696 if (ctf_func_type_info (fp
, tid
, &cfi
) < 0)
698 const char *fname
= ctf_type_name_raw (fp
, tid
);
699 error (_("Error getting function type info: %s"),
700 fname
== nullptr ? "noname" : fname
);
702 rettype
= fetch_tid_type (ccp
, cfi
.ctc_return
);
703 type
->set_target_type (rettype
);
704 set_type_align (type
, ctf_type_align (fp
, tid
));
706 /* Set up function's arguments. */
708 type
->set_num_fields (argc
);
709 if ((cfi
.ctc_flags
& CTF_FUNC_VARARG
) != 0)
710 type
->set_has_varargs (true);
714 std::vector
<ctf_id_t
> argv (argc
);
715 if (ctf_func_type_args (fp
, tid
, argc
, argv
.data ()) == CTF_ERR
)
719 ((struct field
*) TYPE_ZALLOC (type
, argc
* sizeof (struct field
)));
720 struct type
*void_type
= objfile_type (of
)->builtin_void
;
721 /* If failed to find the argument type, fill it with void_type. */
722 for (int iparam
= 0; iparam
< argc
; iparam
++)
724 atype
= fetch_tid_type (ccp
, argv
[iparam
]);
725 if (atype
!= nullptr)
726 type
->field (iparam
).set_type (atype
);
728 type
->field (iparam
).set_type (void_type
);
732 return set_tid_type (of
, tid
, type
);
735 /* Given a TID of CTF_K_ENUM, process all the members of the
736 enumeration, and create the symbol for the enumeration type. */
739 read_enum_type (struct ctf_context
*ccp
, ctf_id_t tid
)
741 struct objfile
*of
= ccp
->of
;
742 ctf_dict_t
*fp
= ccp
->fp
;
745 type
= type_allocator (of
).new_type ();
747 const char *name
= ctf_type_name_raw (fp
, tid
);
748 if (name
!= nullptr && strlen (name
) != 0)
749 type
->set_name (name
);
751 type
->set_code (TYPE_CODE_ENUM
);
752 type
->set_length (ctf_type_size (fp
, tid
));
753 /* Set the underlying type based on its ctf_type_size bits. */
754 type
->set_target_type (objfile_int_type (of
, type
->length (), false));
755 set_type_align (type
, ctf_type_align (fp
, tid
));
757 return set_tid_type (of
, tid
, type
);
761 process_enum_type (struct ctf_context
*ccp
, ctf_id_t tid
)
764 struct ctf_field_info fi
;
766 type
= read_enum_type (ccp
, tid
);
768 fi
.cur_context
= ccp
;
770 if (ctf_enum_iter (ccp
->fp
, tid
, ctf_add_enum_member_cb
, &fi
) == CTF_ERR
)
771 complaint (_("ctf_enum_iter process_enum_type failed - %s"),
772 ctf_errmsg (ctf_errno (ccp
->fp
)));
774 /* Attach fields to the type. */
775 attach_fields_to_type (&fi
, type
);
777 new_symbol (ccp
, type
, tid
);
780 /* Add given cv-qualifiers CNST+VOLTL to the BASE_TYPE of array TID. */
783 add_array_cv_type (struct ctf_context
*ccp
,
785 struct type
*base_type
,
789 struct type
*el_type
, *inner_array
;
791 base_type
= copy_type (base_type
);
792 inner_array
= base_type
;
794 while (inner_array
->target_type ()->code () == TYPE_CODE_ARRAY
)
796 inner_array
->set_target_type (copy_type (inner_array
->target_type ()));
797 inner_array
= inner_array
->target_type ();
800 el_type
= inner_array
->target_type ();
801 cnst
|= TYPE_CONST (el_type
);
802 voltl
|= TYPE_VOLATILE (el_type
);
803 inner_array
->set_target_type (make_cv_type (cnst
, voltl
, el_type
, nullptr));
805 return set_tid_type (ccp
->of
, tid
, base_type
);
808 /* Read all information from a TID of CTF_K_ARRAY. */
811 read_array_type (struct ctf_context
*ccp
, ctf_id_t tid
)
813 struct objfile
*objfile
= ccp
->of
;
814 ctf_dict_t
*fp
= ccp
->fp
;
815 struct type
*element_type
, *range_type
, *idx_type
;
819 if (ctf_array_info (fp
, tid
, &ar
) == CTF_ERR
)
821 complaint (_("ctf_array_info read_array_type failed - %s"),
822 ctf_errmsg (ctf_errno (fp
)));
826 element_type
= fetch_tid_type (ccp
, ar
.ctr_contents
);
827 if (element_type
== nullptr)
830 idx_type
= fetch_tid_type (ccp
, ar
.ctr_index
);
831 if (idx_type
== nullptr)
832 idx_type
= objfile_type (objfile
)->builtin_int
;
834 type_allocator
alloc (objfile
);
835 range_type
= create_static_range_type (alloc
, idx_type
, 0, ar
.ctr_nelems
- 1);
836 type
= create_array_type (NULL
, element_type
, range_type
);
837 if (ar
.ctr_nelems
<= 1) /* Check if undefined upper bound. */
839 range_type
->bounds ()->high
.set_undefined ();
840 type
->set_length (0);
841 type
->set_target_is_stub (true);
844 type
->set_length (ctf_type_size (fp
, tid
));
846 set_type_align (type
, ctf_type_align (fp
, tid
));
848 return set_tid_type (objfile
, tid
, type
);
851 /* Read TID of kind CTF_K_CONST with base type BTID. */
854 read_const_type (struct ctf_context
*ccp
, ctf_id_t tid
, ctf_id_t btid
)
856 struct objfile
*objfile
= ccp
->of
;
857 struct type
*base_type
, *cv_type
;
859 base_type
= fetch_tid_type (ccp
, btid
);
860 if (base_type
== nullptr)
862 base_type
= read_type_record (ccp
, btid
);
863 if (base_type
== nullptr)
865 complaint (_("read_const_type: NULL base type (%ld)"), btid
);
866 base_type
= objfile_type (objfile
)->builtin_error
;
869 cv_type
= make_cv_type (1, TYPE_VOLATILE (base_type
), base_type
, 0);
871 return set_tid_type (objfile
, tid
, cv_type
);
874 /* Read TID of kind CTF_K_VOLATILE with base type BTID. */
877 read_volatile_type (struct ctf_context
*ccp
, ctf_id_t tid
, ctf_id_t btid
)
879 struct objfile
*objfile
= ccp
->of
;
880 ctf_dict_t
*fp
= ccp
->fp
;
881 struct type
*base_type
, *cv_type
;
883 base_type
= fetch_tid_type (ccp
, btid
);
884 if (base_type
== nullptr)
886 base_type
= read_type_record (ccp
, btid
);
887 if (base_type
== nullptr)
889 complaint (_("read_volatile_type: NULL base type (%ld)"), btid
);
890 base_type
= objfile_type (objfile
)->builtin_error
;
894 if (ctf_type_kind (fp
, btid
) == CTF_K_ARRAY
)
895 return add_array_cv_type (ccp
, tid
, base_type
, 0, 1);
896 cv_type
= make_cv_type (TYPE_CONST (base_type
), 1, base_type
, 0);
898 return set_tid_type (objfile
, tid
, cv_type
);
901 /* Read TID of kind CTF_K_RESTRICT with base type BTID. */
904 read_restrict_type (struct ctf_context
*ccp
, ctf_id_t tid
, ctf_id_t btid
)
906 struct objfile
*objfile
= ccp
->of
;
907 struct type
*base_type
, *cv_type
;
909 base_type
= fetch_tid_type (ccp
, btid
);
910 if (base_type
== nullptr)
912 base_type
= read_type_record (ccp
, btid
);
913 if (base_type
== nullptr)
915 complaint (_("read_restrict_type: NULL base type (%ld)"), btid
);
916 base_type
= objfile_type (objfile
)->builtin_error
;
919 cv_type
= make_restrict_type (base_type
);
921 return set_tid_type (objfile
, tid
, cv_type
);
924 /* Read TID of kind CTF_K_TYPEDEF with its NAME and base type BTID. */
927 read_typedef_type (struct ctf_context
*ccp
, ctf_id_t tid
,
928 ctf_id_t btid
, const char *name
)
930 struct objfile
*objfile
= ccp
->of
;
931 struct type
*this_type
, *target_type
;
933 char *aname
= obstack_strdup (&objfile
->objfile_obstack
, name
);
934 this_type
= type_allocator (objfile
).new_type (TYPE_CODE_TYPEDEF
, 0, aname
);
935 set_tid_type (objfile
, tid
, this_type
);
936 target_type
= fetch_tid_type (ccp
, btid
);
937 if (target_type
!= this_type
)
938 this_type
->set_target_type (target_type
);
940 this_type
->set_target_type (nullptr);
942 this_type
->set_target_is_stub (this_type
->target_type () != nullptr);
944 return set_tid_type (objfile
, tid
, this_type
);
947 /* Read TID of kind CTF_K_POINTER with base type BTID. */
950 read_pointer_type (struct ctf_context
*ccp
, ctf_id_t tid
, ctf_id_t btid
)
952 struct objfile
*of
= ccp
->of
;
953 struct type
*target_type
, *type
;
955 target_type
= fetch_tid_type (ccp
, btid
);
956 if (target_type
== nullptr)
958 target_type
= read_type_record (ccp
, btid
);
959 if (target_type
== nullptr)
961 complaint (_("read_pointer_type: NULL target type (%ld)"), btid
);
962 target_type
= objfile_type (ccp
->of
)->builtin_error
;
966 type
= lookup_pointer_type (target_type
);
967 set_type_align (type
, ctf_type_align (ccp
->fp
, tid
));
969 return set_tid_type (of
, tid
, type
);
972 /* Read information from a TID of CTF_K_FORWARD. */
975 read_forward_type (struct ctf_context
*ccp
, ctf_id_t tid
)
977 struct objfile
*of
= ccp
->of
;
978 ctf_dict_t
*fp
= ccp
->fp
;
982 type
= type_allocator (of
).new_type ();
984 const char *name
= ctf_type_name_raw (fp
, tid
);
985 if (name
!= nullptr && strlen (name
) != 0)
986 type
->set_name (name
);
988 kind
= ctf_type_kind_forwarded (fp
, tid
);
989 if (kind
== CTF_K_UNION
)
990 type
->set_code (TYPE_CODE_UNION
);
992 type
->set_code (TYPE_CODE_STRUCT
);
994 type
->set_length (0);
995 type
->set_is_stub (true);
997 return set_tid_type (of
, tid
, type
);
1000 /* Read information associated with type TID. */
1002 static struct type
*
1003 read_type_record (struct ctf_context
*ccp
, ctf_id_t tid
)
1005 ctf_dict_t
*fp
= ccp
->fp
;
1007 struct type
*type
= nullptr;
1010 kind
= ctf_type_kind (fp
, tid
);
1015 type
= read_structure_type (ccp
, tid
);
1018 type
= read_enum_type (ccp
, tid
);
1020 case CTF_K_FUNCTION
:
1021 type
= read_func_kind_type (ccp
, tid
);
1024 btid
= ctf_type_reference (fp
, tid
);
1025 type
= read_const_type (ccp
, tid
, btid
);
1029 const char *name
= ctf_type_name_raw (fp
, tid
);
1030 btid
= ctf_type_reference (fp
, tid
);
1031 type
= read_typedef_type (ccp
, tid
, btid
, name
);
1034 case CTF_K_VOLATILE
:
1035 btid
= ctf_type_reference (fp
, tid
);
1036 type
= read_volatile_type (ccp
, tid
, btid
);
1038 case CTF_K_RESTRICT
:
1039 btid
= ctf_type_reference (fp
, tid
);
1040 type
= read_restrict_type (ccp
, tid
, btid
);
1043 btid
= ctf_type_reference (fp
, tid
);
1044 type
= read_pointer_type (ccp
, tid
, btid
);
1048 type
= read_base_type (ccp
, tid
);
1051 type
= read_array_type (ccp
, tid
);
1054 type
= read_forward_type (ccp
, tid
);
1065 /* Callback to add type TID to the symbol table. */
1068 ctf_add_type_cb (ctf_id_t tid
, void *arg
)
1070 struct ctf_context
*ccp
= (struct ctf_context
*) arg
;
1074 /* Check if tid's type has already been defined. */
1075 type
= get_tid_type (ccp
->of
, tid
);
1076 if (type
!= nullptr)
1079 ctf_id_t btid
= ctf_type_reference (ccp
->fp
, tid
);
1080 kind
= ctf_type_kind (ccp
->fp
, tid
);
1085 process_structure_type (ccp
, tid
);
1088 process_enum_type (ccp
, tid
);
1090 case CTF_K_FUNCTION
:
1091 type
= read_func_kind_type (ccp
, tid
);
1092 new_symbol (ccp
, type
, tid
);
1096 process_base_type (ccp
, tid
);
1099 new_symbol (ccp
, read_type_record (ccp
, tid
), tid
);
1102 type
= read_const_type (ccp
, tid
, btid
);
1103 new_symbol (ccp
, type
, tid
);
1105 case CTF_K_VOLATILE
:
1106 type
= read_volatile_type (ccp
, tid
, btid
);
1107 new_symbol (ccp
, type
, tid
);
1109 case CTF_K_RESTRICT
:
1110 type
= read_restrict_type (ccp
, tid
, btid
);
1111 new_symbol (ccp
, type
, tid
);
1114 type
= read_pointer_type (ccp
, tid
, btid
);
1115 new_symbol (ccp
, type
, tid
);
1118 type
= read_array_type (ccp
, tid
);
1119 new_symbol (ccp
, type
, tid
);
1130 /* Callback to add variable NAME with TID to the symbol table. */
1133 ctf_add_var_cb (const char *name
, ctf_id_t id
, void *arg
)
1135 struct ctf_context
*ccp
= (struct ctf_context
*) arg
;
1136 struct symbol
*sym
= nullptr;
1140 type
= get_tid_type (ccp
->of
, id
);
1142 kind
= ctf_type_kind (ccp
->fp
, id
);
1145 case CTF_K_FUNCTION
:
1146 if (name
!= nullptr && strcmp (name
, "main") == 0)
1147 set_objfile_main_name (ccp
->of
, name
, language_c
);
1151 case CTF_K_VOLATILE
:
1152 case CTF_K_RESTRICT
:
1157 if (type
!= nullptr)
1159 sym
= new_symbol (ccp
, type
, id
);
1161 sym
->compute_and_set_names (name
, false, ccp
->of
->per_bfd
);
1167 if (type
== nullptr)
1169 complaint (_("ctf_add_var_cb: %s has NO type (%ld)"), name
, id
);
1170 type
= objfile_type (ccp
->of
)->builtin_error
;
1172 sym
= new (&ccp
->of
->objfile_obstack
) symbol
;
1173 OBJSTAT (ccp
->of
, n_syms
++);
1174 sym
->set_type (type
);
1175 sym
->set_domain (VAR_DOMAIN
);
1176 sym
->set_aclass_index (LOC_OPTIMIZED_OUT
);
1177 sym
->compute_and_set_names (name
, false, ccp
->of
->per_bfd
);
1178 add_symbol_to_list (sym
, ccp
->builder
->get_file_symbols ());
1181 complaint (_("ctf_add_var_cb: kind unsupported (%d)"), kind
);
1186 set_symbol_address (ccp
->of
, sym
, name
);
1191 /* Add entries in either data objects or function info section, controlled
1195 add_stt_entries (struct ctf_context
*ccp
, int functions
)
1197 ctf_next_t
*i
= nullptr;
1200 struct symbol
*sym
= nullptr;
1203 while ((tid
= ctf_symbol_next (ccp
->fp
, &i
, &tname
, functions
)) != CTF_ERR
)
1205 type
= get_tid_type (ccp
->of
, tid
);
1206 if (type
== nullptr)
1208 sym
= new (&ccp
->of
->objfile_obstack
) symbol
;
1209 OBJSTAT (ccp
->of
, n_syms
++);
1210 sym
->set_type (type
);
1211 sym
->set_domain (VAR_DOMAIN
);
1212 sym
->set_aclass_index (LOC_STATIC
);
1213 sym
->compute_and_set_names (tname
, false, ccp
->of
->per_bfd
);
1214 add_symbol_to_list (sym
, ccp
->builder
->get_global_symbols ());
1215 set_symbol_address (ccp
->of
, sym
, tname
);
1219 /* Add entries in data objects section. */
1222 add_stt_obj (struct ctf_context
*ccp
)
1224 add_stt_entries (ccp
, 0);
1227 /* Add entries in function info section. */
1230 add_stt_func (struct ctf_context
*ccp
)
1232 add_stt_entries (ccp
, 1);
1235 /* Get text segment base for OBJFILE, TSIZE contains the segment size. */
1238 get_objfile_text_range (struct objfile
*of
, int *tsize
)
1240 bfd
*abfd
= of
->obfd
.get ();
1241 const asection
*codes
;
1243 codes
= bfd_get_section_by_name (abfd
, ".text");
1244 *tsize
= codes
? bfd_section_size (codes
) : 0;
1245 return of
->text_section_offset ();
1248 /* Start a symtab for OBJFILE in CTF format. */
1251 ctf_start_compunit_symtab (ctf_psymtab
*pst
,
1252 struct objfile
*of
, CORE_ADDR text_offset
)
1254 struct ctf_context
*ccp
;
1256 ccp
= &pst
->context
;
1257 ccp
->builder
= new buildsym_compunit
1258 (of
, pst
->filename
, nullptr,
1259 language_c
, text_offset
);
1260 ccp
->builder
->record_debugformat ("ctf");
1263 /* Finish reading symbol/type definitions in CTF format.
1264 END_ADDR is the end address of the file's text. */
1266 static struct compunit_symtab
*
1267 ctf_end_compunit_symtab (ctf_psymtab
*pst
,
1270 struct ctf_context
*ccp
;
1272 ccp
= &pst
->context
;
1273 struct compunit_symtab
*result
1274 = ccp
->builder
->end_compunit_symtab (end_addr
);
1275 delete ccp
->builder
;
1276 ccp
->builder
= nullptr;
1280 /* Add all members of an enum with type TID to partial symbol table. */
1283 ctf_psymtab_add_enums (struct ctf_context
*ccp
, ctf_id_t tid
)
1287 ctf_next_t
*i
= nullptr;
1289 while ((ename
= ctf_enum_next (ccp
->fp
, tid
, &i
, &val
)) != nullptr)
1291 ccp
->pst
->add_psymbol (ename
, true,
1292 VAR_DOMAIN
, LOC_CONST
, -1,
1293 psymbol_placement::GLOBAL
,
1294 0, language_c
, ccp
->partial_symtabs
, ccp
->of
);
1296 if (ctf_errno (ccp
->fp
) != ECTF_NEXT_END
)
1297 complaint (_("ctf_enum_next ctf_psymtab_add_enums failed - %s"),
1298 ctf_errmsg (ctf_errno (ccp
->fp
)));
1301 /* Add entries in either data objects or function info section, controlled
1302 by FUNCTIONS, to psymtab. */
1305 ctf_psymtab_add_stt_entries (ctf_dict_t
*cfp
, ctf_psymtab
*pst
,
1306 struct objfile
*of
, int functions
)
1308 ctf_next_t
*i
= nullptr;
1312 while ((tid
= ctf_symbol_next (cfp
, &i
, &tname
, functions
)) != CTF_ERR
)
1314 uint32_t kind
= ctf_type_kind (cfp
, tid
);
1315 address_class aclass
;
1316 domain_enum tdomain
;
1322 tdomain
= STRUCT_DOMAIN
;
1325 tdomain
= VAR_DOMAIN
;
1329 if (kind
== CTF_K_FUNCTION
)
1330 aclass
= LOC_STATIC
;
1331 else if (kind
== CTF_K_CONST
)
1334 aclass
= LOC_TYPEDEF
;
1336 pst
->add_psymbol (tname
, true,
1337 tdomain
, aclass
, -1,
1338 psymbol_placement::GLOBAL
,
1339 0, language_c
, pst
->context
.partial_symtabs
, of
);
1343 /* Add entries in data objects section to psymtab. */
1346 ctf_psymtab_add_stt_obj (ctf_dict_t
*cfp
, ctf_psymtab
*pst
,
1349 ctf_psymtab_add_stt_entries (cfp
, pst
, of
, 0);
1352 /* Add entries in function info section to psymtab. */
1355 ctf_psymtab_add_stt_func (ctf_dict_t
*cfp
, ctf_psymtab
*pst
,
1358 ctf_psymtab_add_stt_entries (cfp
, pst
, of
, 1);
1361 /* Read in full symbols for PST, and anything it depends on. */
1364 ctf_psymtab::expand_psymtab (struct objfile
*objfile
)
1366 struct ctf_context
*ccp
;
1368 gdb_assert (!readin
);
1372 /* Iterate over entries in data types section. */
1373 if (ctf_type_iter (ccp
->fp
, ctf_add_type_cb
, ccp
) == CTF_ERR
)
1374 complaint (_("ctf_type_iter psymtab_to_symtab failed - %s"),
1375 ctf_errmsg (ctf_errno (ccp
->fp
)));
1378 /* Iterate over entries in variable info section. */
1379 if (ctf_variable_iter (ccp
->fp
, ctf_add_var_cb
, ccp
) == CTF_ERR
)
1380 complaint (_("ctf_variable_iter psymtab_to_symtab failed - %s"),
1381 ctf_errmsg (ctf_errno (ccp
->fp
)));
1383 /* Add entries in data objects and function info sections. */
1390 /* Expand partial symbol table PST into a full symbol table.
1394 ctf_psymtab::read_symtab (struct objfile
*objfile
)
1397 warning (_("bug: psymtab for %s is already read in."), filename
);
1402 gdb_printf (_("Reading in CTF data for %s..."), filename
);
1403 gdb_flush (gdb_stdout
);
1406 /* Start a symtab. */
1407 CORE_ADDR offset
; /* Start of text segment. */
1410 offset
= get_objfile_text_range (objfile
, &tsize
);
1411 ctf_start_compunit_symtab (this, objfile
, offset
);
1412 expand_psymtab (objfile
);
1414 set_text_low (offset
);
1415 set_text_high (offset
+ tsize
);
1416 compunit_symtab
= ctf_end_compunit_symtab (this, offset
+ tsize
);
1418 /* Finish up the debug error message. */
1420 gdb_printf (_("done.\n"));
1424 /* Allocate a new partial_symtab NAME.
1426 Each source file that has not been fully read in is represented by
1427 a partial_symtab. This contains the information on where in the
1428 executable the debugging symbols for a specific file are, and a
1429 list of names of global symbols which are located in this file.
1430 They are all chained on partial symtab lists.
1432 Even after the source file has been read into a symtab, the
1433 partial_symtab remains around. They are allocated on an obstack,
1436 static ctf_psymtab
*
1437 create_partial_symtab (const char *name
,
1440 psymtab_storage
*partial_symtabs
,
1441 struct objfile
*objfile
)
1445 pst
= new ctf_psymtab (name
, partial_symtabs
, objfile
->per_bfd
, 0);
1447 pst
->context
.arc
= arc
;
1448 pst
->context
.fp
= cfp
;
1449 pst
->context
.of
= objfile
;
1450 pst
->context
.partial_symtabs
= partial_symtabs
;
1451 pst
->context
.pst
= pst
;
1452 pst
->context
.builder
= nullptr;
1457 /* Callback to add type TID to partial symbol table. */
1460 ctf_psymtab_type_cb (ctf_id_t tid
, void *arg
)
1462 struct ctf_context
*ccp
;
1466 ccp
= (struct ctf_context
*) arg
;
1468 domain_enum domain
= UNDEF_DOMAIN
;
1469 enum address_class aclass
= LOC_UNDEF
;
1470 kind
= ctf_type_kind (ccp
->fp
, tid
);
1474 ctf_psymtab_add_enums (ccp
, tid
);
1478 domain
= STRUCT_DOMAIN
;
1479 aclass
= LOC_TYPEDEF
;
1481 case CTF_K_FUNCTION
:
1483 domain
= VAR_DOMAIN
;
1484 aclass
= LOC_STATIC
;
1485 section
= SECT_OFF_TEXT (ccp
->of
);
1488 domain
= VAR_DOMAIN
;
1489 aclass
= LOC_STATIC
;
1493 case CTF_K_VOLATILE
:
1494 case CTF_K_RESTRICT
:
1495 domain
= VAR_DOMAIN
;
1496 aclass
= LOC_TYPEDEF
;
1500 domain
= VAR_DOMAIN
;
1501 aclass
= LOC_TYPEDEF
;
1508 const char *name
= ctf_type_name_raw (ccp
->fp
, tid
);
1509 if (name
== nullptr || strlen (name
) == 0)
1512 ccp
->pst
->add_psymbol (name
, false,
1513 domain
, aclass
, section
,
1514 psymbol_placement::STATIC
,
1515 0, language_c
, ccp
->partial_symtabs
, ccp
->of
);
1520 /* Callback to add variable NAME with ID to partial symbol table. */
1523 ctf_psymtab_var_cb (const char *name
, ctf_id_t id
, void *arg
)
1525 struct ctf_context
*ccp
= (struct ctf_context
*) arg
;
1527 ccp
->pst
->add_psymbol (name
, true,
1528 VAR_DOMAIN
, LOC_STATIC
, -1,
1529 psymbol_placement::GLOBAL
,
1530 0, language_c
, ccp
->partial_symtabs
, ccp
->of
);
1534 /* Setup partial_symtab's describing each source file for which
1535 debugging information is available. */
1538 scan_partial_symbols (ctf_dict_t
*cfp
, psymtab_storage
*partial_symtabs
,
1539 struct ctf_per_tu_data
*tup
, const char *fname
)
1541 struct objfile
*of
= tup
->of
;
1542 bool isparent
= false;
1544 if (strcmp (fname
, ".ctf") == 0)
1546 fname
= bfd_get_filename (of
->obfd
.get ());
1550 ctf_psymtab
*pst
= create_partial_symtab (fname
, tup
->arc
, cfp
,
1551 partial_symtabs
, of
);
1553 struct ctf_context
*ccx
= &pst
->context
;
1554 if (isparent
== false)
1557 if (ctf_type_iter (cfp
, ctf_psymtab_type_cb
, ccx
) == CTF_ERR
)
1558 complaint (_("ctf_type_iter scan_partial_symbols failed - %s"),
1559 ctf_errmsg (ctf_errno (cfp
)));
1561 if (ctf_variable_iter (cfp
, ctf_psymtab_var_cb
, ccx
) == CTF_ERR
)
1562 complaint (_("ctf_variable_iter scan_partial_symbols failed - %s"),
1563 ctf_errmsg (ctf_errno (cfp
)));
1565 /* Scan CTF object and function sections which correspond to each
1566 STT_FUNC or STT_OBJECT entry in the symbol table,
1567 pick up what init_symtab has done. */
1568 ctf_psymtab_add_stt_obj (cfp
, pst
, of
);
1569 ctf_psymtab_add_stt_func (cfp
, pst
, of
);
1574 /* Callback to build the psymtab for archive member NAME. */
1577 build_ctf_archive_member (ctf_dict_t
*ctf
, const char *name
, void *arg
)
1579 struct ctf_per_tu_data
*tup
= (struct ctf_per_tu_data
*) arg
;
1580 ctf_dict_t
*parent
= tup
->fp
;
1582 if (strcmp (name
, ".ctf") != 0)
1583 ctf_import (ctf
, parent
);
1587 gdb_printf (_("Scanning archive member %s..."), name
);
1588 gdb_flush (gdb_stdout
);
1591 psymtab_storage
*pss
= tup
->psf
->get_partial_symtabs ().get ();
1592 scan_partial_symbols (ctf
, pss
, tup
, name
);
1597 /* Read CTF debugging information from a BFD section. This is
1598 called from elfread.c. It does a quick pass through the
1599 .ctf section to set up the partial symbol table. */
1602 elfctf_build_psymtabs (struct objfile
*of
)
1604 struct ctf_per_tu_data pcu
;
1605 bfd
*abfd
= of
->obfd
.get ();
1608 ctf_archive_t
*arc
= ctf_bfdopen (abfd
, &err
);
1610 error (_("ctf_bfdopen failed on %s - %s"),
1611 bfd_get_filename (abfd
), ctf_errmsg (err
));
1613 ctf_dict_t
*fp
= ctf_dict_open (arc
, NULL
, &err
);
1615 error (_("ctf_dict_open failed on %s - %s"),
1616 bfd_get_filename (abfd
), ctf_errmsg (err
));
1617 ctf_dict_key
.emplace (of
, fp
);
1623 psymbol_functions
*psf
= new psymbol_functions ();
1624 of
->qf
.emplace_front (psf
);
1627 if (ctf_archive_iter (arc
, build_ctf_archive_member
, &pcu
) < 0)
1628 error (_("ctf_archive_iter failed in input file %s: - %s"),
1629 bfd_get_filename (abfd
), ctf_errmsg (err
));
1635 elfctf_build_psymtabs (struct objfile
*of
)
1637 /* Nothing to do if CTF is disabled. */
1640 #endif /* ENABLE_LIBCTF */