diff options
author | Bin Cheng <amker@gcc.gnu.org> | 2012-09-04 09:36:44 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2012-09-04 09:36:44 +0000 |
commit | 12b48dc897e64ae199c0201d9602d93a5245af20 (patch) | |
tree | a11db9245a01d8f255e2cdd67164172922b93c7e | |
parent | a8886f7d1859cebce5db37598c4bae54cc51db1d (diff) | |
download | gcc-12b48dc897e64ae199c0201d9602d93a5245af20.zip gcc-12b48dc897e64ae199c0201d9602d93a5245af20.tar.gz gcc-12b48dc897e64ae199c0201d9602d93a5245af20.tar.bz2 |
re PR target/45070 (Miscompiled c++ class with packed attribute on ARM with -Os optimizations (Qt 4.6.2))
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: r190919
-rw-r--r-- | gcc/config/arm/arm.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index b49fa46..4001f35 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -21862,7 +21862,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; @@ -21901,7 +21901,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; } @@ -21955,8 +21956,7 @@ thumb1_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 |