Remove commented-out code in jv-lang.c
[binutils-gdb.git] / gdb / source.c
index fd6cc8a559c2d67b54ac987508a54ae2a9911f7a..39bd06a7792911104c8382d8124843d8f07c26b2 100644 (file)
@@ -1,7 +1,7 @@
 /* List lines of source files for GDB, the GNU debugger.
    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
-   2009 Free Software Foundation, Inc.
+   2009, 2010 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -46,6 +46,8 @@
 #include "ui-out.h"
 #include "readline/readline.h"
 
+#include "psymtab.h"
+
 
 #define OPEN_MODE (O_RDONLY | O_BINARY)
 #define FDOPEN_MODE FOPEN_RB
@@ -174,8 +176,6 @@ get_current_source_symtab_and_line (void)
 void
 set_default_source_symtab_and_line (void)
 {
-  struct symtab_and_line cursal;
-
   if (!have_full_symbols () && !have_partial_symbols ())
     error (_("No symbol table is loaded.  Use the \"file\" command."));
 
@@ -229,8 +229,6 @@ select_source_symtab (struct symtab *s)
 {
   struct symtabs_and_lines sals;
   struct symtab_and_line sal;
-  struct partial_symtab *ps;
-  struct partial_symtab *cs_pst = 0;
   struct objfile *ofp;
 
   if (s)
@@ -269,6 +267,7 @@ select_source_symtab (struct symtab *s)
        {
          const char *name = s->filename;
          int len = strlen (name);
+
          if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
              || strcmp (name, "<<C++-namespaces>>") == 0)))
            {
@@ -281,33 +280,13 @@ select_source_symtab (struct symtab *s)
   if (current_source_symtab)
     return;
 
-  /* How about the partial symbol tables?  */
-
   ALL_OBJFILES (ofp)
-    {
-      for (ps = ofp->psymtabs; ps != NULL; ps = ps->next)
-       {
-         const char *name = ps->filename;
-         int len = strlen (name);
-         if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
-             || strcmp (name, "<<C++-namespaces>>") == 0)))
-           cs_pst = ps;
-       }
-    }
-  if (cs_pst)
-    {
-      if (cs_pst->readin)
-       {
-         internal_error (__FILE__, __LINE__,
-                         _("select_source_symtab: "
-                         "readin pst found and no symtabs."));
-       }
-      else
-       {
-         current_source_pspace = current_program_space;
-         current_source_symtab = PSYMTAB_TO_SYMTAB (cs_pst);
-       }
-    }
+  {
+    if (ofp->sf)
+      s = ofp->sf->qf->find_last_source_symtab (ofp);
+    if (s)
+      current_source_symtab = s;
+  }
   if (current_source_symtab)
     return;
 
@@ -332,7 +311,6 @@ forget_cached_source_info (void)
   struct program_space *pspace;
   struct symtab *s;
   struct objfile *objfile;
-  struct partial_symtab *pst;
 
   ALL_PSPACES (pspace)
     ALL_PSPACE_OBJFILES (pspace, objfile)
@@ -351,14 +329,8 @@ forget_cached_source_info (void)
            }
        }
 
-      ALL_OBJFILE_PSYMTABS (objfile, pst)
-      {
-       if (pst->fullname != NULL)
-         {
-           xfree (pst->fullname);
-           pst->fullname = NULL;
-         }
-      }
+      if (objfile->sf)
+       objfile->sf->qf->forget_cached_source_info (objfile);
     }
 
   last_source_visited = NULL;
@@ -548,6 +520,7 @@ add_path (char *dirname, char **which_path, int parse_separators)
          if (stat (name, &st) < 0)
            {
              int save_errno = errno;
+
              fprintf_unfiltered (gdb_stderr, "Warning: ");
              print_sys_errmsg (name, save_errno);
            }
