From 67fca8b967657de32c3deb9fe20aaef722a3b4ae Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Fri, 15 Jul 2016 11:38:00 -0400 Subject: [PATCH 06/44] (approved) Expose forcibly_ggc_collect and run it after all selftests Jeff: > Seems reasonable and doesn't depend on earlier patches, right? > Assuming that's correct it seems fine for the trunk whenever you want to > install it. gcc/ChangeLog: * ggc-tests.c (forcibly_ggc_collect): Rename to... (selftest::forcibly_ggc_collect): ...this, and remove "static". (test_basic_struct): Update for above renaming. (test_length): Likewise. (test_union): Likewise. (test_finalization): Likewise. (test_deletable_global): Likewise. (test_inheritance): Likewise. (test_chain_next): Likewise. (test_user_struct): Likewise. (test_tree_marking): Likewise. * selftest-run-tests.c (selftest::run_tests): Call selftest::forcibly_ggc_collect at the end of the selftests. * selftest.h (selftest::forcibly_ggc_collect): New decl. --- gcc/ggc-tests.c | 28 ++++++++++++++-------------- gcc/selftest-run-tests.c | 6 ++++++ gcc/selftest.h | 5 +++++ 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/gcc/ggc-tests.c b/gcc/ggc-tests.c index 7f97231..b9cd276 100644 --- a/gcc/ggc-tests.c +++ b/gcc/ggc-tests.c @@ -27,19 +27,19 @@ along with GCC; see the file COPYING3. If not see #if CHECKING_P -/* The various GTY markers must be outside of a namespace to be seen by - gengtype, so we don't put this file within the selftest namespace. */ - /* A helper function for writing ggc tests. */ -static void -forcibly_ggc_collect () +void +selftest::forcibly_ggc_collect () { ggc_force_collect = true; ggc_collect (); ggc_force_collect = false; } +/* The various GTY markers must be outside of a namespace to be seen by + gengtype, so we don't put this file within the selftest namespace. */ + /* Verify that a simple struct works, and that it can @@ -58,7 +58,7 @@ test_basic_struct () root_test_struct = ggc_cleared_alloc (); root_test_struct->other = ggc_cleared_alloc (); - forcibly_ggc_collect (); + selftest::forcibly_ggc_collect (); ASSERT_TRUE (ggc_marked_p (root_test_struct)); ASSERT_TRUE (ggc_marked_p (root_test_struct->other)); @@ -88,7 +88,7 @@ test_length () for (int i = 0; i < count; i++) root_test_of_length->elem[i] = ggc_cleared_alloc (); - forcibly_ggc_collect (); + selftest::forcibly_ggc_collect (); ASSERT_TRUE (ggc_marked_p (root_test_of_length)); for (int i = 0; i < count; i++) @@ -162,7 +162,7 @@ test_union () test_struct *referenced_by_other = ggc_cleared_alloc (); other->m_ptr = referenced_by_other; - forcibly_ggc_collect (); + selftest::forcibly_ggc_collect (); ASSERT_TRUE (ggc_marked_p (root_test_of_union_1)); ASSERT_TRUE (ggc_marked_p (ts)); @@ -202,7 +202,7 @@ test_finalization () test_struct_with_dtor::dtor_call_count = 0; - forcibly_ggc_collect (); + selftest::forcibly_ggc_collect (); /* Verify that the destructor was run for each instance. */ ASSERT_EQ (count, test_struct_with_dtor::dtor_call_count); @@ -220,7 +220,7 @@ test_deletable_global () test_of_deletable = ggc_cleared_alloc (); ASSERT_TRUE (test_of_deletable != NULL); - forcibly_ggc_collect (); + selftest::forcibly_ggc_collect (); ASSERT_EQ (NULL, test_of_deletable); } @@ -293,7 +293,7 @@ test_inheritance () test_some_subclass_as_base_ptr = new some_subclass (); test_some_other_subclass_as_base_ptr = new some_other_subclass (); - forcibly_ggc_collect (); + selftest::forcibly_ggc_collect (); /* Verify that the roots and everything referenced by them got marked (both for fields in the base class and those in subclasses). */ @@ -372,7 +372,7 @@ test_chain_next () tail_node = new_node; } - forcibly_ggc_collect (); + selftest::forcibly_ggc_collect (); /* If we got here, we survived. */ @@ -439,7 +439,7 @@ test_user_struct () num_calls_to_user_gt_ggc_mx = 0; - forcibly_ggc_collect (); + selftest::forcibly_ggc_collect (); ASSERT_TRUE (ggc_marked_p (root_user_struct_ptr)); ASSERT_TRUE (ggc_marked_p (referenced)); @@ -457,7 +457,7 @@ test_tree_marking () { dummy_unittesting_tree = build_int_cst (integer_type_node, 1066); - forcibly_ggc_collect (); + selftest::forcibly_ggc_collect (); ASSERT_TRUE (ggc_marked_p (dummy_unittesting_tree)); } diff --git a/gcc/selftest-run-tests.c b/gcc/selftest-run-tests.c index d9d3ea1..54a9b0f 100644 --- a/gcc/selftest-run-tests.c +++ b/gcc/selftest-run-tests.c @@ -80,6 +80,12 @@ selftest::run_tests () /* Run any lang-specific selftests. */ lang_hooks.run_lang_selftests (); + /* Force a GC at the end of the selftests, to shake out GC-related + issues. For example, if any GC-managed items have buggy (or missing) + finalizers, this last collection will ensure that things that were + failed to be finalized can be detected by valgrind. */ + forcibly_ggc_collect (); + /* Finished running tests. */ long finish_time = get_run_time (); long elapsed_time = finish_time - start_time; diff --git a/gcc/selftest.h b/gcc/selftest.h index 4c50217..86ad14c 100644 --- a/gcc/selftest.h +++ b/gcc/selftest.h @@ -182,6 +182,11 @@ class temp_override T m_old_value; }; +/* A helper function for writing tests that interact with the + garbage collector. */ + +extern void forcibly_ggc_collect (); + /* Declarations for specific families of tests (by source file), in alphabetical order. */ extern void bitmap_c_tests (); -- 1.8.5.3