From: Martin Liska Date: Thu, 12 Nov 2015 15:50:05 +0000 (+0100) Subject: Fix big memory leak in ix86_valid_target_attribute_p X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=de5672fcb236d43458b4bbd48313ccd699268a1e;p=gcc.git Fix big memory leak in ix86_valid_target_attribute_p * config/i386/i386.c (ix86_valid_target_attribute_p): Finalize options at the of the function. * gcc.c (driver_get_configure_time_options): Call newly introduced init_opts_obstack. * lto-wrapper.c (main): Likewise. * opts.c (init_opts_obstack): New function. (init_options_struct): Call newly introduced init_opts_obstack. * opts.h (init_options_struct): Declare. From-SVN: r230264 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6e5471c308e..4770f0f5e23 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2015-11-12 Martin Liska + + * config/i386/i386.c (ix86_valid_target_attribute_p): + Finalize options at the of the function. + * gcc.c (driver_get_configure_time_options): Call newly + introduced init_opts_obstack. + * lto-wrapper.c (main): Likewise. + * opts.c (init_opts_obstack): New function. + (init_options_struct): Call newly + introduced init_opts_obstack. + * opts.h (init_options_struct): Declare. + 2015-11-12 Martin Liska PR ipa/68035 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 1a6b2fd760e..805f7a88978 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -6237,6 +6237,8 @@ ix86_valid_target_attribute_p (tree fndecl, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize; } + finalize_options_struct (&func_options); + return ret; } diff --git a/gcc/gcc.c b/gcc/gcc.c index 8bbf5be831a..87d19799266 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -9915,7 +9915,7 @@ driver_get_configure_time_options (void (*cb) (const char *option, size_t i; obstack_init (&obstack); - gcc_obstack_init (&opts_obstack); + init_opts_obstack (); n_switches = 0; for (i = 0; i < ARRAY_SIZE (option_default_specs); i++) diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c index 20e67eddf1b..b9ac5356e02 100644 --- a/gcc/lto-wrapper.c +++ b/gcc/lto-wrapper.c @@ -1355,7 +1355,7 @@ main (int argc, char *argv[]) { const char *p; - gcc_obstack_init (&opts_obstack); + init_opts_obstack (); p = argv[0] + strlen (argv[0]); while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1])) diff --git a/gcc/opts.c b/gcc/opts.c index 9a3fbb3c5d0..930ae431157 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -266,6 +266,20 @@ add_comma_separated_to_vector (void **pvec, const char *arg) *pvec = v; } +/* Initialize opts_obstack if not initialized. */ + +void +init_opts_obstack (void) +{ + static bool opts_obstack_initialized = false; + + if (!opts_obstack_initialized) + { + opts_obstack_initialized = true; + gcc_obstack_init (&opts_obstack); + } +} + /* Initialize OPTS and OPTS_SET before using them in parsing options. */ void @@ -273,7 +287,7 @@ init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set) { size_t num_params = get_num_compiler_params (); - gcc_obstack_init (&opts_obstack); + init_opts_obstack (); *opts = global_options_init; diff --git a/gcc/opts.h b/gcc/opts.h index 38b38370fb5..2eb2d9735c6 100644 --- a/gcc/opts.h +++ b/gcc/opts.h @@ -323,6 +323,7 @@ extern void decode_cmdline_options_to_array (unsigned int argc, extern void init_options_once (void); extern void init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set); +extern void init_opts_obstack (void); extern void finalize_options_struct (struct gcc_options *opts); extern void decode_cmdline_options_to_array_default_mask (unsigned int argc, const char **argv,