aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/map.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/map.c')
-rw-r--r--tools/perf/util/map.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index 6ae97eda370b..89ac5b5dc218 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -415,16 +415,20 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp)
415 return fprintf(fp, "%s", dsoname); 415 return fprintf(fp, "%s", dsoname);
416} 416}
417 417
418char *map__srcline(struct map *map, u64 addr, struct symbol *sym)
419{
420 if (map == NULL)
421 return SRCLINE_UNKNOWN;
422 return get_srcline(map->dso, map__rip_2objdump(map, addr), sym, true, true, addr);
423}
424
418int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, 425int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
419 FILE *fp) 426 FILE *fp)
420{ 427{
421 char *srcline;
422 int ret = 0; 428 int ret = 0;
423 429
424 if (map && map->dso) { 430 if (map && map->dso) {
425 srcline = get_srcline(map->dso, 431 char *srcline = map__srcline(map, addr, NULL);
426 map__rip_2objdump(map, addr), NULL,
427 true, true, addr);
428 if (srcline != SRCLINE_UNKNOWN) 432 if (srcline != SRCLINE_UNKNOWN)
429 ret = fprintf(fp, "%s%s", prefix, srcline); 433 ret = fprintf(fp, "%s%s", prefix, srcline);
430 free_srcline(srcline); 434 free_srcline(srcline);
@@ -445,6 +449,20 @@ int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
445 */ 449 */
446u64 map__rip_2objdump(struct map *map, u64 rip) 450u64 map__rip_2objdump(struct map *map, u64 rip)
447{ 451{
452 struct kmap *kmap = __map__kmap(map);
453
454 /*
455 * vmlinux does not have program headers for PTI entry trampolines and
456 * kcore may not either. However the trampoline object code is on the
457 * main kernel map, so just use that instead.
458 */
459 if (kmap && is_entry_trampoline(kmap->name) && kmap->kmaps && kmap->kmaps->machine) {
460 struct map *kernel_map = machine__kernel_map(kmap->kmaps->machine);
461
462 if (kernel_map)
463 map = kernel_map;
464 }
465
448 if (!map->dso->adjust_symbols) 466 if (!map->dso->adjust_symbols)
449 return rip; 467 return rip;
450 468