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:
Andrew Burgess 2019-06-14 22:16:52 +01:00
parent afda45a206
commit 00df30ae1e
4 changed files with 41 additions and 29 deletions

View file

@ -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)
/* 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;
}
/* 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);