diff options
Diffstat (limited to 'tools/perf/util/map.c')
-rw-r--r-- | tools/perf/util/map.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index 4f6680d2043b..ef5bc913ca7a 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c | |||
@@ -172,7 +172,7 @@ int map__load(struct map *map, symbol_filter_t filter) | |||
172 | pr_warning(", continuing without symbols\n"); | 172 | pr_warning(", continuing without symbols\n"); |
173 | return -1; | 173 | return -1; |
174 | } else if (nr == 0) { | 174 | } else if (nr == 0) { |
175 | #ifdef LIBELF_SUPPORT | 175 | #ifdef HAVE_LIBELF_SUPPORT |
176 | const size_t len = strlen(name); | 176 | const size_t len = strlen(name); |
177 | const size_t real_len = len - sizeof(DSO__DELETED); | 177 | const size_t real_len = len - sizeof(DSO__DELETED); |
178 | 178 | ||
@@ -252,10 +252,16 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) | |||
252 | return fprintf(fp, "%s", dsoname); | 252 | return fprintf(fp, "%s", dsoname); |
253 | } | 253 | } |
254 | 254 | ||
255 | /* | 255 | /** |
256 | * map__rip_2objdump - convert symbol start address to objdump address. | ||
257 | * @map: memory map | ||
258 | * @rip: symbol start address | ||
259 | * | ||
256 | * objdump wants/reports absolute IPs for ET_EXEC, and RIPs for ET_DYN. | 260 | * objdump wants/reports absolute IPs for ET_EXEC, and RIPs for ET_DYN. |
257 | * map->dso->adjust_symbols==1 for ET_EXEC-like cases except ET_REL which is | 261 | * map->dso->adjust_symbols==1 for ET_EXEC-like cases except ET_REL which is |
258 | * relative to section start. | 262 | * relative to section start. |
263 | * | ||
264 | * Return: Address suitable for passing to "objdump --start-address=" | ||
259 | */ | 265 | */ |
260 | u64 map__rip_2objdump(struct map *map, u64 rip) | 266 | u64 map__rip_2objdump(struct map *map, u64 rip) |
261 | { | 267 | { |
@@ -268,6 +274,29 @@ u64 map__rip_2objdump(struct map *map, u64 rip) | |||
268 | return map->unmap_ip(map, rip); | 274 | return map->unmap_ip(map, rip); |
269 | } | 275 | } |
270 | 276 | ||
277 | /** | ||
278 | * map__objdump_2mem - convert objdump address to a memory address. | ||
279 | * @map: memory map | ||
280 | * @ip: objdump address | ||
281 | * | ||
282 | * Closely related to map__rip_2objdump(), this function takes an address from | ||
283 | * objdump and converts it to a memory address. Note this assumes that @map | ||
284 | * contains the address. To be sure the result is valid, check it forwards | ||
285 | * e.g. map__rip_2objdump(map->map_ip(map, map__objdump_2mem(map, ip))) == ip | ||
286 | * | ||
287 | * Return: Memory address. | ||
288 | */ | ||
289 | u64 map__objdump_2mem(struct map *map, u64 ip) | ||
290 | { | ||
291 | if (!map->dso->adjust_symbols) | ||
292 | return map->unmap_ip(map, ip); | ||
293 | |||
294 | if (map->dso->rel) | ||
295 | return map->unmap_ip(map, ip + map->pgoff); | ||
296 | |||
297 | return ip; | ||
298 | } | ||
299 | |||
271 | void map_groups__init(struct map_groups *mg) | 300 | void map_groups__init(struct map_groups *mg) |
272 | { | 301 | { |
273 | int i; | 302 | int i; |
@@ -371,6 +400,23 @@ struct symbol *map_groups__find_symbol_by_name(struct map_groups *mg, | |||
371 | return NULL; | 400 | return NULL; |
372 | } | 401 | } |
373 | 402 | ||
403 | int map_groups__find_ams(struct addr_map_symbol *ams, symbol_filter_t filter) | ||
404 | { | ||
405 | if (ams->addr < ams->map->start || ams->addr > ams->map->end) { | ||
406 | if (ams->map->groups == NULL) | ||
407 | return -1; | ||
408 | ams->map = map_groups__find(ams->map->groups, ams->map->type, | ||
409 | ams->addr); | ||
410 | if (ams->map == NULL) | ||
411 | return -1; | ||
412 | } | ||
413 | |||
414 | ams->al_addr = ams->map->map_ip(ams->map, ams->addr); | ||
415 | ams->sym = map__find_symbol(ams->map, ams->al_addr, filter); | ||
416 | |||
417 | return ams->sym ? 0 : -1; | ||
418 | } | ||
419 | |||
374 | size_t __map_groups__fprintf_maps(struct map_groups *mg, | 420 | size_t __map_groups__fprintf_maps(struct map_groups *mg, |
375 | enum map_type type, int verbose, FILE *fp) | 421 | enum map_type type, int verbose, FILE *fp) |
376 | { | 422 | { |