* gdb.base/callfuncs.c (main): Moved to end of file, call
authorPeter Schauer <Peter.Schauer@mytum.de>
Mon, 6 Nov 2000 20:38:02 +0000 (20:38 +0000)
committerPeter Schauer <Peter.Schauer@mytum.de>
Mon, 6 Nov 2000 20:38:02 +0000 (20:38 +0000)
t_double_values to initialize the FPU before inferior calls are made.
* gdb.base/callfuncs.exp:  Test for register preservation after calling
inferior functions.  Add tests for continuining, finishing and
returning from a stop in a call dummy.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/callfuncs.c
gdb/testsuite/gdb.base/callfuncs.exp

index 0155fb8e0a67d3d8c09aa70a35fa4e37873412c9..91f97eb84b6487fa9d3f50e0961307151fae8d8b 100644 (file)
@@ -1,3 +1,11 @@
+2000-11-06  Peter Schauer  <pes@regent.e-technik.tu-muenchen.de>
+
+       * gdb.base/callfuncs.c (main):  Moved to end of file, call
+       t_double_values to initialize the FPU before inferior calls are made.
+       * gdb.base/callfuncs.exp:  Test for register preservation after calling
+       inferior functions.  Add tests for continuining, finishing and
+       returning from a stop in a call dummy.
+
 2000-10-24  Michael Snyder  <msnyder@cleaver.cygnus.com>
 
        * gdb.base/commands.exp: Break up long lines, and re-indent.
index ecf902657db609865d4994fe69895c7341e25911..f53bd3177cb87ddd0e3f8f4eefd1fbe9b699da24 100644 (file)
@@ -172,21 +172,6 @@ cmp10 (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9)
     (i5 == 5) && (i6 == 6) && (i7 == 7) && (i8 == 8) && (i9 == 9);
 }
 
-
-/* Gotta have a main to be able to generate a linked, runnable
-   executable, and also provide a useful place to set a breakpoint. */
-extern void * malloc() ;
-int main ()
-{
-#ifdef usestubs
-  set_debug_traps();
-  breakpoint();
-#endif
-  malloc(1);
-  t_structs_c(struct_val1);
-  return 0 ;
-}
-
 /* Functions that expect specific values to be passed and return 
    either 0 or 1, depending upon whether the values were
    passed incorrectly or correctly, respectively. */
@@ -357,3 +342,19 @@ int a, b;
 {
   return ((*func_arg1)(a, b));
 }
+
+
+/* Gotta have a main to be able to generate a linked, runnable
+   executable, and also provide a useful place to set a breakpoint. */
+extern void * malloc() ;
+int main ()
+{
+#ifdef usestubs
+  set_debug_traps();
+  breakpoint();
+#endif
+  malloc(1);
+  t_double_values(double_val1, double_val2);
+  t_structs_c(struct_val1);
+  return 0 ;
+}
index 8d43ec6a1c524272a1901d2e035efb0cf9e41879..eab99dd6dc6072d9887cb1239c05276adaa2a391 100644 (file)
@@ -237,6 +237,24 @@ proc do_function_calls {} {
        "call inferior func with struct - returns char *"
 }
 
+# Procedure to get current content of all registers.
+global all_registers_content
+set all_registers_content ""
+proc do_get_all_registers { } {
+    global gdb_prompt
+    global expect_out
+    global all_registers_content
+
+    set all_registers_content ""
+    send_gdb "info all-registers\n"
+    gdb_expect {
+       -re "info all-registers\r\n(.*)$gdb_prompt $" {
+           set all_registers_content $expect_out(1,string)
+       }
+       default {}
+    }
+}
+
 # Start with a fresh gdb.
 
 gdb_exit
@@ -271,7 +289,80 @@ if { $hp_aCC_compiler } {
     }
 }
 
+# Make sure that malloc gets called and that the floating point unit
+# is initialized via a call to t_double_values.
+gdb_test "next" "t_double_values\\(double_val1, double_val2\\);.*"
 gdb_test "next" "t_structs_c\\(struct_val1\\);.*"
+
+# Save all register contents.
+do_get_all_registers
+set old_reg_content $all_registers_content
+
+# Perform function calls.
 do_function_calls
 
+# Check if all registers still have the same value.
+do_get_all_registers
+set new_reg_content $all_registers_content
+if ![string compare $old_reg_content $new_reg_content] then {
+    pass "gdb function calls preserve register contents"
+} else {
+    set old_reg_content $all_registers_content
+    fail "gdb function calls preserve register contents"
+}
+
+# Set breakpoint at a function we will call from gdb.
+gdb_breakpoint add
+
+# Call function (causing a breakpoint hit in the call dummy) and do a continue,
+# make sure we are back at main and still have the same register contents.
+gdb_test "print add(4,5)" "The program being debugged stopped while.*" ""
+gdb_test "continue" "Continuing.*" "continue from call dummy breakpoint"
+if ![gdb_test "bt 2" \
+             "#0  main.*" \
+             "bt after continuing from call dummy breakpoint"] then {
+    do_get_all_registers
+    set new_reg_content $all_registers_content
+    if ![string compare $old_reg_content $new_reg_content] then {
+       pass "continue after stop in call dummy preserves register contents"
+    } else {
+       fail "continue after stop in call dummy preserves register contents"
+    }
+}
+
+# Call function (causing a breakpoint hit in the call dummy) and do a finish,
+# make sure we are back at main and still have the same register contents.
+gdb_test "print add(4,5)" "The program being debugged stopped while.*" ""
+gdb_test "finish" \
+        "Value returned is.* = 9" \
+        "finish from call dummy breakpoint returns correct value"
+if ![gdb_test "bt 2" \
+             "#0  main.*" \
+             "bt after finishing from call dummy breakpoint"] then {
+    do_get_all_registers
+    set new_reg_content $all_registers_content
+    if ![string compare $old_reg_content $new_reg_content] then {
+       pass "finish after stop in call dummy preserves register contents"
+    } else {
+       fail "finish after stop in call dummy preserves register contents"
+    }
+}
+
+# Call function (causing a breakpoint hit in the call dummy) and do a return
+# with a value, make sure we are back at main with the same register contents.
+gdb_test "print add(4,5)" "The program being debugged stopped while.*" ""
+if ![gdb_test "return 7" \
+             "#0  main.*" \
+             "back at main after return from call dummy breakpoint" \
+             "Make add return now. .y or n.*" \
+             "y"] then {
+    do_get_all_registers
+    set new_reg_content $all_registers_content
+    if ![string compare $old_reg_content $new_reg_content] then {
+       pass "return after stop in call dummy preserves register contents"
+    } else {
+       fail "return after stop in call dummy preserves register contents"
+    }
+}
+
 return 0