Add command-line option-parsing to the testcases, so that we can
manipulate them without needing a recompile (e.g. varying
optimization levels etc).

This uses getopt_long, which is a GNU extension to libc.  Is that
acceptable?

Implement a --num-iterations option, to override the default of 5.

When running tests under valgrind, pass in "--num-iterations=1",
speeding up the tests by a factor of 5.

gcc/testsuite/ChangeLog:
        * jit.dg/harness.h (num_iterations): New variable.
        (parse_options): New function.
        (main): Use "num_iterations", rather than hardcoding 5.
        * jit.dg/jit.exp (fixed_host_execute): When running tests under
        valgrind, pass in "--num-iterations=1".
---
 gcc/testsuite/jit.dg/harness.h | 46 +++++++++++++++++++++++++++++++++++++++---
 gcc/testsuite/jit.dg/jit.exp   |  5 +++++
 2 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/gcc/testsuite/jit.dg/harness.h b/gcc/testsuite/jit.dg/harness.h
index bff64de..a30b66e 100644
--- a/gcc/testsuite/jit.dg/harness.h
+++ b/gcc/testsuite/jit.dg/harness.h
@@ -247,17 +247,57 @@ extract_progname (const char *argv0)
 }
 
 #ifndef TEST_PROVIDES_MAIN
+
+/* Option parsing, for varying how we run the built testcases
+   (e.g. when poking at things in the debugger).  */
+
+#include <getopt.h>
+int num_iterations = 5;
+
+static void
+parse_options (int argc, char **argv)
+{
+  while (1)
+    {
+      static struct option long_options[] =
+       {
+         {"num-iterations", required_argument, 0, 'i'},
+         {0, 0, 0, 0}
+       };
+
+      int option_index = 0;
+      /* getopt_long is a GNU extension to libc.  */
+      int c = getopt_long (argc, argv, "i:",
+                          long_options, &option_index);
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case 'i':
+         num_iterations = atoi (optarg);
+         break;
+       default:
+         fprintf (stderr, "Usage: %s [--num-iterations NUM]\n",
+                  argv[0]);
+         exit(EXIT_FAILURE);
+       }
+    }
+}
+
 int
 main (int argc, char **argv)
 {
   int i;
 
-  for (i = 1; i <= 5; i++)
+  parse_options (argc, argv);
+
+  for (i = 1; i <= num_iterations; i++)
     {
       snprintf (test, sizeof (test),
                "%s iteration %d of %d",
-                extract_progname (argv[0]),
-                i, 5);
+               extract_progname (argv[0]),
+               i, num_iterations);
 
       //printf ("ITERATION %d\n", i);
       test_jit (argv[0], NULL);
diff --git a/gcc/testsuite/jit.dg/jit.exp b/gcc/testsuite/jit.dg/jit.exp
index a37ccc7..438aabd 100644
--- a/gcc/testsuite/jit.dg/jit.exp
+++ b/gcc/testsuite/jit.dg/jit.exp
@@ -157,6 +157,11 @@ proc fixed_host_execute {args} {
        set valgrind_params {"valgrind"}
        lappend valgrind_params "--leak-check=full"
        lappend valgrind_params "--log-file=${valgrind_logfile}"
+       # When running under valgrind, speed things up by only running one
+       # in-process iteration of the testcase, rather than the default of 5.
+       # Only testcases that use the "main" from harness.h
+       # (#ifndef TEST_PROVIDES_MAIN) will respond to this option.
+       lappend params "--num-iterations=1"
     } else {
        set valgrind_params {}
     }
-- 
1.8.5.3

Reply via email to