Message ID | CAKdteOa+gDFC16zuc8zDCx2AX4TWtA-AyqNK_7ng4+abq8ddZA@mail.gmail.com |
---|---|
State | New |
Headers | show |
On 13 April 2017 at 09:55, Ramana Radhakrishnan <ramana.gcc@googlemail.com> wrote: > On Wed, Apr 12, 2017 at 6:55 PM, Christophe Lyon > <christophe.lyon@linaro.org> wrote: >> Hi, >> >> It looks like we forgot to backport the fix for PR68390 to gcc-5-branch. >> The patch applies cleanly, and fwiw we've had it in the linaro-5 >> branch for a while. >> >> OK to apply to gcc-5-branch? >> > > OK if there are no regressions (the fact that its been in the linaro-5 > branch gives me some confidence about the backport). > Finally committed after bootstrap + no regression test on gcc-5-branch. Thanks, Christophe > Ramana > >> Thanks, >> >> Christophe
Index: gcc/config/arm/arm.c =================================================================== --- gcc/config/arm/arm.c (revision 246880) +++ gcc/config/arm/arm.c (working copy) @@ -6507,8 +6507,13 @@ a VFP register but then need to transfer it to a core register. */ rtx a, b; + tree decl_or_type = decl; - a = arm_function_value (TREE_TYPE (exp), decl, false); + /* If it is an indirect function pointer, get the function type. */ + if (!decl) + decl_or_type = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (exp))); + + a = arm_function_value (TREE_TYPE (exp), decl_or_type, false); b = arm_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)), cfun->decl, false); if (!rtx_equal_p (a, b)) Index: gcc/testsuite/gcc.c-torture/execute/pr68390.c =================================================================== --- gcc/testsuite/gcc.c-torture/execute/pr68390.c (nonexistent) +++ gcc/testsuite/gcc.c-torture/execute/pr68390.c (working copy) @@ -0,0 +1,27 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +__attribute__ ((noinline)) +double direct(int x, ...) +{ + return x*x; +} + +__attribute__ ((noinline)) +double broken(double (*indirect)(int x, ...), int v) +{ + return indirect(v); +} + +int main () +{ + double d1, d2; + int i = 2; + d1 = broken (direct, i); + if (d1 != i*i) + { + __builtin_abort (); + } + return 0; +} +