diff options
author | Andrew Hsieh <andrewhsieh@google.com> | 2014-04-24 00:02:18 -0700 |
---|---|---|
committer | Andrew Hsieh <andrewhsieh@google.com> | 2014-04-24 00:02:18 -0700 |
commit | 16712a032061c7f8e9647004a10f8af866e57719 (patch) | |
tree | 9fd2523c84051a12aabcfba6a9416ed6574ac626 /gcc-4.8 | |
parent | ff7dd022f8f3c026e2e06f734d12b2f186eb1e49 (diff) | |
download | toolchain_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
Diffstat (limited to 'gcc-4.8')
-rw-r--r-- | gcc-4.8/ChangeLog.backported | 11 | ||||
-rw-r--r-- | gcc-4.8/gcc/config/aarch64/aarch64.c | 2 | ||||
-rw-r--r-- | gcc-4.8/gcc/testsuite/g++.dg/pr59695.C | 125 |
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; +} + |