Time for PR 35150 (Bind(C)'s C_LOC; 4.3 regression)?
Jerry DeLisle
jvdelisle@verizon.net
Thu Feb 14 16:28:00 GMT 2008
Jerry DeLisle wrote:
> Jerry DeLisle wrote:
>> Jerry DeLisle wrote:
>>> FX Coudert wrote:
>>>> Hi all,
>>>>
>>>> I'm answer publicly a mail by Tobias asking me if I could look into
>>>> the ISO_C_BINDING PR35150, because I have a solution but won't be in
>>>> position to test it fully or make a proper submission.
>>>>
>>>> To quote Tobias, "PR is a regression versus GCC 4.3.0 2007-07-16,
>>>> where using C_LOC(variable_with_SAVE) as actual argument worked".
>>>> This is rather annoying as it is not really a corner case, and we
>>>> want the first release with ISO_C_BINDING to be all shiny! I'll post
>>>> a more complete analysis in the PR soon, but I don't understand
>>>> where exactly we are failing to emit complete valid code. What I do
>>>> understand is that the result of C_LOC is stored into a variable,
>>>> which is "static void * *" instead of being "void *" (or "void *",
>>>> that doesn't matter), as was the case before. I don't know where is
>>>> the code that actually creates that variable, nor why it wants to
>>>> make it that way.
>>>>
>>>> Even though, I have found a workaround, which although not perfect
>>>> makes everything pass and is only a tiny missed-optimization (ie we
>>>> create one useless variable declaration, which the middle-end will
>>>> remove). It suffices to call gfc_evaluate_variable() to force the
>>>> creation of the variable right away. The patch is as follows:
>>>>
>>>>> Index: trans-expr.c
>>>>> ===================================================================
>>>>> --- trans-expr.c (revision 132257)
>>>>> +++ trans-expr.c (working copy)
>>>>> @@ -2246,7 +2246,16 @@
>>>>> if (sym->intmod_sym_id == ISOCBINDING_LOC)
>>>>> {
>>>>> if (arg->expr->rank == 0)
>>>>> - gfc_conv_expr_reference (se, arg->expr);
>>>>> + {
>>>>> + gfc_conv_expr_reference (se, arg->expr);
>>>>> +
>>>>> + /* TODO -- the following two lines shouldn't be
>>>>> necessary, but
>>>>> + they're removed a bug is exposed later in the
>>>>> codepath.
>>>>> + This is workaround was thus introduced, but will
>>>>> have to be
>>>>> + removed; please see PR 35150 for details about the
>>>>> issue. */
>>>>> + se->expr = convert (pvoid_type_node, se->expr);
>>>>> + se->expr = gfc_evaluate_now (se->expr, &se->pre);
>>>>> + }
>>>>> else
>>>>> {
>>>>> int f;
>>>>
>>>>
>>>> As I debugged and wrote this mail in the Eurostar, I'm short on
>>>> battery and couldn't bootstrap or regtest fully. The patch builds
>>>> (--disable-bootstrap) and introduces no new failure in the
>>>> gfortran.dg/*iso*, gfortran.dg/c_*, gfortran.dg/bind* and
>>>> gfortran.dg/interface* tests (on i386-darwin). I'll be on the run
>>>> for the next few days, so if someone can help by bootstrapping it
>>>> and regtesting it. If you even want to submit, review or commit,
>>>> please feel free.
>>>
>>> I had to manually apply the patch. This is probably because I have
>>> other patches pending in this file.
>>>
>>> I am regression testing, but will not know results until this evening
>>> (+12 hours from now). If it passes, I will commit for you with
>>> Tobias approval.
>>>
>>> Tobias, if you beat me too it, please go ahead.
>>>
>>> Jerry
>>>
>> I get failures with the patch:
>>
>> FAIL: gfortran.dg/data_bounds_1.f90 -O (test for errors, line 10)
>> FAIL: gfortran.dg/data_bounds_1.f90 -O (test for errors, line 11)
>> FAIL: gfortran.dg/data_bounds_1.f90 -O (test for errors, line 14)
>> FAIL: gfortran.dg/data_bounds_1.f90 -O (test for errors, line 15)
>> FAIL: gfortran.dg/volatile11.f90 -O scan-tree-dump optimized
>> "NotOptimizedAway1"
>> FAIL: gfortran.dg/volatile11.f90 -O scan-tree-dump optimized
>> "NotOptimizedAway2"
>> FAIL: gfortran.dg/where_operator_assign_4.f90 -O (test for errors,
>> line 25)
>> FAIL: gfortran.dg/where_operator_assign_4.f90 -O (test for errors,
>> line 28)
>> FAIL: gfortran.dg/where_operator_assign_4.f90 -O (test for excess
>> errors)
>
> The above failures were due to some missing unrelated patches in my
> local tree. My apologies. Restarted regression testing.
>
Passed all regression tests on x86-64-linux-gnu.
Jerry
More information about the Fortran
mailing list