old-cross-binutils/gdb/testsuite/gdb.base/skip.exp
Doug Evans cce0e92333 Extend "skip" command to support -file, -gfile, -function, -rfunction.
gdb/ChangeLog:

	Extend "skip" command to support -file, -gfile, -function, -rfunction.
	* NEWS: Document new features.
	* skip.c: #include "fnmatch.h", "gdb_regex.h".
	(skiplist_entry) <file>: Renamed from filename.
	<function>: Renamed from function_name.
	<file_is_glob, function_is_regexp>: New members.
	<compiled_function_regexp, compiled_function_regexp_is_valid>:
	New members.
	(make_skip_entry): New function.
	(free_skiplist_entry, free_skiplist_entry_cleanup): New functions.
	(make_free_skiplist_entry_cleanup): New function.
	(skip_file_command): Update.
	(skip_function, skip_function_command): Update.
	(compile_skip_regexp): New functions.
	(skip_command): Add support for new options.
	(skip_info): Update.
	(skip_file_p, skip_gfile_p): New functions.
	(skip_function_p, skip_rfunction_p): New functions.
	(function_name_is_marked_for_skip): Update and simplify.
	(_initialize_step_skip): Update.
	* symtab.c: #include "fnmatch.h".
	(compare_glob_filenames_for_search): New function.
	* symtab.h (compare_glob_filenames_for_search): Declare.
	* utils.c (count_path_elements): New function.
	(strip_leading_path_elements): New function.
	* utils.h (count_path_elements): Declare.
	(strip_leading_path_elements): Declare.

gdb/doc/ChangeLog:

	* gdb.texinfo (Skipping Over Functions and Files): Document new
	options to "skip" command.  Update docs of output of "info skip".

gdb/testsuite/ChangeLog:

	* gdb.base/skip.c (test_skip): New function.
	(end_test_skip_file_and_function): New function.
	(test_skip_file_and_function): New function.
	* gdb.base/skip1.c (test_skip): New function.
	(skip1_test_skip_file_and_function): New function.
	* gdb.base/skip.exp: Add tests for new skip options.
	* gdb.base/skip-solib.exp: Update expected output.
	* gdb.perf/skip-command.cc: New file.
	* gdb.perf/skip-command.exp: New file.
	* gdb.perf/skip-command.py: New file.
2016-02-23 13:25:18 -08:00

284 lines
9.6 KiB
Text

