[Patch, Fortran, OOP] PR 45290/45271: pointer initialization / vtab init

Tobias Burnus burnus@net-b.de
Fri Aug 20 10:25:00 GMT 2010


  On 08/20/2010 11:49 AM, Janus Weil wrote:
> this patch fixes PR 45271 by giving static initializers to the PPC
> components of the vtabs. This is made possible by the recent progress
> on pointer initialization (PR 45290). A prerequisite for vtab
> initialization was fixing comment #6 of that PR, which is accomplished
> simply by removing an 'gcc_assert' in 'build_function_decl'.

I like the patch - the only thing I do not quite understand is the 
removal of the
- gcc_assert (!sym->backend_decl);
assert in build_function_decl.

How does the sym->backend_decl get set? More specifically, I worry about 
generating two declarations for the same procedure as on has later in 
build_function_decl:
   sym->backend_decl = fndecl;

Having two declarations for the same procedures not only wastes memory 
but it causes severe problems as the middle end does not expect this. 
Using -fwhole-file (now default) with -fwhole-program and high 
optimization settings (-O3) causes a lot of wrong optimizations if there 
are two declarations. We had a hard time to fix most of them when 
enabling -fwhole-file by default - thus I do not want to introduce new 
problems.

Currently, one has two methods of getting the backend_decl for a procedure:
a) Via gfc_create_function_decl
b) Via gfc_get_extern_function_decl

If in the same file a procedure exists both as external function and is 
defined then a lot of effort is made that both have the share 
backend_decl. Thus, I fear that part of the patch is not correct.

The rest is fine though I would use true and false rather than 0 and 1 
in the calls to gfc_conv_initializer as this is more readable and the 
parameter is defined as "bool".

Tobias


> 2010-08-20  Janus Weil<janus@gcc.gnu.org>
>
> 	PR fortran/45271
> 	PR fortran/45290
> 	* class.c (add_proc_comp): Add static initializer for PPCs.
> 	(add_procs_to_declared_vtab): Modified comment.
> 	* module.c (mio_component): Add argument 'vtype'. Don't read/write the
> 	initializer if the component is part of a vtype.
> 	(mio_component_list): Add argument 'vtype', pass it on to
> 	'mio_component'.
> 	(mio_symbol): Modified call to 'mio_component_list'.
> 	* trans.h (gfc_conv_initializer): Modified prototype.
> 	(gfc_trans_assign_vtab_procs): Removed.
> 	* trans-common.c (create_common): Modified call to
> 	'gfc_conv_initializer'.
> 	* trans-decl.c (gfc_get_symbol_decl,get_proc_pointer_decl,
> 	gfc_emit_parameter_debug_info): Modified call to
> 	'gfc_conv_initializer'.
> 	(build_function_decl): Remove assertion.
> 	* trans-expr.c (gfc_conv_derived_to_class,gfc_trans_class_assign):
> 	Removed call to 'gfc_trans_assign_vtab_procs'.
> 	(gfc_conv_initializer): Add argument 'procptr'.
> 	(gfc_conv_structure): Modified call to 'gfc_conv_initializer'.
> 	(gfc_trans_assign_vtab_procs): Removed.
> 	* trans-stmt.c (gfc_trans_allocate): Removed call to
> 	'gfc_trans_assign_vtab_procs'.
>
>
> 2010-08-20  Janus Weil<janus@gcc.gnu.org>
>
> 	PR fortran/45271
> 	PR fortran/45290
> 	* gfortran.dg/pointer_init_5.f90: New.
> 	* gfortran.dg/typebound_call_18.f03: New.



More information about the Fortran mailing list