Re: [PATCH dwarves v2 1/5] fprintf: Correct names for types with btf_type_tag attribute

Arnaldo Carvalho de Melo
2023-03-27T11:46:21Z

Em Wed, Mar 15, 2023 at 01:04:13AM +0200, Eduard Zingerman escreveu:
> The following example contains a structure field annotated with
> btf_type_tag attribute:
>
> #define __tag1 __attribute__((btf_type_tag("tag1")))
>
> struct st {
> int __tag1 *a;
> } g;
>
> It is not printed correctly by `pahole -F dwarf` command:
>
> $ clang -g -c test.c -o test.o
> pahole -F dwarf test.o
> struct st {
> tag1 * a; /* 0 8 */
> ...
> };
>
> Note the type for variable `a`: `tag1` is printed instead of `int`.
> This commit teaches `type__fprintf()` and `__tag_name()` logic to skip
> `DW_TAG_LLVM_annotation` objects that are used to encode type tags.

I'm applying this now to make progress on this front, but longer term we
should printf it too, as we want the output to match the original source
code as much as possible from the type information.

- Arnaldo

> Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
> ---
> dwarves_fprintf.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/dwarves_fprintf.c b/dwarves_fprintf.c
> index e8399e7..1e6147a 100644
> --- a/dwarves_fprintf.c
> +++ b/dwarves_fprintf.c
> @@ -572,6 +572,7 @@ static const char *__tag__name(const struct tag *tag, const struct cu *cu,
> case DW_TAG_restrict_type:
> case DW_TAG_atomic_type:
> case DW_TAG_unspecified_type:
> + case DW_TAG_LLVM_annotation:
> type = cu__type(cu, tag->type);
> if (type == NULL && tag->type != 0)
> tag__id_not_found_snprintf(bf, len, tag->type);
> @@ -786,6 +787,10 @@ next_type:
> n = tag__has_type_loop(type, ptype, NULL, 0, fp);
> if (n)
> return printed + n;
> + if (ptype->tag == DW_TAG_LLVM_annotation) {
> + type = ptype;
> + goto next_type;
> + }
> if (ptype->tag == DW_TAG_subroutine_type) {
> printed += ftype__fprintf(tag__ftype(ptype),
> cu, name, 0, 1,
> @@ -880,6 +885,14 @@ print_modifier: {
> else
> printed += enumeration__fprintf(type, &tconf, fp);
> break;
> + case DW_TAG_LLVM_annotation: {
> + struct tag *ttype = cu__type(cu, type->type);
> + if (ttype) {
> + type = ttype;
> + goto next_type;
> + }
> + goto out_type_not_found;
> + }
> }
> out:
> if (type_expanded)
> --
> 2.39.1
>

--

- Arnaldo