Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Will Hawkins <hawkinsw@obs.cr>
To: gdb-patches@sourceware.org
Subject: Re: [PATCH v2] Make source.c:search_command_helper use source cache
Date: Mon, 8 Apr 2024 14:12:34 -0400	[thread overview]
Message-ID: <CADx9qWisPFtp4x1wPd_Vv1VPTgRotrM-aR0P-Dji4C4PjGEyBw@mail.gmail.com> (raw)
In-Reply-To: <CADx9qWg=7y4uAYFN=6FZrLOpw6DonkG3mkYxnSCycfaHnLhK8A@mail.gmail.com>

Hello!

I hope that everyone is having a great Monday! If there is something
that I can do to make this patch better, please let me know. I am
sincerely enjoying the opportunity to contribute to GDB and I hope
that you find these patches helpful!

Sincerely,
Will

On Fri, Mar 29, 2024 at 10:46 AM Will Hawkins <hawkinsw@obs.cr> wrote:
>
> I am sorry for the PING. I know that I am supposed to wait for 2 weeks
> before pinging (according to the Contributing documentation) but I am
> nervous that I have not followed the proper procedures for sending the
> patch.
>
> Granting the premise that the patch is something that is useful, I am
> sure that you will have feedback. I am more than willing to make any
> changes to get it into shape.
>
> As I said before, thank you for the work that you all do maintaining
> such an incredible piece of software.
>
> Will
>
>
> On Mon, Mar 25, 2024 at 10:01 AM Will Hawkins <hawkinsw@obs.cr> wrote:
> >
> > The current implementation of search_command_helper accesses the line
> > offsets of the current program spaces's source code through
> > the source cache but then accesses its contents through the disk. This
> > PR updates the implementation so that the access of the contents is also
> > through the source cache.
> >
> > Tested on x86_64-redhat-linux.
> >
> > Signed-off-by: Will Hawkins <hawkinsw@obs.cr>
> > ---
> >     v1 -> v2:
> >         Remove leftover debugging code.
> >
> >     Rationale:
> >         Supporting access through the source cache during searching will make it
> >         easier to implement the embedded source functionality of DW_LNCT_source.
> >
> >  gdb/source.c | 79 +++++++++++++++++++++++++---------------------------
> >  1 file changed, 38 insertions(+), 41 deletions(-)
> >
> > diff --git a/gdb/source.c b/gdb/source.c
> > index bbeb4154258..ef042b0e96e 100644
> > --- a/gdb/source.c
> > +++ b/gdb/source.c
> > @@ -1617,46 +1617,45 @@ search_command_helper (const char *regex, int from_tty, bool forward)
> >    if (!source_open)
> >      error (_("source code access disabled"));
> >
> > -  scoped_fd desc (open_source_file (loc->symtab ()));
> > -  if (desc.get () < 0)
> > -    perror_with_name (symtab_to_filename_for_display (loc->symtab ()),
> > -                     -desc.get ());
> > -
> > -  int line = (forward
> > -             ? last_line_listed + 1
> > -             : last_line_listed - 1);
> > -
> >    const std::vector<off_t> *offsets;
> > -  if (line < 1
> > -      || !g_source_cache.get_line_charpos (loc->symtab (), &offsets)
> > -      || line > offsets->size ())
> > +  if (!g_source_cache.get_line_charpos (loc->symtab (), &offsets))
> >      error (_("Expression not found"));
> >
> > -  if (lseek (desc.get (), (*offsets)[line - 1], 0) < 0)
> > -    perror_with_name (symtab_to_filename_for_display (loc->symtab ()));
> > +  std::string lines;
> > +  if (!g_source_cache.get_source_lines (loc->symtab (), 1, offsets->size (),
> > +                                       &lines))
> > +    perror_with_name (symtab_to_filename_for_display (loc->symtab ()), -ENOENT);
> > +
> > +  int line_no = (forward
> > +                ? last_line_listed + 1
> > +                : last_line_listed - 1);
> >
> > -  gdb_file_up stream = desc.to_file (FDOPEN_MODE);
> > -  clearerr (stream.get ());
> > +  if (line_no < 1
> > +      || line_no > offsets->size ())
> > +    error (_("Expression not found"));
> > +
> > +  size_t current_line_start = (*offsets)[line_no - 1];
> >
> > -  gdb::def_vector<char> buf;
> > -  buf.reserve (256);
> > +  std::string buf;
> >
> >    while (1)
> >      {
> > -      buf.resize (0);
> > -
> > -      int c = fgetc (stream.get ());
> > -      if (c == EOF)
> > +      /* Invariant: current_line_start is either the index
> > +        of the start of the current line in LINES *or* the
> > +        length of the source code (LINES, when there is nothing
> > +        else to do).  */
> > +      if (current_line_start == lines.length ())
> >         break;
> > -      do
> > -       {
> > -         buf.push_back (c);
> > -       }
> > -      while (c != '\n' && (c = fgetc (stream.get ())) >= 0);
> > +
> > +      size_t current_line_end = ((line_no + 1) > offsets->size ()
> > +                                ? lines.size () - 1
> > +                                : (*offsets)[line_no] - 1);
> > +
> > +      size_t sz = current_line_end - current_line_start;
> > +      buf = lines.substr (current_line_start, sz);
> >
> >        /* Remove the \r, if any, at the end of the line, otherwise
> >          regular expressions that end with $ or \n won't work.  */
> > -      size_t sz = buf.size ();
> >        if (sz >= 2 && buf[sz - 2] == '\r')
> >         {
> >           buf[sz - 2] = '\n';
> > @@ -1664,29 +1663,27 @@ search_command_helper (const char *regex, int from_tty, bool forward)
> >         }
> >
> >        /* We now have a source line in buf, null terminate and match.  */
> > -      buf.push_back ('\0');
> > +      buf += '\0';
> >        if (re_exec (buf.data ()) > 0)
> >         {
> >           /* Match!  */
> > -         print_source_lines (loc->symtab (), line, line + 1, 0);
> > -         set_internalvar_integer (lookup_internalvar ("_"), line);
> > -         loc->set (loc->symtab (), std::max (line - lines_to_list / 2, 1));
> > +         print_source_lines (loc->symtab (), line_no, line_no + 1, 0);
> > +         set_internalvar_integer (lookup_internalvar ("_"), line_no);
> > +         loc->set (loc->symtab (), std::max (line_no - lines_to_list / 2, 1));
> >           return;
> >         }
> >
> >        if (forward)
> > -       line++;
> > +       {
> > +         line_no++;
> > +         current_line_start = current_line_end + 1;
> > +       }
> >        else
> >         {
> > -         line--;
> > -         if (line < 1)
> > +         line_no--;
> > +         if (line_no < 1)
> >             break;
> > -         if (fseek (stream.get (), (*offsets)[line - 1], 0) < 0)
> > -           {
> > -             const char *filename
> > -               = symtab_to_filename_for_display (loc->symtab ());
> > -             perror_with_name (filename);
> > -           }
> > +         current_line_start = (*offsets)[line_no - 1];
> >         }
> >      }
> >
> > --
> > 2.44.0
> >

  reply	other threads:[~2024-04-08 18:13 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-24  1:18 [PATCH] " Will Hawkins
2024-03-25 14:00 ` [PATCH v2] " Will Hawkins
2024-03-29 14:46   ` Will Hawkins
2024-04-08 18:12     ` Will Hawkins [this message]
2024-04-18  1:28       ` Will Hawkins
2024-04-19 19:41     ` Tom Tromey
2024-04-19 22:28       ` Will Hawkins
2024-04-19 19:40   ` Tom Tromey
2024-04-19 22:30     ` Will Hawkins

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=CADx9qWisPFtp4x1wPd_Vv1VPTgRotrM-aR0P-Dji4C4PjGEyBw@mail.gmail.com \
    --to=hawkinsw@obs.cr \
    --cc=gdb-patches@sourceware.org \
    /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