perf_counter tools: Add 'perf annotate' feature
authorIngo Molnar <mingo@elte.hu>
Sat, 6 Jun 2009 13:48:52 +0000 (15:48 +0200)
committerIngo Molnar <mingo@elte.hu>
Sat, 6 Jun 2009 16:58:31 +0000 (18:58 +0200)
commit0b73da3f40128eab6ca2a07508f424029a1edaeb
tree06c6c2f92bb5dc0b8ae2b03e0fa7320171d6b492
parent8035e4288078cb806e7dd6bafe4d3e54d44cab3f
perf_counter tools: Add 'perf annotate' feature

Add new perf sub-command to display annotated source code:

 $ perf annotate decode_tree_entry

------------------------------------------------
 Percent | Source code & Disassembly of /home/mingo/git/git
------------------------------------------------
         :
         : /home/mingo/git/git:     file format elf64-x86-64
         :
         :
         : Disassembly of section .text:
         :
         : 00000000004a0da0 <decode_tree_entry>:
         : *modep = mode;
         : return str;
         : }
         :
         : static void decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned long size)
         : {
    3.82 :   4a0da0: 41 54                 push   %r12
         : const char *path;
         : unsigned int mode, len;
         :
         : if (size < 24 || buf[size - 21])
    0.17 :   4a0da2: 48 83 fa 17           cmp    $0x17,%rdx
         : *modep = mode;
         : return str;
         : }
         :
         : static void decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned long size)
         : {
    0.00 :   4a0da6: 49 89 fc              mov    %rdi,%r12
    0.00 :   4a0da9: 55                    push   %rbp
    3.37 :   4a0daa: 53                    push   %rbx
         : const char *path;
         : unsigned int mode, len;
         :
         : if (size < 24 || buf[size - 21])
    0.08 :   4a0dab: 76 73                 jbe    4a0e20 <decode_tree_entry+0x80>
    0.00 :   4a0dad: 80 7c 16 eb 00        cmpb   $0x0,-0x15(%rsi,%rdx,1)
    3.48 :   4a0db2: 75 6c                 jne    4a0e20 <decode_tree_entry+0x80>
         : static const char *get_mode(const char *str, unsigned int *modep)
         : {
         : unsigned char c;
         : unsigned int mode = 0;
         :
         : if (*str == ' ')
    1.94 :   4a0db4: 0f b6 06              movzbl (%rsi),%eax
    0.39 :   4a0db7: 3c 20                 cmp    $0x20,%al
    0.00 :   4a0db9: 74 65                 je     4a0e20 <decode_tree_entry+0x80>
         : return NULL;
         :
         : while ((c = *str++) != ' ') {
    0.06 :   4a0dbb: 89 c2                 mov    %eax,%edx
         : if (c < '0' || c > '7')
    1.99 :   4a0dbd: 31 ed                 xor    %ebp,%ebp
         : unsigned int mode = 0;
         :
         : if (*str == ' ')
         : return NULL;
         :
         : while ((c = *str++) != ' ') {
    1.74 :   4a0dbf: 48 8d 5e 01           lea    0x1(%rsi),%rbx
         : if (c < '0' || c > '7')
    0.00 :   4a0dc3: 8d 42 d0              lea    -0x30(%rdx),%eax
    0.17 :   4a0dc6: 3c 07                 cmp    $0x7,%al
    0.00 :   4a0dc8: 76 0d                 jbe    4a0dd7 <decode_tree_entry+0x37>
    0.00 :   4a0dca: eb 54                 jmp    4a0e20 <decode_tree_entry+0x80>
    0.00 :   4a0dcc: 0f 1f 40 00           nopl   0x0(%rax)
   16.57 :   4a0dd0: 8d 42 d0              lea    -0x30(%rdx),%eax
    0.14 :   4a0dd3: 3c 07                 cmp    $0x7,%al
    0.00 :   4a0dd5: 77 49                 ja     4a0e20 <decode_tree_entry+0x80>
         : return NULL;
         : mode = (mode << 3) + (c - '0');
    3.12 :   4a0dd7: 0f b6 c2              movzbl %dl,%eax
         : unsigned int mode = 0;
         :
         : if (*str == ' ')
         : return NULL;
         :
         : while ((c = *str++) != ' ') {
    0.00 :   4a0dda: 0f b6 13              movzbl (%rbx),%edx
   16.74 :   4a0ddd: 48 83 c3 01           add    $0x1,%rbx
         : if (c < '0' || c > '7')
         : return NULL;
         : mode = (mode << 3) + (c - '0');

The first column is the percentage of samples that arrived on that
particular line - relative to the total cost of the function.

Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Documentation/perf_counter/Documentation/perf-annotate.txt
Documentation/perf_counter/builtin-annotate.c
Documentation/perf_counter/util/symbol.c
Documentation/perf_counter/util/symbol.h