* [patchv2 1/11] Remove xfullpath (use gdb_realpath instead)
@ 2013-01-27 22:31 Jan Kratochvil
2013-02-03 15:55 ` [commit] " Jan Kratochvil
2013-07-17 12:49 ` Agovic, Sanimir
0 siblings, 2 replies; 7+ messages in thread
From: Jan Kratochvil @ 2013-01-27 22:31 UTC (permalink / raw)
To: gdb-patches
Hi,
according to Joel:
Re: [patch 0/9] Absolute filenames
http://sourceware.org/ml/gdb-patches/2013-01/msg00421.html
xfullpath can be removed, that is to replace it by gdb_realpath and remove any
double gdb_realpath calls where appropriate.
gdb_realpath is like realpath while xfullpath was not resolving the very last
filename component wrt symlinks.
Thanks,
Jan
gdb/cli/cli-cmds.c | 5 +----
gdb/dwarf2read.c | 31 +++++--------------------------
gdb/psymtab.c | 32 +++++---------------------------
gdb/source.c | 14 ++++----------
gdb/symfile.h | 5 ++---
gdb/symmisc.c | 2 +-
gdb/symtab.c | 43 ++++++-------------------------------------
gdb/symtab.h | 1 -
gdb/testsuite/gdb.gdb/xfullpath.exp | 14 +++++++-------
gdb/utils.c | 47 -----------------------------------------------
gdb/utils.h | 2 --
11 files changed, 31 insertions(+), 165 deletions(-)
^^^
gdb/
2013-01-25 Jan Kratochvil <jan.kratochvil@redhat.com>
Replace xfullpath calls by gdb_realpath calls.
* cli/cli-cmds.c (find_and_open_script): Remove xfullpath from the
function comment.
* dwarf2read.c (dw2_map_expand_apply): Remove parameter full_path.
Remove it from the iterate_over_some_symtabs call.
(dw2_map_symtabs_matching_filename): Remove parameter full_path.
Remove it from the dw2_map_expand_apply calls, remove a block handling
it.
* psymtab.c (partial_map_expand_apply): Remove parameter full_path.
Remove it from the iterate_over_some_symtabs call.
(partial_map_symtabs_matching_filename): Remove parameter full_path.
Remove it from the partial_map_expand_apply calls, remove a block
handling it. Drop gdb_realpath call and cleanups from the real_path
handling.
* source.c (openp): Drop the comment part about xfullpath. Replace
xfullpath calls by gdb_realpath calls.
(find_and_open_source): Replace xfullpath call by gdb_realpath call.
* symfile.h (struct quick_symbol_functions): Remove parameter full_path
from method map_symtabs_matching_filename and its comment.
* symmisc.c (maintenance_print_msymbols): Replace xfullpath call by
gdb_realpath call.
* symtab.c (iterate_over_some_symtabs): Remove parameter full_path,
remove it also from the function comment, remove a block handling it.
Drop gdb_realpath call and cleanups from the real_path handling.
(iterate_over_symtabs): Drop variable full_path and its use.
* symtab.h (iterate_over_some_symtabs): Remove parameter full_path.
* utils.c (xfullpath): Remove.
* utils.h (xfullpath): Remove.
gdb/testsuite/
2013-01-25 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.gdb/xfullpath.exp: Replace xfullpath calls by gdb_realpath calls.
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -465,10 +465,7 @@ show_script_ext_mode (struct ui_file *file, int from_tty,
we tried to open.
If SEARCH_PATH is non-zero, and the file isn't found in cwd,
- search for it in the source search path.
-
- NOTE: This calls openp which uses xfullpath to compute the full path
- instead of gdb_realpath. Symbolic links are not resolved. */
+ search for it in the source search path. */
int
find_and_open_script (const char *script_file, int search_path,
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -3020,8 +3020,7 @@ dw2_forget_cached_source_info (struct objfile *objfile)
static int
dw2_map_expand_apply (struct objfile *objfile,
struct dwarf2_per_cu_data *per_cu,
- const char *name,
- const char *full_path, const char *real_path,
+ const char *name, const char *real_path,
int (*callback) (struct symtab *, void *),
void *data)
{
@@ -3035,7 +3034,7 @@ dw2_map_expand_apply (struct objfile *objfile,
all of them. */
dw2_instantiate_symtab (per_cu);
- return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
+ return iterate_over_some_symtabs (name, real_path, callback, data,
objfile->symtabs, last_made);
}
@@ -3043,7 +3042,7 @@ dw2_map_expand_apply (struct objfile *objfile,
static int
dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
- const char *full_path, const char *real_path,
+ const char *real_path,
int (*callback) (struct symtab *, void *),
void *data)
{
@@ -3077,8 +3076,7 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
if (FILENAME_CMP (name, this_name) == 0
|| (!is_abs && compare_filenames_for_search (this_name, name)))
{
- if (dw2_map_expand_apply (objfile, per_cu,
- name, full_path, real_path,
+ if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
callback, data))
return 1;
}
@@ -3089,24 +3087,6 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
&& FILENAME_CMP (lbasename (this_name), name_basename) != 0)
continue;
- if (full_path != NULL)
- {
- const char *this_real_name = dw2_get_real_path (objfile,
- file_data, j);
-
- if (this_real_name != NULL
- && (FILENAME_CMP (full_path, this_real_name) == 0
- || (!is_abs
- && compare_filenames_for_search (this_real_name,
- name))))
- {
- if (dw2_map_expand_apply (objfile, per_cu,
- name, full_path, real_path,
- callback, data))
- return 1;
- }
- }
-
if (real_path != NULL)
{
const char *this_real_name = dw2_get_real_path (objfile,
@@ -3118,8 +3098,7 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
&& compare_filenames_for_search (this_real_name,
name))))
{
- if (dw2_map_expand_apply (objfile, per_cu,
- name, full_path, real_path,
+ if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
callback, data))
return 1;
}
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -131,7 +131,6 @@ require_partial_symbols (struct objfile *objfile, int verbose)
static int
partial_map_expand_apply (struct objfile *objfile,
const char *name,
- const char *full_path,
const char *real_path,
struct partial_symtab *pst,
int (*callback) (struct symtab *, void *),
@@ -151,7 +150,7 @@ partial_map_expand_apply (struct objfile *objfile,
all of them. */
psymtab_to_symtab (objfile, pst);
- return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
+ return iterate_over_some_symtabs (name, real_path, callback, data,
objfile->symtabs, last_made);
}
@@ -160,7 +159,6 @@ partial_map_expand_apply (struct objfile *objfile,
static int
partial_map_symtabs_matching_filename (struct objfile *objfile,
const char *name,
- const char *full_path,
const char *real_path,
int (*callback) (struct symtab *,
void *),
@@ -184,7 +182,7 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
if (FILENAME_CMP (name, pst->filename) == 0
|| (!is_abs && compare_filenames_for_search (pst->filename, name)))
{
- if (partial_map_expand_apply (objfile, name, full_path, real_path,
+ if (partial_map_expand_apply (objfile, name, real_path,
pst, callback, data))
return 1;
}
@@ -197,34 +195,14 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
/* If the user gave us an absolute path, try to find the file in
this symtab and use its absolute path. */
- if (full_path != NULL)
- {
- psymtab_to_fullname (pst);
- if (pst->fullname != NULL
- && (FILENAME_CMP (full_path, pst->fullname) == 0
- || (!is_abs && compare_filenames_for_search (pst->fullname,
- name))))
- {
- if (partial_map_expand_apply (objfile, name, full_path, real_path,
- pst, callback, data))
- return 1;
- }
- }
-
if (real_path != NULL)
{
- char *rp = NULL;
psymtab_to_fullname (pst);
- if (pst->fullname != NULL)
- {
- rp = gdb_realpath (pst->fullname);
- make_cleanup (xfree, rp);
- }
- if (rp != NULL
- && (FILENAME_CMP (real_path, rp) == 0
+ if (pst->fullname != NULL
+ && (FILENAME_CMP (real_path, pst->fullname) == 0
|| (!is_abs && compare_filenames_for_search (real_path, name))))
{
- if (partial_map_expand_apply (objfile, name, full_path, real_path,
+ if (partial_map_expand_apply (objfile, name, real_path,
pst, callback, data))
return 1;
}
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -825,15 +825,11 @@ openp (const char *path, int opts, const char *string,
done:
if (filename_opened)
{
- /* If a file was opened, canonicalize its filename. Use xfullpath
- rather than gdb_realpath to avoid resolving the basename part
- of filenames when the associated file is a symbolic link. This
- fixes a potential inconsistency between the filenames known to
- GDB and the filenames it prints in the annotations. */
+ /* If a file was opened, canonicalize its filename. */
if (fd < 0)
*filename_opened = NULL;
else if (IS_ABSOLUTE_PATH (filename))
- *filename_opened = xfullpath (filename);
+ *filename_opened = gdb_realpath (filename);
else
{
/* Beware the // my son, the Emacs barfs, the botch that catch... */
@@ -843,7 +839,7 @@ done:
? "" : SLASH_STRING,
filename, (char *)NULL);
- *filename_opened = xfullpath (f);
+ *filename_opened = gdb_realpath (f);
xfree (f);
}
}
@@ -986,9 +982,7 @@ find_and_open_source (const char *filename,
result = open (*fullname, OPEN_MODE);
if (result >= 0)
{
- /* Call xfullpath here to be consistent with openp
- which we use below. */
- char *lpath = xfullpath (*fullname);
+ char *lpath = gdb_realpath (*fullname);
xfree (*fullname);
*fullname = lpath;
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -160,8 +160,8 @@ struct quick_symbol_functions
where the source file is named NAME.
If NAME is not absolute, a match after a '/' in the symbol
- table's file name will also work. FULL_PATH is the absolute file
- name, and REAL_PATH is the same, run through gdb_realpath.
+ table's file name will also work. REAL_PATH is the absolute file
+ name run through gdb_realpath.
If a match is found, the "partial" symbol table is expanded.
Then, this calls iterate_over_some_symtabs (or equivalent) over
@@ -169,7 +169,6 @@ struct quick_symbol_functions
The result of this call is returned. */
int (*map_symtabs_matching_filename) (struct objfile *objfile,
const char *name,
- const char *full_path,
const char *real_path,
int (*callback) (struct symtab *,
void *),
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -655,7 +655,7 @@ maintenance_print_msymbols (char *args, int from_tty)
/* If a second arg is supplied, it is a source file name to match on. */
if (argv[1] != NULL)
{
- symname = xfullpath (argv[1]);
+ symname = gdb_realpath (argv[1]);
make_cleanup (xfree, symname);
if (symname && stat (symname, &sym_st))
perror_with_name (symname);
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -179,7 +179,7 @@ compare_filenames_for_search (const char *filename, const char *search_name)
/* Check for a symtab of a specific name by searching some symtabs.
This is a helper function for callbacks of iterate_over_symtabs.
- The return value, NAME, FULL_PATH, REAL_PATH, CALLBACK, and DATA
+ The return value, NAME, REAL_PATH, CALLBACK, and DATA
are identical to the `map_symtabs_matching_filename' method of
quick_symbol_functions.
@@ -189,7 +189,6 @@ compare_filenames_for_search (const char *filename, const char *search_name)
int
iterate_over_some_symtabs (const char *name,
- const char *full_path,
const char *real_path,
int (*callback) (struct symtab *symtab,
void *data),
@@ -225,47 +224,21 @@ iterate_over_some_symtabs (const char *name,
/* If the user gave us an absolute path, try to find the file in
this symtab and use its absolute path. */
- if (full_path != NULL)
- {
- const char *fp = symtab_to_fullname (s);
-
- if (FILENAME_CMP (full_path, fp) == 0)
- {
- if (callback (s, data))
- return 1;
- }
-
- if (!is_abs && compare_filenames_for_search (fp, name))
- {
- if (callback (s, data))
- return 1;
- }
- }
-
if (real_path != NULL)
{
const char *fullname = symtab_to_fullname (s);
- char *rp = gdb_realpath (fullname);
- struct cleanup *cleanups = make_cleanup (xfree, rp);
- if (FILENAME_CMP (real_path, rp) == 0)
+ if (FILENAME_CMP (real_path, fullname) == 0)
{
if (callback (s, data))
- {
- do_cleanups (cleanups);
- return 1;
- }
+ return 1;
}
- if (!is_abs && compare_filenames_for_search (rp, name))
+ if (!is_abs && compare_filenames_for_search (fullname, name))
{
if (callback (s, data))
- {
- do_cleanups (cleanups);
- return 1;
- }
+ return 1;
}
- do_cleanups (cleanups);
}
}
@@ -288,22 +261,19 @@ iterate_over_symtabs (const char *name,
struct symtab *s = NULL;
struct objfile *objfile;
char *real_path = NULL;
- char *full_path = NULL;
struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
/* Here we are interested in canonicalizing an absolute path, not
absolutizing a relative path. */
if (IS_ABSOLUTE_PATH (name))
{
- full_path = xfullpath (name);
- make_cleanup (xfree, full_path);
real_path = gdb_realpath (name);
make_cleanup (xfree, real_path);
}
ALL_OBJFILES (objfile)
{
- if (iterate_over_some_symtabs (name, full_path, real_path, callback, data,
+ if (iterate_over_some_symtabs (name, real_path, callback, data,
objfile->symtabs, NULL))
{
do_cleanups (cleanups);
@@ -319,7 +289,6 @@ iterate_over_symtabs (const char *name,
if (objfile->sf
&& objfile->sf->qf->map_symtabs_matching_filename (objfile,
name,
- full_path,
real_path,
callback,
data))
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -1284,7 +1284,6 @@ int compare_filenames_for_search (const char *filename,
const char *search_name);
int iterate_over_some_symtabs (const char *name,
- const char *full_path,
const char *real_path,
int (*callback) (struct symtab *symtab,
void *data),
--- a/gdb/testsuite/gdb.gdb/xfullpath.exp
+++ b/gdb/testsuite/gdb.gdb/xfullpath.exp
@@ -103,37 +103,37 @@ proc test_with_self { executable } {
}
# A file which contains a directory prefix
- gdb_test "print xfullpath (\"./xfullpath.exp\")" \
+ gdb_test "print gdb_realpath (\"./xfullpath.exp\")" \
".\[0-9\]+ =.*\".*/xfullpath.exp\"" \
"A filename with ./ as the directory prefix"
# A file which contains a directory prefix
- gdb_test "print xfullpath (\"../../defs.h\")" \
+ gdb_test "print gdb_realpath (\"../../defs.h\")" \
".\[0-9\]+ =.*\".*/defs.h\"" \
"A filename with ../ in the directory prefix"
# A one-character filename
- gdb_test "print xfullpath (\"./a\")" \
+ gdb_test "print gdb_realpath (\"./a\")" \
".\[0-9\]+ =.*\".*/a\"" \
"A one-char filename in the current directory"
# A file in the root directory
- gdb_test "print xfullpath (\"/root_file_which_should_exist\")" \
+ gdb_test "print gdb_realpath (\"/root_file_which_should_exist\")" \
".\[0-9\]+ =.*\"/root_file_which_should_exist\"" \
"A filename in the root directory"
# A file which does not have a directory prefix
- gdb_test "print xfullpath (\"xfullpath.exp\")" \
+ gdb_test "print gdb_realpath (\"xfullpath.exp\")" \
".\[0-9\]+ =.*\"xfullpath.exp\"" \
"A filename without any directory prefix"
# A one-char filename without any directory prefix
- gdb_test "print xfullpath (\"a\")" \
+ gdb_test "print gdb_realpath (\"a\")" \
".\[0-9\]+ =.*\"a\"" \
"A one-char filename without any directory prefix"
# An empty filename
- gdb_test "print xfullpath (\"\")" \
+ gdb_test "print gdb_realpath (\"\")" \
".\[0-9\]+ =.*\"\"" \
"An empty filename"
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -3286,53 +3286,6 @@ gdb_realpath (const char *filename)
return xstrdup (filename);
}
-/* Return a copy of FILENAME, with its directory prefix canonicalized
- by gdb_realpath. */
-
-char *
-xfullpath (const char *filename)
-{
- const char *base_name = lbasename (filename);
- char *dir_name;
- char *real_path;
- char *result;
-
- /* Extract the basename of filename, and return immediately
- a copy of filename if it does not contain any directory prefix. */
- if (base_name == filename)
- return xstrdup (filename);
-
- dir_name = alloca ((size_t) (base_name - filename + 2));
- /* Allocate enough space to store the dir_name + plus one extra
- character sometimes needed under Windows (see below), and
- then the closing \000 character. */
- strncpy (dir_name, filename, base_name - filename);
- dir_name[base_name - filename] = '\000';
-
-#ifdef HAVE_DOS_BASED_FILE_SYSTEM
- /* We need to be careful when filename is of the form 'd:foo', which
- is equivalent of d:./foo, which is totally different from d:/foo. */
- if (strlen (dir_name) == 2 && isalpha (dir_name[0]) && dir_name[1] == ':')
- {
- dir_name[2] = '.';
- dir_name[3] = '\000';
- }
-#endif
-
- /* Canonicalize the directory prefix, and build the resulting
- filename. If the dirname realpath already contains an ending
- directory separator, avoid doubling it. */
- real_path = gdb_realpath (dir_name);
- if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
- result = concat (real_path, base_name, (char *) NULL);
- else
- result = concat (real_path, SLASH_STRING, base_name, (char *) NULL);
-
- xfree (real_path);
- return result;
-}
-
-
/* This is the 32-bit CRC function used by the GNU separate debug
facility. An executable may contain a section named
.gnu_debuglink, which holds the name of a separate executable file
--- a/gdb/utils.h
+++ b/gdb/utils.h
@@ -124,8 +124,6 @@ extern struct cleanup *make_bpstat_clear_actions_cleanup (void);
extern char *gdb_realpath (const char *);
-extern char *xfullpath (const char *);
-
extern int gdb_filename_fnmatch (const char *pattern, const char *string,
int flags);
^ permalink raw reply [flat|nested] 7+ messages in thread
* [commit] [patchv2 1/11] Remove xfullpath (use gdb_realpath instead)
2013-01-27 22:31 [patchv2 1/11] Remove xfullpath (use gdb_realpath instead) Jan Kratochvil
@ 2013-02-03 15:55 ` Jan Kratochvil
2013-07-17 12:49 ` Agovic, Sanimir
1 sibling, 0 replies; 7+ messages in thread
From: Jan Kratochvil @ 2013-02-03 15:55 UTC (permalink / raw)
To: gdb-patches
On Sun, 27 Jan 2013 23:31:35 +0100, Jan Kratochvil wrote:
> gdb/
> 2013-01-25 Jan Kratochvil <jan.kratochvil@redhat.com>
>
> Replace xfullpath calls by gdb_realpath calls.
> * cli/cli-cmds.c (find_and_open_script): Remove xfullpath from the
> function comment.
> * dwarf2read.c (dw2_map_expand_apply): Remove parameter full_path.
> Remove it from the iterate_over_some_symtabs call.
> (dw2_map_symtabs_matching_filename): Remove parameter full_path.
> Remove it from the dw2_map_expand_apply calls, remove a block handling
> it.
> * psymtab.c (partial_map_expand_apply): Remove parameter full_path.
> Remove it from the iterate_over_some_symtabs call.
> (partial_map_symtabs_matching_filename): Remove parameter full_path.
> Remove it from the partial_map_expand_apply calls, remove a block
> handling it. Drop gdb_realpath call and cleanups from the real_path
> handling.
> * source.c (openp): Drop the comment part about xfullpath. Replace
> xfullpath calls by gdb_realpath calls.
> (find_and_open_source): Replace xfullpath call by gdb_realpath call.
> * symfile.h (struct quick_symbol_functions): Remove parameter full_path
> from method map_symtabs_matching_filename and its comment.
> * symmisc.c (maintenance_print_msymbols): Replace xfullpath call by
> gdb_realpath call.
> * symtab.c (iterate_over_some_symtabs): Remove parameter full_path,
> remove it also from the function comment, remove a block handling it.
> Drop gdb_realpath call and cleanups from the real_path handling.
> (iterate_over_symtabs): Drop variable full_path and its use.
> * symtab.h (iterate_over_some_symtabs): Remove parameter full_path.
> * utils.c (xfullpath): Remove.
> * utils.h (xfullpath): Remove.
>
> gdb/testsuite/
> 2013-01-25 Jan Kratochvil <jan.kratochvil@redhat.com>
>
> * gdb.gdb/xfullpath.exp: Replace xfullpath calls by gdb_realpath calls.
Checked in:
http://sourceware.org/ml/gdb-cvs/2013-02/msg00015.html
Jan
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [patchv2 1/11] Remove xfullpath (use gdb_realpath instead)
2013-01-27 22:31 [patchv2 1/11] Remove xfullpath (use gdb_realpath instead) Jan Kratochvil
2013-02-03 15:55 ` [commit] " Jan Kratochvil
@ 2013-07-17 12:49 ` Agovic, Sanimir
2013-07-17 16:04 ` Doug Evans
1 sibling, 1 reply; 7+ messages in thread
From: Agovic, Sanimir @ 2013-07-17 12:49 UTC (permalink / raw)
To: 'Jan Kratochvil'; +Cc: gdb-patches
Hello Jan,
seems like this patch introduced a regression as pointed out on IRC. It is tracked via http://sourceware.org/bugzilla/show_bug.cgi?id=15415
Could you please have a look? Thanks.
-Sanimir
> -----Original Message-----
> From: gdb-patches-owner@sourceware.org [mailto:gdb-patches-owner@sourceware.org] On Behalf
> Of Jan Kratochvil
> Sent: Sunday, January 27, 2013 11:32 PM
> To: gdb-patches@sourceware.org
> Subject: [patchv2 1/11] Remove xfullpath (use gdb_realpath instead)
>
> Hi,
>
> according to Joel:
> Re: [patch 0/9] Absolute filenames
> http://sourceware.org/ml/gdb-patches/2013-01/msg00421.html
>
> xfullpath can be removed, that is to replace it by gdb_realpath and remove any
> double gdb_realpath calls where appropriate.
>
> gdb_realpath is like realpath while xfullpath was not resolving the very last
> filename component wrt symlinks.
>
>
> Thanks,
> Jan
>
>
> gdb/cli/cli-cmds.c | 5 +----
> gdb/dwarf2read.c | 31 +++++--------------------------
> gdb/psymtab.c | 32 +++++---------------------------
> gdb/source.c | 14 ++++----------
> gdb/symfile.h | 5 ++---
> gdb/symmisc.c | 2 +-
> gdb/symtab.c | 43 ++++++-------------------------------------
> gdb/symtab.h | 1 -
> gdb/testsuite/gdb.gdb/xfullpath.exp | 14 +++++++-------
> gdb/utils.c | 47 -----------------------------------------------
> gdb/utils.h | 2 --
> 11 files changed, 31 insertions(+), 165 deletions(-)
> ^^^
>
> gdb/
> 2013-01-25 Jan Kratochvil <jan.kratochvil@redhat.com>
>
> Replace xfullpath calls by gdb_realpath calls.
> * cli/cli-cmds.c (find_and_open_script): Remove xfullpath from the
> function comment.
> * dwarf2read.c (dw2_map_expand_apply): Remove parameter full_path.
> Remove it from the iterate_over_some_symtabs call.
> (dw2_map_symtabs_matching_filename): Remove parameter full_path.
> Remove it from the dw2_map_expand_apply calls, remove a block handling
> it.
> * psymtab.c (partial_map_expand_apply): Remove parameter full_path.
> Remove it from the iterate_over_some_symtabs call.
> (partial_map_symtabs_matching_filename): Remove parameter full_path.
> Remove it from the partial_map_expand_apply calls, remove a block
> handling it. Drop gdb_realpath call and cleanups from the real_path
> handling.
> * source.c (openp): Drop the comment part about xfullpath. Replace
> xfullpath calls by gdb_realpath calls.
> (find_and_open_source): Replace xfullpath call by gdb_realpath call.
> * symfile.h (struct quick_symbol_functions): Remove parameter full_path
> from method map_symtabs_matching_filename and its comment.
> * symmisc.c (maintenance_print_msymbols): Replace xfullpath call by
> gdb_realpath call.
> * symtab.c (iterate_over_some_symtabs): Remove parameter full_path,
> remove it also from the function comment, remove a block handling it.
> Drop gdb_realpath call and cleanups from the real_path handling.
> (iterate_over_symtabs): Drop variable full_path and its use.
> * symtab.h (iterate_over_some_symtabs): Remove parameter full_path.
> * utils.c (xfullpath): Remove.
> * utils.h (xfullpath): Remove.
>
> gdb/testsuite/
> 2013-01-25 Jan Kratochvil <jan.kratochvil@redhat.com>
>
> * gdb.gdb/xfullpath.exp: Replace xfullpath calls by gdb_realpath calls.
>
> --- a/gdb/cli/cli-cmds.c
> +++ b/gdb/cli/cli-cmds.c
> @@ -465,10 +465,7 @@ show_script_ext_mode (struct ui_file *file, int from_tty,
> we tried to open.
>
> If SEARCH_PATH is non-zero, and the file isn't found in cwd,
> - search for it in the source search path.
> -
> - NOTE: This calls openp which uses xfullpath to compute the full path
> - instead of gdb_realpath. Symbolic links are not resolved. */
> + search for it in the source search path. */
>
> int
> find_and_open_script (const char *script_file, int search_path,
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
> @@ -3020,8 +3020,7 @@ dw2_forget_cached_source_info (struct objfile *objfile)
> static int
> dw2_map_expand_apply (struct objfile *objfile,
> struct dwarf2_per_cu_data *per_cu,
> - const char *name,
> - const char *full_path, const char *real_path,
> + const char *name, const char *real_path,
> int (*callback) (struct symtab *, void *),
> void *data)
> {
> @@ -3035,7 +3034,7 @@ dw2_map_expand_apply (struct objfile *objfile,
> all of them. */
> dw2_instantiate_symtab (per_cu);
>
> - return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
> + return iterate_over_some_symtabs (name, real_path, callback, data,
> objfile->symtabs, last_made);
> }
>
> @@ -3043,7 +3042,7 @@ dw2_map_expand_apply (struct objfile *objfile,
>
> static int
> dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
> - const char *full_path, const char *real_path,
> + const char *real_path,
> int (*callback) (struct symtab *, void *),
> void *data)
> {
> @@ -3077,8 +3076,7 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const
> char *name,
> if (FILENAME_CMP (name, this_name) == 0
> || (!is_abs && compare_filenames_for_search (this_name, name)))
> {
> - if (dw2_map_expand_apply (objfile, per_cu,
> - name, full_path, real_path,
> + if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
> callback, data))
> return 1;
> }
> @@ -3089,24 +3087,6 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const
> char *name,
> && FILENAME_CMP (lbasename (this_name), name_basename) != 0)
> continue;
>
> - if (full_path != NULL)
> - {
> - const char *this_real_name = dw2_get_real_path (objfile,
> - file_data, j);
> -
> - if (this_real_name != NULL
> - && (FILENAME_CMP (full_path, this_real_name) == 0
> - || (!is_abs
> - && compare_filenames_for_search (this_real_name,
> - name))))
> - {
> - if (dw2_map_expand_apply (objfile, per_cu,
> - name, full_path, real_path,
> - callback, data))
> - return 1;
> - }
> - }
> -
> if (real_path != NULL)
> {
> const char *this_real_name = dw2_get_real_path (objfile,
> @@ -3118,8 +3098,7 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const
> char *name,
> && compare_filenames_for_search (this_real_name,
> name))))
> {
> - if (dw2_map_expand_apply (objfile, per_cu,
> - name, full_path, real_path,
> + if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
> callback, data))
> return 1;
> }
> --- a/gdb/psymtab.c
> +++ b/gdb/psymtab.c
> @@ -131,7 +131,6 @@ require_partial_symbols (struct objfile *objfile, int verbose)
> static int
> partial_map_expand_apply (struct objfile *objfile,
> const char *name,
> - const char *full_path,
> const char *real_path,
> struct partial_symtab *pst,
> int (*callback) (struct symtab *, void *),
> @@ -151,7 +150,7 @@ partial_map_expand_apply (struct objfile *objfile,
> all of them. */
> psymtab_to_symtab (objfile, pst);
>
> - return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
> + return iterate_over_some_symtabs (name, real_path, callback, data,
> objfile->symtabs, last_made);
> }
>
> @@ -160,7 +159,6 @@ partial_map_expand_apply (struct objfile *objfile,
> static int
> partial_map_symtabs_matching_filename (struct objfile *objfile,
> const char *name,
> - const char *full_path,
> const char *real_path,
> int (*callback) (struct symtab *,
> void *),
> @@ -184,7 +182,7 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
> if (FILENAME_CMP (name, pst->filename) == 0
> || (!is_abs && compare_filenames_for_search (pst->filename, name)))
> {
> - if (partial_map_expand_apply (objfile, name, full_path, real_path,
> + if (partial_map_expand_apply (objfile, name, real_path,
> pst, callback, data))
> return 1;
> }
> @@ -197,34 +195,14 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
>
> /* If the user gave us an absolute path, try to find the file in
> this symtab and use its absolute path. */
> - if (full_path != NULL)
> - {
> - psymtab_to_fullname (pst);
> - if (pst->fullname != NULL
> - && (FILENAME_CMP (full_path, pst->fullname) == 0
> - || (!is_abs && compare_filenames_for_search (pst->fullname,
> - name))))
> - {
> - if (partial_map_expand_apply (objfile, name, full_path, real_path,
> - pst, callback, data))
> - return 1;
> - }
> - }
> -
> if (real_path != NULL)
> {
> - char *rp = NULL;
> psymtab_to_fullname (pst);
> - if (pst->fullname != NULL)
> - {
> - rp = gdb_realpath (pst->fullname);
> - make_cleanup (xfree, rp);
> - }
> - if (rp != NULL
> - && (FILENAME_CMP (real_path, rp) == 0
> + if (pst->fullname != NULL
> + && (FILENAME_CMP (real_path, pst->fullname) == 0
> || (!is_abs && compare_filenames_for_search (real_path, name))))
> {
> - if (partial_map_expand_apply (objfile, name, full_path, real_path,
> + if (partial_map_expand_apply (objfile, name, real_path,
> pst, callback, data))
> return 1;
> }
> --- a/gdb/source.c
> +++ b/gdb/source.c
> @@ -825,15 +825,11 @@ openp (const char *path, int opts, const char *string,
> done:
> if (filename_opened)
> {
> - /* If a file was opened, canonicalize its filename. Use xfullpath
> - rather than gdb_realpath to avoid resolving the basename part
> - of filenames when the associated file is a symbolic link. This
> - fixes a potential inconsistency between the filenames known to
> - GDB and the filenames it prints in the annotations. */
> + /* If a file was opened, canonicalize its filename. */
> if (fd < 0)
> *filename_opened = NULL;
> else if (IS_ABSOLUTE_PATH (filename))
> - *filename_opened = xfullpath (filename);
> + *filename_opened = gdb_realpath (filename);
> else
> {
> /* Beware the // my son, the Emacs barfs, the botch that catch... */
> @@ -843,7 +839,7 @@ done:
> ? "" : SLASH_STRING,
> filename, (char *)NULL);
>
> - *filename_opened = xfullpath (f);
> + *filename_opened = gdb_realpath (f);
> xfree (f);
> }
> }
> @@ -986,9 +982,7 @@ find_and_open_source (const char *filename,
> result = open (*fullname, OPEN_MODE);
> if (result >= 0)
> {
> - /* Call xfullpath here to be consistent with openp
> - which we use below. */
> - char *lpath = xfullpath (*fullname);
> + char *lpath = gdb_realpath (*fullname);
>
> xfree (*fullname);
> *fullname = lpath;
> --- a/gdb/symfile.h
> +++ b/gdb/symfile.h
> @@ -160,8 +160,8 @@ struct quick_symbol_functions
> where the source file is named NAME.
>
> If NAME is not absolute, a match after a '/' in the symbol
> - table's file name will also work. FULL_PATH is the absolute file
> - name, and REAL_PATH is the same, run through gdb_realpath.
> + table's file name will also work. REAL_PATH is the absolute file
> + name run through gdb_realpath.
>
> If a match is found, the "partial" symbol table is expanded.
> Then, this calls iterate_over_some_symtabs (or equivalent) over
> @@ -169,7 +169,6 @@ struct quick_symbol_functions
> The result of this call is returned. */
> int (*map_symtabs_matching_filename) (struct objfile *objfile,
> const char *name,
> - const char *full_path,
> const char *real_path,
> int (*callback) (struct symtab *,
> void *),
> --- a/gdb/symmisc.c
> +++ b/gdb/symmisc.c
> @@ -655,7 +655,7 @@ maintenance_print_msymbols (char *args, int from_tty)
> /* If a second arg is supplied, it is a source file name to match on. */
> if (argv[1] != NULL)
> {
> - symname = xfullpath (argv[1]);
> + symname = gdb_realpath (argv[1]);
> make_cleanup (xfree, symname);
> if (symname && stat (symname, &sym_st))
> perror_with_name (symname);
> --- a/gdb/symtab.c
> +++ b/gdb/symtab.c
> @@ -179,7 +179,7 @@ compare_filenames_for_search (const char *filename, const char
> *search_name)
> /* Check for a symtab of a specific name by searching some symtabs.
> This is a helper function for callbacks of iterate_over_symtabs.
>
> - The return value, NAME, FULL_PATH, REAL_PATH, CALLBACK, and DATA
> + The return value, NAME, REAL_PATH, CALLBACK, and DATA
> are identical to the `map_symtabs_matching_filename' method of
> quick_symbol_functions.
>
> @@ -189,7 +189,6 @@ compare_filenames_for_search (const char *filename, const char
> *search_name)
>
> int
> iterate_over_some_symtabs (const char *name,
> - const char *full_path,
> const char *real_path,
> int (*callback) (struct symtab *symtab,
> void *data),
> @@ -225,47 +224,21 @@ iterate_over_some_symtabs (const char *name,
> /* If the user gave us an absolute path, try to find the file in
> this symtab and use its absolute path. */
>
> - if (full_path != NULL)
> - {
> - const char *fp = symtab_to_fullname (s);
> -
> - if (FILENAME_CMP (full_path, fp) == 0)
> - {
> - if (callback (s, data))
> - return 1;
> - }
> -
> - if (!is_abs && compare_filenames_for_search (fp, name))
> - {
> - if (callback (s, data))
> - return 1;
> - }
> - }
> -
> if (real_path != NULL)
> {
> const char *fullname = symtab_to_fullname (s);
> - char *rp = gdb_realpath (fullname);
> - struct cleanup *cleanups = make_cleanup (xfree, rp);
>
> - if (FILENAME_CMP (real_path, rp) == 0)
> + if (FILENAME_CMP (real_path, fullname) == 0)
> {
> if (callback (s, data))
> - {
> - do_cleanups (cleanups);
> - return 1;
> - }
> + return 1;
> }
>
> - if (!is_abs && compare_filenames_for_search (rp, name))
> + if (!is_abs && compare_filenames_for_search (fullname, name))
> {
> if (callback (s, data))
> - {
> - do_cleanups (cleanups);
> - return 1;
> - }
> + return 1;
> }
> - do_cleanups (cleanups);
> }
> }
>
> @@ -288,22 +261,19 @@ iterate_over_symtabs (const char *name,
> struct symtab *s = NULL;
> struct objfile *objfile;
> char *real_path = NULL;
> - char *full_path = NULL;
> struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
>
> /* Here we are interested in canonicalizing an absolute path, not
> absolutizing a relative path. */
> if (IS_ABSOLUTE_PATH (name))
> {
> - full_path = xfullpath (name);
> - make_cleanup (xfree, full_path);
> real_path = gdb_realpath (name);
> make_cleanup (xfree, real_path);
> }
>
> ALL_OBJFILES (objfile)
> {
> - if (iterate_over_some_symtabs (name, full_path, real_path, callback, data,
> + if (iterate_over_some_symtabs (name, real_path, callback, data,
> objfile->symtabs, NULL))
> {
> do_cleanups (cleanups);
> @@ -319,7 +289,6 @@ iterate_over_symtabs (const char *name,
> if (objfile->sf
> && objfile->sf->qf->map_symtabs_matching_filename (objfile,
> name,
> - full_path,
> real_path,
> callback,
> data))
> --- a/gdb/symtab.h
> +++ b/gdb/symtab.h
> @@ -1284,7 +1284,6 @@ int compare_filenames_for_search (const char *filename,
> const char *search_name);
>
> int iterate_over_some_symtabs (const char *name,
> - const char *full_path,
> const char *real_path,
> int (*callback) (struct symtab *symtab,
> void *data),
> --- a/gdb/testsuite/gdb.gdb/xfullpath.exp
> +++ b/gdb/testsuite/gdb.gdb/xfullpath.exp
> @@ -103,37 +103,37 @@ proc test_with_self { executable } {
> }
>
> # A file which contains a directory prefix
> - gdb_test "print xfullpath (\"./xfullpath.exp\")" \
> + gdb_test "print gdb_realpath (\"./xfullpath.exp\")" \
> ".\[0-9\]+ =.*\".*/xfullpath.exp\"" \
> "A filename with ./ as the directory prefix"
>
> # A file which contains a directory prefix
> - gdb_test "print xfullpath (\"../../defs.h\")" \
> + gdb_test "print gdb_realpath (\"../../defs.h\")" \
> ".\[0-9\]+ =.*\".*/defs.h\"" \
> "A filename with ../ in the directory prefix"
>
> # A one-character filename
> - gdb_test "print xfullpath (\"./a\")" \
> + gdb_test "print gdb_realpath (\"./a\")" \
> ".\[0-9\]+ =.*\".*/a\"" \
> "A one-char filename in the current directory"
>
> # A file in the root directory
> - gdb_test "print xfullpath (\"/root_file_which_should_exist\")" \
> + gdb_test "print gdb_realpath (\"/root_file_which_should_exist\")" \
> ".\[0-9\]+ =.*\"/root_file_which_should_exist\"" \
> "A filename in the root directory"
>
> # A file which does not have a directory prefix
> - gdb_test "print xfullpath (\"xfullpath.exp\")" \
> + gdb_test "print gdb_realpath (\"xfullpath.exp\")" \
> ".\[0-9\]+ =.*\"xfullpath.exp\"" \
> "A filename without any directory prefix"
>
> # A one-char filename without any directory prefix
> - gdb_test "print xfullpath (\"a\")" \
> + gdb_test "print gdb_realpath (\"a\")" \
> ".\[0-9\]+ =.*\"a\"" \
> "A one-char filename without any directory prefix"
>
> # An empty filename
> - gdb_test "print xfullpath (\"\")" \
> + gdb_test "print gdb_realpath (\"\")" \
> ".\[0-9\]+ =.*\"\"" \
> "An empty filename"
>
> --- a/gdb/utils.c
> +++ b/gdb/utils.c
> @@ -3286,53 +3286,6 @@ gdb_realpath (const char *filename)
> return xstrdup (filename);
> }
>
> -/* Return a copy of FILENAME, with its directory prefix canonicalized
> - by gdb_realpath. */
> -
> -char *
> -xfullpath (const char *filename)
> -{
> - const char *base_name = lbasename (filename);
> - char *dir_name;
> - char *real_path;
> - char *result;
> -
> - /* Extract the basename of filename, and return immediately
> - a copy of filename if it does not contain any directory prefix. */
> - if (base_name == filename)
> - return xstrdup (filename);
> -
> - dir_name = alloca ((size_t) (base_name - filename + 2));
> - /* Allocate enough space to store the dir_name + plus one extra
> - character sometimes needed under Windows (see below), and
> - then the closing \000 character. */
> - strncpy (dir_name, filename, base_name - filename);
> - dir_name[base_name - filename] = '\000';
> -
> -#ifdef HAVE_DOS_BASED_FILE_SYSTEM
> - /* We need to be careful when filename is of the form 'd:foo', which
> - is equivalent of d:./foo, which is totally different from d:/foo. */
> - if (strlen (dir_name) == 2 && isalpha (dir_name[0]) && dir_name[1] == ':')
> - {
> - dir_name[2] = '.';
> - dir_name[3] = '\000';
> - }
> -#endif
> -
> - /* Canonicalize the directory prefix, and build the resulting
> - filename. If the dirname realpath already contains an ending
> - directory separator, avoid doubling it. */
> - real_path = gdb_realpath (dir_name);
> - if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
> - result = concat (real_path, base_name, (char *) NULL);
> - else
> - result = concat (real_path, SLASH_STRING, base_name, (char *) NULL);
> -
> - xfree (real_path);
> - return result;
> -}
> -
> -
> /* This is the 32-bit CRC function used by the GNU separate debug
> facility. An executable may contain a section named
> .gnu_debuglink, which holds the name of a separate executable file
> --- a/gdb/utils.h
> +++ b/gdb/utils.h
> @@ -124,8 +124,6 @@ extern struct cleanup *make_bpstat_clear_actions_cleanup (void);
>
> extern char *gdb_realpath (const char *);
>
> -extern char *xfullpath (const char *);
> -
> extern int gdb_filename_fnmatch (const char *pattern, const char *string,
> int flags);
>
Intel GmbH
Dornacher Strasse 1
85622 Feldkirchen/Muenchen, Deutschland
Sitz der Gesellschaft: Feldkirchen bei Muenchen
Geschaeftsfuehrer: Christian Lamprechter, Hannes Schwaderer, Douglas Lusk
Registergericht: Muenchen HRB 47456
Ust.-IdNr./VAT Registration No.: DE129385895
Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patchv2 1/11] Remove xfullpath (use gdb_realpath instead)
2013-07-17 12:49 ` Agovic, Sanimir
@ 2013-07-17 16:04 ` Doug Evans
2013-07-17 16:13 ` Doug Evans
0 siblings, 1 reply; 7+ messages in thread
From: Doug Evans @ 2013-07-17 16:04 UTC (permalink / raw)
To: Agovic, Sanimir
Cc: Jan Kratochvil, gdb-patches, Cary Coutant, Sterling Augustine
Fully replacing symlinks also breaks Fission cases where we expect to
find ${binary}.dwp.
One thought was to record *both* the original potentially symlink'd
version of the path, and the "realpath", for each objfile. It's extra
complexity, but there is a real problem here. OTOH, a good question
to ask first is "Why does gdb record the realpath at all?" [That's not
a rhetorical question - maybe there's a reason - I actually don't
know.]
On Wed, Jul 17, 2013 at 5:49 AM, Agovic, Sanimir
<sanimir.agovic@intel.com> wrote:
> Hello Jan,
>
> seems like this patch introduced a regression as pointed out on IRC. It is tracked via http://sourceware.org/bugzilla/show_bug.cgi?id=15415
>
> Could you please have a look? Thanks.
>
> -Sanimir
>
>> -----Original Message-----
>> From: gdb-patches-owner@sourceware.org [mailto:gdb-patches-owner@sourceware.org] On Behalf
>> Of Jan Kratochvil
>> Sent: Sunday, January 27, 2013 11:32 PM
>> To: gdb-patches@sourceware.org
>> Subject: [patchv2 1/11] Remove xfullpath (use gdb_realpath instead)
>>
>> Hi,
>>
>> according to Joel:
>> Re: [patch 0/9] Absolute filenames
>> http://sourceware.org/ml/gdb-patches/2013-01/msg00421.html
>>
>> xfullpath can be removed, that is to replace it by gdb_realpath and remove any
>> double gdb_realpath calls where appropriate.
>>
>> gdb_realpath is like realpath while xfullpath was not resolving the very last
>> filename component wrt symlinks.
>>
>>
>> Thanks,
>> Jan
>>
>>
>> gdb/cli/cli-cmds.c | 5 +----
>> gdb/dwarf2read.c | 31 +++++--------------------------
>> gdb/psymtab.c | 32 +++++---------------------------
>> gdb/source.c | 14 ++++----------
>> gdb/symfile.h | 5 ++---
>> gdb/symmisc.c | 2 +-
>> gdb/symtab.c | 43 ++++++-------------------------------------
>> gdb/symtab.h | 1 -
>> gdb/testsuite/gdb.gdb/xfullpath.exp | 14 +++++++-------
>> gdb/utils.c | 47 -----------------------------------------------
>> gdb/utils.h | 2 --
>> 11 files changed, 31 insertions(+), 165 deletions(-)
>> ^^^
>>
>> gdb/
>> 2013-01-25 Jan Kratochvil <jan.kratochvil@redhat.com>
>>
>> Replace xfullpath calls by gdb_realpath calls.
>> * cli/cli-cmds.c (find_and_open_script): Remove xfullpath from the
>> function comment.
>> * dwarf2read.c (dw2_map_expand_apply): Remove parameter full_path.
>> Remove it from the iterate_over_some_symtabs call.
>> (dw2_map_symtabs_matching_filename): Remove parameter full_path.
>> Remove it from the dw2_map_expand_apply calls, remove a block handling
>> it.
>> * psymtab.c (partial_map_expand_apply): Remove parameter full_path.
>> Remove it from the iterate_over_some_symtabs call.
>> (partial_map_symtabs_matching_filename): Remove parameter full_path.
>> Remove it from the partial_map_expand_apply calls, remove a block
>> handling it. Drop gdb_realpath call and cleanups from the real_path
>> handling.
>> * source.c (openp): Drop the comment part about xfullpath. Replace
>> xfullpath calls by gdb_realpath calls.
>> (find_and_open_source): Replace xfullpath call by gdb_realpath call.
>> * symfile.h (struct quick_symbol_functions): Remove parameter full_path
>> from method map_symtabs_matching_filename and its comment.
>> * symmisc.c (maintenance_print_msymbols): Replace xfullpath call by
>> gdb_realpath call.
>> * symtab.c (iterate_over_some_symtabs): Remove parameter full_path,
>> remove it also from the function comment, remove a block handling it.
>> Drop gdb_realpath call and cleanups from the real_path handling.
>> (iterate_over_symtabs): Drop variable full_path and its use.
>> * symtab.h (iterate_over_some_symtabs): Remove parameter full_path.
>> * utils.c (xfullpath): Remove.
>> * utils.h (xfullpath): Remove.
>>
>> gdb/testsuite/
>> 2013-01-25 Jan Kratochvil <jan.kratochvil@redhat.com>
>>
>> * gdb.gdb/xfullpath.exp: Replace xfullpath calls by gdb_realpath calls.
>>
>> --- a/gdb/cli/cli-cmds.c
>> +++ b/gdb/cli/cli-cmds.c
>> @@ -465,10 +465,7 @@ show_script_ext_mode (struct ui_file *file, int from_tty,
>> we tried to open.
>>
>> If SEARCH_PATH is non-zero, and the file isn't found in cwd,
>> - search for it in the source search path.
>> -
>> - NOTE: This calls openp which uses xfullpath to compute the full path
>> - instead of gdb_realpath. Symbolic links are not resolved. */
>> + search for it in the source search path. */
>>
>> int
>> find_and_open_script (const char *script_file, int search_path,
>> --- a/gdb/dwarf2read.c
>> +++ b/gdb/dwarf2read.c
>> @@ -3020,8 +3020,7 @@ dw2_forget_cached_source_info (struct objfile *objfile)
>> static int
>> dw2_map_expand_apply (struct objfile *objfile,
>> struct dwarf2_per_cu_data *per_cu,
>> - const char *name,
>> - const char *full_path, const char *real_path,
>> + const char *name, const char *real_path,
>> int (*callback) (struct symtab *, void *),
>> void *data)
>> {
>> @@ -3035,7 +3034,7 @@ dw2_map_expand_apply (struct objfile *objfile,
>> all of them. */
>> dw2_instantiate_symtab (per_cu);
>>
>> - return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
>> + return iterate_over_some_symtabs (name, real_path, callback, data,
>> objfile->symtabs, last_made);
>> }
>>
>> @@ -3043,7 +3042,7 @@ dw2_map_expand_apply (struct objfile *objfile,
>>
>> static int
>> dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
>> - const char *full_path, const char *real_path,
>> + const char *real_path,
>> int (*callback) (struct symtab *, void *),
>> void *data)
>> {
>> @@ -3077,8 +3076,7 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const
>> char *name,
>> if (FILENAME_CMP (name, this_name) == 0
>> || (!is_abs && compare_filenames_for_search (this_name, name)))
>> {
>> - if (dw2_map_expand_apply (objfile, per_cu,
>> - name, full_path, real_path,
>> + if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
>> callback, data))
>> return 1;
>> }
>> @@ -3089,24 +3087,6 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const
>> char *name,
>> && FILENAME_CMP (lbasename (this_name), name_basename) != 0)
>> continue;
>>
>> - if (full_path != NULL)
>> - {
>> - const char *this_real_name = dw2_get_real_path (objfile,
>> - file_data, j);
>> -
>> - if (this_real_name != NULL
>> - && (FILENAME_CMP (full_path, this_real_name) == 0
>> - || (!is_abs
>> - && compare_filenames_for_search (this_real_name,
>> - name))))
>> - {
>> - if (dw2_map_expand_apply (objfile, per_cu,
>> - name, full_path, real_path,
>> - callback, data))
>> - return 1;
>> - }
>> - }
>> -
>> if (real_path != NULL)
>> {
>> const char *this_real_name = dw2_get_real_path (objfile,
>> @@ -3118,8 +3098,7 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const
>> char *name,
>> && compare_filenames_for_search (this_real_name,
>> name))))
>> {
>> - if (dw2_map_expand_apply (objfile, per_cu,
>> - name, full_path, real_path,
>> + if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
>> callback, data))
>> return 1;
>> }
>> --- a/gdb/psymtab.c
>> +++ b/gdb/psymtab.c
>> @@ -131,7 +131,6 @@ require_partial_symbols (struct objfile *objfile, int verbose)
>> static int
>> partial_map_expand_apply (struct objfile *objfile,
>> const char *name,
>> - const char *full_path,
>> const char *real_path,
>> struct partial_symtab *pst,
>> int (*callback) (struct symtab *, void *),
>> @@ -151,7 +150,7 @@ partial_map_expand_apply (struct objfile *objfile,
>> all of them. */
>> psymtab_to_symtab (objfile, pst);
>>
>> - return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
>> + return iterate_over_some_symtabs (name, real_path, callback, data,
>> objfile->symtabs, last_made);
>> }
>>
>> @@ -160,7 +159,6 @@ partial_map_expand_apply (struct objfile *objfile,
>> static int
>> partial_map_symtabs_matching_filename (struct objfile *objfile,
>> const char *name,
>> - const char *full_path,
>> const char *real_path,
>> int (*callback) (struct symtab *,
>> void *),
>> @@ -184,7 +182,7 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
>> if (FILENAME_CMP (name, pst->filename) == 0
>> || (!is_abs && compare_filenames_for_search (pst->filename, name)))
>> {
>> - if (partial_map_expand_apply (objfile, name, full_path, real_path,
>> + if (partial_map_expand_apply (objfile, name, real_path,
>> pst, callback, data))
>> return 1;
>> }
>> @@ -197,34 +195,14 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
>>
>> /* If the user gave us an absolute path, try to find the file in
>> this symtab and use its absolute path. */
>> - if (full_path != NULL)
>> - {
>> - psymtab_to_fullname (pst);
>> - if (pst->fullname != NULL
>> - && (FILENAME_CMP (full_path, pst->fullname) == 0
>> - || (!is_abs && compare_filenames_for_search (pst->fullname,
>> - name))))
>> - {
>> - if (partial_map_expand_apply (objfile, name, full_path, real_path,
>> - pst, callback, data))
>> - return 1;
>> - }
>> - }
>> -
>> if (real_path != NULL)
>> {
>> - char *rp = NULL;
>> psymtab_to_fullname (pst);
>> - if (pst->fullname != NULL)
>> - {
>> - rp = gdb_realpath (pst->fullname);
>> - make_cleanup (xfree, rp);
>> - }
>> - if (rp != NULL
>> - && (FILENAME_CMP (real_path, rp) == 0
>> + if (pst->fullname != NULL
>> + && (FILENAME_CMP (real_path, pst->fullname) == 0
>> || (!is_abs && compare_filenames_for_search (real_path, name))))
>> {
>> - if (partial_map_expand_apply (objfile, name, full_path, real_path,
>> + if (partial_map_expand_apply (objfile, name, real_path,
>> pst, callback, data))
>> return 1;
>> }
>> --- a/gdb/source.c
>> +++ b/gdb/source.c
>> @@ -825,15 +825,11 @@ openp (const char *path, int opts, const char *string,
>> done:
>> if (filename_opened)
>> {
>> - /* If a file was opened, canonicalize its filename. Use xfullpath
>> - rather than gdb_realpath to avoid resolving the basename part
>> - of filenames when the associated file is a symbolic link. This
>> - fixes a potential inconsistency between the filenames known to
>> - GDB and the filenames it prints in the annotations. */
>> + /* If a file was opened, canonicalize its filename. */
>> if (fd < 0)
>> *filename_opened = NULL;
>> else if (IS_ABSOLUTE_PATH (filename))
>> - *filename_opened = xfullpath (filename);
>> + *filename_opened = gdb_realpath (filename);
>> else
>> {
>> /* Beware the // my son, the Emacs barfs, the botch that catch... */
>> @@ -843,7 +839,7 @@ done:
>> ? "" : SLASH_STRING,
>> filename, (char *)NULL);
>>
>> - *filename_opened = xfullpath (f);
>> + *filename_opened = gdb_realpath (f);
>> xfree (f);
>> }
>> }
>> @@ -986,9 +982,7 @@ find_and_open_source (const char *filename,
>> result = open (*fullname, OPEN_MODE);
>> if (result >= 0)
>> {
>> - /* Call xfullpath here to be consistent with openp
>> - which we use below. */
>> - char *lpath = xfullpath (*fullname);
>> + char *lpath = gdb_realpath (*fullname);
>>
>> xfree (*fullname);
>> *fullname = lpath;
>> --- a/gdb/symfile.h
>> +++ b/gdb/symfile.h
>> @@ -160,8 +160,8 @@ struct quick_symbol_functions
>> where the source file is named NAME.
>>
>> If NAME is not absolute, a match after a '/' in the symbol
>> - table's file name will also work. FULL_PATH is the absolute file
>> - name, and REAL_PATH is the same, run through gdb_realpath.
>> + table's file name will also work. REAL_PATH is the absolute file
>> + name run through gdb_realpath.
>>
>> If a match is found, the "partial" symbol table is expanded.
>> Then, this calls iterate_over_some_symtabs (or equivalent) over
>> @@ -169,7 +169,6 @@ struct quick_symbol_functions
>> The result of this call is returned. */
>> int (*map_symtabs_matching_filename) (struct objfile *objfile,
>> const char *name,
>> - const char *full_path,
>> const char *real_path,
>> int (*callback) (struct symtab *,
>> void *),
>> --- a/gdb/symmisc.c
>> +++ b/gdb/symmisc.c
>> @@ -655,7 +655,7 @@ maintenance_print_msymbols (char *args, int from_tty)
>> /* If a second arg is supplied, it is a source file name to match on. */
>> if (argv[1] != NULL)
>> {
>> - symname = xfullpath (argv[1]);
>> + symname = gdb_realpath (argv[1]);
>> make_cleanup (xfree, symname);
>> if (symname && stat (symname, &sym_st))
>> perror_with_name (symname);
>> --- a/gdb/symtab.c
>> +++ b/gdb/symtab.c
>> @@ -179,7 +179,7 @@ compare_filenames_for_search (const char *filename, const char
>> *search_name)
>> /* Check for a symtab of a specific name by searching some symtabs.
>> This is a helper function for callbacks of iterate_over_symtabs.
>>
>> - The return value, NAME, FULL_PATH, REAL_PATH, CALLBACK, and DATA
>> + The return value, NAME, REAL_PATH, CALLBACK, and DATA
>> are identical to the `map_symtabs_matching_filename' method of
>> quick_symbol_functions.
>>
>> @@ -189,7 +189,6 @@ compare_filenames_for_search (const char *filename, const char
>> *search_name)
>>
>> int
>> iterate_over_some_symtabs (const char *name,
>> - const char *full_path,
>> const char *real_path,
>> int (*callback) (struct symtab *symtab,
>> void *data),
>> @@ -225,47 +224,21 @@ iterate_over_some_symtabs (const char *name,
>> /* If the user gave us an absolute path, try to find the file in
>> this symtab and use its absolute path. */
>>
>> - if (full_path != NULL)
>> - {
>> - const char *fp = symtab_to_fullname (s);
>> -
>> - if (FILENAME_CMP (full_path, fp) == 0)
>> - {
>> - if (callback (s, data))
>> - return 1;
>> - }
>> -
>> - if (!is_abs && compare_filenames_for_search (fp, name))
>> - {
>> - if (callback (s, data))
>> - return 1;
>> - }
>> - }
>> -
>> if (real_path != NULL)
>> {
>> const char *fullname = symtab_to_fullname (s);
>> - char *rp = gdb_realpath (fullname);
>> - struct cleanup *cleanups = make_cleanup (xfree, rp);
>>
>> - if (FILENAME_CMP (real_path, rp) == 0)
>> + if (FILENAME_CMP (real_path, fullname) == 0)
>> {
>> if (callback (s, data))
>> - {
>> - do_cleanups (cleanups);
>> - return 1;
>> - }
>> + return 1;
>> }
>>
>> - if (!is_abs && compare_filenames_for_search (rp, name))
>> + if (!is_abs && compare_filenames_for_search (fullname, name))
>> {
>> if (callback (s, data))
>> - {
>> - do_cleanups (cleanups);
>> - return 1;
>> - }
>> + return 1;
>> }
>> - do_cleanups (cleanups);
>> }
>> }
>>
>> @@ -288,22 +261,19 @@ iterate_over_symtabs (const char *name,
>> struct symtab *s = NULL;
>> struct objfile *objfile;
>> char *real_path = NULL;
>> - char *full_path = NULL;
>> struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
>>
>> /* Here we are interested in canonicalizing an absolute path, not
>> absolutizing a relative path. */
>> if (IS_ABSOLUTE_PATH (name))
>> {
>> - full_path = xfullpath (name);
>> - make_cleanup (xfree, full_path);
>> real_path = gdb_realpath (name);
>> make_cleanup (xfree, real_path);
>> }
>>
>> ALL_OBJFILES (objfile)
>> {
>> - if (iterate_over_some_symtabs (name, full_path, real_path, callback, data,
>> + if (iterate_over_some_symtabs (name, real_path, callback, data,
>> objfile->symtabs, NULL))
>> {
>> do_cleanups (cleanups);
>> @@ -319,7 +289,6 @@ iterate_over_symtabs (const char *name,
>> if (objfile->sf
>> && objfile->sf->qf->map_symtabs_matching_filename (objfile,
>> name,
>> - full_path,
>> real_path,
>> callback,
>> data))
>> --- a/gdb/symtab.h
>> +++ b/gdb/symtab.h
>> @@ -1284,7 +1284,6 @@ int compare_filenames_for_search (const char *filename,
>> const char *search_name);
>>
>> int iterate_over_some_symtabs (const char *name,
>> - const char *full_path,
>> const char *real_path,
>> int (*callback) (struct symtab *symtab,
>> void *data),
>> --- a/gdb/testsuite/gdb.gdb/xfullpath.exp
>> +++ b/gdb/testsuite/gdb.gdb/xfullpath.exp
>> @@ -103,37 +103,37 @@ proc test_with_self { executable } {
>> }
>>
>> # A file which contains a directory prefix
>> - gdb_test "print xfullpath (\"./xfullpath.exp\")" \
>> + gdb_test "print gdb_realpath (\"./xfullpath.exp\")" \
>> ".\[0-9\]+ =.*\".*/xfullpath.exp\"" \
>> "A filename with ./ as the directory prefix"
>>
>> # A file which contains a directory prefix
>> - gdb_test "print xfullpath (\"../../defs.h\")" \
>> + gdb_test "print gdb_realpath (\"../../defs.h\")" \
>> ".\[0-9\]+ =.*\".*/defs.h\"" \
>> "A filename with ../ in the directory prefix"
>>
>> # A one-character filename
>> - gdb_test "print xfullpath (\"./a\")" \
>> + gdb_test "print gdb_realpath (\"./a\")" \
>> ".\[0-9\]+ =.*\".*/a\"" \
>> "A one-char filename in the current directory"
>>
>> # A file in the root directory
>> - gdb_test "print xfullpath (\"/root_file_which_should_exist\")" \
>> + gdb_test "print gdb_realpath (\"/root_file_which_should_exist\")" \
>> ".\[0-9\]+ =.*\"/root_file_which_should_exist\"" \
>> "A filename in the root directory"
>>
>> # A file which does not have a directory prefix
>> - gdb_test "print xfullpath (\"xfullpath.exp\")" \
>> + gdb_test "print gdb_realpath (\"xfullpath.exp\")" \
>> ".\[0-9\]+ =.*\"xfullpath.exp\"" \
>> "A filename without any directory prefix"
>>
>> # A one-char filename without any directory prefix
>> - gdb_test "print xfullpath (\"a\")" \
>> + gdb_test "print gdb_realpath (\"a\")" \
>> ".\[0-9\]+ =.*\"a\"" \
>> "A one-char filename without any directory prefix"
>>
>> # An empty filename
>> - gdb_test "print xfullpath (\"\")" \
>> + gdb_test "print gdb_realpath (\"\")" \
>> ".\[0-9\]+ =.*\"\"" \
>> "An empty filename"
>>
>> --- a/gdb/utils.c
>> +++ b/gdb/utils.c
>> @@ -3286,53 +3286,6 @@ gdb_realpath (const char *filename)
>> return xstrdup (filename);
>> }
>>
>> -/* Return a copy of FILENAME, with its directory prefix canonicalized
>> - by gdb_realpath. */
>> -
>> -char *
>> -xfullpath (const char *filename)
>> -{
>> - const char *base_name = lbasename (filename);
>> - char *dir_name;
>> - char *real_path;
>> - char *result;
>> -
>> - /* Extract the basename of filename, and return immediately
>> - a copy of filename if it does not contain any directory prefix. */
>> - if (base_name == filename)
>> - return xstrdup (filename);
>> -
>> - dir_name = alloca ((size_t) (base_name - filename + 2));
>> - /* Allocate enough space to store the dir_name + plus one extra
>> - character sometimes needed under Windows (see below), and
>> - then the closing \000 character. */
>> - strncpy (dir_name, filename, base_name - filename);
>> - dir_name[base_name - filename] = '\000';
>> -
>> -#ifdef HAVE_DOS_BASED_FILE_SYSTEM
>> - /* We need to be careful when filename is of the form 'd:foo', which
>> - is equivalent of d:./foo, which is totally different from d:/foo. */
>> - if (strlen (dir_name) == 2 && isalpha (dir_name[0]) && dir_name[1] == ':')
>> - {
>> - dir_name[2] = '.';
>> - dir_name[3] = '\000';
>> - }
>> -#endif
>> -
>> - /* Canonicalize the directory prefix, and build the resulting
>> - filename. If the dirname realpath already contains an ending
>> - directory separator, avoid doubling it. */
>> - real_path = gdb_realpath (dir_name);
>> - if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
>> - result = concat (real_path, base_name, (char *) NULL);
>> - else
>> - result = concat (real_path, SLASH_STRING, base_name, (char *) NULL);
>> -
>> - xfree (real_path);
>> - return result;
>> -}
>> -
>> -
>> /* This is the 32-bit CRC function used by the GNU separate debug
>> facility. An executable may contain a section named
>> .gnu_debuglink, which holds the name of a separate executable file
>> --- a/gdb/utils.h
>> +++ b/gdb/utils.h
>> @@ -124,8 +124,6 @@ extern struct cleanup *make_bpstat_clear_actions_cleanup (void);
>>
>> extern char *gdb_realpath (const char *);
>>
>> -extern char *xfullpath (const char *);
>> -
>> extern int gdb_filename_fnmatch (const char *pattern, const char *string,
>> int flags);
>>
> Intel GmbH
> Dornacher Strasse 1
> 85622 Feldkirchen/Muenchen, Deutschland
> Sitz der Gesellschaft: Feldkirchen bei Muenchen
> Geschaeftsfuehrer: Christian Lamprechter, Hannes Schwaderer, Douglas Lusk
> Registergericht: Muenchen HRB 47456
> Ust.-IdNr./VAT Registration No.: DE129385895
> Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patchv2 1/11] Remove xfullpath (use gdb_realpath instead)
2013-07-17 16:04 ` Doug Evans
@ 2013-07-17 16:13 ` Doug Evans
2013-07-17 16:51 ` Jan Kratochvil
0 siblings, 1 reply; 7+ messages in thread
From: Doug Evans @ 2013-07-17 16:13 UTC (permalink / raw)
To: Agovic, Sanimir
Cc: Jan Kratochvil, gdb-patches, Cary Coutant, Sterling Augustine
Ah, forgot a reason. [How not unexpected, sigh.]
If a binary has an auxiliary file (e.g., a separate debug info file or
a -gdb.py file) then gdb won't be able to find them - the auxiliary
files could be named and/or located based on the realpath name.
On Wed, Jul 17, 2013 at 9:03 AM, Doug Evans <dje@google.com> wrote:
> Fully replacing symlinks also breaks Fission cases where we expect to
> find ${binary}.dwp.
>
> One thought was to record *both* the original potentially symlink'd
> version of the path, and the "realpath", for each objfile. It's extra
> complexity, but there is a real problem here. OTOH, a good question
> to ask first is "Why does gdb record the realpath at all?" [That's not
> a rhetorical question - maybe there's a reason - I actually don't
> know.]
>
>
> On Wed, Jul 17, 2013 at 5:49 AM, Agovic, Sanimir
> <sanimir.agovic@intel.com> wrote:
>> Hello Jan,
>>
>> seems like this patch introduced a regression as pointed out on IRC. It is tracked via http://sourceware.org/bugzilla/show_bug.cgi?id=15415
>>
>> Could you please have a look? Thanks.
>>
>> -Sanimir
>>
>>> -----Original Message-----
>>> From: gdb-patches-owner@sourceware.org [mailto:gdb-patches-owner@sourceware.org] On Behalf
>>> Of Jan Kratochvil
>>> Sent: Sunday, January 27, 2013 11:32 PM
>>> To: gdb-patches@sourceware.org
>>> Subject: [patchv2 1/11] Remove xfullpath (use gdb_realpath instead)
>>>
>>> Hi,
>>>
>>> according to Joel:
>>> Re: [patch 0/9] Absolute filenames
>>> http://sourceware.org/ml/gdb-patches/2013-01/msg00421.html
>>>
>>> xfullpath can be removed, that is to replace it by gdb_realpath and remove any
>>> double gdb_realpath calls where appropriate.
>>>
>>> gdb_realpath is like realpath while xfullpath was not resolving the very last
>>> filename component wrt symlinks.
>>>
>>>
>>> Thanks,
>>> Jan
>>>
>>>
>>> gdb/cli/cli-cmds.c | 5 +----
>>> gdb/dwarf2read.c | 31 +++++--------------------------
>>> gdb/psymtab.c | 32 +++++---------------------------
>>> gdb/source.c | 14 ++++----------
>>> gdb/symfile.h | 5 ++---
>>> gdb/symmisc.c | 2 +-
>>> gdb/symtab.c | 43 ++++++-------------------------------------
>>> gdb/symtab.h | 1 -
>>> gdb/testsuite/gdb.gdb/xfullpath.exp | 14 +++++++-------
>>> gdb/utils.c | 47 -----------------------------------------------
>>> gdb/utils.h | 2 --
>>> 11 files changed, 31 insertions(+), 165 deletions(-)
>>> ^^^
>>>
>>> gdb/
>>> 2013-01-25 Jan Kratochvil <jan.kratochvil@redhat.com>
>>>
>>> Replace xfullpath calls by gdb_realpath calls.
>>> * cli/cli-cmds.c (find_and_open_script): Remove xfullpath from the
>>> function comment.
>>> * dwarf2read.c (dw2_map_expand_apply): Remove parameter full_path.
>>> Remove it from the iterate_over_some_symtabs call.
>>> (dw2_map_symtabs_matching_filename): Remove parameter full_path.
>>> Remove it from the dw2_map_expand_apply calls, remove a block handling
>>> it.
>>> * psymtab.c (partial_map_expand_apply): Remove parameter full_path.
>>> Remove it from the iterate_over_some_symtabs call.
>>> (partial_map_symtabs_matching_filename): Remove parameter full_path.
>>> Remove it from the partial_map_expand_apply calls, remove a block
>>> handling it. Drop gdb_realpath call and cleanups from the real_path
>>> handling.
>>> * source.c (openp): Drop the comment part about xfullpath. Replace
>>> xfullpath calls by gdb_realpath calls.
>>> (find_and_open_source): Replace xfullpath call by gdb_realpath call.
>>> * symfile.h (struct quick_symbol_functions): Remove parameter full_path
>>> from method map_symtabs_matching_filename and its comment.
>>> * symmisc.c (maintenance_print_msymbols): Replace xfullpath call by
>>> gdb_realpath call.
>>> * symtab.c (iterate_over_some_symtabs): Remove parameter full_path,
>>> remove it also from the function comment, remove a block handling it.
>>> Drop gdb_realpath call and cleanups from the real_path handling.
>>> (iterate_over_symtabs): Drop variable full_path and its use.
>>> * symtab.h (iterate_over_some_symtabs): Remove parameter full_path.
>>> * utils.c (xfullpath): Remove.
>>> * utils.h (xfullpath): Remove.
>>>
>>> gdb/testsuite/
>>> 2013-01-25 Jan Kratochvil <jan.kratochvil@redhat.com>
>>>
>>> * gdb.gdb/xfullpath.exp: Replace xfullpath calls by gdb_realpath calls.
>>>
>>> --- a/gdb/cli/cli-cmds.c
>>> +++ b/gdb/cli/cli-cmds.c
>>> @@ -465,10 +465,7 @@ show_script_ext_mode (struct ui_file *file, int from_tty,
>>> we tried to open.
>>>
>>> If SEARCH_PATH is non-zero, and the file isn't found in cwd,
>>> - search for it in the source search path.
>>> -
>>> - NOTE: This calls openp which uses xfullpath to compute the full path
>>> - instead of gdb_realpath. Symbolic links are not resolved. */
>>> + search for it in the source search path. */
>>>
>>> int
>>> find_and_open_script (const char *script_file, int search_path,
>>> --- a/gdb/dwarf2read.c
>>> +++ b/gdb/dwarf2read.c
>>> @@ -3020,8 +3020,7 @@ dw2_forget_cached_source_info (struct objfile *objfile)
>>> static int
>>> dw2_map_expand_apply (struct objfile *objfile,
>>> struct dwarf2_per_cu_data *per_cu,
>>> - const char *name,
>>> - const char *full_path, const char *real_path,
>>> + const char *name, const char *real_path,
>>> int (*callback) (struct symtab *, void *),
>>> void *data)
>>> {
>>> @@ -3035,7 +3034,7 @@ dw2_map_expand_apply (struct objfile *objfile,
>>> all of them. */
>>> dw2_instantiate_symtab (per_cu);
>>>
>>> - return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
>>> + return iterate_over_some_symtabs (name, real_path, callback, data,
>>> objfile->symtabs, last_made);
>>> }
>>>
>>> @@ -3043,7 +3042,7 @@ dw2_map_expand_apply (struct objfile *objfile,
>>>
>>> static int
>>> dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
>>> - const char *full_path, const char *real_path,
>>> + const char *real_path,
>>> int (*callback) (struct symtab *, void *),
>>> void *data)
>>> {
>>> @@ -3077,8 +3076,7 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const
>>> char *name,
>>> if (FILENAME_CMP (name, this_name) == 0
>>> || (!is_abs && compare_filenames_for_search (this_name, name)))
>>> {
>>> - if (dw2_map_expand_apply (objfile, per_cu,
>>> - name, full_path, real_path,
>>> + if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
>>> callback, data))
>>> return 1;
>>> }
>>> @@ -3089,24 +3087,6 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const
>>> char *name,
>>> && FILENAME_CMP (lbasename (this_name), name_basename) != 0)
>>> continue;
>>>
>>> - if (full_path != NULL)
>>> - {
>>> - const char *this_real_name = dw2_get_real_path (objfile,
>>> - file_data, j);
>>> -
>>> - if (this_real_name != NULL
>>> - && (FILENAME_CMP (full_path, this_real_name) == 0
>>> - || (!is_abs
>>> - && compare_filenames_for_search (this_real_name,
>>> - name))))
>>> - {
>>> - if (dw2_map_expand_apply (objfile, per_cu,
>>> - name, full_path, real_path,
>>> - callback, data))
>>> - return 1;
>>> - }
>>> - }
>>> -
>>> if (real_path != NULL)
>>> {
>>> const char *this_real_name = dw2_get_real_path (objfile,
>>> @@ -3118,8 +3098,7 @@ dw2_map_symtabs_matching_filename (struct objfile *objfile, const
>>> char *name,
>>> && compare_filenames_for_search (this_real_name,
>>> name))))
>>> {
>>> - if (dw2_map_expand_apply (objfile, per_cu,
>>> - name, full_path, real_path,
>>> + if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
>>> callback, data))
>>> return 1;
>>> }
>>> --- a/gdb/psymtab.c
>>> +++ b/gdb/psymtab.c
>>> @@ -131,7 +131,6 @@ require_partial_symbols (struct objfile *objfile, int verbose)
>>> static int
>>> partial_map_expand_apply (struct objfile *objfile,
>>> const char *name,
>>> - const char *full_path,
>>> const char *real_path,
>>> struct partial_symtab *pst,
>>> int (*callback) (struct symtab *, void *),
>>> @@ -151,7 +150,7 @@ partial_map_expand_apply (struct objfile *objfile,
>>> all of them. */
>>> psymtab_to_symtab (objfile, pst);
>>>
>>> - return iterate_over_some_symtabs (name, full_path, real_path, callback, data,
>>> + return iterate_over_some_symtabs (name, real_path, callback, data,
>>> objfile->symtabs, last_made);
>>> }
>>>
>>> @@ -160,7 +159,6 @@ partial_map_expand_apply (struct objfile *objfile,
>>> static int
>>> partial_map_symtabs_matching_filename (struct objfile *objfile,
>>> const char *name,
>>> - const char *full_path,
>>> const char *real_path,
>>> int (*callback) (struct symtab *,
>>> void *),
>>> @@ -184,7 +182,7 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
>>> if (FILENAME_CMP (name, pst->filename) == 0
>>> || (!is_abs && compare_filenames_for_search (pst->filename, name)))
>>> {
>>> - if (partial_map_expand_apply (objfile, name, full_path, real_path,
>>> + if (partial_map_expand_apply (objfile, name, real_path,
>>> pst, callback, data))
>>> return 1;
>>> }
>>> @@ -197,34 +195,14 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
>>>
>>> /* If the user gave us an absolute path, try to find the file in
>>> this symtab and use its absolute path. */
>>> - if (full_path != NULL)
>>> - {
>>> - psymtab_to_fullname (pst);
>>> - if (pst->fullname != NULL
>>> - && (FILENAME_CMP (full_path, pst->fullname) == 0
>>> - || (!is_abs && compare_filenames_for_search (pst->fullname,
>>> - name))))
>>> - {
>>> - if (partial_map_expand_apply (objfile, name, full_path, real_path,
>>> - pst, callback, data))
>>> - return 1;
>>> - }
>>> - }
>>> -
>>> if (real_path != NULL)
>>> {
>>> - char *rp = NULL;
>>> psymtab_to_fullname (pst);
>>> - if (pst->fullname != NULL)
>>> - {
>>> - rp = gdb_realpath (pst->fullname);
>>> - make_cleanup (xfree, rp);
>>> - }
>>> - if (rp != NULL
>>> - && (FILENAME_CMP (real_path, rp) == 0
>>> + if (pst->fullname != NULL
>>> + && (FILENAME_CMP (real_path, pst->fullname) == 0
>>> || (!is_abs && compare_filenames_for_search (real_path, name))))
>>> {
>>> - if (partial_map_expand_apply (objfile, name, full_path, real_path,
>>> + if (partial_map_expand_apply (objfile, name, real_path,
>>> pst, callback, data))
>>> return 1;
>>> }
>>> --- a/gdb/source.c
>>> +++ b/gdb/source.c
>>> @@ -825,15 +825,11 @@ openp (const char *path, int opts, const char *string,
>>> done:
>>> if (filename_opened)
>>> {
>>> - /* If a file was opened, canonicalize its filename. Use xfullpath
>>> - rather than gdb_realpath to avoid resolving the basename part
>>> - of filenames when the associated file is a symbolic link. This
>>> - fixes a potential inconsistency between the filenames known to
>>> - GDB and the filenames it prints in the annotations. */
>>> + /* If a file was opened, canonicalize its filename. */
>>> if (fd < 0)
>>> *filename_opened = NULL;
>>> else if (IS_ABSOLUTE_PATH (filename))
>>> - *filename_opened = xfullpath (filename);
>>> + *filename_opened = gdb_realpath (filename);
>>> else
>>> {
>>> /* Beware the // my son, the Emacs barfs, the botch that catch... */
>>> @@ -843,7 +839,7 @@ done:
>>> ? "" : SLASH_STRING,
>>> filename, (char *)NULL);
>>>
>>> - *filename_opened = xfullpath (f);
>>> + *filename_opened = gdb_realpath (f);
>>> xfree (f);
>>> }
>>> }
>>> @@ -986,9 +982,7 @@ find_and_open_source (const char *filename,
>>> result = open (*fullname, OPEN_MODE);
>>> if (result >= 0)
>>> {
>>> - /* Call xfullpath here to be consistent with openp
>>> - which we use below. */
>>> - char *lpath = xfullpath (*fullname);
>>> + char *lpath = gdb_realpath (*fullname);
>>>
>>> xfree (*fullname);
>>> *fullname = lpath;
>>> --- a/gdb/symfile.h
>>> +++ b/gdb/symfile.h
>>> @@ -160,8 +160,8 @@ struct quick_symbol_functions
>>> where the source file is named NAME.
>>>
>>> If NAME is not absolute, a match after a '/' in the symbol
>>> - table's file name will also work. FULL_PATH is the absolute file
>>> - name, and REAL_PATH is the same, run through gdb_realpath.
>>> + table's file name will also work. REAL_PATH is the absolute file
>>> + name run through gdb_realpath.
>>>
>>> If a match is found, the "partial" symbol table is expanded.
>>> Then, this calls iterate_over_some_symtabs (or equivalent) over
>>> @@ -169,7 +169,6 @@ struct quick_symbol_functions
>>> The result of this call is returned. */
>>> int (*map_symtabs_matching_filename) (struct objfile *objfile,
>>> const char *name,
>>> - const char *full_path,
>>> const char *real_path,
>>> int (*callback) (struct symtab *,
>>> void *),
>>> --- a/gdb/symmisc.c
>>> +++ b/gdb/symmisc.c
>>> @@ -655,7 +655,7 @@ maintenance_print_msymbols (char *args, int from_tty)
>>> /* If a second arg is supplied, it is a source file name to match on. */
>>> if (argv[1] != NULL)
>>> {
>>> - symname = xfullpath (argv[1]);
>>> + symname = gdb_realpath (argv[1]);
>>> make_cleanup (xfree, symname);
>>> if (symname && stat (symname, &sym_st))
>>> perror_with_name (symname);
>>> --- a/gdb/symtab.c
>>> +++ b/gdb/symtab.c
>>> @@ -179,7 +179,7 @@ compare_filenames_for_search (const char *filename, const char
>>> *search_name)
>>> /* Check for a symtab of a specific name by searching some symtabs.
>>> This is a helper function for callbacks of iterate_over_symtabs.
>>>
>>> - The return value, NAME, FULL_PATH, REAL_PATH, CALLBACK, and DATA
>>> + The return value, NAME, REAL_PATH, CALLBACK, and DATA
>>> are identical to the `map_symtabs_matching_filename' method of
>>> quick_symbol_functions.
>>>
>>> @@ -189,7 +189,6 @@ compare_filenames_for_search (const char *filename, const char
>>> *search_name)
>>>
>>> int
>>> iterate_over_some_symtabs (const char *name,
>>> - const char *full_path,
>>> const char *real_path,
>>> int (*callback) (struct symtab *symtab,
>>> void *data),
>>> @@ -225,47 +224,21 @@ iterate_over_some_symtabs (const char *name,
>>> /* If the user gave us an absolute path, try to find the file in
>>> this symtab and use its absolute path. */
>>>
>>> - if (full_path != NULL)
>>> - {
>>> - const char *fp = symtab_to_fullname (s);
>>> -
>>> - if (FILENAME_CMP (full_path, fp) == 0)
>>> - {
>>> - if (callback (s, data))
>>> - return 1;
>>> - }
>>> -
>>> - if (!is_abs && compare_filenames_for_search (fp, name))
>>> - {
>>> - if (callback (s, data))
>>> - return 1;
>>> - }
>>> - }
>>> -
>>> if (real_path != NULL)
>>> {
>>> const char *fullname = symtab_to_fullname (s);
>>> - char *rp = gdb_realpath (fullname);
>>> - struct cleanup *cleanups = make_cleanup (xfree, rp);
>>>
>>> - if (FILENAME_CMP (real_path, rp) == 0)
>>> + if (FILENAME_CMP (real_path, fullname) == 0)
>>> {
>>> if (callback (s, data))
>>> - {
>>> - do_cleanups (cleanups);
>>> - return 1;
>>> - }
>>> + return 1;
>>> }
>>>
>>> - if (!is_abs && compare_filenames_for_search (rp, name))
>>> + if (!is_abs && compare_filenames_for_search (fullname, name))
>>> {
>>> if (callback (s, data))
>>> - {
>>> - do_cleanups (cleanups);
>>> - return 1;
>>> - }
>>> + return 1;
>>> }
>>> - do_cleanups (cleanups);
>>> }
>>> }
>>>
>>> @@ -288,22 +261,19 @@ iterate_over_symtabs (const char *name,
>>> struct symtab *s = NULL;
>>> struct objfile *objfile;
>>> char *real_path = NULL;
>>> - char *full_path = NULL;
>>> struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
>>>
>>> /* Here we are interested in canonicalizing an absolute path, not
>>> absolutizing a relative path. */
>>> if (IS_ABSOLUTE_PATH (name))
>>> {
>>> - full_path = xfullpath (name);
>>> - make_cleanup (xfree, full_path);
>>> real_path = gdb_realpath (name);
>>> make_cleanup (xfree, real_path);
>>> }
>>>
>>> ALL_OBJFILES (objfile)
>>> {
>>> - if (iterate_over_some_symtabs (name, full_path, real_path, callback, data,
>>> + if (iterate_over_some_symtabs (name, real_path, callback, data,
>>> objfile->symtabs, NULL))
>>> {
>>> do_cleanups (cleanups);
>>> @@ -319,7 +289,6 @@ iterate_over_symtabs (const char *name,
>>> if (objfile->sf
>>> && objfile->sf->qf->map_symtabs_matching_filename (objfile,
>>> name,
>>> - full_path,
>>> real_path,
>>> callback,
>>> data))
>>> --- a/gdb/symtab.h
>>> +++ b/gdb/symtab.h
>>> @@ -1284,7 +1284,6 @@ int compare_filenames_for_search (const char *filename,
>>> const char *search_name);
>>>
>>> int iterate_over_some_symtabs (const char *name,
>>> - const char *full_path,
>>> const char *real_path,
>>> int (*callback) (struct symtab *symtab,
>>> void *data),
>>> --- a/gdb/testsuite/gdb.gdb/xfullpath.exp
>>> +++ b/gdb/testsuite/gdb.gdb/xfullpath.exp
>>> @@ -103,37 +103,37 @@ proc test_with_self { executable } {
>>> }
>>>
>>> # A file which contains a directory prefix
>>> - gdb_test "print xfullpath (\"./xfullpath.exp\")" \
>>> + gdb_test "print gdb_realpath (\"./xfullpath.exp\")" \
>>> ".\[0-9\]+ =.*\".*/xfullpath.exp\"" \
>>> "A filename with ./ as the directory prefix"
>>>
>>> # A file which contains a directory prefix
>>> - gdb_test "print xfullpath (\"../../defs.h\")" \
>>> + gdb_test "print gdb_realpath (\"../../defs.h\")" \
>>> ".\[0-9\]+ =.*\".*/defs.h\"" \
>>> "A filename with ../ in the directory prefix"
>>>
>>> # A one-character filename
>>> - gdb_test "print xfullpath (\"./a\")" \
>>> + gdb_test "print gdb_realpath (\"./a\")" \
>>> ".\[0-9\]+ =.*\".*/a\"" \
>>> "A one-char filename in the current directory"
>>>
>>> # A file in the root directory
>>> - gdb_test "print xfullpath (\"/root_file_which_should_exist\")" \
>>> + gdb_test "print gdb_realpath (\"/root_file_which_should_exist\")" \
>>> ".\[0-9\]+ =.*\"/root_file_which_should_exist\"" \
>>> "A filename in the root directory"
>>>
>>> # A file which does not have a directory prefix
>>> - gdb_test "print xfullpath (\"xfullpath.exp\")" \
>>> + gdb_test "print gdb_realpath (\"xfullpath.exp\")" \
>>> ".\[0-9\]+ =.*\"xfullpath.exp\"" \
>>> "A filename without any directory prefix"
>>>
>>> # A one-char filename without any directory prefix
>>> - gdb_test "print xfullpath (\"a\")" \
>>> + gdb_test "print gdb_realpath (\"a\")" \
>>> ".\[0-9\]+ =.*\"a\"" \
>>> "A one-char filename without any directory prefix"
>>>
>>> # An empty filename
>>> - gdb_test "print xfullpath (\"\")" \
>>> + gdb_test "print gdb_realpath (\"\")" \
>>> ".\[0-9\]+ =.*\"\"" \
>>> "An empty filename"
>>>
>>> --- a/gdb/utils.c
>>> +++ b/gdb/utils.c
>>> @@ -3286,53 +3286,6 @@ gdb_realpath (const char *filename)
>>> return xstrdup (filename);
>>> }
>>>
>>> -/* Return a copy of FILENAME, with its directory prefix canonicalized
>>> - by gdb_realpath. */
>>> -
>>> -char *
>>> -xfullpath (const char *filename)
>>> -{
>>> - const char *base_name = lbasename (filename);
>>> - char *dir_name;
>>> - char *real_path;
>>> - char *result;
>>> -
>>> - /* Extract the basename of filename, and return immediately
>>> - a copy of filename if it does not contain any directory prefix. */
>>> - if (base_name == filename)
>>> - return xstrdup (filename);
>>> -
>>> - dir_name = alloca ((size_t) (base_name - filename + 2));
>>> - /* Allocate enough space to store the dir_name + plus one extra
>>> - character sometimes needed under Windows (see below), and
>>> - then the closing \000 character. */
>>> - strncpy (dir_name, filename, base_name - filename);
>>> - dir_name[base_name - filename] = '\000';
>>> -
>>> -#ifdef HAVE_DOS_BASED_FILE_SYSTEM
>>> - /* We need to be careful when filename is of the form 'd:foo', which
>>> - is equivalent of d:./foo, which is totally different from d:/foo. */
>>> - if (strlen (dir_name) == 2 && isalpha (dir_name[0]) && dir_name[1] == ':')
>>> - {
>>> - dir_name[2] = '.';
>>> - dir_name[3] = '\000';
>>> - }
>>> -#endif
>>> -
>>> - /* Canonicalize the directory prefix, and build the resulting
>>> - filename. If the dirname realpath already contains an ending
>>> - directory separator, avoid doubling it. */
>>> - real_path = gdb_realpath (dir_name);
>>> - if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
>>> - result = concat (real_path, base_name, (char *) NULL);
>>> - else
>>> - result = concat (real_path, SLASH_STRING, base_name, (char *) NULL);
>>> -
>>> - xfree (real_path);
>>> - return result;
>>> -}
>>> -
>>> -
>>> /* This is the 32-bit CRC function used by the GNU separate debug
>>> facility. An executable may contain a section named
>>> .gnu_debuglink, which holds the name of a separate executable file
>>> --- a/gdb/utils.h
>>> +++ b/gdb/utils.h
>>> @@ -124,8 +124,6 @@ extern struct cleanup *make_bpstat_clear_actions_cleanup (void);
>>>
>>> extern char *gdb_realpath (const char *);
>>>
>>> -extern char *xfullpath (const char *);
>>> -
>>> extern int gdb_filename_fnmatch (const char *pattern, const char *string,
>>> int flags);
>>>
>> Intel GmbH
>> Dornacher Strasse 1
>> 85622 Feldkirchen/Muenchen, Deutschland
>> Sitz der Gesellschaft: Feldkirchen bei Muenchen
>> Geschaeftsfuehrer: Christian Lamprechter, Hannes Schwaderer, Douglas Lusk
>> Registergericht: Muenchen HRB 47456
>> Ust.-IdNr./VAT Registration No.: DE129385895
>> Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052
>>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patchv2 1/11] Remove xfullpath (use gdb_realpath instead)
2013-07-17 16:13 ` Doug Evans
@ 2013-07-17 16:51 ` Jan Kratochvil
2013-07-17 17:24 ` Doug Evans
0 siblings, 1 reply; 7+ messages in thread
From: Jan Kratochvil @ 2013-07-17 16:51 UTC (permalink / raw)
To: Doug Evans; +Cc: Agovic, Sanimir, gdb-patches, Cary Coutant, Sterling Augustine
On Wed, 17 Jul 2013 18:12:53 +0200, Doug Evans wrote:
> Ah, forgot a reason. [How not unexpected, sigh.]
>
> If a binary has an auxiliary file (e.g., a separate debug info file or
> a -gdb.py file) then gdb won't be able to find them - the auxiliary
> files could be named and/or located based on the realpath name.
In general GDB does many comparison for file identity by:
strcmp (xfullpath (a), xfullpath (b)) == 0
It would be much more efficient to do:
stat (a).st_{dev,ino} == stat (b).st_{dev,ino}
Going to check what to do with the argv[0] problem, there seems to be xfullpath
excessive.
I do not know what happens with ${binary}.dwp. But .debug files were always
symlinked similar way to their original binary files:
lrwxrwxrwx 1 root root 27 Jun 19 00:23 /lib64/libgtk-x11-2.0.so -> libgtk-x11-2.0.so.0.2400.19*
lrwxrwxrwx 1 root root 27 Jun 19 00:23 /lib64/libgtk-x11-2.0.so.0 -> libgtk-x11-2.0.so.0.2400.19*
-rwxr-xr-x 1 root root 4779088 Jun 16 22:05 /lib64/libgtk-x11-2.0.so.0.2400.19*
lrwxrwxrwx 1 root root 33 Jun 19 00:23 /usr/lib/debug/lib64/libgtk-x11-2.0.so.debug -> libgtk-x11-2.0.so.0.2400.19.debug
lrwxrwxrwx 1 root root 33 Jun 19 00:23 /usr/lib/debug/lib64/libgtk-x11-2.0.so.0.debug -> libgtk-x11-2.0.so.0.2400.19.debug
-r--r--r-- 1 root root 13663732 Jun 16 22:05 /usr/lib/debug/lib64/libgtk-x11-2.0.so.0.2400.19.debug
So I would say this is a bug in the script generating *.dwp, isn't it?
Jan
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patchv2 1/11] Remove xfullpath (use gdb_realpath instead)
2013-07-17 16:51 ` Jan Kratochvil
@ 2013-07-17 17:24 ` Doug Evans
0 siblings, 0 replies; 7+ messages in thread
From: Doug Evans @ 2013-07-17 17:24 UTC (permalink / raw)
To: Jan Kratochvil
Cc: Agovic, Sanimir, gdb-patches, Cary Coutant, Sterling Augustine
On Wed, Jul 17, 2013 at 9:50 AM, Jan Kratochvil
<jan.kratochvil@redhat.com> wrote:
> On Wed, 17 Jul 2013 18:12:53 +0200, Doug Evans wrote:
>> Ah, forgot a reason. [How not unexpected, sigh.]
>>
>> If a binary has an auxiliary file (e.g., a separate debug info file or
>> a -gdb.py file) then gdb won't be able to find them - the auxiliary
>> files could be named and/or located based on the realpath name.
>
> In general GDB does many comparison for file identity by:
> strcmp (xfullpath (a), xfullpath (b)) == 0
>
> It would be much more efficient to do:
> stat (a).st_{dev,ino} == stat (b).st_{dev,ino}
>
> Going to check what to do with the argv[0] problem, there seems to be xfullpath
> excessive.
>
> I do not know what happens with ${binary}.dwp. But .debug files were always
> symlinked similar way to their original binary files:
>
> lrwxrwxrwx 1 root root 27 Jun 19 00:23 /lib64/libgtk-x11-2.0.so -> libgtk-x11-2.0.so.0.2400.19*
> lrwxrwxrwx 1 root root 27 Jun 19 00:23 /lib64/libgtk-x11-2.0.so.0 -> libgtk-x11-2.0.so.0.2400.19*
> -rwxr-xr-x 1 root root 4779088 Jun 16 22:05 /lib64/libgtk-x11-2.0.so.0.2400.19*
> lrwxrwxrwx 1 root root 33 Jun 19 00:23 /usr/lib/debug/lib64/libgtk-x11-2.0.so.debug -> libgtk-x11-2.0.so.0.2400.19.debug
> lrwxrwxrwx 1 root root 33 Jun 19 00:23 /usr/lib/debug/lib64/libgtk-x11-2.0.so.0.debug -> libgtk-x11-2.0.so.0.2400.19.debug
> -r--r--r-- 1 root root 13663732 Jun 16 22:05 /usr/lib/debug/lib64/libgtk-x11-2.0.so.0.2400.19.debug
>
> So I would say this is a bug in the script generating *.dwp, isn't it?
re: dwp: No, it's an artifact of the underlying build system. It's
not dwp-specific in any way.
[Imagine a build tree that is actually a symlink forest.]
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2013-07-17 17:24 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-01-27 22:31 [patchv2 1/11] Remove xfullpath (use gdb_realpath instead) Jan Kratochvil
2013-02-03 15:55 ` [commit] " Jan Kratochvil
2013-07-17 12:49 ` Agovic, Sanimir
2013-07-17 16:04 ` Doug Evans
2013-07-17 16:13 ` Doug Evans
2013-07-17 16:51 ` Jan Kratochvil
2013-07-17 17:24 ` Doug Evans
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox