From 45d735237b7edf282131d570a7a9f6aa9ee1bd9c Mon Sep 17 00:00:00 2001 From: Bernd Edlinger Date: Wed, 30 Oct 2019 21:35:22 +0100 Subject: [PATCH] Add a test case for skip with inlined functions --- gdb/testsuite/ChangeLog | 5 ++ gdb/testsuite/gdb.base/skip-inline.c | 64 +++++++++++++++++++++ gdb/testsuite/gdb.base/skip-inline.exp | 78 ++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 gdb/testsuite/gdb.base/skip-inline.c create mode 100644 gdb/testsuite/gdb.base/skip-inline.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 4fd959171cd..810cefdaeda 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-12-16 Bernd Edlinger + + * gdb.base/skip-inline.c: New file. + * gdb.base/skip-inline.exp: New file. + 2019-12-16 Simon Marchi * gdb.base/jit-reader.exp (jit_reader_test): Rename diff --git a/gdb/testsuite/gdb.base/skip-inline.c b/gdb/testsuite/gdb.base/skip-inline.c new file mode 100644 index 00000000000..e56214928ff --- /dev/null +++ b/gdb/testsuite/gdb.base/skip-inline.c @@ -0,0 +1,64 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2019 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 . */ + +#include + +int bar (void); +int baz (int); +void skip1_test_skip_file_and_function (void); +void test_skip_file_and_function (void); + +__attribute__((__always_inline__)) static inline int +foo (void) +{ + return bar (); +} + +int +main () +{ + volatile int x; + + /* step immediately into the inlined code */ + baz (foo ()); + + /* step first over non-inline code, this involves a different code path */ + x = 0; x = baz (foo ()); + + test_skip_file_and_function (); + + return 0; +} + +static void +test_skip (void) +{ +} + +static void +end_test_skip_file_and_function (void) +{ + abort (); +} + +void +test_skip_file_and_function (void) +{ + test_skip (); + skip1_test_skip_file_and_function (); + end_test_skip_file_and_function (); +} diff --git a/gdb/testsuite/gdb.base/skip-inline.exp b/gdb/testsuite/gdb.base/skip-inline.exp new file mode 100644 index 00000000000..4ab9ecf3fb6 --- /dev/null +++ b/gdb/testsuite/gdb.base/skip-inline.exp @@ -0,0 +1,78 @@ +# Copyright 2019 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 . + +standard_testfile + +if { [prepare_for_testing "failed to prepare" "skip-inline" \ + {skip-inline.c skip1.c } \ + {debug nowarnings}] } { + return -1 +} + +set srcfile skip-inline.c +set srcfile1 skip1.c + +if ![runto_main] { + fail "can't run to main" + return +} + +# Create a skiplist entry for a specified file and function. + +gdb_test "skip function foo" "Function foo will be skipped when stepping\." + +gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main" +gdb_test "step" ".*" "step into baz, since foo will be skipped" +gdb_test "bt" "\\s*\\#0\\s+baz.*" "in the baz, since foo was skipped" +gdb_test "step" ".*" "step in the baz" +gdb_test "bt" "\\s*\\#0\\s+baz.*" "still in the baz" +gdb_test "step" ".*" "step back to main" +gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main" +gdb_test "step" ".*" "step again into baz, since foo will be skipped" +gdb_test "bt" "\\s*\\#0\\s+baz.*" "again in the baz" +gdb_test "step" ".*" "step in the baz, again" +gdb_test "bt" "\\s*\\#0\\s+baz.*" "still in the baz, again" +gdb_test "step" ".*" "step back to main, again" +gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main" + +if ![runto_main] { + fail "can't run to main" + return +} + +with_test_prefix "double step" { + gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main" + gdb_test "step 2" ".*" "step into baz, since foo will be skipped" + gdb_test "bt" "\\s*\\#0\\s+baz.*" "still in the baz" + gdb_test "step" ".*" "step back to main" + gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main" + gdb_test "step 2" ".*" "step again into baz, since foo will be skipped" + gdb_test "bt" "\\s*\\#0\\s+baz.*" "again in the baz" + gdb_test "step" ".*" "step back to main, again" + gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main" +} + +if ![runto_main] { + fail "can't run to main" + return +} + +with_test_prefix "triple step" { + gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main" + gdb_test "step 3" ".*" "step over baz" + gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main" + gdb_test "step 3" ".*" "step over baz, again" + gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main" +} -- 2.30.2