2012-04-04 11:14:26 +04:00
# include "../../util/util.h"
2010-08-10 21:54:09 +04:00
# include "../browser.h"
# include "../helpline.h"
# include "../libslang.h"
2011-10-26 14:00:55 +04:00
# include "../ui.h"
# include "../util.h"
2012-04-04 11:14:26 +04:00
# include "../../util/annotate.h"
# include "../../util/hist.h"
# include "../../util/sort.h"
# include "../../util/symbol.h"
2011-02-22 18:02:07 +03:00
# include <pthread.h>
2011-10-20 22:59:15 +04:00
# include <newt.h>
2010-08-10 21:54:09 +04: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 19:19:22 +04:00
struct browser_disasm_line {
struct rb_node rb_node ;
double percent ;
u32 idx ;
int idx_asm ;
2012-05-12 20:40:52 +04:00
int jump_sources ;
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 19:19:22 +04:00
} ;
2012-05-30 04:24:05 +04:00
static struct annotate_browser_opt {
bool hide_src_code ,
use_offset ,
jump_arrows ,
show_nr_jumps ;
} annotate_browser__opts = {
. use_offset = true ,
. jump_arrows = true ,
} ;
2010-08-09 22:30:40 +04:00
struct annotate_browser {
struct ui_browser b ;
struct rb_root entries ;
2010-08-10 22:14:53 +04:00
struct rb_node * curr_hot ;
2012-04-15 22:24:39 +04: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 19:19:22 +04:00
struct disasm_line * * offsets ;
2012-04-02 19:59:01 +04:00
u64 start ;
2011-10-14 19:31:21 +04:00
int nr_asm_entries ;
int nr_entries ;
2012-05-12 23:21:53 +04:00
int max_jump_sources ;
int nr_jumps ;
2012-04-08 00:10:30 +04:00
bool searching_backwards ;
2012-05-03 20:12:49 +04:00
u8 addr_width ;
2012-05-12 23:21:53 +04:00
u8 jumps_width ;
u8 target_width ;
2012-05-03 20:12:49 +04:00
u8 min_addr_width ;
u8 max_addr_width ;
2012-04-08 00:10:30 +04:00
char search_bf [ 128 ] ;
2010-08-09 22:30:40 +04:00
} ;
2012-04-19 17:29:53 +04:00
static inline struct browser_disasm_line * disasm_line__browser ( struct disasm_line * dl )
2010-08-09 22:30:40 +04:00
{
2012-04-19 17:29:53 +04:00
return ( struct browser_disasm_line * ) ( dl + 1 ) ;
2010-08-09 22:30:40 +04:00
}
2012-09-11 02:15:03 +04:00
static bool disasm_line__filter ( struct ui_browser * browser __maybe_unused ,
void * entry )
2011-10-14 19:31:21 +04:00
{
2012-05-30 04:24:05 +04:00
if ( annotate_browser__opts . hide_src_code ) {
2012-04-15 22:24:39 +04:00
struct disasm_line * dl = list_entry ( entry , struct disasm_line , node ) ;
return dl - > offset = = - 1 ;
2011-10-14 19:31:21 +04:00
}
return false ;
}
2012-05-12 23:21:53 +04:00
static int annotate_browser__jumps_percent_color ( struct annotate_browser * browser ,
int nr , bool current )
{
if ( current & & ( ! browser - > b . use_navkeypressed | | browser - > b . navkeypressed ) )
return HE_COLORSET_SELECTED ;
if ( nr = = browser - > max_jump_sources )
return HE_COLORSET_TOP ;
if ( nr > 1 )
return HE_COLORSET_MEDIUM ;
return HE_COLORSET_NORMAL ;
}
static int annotate_browser__set_jumps_percent_color ( struct annotate_browser * browser ,
int nr , bool current )
{
int color = annotate_browser__jumps_percent_color ( browser , nr , current ) ;
return ui_browser__set_color ( & browser - > b , color ) ;
}
2012-05-30 05:42:18 +04:00
static void annotate_browser__write ( struct ui_browser * browser , void * entry , int row )
2010-08-10 21:54:09 +04:00
{
2012-05-30 05:42:18 +04:00
struct annotate_browser * ab = container_of ( browser , struct annotate_browser , b ) ;
2012-04-15 22:24:39 +04: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 19:19:22 +04:00
struct browser_disasm_line * bdl = disasm_line__browser ( dl ) ;
2012-05-30 05:42:18 +04:00
bool current_entry = ui_browser__is_current_entry ( browser , row ) ;
2012-05-30 04:24:05 +04:00
bool change_color = ( ! annotate_browser__opts . hide_src_code & &
2012-05-30 05:42:18 +04:00
( ! current_entry | | ( browser - > use_navkeypressed & &
! browser - > navkeypressed ) ) ) ;
int width = browser - > width , printed ;
2012-05-03 20:12:49 +04:00
char bf [ 256 ] ;
2010-08-10 21:54:09 +04:00
2012-04-28 00:13:53 +04:00
if ( dl - > offset ! = - 1 & & bdl - > percent ! = 0.0 ) {
2012-05-30 05:42:18 +04:00
ui_browser__set_percent_color ( browser , bdl - > percent , current_entry ) ;
2012-04-28 00:13:53 +04:00
slsmg_printf ( " %6.2f " , bdl - > percent ) ;
2010-08-09 22:30:40 +04:00
} else {
2012-05-30 05:42:18 +04:00
ui_browser__set_percent_color ( browser , 0 , current_entry ) ;
2012-04-28 00:13:53 +04:00
slsmg_write_nstring ( " " , 7 ) ;
2010-08-09 22:30:40 +04:00
}
2012-04-19 22:19:17 +04:00
SLsmg_write_char ( ' ' ) ;
2011-10-18 20:31:35 +04:00
/* The scroll bar isn't being used */
2012-05-30 05:42:18 +04:00
if ( ! browser - > navkeypressed )
2011-10-18 20:31:35 +04:00
width + = 1 ;
2012-04-15 22:24:39 +04:00
if ( ! * dl - > line )
2012-04-28 00:13:53 +04:00
slsmg_write_nstring ( " " , width - 7 ) ;
2012-05-03 20:12:49 +04:00
else if ( dl - > offset = = - 1 ) {
printed = scnprintf ( bf , sizeof ( bf ) , " %*s " ,
ab - > addr_width , " " ) ;
slsmg_write_nstring ( bf , printed ) ;
slsmg_write_nstring ( dl - > line , width - printed - 6 ) ;
} else {
2012-04-15 22:24:39 +04:00
u64 addr = dl - > offset ;
2012-05-03 20:12:49 +04:00
int color = - 1 ;
2012-04-02 19:59:01 +04:00
2012-05-30 04:24:05 +04:00
if ( ! annotate_browser__opts . use_offset )
2012-04-02 20:21:55 +04:00
addr + = ab - > start ;
2012-05-30 04:24:05 +04:00
if ( ! annotate_browser__opts . use_offset ) {
2012-05-03 20:12:49 +04:00
printed = scnprintf ( bf , sizeof ( bf ) , " % " PRIx64 " : " , addr ) ;
2012-04-19 20:15:24 +04:00
} else {
2012-05-12 20:40:52 +04:00
if ( bdl - > jump_sources ) {
2012-05-30 04:24:05 +04:00
if ( annotate_browser__opts . show_nr_jumps ) {
2012-05-12 23:21:53 +04:00
int prev ;
printed = scnprintf ( bf , sizeof ( bf ) , " %*d " ,
ab - > jumps_width ,
bdl - > jump_sources ) ;
prev = annotate_browser__set_jumps_percent_color ( ab , bdl - > jump_sources ,
current_entry ) ;
slsmg_write_nstring ( bf , printed ) ;
2012-05-30 05:42:18 +04:00
ui_browser__set_color ( browser , prev ) ;
2012-05-12 23:21:53 +04:00
}
2012-05-03 20:12:49 +04:00
printed = scnprintf ( bf , sizeof ( bf ) , " %* " PRIx64 " : " ,
2012-05-12 23:21:53 +04:00
ab - > target_width , addr ) ;
2012-04-19 20:15:24 +04:00
} else {
2012-05-03 20:12:49 +04:00
printed = scnprintf ( bf , sizeof ( bf ) , " %*s " ,
ab - > addr_width , " " ) ;
2012-04-19 20:15:24 +04: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 19:19:22 +04:00
2012-04-02 19:59:01 +04:00
if ( change_color )
2012-05-30 05:42:18 +04:00
color = ui_browser__set_color ( browser , HE_COLORSET_ADDR ) ;
2012-04-02 19:59:01 +04:00
slsmg_write_nstring ( bf , printed ) ;
if ( change_color )
2012-05-30 05:42:18 +04:00
ui_browser__set_color ( browser , color ) ;
2012-04-19 17:16:27 +04: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 22:40:20 +04:00
if ( ins__is_jump ( dl - > ins ) ) {
2012-04-25 15:00:23 +04: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 22:40:20 +04:00
2012-05-30 05:42:18 +04:00
ui_browser__write_graph ( browser , fwd ? SLSMG_DARROW_CHAR :
2012-04-20 23:26:14 +04:00
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 22:40:20 +04:00
SLsmg_write_char ( ' ' ) ;
2012-04-27 22:10:54 +04:00
} else if ( ins__is_call ( dl - > ins ) ) {
2012-05-30 05:42:18 +04:00
ui_browser__write_graph ( browser , SLSMG_RARROW_CHAR ) ;
2012-04-27 22:10:54 +04:00
SLsmg_write_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 22:40:20 +04:00
} else {
slsmg_write_nstring ( " " , 2 ) ;
}
2012-04-20 22:51:40 +04:00
} else {
if ( strcmp ( dl - > name , " retq " ) ) {
slsmg_write_nstring ( " " , 2 ) ;
} else {
2012-05-30 05:42:18 +04:00
ui_browser__write_graph ( browser , SLSMG_LARROW_CHAR ) ;
2012-04-20 22:51:40 +04:00
SLsmg_write_char ( ' ' ) ;
}
}
2012-04-19 17:16:27 +04:00
2012-05-30 04:24:05 +04:00
disasm_line__scnprintf ( dl , bf , sizeof ( bf ) , ! annotate_browser__opts . use_offset ) ;
2012-05-03 20:12:49 +04:00
slsmg_write_nstring ( bf , width - 10 - printed ) ;
2012-04-02 19:59:01 +04:00
}
2011-02-09 18:59:14 +03:00
2012-02-23 12:46:20 +04:00
if ( current_entry )
2012-04-15 22:24:39 +04:00
ab - > selection = dl ;
2010-08-09 22:30:40 +04:00
}
2013-01-14 23:47:17 +04:00
static bool disasm_line__is_valid_jump ( struct disasm_line * dl , struct symbol * sym )
{
if ( ! dl | | ! dl - > ins | | ! ins__is_jump ( dl - > ins )
| | ! disasm_line__has_offset ( dl )
| | dl - > ops . target . offset > = symbol__size ( sym ) )
return false ;
return true ;
}
2012-04-27 23:35:29 +04:00
static void annotate_browser__draw_current_jump ( struct ui_browser * browser )
2012-04-24 21:24:28 +04:00
{
struct annotate_browser * ab = container_of ( browser , struct annotate_browser , b ) ;
2012-04-27 23:35:29 +04:00
struct disasm_line * cursor = ab - > selection , * target ;
struct browser_disasm_line * btarget , * bcursor ;
2012-05-03 20:12:49 +04:00
unsigned int from , to ;
2012-11-09 21:27:15 +04:00
struct map_symbol * ms = ab - > b . priv ;
struct symbol * sym = ms - > sym ;
/* PLT symbols contain external offsets */
if ( strstr ( sym - > name , " @plt " ) )
return ;
2012-04-24 21:24:28 +04:00
2013-01-14 23:47:17 +04:00
if ( ! disasm_line__is_valid_jump ( cursor , sym ) )
2012-04-27 23:35:29 +04:00
return ;
2012-04-24 21:24:28 +04:00
2012-04-27 23:35:29 +04:00
target = ab - > offsets [ cursor - > ops . target . offset ] ;
if ( ! target )
return ;
2012-04-24 21:24:28 +04:00
2012-04-27 23:35:29 +04:00
bcursor = disasm_line__browser ( cursor ) ;
btarget = disasm_line__browser ( target ) ;
2012-04-24 21:24:28 +04:00
2012-05-30 04:24:05 +04:00
if ( annotate_browser__opts . hide_src_code ) {
2012-04-27 23:35:29 +04:00
from = bcursor - > idx_asm ;
2012-04-24 21:24:28 +04:00
to = btarget - > idx_asm ;
} else {
2012-04-27 23:35:29 +04:00
from = ( u64 ) bcursor - > idx ;
2012-04-24 21:24:28 +04:00
to = ( u64 ) btarget - > idx ;
}
ui_browser__set_color ( browser , HE_COLORSET_CODE ) ;
2012-05-03 20:12:49 +04:00
__ui_browser__line_arrow ( browser , 9 + ab - > addr_width , from , to ) ;
2012-04-24 21:24:28 +04:00
}
static unsigned int annotate_browser__refresh ( struct ui_browser * browser )
{
int ret = ui_browser__list_head_refresh ( browser ) ;
2012-05-30 04:24:05 +04:00
if ( annotate_browser__opts . jump_arrows )
2012-04-27 23:35:29 +04:00
annotate_browser__draw_current_jump ( browser ) ;
2012-04-24 21:24:28 +04:00
2012-05-03 20:12:49 +04:00
ui_browser__set_color ( browser , HE_COLORSET_NORMAL ) ;
__ui_browser__vline ( browser , 7 , 0 , browser - > height - 1 ) ;
2012-04-24 21:24:28 +04:00
return ret ;
}
2012-04-15 22:24:39 +04:00
static double disasm_line__calc_percent ( struct disasm_line * dl , struct symbol * sym , int evidx )
2010-08-09 22:30:40 +04:00
{
double percent = 0.0 ;
2012-04-15 22:24:39 +04:00
if ( dl - > offset ! = - 1 ) {
2010-08-09 22:30:40 +04:00
int len = sym - > end - sym - > start ;
2010-08-10 21:54:09 +04:00
unsigned int hits = 0 ;
2011-02-04 14:45:46 +03:00
struct annotation * notes = symbol__annotation ( sym ) ;
2011-02-08 18:27:39 +03:00
struct source_line * src_line = notes - > src - > lines ;
2011-02-04 18:43:24 +03:00
struct sym_hist * h = annotation__histogram ( notes , evidx ) ;
2012-04-15 22:24:39 +04:00
s64 offset = dl - > offset ;
struct disasm_line * next ;
2010-08-09 22:30:40 +04:00
2012-04-15 22:24:39 +04:00
next = disasm__get_next_ip_line ( & notes - > src - > source , dl ) ;
2010-08-10 21:54:09 +04:00
while ( offset < ( s64 ) len & &
( next = = NULL | | offset < next - > offset ) ) {
2011-02-04 14:45:46 +03:00
if ( src_line ) {
percent + = src_line [ offset ] . percent ;
2010-08-10 21:54:09 +04:00
} else
2011-02-04 14:45:46 +03:00
hits + = h - > addr [ offset ] ;
2010-08-10 21:54:09 +04:00
+ + offset ;
}
2011-02-04 14:45:46 +03: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 21:54:09 +04:00
percent = 100.0 * hits / h - > sum ;
}
2010-08-09 22:30:40 +04:00
return percent ;
}
2012-04-19 17:29:53 +04:00
static void disasm_rb_tree__insert ( struct rb_root * root , struct browser_disasm_line * bdl )
2010-08-09 22:30:40 +04:00
{
2012-04-15 22:24:39 +04:00
struct rb_node * * p = & root - > rb_node ;
2010-08-09 22:30:40 +04:00
struct rb_node * parent = NULL ;
2012-04-19 17:29:53 +04:00
struct browser_disasm_line * l ;
2010-08-09 22:30:40 +04:00
while ( * p ! = NULL ) {
parent = * p ;
2012-04-19 17:29:53 +04:00
l = rb_entry ( parent , struct browser_disasm_line , rb_node ) ;
if ( bdl - > percent < l - > percent )
2010-08-09 22:30:40 +04:00
p = & ( * p ) - > rb_left ;
else
p = & ( * p ) - > rb_right ;
}
2012-04-19 17:29:53 +04:00
rb_link_node ( & bdl - > rb_node , parent , p ) ;
rb_insert_color ( & bdl - > rb_node , root ) ;
2010-08-10 21:54:09 +04:00
}
2012-05-30 05:42:18 +04:00
static void annotate_browser__set_top ( struct annotate_browser * browser ,
2012-04-15 22:24:39 +04:00
struct disasm_line * pos , u32 idx )
2010-08-10 22:14:53 +04:00
{
unsigned back ;
2012-05-30 05:42:18 +04:00
ui_browser__refresh_dimensions ( & browser - > b ) ;
back = browser - > b . height / 2 ;
browser - > b . top_idx = browser - > b . index = idx ;
2010-08-10 22:14:53 +04:00
2012-05-30 05:42:18 +04:00
while ( browser - > b . top_idx ! = 0 & & back ! = 0 ) {
2012-04-15 22:24:39 +04:00
pos = list_entry ( pos - > node . prev , struct disasm_line , node ) ;
2010-08-10 22:14:53 +04:00
2012-05-30 05:42:18 +04:00
if ( disasm_line__filter ( & browser - > b , & pos - > node ) )
2012-04-04 04:35:35 +04:00
continue ;
2012-05-30 05:42:18 +04:00
- - browser - > b . top_idx ;
2010-08-10 22:14:53 +04:00
- - back ;
}
2012-05-30 05:42:18 +04:00
browser - > b . top = pos ;
browser - > b . navkeypressed = true ;
2012-04-03 22:32:45 +04:00
}
static void annotate_browser__set_rb_top ( struct annotate_browser * browser ,
struct rb_node * nd )
{
2012-04-19 17:29:53 +04:00
struct browser_disasm_line * bpos ;
2012-04-15 22:24:39 +04:00
struct disasm_line * pos ;
2012-05-30 03:49:14 +04:00
u32 idx ;
2012-04-03 22:32:45 +04:00
2012-04-19 17:29:53 +04:00
bpos = rb_entry ( nd , struct browser_disasm_line , rb_node ) ;
pos = ( ( struct disasm_line * ) bpos ) - 1 ;
2012-05-30 03:49:14 +04:00
idx = bpos - > idx ;
2012-05-30 04:24:05 +04:00
if ( annotate_browser__opts . hide_src_code )
2012-05-30 03:49:14 +04:00
idx = bpos - > idx_asm ;
annotate_browser__set_top ( browser , pos , idx ) ;
2012-04-03 22:32:45 +04:00
browser - > curr_hot = nd ;
2010-08-10 22:14:53 +04:00
}
2011-02-22 18:02:07 +03:00
static void annotate_browser__calc_percent ( struct annotate_browser * browser ,
int evidx )
2010-08-10 22:14:53 +04:00
{
2011-10-06 02:35:54 +04:00
struct map_symbol * ms = browser - > b . priv ;
struct symbol * sym = ms - > sym ;
2011-02-22 18:02:07 +03:00
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 22:24:39 +04:00
struct disasm_line * pos ;
2011-02-22 18: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 17:29:53 +04: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 18:02:07 +03:00
continue ;
}
2012-04-19 17:29:53 +04:00
disasm_rb_tree__insert ( & browser - > entries , bpos ) ;
2011-02-22 18:02:07 +03:00
}
pthread_mutex_unlock ( & notes - > lock ) ;
browser - > curr_hot = rb_last ( & browser - > entries ) ;
}
2011-10-14 19:31:21 +04:00
static bool annotate_browser__toggle_source ( struct annotate_browser * browser )
{
2012-04-15 22:24:39 +04:00
struct disasm_line * dl ;
2012-04-19 17:29:53 +04:00
struct browser_disasm_line * bdl ;
2011-10-14 19:31:21 +04:00
off_t offset = browser - > b . index - browser - > b . top_idx ;
browser - > b . seek ( & browser - > b , offset , SEEK_CUR ) ;
2012-04-15 22:24:39 +04:00
dl = list_entry ( browser - > b . top , struct disasm_line , node ) ;
2012-04-19 17:29:53 +04:00
bdl = disasm_line__browser ( dl ) ;
2011-10-14 19:31:21 +04:00
2012-05-30 04:24:05 +04:00
if ( annotate_browser__opts . hide_src_code ) {
2012-04-19 17:29:53 +04:00
if ( bdl - > idx_asm < offset )
offset = bdl - > idx ;
2011-10-14 19:31:21 +04:00
browser - > b . nr_entries = browser - > nr_entries ;
2012-05-30 04:24:05 +04:00
annotate_browser__opts . hide_src_code = false ;
2011-10-14 19:31:21 +04:00
browser - > b . seek ( & browser - > b , - offset , SEEK_CUR ) ;
2012-04-19 17:29:53 +04:00
browser - > b . top_idx = bdl - > idx - offset ;
browser - > b . index = bdl - > idx ;
2011-10-14 19:31:21 +04:00
} else {
2012-04-19 17:29:53 +04:00
if ( bdl - > idx_asm < 0 ) {
2011-10-14 19:31:21 +04:00
ui_helpline__puts ( " Only available for assembly lines. " ) ;
browser - > b . seek ( & browser - > b , - offset , SEEK_CUR ) ;
return false ;
}
2012-04-19 17:29:53 +04:00
if ( bdl - > idx_asm < offset )
offset = bdl - > idx_asm ;
2011-10-14 19:31:21 +04:00
browser - > b . nr_entries = browser - > nr_asm_entries ;
2012-05-30 04:24:05 +04:00
annotate_browser__opts . hide_src_code = true ;
2011-10-14 19:31:21 +04:00
browser - > b . seek ( & browser - > b , - offset , SEEK_CUR ) ;
2012-04-19 17:29:53 +04:00
browser - > b . top_idx = bdl - > idx_asm - offset ;
browser - > b . index = bdl - > idx_asm ;
2011-10-14 19:31:21 +04:00
}
return true ;
}
2012-05-30 04:24:05 +04:00
static void annotate_browser__init_asm_mode ( struct annotate_browser * browser )
{
ui_browser__reset_index ( & browser - > b ) ;
browser - > b . nr_entries = browser - > nr_asm_entries ;
}
2012-11-02 09:50:05 +04:00
static bool annotate_browser__callq ( struct annotate_browser * browser , int evidx ,
struct hist_browser_timer * hbt )
2012-04-02 20:58:33 +04:00
{
struct map_symbol * ms = browser - > b . priv ;
2012-04-16 03:12:07 +04:00
struct disasm_line * dl = browser - > selection ;
2012-04-02 20:58:33 +04:00
struct symbol * sym = ms - > sym ;
struct annotation * notes ;
struct symbol * target ;
u64 ip ;
2012-04-18 23:07:38 +04:00
if ( ! ins__is_call ( dl - > ins ) )
2012-04-02 20:58:33 +04:00
return false ;
2012-04-25 15:00:23 +04:00
ip = ms - > map - > map_ip ( ms - > map , dl - > ops . target . addr ) ;
2012-04-02 20:58:33 +04: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 ) ;
2012-11-02 09:50:05 +04:00
symbol__tui_annotate ( target , ms - > map , evidx , hbt ) ;
2012-04-02 20:58:33 +04:00
ui_browser__show_title ( & browser - > b , sym - > name ) ;
return true ;
}
2012-04-15 22:24:39 +04:00
static
struct disasm_line * annotate_browser__find_offset ( struct annotate_browser * browser ,
s64 offset , s64 * idx )
2012-04-04 04:35:35 +04:00
{
struct map_symbol * ms = browser - > b . priv ;
struct symbol * sym = ms - > sym ;
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 22:24:39 +04:00
struct disasm_line * pos ;
2012-04-04 04:35:35 +04:00
* idx = 0 ;
list_for_each_entry ( pos , & notes - > src - > source , node ) {
if ( pos - > offset = = offset )
return pos ;
2012-04-15 22:24:39 +04:00
if ( ! disasm_line__filter ( & browser - > b , & pos - > node ) )
2012-04-04 04:35:35 +04:00
+ + * idx ;
}
return NULL ;
}
static bool annotate_browser__jump ( struct annotate_browser * browser )
{
2012-04-16 03:12:07 +04:00
struct disasm_line * dl = browser - > selection ;
2012-04-18 20:58:34 +04:00
s64 idx ;
2012-04-04 04:35:35 +04:00
2012-04-18 23:07:38 +04:00
if ( ! ins__is_jump ( dl - > ins ) )
2012-04-04 04:35:35 +04:00
return false ;
2012-04-25 15:00:23 +04:00
dl = annotate_browser__find_offset ( browser , dl - > ops . target . offset , & idx ) ;
2012-04-15 22:24:39 +04:00
if ( dl = = NULL ) {
2012-04-04 04:35:35 +04:00
ui_helpline__puts ( " Invallid jump offset " ) ;
return true ;
}
2012-04-15 22:24:39 +04:00
annotate_browser__set_top ( browser , dl , idx ) ;
2012-04-04 04:35:35 +04:00
return true ;
}
2012-04-15 22:24:39 +04:00
static
struct disasm_line * annotate_browser__find_string ( struct annotate_browser * browser ,
char * s , s64 * idx )
2012-04-08 00:10:30 +04:00
{
struct map_symbol * ms = browser - > b . priv ;
struct symbol * sym = ms - > sym ;
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 22:24:39 +04:00
struct disasm_line * pos = browser - > selection ;
2012-04-08 00:10:30 +04:00
* idx = browser - > b . index ;
list_for_each_entry_continue ( pos , & notes - > src - > source , node ) {
2012-04-15 22:24:39 +04:00
if ( disasm_line__filter ( & browser - > b , & pos - > node ) )
2012-04-08 00:10:30 +04: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 22:24:39 +04:00
struct disasm_line * dl ;
2012-04-08 00:10:30 +04:00
s64 idx ;
2012-04-15 22:24:39 +04:00
dl = annotate_browser__find_string ( browser , browser - > search_bf , & idx ) ;
if ( dl = = NULL ) {
2012-04-08 00:10:30 +04:00
ui_helpline__puts ( " String not found! " ) ;
return false ;
}
2012-04-15 22:24:39 +04:00
annotate_browser__set_top ( browser , dl , idx ) ;
2012-04-08 00:10:30 +04:00
browser - > searching_backwards = false ;
return true ;
}
2012-04-15 22:24:39 +04:00
static
struct disasm_line * annotate_browser__find_string_reverse ( struct annotate_browser * browser ,
char * s , s64 * idx )
2012-04-08 00:10:30 +04:00
{
struct map_symbol * ms = browser - > b . priv ;
struct symbol * sym = ms - > sym ;
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 22:24:39 +04:00
struct disasm_line * pos = browser - > selection ;
2012-04-08 00:10:30 +04:00
* idx = browser - > b . index ;
list_for_each_entry_continue_reverse ( pos , & notes - > src - > source , node ) {
2012-04-15 22:24:39 +04:00
if ( disasm_line__filter ( & browser - > b , & pos - > node ) )
2012-04-08 00:10:30 +04: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 22:24:39 +04:00
struct disasm_line * dl ;
2012-04-08 00:10:30 +04:00
s64 idx ;
2012-04-15 22:24:39 +04:00
dl = annotate_browser__find_string_reverse ( browser , browser - > search_bf , & idx ) ;
if ( dl = = NULL ) {
2012-04-08 00:10:30 +04:00
ui_helpline__puts ( " String not found! " ) ;
return false ;
}
2012-04-15 22:24:39 +04:00
annotate_browser__set_top ( browser , dl , idx ) ;
2012-04-08 00:10:30 +04: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 ) ;
}
2012-05-30 04:24:05 +04:00
static void annotate_browser__update_addr_width ( struct annotate_browser * browser )
{
if ( annotate_browser__opts . use_offset )
browser - > target_width = browser - > min_addr_width ;
else
browser - > target_width = browser - > max_addr_width ;
browser - > addr_width = browser - > target_width ;
if ( annotate_browser__opts . show_nr_jumps )
browser - > addr_width + = browser - > jumps_width + 1 ;
}
2012-05-30 05:42:18 +04:00
static int annotate_browser__run ( struct annotate_browser * browser , int evidx ,
2012-11-02 09:50:05 +04:00
struct hist_browser_timer * hbt )
2011-02-22 18:02:07 +03:00
{
struct rb_node * nd = NULL ;
2012-05-30 05:42:18 +04:00
struct map_symbol * ms = browser - > b . priv ;
2011-10-06 02:35:54 +04:00
struct symbol * sym = ms - > sym ;
2012-05-12 23:36:55 +04:00
const char * help = " Press 'h' for help on key bindings " ;
2012-11-02 09:50:05 +04:00
int delay_secs = hbt ? hbt - > refresh : 0 ;
2010-08-11 17:07:43 +04:00
int key ;
2010-08-10 22:14:53 +04:00
2012-05-30 05:42:18 +04:00
if ( ui_browser__show ( & browser - > b , sym - > name , help ) < 0 )
2010-08-10 22:14:53 +04:00
return - 1 ;
2011-02-22 18:02:07 +03:00
2012-05-30 05:42:18 +04:00
annotate_browser__calc_percent ( browser , evidx ) ;
2011-02-22 18:02:07 +03:00
2012-05-30 05:42:18 +04:00
if ( browser - > curr_hot ) {
annotate_browser__set_rb_top ( browser , browser - > curr_hot ) ;
browser - > b . navkeypressed = false ;
2012-04-08 00:10:30 +04:00
}
2010-08-10 22:14:53 +04:00
2012-05-30 05:42:18 +04:00
nd = browser - > curr_hot ;
2011-02-22 18:02:07 +03:00
2010-08-10 22:14:53 +04:00
while ( 1 ) {
2012-05-30 05:42:18 +04:00
key = ui_browser__run ( & browser - > b , delay_secs ) ;
2010-08-10 22:14:53 +04:00
2011-10-06 02:11:32 +04:00
if ( delay_secs ! = 0 ) {
2012-05-30 05:42:18 +04:00
annotate_browser__calc_percent ( browser , evidx ) ;
2011-02-22 18:02:07 +03:00
/*
* 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 17:07:43 +04:00
switch ( key ) {
2011-10-20 22:59:15 +04:00
case K_TIMER :
2012-11-02 09:50:05 +04:00
if ( hbt )
hbt - > timer ( hbt - > arg ) ;
2011-10-06 02:11:32 +04:00
if ( delay_secs ! = 0 )
2011-02-22 18:02:07 +03:00
symbol__annotate_decay_histogram ( sym , evidx ) ;
continue ;
2011-10-20 22:59:15 +04:00
case K_TAB :
2011-02-22 18:02:07 +03:00
if ( nd ! = NULL ) {
nd = rb_prev ( nd ) ;
if ( nd = = NULL )
2012-05-30 05:42:18 +04:00
nd = rb_last ( & browser - > entries ) ;
2011-02-22 18:02:07 +03:00
} else
2012-05-30 05:42:18 +04:00
nd = browser - > curr_hot ;
2010-08-10 22:14:53 +04:00
break ;
2011-10-20 22:59:15 +04:00
case K_UNTAB :
2011-02-22 18:02:07 +03:00
if ( nd ! = NULL )
nd = rb_next ( nd ) ;
if ( nd = = NULL )
2012-05-30 05:42:18 +04:00
nd = rb_first ( & browser - > entries ) ;
2011-02-22 18:02:07 +03:00
else
2012-05-30 05:42:18 +04:00
nd = browser - > curr_hot ;
2011-02-22 18:02:07 +03:00
break ;
2012-05-12 23:36:55 +04:00
case K_F1 :
2012-02-23 12:46:21 +04:00
case ' h ' :
2012-05-30 05:42:18 +04:00
ui_browser__help_window ( & browser - > b ,
2012-05-12 23:36:55 +04:00
" UP/DOWN/PGUP \n "
" PGDN/SPACE Navigate \n "
" q/ESC/CTRL+C Exit \n \n "
" -> Go to target \n "
" <- Exit \n "
2012-05-30 19:31:44 +04:00
" H Cycle thru hottest instructions \n "
2012-05-12 23:36:55 +04:00
" j Toggle showing jump to target arrows \n "
" J Toggle showing number of jump sources on targets \n "
" n Search next string \n "
" o Toggle disassembler output/simplified view \n "
" s Toggle source code view \n "
" / Search string \n "
2012-10-30 07:56:05 +04:00
" r Run available scripts \n "
2012-05-12 23:36:55 +04:00
" ? Search previous string \n " ) ;
continue ;
2012-10-30 07:56:05 +04:00
case ' r ' :
{
script_browse ( NULL ) ;
continue ;
}
2012-05-12 23:36:55 +04:00
case ' H ' :
2012-05-30 05:42:18 +04:00
nd = browser - > curr_hot ;
2010-08-10 22:14:53 +04:00
break ;
2012-02-23 12:46:21 +04:00
case ' s ' :
2012-05-30 05:42:18 +04:00
if ( annotate_browser__toggle_source ( browser ) )
2011-10-14 19:31:21 +04:00
ui_helpline__puts ( help ) ;
continue ;
2012-04-02 20:21:55 +04:00
case ' o ' :
2012-05-30 04:24:05 +04:00
annotate_browser__opts . use_offset = ! annotate_browser__opts . use_offset ;
2012-05-30 05:42:18 +04:00
annotate_browser__update_addr_width ( browser ) ;
2012-04-02 20:21:55 +04:00
continue ;
2012-04-27 23:35:29 +04:00
case ' j ' :
2012-05-30 04:24:05 +04:00
annotate_browser__opts . jump_arrows = ! annotate_browser__opts . jump_arrows ;
2012-04-27 23:35:29 +04:00
continue ;
2012-05-12 23:21:53 +04:00
case ' J ' :
2012-05-30 04:24:05 +04:00
annotate_browser__opts . show_nr_jumps = ! annotate_browser__opts . show_nr_jumps ;
2012-05-30 05:42:18 +04:00
annotate_browser__update_addr_width ( browser ) ;
2012-05-30 04:24:05 +04:00
continue ;
2012-04-08 00:10:30 +04:00
case ' / ' :
2012-05-30 05:42:18 +04:00
if ( annotate_browser__search ( browser , delay_secs ) ) {
2012-04-08 00:10:30 +04:00
show_help :
ui_helpline__puts ( help ) ;
}
continue ;
case ' n ' :
2012-05-30 05:42:18 +04:00
if ( browser - > searching_backwards ?
annotate_browser__continue_search_reverse ( browser , delay_secs ) :
annotate_browser__continue_search ( browser , delay_secs ) )
2012-04-08 00:10:30 +04:00
goto show_help ;
continue ;
case ' ? ' :
2012-05-30 05:42:18 +04:00
if ( annotate_browser__search_reverse ( browser , delay_secs ) )
2012-04-08 00:10:30 +04:00
goto show_help ;
continue ;
2012-05-30 04:24:05 +04:00
case ' D ' : {
static int seq ;
ui_helpline__pop ( ) ;
ui_helpline__fpush ( " %d: nr_ent=%d, height=%d, idx=%d, top_idx=%d, nr_asm_entries=%d " ,
2012-05-30 05:42:18 +04:00
seq + + , browser - > b . nr_entries ,
browser - > b . height ,
browser - > b . index ,
browser - > b . top_idx ,
browser - > nr_asm_entries ) ;
2012-05-30 04:24:05 +04:00
}
continue ;
2011-10-20 22:59:15 +04:00
case K_ENTER :
case K_RIGHT :
2012-05-30 05:42:18 +04:00
if ( browser - > selection = = NULL )
2011-10-06 16:45:29 +04:00
ui_helpline__puts ( " Huh? No selection. Report to linux-kernel@vger.kernel.org " ) ;
2012-05-30 05:42:18 +04:00
else if ( browser - > selection - > offset = = - 1 )
2011-10-06 16:45:29 +04:00
ui_helpline__puts ( " Actions are only available for assembly lines. " ) ;
2012-05-30 05:42:18 +04:00
else if ( ! browser - > selection - > ins ) {
if ( strcmp ( browser - > selection - > name , " retq " ) )
2012-04-20 22:57:15 +04:00
goto show_sup_ins ;
goto out ;
2012-05-30 05:42:18 +04:00
} else if ( ! ( annotate_browser__jump ( browser ) | |
2012-11-02 09:50:05 +04:00
annotate_browser__callq ( browser , evidx , hbt ) ) ) {
2012-04-20 22:57:15 +04:00
show_sup_ins :
ui_helpline__puts ( " Actions are only available for 'callq', 'retq' & jump instructions. " ) ;
}
2011-10-19 19:18:13 +04:00
continue ;
2011-10-20 22:59:15 +04:00
case K_LEFT :
case K_ESC :
2011-10-13 15:31:22 +04:00
case ' q ' :
case CTRL ( ' c ' ) :
2010-08-10 22:14:53 +04:00
goto out ;
2011-10-13 15:31:22 +04:00
default :
continue ;
2010-08-10 22:14:53 +04:00
}
2011-02-22 18:02:07 +03:00
if ( nd ! = NULL )
2012-05-30 05:42:18 +04:00
annotate_browser__set_rb_top ( browser , nd ) ;
2010-08-10 22:14:53 +04:00
}
out :
2012-05-30 05:42:18 +04:00
ui_browser__hide ( & browser - > b ) ;
2010-08-11 17:07:43 +04:00
return key ;
2010-08-10 22:14:53 +04:00
}
2011-11-12 04:17:32 +04:00
int hist_entry__tui_annotate ( struct hist_entry * he , int evidx ,
2012-11-02 09:50:05 +04:00
struct hist_browser_timer * hbt )
2011-02-04 14:45:46 +03:00
{
2012-11-02 09:50:05 +04:00
return symbol__tui_annotate ( he - > ms . sym , he - > ms . map , evidx , hbt ) ;
2011-02-04 14:45:46 +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 19:19:22 +04:00
static void annotate_browser__mark_jump_targets ( struct annotate_browser * browser ,
size_t size )
{
u64 offset ;
2012-11-09 21:27:15 +04:00
struct map_symbol * ms = browser - > b . priv ;
struct symbol * sym = ms - > sym ;
/* PLT symbols contain external offsets */
if ( strstr ( sym - > name , " @plt " ) )
return ;
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 19:19:22 +04:00
for ( offset = 0 ; offset < size ; + + offset ) {
struct disasm_line * dl = browser - > offsets [ offset ] , * dlt ;
struct browser_disasm_line * bdlt ;
2013-01-14 23:47:17 +04:00
if ( ! disasm_line__is_valid_jump ( dl , sym ) )
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 19:19:22 +04:00
continue ;
2012-04-25 15:00:23 +04:00
dlt = browser - > offsets [ dl - > ops . target . offset ] ;
2012-04-25 14:48:42 +04: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 19:19:22 +04:00
bdlt = disasm_line__browser ( dlt ) ;
2012-05-12 23:21:53 +04:00
if ( + + bdlt - > jump_sources > browser - > max_jump_sources )
browser - > max_jump_sources = bdlt - > jump_sources ;
+ + browser - > nr_jumps ;
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 19:19:22 +04:00
}
}
2012-05-12 23:21:53 +04:00
static inline int width_jumps ( int n )
{
if ( n > = 100 )
return 5 ;
if ( n / 10 )
return 2 ;
return 1 ;
}
2011-02-22 18:02:07 +03:00
int symbol__tui_annotate ( struct symbol * sym , struct map * map , int evidx ,
2012-11-02 09:50:05 +04:00
struct hist_browser_timer * hbt )
2010-08-10 21:54:09 +04:00
{
2012-04-15 22:24:39 +04:00
struct disasm_line * pos , * n ;
2011-04-08 10:31:26 +04:00
struct annotation * notes ;
2012-06-05 09:14:59 +04:00
size_t size ;
2011-10-06 02:35:54 +04:00
struct map_symbol ms = {
. map = map ,
. sym = sym ,
} ;
2010-08-09 22:30:40 +04:00
struct annotate_browser browser = {
. b = {
2012-04-24 21:24:28 +04:00
. refresh = annotate_browser__refresh ,
2010-08-09 22:30:40 +04:00
. seek = ui_browser__list_head_seek ,
. write = annotate_browser__write ,
2012-04-15 22:24:39 +04:00
. filter = disasm_line__filter ,
2011-10-06 02:35:54 +04:00
. priv = & ms ,
2011-10-18 20:31:35 +04:00
. use_navkeypressed = true ,
2010-08-09 22:30:40 +04:00
} ,
2010-08-10 21:54:09 +04: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 19:19:22 +04:00
int ret = - 1 ;
2010-08-10 21:54:09 +04:00
2011-02-04 14:45:46 +03:00
if ( sym = = NULL )
2010-08-10 21:54:09 +04:00
return - 1 ;
2012-06-05 09:14:59 +04:00
size = symbol__size ( sym ) ;
2011-02-04 14:45:46 +03:00
if ( map - > dso - > annotate_warned )
2010-08-10 21:54:09 +04: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 19:19:22 +04:00
browser . offsets = zalloc ( size * sizeof ( struct disasm_line * ) ) ;
if ( browser . offsets = = NULL ) {
ui__error ( " Not enough memory! " ) ;
return - 1 ;
}
2012-04-19 17:29:53 +04:00
if ( symbol__annotate ( sym , map , sizeof ( struct browser_disasm_line ) ) < 0 ) {
2011-10-26 14:00:55 +04: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 19:19:22 +04:00
goto out_free_offsets ;
2010-08-10 21:54:09 +04:00
}
ui_helpline__push ( " Press <- or ESC to exit " ) ;
2011-04-08 10:31:26 +04:00
notes = symbol__annotation ( sym ) ;
2012-04-02 19:59:01 +04:00
browser . start = map__rip_2objdump ( map , sym - > start ) ;
2011-04-08 10:31:26 +04:00
2011-02-08 18:27:39 +03:00
list_for_each_entry ( pos , & notes - > src - > source , node ) {
2012-04-19 17:29:53 +04:00
struct browser_disasm_line * bpos ;
2010-08-10 21:54:09 +04:00
size_t line_len = strlen ( pos - > line ) ;
2011-02-22 18:02:07 +03:00
2010-08-09 22:30:40 +04:00
if ( browser . b . width < line_len )
browser . b . width = line_len ;
2012-04-19 17:29:53 +04: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 19:19:22 +04:00
if ( pos - > offset ! = - 1 ) {
2012-04-19 17:29:53 +04: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 22:17:50 +04: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 19:19:22 +04:00
} else
2012-04-19 17:29:53 +04:00
bpos - > idx_asm = - 1 ;
2010-08-09 22:30:40 +04: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 19:19:22 +04:00
annotate_browser__mark_jump_targets ( & browser , size ) ;
2012-05-12 23:21:53 +04:00
browser . addr_width = browser . target_width = browser . min_addr_width = hex_width ( size ) ;
2012-05-03 20:12:49 +04:00
browser . max_addr_width = hex_width ( sym - > end ) ;
2012-05-12 23:21:53 +04:00
browser . jumps_width = width_jumps ( browser . max_jump_sources ) ;
2011-10-14 19:31:21 +04:00
browser . b . nr_entries = browser . nr_entries ;
2011-04-08 10:31:26 +04:00
browser . b . entries = & notes - > src - > source ,
2010-08-09 22:30:40 +04:00
browser . b . width + = 18 ; /* Percentage */
2012-05-30 04:24:05 +04:00
if ( annotate_browser__opts . hide_src_code )
annotate_browser__init_asm_mode ( & browser ) ;
annotate_browser__update_addr_width ( & browser ) ;
2012-11-02 09:50:05 +04:00
ret = annotate_browser__run ( & browser , evidx , hbt ) ;
2011-02-08 18:27:39 +03:00
list_for_each_entry_safe ( pos , n , & notes - > src - > source , node ) {
2010-08-10 21:54:09 +04:00
list_del ( & pos - > node ) ;
2012-04-15 22:24:39 +04:00
disasm_line__free ( pos ) ;
2010-08-10 21:54:09 +04: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 19:19:22 +04:00
out_free_offsets :
free ( browser . offsets ) ;
2010-08-10 21:54:09 +04:00
return ret ;
}
2012-05-30 05:06:30 +04:00
# define ANNOTATE_CFG(n) \
{ . name = # n , . value = & annotate_browser__opts . n , }
2013-01-14 23:47:17 +04:00
2012-05-30 05:06:30 +04:00
/*
* Keep the entries sorted , they are bsearch ' ed
*/
static struct annotate__config {
const char * name ;
bool * value ;
} annotate__configs [ ] = {
ANNOTATE_CFG ( hide_src_code ) ,
ANNOTATE_CFG ( jump_arrows ) ,
ANNOTATE_CFG ( show_nr_jumps ) ,
ANNOTATE_CFG ( use_offset ) ,
} ;
# undef ANNOTATE_CFG
static int annotate_config__cmp ( const void * name , const void * cfgp )
{
const struct annotate__config * cfg = cfgp ;
return strcmp ( name , cfg - > name ) ;
}
2012-09-11 02:15:03 +04:00
static int annotate__config ( const char * var , const char * value ,
void * data __maybe_unused )
2012-05-30 05:06:30 +04:00
{
struct annotate__config * cfg ;
const char * name ;
if ( prefixcmp ( var , " annotate. " ) ! = 0 )
return 0 ;
name = var + 9 ;
cfg = bsearch ( name , annotate__configs , ARRAY_SIZE ( annotate__configs ) ,
sizeof ( struct annotate__config ) , annotate_config__cmp ) ;
if ( cfg = = NULL )
return - 1 ;
* cfg - > value = perf_config_bool ( name , value ) ;
return 0 ;
}
void annotate_browser__init ( void )
{
perf_config ( annotate__config , NULL ) ;
}