2012-04-04 00:14:26 -07:00
# include "../../util/util.h"
2010-08-10 14:54:09 -03:00
# include "../browser.h"
# include "../helpline.h"
# include "../libslang.h"
2011-10-26 08:00:55 -02:00
# include "../ui.h"
# include "../util.h"
2012-04-04 00:14:26 -07:00
# include "../../util/annotate.h"
# include "../../util/hist.h"
# include "../../util/sort.h"
# include "../../util/symbol.h"
2011-02-22 12:02:07 -03:00
# include <pthread.h>
2011-10-20 16:59:15 -02:00
# include <newt.h>
2010-08-10 14:54:09 -03:00
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
struct browser_disasm_line {
struct rb_node rb_node ;
double percent ;
u32 idx ;
int idx_asm ;
bool jump_target ;
} ;
2010-08-09 15:30:40 -03:00
struct annotate_browser {
struct ui_browser b ;
struct rb_root entries ;
2010-08-10 15:14:53 -03:00
struct rb_node * curr_hot ;
2012-04-15 15:24:39 -03:00
struct disasm_line * selection ;
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
struct disasm_line * * offsets ;
2012-04-02 12:59:01 -03:00
u64 start ;
2011-10-14 12:31:21 -03:00
int nr_asm_entries ;
int nr_entries ;
bool hide_src_code ;
2012-04-02 13:21:55 -03:00
bool use_offset ;
2012-04-07 17:10:30 -03:00
bool searching_backwards ;
2012-04-19 13:15:24 -03:00
u8 offset_width ;
2012-04-07 17:10:30 -03:00
char search_bf [ 128 ] ;
2010-08-09 15:30:40 -03:00
} ;
2012-04-19 10:29:53 -03:00
static inline struct browser_disasm_line * disasm_line__browser ( struct disasm_line * dl )
2010-08-09 15:30:40 -03:00
{
2012-04-19 10:29:53 -03:00
return ( struct browser_disasm_line * ) ( dl + 1 ) ;
2010-08-09 15:30:40 -03:00
}
2012-04-15 15:24:39 -03:00
static bool disasm_line__filter ( struct ui_browser * browser , void * entry )
2011-10-14 12:31:21 -03:00
{
struct annotate_browser * ab = container_of ( browser , struct annotate_browser , b ) ;
if ( ab - > hide_src_code ) {
2012-04-15 15:24:39 -03:00
struct disasm_line * dl = list_entry ( entry , struct disasm_line , node ) ;
return dl - > offset = = - 1 ;
2011-10-14 12:31:21 -03:00
}
return false ;
}
2010-08-10 14:54:09 -03:00
static void annotate_browser__write ( struct ui_browser * self , void * entry , int row )
{
2011-10-05 19:35:54 -03:00
struct annotate_browser * ab = container_of ( self , struct annotate_browser , b ) ;
2012-04-15 15:24:39 -03:00
struct disasm_line * dl = list_entry ( entry , struct disasm_line , node ) ;
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
struct browser_disasm_line * bdl = disasm_line__browser ( dl ) ;
2010-08-10 14:54:09 -03:00
bool current_entry = ui_browser__is_current_entry ( self , row ) ;
2012-04-02 12:59:01 -03:00
bool change_color = ( ! ab - > hide_src_code & &
( ! current_entry | | ( self - > use_navkeypressed & &
! self - > navkeypressed ) ) ) ;
2010-08-10 14:54:09 -03:00
int width = self - > width ;
2012-04-15 15:24:39 -03:00
if ( dl - > offset ! = - 1 ) {
2012-04-19 10:29:53 -03:00
ui_browser__set_percent_color ( self , bdl - > percent , current_entry ) ;
slsmg_printf ( " %7.2f " , bdl - > percent ) ;
2010-08-09 15:30:40 -03:00
} else {
2010-08-11 14:51:47 -03:00
ui_browser__set_percent_color ( self , 0 , current_entry ) ;
2010-08-09 15:30:40 -03:00
slsmg_write_nstring ( " " , 9 ) ;
}
2012-04-20 16:26:14 -03:00
ui_browser__write_graph ( self , SLSMG_VLINE_CHAR ) ;
2012-04-19 15:19:17 -03:00
SLsmg_write_char ( ' ' ) ;
2011-10-18 14:31:35 -02:00
/* The scroll bar isn't being used */
if ( ! self - > navkeypressed )
width + = 1 ;
2012-04-15 15:24:39 -03:00
if ( dl - > offset ! = - 1 & & change_color )
2012-04-02 12:59:01 -03:00
ui_browser__set_color ( self , HE_COLORSET_CODE ) ;
2012-02-23 17:46:20 +09:00
2012-04-15 15:24:39 -03:00
if ( ! * dl - > line )
2012-04-19 15:07:46 -03:00
slsmg_write_nstring ( " " , width - 10 ) ;
2012-04-15 15:24:39 -03:00
else if ( dl - > offset = = - 1 )
2012-04-19 15:07:46 -03:00
slsmg_write_nstring ( dl - > line , width - 10 ) ;
2012-04-02 12:59:01 -03:00
else {
2012-04-19 15:07:46 -03:00
char bf [ 256 ] ;
2012-04-15 15:24:39 -03:00
u64 addr = dl - > offset ;
2012-04-02 13:21:55 -03:00
int printed , color = - 1 ;
2012-04-02 12:59:01 -03:00
2012-04-02 13:21:55 -03:00
if ( ! ab - > use_offset )
addr + = ab - > start ;
2012-04-19 13:15:24 -03:00
if ( ! ab - > use_offset ) {
2012-04-24 14:24:28 -03:00
printed = scnprintf ( bf , sizeof ( bf ) , " % " PRIx64 " : " , addr ) ;
2012-04-19 13:15:24 -03:00
} else {
if ( bdl - > jump_target ) {
2012-04-24 14:24:28 -03:00
printed = scnprintf ( bf , sizeof ( bf ) , " %* " PRIx64 " : " ,
2012-04-19 13:15:24 -03:00
ab - > offset_width , addr ) ;
} else {
2012-04-24 14:24:28 -03:00
printed = scnprintf ( bf , sizeof ( bf ) , " %*s " ,
2012-04-19 13:15:24 -03:00
ab - > offset_width , " " ) ;
}
}
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
2012-04-02 12:59:01 -03:00
if ( change_color )
color = ui_browser__set_color ( self , HE_COLORSET_ADDR ) ;
slsmg_write_nstring ( bf , printed ) ;
if ( change_color )
ui_browser__set_color ( self , color ) ;
2012-04-19 10:16:27 -03:00
if ( dl - > ins & & dl - > ins - > ops - > scnprintf ) {
perf annotate browser: Add visual cues on jump lines
Using up/down arrows just before the instruction, replacing the actual chars
with approximations to avoid mail encoding snafus:
avtab_search_node
0.00 | push %rbp
0.00 | mov %rsp,%rbp
0.00 | callq mcount
0.00 | movzwl 0x6(%rsi),%edx
0.00 | and $0x7fff,%dx
0.00 | test %rdi,%rdi
0.00 | v jne 20
0.00 | 17: xor %eax,%eax
0.00 | 19: leaveq
0.00 | retq
0.00 | nopl 0x0(%rax,%rax,1)
0.00 | 20: mov (%rdi),%rax
0.00 | test %rax,%rax
0.00 | ^ je 17
0.00 | movzwl (%rsi),%ecx
0.00 | movzwl 0x2(%rsi),%r9d
0.00 | movzwl 0x4(%rsi),%r8d
0.00 | movzwl %cx,%esi
0.00 | movzwl %r9w,%r10d
0.00 | shl $0x9,%esi
0.00 | lea (%rsi,%r10,4),%esi
0.00 | lea (%r8,%rsi,1),%esi
0.00 | and 0x10(%rdi),%si
0.00 | movzwl %si,%esi
0.00 | mov (%rax,%rsi,8),%rax
0.00 | test %rax,%rax
0.00 | ^ je 19
0.00 | nopw 0x0(%rax,%rax,1)
0.00 | 60: cmp %cx,(%rax)
0.00 | v jne 7e
0.00 | cmp %r9w,0x2(%rax)
0.00 | v jne 7e
0.00 | cmp %r8w,0x4(%rax)
0.00 | v jne 79
0.00 | test %dx,0x6(%rax)
0.00 | ^ jne 19
0.00 | 79: cmp %r8w,0x4(%rax)
93.04 | 7e:^ ja 17
2.53 | mov 0x10(%rax),%rax
4.43 | test %rax,%rax
0.00 | ^ jne 60
0.00 | leaveq
0.00 | retq
Next low hanging fruit is to use left arrow for retqs, then work on clearling
marking loops.
Requested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-hkx848wdbs6n7bcp3ymr9yus@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-20 15:40:20 -03:00
if ( ins__is_jump ( dl - > ins ) ) {
2012-04-25 08:00:23 -03:00
bool fwd = dl - > ops . target . offset > ( u64 ) dl - > offset ;
perf annotate browser: Add visual cues on jump lines
Using up/down arrows just before the instruction, replacing the actual chars
with approximations to avoid mail encoding snafus:
avtab_search_node
0.00 | push %rbp
0.00 | mov %rsp,%rbp
0.00 | callq mcount
0.00 | movzwl 0x6(%rsi),%edx
0.00 | and $0x7fff,%dx
0.00 | test %rdi,%rdi
0.00 | v jne 20
0.00 | 17: xor %eax,%eax
0.00 | 19: leaveq
0.00 | retq
0.00 | nopl 0x0(%rax,%rax,1)
0.00 | 20: mov (%rdi),%rax
0.00 | test %rax,%rax
0.00 | ^ je 17
0.00 | movzwl (%rsi),%ecx
0.00 | movzwl 0x2(%rsi),%r9d
0.00 | movzwl 0x4(%rsi),%r8d
0.00 | movzwl %cx,%esi
0.00 | movzwl %r9w,%r10d
0.00 | shl $0x9,%esi
0.00 | lea (%rsi,%r10,4),%esi
0.00 | lea (%r8,%rsi,1),%esi
0.00 | and 0x10(%rdi),%si
0.00 | movzwl %si,%esi
0.00 | mov (%rax,%rsi,8),%rax
0.00 | test %rax,%rax
0.00 | ^ je 19
0.00 | nopw 0x0(%rax,%rax,1)
0.00 | 60: cmp %cx,(%rax)
0.00 | v jne 7e
0.00 | cmp %r9w,0x2(%rax)
0.00 | v jne 7e
0.00 | cmp %r8w,0x4(%rax)
0.00 | v jne 79
0.00 | test %dx,0x6(%rax)
0.00 | ^ jne 19
0.00 | 79: cmp %r8w,0x4(%rax)
93.04 | 7e:^ ja 17
2.53 | mov 0x10(%rax),%rax
4.43 | test %rax,%rax
0.00 | ^ jne 60
0.00 | leaveq
0.00 | retq
Next low hanging fruit is to use left arrow for retqs, then work on clearling
marking loops.
Requested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-hkx848wdbs6n7bcp3ymr9yus@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-20 15:40:20 -03:00
2012-04-20 16:26:14 -03:00
ui_browser__write_graph ( self , fwd ? SLSMG_DARROW_CHAR :
SLSMG_UARROW_CHAR ) ;
perf annotate browser: Add visual cues on jump lines
Using up/down arrows just before the instruction, replacing the actual chars
with approximations to avoid mail encoding snafus:
avtab_search_node
0.00 | push %rbp
0.00 | mov %rsp,%rbp
0.00 | callq mcount
0.00 | movzwl 0x6(%rsi),%edx
0.00 | and $0x7fff,%dx
0.00 | test %rdi,%rdi
0.00 | v jne 20
0.00 | 17: xor %eax,%eax
0.00 | 19: leaveq
0.00 | retq
0.00 | nopl 0x0(%rax,%rax,1)
0.00 | 20: mov (%rdi),%rax
0.00 | test %rax,%rax
0.00 | ^ je 17
0.00 | movzwl (%rsi),%ecx
0.00 | movzwl 0x2(%rsi),%r9d
0.00 | movzwl 0x4(%rsi),%r8d
0.00 | movzwl %cx,%esi
0.00 | movzwl %r9w,%r10d
0.00 | shl $0x9,%esi
0.00 | lea (%rsi,%r10,4),%esi
0.00 | lea (%r8,%rsi,1),%esi
0.00 | and 0x10(%rdi),%si
0.00 | movzwl %si,%esi
0.00 | mov (%rax,%rsi,8),%rax
0.00 | test %rax,%rax
0.00 | ^ je 19
0.00 | nopw 0x0(%rax,%rax,1)
0.00 | 60: cmp %cx,(%rax)
0.00 | v jne 7e
0.00 | cmp %r9w,0x2(%rax)
0.00 | v jne 7e
0.00 | cmp %r8w,0x4(%rax)
0.00 | v jne 79
0.00 | test %dx,0x6(%rax)
0.00 | ^ jne 19
0.00 | 79: cmp %r8w,0x4(%rax)
93.04 | 7e:^ ja 17
2.53 | mov 0x10(%rax),%rax
4.43 | test %rax,%rax
0.00 | ^ jne 60
0.00 | leaveq
0.00 | retq
Next low hanging fruit is to use left arrow for retqs, then work on clearling
marking loops.
Requested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-hkx848wdbs6n7bcp3ymr9yus@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-20 15:40:20 -03:00
SLsmg_write_char ( ' ' ) ;
} else {
slsmg_write_nstring ( " " , 2 ) ;
}
2012-04-20 14:38:46 -03:00
dl - > ins - > ops - > scnprintf ( dl - > ins , bf , sizeof ( bf ) , & dl - > ops ,
! ab - > use_offset ) ;
2012-04-20 15:51:40 -03:00
} else {
if ( strcmp ( dl - > name , " retq " ) ) {
slsmg_write_nstring ( " " , 2 ) ;
} else {
2012-04-20 16:26:14 -03:00
ui_browser__write_graph ( self , SLSMG_LARROW_CHAR ) ;
2012-04-20 15:51:40 -03:00
SLsmg_write_char ( ' ' ) ;
}
scnprintf ( bf , sizeof ( bf ) , " %-6.6s %s " , dl - > name , dl - > ops . raw ) ;
}
2012-04-19 10:16:27 -03:00
2012-04-20 15:51:40 -03:00
slsmg_write_nstring ( bf , width - 12 - printed ) ;
2012-04-02 12:59:01 -03:00
}
2011-02-09 13:59:14 -02:00
2012-02-23 17:46:20 +09:00
if ( current_entry )
2012-04-15 15:24:39 -03:00
ab - > selection = dl ;
2010-08-09 15:30:40 -03:00
}
2012-04-24 14:24:28 -03:00
static void annotate_browser__draw_current_loop ( struct ui_browser * browser )
{
struct annotate_browser * ab = container_of ( browser , struct annotate_browser , b ) ;
struct map_symbol * ms = browser - > priv ;
struct symbol * sym = ms - > sym ;
struct annotation * notes = symbol__annotation ( sym ) ;
struct disasm_line * cursor = ab - > selection , * pos = cursor , * target ;
struct browser_disasm_line * bcursor = disasm_line__browser ( cursor ) ,
* btarget , * bpos ;
unsigned int from , to , start_width = 2 ;
list_for_each_entry_from ( pos , & notes - > src - > source , node ) {
2012-04-25 14:18:42 -03:00
if ( ! pos - > ins | | ! ins__is_jump ( pos - > ins ) | |
! disasm_line__has_offset ( pos ) )
2012-04-24 14:24:28 -03:00
continue ;
2012-04-25 08:00:23 -03:00
target = ab - > offsets [ pos - > ops . target . offset ] ;
2012-04-24 14:24:28 -03:00
if ( ! target )
continue ;
btarget = disasm_line__browser ( target ) ;
if ( btarget - > idx < = bcursor - > idx )
goto found ;
}
return ;
found :
bpos = disasm_line__browser ( pos ) ;
if ( ab - > hide_src_code ) {
from = bpos - > idx_asm ;
to = btarget - > idx_asm ;
} else {
from = ( u64 ) bpos - > idx ;
to = ( u64 ) btarget - > idx ;
}
ui_browser__set_color ( browser , HE_COLORSET_CODE ) ;
if ( ! bpos - > jump_target )
start_width + = ab - > offset_width + 1 ;
__ui_browser__line_arrow_up ( browser , 10 , from , to , start_width ) ;
}
static unsigned int annotate_browser__refresh ( struct ui_browser * browser )
{
int ret = ui_browser__list_head_refresh ( browser ) ;
annotate_browser__draw_current_loop ( browser ) ;
return ret ;
}
2012-04-15 15:24:39 -03:00
static double disasm_line__calc_percent ( struct disasm_line * dl , struct symbol * sym , int evidx )
2010-08-09 15:30:40 -03:00
{
double percent = 0.0 ;
2012-04-15 15:24:39 -03:00
if ( dl - > offset ! = - 1 ) {
2010-08-09 15:30:40 -03:00
int len = sym - > end - sym - > start ;
2010-08-10 14:54:09 -03:00
unsigned int hits = 0 ;
2011-02-04 09:45:46 -02:00
struct annotation * notes = symbol__annotation ( sym ) ;
2011-02-08 13:27:39 -02:00
struct source_line * src_line = notes - > src - > lines ;
2011-02-04 13:43:24 -02:00
struct sym_hist * h = annotation__histogram ( notes , evidx ) ;
2012-04-15 15:24:39 -03:00
s64 offset = dl - > offset ;
struct disasm_line * next ;
2010-08-09 15:30:40 -03:00
2012-04-15 15:24:39 -03:00
next = disasm__get_next_ip_line ( & notes - > src - > source , dl ) ;
2010-08-10 14:54:09 -03:00
while ( offset < ( s64 ) len & &
( next = = NULL | | offset < next - > offset ) ) {
2011-02-04 09:45:46 -02:00
if ( src_line ) {
percent + = src_line [ offset ] . percent ;
2010-08-10 14:54:09 -03:00
} else
2011-02-04 09:45:46 -02:00
hits + = h - > addr [ offset ] ;
2010-08-10 14:54:09 -03:00
+ + offset ;
}
2011-02-04 09:45:46 -02:00
/*
* If the percentage wasn ' t already calculated in
* symbol__get_source_line , do it now :
*/
if ( src_line = = NULL & & h - > sum )
2010-08-10 14:54:09 -03:00
percent = 100.0 * hits / h - > sum ;
}
2010-08-09 15:30:40 -03:00
return percent ;
}
2012-04-19 10:29:53 -03:00
static void disasm_rb_tree__insert ( struct rb_root * root , struct browser_disasm_line * bdl )
2010-08-09 15:30:40 -03:00
{
2012-04-15 15:24:39 -03:00
struct rb_node * * p = & root - > rb_node ;
2010-08-09 15:30:40 -03:00
struct rb_node * parent = NULL ;
2012-04-19 10:29:53 -03:00
struct browser_disasm_line * l ;
2010-08-09 15:30:40 -03:00
while ( * p ! = NULL ) {
parent = * p ;
2012-04-19 10:29:53 -03:00
l = rb_entry ( parent , struct browser_disasm_line , rb_node ) ;
if ( bdl - > percent < l - > percent )
2010-08-09 15:30:40 -03:00
p = & ( * p ) - > rb_left ;
else
p = & ( * p ) - > rb_right ;
}
2012-04-19 10:29:53 -03:00
rb_link_node ( & bdl - > rb_node , parent , p ) ;
rb_insert_color ( & bdl - > rb_node , root ) ;
2010-08-10 14:54:09 -03:00
}
2010-08-10 15:14:53 -03:00
static void annotate_browser__set_top ( struct annotate_browser * self ,
2012-04-15 15:24:39 -03:00
struct disasm_line * pos , u32 idx )
2010-08-10 15:14:53 -03:00
{
unsigned back ;
ui_browser__refresh_dimensions ( & self - > b ) ;
back = self - > b . height / 2 ;
2012-04-03 15:32:45 -03:00
self - > b . top_idx = self - > b . index = idx ;
2010-08-10 15:14:53 -03:00
while ( self - > b . top_idx ! = 0 & & back ! = 0 ) {
2012-04-15 15:24:39 -03:00
pos = list_entry ( pos - > node . prev , struct disasm_line , node ) ;
2010-08-10 15:14:53 -03:00
2012-04-15 15:24:39 -03:00
if ( disasm_line__filter ( & self - > b , & pos - > node ) )
2012-04-03 21:35:35 -03:00
continue ;
2010-08-10 15:14:53 -03:00
- - self - > b . top_idx ;
- - back ;
}
self - > b . top = pos ;
2012-04-07 17:10:30 -03:00
self - > b . navkeypressed = true ;
2012-04-03 15:32:45 -03:00
}
static void annotate_browser__set_rb_top ( struct annotate_browser * browser ,
struct rb_node * nd )
{
2012-04-19 10:29:53 -03:00
struct browser_disasm_line * bpos ;
2012-04-15 15:24:39 -03:00
struct disasm_line * pos ;
2012-04-03 15:32:45 -03:00
2012-04-19 10:29:53 -03:00
bpos = rb_entry ( nd , struct browser_disasm_line , rb_node ) ;
pos = ( ( struct disasm_line * ) bpos ) - 1 ;
annotate_browser__set_top ( browser , pos , bpos - > idx ) ;
2012-04-03 15:32:45 -03:00
browser - > curr_hot = nd ;
2010-08-10 15:14:53 -03:00
}
2011-02-22 12:02:07 -03:00
static void annotate_browser__calc_percent ( struct annotate_browser * browser ,
int evidx )
2010-08-10 15:14:53 -03:00
{
2011-10-05 19:35:54 -03:00
struct map_symbol * ms = browser - > b . priv ;
struct symbol * sym = ms - > sym ;
2011-02-22 12:02:07 -03:00
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 15:24:39 -03:00
struct disasm_line * pos ;
2011-02-22 12:02:07 -03:00
browser - > entries = RB_ROOT ;
pthread_mutex_lock ( & notes - > lock ) ;
list_for_each_entry ( pos , & notes - > src - > source , node ) {
2012-04-19 10:29:53 -03:00
struct browser_disasm_line * bpos = disasm_line__browser ( pos ) ;
bpos - > percent = disasm_line__calc_percent ( pos , sym , evidx ) ;
if ( bpos - > percent < 0.01 ) {
RB_CLEAR_NODE ( & bpos - > rb_node ) ;
2011-02-22 12:02:07 -03:00
continue ;
}
2012-04-19 10:29:53 -03:00
disasm_rb_tree__insert ( & browser - > entries , bpos ) ;
2011-02-22 12:02:07 -03:00
}
pthread_mutex_unlock ( & notes - > lock ) ;
browser - > curr_hot = rb_last ( & browser - > entries ) ;
}
2011-10-14 12:31:21 -03:00
static bool annotate_browser__toggle_source ( struct annotate_browser * browser )
{
2012-04-15 15:24:39 -03:00
struct disasm_line * dl ;
2012-04-19 10:29:53 -03:00
struct browser_disasm_line * bdl ;
2011-10-14 12:31:21 -03:00
off_t offset = browser - > b . index - browser - > b . top_idx ;
browser - > b . seek ( & browser - > b , offset , SEEK_CUR ) ;
2012-04-15 15:24:39 -03:00
dl = list_entry ( browser - > b . top , struct disasm_line , node ) ;
2012-04-19 10:29:53 -03:00
bdl = disasm_line__browser ( dl ) ;
2011-10-14 12:31:21 -03:00
if ( browser - > hide_src_code ) {
2012-04-19 10:29:53 -03:00
if ( bdl - > idx_asm < offset )
offset = bdl - > idx ;
2011-10-14 12:31:21 -03:00
browser - > b . nr_entries = browser - > nr_entries ;
browser - > hide_src_code = false ;
browser - > b . seek ( & browser - > b , - offset , SEEK_CUR ) ;
2012-04-19 10:29:53 -03:00
browser - > b . top_idx = bdl - > idx - offset ;
browser - > b . index = bdl - > idx ;
2011-10-14 12:31:21 -03:00
} else {
2012-04-19 10:29:53 -03:00
if ( bdl - > idx_asm < 0 ) {
2011-10-14 12:31:21 -03:00
ui_helpline__puts ( " Only available for assembly lines. " ) ;
browser - > b . seek ( & browser - > b , - offset , SEEK_CUR ) ;
return false ;
}
2012-04-19 10:29:53 -03:00
if ( bdl - > idx_asm < offset )
offset = bdl - > idx_asm ;
2011-10-14 12:31:21 -03:00
browser - > b . nr_entries = browser - > nr_asm_entries ;
browser - > hide_src_code = true ;
browser - > b . seek ( & browser - > b , - offset , SEEK_CUR ) ;
2012-04-19 10:29:53 -03:00
browser - > b . top_idx = bdl - > idx_asm - offset ;
browser - > b . index = bdl - > idx_asm ;
2011-10-14 12:31:21 -03:00
}
return true ;
}
2012-04-02 13:58:33 -03:00
static bool annotate_browser__callq ( struct annotate_browser * browser ,
int evidx , void ( * timer ) ( void * arg ) ,
void * arg , int delay_secs )
{
struct map_symbol * ms = browser - > b . priv ;
2012-04-15 20:12:07 -03:00
struct disasm_line * dl = browser - > selection ;
2012-04-02 13:58:33 -03:00
struct symbol * sym = ms - > sym ;
struct annotation * notes ;
struct symbol * target ;
u64 ip ;
2012-04-18 16:07:38 -03:00
if ( ! ins__is_call ( dl - > ins ) )
2012-04-02 13:58:33 -03:00
return false ;
2012-04-25 08:00:23 -03:00
ip = ms - > map - > map_ip ( ms - > map , dl - > ops . target . addr ) ;
2012-04-02 13:58:33 -03:00
target = map__find_symbol ( ms - > map , ip , NULL ) ;
if ( target = = NULL ) {
ui_helpline__puts ( " The called function was not found. " ) ;
return true ;
}
notes = symbol__annotation ( target ) ;
pthread_mutex_lock ( & notes - > lock ) ;
if ( notes - > src = = NULL & & symbol__alloc_hist ( target ) < 0 ) {
pthread_mutex_unlock ( & notes - > lock ) ;
ui__warning ( " Not enough memory for annotating '%s' symbol! \n " ,
target - > name ) ;
return true ;
}
pthread_mutex_unlock ( & notes - > lock ) ;
symbol__tui_annotate ( target , ms - > map , evidx , timer , arg , delay_secs ) ;
ui_browser__show_title ( & browser - > b , sym - > name ) ;
return true ;
}
2012-04-15 15:24:39 -03:00
static
struct disasm_line * annotate_browser__find_offset ( struct annotate_browser * browser ,
s64 offset , s64 * idx )
2012-04-03 21:35:35 -03:00
{
struct map_symbol * ms = browser - > b . priv ;
struct symbol * sym = ms - > sym ;
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 15:24:39 -03:00
struct disasm_line * pos ;
2012-04-03 21:35:35 -03:00
* idx = 0 ;
list_for_each_entry ( pos , & notes - > src - > source , node ) {
if ( pos - > offset = = offset )
return pos ;
2012-04-15 15:24:39 -03:00
if ( ! disasm_line__filter ( & browser - > b , & pos - > node ) )
2012-04-03 21:35:35 -03:00
+ + * idx ;
}
return NULL ;
}
static bool annotate_browser__jump ( struct annotate_browser * browser )
{
2012-04-15 20:12:07 -03:00
struct disasm_line * dl = browser - > selection ;
2012-04-18 13:58:34 -03:00
s64 idx ;
2012-04-03 21:35:35 -03:00
2012-04-18 16:07:38 -03:00
if ( ! ins__is_jump ( dl - > ins ) )
2012-04-03 21:35:35 -03:00
return false ;
2012-04-25 08:00:23 -03:00
dl = annotate_browser__find_offset ( browser , dl - > ops . target . offset , & idx ) ;
2012-04-15 15:24:39 -03:00
if ( dl = = NULL ) {
2012-04-03 21:35:35 -03:00
ui_helpline__puts ( " Invallid jump offset " ) ;
return true ;
}
2012-04-15 15:24:39 -03:00
annotate_browser__set_top ( browser , dl , idx ) ;
2012-04-03 21:35:35 -03:00
return true ;
}
2012-04-15 15:24:39 -03:00
static
struct disasm_line * annotate_browser__find_string ( struct annotate_browser * browser ,
char * s , s64 * idx )
2012-04-07 17:10:30 -03:00
{
struct map_symbol * ms = browser - > b . priv ;
struct symbol * sym = ms - > sym ;
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 15:24:39 -03:00
struct disasm_line * pos = browser - > selection ;
2012-04-07 17:10:30 -03:00
* idx = browser - > b . index ;
list_for_each_entry_continue ( pos , & notes - > src - > source , node ) {
2012-04-15 15:24:39 -03:00
if ( disasm_line__filter ( & browser - > b , & pos - > node ) )
2012-04-07 17:10:30 -03:00
continue ;
+ + * idx ;
if ( pos - > line & & strstr ( pos - > line , s ) ! = NULL )
return pos ;
}
return NULL ;
}
static bool __annotate_browser__search ( struct annotate_browser * browser )
{
2012-04-15 15:24:39 -03:00
struct disasm_line * dl ;
2012-04-07 17:10:30 -03:00
s64 idx ;
2012-04-15 15:24:39 -03:00
dl = annotate_browser__find_string ( browser , browser - > search_bf , & idx ) ;
if ( dl = = NULL ) {
2012-04-07 17:10:30 -03:00
ui_helpline__puts ( " String not found! " ) ;
return false ;
}
2012-04-15 15:24:39 -03:00
annotate_browser__set_top ( browser , dl , idx ) ;
2012-04-07 17:10:30 -03:00
browser - > searching_backwards = false ;
return true ;
}
2012-04-15 15:24:39 -03:00
static
struct disasm_line * annotate_browser__find_string_reverse ( struct annotate_browser * browser ,
char * s , s64 * idx )
2012-04-07 17:10:30 -03:00
{
struct map_symbol * ms = browser - > b . priv ;
struct symbol * sym = ms - > sym ;
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 15:24:39 -03:00
struct disasm_line * pos = browser - > selection ;
2012-04-07 17:10:30 -03:00
* idx = browser - > b . index ;
list_for_each_entry_continue_reverse ( pos , & notes - > src - > source , node ) {
2012-04-15 15:24:39 -03:00
if ( disasm_line__filter ( & browser - > b , & pos - > node ) )
2012-04-07 17:10:30 -03:00
continue ;
- - * idx ;
if ( pos - > line & & strstr ( pos - > line , s ) ! = NULL )
return pos ;
}
return NULL ;
}
static bool __annotate_browser__search_reverse ( struct annotate_browser * browser )
{
2012-04-15 15:24:39 -03:00
struct disasm_line * dl ;
2012-04-07 17:10:30 -03:00
s64 idx ;
2012-04-15 15:24:39 -03:00
dl = annotate_browser__find_string_reverse ( browser , browser - > search_bf , & idx ) ;
if ( dl = = NULL ) {
2012-04-07 17:10:30 -03:00
ui_helpline__puts ( " String not found! " ) ;
return false ;
}
2012-04-15 15:24:39 -03:00
annotate_browser__set_top ( browser , dl , idx ) ;
2012-04-07 17:10:30 -03:00
browser - > searching_backwards = true ;
return true ;
}
static bool annotate_browser__search_window ( struct annotate_browser * browser ,
int delay_secs )
{
if ( ui_browser__input_window ( " Search " , " String: " , browser - > search_bf ,
" ENTER: OK, ESC: Cancel " ,
delay_secs * 2 ) ! = K_ENTER | |
! * browser - > search_bf )
return false ;
return true ;
}
static bool annotate_browser__search ( struct annotate_browser * browser , int delay_secs )
{
if ( annotate_browser__search_window ( browser , delay_secs ) )
return __annotate_browser__search ( browser ) ;
return false ;
}
static bool annotate_browser__continue_search ( struct annotate_browser * browser ,
int delay_secs )
{
if ( ! * browser - > search_bf )
return annotate_browser__search ( browser , delay_secs ) ;
return __annotate_browser__search ( browser ) ;
}
static bool annotate_browser__search_reverse ( struct annotate_browser * browser ,
int delay_secs )
{
if ( annotate_browser__search_window ( browser , delay_secs ) )
return __annotate_browser__search_reverse ( browser ) ;
return false ;
}
static
bool annotate_browser__continue_search_reverse ( struct annotate_browser * browser ,
int delay_secs )
{
if ( ! * browser - > search_bf )
return annotate_browser__search_reverse ( browser , delay_secs ) ;
return __annotate_browser__search_reverse ( browser ) ;
}
2011-02-22 12:02:07 -03:00
static int annotate_browser__run ( struct annotate_browser * self , int evidx ,
2011-11-11 22:17:32 -02:00
void ( * timer ) ( void * arg ) ,
2011-10-05 19:35:54 -03:00
void * arg , int delay_secs )
2011-02-22 12:02:07 -03:00
{
struct rb_node * nd = NULL ;
2011-10-05 19:35:54 -03:00
struct map_symbol * ms = self - > b . priv ;
struct symbol * sym = ms - > sym ;
2012-02-23 17:46:23 +09:00
const char * help = " <-/ESC: Exit, TAB/shift+TAB: Cycle hot lines, "
" H: Go to hottest line, ->/ENTER: Line action, "
2012-04-02 13:21:55 -03:00
" O: Toggle offset view, "
2012-02-23 17:46:23 +09:00
" S: Toggle source code view " ;
2010-08-11 10:07:43 -03:00
int key ;
2010-08-10 15:14:53 -03:00
2011-10-14 12:31:21 -03:00
if ( ui_browser__show ( & self - > b , sym - > name , help ) < 0 )
2010-08-10 15:14:53 -03:00
return - 1 ;
2011-02-22 12:02:07 -03:00
annotate_browser__calc_percent ( self , evidx ) ;
2012-04-07 17:10:30 -03:00
if ( self - > curr_hot ) {
2012-04-03 15:32:45 -03:00
annotate_browser__set_rb_top ( self , self - > curr_hot ) ;
2012-04-07 17:10:30 -03:00
self - > b . navkeypressed = false ;
}
2010-08-10 15:14:53 -03:00
nd = self - > curr_hot ;
2011-02-22 12:02:07 -03:00
2010-08-10 15:14:53 -03:00
while ( 1 ) {
2011-10-13 08:52:46 -03:00
key = ui_browser__run ( & self - > b , delay_secs ) ;
2010-08-10 15:14:53 -03:00
2011-10-05 19:11:32 -03:00
if ( delay_secs ! = 0 ) {
2011-02-22 12:02:07 -03:00
annotate_browser__calc_percent ( self , evidx ) ;
/*
* Current line focus got out of the list of most active
* lines , NULL it so that if TAB | UNTAB is pressed , we
* move to curr_hot ( current hottest line ) .
*/
if ( nd ! = NULL & & RB_EMPTY_NODE ( nd ) )
nd = NULL ;
}
2010-08-11 10:07:43 -03:00
switch ( key ) {
2011-10-20 16:59:15 -02:00
case K_TIMER :
2011-10-05 19:11:32 -03:00
if ( timer ! = NULL )
timer ( arg ) ;
if ( delay_secs ! = 0 )
2011-02-22 12:02:07 -03:00
symbol__annotate_decay_histogram ( sym , evidx ) ;
continue ;
2011-10-20 16:59:15 -02:00
case K_TAB :
2011-02-22 12:02:07 -03:00
if ( nd ! = NULL ) {
nd = rb_prev ( nd ) ;
if ( nd = = NULL )
nd = rb_last ( & self - > entries ) ;
} else
nd = self - > curr_hot ;
2010-08-10 15:14:53 -03:00
break ;
2011-10-20 16:59:15 -02:00
case K_UNTAB :
2011-02-22 12:02:07 -03:00
if ( nd ! = NULL )
nd = rb_next ( nd ) ;
if ( nd = = NULL )
nd = rb_first ( & self - > entries ) ;
else
nd = self - > curr_hot ;
break ;
case ' H ' :
2012-02-23 17:46:21 +09:00
case ' h ' :
2011-02-22 12:02:07 -03:00
nd = self - > curr_hot ;
2010-08-10 15:14:53 -03:00
break ;
2011-10-14 12:31:21 -03:00
case ' S ' :
2012-02-23 17:46:21 +09:00
case ' s ' :
2011-10-14 12:31:21 -03:00
if ( annotate_browser__toggle_source ( self ) )
ui_helpline__puts ( help ) ;
continue ;
2012-04-02 13:21:55 -03:00
case ' O ' :
case ' o ' :
self - > use_offset = ! self - > use_offset ;
continue ;
2012-04-07 17:10:30 -03:00
case ' / ' :
if ( annotate_browser__search ( self , delay_secs ) ) {
show_help :
ui_helpline__puts ( help ) ;
}
continue ;
case ' n ' :
if ( self - > searching_backwards ?
annotate_browser__continue_search_reverse ( self , delay_secs ) :
annotate_browser__continue_search ( self , delay_secs ) )
goto show_help ;
continue ;
case ' ? ' :
if ( annotate_browser__search_reverse ( self , delay_secs ) )
goto show_help ;
continue ;
2011-10-20 16:59:15 -02:00
case K_ENTER :
case K_RIGHT :
2012-04-02 13:58:33 -03:00
if ( self - > selection = = NULL )
2011-10-06 09:45:29 -03:00
ui_helpline__puts ( " Huh? No selection. Report to linux-kernel@vger.kernel.org " ) ;
2012-04-02 13:58:33 -03:00
else if ( self - > selection - > offset = = - 1 )
2011-10-06 09:45:29 -03:00
ui_helpline__puts ( " Actions are only available for assembly lines. " ) ;
2012-04-20 15:57:15 -03:00
else if ( ! self - > selection - > ins ) {
if ( strcmp ( self - > selection - > name , " retq " ) )
goto show_sup_ins ;
goto out ;
} else if ( ! ( annotate_browser__jump ( self ) | |
annotate_browser__callq ( self , evidx , timer , arg , delay_secs ) ) ) {
show_sup_ins :
ui_helpline__puts ( " Actions are only available for 'callq', 'retq' & jump instructions. " ) ;
}
2011-10-19 13:18:13 -02:00
continue ;
2011-10-20 16:59:15 -02:00
case K_LEFT :
case K_ESC :
2011-10-13 08:31:22 -03:00
case ' q ' :
case CTRL ( ' c ' ) :
2010-08-10 15:14:53 -03:00
goto out ;
2011-10-13 08:31:22 -03:00
default :
continue ;
2010-08-10 15:14:53 -03:00
}
2011-02-22 12:02:07 -03:00
if ( nd ! = NULL )
2012-04-03 15:32:45 -03:00
annotate_browser__set_rb_top ( self , nd ) ;
2010-08-10 15:14:53 -03:00
}
out :
2010-08-10 15:44:20 -03:00
ui_browser__hide ( & self - > b ) ;
2010-08-11 10:07:43 -03:00
return key ;
2010-08-10 15:14:53 -03:00
}
2011-11-11 22:17:32 -02:00
int hist_entry__tui_annotate ( struct hist_entry * he , int evidx ,
2011-10-05 19:11:32 -03:00
void ( * timer ) ( void * arg ) , void * arg , int delay_secs )
2011-02-04 09:45:46 -02:00
{
2011-11-11 22:17:32 -02:00
return symbol__tui_annotate ( he - > ms . sym , he - > ms . map , evidx ,
2011-10-05 19:11:32 -03:00
timer , arg , delay_secs ) ;
2011-02-04 09:45:46 -02:00
}
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
static void annotate_browser__mark_jump_targets ( struct annotate_browser * browser ,
size_t size )
{
u64 offset ;
for ( offset = 0 ; offset < size ; + + offset ) {
struct disasm_line * dl = browser - > offsets [ offset ] , * dlt ;
struct browser_disasm_line * bdlt ;
2012-04-25 14:18:42 -03:00
if ( ! dl | | ! dl - > ins | | ! ins__is_jump ( dl - > ins ) | |
! disasm_line__has_offset ( dl ) )
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
continue ;
2012-04-25 08:00:23 -03:00
if ( dl - > ops . target . offset > = size ) {
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
ui__error ( " jump to after symbol! \n "
" size: %zx, jump target: % " PRIx64 ,
2012-04-25 08:00:23 -03:00
size , dl - > ops . target . offset ) ;
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
continue ;
}
2012-04-25 08:00:23 -03:00
dlt = browser - > offsets [ dl - > ops . target . offset ] ;
2012-04-25 07:48:42 -03:00
/*
* FIXME : Oops , no jump target ? Buggy disassembler ? Or do we
* have to adjust to the previous offset ?
*/
if ( dlt = = NULL )
continue ;
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
bdlt = disasm_line__browser ( dlt ) ;
bdlt - > jump_target = true ;
}
}
2011-02-22 12:02:07 -03:00
int symbol__tui_annotate ( struct symbol * sym , struct map * map , int evidx ,
2011-11-11 22:17:32 -02:00
void ( * timer ) ( void * arg ) , void * arg ,
2011-10-05 19:35:54 -03:00
int delay_secs )
2010-08-10 14:54:09 -03:00
{
2012-04-15 15:24:39 -03:00
struct disasm_line * pos , * n ;
2011-04-08 14:31:26 +08:00
struct annotation * notes ;
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
const size_t size = symbol__size ( sym ) ;
2011-10-05 19:35:54 -03:00
struct map_symbol ms = {
. map = map ,
. sym = sym ,
} ;
2010-08-09 15:30:40 -03:00
struct annotate_browser browser = {
. b = {
2012-04-24 14:24:28 -03:00
. refresh = annotate_browser__refresh ,
2010-08-09 15:30:40 -03:00
. seek = ui_browser__list_head_seek ,
. write = annotate_browser__write ,
2012-04-15 15:24:39 -03:00
. filter = disasm_line__filter ,
2011-10-05 19:35:54 -03:00
. priv = & ms ,
2011-10-18 14:31:35 -02:00
. use_navkeypressed = true ,
2010-08-09 15:30:40 -03:00
} ,
2012-04-19 15:07:46 -03:00
. use_offset = true ,
2010-08-10 14:54:09 -03:00
} ;
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
int ret = - 1 ;
2010-08-10 14:54:09 -03:00
2011-02-04 09:45:46 -02:00
if ( sym = = NULL )
2010-08-10 14:54:09 -03:00
return - 1 ;
2011-02-04 09:45:46 -02:00
if ( map - > dso - > annotate_warned )
2010-08-10 14:54:09 -03:00
return - 1 ;
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
browser . offsets = zalloc ( size * sizeof ( struct disasm_line * ) ) ;
if ( browser . offsets = = NULL ) {
ui__error ( " Not enough memory! " ) ;
return - 1 ;
}
2012-04-19 10:29:53 -03:00
if ( symbol__annotate ( sym , map , sizeof ( struct browser_disasm_line ) ) < 0 ) {
2011-10-26 08:00:55 -02:00
ui__error ( " %s " , ui_helpline__last_msg ) ;
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
goto out_free_offsets ;
2010-08-10 14:54:09 -03:00
}
ui_helpline__push ( " Press <- or ESC to exit " ) ;
2011-04-08 14:31:26 +08:00
notes = symbol__annotation ( sym ) ;
2012-04-02 12:59:01 -03:00
browser . start = map__rip_2objdump ( map , sym - > start ) ;
2011-04-08 14:31:26 +08:00
2011-02-08 13:27:39 -02:00
list_for_each_entry ( pos , & notes - > src - > source , node ) {
2012-04-19 10:29:53 -03:00
struct browser_disasm_line * bpos ;
2010-08-10 14:54:09 -03:00
size_t line_len = strlen ( pos - > line ) ;
2011-02-22 12:02:07 -03:00
2010-08-09 15:30:40 -03:00
if ( browser . b . width < line_len )
browser . b . width = line_len ;
2012-04-19 10:29:53 -03:00
bpos = disasm_line__browser ( pos ) ;
bpos - > idx = browser . nr_entries + + ;
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
if ( pos - > offset ! = - 1 ) {
2012-04-19 10:29:53 -03:00
bpos - > idx_asm = browser . nr_asm_entries + + ;
perf annotate browser: Bandaid offsets/jump label objdump ambiguity
We need to cope with things like:
$ objdump -d --no-show-raw -S -C /lib/modules/3.4.0-rc2+/build/vmlinux
<SNIP>
ffffffff8125ec60 <copy_user_generic_unrolled>:
* Output:
* eax uncopied bytes or 0 if successful.
*/
ENTRY(copy_user_generic_unrolled)
CFI_STARTPROC
cmpl $8,%edx
ffffffff8125ec60: cmp $0x8,%edx
jb 20f /* less then 8 bytes, go to byte copy loop */
ffffffff8125ec63: jb ffffffff8125ecf5 <copy_user_generic_unrolled+0x95>
ALIGN_DESTINATION
<SNIP>
ffffffff8125ec8d: je ffffffff8125ecd9 <copy_user_generic_unrolled+0x79>
1: movq (%rsi),%r8
ffffffff8125ec8f: mov (%rsi),%r8
2: movq 1*8(%rsi),%r9
ffffffff8125ec92: mov 0x8(%rsi),%r9
3: movq 2*8(%rsi),%r10
ffffffff8125ec96: mov 0x10(%rsi),%r10
4: movq 3*8(%rsi),%r11
<SNIP>
Probably expect that the length of the addr field be the same...
Lazy move for now, back to supporting suppressing the address on callq lines...
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-7hp85vnvowpqj8799f8rxbu1@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-20 15:17:50 -03:00
/*
* FIXME : short term bandaid to cope with assembly
* routines that comes with labels in the same column
* as the address in objdump , sigh .
*
* E . g . copy_user_generic_unrolled
*/
if ( pos - > offset < ( s64 ) size )
browser . offsets [ pos - > offset ] = pos ;
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
} else
2012-04-19 10:29:53 -03:00
bpos - > idx_asm = - 1 ;
2010-08-09 15:30:40 -03:00
}
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
annotate_browser__mark_jump_targets ( & browser , size ) ;
2012-04-19 13:15:24 -03:00
browser . offset_width = hex_width ( size ) ;
2011-10-14 12:31:21 -03:00
browser . b . nr_entries = browser . nr_entries ;
2011-04-08 14:31:26 +08:00
browser . b . entries = & notes - > src - > source ,
2010-08-09 15:30:40 -03:00
browser . b . width + = 18 ; /* Percentage */
2011-11-11 22:17:32 -02:00
ret = annotate_browser__run ( & browser , evidx , timer , arg , delay_secs ) ;
2011-02-08 13:27:39 -02:00
list_for_each_entry_safe ( pos , n , & notes - > src - > source , node ) {
2010-08-10 14:54:09 -03:00
list_del ( & pos - > node ) ;
2012-04-15 15:24:39 -03:00
disasm_line__free ( pos ) ;
2010-08-10 14:54:09 -03:00
}
perf annotate browser: Hide non jump target addresses in offset mode
This:
0.00 : ffffffff8116bd00: lock btsl $0x0,(%r12)
100.00 : ffffffff8116bd07: sbb %eax,%eax
0.00 : ffffffff8116bd09: test %eax,%eax
0.00 : ffffffff8116bd0b: jne ffffffff8116bf5f <__mem_cgroup_commit_charge+0x28f>
0.00 : ffffffff8116bd11: mov (%r12),%rax
0.00 : ffffffff8116bd15: test $0x2,%al
0.00 : ffffffff8116bd17: jne ffffffff8116bf6e <__mem_cgroup_commit_charge+0x29e>
0.00 : ffffffff8116bd1d: test %r9b,%r9b
0.00 : ffffffff8116bd20: jne ffffffff8116be30 <__mem_cgroup_commit_charge+0x160>
0.00 : ffffffff8116bd26: xor %eax,%eax
0.00 : ffffffff8116bd28: mov %r13,0x8(%r12)
0.00 : ffffffff8116bd2d: lock orb $0x2,(%r12)
0.00 : ffffffff8116bd33: test %r9b,%r9b
0.00 : ffffffff8116bd36: je ffffffff8116bdf3 <__mem_cgroup_commit_charge+0x123>
Becomes:
0.00 : 30: lock btsl $0x0,(%r12)
100.00 : sbb %eax,%eax
0.00 : test %eax,%eax
0.00 : jne 28f
0.00 : mov (%r12),%rax
0.00 : test $0x2,%al
0.00 : jne 29e
0.00 : test %r9b,%r9b
0.00 : jne 160
0.00 : 56: xor %eax,%eax
0.00 : 58: mov %r13,0x8(%r12)
0.00 : lock orb $0x2,(%r12)
0.00 : test %r9b,%r9b
0.00 : je 123
I.e. We trow away all those useless addresses and keep just jump labels.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-r2vmbtgz0l8coluj8flztgrn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2012-04-19 12:19:22 -03:00
out_free_offsets :
free ( browser . offsets ) ;
2010-08-10 14:54:09 -03:00
return ret ;
}