[PATCH] testsuite: inline-cmds.exp: adjust checks with 'finish' command

Edjunior Barbosa Machado
2011-04-27T06:43:43Z

Hi,

as previously discussed in the mailing list (http://sourceware.org/ml/gdb/2010-11/msg00032.html), the behavior of 'finish' command may be slightly different on some architectures (as ppc64, for instance) where there will be one or more instructions after a call instruction that are still part of the subroutine call block. In these cases, after issue 'finish' gdb will show the caller line again instead of the next line.

Please consider the following fix for checks with 'finish' in gdb.opt/inline-cmds.exp. Tested on x86, ppc32 and ppc64. Ok to apply?

Thanks,
--
Edjunior

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 0485d21..c576005 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-04-27 Edjunior Machado <emachado@linux.vnet.ibm.com>
+
+ * gdb.opt/inline-cmds.exp: Adjust checks with "finish" command to
+ accept to show the caller line again as well as the line after.
+
2011-04-25 Jan Kratochvil <jan.kratochvil@redhat.com>

* gdb.base/gdbindex-stabs-dwarf.c: New file.
diff --git a/gdb/testsuite/gdb.opt/inline-cmds.exp b/gdb/testsuite/gdb.opt/inline-cmds.exp
index cde86f5..cbf3160 100644
--- a/gdb/testsuite/gdb.opt/inline-cmds.exp
+++ b/gdb/testsuite/gdb.opt/inline-cmds.exp
@@ -263,7 +263,20 @@ gdb_continue_to_breakpoint "finish into func1"

gdb_test "next" ".*marker \\\(\\\);" "next to finish marker"
gdb_test "step" ".*set breakpoint 2 here.*" "step into finish marker"
-gdb_test "finish" "func1 \\\(\\\);" "finish from marker to func1"
+
+# Some architectures will have one or more instructions after
+# the call instruction which still are part of the call sequence,
+# so it should be expected to return to the caller line after issue
+# a 'finish' command.
+gdb_test_multiple "finish" "finish from marker" {
+ -re "func1 \\\(\\\);.*" {
+ pass "finish from marker to func1"
+ }
+ -re "marker \\\(\\\);.*" {
+ pass "finish from marker"
+ gdb_test "step" "func1 \\\(\\\);.*" "step after marker to reach func1"
+ }
+}

gdb_test "step" "bar \\\(\\\);" "step into func1 for finish"
gdb_test "finish" "func3 \\\(\\\);" "finish from func1 to func3"
@@ -273,7 +286,15 @@ set line6 [gdb_get_line_number "set breakpoint 6 here"]
gdb_breakpoint $line6
gdb_continue_to_breakpoint "before the outer_inline call"
gdb_test "step" "marker \\\(\\\) at .*" "reach 1 the outer_inline call"
-gdb_test "finish" "main \\\(\\\) at .*outer_inline2 \\\(\\\);" "reach outer_inline2"
+gdb_test_multiple "finish" "finish from marker" {
+ -re "main \\\(\\\) at .*outer_inline2 \\\(\\\);.*" {
+ pass "reach outer_inline2"
+ }
+ -re "main \\\(\\\) at .*marker \\\(\\\);.*" {
+ pass "finish from marker"
+ gdb_test "step" "outer_inline2 \\\(\\\);.*" "step after marker to reach outer_inline2"
+ }
+}
gdb_test "bt" "#0 main.*" "backtrace at main of outer_inline"
gdb_test "step" "outer_inline2 \\\(\\\) at .*" "enter outer_inline2"
gdb_test "bt" "#0 outer_inline2.*#1 main.*" "backtrace at outer_inline2"