diff options
author | David Malcolm <dmalcolm@redhat.com> | 2017-12-12 01:31:30 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2017-12-12 01:31:30 +0000 |
commit | 421b29d6153301fdaee458a1dc7e3a254e6a662a (patch) | |
tree | b27018e1eb914a962a27cfb2ca93872533a85971 /gcc/selftest.c | |
parent | cd147a267f57a7345767950ed4897d65424e838d (diff) | |
download | gcc-421b29d6153301fdaee458a1dc7e3a254e6a662a.zip gcc-421b29d6153301fdaee458a1dc7e3a254e6a662a.tar.gz gcc-421b29d6153301fdaee458a1dc7e3a254e6a662a.tar.bz2 |
Expensive selftests: torture testing for fix-it boundary conditions (PR c/82050)
This patch adds selftest coverage for the fix for PR c/82050.
The selftest iterates over various "interesting" column and line-width
values to try to shake out bugs in the fix-it printing routines, a kind
of "torture" selftest.
Unfortunately this selftest is noticably slower than the other selftests;
adding it to diagnostic-show-locus.c led to:
-fself-test: 40218 pass(es) in 0.172000 seconds
slowing down to:
-fself-test: 97315 pass(es) in 6.109000 seconds
for an unoptimized build (e.g. when hacking with --disable-bootstrap).
Given that this affects the compile-edit-test cycle of the "gcc"
subdirectory, this felt like an unacceptable amount of overhead to add.
I attempted to optimize the test by reducing the amount of coverage, but
the test seems useful, and there seems to be a valid role for "torture"
selftests.
Hence this patch adds a:
gcc.dg/plugin/expensive_selftests_plugin.c
with the responsibility for running "expensive" selftests, and adds the
expensive test there. The patch moves a small amount of code from
selftest::run_tests into a helper class so that the plugin can print
a useful summary line (to reassure us that the tests are actually being
run).
With that, the compile-edit-test cycle of the "gcc" subdir is unaffected;
the plugin takes:
expensive_selftests_plugin: 26641 pass(es) in 3.127000 seconds
which seems reasonable within the much longer time taken by "make check"
(I optimized some of the overhead away, hence the reduction from 6 seconds
above down to 3 seconds).
gcc/ChangeLog:
PR c/82050
* selftest-run-tests.c (selftest::run_tests): Move start/finish code
to...
* selftest.c (selftest::test_runner::test_runner): New ctor.
(selftest::test_runner::~test_runner): New dtor.
* selftest.h (class selftest::test_runner): New class.
gcc/testsuite/ChangeLog:
PR c/82050
* gcc.dg/plugin/expensive-selftests-1.c: New file.
* gcc.dg/plugin/expensive_selftests_plugin.c: New file.
* gcc.dg/plugin/plugin.exp (plugin_test_list): Add the above.
From-SVN: r255563
Diffstat (limited to 'gcc/selftest.c')
-rw-r--r-- | gcc/selftest.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/gcc/selftest.c b/gcc/selftest.c index b41b9f5..ca84bfa 100644 --- a/gcc/selftest.c +++ b/gcc/selftest.c @@ -213,6 +213,28 @@ locate_file (const char *name) return concat (path_to_selftest_files, "/", name, NULL); } +/* selftest::test_runner's ctor. */ + +test_runner::test_runner (const char *name) +: m_name (name), + m_start_time (get_run_time ()) +{ +} + +/* selftest::test_runner's dtor. Print a summary line to stderr. */ + +test_runner::~test_runner () +{ + /* Finished running tests. */ + long finish_time = get_run_time (); + long elapsed_time = finish_time - m_start_time; + + fprintf (stderr, + "%s: %i pass(es) in %ld.%06ld seconds\n", + m_name, num_passes, + elapsed_time / 1000000, elapsed_time % 1000000); +} + /* Selftests for libiberty. */ /* Verify that xstrndup generates EXPECTED when called on SRC and N. */ |