* configure, config.in: Rebuilt.
authorTom Tromey <tromey@redhat.com>
Fri, 21 Dec 2001 22:32:37 +0000 (22:32 +0000)
committerTom Tromey <tromey@redhat.com>
Fri, 21 Dec 2001 22:32:37 +0000 (22:32 +0000)
* configure.in: Check for realpath.
* defs.h (gdb_realpath): Declare.
* symtab.h (partial_symtab): Added fullname field.
* source.c (openp): Use gdb_realpath.
(forget_cached_source_info): Clear full name of each partial
symtab.
* utils.c (gdb_realpath): New function.
* symtab.c (lookup_symtab): Removed.
(lookup_symtab_1): Renamed to lookup_symtab.
(lookup_symtab): Look for real path.
(lookup_partial_symtab): Likewise.

gdb/ChangeLog
gdb/config.in
gdb/configure
gdb/configure.in
gdb/defs.h
gdb/source.c
gdb/symtab.c
gdb/symtab.h
gdb/utils.c

index a3bbbdcb9d5efb1ba0b220165b883e759056c669..c2202bf2c38c8df970d9a93634d901d2d4a6acb9 100644 (file)
@@ -1,3 +1,18 @@
+2001-12-21  Tom Tromey  <tromey@redhat.com>
+
+       * configure, config.in: Rebuilt.
+       * configure.in: Check for realpath.
+       * defs.h (gdb_realpath): Declare.
+       * symtab.h (partial_symtab): Added fullname field.
+       * source.c (openp): Use gdb_realpath.
+       (forget_cached_source_info): Clear full name of each partial
+       symtab.
+       * utils.c (gdb_realpath): New function.
+       * symtab.c (lookup_symtab): Removed.
+       (lookup_symtab_1): Renamed to lookup_symtab.
+       (lookup_symtab): Look for real path.
+       (lookup_partial_symtab): Likewise.
+
 2001-12-21  Michael Snyder  <msnyder@redhat.com>
 
        * maint.c (match_substring): New function.  Tokenizer for
index c80d8a8b105a1533449a3205fc8266ecfa95c1e0..faca85edb718b12cb9e0eea75e2a95d09a969198 100644 (file)
 /* Define if you have the putenv function.  */
 #undef HAVE_PUTENV
 
+/* Define if you have the realpath function.  */
+#undef HAVE_REALPATH
+
 /* Define if you have the sbrk function.  */
 #undef HAVE_SBRK
 
index dcb5ce23b0b9159ca426f1ddc3cdeccd18b8d09e..e1881ff9cd6565200bf0c9a54168248120739e26 100755 (executable)
@@ -3582,7 +3582,7 @@ EOF
 fi
 
 
-for ac_func in bcopy btowc bzero isascii poll sbrk setpgid setpgrp \
+for ac_func in bcopy btowc bzero isascii poll realpath sbrk setpgid setpgrp \
        sigaction sigprocmask sigsetmask
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
index 8df5c87a51dec8f3f9d2b78440fe07bb3ac8d1d7..43a5c0e1cf790ba29f3c892b7c44c6d45b336e34 100644 (file)
@@ -131,7 +131,7 @@ AC_HEADER_STAT
 
 AC_C_CONST
 
-AC_CHECK_FUNCS(bcopy btowc bzero isascii poll sbrk setpgid setpgrp \
+AC_CHECK_FUNCS(bcopy btowc bzero isascii poll realpath sbrk setpgid setpgrp \
        sigaction sigprocmask sigsetmask)
 AC_FUNC_ALLOCA
 AC_FUNC_VFORK
index 48adef5139d7e5056b19506d060ab097b94b2fc9..e573854be247240f9bb6e715e14881f26a11103d 100644 (file)
@@ -575,6 +575,8 @@ extern void init_page_info (void);
 extern CORE_ADDR host_pointer_to_address (void *ptr);
 extern void *address_to_host_pointer (CORE_ADDR addr);
 
+extern char *gdb_realpath (const char *);
+
 /* From demangle.c */
 
 extern void set_demangling_style (char *);
index d04f886df83598eecb4d1ebd7a3757798e2733ae..dab794fb731b9140df803d933f21a77c0c6c8efa 100644 (file)
@@ -234,6 +234,7 @@ forget_cached_source_info (void)
 {
   register struct symtab *s;
   register struct objfile *objfile;
+  struct partial_symtab *pst;
 
   for (objfile = object_files; objfile != NULL; objfile = objfile->next)
     {
@@ -250,6 +251,15 @@ forget_cached_source_info (void)
              s->fullname = NULL;
            }
        }
+
+      ALL_OBJFILE_PSYMTABS (objfile, pst)
+      {
+       if (pst->fullname != NULL)
+         {
+           xfree (pst->fullname);
+           pst->fullname = NULL;
+         }
+      }
     }
 }
 
