]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gcc/ChangeLog:
authorkugan <kugan@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 22 Nov 2015 23:07:58 +0000 (23:07 +0000)
committerkugan <kugan@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 22 Nov 2015 23:07:58 +0000 (23:07 +0000)
2015-11-23  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-23  Kugan Vivekanandarajah  <kuganv@linaro.org>

PR target/68390
* gcc/testsuite/gcc.c-torture/execute/pr68390.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230730 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr68390.c [new file with mode: 0644]

index 51e07072e8736ce2abb706478239290d725a67cb..c584fd9780debea6c9ecef014c4fa0a25166540e 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-23  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       PR target/68390
+       * config/arm/arm.c (arm_function_ok_for_sibcall): Get function type
+       for indirect function call.
+
 2015-11-22  Bilyan Borisov  <bilyan.borisov@arm.com>
 
        * config/aarch64/aarch64-simd.md
index 290b537ae166b5d48fdf28e461c9dafb8be3ef9d..e0cdc209734520037e99412a46ac6470ebb13b07 100644 (file)
@@ -6686,8 +6686,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))
index 7163326521621c495f5430fa02c5c724dfab94fb..3074642b247582102af1468359a51d154f1943f3 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-23  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       PR target/68390
+       * gcc/testsuite/gcc.c-torture/execute/pr68390.c: New test.
+
 2015-11-22  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        * gfortran.dg/fmt_g0_1.f08: Update test. Leading zero.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr68390.c b/gcc/testsuite/gcc.c-torture/execute/pr68390.c
new file mode 100644 (file)
index 0000000..86f07fe
--- /dev/null
@@ -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;
+}
+