diff mbox

Fix memory leak in Fortran FE with init_emit

Message ID 20120822130314.GU1999@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Aug. 22, 2012, 1:03 p.m. UTC
Hi!

init_function_start is these days supposed to be called only at the start of
RTL expansion, it shouldn't be called much earlier, because then we leak
e.g. the memory allocated by init_emit.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2012-08-22  Jakub Jelinek  <jakub@redhat.com>

	* trans-decl.c (trans_function_start, generate_coarray_init,
	create_main_function, gfc_generate_constructors): Call
	allocate_struct_function instead of init_function_start.


	Jakub

Comments

Tobias Burnus Aug. 22, 2012, 1:28 p.m. UTC | #1
On 08/22/2012 03:03 PM, Jakub Jelinek wrote:
> init_function_start is these days supposed to be called only at the start of
> RTL expansion, it shouldn't be called much earlier, because then we leak
> e.g. the memory allocated by init_emit.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK. That way it makes much more sense how init_function_start works. 
Thanks for the patch!

Tobias

> 2012-08-22  Jakub Jelinek  <jakub@redhat.com>
>
> 	* trans-decl.c (trans_function_start, generate_coarray_init,
> 	create_main_function, gfc_generate_constructors): Call
> 	allocate_struct_function instead of init_function_start.
>
> --- gcc/fortran/trans-decl.c.jj	2012-08-13 14:36:51.000000000 +0200
> +++ gcc/fortran/trans-decl.c	2012-08-22 12:18:29.963953958 +0200
> @@ -2265,7 +2265,8 @@ trans_function_start (gfc_symbol * sym)
>     /* Create RTL for function definition.  */
>     make_decl_rtl (fndecl);
>   
> -  init_function_start (fndecl);
> +  gcc_checking_assert (DECL_STRUCT_FUNCTION (fndecl) == NULL);
> +  allocate_struct_function (fndecl, false);
>   
>     /* function.c requires a push at the start of the function.  */
>     pushlevel ();
> @@ -4408,7 +4409,8 @@ generate_coarray_init (gfc_namespace * n
>   
>     rest_of_decl_compilation (fndecl, 0, 0);
>     make_decl_rtl (fndecl);
> -  init_function_start (fndecl);
> +  gcc_checking_assert (DECL_STRUCT_FUNCTION (fndecl) == NULL);
> +  allocate_struct_function (fndecl, false);
>   
>     pushlevel ();
>     gfc_init_block (&caf_init_block);
> @@ -4982,7 +4984,8 @@ create_main_function (tree fndecl)
>   
>     rest_of_decl_compilation (ftn_main, 1, 0);
>     make_decl_rtl (ftn_main);
> -  init_function_start (ftn_main);
> +  gcc_checking_assert (DECL_STRUCT_FUNCTION (ftn_main) == NULL);
> +  allocate_struct_function (ftn_main, false);
>     pushlevel ();
>   
>     gfc_init_block (&body);
> @@ -5537,7 +5540,8 @@ gfc_generate_constructors (void)
>   
>     make_decl_rtl (fndecl);
>   
> -  init_function_start (fndecl);
> +  gcc_checking_assert (DECL_STRUCT_FUNCTION (fndecl) == NULL);
> +  allocate_struct_function (fndecl, false);
>   
>     pushlevel ();
>
Richard Biener Aug. 22, 2012, 1:29 p.m. UTC | #2
On Wed, Aug 22, 2012 at 3:03 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> init_function_start is these days supposed to be called only at the start of
> RTL expansion, it shouldn't be called much earlier, because then we leak
> e.g. the memory allocated by init_emit.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Looks ok, but please move the assert into allocate_struct_function instead.

Richard.

> 2012-08-22  Jakub Jelinek  <jakub@redhat.com>
>
>         * trans-decl.c (trans_function_start, generate_coarray_init,
>         create_main_function, gfc_generate_constructors): Call
>         allocate_struct_function instead of init_function_start.
>
> --- gcc/fortran/trans-decl.c.jj 2012-08-13 14:36:51.000000000 +0200
> +++ gcc/fortran/trans-decl.c    2012-08-22 12:18:29.963953958 +0200
> @@ -2265,7 +2265,8 @@ trans_function_start (gfc_symbol * sym)
>    /* Create RTL for function definition.  */
>    make_decl_rtl (fndecl);
>
> -  init_function_start (fndecl);
> +  gcc_checking_assert (DECL_STRUCT_FUNCTION (fndecl) == NULL);
> +  allocate_struct_function (fndecl, false);
>
>    /* function.c requires a push at the start of the function.  */
>    pushlevel ();
> @@ -4408,7 +4409,8 @@ generate_coarray_init (gfc_namespace * n
>
>    rest_of_decl_compilation (fndecl, 0, 0);
>    make_decl_rtl (fndecl);
> -  init_function_start (fndecl);
> +  gcc_checking_assert (DECL_STRUCT_FUNCTION (fndecl) == NULL);
> +  allocate_struct_function (fndecl, false);
>
>    pushlevel ();
>    gfc_init_block (&caf_init_block);
> @@ -4982,7 +4984,8 @@ create_main_function (tree fndecl)
>
>    rest_of_decl_compilation (ftn_main, 1, 0);
>    make_decl_rtl (ftn_main);
> -  init_function_start (ftn_main);
> +  gcc_checking_assert (DECL_STRUCT_FUNCTION (ftn_main) == NULL);
> +  allocate_struct_function (ftn_main, false);
>    pushlevel ();
>
>    gfc_init_block (&body);
> @@ -5537,7 +5540,8 @@ gfc_generate_constructors (void)
>
>    make_decl_rtl (fndecl);
>
> -  init_function_start (fndecl);
> +  gcc_checking_assert (DECL_STRUCT_FUNCTION (fndecl) == NULL);
> +  allocate_struct_function (fndecl, false);
>
>    pushlevel ();
>
>
>         Jakub
diff mbox

Patch

--- gcc/fortran/trans-decl.c.jj	2012-08-13 14:36:51.000000000 +0200
+++ gcc/fortran/trans-decl.c	2012-08-22 12:18:29.963953958 +0200
@@ -2265,7 +2265,8 @@  trans_function_start (gfc_symbol * sym)
   /* Create RTL for function definition.  */
   make_decl_rtl (fndecl);
 
-  init_function_start (fndecl);
+  gcc_checking_assert (DECL_STRUCT_FUNCTION (fndecl) == NULL);
+  allocate_struct_function (fndecl, false);
 
   /* function.c requires a push at the start of the function.  */
   pushlevel ();
@@ -4408,7 +4409,8 @@  generate_coarray_init (gfc_namespace * n
 
   rest_of_decl_compilation (fndecl, 0, 0);
   make_decl_rtl (fndecl);
-  init_function_start (fndecl);
+  gcc_checking_assert (DECL_STRUCT_FUNCTION (fndecl) == NULL);
+  allocate_struct_function (fndecl, false);
 
   pushlevel ();
   gfc_init_block (&caf_init_block);
@@ -4982,7 +4984,8 @@  create_main_function (tree fndecl)
 
   rest_of_decl_compilation (ftn_main, 1, 0);
   make_decl_rtl (ftn_main);
-  init_function_start (ftn_main);
+  gcc_checking_assert (DECL_STRUCT_FUNCTION (ftn_main) == NULL);
+  allocate_struct_function (ftn_main, false);
   pushlevel ();
 
   gfc_init_block (&body);
@@ -5537,7 +5540,8 @@  gfc_generate_constructors (void)
 
   make_decl_rtl (fndecl);
 
-  init_function_start (fndecl);
+  gcc_checking_assert (DECL_STRUCT_FUNCTION (fndecl) == NULL);
+  allocate_struct_function (fndecl, false);
 
   pushlevel ();