This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Incorrect code due to indirect tail call of varargs function with hard float ABI
- From: Kugan <kugan dot vivekanandarajah at linaro dot org>
- To: Ramana Radhakrishnan <ramana dot radhakrishnan at foss dot arm dot com>, Charles Baylis <charles dot baylis at linaro dot org>, Kyrill Tkachov <kyrylo dot tkachov at arm dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, Richard Earnshaw <Richard dot Earnshaw at arm dot com>
- Date: Tue, 26 Jan 2016 08:54:33 +1100
- Subject: Re: Incorrect code due to indirect tail call of varargs function with hard float ABI
- Authentication-results: sourceware.org; auth=none
- References: <564A57BA dot 7050504 at linaro dot org> <CADnVucBHnigJL_kaG8rqUPeQLhF==_cm+tQCOMaAWH5UHWxpHQ at mail dot gmail dot com> <564A9327 dot 8070607 at linaro dot org> <564AFBEE dot 9050801 at foss dot arm dot com> <564B8655 dot 1060509 at linaro dot org> <564BC70C dot 70805 at linaro dot org> <564C42B7 dot 9040702 at foss dot arm dot com> <565E269A dot 1090102 at linaro dot org>
This issue also remains in 4.9 and 5.0 branches. Is this OK to backport
to the release branches.
Thanks,
Kugan
On 02/12/15 10:00, Kugan wrote:
>
>>>
>>> gcc/ChangeLog:
>>>
>>> 2015-11-18 Kugan Vivekanandarajah <kuganv@linaro.org>
>>>
>>> PR target/68390
>>> * config/arm/arm.c (arm_function_ok_for_sibcall): Get function type
>>> for indirect function call.
>>>
>>> gcc/testsuite/ChangeLog:
>>>
>>> 2015-11-18 Kugan Vivekanandarajah <kuganv@linaro.org>
>>>
>>> PR target/68390
>>> * gcc.target/arm/PR68390.c: New test.
>>>
>>
>> s/PR/pr in the test name and put this in gcc.c-torture/execute instead - there is nothing ARM specific about the test. Tests in gcc.target/arm should really only be architecture specific. This isn't.
>>
>>>
>>>
>>>
>>> p.txt
>>>
>>>
>>> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
>>> index a379121..0dae7da 100644
>>> --- a/gcc/config/arm/arm.c
>>> +++ b/gcc/config/arm/arm.c
>>> @@ -6680,8 +6680,13 @@ arm_function_ok_for_sibcall (tree decl, tree exp)
>>> a VFP register but then need to transfer it to a core
>>> register. */
>>> rtx a, b;
>>> + tree fn_decl = decl;
>>
>> Call it decl_or_type instead - it's really that ...
>>
>>>
>>> - a = arm_function_value (TREE_TYPE (exp), decl, false);
>>> + /* If it is an indirect function pointer, get the function type. */
>>> + if (!decl)
>>> + fn_decl = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (exp)));
>>> +
>>
>> This is probably just my mail client - but please watch out for indentation.
>>
>>> + a = arm_function_value (TREE_TYPE (exp), fn_decl, false);
>>> b = arm_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
>>> cfun->decl, false);
>>> if (!rtx_equal_p (a, b))
>>
>>
>> OK with those changes.
>>
>> Ramana
>>
>