aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Hsieh <andrewhsieh@google.com>2014-04-24 00:02:18 -0700
committerAndrew Hsieh <andrewhsieh@google.com>2014-04-24 00:02:18 -0700
commit16712a032061c7f8e9647004a10f8af866e57719 (patch)
tree9fd2523c84051a12aabcfba6a9416ed6574ac626
parentff7dd022f8f3c026e2e06f734d12b2f186eb1e49 (diff)
downloadtoolchain_gcc-16712a032061c7f8e9647004a10f8af866e57719.tar.gz
toolchain_gcc-16712a032061c7f8e9647004a10f8af866e57719.tar.bz2
toolchain_gcc-16712a032061c7f8e9647004a10f8af866e57719.zip
[4.8] Backport fix on bad aarch64 codegen in multiple inheritance thunks
See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59695 http://gcc.gnu.org/viewcvs/gcc?view=revision&revision=206703 2014-01-17 Kugan Vivekanandarajah <kuganv@linaro.org> Backport from mainline 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. Change-Id: I94f2c9ad01ed489b4a167ce67a34365db37a8200
-rw-r--r--gcc-4.8/ChangeLog.backported11
-rw-r--r--gcc-4.8/gcc/config/aarch64/aarch64.c2
-rw-r--r--gcc-4.8/gcc/testsuite/g++.dg/pr59695.C125
3 files changed, 137 insertions, 1 deletions
diff --git a/gcc-4.8/ChangeLog.backported b/gcc-4.8/ChangeLog.backported
index 61834676f..f92f0f945 100644
--- a/gcc-4.8/ChangeLog.backported
+++ b/gcc-4.8/ChangeLog.backported
@@ -1,3 +1,14 @@
+http://gcc.gnu.org/viewcvs/gcc?view=revision&revision=206703
+2014-01-17 Kugan Vivekanandarajah <kuganv@linaro.org>
+
+ Backport from mainline
+ 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.
+
http://gcc.gnu.org/viewcvs/gcc?view=revision&revision=208519
2014-03-12 Roland McGrath <mcgrathr@google.com>
Mark Seaborn <mseaborn@google.com>
diff --git a/gcc-4.8/gcc/config/aarch64/aarch64.c b/gcc-4.8/gcc/config/aarch64/aarch64.c
index fa53c71df..4d5166618 100644
--- a/gcc-4.8/gcc/config/aarch64/aarch64.c
+++ b/gcc-4.8/gcc/config/aarch64/aarch64.c
@@ -2274,7 +2274,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-4.8/gcc/testsuite/g++.dg/pr59695.C b/gcc-4.8/gcc/testsuite/g++.dg/pr59695.C
new file mode 100644
index 000000000..ac636d06f
--- /dev/null
+++ b/gcc-4.8/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;
+}
+