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? 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