* 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.
This commit is contained in:
Tom Tromey
2001-12-21 22:32:37 +00:00
parent a532ca6282
commit 58d370e0e6
9 changed files with 99 additions and 5 deletions

View 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> 2001-12-21 Michael Snyder <msnyder@redhat.com>
* maint.c (match_substring): New function. Tokenizer for * maint.c (match_substring): New function. Tokenizer for

View File

@ -220,6 +220,9 @@
/* Define if you have the putenv function. */ /* Define if you have the putenv function. */
#undef HAVE_PUTENV #undef HAVE_PUTENV
/* Define if you have the realpath function. */
#undef HAVE_REALPATH
/* Define if you have the sbrk function. */ /* Define if you have the sbrk function. */
#undef HAVE_SBRK #undef HAVE_SBRK

2
gdb/configure vendored
View File

@ -3582,7 +3582,7 @@ EOF
fi 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 sigaction sigprocmask sigsetmask
do do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6

View File

@ -131,7 +131,7 @@ AC_HEADER_STAT
AC_C_CONST 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) sigaction sigprocmask sigsetmask)
AC_FUNC_ALLOCA AC_FUNC_ALLOCA
AC_FUNC_VFORK AC_FUNC_VFORK

View File

@ -575,6 +575,8 @@ extern void init_page_info (void);
extern CORE_ADDR host_pointer_to_address (void *ptr); extern CORE_ADDR host_pointer_to_address (void *ptr);
extern void *address_to_host_pointer (CORE_ADDR addr); extern void *address_to_host_pointer (CORE_ADDR addr);
extern char *gdb_realpath (const char *);
/* From demangle.c */ /* From demangle.c */
extern void set_demangling_style (char *); extern void set_demangling_style (char *);

View File

@ -234,6 +234,7 @@ forget_cached_source_info (void)
{ {
register struct symtab *s; register struct symtab *s;
register struct objfile *objfile; register struct objfile *objfile;
struct partial_symtab *pst;
for (objfile = object_files; objfile != NULL; objfile = objfile->next) for (objfile = object_files; objfile != NULL; objfile = objfile->next)
{ {
@ -250,6 +251,15 @@ forget_cached_source_info (void)
s->fullname = NULL; 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) if (fd < 0)
*filename_opened = NULL; *filename_opened = NULL;
else if (IS_ABSOLUTE_PATH (filename)) else if (IS_ABSOLUTE_PATH (filename))
*filename_opened = savestring (filename, strlen (filename)); *filename_opened = gdb_realpath (filename);
else else
{ {
/* Beware the // my son, the Emacs barfs, the botch that catch... */ /* 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]) IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
? "" : SLASH_STRING, ? "" : SLASH_STRING,
filename, NULL); filename, NULL);
*filename_opened = gdb_realpath (f);
xfree (f);
} }
} }
/* OBSOLETE #ifdef MPW */ /* OBSOLETE #ifdef MPW */

View File

@ -141,14 +141,38 @@ lookup_symtab (const char *name)
register struct symtab *s; register struct symtab *s;
register struct partial_symtab *ps; register struct partial_symtab *ps;
register struct objfile *objfile; 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: got_symtab:
/* First, search for an exact match */ /* First, search for an exact match */
ALL_SYMTABS (objfile, s) ALL_SYMTABS (objfile, s)
{
if (FILENAME_CMP (name, s->filename) == 0) if (FILENAME_CMP (name, s->filename) == 0)
{
xfree (real_path);
return s; 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) */ /* Now, search for a matching tail (only if name doesn't have any dirs) */
@ -195,14 +219,36 @@ lookup_partial_symtab (const char *name)
{ {
register struct partial_symtab *pst; register struct partial_symtab *pst;
register struct objfile *objfile; 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) ALL_PSYMTABS (objfile, pst)
{ {
if (FILENAME_CMP (name, pst->filename) == 0) if (FILENAME_CMP (name, pst->filename) == 0)
{ {
xfree (real_path);
return (pst); 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) */ /* Now, search for a matching tail (only if name doesn't have any dirs) */

View File

@ -967,6 +967,10 @@ struct partial_symtab
char *filename; 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. */ /* Information about the object file from which symbols should be read. */
struct objfile *objfile; struct objfile *objfile;

View File

@ -2544,3 +2544,15 @@ string_to_core_addr (const char *my_string)
} }
return addr; 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
}