Skip to content

Commit

Permalink
dwarf2ctf: convert annotation DIEs to CTF types
Browse files Browse the repository at this point in the history
This patch makes the DWARF-to-CTF conversion process aware of the new
DW_TAG_GNU_annotation DIEs. The DIEs are converted to CTF_K_DECL_TAG
types and added to the compilation unit CTF container to be translated
to BTF and output.

gcc/

	* dwarf2ctf.cc (handle_btf_tags): New function.
	(gen_ctf_sou_type): Don't try to create member types for children which
	are not DW_TAG_member. Call handle_btf_tags if appropriate.
	(gen_ctf_function_type): Call handle_btf_tags if appropriate.
	(gen_ctf_variable): Likewise.
	(gen_ctf_type): Likewise.
  • Loading branch information
dafaust authored and ouuleilei-bot committed Jul 11, 2023
1 parent 05f815d commit 61d5638
Showing 1 changed file with 70 additions and 1 deletion.
71 changes: 70 additions & 1 deletion gcc/dwarf2ctf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ along with GCC; see the file COPYING3. If not see
static ctf_id_t
gen_ctf_type (ctf_container_ref, dw_die_ref);

static void
handle_btf_tags (ctf_container_ref, dw_die_ref, ctf_id_t, int);

/* All the DIE structures we handle come from the DWARF information
generated by GCC. However, there are three situations where we need
to create our own created DIE structures because GCC doesn't
Expand Down Expand Up @@ -547,6 +550,7 @@ gen_ctf_sou_type (ctf_container_ref ctfc, dw_die_ref sou, uint32_t kind)
/* Now process the struct members. */
{
dw_die_ref c;
int idx = 0;

c = dw_get_die_child (sou);
if (c)
Expand All @@ -559,6 +563,9 @@ gen_ctf_sou_type (ctf_container_ref ctfc, dw_die_ref sou, uint32_t kind)

c = dw_get_die_sib (c);

if (dw_get_die_tag (c) != DW_TAG_member)
continue;

field_name = get_AT_string (c, DW_AT_name);
field_type = ctf_get_AT_type (c);
field_location = ctf_get_AT_data_member_location (c);
Expand Down Expand Up @@ -626,6 +633,12 @@ gen_ctf_sou_type (ctf_container_ref ctfc, dw_die_ref sou, uint32_t kind)
field_name,
field_type_id,
field_location);

/* Handle BTF tags on the member. */
if (btf_debuginfo_p ())
handle_btf_tags (ctfc, c, sou_type_id, idx);

idx++;
}
while (c != dw_get_die_child (sou));
}
Expand Down Expand Up @@ -718,6 +731,9 @@ gen_ctf_function_type (ctf_container_ref ctfc, dw_die_ref function,
arg_type = gen_ctf_type (ctfc, ctf_get_AT_type (c));
/* Add the argument to the existing CTF function type. */
ctf_add_function_arg (ctfc, function, arg_name, arg_type);

if (btf_debuginfo_p ())
handle_btf_tags (ctfc, c, function_type_id, i - 1);
}
else
/* This is a local variable. Ignore. */
Expand Down Expand Up @@ -833,6 +849,11 @@ gen_ctf_variable (ctf_container_ref ctfc, dw_die_ref die)
/* Skip updating the number of global objects at this time. This is updated
later after pre-processing as some CTF variable records although
generated now, will not be emitted later. [PR105089]. */

/* Handle any BTF tags on the variable. */
if (btf_debuginfo_p ())
handle_btf_tags (ctfc, die, CTF_NULL_TYPEID, -1);

}

/* Add a CTF function record for the given input DWARF DIE. */
Expand All @@ -850,8 +871,13 @@ gen_ctf_function (ctf_container_ref ctfc, dw_die_ref die)
counter. Note that DWARF encodes function types in both
DW_TAG_subroutine_type and DW_TAG_subprogram in exactly the same
way. */
(void) gen_ctf_function_type (ctfc, die, true /* from_global_func */);
function_type_id
= gen_ctf_function_type (ctfc, die, true /* from_global_func */);
ctfc->ctfc_num_global_funcs += 1;

/* Handle any BTF tags on the function itself. */
if (btf_debuginfo_p ())
handle_btf_tags (ctfc, die, function_type_id, -1);
}

/* Add CTF type record(s) for the given input DWARF DIE and return its type id.
Expand Down Expand Up @@ -928,6 +954,10 @@ gen_ctf_type (ctf_container_ref ctfc, dw_die_ref die)
break;
}

/* Handle any BTF tags on the type. */
if (btf_debuginfo_p () && !unrecog_die)
handle_btf_tags (ctfc, die, type_id, -1);

/* For all types unrepresented in CTF, use an explicit CTF type of kind
CTF_K_UNKNOWN. */
if ((type_id == CTF_NULL_TYPEID) && (!unrecog_die))
Expand All @@ -936,6 +966,45 @@ gen_ctf_type (ctf_container_ref ctfc, dw_die_ref die)
return type_id;
}

/* BTF support. Handle any BTF tags attached to a given DIE, and generate
intermediate CTF types for them. */

static void
handle_btf_tags (ctf_container_ref ctfc, dw_die_ref die, ctf_id_t type_id,
int component_idx)
{
dw_die_ref c;
const char * name = NULL;
const char * value = NULL;

c = dw_get_die_child (die);
if (c)
do
{
if (dw_get_die_tag (c) != DW_TAG_GNU_annotation)
{
c = dw_get_die_sib (c);
continue;
}

name = get_AT_string (c, DW_AT_name);

/* BTF decl tags add an arbitrary annotation to the thing they
annotate. The annotated thing could be a variable or a type. */
if (strcmp (name, "btf_decl_tag") == 0)
{
value = get_AT_string (c, DW_AT_const_value);
if (!ctf_type_exists (ctfc, c, NULL))
(void) ctf_add_reftype (ctfc, CTF_ADD_ROOT, value,
type_id, CTFC_INT_K_DECL_TAG, c);
ctf_dtdef_ref dtd = ctf_dtd_lookup (ctfc, c);
dtd->dtd_u.dtu_btfnote.component_idx = component_idx;
}
c = dw_get_die_sib (c);
}
while (c != dw_get_die_child (die));
}

/* Prepare for output and write out the CTF debug information. */

static void
Expand Down

0 comments on commit 61d5638

Please sign in to comment.