line_maps instances such as the global line_table are
GC-managed, but the htab within location_adhoc_data_map.htab
is not GC-managed.

Previously this was deleted manually by a call to
location_adhoc_data_fini within toplev::main.

However, on adding a call to forcibly_ggc_collect after the
selftests, all of the htabs for the various line_tables
created during the selftests start showing up as leaks
in "make selftest-valgrind", e.g.:

13,536 (1,344 direct, 12,192 indirect) bytes in 12 blocks are definitely lost 
in loss record 1,065 of 1,086
   at 0x4A081D4: calloc (in 
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
   by 0x16DB3B0: xcalloc (xmalloc.c:163)
   by 0x16D8D34: htab_create_typed_alloc (hashtab.c:358)
   by 0x16D8DBD: htab_create_alloc (hashtab.c:286)
   by 0x16A2CCC: linemap_init(line_maps*, unsigned int) (line-map.c:353)
   by 0x1685605: 
selftest::line_table_test::line_table_test(selftest::line_table_case const&) 
(input.c:1624)
   by 0x167D09C: 
selftest::test_applying_fixits_modernize_named_init(selftest::line_table_case 
const&) (edit-context.c:1430)
   by 0x1686827: selftest::for_each_line_table_case(void 
(*)(selftest::line_table_case const&)) (input.c:3227)
   by 0x167F067: selftest::edit_context_c_tests() (edit-context.c:1658)
   by 0x1616E67: selftest::run_tests() (selftest-run-tests.c:71)
   by 0xC0DB25: toplev::run_self_tests() (toplev.c:2076)
   by 0x618EB4: toplev::main(int, char**) (toplev.c:2153)

This patch removes the manual one-time cleanup in favor of
adding a destructor to class line_maps, which cleans up
the non-GC-managed htab.

Doing so improves "make selftest-valgrind" from:

==61118== LEAK SUMMARY:
==61118==    definitely lost: 121,248 bytes in 1,515 blocks
==61118==    indirectly lost: 974,344 bytes in 959 blocks
==61118==      possibly lost: 0 bytes in 0 blocks
==61118==    still reachable: 1,332,599 bytes in 3,684 blocks
==61118==         suppressed: 0 bytes in 0 blocks

to:

==57182== LEAK SUMMARY:
==57182==    definitely lost: 13,840 bytes in 556 blocks
==57182==    indirectly lost: 0 bytes in 0 blocks
==57182==      possibly lost: 0 bytes in 0 blocks
==57182==    still reachable: 1,355,703 bytes in 3,684 blocks
==57182==         suppressed: 0 bytes in 0 blocks

Successfully bootstrapped&regrtested on x86_64-pc-linux-gnu.

Committed to trunk as r241533.

gcc/ChangeLog:
        * toplev.c (toplev::main): Remove call to
        location_adhoc_data_fini.

libcpp/ChangeLog:
        * include/line-map.h (line_maps::~line_maps): New dtor.
        (location_adhoc_data_fini): Delete decl.
        * line-map.c (line_maps::~line_maps): New dtor.
        (location_adhoc_data_fini): Delete.
---
 gcc/toplev.c              |  1 -
 libcpp/include/line-map.h |  3 ++-
 libcpp/line-map.c         | 15 ++++++++-------
 3 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/gcc/toplev.c b/gcc/toplev.c
index 1df80d0..59b84eb 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -2169,7 +2169,6 @@ toplev::main (int argc, char **argv)
   diagnostic_finish (global_dc);
 
   finalize_plugins ();
-  location_adhoc_data_fini (line_table);
 
   after_memory_report = true;
 
diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h
index 8be98b5..b61c3cc 100644
--- a/libcpp/include/line-map.h
+++ b/libcpp/include/line-map.h
@@ -699,6 +699,8 @@ struct GTY(()) location_adhoc_data_map {
 
 /* A set of chronological line_map structures.  */
 struct GTY(()) line_maps {
+
+  ~line_maps ();
   
   maps_info_ordinary info_ordinary;
 
@@ -977,7 +979,6 @@ LINEMAPS_LAST_ALLOCATED_MACRO_MAP (const line_maps *set)
   return (line_map_macro *)LINEMAPS_LAST_ALLOCATED_MAP (set, true);
 }
 
-extern void location_adhoc_data_fini (struct line_maps *);
 extern source_location get_combined_adhoc_loc (struct line_maps *,
                                               source_location,
                                               source_range,
diff --git a/libcpp/line-map.c b/libcpp/line-map.c
index c5c42f0..c98ee45 100644
--- a/libcpp/line-map.c
+++ b/libcpp/line-map.c
@@ -57,6 +57,14 @@ static source_location linemap_macro_loc_to_exp_point 
(struct line_maps *,
 extern unsigned num_expanded_macros_counter;
 extern unsigned num_macro_tokens_counter;
 
+/* Destructor for class line_maps.
+   Ensure non-GC-managed memory is released.  */
+
+line_maps::~line_maps ()
+{
+  htab_delete (location_adhoc_data_map.htab);
+}
+
 /* Hash function for location_adhoc_data hashtable.  */
 
 static hashval_t
@@ -333,13 +341,6 @@ get_pure_location (line_maps *set, source_location loc)
   return loc & ~((1 << ordmap->m_range_bits) - 1);
 }
 
-/* Finalize the location_adhoc_data structure.  */
-void
-location_adhoc_data_fini (struct line_maps *set)
-{
-  htab_delete (set->location_adhoc_data_map.htab);
-}
-
 /* Initialize a line map set.  */
 
 void
-- 
1.8.5.3

Reply via email to