1 /* Skipping uninteresting files and functions while stepping.
3 Copyright (C) 2011-2017 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
26 #include "completer.h"
28 #include "cli/cli-utils.h"
29 #include "arch-utils.h"
32 #include "breakpoint.h" /* for get_sal_arch () */
34 #include "filenames.h"
36 #include "gdb_regex.h"
37 #include "common/gdb_optional.h"
43 /* Non-zero if FILE is a glob-style pattern.
44 Otherewise it is the plain file name (possibly with directories). */
47 /* The name of the file or NULL.
48 The skiplist entry owns this pointer. */
51 /* Non-zero if FUNCTION is a regexp.
52 Otherwise it is a plain function name (possibly with arguments,
54 int function_is_regexp;
56 /* The name of the function or NULL.
57 The skiplist entry owns this pointer. */
60 /* If this is a function regexp, the compiled form. */
61 gdb::optional<compiled_regex> compiled_function_regexp;
65 struct skiplist_entry *next;
68 static void add_skiplist_entry (struct skiplist_entry *e);
70 static struct skiplist_entry *skiplist_entry_chain;
71 static int skiplist_entry_count;
73 #define ALL_SKIPLIST_ENTRIES(E) \
74 for (E = skiplist_entry_chain; E; E = E->next)
76 #define ALL_SKIPLIST_ENTRIES_SAFE(E,TMP) \
77 for (E = skiplist_entry_chain; \
78 E ? (TMP = E->next, 1) : 0; \
81 /* Create a skip object. */
83 static struct skiplist_entry *
84 make_skip_entry (int file_is_glob, const char *file,
85 int function_is_regexp, const char *function)
87 struct skiplist_entry *e = XCNEW (struct skiplist_entry);
89 gdb_assert (file != NULL || function != NULL);
91 gdb_assert (file != NULL);
92 if (function_is_regexp)
93 gdb_assert (function != NULL);
96 e->file = xstrdup (file);
98 e->function = xstrdup (function);
99 e->file_is_glob = file_is_glob;
100 e->function_is_regexp = function_is_regexp;
106 /* Free a skiplist entry. */
109 free_skiplist_entry (struct skiplist_entry *e)
116 /* Wrapper to free_skiplist_entry for use as a cleanup. */
119 free_skiplist_entry_cleanup (void *e)
121 free_skiplist_entry ((struct skiplist_entry *) e);
124 /* Create a cleanup to free skiplist entry E. */
126 static struct cleanup *
127 make_free_skiplist_entry_cleanup (struct skiplist_entry *e)
129 return make_cleanup (free_skiplist_entry_cleanup, e);
133 skip_file_command (char *arg, int from_tty)
135 struct symtab *symtab;
136 const char *filename = NULL;
138 /* If no argument was given, try to default to the last
139 displayed codepoint. */
142 symtab = get_last_displayed_symtab ();
144 error (_("No default file now."));
146 /* It is not a typo, symtab_to_filename_for_display woule be needlessly
148 filename = symtab_to_fullname (symtab);
153 add_skiplist_entry (make_skip_entry (0, filename, 0, NULL));
155 printf_filtered (_("File %s will be skipped when stepping.\n"), filename);
158 /* Create a skiplist entry for the given function NAME and add it to the
162 skip_function (const char *name)
164 add_skiplist_entry (make_skip_entry (0, NULL, 0, name));
166 printf_filtered (_("Function %s will be skipped when stepping.\n"), name);
170 skip_function_command (char *arg, int from_tty)
172 /* Default to the current function if no argument is given. */
175 const char *name = NULL;
178 if (!last_displayed_sal_is_valid ())
179 error (_("No default function now."));
181 pc = get_last_displayed_addr ();
182 if (!find_pc_partial_function (pc, &name, NULL, NULL))
184 error (_("No function found containing current program point %s."),
185 paddress (get_current_arch (), pc));
187 skip_function (name);
194 /* Compile the regexp in E.
195 An error is thrown if there's an error.
196 MESSAGE is used as a prefix of the error message. */
199 compile_skip_regexp (struct skiplist_entry *e, const char *message)
201 int flags = REG_NOSUB;
204 flags |= REG_EXTENDED;
207 gdb_assert (e->function_is_regexp && e->function != NULL);
208 e->compiled_function_regexp.emplace (e->function, flags, message);
211 /* Process "skip ..." that does not match "skip file" or "skip function". */
214 skip_command (char *arg, int from_tty)
216 const char *file = NULL;
217 const char *gfile = NULL;
218 const char *function = NULL;
219 const char *rfunction = NULL;
220 struct skiplist_entry *e;
225 skip_function_command (arg, from_tty);
231 for (i = 0; argv[i] != NULL; ++i)
233 const char *p = argv[i];
234 const char *value = argv[i + 1];
236 if (strcmp (p, "-fi") == 0
237 || strcmp (p, "-file") == 0)
240 error (_("Missing value for %s option."), p);
244 else if (strcmp (p, "-gfi") == 0
245 || strcmp (p, "-gfile") == 0)
248 error (_("Missing value for %s option."), p);
252 else if (strcmp (p, "-fu") == 0
253 || strcmp (p, "-function") == 0)
256 error (_("Missing value for %s option."), p);
260 else if (strcmp (p, "-rfu") == 0
261 || strcmp (p, "-rfunction") == 0)
264 error (_("Missing value for %s option."), p);
269 error (_("Invalid skip option: %s"), p);
272 /* Assume the user entered "skip FUNCTION-NAME".
273 FUNCTION-NAME may be `foo (int)', and therefore we pass the
274 complete original arg to skip_function command as if the user
275 typed "skip function arg". */
276 skip_function_command (arg, from_tty);
280 error (_("Invalid argument: %s"), p);
283 if (file != NULL && gfile != NULL)
284 error (_("Cannot specify both -file and -gfile."));
286 if (function != NULL && rfunction != NULL)
287 error (_("Cannot specify both -function and -rfunction."));
289 /* This shouldn't happen as "skip" by itself gets punted to
290 skip_function_command. */
291 gdb_assert (file != NULL || gfile != NULL
292 || function != NULL || rfunction != NULL);
294 e = make_skip_entry (gfile != NULL, file ? file : gfile,
295 rfunction != NULL, function ? function : rfunction);
296 if (rfunction != NULL)
298 struct cleanup *rf_cleanups = make_free_skiplist_entry_cleanup (e);
300 compile_skip_regexp (e, _("regexp"));
301 discard_cleanups (rf_cleanups);
303 add_skiplist_entry (e);
305 /* I18N concerns drive some of the choices here (we can't piece together
306 the output too much). OTOH we want to keep this simple. Therefore the
307 only polish we add to the output is to append "(s)" to "File" or
308 "Function" if they're a glob/regexp. */
310 const char *file_to_print = file != NULL ? file : gfile;
311 const char *function_to_print = function != NULL ? function : rfunction;
312 const char *file_text = gfile != NULL ? _("File(s)") : _("File");
313 const char *lower_file_text = gfile != NULL ? _("file(s)") : _("file");
314 const char *function_text
315 = rfunction != NULL ? _("Function(s)") : _("Function");
317 if (function_to_print == NULL)
319 printf_filtered (_("%s %s will be skipped when stepping.\n"),
320 file_text, file_to_print);
322 else if (file_to_print == NULL)
324 printf_filtered (_("%s %s will be skipped when stepping.\n"),
325 function_text, function_to_print);
329 printf_filtered (_("%s %s in %s %s will be skipped"
330 " when stepping.\n"),
331 function_text, function_to_print,
332 lower_file_text, file_to_print);
338 skip_info (char *arg, int from_tty)
340 struct skiplist_entry *e;
341 int num_printable_entries = 0;
342 struct value_print_options opts;
344 get_user_print_options (&opts);
346 /* Count the number of rows in the table and see if we need space for a
347 64-bit address anywhere. */
348 ALL_SKIPLIST_ENTRIES (e)
349 if (arg == NULL || number_is_in_list (arg, e->number))
350 num_printable_entries++;
352 if (num_printable_entries == 0)
355 current_uiout->message (_("Not skipping any files or functions.\n"));
357 current_uiout->message (
358 _("No skiplist entries found with number %s.\n"), arg);
363 ui_out_emit_table table_emitter (current_uiout, 6, num_printable_entries,
366 current_uiout->table_header (5, ui_left, "number", "Num"); /* 1 */
367 current_uiout->table_header (3, ui_left, "enabled", "Enb"); /* 2 */
368 current_uiout->table_header (4, ui_right, "regexp", "Glob"); /* 3 */
369 current_uiout->table_header (20, ui_left, "file", "File"); /* 4 */
370 current_uiout->table_header (2, ui_right, "regexp", "RE"); /* 5 */
371 current_uiout->table_header (40, ui_noalign, "function", "Function"); /* 6 */
372 current_uiout->table_body ();
374 ALL_SKIPLIST_ENTRIES (e)
378 if (arg != NULL && !number_is_in_list (arg, e->number))
381 ui_out_emit_tuple tuple_emitter (current_uiout, "blklst-entry");
382 current_uiout->field_int ("number", e->number); /* 1 */
385 current_uiout->field_string ("enabled", "y"); /* 2 */
387 current_uiout->field_string ("enabled", "n"); /* 2 */
390 current_uiout->field_string ("regexp", "y"); /* 3 */
392 current_uiout->field_string ("regexp", "n"); /* 3 */
394 current_uiout->field_string ("file",
395 e->file ? e->file : "<none>"); /* 4 */
396 if (e->function_is_regexp)
397 current_uiout->field_string ("regexp", "y"); /* 5 */
399 current_uiout->field_string ("regexp", "n"); /* 5 */
401 current_uiout->field_string (
402 "function", e->function ? e->function : "<none>"); /* 6 */
404 current_uiout->text ("\n");
409 skip_enable_command (char *arg, int from_tty)
411 struct skiplist_entry *e;
414 ALL_SKIPLIST_ENTRIES (e)
415 if (arg == NULL || number_is_in_list (arg, e->number))
422 error (_("No skiplist entries found with number %s."), arg);
426 skip_disable_command (char *arg, int from_tty)
428 struct skiplist_entry *e;
431 ALL_SKIPLIST_ENTRIES (e)
432 if (arg == NULL || number_is_in_list (arg, e->number))
439 error (_("No skiplist entries found with number %s."), arg);
443 skip_delete_command (char *arg, int from_tty)
445 struct skiplist_entry *e, *temp, *b_prev;
449 ALL_SKIPLIST_ENTRIES_SAFE (e, temp)
450 if (arg == NULL || number_is_in_list (arg, e->number))
453 b_prev->next = e->next;
455 skiplist_entry_chain = e->next;
457 free_skiplist_entry (e);
466 error (_("No skiplist entries found with number %s."), arg);
469 /* Add the given skiplist entry to our list, and set the entry's number. */
472 add_skiplist_entry (struct skiplist_entry *e)
474 struct skiplist_entry *e1;
476 e->number = ++skiplist_entry_count;
478 /* Add to the end of the chain so that the list of
479 skiplist entries will be in numerical order. */
481 e1 = skiplist_entry_chain;
483 skiplist_entry_chain = e;
492 /* Return non-zero if we're stopped at a file to be skipped. */
495 skip_file_p (struct skiplist_entry *e,
496 const struct symtab_and_line *function_sal)
498 gdb_assert (e->file != NULL && !e->file_is_glob);
500 if (function_sal->symtab == NULL)
503 /* Check first sole SYMTAB->FILENAME. It may not be a substring of
504 symtab_to_fullname as it may contain "./" etc. */
505 if (compare_filenames_for_search (function_sal->symtab->filename, e->file))
508 /* Before we invoke realpath, which can get expensive when many
509 files are involved, do a quick comparison of the basenames. */
510 if (!basenames_may_differ
511 && filename_cmp (lbasename (function_sal->symtab->filename),
512 lbasename (e->file)) != 0)
515 /* Note: symtab_to_fullname caches its result, thus we don't have to. */
517 const char *fullname = symtab_to_fullname (function_sal->symtab);
519 if (compare_filenames_for_search (fullname, e->file))
526 /* Return non-zero if we're stopped at a globbed file to be skipped. */
529 skip_gfile_p (struct skiplist_entry *e,
530 const struct symtab_and_line *function_sal)
532 gdb_assert (e->file != NULL && e->file_is_glob);
534 if (function_sal->symtab == NULL)
537 /* Check first sole SYMTAB->FILENAME. It may not be a substring of
538 symtab_to_fullname as it may contain "./" etc. */
539 if (gdb_filename_fnmatch (e->file, function_sal->symtab->filename,
540 FNM_FILE_NAME | FNM_NOESCAPE) == 0)
543 /* Before we invoke symtab_to_fullname, which is expensive, do a quick
544 comparison of the basenames.
545 Note that we assume that lbasename works with glob-style patterns.
546 If the basename of the glob pattern is something like "*.c" then this
547 isn't much of a win. Oh well. */
548 if (!basenames_may_differ
549 && gdb_filename_fnmatch (lbasename (e->file),
550 lbasename (function_sal->symtab->filename),
551 FNM_FILE_NAME | FNM_NOESCAPE) != 0)
554 /* Note: symtab_to_fullname caches its result, thus we don't have to. */
556 const char *fullname = symtab_to_fullname (function_sal->symtab);
558 if (compare_glob_filenames_for_search (fullname, e->file))
565 /* Return non-zero if we're stopped at a function to be skipped. */
568 skip_function_p (struct skiplist_entry *e, const char *function_name)
570 gdb_assert (e->function != NULL && !e->function_is_regexp);
571 return strcmp_iw (function_name, e->function) == 0;
574 /* Return non-zero if we're stopped at a function regexp to be skipped. */
577 skip_rfunction_p (struct skiplist_entry *e, const char *function_name)
579 gdb_assert (e->function != NULL && e->function_is_regexp
580 && e->compiled_function_regexp);
581 return (e->compiled_function_regexp->exec (function_name, 0, NULL, 0)
588 function_name_is_marked_for_skip (const char *function_name,
589 const struct symtab_and_line *function_sal)
591 struct skiplist_entry *e;
593 if (function_name == NULL)
596 ALL_SKIPLIST_ENTRIES (e)
598 int skip_by_file = 0;
599 int skip_by_function = 0;
608 if (skip_gfile_p (e, function_sal))
613 if (skip_file_p (e, function_sal))
617 if (e->function != NULL)
619 if (e->function_is_regexp)
621 if (skip_rfunction_p (e, function_name))
622 skip_by_function = 1;
626 if (skip_function_p (e, function_name))
627 skip_by_function = 1;
631 /* If both file and function must match, make sure we don't errantly
632 exit if only one of them match. */
633 if (e->file != NULL && e->function != NULL)
635 if (skip_by_file && skip_by_function)
638 /* Only one of file/function is specified. */
639 else if (skip_by_file || skip_by_function)
646 /* Provide a prototype to silence -Wmissing-prototypes. */
647 extern initialize_file_ftype _initialize_step_skip;
650 _initialize_step_skip (void)
652 static struct cmd_list_element *skiplist = NULL;
653 struct cmd_list_element *c;
655 skiplist_entry_chain = 0;
656 skiplist_entry_count = 0;
658 add_prefix_cmd ("skip", class_breakpoint, skip_command, _("\
659 Ignore a function while stepping.\n\
661 Usage: skip [FUNCTION-NAME]\n\
662 skip [<file-spec>] [<function-spec>]\n\
663 If no arguments are given, ignore the current function.\n\
665 <file-spec> is one of:\n\
666 -fi|-file FILE-NAME\n\
667 -gfi|-gfile GLOB-FILE-PATTERN\n\
668 <function-spec> is one of:\n\
669 -fu|-function FUNCTION-NAME\n\
670 -rfu|-rfunction FUNCTION-NAME-REGULAR-EXPRESSION"),
671 &skiplist, "skip ", 1, &cmdlist);
673 c = add_cmd ("file", class_breakpoint, skip_file_command, _("\
674 Ignore a file while stepping.\n\
675 Usage: skip file [FILE-NAME]\n\
676 If no filename is given, ignore the current file."),
678 set_cmd_completer (c, filename_completer);
680 c = add_cmd ("function", class_breakpoint, skip_function_command, _("\
681 Ignore a function while stepping.\n\
682 Usage: skip function [FUNCTION-NAME]\n\
683 If no function name is given, skip the current function."),
685 set_cmd_completer (c, location_completer);
687 add_cmd ("enable", class_breakpoint, skip_enable_command, _("\
688 Enable skip entries. You can specify numbers (e.g. \"skip enable 1 3\"), \
689 ranges (e.g. \"skip enable 4-8\"), or both (e.g. \"skip enable 1 3 4-8\").\n\n\
690 If you don't specify any numbers or ranges, we'll enable all skip entries.\n\n\
691 Usage: skip enable [NUMBERS AND/OR RANGES]"),
694 add_cmd ("disable", class_breakpoint, skip_disable_command, _("\
695 Disable skip entries. You can specify numbers (e.g. \"skip disable 1 3\"), \
696 ranges (e.g. \"skip disable 4-8\"), or both (e.g. \"skip disable 1 3 4-8\").\n\n\
697 If you don't specify any numbers or ranges, we'll disable all skip entries.\n\n\
698 Usage: skip disable [NUMBERS AND/OR RANGES]"),
701 add_cmd ("delete", class_breakpoint, skip_delete_command, _("\
702 Delete skip entries. You can specify numbers (e.g. \"skip delete 1 3\"), \
703 ranges (e.g. \"skip delete 4-8\"), or both (e.g. \"skip delete 1 3 4-8\").\n\n\
704 If you don't specify any numbers or ranges, we'll delete all skip entries.\n\n\
705 Usage: skip delete [NUMBERS AND/OR RANGES]"),
708 add_info ("skip", skip_info, _("\
709 Display the status of skips. You can specify numbers (e.g. \"skip info 1 3\"), \
710 ranges (e.g. \"skip info 4-8\"), or both (e.g. \"skip info 1 3 4-8\").\n\n\
711 If you don't specify any numbers or ranges, we'll show all skips.\n\n\
712 Usage: skip info [NUMBERS AND/OR RANGES]\n\
713 The \"Type\" column indicates one of:\n\
714 \tfile - ignored file\n\
715 \tfunction - ignored function"));