aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMatthew Gretton-Dann <matthew.gretton-dann@linaro.org>2014-01-15 10:27:55 +0000
committerChristophe Lyon <clyon@gcc.gnu.org>2014-01-15 11:27:55 +0100
commitd103f29bc32f9bbbe14657b6258ae9c761fc9a28 (patch)
tree400644faadd03cf87e20fb2a806ae8ac3c9586f5 /gcc
parent1c8b53037c22de1a05643f3bb0851d4460c93a8a (diff)
downloadgcc-d103f29bc32f9bbbe14657b6258ae9c761fc9a28.zip
gcc-d103f29bc32f9bbbe14657b6258ae9c761fc9a28.tar.gz
gcc-d103f29bc32f9bbbe14657b6258ae9c761fc9a28.tar.bz2
re PR target/59695 (bad code generation on aarch64 in aarch64_output_mi_thunk)
2014-01-15 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org> Kugan Vivekanandarajah <kuganv@linaro.org> gcc/ PR target/59695 * config/aarch64/aarch64.c (aarch64_build_constant): Fix incorrect truncation. gcc/testsuite/ PR target/59695 * g++.dg/pr59695.C: New testcase. Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org> From-SVN: r206628
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/aarch64/aarch64.c2
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/pr59695.C125
4 files changed, 139 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bbca468..f993e48 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-01-15 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
+ Kugan Vivekanandarajah <kuganv@linaro.org>
+
+ PR target/59695
+ * config/aarch64/aarch64.c (aarch64_build_constant): Fix incorrect
+ truncation.
+
2014-01-15 Richard Biener <rguenther@suse.de>
PR rtl-optimization/59802
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 62c659a..89f2b9b 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -2488,7 +2488,7 @@ aarch64_build_constant (int regnum, HOST_WIDE_INT val)
if (ncount < zcount)
{
emit_move_insn (gen_rtx_REG (Pmode, regnum),
- GEN_INT ((~val) & 0xffff));
+ GEN_INT (val | ~(HOST_WIDE_INT) 0xffff));
tval = 0xffff;
}
else
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4322749..eeff3e6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-15 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
+ Kugan Vivekanandarajah <kuganv@linaro.org>
+
+ PR target/59695
+ * g++.dg/pr59695.C: New testcase.
+
2014-01-15 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
PR target/59803
diff --git a/gcc/testsuite/g++.dg/pr59695.C b/gcc/testsuite/g++.dg/pr59695.C
new file mode 100644
index 0000000..ac636d0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr59695.C
@@ -0,0 +1,125 @@
+
+/* PR target/59695 */
+/* { dg-do run } */
+/* { dg-options "-O0" } */
+
+#define DEFINE_VIRTUALS_FNS(i) virtual void xxx##i () {} \
+ virtual void foo1_##i () {}\
+ virtual void foo2_##i () {}\
+ virtual void foo3_##i () {}\
+ virtual void foo4_##i () {}\
+ virtual void foo5_##i () {}\
+ virtual void foo6_##i () {}\
+ virtual void foo7_##i () {}\
+ virtual void foo8_##i () {}\
+ virtual void foo9_##i () {}\
+ virtual void foo10_##i () {}\
+ virtual void foo11_##i () {}\
+ virtual void foo12_##i () {}\
+ virtual void foo13_##i () {}\
+ virtual void foo14_##i () {}\
+ virtual void foo15_##i () {}\
+ virtual void foo16_##i () {}\
+ virtual void foo17_##i () {}\
+ virtual void foo18_##i () {}\
+ virtual void foo19_##i () {}\
+ virtual void foo20_##i () {}\
+ virtual void foo21_##i () {}\
+ virtual void foo22_##i () {}\
+
+class base_class_2
+{
+
+public:
+ /* Define lots of virtual functions */
+ DEFINE_VIRTUALS_FNS (1)
+ DEFINE_VIRTUALS_FNS (2)
+ DEFINE_VIRTUALS_FNS (3)
+ DEFINE_VIRTUALS_FNS (4)
+ DEFINE_VIRTUALS_FNS (5)
+ DEFINE_VIRTUALS_FNS (6)
+ DEFINE_VIRTUALS_FNS (7)
+ DEFINE_VIRTUALS_FNS (8)
+ DEFINE_VIRTUALS_FNS (9)
+ DEFINE_VIRTUALS_FNS (10)
+ DEFINE_VIRTUALS_FNS (11)
+ DEFINE_VIRTUALS_FNS (12)
+ DEFINE_VIRTUALS_FNS (13)
+ DEFINE_VIRTUALS_FNS (14)
+ DEFINE_VIRTUALS_FNS (15)
+ DEFINE_VIRTUALS_FNS (16)
+ DEFINE_VIRTUALS_FNS (17)
+ DEFINE_VIRTUALS_FNS (18)
+ DEFINE_VIRTUALS_FNS (19)
+ DEFINE_VIRTUALS_FNS (20)
+
+ base_class_2();
+ virtual ~base_class_2 ();
+};
+
+base_class_2::base_class_2()
+{
+}
+
+base_class_2::~base_class_2 ()
+{
+}
+
+class base_class_1
+{
+public:
+ virtual ~base_class_1();
+ base_class_1();
+};
+
+base_class_1::base_class_1()
+{
+}
+
+base_class_1::~base_class_1()
+{
+}
+
+class base_Impl_class :
+ virtual public base_class_2, public base_class_1
+{
+public:
+ base_Impl_class ();
+ virtual ~base_Impl_class ();
+};
+
+base_Impl_class::base_Impl_class ()
+{
+}
+
+base_Impl_class::~base_Impl_class ()
+{
+}
+
+
+class test_cls : public base_Impl_class
+{
+public:
+ test_cls();
+ virtual ~test_cls();
+};
+
+test_cls::test_cls()
+{
+}
+
+test_cls::~test_cls()
+{
+}
+
+int main()
+{
+ test_cls *test = new test_cls;
+ base_class_2 *p1 = test;
+
+ /* PR59695 destructor thunk offsets are not setup
+ correctly resulting in crash. */
+ delete p1;
+ return 0;
+}
+