# Copyright 2011-2016 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# This file was written by Justin Lebar. (justin.lebar@gmail.com)
# And further hacked on by Doug Evans. (dje@google.com)
if { [prepare_for_testing skip.exp "skip" \
{skip.c skip1.c } \
{debug nowarnings}] } {
return -1
}
set srcfile skip.c
set srcfile1 skip1.c
# Right after we start gdb, there's no default file or function to skip.
gdb_test "skip file" "No default file now." "skip file (no default file)"
gdb_test "skip function" "No default function now."
gdb_test "skip" "No default function now." "skip (no default function)"
# Test elided args.
gdb_test "skip -fi" "Missing value for -fi option."
gdb_test "skip -file" "Missing value for -file option."
gdb_test "skip -fu" "Missing value for -fu option."
gdb_test "skip -function" "Missing value for -function option."
gdb_test "skip -rfu" "Missing value for -rfu option."
gdb_test "skip -rfunction" "Missing value for -rfunction option."
# Test other invalid option combinations.
gdb_test "skip -x" "Invalid skip option: -x"
gdb_test "skip -rfu foo.* xyzzy" "Invalid argument: xyzzy"
if ![runto_main] {
fail "Can't run to main"
return
}
# Test |info skip| with an empty skiplist.
gdb_test "info skip" "Not skipping any files or functions\." "info skip empty"
# Create a skiplist entry for the current file and function.
gdb_test "skip file" "File .*$srcfile will be skipped when stepping\." "skip file ($srcfile)"
gdb_test "skip" "Function main will be skipped when stepping\." "skip (main)"
# Create a skiplist entry for a specified file and function.
gdb_test "skip file skip1.c" "File .*$srcfile1 will be skipped when stepping\."
gdb_test "skip function baz" "Function baz will be skipped when stepping\."
# Test bad skiplist entry modification commands
gdb_test "skip enable 999" "No skiplist entries found with number 999."
gdb_test "skip disable 999" "No skiplist entries found with number 999."
gdb_test "skip delete 999" "No skiplist entries found with number 999."
gdb_test "skip enable a" "Args must be numbers or '\\$' variables."
gdb_test "skip disable a" "Args must be numbers or '\\$' variables."
gdb_test "skip delete a" "Args must be numbers or '\\$' variables."
# Ask for info on a skiplist entry which doesn't exist.
gdb_test "info skip 999" "No skiplist entries found with number 999."
# Does |info skip| look right?
gdb_test "info skip" \
"Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
1\\s+y\\s+n\\s+.*$srcfile\\s+n\\s+<none>\\s*
2\\s+y\\s+n\\s+<none>\\s+n\\s+main\\s*
3\\s+y\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*
4\\s+y\\s+n\\s+<none>\\s+n\\s+baz\\s*"
# Right now, we have an outstanding skiplist entry on both source
# files, so when we step into the first line in main(), we should step
# right over it and go to the second line of main().
if ![runto_main] {
fail "Can't run to main"
return
}
gdb_test "step" ".*" "step in the main"
gdb_test "bt" "\\s*\\#0\\s+main.*" "step after all ignored"
# Now remove skip.c from the skiplist. Our first step should take us
# into foo(), and our second step should take us to the next line in main().
gdb_test "skip delete 1"
# Check that entry 1 is missing from |info skip|
gdb_test "info skip" \
"Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
2\\s+y\\s+n\\s+<none>\\s+n\\s+main\\s*
3\\s+y\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*
4\\s+y\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
"info skip (delete 1)"
if ![runto_main] {
fail "Can't run to main"
return
}
set test "step after deleting 1"
gdb_test "step" "foo \\(\\) at.*" "$test (1)"
gdb_test "step" ".*" "$test (2)" ; # Return from foo()
gdb_test "step" "main \\(\\) at.*" "$test (3)"
# Now disable the skiplist entry for skip1.c. We should now
# step into foo(), then into bar(), but not into baz().
gdb_test "skip disable 3"
# Is entry 3 disabled in |info skip|?
gdb_test "info skip 3" \
"3\\s+n\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*" \
"info skip shows entry as disabled"
if ![runto_main] {
fail "Can't run to main"
return
}
set test "step after disabling 3"
gdb_test "step" "bar \\(\\) at.*" "$test (1)"
gdb_test "step" ".*" "$test (2)"; # Return from foo()
gdb_test "step" "foo \\(\\) at.*" "$test (3)"
gdb_test "step" ".*" "$test (4)"; # Return from bar()
gdb_test "step" "main \\(\\) at.*" "$test (5)"
# Enable skiplist entry 3 and make sure we step over it like before.
gdb_test "skip enable 3"
# Is entry 3 enabled in |info skip|?
gdb_test "info skip 3" \
"3\\s+y\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*" \
"info skip shows entry as enabled"
if ![runto_main] {
fail "Can't run to main"
return
}
set test "step after enable 3"
gdb_test "step" "foo \\(\\) at.*" "$test (1)"
gdb_test "step" ".*" "$test (2)"; # Return from foo()
gdb_test "step" "main \\(\\) at.*" "$test (3)"
gdb_test "skip disable"
gdb_test "info skip" \
"Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
2\\s+n\\s+n\\s+<none>\\s+n\\s+main\\s*
3\\s+n\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*
4\\s+n\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
"info skip after disabling all"
gdb_test "skip enable"
gdb_test "info skip" \
"Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
2\\s+y\\s+n\\s+<none>\\s+n\\s+main\\s*
3\\s+y\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*
4\\s+y\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
"info skip after enabling all"
gdb_test "skip disable 4 2-3"
gdb_test "info skip" \
"Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
2\\s+n\\s+n\\s+<none>\\s+n\\s+main\\s*
3\\s+n\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*
4\\s+n\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
"info skip after disabling 4 2-3"
gdb_test "skip enable 2-3"
gdb_test "info skip" \
"Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
2\\s+y\\s+n\\s+<none>\\s+n\\s+main\\s*
3\\s+y\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*
4\\s+n\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
"info skip after enabling 2-3"
gdb_test "info skip 2-3" \
"Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
2\\s+y\\s+n\\s+<none>\\s+n\\s+main\\s*
3\\s+y\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*" \
"info skip 2-3"
gdb_test "skip delete 2 3"
gdb_test "info skip" \
"Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
4\\s+n\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
"info skip after deleting 2 3"
gdb_test "skip delete"
gdb_test "info skip" "Not skipping any files or functions\." \
"info skip after deleting all"
# Now test skip -fi, etc.
# Create a skiplist entry for a specified file and function.
gdb_test "skip -fi skip1.c" "File .*$srcfile1 will be skipped when stepping\."
gdb_test "skip -gfi sk*1.c" "File\\(s\\) sk\\*1.c will be skipped when stepping\."
gdb_test "skip -fu baz" "Function baz will be skipped when stepping\."
gdb_test "skip -rfu ^b.z$" "Function\\(s\\) \\^b\\.z\\$ will be skipped when stepping."
if ![runto_main] {
fail "Can't run to main"
return
}
set test "step using -fi"
gdb_test_no_output "skip disable"
gdb_test_no_output "skip enable 5"
gdb_test "step" "foo \\(\\) at.*" "$test (1)"
gdb_test "step" ".*" "$test (2)"; # Return from foo()
gdb_test "step" "main \\(\\) at.*" "$test (3)"
if ![runto_main] {
fail "Can't run to main"
return
}
set test "step using -gfi"
gdb_test_no_output "skip disable"
gdb_test_no_output "skip enable 6"
gdb_test "step" "foo \\(\\) at.*" "$test (1)"
gdb_test "step" ".*" "$test (2)"; # Return from foo()
gdb_test "step" "main \\(\\) at.*" "$test (3)"
if ![runto_main] {
fail "Can't run to main"
return
}
set test "step using -fu for baz"
gdb_test_no_output "skip disable"
gdb_test_no_output "skip enable 7"
gdb_test "step" "bar \\(\\) at.*" "$test (1)"
gdb_test "step" ".*" "$test (2)"; # Return from bar()
gdb_test "step" "foo \\(\\) at.*" "$test (3)"
gdb_test "step" ".*" "$test (4)"; # Return from foo()
gdb_test "step" "main \\(\\) at.*" "$test (5)"
if ![runto_main] {
fail "Can't run to main"
return
}
set test "step using -rfu for baz"
gdb_test_no_output "skip disable"
gdb_test_no_output "skip enable 8"
gdb_test "step" "bar \\(\\) at.*" "$test (1)"
gdb_test "step" ".*" "$test (2)"; # Return from bar()
gdb_test "step" "foo \\(\\) at.*" "$test (3)"
gdb_test "step" ".*" "$test (4)"; # Return from foo()
gdb_test "step" "main \\(\\) at.*" "$test (5)"
# Test -fi + -fu.
if ![runto_main] {
fail "Can't run to main"
return
}
set test "step using -fi + -fu"
gdb_test_no_output "skip delete"
gdb_test "skip -fi skip1.c -fu test_skip" \
"Function test_skip in file skip1.c will be skipped when stepping\."
gdb_breakpoint "test_skip_file_and_function"
gdb_breakpoint "end_test_skip_file_and_function"
gdb_test "call test_skip_file_and_function ()" "silently stop."
# Verify we can step into skip.c:test_skip but not skip1.c:test_skip.
gdb_test "step" "test_skip \\(\\) at.*" "$test (1)"
gdb_test "step" "test_skip_file_and_function \\(\\) at.*" "$test (2)"; # Return from test_skip()
gdb_test "step" "skip1_test_skip_file_and_function \\(\\) at.*" "$test (4)"
gdb_test "step" ".*" "$test (5)"; # Skip over test_skip()
gdb_test "step" "test_skip_file_and_function \\(\\) at.*" "$test (6)"; # Return from skip1_test_skip_file_and_function()