diff options
author | David Malcolm <dmalcolm@redhat.com> | 2014-11-19 19:23:06 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2014-11-19 19:23:06 +0000 |
commit | 10fdd6e94f3d0c6b9da1bf82651ec06171d0c7d3 (patch) | |
tree | b461473cf577eda9fadf4e1190832b520ea2460e /gcc/passes.c | |
parent | a4fe9e9923db7931411e3bbf86892245f3bfb4e2 (diff) | |
download | gcc-10fdd6e94f3d0c6b9da1bf82651ec06171d0c7d3.zip gcc-10fdd6e94f3d0c6b9da1bf82651ec06171d0c7d3.tar.gz gcc-10fdd6e94f3d0c6b9da1bf82651ec06171d0c7d3.tar.bz2 |
PR jit/63854: Fix memory leaks within context/pass_manager/dump_manager
gcc/ChangeLog:
PR jit/63854
* config/alpha/alpha.c (alpha_option_override): Remove static from
"handle_trap_shadows_info" and "align_insns_info".
* config/i386/i386.c (ix86_option_override): Likewise for
"insert_vzeroupper_info".
* config/rl78/rl78.c (rl78_asm_file_start): Likewise for
"rl78_devirt_info" and "rl78_move_elim_info".
* config/rs6000/rs6000.c (rs6000_option_override): Likewise for
"analyze_swaps_info".
* context.c (gcc::context::~context): New.
* context.h (gcc::context::~context): New.
* dumpfile.c (dump_files): Add "false" initializers for new field
"owns_strings".
(gcc::dump_manager::~dump_manager): New.
(gcc::dump_manager::dump_register): Add param "take_ownership".
* dumpfile.h (struct dump_file_info): Add field "owns_strings".
(gcc::dump_manager::~dump_manager): New.
(gcc::dump_manager::dump_register): Add param "take_ownership".
* pass_manager.h (gcc::pass_manager::operator delete): New.
(gcc::pass_manager::~pass_manager): New.
* passes.c (pass_manager::register_one_dump_file): Pass "true" to
new "owns_strings" argument to dump_register.
(pass_manager::operator delete): New.
(delete_pass_tree): New function.
(pass_manager::~pass_manager): New.
* statistics.c (statistics_early_init): Pass "false" to
new "owns_strings" argument to dump_register.
* toplev.c (toplev::finalize): Clean up the context and thus the
things it owns.
From-SVN: r217793
Diffstat (limited to 'gcc/passes.c')
-rw-r--r-- | gcc/passes.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/gcc/passes.c b/gcc/passes.c index f6f3b9d..a3be0bb 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -776,7 +776,8 @@ pass_manager::register_one_dump_file (opt_pass *pass) if (optgroup_flags == OPTGROUP_NONE) optgroup_flags = OPTGROUP_OTHER; id = dumps->dump_register (dot_name, flag_name, glob_name, flags, - optgroup_flags); + optgroup_flags, + true); set_pass_for_id (id, pass); full_name = concat (prefix, pass->name, num, NULL); register_pass_name (pass, full_name); @@ -1527,6 +1528,12 @@ pass_manager::operator new (size_t sz) return xcalloc (1, sz); } +void +pass_manager::operator delete (void *ptr) +{ + free (ptr); +} + pass_manager::pass_manager (context *ctxt) : all_passes (NULL), all_small_ipa_passes (NULL), all_lowering_passes (NULL), all_regular_ipa_passes (NULL), @@ -1584,6 +1591,36 @@ pass_manager::pass_manager (context *ctxt) register_dump_files (all_passes); } +static void +delete_pass_tree (opt_pass *pass) +{ + while (pass) + { + /* Recurse into child passes. */ + delete_pass_tree (pass->sub); + + opt_pass *next = pass->next; + + /* Delete this pass. */ + delete pass; + + /* Iterate onto sibling passes. */ + pass = next; + } +} + +pass_manager::~pass_manager () +{ + XDELETEVEC (passes_by_id); + + /* Call delete_pass_tree on each of the pass_lists. */ +#define DEF_PASS_LIST(LIST) \ + delete_pass_tree (*pass_lists[PASS_LIST_NO_##LIST]); + GCC_PASS_LISTS +#undef DEF_PASS_LIST + +} + /* If we are in IPA mode (i.e., current_function_decl is NULL), call function CALLBACK for every function in the call graph. Otherwise, call CALLBACK on the current function. */ |