On 11/12/2015 12:29 PM, Richard Biener wrote: > On Thu, Nov 12, 2015 at 11:03 AM, Martin Liška <mli...@suse.cz> wrote: >> Hello. >> >> Following patch was a bit negotiated with Jakub and can save a huge amount >> of memory in cases >> where target attributes are heavily utilized. >> >> Can bootstrap and survives regression tests on x86_64-linux-pc. >> >> Ready for trunk? > > +static bool opts_obstack_initialized = false; > + > +/* Initialize opts_obstack if not initialized. */ > + > +void > +init_opts_obstack (void) > +{ > + if (!opts_obstack_initialized) > + { > + opts_obstack_initialized = true; > + gcc_obstack_init (&opts_obstack); > > you can move the static global to function scope. > > Ok with that change.
Done and installed as r230264. Final version of the patch is attached. > > Btw, don't other targets need a similar adjustment to their hook? > Grepping shows arm and nios2. nios2 is not the case as it doesn't utilize: init_options_struct (&func_options, NULL); I've been testing patch for aarch64 that is also included in the email. Martin > > Thanks, > Richard. > > >> Thanks, >> Martin
>From 2a7ed80a489228bbb3c271ca9d0217cca888eeae Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Wed, 11 Nov 2015 12:52:11 +0100 Subject: [PATCH] Fix big memory leak in ix86_valid_target_attribute_p gcc/ChangeLog: 2015-11-12 Martin Liska <mli...@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. --- gcc/config/i386/i386.c | 2 ++ gcc/gcc.c | 2 +- gcc/lto-wrapper.c | 2 +- gcc/opts.c | 16 +++++++++++++++- gcc/opts.h | 1 + 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index b84a11d..1325cf0 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 8bbf5be..87d1979 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 20e67ed..b9ac535 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 9a3fbb3..930ae43 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 38b3837..2eb2d97 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, -- 2.6.2
>From b2a7dcae8de93db470da0b35162f5538337320ee Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Thu, 12 Nov 2015 16:41:16 +0100 Subject: [PATCH] Finalize func_options in arm target in arm_valid_target_attribute_p gcc/ChangeLog: 2015-11-12 Martin Liska <mli...@suse.cz> * config/arm/arm.c (arm_valid_target_attribute_p): Finalize options struct. --- gcc/config/arm/arm.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index f4ebbc8..941774b 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -29956,6 +29956,8 @@ arm_valid_target_attribute_p (tree fndecl, tree ARG_UNUSED (name), DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize; + finalize_options_struct (&func_options); + return ret; } -- 2.6.2