@@ -603,15 +613,17 @@ done:
       if (fd < 0)
        *filename_opened = NULL;
       else if (IS_ABSOLUTE_PATH (filename))
-       *filename_opened = savestring (filename, strlen (filename));
+       *filename_opened = gdb_realpath (filename);
       else
        {
          /* Beware the // my son, the Emacs barfs, the botch that catch... */
 
-         *filename_opened = concat (current_directory,
+         char *f = concat (current_directory,
            IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
                                     ? "" : SLASH_STRING,
                                     filename, NULL);
+         *filename_opened = gdb_realpath (f);
+         xfree (f);
        }
     }
   /* OBSOLETE #ifdef MPW  */
index d11dabaf7b773d0812e385df16ec9113443fe02c..2353ae5a8c0c4fc91f3f95c01ba655b49e309e3f 100644 (file)
@@ -141,14 +141,38 @@ lookup_symtab (const char *name)
   register struct symtab *s;
   register struct partial_symtab *ps;
   register struct objfile *objfile;
+  char *real_path = NULL;
+
+  /* Here we are interested in canonicalizing an absolute path, not
+     absolutizing a relative path.  */
+  if (IS_ABSOLUTE_PATH (name))
+    real_path = gdb_realpath (name);
 
 got_symtab:
 
   /* First, search for an exact match */
 
   ALL_SYMTABS (objfile, s)
+  {
     if (FILENAME_CMP (name, s->filename) == 0)
-      return s;
+      {
+       xfree (real_path);
+       return s;
+      }
+    /* If the user gave us an absolute path, try to find the file in
+       this symtab and use its absolute path.  */
+    if (real_path != NULL)
+      {
+       char *rp = symtab_to_filename (s);
+       if (FILENAME_CMP (real_path, rp) == 0)
+         {
+           xfree (real_path);
+           return s;
+         }
+      }
+  }
+
+  xfree (real_path);
 
   /* Now, search for a matching tail (only if name doesn't have any dirs) */
 
@@ -195,15 +219,37 @@ lookup_partial_symtab (const char *name)
 {
   register struct partial_symtab *pst;
   register struct objfile *objfile;
+  char *real_path = NULL;
+
+  /* Here we are interested in canonicalizing an absolute path, not
+     absolutizing a relative path.  */
+  if (IS_ABSOLUTE_PATH (name))
+    real_path = gdb_realpath (name);
 
   ALL_PSYMTABS (objfile, pst)
   {
     if (FILENAME_CMP (name, pst->filename) == 0)
       {
+       xfree (real_path);
        return (pst);
       }
+    /* If the user gave us an absolute path, try to find the file in
+       this symtab and use its absolute path.  */
+    if (real_path != NULL)
+      {
+       if (pst->fullname == NULL)
+         source_full_path_of (pst->filename, &pst->fullname);
+       if (pst->fullname != NULL
+           && FILENAME_CMP (real_path, pst->fullname) == 0)
+         {
+           xfree (real_path);
+           return pst;
+         }
+      }
   }
 
+  xfree (real_path);
+
   /* Now, search for a matching tail (only if name doesn't have any dirs) */
 
   if (lbasename (name) == name)
index 841da4dab8104c2eebccd44b1b65cf88bc95ddd4..f01cbbe012d2387ad97d8c882656241fc8daa017 100644 (file)
@@ -967,6 +967,10 @@ struct partial_symtab
 
     char *filename;
 
+    /* Full path of the source file.  NULL if not known.  */
+
+    char *fullname;
+
     /* Information about the object file from which symbols should be read.  */
 
     struct objfile *objfile;
index 4d12c3998ceb388c108ce0232518168364871d28..a5ff55570065ef14f313c9c990c9d506b9d7a1cb 100644 (file)
@@ -2544,3 +2544,15 @@ string_to_core_addr (const char *my_string)
     }
   return addr;
 }
+
+char *
+gdb_realpath (const char *filename)
+{
+#ifdef HAVE_REALPATH
+  char buf[PATH_MAX];
+  char *rp = realpath (filename, buf);
+  return xstrdup (rp ? rp : filename);
+#else
+  return xstrdup (filename);
+#endif
+}