standard_testfile
 
+set epilogue [have_epilogue_line_info]
+
 if { [prepare_for_testing "failed to prepare" "skip-inline" \
                          {skip-inline.c skip1.c } \
                          {debug nowarnings}] } {
 set srcfile skip-inline.c
 set srcfile1 skip1.c
 
-if ![runto_main] {
-    return
-}
-
-# Create a skiplist entry for a specified file and function.
-
-gdb_test "skip function foo" "Function foo will be skipped when stepping\."
+proc_with_prefix single_step { } {
+    if ![runto_main] {
+       return
+    }
 
-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] {
-    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 "step" ".*" "step into baz, since foo will be skipped"
+    gdb_test "bt" "\\s*\\#0\\s+baz.*" "in the baz, since foo was skipped"
+    gdb_step_until ".*x = 0; x = baz \\(foo \\(\\)\\).*"
     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 "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 back to main, again"
-    gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
+    gdb_step_until "main \\(\\) at .*" "step back to main, again"
+    gdb_test "bt" "\\s*\\#0.*main.*" "again back to main"
 }
 
-if ![runto_main] {
-    return
-}
+proc_with_prefix double_step { } {
+    if ![runto_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"
+    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] {
-    return
+proc_with_prefix triple_step { } {
+    if ![runto_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"
+    }
 }
 
-gdb_test "skip delete" ".*" "skip delete"
+proc_with_prefix skip_current_frame { } {
+    if ![runto_main] {
+       return
+    }
+
+    gdb_test "skip delete" ".*" "skip delete"
 
-with_test_prefix "skip current frame" {
     gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
     gdb_test "step" ".*" "step into foo"
     gdb_test "bt" "\\s*\\#0\\s+foo.*" "in the foo"
     gdb_test "skip" "Function foo will be skipped when stepping\." "skip"
 }
+
+# Create a skiplist entry for a specified file and function.
+
+gdb_test "skip function foo" "Function foo will be skipped when stepping\."
+
+single_step
+
+# Some compilers link the epilogue of functions to the line containing the
+# closing brace, while others dont.  The behavior ends up so out of sync
+# with multiple steps at a time, that completely different procs would need
+# to be made, and it is frankly unnecessary.
+if {$epilogue} {
+    double_step
+    triple_step
+}
+
+skip_current_frame