From: Christophe Lyon Date: Fri, 21 Apr 2017 09:23:59 +0000 (+0000) Subject: [ARM] PR68390 Incorrect code due to indirect tail call of varargs function with hard... X-Git-Tag: releases/gcc-5.5.0~397 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0629aac5a22d029d6fc7b8149fae37a33f381a60;p=thirdparty%2Fgcc.git [ARM] PR68390 Incorrect code due to indirect tail call of varargs function with hard float ABI 2017-04-21 Christophe Lyon Backport from mainline +2015-11-23 Kugan Vivekanandarajah PR target/68390 gcc/ * config/arm/arm.c (arm_function_ok_for_sibcall): Get function type for indirect function call. gcc/testsuite/ * gcc.c-torture/execute/pr68390.c: New test. From-SVN: r247057 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d05b488db21e..b592996003ce 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-04-21 Christophe Lyon + + Backport from mainline + +2015-11-23 Kugan Vivekanandarajah + + PR target/68390 + * config/arm/arm.c (arm_function_ok_for_sibcall): Get function type + for indirect function call. + 2017-04-12 Bill Schmidt Backport from mainline diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index c8aab8e09f83..67bab17a9d77 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -6507,8 +6507,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 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)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1493a615d01b..df0134eb983e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2017-04-21 Christophe Lyon + + Backport from mainline + 2015-11-23 Kugan Vivekanandarajah + + PR target/68390 + * gcc.c-torture/execute/pr68390.c: New test. + 2017-04-14 Dominique d'Humieres Backport from trunk diff --git a/gcc/testsuite/gcc.c-torture/execute/pr68390.c b/gcc/testsuite/gcc.c-torture/execute/pr68390.c new file mode 100644 index 000000000000..86f07fefd4fa --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr68390.c @@ -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; +} +