Fwd: [PATCH] skip -gfile: call fnmatch without FNM_FILE_NAME

Fangrui Song maskray@sourceware.org
Mon Dec 30 03:09:34 GMT 2024


Sorry, sent wrongly to gdb@sourceware.org ...


---

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.  Drop the
FNM_FILE_NAME flag.
---
 gdb/doc/gdb.texinfo | 2 +-
 gdb/skip.c          | 4 ++--
 gdb/symtab.c        | 4 ++--
 gdb/utils.c         | 2 --
 4 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index b985399cf34..7ae486e3b7a 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -6737,7 +6737,7 @@ 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 metacharacter @code{*} matches slashes.

 @smallexample
 (@value{GDBP}) skip -gfi utils/*.c
diff --git a/gdb/skip.c b/gdb/skip.c
index 3791c29b1e0..082fd2edbc8 100644
--- a/gdb/skip.c
+++ b/gdb/skip.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,7 +542,7 @@ 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
     {
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 106e540ca48..00c470b4d3e 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -609,7 +609,7 @@ compare_glob_filenames_for_search (const char *filename,
     {
       return (search_path_elements == file_path_elements
              && gdb_filename_fnmatch (search_name, filename,
-                                      FNM_FILE_NAME | FNM_NOESCAPE) == 0);
+                                      FNM_NOESCAPE) == 0);
     }

   {
@@ -618,7 +618,7 @@ compare_glob_filenames_for_search (const char *filename,
                                     file_path_elements - search_path_elements);

     return gdb_filename_fnmatch (search_name, file_to_compare,
-                                FNM_FILE_NAME | FNM_NOESCAPE) == 0;
+                                FNM_NOESCAPE) == 0;
   }
 }

diff --git a/gdb/utils.c b/gdb/utils.c
index 6f2055e299d..d39cbacba71 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -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);

--
2.47.1


More information about the Gdb-patches mailing list