diff options
author | Fangrui Song <maskray@sourceware.org> | 2024-12-29 14:57:44 -0800 |
---|---|---|
committer | Fangrui Song <maskray@sourceware.org> | 2025-01-03 21:15:32 -0800 |
commit | 02646a4c561ec88491114b87950cbb827c7d614c (patch) | |
tree | 141ce322af8de9f451a346fd48bf8856e8711c17 | |
parent | d8d3ed295efb75a7421340484e3fe8115402b1f2 (diff) | |
download | gdb-02646a4c561ec88491114b87950cbb827c7d614c.zip gdb-02646a4c561ec88491114b87950cbb827c7d614c.tar.gz gdb-02646a4c561ec88491114b87950cbb827c7d614c.tar.bz2 |
skip -gfile: call fnmatch without FNM_FILE_NAME
fnmatch is called with the FNM_FILE_NAME flag so that `skip -gfi /usr/*`
doesn't match /usr/include/*. This makes the file matching feature not
useful for STL headers that reside in multiple directories. In
addition, the user cannot use a single `*` to match multiple leading
path components.
Let's drop the FNM_FILE_NAME flag and remove the assertion from
gdb_filename_fnmatch (originally for the auto-load feature).
-rw-r--r-- | gdb/doc/gdb.texinfo | 4 | ||||
-rw-r--r-- | gdb/skip.c | 6 | ||||
-rw-r--r-- | gdb/symtab.c | 34 | ||||
-rw-r--r-- | gdb/utils.c | 6 |
4 files changed, 8 insertions, 42 deletions
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index b985399..c77ac7f 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -6737,7 +6737,9 @@ Functions in @var{file} will be skipped over when stepping. @itemx -gfi @var{file-glob-pattern} @cindex skipping over files via glob-style patterns Functions in files matching @var{file-glob-pattern} will be skipped -over when stepping. +over when stepping. The directory separator character @file{/} is treated as a +regular character, so it can be matched by wildcard characters @file{*} and +@file{?}. @smallexample (@value{GDBP}) skip -gfi utils/*.c @@ -531,7 +531,7 @@ skiplist_entry::do_skip_gfile_p (const symtab_and_line &function_sal) const /* Check first sole SYMTAB->FILENAME. It may not be a substring of symtab_to_fullname as it may contain "./" etc. */ if (gdb_filename_fnmatch (m_file.c_str (), function_sal.symtab->filename, - FNM_FILE_NAME | FNM_NOESCAPE) == 0) + FNM_NOESCAPE) == 0) result = true; /* Before we invoke symtab_to_fullname, which is expensive, do a quick @@ -542,14 +542,14 @@ skiplist_entry::do_skip_gfile_p (const symtab_and_line &function_sal) const else if (!basenames_may_differ && gdb_filename_fnmatch (lbasename (m_file.c_str ()), lbasename (function_sal.symtab->filename), - FNM_FILE_NAME | FNM_NOESCAPE) != 0) + FNM_NOESCAPE) != 0) result = false; else { /* Note: symtab_to_fullname caches its result, thus we don't have to. */ const char *fullname = symtab_to_fullname (function_sal.symtab); - result = compare_glob_filenames_for_search (fullname, m_file.c_str ()); + result = gdb_filename_fnmatch (m_file.c_str (), fullname, FNM_NOESCAPE); } if (debug_skip) diff --git a/gdb/symtab.c b/gdb/symtab.c index 106e540..ba42126 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -588,40 +588,6 @@ compare_filenames_for_search (const char *filename, const char *search_name) && STRIP_DRIVE_SPEC (filename) == &filename[len - search_len])); } -/* Same as compare_filenames_for_search, but for glob-style patterns. - Heads up on the order of the arguments. They match the order of - compare_filenames_for_search, but it's the opposite of the order of - arguments to gdb_filename_fnmatch. */ - -bool -compare_glob_filenames_for_search (const char *filename, - const char *search_name) -{ - /* We rely on the property of glob-style patterns with FNM_FILE_NAME that - all /s have to be explicitly specified. */ - int file_path_elements = count_path_elements (filename); - int search_path_elements = count_path_elements (search_name); - - if (search_path_elements > file_path_elements) - return false; - - if (IS_ABSOLUTE_PATH (search_name)) - { - return (search_path_elements == file_path_elements - && gdb_filename_fnmatch (search_name, filename, - FNM_FILE_NAME | FNM_NOESCAPE) == 0); - } - - { - const char *file_to_compare - = strip_leading_path_elements (filename, - file_path_elements - search_path_elements); - - return gdb_filename_fnmatch (search_name, file_to_compare, - FNM_FILE_NAME | FNM_NOESCAPE) == 0; - } -} - /* Check for a symtab of a specific name by searching some symtabs. This is a helper function for callbacks of iterate_over_symtabs. diff --git a/gdb/utils.c b/gdb/utils.c index 6f2055e..4027d4f 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -3491,8 +3491,8 @@ wait_to_die_with_timeout (pid_t pid, int *status, int timeout) #endif /* HAVE_WAITPID */ -/* Provide fnmatch compatible function for FNM_FILE_NAME matching of host files. - Both FNM_FILE_NAME and FNM_NOESCAPE must be set in FLAGS. +/* Provide fnmatch compatible function for matching of host files. + FNM_NOESCAPE must be set in FLAGS. It handles correctly HAVE_DOS_BASED_FILE_SYSTEM and HAVE_CASE_INSENSITIVE_FILE_SYSTEM. */ @@ -3500,8 +3500,6 @@ wait_to_die_with_timeout (pid_t pid, int *status, int timeout) int gdb_filename_fnmatch (const char *pattern, const char *string, int flags) { - gdb_assert ((flags & FNM_FILE_NAME) != 0); - /* It is unclear how '\' escaping vs. directory separator should coexist. */ gdb_assert ((flags & FNM_NOESCAPE) != 0); |