This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

About the alignment of main


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]