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: Fri, 29 Mar 2024 10:46:06 -0400 [thread overview]
Message-ID: <CADx9qWg=7y4uAYFN=6FZrLOpw6DonkG3mkYxnSCycfaHnLhK8A@mail.gmail.com> (raw)
In-Reply-To: <20240325140103.157217-1-hawkinsw@obs.cr>
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-03-29 14:46 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 [this message]
2024-04-08 18:12 ` Will Hawkins
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='CADx9qWg=7y4uAYFN=6FZrLOpw6DonkG3mkYxnSCycfaHnLhK8A@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