Fix big memory leak in ix86_valid_target_attribute_p
authorMartin Liska <mliska@suse.cz>
Thu, 12 Nov 2015 15:50:05 +0000 (16:50 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 12 Nov 2015 15:50:05 +0000 (15:50 +0000)
* 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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/gcc.c
gcc/lto-wrapper.c
gcc/opts.c
gcc/opts.h

index 6e5471c308efef3b2221766477b42d729f823738..4770f0f5e232814d75223c9211f997e8a96f389a 100644 (file)
@@ -1,3 +1,15 @@
+2015-11-12  Martin Liska  <mliska@suse.cz>
+
+       * 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  <mliska@suse.cz>
 
        PR ipa/68035
index 1a6b2fd760edfaee3e241b0269df0277f1201186..805f7a8897843ed13514fbda5378a8d11290b930 100644 (file)
@@ -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;
 }
 
index 8bbf5be831a1c65271e997276e0555854eddc88a..87d19799266d09a00c32e27eb2cbc713c8765ed6 100644 (file)
--- 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++)
index 20e67eddf1baac35d091dc94e471df499796223b..b9ac5356e021c164cd0f77c886e6fb2c17ee389d 100644 (file)
@@ -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]))
index 9a3fbb3c5d07ed515c0a123cc2bae7d33232ac88..930ae431157e5fd07e001c2e8d4c34668f0812d5 100644 (file)
@@ -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;
 
index 38b38370fb53080bfba385f4c56ec3d3a812eb53..2eb2d9735c6ab8ef98d61c56918dc5e651ebe12c 100644 (file)
@@ -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,