[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