Message ID | 1541610522-56777-2-git-send-email-dmalcolm@redhat.com |
---|---|
State | New |
Headers | show |
Series | Fix -fopt-info-inline (PR ipa/86395) | expand |
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 >
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 ();