Index: utils.c =================================================================== RCS file: /cvs/src/src/gdb/utils.c,v retrieving revision 1.71 diff -c -3 -p -r1.71 utils.c *** utils.c 2002/03/28 03:43:37 1.71 --- utils.c 2002/03/31 23:00:08 *************** gdb_realpath (const char *filename) *** 2560,2562 **** --- 2560,2599 ---- return xstrdup (filename); #endif } + + /* + * xfullpath + * + * 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 + 1)); + strncpy (dir_name, filename, base_name - filename); + dir_name[base_name - filename] = '\000'; + + /* Canonicalize the directory prefix, and build the resulting + filename. Avoid returning a path which starts with 2 SLASH_CHARS + if the canonicalized path is the root path */ + real_path = gdb_realpath (dir_name); + if (strcmp (real_path, SLASH_STRING) == 0) + result = concat (SLASH_STRING, base_name, NULL); + else + result = concat (real_path, SLASH_STRING, base_name, NULL); + + xfree (real_path); + return result; + } Index: defs.h =================================================================== RCS file: /cvs/src/src/gdb/defs.h,v retrieving revision 1.85 diff -c -3 -p -r1.85 defs.h *** defs.h 2002/03/23 17:38:12 1.85 --- defs.h 2002/03/31 22:59:53 *************** extern CORE_ADDR host_pointer_to_address *** 372,377 **** --- 372,378 ---- extern void *address_to_host_pointer (CORE_ADDR addr); extern char *gdb_realpath (const char *); + extern char *xfullpath (const char *); /* From demangle.c */ Index: source.c =================================================================== RCS file: /cvs/src/src/gdb/source.c,v retrieving revision 1.25 diff -c -3 -p -r1.25 source.c *** source.c 2002/03/06 06:28:33 1.25 --- source.c 2002/03/31 22:59:57 *************** done: *** 612,618 **** if (fd < 0) *filename_opened = NULL; else if (IS_ABSOLUTE_PATH (filename)) ! *filename_opened = gdb_realpath (filename); else { /* Beware the // my son, the Emacs barfs, the botch that catch... */ --- 612,618 ---- if (fd < 0) *filename_opened = NULL; else if (IS_ABSOLUTE_PATH (filename)) ! *filename_opened = xfullpath (filename); else { /* Beware the // my son, the Emacs barfs, the botch that catch... */ *************** done: *** 621,627 **** IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]) ? "" : SLASH_STRING, filename, NULL); ! *filename_opened = gdb_realpath (f); xfree (f); } } --- 621,627 ---- IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]) ? "" : SLASH_STRING, filename, NULL); ! *filename_opened = xfullpath (f); xfree (f); } } Index: symtab.c =================================================================== RCS file: /cvs/src/src/gdb/symtab.c,v retrieving revision 1.59 diff -c -3 -p -r1.59 symtab.c *** symtab.c 2002/03/27 23:10:23 1.59 --- symtab.c 2002/03/31 23:00:04 *************** lookup_symtab (const char *name) *** 144,154 **** 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: --- 144,160 ---- register struct partial_symtab *ps; register struct objfile *objfile; char *real_path = NULL; + char *full_path = 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); ! } got_symtab: *************** got_symtab: *** 158,181 **** { if (FILENAME_CMP (name, s->filename) == 0) { - 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) */ if (lbasename (name) == name) --- 164,195 ---- { if (FILENAME_CMP (name, s->filename) == 0) { return s; } + /* 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_filename (s); + if (FILENAME_CMP (full_path, fp) == 0) + { + return s; + } + } + if (real_path != NULL) { ! const char *rp = gdb_realpath (symtab_to_filename (s)); ! make_cleanup (xfree, rp); if (FILENAME_CMP (real_path, rp) == 0) { return s; } } } /* Now, search for a matching tail (only if name doesn't have any dirs) */ if (lbasename (name) == name) *************** lookup_partial_symtab (const char *name) *** 221,256 **** { 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) */ --- 235,289 ---- { register struct partial_symtab *pst; register struct objfile *objfile; + char *full_path = NULL; char *real_path = 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_PSYMTABS (objfile, pst) { if (FILENAME_CMP (name, pst->filename) == 0) { return (pst); } + /* 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) { if (pst->fullname == NULL) source_full_path_of (pst->filename, &pst->fullname); if (pst->fullname != NULL ! && FILENAME_CMP (full_path, pst->fullname) == 0) { return pst; } } ! if (real_path != NULL) ! { ! char *rp = NULL; ! if (pst->fullname == NULL) ! source_full_path_of (pst->filename, &pst->fullname); ! if (pst->fullname != NULL) ! { ! rp = gdb_realpath (pst->fullname); ! make_cleanup (xfree, rp); ! } ! if (rp != NULL && FILENAME_CMP (real_path, rp) == 0) ! { ! return pst; ! } ! } ! } /* Now, search for a matching tail (only if name doesn't have any dirs) */