Question about array types in the front-end
FX
fxcoudert@gmail.com
Fri Feb 22 18:18:00 GMT 2008
Hi all,
I dare ping that question... I'm really stuck with this fndecl issue
and I think, even though it's probably not so huge a patch, it's
important for 4.4 and it's also important to commit it early (because
it's a quite intrusive change). So, if some of you have time to ponder
on the following... Many thanks in advance!
FX
On Sat, Feb 2, 2008 at 8:30 PM, FX Coudert <fxcoudert@gmail.com> wrote:
> Hi all,
>
> I'm working on a patch to fix the "multiple decls per function"
> issue. Current status is good, except for handling of array
> arguments, and I need a hand in understand how this is handled. This
> is not strictly related to my patch, but lies in the code generated
> by the front-end in its current state, although it is uncovered by
> the patch :( I'd be happy to get other maintainers' insight on this
> issue, because I'm not too used to array-handling at the tree level.
>
>
> My patch enables us to reuse already created function decls for a
> given function instead of creating a new one each time. If the
> function declaration comes first or if an explicit interface is used,
> we can create the function decl easily from the formal arglist. For
> implicit interfaces, I chose to recreate the list of argument types
> simply by looking at the types in the actual arglist (in its tree form).
>
> However, in the case where an array is used as argument, that doesn't
> give the same results. For an explicit interface of type
>
> subroutine test(x)
> integer x(1)
> end subroutine test
>
> the front-end generates for the type of the argument the following tree:
>
> <pointer_type 0x2aae4c1bc3c0
> type <array_type 0x2aae4c1bc000 type <real_type
> 0x2aae4c1383c0 real(kind=4)>
> type_2 SF
> size <integer_cst 0x2aae4c11ea50 constant invariant 32>
> unit size <integer_cst 0x2aae4c11e6c0 constant invariant 4>
> align 32 symtab 0 alias set -1 canonical type
> 0x2aae4c1bc000 domain <integer_type 0x2aae4c1bc300>
> pointer_to_this <pointer_type 0x2aae4c1bc3c0>>
> unsigned type_2 DI
> size <integer_cst 0x2aae4c11eb40 constant invariant 64>
> unit size <integer_cst 0x2aae4c11eb70 constant invariant 8>
> align 64 symtab 0 alias set -1 canonical type 0x2aae4c1bc3c0>
>
> which is, as far as I understand, correctly marked as an array (see
> the "type_2", which is TYPE_LANG_FLAG_2, aka GFC_ARRAY_TYPE_P. On the
> other hand, when the front-end generates code for the following call
> (with implicit interface):
>
> integer x(1)
> call test(x)
>
> it gives the following type to the x argument :
>
> <pointer_type 0x2b41eda80780
> type <array_type 0x2b41eda800c0 type <real_type
> 0x2b41ed9fc3c0 real(kind=4)>
> type_2 SF
> size <integer_cst 0x2b41ed9e2a50 constant invariant 32>
> unit size <integer_cst 0x2b41ed9e26c0 constant invariant 4>
> align 32 symtab 0 alias set -1 canonical type
> 0x2b41eda800c0 domain <integer_type 0x2b41eda803c0>
> pointer_to_this <pointer_type 0x2b41eda80780>>
> unsigned DI
> size <integer_cst 0x2b41ed9e2b40 constant invariant 64>
> unit size <integer_cst 0x2b41ed9e2b70 constant invariant 8>
> align 64 symtab 0 alias set -1 canonical type 0x2b41eda80780>
>
> It looks right, but it doesn't have the "type_2" flag, ie no
> GFC_ARRAY_TYPE_P. Later on, this issue will trigger various asserts
> in the front-end (starting with gfc_build_dummy_array_decl, at
> fortran/trans-decl.c:740). I believe these asserts are right, and the
> arguments should be marked with GFC_ARRAY_TYPE_P. Do others agree
> with this conclusion, and does anyone know where I can start looking
> for a place to add it?
>
> Thanks,
> FX
>
>
>
> PS: my current patch is attached, it regtests and works for valid
> code that doesn't involve arrays :)
> The testcase that reveals the issue I describe here is:
>
> > program test
> > real dist(1)
> > dist = 1.0
> > call f(dist)
> > end program test
> >
> > subroutine f(dist)
> > real dist(1)
> > if (dist(1) > 0) call abort
> > end
>
>
> If you put the subroutine before the main program, the function decl
> is generated from the formal arglist, and it works fine. If you keep
> it in the order given here, the function decl's args types (ie
> TYPE_ARG_TYPES (TREE_TYPE (fndecl)))
>
>
> PS2: this patch allows good inlining of non-contained procedures, as
> well as the -fwhole-program option. It should also allow better
> optimization in the middle-end (by having a valid call-graph).
>
>
--
FX Coudert
http://www.homepages.ucl.ac.uk/~uccafco/
More information about the Fortran
mailing list