aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-12-22 00:10:45 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-12-22 00:10:45 +0100
commit604aac48157176b932b5a8772db4d4919199c300 (patch)
treeb5d4bdc392365b4e9bd0c05520f364bc8a855a9f /gcc
parent36367d1f19e2a61bd05b292df8f27aab4c03ba72 (diff)
downloadgcc-604aac48157176b932b5a8772db4d4919199c300.zip
gcc-604aac48157176b932b5a8772db4d4919199c300.tar.gz
gcc-604aac48157176b932b5a8772db4d4919199c300.tar.bz2
re PR middle-end/83487 (ICE in expand_call, at calls.c:4098)
PR middle-end/83487 * config/i386/i386.c (ix86_function_arg_boundary): Return PARM_BOUNDARY for TYPE_EMPTY_P types. * gcc.c-torture/compile/pr83487.c: New test. * gcc.dg/compat/pr83487-1.h: New file. * gcc.dg/compat/pr83487-1_main.c: New test. * gcc.dg/compat/pr83487-1_x.c: New file. * gcc.dg/compat/pr83487-1_y.c: New file. * gcc.dg/compat/pr83487-2_main.c: New test. * gcc.dg/compat/pr83487-2_x.c: New file. * gcc.dg/compat/pr83487-2_y.c: New file. * g++.dg/abi/pr83487.C: New test. * g++.dg/compat/abi/pr83487-1_main.C: New test. * g++.dg/compat/abi/pr83487-1_x.C: New file. * g++.dg/compat/abi/pr83487-1_y.C: New file. * g++.dg/compat/abi/pr83487-2_main.C: New test. * g++.dg/compat/abi/pr83487-2_x.C: New file. * g++.dg/compat/abi/pr83487-2_y.C: New file. From-SVN: r255961
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/i386/i386.c2
-rw-r--r--gcc/testsuite/ChangeLog17
-rw-r--r--gcc/testsuite/g++.dg/abi/pr83487.C13
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/pr83487-1_main.C8
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/pr83487-1_x.C1
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/pr83487-1_y.C1
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/pr83487-2_main.C8
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/pr83487-2_x.C1
-rw-r--r--gcc/testsuite/g++.dg/compat/abi/pr83487-2_y.C1
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr83487.c11
-rw-r--r--gcc/testsuite/gcc.dg/compat/pr83487-1.h9
-rw-r--r--gcc/testsuite/gcc.dg/compat/pr83487-1_main.c8
-rw-r--r--gcc/testsuite/gcc.dg/compat/pr83487-1_x.c63
-rw-r--r--gcc/testsuite/gcc.dg/compat/pr83487-1_y.c27
-rw-r--r--gcc/testsuite/gcc.dg/compat/pr83487-2_main.c1
-rw-r--r--gcc/testsuite/gcc.dg/compat/pr83487-2_x.c2
-rw-r--r--gcc/testsuite/gcc.dg/compat/pr83487-2_y.c2
18 files changed, 179 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 082223d..585a70b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2017-12-21 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/83487
+ * config/i386/i386.c (ix86_function_arg_boundary): Return
+ PARM_BOUNDARY for TYPE_EMPTY_P types.
+
PR c/83448
* gimple-ssa-sprintf.c (maybe_warn): Don't call set_caret_index
if navail is >= dir.len.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index beeabff..8d02eb2 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -8973,6 +8973,8 @@ ix86_function_arg_boundary (machine_mode mode, const_tree type)
the main variant type. */
type = TYPE_MAIN_VARIANT (type);
align = TYPE_ALIGN (type);
+ if (TYPE_EMPTY_P (type))
+ return PARM_BOUNDARY;
}
else
align = GET_MODE_ALIGNMENT (mode);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2f5fd08..df630ad 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,22 @@
2017-12-21 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/83487
+ * gcc.c-torture/compile/pr83487.c: New test.
+ * gcc.dg/compat/pr83487-1.h: New file.
+ * gcc.dg/compat/pr83487-1_main.c: New test.
+ * gcc.dg/compat/pr83487-1_x.c: New file.
+ * gcc.dg/compat/pr83487-1_y.c: New file.
+ * gcc.dg/compat/pr83487-2_main.c: New test.
+ * gcc.dg/compat/pr83487-2_x.c: New file.
+ * gcc.dg/compat/pr83487-2_y.c: New file.
+ * g++.dg/abi/pr83487.C: New test.
+ * g++.dg/compat/abi/pr83487-1_main.C: New test.
+ * g++.dg/compat/abi/pr83487-1_x.C: New file.
+ * g++.dg/compat/abi/pr83487-1_y.C: New file.
+ * g++.dg/compat/abi/pr83487-2_main.C: New test.
+ * g++.dg/compat/abi/pr83487-2_x.C: New file.
+ * g++.dg/compat/abi/pr83487-2_y.C: New file.
+
PR c/83448
* gcc.c-torture/compile/pr83448.c: New test.
* gcc.dg/tree-ssa/builtin-snprintf-warn-4.c: New test.
diff --git a/gcc/testsuite/g++.dg/abi/pr83487.C b/gcc/testsuite/g++.dg/abi/pr83487.C
new file mode 100644
index 0000000..b1ef1bf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/pr83487.C
@@ -0,0 +1,13 @@
+/* PR middle-end/83487 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct __attribute__ ((__aligned__)) A {};
+struct A a;
+void bar (int, int, int, int, int, int, int, struct A);
+
+void
+foo ()
+{
+ bar (0, 1, 2, 3, 4, 5, 6, a);
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-1_main.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-1_main.C
new file mode 100644
index 0000000..cd7cd94
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/pr83487-1_main.C
@@ -0,0 +1,8 @@
+extern void do_test (void);
+
+int
+main ()
+{
+ do_test ();
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-1_x.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-1_x.C
new file mode 100644
index 0000000..f214647
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/pr83487-1_x.C
@@ -0,0 +1 @@
+#include "../../../gcc.dg/compat/pr83487-1_x.c"
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-1_y.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-1_y.C
new file mode 100644
index 0000000..fc51498
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/pr83487-1_y.C
@@ -0,0 +1 @@
+#include "../../../gcc.dg/compat/pr83487-1_y.c"
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-2_main.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-2_main.C
new file mode 100644
index 0000000..cd7cd94
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/pr83487-2_main.C
@@ -0,0 +1,8 @@
+extern void do_test (void);
+
+int
+main ()
+{
+ do_test ();
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-2_x.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-2_x.C
new file mode 100644
index 0000000..c24fd60
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/pr83487-2_x.C
@@ -0,0 +1 @@
+#include "../../../gcc.dg/compat/pr83487-2_x.c"
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr83487-2_y.C b/gcc/testsuite/g++.dg/compat/abi/pr83487-2_y.C
new file mode 100644
index 0000000..e5253d2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/compat/abi/pr83487-2_y.C
@@ -0,0 +1 @@
+#include "../../../gcc.dg/compat/pr83487-2_y.c"
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr83487.c b/gcc/testsuite/gcc.c-torture/compile/pr83487.c
new file mode 100644
index 0000000..9effb1e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr83487.c
@@ -0,0 +1,11 @@
+/* PR middle-end/83487 */
+
+struct __attribute__ ((aligned)) A {};
+struct A a;
+void bar (int, int, int, int, int, int, int, struct A);
+
+void
+foo (void)
+{
+ bar (0, 1, 2, 3, 4, 5, 6, a);
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-1.h b/gcc/testsuite/gcc.dg/compat/pr83487-1.h
new file mode 100644
index 0000000..f39d5fd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compat/pr83487-1.h
@@ -0,0 +1,9 @@
+#ifdef PR83487_LARGE
+struct __attribute__ ((aligned (128))) A {};
+struct B {};
+struct C { struct B c[128]; };
+#else
+struct __attribute__ ((aligned (16))) A {};
+struct B {};
+struct C { struct B c[16]; };
+#endif
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-1_main.c b/gcc/testsuite/gcc.dg/compat/pr83487-1_main.c
new file mode 100644
index 0000000..cd7cd94
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compat/pr83487-1_main.c
@@ -0,0 +1,8 @@
+extern void do_test (void);
+
+int
+main ()
+{
+ do_test ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-1_x.c b/gcc/testsuite/gcc.dg/compat/pr83487-1_x.c
new file mode 100644
index 0000000..043a4c4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compat/pr83487-1_x.c
@@ -0,0 +1,63 @@
+#include "pr83487-1.h"
+
+extern
+#ifdef __cplusplus
+"C"
+#endif
+void abort ();
+
+void
+f1 (int i, int j, int k, int l, int m, int n, int o, struct A x)
+{
+ if (i != 6 || j != 0 || k != 1 || l != 2 || m != 3 || n != 4 || o != 5)
+ abort ();
+}
+
+void
+f2 (int i, int j, int k, int l, int m, int n, int o, struct A x, int p, int q)
+{
+ if (i != 6 || j != 0 || k != 1 || l != 2 || m != 3 || n != 4 || o != 5 || p != 7 || q != 8)
+ abort ();
+}
+
+void
+f3 (int i, int j, int k, int l, int m, int n, int o, struct B x, int p, int q)
+{
+ if (i != 6 || j != 0 || k != 1 || l != 2 || m != 3 || n != 4 || o != 5 || p != 7 || q != 8)
+ abort ();
+}
+
+void
+f4 (int i, int j, int k, int l, int m, int n, int o, struct C x, int p, int q)
+{
+ if (i != 6 || j != 0 || k != 1 || l != 2 || m != 3 || n != 4 || o != 5 || p != 7 || q != 8)
+ abort ();
+}
+
+void
+f5 (int o, struct A x)
+{
+ if (o != 5)
+ abort ();
+}
+
+void
+f6 (int o, struct A x, int p, int q)
+{
+ if (o != 5 || p != 7 || q != 8)
+ abort ();
+}
+
+void
+f7 (int o, struct B x, int p, int q)
+{
+ if (o != 5 || p != 7 || q != 8)
+ abort ();
+}
+
+void
+f8 (int o, struct C x, int p, int q)
+{
+ if (o != 5 || p != 7 || q != 8)
+ abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-1_y.c b/gcc/testsuite/gcc.dg/compat/pr83487-1_y.c
new file mode 100644
index 0000000..ef927bb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compat/pr83487-1_y.c
@@ -0,0 +1,27 @@
+#include "pr83487-1.h"
+
+struct A a;
+struct B b;
+struct C c;
+
+extern void f1 (int i, int j, int k, int l, int m, int n, int o, struct A);
+extern void f2 (int i, int j, int k, int l, int m, int n, int o, struct A, int p, int q);
+extern void f3 (int i, int j, int k, int l, int m, int n, int o, struct B, int p, int q);
+extern void f4 (int i, int j, int k, int l, int m, int n, int o, struct C, int p, int q);
+extern void f5 (int o, struct A);
+extern void f6 (int o, struct A, int p, int q);
+extern void f7 (int o, struct B, int p, int q);
+extern void f8 (int o, struct C, int p, int q);
+
+void
+do_test ()
+{
+ f1 (6, 0, 1, 2, 3, 4, 5, a);
+ f2 (6, 0, 1, 2, 3, 4, 5, a, 7, 8);
+ f3 (6, 0, 1, 2, 3, 4, 5, b, 7, 8);
+ f4 (6, 0, 1, 2, 3, 4, 5, c, 7, 8);
+ f5 (5, a);
+ f6 (5, a, 7, 8);
+ f7 (5, b, 7, 8);
+ f8 (5, c, 7, 8);
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-2_main.c b/gcc/testsuite/gcc.dg/compat/pr83487-2_main.c
new file mode 100644
index 0000000..276ae3b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compat/pr83487-2_main.c
@@ -0,0 +1 @@
+#include "pr83487-1_main.c"
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-2_x.c b/gcc/testsuite/gcc.dg/compat/pr83487-2_x.c
new file mode 100644
index 0000000..494abd7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compat/pr83487-2_x.c
@@ -0,0 +1,2 @@
+#define PR83487_LARGE
+#include "pr83487-1_x.c"
diff --git a/gcc/testsuite/gcc.dg/compat/pr83487-2_y.c b/gcc/testsuite/gcc.dg/compat/pr83487-2_y.c
new file mode 100644
index 0000000..e5a67d5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/compat/pr83487-2_y.c
@@ -0,0 +1,2 @@
+#define PR83487_LARGE
+#include "pr83487-1_y.c"