diff options
Diffstat (limited to 'tools/perf/util/annotate.c')
-rw-r--r-- | tools/perf/util/annotate.c | 75 |
1 files changed, 49 insertions, 26 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index cf6242c92ee2..469eb679fb9d 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c | |||
@@ -26,10 +26,10 @@ static int disasm_line__parse(char *line, char **namep, char **rawp); | |||
26 | 26 | ||
27 | static void ins__delete(struct ins_operands *ops) | 27 | static void ins__delete(struct ins_operands *ops) |
28 | { | 28 | { |
29 | free(ops->source.raw); | 29 | zfree(&ops->source.raw); |
30 | free(ops->source.name); | 30 | zfree(&ops->source.name); |
31 | free(ops->target.raw); | 31 | zfree(&ops->target.raw); |
32 | free(ops->target.name); | 32 | zfree(&ops->target.name); |
33 | } | 33 | } |
34 | 34 | ||
35 | static int ins__raw_scnprintf(struct ins *ins, char *bf, size_t size, | 35 | static int ins__raw_scnprintf(struct ins *ins, char *bf, size_t size, |
@@ -185,8 +185,7 @@ static int lock__parse(struct ins_operands *ops) | |||
185 | return 0; | 185 | return 0; |
186 | 186 | ||
187 | out_free_ops: | 187 | out_free_ops: |
188 | free(ops->locked.ops); | 188 | zfree(&ops->locked.ops); |
189 | ops->locked.ops = NULL; | ||
190 | return 0; | 189 | return 0; |
191 | } | 190 | } |
192 | 191 | ||
@@ -205,9 +204,9 @@ static int lock__scnprintf(struct ins *ins, char *bf, size_t size, | |||
205 | 204 | ||
206 | static void lock__delete(struct ins_operands *ops) | 205 | static void lock__delete(struct ins_operands *ops) |
207 | { | 206 | { |
208 | free(ops->locked.ops); | 207 | zfree(&ops->locked.ops); |
209 | free(ops->target.raw); | 208 | zfree(&ops->target.raw); |
210 | free(ops->target.name); | 209 | zfree(&ops->target.name); |
211 | } | 210 | } |
212 | 211 | ||
213 | static struct ins_ops lock_ops = { | 212 | static struct ins_ops lock_ops = { |
@@ -256,8 +255,7 @@ static int mov__parse(struct ins_operands *ops) | |||
256 | return 0; | 255 | return 0; |
257 | 256 | ||
258 | out_free_source: | 257 | out_free_source: |
259 | free(ops->source.raw); | 258 | zfree(&ops->source.raw); |
260 | ops->source.raw = NULL; | ||
261 | return -1; | 259 | return -1; |
262 | } | 260 | } |
263 | 261 | ||
@@ -464,17 +462,12 @@ void symbol__annotate_zero_histograms(struct symbol *sym) | |||
464 | pthread_mutex_unlock(¬es->lock); | 462 | pthread_mutex_unlock(¬es->lock); |
465 | } | 463 | } |
466 | 464 | ||
467 | int symbol__inc_addr_samples(struct symbol *sym, struct map *map, | 465 | static int __symbol__inc_addr_samples(struct symbol *sym, struct map *map, |
468 | int evidx, u64 addr) | 466 | struct annotation *notes, int evidx, u64 addr) |
469 | { | 467 | { |
470 | unsigned offset; | 468 | unsigned offset; |
471 | struct annotation *notes; | ||
472 | struct sym_hist *h; | 469 | struct sym_hist *h; |
473 | 470 | ||
474 | notes = symbol__annotation(sym); | ||
475 | if (notes->src == NULL) | ||
476 | return -ENOMEM; | ||
477 | |||
478 | pr_debug3("%s: addr=%#" PRIx64 "\n", __func__, map->unmap_ip(map, addr)); | 471 | pr_debug3("%s: addr=%#" PRIx64 "\n", __func__, map->unmap_ip(map, addr)); |
479 | 472 | ||
480 | if (addr < sym->start || addr > sym->end) | 473 | if (addr < sym->start || addr > sym->end) |
@@ -491,6 +484,33 @@ int symbol__inc_addr_samples(struct symbol *sym, struct map *map, | |||
491 | return 0; | 484 | return 0; |
492 | } | 485 | } |
493 | 486 | ||
487 | static int symbol__inc_addr_samples(struct symbol *sym, struct map *map, | ||
488 | int evidx, u64 addr) | ||
489 | { | ||
490 | struct annotation *notes; | ||
491 | |||
492 | if (sym == NULL || use_browser != 1 || !sort__has_sym) | ||
493 | return 0; | ||
494 | |||
495 | notes = symbol__annotation(sym); | ||
496 | if (notes->src == NULL) { | ||
497 | if (symbol__alloc_hist(sym) < 0) | ||
498 | return -ENOMEM; | ||
499 | } | ||
500 | |||
501 | return __symbol__inc_addr_samples(sym, map, notes, evidx, addr); | ||
502 | } | ||
503 | |||
504 | int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, int evidx) | ||
505 | { | ||
506 | return symbol__inc_addr_samples(ams->sym, ams->map, evidx, ams->al_addr); | ||
507 | } | ||
508 | |||
509 | int hist_entry__inc_addr_samples(struct hist_entry *he, int evidx, u64 ip) | ||
510 | { | ||
511 | return symbol__inc_addr_samples(he->ms.sym, he->ms.map, evidx, ip); | ||
512 | } | ||
513 | |||
494 | static void disasm_line__init_ins(struct disasm_line *dl) | 514 | static void disasm_line__init_ins(struct disasm_line *dl) |
495 | { | 515 | { |
496 | dl->ins = ins__find(dl->name); | 516 | dl->ins = ins__find(dl->name); |
@@ -538,8 +558,7 @@ static int disasm_line__parse(char *line, char **namep, char **rawp) | |||
538 | return 0; | 558 | return 0; |
539 | 559 | ||
540 | out_free_name: | 560 | out_free_name: |
541 | free(*namep); | 561 | zfree(namep); |
542 | *namep = NULL; | ||
543 | return -1; | 562 | return -1; |
544 | } | 563 | } |
545 | 564 | ||
@@ -564,7 +583,7 @@ static struct disasm_line *disasm_line__new(s64 offset, char *line, size_t privs | |||
564 | return dl; | 583 | return dl; |
565 | 584 | ||
566 | out_free_line: | 585 | out_free_line: |
567 | free(dl->line); | 586 | zfree(&dl->line); |
568 | out_delete: | 587 | out_delete: |
569 | free(dl); | 588 | free(dl); |
570 | return NULL; | 589 | return NULL; |
@@ -572,8 +591,8 @@ out_delete: | |||
572 | 591 | ||
573 | void disasm_line__free(struct disasm_line *dl) | 592 | void disasm_line__free(struct disasm_line *dl) |
574 | { | 593 | { |
575 | free(dl->line); | 594 | zfree(&dl->line); |
576 | free(dl->name); | 595 | zfree(&dl->name); |
577 | if (dl->ins && dl->ins->ops->free) | 596 | if (dl->ins && dl->ins->ops->free) |
578 | dl->ins->ops->free(&dl->ops); | 597 | dl->ins->ops->free(&dl->ops); |
579 | else | 598 | else |
@@ -900,7 +919,7 @@ fallback: | |||
900 | * cache, or is just a kallsyms file, well, lets hope that this | 919 | * cache, or is just a kallsyms file, well, lets hope that this |
901 | * DSO is the same as when 'perf record' ran. | 920 | * DSO is the same as when 'perf record' ran. |
902 | */ | 921 | */ |
903 | filename = dso->long_name; | 922 | filename = (char *)dso->long_name; |
904 | snprintf(symfs_filename, sizeof(symfs_filename), "%s%s", | 923 | snprintf(symfs_filename, sizeof(symfs_filename), "%s%s", |
905 | symbol_conf.symfs, filename); | 924 | symbol_conf.symfs, filename); |
906 | free_filename = false; | 925 | free_filename = false; |
@@ -1091,8 +1110,7 @@ static void symbol__free_source_line(struct symbol *sym, int len) | |||
1091 | src_line = (void *)src_line + sizeof_src_line; | 1110 | src_line = (void *)src_line + sizeof_src_line; |
1092 | } | 1111 | } |
1093 | 1112 | ||
1094 | free(notes->src->lines); | 1113 | zfree(¬es->src->lines); |
1095 | notes->src->lines = NULL; | ||
1096 | } | 1114 | } |
1097 | 1115 | ||
1098 | /* Get the filename:line for the colored entries */ | 1116 | /* Get the filename:line for the colored entries */ |
@@ -1376,3 +1394,8 @@ int symbol__tty_annotate(struct symbol *sym, struct map *map, | |||
1376 | 1394 | ||
1377 | return 0; | 1395 | return 0; |
1378 | } | 1396 | } |
1397 | |||
1398 | int hist_entry__annotate(struct hist_entry *he, size_t privsize) | ||
1399 | { | ||
1400 | return symbol__annotate(he->ms.sym, he->ms.map, privsize); | ||
1401 | } | ||