diff options
Diffstat (limited to 'tools/perf/util/annotate.c')
-rw-r--r-- | tools/perf/util/annotate.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 4db73d5a0dbc..7e5a1e8874ce 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c | |||
@@ -354,9 +354,6 @@ static struct ins_ops nop_ops = { | |||
354 | .scnprintf = nop__scnprintf, | 354 | .scnprintf = nop__scnprintf, |
355 | }; | 355 | }; |
356 | 356 | ||
357 | /* | ||
358 | * Must be sorted by name! | ||
359 | */ | ||
360 | static struct ins instructions[] = { | 357 | static struct ins instructions[] = { |
361 | { .name = "add", .ops = &mov_ops, }, | 358 | { .name = "add", .ops = &mov_ops, }, |
362 | { .name = "addl", .ops = &mov_ops, }, | 359 | { .name = "addl", .ops = &mov_ops, }, |
@@ -372,8 +369,8 @@ static struct ins instructions[] = { | |||
372 | { .name = "bgt", .ops = &jump_ops, }, | 369 | { .name = "bgt", .ops = &jump_ops, }, |
373 | { .name = "bhi", .ops = &jump_ops, }, | 370 | { .name = "bhi", .ops = &jump_ops, }, |
374 | { .name = "bl", .ops = &call_ops, }, | 371 | { .name = "bl", .ops = &call_ops, }, |
375 | { .name = "blt", .ops = &jump_ops, }, | ||
376 | { .name = "bls", .ops = &jump_ops, }, | 372 | { .name = "bls", .ops = &jump_ops, }, |
373 | { .name = "blt", .ops = &jump_ops, }, | ||
377 | { .name = "blx", .ops = &call_ops, }, | 374 | { .name = "blx", .ops = &call_ops, }, |
378 | { .name = "bne", .ops = &jump_ops, }, | 375 | { .name = "bne", .ops = &jump_ops, }, |
379 | #endif | 376 | #endif |
@@ -449,18 +446,39 @@ static struct ins instructions[] = { | |||
449 | { .name = "xbeginq", .ops = &jump_ops, }, | 446 | { .name = "xbeginq", .ops = &jump_ops, }, |
450 | }; | 447 | }; |
451 | 448 | ||
452 | static int ins__cmp(const void *name, const void *insp) | 449 | static int ins__key_cmp(const void *name, const void *insp) |
453 | { | 450 | { |
454 | const struct ins *ins = insp; | 451 | const struct ins *ins = insp; |
455 | 452 | ||
456 | return strcmp(name, ins->name); | 453 | return strcmp(name, ins->name); |
457 | } | 454 | } |
458 | 455 | ||
456 | static int ins__cmp(const void *a, const void *b) | ||
457 | { | ||
458 | const struct ins *ia = a; | ||
459 | const struct ins *ib = b; | ||
460 | |||
461 | return strcmp(ia->name, ib->name); | ||
462 | } | ||
463 | |||
464 | static void ins__sort(void) | ||
465 | { | ||
466 | const int nmemb = ARRAY_SIZE(instructions); | ||
467 | |||
468 | qsort(instructions, nmemb, sizeof(struct ins), ins__cmp); | ||
469 | } | ||
470 | |||
459 | static struct ins *ins__find(const char *name) | 471 | static struct ins *ins__find(const char *name) |
460 | { | 472 | { |
461 | const int nmemb = ARRAY_SIZE(instructions); | 473 | const int nmemb = ARRAY_SIZE(instructions); |
474 | static bool sorted; | ||
475 | |||
476 | if (!sorted) { | ||
477 | ins__sort(); | ||
478 | sorted = true; | ||
479 | } | ||
462 | 480 | ||
463 | return bsearch(name, instructions, nmemb, sizeof(struct ins), ins__cmp); | 481 | return bsearch(name, instructions, nmemb, sizeof(struct ins), ins__key_cmp); |
464 | } | 482 | } |
465 | 483 | ||
466 | int symbol__annotate_init(struct map *map __maybe_unused, struct symbol *sym) | 484 | int symbol__annotate_init(struct map *map __maybe_unused, struct symbol *sym) |
@@ -1122,7 +1140,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize) | |||
1122 | } else if (dso__is_kcore(dso)) { | 1140 | } else if (dso__is_kcore(dso)) { |
1123 | goto fallback; | 1141 | goto fallback; |
1124 | } else if (readlink(symfs_filename, command, sizeof(command)) < 0 || | 1142 | } else if (readlink(symfs_filename, command, sizeof(command)) < 0 || |
1125 | strstr(command, "[kernel.kallsyms]") || | 1143 | strstr(command, DSO__NAME_KALLSYMS) || |
1126 | access(symfs_filename, R_OK)) { | 1144 | access(symfs_filename, R_OK)) { |
1127 | free(filename); | 1145 | free(filename); |
1128 | fallback: | 1146 | fallback: |