gcc return struct code generation

jose gomez valcarcel jcgv33@yahoo.es
Tue Aug 30 06:30:00 GMT 2011


I also think is a bug, but i'm not sure. My toy kernel has no assembly (.S) files, but of course it has c functions with
inline assembly. My context switch function it's a c funtion (yes i know there are better ways of doing this) with some
inline assembly code first to save context, some c code, and then some assembly code to restore context and do 'iret'.
It works only if the C code doesn't touch the rsp, because I 'intercept' the end of the function.

I known that is 'questionable' code, but the real question is that i expect that this simple C code not to touch RSP with optimizations
enabled in x86_64. I got surprised. Note that you point of stack aligned on 16 byte boundary is irrelevant, because it has to be aligned
on 'fn' entry call.


----- Mensaje original -----
De: Ian Lance Taylor <iant@google.com>
Para: jose gomez valcarcel <jcgv33@yahoo.es>
CC: "gcc-help@gcc.gnu.org" <gcc-help@gcc.gnu.org>; "jcgv@elgron.org" <jcgv@elgron.org>
Enviado: lunes 29 de agosto de 2011 23:29
Asunto: Re: gcc return struct code generation

jose gomez valcarcel <jcgv33@yahoo.es> writes:

> I just read x86_64 ABI code generation, and the result is ok. The
> struct is returned in registers RAX, RDX. The only disappointing thing
> is the allocation of 40 stack bytes, whic apparently is not used. This
> effect cause my kernel code not to mix well with hand-assembler code.

That is a good question.  I think it is a bug.  Although I'm curious as
to why allocating extra unused stack space is a problem for your kernel
code.  Some stack space will always be used, because the x86_64 ABI
requires the stack to be aligned on a 16-byte boundary before executing
a call instruction.


More information about the Gcc-help mailing list