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
> >
next prev parent 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