gdb: Remove an update of current_source_line and current_source_symtab
[deliverable/binutils-gdb.git] / gdb / source.c
index 14dda01cb0164cf1644c5fd57c38decd381e6c82..dec5a2f84bab5490c19a66b11f1e8bc0d1867457 100644 (file)
@@ -26,7 +26,7 @@
 #include "gdbcmd.h"
 #include "frame.h"
 #include "value.h"
-#include "filestuff.h"
+#include "common/filestuff.h"
 
 #include <sys/types.h>
 #include <fcntl.h>
@@ -238,8 +238,6 @@ clear_current_source_symtab_and_line (void)
 void
 select_source_symtab (struct symtab *s)
 {
-  struct objfile *ofp;
-
   if (s)
     {
       current_source_symtab = s;
@@ -271,23 +269,29 @@ select_source_symtab (struct symtab *s)
 
   current_source_line = 1;
 
-  ALL_FILETABS (ofp, cu, symtab)
+  for (objfile *ofp : current_program_space->objfiles ())
     {
-      const char *name = symtab->filename;
-      int len = strlen (name);
-
-      if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
-                       || strcmp (name, "<<C++-namespaces>>") == 0)))
+      for (compunit_symtab *cu : ofp->compunits ())
        {
-         current_source_pspace = current_program_space;
-         current_source_symtab = symtab;
+         for (symtab *symtab : compunit_filetabs (cu))
+           {
+             const char *name = symtab->filename;
+             int len = strlen (name);
+
+             if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
+                               || strcmp (name, "<<C++-namespaces>>") == 0)))
+               {
+                 current_source_pspace = current_program_space;
+                 current_source_symtab = symtab;
+               }
+           }
        }
     }
 
   if (current_source_symtab)
     return;
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       if (objfile->sf)
        s = objfile->sf->qf->find_last_source_symtab (objfile);
