All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: "Martin Liška" <mliska@suse.cz>
Cc: linux-kernel@vger.kernel.org, Jiri Slaby <jslaby@suse.cz>,
	linux-perf-users@vger.kernel.org
Subject: Re: [PATCH] Fix jump parsing for C++ code.
Date: Thu, 11 Feb 2021 14:16:06 -0300	[thread overview]
Message-ID: <20210211171606.GG1131885@kernel.org> (raw)
In-Reply-To: <13e1a405-edf9-e4c2-4327-a9b454353730@suse.cz>

Em Thu, Feb 11, 2021 at 01:37:55PM +0100, Martin Liška escreveu:
> Considering the following testcase:
> 
> int
> foo(int a, int b)
> {
>   for (unsigned i = 0; i < 1000000000; i++)
>     a += b;
>   return a;
> }
> 
> int main()
> {
>   foo (3, 4);
>   return 0;
> }
> 
> perf annotate displays:
>  86.52 │40055e: → ja   40056c <foo(int, int)+0x26>
>  13.37 │400560:   mov  -0x18(%rbp),%eax
>        │400563:   add  %eax,-0x14(%rbp)
>        │400566:   addl $0x1,-0x4(%rbp)
>   0.11 │40056a: → jmp  400557 <foo(int, int)+0x11>
>        │40056c:   mov  -0x14(%rbp),%eax
>        │40056f:   pop  %rbp
> 
> and the 'ja 40056c' does not link to the location in the function.
> It's caused by fact that comma is wrongly parsed, it's part
> of function signature.
> 
> With my patch I see:
> 
>  86.52 │   ┌──ja   26
>  13.37 │   │  mov  -0x18(%rbp),%eax
>        │   │  add  %eax,-0x14(%rbp)
>        │   │  addl $0x1,-0x4(%rbp)
>   0.11 │   │↑ jmp  11
>        │26:└─→mov  -0x14(%rbp),%eax
> 
> and 'o' output prints:
>  86.52 │4005┌── ↓ ja   40056c <foo(int, int)+0x26>
>  13.37 │4005│0:   mov  -0x18(%rbp),%eax
>        │4005│3:   add  %eax,-0x14(%rbp)
>        │4005│6:   addl $0x1,-0x4(%rbp)
>   0.11 │4005│a: ↑ jmp  400557 <foo(int, int)+0x11>
>        │4005└─→   mov  -0x14(%rbp),%eax

So, before your patch, this is what I am seeing:

  [acme@five c]$ cat cpp_args_annotate.c
  int
  foo(int a, int b)
  {
     for (unsigned i = 0; i < 1000000000; i++)
       a += b;
     return a;
  }
  
  int main()
  {
     foo (3, 4);
     return 0;
  }
  [acme@five c]$ gcc --version |& head -1
  gcc (GCC) 10.2.1 20201125 (Red Hat 10.2.1-9)
  [acme@five c]$ gcc -g cpp_args_annotate.c -o cpp_args_annotate
  [acme@five c]$ perf record ./cpp_args_annotate
  [ perf record: Woken up 2 times to write data ]
  [ perf record: Captured and wrote 0.275 MB perf.data (7188 samples) ]
  [acme@five c]$ perf annotate --stdio2 foo
  Samples: 7K of event 'cycles:u', 4000 Hz, Event count (approx.): 7468429289, [percent: local period]
  foo() /home/acme/c/cpp_args_annotate
  Percent
              0000000000401106 <foo>:
              foo():
              int
              foo(int a, int b)
              {
                push %rbp
                mov  %rsp,%rbp
                mov  %edi,-0x14(%rbp)
                mov  %esi,-0x18(%rbp)
              for (unsigned i = 0; i < 1000000000; i++)
                movl $0x0,-0x4(%rbp)
              ↓ jmp  1d
              a += b;
   13.45  13:   mov  -0x18(%rbp),%eax
                add  %eax,-0x14(%rbp)
              for (unsigned i = 0; i < 1000000000; i++)
                addl $0x1,-0x4(%rbp)
    0.09  1d:   cmpl $0x3b9ac9ff,-0x4(%rbp)
   86.46      ↑ jbe  13
              return a;
                mov  -0x14(%rbp),%eax
              }
                pop  %rbp
              ← retq
  [acme@five c]$


Ok, now I see:

[acme@five c]$ g++ -g cpp_args_annotate.c -o cpp_args_annotate
[acme@five c]$ perf record ./cpp_args_annotate
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.268 MB perf.data (6976 samples) ]
[acme@five c]$ perf annotate --stdio2 foo
Samples: 6K of event 'cycles:u', 4000 Hz, Event count (approx.): 7380681761, [percent: local period]
foo() /home/acme/c/cpp_args_annotate
Percent
            0000000000401106 <foo(int, int)>:
            foo(int, int):
            int
            foo(int a, int b)
            {
              push %rbp
              mov  %rsp,%rbp
              mov  %edi,-0x14(%rbp)
              mov  %esi,-0x18(%rbp)
            for (unsigned i = 0; i < 1000000000; i++)
              movl $0x0,-0x4(%rbp)
              cmpl $0x3b9ac9ff,-0x4(%rbp)
 86.53      → ja   40112c <foo(int, int)+0x26>
            a += b;
 13.32        mov  -0x18(%rbp),%eax
  0.00        add  %eax,-0x14(%rbp)
            for (unsigned i = 0; i < 1000000000; i++)
              addl $0x1,-0x4(%rbp)
  0.15      → jmp  401117 <foo(int, int)+0x11>
            return a;
              mov  -0x14(%rbp),%eax
            }
              pop  %rbp
            ← retq
[acme@five c]$
  
Ok, continuing the test...

- Arnaldo

      parent reply	other threads:[~2021-02-11 17:19 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-11 12:37 [PATCH] Fix jump parsing for C++ code Martin Liška
2021-02-11 12:59 ` Arnaldo Carvalho de Melo
2021-02-11 17:16 ` Arnaldo Carvalho de Melo [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210211171606.GG1131885@kernel.org \
    --to=acme@kernel.org \
    --cc=jslaby@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mliska@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.