2011-02-04 14:45:46 +03:00
/*
* Copyright ( C ) 2011 , Red Hat Inc , Arnaldo Carvalho de Melo < acme @ redhat . com >
*
* Parts came from builtin - annotate . c , see those files for further
* copyright notes .
*
* Released under the GPL v2 . ( and only v2 , not any later version )
*/
# include "util.h"
2014-02-20 05:32:53 +04:00
# include "ui/ui.h"
# include "sort.h"
2011-02-04 14:45:46 +03:00
# include "build-id.h"
# include "color.h"
# include "cache.h"
# include "symbol.h"
# include "debug.h"
# include "annotate.h"
2013-03-05 09:53:21 +04:00
# include "evsel.h"
2014-11-13 05:05:26 +03:00
# include <regex.h>
2011-02-08 18:27:39 +03:00
# include <pthread.h>
2012-10-28 01:18:29 +04:00
# include <linux/bitops.h>
2011-02-04 14:45:46 +03:00
2011-09-16 01:31:41 +04:00
const char * disassembler_style ;
2012-09-04 14:32:30 +04:00
const char * objdump_path ;
2014-11-13 05:05:26 +03:00
static regex_t file_lineno ;
2011-09-16 01:31:41 +04:00
2012-05-12 20:15:34 +04:00
static struct ins * ins__find ( const char * name ) ;
static int disasm_line__parse ( char * line , char * * namep , char * * rawp ) ;
2012-05-12 20:26:20 +04:00
static void ins__delete ( struct ins_operands * ops )
{
2015-03-05 21:27:28 +03:00
if ( ops = = NULL )
return ;
2013-12-27 23:55:14 +04:00
zfree ( & ops - > source . raw ) ;
zfree ( & ops - > source . name ) ;
zfree ( & ops - > target . raw ) ;
zfree ( & ops - > target . name ) ;
2012-05-12 20:26:20 +04:00
}
2012-05-08 01:54:16 +04:00
static int ins__raw_scnprintf ( struct ins * ins , char * bf , size_t size ,
struct ins_operands * ops )
{
return scnprintf ( bf , size , " %-6.6s %s " , ins - > name , ops - > raw ) ;
}
int ins__scnprintf ( struct ins * ins , char * bf , size_t size ,
struct ins_operands * ops )
{
if ( ins - > ops - > scnprintf )
return ins - > ops - > scnprintf ( ins , bf , size , ops ) ;
return ins__raw_scnprintf ( ins , bf , size , ops ) ;
}
2012-04-20 21:38:46 +04:00
static int call__parse ( struct ins_operands * ops )
2012-04-18 23:07:38 +04:00
{
2012-04-20 22:26:47 +04:00
char * endptr , * tok , * name ;
2012-04-25 15:00:23 +04:00
ops - > target . addr = strtoull ( ops - > raw , & endptr , 16 ) ;
2012-04-20 22:26:47 +04:00
name = strchr ( endptr , ' < ' ) ;
if ( name = = NULL )
goto indirect_call ;
name + + ;
tok = strchr ( name , ' > ' ) ;
if ( tok = = NULL )
return - 1 ;
* tok = ' \0 ' ;
2012-04-25 15:00:23 +04:00
ops - > target . name = strdup ( name ) ;
2012-04-20 22:26:47 +04:00
* tok = ' > ' ;
2012-04-25 15:00:23 +04:00
return ops - > target . name = = NULL ? - 1 : 0 ;
2012-04-20 22:26:47 +04:00
indirect_call :
2012-05-11 19:28:55 +04:00
tok = strchr ( endptr , ' ( ' ) ;
if ( tok ! = NULL ) {
ops - > target . addr = 0 ;
return 0 ;
}
2012-04-20 22:26:47 +04:00
tok = strchr ( endptr , ' * ' ) ;
if ( tok = = NULL )
return - 1 ;
2012-04-25 15:00:23 +04:00
ops - > target . addr = strtoull ( tok + 1 , NULL , 16 ) ;
2012-04-18 23:07:38 +04:00
return 0 ;
}
2012-04-20 22:26:47 +04:00
static int call__scnprintf ( struct ins * ins , char * bf , size_t size ,
2012-05-08 01:54:16 +04:00
struct ins_operands * ops )
2012-04-20 22:26:47 +04:00
{
2012-04-25 15:00:23 +04:00
if ( ops - > target . name )
return scnprintf ( bf , size , " %-6.6s %s " , ins - > name , ops - > target . name ) ;
2012-04-20 22:26:47 +04:00
2012-05-11 19:28:55 +04:00
if ( ops - > target . addr = = 0 )
return ins__raw_scnprintf ( ins , bf , size , ops ) ;
2012-04-25 15:00:23 +04:00
return scnprintf ( bf , size , " %-6.6s *% " PRIx64 , ins - > name , ops - > target . addr ) ;
2012-04-20 22:26:47 +04:00
}
2012-04-18 23:07:38 +04:00
static struct ins_ops call_ops = {
2012-04-20 22:26:47 +04:00
. parse = call__parse ,
. scnprintf = call__scnprintf ,
2012-04-18 23:07:38 +04:00
} ;
bool ins__is_call ( const struct ins * ins )
{
return ins - > ops = = & call_ops ;
}
2012-04-20 21:38:46 +04:00
static int jump__parse ( struct ins_operands * ops )
2012-04-18 20:58:34 +04:00
{
2012-04-20 21:38:46 +04:00
const char * s = strchr ( ops - > raw , ' + ' ) ;
2012-04-18 20:58:34 +04:00
2013-08-07 15:38:54 +04:00
ops - > target . addr = strtoull ( ops - > raw , NULL , 16 ) ;
2012-04-25 21:16:03 +04:00
if ( s + + ! = NULL )
2013-08-07 15:38:54 +04:00
ops - > target . offset = strtoull ( s , NULL , 16 ) ;
2012-04-25 21:16:03 +04:00
else
ops - > target . offset = UINT64_MAX ;
2012-04-18 20:58:34 +04:00
return 0 ;
}
2012-04-20 21:38:46 +04:00
static int jump__scnprintf ( struct ins * ins , char * bf , size_t size ,
2012-05-08 01:54:16 +04:00
struct ins_operands * ops )
2012-04-19 17:16:27 +04:00
{
2012-04-25 15:00:23 +04:00
return scnprintf ( bf , size , " %-6.6s % " PRIx64 , ins - > name , ops - > target . offset ) ;
2012-04-19 17:16:27 +04:00
}
2012-04-18 20:58:34 +04:00
static struct ins_ops jump_ops = {
2012-04-20 21:38:46 +04:00
. parse = jump__parse ,
. scnprintf = jump__scnprintf ,
2012-04-18 20:58:34 +04:00
} ;
bool ins__is_jump ( const struct ins * ins )
{
return ins - > ops = = & jump_ops ;
}
2012-05-11 23:48:49 +04:00
static int comment__symbol ( char * raw , char * comment , u64 * addrp , char * * namep )
{
char * endptr , * name , * t ;
if ( strstr ( raw , " (%rip) " ) = = NULL )
return 0 ;
* addrp = strtoull ( comment , & endptr , 16 ) ;
name = strchr ( endptr , ' < ' ) ;
if ( name = = NULL )
return - 1 ;
name + + ;
t = strchr ( name , ' > ' ) ;
if ( t = = NULL )
return 0 ;
* t = ' \0 ' ;
* namep = strdup ( name ) ;
* t = ' > ' ;
return 0 ;
}
2012-05-12 20:15:34 +04:00
static int lock__parse ( struct ins_operands * ops )
{
char * name ;
ops - > locked . ops = zalloc ( sizeof ( * ops - > locked . ops ) ) ;
if ( ops - > locked . ops = = NULL )
return 0 ;
if ( disasm_line__parse ( ops - > raw , & name , & ops - > locked . ops - > raw ) < 0 )
goto out_free_ops ;
2012-11-09 21:27:13 +04:00
ops - > locked . ins = ins__find ( name ) ;
2015-01-18 22:00:21 +03:00
free ( name ) ;
2012-11-09 21:27:13 +04:00
if ( ops - > locked . ins = = NULL )
goto out_free_ops ;
2012-05-12 20:15:34 +04:00
2012-11-09 21:27:13 +04:00
if ( ! ops - > locked . ins - > ops )
return 0 ;
2012-05-12 20:15:34 +04:00
2015-01-18 22:00:20 +03:00
if ( ops - > locked . ins - > ops - > parse & &
ops - > locked . ins - > ops - > parse ( ops - > locked . ops ) < 0 )
goto out_free_ops ;
2012-05-12 20:15:34 +04:00
return 0 ;
out_free_ops :
2013-12-27 00:41:15 +04:00
zfree ( & ops - > locked . ops ) ;
2012-05-12 20:15:34 +04:00
return 0 ;
}
static int lock__scnprintf ( struct ins * ins , char * bf , size_t size ,
struct ins_operands * ops )
{
int printed ;
if ( ops - > locked . ins = = NULL )
return ins__raw_scnprintf ( ins , bf , size , ops ) ;
printed = scnprintf ( bf , size , " %-6.6s " , ins - > name ) ;
return printed + ins__scnprintf ( ops - > locked . ins , bf + printed ,
size - printed , ops - > locked . ops ) ;
}
2012-05-12 20:26:20 +04:00
static void lock__delete ( struct ins_operands * ops )
{
2015-01-18 22:00:21 +03:00
struct ins * ins = ops - > locked . ins ;
if ( ins & & ins - > ops - > free )
ins - > ops - > free ( ops - > locked . ops ) ;
else
ins__delete ( ops - > locked . ops ) ;
2013-12-27 23:55:14 +04:00
zfree ( & ops - > locked . ops ) ;
zfree ( & ops - > target . raw ) ;
zfree ( & ops - > target . name ) ;
2012-05-12 20:26:20 +04:00
}
2012-05-12 20:15:34 +04:00
static struct ins_ops lock_ops = {
2012-05-12 20:26:20 +04:00
. free = lock__delete ,
2012-05-12 20:15:34 +04:00
. parse = lock__parse ,
. scnprintf = lock__scnprintf ,
} ;
2012-05-11 23:48:49 +04:00
static int mov__parse ( struct ins_operands * ops )
{
char * s = strchr ( ops - > raw , ' , ' ) , * target , * comment , prev ;
if ( s = = NULL )
return - 1 ;
* s = ' \0 ' ;
ops - > source . raw = strdup ( ops - > raw ) ;
* s = ' , ' ;
2014-12-17 23:24:45 +03:00
2012-05-11 23:48:49 +04:00
if ( ops - > source . raw = = NULL )
return - 1 ;
target = + + s ;
2014-08-15 01:03:00 +04:00
comment = strchr ( s , ' # ' ) ;
if ( comment ! = NULL )
s = comment - 1 ;
else
s = strchr ( s , ' \0 ' ) - 1 ;
2012-05-11 23:48:49 +04:00
2014-08-15 01:03:00 +04:00
while ( s > target & & isspace ( s [ 0 ] ) )
- - s ;
s + + ;
2012-05-11 23:48:49 +04:00
prev = * s ;
* s = ' \0 ' ;
ops - > target . raw = strdup ( target ) ;
* s = prev ;
if ( ops - > target . raw = = NULL )
goto out_free_source ;
if ( comment = = NULL )
return 0 ;
while ( comment [ 0 ] ! = ' \0 ' & & isspace ( comment [ 0 ] ) )
+ + comment ;
comment__symbol ( ops - > source . raw , comment , & ops - > source . addr , & ops - > source . name ) ;
comment__symbol ( ops - > target . raw , comment , & ops - > target . addr , & ops - > target . name ) ;
return 0 ;
out_free_source :
2013-12-27 00:41:15 +04:00
zfree ( & ops - > source . raw ) ;
2012-05-11 23:48:49 +04:00
return - 1 ;
}
static int mov__scnprintf ( struct ins * ins , char * bf , size_t size ,
struct ins_operands * ops )
{
return scnprintf ( bf , size , " %-6.6s %s,%s " , ins - > name ,
ops - > source . name ? : ops - > source . raw ,
ops - > target . name ? : ops - > target . raw ) ;
}
static struct ins_ops mov_ops = {
. parse = mov__parse ,
. scnprintf = mov__scnprintf ,
} ;
2012-05-12 00:21:09 +04:00
static int dec__parse ( struct ins_operands * ops )
{
char * target , * comment , * s , prev ;
target = s = ops - > raw ;
while ( s [ 0 ] ! = ' \0 ' & & ! isspace ( s [ 0 ] ) )
+ + s ;
prev = * s ;
* s = ' \0 ' ;
ops - > target . raw = strdup ( target ) ;
* s = prev ;
if ( ops - > target . raw = = NULL )
return - 1 ;
comment = strchr ( s , ' # ' ) ;
if ( comment = = NULL )
return 0 ;
while ( comment [ 0 ] ! = ' \0 ' & & isspace ( comment [ 0 ] ) )
+ + comment ;
comment__symbol ( ops - > target . raw , comment , & ops - > target . addr , & ops - > target . name ) ;
return 0 ;
}
static int dec__scnprintf ( struct ins * ins , char * bf , size_t size ,
struct ins_operands * ops )
{
return scnprintf ( bf , size , " %-6.6s %s " , ins - > name ,
ops - > target . name ? : ops - > target . raw ) ;
}
static struct ins_ops dec_ops = {
. parse = dec__parse ,
. scnprintf = dec__scnprintf ,
} ;
2012-09-11 02:15:03 +04:00
static int nop__scnprintf ( struct ins * ins __maybe_unused , char * bf , size_t size ,
struct ins_operands * ops __maybe_unused )
2012-05-08 01:57:02 +04:00
{
return scnprintf ( bf , size , " %-6.6s " , " nop " ) ;
}
static struct ins_ops nop_ops = {
. scnprintf = nop__scnprintf ,
} ;
2012-04-18 20:58:34 +04:00
/*
* Must be sorted by name !
*/
static struct ins instructions [ ] = {
2012-05-11 23:48:49 +04:00
{ . name = " add " , . ops = & mov_ops , } ,
{ . name = " addl " , . ops = & mov_ops , } ,
{ . name = " addq " , . ops = & mov_ops , } ,
{ . name = " addw " , . ops = & mov_ops , } ,
{ . name = " and " , . ops = & mov_ops , } ,
2012-05-12 20:15:34 +04:00
{ . name = " bts " , . ops = & mov_ops , } ,
2012-04-18 23:07:38 +04:00
{ . name = " call " , . ops = & call_ops , } ,
{ . name = " callq " , . ops = & call_ops , } ,
2012-05-11 23:48:49 +04:00
{ . name = " cmp " , . ops = & mov_ops , } ,
{ . name = " cmpb " , . ops = & mov_ops , } ,
{ . name = " cmpl " , . ops = & mov_ops , } ,
{ . name = " cmpq " , . ops = & mov_ops , } ,
{ . name = " cmpw " , . ops = & mov_ops , } ,
{ . name = " cmpxch " , . ops = & mov_ops , } ,
2012-05-12 00:21:09 +04:00
{ . name = " dec " , . ops = & dec_ops , } ,
{ . name = " decl " , . ops = & dec_ops , } ,
2012-05-11 23:48:49 +04:00
{ . name = " imul " , . ops = & mov_ops , } ,
2012-05-12 00:21:09 +04:00
{ . name = " inc " , . ops = & dec_ops , } ,
{ . name = " incl " , . ops = & dec_ops , } ,
2012-04-18 20:58:34 +04:00
{ . name = " ja " , . ops = & jump_ops , } ,
2012-04-20 00:10:12 +04:00
{ . name = " jae " , . ops = & jump_ops , } ,
{ . name = " jb " , . ops = & jump_ops , } ,
{ . name = " jbe " , . ops = & jump_ops , } ,
{ . name = " jc " , . ops = & jump_ops , } ,
{ . name = " jcxz " , . ops = & jump_ops , } ,
2012-04-18 20:58:34 +04:00
{ . name = " je " , . ops = & jump_ops , } ,
2012-04-20 00:10:12 +04:00
{ . name = " jecxz " , . ops = & jump_ops , } ,
{ . name = " jg " , . ops = & jump_ops , } ,
{ . name = " jge " , . ops = & jump_ops , } ,
{ . name = " jl " , . ops = & jump_ops , } ,
{ . name = " jle " , . ops = & jump_ops , } ,
2012-04-18 20:58:34 +04:00
{ . name = " jmp " , . ops = & jump_ops , } ,
{ . name = " jmpq " , . ops = & jump_ops , } ,
2012-04-20 00:10:12 +04:00
{ . name = " jna " , . ops = & jump_ops , } ,
{ . name = " jnae " , . ops = & jump_ops , } ,
{ . name = " jnb " , . ops = & jump_ops , } ,
{ . name = " jnbe " , . ops = & jump_ops , } ,
{ . name = " jnc " , . ops = & jump_ops , } ,
2012-04-18 20:58:34 +04:00
{ . name = " jne " , . ops = & jump_ops , } ,
2012-04-20 00:10:12 +04:00
{ . name = " jng " , . ops = & jump_ops , } ,
{ . name = " jnge " , . ops = & jump_ops , } ,
{ . name = " jnl " , . ops = & jump_ops , } ,
{ . name = " jnle " , . ops = & jump_ops , } ,
{ . name = " jno " , . ops = & jump_ops , } ,
{ . name = " jnp " , . ops = & jump_ops , } ,
{ . name = " jns " , . ops = & jump_ops , } ,
{ . name = " jnz " , . ops = & jump_ops , } ,
{ . name = " jo " , . ops = & jump_ops , } ,
{ . name = " jp " , . ops = & jump_ops , } ,
{ . name = " jpe " , . ops = & jump_ops , } ,
{ . name = " jpo " , . ops = & jump_ops , } ,
{ . name = " jrcxz " , . ops = & jump_ops , } ,
2012-04-18 20:58:34 +04:00
{ . name = " js " , . ops = & jump_ops , } ,
2012-04-20 00:10:12 +04:00
{ . name = " jz " , . ops = & jump_ops , } ,
2012-05-11 23:48:49 +04:00
{ . name = " lea " , . ops = & mov_ops , } ,
2012-05-12 20:15:34 +04:00
{ . name = " lock " , . ops = & lock_ops , } ,
2012-05-11 23:48:49 +04:00
{ . name = " mov " , . ops = & mov_ops , } ,
{ . name = " movb " , . ops = & mov_ops , } ,
{ . name = " movdqa " , . ops = & mov_ops , } ,
{ . name = " movl " , . ops = & mov_ops , } ,
{ . name = " movq " , . ops = & mov_ops , } ,
{ . name = " movslq " , . ops = & mov_ops , } ,
{ . name = " movzbl " , . ops = & mov_ops , } ,
{ . name = " movzwl " , . ops = & mov_ops , } ,
2012-05-08 01:57:02 +04:00
{ . name = " nop " , . ops = & nop_ops , } ,
{ . name = " nopl " , . ops = & nop_ops , } ,
{ . name = " nopw " , . ops = & nop_ops , } ,
2012-05-11 23:48:49 +04:00
{ . name = " or " , . ops = & mov_ops , } ,
{ . name = " orl " , . ops = & mov_ops , } ,
{ . name = " test " , . ops = & mov_ops , } ,
{ . name = " testb " , . ops = & mov_ops , } ,
{ . name = " testl " , . ops = & mov_ops , } ,
2012-05-12 20:15:34 +04:00
{ . name = " xadd " , . ops = & mov_ops , } ,
2012-10-31 04:34:08 +04:00
{ . name = " xbeginl " , . ops = & jump_ops , } ,
{ . name = " xbeginq " , . ops = & jump_ops , } ,
2012-04-18 20:58:34 +04:00
} ;
static int ins__cmp ( const void * name , const void * insp )
{
const struct ins * ins = insp ;
return strcmp ( name , ins - > name ) ;
}
static struct ins * ins__find ( const char * name )
{
const int nmemb = ARRAY_SIZE ( instructions ) ;
return bsearch ( name , instructions , nmemb , sizeof ( struct ins ) , ins__cmp ) ;
}
2012-09-11 02:15:03 +04:00
int symbol__annotate_init ( struct map * map __maybe_unused , struct symbol * sym )
2011-02-04 14:45:46 +03:00
{
struct annotation * notes = symbol__annotation ( sym ) ;
2011-02-08 18:27:39 +03:00
pthread_mutex_init ( & notes - > lock , NULL ) ;
return 0 ;
}
2011-02-04 14:45:46 +03:00
2011-11-12 04:17:32 +04:00
int symbol__alloc_hist ( struct symbol * sym )
2011-02-08 18:27:39 +03:00
{
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-19 17:57:06 +04:00
const size_t size = symbol__size ( sym ) ;
2012-07-20 07:05:25 +04:00
size_t sizeof_sym_hist ;
/* Check for overflow when calculating sizeof_sym_hist */
if ( size > ( SIZE_MAX - sizeof ( struct sym_hist ) ) / sizeof ( u64 ) )
return - 1 ;
sizeof_sym_hist = ( sizeof ( struct sym_hist ) + size * sizeof ( u64 ) ) ;
/* Check for overflow in zalloc argument */
if ( sizeof_sym_hist > ( SIZE_MAX - sizeof ( * notes - > src ) )
/ symbol_conf . nr_events )
return - 1 ;
2011-02-08 18:27:39 +03:00
2011-11-12 04:17:32 +04:00
notes - > src = zalloc ( sizeof ( * notes - > src ) + symbol_conf . nr_events * sizeof_sym_hist ) ;
2011-02-08 18:27:39 +03:00
if ( notes - > src = = NULL )
return - 1 ;
notes - > src - > sizeof_sym_hist = sizeof_sym_hist ;
2011-11-12 04:17:32 +04:00
notes - > src - > nr_histograms = symbol_conf . nr_events ;
2011-02-08 18:27:39 +03:00
INIT_LIST_HEAD ( & notes - > src - > source ) ;
return 0 ;
2011-02-04 14:45:46 +03:00
}
2011-02-06 19:54:44 +03:00
void symbol__annotate_zero_histograms ( struct symbol * sym )
{
struct annotation * notes = symbol__annotation ( sym ) ;
2011-02-08 18:27:39 +03:00
pthread_mutex_lock ( & notes - > lock ) ;
if ( notes - > src ! = NULL )
memset ( notes - > src - > histograms , 0 ,
notes - > src - > nr_histograms * notes - > src - > sizeof_sym_hist ) ;
pthread_mutex_unlock ( & notes - > lock ) ;
2011-02-06 19:54:44 +03:00
}
2013-12-18 22:37:41 +04:00
static int __symbol__inc_addr_samples ( struct symbol * sym , struct map * map ,
struct annotation * notes , int evidx , u64 addr )
2011-02-04 14:45:46 +03:00
{
2011-02-04 18:43:24 +03:00
unsigned offset ;
2011-02-04 14:45:46 +03:00
struct sym_hist * h ;
pr_debug3 ( " %s: addr=%# " PRIx64 " \n " , __func__ , map - > unmap_ip ( map , addr ) ) ;
2014-10-15 00:19:44 +04:00
if ( addr < sym - > start | | addr > = sym - > end )
2012-03-27 19:55:57 +04:00
return - ERANGE ;
2011-02-04 14:45:46 +03:00
2011-02-04 18:43:24 +03:00
offset = addr - sym - > start ;
h = annotation__histogram ( notes , evidx ) ;
2011-02-04 14:45:46 +03:00
h - > sum + + ;
h - > addr [ offset ] + + ;
pr_debug3 ( " %# " PRIx64 " %s: period++ [addr: %# " PRIx64 " , %# " PRIx64
2011-02-04 18:43:24 +03:00
" , evidx=%d] => % " PRIu64 " \n " , sym - > start , sym - > name ,
addr , addr - sym - > start , evidx , h - > addr [ offset ] ) ;
2011-02-04 14:45:46 +03:00
return 0 ;
}
2015-05-27 20:51:46 +03:00
static struct annotation * symbol__get_annotation ( struct symbol * sym )
{
struct annotation * notes = symbol__annotation ( sym ) ;
if ( notes - > src = = NULL ) {
if ( symbol__alloc_hist ( sym ) < 0 )
return NULL ;
}
return notes ;
}
2013-12-19 00:12:24 +04:00
static int symbol__inc_addr_samples ( struct symbol * sym , struct map * map ,
int evidx , u64 addr )
2013-12-18 22:37:41 +04:00
{
struct annotation * notes ;
2014-02-20 05:32:53 +04:00
if ( sym = = NULL )
2013-12-18 22:37:41 +04:00
return 0 ;
2015-05-27 20:51:46 +03:00
notes = symbol__get_annotation ( sym ) ;
if ( notes = = NULL )
return - ENOMEM ;
2013-12-18 22:37:41 +04:00
return __symbol__inc_addr_samples ( sym , map , notes , evidx , addr ) ;
}
2013-12-18 23:48:29 +04:00
int addr_map_symbol__inc_samples ( struct addr_map_symbol * ams , int evidx )
{
return symbol__inc_addr_samples ( ams - > sym , ams - > map , evidx , ams - > al_addr ) ;
}
2013-12-19 00:10:15 +04:00
int hist_entry__inc_addr_samples ( struct hist_entry * he , int evidx , u64 ip )
{
return symbol__inc_addr_samples ( he - > ms . sym , he - > ms . map , evidx , ip ) ;
}
2012-04-18 20:58:34 +04:00
static void disasm_line__init_ins ( struct disasm_line * dl )
{
dl - > ins = ins__find ( dl - > name ) ;
if ( dl - > ins = = NULL )
return ;
if ( ! dl - > ins - > ops )
return ;
2015-01-18 22:00:20 +03:00
if ( dl - > ins - > ops - > parse & & dl - > ins - > ops - > parse ( & dl - > ops ) < 0 )
dl - > ins = NULL ;
2012-04-18 20:58:34 +04:00
}
2012-05-12 20:15:34 +04:00
static int disasm_line__parse ( char * line , char * * namep , char * * rawp )
{
char * name = line , tmp ;
while ( isspace ( name [ 0 ] ) )
+ + name ;
if ( name [ 0 ] = = ' \0 ' )
return - 1 ;
* rawp = name + 1 ;
while ( ( * rawp ) [ 0 ] ! = ' \0 ' & & ! isspace ( ( * rawp ) [ 0 ] ) )
+ + * rawp ;
tmp = ( * rawp ) [ 0 ] ;
( * rawp ) [ 0 ] = ' \0 ' ;
* namep = strdup ( name ) ;
if ( * namep = = NULL )
goto out_free_name ;
( * rawp ) [ 0 ] = tmp ;
if ( ( * rawp ) [ 0 ] ! = ' \0 ' ) {
( * rawp ) + + ;
while ( isspace ( ( * rawp ) [ 0 ] ) )
+ + ( * rawp ) ;
}
return 0 ;
out_free_name :
2013-12-27 00:41:15 +04:00
zfree ( namep ) ;
2012-05-12 20:15:34 +04:00
return - 1 ;
}
2014-11-13 05:05:26 +03:00
static struct disasm_line * disasm_line__new ( s64 offset , char * line ,
size_t privsize , int line_nr )
2011-02-04 14:45:46 +03:00
{
2012-04-15 22:52:18 +04:00
struct disasm_line * dl = zalloc ( sizeof ( * dl ) + privsize ) ;
2011-02-04 14:45:46 +03:00
2012-04-15 22:24:39 +04:00
if ( dl ! = NULL ) {
dl - > offset = offset ;
dl - > line = strdup ( line ) ;
2014-11-13 05:05:26 +03:00
dl - > line_nr = line_nr ;
2012-04-15 22:24:39 +04:00
if ( dl - > line = = NULL )
2012-04-02 19:59:01 +04:00
goto out_delete ;
2012-04-15 22:52:18 +04:00
if ( offset ! = - 1 ) {
2012-05-12 20:15:34 +04:00
if ( disasm_line__parse ( dl - > line , & dl - > name , & dl - > ops . raw ) < 0 )
2012-04-15 22:52:18 +04:00
goto out_free_line ;
2012-04-18 20:58:34 +04:00
disasm_line__init_ins ( dl ) ;
2012-04-15 22:52:18 +04:00
}
2011-02-04 14:45:46 +03:00
}
2012-04-15 22:24:39 +04:00
return dl ;
2012-04-15 22:52:18 +04:00
out_free_line :
2013-12-27 23:55:14 +04:00
zfree ( & dl - > line ) ;
2012-04-02 19:59:01 +04:00
out_delete :
2012-04-15 22:24:39 +04:00
free ( dl ) ;
2012-04-02 19:59:01 +04:00
return NULL ;
2011-02-04 14:45:46 +03:00
}
2012-04-15 22:24:39 +04:00
void disasm_line__free ( struct disasm_line * dl )
2011-02-04 14:45:46 +03:00
{
2013-12-27 23:55:14 +04:00
zfree ( & dl - > line ) ;
zfree ( & dl - > name ) ;
2012-05-12 20:26:20 +04:00
if ( dl - > ins & & dl - > ins - > ops - > free )
dl - > ins - > ops - > free ( & dl - > ops ) ;
else
ins__delete ( & dl - > ops ) ;
2012-04-15 22:24:39 +04:00
free ( dl ) ;
2011-02-04 14:45:46 +03:00
}
2012-05-08 01:54:16 +04:00
int disasm_line__scnprintf ( struct disasm_line * dl , char * bf , size_t size , bool raw )
{
if ( raw | | ! dl - > ins )
return scnprintf ( bf , size , " %-6.6s %s " , dl - > name , dl - > ops . raw ) ;
return ins__scnprintf ( dl - > ins , bf , size , & dl - > ops ) ;
}
2012-04-15 22:24:39 +04:00
static void disasm__add ( struct list_head * head , struct disasm_line * line )
2011-02-04 14:45:46 +03:00
{
list_add_tail ( & line - > node , head ) ;
}
2012-04-15 22:24:39 +04:00
struct disasm_line * disasm__get_next_ip_line ( struct list_head * head , struct disasm_line * pos )
2011-02-04 14:45:46 +03:00
{
list_for_each_entry_continue ( pos , head , node )
if ( pos - > offset > = 0 )
return pos ;
return NULL ;
}
2013-03-05 09:53:30 +04:00
double disasm__calc_percent ( struct annotation * notes , int evidx , s64 offset ,
2015-06-19 22:10:43 +03:00
s64 end , const char * * path , u64 * nr_samples )
2013-03-05 09:53:23 +04:00
{
struct source_line * src_line = notes - > src - > lines ;
double percent = 0.0 ;
2015-06-19 22:10:43 +03:00
* nr_samples = 0 ;
2013-03-05 09:53:23 +04:00
2013-03-05 09:53:24 +04:00
if ( src_line ) {
2013-03-05 09:53:28 +04:00
size_t sizeof_src_line = sizeof ( * src_line ) +
sizeof ( src_line - > p ) * ( src_line - > nr_pcnt - 1 ) ;
2013-03-05 09:53:24 +04:00
while ( offset < end ) {
2013-03-05 09:53:28 +04:00
src_line = ( void * ) notes - > src - > lines +
( sizeof_src_line * offset ) ;
2013-03-05 09:53:23 +04:00
if ( * path = = NULL )
2013-03-05 09:53:28 +04:00
* path = src_line - > path ;
2013-03-05 09:53:23 +04:00
2013-03-05 09:53:28 +04:00
percent + = src_line - > p [ evidx ] . percent ;
2015-06-19 22:10:43 +03:00
* nr_samples + = src_line - > p [ evidx ] . samples ;
2013-03-05 09:53:28 +04:00
offset + + ;
2013-03-05 09:53:24 +04:00
}
} else {
2013-03-05 09:53:28 +04:00
struct sym_hist * h = annotation__histogram ( notes , evidx ) ;
unsigned int hits = 0 ;
2013-03-05 09:53:24 +04:00
while ( offset < end )
hits + = h - > addr [ offset + + ] ;
2013-03-05 09:53:23 +04:00
2015-06-19 22:10:43 +03:00
if ( h - > sum ) {
* nr_samples = hits ;
2013-03-05 09:53:24 +04:00
percent = 100.0 * hits / h - > sum ;
2015-06-19 22:10:43 +03:00
}
2013-03-05 09:53:24 +04:00
}
2013-03-05 09:53:23 +04:00
return percent ;
}
2012-04-15 22:24:39 +04:00
static int disasm_line__print ( struct disasm_line * dl , struct symbol * sym , u64 start ,
2013-03-05 09:53:21 +04:00
struct perf_evsel * evsel , u64 len , int min_pcnt , int printed ,
2012-04-15 22:24:39 +04:00
int max_lines , struct disasm_line * queue )
2011-02-04 14:45:46 +03:00
{
static const char * prev_line ;
static const char * prev_color ;
2012-04-15 22:24:39 +04:00
if ( dl - > offset ! = - 1 ) {
2011-02-04 14:45:46 +03:00
const char * path = NULL ;
2015-06-19 22:10:43 +03:00
u64 nr_samples ;
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
double percent , max_percent = 0.0 ;
double * ppercents = & percent ;
2015-06-19 22:10:43 +03:00
u64 * psamples = & nr_samples ;
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
int i , nr_percent = 1 ;
2011-02-04 14:45:46 +03:00
const char * color ;
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 22:24:39 +04:00
s64 offset = dl - > offset ;
2012-04-02 19:59:01 +04:00
const u64 addr = start + offset ;
2012-04-15 22:24:39 +04:00
struct disasm_line * next ;
2011-02-08 18:27:39 +03:00
2012-04-15 22:24:39 +04:00
next = disasm__get_next_ip_line ( & notes - > src - > source , dl ) ;
2011-02-04 14:45:46 +03:00
2013-03-05 09:53:26 +04:00
if ( perf_evsel__is_group_event ( evsel ) ) {
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
nr_percent = evsel - > nr_members ;
ppercents = calloc ( nr_percent , sizeof ( double ) ) ;
2015-06-19 22:10:43 +03:00
psamples = calloc ( nr_percent , sizeof ( u64 ) ) ;
if ( ppercents = = NULL | | psamples = = NULL ) {
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
return - 1 ;
2015-06-19 22:10:43 +03:00
}
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
}
for ( i = 0 ; i < nr_percent ; i + + ) {
percent = disasm__calc_percent ( notes ,
2013-03-05 09:53:28 +04:00
notes - > src - > lines ? i : evsel - > idx + i ,
offset ,
next ? next - > offset : ( s64 ) len ,
2015-06-19 22:10:43 +03:00
& path , & nr_samples ) ;
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
ppercents [ i ] = percent ;
2015-06-19 22:10:43 +03:00
psamples [ i ] = nr_samples ;
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
if ( percent > max_percent )
max_percent = percent ;
}
if ( max_percent < min_pcnt )
2011-02-06 19:54:44 +03:00
return - 1 ;
2011-02-08 20:01:39 +03:00
if ( max_lines & & printed > = max_lines )
2011-02-06 19:54:44 +03:00
return 1 ;
2011-02-05 20:37:31 +03:00
2011-02-08 20:29:25 +03:00
if ( queue ! = NULL ) {
list_for_each_entry_from ( queue , & notes - > src - > source , node ) {
2012-04-15 22:24:39 +04:00
if ( queue = = dl )
2011-02-08 20:29:25 +03:00
break ;
2013-03-05 09:53:21 +04:00
disasm_line__print ( queue , sym , start , evsel , len ,
2011-02-08 20:29:25 +03:00
0 , 0 , 1 , NULL ) ;
}
}
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
color = get_percent_color ( max_percent ) ;
2011-02-04 14:45:46 +03:00
/*
* Also color the filename and line if needed , with
* the same color than the percentage . Don ' t print it
* twice for close colored addr with the same filename : line
*/
if ( path ) {
if ( ! prev_line | | strcmp ( prev_line , path )
| | color ! = prev_color ) {
color_fprintf ( stdout , color , " %s " , path ) ;
prev_line = path ;
prev_color = color ;
}
}
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
for ( i = 0 ; i < nr_percent ; i + + ) {
percent = ppercents [ i ] ;
2015-06-19 22:10:43 +03:00
nr_samples = psamples [ i ] ;
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
color = get_percent_color ( percent ) ;
2015-06-19 22:10:43 +03:00
if ( symbol_conf . show_total_period )
color_fprintf ( stdout , color , " %7 " PRIu64 ,
nr_samples ) ;
else
color_fprintf ( stdout , color , " %7.2f " , percent ) ;
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
}
2011-02-04 14:45:46 +03:00
printf ( " : " ) ;
2012-04-02 19:59:01 +04:00
color_fprintf ( stdout , PERF_COLOR_MAGENTA , " % " PRIx64 " : " , addr ) ;
2012-04-15 22:24:39 +04:00
color_fprintf ( stdout , PERF_COLOR_BLUE , " %s \n " , dl - > line ) ;
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
if ( ppercents ! = & percent )
free ( ppercents ) ;
2015-06-19 22:10:43 +03:00
if ( psamples ! = & nr_samples )
free ( psamples ) ;
2011-02-08 20:01:39 +03:00
} else if ( max_lines & & printed > = max_lines )
2011-02-06 19:54:44 +03:00
return 1 ;
else {
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
int width = 8 ;
2011-02-08 20:29:25 +03:00
if ( queue )
return - 1 ;
2013-03-05 09:53:26 +04:00
if ( perf_evsel__is_group_event ( evsel ) )
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
width * = evsel - > nr_members ;
2012-04-15 22:24:39 +04:00
if ( ! * dl - > line )
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
printf ( " %*s: \n " , width , " " ) ;
2011-02-04 14:45:46 +03:00
else
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
printf ( " %*s: %s \n " , width , " " , dl - > line ) ;
2011-02-04 14:45:46 +03:00
}
2011-02-06 19:54:44 +03:00
return 0 ;
2011-02-04 14:45:46 +03:00
}
2013-03-05 09:53:22 +04:00
/*
* symbol__parse_objdump_line ( ) parses objdump output ( with - d - - no - show - raw )
* which looks like following
*
* 0000000000415500 < _init > :
* 415500 : sub $ 0x8 , % rsp
* 415504 : mov 0x2f5ad5 ( % rip ) , % rax # 70 afe0 < _DYNAMIC + 0x2f8 >
* 41550 b : test % rax , % rax
* 41550 e : je 415515 < _init + 0x15 >
* 415510 : callq 416e70 < __gmon_start__ @ plt >
* 415515 : add $ 0x8 , % rsp
* 415519 : retq
*
* it will be parsed and saved into struct disasm_line as
* < offset > < name > < ops . raw >
*
* The offset will be a relative offset from the start of the symbol and - 1
* means that it ' s not a disassembly line so should be treated differently .
* The ops . raw part will be parsed further according to type of the instruction .
*/
2011-02-08 18:27:39 +03:00
static int symbol__parse_objdump_line ( struct symbol * sym , struct map * map ,
2014-11-13 05:05:26 +03:00
FILE * file , size_t privsize ,
int * line_nr )
2011-02-04 14:45:46 +03:00
{
2011-02-08 18:27:39 +03:00
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 22:24:39 +04:00
struct disasm_line * dl ;
2012-04-02 19:59:01 +04:00
char * line = NULL , * parsed_line , * tmp , * tmp2 , * c ;
2011-02-04 14:45:46 +03:00
size_t line_len ;
s64 line_ip , offset = - 1 ;
2014-11-13 05:05:26 +03:00
regmatch_t match [ 2 ] ;
2011-02-04 14:45:46 +03:00
if ( getline ( & line , & line_len , file ) < 0 )
return - 1 ;
if ( ! line )
return - 1 ;
while ( line_len ! = 0 & & isspace ( line [ line_len - 1 ] ) )
line [ - - line_len ] = ' \0 ' ;
c = strchr ( line , ' \n ' ) ;
if ( c )
* c = 0 ;
line_ip = - 1 ;
2012-04-12 00:04:59 +04:00
parsed_line = line ;
2011-02-04 14:45:46 +03:00
2014-11-13 05:05:26 +03:00
/* /filename:linenr ? Save line number and ignore. */
if ( regexec ( & file_lineno , line , 2 , match , 0 ) = = 0 ) {
* line_nr = atoi ( line + match [ 1 ] . rm_so ) ;
return 0 ;
}
2011-02-04 14:45:46 +03:00
/*
* Strip leading spaces :
*/
tmp = line ;
while ( * tmp ) {
if ( * tmp ! = ' ' )
break ;
tmp + + ;
}
if ( * tmp ) {
/*
* Parse hexa addresses followed by ' : '
*/
line_ip = strtoull ( tmp , & tmp2 , 16 ) ;
if ( * tmp2 ! = ' : ' | | tmp = = tmp2 | | tmp2 [ 1 ] = = ' \0 ' )
line_ip = - 1 ;
}
if ( line_ip ! = - 1 ) {
u64 start = map__rip_2objdump ( map , sym - > start ) ,
end = map__rip_2objdump ( map , sym - > end ) ;
offset = line_ip - start ;
2014-10-15 00:19:44 +04:00
if ( ( u64 ) line_ip < start | | ( u64 ) line_ip > = end )
2011-02-04 14:45:46 +03:00
offset = - 1 ;
2012-04-02 19:59:01 +04:00
else
parsed_line = tmp2 + 1 ;
2012-04-12 00:04:59 +04:00
}
2011-02-04 14:45:46 +03:00
2014-11-13 05:05:26 +03:00
dl = disasm_line__new ( offset , parsed_line , privsize , * line_nr ) ;
2012-04-02 19:59:01 +04:00
free ( line ) ;
2014-11-13 05:05:26 +03:00
( * line_nr ) + + ;
2012-04-02 19:59:01 +04:00
2012-04-15 22:24:39 +04:00
if ( dl = = NULL )
2011-02-04 14:45:46 +03:00
return - 1 ;
2012-04-02 19:59:01 +04:00
2013-08-07 15:38:54 +04:00
if ( dl - > ops . target . offset = = UINT64_MAX )
dl - > ops . target . offset = dl - > ops . target . addr -
map__rip_2objdump ( map , sym - > start ) ;
2013-10-14 14:43:40 +04:00
/* kcore has no symbols, so add the call target name */
2013-08-07 15:38:57 +04:00
if ( dl - > ins & & ins__is_call ( dl - > ins ) & & ! dl - > ops . target . name ) {
2013-10-14 14:43:40 +04:00
struct addr_map_symbol target = {
. map = map ,
. addr = dl - > ops . target . addr ,
} ;
if ( ! map_groups__find_ams ( & target , NULL ) & &
target . sym - > start = = target . al_addr )
dl - > ops . target . name = strdup ( target . sym - > name ) ;
2013-08-07 15:38:57 +04:00
}
2012-04-15 22:24:39 +04:00
disasm__add ( & notes - > src - > source , dl ) ;
2011-02-04 14:45:46 +03:00
return 0 ;
}
2014-11-13 05:05:26 +03:00
static __attribute__ ( ( constructor ) ) void symbol__init_regexpr ( void )
{
regcomp ( & file_lineno , " ^/[^:]+:([0-9]+) " , REG_EXTENDED ) ;
}
2013-08-07 15:38:56 +04:00
static void delete_last_nop ( struct symbol * sym )
{
struct annotation * notes = symbol__annotation ( sym ) ;
struct list_head * list = & notes - > src - > source ;
struct disasm_line * dl ;
while ( ! list_empty ( list ) ) {
dl = list_entry ( list - > prev , struct disasm_line , node ) ;
if ( dl - > ins & & dl - > ins - > ops ) {
if ( dl - > ins - > ops ! = & nop_ops )
return ;
} else {
if ( ! strstr ( dl - > line , " nop " ) & &
! strstr ( dl - > line , " nopl " ) & &
! strstr ( dl - > line , " nopw " ) )
return ;
}
list_del ( & dl - > node ) ;
disasm_line__free ( dl ) ;
}
}
2011-02-08 18:27:39 +03:00
int symbol__annotate ( struct symbol * sym , struct map * map , size_t privsize )
2011-02-04 14:45:46 +03:00
{
struct dso * dso = map - > dso ;
char * filename = dso__build_id_filename ( dso , NULL , 0 ) ;
bool free_filename = true ;
char command [ PATH_MAX * 2 ] ;
FILE * file ;
int err = 0 ;
char symfs_filename [ PATH_MAX ] ;
2013-10-09 16:01:12 +04:00
struct kcore_extract kce ;
bool delete_extract = false ;
2014-11-13 05:05:26 +03:00
int lineno = 0 ;
2011-02-04 14:45:46 +03:00
2014-07-29 17:21:58 +04:00
if ( filename )
symbol__join_symfs ( symfs_filename , filename ) ;
2011-02-04 14:45:46 +03:00
if ( filename = = NULL ) {
if ( dso - > has_build_id ) {
pr_err ( " Can't annotate %s: not enough memory \n " ,
sym - > name ) ;
return - ENOMEM ;
}
goto fallback ;
2014-11-11 13:04:54 +03:00
} else if ( dso__is_kcore ( dso ) ) {
goto fallback ;
2011-02-04 14:45:46 +03:00
} else if ( readlink ( symfs_filename , command , sizeof ( command ) ) < 0 | |
strstr ( command , " [kernel.kallsyms] " ) | |
access ( symfs_filename , R_OK ) ) {
free ( filename ) ;
fallback :
/*
* If we don ' t have build - ids or the build - id file isn ' t in the
* cache , or is just a kallsyms file , well , lets hope that this
* DSO is the same as when ' perf record ' ran .
*/
2013-12-10 22:19:23 +04:00
filename = ( char * ) dso - > long_name ;
2014-07-29 17:21:58 +04:00
symbol__join_symfs ( symfs_filename , filename ) ;
2011-02-04 14:45:46 +03:00
free_filename = false ;
}
2013-08-07 15:38:54 +04:00
if ( dso - > symtab_type = = DSO_BINARY_TYPE__KALLSYMS & &
! dso__is_kcore ( dso ) ) {
2011-02-23 17:08:59 +03:00
char bf [ BUILD_ID_SIZE * 2 + 16 ] = " with build id " ;
char * build_id_msg = NULL ;
2011-02-04 14:45:46 +03:00
if ( dso - > annotate_warned )
goto out_free_filename ;
2011-02-23 17:08:59 +03:00
if ( dso - > has_build_id ) {
build_id__sprintf ( dso - > build_id ,
sizeof ( dso - > build_id ) , bf + 15 ) ;
build_id_msg = bf ;
}
2011-02-04 14:45:46 +03:00
err = - ENOENT ;
dso - > annotate_warned = 1 ;
2011-10-26 14:00:55 +04:00
pr_err ( " Can't annotate %s: \n \n "
" No vmlinux file%s \n was found in the path. \n \n "
" Please use: \n \n "
2013-02-07 13:02:12 +04:00
" perf buildid-cache -vu vmlinux \n \n "
2011-10-26 14:00:55 +04:00
" or: \n \n "
2012-02-23 12:46:24 +04:00
" --vmlinux vmlinux \n " ,
2011-02-23 17:08:59 +03:00
sym - > name , build_id_msg ? : " " ) ;
2011-02-04 14:45:46 +03:00
goto out_free_filename ;
}
pr_debug ( " %s: filename=%s, sym=%s, start=%# " PRIx64 " , end=%# " PRIx64 " \n " , __func__ ,
filename , sym - > name , map - > unmap_ip ( map , sym - > start ) ,
map - > unmap_ip ( map , sym - > end ) ) ;
pr_debug ( " annotating [%p] %30s : [%p] %30s \n " ,
dso , dso - > long_name , sym , sym - > name ) ;
2013-10-09 16:01:12 +04:00
if ( dso__is_kcore ( dso ) ) {
kce . kcore_filename = symfs_filename ;
kce . addr = map__rip_2objdump ( map , sym - > start ) ;
kce . offs = sym - > start ;
2014-10-15 00:19:44 +04:00
kce . len = sym - > end - sym - > start ;
2013-10-09 16:01:12 +04:00
if ( ! kcore_extract__create ( & kce ) ) {
delete_extract = true ;
strlcpy ( symfs_filename , kce . extract_filename ,
sizeof ( symfs_filename ) ) ;
if ( free_filename ) {
free ( filename ) ;
free_filename = false ;
}
filename = symfs_filename ;
}
2015-03-02 20:56:12 +03:00
} else if ( dso__needs_decompress ( dso ) ) {
char tmp [ PATH_MAX ] ;
struct kmod_path m ;
int fd ;
bool ret ;
if ( kmod_path__parse_ext ( & m , symfs_filename ) )
goto out_free_filename ;
snprintf ( tmp , PATH_MAX , " /tmp/perf-kmod-XXXXXX " ) ;
fd = mkstemp ( tmp ) ;
if ( fd < 0 ) {
free ( m . ext ) ;
goto out_free_filename ;
}
ret = decompress_to_file ( m . ext , symfs_filename , fd ) ;
free ( m . ext ) ;
close ( fd ) ;
if ( ! ret )
goto out_free_filename ;
strcpy ( symfs_filename , tmp ) ;
2013-10-09 16:01:12 +04:00
}
2011-02-04 14:45:46 +03:00
snprintf ( command , sizeof ( command ) ,
2012-09-04 14:32:30 +04:00
" %s %s%s --start-address=0x%016 " PRIx64
2011-05-17 19:32:07 +04:00
" --stop-address=0x%016 " PRIx64
2014-11-13 05:05:26 +03:00
" -l -d %s %s -C %s 2>/dev/null|grep -v %s|expand " ,
2012-09-04 14:32:30 +04:00
objdump_path ? objdump_path : " objdump " ,
2011-09-16 01:31:41 +04:00
disassembler_style ? " -M " : " " ,
disassembler_style ? disassembler_style : " " ,
2011-02-04 14:45:46 +03:00
map__rip_2objdump ( map , sym - > start ) ,
2014-10-15 00:19:44 +04:00
map__rip_2objdump ( map , sym - > end ) ,
2011-05-17 19:32:07 +04:00
symbol_conf . annotate_asm_raw ? " " : " --no-show-raw " ,
symbol_conf . annotate_src ? " -S " : " " ,
2011-02-04 14:45:46 +03:00
symfs_filename , filename ) ;
pr_debug ( " Executing: %s \n " , command ) ;
file = popen ( command , " r " ) ;
if ( ! file )
2015-03-02 20:56:12 +03:00
goto out_remove_tmp ;
2011-02-04 14:45:46 +03:00
while ( ! feof ( file ) )
2014-11-13 05:05:26 +03:00
if ( symbol__parse_objdump_line ( sym , map , file , privsize ,
& lineno ) < 0 )
2011-02-04 14:45:46 +03:00
break ;
2013-08-07 15:38:56 +04:00
/*
* kallsyms does not have symbol sizes so there may a nop at the end .
* Remove it .
*/
if ( dso__is_kcore ( dso ) )
delete_last_nop ( sym ) ;
2011-02-04 14:45:46 +03:00
pclose ( file ) ;
2015-03-02 20:56:12 +03:00
out_remove_tmp :
if ( dso__needs_decompress ( dso ) )
unlink ( symfs_filename ) ;
2011-02-04 14:45:46 +03:00
out_free_filename :
2013-10-09 16:01:12 +04:00
if ( delete_extract )
kcore_extract__delete ( & kce ) ;
2011-02-04 14:45:46 +03:00
if ( free_filename )
free ( filename ) ;
return err ;
}
static void insert_source_line ( struct rb_root * root , struct source_line * src_line )
{
struct source_line * iter ;
struct rb_node * * p = & root - > rb_node ;
struct rb_node * parent = NULL ;
2013-03-05 09:53:28 +04:00
int i , ret ;
2011-02-04 14:45:46 +03:00
while ( * p ! = NULL ) {
parent = * p ;
iter = rb_entry ( parent , struct source_line , node ) ;
2012-11-09 09:58:49 +04:00
ret = strcmp ( iter - > path , src_line - > path ) ;
if ( ret = = 0 ) {
2013-03-05 09:53:28 +04:00
for ( i = 0 ; i < src_line - > nr_pcnt ; i + + )
iter - > p [ i ] . percent_sum + = src_line - > p [ i ] . percent ;
2012-11-09 09:58:49 +04:00
return ;
}
if ( ret < 0 )
p = & ( * p ) - > rb_left ;
else
p = & ( * p ) - > rb_right ;
}
2013-03-05 09:53:28 +04:00
for ( i = 0 ; i < src_line - > nr_pcnt ; i + + )
src_line - > p [ i ] . percent_sum = src_line - > p [ i ] . percent ;
2012-11-09 09:58:49 +04:00
rb_link_node ( & src_line - > node , parent , p ) ;
rb_insert_color ( & src_line - > node , root ) ;
}
2013-03-05 09:53:28 +04:00
static int cmp_source_line ( struct source_line * a , struct source_line * b )
{
int i ;
for ( i = 0 ; i < a - > nr_pcnt ; i + + ) {
if ( a - > p [ i ] . percent_sum = = b - > p [ i ] . percent_sum )
continue ;
return a - > p [ i ] . percent_sum > b - > p [ i ] . percent_sum ;
}
return 0 ;
}
2012-11-09 09:58:49 +04:00
static void __resort_source_line ( struct rb_root * root , struct source_line * src_line )
{
struct source_line * iter ;
struct rb_node * * p = & root - > rb_node ;
struct rb_node * parent = NULL ;
while ( * p ! = NULL ) {
parent = * p ;
iter = rb_entry ( parent , struct source_line , node ) ;
2013-03-05 09:53:28 +04:00
if ( cmp_source_line ( src_line , iter ) )
2011-02-04 14:45:46 +03:00
p = & ( * p ) - > rb_left ;
else
p = & ( * p ) - > rb_right ;
}
rb_link_node ( & src_line - > node , parent , p ) ;
rb_insert_color ( & src_line - > node , root ) ;
}
2012-11-09 09:58:49 +04:00
static void resort_source_line ( struct rb_root * dest_root , struct rb_root * src_root )
{
struct source_line * src_line ;
struct rb_node * node ;
node = rb_first ( src_root ) ;
while ( node ) {
struct rb_node * next ;
src_line = rb_entry ( node , struct source_line , node ) ;
next = rb_next ( node ) ;
rb_erase ( node , src_root ) ;
__resort_source_line ( dest_root , src_line ) ;
node = next ;
}
}
2011-02-04 14:45:46 +03:00
static void symbol__free_source_line ( struct symbol * sym , int len )
{
struct annotation * notes = symbol__annotation ( sym ) ;
2011-02-08 18:27:39 +03:00
struct source_line * src_line = notes - > src - > lines ;
2013-03-05 09:53:28 +04:00
size_t sizeof_src_line ;
2011-02-04 14:45:46 +03:00
int i ;
2013-03-05 09:53:28 +04:00
sizeof_src_line = sizeof ( * src_line ) +
( sizeof ( src_line - > p ) * ( src_line - > nr_pcnt - 1 ) ) ;
2011-02-04 14:45:46 +03:00
2013-03-05 09:53:28 +04:00
for ( i = 0 ; i < len ; i + + ) {
2013-09-11 09:09:28 +04:00
free_srcline ( src_line - > path ) ;
2013-03-05 09:53:28 +04:00
src_line = ( void * ) src_line + sizeof_src_line ;
}
2013-12-27 00:41:15 +04:00
zfree ( & notes - > src - > lines ) ;
2011-02-04 14:45:46 +03:00
}
/* Get the filename:line for the colored entries */
static int symbol__get_source_line ( struct symbol * sym , struct map * map ,
2013-03-05 09:53:21 +04:00
struct perf_evsel * evsel ,
2013-09-11 09:09:30 +04:00
struct rb_root * root , int len )
2011-02-04 14:45:46 +03:00
{
u64 start ;
2013-03-05 09:53:28 +04:00
int i , k ;
int evidx = evsel - > idx ;
2011-02-04 14:45:46 +03:00
struct source_line * src_line ;
struct annotation * notes = symbol__annotation ( sym ) ;
2013-03-05 09:53:28 +04:00
struct sym_hist * h = annotation__histogram ( notes , evidx ) ;
2012-11-09 09:58:49 +04:00
struct rb_root tmp_root = RB_ROOT ;
2013-03-05 09:53:28 +04:00
int nr_pcnt = 1 ;
u64 h_sum = h - > sum ;
size_t sizeof_src_line = sizeof ( struct source_line ) ;
if ( perf_evsel__is_group_event ( evsel ) ) {
for ( i = 1 ; i < evsel - > nr_members ; i + + ) {
h = annotation__histogram ( notes , evidx + i ) ;
h_sum + = h - > sum ;
}
nr_pcnt = evsel - > nr_members ;
sizeof_src_line + = ( nr_pcnt - 1 ) * sizeof ( src_line - > p ) ;
}
2011-02-04 14:45:46 +03:00
2013-03-05 09:53:28 +04:00
if ( ! h_sum )
2011-02-04 14:45:46 +03:00
return 0 ;
2013-03-05 09:53:28 +04:00
src_line = notes - > src - > lines = calloc ( len , sizeof_src_line ) ;
2011-02-08 18:27:39 +03:00
if ( ! notes - > src - > lines )
2011-02-04 14:45:46 +03:00
return - 1 ;
2012-03-26 00:28:12 +04:00
start = map__rip_2objdump ( map , sym - > start ) ;
2011-02-04 14:45:46 +03:00
for ( i = 0 ; i < len ; i + + ) {
u64 offset ;
2013-03-05 09:53:28 +04:00
double percent_max = 0.0 ;
2011-02-04 14:45:46 +03:00
2013-03-05 09:53:28 +04:00
src_line - > nr_pcnt = nr_pcnt ;
for ( k = 0 ; k < nr_pcnt ; k + + ) {
h = annotation__histogram ( notes , evidx + k ) ;
src_line - > p [ k ] . percent = 100.0 * h - > addr [ i ] / h - > sum ;
if ( src_line - > p [ k ] . percent > percent_max )
percent_max = src_line - > p [ k ] . percent ;
}
if ( percent_max < = 0.5 )
goto next ;
2011-02-04 14:45:46 +03:00
offset = start + i ;
2014-11-13 05:05:27 +03:00
src_line - > path = get_srcline ( map - > dso , offset , NULL , false ) ;
2013-03-05 09:53:28 +04:00
insert_source_line ( & tmp_root , src_line ) ;
2011-02-04 14:45:46 +03:00
2013-03-05 09:53:28 +04:00
next :
src_line = ( void * ) src_line + sizeof_src_line ;
2011-02-04 14:45:46 +03:00
}
2012-11-09 09:58:49 +04:00
resort_source_line ( root , & tmp_root ) ;
2011-02-04 14:45:46 +03:00
return 0 ;
}
static void print_summary ( struct rb_root * root , const char * filename )
{
struct source_line * src_line ;
struct rb_node * node ;
printf ( " \n Sorted summary for file %s \n " , filename ) ;
printf ( " ---------------------------------------------- \n \n " ) ;
if ( RB_EMPTY_ROOT ( root ) ) {
printf ( " Nothing higher than %1.1f%% \n " , MIN_GREEN ) ;
return ;
}
node = rb_first ( root ) ;
while ( node ) {
2013-03-05 09:53:28 +04:00
double percent , percent_max = 0.0 ;
2011-02-04 14:45:46 +03:00
const char * color ;
char * path ;
2013-03-05 09:53:28 +04:00
int i ;
2011-02-04 14:45:46 +03:00
src_line = rb_entry ( node , struct source_line , node ) ;
2013-03-05 09:53:28 +04:00
for ( i = 0 ; i < src_line - > nr_pcnt ; i + + ) {
percent = src_line - > p [ i ] . percent_sum ;
color = get_percent_color ( percent ) ;
color_fprintf ( stdout , color , " %7.2f " , percent ) ;
if ( percent > percent_max )
percent_max = percent ;
}
2011-02-04 14:45:46 +03:00
path = src_line - > path ;
2013-03-05 09:53:28 +04:00
color = get_percent_color ( percent_max ) ;
2013-09-11 09:09:28 +04:00
color_fprintf ( stdout , color , " %s \n " , path ) ;
2011-02-04 14:45:46 +03:00
node = rb_next ( node ) ;
}
}
2013-03-05 09:53:21 +04:00
static void symbol__annotate_hits ( struct symbol * sym , struct perf_evsel * evsel )
2011-02-04 14:45:46 +03:00
{
struct annotation * notes = symbol__annotation ( sym ) ;
2013-03-05 09:53:21 +04:00
struct sym_hist * h = annotation__histogram ( notes , evsel - > idx ) ;
2012-04-19 17:57:06 +04:00
u64 len = symbol__size ( sym ) , offset ;
2011-02-04 14:45:46 +03:00
for ( offset = 0 ; offset < len ; + + offset )
if ( h - > addr [ offset ] ! = 0 )
printf ( " %* " PRIx64 " : % " PRIu64 " \n " , BITS_PER_LONG / 2 ,
sym - > start + offset , h - > addr [ offset ] ) ;
printf ( " %*s: % " PRIu64 " \n " , BITS_PER_LONG / 2 , " h->sum " , h - > sum ) ;
}
2013-03-05 09:53:21 +04:00
int symbol__annotate_printf ( struct symbol * sym , struct map * map ,
struct perf_evsel * evsel , bool full_paths ,
int min_pcnt , int max_lines , int context )
2011-02-04 14:45:46 +03:00
{
struct dso * dso = map - > dso ;
2012-09-08 19:06:50 +04:00
char * filename ;
const char * d_filename ;
2014-03-18 18:50:21 +04:00
const char * evsel_name = perf_evsel__name ( evsel ) ;
2011-02-08 18:27:39 +03:00
struct annotation * notes = symbol__annotation ( sym ) ;
2012-04-15 22:24:39 +04:00
struct disasm_line * pos , * queue = NULL ;
2012-04-02 19:59:01 +04:00
u64 start = map__rip_2objdump ( map , sym - > start ) ;
2011-02-08 20:29:25 +03:00
int printed = 2 , queue_len = 0 ;
2011-02-06 19:54:44 +03:00
int more = 0 ;
2011-02-04 14:45:46 +03:00
u64 len ;
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
int width = 8 ;
2014-03-18 18:50:21 +04:00
int namelen , evsel_name_len , graph_dotted_len ;
2011-02-04 14:45:46 +03:00
2012-09-08 19:06:50 +04:00
filename = strdup ( dso - > long_name ) ;
if ( ! filename )
return - ENOMEM ;
2011-02-04 14:45:46 +03:00
if ( full_paths )
d_filename = filename ;
else
d_filename = basename ( filename ) ;
2012-04-19 17:57:06 +04:00
len = symbol__size ( sym ) ;
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
namelen = strlen ( d_filename ) ;
2014-03-18 18:50:21 +04:00
evsel_name_len = strlen ( evsel_name ) ;
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
2013-03-05 09:53:26 +04:00
if ( perf_evsel__is_group_event ( evsel ) )
perf annotate: Add basic support to event group view
Add --group option to enable event grouping. When enabled, all the
group members information will be shown with the leader so skip
non-leader events.
It only supports --stdio output currently. Later patches will extend
additional features.
$ perf annotate --group --stdio
...
Percent | Source code & Disassembly of libpthread-2.15.so
--------------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 000000387dc0aa50 <__pthread_mutex_unlock_usercnt>:
8.08 2.40 5.29 : 387dc0aa50: mov %rdi,%rdx
0.00 0.00 0.00 : 387dc0aa53: mov 0x10(%rdi),%edi
0.00 0.00 0.00 : 387dc0aa56: mov %edi,%eax
0.00 0.80 0.00 : 387dc0aa58: and $0x7f,%eax
3.03 2.40 3.53 : 387dc0aa5b: test $0x7c,%dil
0.00 0.00 0.00 : 387dc0aa5f: jne 387dc0aaa9 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa61: test %eax,%eax
0.00 0.00 0.00 : 387dc0aa63: jne 387dc0aa85 <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa65: and $0x80,%edi
0.00 0.00 0.00 : 387dc0aa6b: test %esi,%esi
3.03 5.60 7.06 : 387dc0aa6d: movl $0x0,0x8(%rdx)
0.00 0.00 0.59 : 387dc0aa74: je 387dc0aa7a <__pthread_mutex_unlock_use
0.00 0.00 0.00 : 387dc0aa76: subl $0x1,0xc(%rdx)
2.02 5.60 1.18 : 387dc0aa7a: mov %edi,%esi
0.00 0.00 0.00 : 387dc0aa7c: lock decl (%rdx)
83.84 83.20 82.35 : 387dc0aa7f: jne 387dc0aada <_L_unlock_586>
0.00 0.00 0.00 : 387dc0aa81: nop
0.00 0.00 0.00 : 387dc0aa82: xor %eax,%eax
0.00 0.00 0.00 : 387dc0aa84: retq
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1362462812-30885-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-03-05 09:53:25 +04:00
width * = evsel - > nr_members ;
2011-02-04 14:45:46 +03:00
2014-03-18 18:50:21 +04:00
printf ( " %-*.*s| Source code & Disassembly of %s for %s \n " ,
width , width , " Percent " , d_filename , evsel_name ) ;
graph_dotted_len = width + namelen + evsel_name_len ;
printf ( " -%-*.*s----------------------------------------- \n " ,
graph_dotted_len , graph_dotted_len , graph_dotted_line ) ;
2011-02-04 14:45:46 +03:00
if ( verbose )
2013-03-05 09:53:21 +04:00
symbol__annotate_hits ( sym , evsel ) ;
2011-02-04 14:45:46 +03:00
2011-02-08 18:27:39 +03:00
list_for_each_entry ( pos , & notes - > src - > source , node ) {
2011-02-08 20:29:25 +03:00
if ( context & & queue = = NULL ) {
queue = pos ;
queue_len = 0 ;
}
2013-03-05 09:53:21 +04:00
switch ( disasm_line__print ( pos , sym , start , evsel , len ,
2012-04-02 19:59:01 +04:00
min_pcnt , printed , max_lines ,
queue ) ) {
2011-02-06 19:54:44 +03:00
case 0 :
+ + printed ;
2011-02-08 20:29:25 +03:00
if ( context ) {
printed + = queue_len ;
queue = NULL ;
queue_len = 0 ;
}
2011-02-06 19:54:44 +03:00
break ;
case 1 :
/* filtered by max_lines */
+ + more ;
2011-02-05 20:37:31 +03:00
break ;
2011-02-06 19:54:44 +03:00
case - 1 :
default :
2011-02-08 20:29:25 +03:00
/*
* Filtered by min_pcnt or non IP lines when
* context ! = 0
*/
if ( ! context )
break ;
if ( queue_len = = context )
queue = list_entry ( queue - > node . next , typeof ( * queue ) , node ) ;
else
+ + queue_len ;
2011-02-06 19:54:44 +03:00
break ;
}
}
2012-09-08 19:06:50 +04:00
free ( filename ) ;
2011-02-06 19:54:44 +03:00
return more ;
}
2011-02-05 23:51:38 +03:00
2011-02-06 19:54:44 +03:00
void symbol__annotate_zero_histogram ( struct symbol * sym , int evidx )
{
struct annotation * notes = symbol__annotation ( sym ) ;
struct sym_hist * h = annotation__histogram ( notes , evidx ) ;
2011-02-08 18:27:39 +03:00
memset ( h , 0 , notes - > src - > sizeof_sym_hist ) ;
2011-02-06 19:54:44 +03:00
}
2011-02-08 18:27:39 +03:00
void symbol__annotate_decay_histogram ( struct symbol * sym , int evidx )
2011-02-06 19:54:44 +03:00
{
struct annotation * notes = symbol__annotation ( sym ) ;
struct sym_hist * h = annotation__histogram ( notes , evidx ) ;
2012-04-19 17:57:06 +04:00
int len = symbol__size ( sym ) , offset ;
2011-02-06 19:54:44 +03:00
h - > sum = 0 ;
2012-04-05 23:15:59 +04:00
for ( offset = 0 ; offset < len ; + + offset ) {
h - > addr [ offset ] = h - > addr [ offset ] * 7 / 8 ;
h - > sum + = h - > addr [ offset ] ;
2011-02-05 23:51:38 +03:00
}
}
2012-04-15 22:24:39 +04:00
void disasm__purge ( struct list_head * head )
2011-02-05 23:51:38 +03:00
{
2012-04-15 22:24:39 +04:00
struct disasm_line * pos , * n ;
2011-02-05 23:51:38 +03:00
list_for_each_entry_safe ( pos , n , head , node ) {
list_del ( & pos - > node ) ;
2012-04-15 22:24:39 +04:00
disasm_line__free ( pos ) ;
2011-02-05 23:51:38 +03:00
}
}
2012-04-15 22:52:18 +04:00
static size_t disasm_line__fprintf ( struct disasm_line * dl , FILE * fp )
{
size_t printed ;
if ( dl - > offset = = - 1 )
return fprintf ( fp , " %s \n " , dl - > line ) ;
printed = fprintf ( fp , " %# " PRIx64 " %s " , dl - > offset , dl - > name ) ;
2012-04-20 21:38:46 +04:00
if ( dl - > ops . raw [ 0 ] ! = ' \0 ' ) {
2012-04-15 22:52:18 +04:00
printed + = fprintf ( fp , " %.*s %s \n " , 6 - ( int ) printed , " " ,
2012-04-20 21:38:46 +04:00
dl - > ops . raw ) ;
2012-04-15 22:52:18 +04:00
}
return printed + fprintf ( fp , " \n " ) ;
}
size_t disasm__fprintf ( struct list_head * head , FILE * fp )
{
struct disasm_line * pos ;
size_t printed = 0 ;
list_for_each_entry ( pos , head , node )
printed + = disasm_line__fprintf ( pos , fp ) ;
return printed ;
}
2013-03-05 09:53:21 +04:00
int symbol__tty_annotate ( struct symbol * sym , struct map * map ,
struct perf_evsel * evsel , bool print_lines ,
bool full_paths , int min_pcnt , int max_lines )
2011-02-05 23:51:38 +03:00
{
struct dso * dso = map - > dso ;
struct rb_root source_line = RB_ROOT ;
u64 len ;
2011-02-08 18:27:39 +03:00
if ( symbol__annotate ( sym , map , 0 ) < 0 )
2011-02-05 23:51:38 +03:00
return - 1 ;
2012-04-19 17:57:06 +04:00
len = symbol__size ( sym ) ;
2011-02-05 23:51:38 +03:00
if ( print_lines ) {
2013-09-11 09:09:30 +04:00
symbol__get_source_line ( sym , map , evsel , & source_line , len ) ;
print_summary ( & source_line , dso - > long_name ) ;
2011-02-04 14:45:46 +03:00
}
2013-03-05 09:53:21 +04:00
symbol__annotate_printf ( sym , map , evsel , full_paths ,
2011-02-08 20:29:25 +03:00
min_pcnt , max_lines , 0 ) ;
2011-02-04 14:45:46 +03:00
if ( print_lines )
symbol__free_source_line ( sym , len ) ;
2012-04-15 22:24:39 +04:00
disasm__purge ( & symbol__annotation ( sym ) - > src - > source ) ;
2011-02-05 23:51:38 +03:00
2011-02-04 14:45:46 +03:00
return 0 ;
}
2013-12-19 00:10:15 +04:00
int hist_entry__annotate ( struct hist_entry * he , size_t privsize )
{
return symbol__annotate ( he - > ms . sym , he - > ms . map , privsize ) ;
}
2014-02-20 05:32:53 +04:00
bool ui__has_annotation ( void )
{
return use_browser = = 1 & & sort__has_sym ;
}