This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[commit] Speed up cpexprs.exp


The cpexprs.exp takes 45 seconds on native GNU/Linux, and 7.5 minutes
on an ARM EABI simulator.  The reason is that each breakpoint test
starts a clean copy of the executable, runs to main, sets a
breakpoint, and continues to it.  The run operation involves a lot of
overhead, e.g. a fork() or a download.

I've checked in this patch which arranges to call an outer test
function over and over again.  That way, we can use a single binary.
This does open the possibility for cascading failures in a test that
is likely to crash mid-run - a persistant problem with our testsuite -
but that seems unlikely here.

This drops the test time down to 10-20 seconds.

Should I put this on the branch too?

-- 
Daniel Jacobowitz
CodeSourcery

2010-08-30  Daniel Jacobowitz  <dan@codesourcery.com>

	* gdb.cp/cpexprs.exp (test_breakpoint): Continue to test_function
	instead of running to main.  Do not test the main function.
	* gdb/testsuite/gdb.cp/cpexprs.cc (main): Rename to test_function.
	Add new main.

Index: gdb.cp/cpexprs.cc
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.cp/cpexprs.cc,v
retrieving revision 1.1
diff -u -p -r1.1 cpexprs.cc
--- gdb.cp/cpexprs.cc	9 Mar 2010 18:08:03 -0000	1.1
+++ gdb.cp/cpexprs.cc	30 Aug 2010 17:34:33 -0000
@@ -309,8 +309,8 @@ class derived : public base1, public bas
 };
 
 int
-main (int argc, char* argv[]) // main
-{ // main
+test_function (int argc, char* argv[]) // test_function
+{ // test_function
   derived d;
   void (derived::*pfunc) (void) const = &derived::a_function;
   (d.*pfunc) ();
@@ -427,5 +427,19 @@ main (int argc, char* argv[]) // main
   char* str = a;
   fluff* flp = a;
   fluff** flpp = a;
+
+  return 0;
 }
 
+int
+main (int argc, char* argv[])
+{
+  int i;
+
+  /* Call the test function repeatedly, enough times for all our tests
+     without running forever if something goes wrong.  */
+  for (i = 0; i < 1000; i++)
+    test_function (argc, argv);
+
+  return 0;
+}
Index: gdb.cp/cpexprs.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.cp/cpexprs.exp,v
retrieving revision 1.3
diff -u -p -r1.3 cpexprs.exp
--- gdb.cp/cpexprs.exp	11 Jun 2010 17:35:28 -0000	1.3
+++ gdb.cp/cpexprs.exp	30 Aug 2010 17:34:33 -0000
@@ -24,9 +24,14 @@
 proc test_breakpoint {func} {
     global DEC
 
-    # Restart every time
-    if {![runto_main]} {
-	perror "could not run to main when attempting to break at $func"
+    # Return to the top of the test function every time.
+    delete_breakpoints
+    if { ! [gdb_breakpoint test_function] } {
+	fail "set test_function breakpoint for $func"
+    } elseif { [gdb_test "continue" \
+		    "Continuing.\r\n\r\nBreakpoint $DEC+,.*test_function.*" \
+		    ""] != 0 } {
+	fail "continue to test_function for $func"
     } else {
 	gdb_breakpoint "$func"
 	set i [expr {[string last : $func] + 1}]
@@ -113,7 +118,7 @@ set ADDR "0x$HEX+"; # address
 array set all_functions {}
 
 # "Normal" functions/methods
-add {main} \
+add {test_function} \
     {int (int, char **)} \
     - \
     -
@@ -717,8 +722,8 @@ foreach name [get_functions list] {
 
 # Running to breakpoint -- use any function we can "list"
 foreach name [get_functions list] {
-    # Skip "main", since test_breakpoint uses it
-    if {[string compare $name "main"] != 0} {
+    # Skip "test_function", since test_breakpoint uses it
+    if {[string compare $name "test_function"] != 0} {
 	test_breakpoint $name
     }
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]