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"
2013-03-05 14:53:21 +09:00
# include "../../util/evsel.h"
2011-02-22 12:02:07 -03:00
# include <pthread.h>
2010-08-10 14:54:09 -03:00
2015-06-19 16:10:43 -03:00
struct disasm_line_samples {
double percent ;
u64 nr ;
} ;
2015-07-18 08:24:51 -07:00
# define IPC_WIDTH 6
# define CYCLES_WIDTH 6
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 {
2015-06-19 16:10:43 -03:00
struct rb_node rb_node ;
u32 idx ;
int idx_asm ;
int jump_sources ;
2012-11-10 01:21:02 +09:00
/*
* actual length of this array is saved on the nr_events field
* of the struct annotate_browser
*/
2015-06-19 16:10:43 -03:00
struct disasm_line_samples samples [ 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
} ;
2012-05-29 21:24:05 -03:00
static struct annotate_browser_opt {
bool hide_src_code ,
use_offset ,
jump_arrows ,
2014-11-12 18:05:26 -08:00
show_linenr ,
2015-06-19 16:10:43 -03:00
show_nr_jumps ,
show_total_period ;
2012-05-29 21:24:05 -03:00
} annotate_browser__opts = {
. use_offset = true ,
. jump_arrows = true ,
} ;
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-11-10 01:21:02 +09: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-11-10 01:21:02 +09:00
int nr_events ;
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 ;
2012-05-12 16:21:53 -03:00
int max_jump_sources ;
int nr_jumps ;
2012-04-07 17:10:30 -03:00
bool searching_backwards ;
2015-07-18 08:24:50 -07:00
bool have_cycles ;
2012-05-03 13:12:49 -03:00
u8 addr_width ;
2012-05-12 16:21:53 -03:00
u8 jumps_width ;
u8 target_width ;
2012-05-03 13:12:49 -03:00
u8 min_addr_width ;
u8 max_addr_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-09-11 01:15:03 +03:00
static bool disasm_line__filter ( struct ui_browser * browser __maybe_unused ,
void * entry )
2011-10-14 12:31:21 -03:00
{
2012-05-29 21:24:05 -03:00
if ( annotate_browser__opts . 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 ;
}
2012-05-12 16:21:53 -03: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 ) ;
}
2015-07-18 08:24:51 -07:00
static int annotate_browser__pcnt_width ( struct annotate_browser * ab )
{
int w = 7 * ab - > nr_events ;
if ( ab - > have_cycles )
w + = IPC_WIDTH + CYCLES_WIDTH ;
return w ;
}
2012-05-29 22:42:18 -03:00
static void annotate_browser__write ( struct ui_browser * browser , void * entry , int row )
2010-08-10 14:54:09 -03:00
{
2012-05-29 22:42:18 -03:00
struct annotate_browser * ab = container_of ( browser , 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 ) ;
2012-05-29 22:42:18 -03:00
bool current_entry = ui_browser__is_current_entry ( browser , row ) ;
2012-05-29 21:24:05 -03:00
bool change_color = ( ! annotate_browser__opts . hide_src_code & &
2012-05-29 22:42:18 -03:00
( ! current_entry | | ( browser - > use_navkeypressed & &
! browser - > navkeypressed ) ) ) ;
int width = browser - > width , printed ;
2015-07-18 08:24:51 -07:00
int i , pcnt_width = annotate_browser__pcnt_width ( ab ) ;
2012-11-10 01:21:02 +09:00
double percent_max = 0.0 ;
2012-05-03 13:12:49 -03:00
char bf [ 256 ] ;
2010-08-10 14:54:09 -03:00
2012-11-10 01:21:02 +09:00
for ( i = 0 ; i < ab - > nr_events ; i + + ) {
2015-06-19 16:10:43 -03:00
if ( bdl - > samples [ i ] . percent > percent_max )
percent_max = bdl - > samples [ i ] . percent ;
2012-11-10 01:21:02 +09:00
}
if ( dl - > offset ! = - 1 & & percent_max ! = 0.0 ) {
2015-07-18 08:24:51 -07:00
if ( percent_max ! = 0.0 ) {
for ( i = 0 ; i < ab - > nr_events ; i + + ) {
ui_browser__set_percent_color ( browser ,
bdl - > samples [ i ] . percent ,
current_entry ) ;
if ( annotate_browser__opts . show_total_period )
slsmg_printf ( " %6 " PRIu64 " " ,
bdl - > samples [ i ] . nr ) ;
else
slsmg_printf ( " %6.2f " , bdl - > samples [ i ] . percent ) ;
}
} else {
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , " " , 7 * ab - > nr_events ) ;
2012-11-10 01:21:02 +09:00
}
2010-08-09 15:30:40 -03:00
} else {
2012-05-29 22:42:18 -03:00
ui_browser__set_percent_color ( browser , 0 , current_entry ) ;
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , " " , 7 * ab - > nr_events ) ;
2015-07-18 08:24:51 -07:00
}
if ( ab - > have_cycles ) {
if ( dl - > ipc )
slsmg_printf ( " %*.2f " , IPC_WIDTH - 1 , dl - > ipc ) ;
else
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , " " , IPC_WIDTH ) ;
2015-07-18 08:24:51 -07:00
if ( dl - > cycles )
slsmg_printf ( " %* " PRIu64 " " ,
CYCLES_WIDTH - 1 , dl - > cycles ) ;
else
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , " " , CYCLES_WIDTH ) ;
2010-08-09 15:30:40 -03:00
}
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 */
2012-05-29 22:42:18 -03:00
if ( ! browser - > navkeypressed )
2011-10-18 14:31:35 -02:00
width + = 1 ;
2012-04-15 15:24:39 -03:00
if ( ! * dl - > line )
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , " " , width - pcnt_width ) ;
2012-05-03 13:12:49 -03:00
else if ( dl - > offset = = - 1 ) {
2014-11-12 18:05:26 -08:00
if ( dl - > line_nr & & annotate_browser__opts . show_linenr )
printed = scnprintf ( bf , sizeof ( bf ) , " %-*d " ,
ab - > addr_width + 1 , dl - > line_nr ) ;
else
printed = scnprintf ( bf , sizeof ( bf ) , " %*s " ,
2012-05-03 13:12:49 -03:00
ab - > addr_width , " " ) ;
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , bf , printed ) ;
ui_browser__write_nstring ( browser , dl - > line , width - printed - pcnt_width + 1 ) ;
2012-05-03 13:12:49 -03:00
} else {
2012-04-15 15:24:39 -03:00
u64 addr = dl - > offset ;
2012-05-03 13:12:49 -03:00
int color = - 1 ;
2012-04-02 12:59:01 -03:00
2012-05-29 21:24:05 -03:00
if ( ! annotate_browser__opts . use_offset )
2012-04-02 13:21:55 -03:00
addr + = ab - > start ;
2012-05-29 21:24:05 -03:00
if ( ! annotate_browser__opts . use_offset ) {
2012-05-03 13:12:49 -03:00
printed = scnprintf ( bf , sizeof ( bf ) , " % " PRIx64 " : " , addr ) ;
2012-04-19 13:15:24 -03:00
} else {
2012-05-12 13:40:52 -03:00
if ( bdl - > jump_sources ) {
2012-05-29 21:24:05 -03:00
if ( annotate_browser__opts . show_nr_jumps ) {
2012-05-12 16:21:53 -03: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 ) ;
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , bf , printed ) ;
2012-05-29 22:42:18 -03:00
ui_browser__set_color ( browser , prev ) ;
2012-05-12 16:21:53 -03:00
}
2012-05-03 13:12:49 -03:00
printed = scnprintf ( bf , sizeof ( bf ) , " %* " PRIx64 " : " ,
2012-05-12 16:21:53 -03:00
ab - > target_width , addr ) ;
2012-04-19 13:15:24 -03:00
} else {
2012-05-03 13:12:49 -03:00
printed = scnprintf ( bf , sizeof ( bf ) , " %*s " ,
ab - > addr_width , " " ) ;
2012-04-19 13:15:24 -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
2012-04-02 12:59:01 -03:00
if ( change_color )
2012-05-29 22:42:18 -03:00
color = ui_browser__set_color ( browser , HE_COLORSET_ADDR ) ;
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , bf , printed ) ;
2012-04-02 12:59:01 -03:00
if ( change_color )
2012-05-29 22:42:18 -03:00
ui_browser__set_color ( browser , 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-05-29 22:42:18 -03:00
ui_browser__write_graph ( browser , fwd ? SLSMG_DARROW_CHAR :
2012-04-20 16:26:14 -03: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 15:40:20 -03:00
SLsmg_write_char ( ' ' ) ;
2012-04-27 15:10:54 -03:00
} else if ( ins__is_call ( dl - > ins ) ) {
2012-05-29 22:42:18 -03:00
ui_browser__write_graph ( browser , SLSMG_RARROW_CHAR ) ;
2012-04-27 15:10:54 -03: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 15:40:20 -03:00
} else {
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , " " , 2 ) ;
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 15:51:40 -03:00
} else {
if ( strcmp ( dl - > name , " retq " ) ) {
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , " " , 2 ) ;
2012-04-20 15:51:40 -03:00
} else {
2012-05-29 22:42:18 -03:00
ui_browser__write_graph ( browser , SLSMG_LARROW_CHAR ) ;
2012-04-20 15:51:40 -03:00
SLsmg_write_char ( ' ' ) ;
}
}
2012-04-19 10:16:27 -03:00
2012-05-29 21:24:05 -03:00
disasm_line__scnprintf ( dl , bf , sizeof ( bf ) , ! annotate_browser__opts . use_offset ) ;
2015-08-11 12:24:27 -03:00
ui_browser__write_nstring ( browser , bf , width - pcnt_width - 3 - 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
}
2013-01-14 14:47:17 -05: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 16:35:29 -03:00
static void annotate_browser__draw_current_jump ( struct ui_browser * browser )
2012-04-24 14:24:28 -03:00
{
struct annotate_browser * ab = container_of ( browser , struct annotate_browser , b ) ;
2012-04-27 16:35:29 -03:00
struct disasm_line * cursor = ab - > selection , * target ;
struct browser_disasm_line * btarget , * bcursor ;
2012-05-03 13:12:49 -03:00
unsigned int from , to ;
2012-11-10 02:27:15 +09:00
struct map_symbol * ms = ab - > b . priv ;
struct symbol * sym = ms - > sym ;
2015-07-18 08:24:51 -07:00
u8 pcnt_width = annotate_browser__pcnt_width ( ab ) ;
2012-11-10 02:27:15 +09:00
/* PLT symbols contain external offsets */
if ( strstr ( sym - > name , " @plt " ) )
return ;
2012-04-24 14:24:28 -03:00
2013-01-14 14:47:17 -05:00
if ( ! disasm_line__is_valid_jump ( cursor , sym ) )
2012-04-27 16:35:29 -03:00
return ;
2012-04-24 14:24:28 -03:00
2012-04-27 16:35:29 -03:00
target = ab - > offsets [ cursor - > ops . target . offset ] ;
if ( ! target )
return ;
2012-04-24 14:24:28 -03:00
2012-04-27 16:35:29 -03:00
bcursor = disasm_line__browser ( cursor ) ;
btarget = disasm_line__browser ( target ) ;
2012-04-24 14:24:28 -03:00
2012-05-29 21:24:05 -03:00
if ( annotate_browser__opts . hide_src_code ) {
2012-04-27 16:35:29 -03:00
from = bcursor - > idx_asm ;
2012-04-24 14:24:28 -03:00
to = btarget - > idx_asm ;
} else {
2012-04-27 16:35:29 -03:00
from = ( u64 ) bcursor - > idx ;
2012-04-24 14:24:28 -03:00
to = ( u64 ) btarget - > idx ;
}
ui_browser__set_color ( browser , HE_COLORSET_CODE ) ;
2012-11-10 01:21:02 +09:00
__ui_browser__line_arrow ( browser , pcnt_width + 2 + ab - > addr_width ,
from , to ) ;
2012-04-24 14:24:28 -03:00
}
static unsigned int annotate_browser__refresh ( struct ui_browser * browser )
{
2012-11-10 01:21:02 +09:00
struct annotate_browser * ab = container_of ( browser , struct annotate_browser , b ) ;
2012-04-24 14:24:28 -03:00
int ret = ui_browser__list_head_refresh ( browser ) ;
2015-07-18 08:24:51 -07:00
int pcnt_width = annotate_browser__pcnt_width ( ab ) ;
2012-04-24 14:24:28 -03:00
2012-05-29 21:24:05 -03:00
if ( annotate_browser__opts . jump_arrows )
2012-04-27 16:35:29 -03:00
annotate_browser__draw_current_jump ( browser ) ;
2012-04-24 14:24:28 -03:00
2012-05-03 13:12:49 -03:00
ui_browser__set_color ( browser , HE_COLORSET_NORMAL ) ;
2012-11-10 01:21:02 +09:00
__ui_browser__vline ( browser , pcnt_width , 0 , browser - > height - 1 ) ;
2012-04-24 14:24:28 -03:00
return ret ;
}
2012-11-10 01:21:02 +09:00
static int disasm__cmp ( struct browser_disasm_line * a ,
struct browser_disasm_line * b , int nr_pcnt )
{
int i ;
for ( i = 0 ; i < nr_pcnt ; i + + ) {
2015-06-19 16:10:43 -03:00
if ( a - > samples [ i ] . percent = = b - > samples [ i ] . percent )
2012-11-10 01:21:02 +09:00
continue ;
2015-06-19 16:10:43 -03:00
return a - > samples [ i ] . percent < b - > samples [ i ] . percent ;
2012-11-10 01:21:02 +09:00
}
return 0 ;
}
static void disasm_rb_tree__insert ( struct rb_root * root , struct browser_disasm_line * bdl ,
int nr_events )
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 ) ;
2012-11-10 01:21:02 +09:00
if ( disasm__cmp ( bdl , l , nr_events ) )
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
}
2012-05-29 22:42:18 -03:00
static void annotate_browser__set_top ( struct annotate_browser * browser ,
2012-04-15 15:24:39 -03:00
struct disasm_line * pos , u32 idx )
2010-08-10 15:14:53 -03:00
{
unsigned back ;
2012-05-29 22:42:18 -03:00
ui_browser__refresh_dimensions ( & browser - > b ) ;
back = browser - > b . height / 2 ;
browser - > b . top_idx = browser - > b . index = idx ;
2010-08-10 15:14:53 -03:00
2012-05-29 22:42:18 -03:00
while ( browser - > 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-05-29 22:42:18 -03:00
if ( disasm_line__filter ( & browser - > b , & pos - > node ) )
2012-04-03 21:35:35 -03:00
continue ;
2012-05-29 22:42:18 -03:00
- - browser - > b . top_idx ;
2010-08-10 15:14:53 -03:00
- - back ;
}
2012-05-29 22:42:18 -03:00
browser - > b . top = pos ;
browser - > 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-05-29 20:49:14 -03:00
u32 idx ;
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 ;
2012-05-29 20:49:14 -03:00
idx = bpos - > idx ;
2012-05-29 21:24:05 -03:00
if ( annotate_browser__opts . hide_src_code )
2012-05-29 20:49:14 -03:00
idx = bpos - > idx_asm ;
annotate_browser__set_top ( browser , pos , 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 ,
2013-03-05 14:53:21 +09:00
struct perf_evsel * evsel )
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 ) ;
2013-03-05 14:53:30 +09:00
struct disasm_line * pos , * next ;
s64 len = symbol__size ( sym ) ;
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 ) ;
2013-03-05 14:53:30 +09:00
const char * path = NULL ;
2012-11-10 01:21:02 +09:00
double max_percent = 0.0 ;
int i ;
2013-03-05 14:53:30 +09:00
if ( pos - > offset = = - 1 ) {
RB_CLEAR_NODE ( & bpos - > rb_node ) ;
continue ;
}
next = disasm__get_next_ip_line ( & notes - > src - > source , pos ) ;
2012-11-10 01:21:02 +09:00
for ( i = 0 ; i < browser - > nr_events ; i + + ) {
2015-06-19 16:10:43 -03:00
u64 nr_samples ;
bpos - > samples [ i ] . percent = disasm__calc_percent ( notes ,
2012-11-10 01:21:02 +09:00
evsel - > idx + i ,
pos - > offset ,
next ? next - > offset : len ,
2015-06-19 16:10:43 -03:00
& path , & nr_samples ) ;
bpos - > samples [ i ] . nr = nr_samples ;
2012-11-10 01:21:02 +09:00
2015-06-19 16:10:43 -03:00
if ( max_percent < bpos - > samples [ i ] . percent )
max_percent = bpos - > samples [ i ] . percent ;
2012-11-10 01:21:02 +09:00
}
2015-07-18 08:24:50 -07:00
if ( max_percent < 0.01 & & pos - > ipc = = 0 ) {
2012-04-19 10:29:53 -03:00
RB_CLEAR_NODE ( & bpos - > rb_node ) ;
2011-02-22 12:02:07 -03:00
continue ;
}
2012-11-10 01:21:02 +09:00
disasm_rb_tree__insert ( & browser - > entries , bpos ,
browser - > nr_events ) ;
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
2012-05-29 21:24:05 -03:00
if ( annotate_browser__opts . 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 ;
2012-05-29 21:24:05 -03:00
annotate_browser__opts . hide_src_code = false ;
2011-10-14 12:31:21 -03:00
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 ;
2012-05-29 21:24:05 -03:00
annotate_browser__opts . hide_src_code = true ;
2011-10-14 12:31:21 -03:00
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-05-29 21:24:05 -03: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 ;
}
2013-08-07 14:38:55 +03:00
# define SYM_TITLE_MAX_SIZE (PATH_MAX + 64)
static int sym_title ( struct symbol * sym , struct map * map , char * title ,
size_t sz )
{
return snprintf ( title , sz , " %s %s " , sym - > name , map - > dso - > long_name ) ;
}
2013-03-05 14:53:21 +09:00
static bool annotate_browser__callq ( struct annotate_browser * browser ,
struct perf_evsel * evsel ,
2012-11-02 14:50:05 +09:00
struct hist_browser_timer * hbt )
2012-04-02 13:58:33 -03:00
{
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 annotation * notes ;
2013-10-14 13:43:39 +03:00
struct addr_map_symbol target = {
. map = ms - > map ,
2013-10-14 13:43:44 +03:00
. addr = map__objdump_2mem ( ms - > map , dl - > ops . target . addr ) ,
2013-10-14 13:43:39 +03:00
} ;
2013-08-07 14:38:55 +03:00
char title [ SYM_TITLE_MAX_SIZE ] ;
2012-04-02 13:58:33 -03:00
2012-04-18 16:07:38 -03:00
if ( ! ins__is_call ( dl - > ins ) )
2012-04-02 13:58:33 -03:00
return false ;
2013-10-14 13:43:44 +03:00
if ( map_groups__find_ams ( & target , NULL ) | |
map__rip_2objdump ( target . map , target . map - > map_ip ( target . map ,
target . addr ) ) ! =
dl - > ops . target . addr ) {
2012-04-02 13:58:33 -03:00
ui_helpline__puts ( " The called function was not found. " ) ;
return true ;
}
2013-10-14 13:43:39 +03:00
notes = symbol__annotation ( target . sym ) ;
2012-04-02 13:58:33 -03:00
pthread_mutex_lock ( & notes - > lock ) ;
2013-10-14 13:43:39 +03:00
if ( notes - > src = = NULL & & symbol__alloc_hist ( target . sym ) < 0 ) {
2012-04-02 13:58:33 -03:00
pthread_mutex_unlock ( & notes - > lock ) ;
ui__warning ( " Not enough memory for annotating '%s' symbol! \n " ,
2013-10-14 13:43:39 +03:00
target . sym - > name ) ;
2012-04-02 13:58:33 -03:00
return true ;
}
pthread_mutex_unlock ( & notes - > lock ) ;
2013-10-14 13:43:39 +03:00
symbol__tui_annotate ( target . sym , target . map , evsel , hbt ) ;
sym_title ( ms - > sym , ms - > map , title , sizeof ( title ) ) ;
2013-08-07 14:38:55 +03:00
ui_browser__show_title ( & browser - > b , title ) ;
2012-04-02 13:58:33 -03:00
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 ) {
2013-08-02 13:10:50 +02:00
ui_helpline__puts ( " Invalid jump offset " ) ;
2012-04-03 21:35:35 -03:00
return true ;
}
2012-04-15 15:24:39 -03:00
annotate_browser__set_top ( browser , dl , idx ) ;
2014-12-17 17:24:45 -03:00
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 ) ;
}
2012-05-29 21:24:05 -03: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 ;
}
2013-03-05 14:53:21 +09:00
static int annotate_browser__run ( struct annotate_browser * browser ,
struct perf_evsel * evsel ,
2012-11-02 14:50:05 +09:00
struct hist_browser_timer * hbt )
2011-02-22 12:02:07 -03:00
{
struct rb_node * nd = NULL ;
2012-05-29 22:42:18 -03:00
struct map_symbol * ms = browser - > b . priv ;
2011-10-05 19:35:54 -03:00
struct symbol * sym = ms - > sym ;
2012-05-12 16:36:55 -03:00
const char * help = " Press 'h' for help on key bindings " ;
2012-11-02 14:50:05 +09:00
int delay_secs = hbt ? hbt - > refresh : 0 ;
2010-08-11 10:07:43 -03:00
int key ;
2013-08-07 14:38:55 +03:00
char title [ SYM_TITLE_MAX_SIZE ] ;
2010-08-10 15:14:53 -03:00
2013-08-07 14:38:55 +03:00
sym_title ( sym , ms - > map , title , sizeof ( title ) ) ;
if ( ui_browser__show ( & browser - > b , title , help ) < 0 )
2010-08-10 15:14:53 -03:00
return - 1 ;
2011-02-22 12:02:07 -03:00
2013-03-05 14:53:21 +09:00
annotate_browser__calc_percent ( browser , evsel ) ;
2011-02-22 12:02:07 -03:00
2012-05-29 22:42:18 -03:00
if ( browser - > curr_hot ) {
annotate_browser__set_rb_top ( browser , browser - > curr_hot ) ;
browser - > b . navkeypressed = false ;
2012-04-07 17:10:30 -03:00
}
2010-08-10 15:14:53 -03:00
2012-05-29 22:42:18 -03:00
nd = browser - > curr_hot ;
2011-02-22 12:02:07 -03:00
2010-08-10 15:14:53 -03:00
while ( 1 ) {
2012-05-29 22:42:18 -03:00
key = ui_browser__run ( & browser - > b , delay_secs ) ;
2010-08-10 15:14:53 -03:00
2011-10-05 19:11:32 -03:00
if ( delay_secs ! = 0 ) {
2013-03-05 14:53:21 +09:00
annotate_browser__calc_percent ( browser , evsel ) ;
2011-02-22 12: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 10:07:43 -03:00
switch ( key ) {
2011-10-20 16:59:15 -02:00
case K_TIMER :
2012-11-02 14:50:05 +09:00
if ( hbt )
hbt - > timer ( hbt - > arg ) ;
2011-10-05 19:11:32 -03:00
if ( delay_secs ! = 0 )
2013-03-05 14:53:21 +09:00
symbol__annotate_decay_histogram ( sym , evsel - > idx ) ;
2011-02-22 12:02:07 -03:00
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 )
2012-05-29 22:42:18 -03:00
nd = rb_last ( & browser - > entries ) ;
2011-02-22 12:02:07 -03:00
} else
2012-05-29 22:42:18 -03:00
nd = browser - > 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 )
2012-05-29 22:42:18 -03:00
nd = rb_first ( & browser - > entries ) ;
2011-02-22 12:02:07 -03:00
else
2012-05-29 22:42:18 -03:00
nd = browser - > curr_hot ;
2011-02-22 12:02:07 -03:00
break ;
2012-05-12 16:36:55 -03:00
case K_F1 :
2012-02-23 17:46:21 +09:00
case ' h ' :
2012-05-29 22:42:18 -03:00
ui_browser__help_window ( & browser - > b ,
2012-05-12 16:36:55 -03: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 12:31:44 -03:00
" H Cycle thru hottest instructions \n "
2012-05-12 16:36:55 -03: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 "
2015-06-19 16:10:43 -03:00
" t Toggle total period view \n "
2012-05-12 16:36:55 -03:00
" / Search string \n "
2014-11-12 18:05:26 -08:00
" k Toggle line numbers \n "
2012-10-30 11:56:05 +08:00
" r Run available scripts \n "
2013-08-07 15:55:48 -03:00
" ? Search string backwards \n " ) ;
2012-05-12 16:36:55 -03:00
continue ;
2012-10-30 11:56:05 +08:00
case ' r ' :
{
script_browse ( NULL ) ;
continue ;
}
2014-11-12 18:05:26 -08:00
case ' k ' :
annotate_browser__opts . show_linenr =
! annotate_browser__opts . show_linenr ;
break ;
2012-05-12 16:36:55 -03:00
case ' H ' :
2012-05-29 22:42:18 -03:00
nd = browser - > curr_hot ;
2010-08-10 15:14:53 -03:00
break ;
2012-02-23 17:46:21 +09:00
case ' s ' :
2012-05-29 22:42:18 -03:00
if ( annotate_browser__toggle_source ( browser ) )
2011-10-14 12:31:21 -03:00
ui_helpline__puts ( help ) ;
continue ;
2012-04-02 13:21:55 -03:00
case ' o ' :
2012-05-29 21:24:05 -03:00
annotate_browser__opts . use_offset = ! annotate_browser__opts . use_offset ;
2012-05-29 22:42:18 -03:00
annotate_browser__update_addr_width ( browser ) ;
2012-04-02 13:21:55 -03:00
continue ;
2012-04-27 16:35:29 -03:00
case ' j ' :
2012-05-29 21:24:05 -03:00
annotate_browser__opts . jump_arrows = ! annotate_browser__opts . jump_arrows ;
2012-04-27 16:35:29 -03:00
continue ;
2012-05-12 16:21:53 -03:00
case ' J ' :
2012-05-29 21:24:05 -03:00
annotate_browser__opts . show_nr_jumps = ! annotate_browser__opts . show_nr_jumps ;
2012-05-29 22:42:18 -03:00
annotate_browser__update_addr_width ( browser ) ;
2012-05-29 21:24:05 -03:00
continue ;
2012-04-07 17:10:30 -03:00
case ' / ' :
2012-05-29 22:42:18 -03:00
if ( annotate_browser__search ( browser , delay_secs ) ) {
2012-04-07 17:10:30 -03:00
show_help :
ui_helpline__puts ( help ) ;
}
continue ;
case ' n ' :
2012-05-29 22:42:18 -03:00
if ( browser - > searching_backwards ?
annotate_browser__continue_search_reverse ( browser , delay_secs ) :
annotate_browser__continue_search ( browser , delay_secs ) )
2012-04-07 17:10:30 -03:00
goto show_help ;
continue ;
case ' ? ' :
2012-05-29 22:42:18 -03:00
if ( annotate_browser__search_reverse ( browser , delay_secs ) )
2012-04-07 17:10:30 -03:00
goto show_help ;
continue ;
2012-05-29 21:24:05 -03: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-29 22:42:18 -03:00
seq + + , browser - > b . nr_entries ,
browser - > b . height ,
browser - > b . index ,
browser - > b . top_idx ,
browser - > nr_asm_entries ) ;
2012-05-29 21:24:05 -03:00
}
continue ;
2011-10-20 16:59:15 -02:00
case K_ENTER :
case K_RIGHT :
2012-05-29 22:42:18 -03:00
if ( browser - > selection = = NULL )
2011-10-06 09:45:29 -03:00
ui_helpline__puts ( " Huh? No selection. Report to linux-kernel@vger.kernel.org " ) ;
2012-05-29 22:42:18 -03:00
else if ( browser - > selection - > offset = = - 1 )
2011-10-06 09:45:29 -03:00
ui_helpline__puts ( " Actions are only available for assembly lines. " ) ;
2012-05-29 22:42:18 -03:00
else if ( ! browser - > selection - > ins ) {
if ( strcmp ( browser - > selection - > name , " retq " ) )
2012-04-20 15:57:15 -03:00
goto show_sup_ins ;
goto out ;
2012-05-29 22:42:18 -03:00
} else if ( ! ( annotate_browser__jump ( browser ) | |
2013-03-05 14:53:21 +09:00
annotate_browser__callq ( browser , evsel , hbt ) ) ) {
2012-04-20 15:57:15 -03:00
show_sup_ins :
ui_helpline__puts ( " Actions are only available for 'callq', 'retq' & jump instructions. " ) ;
}
2011-10-19 13:18:13 -02:00
continue ;
2015-06-19 16:10:43 -03:00
case ' t ' :
annotate_browser__opts . show_total_period =
! annotate_browser__opts . show_total_period ;
annotate_browser__update_addr_width ( browser ) ;
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-05-29 22:42:18 -03:00
annotate_browser__set_rb_top ( browser , nd ) ;
2010-08-10 15:14:53 -03:00
}
out :
2012-05-29 22:42:18 -03:00
ui_browser__hide ( & browser - > b ) ;
2010-08-11 10:07:43 -03:00
return key ;
2010-08-10 15:14:53 -03:00
}
2015-03-17 18:27:28 -03:00
int map_symbol__tui_annotate ( struct map_symbol * ms , struct perf_evsel * evsel ,
struct hist_browser_timer * hbt )
{
2015-06-19 16:10:43 -03:00
/* Set default value for show_total_period. */
annotate_browser__opts . show_total_period =
symbol_conf . show_total_period ;
2015-03-17 18:27:28 -03:00
return symbol__tui_annotate ( ms - > sym , ms - > map , evsel , hbt ) ;
}
2013-03-05 14:53:21 +09:00
int hist_entry__tui_annotate ( struct hist_entry * he , struct perf_evsel * evsel ,
2012-11-02 14:50:05 +09:00
struct hist_browser_timer * hbt )
2011-02-04 09:45:46 -02:00
{
2015-05-29 21:53:44 +09:00
/* reset abort key so that it can get Ctrl-C as a key */
SLang_reset_tty ( ) ;
SLang_init_tty ( 0 , 0 , 0 ) ;
2015-03-17 18:27:28 -03:00
return map_symbol__tui_annotate ( & he - > ms , evsel , hbt ) ;
2011-02-04 09:45:46 -02:00
}
2015-07-18 08:24:50 -07:00
static unsigned count_insn ( struct annotate_browser * browser , u64 start , u64 end )
{
unsigned n_insn = 0 ;
u64 offset ;
for ( offset = start ; offset < = end ; offset + + ) {
if ( browser - > offsets [ offset ] )
n_insn + + ;
}
return n_insn ;
}
static void count_and_fill ( struct annotate_browser * browser , u64 start , u64 end ,
struct cyc_hist * ch )
{
unsigned n_insn ;
u64 offset ;
n_insn = count_insn ( browser , start , end ) ;
if ( n_insn & & ch - > num & & ch - > cycles ) {
float ipc = n_insn / ( ( double ) ch - > cycles / ( double ) ch - > num ) ;
/* Hide data when there are too many overlaps. */
if ( ch - > reset > = 0x7fff | | ch - > reset > = ch - > num / 2 )
return ;
for ( offset = start ; offset < = end ; offset + + ) {
struct disasm_line * dl = browser - > offsets [ offset ] ;
if ( dl )
dl - > ipc = ipc ;
}
}
}
/*
* This should probably be in util / annotate . c to share with the tty
* annotate , but right now we need the per byte offsets arrays ,
* which are only here .
*/
static void annotate__compute_ipc ( struct annotate_browser * browser , size_t size ,
struct symbol * sym )
{
u64 offset ;
struct annotation * notes = symbol__annotation ( sym ) ;
if ( ! notes - > src | | ! notes - > src - > cycles_hist )
return ;
pthread_mutex_lock ( & notes - > lock ) ;
for ( offset = 0 ; offset < size ; + + offset ) {
struct cyc_hist * ch ;
ch = & notes - > src - > cycles_hist [ offset ] ;
if ( ch & & ch - > cycles ) {
struct disasm_line * dl ;
if ( ch - > have_start )
count_and_fill ( browser , ch - > start , offset , ch ) ;
dl = browser - > offsets [ offset ] ;
if ( dl & & ch - > num_aggr )
dl - > cycles = ch - > cycles_aggr / ch - > num_aggr ;
browser - > have_cycles = true ;
}
}
pthread_mutex_unlock ( & notes - > lock ) ;
}
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 ;
2012-11-10 02:27:15 +09: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 12:19:22 -03:00
for ( offset = 0 ; offset < size ; + + offset ) {
struct disasm_line * dl = browser - > offsets [ offset ] , * dlt ;
struct browser_disasm_line * bdlt ;
2013-01-14 14:47:17 -05: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 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 ) ;
2012-05-12 16:21:53 -03: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 12:19:22 -03:00
}
}
2012-05-12 16:21:53 -03:00
static inline int width_jumps ( int n )
{
if ( n > = 100 )
return 5 ;
if ( n / 10 )
return 2 ;
return 1 ;
}
2013-03-05 14:53:21 +09:00
int symbol__tui_annotate ( struct symbol * sym , struct map * map ,
struct perf_evsel * evsel ,
2012-11-02 14:50:05 +09:00
struct hist_browser_timer * hbt )
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 ;
2012-06-05 13:14:59 +08:00
size_t size ;
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
} ,
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 ;
2012-11-10 01:21:02 +09:00
int nr_pcnt = 1 ;
size_t sizeof_bdl = sizeof ( struct browser_disasm_line ) ;
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 ;
2012-06-05 13:14:59 +08:00
size = symbol__size ( sym ) ;
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-11-10 01:21:02 +09:00
if ( perf_evsel__is_group_event ( evsel ) ) {
nr_pcnt = evsel - > nr_members ;
2015-06-19 16:10:43 -03:00
sizeof_bdl + = sizeof ( struct disasm_line_samples ) *
( nr_pcnt - 1 ) ;
2012-11-10 01:21:02 +09:00
}
if ( symbol__annotate ( sym , map , sizeof_bdl ) < 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 ) ;
2015-07-18 08:24:50 -07:00
annotate__compute_ipc ( & browser , size , 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 12:19:22 -03:00
2012-05-12 16:21:53 -03:00
browser . addr_width = browser . target_width = browser . min_addr_width = hex_width ( size ) ;
2012-05-03 13:12:49 -03:00
browser . max_addr_width = hex_width ( sym - > end ) ;
2012-05-12 16:21:53 -03:00
browser . jumps_width = width_jumps ( browser . max_jump_sources ) ;
2012-11-10 01:21:02 +09:00
browser . nr_events = nr_pcnt ;
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 */
2012-05-29 21:24:05 -03:00
if ( annotate_browser__opts . hide_src_code )
annotate_browser__init_asm_mode ( & browser ) ;
annotate_browser__update_addr_width ( & browser ) ;
2013-03-05 14:53:21 +09:00
ret = annotate_browser__run ( & browser , evsel , hbt ) ;
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 ;
}
2012-05-29 22:06:30 -03:00
# define ANNOTATE_CFG(n) \
{ . name = # n , . value = & annotate_browser__opts . n , }
2013-01-14 14:47:17 -05:00
2012-05-29 22:06:30 -03:00
/*
* Keep the entries sorted , they are bsearch ' ed
*/
2013-01-18 16:55:52 -03:00
static struct annotate_config {
2012-05-29 22:06:30 -03:00
const char * name ;
bool * value ;
} annotate__configs [ ] = {
ANNOTATE_CFG ( hide_src_code ) ,
ANNOTATE_CFG ( jump_arrows ) ,
2014-11-12 18:05:26 -08:00
ANNOTATE_CFG ( show_linenr ) ,
2012-05-29 22:06:30 -03:00
ANNOTATE_CFG ( show_nr_jumps ) ,
ANNOTATE_CFG ( use_offset ) ,
2015-06-19 16:10:43 -03:00
ANNOTATE_CFG ( show_total_period ) ,
2012-05-29 22:06:30 -03:00
} ;
# undef ANNOTATE_CFG
static int annotate_config__cmp ( const void * name , const void * cfgp )
{
2013-01-18 16:55:52 -03:00
const struct annotate_config * cfg = cfgp ;
2012-05-29 22:06:30 -03:00
return strcmp ( name , cfg - > name ) ;
}
2012-09-11 01:15:03 +03:00
static int annotate__config ( const char * var , const char * value ,
void * data __maybe_unused )
2012-05-29 22:06:30 -03:00
{
2013-01-18 16:55:52 -03:00
struct annotate_config * cfg ;
2012-05-29 22:06:30 -03:00
const char * name ;
if ( prefixcmp ( var , " annotate. " ) ! = 0 )
return 0 ;
name = var + 9 ;
cfg = bsearch ( name , annotate__configs , ARRAY_SIZE ( annotate__configs ) ,
2013-01-18 16:55:52 -03:00
sizeof ( struct annotate_config ) , annotate_config__cmp ) ;
2012-05-29 22:06:30 -03:00
if ( cfg = = NULL )
return - 1 ;
* cfg - > value = perf_config_bool ( name , value ) ;
return 0 ;
}
void annotate_browser__init ( void )
{
perf_config ( annotate__config , NULL ) ;
}