diff options
Diffstat (limited to 'tools/perf/util/map.c')
| -rw-r--r-- | tools/perf/util/map.c | 26 |
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 | ||
| 418 | char *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 | |||
| 418 | int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, | 425 | int 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 | */ |
| 446 | u64 map__rip_2objdump(struct map *map, u64 rip) | 450 | u64 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 | ||
