From: Namhyung Kim <namhyung@kernel.org>
To: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: acme@kernel.org, jolsa@kernel.org, adrian.hunter@intel.com,
irogers@google.com, segher@kernel.crashing.org,
christophe.leroy@csgroup.eu, linux-kernel@vger.kernel.org,
linux-perf-users@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
akanksha@linux.ibm.com, maddy@linux.ibm.com, kjain@linux.ibm.com,
disgoel@linux.vnet.ibm.com
Subject: Re: [PATCH V5 16/17] tools/perf: Add support for global_die to capture name of variable in case of register defined variable
Date: Tue, 2 Jul 2024 19:00:36 -0700 [thread overview]
Message-ID: <ZoSwxHC3cpGa1UqM@google.com> (raw)
In-Reply-To: <20240701043430.66666-17-atrajeev@linux.vnet.ibm.com>
On Mon, Jul 01, 2024 at 10:04:29AM +0530, Athira Rajeev wrote:
> In case of register defined variable (found using
> find_data_type_global_reg), if the type of variable happens to be base
> type (example, long unsigned int), perf report captures it as:
>
> 12.85% long unsigned int long unsigned int +0 (no field)
>
> The above data type is actually referring to samples captured while
> accessing "r1" which represents current stack pointer in powerpc.
> register void *__stack_pointer asm("r1");
>
> The dwarf debug contains this as:
>
> <<>>
> <1><18dd772>: Abbrev Number: 129 (DW_TAG_variable)
> <18dd774> DW_AT_name : (indirect string, offset: 0x11ba): current_stack_pointer
> <18dd778> DW_AT_decl_file : 51
> <18dd779> DW_AT_decl_line : 1468
> <18dd77b> DW_AT_decl_column : 24
> <18dd77c> DW_AT_type : <0x18da5cd>
> <18dd780> DW_AT_external : 1
> <18dd780> DW_AT_location : 1 byte block: 51 (DW_OP_reg1 (r1))
>
> where 18da5cd is:
>
> <1><18da5cd>: Abbrev Number: 47 (DW_TAG_base_type)
> <18da5ce> DW_AT_byte_size : 8
> <18da5cf> DW_AT_encoding : 7 (unsigned)
> <18da5d0> DW_AT_name : (indirect string, offset: 0x55c7): long unsigned int
> <<>>
>
> To make it more clear to the user, capture the DW_AT_name of the
> variable and save it as part of Dwarf_Global. Dwarf_Global is used so
> that it can be used and retrieved while presenting the result.
>
> Update "dso__findnew_data_type" function to set "var_name" if
> variable name is set as part of Dwarf_Global. Updated
> "hist_entry__typeoff_snprintf" to print var_name if it is set.
> With the changes, along with "long unsigned int" report also says the
> variable name as current_stack_pointer
>
> Snippet of result:
>
> 12.85% long unsigned int long unsigned int +0 (current_stack_pointer)
But I'm afraid it'd contain other (global) unsigned int type accesses
also. Currently data_type_cmp() only compares size and type name so it
cannot distinguish two different int variables.
I thought it's ok since we care about types, but we might want to see
global variables (in the same type) - not only register variables -
separately. Then I think we should compare variable names after type
name (if exists).
> 4.68% struct paca_struct struct paca_struct +2312 (__current)
> 4.57% struct paca_struct struct paca_struct +2354 (irq_soft_mask)
>
> Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
> ---
> tools/perf/util/annotate-data.c | 30 ++++++++++++++++++++++++------
> tools/perf/util/dwarf-aux.c | 1 +
> tools/perf/util/dwarf-aux.h | 1 +
> tools/perf/util/sort.c | 7 +++++--
> 4 files changed, 31 insertions(+), 8 deletions(-)
>
> diff --git a/tools/perf/util/annotate-data.c b/tools/perf/util/annotate-data.c
> index c919b2259f54..a6d6cf69dbab 100644
> --- a/tools/perf/util/annotate-data.c
> +++ b/tools/perf/util/annotate-data.c
> @@ -273,23 +273,32 @@ static void delete_members(struct annotated_member *member)
> }
>
> static struct annotated_data_type *dso__findnew_data_type(struct dso *dso,
> - Dwarf_Die *type_die)
> + Dwarf_Die *type_die, Dwarf_Global *global_die)
> {
> struct annotated_data_type *result = NULL;
> struct annotated_data_type key;
> struct rb_node *node;
> struct strbuf sb;
> + struct strbuf sb_var_name;
> char *type_name;
> + char *var_name = NULL;
> Dwarf_Word size;
>
> strbuf_init(&sb, 32);
> + strbuf_init(&sb_var_name, 32);
> if (die_get_typename_from_type(type_die, &sb) < 0)
> strbuf_add(&sb, "(unknown type)", 14);
> + if (global_die->name) {
> + strbuf_addstr(&sb_var_name, global_die->name);
> + var_name = strbuf_detach(&sb_var_name, NULL);
> + }
> type_name = strbuf_detach(&sb, NULL);
> dwarf_aggregate_size(type_die, &size);
>
> /* Check existing nodes in dso->data_types tree */
> key.self.type_name = type_name;
> + if (global_die->name)
> + key.self.var_name = var_name;
Maybe you can set it unconditionally as it's NULL by default.
But you need to free the var_name if rb_find() returns an existing
node. I think it should be done after you allocate the result.
> key.self.size = size;
> node = rb_find(&key, dso__data_types(dso), data_type_cmp);
> if (node) {
> @@ -306,6 +315,8 @@ static struct annotated_data_type *dso__findnew_data_type(struct dso *dso,
> }
>
> result->self.type_name = type_name;
> + if (global_die->name)
> + result->self.var_name = var_name;
Here.
Thanks,
Namhyung
> result->self.size = size;
> INIT_LIST_HEAD(&result->self.children);
>
> @@ -1183,7 +1194,7 @@ static int find_data_type_block(struct data_loc_info *dloc,
> * cu_die and match with reg to identify data type die.
> */
> static int find_data_type_global_reg(struct data_loc_info *dloc, int reg, Dwarf_Die *cu_die,
> - Dwarf_Die *type_die)
> + Dwarf_Die *type_die, Dwarf_Global *global_die)
> {
> Dwarf_Die vr_die;
> int ret = -1;
> @@ -1195,8 +1206,11 @@ static int find_data_type_global_reg(struct data_loc_info *dloc, int reg, Dwarf_
> if (dwarf_offdie(dloc->di->dbg, var_types->die_off, &vr_die)) {
> if (die_get_real_type(&vr_die, type_die) == NULL) {
> dloc->type_offset = 0;
> + global_die->name = var_types->name;
> dwarf_offdie(dloc->di->dbg, var_types->die_off, type_die);
> }
> + global_die->die_offset = (long)dwarf_dieoffset(type_die);
> + global_die->cu_offset = (long)dwarf_dieoffset(cu_die);
> pr_debug_type_name(type_die, TSR_KIND_TYPE);
> ret = 0;
> pr_debug_dtp("found by CU for %s (die:%#lx)\n",
> @@ -1212,7 +1226,8 @@ static int find_data_type_global_reg(struct data_loc_info *dloc, int reg, Dwarf_
> }
>
> /* The result will be saved in @type_die */
> -static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die)
> +static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die,
> + Dwarf_Global *global_die)
> {
> struct annotated_op_loc *loc = dloc->op;
> Dwarf_Die cu_die, var_die;
> @@ -1226,6 +1241,8 @@ static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die)
> u64 pc;
> char buf[64];
>
> + memset(global_die, 0, sizeof(Dwarf_Global));
> +
> if (dloc->op->multi_regs)
> snprintf(buf, sizeof(buf), "reg%d, reg%d", dloc->op->reg1, dloc->op->reg2);
> else if (dloc->op->reg1 == DWARF_REG_PC)
> @@ -1259,7 +1276,7 @@ static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die)
> dwarf_diename(&cu_die), (long)dwarf_dieoffset(&cu_die));
>
> if (loc->reg_type == DWARF_REG_GLOBAL) {
> - ret = find_data_type_global_reg(dloc, reg, &cu_die, type_die);
> + ret = find_data_type_global_reg(dloc, reg, &cu_die, type_die, global_die);
> if (!ret)
> goto out;
> }
> @@ -1395,6 +1412,7 @@ struct annotated_data_type *find_data_type(struct data_loc_info *dloc)
> struct annotated_data_type *result = NULL;
> struct dso *dso = map__dso(dloc->ms->map);
> Dwarf_Die type_die;
> + Dwarf_Global global_die;
>
> dloc->di = debuginfo__new(dso__long_name(dso));
> if (dloc->di == NULL) {
> @@ -1410,10 +1428,10 @@ struct annotated_data_type *find_data_type(struct data_loc_info *dloc)
>
> dloc->fbreg = -1;
>
> - if (find_data_type_die(dloc, &type_die) < 0)
> + if (find_data_type_die(dloc, &type_die, &global_die) < 0)
> goto out;
>
> - result = dso__findnew_data_type(dso, &type_die);
> + result = dso__findnew_data_type(dso, &type_die, &global_die);
>
> out:
> debuginfo__delete(dloc->di);
> diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
> index 44ef968a7ad3..9e61ff326651 100644
> --- a/tools/perf/util/dwarf-aux.c
> +++ b/tools/perf/util/dwarf-aux.c
> @@ -1610,6 +1610,7 @@ static int __die_collect_vars_cb(Dwarf_Die *die_mem, void *arg)
> vt->reg = reg_from_dwarf_op(ops);
> vt->offset = offset_from_dwarf_op(ops);
> vt->next = *var_types;
> + vt->name = dwarf_diename(die_mem);
> *var_types = vt;
>
> return DIE_FIND_CB_SIBLING;
> diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h
> index 24446412b869..406a5b1e269b 100644
> --- a/tools/perf/util/dwarf-aux.h
> +++ b/tools/perf/util/dwarf-aux.h
> @@ -146,6 +146,7 @@ struct die_var_type {
> u64 addr;
> int reg;
> int offset;
> + const char *name;
> };
>
> /* Return type info of a member at offset */
> diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> index cd39ea972193..535ca19a23fd 100644
> --- a/tools/perf/util/sort.c
> +++ b/tools/perf/util/sort.c
> @@ -2305,9 +2305,12 @@ static int hist_entry__typeoff_snprintf(struct hist_entry *he, char *bf,
> char buf[4096];
>
> buf[0] = '\0';
> - if (list_empty(&he_type->self.children))
> + if (list_empty(&he_type->self.children)) {
> snprintf(buf, sizeof(buf), "no field");
> - else
> + if (he_type->self.var_name)
> + strcpy(buf, he_type->self.var_name);
> +
> + } else
> fill_member_name(buf, sizeof(buf), &he_type->self,
> he->mem_type_off, true);
> buf[4095] = '\0';
> --
> 2.43.0
>
WARNING: multiple messages have this Message-ID (diff)
From: Namhyung Kim <namhyung@kernel.org>
To: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: irogers@google.com, disgoel@linux.vnet.ibm.com,
maddy@linux.ibm.com, kjain@linux.ibm.com,
adrian.hunter@intel.com, christophe.leroy@csgroup.eu,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
acme@kernel.org, jolsa@kernel.org, akanksha@linux.ibm.com,
linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH V5 16/17] tools/perf: Add support for global_die to capture name of variable in case of register defined variable
Date: Tue, 2 Jul 2024 19:00:36 -0700 [thread overview]
Message-ID: <ZoSwxHC3cpGa1UqM@google.com> (raw)
In-Reply-To: <20240701043430.66666-17-atrajeev@linux.vnet.ibm.com>
On Mon, Jul 01, 2024 at 10:04:29AM +0530, Athira Rajeev wrote:
> In case of register defined variable (found using
> find_data_type_global_reg), if the type of variable happens to be base
> type (example, long unsigned int), perf report captures it as:
>
> 12.85% long unsigned int long unsigned int +0 (no field)
>
> The above data type is actually referring to samples captured while
> accessing "r1" which represents current stack pointer in powerpc.
> register void *__stack_pointer asm("r1");
>
> The dwarf debug contains this as:
>
> <<>>
> <1><18dd772>: Abbrev Number: 129 (DW_TAG_variable)
> <18dd774> DW_AT_name : (indirect string, offset: 0x11ba): current_stack_pointer
> <18dd778> DW_AT_decl_file : 51
> <18dd779> DW_AT_decl_line : 1468
> <18dd77b> DW_AT_decl_column : 24
> <18dd77c> DW_AT_type : <0x18da5cd>
> <18dd780> DW_AT_external : 1
> <18dd780> DW_AT_location : 1 byte block: 51 (DW_OP_reg1 (r1))
>
> where 18da5cd is:
>
> <1><18da5cd>: Abbrev Number: 47 (DW_TAG_base_type)
> <18da5ce> DW_AT_byte_size : 8
> <18da5cf> DW_AT_encoding : 7 (unsigned)
> <18da5d0> DW_AT_name : (indirect string, offset: 0x55c7): long unsigned int
> <<>>
>
> To make it more clear to the user, capture the DW_AT_name of the
> variable and save it as part of Dwarf_Global. Dwarf_Global is used so
> that it can be used and retrieved while presenting the result.
>
> Update "dso__findnew_data_type" function to set "var_name" if
> variable name is set as part of Dwarf_Global. Updated
> "hist_entry__typeoff_snprintf" to print var_name if it is set.
> With the changes, along with "long unsigned int" report also says the
> variable name as current_stack_pointer
>
> Snippet of result:
>
> 12.85% long unsigned int long unsigned int +0 (current_stack_pointer)
But I'm afraid it'd contain other (global) unsigned int type accesses
also. Currently data_type_cmp() only compares size and type name so it
cannot distinguish two different int variables.
I thought it's ok since we care about types, but we might want to see
global variables (in the same type) - not only register variables -
separately. Then I think we should compare variable names after type
name (if exists).
> 4.68% struct paca_struct struct paca_struct +2312 (__current)
> 4.57% struct paca_struct struct paca_struct +2354 (irq_soft_mask)
>
> Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
> ---
> tools/perf/util/annotate-data.c | 30 ++++++++++++++++++++++++------
> tools/perf/util/dwarf-aux.c | 1 +
> tools/perf/util/dwarf-aux.h | 1 +
> tools/perf/util/sort.c | 7 +++++--
> 4 files changed, 31 insertions(+), 8 deletions(-)
>
> diff --git a/tools/perf/util/annotate-data.c b/tools/perf/util/annotate-data.c
> index c919b2259f54..a6d6cf69dbab 100644
> --- a/tools/perf/util/annotate-data.c
> +++ b/tools/perf/util/annotate-data.c
> @@ -273,23 +273,32 @@ static void delete_members(struct annotated_member *member)
> }
>
> static struct annotated_data_type *dso__findnew_data_type(struct dso *dso,
> - Dwarf_Die *type_die)
> + Dwarf_Die *type_die, Dwarf_Global *global_die)
> {
> struct annotated_data_type *result = NULL;
> struct annotated_data_type key;
> struct rb_node *node;
> struct strbuf sb;
> + struct strbuf sb_var_name;
> char *type_name;
> + char *var_name = NULL;
> Dwarf_Word size;
>
> strbuf_init(&sb, 32);
> + strbuf_init(&sb_var_name, 32);
> if (die_get_typename_from_type(type_die, &sb) < 0)
> strbuf_add(&sb, "(unknown type)", 14);
> + if (global_die->name) {
> + strbuf_addstr(&sb_var_name, global_die->name);
> + var_name = strbuf_detach(&sb_var_name, NULL);
> + }
> type_name = strbuf_detach(&sb, NULL);
> dwarf_aggregate_size(type_die, &size);
>
> /* Check existing nodes in dso->data_types tree */
> key.self.type_name = type_name;
> + if (global_die->name)
> + key.self.var_name = var_name;
Maybe you can set it unconditionally as it's NULL by default.
But you need to free the var_name if rb_find() returns an existing
node. I think it should be done after you allocate the result.
> key.self.size = size;
> node = rb_find(&key, dso__data_types(dso), data_type_cmp);
> if (node) {
> @@ -306,6 +315,8 @@ static struct annotated_data_type *dso__findnew_data_type(struct dso *dso,
> }
>
> result->self.type_name = type_name;
> + if (global_die->name)
> + result->self.var_name = var_name;
Here.
Thanks,
Namhyung
> result->self.size = size;
> INIT_LIST_HEAD(&result->self.children);
>
> @@ -1183,7 +1194,7 @@ static int find_data_type_block(struct data_loc_info *dloc,
> * cu_die and match with reg to identify data type die.
> */
> static int find_data_type_global_reg(struct data_loc_info *dloc, int reg, Dwarf_Die *cu_die,
> - Dwarf_Die *type_die)
> + Dwarf_Die *type_die, Dwarf_Global *global_die)
> {
> Dwarf_Die vr_die;
> int ret = -1;
> @@ -1195,8 +1206,11 @@ static int find_data_type_global_reg(struct data_loc_info *dloc, int reg, Dwarf_
> if (dwarf_offdie(dloc->di->dbg, var_types->die_off, &vr_die)) {
> if (die_get_real_type(&vr_die, type_die) == NULL) {
> dloc->type_offset = 0;
> + global_die->name = var_types->name;
> dwarf_offdie(dloc->di->dbg, var_types->die_off, type_die);
> }
> + global_die->die_offset = (long)dwarf_dieoffset(type_die);
> + global_die->cu_offset = (long)dwarf_dieoffset(cu_die);
> pr_debug_type_name(type_die, TSR_KIND_TYPE);
> ret = 0;
> pr_debug_dtp("found by CU for %s (die:%#lx)\n",
> @@ -1212,7 +1226,8 @@ static int find_data_type_global_reg(struct data_loc_info *dloc, int reg, Dwarf_
> }
>
> /* The result will be saved in @type_die */
> -static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die)
> +static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die,
> + Dwarf_Global *global_die)
> {
> struct annotated_op_loc *loc = dloc->op;
> Dwarf_Die cu_die, var_die;
> @@ -1226,6 +1241,8 @@ static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die)
> u64 pc;
> char buf[64];
>
> + memset(global_die, 0, sizeof(Dwarf_Global));
> +
> if (dloc->op->multi_regs)
> snprintf(buf, sizeof(buf), "reg%d, reg%d", dloc->op->reg1, dloc->op->reg2);
> else if (dloc->op->reg1 == DWARF_REG_PC)
> @@ -1259,7 +1276,7 @@ static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die)
> dwarf_diename(&cu_die), (long)dwarf_dieoffset(&cu_die));
>
> if (loc->reg_type == DWARF_REG_GLOBAL) {
> - ret = find_data_type_global_reg(dloc, reg, &cu_die, type_die);
> + ret = find_data_type_global_reg(dloc, reg, &cu_die, type_die, global_die);
> if (!ret)
> goto out;
> }
> @@ -1395,6 +1412,7 @@ struct annotated_data_type *find_data_type(struct data_loc_info *dloc)
> struct annotated_data_type *result = NULL;
> struct dso *dso = map__dso(dloc->ms->map);
> Dwarf_Die type_die;
> + Dwarf_Global global_die;
>
> dloc->di = debuginfo__new(dso__long_name(dso));
> if (dloc->di == NULL) {
> @@ -1410,10 +1428,10 @@ struct annotated_data_type *find_data_type(struct data_loc_info *dloc)
>
> dloc->fbreg = -1;
>
> - if (find_data_type_die(dloc, &type_die) < 0)
> + if (find_data_type_die(dloc, &type_die, &global_die) < 0)
> goto out;
>
> - result = dso__findnew_data_type(dso, &type_die);
> + result = dso__findnew_data_type(dso, &type_die, &global_die);
>
> out:
> debuginfo__delete(dloc->di);
> diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
> index 44ef968a7ad3..9e61ff326651 100644
> --- a/tools/perf/util/dwarf-aux.c
> +++ b/tools/perf/util/dwarf-aux.c
> @@ -1610,6 +1610,7 @@ static int __die_collect_vars_cb(Dwarf_Die *die_mem, void *arg)
> vt->reg = reg_from_dwarf_op(ops);
> vt->offset = offset_from_dwarf_op(ops);
> vt->next = *var_types;
> + vt->name = dwarf_diename(die_mem);
> *var_types = vt;
>
> return DIE_FIND_CB_SIBLING;
> diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h
> index 24446412b869..406a5b1e269b 100644
> --- a/tools/perf/util/dwarf-aux.h
> +++ b/tools/perf/util/dwarf-aux.h
> @@ -146,6 +146,7 @@ struct die_var_type {
> u64 addr;
> int reg;
> int offset;
> + const char *name;
> };
>
> /* Return type info of a member at offset */
> diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> index cd39ea972193..535ca19a23fd 100644
> --- a/tools/perf/util/sort.c
> +++ b/tools/perf/util/sort.c
> @@ -2305,9 +2305,12 @@ static int hist_entry__typeoff_snprintf(struct hist_entry *he, char *bf,
> char buf[4096];
>
> buf[0] = '\0';
> - if (list_empty(&he_type->self.children))
> + if (list_empty(&he_type->self.children)) {
> snprintf(buf, sizeof(buf), "no field");
> - else
> + if (he_type->self.var_name)
> + strcpy(buf, he_type->self.var_name);
> +
> + } else
> fill_member_name(buf, sizeof(buf), &he_type->self,
> he->mem_type_off, true);
> buf[4095] = '\0';
> --
> 2.43.0
>
next prev parent reply other threads:[~2024-07-03 2:00 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-01 4:34 [PATCH V5 00/17] Add data type profiling support for powerpc Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 01/17] tools/perf: Move the data structures related to register type to header file Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 02/17] tools/perf: Add "update_insn_state" callback function to handle arch specific instruction tracking Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 03/17] tools/perf: Update TYPE_STATE_MAX_REGS to include max of regs in powerpc Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-03 0:09 ` Namhyung Kim
2024-07-03 0:09 ` Namhyung Kim
2024-07-01 4:34 ` [PATCH V5 04/17] tools/perf: Add disasm_line__parse to parse raw instruction for powerpc Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-03 1:16 ` Namhyung Kim
2024-07-03 1:16 ` Namhyung Kim
2024-07-03 13:11 ` Athira Rajeev
2024-07-03 13:11 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 05/17] tools/perf: Add support to capture and parse raw instruction in powerpc using dso__data_read_offset utility Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-03 1:24 ` Namhyung Kim
2024-07-03 1:24 ` Namhyung Kim
2024-07-03 11:52 ` Athira Rajeev
2024-07-03 11:52 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 06/17] tools/perf: Update parameters for reg extract functions to use raw instruction on powerpc Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 07/17] tools/perf: Add parse function for memory instructions in powerpc Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 08/17] tools/perf: Add support to identify memory instructions of opcode 31 " Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 09/17] tools/perf: Add some of the arithmetic instructions to support instruction tracking " Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 10/17] tools/perf: Add more instructions for instruction tracking Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 11/17] tools/perf: Update instruction tracking for powerpc Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 12/17] tools/perf: Make capstone_init non-static so that it can be used during symbol disassemble Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 13/17] tools/perf: Use capstone_init and remove open_capstone_handle from disasm.c Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 14/17] tools/perf: Add support to use libcapstone in powerpc Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-01 4:34 ` [PATCH V5 15/17] tools/perf: Add support to find global register variables using find_data_type_global_reg Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-03 1:41 ` Namhyung Kim
2024-07-03 1:41 ` Namhyung Kim
2024-07-01 4:34 ` [PATCH V5 16/17] tools/perf: Add support for global_die to capture name of variable in case of register defined variable Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
2024-07-03 2:00 ` Namhyung Kim [this message]
2024-07-03 2:00 ` Namhyung Kim
2024-07-01 4:34 ` [PATCH V5 17/17] tools/perf: Set instruction name to be used with insn-stat when using raw instruction Athira Rajeev
2024-07-01 4:34 ` Athira Rajeev
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=ZoSwxHC3cpGa1UqM@google.com \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=akanksha@linux.ibm.com \
--cc=atrajeev@linux.vnet.ibm.com \
--cc=christophe.leroy@csgroup.eu \
--cc=disgoel@linux.vnet.ibm.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=kjain@linux.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=maddy@linux.ibm.com \
--cc=segher@kernel.crashing.org \
/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.