On Wed, Nov 7, 2018 at 5:22 PM David Malcolm <dmalc...@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 >