From: Andrew Burgess <andrew.burgess@embecosm.com>
To: gdb-patches@sourceware.org
Cc: Andrew Burgess <andrew.burgess@embecosm.com>
Subject: [PATCH 2/4] gdb: New function to open source file and compute line charpos data
Date: Fri, 14 Jun 2019 23:01:00 -0000 [thread overview]
Message-ID: <24a072ec0ca17e602d5b239b8627f093a7ee9df7.1560553051.git.andrew.burgess@embecosm.com> (raw)
In-Reply-To: <cover.1560553051.git.andrew.burgess@embecosm.com>
In-Reply-To: <cover.1560553051.git.andrew.burgess@embecosm.com>
Every place that a symtab's line_charpos data is loaded always follows
the same pattern, so create a new function to contain this logic and
make use of it throughout GDB.
There should be no user visible changes after this commit.
gdb/ChangeLog:
* source-cache.c (source_cache::get_plain_source_lines): Use
open_source_file_with_line_charpos instead of just
open_source_file, remove call to find_source_lines.
(source_cache::get_source_lines): Likewise.
* source.c (find_source_lines): Make static.
(get_filename_and_charpos): Renamed into...
(open_source_file_with_line_charpos): ..this along with changes to
return a scoped_fd, and some other minor clean ups.
(identify_source_line): Use open_source_file_with_line_charpos.
(search_command_helper): Use open_source_file_with_line_charpos
instead of just open_source_file, remove call to
find_source_lines.
* source.h (open_source_file_with_line_charpos): Declare new
function.
(find_source_lines): Delete declaration.
---
gdb/ChangeLog | 18 ++++++++++++++++++
gdb/source-cache.c | 8 ++------
gdb/source.c | 33 ++++++++++++++++-----------------
gdb/source.h | 11 +++++------
4 files changed, 41 insertions(+), 29 deletions(-)
diff --git a/gdb/source-cache.c b/gdb/source-cache.c
index d2fb4b81b71..2d5b549d971 100644
--- a/gdb/source-cache.c
+++ b/gdb/source-cache.c
@@ -49,13 +49,10 @@ bool
source_cache::get_plain_source_lines (struct symtab *s, int first_line,
int last_line, std::string *lines)
{
- scoped_fd desc (open_source_file (s));
+ scoped_fd desc (open_source_file_with_line_charpos (s));
if (desc.get () < 0)
return false;
- if (s->line_charpos == 0)
- find_source_lines (s, desc.get ());
-
if (first_line < 1 || first_line > s->nlines || last_line < 1)
return false;
@@ -202,10 +199,9 @@ source_cache::get_source_lines (struct symtab *s, int first_line,
{
if (s->line_charpos == 0)
{
- scoped_fd desc = open_source_file (s);
+ scoped_fd desc (open_source_file_with_line_charpos (s));
if (desc.get () < 0)
return false;
- find_source_lines (s, desc.get ());
/* FULLNAME points to a value owned by the symtab
(symtab::fullname). Calling open_source_file reallocates
diff --git a/gdb/source.c b/gdb/source.c
index 5fa55e2c160..dae1801c136 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -1129,7 +1129,7 @@ symtab_to_filename_for_display (struct symtab *symtab)
to be open on descriptor DESC.
All set S->nlines to the number of such lines. */
-void
+static void
find_source_lines (struct symtab *s, int desc)
{
struct stat st;
@@ -1196,28 +1196,30 @@ find_source_lines (struct symtab *s, int desc)
\f
-/* Get full pathname and line number positions for a symtab.
- Set *FULLNAME to actual name of the file as found by `openp',
- or to 0 if the file is not found. */
+/* See source.h. */
-static void
-get_filename_and_charpos (struct symtab *s)
+scoped_fd
+open_source_file_with_line_charpos (struct symtab *s)
{
- scoped_fd desc = open_source_file (s);
- if (desc.get () < 0)
- return;
- if (s->line_charpos == 0)
- find_source_lines (s, desc.get ());
+ scoped_fd fd (open_source_file (s));
+ if (fd.get () < 0)
+ return fd;
+
+ if (s->line_charpos == nullptr)
+ find_source_lines (s, fd.get ());
+ return fd;
}
+\f
+
/* See source.h. */
int
identify_source_line (struct symtab *s, int line, int mid_statement,
CORE_ADDR pc)
{
- if (s->line_charpos == 0)
- get_filename_and_charpos (s);
+ if (s->line_charpos == nullptr)
+ open_source_file_with_line_charpos (s);
if (s->fullname == 0)
return 0;
if (line > s->nlines)
@@ -1545,13 +1547,10 @@ search_command_helper (const char *regex, int from_tty, bool forward)
if (current_source_symtab == 0)
select_source_symtab (0);
- scoped_fd desc = open_source_file (current_source_symtab);
+ scoped_fd desc (open_source_file_with_line_charpos (current_source_symtab));
if (desc.get () < 0)
perror_with_name (symtab_to_filename_for_display (current_source_symtab));
- if (current_source_symtab->line_charpos == 0)
- find_source_lines (current_source_symtab, desc.get ());
-
int line = (forward
? last_line_listed + 1
: last_line_listed - 1);
diff --git a/gdb/source.h b/gdb/source.h
index f1b5f6e8f7f..7ea826acae5 100644
--- a/gdb/source.h
+++ b/gdb/source.h
@@ -76,6 +76,11 @@ extern scoped_fd find_and_open_source (const char *filename,
negative number for error. */
extern scoped_fd open_source_file (struct symtab *s);
+/* Open a source file given a symtab S (by calling open_source_file), then
+ ensure the line_charpos data is initialised for symtab S before
+ returning. */
+extern scoped_fd open_source_file_with_line_charpos (struct symtab *s);
+
extern gdb::unique_xmalloc_ptr<char> rewrite_source_path (const char *path);
extern const char *symtab_to_fullname (struct symtab *s);
@@ -84,12 +89,6 @@ extern const char *symtab_to_fullname (struct symtab *s);
filename. It depends on 'set filename-display' value. */
extern const char *symtab_to_filename_for_display (struct symtab *symtab);
-/* Create and initialize the table S->line_charpos that records the
- positions of the lines in the source file, which is assumed to be
- open on descriptor DESC. All set S->nlines to the number of such
- lines. */
-extern void find_source_lines (struct symtab *s, int desc);
-
/* Return the first line listed by print_source_lines. Used by
command interpreters to request listing from a previous point. If
0, then no source lines have yet been listed since the last time
--
2.14.5
next prev parent reply other threads:[~2019-06-14 23:01 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-12 23:13 [PATCH] gdb: Remove an update of current_source_line and current_source_symtab Andrew Burgess
2019-06-14 14:44 ` Tom Tromey
2019-06-14 23:01 ` Andrew Burgess [this message]
2019-06-14 23:01 ` [PATCH 3/4] " Andrew Burgess
2019-06-14 23:01 ` [PATCH 4/4] gdb: Don't allow annotations to influence what else GDB prints Andrew Burgess
2019-06-14 23:01 ` [PATCH 0/4] Changes around annotate_source_line Andrew Burgess
2019-06-15 14:26 ` Tom Tromey
2019-06-14 23:01 ` [PATCH 1/4] gdb: Remove unused parameter Andrew Burgess
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=24a072ec0ca17e602d5b239b8627f093a7ee9df7.1560553051.git.andrew.burgess@embecosm.com \
--to=andrew.burgess@embecosm.com \
--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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).