The die_get_typename() is to return a C-like type name from DWARF debug
entry and it follows data type if the target entry is a pointer type.
But I found void pointers don't have the type attribte to follow and
then the function returns an error for that case. This results in a
broken type string for void pointer types.
For example, the following type entries are pointer types.
<1><48c>: Abbrev Number: 4 (DW_TAG_pointer_type)
<48d> DW_AT_byte_size : 8
<48d> DW_AT_type : <0x481>
<1><491>: Abbrev Number: 211 (DW_TAG_pointer_type)
<493> DW_AT_byte_size : 8
<1><494>: Abbrev Number: 4 (DW_TAG_pointer_type)
<495> DW_AT_byte_size : 8
<495> DW_AT_type : <0x49e>
The first one at offset 48c and the third one at offset 494 have type
information. Then they are pointer types for the referenced types.
But the second one at offset 491 doesn't have the type attribute.
Cc: Masami Hiramatsu <[email protected]>
Signed-off-by: Namhyung Kim <[email protected]>
---
tools/perf/util/dwarf-aux.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index 2941d88f2199..4849c3bbfd95 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -1090,7 +1090,14 @@ int die_get_typename(Dwarf_Die *vr_die, struct strbuf *buf)
return strbuf_addf(buf, "%s%s", tmp, name ?: "");
}
ret = die_get_typename(&type, buf);
- return ret ? ret : strbuf_addstr(buf, tmp);
+ if (ret < 0) {
+ /* void pointer has no type attribute */
+ if (tag == DW_TAG_pointer_type && ret == -ENOENT)
+ return strbuf_addf(buf, "void*");
+
+ return ret;
+ }
+ return strbuf_addstr(buf, tmp);
}
/**
--
2.42.0.655.g421f12c284-goog
On Wed, 11 Oct 2023 20:50:27 -0700
Namhyung Kim <[email protected]> wrote:
> The die_get_typename() is to return a C-like type name from DWARF debug
> entry and it follows data type if the target entry is a pointer type.
> But I found void pointers don't have the type attribte to follow and
> then the function returns an error for that case. This results in a
> broken type string for void pointer types.
>
> For example, the following type entries are pointer types.
>
> <1><48c>: Abbrev Number: 4 (DW_TAG_pointer_type)
> <48d> DW_AT_byte_size : 8
> <48d> DW_AT_type : <0x481>
> <1><491>: Abbrev Number: 211 (DW_TAG_pointer_type)
> <493> DW_AT_byte_size : 8
> <1><494>: Abbrev Number: 4 (DW_TAG_pointer_type)
> <495> DW_AT_byte_size : 8
> <495> DW_AT_type : <0x49e>
>
> The first one at offset 48c and the third one at offset 494 have type
> information. Then they are pointer types for the referenced types.
> But the second one at offset 491 doesn't have the type attribute.
This looks good to me!
Acked-by: Masami Hiramatsu (Google) <[email protected]>
Thanks!
>
> Cc: Masami Hiramatsu <[email protected]>
> Signed-off-by: Namhyung Kim <[email protected]>
> ---
> tools/perf/util/dwarf-aux.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
> index 2941d88f2199..4849c3bbfd95 100644
> --- a/tools/perf/util/dwarf-aux.c
> +++ b/tools/perf/util/dwarf-aux.c
> @@ -1090,7 +1090,14 @@ int die_get_typename(Dwarf_Die *vr_die, struct strbuf *buf)
> return strbuf_addf(buf, "%s%s", tmp, name ?: "");
> }
> ret = die_get_typename(&type, buf);
> - return ret ? ret : strbuf_addstr(buf, tmp);
> + if (ret < 0) {
> + /* void pointer has no type attribute */
> + if (tag == DW_TAG_pointer_type && ret == -ENOENT)
> + return strbuf_addf(buf, "void*");
> +
> + return ret;
> + }
> + return strbuf_addstr(buf, tmp);
> }
>
> /**
> --
> 2.42.0.655.g421f12c284-goog
>
--
Masami Hiramatsu (Google) <[email protected]>