]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/59695 (bad code generation on aarch64 in aarch64_output_mi_thunk)
authorMatthew Gretton-Dann <matthew.gretton-dann@linaro.org>
Wed, 15 Jan 2014 10:27:55 +0000 (10:27 +0000)
committerChristophe Lyon <clyon@gcc.gnu.org>
Wed, 15 Jan 2014 10:27:55 +0000 (11:27 +0100)
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

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr59695.C [new file with mode: 0644]

index bbca4685a5021567ae0252199eeac72a4fc666a1..f993e480f7b9173781d57cd925086ee3daab2a07 100644 (file)
@@ -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
index 62c659a18b27c2e81089d5e973b3997cbbf50e1e..89f2b9bf50e51f1e1e901ce727605b9d535cde84 100644 (file)
@@ -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
index 43227493b7f93629c765d804d3676cebfd699754..eeff3e6cd926a19ab29a25467f3f73b8c0bb9fe8 100644 (file)
@@ -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 (file)
index 0000000..ac636d0
--- /dev/null
@@ -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;
+}
+