diff options
author | Namhyung Kim <namhyung@kernel.org> | 2024-08-17 02:58:39 +0300 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2024-08-19 17:55:26 +0300 |
commit | 023aceecc74ae7dd9e91c8e35d641da74a371078 (patch) | |
tree | c24c438ca2cba51f48af06b7a55695f305d0be0b /tools | |
parent | ba8833703b49451453d97bf6414a522293f7e31d (diff) | |
download | linux-023aceecc74ae7dd9e91c8e35d641da74a371078.tar.xz |
perf annotate-data: Update type stat at the end of find_data_type_die()
After trying all possibilities with DWARF and instruction tracking.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240816235840.2754937-10-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/annotate-data.c | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/tools/perf/util/annotate-data.c b/tools/perf/util/annotate-data.c index e86f40fed323..aa330c7d8edd 100644 --- a/tools/perf/util/annotate-data.c +++ b/tools/perf/util/annotate-data.c @@ -432,10 +432,8 @@ static enum type_match_result check_variable(struct data_loc_info *dloc, needs_pointer = false; /* Get the type of the variable */ - if (__die_get_real_type(var_die, type_die) == NULL) { - ann_data_stat.no_typeinfo++; + if (__die_get_real_type(var_die, type_die) == NULL) return PERF_TMR_NO_TYPE; - } /* * Usually it expects a pointer type for a memory access. @@ -444,10 +442,8 @@ static enum type_match_result check_variable(struct data_loc_info *dloc, */ if (needs_pointer) { if (!is_pointer_type(type_die) || - __die_get_real_type(type_die, type_die) == NULL) { - ann_data_stat.no_typeinfo++; + __die_get_real_type(type_die, type_die) == NULL) return PERF_TMR_NO_POINTER; - } } if (dwarf_tag(type_die) == DW_TAG_typedef) @@ -456,16 +452,12 @@ static enum type_match_result check_variable(struct data_loc_info *dloc, sized_type = *type_die; /* Get the size of the actual type */ - if (dwarf_aggregate_size(&sized_type, &size) < 0) { - ann_data_stat.invalid_size++; + if (dwarf_aggregate_size(&sized_type, &size) < 0) return PERF_TMR_NO_SIZE; - } /* Minimal sanity check */ - if ((unsigned)offset >= size) { - ann_data_stat.bad_offset++; + if ((unsigned)offset >= size) return PERF_TMR_BAD_OFFSET; - } return PERF_TMR_OK; } @@ -1275,7 +1267,7 @@ static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die) bool found = false; u64 pc; char buf[64]; - enum type_match_result result; + enum type_match_result result = PERF_TMR_UNKNOWN; if (dloc->op->multi_regs) snprintf(buf, sizeof(buf), "reg%d, reg%d", dloc->op->reg1, dloc->op->reg2); @@ -1317,7 +1309,7 @@ static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die) pr_debug_dtp("found by addr=%#"PRIx64" type_offset=%#x\n", dloc->var_addr, offset); pr_debug_type_name(type_die, TSR_KIND_TYPE); - ret = 0; + found = true; goto out; } } @@ -1416,16 +1408,37 @@ retry: } } +out: if (found) { pr_debug_dtp("final type:"); pr_debug_type_name(type_die, TSR_KIND_TYPE); ret = 0; } else { - pr_debug_dtp("no variable found\n"); - ann_data_stat.no_var++; + switch (result) { + case PERF_TMR_NO_TYPE: + case PERF_TMR_NO_POINTER: + pr_debug_dtp("%s\n", match_result_str(result)); + ann_data_stat.no_typeinfo++; + break; + case PERF_TMR_NO_SIZE: + pr_debug_dtp("%s\n", match_result_str(result)); + ann_data_stat.invalid_size++; + break; + case PERF_TMR_BAD_OFFSET: + pr_debug_dtp("%s\n", match_result_str(result)); + ann_data_stat.bad_offset++; + break; + case PERF_TMR_UNKNOWN: + case PERF_TMR_BAIL_OUT: + case PERF_TMR_OK: /* should not reach here */ + default: + pr_debug_dtp("no variable found\n"); + ann_data_stat.no_var++; + break; + } + ret = -1; } -out: free(scopes); return ret; } |