aboutsummaryrefslogtreecommitdiff
path: root/gdb/psymtab.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/psymtab.c')
-rw-r--r--gdb/psymtab.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 7c48599..2965e9f 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -204,9 +204,7 @@ partial_map_symtabs_matching_filename (struct objfile *objfile,
{
gdb_assert (IS_ABSOLUTE_PATH (real_path));
gdb_assert (IS_ABSOLUTE_PATH (name));
- psymtab_to_fullname (pst);
- if (pst->fullname != NULL
- && FILENAME_CMP (real_path, pst->fullname) == 0)
+ if (filename_cmp (psymtab_to_fullname (pst), real_path) == 0)
{
if (partial_map_expand_apply (objfile, name, real_path,
pst, callback, data))
@@ -1161,28 +1159,39 @@ map_symbol_filenames_psymtab (struct objfile *objfile,
static const char *
psymtab_to_fullname (struct partial_symtab *ps)
{
- int r;
-
- if (!ps)
- return NULL;
- if (ps->anonymous)
- return NULL;
+ gdb_assert (!ps->anonymous);
/* Use cached copy if we have it.
We rely on forget_cached_source_info being called appropriately
to handle cases like the file being moved. */
- if (ps->fullname)
- return ps->fullname;
+ if (ps->fullname == NULL)
+ {
+ int fd = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
- r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
+ if (fd >= 0)
+ close (fd);
+ else
+ {
+ char *fullname;
+ struct cleanup *back_to;
- if (r >= 0)
- {
- close (r);
- return ps->fullname;
- }
+ /* rewrite_source_path would be applied by find_and_open_source, we
+ should report the pathname where GDB tried to find the file. */
- return NULL;
+ if (ps->dirname == NULL || IS_ABSOLUTE_PATH (ps->filename))
+ fullname = xstrdup (ps->filename);
+ else
+ fullname = concat (ps->dirname, SLASH_STRING, ps->filename, NULL);
+
+ back_to = make_cleanup (xfree, fullname);
+ ps->fullname = rewrite_source_path (fullname);
+ if (ps->fullname == NULL)
+ ps->fullname = xstrdup (fullname);
+ do_cleanups (back_to);
+ }
+ }
+
+ return ps->fullname;
}
static const char *
@@ -1354,7 +1363,7 @@ recursively_search_psymtabs (struct partial_symtab *ps,
static void
expand_symtabs_matching_via_partial
(struct objfile *objfile,
- int (*file_matcher) (const char *, void *),
+ int (*file_matcher) (const char *, void *, int basenames),
int (*name_matcher) (const char *, void *),
enum search_domain kind,
void *data)
@@ -1381,7 +1390,13 @@ expand_symtabs_matching_via_partial
{
if (ps->anonymous)
continue;
- if (! (*file_matcher) (ps->filename, data))
+
+ /* Before we invoke realpath, which can get expensive when many
+ files are involved, do a quick comparison of the basenames. */
+ if (!(*file_matcher) (ps->filename, data, 0)
+ && (basenames_may_differ
+ || (*file_matcher) (lbasename (ps->filename), data, 1))
+ && !(*file_matcher) (psymtab_to_fullname (ps), data, 0))
continue;
}