------- Comment #7 from armcc2000 at yahoo dot com 2005-11-09 23:32 -------
(In reply to comment #4)
>
> I think this is a dup of bug 23150 which was fixed in 4.1.0.
>
Something has certainly changed in 4.1 - the stack corruption is gone.
With -Os, the good() and bad() testcases compile to:
------------------------------------------------------------
bad:
@ args = 8, pretend = 4, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
sub sp, sp, #4
str lr, [sp, #-4]!
mov ip, #0
sub sp, sp, #8
str r3, [sp, #12]
mov r0, ip
mov r1, ip
mov r2, ip
mov r3, ip
str ip, [sp, #0]
str ip, [sp, #4]
bl foo
add sp, sp, #8
ldr lr, [sp], #4
add sp, sp, #4
bx lr
good:
@ args = 4, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
str lr, [sp, #-4]!
mov ip, #0
sub sp, sp, #8
mov r0, ip
mov r1, ip
mov r2, ip
mov r3, ip
str ip, [sp, #0]
str ip, [sp, #4]
bl foo
add sp, sp, #8
ldmfd sp!, {pc}
.ident "GCC: (GNU) 4.1.0 20051105 (experimental)"
------------------------------------------------------------
The bug with previous compilers seems to be that the amount of stack space
already allocated by the caller was over estimated by the callee (ie
incorrectly calculated to be 8 bytes instead of 4 - as if the entire long long
param is passed on the stack when in fact only half of it has been).
However with 4.1, neither good() or bad() make any use of the 4 bytes of stack
already allocated for them by their caller ??. They both assume they start off
with 0 bytes allocated to them and then correctly allocate as required.
Therefore it seems that 4.1 is generating correct code because of a missing
optimisation that was present in previous versions ??
------------------------------------------------------------
As an aside, if gcc were smart enough, I believe good() and bad() should
compile to exactly the same assembler, so there's still some optimisation
tweaks that could be done... ;-)
------------------------------------------------------------
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24675