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