On Fri, 2016-10-21 at 12:04 +0200, Bernd Schmidt wrote: > On 10/21/2016 02:36 AM, David Malcolm wrote: > > + /* Test dumping of hard regs. This is inherently target > > -specific due > > + to the name. */ > > +#ifdef I386_OPTS_H > > + ASSERT_RTL_DUMP_EQ ("(reg:SI ax)", gen_raw_REG (SImode, 0)); > > +#endif > > Generally putting in target dependencies like this isn't something we > like to do. The patch is OK without this part, and we can revisit > this, > but maybe there wants to be a target hook for running target-specific > selftests.
Thanks. I removed the above target-specific part, and committed it as r241405 (having reverified bootstrap®rtest on x86_64-pc-linux-gnu). The following patch implements a target hook for running target-specific selftests. It implements the above test for dumping of hard regs, putting it within i386.c. It's rather trivial, but I have followups that add further target-specific tests, so hopefully this foundation is OK. Successfully bootstrapped®rtested on x86_64-pc-linux-gnu. OK for trunk? > > + ASSERT_RTL_DUMP_EQ ("(cjump_insn (set (pc)\n" > > + " (label_ref 0))\n" > > + " (nil))\n", > > + jump_insn); > > } > > I do wonder about the (nil)s and whether we can eliminate them. I hope to. gcc/ChangeLog: * config/i386/i386.c: Include "selftest.h" and "selftest-rtl.h". (selftest::ix86_test_dumping_hard_regs): New function. (selftest::ix86_run_selftests): New function. (TARGET_RUN_TARGET_SELFTESTS): When CHECKING_P, wire this up to selftest::ix86_run_selftests. * doc/tm.texi.in (TARGET_RUN_TARGET_SELFTESTS): New. * doc/tm.texi: Regenerate * rtl-tests.c: Include "selftest-rtl.h". (selftest::assert_rtl_dump_eq): Make non-static. (ASSERT_RTL_DUMP_EQ): Move to selftest-rtl.h. (selftest::test_dumping_regs): Update comment. * selftest-rtl.h: New file. * selftest-run-tests.c: Include "target.h". (selftest::run_tests): If non-NULL, call targetm.run_target_selftests. * target.def (run_target_selftests): New hook. --- gcc/config/i386/i386.c | 34 ++++++++++++++++++++++++++++++++++ gcc/doc/tm.texi | 4 ++++ gcc/doc/tm.texi.in | 2 ++ gcc/rtl-tests.c | 10 +++------- gcc/selftest-rtl.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ gcc/selftest-run-tests.c | 5 +++++ gcc/target.def | 6 ++++++ 7 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 gcc/selftest-rtl.h diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 3e6f8fd..8f6ceb4 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -77,6 +77,8 @@ along with GCC; see the file COPYING3. If not see #include "case-cfn-macros.h" #include "regrename.h" #include "dojump.h" +#include "selftest.h" +#include "selftest-rtl.h" /* This file should be included last. */ #include "target-def.h" @@ -50365,6 +50367,33 @@ ix86_addr_space_zero_address_valid (addr_space_t as) #undef TARGET_ADDR_SPACE_ZERO_ADDRESS_VALID #define TARGET_ADDR_SPACE_ZERO_ADDRESS_VALID ix86_addr_space_zero_address_valid +/* Target-specific selftests. */ + +#if CHECKING_P + +namespace selftest { + +/* Verify that hard regs are dumped as expected (in compact mode). */ + +static void +ix86_test_dumping_hard_regs () +{ + ASSERT_RTL_DUMP_EQ ("(reg:SI ax)", gen_raw_REG (SImode, 0)); + ASSERT_RTL_DUMP_EQ ("(reg:SI dx)", gen_raw_REG (SImode, 1)); +} + +/* Run all target-specific selftests. */ + +static void +ix86_run_selftests (void) +{ + ix86_test_dumping_hard_regs (); +} + +} // namespace selftest + +#endif /* CHECKING_P */ + /* Initialize the GCC target structure. */ #undef TARGET_RETURN_IN_MEMORY #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory @@ -50840,6 +50869,11 @@ ix86_addr_space_zero_address_valid (addr_space_t as) #undef TARGET_CUSTOM_FUNCTION_DESCRIPTORS #define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 1 +#if CHECKING_P +#undef TARGET_RUN_TARGET_SELFTESTS +#define TARGET_RUN_TARGET_SELFTESTS selftest::ix86_run_selftests +#endif /* #if CHECKING_P */ + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-i386.h" diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 29dc73b..7efcf57 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -11821,3 +11821,7 @@ All and all it does not take long to convert ports that the maintainer is familiar with. @end defmac + +@deftypefn {Target Hook} void TARGET_RUN_TARGET_SELFTESTS (void) +If selftests are enabled, run any selftests for this target. +@end deftypefn diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index efcd741..fb94dd8 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -8307,3 +8307,5 @@ All and all it does not take long to convert ports that the maintainer is familiar with. @end defmac + +@hook TARGET_RUN_TARGET_SELFTESTS diff --git a/gcc/rtl-tests.c b/gcc/rtl-tests.c index b723560..10c0ddc 100644 --- a/gcc/rtl-tests.c +++ b/gcc/rtl-tests.c @@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see #include "cfgbuild.h" #include "print-rtl.h" #include "selftest.h" +#include "selftest-rtl.h" #include "function.h" #include "memmodel.h" #include "emit-rtl.h" @@ -60,7 +61,7 @@ verify_print_pattern (const char *expected, rtx pat) /* Verify that X is dumped as EXPECTED_DUMP, using compact mode. Use LOC as the effective location when reporting errors. */ -static void +void assert_rtl_dump_eq (const location &loc, const char *expected_dump, rtx x) { named_temp_file tmp_out (".rtl"); @@ -75,18 +76,13 @@ assert_rtl_dump_eq (const location &loc, const char *expected_dump, rtx x) free (dump); } -/* Verify that RTX is dumped as EXPECTED_DUMP, using compact mode. */ - -#define ASSERT_RTL_DUMP_EQ(EXPECTED_DUMP, RTX) \ - assert_rtl_dump_eq (SELFTEST_LOCATION, (EXPECTED_DUMP), (RTX)) - /* Verify that regs are dumped as expected (in compact mode). */ static void test_dumping_regs () { /* Dumps of hard regs contain a target-specific name, so we don't test - it here. */ + it here; this can be tested in target-specific selftests. */ /* Test dumping of virtual regs. The various virtual regs are inited as Pmode, so this is target-specific. The tests below assume DImode, so diff --git a/gcc/selftest-rtl.h b/gcc/selftest-rtl.h new file mode 100644 index 0000000..0f0e167 --- /dev/null +++ b/gcc/selftest-rtl.h @@ -0,0 +1,45 @@ +/* A self-testing framework, for use by -fself-test. + Copyright (C) 2016 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef GCC_SELFTEST_RTL_H +#define GCC_SELFTEST_RTL_H + +/* The selftest code should entirely disappear in a production + configuration, hence we guard all of it with #if CHECKING_P. */ + +#if CHECKING_P + +namespace selftest { + +/* Verify that X is dumped as EXPECTED_DUMP, using compact mode. + Use LOC as the effective location when reporting errors. */ + +extern void +assert_rtl_dump_eq (const location &loc, const char *expected_dump, rtx x); + +/* Verify that RTX is dumped as EXPECTED_DUMP, using compact mode. */ + +#define ASSERT_RTL_DUMP_EQ(EXPECTED_DUMP, RTX) \ + assert_rtl_dump_eq (SELFTEST_LOCATION, (EXPECTED_DUMP), (RTX)) + +} /* end of namespace selftest. */ + +#endif /* #if CHECKING_P */ + +#endif /* GCC_SELFTEST_RTL_H */ diff --git a/gcc/selftest-run-tests.c b/gcc/selftest-run-tests.c index d9d3ea1..68930ae 100644 --- a/gcc/selftest-run-tests.c +++ b/gcc/selftest-run-tests.c @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "selftest.h" #include "tree.h" +#include "target.h" #include "langhooks.h" /* This function needed to be split out from selftest.c as it references @@ -77,6 +78,10 @@ selftest::run_tests () /* This one relies on most of the above. */ function_tests_c_tests (); + /* Run any target-specific selftests. */ + if (targetm.run_target_selftests) + targetm.run_target_selftests (); + /* Run any lang-specific selftests. */ lang_hooks.run_lang_selftests (); diff --git a/gcc/target.def b/gcc/target.def index 29d1f81..61c5397 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -6136,6 +6136,12 @@ HOOK_VECTOR_END (mode_switching) #include "target-insns.def" #undef DEF_TARGET_INSN +DEFHOOK +(run_target_selftests, + "If selftests are enabled, run any selftests for this target.", + void, (void), + NULL) + /* Close the 'struct gcc_target' definition. */ HOOK_VECTOR_END (C90_EMPTY_HACK) -- 1.8.5.3