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