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/dumpfile.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/dumpfile.c')
-rw-r--r-- | gcc/dumpfile.c | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c index fca7b51..c2cd89b 100644 --- a/gcc/dumpfile.c +++ b/gcc/dumpfile.c @@ -49,29 +49,29 @@ int dump_flags; TREE_DUMP_INDEX enumeration in dumpfile.h. */ static struct dump_file_info dump_files[TDI_end] = { - {NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0}, + {NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, false}, {".cgraph", "ipa-cgraph", NULL, NULL, NULL, NULL, NULL, TDF_IPA, - 0, 0, 0, 0, 0}, + 0, 0, 0, 0, 0, false}, {".type-inheritance", "ipa-type-inheritance", NULL, NULL, NULL, NULL, NULL, TDF_IPA, - 0, 0, 0, 0, 0}, + 0, 0, 0, 0, 0, false}, {".tu", "translation-unit", NULL, NULL, NULL, NULL, NULL, TDF_TREE, - 0, 0, 0, 0, 1}, + 0, 0, 0, 0, 1, false}, {".class", "class-hierarchy", NULL, NULL, NULL, NULL, NULL, TDF_TREE, - 0, 0, 0, 0, 2}, + 0, 0, 0, 0, 2, false}, {".original", "tree-original", NULL, NULL, NULL, NULL, NULL, TDF_TREE, - 0, 0, 0, 0, 3}, + 0, 0, 0, 0, 3, false}, {".gimple", "tree-gimple", NULL, NULL, NULL, NULL, NULL, TDF_TREE, - 0, 0, 0, 0, 4}, + 0, 0, 0, 0, 4, false}, {".nested", "tree-nested", NULL, NULL, NULL, NULL, NULL, TDF_TREE, - 0, 0, 0, 0, 5}, + 0, 0, 0, 0, 5, false}, #define FIRST_AUTO_NUMBERED_DUMP 6 {NULL, "tree-all", NULL, NULL, NULL, NULL, NULL, TDF_TREE, - 0, 0, 0, 0, 0}, + 0, 0, 0, 0, 0, false}, {NULL, "rtl-all", NULL, NULL, NULL, NULL, NULL, TDF_RTL, - 0, 0, 0, 0, 0}, + 0, 0, 0, 0, 0, false}, {NULL, "ipa-all", NULL, NULL, NULL, NULL, NULL, TDF_IPA, - 0, 0, 0, 0, 0}, + 0, 0, 0, 0, 0, false}, }; /* Define a name->number mapping for a dump flag value. */ @@ -148,10 +148,32 @@ gcc::dump_manager::dump_manager (): { } +gcc::dump_manager::~dump_manager () +{ + for (size_t i = 0; i < m_extra_dump_files_in_use; i++) + { + dump_file_info *dfi = &m_extra_dump_files[i]; + /* suffix, swtch, glob are statically allocated for the entries + in dump_files, and for statistics, but are dynamically allocated + for those for passes. */ + if (dfi->owns_strings) + { + XDELETEVEC (const_cast <char *> (dfi->suffix)); + XDELETEVEC (const_cast <char *> (dfi->swtch)); + XDELETEVEC (const_cast <char *> (dfi->glob)); + } + /* These, if non-NULL, are always dynamically allocated. */ + XDELETEVEC (const_cast <char *> (dfi->pfilename)); + XDELETEVEC (const_cast <char *> (dfi->alt_filename)); + } + XDELETEVEC (m_extra_dump_files); +} + unsigned int gcc::dump_manager:: dump_register (const char *suffix, const char *swtch, const char *glob, - int flags, int optgroup_flags) + int flags, int optgroup_flags, + bool take_ownership) { int num = m_next_dump++; @@ -175,6 +197,7 @@ dump_register (const char *suffix, const char *swtch, const char *glob, m_extra_dump_files[count].pflags = flags; m_extra_dump_files[count].optgroup_flags = optgroup_flags; m_extra_dump_files[count].num = num; + m_extra_dump_files[count].owns_strings = take_ownership; return count + TDI_end; } |