1 /* Generate CTF types and objects from the GCC DWARF.
2 Copyright (C) 2021-2023 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
24 #include "dwarf2out.h"
25 #include "dwarf2out.h"
27 #include "dwarf2ctf.h"
30 /* Forward declarations for some routines defined in this file. */
33 gen_ctf_type (ctf_container_ref
, dw_die_ref
);
35 /* All the DIE structures we handle come from the DWARF information
36 generated by GCC. However, there are three situations where we need
37 to create our own created DIE structures because GCC doesn't
40 The DWARF spec suggests using a DIE with DW_TAG_unspecified_type
41 and name "void" in order to denote the void type. But GCC doesn't
42 follow this advice. Still we need a DIE to act as a key for void
43 types, we use ctf_void_die.
45 Also, if a subrange type corresponding to an array index does not
46 specify a type then we assume it is `int'.
48 Finally, for types unrepresentable in CTF, we need a DIE to anchor
49 them to a CTF type of kind unknown.
51 The variables below are initialized in ctf_debug_init and hold
52 references to the proper DIEs. */
54 static GTY (()) dw_die_ref ctf_void_die
;
55 static GTY (()) dw_die_ref ctf_array_index_die
;
56 static GTY (()) dw_die_ref ctf_unknown_die
;
58 /* Some DIEs have a type description attribute, stored in a DW_AT_type
59 attribute. However, GCC generates no attribute to signify a `void'
62 This can happen in many contexts (return type of a function,
63 pointed or qualified type, etc) so we use the `ctf_get_AT_type'
64 function below abstracts this. */
67 ctf_get_AT_type (dw_die_ref die
)
69 dw_die_ref type_die
= get_AT_ref (die
, DW_AT_type
);
70 return (type_die
? type_die
: ctf_void_die
);
73 /* Some data member DIEs have location specified as a DWARF expression
74 (specifically in DWARF2). Luckily, the expression is a simple
75 DW_OP_plus_uconst with one operand set to zero.
77 Sometimes the data member location may also be negative. In yet some other
78 cases (specifically union data members), the data member location is
79 non-existent. Handle all these scenarios here to abstract this. */
82 ctf_get_AT_data_member_location (dw_die_ref die
)
84 HOST_WIDE_INT field_location
= 0;
87 /* The field location (in bits) can be determined from
88 either a DW_AT_data_member_location attribute or a
89 DW_AT_data_bit_offset attribute. */
90 if (get_AT (die
, DW_AT_data_bit_offset
))
91 field_location
= get_AT_unsigned (die
, DW_AT_data_bit_offset
);
94 attr
= get_AT (die
, DW_AT_data_member_location
);
95 if (attr
&& AT_class (attr
) == dw_val_class_loc
)
97 dw_loc_descr_ref descr
= AT_loc (attr
);
98 /* Operand 2 must be zero; the structure is assumed to be on the
100 gcc_assert (!descr
->dw_loc_oprnd2
.v
.val_unsigned
);
101 gcc_assert (descr
->dw_loc_oprnd2
.val_class
102 == dw_val_class_unsigned_const
);
103 field_location
= descr
->dw_loc_oprnd1
.v
.val_unsigned
* 8;
107 attr
= get_AT (die
, DW_AT_data_member_location
);
108 if (attr
&& AT_class (attr
) == dw_val_class_const
)
109 field_location
= AT_int (attr
) * 8;
111 field_location
= (get_AT_unsigned (die
,
112 DW_AT_data_member_location
)
117 return field_location
;
120 /* CTF Types' and CTF Variables' Location Information. CTF section does not
121 emit location information, this is provided for BTF CO-RE use-cases. These
122 functions fetch information from DWARF Die directly, as such the location
123 information is not buffered in the CTF container. */
126 ctf_get_die_loc_file (dw_die_ref die
)
131 struct dwarf_file_data
* file
;
132 file
= get_AT_file (die
, DW_AT_decl_file
);
136 return file
->filename
;
140 ctf_get_die_loc_line (dw_die_ref die
)
145 return get_AT_unsigned (die
, DW_AT_decl_line
);
149 ctf_get_die_loc_col (dw_die_ref die
)
154 return get_AT_unsigned (die
, DW_AT_decl_column
);
157 /* Generate CTF for the void type. */
160 gen_ctf_void_type (ctf_container_ref ctfc
)
162 ctf_encoding_t ctf_encoding
= {0, 0, 0};
164 /* In CTF the void type is encoded as a 0-byte signed integer
167 ctf_encoding
.cte_bits
= 0;
168 ctf_encoding
.cte_format
= CTF_INT_SIGNED
;
170 gcc_assert (ctf_void_die
!= NULL
);
171 return ctf_add_integer (ctfc
, CTF_ADD_ROOT
, "void",
172 &ctf_encoding
, ctf_void_die
);
175 /* Generate CTF type of unknown kind. */
178 gen_ctf_unknown_type (ctf_container_ref ctfc
)
180 ctf_id_t unknown_type_id
;
182 /* In CTF, the unknown type is encoded as a 0 byte sized type with kind
183 CTF_K_UNKNOWN. Create an encoding object merely to reuse the underlying
184 ctf_add_encoded interface; the CTF encoding object is not 'used' any more
185 than just the generation of size from. */
186 ctf_encoding_t ctf_encoding
= {0, 0, 0};
188 gcc_assert (ctf_unknown_die
!= NULL
);
189 /* Type de-duplication. */
190 if (!ctf_type_exists (ctfc
, ctf_unknown_die
, &unknown_type_id
))
191 unknown_type_id
= ctf_add_unknown (ctfc
, CTF_ADD_ROOT
, "unknown",
192 &ctf_encoding
, ctf_unknown_die
);
194 return unknown_type_id
;
197 /* Sizes of entities can be given in bytes or bits. This function
198 abstracts this by returning the size in bits of the given entity.
199 If no DW_AT_byte_size nor DW_AT_bit_size are defined, this function
203 ctf_die_bitsize (dw_die_ref die
)
205 dw_attr_node
*attr_byte_size
= get_AT (die
, DW_AT_byte_size
);
206 dw_attr_node
*attr_bit_size
= get_AT (die
, DW_AT_bit_size
);
209 return AT_unsigned (attr_bit_size
);
210 else if (attr_byte_size
)
211 return (AT_unsigned (attr_byte_size
) * 8);
216 /* Generate CTF for base type (integer, boolean, real, fixed point and complex).
217 Important: the caller of this API must make sure that duplicate types are
221 gen_ctf_base_type (ctf_container_ref ctfc
, dw_die_ref type
)
223 ctf_id_t type_id
= CTF_NULL_TYPEID
;
225 ctf_encoding_t ctf_encoding
= {0, 0, 0};
227 unsigned int encoding
= get_AT_unsigned (type
, DW_AT_encoding
);
228 unsigned int bit_size
= ctf_die_bitsize (type
);
229 const char * name_string
= get_AT_string (type
, DW_AT_name
);
235 ctf_encoding
.cte_format
= CTF_INT_SIGNED
;
236 ctf_encoding
.cte_bits
= 0;
238 gcc_assert (name_string
);
239 type_id
= ctf_add_integer (ctfc
, CTF_ADD_ROOT
, name_string
,
240 &ctf_encoding
, type
);
245 ctf_encoding
.cte_format
= CTF_INT_BOOL
;
246 ctf_encoding
.cte_bits
= bit_size
;
248 gcc_assert (name_string
);
249 type_id
= ctf_add_integer (ctfc
, CTF_ADD_ROOT
, name_string
,
250 &ctf_encoding
, type
);
254 unsigned int float_bit_size
255 = tree_to_uhwi (TYPE_SIZE (float_type_node
));
256 unsigned int double_bit_size
257 = tree_to_uhwi (TYPE_SIZE (double_type_node
));
258 unsigned int long_double_bit_size
259 = tree_to_uhwi (TYPE_SIZE (long_double_type_node
));
261 if (bit_size
== float_bit_size
)
262 ctf_encoding
.cte_format
= CTF_FP_SINGLE
;
263 else if (bit_size
== double_bit_size
)
264 ctf_encoding
.cte_format
= CTF_FP_DOUBLE
;
265 else if (bit_size
== long_double_bit_size
)
266 ctf_encoding
.cte_format
= CTF_FP_LDOUBLE
;
268 /* CTF does not have representation for other types. Skip them. */
271 ctf_encoding
.cte_bits
= bit_size
;
272 type_id
= ctf_add_float (ctfc
, CTF_ADD_ROOT
, name_string
,
273 &ctf_encoding
, type
);
277 case DW_ATE_signed_char
:
279 case DW_ATE_unsigned_char
:
283 case DW_ATE_unsigned
:
285 if (encoding
== DW_ATE_signed_char
286 || encoding
== DW_ATE_unsigned_char
)
287 ctf_encoding
.cte_format
|= CTF_INT_CHAR
;
289 if (encoding
== DW_ATE_signed
290 || encoding
== DW_ATE_signed_char
)
291 ctf_encoding
.cte_format
|= CTF_INT_SIGNED
;
293 ctf_encoding
.cte_bits
= bit_size
;
294 type_id
= ctf_add_integer (ctfc
, CTF_ADD_ROOT
, name_string
,
295 &ctf_encoding
, type
);
298 case DW_ATE_complex_float
:
300 unsigned int float_bit_size
301 = tree_to_uhwi (TYPE_SIZE (float_type_node
));
302 unsigned int double_bit_size
303 = tree_to_uhwi (TYPE_SIZE (double_type_node
));
304 unsigned int long_double_bit_size
305 = tree_to_uhwi (TYPE_SIZE (long_double_type_node
));
307 if (bit_size
== float_bit_size
* 2)
308 ctf_encoding
.cte_format
= CTF_FP_CPLX
;
309 else if (bit_size
== double_bit_size
* 2)
310 ctf_encoding
.cte_format
= CTF_FP_DCPLX
;
311 else if (bit_size
== long_double_bit_size
* 2)
312 ctf_encoding
.cte_format
= CTF_FP_LDCPLX
;
314 /* CTF does not have representation for other types. Skip them. */
317 ctf_encoding
.cte_bits
= bit_size
;
318 type_id
= ctf_add_float (ctfc
, CTF_ADD_ROOT
, name_string
,
319 &ctf_encoding
, type
);
330 /* Generate CTF for a pointer type. */
333 gen_ctf_pointer_type (ctf_container_ref ctfc
, dw_die_ref ptr_type
)
335 ctf_id_t type_id
= CTF_NULL_TYPEID
;
336 ctf_id_t ptr_type_id
= CTF_NULL_TYPEID
;
337 dw_die_ref pointed_type_die
= ctf_get_AT_type (ptr_type
);
339 type_id
= gen_ctf_type (ctfc
, pointed_type_die
);
341 /* Type de-duplication.
342 Consult the ctfc_types hash again before adding the CTF pointer type
343 because there can be cases where a pointer type may have been added by
344 the gen_ctf_type call above. */
345 if (ctf_type_exists (ctfc
, ptr_type
, &ptr_type_id
))
348 ptr_type_id
= ctf_add_pointer (ctfc
, CTF_ADD_ROOT
, type_id
, ptr_type
);
352 /* Generate CTF for an array type. */
355 gen_ctf_array_type (ctf_container_ref ctfc
, dw_die_ref array_type
)
358 ctf_id_t array_elems_type_id
= CTF_NULL_TYPEID
;
360 int vector_type_p
= get_AT_flag (array_type
, DW_AT_GNU_vector
);
362 return array_elems_type_id
;
364 dw_die_ref array_elems_type
= ctf_get_AT_type (array_type
);
366 /* First, register the type of the array elements if needed. */
367 array_elems_type_id
= gen_ctf_type (ctfc
, array_elems_type
);
369 /* DWARF array types pretend C supports multi-dimensional arrays.
370 So for the type int[N][M], the array type DIE contains two
371 subrange_type children, the first with upper bound N-1 and the
372 second with upper bound M-1.
374 CTF, on the other hand, just encodes each array type in its own
375 array type CTF struct. Therefore we have to iterate on the
376 children and create all the needed types. */
378 c
= dw_get_die_child (array_type
);
383 dw_die_ref array_index_type
;
384 uint32_t array_num_elements
;
386 c
= dw_get_die_sib (c
);
388 if (dw_get_die_tag (c
) == DW_TAG_subrange_type
)
390 dw_attr_node
*upper_bound_at
;
392 array_index_type
= ctf_get_AT_type (c
);
394 /* When DW_AT_upper_bound is used to specify the size of an
395 array in DWARF, it is usually an unsigned constant
396 specifying the upper bound index of the array. However,
397 for unsized arrays, such as foo[] or bar[0],
398 DW_AT_upper_bound is a signed integer constant
401 upper_bound_at
= get_AT (c
, DW_AT_upper_bound
);
403 && AT_class (upper_bound_at
) == dw_val_class_unsigned_const
)
404 /* This is the upper bound index. */
405 array_num_elements
= get_AT_unsigned (c
, DW_AT_upper_bound
) + 1;
406 else if (get_AT (c
, DW_AT_count
))
407 array_num_elements
= get_AT_unsigned (c
, DW_AT_count
);
410 /* This is a VLA of some kind. */
411 array_num_elements
= 0;
414 else if (dw_get_die_tag (c
) == DW_TAG_enumeration_type
)
416 array_index_type
= 0;
417 array_num_elements
= 0;
424 /* Ok, mount and register the array type. Note how the array
425 type we register here is the type of the elements in
426 subsequent "dimensions", if there are any. */
428 arinfo
.ctr_nelems
= array_num_elements
;
429 if (array_index_type
)
430 arinfo
.ctr_index
= gen_ctf_type (ctfc
, array_index_type
);
432 arinfo
.ctr_index
= gen_ctf_type (ctfc
, ctf_array_index_die
);
434 arinfo
.ctr_contents
= array_elems_type_id
;
435 if (!ctf_type_exists (ctfc
, c
, &array_elems_type_id
))
436 array_elems_type_id
= ctf_add_array (ctfc
, CTF_ADD_ROOT
, &arinfo
,
439 while (c
!= dw_get_die_child (array_type
));
442 /* Type de-duplication.
443 Consult the ctfc_types hash again before adding the CTF array type because
444 there can be cases where an array_type type may have been added by the
445 gen_ctf_type call above. */
446 if (!ctf_type_exists (ctfc
, array_type
, &type_id
))
447 type_id
= ctf_add_array (ctfc
, CTF_ADD_ROOT
, &arinfo
, array_type
);
450 return array_elems_type_id
;
453 /* Generate CTF for a typedef. */
456 gen_ctf_typedef (ctf_container_ref ctfc
, dw_die_ref tdef
)
458 ctf_id_t tdef_type_id
, tid
;
459 const char *tdef_name
= get_AT_string (tdef
, DW_AT_name
);
460 dw_die_ref tdef_type
= ctf_get_AT_type (tdef
);
462 tid
= gen_ctf_type (ctfc
, tdef_type
);
464 /* Type de-duplication.
465 This is necessary because the ctf for the typedef may have been already
466 added due to the gen_ctf_type call above. */
467 if (!ctf_type_exists (ctfc
, tdef
, &tdef_type_id
))
469 tdef_type_id
= ctf_add_typedef (ctfc
, CTF_ADD_ROOT
,
477 /* Generate CTF for a type modifier.
479 If the given DIE contains a valid C modifier (like _Atomic), which is not
480 supported by CTF, then this function skips the modifier die and continues
481 with the underlying type.
483 For all other cases, this function returns a CTF_NULL_TYPEID;
487 gen_ctf_modifier_type (ctf_container_ref ctfc
, dw_die_ref modifier
)
489 uint32_t kind
= CTF_K_MAX
;
490 ctf_id_t modifier_type_id
, qual_type_id
;
491 dw_die_ref qual_type
= ctf_get_AT_type (modifier
);
493 switch (dw_get_die_tag (modifier
))
495 case DW_TAG_const_type
: kind
= CTF_K_CONST
; break;
496 case DW_TAG_volatile_type
: kind
= CTF_K_VOLATILE
; break;
497 case DW_TAG_restrict_type
: kind
= CTF_K_RESTRICT
; break;
498 case DW_TAG_atomic_type
: break;
500 return CTF_NULL_TYPEID
;
503 /* Register the type for which this modifier applies. */
504 qual_type_id
= gen_ctf_type (ctfc
, qual_type
);
506 /* Skip generating a CTF modifier record for _Atomic as there is no
507 representation for it. */
508 if (dw_get_die_tag (modifier
) == DW_TAG_atomic_type
)
511 gcc_assert (kind
!= CTF_K_MAX
);
512 /* Now register the modifier itself. */
513 if (!ctf_type_exists (ctfc
, modifier
, &modifier_type_id
))
514 modifier_type_id
= ctf_add_reftype (ctfc
, CTF_ADD_ROOT
,
518 return modifier_type_id
;
521 /* Generate CTF for a struct type. */
524 gen_ctf_sou_type (ctf_container_ref ctfc
, dw_die_ref sou
, uint32_t kind
)
526 uint32_t bit_size
= ctf_die_bitsize (sou
);
527 int declaration_p
= get_AT_flag (sou
, DW_AT_declaration
);
528 const char *sou_name
= get_AT_string (sou
, DW_AT_name
);
530 ctf_id_t sou_type_id
;
532 /* An incomplete structure or union type is represented in DWARF by
533 a structure or union DIE that does not have a size attribute and
534 that has a DW_AT_declaration attribute. This corresponds to a
535 CTF forward type with kind CTF_K_STRUCT. */
536 if (bit_size
== 0 && declaration_p
)
537 return ctf_add_forward (ctfc
, CTF_ADD_ROOT
,
538 sou_name
, kind
, sou
);
540 /* This is a complete struct or union type. Generate a CTF type for
541 it if it doesn't exist already. */
542 if (!ctf_type_exists (ctfc
, sou
, &sou_type_id
))
543 sou_type_id
= ctf_add_sou (ctfc
, CTF_ADD_ROOT
,
544 sou_name
, kind
, bit_size
/ 8,
547 /* Now process the struct members. */
551 c
= dw_get_die_child (sou
);
555 const char *field_name
;
556 dw_die_ref field_type
;
557 HOST_WIDE_INT field_location
;
558 ctf_id_t field_type_id
;
560 c
= dw_get_die_sib (c
);
562 field_name
= get_AT_string (c
, DW_AT_name
);
563 field_type
= ctf_get_AT_type (c
);
564 field_location
= ctf_get_AT_data_member_location (c
);
566 /* Generate the field type. */
567 field_type_id
= gen_ctf_type (ctfc
, field_type
);
569 /* If this is a bit-field, then wrap the field type
570 generated above with a CTF slice. */
571 if (get_AT (c
, DW_AT_bit_offset
)
572 || get_AT (c
, DW_AT_data_bit_offset
))
575 HOST_WIDE_INT bitpos
= 0;
576 HOST_WIDE_INT bitsize
= ctf_die_bitsize (c
);
577 HOST_WIDE_INT bit_offset
;
579 /* The bit offset is given in bits and it may be
581 attr
= get_AT (c
, DW_AT_bit_offset
);
584 if (AT_class (attr
) == dw_val_class_unsigned_const
)
585 bit_offset
= AT_unsigned (attr
);
587 bit_offset
= AT_int (attr
);
589 if (BYTES_BIG_ENDIAN
)
590 bitpos
= field_location
+ bit_offset
;
593 HOST_WIDE_INT bit_size
;
595 attr
= get_AT (c
, DW_AT_byte_size
);
597 /* Explicit size given in bytes. */
598 bit_size
= AT_unsigned (attr
) * 8;
600 /* Infer the size from the member type. */
601 bit_size
= ctf_die_bitsize (field_type
);
603 bitpos
= (field_location
610 /* In DWARF5 a data_bit_offset attribute is given with
611 the offset of the data from the beginning of the
612 struct. Acknowledge it if present. */
613 attr
= get_AT (c
, DW_AT_data_bit_offset
);
615 bitpos
+= AT_unsigned (attr
);
617 field_type_id
= ctf_add_slice (ctfc
, CTF_ADD_NONROOT
,
619 bitpos
- field_location
,
624 /* Add the field type to the struct or union type. */
625 ctf_add_member_offset (ctfc
, sou
,
630 while (c
!= dw_get_die_child (sou
));
636 /* Generate CTF for a function type. */
639 gen_ctf_function_type (ctf_container_ref ctfc
, dw_die_ref function
,
640 bool from_global_func
)
642 const char *function_name
= get_AT_string (function
, DW_AT_name
);
643 dw_die_ref return_type
= ctf_get_AT_type (function
);
645 ctf_funcinfo_t func_info
;
646 uint32_t num_args
= 0;
647 int linkage
= get_AT_flag (function
, DW_AT_external
);
649 ctf_id_t return_type_id
;
650 ctf_id_t function_type_id
;
652 /* First, add the return type. */
653 return_type_id
= gen_ctf_type (ctfc
, return_type
);
654 func_info
.ctc_return
= return_type_id
;
656 /* Type de-duplication.
657 Consult the ctfc_types hash before adding the CTF function type. */
658 if (ctf_type_exists (ctfc
, function
, &function_type_id
))
659 return function_type_id
;
661 /* Do a first pass on the formals to determine the number of
662 arguments, and whether the function type gets a varargs. */
666 c
= dw_get_die_child (function
);
670 c
= dw_get_die_sib (c
);
672 if (dw_get_die_tag (c
) == DW_TAG_formal_parameter
)
674 else if (dw_get_die_tag (c
) == DW_TAG_unspecified_parameters
)
676 func_info
.ctc_flags
|= CTF_FUNC_VARARG
;
680 while (c
!= dw_get_die_child (function
));
683 /* Note the number of typed arguments _includes_ the vararg. */
684 func_info
.ctc_argc
= num_args
;
686 /* Type de-duplication has already been performed by now. */
687 function_type_id
= ctf_add_function (ctfc
, CTF_ADD_ROOT
,
689 (const ctf_funcinfo_t
*)&func_info
,
694 /* Second pass on formals: generate the CTF types corresponding to
695 them and add them as CTF function args. */
699 const char *arg_name
;
702 c
= dw_get_die_child (function
);
706 c
= dw_get_die_sib (c
);
708 if (dw_get_die_tag (c
) == DW_TAG_unspecified_parameters
)
710 gcc_assert (i
== num_args
- 1);
711 /* Add an argument with type 0 and no name. */
712 ctf_add_function_arg (ctfc
, function
, "", 0);
714 else if (dw_get_die_tag (c
) == DW_TAG_formal_parameter
)
717 arg_name
= get_AT_string (c
, DW_AT_name
);
718 arg_type
= gen_ctf_type (ctfc
, ctf_get_AT_type (c
));
719 /* Add the argument to the existing CTF function type. */
720 ctf_add_function_arg (ctfc
, function
, arg_name
, arg_type
);
723 /* This is a local variable. Ignore. */
726 while (c
!= dw_get_die_child (function
));
729 return function_type_id
;
732 /* Generate CTF for an enumeration type. */
735 gen_ctf_enumeration_type (ctf_container_ref ctfc
, dw_die_ref enumeration
)
737 const char *enum_name
= get_AT_string (enumeration
, DW_AT_name
);
738 unsigned int bit_size
= ctf_die_bitsize (enumeration
);
739 unsigned int signedness
= get_AT_unsigned (enumeration
, DW_AT_encoding
);
740 int declaration_p
= get_AT_flag (enumeration
, DW_AT_declaration
);
742 ctf_id_t enumeration_type_id
;
744 /* If this is an incomplete enum, generate a CTF forward for it and
748 gcc_assert (enum_name
);
749 return ctf_add_forward (ctfc
, CTF_ADD_ROOT
, enum_name
,
750 CTF_K_ENUM
, enumeration
);
753 /* If the size the enumerators is not specified then use the size of
754 the underlying type, which must be a base type. */
757 dw_die_ref type
= ctf_get_AT_type (enumeration
);
758 bit_size
= ctf_die_bitsize (type
);
761 /* Generate a CTF type for the enumeration. */
762 enumeration_type_id
= ctf_add_enum (ctfc
, CTF_ADD_ROOT
,
763 enum_name
, bit_size
/ 8,
764 (signedness
== DW_ATE_unsigned
),
767 /* Process the enumerators. */
771 c
= dw_get_die_child (enumeration
);
775 const char *enumerator_name
;
776 dw_attr_node
*enumerator_value
;
777 HOST_WIDE_INT value_wide_int
;
779 c
= dw_get_die_sib (c
);
781 enumerator_name
= get_AT_string (c
, DW_AT_name
);
782 enumerator_value
= get_AT (c
, DW_AT_const_value
);
784 /* enumerator_value can be either a signed or an unsigned
786 if (AT_class (enumerator_value
) == dw_val_class_unsigned_const
787 || (AT_class (enumerator_value
)
788 == dw_val_class_unsigned_const_implicit
))
789 value_wide_int
= AT_unsigned (enumerator_value
);
791 value_wide_int
= AT_int (enumerator_value
);
793 ctf_add_enumerator (ctfc
, enumeration_type_id
,
794 enumerator_name
, value_wide_int
, enumeration
);
796 while (c
!= dw_get_die_child (enumeration
));
799 return enumeration_type_id
;
802 /* Add a CTF variable record for the given input DWARF DIE. */
805 gen_ctf_variable (ctf_container_ref ctfc
, dw_die_ref die
)
807 const char *var_name
= get_AT_string (die
, DW_AT_name
);
808 dw_die_ref var_type
= ctf_get_AT_type (die
);
809 unsigned int external_vis
= get_AT_flag (die
, DW_AT_external
);
810 ctf_id_t var_type_id
;
812 /* Avoid duplicates. */
813 if (ctf_dvd_lookup (ctfc
, die
))
816 /* Do not generate CTF variable records for non-defining incomplete
817 declarations. Such declarations can be known via the DWARF
818 DW_AT_specification attribute. */
819 if (ctf_dvd_ignore_lookup (ctfc
, die
))
822 /* The value of the DW_AT_specification attribute, if present, is a
823 reference to the debugging information entry representing the
824 non-defining declaration. */
825 dw_die_ref decl
= get_AT_ref (die
, DW_AT_specification
);
827 /* Add the type of the variable. */
828 var_type_id
= gen_ctf_type (ctfc
, var_type
);
830 /* Generate the new CTF variable and update global counter. */
831 (void) ctf_add_variable (ctfc
, var_name
, var_type_id
, die
, external_vis
,
833 /* Skip updating the number of global objects at this time. This is updated
834 later after pre-processing as some CTF variable records although
835 generated now, will not be emitted later. [PR105089]. */
838 /* Add a CTF function record for the given input DWARF DIE. */
841 gen_ctf_function (ctf_container_ref ctfc
, dw_die_ref die
)
843 ctf_id_t function_type_id
;
844 /* Type de-duplication.
845 Consult the ctfc_types hash before adding the CTF function type. */
846 if (ctf_type_exists (ctfc
, die
, &function_type_id
))
849 /* Add the type of the function and update the global functions
850 counter. Note that DWARF encodes function types in both
851 DW_TAG_subroutine_type and DW_TAG_subprogram in exactly the same
853 (void) gen_ctf_function_type (ctfc
, die
, true /* from_global_func */);
854 ctfc
->ctfc_num_global_funcs
+= 1;
857 /* Add CTF type record(s) for the given input DWARF DIE and return its type id.
859 If there is already a CTF type corresponding to the given DIE, then
860 this function returns the type id of the existing type.
862 If the given DIE is not recognized as a type, then this function
863 returns CTF_NULL_TYPEID. */
866 gen_ctf_type (ctf_container_ref ctfc
, dw_die_ref die
)
869 int unrecog_die
= false;
871 if (ctf_type_exists (ctfc
, die
, &type_id
))
874 switch (dw_get_die_tag (die
))
876 case DW_TAG_base_type
:
877 type_id
= gen_ctf_base_type (ctfc
, die
);
879 case DW_TAG_pointer_type
:
880 type_id
= gen_ctf_pointer_type (ctfc
, die
);
883 type_id
= gen_ctf_typedef (ctfc
, die
);
885 case DW_TAG_array_type
:
886 type_id
= gen_ctf_array_type (ctfc
, die
);
888 case DW_TAG_structure_type
:
889 type_id
= gen_ctf_sou_type (ctfc
, die
, CTF_K_STRUCT
);
891 case DW_TAG_union_type
:
892 type_id
= gen_ctf_sou_type (ctfc
, die
, CTF_K_UNION
);
894 case DW_TAG_subroutine_type
:
895 type_id
= gen_ctf_function_type (ctfc
, die
,
896 false /* from_global_func */);
898 case DW_TAG_enumeration_type
:
899 type_id
= gen_ctf_enumeration_type (ctfc
, die
);
901 case DW_TAG_atomic_type
:
903 case DW_TAG_const_type
:
905 case DW_TAG_restrict_type
:
907 case DW_TAG_volatile_type
:
908 type_id
= gen_ctf_modifier_type (ctfc
, die
);
910 case DW_TAG_unspecified_type
:
912 const char *name
= get_AT_string (die
, DW_AT_name
);
914 if (name
&& strcmp (name
, "void") == 0)
915 type_id
= gen_ctf_void_type (ctfc
);
917 type_id
= CTF_NULL_TYPEID
;
921 case DW_TAG_reference_type
:
922 type_id
= CTF_NULL_TYPEID
;
925 /* Unrecognized DIE. */
927 type_id
= CTF_NULL_TYPEID
;
931 /* For all types unrepresented in CTF, use an explicit CTF type of kind
933 if ((type_id
== CTF_NULL_TYPEID
) && (!unrecog_die
))
934 type_id
= gen_ctf_unknown_type (ctfc
);
939 /* Prepare for output and write out the CTF debug information. */
942 ctf_debug_finalize (const char *filename
, bool btf
)
946 btf_output (filename
);
952 /* Emit the collected CTF information. */
953 ctf_output (filename
);
955 /* Reset the CTF state. */
961 ctf_do_die (dw_die_ref die
)
963 ctf_container_ref tu_ctfc
= ctf_get_tu_ctfc ();
965 /* Note how we tell the caller to continue traversing children DIEs
966 if this DIE didn't result in CTF records being added. */
967 if (dw_get_die_tag (die
) == DW_TAG_variable
)
969 gen_ctf_variable (tu_ctfc
, die
);
972 else if (dw_get_die_tag (die
) == DW_TAG_subprogram
)
974 gen_ctf_function (tu_ctfc
, die
);
978 return gen_ctf_type (tu_ctfc
, die
) == CTF_NULL_TYPEID
;
981 /* Initialize CTF subsystem for CTF debug info generation. */
984 ctf_debug_init (void)
986 /* First, initialize the CTF subsystem. */
989 /* Create a couple of DIE structures that we may need. */
990 ctf_void_die
= new_die_raw (DW_TAG_unspecified_type
);
991 add_name_attribute (ctf_void_die
, "void");
993 = base_type_die (integer_type_node
, 0 /* reverse */);
994 add_name_attribute (ctf_array_index_die
, "int");
995 ctf_unknown_die
= new_die_raw (DW_TAG_unspecified_type
);
996 add_name_attribute (ctf_unknown_die
, "unknown");
999 /* Preprocess the CTF debug information after initialization. */
1002 ctf_debug_init_postprocess (bool btf
)
1004 /* Only BTF requires postprocessing right after init. */
1006 btf_init_postprocess ();
1009 /* Early finish CTF/BTF debug info. */
1012 ctf_debug_early_finish (const char * filename
)
1014 /* Emit CTF debug info early always. */
1015 if (ctf_debug_info_level
> CTFINFO_LEVEL_NONE
1016 /* Emit BTF debug info early if CO-RE relocations are not
1018 || (btf_debuginfo_p () && !btf_with_core_debuginfo_p ()))
1019 ctf_debug_finalize (filename
, btf_debuginfo_p ());
1022 /* Finish CTF/BTF debug info emission. */
1025 ctf_debug_finish (const char * filename
)
1027 /* Emit BTF debug info here when CO-RE relocations need to be generated.
1028 BTF with CO-RE relocations needs to be generated when CO-RE is in effect
1029 for the BPF target. */
1030 if (btf_with_core_debuginfo_p ())
1032 gcc_assert (btf_debuginfo_p ());
1033 ctf_debug_finalize (filename
, btf_debuginfo_p ());
1037 #include "gt-dwarf2ctf.h"