This is the mail archive of the
mailing list for the GCC project.
Re: [Patch, Fortran] PR56907 - do not 'pack' arrays passed to C_LOC
- From: Tobias Burnus <burnus at net-b dot de>
- To: Janus Weil <janus at gcc dot gnu dot org>
- Cc: gcc patches <gcc-patches at gcc dot gnu dot org>, gfortran <fortran at gcc dot gnu dot org>
- Date: Fri, 19 Apr 2013 23:15:56 +0200
- Subject: Re: [Patch, Fortran] PR56907 - do not 'pack' arrays passed to C_LOC
- References: <5165C8D0 dot 7020606 at net-b dot de> <CAKwh3qh=i0H4C7=3wavUvfkzA_FeUCaxiOctJ9n4821P_gLu1Q at mail dot gmail dot com>
What I don't quite understand is:
@@ -6317,8 +6317,13 @@ conv_isocbinding_function (gfc_se *se, gfc_expr *expr)
if (arg->expr->rank == 0)
gfc_conv_expr_reference (se, arg->expr);
+ else if (gfc_is_simply_contiguous (arg->expr, false))
gfc_conv_array_parameter (se, arg->expr, true, NULL, NULL, NULL);
+ gfc_conv_expr_descriptor (se, arg->expr);
+ se->expr = gfc_conv_descriptor_data_get (se->expr);
Why doesn't 'gfc_conv_array_parameter' handle this situation properly?
Well, it does: As it doesn't know whether the array is contiguous or not
- it packs the array. That's what one usually wants.
However, for C_LOC one knows that the array is contiguous - the user
promises this to the compiler - and, hence, no packing is needed.
After all there is code like this inside:
no_pack = (...)
gfc_is_simply_contiguous (expr, false));
Wouldn't it be better to fix the logic in there, instead of avoiding
to call it alltogether? This might also help in other situations ...
I don't know of any other situation where the *user* guarantees that the
argument is contiguous while the compiler cannot check this. And even if
the user lied to the compiler - doing no packing gives at least the
address of the first element instead of the address of an immediately
feed temporary array.
(Actually, there are other places in the compiler, where the user
guarantees this: Pointer assignment to a "contiguous" pointer; there,
the user promises that the target is contiguous. Maybe there are other
spots as well. On the other hand, if the dummy argument has the
CONTIGUOUS attribute, an automatic copy-in/out is required if it is not