From 0da03143c795c3e8f2a56bb9226dc1e47a3cd8b2 Mon Sep 17 00:00:00 2001 From: dmalcolm Date: Tue, 19 Jan 2016 14:35:16 +0000 Subject: [PATCH] Fix memory chunk corruption for opts_obstack (PR jit/68446) gcc/ChangeLog: PR jit/68446 * gcc.c (driver::decode_argv): Add call to init_opts_obstack before init_options_struct. * opts.c (init_opts_obstack): Remove idempotency. (init_options_struct): Replace call to init_opts_obstack with a gcc_assert to verify that it has already been called. * toplev.c (toplev::main): Add call to init_opts_obstack before calls to init_options_struct. (toplev::finalize): Move cleanup of opts_obstack next to cleanup of save_decoded_options, clearing the latter, and save_decoded_options_count. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@232567 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 14 ++++++++++++++ gcc/gcc.c | 1 + gcc/opts.c | 14 +++++--------- gcc/toplev.c | 7 ++++++- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bffbedf2591..56890c1b976 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2016-01-19 David Malcolm + + PR jit/68446 + * gcc.c (driver::decode_argv): Add call to + init_opts_obstack before init_options_struct. + * opts.c (init_opts_obstack): Remove idempotency. + (init_options_struct): Replace call to init_opts_obstack + with a gcc_assert to verify that it has already been called. + * toplev.c (toplev::main): Add call to init_opts_obstack before + calls to init_options_struct. + (toplev::finalize): Move cleanup of opts_obstack next to + cleanup of save_decoded_options, clearing the latter, and + save_decoded_options_count. + 2016-01-19 Kyrylo Tkachov PR target/69135 diff --git a/gcc/gcc.c b/gcc/gcc.c index f04fdc440d2..683b30fcbab 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -7216,6 +7216,7 @@ driver::decode_argv (int argc, const char **argv) global_init_params (); finish_params (); + init_opts_obstack (); init_options_struct (&global_options, &global_options_set); decode_cmdline_options_to_array (argc, argv, diff --git a/gcc/opts.c b/gcc/opts.c index 8e8410cd370..b4e8144489c 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -266,18 +266,12 @@ add_comma_separated_to_vector (void **pvec, const char *arg) *pvec = v; } -/* Initialize opts_obstack if not initialized. */ +/* Initialize opts_obstack. */ void init_opts_obstack (void) { - static bool opts_obstack_initialized = false; - - if (!opts_obstack_initialized) - { - opts_obstack_initialized = true; - gcc_obstack_init (&opts_obstack); - } + gcc_obstack_init (&opts_obstack); } /* Initialize OPTS and OPTS_SET before using them in parsing options. */ @@ -287,7 +281,9 @@ init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set) { size_t num_params = get_num_compiler_params (); - init_opts_obstack (); + /* Ensure that opts_obstack has already been initialized by the time + that we initialize any gcc_options instances (PR jit/68446). */ + gcc_assert (opts_obstack.chunk_size > 0); *opts = global_options_init; diff --git a/gcc/toplev.c b/gcc/toplev.c index b754e5b2408..28c115d71c4 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -2053,6 +2053,7 @@ toplev::main (int argc, char **argv) /* One-off initialization of options that does not need to be repeated when options are added for particular functions. */ init_options_once (); + init_opts_obstack (); /* Initialize global options structures; this must be repeated for each structure used for parsing options. */ @@ -2134,11 +2135,15 @@ toplev::finalize (void) finalize_options_struct (&global_options); finalize_options_struct (&global_options_set); + /* save_decoded_options uses opts_obstack, so these must + be cleaned up together. */ + obstack_free (&opts_obstack, NULL); XDELETEVEC (save_decoded_options); + save_decoded_options = NULL; + save_decoded_options_count = 0; /* Clean up the context (and pass_manager etc). */ delete g; g = NULL; - obstack_free (&opts_obstack, NULL); } -- 2.11.4.GIT