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