From: Bin Cheng Date: Wed, 5 Sep 2012 10:54:08 +0000 (+0000) Subject: backport: re PR target/45070 (Miscompiled c++ class with packed attribute on ARM... X-Git-Tag: releases/gcc-4.6.4~383 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e42ca11da872abfaaa49a101b47b0b15fddc91e2;p=thirdparty%2Fgcc.git backport: re PR target/45070 (Miscompiled c++ class with packed attribute on ARM with -Os optimizations (Qt 4.6.2)) 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a4edd5c6b4a6..e8bb95d33122 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-09-05 Bin Cheng + + 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 Backport from 2012-09-04 mainline r190914 diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index f189511f734e..c3c5aa168aff 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -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