]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/45070 (Miscompiled c++ class with packed attribute on ARM...
authorBin Cheng <bin.cheng@arm.com>
Wed, 5 Sep 2012 10:54:08 +0000 (10:54 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Wed, 5 Sep 2012 10:54:08 +0000 (10:54 +0000)
Backport from 2012-09-04 mainline r190919

PR target/45070
* config/arm/arm.c (thumb1_extra_regs_pushed): Handle return value of
size less than 4 bytes by using macro ARM_NUM_INTS.
(thumb1_unexpanded_epilogue): Use macro ARM_NUM_INTS.

From-SVN: r190971

gcc/ChangeLog
gcc/config/arm/arm.c

index a4edd5c6b4a6a2b6a0975b706dc3caf87a0bbf16..e8bb95d33122c80a48b7122acbe36dd6e8664c10 100644 (file)
@@ -1,3 +1,12 @@
+2012-09-05  Bin Cheng  <bin.cheng@arm.com>
+
+       Backport from 2012-09-04 mainline r190919
+
+       PR target/45070
+       * config/arm/arm.c (thumb1_extra_regs_pushed): Handle return value of
+       size less than 4 bytes by using macro ARM_NUM_INTS.
+       (thumb1_unexpanded_epilogue): Use macro ARM_NUM_INTS.
+
 2012-09-04  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        Backport from 2012-09-04 mainline r190914
index f189511f734ef8e1a781b78485fabf05fcd3f2f5..c3c5aa168aff0cfd20038c487469f8c6402dcc14 100644 (file)
@@ -20444,7 +20444,7 @@ thumb1_extra_regs_pushed (arm_stack_offsets *offsets, bool for_prologue)
   unsigned long l_mask = live_regs_mask & (for_prologue ? 0x40ff : 0xff);
   /* Then count how many other high registers will need to be pushed.  */
   unsigned long high_regs_pushed = bit_count (live_regs_mask & 0x0f00);
-  int n_free, reg_base;
+  int n_free, reg_base, size;
 
   if (!for_prologue && frame_pointer_needed)
     amount = offsets->locals_base - offsets->saved_regs;
@@ -20483,7 +20483,8 @@ thumb1_extra_regs_pushed (arm_stack_offsets *offsets, bool for_prologue)
   n_free = 0;
   if (!for_prologue)
     {
-      reg_base = arm_size_return_regs () / UNITS_PER_WORD;
+      size = arm_size_return_regs ();
+      reg_base = ARM_NUM_INTS (size);
       live_regs_mask >>= reg_base;
     }
 
@@ -20537,8 +20538,7 @@ thumb_unexpanded_epilogue (void)
   if (extra_pop > 0)
     {
       unsigned long extra_mask = (1 << extra_pop) - 1;
-      live_regs_mask |= extra_mask << ((size + UNITS_PER_WORD - 1) 
-                                      / UNITS_PER_WORD);
+      live_regs_mask |= extra_mask << ARM_NUM_INTS (size);
     }
 
   /* The prolog may have pushed some high registers to use as