From: Namhyung Kim <namhyung@kernel.org>
To: Zecheng Li <zecheng@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
"Liang, Kan" <kan.liang@linux.intel.com>,
Masami Hiramatsu <mhiramat@kernel.org>,
Xu Liu <xliuprof@google.com>,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 05/10] perf dwarf-aux: Find pointer type to a type
Date: Fri, 29 Aug 2025 23:48:58 -0700 [thread overview]
Message-ID: <aLKe2mdHGS_diq4h@google.com> (raw)
In-Reply-To: <20250825195412.223077-6-zecheng@google.com>
On Mon, Aug 25, 2025 at 07:54:07PM +0000, Zecheng Li wrote:
> Implement die_find_pointer_to_type that searches for the pointer type to
> a given type in the CU. There's no guarantee that a pointer DIE exists
> for every possible base type. Compilers only generate DIEs for types
> actually used or defined. Returns NULL if no pointer type is found.
>
> It prepares the support for tracking LEA instructions. When we load the
> effective address from a stack position to a register, the register now
> holds a pointer type to the type at that stack position.
>
> The performance could be improved by adding a cache for the pointer
> types. Currently its impact on the annotation time for vmlinux is low.
I'm afraid the cache hit ratio can be low, but I have no data. Anyway
can you please share the difference of annotation time before and after
this patchset? It'd be nice if you have numbers for a large perf.data.
Thanks,
Namhyung
>
> Signed-off-by: Zecheng Li <zecheng@google.com>
> ---
> tools/perf/util/dwarf-aux.c | 69 +++++++++++++++++++++++++++++++++++++
> tools/perf/util/dwarf-aux.h | 4 +++
> 2 files changed, 73 insertions(+)
>
> diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
> index 6fd2db5d9381..6e8877ff2172 100644
> --- a/tools/perf/util/dwarf-aux.c
> +++ b/tools/perf/util/dwarf-aux.c
> @@ -2117,3 +2117,72 @@ Dwarf_Die *die_deref_ptr_type(Dwarf_Die *ptr_die, int offset,
>
> return die_get_member_type(&type_die, offset, die_mem);
> }
> +
> +struct find_pointer_type_data {
> + /* DIE offset of the type we want to point to */
> + Dwarf_Off target_type_offset;
> + Dwarf_Die *found_die;
> +};
> +
> +static int __die_find_pointer_to_type_cb(Dwarf_Die *die_mem, void *arg)
> +{
> + struct find_pointer_type_data *data = arg;
> + Dwarf_Attribute type_attr;
> + Dwarf_Die type_die;
> + Dwarf_Off ref_type_offset;
> +
> + if (dwarf_tag(die_mem) != DW_TAG_pointer_type)
> + return DIE_FIND_CB_CONTINUE;
> +
> + if (!dwarf_attr(die_mem, DW_AT_type, &type_attr))
> + return DIE_FIND_CB_SIBLING;
> +
> + /* Get the DIE this pointer points to */
> + if (!dwarf_formref_die(&type_attr, &type_die))
> + return DIE_FIND_CB_SIBLING;
> +
> + ref_type_offset = dwarf_dieoffset(&type_die);
> +
> + if (ref_type_offset != 0 && ref_type_offset == data->target_type_offset) {
> + /* This die_mem is a pointer to the target type */
> + if (data->found_die)
> + *data->found_die = *die_mem;
> + return DIE_FIND_CB_END;
> + }
> +
> + return DIE_FIND_CB_SIBLING;
> +}
> +
> +/**
> + * die_find_pointer_to_type - Find a DIE for a pointer to a given type
> + * @cu_die: The compilation unit to search within.
> + * @target_type: The DIE of the type you want to find a pointer to.
> + * @result_die: Buffer to store the found DW_TAG_pointer_type DIE.
> + *
> + * Scans the children of the @cu_die for a DW_TAG_pointer_type DIE
> + * whose DW_AT_type attribute references the @target_type.
> + *
> + * Return: @result_die if found, NULL otherwise.
> + */
> +Dwarf_Die *die_find_pointer_to_type(Dwarf_Die *cu_die, Dwarf_Die *target_type,
> + Dwarf_Die *result_die)
> +{
> + struct find_pointer_type_data data;
> + Dwarf_Die search_mem;
> +
> + if (!cu_die || !target_type || !result_die)
> + return NULL;
> +
> + data.target_type_offset = dwarf_dieoffset(target_type);
> + if (data.target_type_offset == 0) {
> + pr_debug("Target type DIE has no offset\n");
> + return NULL;
> + }
> + data.found_die = result_die;
> +
> + if (die_find_child(cu_die, __die_find_pointer_to_type_cb, &data, &search_mem))
> + return result_die;
> +
> + return NULL;
> +}
> +
> diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h
> index cd481ec9c5a1..f20319eb97a9 100644
> --- a/tools/perf/util/dwarf-aux.h
> +++ b/tools/perf/util/dwarf-aux.h
> @@ -158,6 +158,10 @@ Dwarf_Die *die_get_member_type(Dwarf_Die *type_die, int offset, Dwarf_Die *die_m
> /* Return type info where the pointer and offset point to */
> Dwarf_Die *die_deref_ptr_type(Dwarf_Die *ptr_die, int offset, Dwarf_Die *die_mem);
>
> +/* Find a DIE for a pointer to a given type */
> +Dwarf_Die *die_find_pointer_to_type(Dwarf_Die *cu_die, Dwarf_Die *target_type,
> + Dwarf_Die *result_die);
> +
> /* Get byte offset range of given variable DIE */
> int die_get_var_range(Dwarf_Die *sp_die, Dwarf_Die *vr_die, struct strbuf *buf);
>
> --
> 2.51.0.261.g7ce5a0a67e-goog
>
prev parent reply other threads:[~2025-08-30 6:49 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-25 19:54 [PATCH v2 00/10] perf tools: Some improvements on data type profiler Zecheng Li
2025-08-25 19:54 ` [PATCH v2 01/10] perf dwarf-aux: Use signed variable types in match_var_offset Zecheng Li
2025-08-28 6:52 ` Namhyung Kim
2025-09-03 15:49 ` Arnaldo Carvalho de Melo
2025-09-03 22:05 ` Arnaldo Carvalho de Melo
2025-09-05 19:50 ` Namhyung Kim
2025-09-13 14:34 ` Arnaldo Carvalho de Melo
2025-08-25 19:54 ` [PATCH v2 02/10] perf dwarf-aux: More accurate variable type match for breg Zecheng Li
2025-08-28 7:18 ` Namhyung Kim
2025-08-28 18:36 ` Zecheng Li
2025-08-30 0:53 ` Namhyung Kim
2025-08-25 19:54 ` [PATCH v2 03/10] perf dwarf-aux: Better variable collection for insn tracking Zecheng Li
2025-08-30 1:22 ` Namhyung Kim
2025-08-25 19:54 ` [PATCH v2 04/10] perf annotate: Skip annotating data types to lea instructions Zecheng Li
2025-08-30 6:41 ` Namhyung Kim
2025-08-25 19:54 ` [PATCH v2 05/10] perf dwarf-aux: Find pointer type to a type Zecheng Li
2025-08-30 6:48 ` Namhyung Kim [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aLKe2mdHGS_diq4h@google.com \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=xliuprof@google.com \
--cc=zecheng@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.