[Patch, Fortran, committed] free gfc_code of EXEC_END_PROCEDURE

Tobias Burnus burnus@net-b.de
Wed Aug 22 07:47:00 GMT 2012


Dear Thomas, dear all,

On 08/22/2012 07:28 AM, Thomas Koenig wrote:
> Am 22.08.2012 00:26, schrieb Tobias Burnus:
>
>> I think we should join in an try to remove some leakage - and try to not
>> introduce new ones.
>
> What about using C++ constructors/destructors that allocate/deallocate
> the necessary memory?  This should simplify the code for memory
> allocation a lot.

I don't see how. GCC operates on lists - and the main problem is to keep 
track about them to free them when they aren't needed. Only when the 
scope is limited, it could help to free pointer components; still, one 
needs to be careful whether the same pointer is used elsewhere.

If you have time, maybe you are able to find out why the following 
program leaks memory:

!subroutine foo()
   call bar()
contains
   subroutine bar()
   end subroutine bar
end

It doesn't if one comments in the "subroutine  foo()" line. According to 
valgrind, the memory is allocated in parse_contained:
       gfc_current_ns = gfc_get_namespace (parent_ns, 1);
However, my impression is that the namespace for ST_END_PROGRAM is 
properly freed in that function ("gfc_free_namespace (ns);") and the 
rest (namespace for MAIN__ and its contained "bar" namespace) is 
properly freed via translate_all_program_units's call to gfc_done_2 
which calls gfc_symbol_done_2 and in turn gfc_free_namespace.


For completeness, the valgrind output is as follows:

==6949== 2,976 (2,432 direct, 544 indirect) bytes in 1 blocks are 
definitely lost in loss record 354 of 369
==6949==    at 0x4C292B8: calloc (in 
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==6949==    by 0xE6AA08: xcalloc (xmalloc.c:162)
==6949==    by 0x5EFC7E: gfc_get_namespace(gfc_namespace*, int) 
(symbol.c:2325)
==6949==    by 0x5C14AB: parse_contained(int) (parse.c:3995)
==6949==    by 0x5C143E: parse_progunit(gfc_statement) (parse.c:4190)
==6949==    by 0x5C1F4D: gfc_parse_file() (parse.c:4595)
==6949==    by 0x5FE215: gfc_be_parse_file() (f95-lang.c:191)
==6949==    by 0x97B15B: compile_file() (toplev.c:546)
==6949==    by 0x97CD19: toplev_main(int, char**) (toplev.c:1863)
==6949==    by 0x5F5D454: (below main) (libc-start.c:226)

Tobias



More information about the Fortran mailing list