forked from Imagelibrary/binutils-gdb
gdb: New function to open source file and compute line charpos data
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.
This commit is contained in:
@@ -1,3 +1,21 @@
|
|||||||
|
2019-06-15 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2019-06-15 Andrew Burgess <andrew.burgess@embecosm.com>
|
2019-06-15 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
* source.c (get_filename_and_charpos): Remove fullname
|
* source.c (get_filename_and_charpos): Remove fullname
|
||||||
|
|||||||
@@ -49,13 +49,10 @@ bool
|
|||||||
source_cache::get_plain_source_lines (struct symtab *s, int first_line,
|
source_cache::get_plain_source_lines (struct symtab *s, int first_line,
|
||||||
int last_line, std::string *lines)
|
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)
|
if (desc.get () < 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (s->line_charpos == 0)
|
|
||||||
find_source_lines (s, desc.get ());
|
|
||||||
|
|
||||||
if (first_line < 1 || first_line > s->nlines || last_line < 1)
|
if (first_line < 1 || first_line > s->nlines || last_line < 1)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -202,10 +199,9 @@ source_cache::get_source_lines (struct symtab *s, int first_line,
|
|||||||
{
|
{
|
||||||
if (s->line_charpos == 0)
|
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)
|
if (desc.get () < 0)
|
||||||
return false;
|
return false;
|
||||||
find_source_lines (s, desc.get ());
|
|
||||||
|
|
||||||
/* FULLNAME points to a value owned by the symtab
|
/* FULLNAME points to a value owned by the symtab
|
||||||
(symtab::fullname). Calling open_source_file reallocates
|
(symtab::fullname). Calling open_source_file reallocates
|
||||||
|
|||||||
33
gdb/source.c
33
gdb/source.c
@@ -1129,7 +1129,7 @@ symtab_to_filename_for_display (struct symtab *symtab)
|
|||||||
to be open on descriptor DESC.
|
to be open on descriptor DESC.
|
||||||
All set S->nlines to the number of such lines. */
|
All set S->nlines to the number of such lines. */
|
||||||
|
|
||||||
void
|
static void
|
||||||
find_source_lines (struct symtab *s, int desc)
|
find_source_lines (struct symtab *s, int desc)
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
@@ -1196,28 +1196,30 @@ find_source_lines (struct symtab *s, int desc)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Get full pathname and line number positions for a symtab.
|
/* See source.h. */
|
||||||
Set *FULLNAME to actual name of the file as found by `openp',
|
|
||||||
or to 0 if the file is not found. */
|
|
||||||
|
|
||||||
static void
|
scoped_fd
|
||||||
get_filename_and_charpos (struct symtab *s)
|
open_source_file_with_line_charpos (struct symtab *s)
|
||||||
{
|
{
|
||||||
scoped_fd desc = open_source_file (s);
|
scoped_fd fd (open_source_file (s));
|
||||||
if (desc.get () < 0)
|
if (fd.get () < 0)
|
||||||
return;
|
return fd;
|
||||||
if (s->line_charpos == 0)
|
|
||||||
find_source_lines (s, desc.get ());
|
if (s->line_charpos == nullptr)
|
||||||
|
find_source_lines (s, fd.get ());
|
||||||
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* See source.h. */
|
/* See source.h. */
|
||||||
|
|
||||||
int
|
int
|
||||||
identify_source_line (struct symtab *s, int line, int mid_statement,
|
identify_source_line (struct symtab *s, int line, int mid_statement,
|
||||||
CORE_ADDR pc)
|
CORE_ADDR pc)
|
||||||
{
|
{
|
||||||
if (s->line_charpos == 0)
|
if (s->line_charpos == nullptr)
|
||||||
get_filename_and_charpos (s);
|
open_source_file_with_line_charpos (s);
|
||||||
if (s->fullname == 0)
|
if (s->fullname == 0)
|
||||||
return 0;
|
return 0;
|
||||||
if (line > s->nlines)
|
if (line > s->nlines)
|
||||||
@@ -1545,13 +1547,10 @@ search_command_helper (const char *regex, int from_tty, bool forward)
|
|||||||
if (current_source_symtab == 0)
|
if (current_source_symtab == 0)
|
||||||
select_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)
|
if (desc.get () < 0)
|
||||||
perror_with_name (symtab_to_filename_for_display (current_source_symtab));
|
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
|
int line = (forward
|
||||||
? last_line_listed + 1
|
? last_line_listed + 1
|
||||||
: last_line_listed - 1);
|
: last_line_listed - 1);
|
||||||
|
|||||||
11
gdb/source.h
11
gdb/source.h
@@ -76,6 +76,11 @@ extern scoped_fd find_and_open_source (const char *filename,
|
|||||||
negative number for error. */
|
negative number for error. */
|
||||||
extern scoped_fd open_source_file (struct symtab *s);
|
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 gdb::unique_xmalloc_ptr<char> rewrite_source_path (const char *path);
|
||||||
|
|
||||||
extern const char *symtab_to_fullname (struct symtab *s);
|
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. */
|
filename. It depends on 'set filename-display' value. */
|
||||||
extern const char *symtab_to_filename_for_display (struct symtab *symtab);
|
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
|
/* Return the first line listed by print_source_lines. Used by
|
||||||
command interpreters to request listing from a previous point. If
|
command interpreters to request listing from a previous point. If
|
||||||
0, then no source lines have yet been listed since the last time
|
0, then no source lines have yet been listed since the last time
|
||||||
|
|||||||
Reference in New Issue
Block a user