diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2013-02-03 16:20:20 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2013-02-03 16:20:20 +0000 |
commit | fbd9ab743390e50f3f829f4d634deb931cc2b819 (patch) | |
tree | 0cc29024ce3314c46ba19bed5702e4f86ab6f0c8 /gdb/psymtab.c | |
parent | 56d397a3824d826cdbaa02dba633bd86da6308c5 (diff) | |
download | gdb-fbd9ab743390e50f3f829f4d634deb931cc2b819.zip gdb-fbd9ab743390e50f3f829f4d634deb931cc2b819.tar.gz gdb-fbd9ab743390e50f3f829f4d634deb931cc2b819.tar.bz2 |
gdb/
* dwarf2read.c (dw2_expand_symtabs_matching): Add basenames parameter
to the file_matcher parameter. Pass 0 to it.
(dwarf2_create_include_psymtab): Copy also DIRNAME.
* psymtab.c (partial_map_symtabs_matching_filename): Drop handling of
NULL psymtab_to_fullname result.
(psymtab_to_fullname): Remove variable r. Never return NULL, assemble
an expected filename instead.
(expand_symtabs_matching_via_partial): Add basenames parameter to the
file_matcher parameter. Call also psymtab_to_fullname, after newly
considering BASENAMES_MAY_DIFFER.
* source.c (rewrite_source_path): Remove static.
* source.h (rewrite_source_path): New declaration.
* symfile.h (struct quick_symbol_functions): Add basenames parameter to
the expand_symtabs_matching field. Comment it.
* symtab.c (file_matches): New function comment. Add parameter
basenames, implement it.
(search_symbols_file_matches): Add basenames parameter. Update the
file_matches caller.
(search_symbols): Match FILES also against symtab_to_fullname.
Optimize it for BASENAMES_MAY_DIFFER.
gdb/testsuite/
* gdb.base/fullpath-expand-func.c: New file.
* gdb.base/fullpath-expand.c: New file.
* gdb.base/fullpath-expand.exp: New file.
* gdb.base/realname-expand-real.c: New file.
* gdb.base/realname-expand.c: New file.
* gdb.base/realname-expand.exp: New file.
Diffstat (limited to 'gdb/psymtab.c')
-rw-r--r-- | gdb/psymtab.c | 55 |
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; } |