Ok, with the current patch I have to prevent sibcall optimization in
main (the patch isn't final, but thats not important, the problem will
be fixed somehow) I am now getting much better results from the
testsuite. However, I am still running into problems when a function is
inlined into main and it uses alignment sensitive functions.
The comment for 'FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN' clearly states
that it will align the stack nicely for all calls from main, but does
nothing for the alignment of main itself. I realize that I should
probably fix this in the crt code such that main always enters aligned
(as discussed previously here). However, I was wondering whether gcc
couldn't help with even that, and actually align main itself (given some
suitable target macro like TARGET_IS_LAME_AND_DOESNT_ALIGN_MAIN).
The way I would see this working is thus. gcc detects that it is dealing
with the function "main". If it does and T_I_L_A_D_A_M is set, it emits
the code for aligning the stack as it currently does, then makes a call
to a local label, and does a normal return from main. So you go from
something like this:
main:
pushl %ebp
movl %esp, %ebp
pushl %edi
push %esi
subl $64, %esp
andl $-16, %esp / Stack now aligned
.... normal main code here ....
popl %esi
popl %edi
popl %ebp
ret
To something like this:
main:
pushl %ebp
movl %esp, %ebp
pushl %edi
push %esi
subl $64, %esp
andl $-16, %esp / stack now aligned
movl 16(%ebp), %eax
pushl %eax / argc
movl 12(%ebp), %eax
pushl %eax / argv
movl 8(%ebp), %eax
pushl %eax / envp
call .temp_main_label
addl $12, %esp
popl %esi
popl %edi
popl %ebp
ret
.temp_main_label:
... rest of main code here ...
Intuitively, it seems like that would work. Comments? Suggestions?
Kean