On 11/23/2015 11:29 PM, Trevor Saunders wrote:
On Mon, Nov 23, 2015 at 02:48:37PM +0100, marxin wrote:
gcc/ChangeLog:
2015-11-20 Martin Liska <mli...@suse.cz>
* ipa-devirt.c (ipa_devirt): Use auto_vec instead
of a local-scope vec. Release final_warning_records.
---
gcc/ipa-devirt.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index e74f853..6003c92 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -3837,7 +3837,7 @@ ipa_devirt (void)
if (warn_suggest_final_methods)
{
- vec<const decl_warn_count*> decl_warnings_vec = vNULL;
+ auto_vec<const decl_warn_count*> decl_warnings_vec;
final_warning_records->decl_warnings.traverse
<vec<const decl_warn_count *> *, add_decl_warning>
(&decl_warnings_vec);
@@ -3887,7 +3887,8 @@ ipa_devirt (void)
decl, count, dyn_count);
}
}
-
+
+ final_warning_records->type_warnings.release ();
delete (final_warning_records);
You should be able to just make
final_warning_record::type_warnings an auto_vec right? that
seems less error prone, though this is certainly fine for now.
Trev
final_warning_records = 0;
}
--
2.6.3
Hi.
There's v2 of the patch that reflects ideas suggested by Trevor.
Ready to be installed?
Thanks,
Martin
>From 2362e45abccc28a8fc6ed9ad6cbc69a9bee888c7 Mon Sep 17 00:00:00 2001
From: marxin <mli...@suse.cz>
Date: Mon, 23 Nov 2015 14:48:37 +0100
Subject: [PATCH 2/6] Fix memory leaks in IPA devirt
gcc/ChangeLog:
2015-11-20 Martin Liska <mli...@suse.cz>
* ipa-devirt.c (ipa_devirt): Use auto_vec instead
of a local-scope vec.
(struct final_warning_record): Use auto_vec instead
of vec.
---
gcc/ipa-devirt.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index e74f853..1539bb9 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -2987,7 +2987,7 @@ struct decl_warn_count
struct final_warning_record
{
gcov_type dyn_count;
- vec<odr_type_warn_count> type_warnings;
+ auto_vec<odr_type_warn_count> type_warnings;
hash_map<tree, decl_warn_count> decl_warnings;
};
struct final_warning_record *final_warning_records;
@@ -3609,7 +3609,6 @@ ipa_devirt (void)
if (warn_suggest_final_methods || warn_suggest_final_types)
{
final_warning_records = new (final_warning_record);
- final_warning_records->type_warnings = vNULL;
final_warning_records->type_warnings.safe_grow_cleared (odr_types.length ());
free_polymorphic_call_targets_hash ();
}
@@ -3837,7 +3836,7 @@ ipa_devirt (void)
if (warn_suggest_final_methods)
{
- vec<const decl_warn_count*> decl_warnings_vec = vNULL;
+ auto_vec<const decl_warn_count*> decl_warnings_vec;
final_warning_records->decl_warnings.traverse
<vec<const decl_warn_count *> *, add_decl_warning> (&decl_warnings_vec);
@@ -3887,7 +3886,7 @@ ipa_devirt (void)
decl, count, dyn_count);
}
}
-
+
delete (final_warning_records);
final_warning_records = 0;
}
--
2.6.3