Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Feb 2002 17:01:29 +1100 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        Mike Silbersack <silby@silby.com>
Cc:        Michal Mertl <mime@traveller.cz>, <hackers@freebsd.org>, <greg@bogslab.ucdavis.edu>
Subject:   Re: stack alignment issues
Message-ID:  <20020205163210.G25358-100000@gamplex.bde.org>
In-Reply-To: <20020204120547.B2144-100000@patrocles.silby.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 4 Feb 2002, Mike Silbersack wrote:

> On Tue, 5 Feb 2002, Bruce Evans wrote:
> > I haven't done anything to clean up the patch.  I hope the problem
> > will go away in future versions of gcc (align the stack at runtime in
> > the few routines that actually need it).
>
> Well, if Linux aligns the initial stack, the chance that gcc will have
> auto-alignment added sounds to be about zero.  You might as well go ahead
> with your patch when you get a chance.

There is a nonzero probability that the pessimization of aligning in almost
every routine will be fixed someday.  Actually, the pessimization is worse
-- the alignment is done before every call.

Example:

%%%
foo.c:
foo()
{
	f1(1);
	f2(2);
	f3(3.0);
}
%%%

gcc -O -S [-mpreferred-stack boundary] currently generates the following
code for this:

%%%
	.file	"z.c"
	.version	"01.01"
gcc2_compiled.:
	.section	.rodata
	.p2align 3
.LC0:
	.long 0x0,0x40080000
.text
	.p2align 2,0x90
.globl foo
		.type		 foo,@function
foo:
	pushl %ebp
	movl %esp,%ebp
	subl $8,%esp		# <- extra instruction for alignment (for foo)
	addl $-12,%esp		# <- extra instruction for alignment (for f1)
	pushl $1
	call f1
	addl $-12,%esp		# <- extra instruction for alignment (for f2)
	pushl $2
	call f2
	addl $32,%esp		# <- extra instruction for alignment (for f3)
	addl $-8,%esp		# <- extra instruction for alignment (another)
	pushl .LC0+4
	pushl .LC0
	call f3
	leave
	ret
.Lfe1:
		.size		 foo,.Lfe1-foo
	.ident	"GCC: (c) 2.95.3 20010315 (release)"
%%%

It should generate something like:

	.file	"z.c"
	.version	"01.01"
gcc2_compiled.:
	.section	.rodata
	.p2align 3
.LC0:
	.long 0x0,0x40080000
.text
	.p2align 2,0x90
.globl foo
		.type		 foo,@function
foo:
	pushl %ebp
	movl %esp,%ebp
	andl $~0x7,%esp		# <- extra instruction for alignment (for foo)
				# Only needed since foo() uses FPU.
				# 8-byte alignment enough for doubles?
				# Adjust in prologue so that there are
				# hopefully no alloca()-like issues, except
				# we need a frame pointer to restore %esp.
	pushl $1
	call f1
	pushl $2
	call f2
	pushl .LC0+4
	pushl .LC0
	call f3
	leave
	ret
.Lfe1:
		.size		 foo,.Lfe1-foo
	.ident	"GCC: (c) 2.95.3 20010315 (release)"
%%%

My patch is not suitable for committing verbatim.  It has 2 or 3 XXX's.

Bruce


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020205163210.G25358-100000>