Introduce and use ui_out_emit_table
[deliverable/binutils-gdb.git] / gdb / skip.c
1 /* Skipping uninteresting files and functions while stepping.
2
3 Copyright (C) 2011-2017 Free Software Foundation, Inc.
4
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.
9
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.
14
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/>. */
17
18 #include "defs.h"
19 #include "skip.h"
20 #include "value.h"
21 #include "valprint.h"
22 #include "ui-out.h"
23 #include "symtab.h"
24 #include "gdbcmd.h"
25 #include "command.h"
26 #include "completer.h"
27 #include "stack.h"
28 #include "cli/cli-utils.h"
29 #include "arch-utils.h"
30 #include "linespec.h"
31 #include "objfiles.h"
32 #include "breakpoint.h" /* for get_sal_arch () */
33 #include "source.h"
34 #include "filenames.h"
35 #include "fnmatch.h"
36 #include "gdb_regex.h"
37 #include "common/gdb_optional.h"
38
39 struct skiplist_entry
40 {
41 int number;
42
43 /* Non-zero if FILE is a glob-style pattern.
44 Otherewise it is the plain file name (possibly with directories). */
45 int file_is_glob;
46
47 /* The name of the file or NULL.
48 The skiplist entry owns this pointer. */
49 char *file;
50
51 /* Non-zero if FUNCTION is a regexp.
52 Otherwise it is a plain function name (possibly with arguments,
53 for C++). */
54 int function_is_regexp;
55
56 /* The name of the function or NULL.
57 The skiplist entry owns this pointer. */
58 char *function;
59
60 /* If this is a function regexp, the compiled form. */
61 gdb::optional<compiled_regex> compiled_function_regexp;
62
63 int enabled;
64
65 struct skiplist_entry *next;
66 };
67
68 static void add_skiplist_entry (struct skiplist_entry *e);
69
70 static struct skiplist_entry *skiplist_entry_chain;
71 static int skiplist_entry_count;
72
73 #define ALL_SKIPLIST_ENTRIES(E) \
74 for (E = skiplist_entry_chain; E; E = E->next)
75
76 #define ALL_SKIPLIST_ENTRIES_SAFE(E,TMP) \
77 for (E = skiplist_entry_chain; \
78 E ? (TMP = E->next, 1) : 0; \
79 E = TMP)
80
81 /* Create a skip object. */
82
83 static struct skiplist_entry *
84 make_skip_entry (int file_is_glob, const char *file,
85 int function_is_regexp, const char *function)
86 {
87 struct skiplist_entry *e = XCNEW (struct skiplist_entry);
88
89 gdb_assert (file != NULL || function != NULL);
90 if (file_is_glob)
91 gdb_assert (file != NULL);
92 if (function_is_regexp)
93 gdb_assert (function != NULL);
94
95 if (file != NULL)
96 e->file = xstrdup (file);
97 if (function != NULL)
98 e->function = xstrdup (function);
99 e->file_is_glob = file_is_glob;
100 e->function_is_regexp = function_is_regexp;
101 e->enabled = 1;
102
103 return e;
104 }
105
106 /* Free a skiplist entry. */
107
108 static void
109 free_skiplist_entry (struct skiplist_entry *e)
110 {
111 xfree (e->file);
112 xfree (e->function);
113 xfree (e);
114 }
115
116 /* Wrapper to free_skiplist_entry for use as a cleanup. */
117
118 static void
119 free_skiplist_entry_cleanup (void *e)
120 {
121 free_skiplist_entry ((struct skiplist_entry *) e);
122 }
123
124 /* Create a cleanup to free skiplist entry E. */
125
126 static struct cleanup *
127 make_free_skiplist_entry_cleanup (struct skiplist_entry *e)
128 {
129 return make_cleanup (free_skiplist_entry_cleanup, e);
130 }
131
132 static void
133 skip_file_command (char *arg, int from_tty)
134 {
135 struct symtab *symtab;
136 const char *filename = NULL;
137
138 /* If no argument was given, try to default to the last
139 displayed codepoint. */
140 if (arg == NULL)
141 {
142 symtab = get_last_displayed_symtab ();
143 if (symtab == NULL)
144 error (_("No default file now."));
145
146 /* It is not a typo, symtab_to_filename_for_display woule be needlessly
147 ambiguous. */
148 filename = symtab_to_fullname (symtab);
149 }
150 else
151 filename = arg;
152
153 add_skiplist_entry (make_skip_entry (0, filename, 0, NULL));
154
155 printf_filtered (_("File %s will be skipped when stepping.\n"), filename);
156 }
157
158 /* Create a skiplist entry for the given function NAME and add it to the
159 list. */
160
161 static void
162 skip_function (const char *name)
163 {
164 add_skiplist_entry (make_skip_entry (0, NULL, 0, name));
165
166 printf_filtered (_("Function %s will be skipped when stepping.\n"), name);
167 }
168
169 static void
170 skip_function_command (char *arg, int from_tty)
171 {
172 /* Default to the current function if no argument is given. */
173 if (arg == NULL)
174 {
175 const char *name = NULL;
176 CORE_ADDR pc;
177
178 if (!last_displayed_sal_is_valid ())
179 error (_("No default function now."));
180
181 pc = get_last_displayed_addr ();
182 if (!find_pc_partial_function (pc, &name, NULL, NULL))
183 {
184 error (_("No function found containing current program point %s."),
185 paddress (get_current_arch (), pc));
186 }
187 skip_function (name);
188 return;
189 }
190
191 skip_function (arg);
192 }
193
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. */
197
198 static void
199 compile_skip_regexp (struct skiplist_entry *e, const char *message)
200 {
201 int flags = REG_NOSUB;
202
203 #ifdef REG_EXTENDED
204 flags |= REG_EXTENDED;
205 #endif
206
207 gdb_assert (e->function_is_regexp && e->function != NULL);
208 e->compiled_function_regexp.emplace (e->function, flags, message);
209 }
210
211 /* Process "skip ..." that does not match "skip file" or "skip function". */
212
213 static void
214 skip_command (char *arg, int from_tty)
215 {
216 const char *file = NULL;
217 const char *gfile = NULL;
218 const char *function = NULL;
219 const char *rfunction = NULL;
220 char **argv;
221 struct cleanup *cleanups;
222 struct skiplist_entry *e;
223 int i;
224
225 if (arg == NULL)
226 {
227 skip_function_command (arg, from_tty);
228 return;
229 }
230
231 argv = buildargv (arg);
232 cleanups = make_cleanup_freeargv (argv);
233
234 for (i = 0; argv[i] != NULL; ++i)
235 {
236 const char *p = argv[i];
237 const char *value = argv[i + 1];
238
239 if (strcmp (p, "-fi") == 0
240 || strcmp (p, "-file") == 0)
241 {
242 if (value == NULL)
243 error (_("Missing value for %s option."), p);
244 file = value;
245 ++i;
246 }
247 else if (strcmp (p, "-gfi") == 0
248 || strcmp (p, "-gfile") == 0)
249 {
250 if (value == NULL)
251 error (_("Missing value for %s option."), p);
252 gfile = value;
253 ++i;
254 }
255 else if (strcmp (p, "-fu") == 0
256 || strcmp (p, "-function") == 0)
257 {
258 if (value == NULL)
259 error (_("Missing value for %s option."), p);
260 function = value;
261 ++i;
262 }
263 else if (strcmp (p, "-rfu") == 0
264 || strcmp (p, "-rfunction") == 0)
265 {
266 if (value == NULL)
267 error (_("Missing value for %s option."), p);
268 rfunction = value;
269 ++i;
270 }
271 else if (*p == '-')
272 error (_("Invalid skip option: %s"), p);
273 else if (i == 0)
274 {
275 /* Assume the user entered "skip FUNCTION-NAME".
276 FUNCTION-NAME may be `foo (int)', and therefore we pass the
277 complete original arg to skip_function command as if the user
278 typed "skip function arg". */
279 do_cleanups (cleanups);
280 skip_function_command (arg, from_tty);
281 return;
282 }
283 else
284 error (_("Invalid argument: %s"), p);
285 }
286
287 if (file != NULL && gfile != NULL)
288 error (_("Cannot specify both -file and -gfile."));
289
290 if (function != NULL && rfunction != NULL)
291 error (_("Cannot specify both -function and -rfunction."));
292
293 /* This shouldn't happen as "skip" by itself gets punted to
294 skip_function_command. */
295 gdb_assert (file != NULL || gfile != NULL
296 || function != NULL || rfunction != NULL);
297
298 e = make_skip_entry (gfile != NULL, file ? file : gfile,
299 rfunction != NULL, function ? function : rfunction);
300 if (rfunction != NULL)
301 {
302 struct cleanup *rf_cleanups = make_free_skiplist_entry_cleanup (e);
303
304 compile_skip_regexp (e, _("regexp"));
305 discard_cleanups (rf_cleanups);
306 }
307 add_skiplist_entry (e);
308
309 /* I18N concerns drive some of the choices here (we can't piece together
310 the output too much). OTOH we want to keep this simple. Therefore the
311 only polish we add to the output is to append "(s)" to "File" or
312 "Function" if they're a glob/regexp. */
313 {
314 const char *file_to_print = file != NULL ? file : gfile;
315 const char *function_to_print = function != NULL ? function : rfunction;
316 const char *file_text = gfile != NULL ? _("File(s)") : _("File");
317 const char *lower_file_text = gfile != NULL ? _("file(s)") : _("file");
318 const char *function_text
319 = rfunction != NULL ? _("Function(s)") : _("Function");
320
321 if (function_to_print == NULL)
322 {
323 printf_filtered (_("%s %s will be skipped when stepping.\n"),
324 file_text, file_to_print);
325 }
326 else if (file_to_print == NULL)
327 {
328 printf_filtered (_("%s %s will be skipped when stepping.\n"),
329 function_text, function_to_print);
330 }
331 else
332 {
333 printf_filtered (_("%s %s in %s %s will be skipped"
334 " when stepping.\n"),
335 function_text, function_to_print,
336 lower_file_text, file_to_print);
337 }
338 }
339
340 do_cleanups (cleanups);
341 }
342
343 static void
344 skip_info (char *arg, int from_tty)
345 {
346 struct skiplist_entry *e;
347 int num_printable_entries = 0;
348 struct value_print_options opts;
349
350 get_user_print_options (&opts);
351
352 /* Count the number of rows in the table and see if we need space for a
353 64-bit address anywhere. */
354 ALL_SKIPLIST_ENTRIES (e)
355 if (arg == NULL || number_is_in_list (arg, e->number))
356 num_printable_entries++;
357
358 if (num_printable_entries == 0)
359 {
360 if (arg == NULL)
361 current_uiout->message (_("Not skipping any files or functions.\n"));
362 else
363 current_uiout->message (
364 _("No skiplist entries found with number %s.\n"), arg);
365
366 return;
367 }
368
369 ui_out_emit_table table_emitter (current_uiout, 6, num_printable_entries,
370 "SkiplistTable");
371
372 current_uiout->table_header (5, ui_left, "number", "Num"); /* 1 */
373 current_uiout->table_header (3, ui_left, "enabled", "Enb"); /* 2 */
374 current_uiout->table_header (4, ui_right, "regexp", "Glob"); /* 3 */
375 current_uiout->table_header (20, ui_left, "file", "File"); /* 4 */
376 current_uiout->table_header (2, ui_right, "regexp", "RE"); /* 5 */
377 current_uiout->table_header (40, ui_noalign, "function", "Function"); /* 6 */
378 current_uiout->table_body ();
379
380 ALL_SKIPLIST_ENTRIES (e)
381 {
382
383 QUIT;
384 if (arg != NULL && !number_is_in_list (arg, e->number))
385 continue;
386
387 ui_out_emit_tuple tuple_emitter (current_uiout, "blklst-entry");
388 current_uiout->field_int ("number", e->number); /* 1 */
389
390 if (e->enabled)
391 current_uiout->field_string ("enabled", "y"); /* 2 */
392 else
393 current_uiout->field_string ("enabled", "n"); /* 2 */
394
395 if (e->file_is_glob)
396 current_uiout->field_string ("regexp", "y"); /* 3 */
397 else
398 current_uiout->field_string ("regexp", "n"); /* 3 */
399
400 current_uiout->field_string ("file",
401 e->file ? e->file : "<none>"); /* 4 */
402 if (e->function_is_regexp)
403 current_uiout->field_string ("regexp", "y"); /* 5 */
404 else
405 current_uiout->field_string ("regexp", "n"); /* 5 */
406
407 current_uiout->field_string (
408 "function", e->function ? e->function : "<none>"); /* 6 */
409
410 current_uiout->text ("\n");
411 }
412 }
413
414 static void
415 skip_enable_command (char *arg, int from_tty)
416 {
417 struct skiplist_entry *e;
418 int found = 0;
419
420 ALL_SKIPLIST_ENTRIES (e)
421 if (arg == NULL || number_is_in_list (arg, e->number))
422 {
423 e->enabled = 1;
424 found = 1;
425 }
426
427 if (!found)
428 error (_("No skiplist entries found with number %s."), arg);
429 }
430
431 static void
432 skip_disable_command (char *arg, int from_tty)
433 {
434 struct skiplist_entry *e;
435 int found = 0;
436
437 ALL_SKIPLIST_ENTRIES (e)
438 if (arg == NULL || number_is_in_list (arg, e->number))
439 {
440 e->enabled = 0;
441 found = 1;
442 }
443
444 if (!found)
445 error (_("No skiplist entries found with number %s."), arg);
446 }
447
448 static void
449 skip_delete_command (char *arg, int from_tty)
450 {
451 struct skiplist_entry *e, *temp, *b_prev;
452 int found = 0;
453
454 b_prev = 0;
455 ALL_SKIPLIST_ENTRIES_SAFE (e, temp)
456 if (arg == NULL || number_is_in_list (arg, e->number))
457 {
458 if (b_prev != NULL)
459 b_prev->next = e->next;
460 else
461 skiplist_entry_chain = e->next;
462
463 free_skiplist_entry (e);
464 found = 1;
465 }
466 else
467 {
468 b_prev = e;
469 }
470
471 if (!found)
472 error (_("No skiplist entries found with number %s."), arg);
473 }
474
475 /* Add the given skiplist entry to our list, and set the entry's number. */
476
477 static void
478 add_skiplist_entry (struct skiplist_entry *e)
479 {
480 struct skiplist_entry *e1;
481
482 e->number = ++skiplist_entry_count;
483
484 /* Add to the end of the chain so that the list of
485 skiplist entries will be in numerical order. */
486
487 e1 = skiplist_entry_chain;
488 if (e1 == NULL)
489 skiplist_entry_chain = e;
490 else
491 {
492 while (e1->next)
493 e1 = e1->next;
494 e1->next = e;
495 }
496 }
497
498 /* Return non-zero if we're stopped at a file to be skipped. */
499
500 static int
501 skip_file_p (struct skiplist_entry *e,
502 const struct symtab_and_line *function_sal)
503 {
504 gdb_assert (e->file != NULL && !e->file_is_glob);
505
506 if (function_sal->symtab == NULL)
507 return 0;
508
509 /* Check first sole SYMTAB->FILENAME. It may not be a substring of
510 symtab_to_fullname as it may contain "./" etc. */
511 if (compare_filenames_for_search (function_sal->symtab->filename, e->file))
512 return 1;
513
514 /* Before we invoke realpath, which can get expensive when many
515 files are involved, do a quick comparison of the basenames. */
516 if (!basenames_may_differ
517 && filename_cmp (lbasename (function_sal->symtab->filename),
518 lbasename (e->file)) != 0)
519 return 0;
520
521 /* Note: symtab_to_fullname caches its result, thus we don't have to. */
522 {
523 const char *fullname = symtab_to_fullname (function_sal->symtab);
524
525 if (compare_filenames_for_search (fullname, e->file))
526 return 1;
527 }
528
529 return 0;
530 }
531
532 /* Return non-zero if we're stopped at a globbed file to be skipped. */
533
534 static int
535 skip_gfile_p (struct skiplist_entry *e,
536 const struct symtab_and_line *function_sal)
537 {
538 gdb_assert (e->file != NULL && e->file_is_glob);
539
540 if (function_sal->symtab == NULL)
541 return 0;
542
543 /* Check first sole SYMTAB->FILENAME. It may not be a substring of
544 symtab_to_fullname as it may contain "./" etc. */
545 if (gdb_filename_fnmatch (e->file, function_sal->symtab->filename,
546 FNM_FILE_NAME | FNM_NOESCAPE) == 0)
547 return 1;
548
549 /* Before we invoke symtab_to_fullname, which is expensive, do a quick
550 comparison of the basenames.
551 Note that we assume that lbasename works with glob-style patterns.
552 If the basename of the glob pattern is something like "*.c" then this
553 isn't much of a win. Oh well. */
554 if (!basenames_may_differ
555 && gdb_filename_fnmatch (lbasename (e->file),
556 lbasename (function_sal->symtab->filename),
557 FNM_FILE_NAME | FNM_NOESCAPE) != 0)
558 return 0;
559
560 /* Note: symtab_to_fullname caches its result, thus we don't have to. */
561 {
562 const char *fullname = symtab_to_fullname (function_sal->symtab);
563
564 if (compare_glob_filenames_for_search (fullname, e->file))
565 return 1;
566 }
567
568 return 0;
569 }
570
571 /* Return non-zero if we're stopped at a function to be skipped. */
572
573 static int
574 skip_function_p (struct skiplist_entry *e, const char *function_name)
575 {
576 gdb_assert (e->function != NULL && !e->function_is_regexp);
577 return strcmp_iw (function_name, e->function) == 0;
578 }
579
580 /* Return non-zero if we're stopped at a function regexp to be skipped. */
581
582 static int
583 skip_rfunction_p (struct skiplist_entry *e, const char *function_name)
584 {
585 gdb_assert (e->function != NULL && e->function_is_regexp
586 && e->compiled_function_regexp);
587 return (e->compiled_function_regexp->exec (function_name, 0, NULL, 0)
588 == 0);
589 }
590
591 /* See skip.h. */
592
593 int
594 function_name_is_marked_for_skip (const char *function_name,
595 const struct symtab_and_line *function_sal)
596 {
597 struct skiplist_entry *e;
598
599 if (function_name == NULL)
600 return 0;
601
602 ALL_SKIPLIST_ENTRIES (e)
603 {
604 int skip_by_file = 0;
605 int skip_by_function = 0;
606
607 if (!e->enabled)
608 continue;
609
610 if (e->file != NULL)
611 {
612 if (e->file_is_glob)
613 {
614 if (skip_gfile_p (e, function_sal))
615 skip_by_file = 1;
616 }
617 else
618 {
619 if (skip_file_p (e, function_sal))
620 skip_by_file = 1;
621 }
622 }
623 if (e->function != NULL)
624 {
625 if (e->function_is_regexp)
626 {
627 if (skip_rfunction_p (e, function_name))
628 skip_by_function = 1;
629 }
630 else
631 {
632 if (skip_function_p (e, function_name))
633 skip_by_function = 1;
634 }
635 }
636
637 /* If both file and function must match, make sure we don't errantly
638 exit if only one of them match. */
639 if (e->file != NULL && e->function != NULL)
640 {
641 if (skip_by_file && skip_by_function)
642 return 1;
643 }
644 /* Only one of file/function is specified. */
645 else if (skip_by_file || skip_by_function)
646 return 1;
647 }
648
649 return 0;
650 }
651
652 /* Provide a prototype to silence -Wmissing-prototypes. */
653 extern initialize_file_ftype _initialize_step_skip;
654
655 void
656 _initialize_step_skip (void)
657 {
658 static struct cmd_list_element *skiplist = NULL;
659 struct cmd_list_element *c;
660
661 skiplist_entry_chain = 0;
662 skiplist_entry_count = 0;
663
664 add_prefix_cmd ("skip", class_breakpoint, skip_command, _("\
665 Ignore a function while stepping.\n\
666 \n\
667 Usage: skip [FUNCTION-NAME]\n\
668 skip [<file-spec>] [<function-spec>]\n\
669 If no arguments are given, ignore the current function.\n\
670 \n\
671 <file-spec> is one of:\n\
672 -fi|-file FILE-NAME\n\
673 -gfi|-gfile GLOB-FILE-PATTERN\n\
674 <function-spec> is one of:\n\
675 -fu|-function FUNCTION-NAME\n\
676 -rfu|-rfunction FUNCTION-NAME-REGULAR-EXPRESSION"),
677 &skiplist, "skip ", 1, &cmdlist);
678
679 c = add_cmd ("file", class_breakpoint, skip_file_command, _("\
680 Ignore a file while stepping.\n\
681 Usage: skip file [FILE-NAME]\n\
682 If no filename is given, ignore the current file."),
683 &skiplist);
684 set_cmd_completer (c, filename_completer);
685
686 c = add_cmd ("function", class_breakpoint, skip_function_command, _("\
687 Ignore a function while stepping.\n\
688 Usage: skip function [FUNCTION-NAME]\n\
689 If no function name is given, skip the current function."),
690 &skiplist);
691 set_cmd_completer (c, location_completer);
692
693 add_cmd ("enable", class_breakpoint, skip_enable_command, _("\
694 Enable skip entries. You can specify numbers (e.g. \"skip enable 1 3\"), \
695 ranges (e.g. \"skip enable 4-8\"), or both (e.g. \"skip enable 1 3 4-8\").\n\n\
696 If you don't specify any numbers or ranges, we'll enable all skip entries.\n\n\
697 Usage: skip enable [NUMBERS AND/OR RANGES]"),
698 &skiplist);
699
700 add_cmd ("disable", class_breakpoint, skip_disable_command, _("\
701 Disable skip entries. You can specify numbers (e.g. \"skip disable 1 3\"), \
702 ranges (e.g. \"skip disable 4-8\"), or both (e.g. \"skip disable 1 3 4-8\").\n\n\
703 If you don't specify any numbers or ranges, we'll disable all skip entries.\n\n\
704 Usage: skip disable [NUMBERS AND/OR RANGES]"),
705 &skiplist);
706
707 add_cmd ("delete", class_breakpoint, skip_delete_command, _("\
708 Delete skip entries. You can specify numbers (e.g. \"skip delete 1 3\"), \
709 ranges (e.g. \"skip delete 4-8\"), or both (e.g. \"skip delete 1 3 4-8\").\n\n\
710 If you don't specify any numbers or ranges, we'll delete all skip entries.\n\n\
711 Usage: skip delete [NUMBERS AND/OR RANGES]"),
712 &skiplist);
713
714 add_info ("skip", skip_info, _("\
715 Display the status of skips. You can specify numbers (e.g. \"skip info 1 3\"), \
716 ranges (e.g. \"skip info 4-8\"), or both (e.g. \"skip info 1 3 4-8\").\n\n\
717 If you don't specify any numbers or ranges, we'll show all skips.\n\n\
718 Usage: skip info [NUMBERS AND/OR RANGES]\n\
719 The \"Type\" column indicates one of:\n\
720 \tfile - ignored file\n\
721 \tfunction - ignored function"));
722 }
This page took 0.046439 seconds and 5 git commands to generate.