@@ -707,6 +680,20 @@ openp (const char *path, int opts, const char *string,
 
   /* The open syscall MODE parameter is not specified.  */
   gdb_assert ((mode & O_CREAT) == 0);
+  gdb_assert (string != NULL);
+
+  /* A file with an empty name cannot possibly exist.  Report a failure
+     without further checking.
+
+     This is an optimization which also defends us against buggy
+     implementations of the "stat" function.  For instance, we have
+     noticed that a MinGW debugger built on Windows XP 32bits crashes
+     when the debugger is started with an empty argument.  */
+  if (string[0] == '\0')
+    {
+      errno = ENOENT;
+      return -1;
+    }
 
   if (!path)
     path = ".";
@@ -737,6 +724,10 @@ openp (const char *path, int opts, const char *string,
            goto done;
     }
 
+  /* For dos paths, d:/foo -> /foo, and d:foo -> foo.  */
+  if (HAS_DRIVE_SPEC (string))
+    string = STRIP_DRIVE_SPEC (string);
+
   /* /foo => foo, to avoid multiple slashes that Emacs doesn't like. */
   while (IS_DIR_SEPARATOR(string[0]))
     string++;
@@ -777,6 +768,16 @@ openp (const char *path, int opts, const char *string,
          /* Normal file name in path -- just use it.  */
          strncpy (filename, p, len);
          filename[len] = 0;
+
+         /* Don't search $cdir.  It's also a magic path like $cwd, but we
+            don't have enough information to expand it.  The user *could*
+            have an actual directory named '$cdir' but handling that would
+            be confusing, it would mean different things in different
+            contexts.  If the user really has '$cdir' one can use './$cdir'.
+            We can get $cdir when loading scripts.  When loading source files
+            $cdir must have already been expanded to the correct value.  */
+         if (strcmp (filename, "$cdir") == 0)
+           continue;
        }
 
       /* Remove trailing slashes */
@@ -814,6 +815,7 @@ done:
                            IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
                            ? "" : SLASH_STRING,
                            filename, (char *)NULL);
+
          *filename_opened = xfullpath (f);
          xfree (f);
        }
@@ -950,7 +952,7 @@ rewrite_source_path (const char *path)
      An invalid file descriptor is returned. ( the return value is negative ) 
      FULLNAME is set to NULL.  */
 
-static int
+int
 find_and_open_source (const char *filename,
                      const char *dirname,
                      char **fullname)
@@ -1080,34 +1082,6 @@ symtab_to_fullname (struct symtab *s)
 
   return NULL;
 }
-
-/* Finds the fullname that a partial_symtab represents.
-
-   If this functions finds the fullname, it will save it in ps->fullname
-   and it will also return the value.
-
-   If this function fails to find the file that this partial_symtab represents,
-   NULL will be returned and ps->fullname will be set to NULL.  */
-char *
-psymtab_to_fullname (struct partial_symtab *ps)
-{
-  int r;
-
-  if (!ps)
-    return NULL;
-
-  /* Don't check ps->fullname here, the file could have been
-     deleted/moved/..., look for it again */
-  r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
-
-  if (r >= 0)
-    {
-      close (r);
-      return ps->fullname;
-    }
-
-  return NULL;
-}
 \f
 /* Create and initialize the table S->line_charpos that records
    the positions of the lines in the source file, which is assumed
@@ -1901,7 +1875,6 @@ unset_substitute_path_command (char *args, int from_tty)
 static void
 set_substitute_path_command (char *args, int from_tty)
 {
-  char *from_path, *to_path;
   char **argv;
   struct substitute_path_rule *rule;
   
@@ -1940,6 +1913,7 @@ void
 _initialize_source (void)
 {
   struct cmd_list_element *c;
+
   current_source_symtab = 0;
   init_source_path ();
 
@@ -2001,6 +1975,7 @@ The matching line number is also stored as the value of \"$_\"."));
   add_com ("reverse-search", class_files, reverse_search_command, _("\
 Search backward for regular expression (see regex(3)) from last line listed.\n\
 The matching line number is also stored as the value of \"$_\"."));
+  add_com_alias ("rev", "reverse-search", class_files, 1);
 
   if (xdb_commands)
     {