gdb: New function to open source file and compute line charpos data
authorAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 14 Jun 2019 21:16:52 +0000 (22:16 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Sat, 15 Jun 2019 20:39:04 +0000 (21:39 +0100)
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
gdb/source-cache.c
gdb/source.c
gdb/source.h

index 83916efc63058301c994a9233fcd430bc2b6536c..cb81983a1da6c465861122c39a9c251ff4391537 100644 (file)
@@ -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>
 
        * source.c (get_filename_and_charpos): Remove fullname
index d2fb4b81b7171a1e68e9aae4349c4e544420939d..2d5b549d97171014ea3c99fae5f438da45f92f14 100644 (file)
@@ -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
index 5fa55e2c16023fb4cc6fcba4511f9e660ff621c4..dae1801c1369c6950b115d0914efaed08ffb1004 100644 (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)
 
 \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);
index f1b5f6e8f7f6b61032e9d779225ec85334f0c9b8..7ea826acae5a01b265c0e9292c24e506ff4ac247 100644 (file)
@@ -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