#include "common/gdb_optional.h"
 #include <list>
 
+/* True if we want to print debug printouts related to file/function
+   skipping. */
+static int debug_skip = 0;
+
 class skiplist_entry
 {
 public:
 bool
 skiplist_entry::do_skip_file_p (const symtab_and_line &function_sal) const
 {
+  if (debug_skip)
+    fprintf_unfiltered (gdb_stdlog,
+                       "skip: checking if file %s matches non-glob %s...",
+                       function_sal.symtab->filename, m_file.c_str ());
+
+  bool result;
+
   /* Check first sole SYMTAB->FILENAME.  It may not be a substring of
      symtab_to_fullname as it may contain "./" etc.  */
   if (compare_filenames_for_search (function_sal.symtab->filename,
                                    m_file.c_str ()))
-    return true;
+    result = true;
 
   /* Before we invoke realpath, which can get expensive when many
      files are involved, do a quick comparison of the basenames.  */
-  if (!basenames_may_differ
-      && filename_cmp (lbasename (function_sal.symtab->filename),
-                      lbasename (m_file.c_str ())) != 0)
-    return false;
+  else if (!basenames_may_differ
+          && filename_cmp (lbasename (function_sal.symtab->filename),
+                           lbasename (m_file.c_str ())) != 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);
 
-  /* Note: symtab_to_fullname caches its result, thus we don't have to.  */
-  {
-    const char *fullname = symtab_to_fullname (function_sal.symtab);
+      result = compare_filenames_for_search (fullname, m_file.c_str ());
+    }
 
-    if (compare_filenames_for_search (fullname, m_file.c_str ()))
-      return true;
-  }
+  if (debug_skip)
+    fprintf_unfiltered (gdb_stdlog, result ? "yes.\n" : "no.\n");
 
-  return false;
+  return result;
 }
 
 bool
 skiplist_entry::do_skip_gfile_p (const symtab_and_line &function_sal) const
 {
+  if (debug_skip)
+    fprintf_unfiltered (gdb_stdlog,
+                       "skip: checking if file %s matches glob %s...",
+                       function_sal.symtab->filename, m_file.c_str ());
+
+  bool result;
+
   /* 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)
-    return true;
+    result = true;
 
   /* Before we invoke symtab_to_fullname, which is expensive, do a quick
      comparison of the basenames.
      Note that we assume that lbasename works with glob-style patterns.
      If the basename of the glob pattern is something like "*.c" then this
      isn't much of a win.  Oh well.  */
-  if (!basenames_may_differ
+  else if (!basenames_may_differ
       && gdb_filename_fnmatch (lbasename (m_file.c_str ()),
                               lbasename (function_sal.symtab->filename),
                               FNM_FILE_NAME | FNM_NOESCAPE) != 0)
-    return false;
+    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);
 
-  /* 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 ());
+    }
 
-    if (compare_glob_filenames_for_search (fullname, m_file.c_str ()))
-      return true;
-  }
+  if (debug_skip)
+    fprintf_unfiltered (gdb_stdlog, result ? "yes.\n" : "no.\n");
 
-  return false;
+  return result;
 }
 
 bool
   if (m_function.empty ())
     return false;
 
+  bool result;
+
   if (m_function_is_regexp)
     {
+      if (debug_skip)
+        fprintf_unfiltered (gdb_stdlog,
+                           "skip: checking if function %s matches regex %s...",
+                           function_name, m_function.c_str ());
+
       gdb_assert (m_compiled_function_regexp);
-      return (m_compiled_function_regexp->exec (function_name, 0, NULL, 0)
-             == 0);
+      result
+       = (m_compiled_function_regexp->exec (function_name, 0, NULL, 0) == 0);
     }
   else
-    return strcmp_iw (function_name, m_function.c_str ()) == 0;
+    {
+      if (debug_skip)
+        fprintf_unfiltered (gdb_stdlog,
+                           ("skip: checking if function %s matches non-regex "
+                            "%s..."),
+                           function_name, m_function.c_str ());
+      result = (strcmp_iw (function_name, m_function.c_str ()) == 0);
+    }
+
+  if (debug_skip)
+    fprintf_unfiltered (gdb_stdlog, result ? "yes.\n" : "no.\n");
+
+  return result;
 }
 
 /* See skip.h.  */
 The \"Type\" column indicates one of:\n\
 \tfile        - ignored file\n\
 \tfunction    - ignored function"));
+
+  add_setshow_boolean_cmd ("skip", class_maintenance,
+                          &debug_skip, _("\
+Set whether to print the debug output about skipping files and functions."),
+                          _("\
+Show whether the debug output about skipping files and functions is printed"),
+                          _("\
+When non-zero, debug output about skipping files and functions is displayed."),
+                          NULL, NULL,
+                          &setdebuglist, &showdebuglist);
 }