[PATCH 1/4] cgraph: add selftest::symbol_table_test
Richard Biener
richard.guenther@gmail.com
Thu Nov 8 11:29:00 GMT 2018
On Wed, Nov 7, 2018 at 5:22 PM David Malcolm <dmalcolm@redhat.com> wrote:
>
> This patch adds a selftest fixture for overriding the "symtab" global,
> so that selftests involving symtab nodes can be isolated from each
> other: each selftest can have its own symbol_table instance.
>
> In particular, this ensures that nodes can have a predictable "order"
> and thus predictable dump names within selftests.
>
> Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu, in
> conjunction with the rest of the patch kit.
>
> OK for trunk?
OK.
> gcc/ChangeLog:
> * cgraph.c: Include "selftest.h".
> (saved_symtab): New variable.
> (selftest::symbol_table_test::symbol_table_test): New ctor.
> (selftest::symbol_table_test::~symbol_table_test): New dtor.
> (selftest::test_symbol_table_test): New test.
> (selftest::cgraph_c_tests): New.
> * cgraph.h (saved_symtab): New decl.
> (selftest::symbol_table_test): New class.
> * selftest-run-tests.c (selftest::run_tests): Call
> selftest::cgraph_c_tests.
> * selftest.h (selftest::cgraph_c_tests): New decl.
> ---
> gcc/cgraph.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++
> gcc/cgraph.h | 23 +++++++++++++++++
> gcc/selftest-run-tests.c | 1 +
> gcc/selftest.h | 1 +
> 4 files changed, 92 insertions(+)
>
> diff --git a/gcc/cgraph.c b/gcc/cgraph.c
> index b432f7e..b3dd429 100644
> --- a/gcc/cgraph.c
> +++ b/gcc/cgraph.c
> @@ -62,6 +62,7 @@ along with GCC; see the file COPYING3. If not see
> #include "gimplify.h"
> #include "stringpool.h"
> #include "attribs.h"
> +#include "selftest.h"
>
> /* FIXME: Only for PROP_loops, but cgraph shouldn't have to know about this. */
> #include "tree-pass.h"
> @@ -3765,4 +3766,70 @@ cgraph_edge::sreal_frequency ()
> : caller->count);
> }
>
> +/* A stashed copy of "symtab" for use by selftest::symbol_table_test.
> + This needs to be a global so that it can be a GC root, and thus
> + prevent the stashed copy from being garbage-collected if the GC runs
> + during a symbol_table_test. */
> +
> +symbol_table *saved_symtab;
> +
> +#if CHECKING_P
> +
> +namespace selftest {
> +
> +/* class selftest::symbol_table_test. */
> +
> +/* Constructor. Store the old value of symtab, and create a new one. */
> +
> +symbol_table_test::symbol_table_test ()
> +{
> + gcc_assert (saved_symtab == NULL);
> + saved_symtab = symtab;
> + symtab = new (ggc_cleared_alloc <symbol_table> ()) symbol_table ();
> +}
> +
> +/* Destructor. Restore the old value of symtab. */
> +
> +symbol_table_test::~symbol_table_test ()
> +{
> + gcc_assert (saved_symtab != NULL);
> + symtab = saved_symtab;
> + saved_symtab = NULL;
> +}
> +
> +/* Verify that symbol_table_test works. */
> +
> +static void
> +test_symbol_table_test ()
> +{
> + /* Simulate running two selftests involving symbol tables. */
> + for (int i = 0; i < 2; i++)
> + {
> + symbol_table_test stt;
> + tree test_decl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
> + get_identifier ("test_decl"),
> + build_function_type_list (void_type_node,
> + NULL_TREE));
> + cgraph_node *node = cgraph_node::get_create (test_decl);
> + gcc_assert (node);
> +
> + /* Verify that the node has order 0 on both iterations,
> + and thus that nodes have predictable dump names in selftests. */
> + ASSERT_EQ (node->order, 0);
> + ASSERT_STREQ (node->dump_name (), "test_decl/0");
> + }
> +}
> +
> +/* Run all of the selftests within this file. */
> +
> +void
> +cgraph_c_tests ()
> +{
> + test_symbol_table_test ();
> +}
> +
> +} // namespace selftest
> +
> +#endif /* CHECKING_P */
> +
> #include "gt-cgraph.h"
> diff --git a/gcc/cgraph.h b/gcc/cgraph.h
> index 71c5453..d326866 100644
> --- a/gcc/cgraph.h
> +++ b/gcc/cgraph.h
> @@ -3350,4 +3350,27 @@ xstrdup_for_dump (const char *transient_str)
> return ggc_strdup (transient_str);
> }
>
> +extern GTY(()) symbol_table *saved_symtab;
> +
> +#if CHECKING_P
> +
> +namespace selftest {
> +
> +/* An RAII-style class for use in selftests for temporarily using a different
> + symbol_table, so that such tests can be isolated from each other. */
> +
> +class symbol_table_test
> +{
> + public:
> + /* Constructor. Override "symtab". */
> + symbol_table_test ();
> +
> + /* Constructor. Restore the saved_symtab. */
> + ~symbol_table_test ();
> +};
> +
> +} // namespace selftest
> +
> +#endif /* CHECKING_P */
> +
> #endif /* GCC_CGRAPH_H */
> diff --git a/gcc/selftest-run-tests.c b/gcc/selftest-run-tests.c
> index 562ada7..6d65d24 100644
> --- a/gcc/selftest-run-tests.c
> +++ b/gcc/selftest-run-tests.c
> @@ -73,6 +73,7 @@ selftest::run_tests ()
> unique_ptr_tests_cc_tests ();
> opt_proposer_c_tests ();
> json_cc_tests ();
> + cgraph_c_tests ();
> optinfo_emit_json_cc_tests ();
> opt_problem_cc_tests ();
>
> diff --git a/gcc/selftest.h b/gcc/selftest.h
> index 8da7c4a..4e4c755 100644
> --- a/gcc/selftest.h
> +++ b/gcc/selftest.h
> @@ -215,6 +215,7 @@ class test_runner
> alphabetical order. */
> extern void attribute_c_tests ();
> extern void bitmap_c_tests ();
> +extern void cgraph_c_tests ();
> extern void diagnostic_c_tests ();
> extern void diagnostic_show_locus_c_tests ();
> extern void dumpfile_c_tests ();
> --
> 1.8.5.3
>
More information about the Gcc-patches
mailing list