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: r190970
This commit is contained in:
parent
e4fd4fd8ec
commit
fbe8f3336b
|
@ -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 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* alias.c (read_dependence): Return true for ALIAS_SET_MEMORY_BARRIER.
|
||||
|
|
|
@ -21778,7 +21778,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;
|
||||
|
@ -21817,7 +21817,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;
|
||||
}
|
||||
|
||||
|
@ -21871,8 +21872,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
|
||||
|
|
Loading…
Reference in New Issue