@@ -349,7 +353,7 @@ show_directories_command (struct ui_file *file, int from_tty,
 void
 forget_cached_source_info_for_objfile (struct objfile *objfile)
 {
-  for (compunit_symtab *cu : objfile_compunits (objfile))
+  for (compunit_symtab *cu : objfile->compunits ())
     {
       for (symtab *s : compunit_filetabs (cu))
        {
@@ -378,7 +382,7 @@ forget_cached_source_info (void)
   struct program_space *pspace;
 
   ALL_PSPACES (pspace)
-    for (objfile *objfile : all_objfiles (pspace))
+    for (objfile *objfile : pspace->objfiles ())
       {
        forget_cached_source_info_for_objfile (objfile);
       }
@@ -983,7 +987,10 @@ find_and_open_source (const char *filename,
       result = gdb_open_cloexec (fullname->get (), OPEN_MODE, 0);
       if (result >= 0)
        {
-         *fullname = gdb_realpath (fullname->get ());
+         if (basenames_may_differ)
+           *fullname = gdb_realpath (fullname->get ());
+         else
+           *fullname = gdb_abspath (fullname->get ());
          return scoped_fd (result);
        }
 
@@ -1005,9 +1012,7 @@ find_and_open_source (const char *filename,
       /* Replace a path entry of $cdir with the compilation directory
         name.  */
 #define        cdir_len        5
-      /* We cast strstr's result in case an ANSIhole has made it const,
-         which produces a "required warning" when assigned to a nonconst.  */
-      p = (char *) strstr (source_path, "$cdir");
+      p = strstr (source_path, "$cdir");
       if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
          && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
        {
@@ -1023,26 +1028,22 @@ find_and_open_source (const char *filename,
        }
     }
 
-  gdb::unique_xmalloc_ptr<char> rewritten_filename;
-  if (IS_ABSOLUTE_PATH (filename))
-    {
-      /* If filename is absolute path, try the source path
-        substitution on it.  */
-      rewritten_filename = rewrite_source_path (filename);
+  gdb::unique_xmalloc_ptr<char> rewritten_filename
+    = rewrite_source_path (filename);
 
-      if (rewritten_filename != NULL)
-       filename = rewritten_filename.get ();
-    }
+  if (rewritten_filename != NULL)
+    filename = rewritten_filename.get ();
 
-  result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, filename,
-                 OPEN_MODE, fullname);
+  openp_flags flags = OPF_SEARCH_IN_PATH;
+  if (basenames_may_differ)
+    flags |= OPF_RETURN_REALPATH;
+  result = openp (path, flags, filename, OPEN_MODE, fullname);
   if (result < 0)
     {
       /* Didn't work.  Try using just the basename.  */
       p = lbasename (filename);
       if (p != filename)
-       result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, p,
-                       OPEN_MODE, fullname);
+       result = openp (path, flags, p, OPEN_MODE, fullname);
     }
 
   return scoped_fd (result);
@@ -1128,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;
@@ -1195,47 +1196,20 @@ 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.  */
-
-static void
-get_filename_and_charpos (struct symtab *s, char **fullname)
-{
-  scoped_fd desc = open_source_file (s);
-  if (desc.get () < 0)
-    {
-      if (fullname)
-       *fullname = NULL;
-      return;
-    }
-  if (fullname)
-    *fullname = s->fullname;
-  if (s->line_charpos == 0)
-    find_source_lines (s, desc.get ());
-}
-
 /* See source.h.  */
 
-int
-identify_source_line (struct symtab *s, int line, int mid_statement,
-                     CORE_ADDR pc)
+scoped_fd
+open_source_file_with_line_charpos (struct symtab *s)
 {
-  if (s->line_charpos == 0)
-    get_filename_and_charpos (s, (char **) NULL);
-  if (s->fullname == 0)
-    return 0;
-  if (line > s->nlines)
-    /* Don't index off the end of the line_charpos array.  */
-    return 0;
-  annotate_source (s->fullname, line, s->line_charpos[line - 1],
-                  mid_statement, get_objfile_arch (SYMTAB_OBJFILE (s)), pc);
+  scoped_fd fd (open_source_file (s));
+  if (fd.get () < 0)
+    return fd;
 
-  current_source_line = line;
-  current_source_symtab = s;
-  clear_lines_listed_range ();
-  return 1;
+  if (s->line_charpos == nullptr)
+    find_source_lines (s, fd.get ());
+  return fd;
 }
+
 \f
 
 /* Print source lines from the file of symtab S,
@@ -1245,7 +1219,6 @@ static void
 print_source_lines_base (struct symtab *s, int line, int stopline,
                         print_source_lines_flags flags)
 {
-  int c;
   scoped_fd desc;
   int noprint = 0;
   int nlines = stopline - line;
@@ -1339,13 +1312,10 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
           line, symtab_to_filename_for_display (s), s->nlines);
 
   const char *iter = lines.c_str ();
-  while (nlines-- > 0)
+  while (nlines-- > 0 && *iter != '\0')
     {
       char buf[20];
 
-      c = *iter++;
-      if (c == '\0')
-       break;
       last_line_listed = current_source_line;
       if (flags & PRINT_SOURCE_LINES_FILENAME)
         {
@@ -1354,33 +1324,59 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
         }
       xsnprintf (buf, sizeof (buf), "%d\t", current_source_line++);
       uiout->text (buf);
-      do
+
+      while (*iter != '\0')
        {
-         if (c < 040 && c != '\t' && c != '\n' && c != '\r' && c != '\033')
+         /* Find a run of characters that can be emitted at once.
+            This is done so that escape sequences are kept
+            together.  */
+         const char *start = iter;
+         while (true)
            {
-             xsnprintf (buf, sizeof (buf), "^%c", c + 0100);
-             uiout->text (buf);
+             int skip_bytes;
+
+             char c = *iter;
+             if (c == '\033' && skip_ansi_escape (iter, &skip_bytes))
+               iter += skip_bytes;
+             else if (c >= 0 && c < 040 && c != '\t')
+               break;
+             else if (c == 0177)
+               break;
+             else
+               ++iter;
            }
-         else if (c == 0177)
-           uiout->text ("^?");
-         else if (c == '\r')
+         if (iter > start)
            {
-             /* Skip a \r character, but only before a \n.  */
-             if (*iter != '\n')
-               printf_filtered ("^%c", c + 0100);
+             std::string text (start, iter);
+             uiout->text (text.c_str ());
            }
-         else
+         if (*iter == '\r')
+           {
+             /* Treat either \r or \r\n as a single newline.  */
+             ++iter;
+             if (*iter == '\n')
+               ++iter;
+             break;
+           }
+         else if (*iter == '\n')
            {
-             xsnprintf (buf, sizeof (buf), "%c", c);
+             ++iter;
+             break;
+           }
+         else if (*iter > 0 && *iter < 040)
+           {
+             xsnprintf (buf, sizeof (buf), "^%c", *iter + 0100);
              uiout->text (buf);
+             ++iter;
+           }
+         else if (*iter == 0177)
+           {
+             uiout->text ("^?");
+             ++iter;
            }
        }
-      while (c != '\n' && (c = *iter++) != '\0');
-      if (c == '\0')
-       break;
+      uiout->text ("\n");
     }
-  if (!lines.empty() && lines.back () != '\n')
-    uiout->text ("\n");
 }
 \f
 
@@ -1500,8 +1496,8 @@ info_line_command (const char *arg, int from_tty)
 
          /* If this is the only line, show the source code.  If it could
             not find the file, don't do anything special.  */
-         if (annotation_level && sals.size () == 1)
-           identify_source_line (sal.symtab, sal.line, 0, start_pc);
+         if (sals.size () == 1)
+           annotate_source_line (sal.symtab, sal.line, 0, start_pc);
        }
       else
        /* Is there any case in which we get here, and have an address
@@ -1528,13 +1524,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);
This page took 0.033655 seconds and 4 git commands to generate.