diff options
| author | Namhyung Kim <[email protected]> | 2024-01-17 06:26:54 +0000 |
|---|---|---|
| committer | Namhyung Kim <[email protected]> | 2024-01-22 20:08:20 +0000 |
| commit | 5f7cdde843dd21c7228d9ae47d985086ce165985 (patch) | |
| tree | e5f1d18451917e790e652f2526ff6efbdf1918cd /tools/perf/util/annotate.h | |
| parent | perf annotate-data: Handle PC-relative addressing (diff) | |
| download | kernel-5f7cdde843dd21c7228d9ae47d985086ce165985.tar.gz kernel-5f7cdde843dd21c7228d9ae47d985086ce165985.zip | |
perf annotate-data: Support global variables
Global variables are accessed using PC-relative address so it needs to
be handled separately. The PC-rel addressing is detected by using
DWARF_REG_PC. On x86, %rip register would be used.
The address can be calculated using the ip and offset in the
instruction. But it should start from the next instruction so add
calculate_pcrel_addr() to do it properly.
But global variables defined in a different file would only have a
declaration which doesn't include a location list. So it first tries
to get the type info using the address, and then looks up the variable
declarations using name. The name of global variables should be get
from the symbol table. The declaration would have the type info.
So extend find_var_type() to take both address and name for global
variables.
The stat is now looks like:
Annotate data type stats:
total 294, ok 153 (52.0%), bad 141 (48.0%)
-----------------------------------------------------------
30 : no_sym
32 : no_mem_ops
61 : no_var
10 : no_typeinfo
8 : bad_offset
Reviewed-by: Ian Rogers <[email protected]>
Cc: Stephane Eranian <[email protected]>
Cc: Masami Hiramatsu <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Namhyung Kim <[email protected]>
Diffstat (limited to 'tools/perf/util/annotate.h')
| -rw-r--r-- | tools/perf/util/annotate.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index d0ff677b460c..94435607c958 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h @@ -491,4 +491,8 @@ struct annotated_item_stat { }; extern struct list_head ann_insn_stat; +/* Calculate PC-relative address */ +u64 annotate_calc_pcrel(struct map_symbol *ms, u64 ip, int offset, + struct disasm_line *dl); + #endif /* __PERF_ANNOTATE_H */ |
