linux/tools/perf/util/annotate.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
   3 *
   4 * Parts came from builtin-annotate.c, see those files for further
   5 * copyright notes.
   6 *
   7 * Released under the GPL v2. (and only v2, not any later version)
   8 */
   9
  10#include "util.h"
  11#include "ui/ui.h"
  12#include "sort.h"
  13#include "build-id.h"
  14#include "color.h"
  15#include "cache.h"
  16#include "symbol.h"
  17#include "debug.h"
  18#include "annotate.h"
  19#include "evsel.h"
  20#include "block-range.h"
  21#include "arch/common.h"
  22#include <regex.h>
  23#include <pthread.h>
  24#include <linux/bitops.h>
  25#include <sys/utsname.h>
  26
  27const char      *disassembler_style;
  28const char      *objdump_path;
  29static regex_t   file_lineno;
  30
  31static struct ins_ops *ins__find(struct arch *arch, const char *name);
  32static void ins__sort(struct arch *arch);
  33static int disasm_line__parse(char *line, const char **namep, char **rawp);
  34
  35struct arch {
  36        const char      *name;
  37        struct ins      *instructions;
  38        size_t          nr_instructions;
  39        size_t          nr_instructions_allocated;
  40        struct ins_ops  *(*associate_instruction_ops)(struct arch *arch, const char *name);
  41        bool            sorted_instructions;
  42        bool            initialized;
  43        void            *priv;
  44        int             (*init)(struct arch *arch);
  45        struct          {
  46                char comment_char;
  47                char skip_functions_char;
  48        } objdump;
  49};
  50
  51static struct ins_ops call_ops;
  52static struct ins_ops dec_ops;
  53static struct ins_ops jump_ops;
  54static struct ins_ops mov_ops;
  55static struct ins_ops nop_ops;
  56static struct ins_ops lock_ops;
  57static struct ins_ops ret_ops;
  58
  59static int arch__grow_instructions(struct arch *arch)
  60{
  61        struct ins *new_instructions;
  62        size_t new_nr_allocated;
  63
  64        if (arch->nr_instructions_allocated == 0 && arch->instructions)
  65                goto grow_from_non_allocated_table;
  66
  67        new_nr_allocated = arch->nr_instructions_allocated + 128;
  68        new_instructions = realloc(arch->instructions, new_nr_allocated * sizeof(struct ins));
  69        if (new_instructions == NULL)
  70                return -1;
  71
  72out_update_instructions:
  73        arch->instructions = new_instructions;
  74        arch->nr_instructions_allocated = new_nr_allocated;
  75        return 0;
  76
  77grow_from_non_allocated_table:
  78        new_nr_allocated = arch->nr_instructions + 128;
  79        new_instructions = calloc(new_nr_allocated, sizeof(struct ins));
  80        if (new_instructions == NULL)
  81                return -1;
  82
  83        memcpy(new_instructions, arch->instructions, arch->nr_instructions);
  84        goto out_update_instructions;
  85}
  86
  87static int arch__associate_ins_ops(struct arch* arch, const char *name, struct ins_ops *ops)
  88{
  89        struct ins *ins;
  90
  91        if (arch->nr_instructions == arch->nr_instructions_allocated &&
  92            arch__grow_instructions(arch))
  93                return -1;
  94
  95        ins = &arch->instructions[arch->nr_instructions];
  96        ins->name = strdup(name);
  97        if (!ins->name)
  98                return -1;
  99
 100        ins->ops  = ops;
 101        arch->nr_instructions++;
 102
 103        ins__sort(arch);
 104        return 0;
 105}
 106
 107#include "arch/arm/annotate/instructions.c"
 108#include "arch/arm64/annotate/instructions.c"
 109#include "arch/x86/annotate/instructions.c"
 110#include "arch/powerpc/annotate/instructions.c"
 111
 112static struct arch architectures[] = {
 113        {
 114                .name = "arm",
 115                .init = arm__annotate_init,
 116        },
 117        {
 118                .name = "arm64",
 119                .init = arm64__annotate_init,
 120        },
 121        {
 122                .name = "x86",
 123                .instructions = x86__instructions,
 124                .nr_instructions = ARRAY_SIZE(x86__instructions),
 125                .objdump =  {
 126                        .comment_char = '#',
 127                },
 128        },
 129        {
 130                .name = "powerpc",
 131                .init = powerpc__annotate_init,
 132        },
 133        {
 134                .name = "s390",
 135                .objdump =  {
 136                        .comment_char = '#',
 137                },
 138        },
 139};
 140
 141static void ins__delete(struct ins_operands *ops)
 142{
 143        if (ops == NULL)
 144                return;
 145        zfree(&ops->source.raw);
 146        zfree(&ops->source.name);
 147        zfree(&ops->target.raw);
 148        zfree(&ops->target.name);
 149}
 150
 151static int ins__raw_scnprintf(struct ins *ins, char *bf, size_t size,
 152                              struct ins_operands *ops)
 153{
 154        return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->raw);
 155}
 156
 157int ins__scnprintf(struct ins *ins, char *bf, size_t size,
 158                  struct ins_operands *ops)
 159{
 160        if (ins->ops->scnprintf)
 161                return ins->ops->scnprintf(ins, bf, size, ops);
 162
 163        return ins__raw_scnprintf(ins, bf, size, ops);
 164}
 165
 166static int call__parse(struct arch *arch, struct ins_operands *ops, struct map *map)
 167{
 168        char *endptr, *tok, *name;
 169
 170        ops->target.addr = strtoull(ops->raw, &endptr, 16);
 171
 172        name = strchr(endptr, '<');
 173        if (name == NULL)
 174                goto indirect_call;
 175
 176        name++;
 177
 178        if (arch->objdump.skip_functions_char &&
 179            strchr(name, arch->objdump.skip_functions_char))
 180                return -1;
 181
 182        tok = strchr(name, '>');
 183        if (tok == NULL)
 184                return -1;
 185
 186        *tok = '\0';
 187        ops->target.name = strdup(name);
 188        *tok = '>';
 189
 190        return ops->target.name == NULL ? -1 : 0;
 191
 192indirect_call:
 193        tok = strchr(endptr, '*');
 194        if (tok == NULL) {
 195                struct symbol *sym = map__find_symbol(map, map->map_ip(map, ops->target.addr));
 196                if (sym != NULL)
 197                        ops->target.name = strdup(sym->name);
 198                else
 199                        ops->target.addr = 0;
 200                return 0;
 201        }
 202
 203        ops->target.addr = strtoull(tok + 1, NULL, 16);
 204        return 0;
 205}
 206
 207static int call__scnprintf(struct ins *ins, char *bf, size_t size,
 208                           struct ins_operands *ops)
 209{
 210        if (ops->target.name)
 211                return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->target.name);
 212
 213        if (ops->target.addr == 0)
 214                return ins__raw_scnprintf(ins, bf, size, ops);
 215
 216        return scnprintf(bf, size, "%-6.6s *%" PRIx64, ins->name, ops->target.addr);
 217}
 218
 219static struct ins_ops call_ops = {
 220        .parse     = call__parse,
 221        .scnprintf = call__scnprintf,
 222};
 223
 224bool ins__is_call(const struct ins *ins)
 225{
 226        return ins->ops == &call_ops;
 227}
 228
 229static int jump__parse(struct arch *arch __maybe_unused, struct ins_operands *ops, struct map *map __maybe_unused)
 230{
 231        const char *s = strchr(ops->raw, '+');
 232        const char *c = strchr(ops->raw, ',');
 233
 234        if (c++ != NULL)
 235                ops->target.addr = strtoull(c, NULL, 16);
 236        else
 237                ops->target.addr = strtoull(ops->raw, NULL, 16);
 238
 239        if (s++ != NULL) {
 240                ops->target.offset = strtoull(s, NULL, 16);
 241                ops->target.offset_avail = true;
 242        } else {
 243                ops->target.offset_avail = false;
 244        }
 245
 246        return 0;
 247}
 248
 249static int jump__scnprintf(struct ins *ins, char *bf, size_t size,
 250                           struct ins_operands *ops)
 251{
 252        if (!ops->target.addr || ops->target.offset < 0)
 253                return ins__raw_scnprintf(ins, bf, size, ops);
 254
 255        return scnprintf(bf, size, "%-6.6s %" PRIx64, ins->name, ops->target.offset);
 256}
 257
 258static struct ins_ops jump_ops = {
 259        .parse     = jump__parse,
 260        .scnprintf = jump__scnprintf,
 261};
 262
 263bool ins__is_jump(const struct ins *ins)
 264{
 265        return ins->ops == &jump_ops;
 266}
 267
 268static int comment__symbol(char *raw, char *comment, u64 *addrp, char **namep)
 269{
 270        char *endptr, *name, *t;
 271
 272        if (strstr(raw, "(%rip)") == NULL)
 273                return 0;
 274
 275        *addrp = strtoull(comment, &endptr, 16);
 276        name = strchr(endptr, '<');
 277        if (name == NULL)
 278                return -1;
 279
 280        name++;
 281
 282        t = strchr(name, '>');
 283        if (t == NULL)
 284                return 0;
 285
 286        *t = '\0';
 287        *namep = strdup(name);
 288        *t = '>';
 289
 290        return 0;
 291}
 292
 293static int lock__parse(struct arch *arch, struct ins_operands *ops, struct map *map)
 294{
 295        ops->locked.ops = zalloc(sizeof(*ops->locked.ops));
 296        if (ops->locked.ops == NULL)
 297                return 0;
 298
 299        if (disasm_line__parse(ops->raw, &ops->locked.ins.name, &ops->locked.ops->raw) < 0)
 300                goto out_free_ops;
 301
 302        ops->locked.ins.ops = ins__find(arch, ops->locked.ins.name);
 303
 304        if (ops->locked.ins.ops == NULL)
 305                goto out_free_ops;
 306
 307        if (ops->locked.ins.ops->parse &&
 308            ops->locked.ins.ops->parse(arch, ops->locked.ops, map) < 0)
 309                goto out_free_ops;
 310
 311        return 0;
 312
 313out_free_ops:
 314        zfree(&ops->locked.ops);
 315        return 0;
 316}
 317
 318static int lock__scnprintf(struct ins *ins, char *bf, size_t size,
 319                           struct ins_operands *ops)
 320{
 321        int printed;
 322
 323        if (ops->locked.ins.ops == NULL)
 324                return ins__raw_scnprintf(ins, bf, size, ops);
 325
 326        printed = scnprintf(bf, size, "%-6.6s ", ins->name);
 327        return printed + ins__scnprintf(&ops->locked.ins, bf + printed,
 328                                        size - printed, ops->locked.ops);
 329}
 330
 331static void lock__delete(struct ins_operands *ops)
 332{
 333        struct ins *ins = &ops->locked.ins;
 334
 335        if (ins->ops && ins->ops->free)
 336                ins->ops->free(ops->locked.ops);
 337        else
 338                ins__delete(ops->locked.ops);
 339
 340        zfree(&ops->locked.ops);
 341        zfree(&ops->target.raw);
 342        zfree(&ops->target.name);
 343}
 344
 345static struct ins_ops lock_ops = {
 346        .free      = lock__delete,
 347        .parse     = lock__parse,
 348        .scnprintf = lock__scnprintf,
 349};
 350
 351static int mov__parse(struct arch *arch, struct ins_operands *ops, struct map *map __maybe_unused)
 352{
 353        char *s = strchr(ops->raw, ','), *target, *comment, prev;
 354
 355        if (s == NULL)
 356                return -1;
 357
 358        *s = '\0';
 359        ops->source.raw = strdup(ops->raw);
 360        *s = ',';
 361
 362        if (ops->source.raw == NULL)
 363                return -1;
 364
 365        target = ++s;
 366        comment = strchr(s, arch->objdump.comment_char);
 367
 368        if (comment != NULL)
 369                s = comment - 1;
 370        else
 371                s = strchr(s, '\0') - 1;
 372
 373        while (s > target && isspace(s[0]))
 374                --s;
 375        s++;
 376        prev = *s;
 377        *s = '\0';
 378
 379        ops->target.raw = strdup(target);
 380        *s = prev;
 381
 382        if (ops->target.raw == NULL)
 383                goto out_free_source;
 384
 385        if (comment == NULL)
 386                return 0;
 387
 388        while (comment[0] != '\0' && isspace(comment[0]))
 389                ++comment;
 390
 391        comment__symbol(ops->source.raw, comment, &ops->source.addr, &ops->source.name);
 392        comment__symbol(ops->target.raw, comment, &ops->target.addr, &ops->target.name);
 393
 394        return 0;
 395
 396out_free_source:
 397        zfree(&ops->source.raw);
 398        return -1;
 399}
 400
 401static int mov__scnprintf(struct ins *ins, char *bf, size_t size,
 402                           struct ins_operands *ops)
 403{
 404        return scnprintf(bf, size, "%-6.6s %s,%s", ins->name,
 405                         ops->source.name ?: ops->source.raw,
 406                         ops->target.name ?: ops->target.raw);
 407}
 408
 409static struct ins_ops mov_ops = {
 410        .parse     = mov__parse,
 411        .scnprintf = mov__scnprintf,
 412};
 413
 414static int dec__parse(struct arch *arch __maybe_unused, struct ins_operands *ops, struct map *map __maybe_unused)
 415{
 416        char *target, *comment, *s, prev;
 417
 418        target = s = ops->raw;
 419
 420        while (s[0] != '\0' && !isspace(s[0]))
 421                ++s;
 422        prev = *s;
 423        *s = '\0';
 424
 425        ops->target.raw = strdup(target);
 426        *s = prev;
 427
 428        if (ops->target.raw == NULL)
 429                return -1;
 430
 431        comment = strchr(s, arch->objdump.comment_char);
 432        if (comment == NULL)
 433                return 0;
 434
 435        while (comment[0] != '\0' && isspace(comment[0]))
 436                ++comment;
 437
 438        comment__symbol(ops->target.raw, comment, &ops->target.addr, &ops->target.name);
 439
 440        return 0;
 441}
 442
 443static int dec__scnprintf(struct ins *ins, char *bf, size_t size,
 444                           struct ins_operands *ops)
 445{
 446        return scnprintf(bf, size, "%-6.6s %s", ins->name,
 447                         ops->target.name ?: ops->target.raw);
 448}
 449
 450static struct ins_ops dec_ops = {
 451        .parse     = dec__parse,
 452        .scnprintf = dec__scnprintf,
 453};
 454
 455static int nop__scnprintf(struct ins *ins __maybe_unused, char *bf, size_t size,
 456                          struct ins_operands *ops __maybe_unused)
 457{
 458        return scnprintf(bf, size, "%-6.6s", "nop");
 459}
 460
 461static struct ins_ops nop_ops = {
 462        .scnprintf = nop__scnprintf,
 463};
 464
 465static struct ins_ops ret_ops = {
 466        .scnprintf = ins__raw_scnprintf,
 467};
 468
 469bool ins__is_ret(const struct ins *ins)
 470{
 471        return ins->ops == &ret_ops;
 472}
 473
 474static int ins__key_cmp(const void *name, const void *insp)
 475{
 476        const struct ins *ins = insp;
 477
 478        return strcmp(name, ins->name);
 479}
 480
 481static int ins__cmp(const void *a, const void *b)
 482{
 483        const struct ins *ia = a;
 484        const struct ins *ib = b;
 485
 486        return strcmp(ia->name, ib->name);
 487}
 488
 489static void ins__sort(struct arch *arch)
 490{
 491        const int nmemb = arch->nr_instructions;
 492
 493        qsort(arch->instructions, nmemb, sizeof(struct ins), ins__cmp);
 494}
 495
 496static struct ins_ops *__ins__find(struct arch *arch, const char *name)
 497{
 498        struct ins *ins;
 499        const int nmemb = arch->nr_instructions;
 500
 501        if (!arch->sorted_instructions) {
 502                ins__sort(arch);
 503                arch->sorted_instructions = true;
 504        }
 505
 506        ins = bsearch(name, arch->instructions, nmemb, sizeof(struct ins), ins__key_cmp);
 507        return ins ? ins->ops : NULL;
 508}
 509
 510static struct ins_ops *ins__find(struct arch *arch, const char *name)
 511{
 512        struct ins_ops *ops = __ins__find(arch, name);
 513
 514        if (!ops && arch->associate_instruction_ops)
 515                ops = arch->associate_instruction_ops(arch, name);
 516
 517        return ops;
 518}
 519
 520static int arch__key_cmp(const void *name, const void *archp)
 521{
 522        const struct arch *arch = archp;
 523
 524        return strcmp(name, arch->name);
 525}
 526
 527static int arch__cmp(const void *a, const void *b)
 528{
 529        const struct arch *aa = a;
 530        const struct arch *ab = b;
 531
 532        return strcmp(aa->name, ab->name);
 533}
 534
 535static void arch__sort(void)
 536{
 537        const int nmemb = ARRAY_SIZE(architectures);
 538
 539        qsort(architectures, nmemb, sizeof(struct arch), arch__cmp);
 540}
 541
 542static struct arch *arch__find(const char *name)
 543{
 544        const int nmemb = ARRAY_SIZE(architectures);
 545        static bool sorted;
 546
 547        if (!sorted) {
 548                arch__sort();
 549                sorted = true;
 550        }
 551
 552        return bsearch(name, architectures, nmemb, sizeof(struct arch), arch__key_cmp);
 553}
 554
 555int symbol__alloc_hist(struct symbol *sym)
 556{
 557        struct annotation *notes = symbol__annotation(sym);
 558        const size_t size = symbol__size(sym);
 559        size_t sizeof_sym_hist;
 560
 561        /* Check for overflow when calculating sizeof_sym_hist */
 562        if (size > (SIZE_MAX - sizeof(struct sym_hist)) / sizeof(u64))
 563                return -1;
 564
 565        sizeof_sym_hist = (sizeof(struct sym_hist) + size * sizeof(u64));
 566
 567        /* Check for overflow in zalloc argument */
 568        if (sizeof_sym_hist > (SIZE_MAX - sizeof(*notes->src))
 569                                / symbol_conf.nr_events)
 570                return -1;
 571
 572        notes->src = zalloc(sizeof(*notes->src) + symbol_conf.nr_events * sizeof_sym_hist);
 573        if (notes->src == NULL)
 574                return -1;
 575        notes->src->sizeof_sym_hist = sizeof_sym_hist;
 576        notes->src->nr_histograms   = symbol_conf.nr_events;
 577        INIT_LIST_HEAD(&notes->src->source);
 578        return 0;
 579}
 580
 581/* The cycles histogram is lazily allocated. */
 582static int symbol__alloc_hist_cycles(struct symbol *sym)
 583{
 584        struct annotation *notes = symbol__annotation(sym);
 585        const size_t size = symbol__size(sym);
 586
 587        notes->src->cycles_hist = calloc(size, sizeof(struct cyc_hist));
 588        if (notes->src->cycles_hist == NULL)
 589                return -1;
 590        return 0;
 591}
 592
 593void symbol__annotate_zero_histograms(struct symbol *sym)
 594{
 595        struct annotation *notes = symbol__annotation(sym);
 596
 597        pthread_mutex_lock(&notes->lock);
 598        if (notes->src != NULL) {
 599                memset(notes->src->histograms, 0,
 600                       notes->src->nr_histograms * notes->src->sizeof_sym_hist);
 601                if (notes->src->cycles_hist)
 602                        memset(notes->src->cycles_hist, 0,
 603                                symbol__size(sym) * sizeof(struct cyc_hist));
 604        }
 605        pthread_mutex_unlock(&notes->lock);
 606}
 607
 608static int __symbol__account_cycles(struct annotation *notes,
 609                                    u64 start,
 610                                    unsigned offset, unsigned cycles,
 611                                    unsigned have_start)
 612{
 613        struct cyc_hist *ch;
 614
 615        ch = notes->src->cycles_hist;
 616        /*
 617         * For now we can only account one basic block per
 618         * final jump. But multiple could be overlapping.
 619         * Always account the longest one. So when
 620         * a shorter one has been already seen throw it away.
 621         *
 622         * We separately always account the full cycles.
 623         */
 624        ch[offset].num_aggr++;
 625        ch[offset].cycles_aggr += cycles;
 626
 627        if (!have_start && ch[offset].have_start)
 628                return 0;
 629        if (ch[offset].num) {
 630                if (have_start && (!ch[offset].have_start ||
 631                                   ch[offset].start > start)) {
 632                        ch[offset].have_start = 0;
 633                        ch[offset].cycles = 0;
 634                        ch[offset].num = 0;
 635                        if (ch[offset].reset < 0xffff)
 636                                ch[offset].reset++;
 637                } else if (have_start &&
 638                           ch[offset].start < start)
 639                        return 0;
 640        }
 641        ch[offset].have_start = have_start;
 642        ch[offset].start = start;
 643        ch[offset].cycles += cycles;
 644        ch[offset].num++;
 645        return 0;
 646}
 647
 648static int __symbol__inc_addr_samples(struct symbol *sym, struct map *map,
 649                                      struct annotation *notes, int evidx, u64 addr)
 650{
 651        unsigned offset;
 652        struct sym_hist *h;
 653
 654        pr_debug3("%s: addr=%#" PRIx64 "\n", __func__, map->unmap_ip(map, addr));
 655
 656        if ((addr < sym->start || addr >= sym->end) &&
 657            (addr != sym->end || sym->start != sym->end)) {
 658                pr_debug("%s(%d): ERANGE! sym->name=%s, start=%#" PRIx64 ", addr=%#" PRIx64 ", end=%#" PRIx64 "\n",
 659                       __func__, __LINE__, sym->name, sym->start, addr, sym->end);
 660                return -ERANGE;
 661        }
 662
 663        offset = addr - sym->start;
 664        h = annotation__histogram(notes, evidx);
 665        h->sum++;
 666        h->addr[offset]++;
 667
 668        pr_debug3("%#" PRIx64 " %s: period++ [addr: %#" PRIx64 ", %#" PRIx64
 669                  ", evidx=%d] => %" PRIu64 "\n", sym->start, sym->name,
 670                  addr, addr - sym->start, evidx, h->addr[offset]);
 671        return 0;
 672}
 673
 674static struct annotation *symbol__get_annotation(struct symbol *sym, bool cycles)
 675{
 676        struct annotation *notes = symbol__annotation(sym);
 677
 678        if (notes->src == NULL) {
 679                if (symbol__alloc_hist(sym) < 0)
 680                        return NULL;
 681        }
 682        if (!notes->src->cycles_hist && cycles) {
 683                if (symbol__alloc_hist_cycles(sym) < 0)
 684                        return NULL;
 685        }
 686        return notes;
 687}
 688
 689static int symbol__inc_addr_samples(struct symbol *sym, struct map *map,
 690                                    int evidx, u64 addr)
 691{
 692        struct annotation *notes;
 693
 694        if (sym == NULL)
 695                return 0;
 696        notes = symbol__get_annotation(sym, false);
 697        if (notes == NULL)
 698                return -ENOMEM;
 699        return __symbol__inc_addr_samples(sym, map, notes, evidx, addr);
 700}
 701
 702static int symbol__account_cycles(u64 addr, u64 start,
 703                                  struct symbol *sym, unsigned cycles)
 704{
 705        struct annotation *notes;
 706        unsigned offset;
 707
 708        if (sym == NULL)
 709                return 0;
 710        notes = symbol__get_annotation(sym, true);
 711        if (notes == NULL)
 712                return -ENOMEM;
 713        if (addr < sym->start || addr >= sym->end)
 714                return -ERANGE;
 715
 716        if (start) {
 717                if (start < sym->start || start >= sym->end)
 718                        return -ERANGE;
 719                if (start >= addr)
 720                        start = 0;
 721        }
 722        offset = addr - sym->start;
 723        return __symbol__account_cycles(notes,
 724                                        start ? start - sym->start : 0,
 725                                        offset, cycles,
 726                                        !!start);
 727}
 728
 729int addr_map_symbol__account_cycles(struct addr_map_symbol *ams,
 730                                    struct addr_map_symbol *start,
 731                                    unsigned cycles)
 732{
 733        u64 saddr = 0;
 734        int err;
 735
 736        if (!cycles)
 737                return 0;
 738
 739        /*
 740         * Only set start when IPC can be computed. We can only
 741         * compute it when the basic block is completely in a single
 742         * function.
 743         * Special case the case when the jump is elsewhere, but
 744         * it starts on the function start.
 745         */
 746        if (start &&
 747                (start->sym == ams->sym ||
 748                 (ams->sym &&
 749                   start->addr == ams->sym->start + ams->map->start)))
 750                saddr = start->al_addr;
 751        if (saddr == 0)
 752                pr_debug2("BB with bad start: addr %"PRIx64" start %"PRIx64" sym %"PRIx64" saddr %"PRIx64"\n",
 753                        ams->addr,
 754                        start ? start->addr : 0,
 755                        ams->sym ? ams->sym->start + ams->map->start : 0,
 756                        saddr);
 757        err = symbol__account_cycles(ams->al_addr, saddr, ams->sym, cycles);
 758        if (err)
 759                pr_debug2("account_cycles failed %d\n", err);
 760        return err;
 761}
 762
 763int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, int evidx)
 764{
 765        return symbol__inc_addr_samples(ams->sym, ams->map, evidx, ams->al_addr);
 766}
 767
 768int hist_entry__inc_addr_samples(struct hist_entry *he, int evidx, u64 ip)
 769{
 770        return symbol__inc_addr_samples(he->ms.sym, he->ms.map, evidx, ip);
 771}
 772
 773static void disasm_line__init_ins(struct disasm_line *dl, struct arch *arch, struct map *map)
 774{
 775        dl->ins.ops = ins__find(arch, dl->ins.name);
 776
 777        if (!dl->ins.ops)
 778                return;
 779
 780        if (dl->ins.ops->parse && dl->ins.ops->parse(arch, &dl->ops, map) < 0)
 781                dl->ins.ops = NULL;
 782}
 783
 784static int disasm_line__parse(char *line, const char **namep, char **rawp)
 785{
 786        char *name = line, tmp;
 787
 788        while (isspace(name[0]))
 789                ++name;
 790
 791        if (name[0] == '\0')
 792                return -1;
 793
 794        *rawp = name + 1;
 795
 796        while ((*rawp)[0] != '\0' && !isspace((*rawp)[0]))
 797                ++*rawp;
 798
 799        tmp = (*rawp)[0];
 800        (*rawp)[0] = '\0';
 801        *namep = strdup(name);
 802
 803        if (*namep == NULL)
 804                goto out_free_name;
 805
 806        (*rawp)[0] = tmp;
 807
 808        if ((*rawp)[0] != '\0') {
 809                (*rawp)++;
 810                while (isspace((*rawp)[0]))
 811                        ++(*rawp);
 812        }
 813
 814        return 0;
 815
 816out_free_name:
 817        free((void *)namep);
 818        *namep = NULL;
 819        return -1;
 820}
 821
 822static struct disasm_line *disasm_line__new(s64 offset, char *line,
 823                                            size_t privsize, int line_nr,
 824                                            struct arch *arch,
 825                                            struct map *map)
 826{
 827        struct disasm_line *dl = zalloc(sizeof(*dl) + privsize);
 828
 829        if (dl != NULL) {
 830                dl->offset = offset;
 831                dl->line = strdup(line);
 832                dl->line_nr = line_nr;
 833                if (dl->line == NULL)
 834                        goto out_delete;
 835
 836                if (offset != -1) {
 837                        if (disasm_line__parse(dl->line, &dl->ins.name, &dl->ops.raw) < 0)
 838                                goto out_free_line;
 839
 840                        disasm_line__init_ins(dl, arch, map);
 841                }
 842        }
 843
 844        return dl;
 845
 846out_free_line:
 847        zfree(&dl->line);
 848out_delete:
 849        free(dl);
 850        return NULL;
 851}
 852
 853void disasm_line__free(struct disasm_line *dl)
 854{
 855        zfree(&dl->line);
 856        if (dl->ins.ops && dl->ins.ops->free)
 857                dl->ins.ops->free(&dl->ops);
 858        else
 859                ins__delete(&dl->ops);
 860        free((void *)dl->ins.name);
 861        dl->ins.name = NULL;
 862        free(dl);
 863}
 864
 865int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw)
 866{
 867        if (raw || !dl->ins.ops)
 868                return scnprintf(bf, size, "%-6.6s %s", dl->ins.name, dl->ops.raw);
 869
 870        return ins__scnprintf(&dl->ins, bf, size, &dl->ops);
 871}
 872
 873static void disasm__add(struct list_head *head, struct disasm_line *line)
 874{
 875        list_add_tail(&line->node, head);
 876}
 877
 878struct disasm_line *disasm__get_next_ip_line(struct list_head *head, struct disasm_line *pos)
 879{
 880        list_for_each_entry_continue(pos, head, node)
 881                if (pos->offset >= 0)
 882                        return pos;
 883
 884        return NULL;
 885}
 886
 887double disasm__calc_percent(struct annotation *notes, int evidx, s64 offset,
 888                            s64 end, const char **path, u64 *nr_samples)
 889{
 890        struct source_line *src_line = notes->src->lines;
 891        double percent = 0.0;
 892        *nr_samples = 0;
 893
 894        if (src_line) {
 895                size_t sizeof_src_line = sizeof(*src_line) +
 896                                sizeof(src_line->samples) * (src_line->nr_pcnt - 1);
 897
 898                while (offset < end) {
 899                        src_line = (void *)notes->src->lines +
 900                                        (sizeof_src_line * offset);
 901
 902                        if (*path == NULL)
 903                                *path = src_line->path;
 904
 905                        percent += src_line->samples[evidx].percent;
 906                        *nr_samples += src_line->samples[evidx].nr;
 907                        offset++;
 908                }
 909        } else {
 910                struct sym_hist *h = annotation__histogram(notes, evidx);
 911                unsigned int hits = 0;
 912
 913                while (offset < end)
 914                        hits += h->addr[offset++];
 915
 916                if (h->sum) {
 917                        *nr_samples = hits;
 918                        percent = 100.0 * hits / h->sum;
 919                }
 920        }
 921
 922        return percent;
 923}
 924
 925static const char *annotate__address_color(struct block_range *br)
 926{
 927        double cov = block_range__coverage(br);
 928
 929        if (cov >= 0) {
 930                /* mark red for >75% coverage */
 931                if (cov > 0.75)
 932                        return PERF_COLOR_RED;
 933
 934                /* mark dull for <1% coverage */
 935                if (cov < 0.01)
 936                        return PERF_COLOR_NORMAL;
 937        }
 938
 939        return PERF_COLOR_MAGENTA;
 940}
 941
 942static const char *annotate__asm_color(struct block_range *br)
 943{
 944        double cov = block_range__coverage(br);
 945
 946        if (cov >= 0) {
 947                /* mark dull for <1% coverage */
 948                if (cov < 0.01)
 949                        return PERF_COLOR_NORMAL;
 950        }
 951
 952        return PERF_COLOR_BLUE;
 953}
 954
 955static void annotate__branch_printf(struct block_range *br, u64 addr)
 956{
 957        bool emit_comment = true;
 958
 959        if (!br)
 960                return;
 961
 962#if 1
 963        if (br->is_target && br->start == addr) {
 964                struct block_range *branch = br;
 965                double p;
 966
 967                /*
 968                 * Find matching branch to our target.
 969                 */
 970                while (!branch->is_branch)
 971                        branch = block_range__next(branch);
 972
 973                p = 100 *(double)br->entry / branch->coverage;
 974
 975                if (p > 0.1) {
 976                        if (emit_comment) {
 977                                emit_comment = false;
 978                                printf("\t#");
 979                        }
 980
 981                        /*
 982                         * The percentage of coverage joined at this target in relation
 983                         * to the next branch.
 984                         */
 985                        printf(" +%.2f%%", p);
 986                }
 987        }
 988#endif
 989        if (br->is_branch && br->end == addr) {
 990                double p = 100*(double)br->taken / br->coverage;
 991
 992                if (p > 0.1) {
 993                        if (emit_comment) {
 994                                emit_comment = false;
 995                                printf("\t#");
 996                        }
 997
 998                        /*
 999                         * The percentage of coverage leaving at this branch, and
1000                         * its prediction ratio.
1001                         */
1002                        printf(" -%.2f%% (p:%.2f%%)", p, 100*(double)br->pred  / br->taken);
1003                }
1004        }
1005}
1006
1007
1008static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 start,
1009                      struct perf_evsel *evsel, u64 len, int min_pcnt, int printed,
1010                      int max_lines, struct disasm_line *queue)
1011{
1012        static const char *prev_line;
1013        static const char *prev_color;
1014
1015        if (dl->offset != -1) {
1016                const char *path = NULL;
1017                u64 nr_samples;
1018                double percent, max_percent = 0.0;
1019                double *ppercents = &percent;
1020                u64 *psamples = &nr_samples;
1021                int i, nr_percent = 1;
1022                const char *color;
1023                struct annotation *notes = symbol__annotation(sym);
1024                s64 offset = dl->offset;
1025                const u64 addr = start + offset;
1026                struct disasm_line *next;
1027                struct block_range *br;
1028
1029                next = disasm__get_next_ip_line(&notes->src->source, dl);
1030
1031                if (perf_evsel__is_group_event(evsel)) {
1032                        nr_percent = evsel->nr_members;
1033                        ppercents = calloc(nr_percent, sizeof(double));
1034                        psamples = calloc(nr_percent, sizeof(u64));
1035                        if (ppercents == NULL || psamples == NULL) {
1036                                return -1;
1037                        }
1038                }
1039
1040                for (i = 0; i < nr_percent; i++) {
1041                        percent = disasm__calc_percent(notes,
1042                                        notes->src->lines ? i : evsel->idx + i,
1043                                        offset,
1044                                        next ? next->offset : (s64) len,
1045                                        &path, &nr_samples);
1046
1047                        ppercents[i] = percent;
1048                        psamples[i] = nr_samples;
1049                        if (percent > max_percent)
1050                                max_percent = percent;
1051                }
1052
1053                if (max_percent < min_pcnt)
1054                        return -1;
1055
1056                if (max_lines && printed >= max_lines)
1057                        return 1;
1058
1059                if (queue != NULL) {
1060                        list_for_each_entry_from(queue, &notes->src->source, node) {
1061                                if (queue == dl)
1062                                        break;
1063                                disasm_line__print(queue, sym, start, evsel, len,
1064                                                    0, 0, 1, NULL);
1065                        }
1066                }
1067
1068                color = get_percent_color(max_percent);
1069
1070                /*
1071                 * Also color the filename and line if needed, with
1072                 * the same color than the percentage. Don't print it
1073                 * twice for close colored addr with the same filename:line
1074                 */
1075                if (path) {
1076                        if (!prev_line || strcmp(prev_line, path)
1077                                       || color != prev_color) {
1078                                color_fprintf(stdout, color, " %s", path);
1079                                prev_line = path;
1080                                prev_color = color;
1081                        }
1082                }
1083
1084                for (i = 0; i < nr_percent; i++) {
1085                        percent = ppercents[i];
1086                        nr_samples = psamples[i];
1087                        color = get_percent_color(percent);
1088
1089                        if (symbol_conf.show_total_period)
1090                                color_fprintf(stdout, color, " %7" PRIu64,
1091                                              nr_samples);
1092                        else
1093                                color_fprintf(stdout, color, " %7.2f", percent);
1094                }
1095
1096                printf(" :      ");
1097
1098                br = block_range__find(addr);
1099                color_fprintf(stdout, annotate__address_color(br), "  %" PRIx64 ":", addr);
1100                color_fprintf(stdout, annotate__asm_color(br), "%s", dl->line);
1101                annotate__branch_printf(br, addr);
1102                printf("\n");
1103
1104                if (ppercents != &percent)
1105                        free(ppercents);
1106
1107                if (psamples != &nr_samples)
1108                        free(psamples);
1109
1110        } else if (max_lines && printed >= max_lines)
1111                return 1;
1112        else {
1113                int width = 8;
1114
1115                if (queue)
1116                        return -1;
1117
1118                if (perf_evsel__is_group_event(evsel))
1119                        width *= evsel->nr_members;
1120
1121                if (!*dl->line)
1122                        printf(" %*s:\n", width, " ");
1123                else
1124                        printf(" %*s:   %s\n", width, " ", dl->line);
1125        }
1126
1127        return 0;
1128}
1129
1130/*
1131 * symbol__parse_objdump_line() parses objdump output (with -d --no-show-raw)
1132 * which looks like following
1133 *
1134 *  0000000000415500 <_init>:
1135 *    415500:       sub    $0x8,%rsp
1136 *    415504:       mov    0x2f5ad5(%rip),%rax        # 70afe0 <_DYNAMIC+0x2f8>
1137 *    41550b:       test   %rax,%rax
1138 *    41550e:       je     415515 <_init+0x15>
1139 *    415510:       callq  416e70 <__gmon_start__@plt>
1140 *    415515:       add    $0x8,%rsp
1141 *    415519:       retq
1142 *
1143 * it will be parsed and saved into struct disasm_line as
1144 *  <offset>       <name>  <ops.raw>
1145 *
1146 * The offset will be a relative offset from the start of the symbol and -1
1147 * means that it's not a disassembly line so should be treated differently.
1148 * The ops.raw part will be parsed further according to type of the instruction.
1149 */
1150static int symbol__parse_objdump_line(struct symbol *sym, struct map *map,
1151                                      struct arch *arch,
1152                                      FILE *file, size_t privsize,
1153                                      int *line_nr)
1154{
1155        struct annotation *notes = symbol__annotation(sym);
1156        struct disasm_line *dl;
1157        char *line = NULL, *parsed_line, *tmp, *tmp2, *c;
1158        size_t line_len;
1159        s64 line_ip, offset = -1;
1160        regmatch_t match[2];
1161
1162        if (getline(&line, &line_len, file) < 0)
1163                return -1;
1164
1165        if (!line)
1166                return -1;
1167
1168        while (line_len != 0 && isspace(line[line_len - 1]))
1169                line[--line_len] = '\0';
1170
1171        c = strchr(line, '\n');
1172        if (c)
1173                *c = 0;
1174
1175        line_ip = -1;
1176        parsed_line = line;
1177
1178        /* /filename:linenr ? Save line number and ignore. */
1179        if (regexec(&file_lineno, line, 2, match, 0) == 0) {
1180                *line_nr = atoi(line + match[1].rm_so);
1181                return 0;
1182        }
1183
1184        /*
1185         * Strip leading spaces:
1186         */
1187        tmp = line;
1188        while (*tmp) {
1189                if (*tmp != ' ')
1190                        break;
1191                tmp++;
1192        }
1193
1194        if (*tmp) {
1195                /*
1196                 * Parse hexa addresses followed by ':'
1197                 */
1198                line_ip = strtoull(tmp, &tmp2, 16);
1199                if (*tmp2 != ':' || tmp == tmp2 || tmp2[1] == '\0')
1200                        line_ip = -1;
1201        }
1202
1203        if (line_ip != -1) {
1204                u64 start = map__rip_2objdump(map, sym->start),
1205                    end = map__rip_2objdump(map, sym->end);
1206
1207                offset = line_ip - start;
1208                if ((u64)line_ip < start || (u64)line_ip >= end)
1209                        offset = -1;
1210                else
1211                        parsed_line = tmp2 + 1;
1212        }
1213
1214        dl = disasm_line__new(offset, parsed_line, privsize, *line_nr, arch, map);
1215        free(line);
1216        (*line_nr)++;
1217
1218        if (dl == NULL)
1219                return -1;
1220
1221        if (!disasm_line__has_offset(dl)) {
1222                dl->ops.target.offset = dl->ops.target.addr -
1223                                        map__rip_2objdump(map, sym->start);
1224                dl->ops.target.offset_avail = true;
1225        }
1226
1227        /* kcore has no symbols, so add the call target name */
1228        if (dl->ins.ops && ins__is_call(&dl->ins) && !dl->ops.target.name) {
1229                struct addr_map_symbol target = {
1230                        .map = map,
1231                        .addr = dl->ops.target.addr,
1232                };
1233
1234                if (!map_groups__find_ams(&target) &&
1235                    target.sym->start == target.al_addr)
1236                        dl->ops.target.name = strdup(target.sym->name);
1237        }
1238
1239        disasm__add(&notes->src->source, dl);
1240
1241        return 0;
1242}
1243
1244static __attribute__((constructor)) void symbol__init_regexpr(void)
1245{
1246        regcomp(&file_lineno, "^/[^:]+:([0-9]+)", REG_EXTENDED);
1247}
1248
1249static void delete_last_nop(struct symbol *sym)
1250{
1251        struct annotation *notes = symbol__annotation(sym);
1252        struct list_head *list = &notes->src->source;
1253        struct disasm_line *dl;
1254
1255        while (!list_empty(list)) {
1256                dl = list_entry(list->prev, struct disasm_line, node);
1257
1258                if (dl->ins.ops) {
1259                        if (dl->ins.ops != &nop_ops)
1260                                return;
1261                } else {
1262                        if (!strstr(dl->line, " nop ") &&
1263                            !strstr(dl->line, " nopl ") &&
1264                            !strstr(dl->line, " nopw "))
1265                                return;
1266                }
1267
1268                list_del(&dl->node);
1269                disasm_line__free(dl);
1270        }
1271}
1272
1273int symbol__strerror_disassemble(struct symbol *sym __maybe_unused, struct map *map,
1274                              int errnum, char *buf, size_t buflen)
1275{
1276        struct dso *dso = map->dso;
1277
1278        BUG_ON(buflen == 0);
1279
1280        if (errnum >= 0) {
1281                str_error_r(errnum, buf, buflen);
1282                return 0;
1283        }
1284
1285        switch (errnum) {
1286        case SYMBOL_ANNOTATE_ERRNO__NO_VMLINUX: {
1287                char bf[SBUILD_ID_SIZE + 15] = " with build id ";
1288                char *build_id_msg = NULL;
1289
1290                if (dso->has_build_id) {
1291                        build_id__sprintf(dso->build_id,
1292                                          sizeof(dso->build_id), bf + 15);
1293                        build_id_msg = bf;
1294                }
1295                scnprintf(buf, buflen,
1296                          "No vmlinux file%s\nwas found in the path.\n\n"
1297                          "Note that annotation using /proc/kcore requires CAP_SYS_RAWIO capability.\n\n"
1298                          "Please use:\n\n"
1299                          "  perf buildid-cache -vu vmlinux\n\n"
1300                          "or:\n\n"
1301                          "  --vmlinux vmlinux\n", build_id_msg ?: "");
1302        }
1303                break;
1304        default:
1305                scnprintf(buf, buflen, "Internal error: Invalid %d error code\n", errnum);
1306                break;
1307        }
1308
1309        return 0;
1310}
1311
1312static int dso__disassemble_filename(struct dso *dso, char *filename, size_t filename_size)
1313{
1314        char linkname[PATH_MAX];
1315        char *build_id_filename;
1316
1317        if (dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS &&
1318            !dso__is_kcore(dso))
1319                return SYMBOL_ANNOTATE_ERRNO__NO_VMLINUX;
1320
1321        build_id_filename = dso__build_id_filename(dso, NULL, 0);
1322        if (build_id_filename) {
1323                __symbol__join_symfs(filename, filename_size, build_id_filename);
1324                free(build_id_filename);
1325        } else {
1326                if (dso->has_build_id)
1327                        return ENOMEM;
1328                goto fallback;
1329        }
1330
1331        if (dso__is_kcore(dso) ||
1332            readlink(filename, linkname, sizeof(linkname)) < 0 ||
1333            strstr(linkname, DSO__NAME_KALLSYMS) ||
1334            access(filename, R_OK)) {
1335fallback:
1336                /*
1337                 * If we don't have build-ids or the build-id file isn't in the
1338                 * cache, or is just a kallsyms file, well, lets hope that this
1339                 * DSO is the same as when 'perf record' ran.
1340                 */
1341                __symbol__join_symfs(filename, filename_size, dso->long_name);
1342        }
1343
1344        return 0;
1345}
1346
1347static const char *annotate__norm_arch(const char *arch_name)
1348{
1349        struct utsname uts;
1350
1351        if (!arch_name) { /* Assume we are annotating locally. */
1352                if (uname(&uts) < 0)
1353                        return NULL;
1354                arch_name = uts.machine;
1355        }
1356        return normalize_arch((char *)arch_name);
1357}
1358
1359int symbol__disassemble(struct symbol *sym, struct map *map, const char *arch_name, size_t privsize)
1360{
1361        struct dso *dso = map->dso;
1362        char command[PATH_MAX * 2];
1363        struct arch *arch = NULL;
1364        FILE *file;
1365        char symfs_filename[PATH_MAX];
1366        struct kcore_extract kce;
1367        bool delete_extract = false;
1368        int stdout_fd[2];
1369        int lineno = 0;
1370        int nline;
1371        pid_t pid;
1372        int err = dso__disassemble_filename(dso, symfs_filename, sizeof(symfs_filename));
1373
1374        if (err)
1375                return err;
1376
1377        arch_name = annotate__norm_arch(arch_name);
1378        if (!arch_name)
1379                return -1;
1380
1381        arch = arch__find(arch_name);
1382        if (arch == NULL)
1383                return -ENOTSUP;
1384
1385        if (arch->init) {
1386                err = arch->init(arch);
1387                if (err) {
1388                        pr_err("%s: failed to initialize %s arch priv area\n", __func__, arch->name);
1389                        return err;
1390                }
1391        }
1392
1393        pr_debug("%s: filename=%s, sym=%s, start=%#" PRIx64 ", end=%#" PRIx64 "\n", __func__,
1394                 symfs_filename, sym->name, map->unmap_ip(map, sym->start),
1395                 map->unmap_ip(map, sym->end));
1396
1397        pr_debug("annotating [%p] %30s : [%p] %30s\n",
1398                 dso, dso->long_name, sym, sym->name);
1399
1400        if (dso__is_kcore(dso)) {
1401                kce.kcore_filename = symfs_filename;
1402                kce.addr = map__rip_2objdump(map, sym->start);
1403                kce.offs = sym->start;
1404                kce.len = sym->end - sym->start;
1405                if (!kcore_extract__create(&kce)) {
1406                        delete_extract = true;
1407                        strlcpy(symfs_filename, kce.extract_filename,
1408                                sizeof(symfs_filename));
1409                }
1410        } else if (dso__needs_decompress(dso)) {
1411                char tmp[PATH_MAX];
1412                struct kmod_path m;
1413                int fd;
1414                bool ret;
1415
1416                if (kmod_path__parse_ext(&m, symfs_filename))
1417                        goto out;
1418
1419                snprintf(tmp, PATH_MAX, "/tmp/perf-kmod-XXXXXX");
1420
1421                fd = mkstemp(tmp);
1422                if (fd < 0) {
1423                        free(m.ext);
1424                        goto out;
1425                }
1426
1427                ret = decompress_to_file(m.ext, symfs_filename, fd);
1428
1429                if (ret)
1430                        pr_err("Cannot decompress %s %s\n", m.ext, symfs_filename);
1431
1432                free(m.ext);
1433                close(fd);
1434
1435                if (!ret)
1436                        goto out;
1437
1438                strcpy(symfs_filename, tmp);
1439        }
1440
1441        snprintf(command, sizeof(command),
1442                 "%s %s%s --start-address=0x%016" PRIx64
1443                 " --stop-address=0x%016" PRIx64
1444                 " -l -d %s %s -C %s 2>/dev/null|grep -v %s|expand",
1445                 objdump_path ? objdump_path : "objdump",
1446                 disassembler_style ? "-M " : "",
1447                 disassembler_style ? disassembler_style : "",
1448                 map__rip_2objdump(map, sym->start),
1449                 map__rip_2objdump(map, sym->end),
1450                 symbol_conf.annotate_asm_raw ? "" : "--no-show-raw",
1451                 symbol_conf.annotate_src ? "-S" : "",
1452                 symfs_filename, symfs_filename);
1453
1454        pr_debug("Executing: %s\n", command);
1455
1456        err = -1;
1457        if (pipe(stdout_fd) < 0) {
1458                pr_err("Failure creating the pipe to run %s\n", command);
1459                goto out_remove_tmp;
1460        }
1461
1462        pid = fork();
1463        if (pid < 0) {
1464                pr_err("Failure forking to run %s\n", command);
1465                goto out_close_stdout;
1466        }
1467
1468        if (pid == 0) {
1469                close(stdout_fd[0]);
1470                dup2(stdout_fd[1], 1);
1471                close(stdout_fd[1]);
1472                execl("/bin/sh", "sh", "-c", command, NULL);
1473                perror(command);
1474                exit(-1);
1475        }
1476
1477        close(stdout_fd[1]);
1478
1479        file = fdopen(stdout_fd[0], "r");
1480        if (!file) {
1481                pr_err("Failure creating FILE stream for %s\n", command);
1482                /*
1483                 * If we were using debug info should retry with
1484                 * original binary.
1485                 */
1486                goto out_remove_tmp;
1487        }
1488
1489        nline = 0;
1490        while (!feof(file)) {
1491                if (symbol__parse_objdump_line(sym, map, arch, file, privsize,
1492                            &lineno) < 0)
1493                        break;
1494                nline++;
1495        }
1496
1497        if (nline == 0)
1498                pr_err("No output from %s\n", command);
1499
1500        /*
1501         * kallsyms does not have symbol sizes so there may a nop at the end.
1502         * Remove it.
1503         */
1504        if (dso__is_kcore(dso))
1505                delete_last_nop(sym);
1506
1507        fclose(file);
1508        err = 0;
1509out_remove_tmp:
1510        close(stdout_fd[0]);
1511
1512        if (dso__needs_decompress(dso))
1513                unlink(symfs_filename);
1514
1515        if (delete_extract)
1516                kcore_extract__delete(&kce);
1517out:
1518        return err;
1519
1520out_close_stdout:
1521        close(stdout_fd[1]);
1522        goto out_remove_tmp;
1523}
1524
1525static void insert_source_line(struct rb_root *root, struct source_line *src_line)
1526{
1527        struct source_line *iter;
1528        struct rb_node **p = &root->rb_node;
1529        struct rb_node *parent = NULL;
1530        int i, ret;
1531
1532        while (*p != NULL) {
1533                parent = *p;
1534                iter = rb_entry(parent, struct source_line, node);
1535
1536                ret = strcmp(iter->path, src_line->path);
1537                if (ret == 0) {
1538                        for (i = 0; i < src_line->nr_pcnt; i++)
1539                                iter->samples[i].percent_sum += src_line->samples[i].percent;
1540                        return;
1541                }
1542
1543                if (ret < 0)
1544                        p = &(*p)->rb_left;
1545                else
1546                        p = &(*p)->rb_right;
1547        }
1548
1549        for (i = 0; i < src_line->nr_pcnt; i++)
1550                src_line->samples[i].percent_sum = src_line->samples[i].percent;
1551
1552        rb_link_node(&src_line->node, parent, p);
1553        rb_insert_color(&src_line->node, root);
1554}
1555
1556static int cmp_source_line(struct source_line *a, struct source_line *b)
1557{
1558        int i;
1559
1560        for (i = 0; i < a->nr_pcnt; i++) {
1561                if (a->samples[i].percent_sum == b->samples[i].percent_sum)
1562                        continue;
1563                return a->samples[i].percent_sum > b->samples[i].percent_sum;
1564        }
1565
1566        return 0;
1567}
1568
1569static void __resort_source_line(struct rb_root *root, struct source_line *src_line)
1570{
1571        struct source_line *iter;
1572        struct rb_node **p = &root->rb_node;
1573        struct rb_node *parent = NULL;
1574
1575        while (*p != NULL) {
1576                parent = *p;
1577                iter = rb_entry(parent, struct source_line, node);
1578
1579                if (cmp_source_line(src_line, iter))
1580                        p = &(*p)->rb_left;
1581                else
1582                        p = &(*p)->rb_right;
1583        }
1584
1585        rb_link_node(&src_line->node, parent, p);
1586        rb_insert_color(&src_line->node, root);
1587}
1588
1589static void resort_source_line(struct rb_root *dest_root, struct rb_root *src_root)
1590{
1591        struct source_line *src_line;
1592        struct rb_node *node;
1593
1594        node = rb_first(src_root);
1595        while (node) {
1596                struct rb_node *next;
1597
1598                src_line = rb_entry(node, struct source_line, node);
1599                next = rb_next(node);
1600                rb_erase(node, src_root);
1601
1602                __resort_source_line(dest_root, src_line);
1603                node = next;
1604        }
1605}
1606
1607static void symbol__free_source_line(struct symbol *sym, int len)
1608{
1609        struct annotation *notes = symbol__annotation(sym);
1610        struct source_line *src_line = notes->src->lines;
1611        size_t sizeof_src_line;
1612        int i;
1613
1614        sizeof_src_line = sizeof(*src_line) +
1615                          (sizeof(src_line->samples) * (src_line->nr_pcnt - 1));
1616
1617        for (i = 0; i < len; i++) {
1618                free_srcline(src_line->path);
1619                src_line = (void *)src_line + sizeof_src_line;
1620        }
1621
1622        zfree(&notes->src->lines);
1623}
1624
1625/* Get the filename:line for the colored entries */
1626static int symbol__get_source_line(struct symbol *sym, struct map *map,
1627                                   struct perf_evsel *evsel,
1628                                   struct rb_root *root, int len)
1629{
1630        u64 start;
1631        int i, k;
1632        int evidx = evsel->idx;
1633        struct source_line *src_line;
1634        struct annotation *notes = symbol__annotation(sym);
1635        struct sym_hist *h = annotation__histogram(notes, evidx);
1636        struct rb_root tmp_root = RB_ROOT;
1637        int nr_pcnt = 1;
1638        u64 h_sum = h->sum;
1639        size_t sizeof_src_line = sizeof(struct source_line);
1640
1641        if (perf_evsel__is_group_event(evsel)) {
1642                for (i = 1; i < evsel->nr_members; i++) {
1643                        h = annotation__histogram(notes, evidx + i);
1644                        h_sum += h->sum;
1645                }
1646                nr_pcnt = evsel->nr_members;
1647                sizeof_src_line += (nr_pcnt - 1) * sizeof(src_line->samples);
1648        }
1649
1650        if (!h_sum)
1651                return 0;
1652
1653        src_line = notes->src->lines = calloc(len, sizeof_src_line);
1654        if (!notes->src->lines)
1655                return -1;
1656
1657        start = map__rip_2objdump(map, sym->start);
1658
1659        for (i = 0; i < len; i++) {
1660                u64 offset;
1661                double percent_max = 0.0;
1662
1663                src_line->nr_pcnt = nr_pcnt;
1664
1665                for (k = 0; k < nr_pcnt; k++) {
1666                        h = annotation__histogram(notes, evidx + k);
1667                        src_line->samples[k].percent = 100.0 * h->addr[i] / h->sum;
1668
1669                        if (src_line->samples[k].percent > percent_max)
1670                                percent_max = src_line->samples[k].percent;
1671                }
1672
1673                if (percent_max <= 0.5)
1674                        goto next;
1675
1676                offset = start + i;
1677                src_line->path = get_srcline(map->dso, offset, NULL, false);
1678                insert_source_line(&tmp_root, src_line);
1679
1680        next:
1681                src_line = (void *)src_line + sizeof_src_line;
1682        }
1683
1684        resort_source_line(root, &tmp_root);
1685        return 0;
1686}
1687
1688static void print_summary(struct rb_root *root, const char *filename)
1689{
1690        struct source_line *src_line;
1691        struct rb_node *node;
1692
1693        printf("\nSorted summary for file %s\n", filename);
1694        printf("----------------------------------------------\n\n");
1695
1696        if (RB_EMPTY_ROOT(root)) {
1697                printf(" Nothing higher than %1.1f%%\n", MIN_GREEN);
1698                return;
1699        }
1700
1701        node = rb_first(root);
1702        while (node) {
1703                double percent, percent_max = 0.0;
1704                const char *color;
1705                char *path;
1706                int i;
1707
1708                src_line = rb_entry(node, struct source_line, node);
1709                for (i = 0; i < src_line->nr_pcnt; i++) {
1710                        percent = src_line->samples[i].percent_sum;
1711                        color = get_percent_color(percent);
1712                        color_fprintf(stdout, color, " %7.2f", percent);
1713
1714                        if (percent > percent_max)
1715                                percent_max = percent;
1716                }
1717
1718                path = src_line->path;
1719                color = get_percent_color(percent_max);
1720                color_fprintf(stdout, color, " %s\n", path);
1721
1722                node = rb_next(node);
1723        }
1724}
1725
1726static void symbol__annotate_hits(struct symbol *sym, struct perf_evsel *evsel)
1727{
1728        struct annotation *notes = symbol__annotation(sym);
1729        struct sym_hist *h = annotation__histogram(notes, evsel->idx);
1730        u64 len = symbol__size(sym), offset;
1731
1732        for (offset = 0; offset < len; ++offset)
1733                if (h->addr[offset] != 0)
1734                        printf("%*" PRIx64 ": %" PRIu64 "\n", BITS_PER_LONG / 2,
1735                               sym->start + offset, h->addr[offset]);
1736        printf("%*s: %" PRIu64 "\n", BITS_PER_LONG / 2, "h->sum", h->sum);
1737}
1738
1739int symbol__annotate_printf(struct symbol *sym, struct map *map,
1740                            struct perf_evsel *evsel, bool full_paths,
1741                            int min_pcnt, int max_lines, int context)
1742{
1743        struct dso *dso = map->dso;
1744        char *filename;
1745        const char *d_filename;
1746        const char *evsel_name = perf_evsel__name(evsel);
1747        struct annotation *notes = symbol__annotation(sym);
1748        struct sym_hist *h = annotation__histogram(notes, evsel->idx);
1749        struct disasm_line *pos, *queue = NULL;
1750        u64 start = map__rip_2objdump(map, sym->start);
1751        int printed = 2, queue_len = 0;
1752        int more = 0;
1753        u64 len;
1754        int width = 8;
1755        int graph_dotted_len;
1756
1757        filename = strdup(dso->long_name);
1758        if (!filename)
1759                return -ENOMEM;
1760
1761        if (full_paths)
1762                d_filename = filename;
1763        else
1764                d_filename = basename(filename);
1765
1766        len = symbol__size(sym);
1767
1768        if (perf_evsel__is_group_event(evsel))
1769                width *= evsel->nr_members;
1770
1771        graph_dotted_len = printf(" %-*.*s|     Source code & Disassembly of %s for %s (%" PRIu64 " samples)\n",
1772               width, width, "Percent", d_filename, evsel_name, h->sum);
1773
1774        printf("%-*.*s----\n",
1775               graph_dotted_len, graph_dotted_len, graph_dotted_line);
1776
1777        if (verbose > 0)
1778                symbol__annotate_hits(sym, evsel);
1779
1780        list_for_each_entry(pos, &notes->src->source, node) {
1781                if (context && queue == NULL) {
1782                        queue = pos;
1783                        queue_len = 0;
1784                }
1785
1786                switch (disasm_line__print(pos, sym, start, evsel, len,
1787                                            min_pcnt, printed, max_lines,
1788                                            queue)) {
1789                case 0:
1790                        ++printed;
1791                        if (context) {
1792                                printed += queue_len;
1793                                queue = NULL;
1794                                queue_len = 0;
1795                        }
1796                        break;
1797                case 1:
1798                        /* filtered by max_lines */
1799                        ++more;
1800                        break;
1801                case -1:
1802                default:
1803                        /*
1804                         * Filtered by min_pcnt or non IP lines when
1805                         * context != 0
1806                         */
1807                        if (!context)
1808                                break;
1809                        if (queue_len == context)
1810                                queue = list_entry(queue->node.next, typeof(*queue), node);
1811                        else
1812                                ++queue_len;
1813                        break;
1814                }
1815        }
1816
1817        free(filename);
1818
1819        return more;
1820}
1821
1822void symbol__annotate_zero_histogram(struct symbol *sym, int evidx)
1823{
1824        struct annotation *notes = symbol__annotation(sym);
1825        struct sym_hist *h = annotation__histogram(notes, evidx);
1826
1827        memset(h, 0, notes->src->sizeof_sym_hist);
1828}
1829
1830void symbol__annotate_decay_histogram(struct symbol *sym, int evidx)
1831{
1832        struct annotation *notes = symbol__annotation(sym);
1833        struct sym_hist *h = annotation__histogram(notes, evidx);
1834        int len = symbol__size(sym), offset;
1835
1836        h->sum = 0;
1837        for (offset = 0; offset < len; ++offset) {
1838                h->addr[offset] = h->addr[offset] * 7 / 8;
1839                h->sum += h->addr[offset];
1840        }
1841}
1842
1843void disasm__purge(struct list_head *head)
1844{
1845        struct disasm_line *pos, *n;
1846
1847        list_for_each_entry_safe(pos, n, head, node) {
1848                list_del(&pos->node);
1849                disasm_line__free(pos);
1850        }
1851}
1852
1853static size_t disasm_line__fprintf(struct disasm_line *dl, FILE *fp)
1854{
1855        size_t printed;
1856
1857        if (dl->offset == -1)
1858                return fprintf(fp, "%s\n", dl->line);
1859
1860        printed = fprintf(fp, "%#" PRIx64 " %s", dl->offset, dl->ins.name);
1861
1862        if (dl->ops.raw[0] != '\0') {
1863                printed += fprintf(fp, "%.*s %s\n", 6 - (int)printed, " ",
1864                                   dl->ops.raw);
1865        }
1866
1867        return printed + fprintf(fp, "\n");
1868}
1869
1870size_t disasm__fprintf(struct list_head *head, FILE *fp)
1871{
1872        struct disasm_line *pos;
1873        size_t printed = 0;
1874
1875        list_for_each_entry(pos, head, node)
1876                printed += disasm_line__fprintf(pos, fp);
1877
1878        return printed;
1879}
1880
1881int symbol__tty_annotate(struct symbol *sym, struct map *map,
1882                         struct perf_evsel *evsel, bool print_lines,
1883                         bool full_paths, int min_pcnt, int max_lines)
1884{
1885        struct dso *dso = map->dso;
1886        struct rb_root source_line = RB_ROOT;
1887        u64 len;
1888
1889        if (symbol__disassemble(sym, map, perf_evsel__env_arch(evsel), 0) < 0)
1890                return -1;
1891
1892        len = symbol__size(sym);
1893
1894        if (print_lines) {
1895                srcline_full_filename = full_paths;
1896                symbol__get_source_line(sym, map, evsel, &source_line, len);
1897                print_summary(&source_line, dso->long_name);
1898        }
1899
1900        symbol__annotate_printf(sym, map, evsel, full_paths,
1901                                min_pcnt, max_lines, 0);
1902        if (print_lines)
1903                symbol__free_source_line(sym, len);
1904
1905        disasm__purge(&symbol__annotation(sym)->src->source);
1906
1907        return 0;
1908}
1909
1910bool ui__has_annotation(void)
1911{
1912        return use_browser == 1 && perf_hpp_list.sym;
1913}
1914