public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Nelson Chu <nelson@rivosinc.com>
To: Joseph Faulls <Joseph.Faulls@imgtec.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>,
	"binutils@sourceware.org" <binutils@sourceware.org>
Subject: Re: [PATCH] RISC-V: Search for mapping symbols from the last one found
Date: Wed, 15 May 2024 07:14:54 +0800	[thread overview]
Message-ID: <CAPpQWtA1Tbc+7u4Ns3GZL_oUMzuyB84Oef7d3nKrbgx5fh2jAg@mail.gmail.com> (raw)
In-Reply-To: <LO4P265MB5914EDB2242E0EE887FC802580E32@LO4P265MB5914.GBRP265.PROD.OUTLOOK.COM>

[-- Attachment #1: Type: text/plain, Size: 6419 bytes --]

Thanks, committed ;)

Nelson

On Tue, May 14, 2024 at 5:10 PM Joseph Faulls <Joseph.Faulls@imgtec.com>
wrote:

> Thanks, Nelson. Updated the patch:
>
> With previous behaviour, multiple mapping symbols within the same
> function would result in all the mapping symbols being searched.
> This could slow down disassembly dramatically.
>
> Multiple mapping symbols within a function can be a result of encoding
> instructions as data, like sometimes seen in random instruction
> generators.
>
> opcodes/ChangeLog:
>
>         * riscv-dis.c (riscv_search_mapping_symbol): Use last mapping
>           symbol if it exists.
> ---
>  opcodes/riscv-dis.c | 12 ++++--------
>  1 file changed, 4 insertions(+), 8 deletions(-)
>
> diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c
> index 684098d386a..e6596c47423 100644
> --- a/opcodes/riscv-dis.c
> +++ b/opcodes/riscv-dis.c
> @@ -1076,11 +1076,9 @@ riscv_search_mapping_symbol (bfd_vma memaddr,
>    from_last_map_symbol = (last_map_symbol >= 0
>                           && info->stop_offset == last_stop_offset);
>
> -  /* Start scanning at the start of the function, or wherever
> -     we finished last time.  */
> -  n = info->symtab_pos + 1;
> -  if (from_last_map_symbol && n >= last_map_symbol)
> -    n = last_map_symbol;
> +  /* Start scanning from wherever we finished last time, or the start
> +     of the function.  */
> +  n = from_last_map_symbol ? last_map_symbol : info->symtab_pos + 1;
>
>    /* Find the suitable mapping symbol to dump.  */
>    for (; n < info->symtab_size; n++)
> @@ -1105,9 +1103,7 @@ riscv_search_mapping_symbol (bfd_vma memaddr,
>       can pick up a text mapping symbol of a preceeding section.  */
>    if (!found)
>      {
> -      n = info->symtab_pos;
> -      if (from_last_map_symbol && n >= last_map_symbol)
> -       n = last_map_symbol;
> +      n = from_last_map_symbol ? last_map_symbol : info->symtab_pos;
>
>        for (; n >= 0; n--)
>         {
> --
> 2.34.1
>
> ------------------------------
> *From:* Nelson Chu <nelson@rivosinc.com>
> *Sent:* Tuesday, May 14, 2024 1:34 AM
> *To:* Palmer Dabbelt <palmer@dabbelt.com>
> *Cc:* Joseph Faulls <Joseph.Faulls@imgtec.com>; binutils@sourceware.org <
> binutils@sourceware.org>
> *Subject:* Re: [PATCH] RISC-V: Search for mapping symbols from the last
> one found
>
>
> There is a similar (n >= last_map_symbol) check when we need to backtrace
> searching, https://github.com/bminor/binutils-gdb/blob/master/opcodes/riscv-dis.c#L1109
> [github.com]
> <https://urldefense.com/v3/__https://github.com/bminor/binutils-gdb/blob/master/opcodes/riscv-dis.c*L1109__;Iw!!KCwjcDI!zCUUWandbHQVnj1F9uYJb9d3R0tZc6qdNw08xyHSliol7nDMdHOVDm7pp_3zEykv3p4RP46uhAiFnpVQcFWu$>,
> should we also need to fix this?
>
> diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c
>
> index 684098d386a..e6596c47423 100644
>
> --- a/opcodes/riscv-dis.c
>
> +++ b/opcodes/riscv-dis.c
>
> @@ -1076,11 +1076,9 @@ riscv_search_mapping_symbol (bfd_vma memaddr,
>
>    from_last_map_symbol = (last_map_symbol >= 0
>                           && info->stop_offset == last_stop_offset);
>
> -  /* Start scanning at the start of the function, or wherever
>
> -     we finished last time.  */
>
> -  n = info->symtab_pos + 1;
>
> -  if (from_last_map_symbol && n >= last_map_symbol)
>
> -    n = last_map_symbol;
>
> +  /* Start scanning from wherever we finished last time, or the start
>
> +     of the function.  */
>
> +  n = from_last_map_symbol ? last_map_symbol : info->symtab_pos + 1;
>
>
>    /* Find the suitable mapping symbol to dump.  */
>    for (; n < info->symtab_size; n++)
> @@ -1105,9 +1103,7 @@ riscv_search_mapping_symbol (bfd_vma memaddr,
>
>       can pick up a text mapping symbol of a preceeding section.  */
>    if (!found)
>      {
> -      n = info->symtab_pos;
>
> -      if (from_last_map_symbol && n >= last_map_symbol)
>
> -       n = last_map_symbol;
>
> +      n = from_last_map_symbol ? last_map_symbol : info->symtab_pos;
>
>
>        for (; n >= 0; n--)
>
> On Mon, May 6, 2024 at 11:12 PM Palmer Dabbelt <palmer@dabbelt.com> wrote:
>
> On Fri, 03 May 2024 05:56:47 PDT (-0700), Joseph.Faulls@imgtec.com wrote:
> > Ping. I know it's a small patch, but it sped up disassembly of my use
> case from 5 minutes to 5 seconds.
> > ________________________________
> > From: Joseph Faulls
> > Sent: Thursday, April 18, 2024 11:48 AM
> > To: binutils@sourceware.org <binutils@sourceware.org>
> > Cc: nelson@rivosinc.com <nelson@rivosinc.com>
> > Subject: [PATCH] RISC-V: Search for mapping symbols from the last one
> found
> >
> > With previous behaviour, multiple mapping symbols within the same
> > function would result in all the mapping symbols being searched.
> > This could slow down disassembly dramatically.
> >
> > Multiple mapping symbols within a function can be a result of encoding
> > instructions as data, like sometimes seen in random instruction
> > generators.
> >
> > opcodes/ChangeLog:
> >
> >         * riscv-dis.c (riscv_search_mapping_symbol): Use last mapping
> >           symbol if it exists.
> >
> > Note for reviewers:
> > I don't see why the previous check 'n >= last_map_symbol exists'. Why do
> we force starting from the start of the function if the last mapping symbol
> was found after it? If I'm missing something, please let me know!
>
> Sorry for being slow here.  Nelson and I were talking a bit right before
> the weekend and it looks like this was just a bug, but it's very similar
> to what the Arm code does.
>
>
> I guess that is because we ported the code from aarch64 at the beginning,
> and then kept their code to fix the stuff probably this one, https://github.com/bminor/binutils-gdb/commit/51457761649bab6868343b3da2258d73a62901f7
> [github.com]
> <https://urldefense.com/v3/__https://github.com/bminor/binutils-gdb/commit/51457761649bab6868343b3da2258d73a62901f7__;!!KCwjcDI!zCUUWandbHQVnj1F9uYJb9d3R0tZc6qdNw08xyHSliol7nDMdHOVDm7pp_3zEykv3p4RP46uhAiFnpPZmLn7$>.
> But even applying Joseph's patch, the testcase from the above commit also
> looks good, and I also passed the riscv-gnu-toolchain for the above changes
> (two places use n >= last_map_symbol).  So it seems no reason to keep the
> (n >= last_map_symbol) checks for now.
>
> Nelson
>

      reply	other threads:[~2024-05-14 23:15 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-18 10:48 Joseph Faulls
2024-05-03 12:56 ` Joseph Faulls
2024-05-06 15:12   ` Palmer Dabbelt
2024-05-14  0:34     ` Nelson Chu
2024-05-14  9:10       ` Joseph Faulls
2024-05-14 23:14         ` Nelson Chu [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=CAPpQWtA1Tbc+7u4Ns3GZL_oUMzuyB84Oef7d3nKrbgx5fh2jAg@mail.gmail.com \
    --to=nelson@rivosinc.com \
    --cc=Joseph.Faulls@imgtec.com \
    --cc=binutils@sourceware.org \
    --cc=palmer@dabbelt.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).