[LLVMdev] Proposing a new 'alloca' parameter attribute to implement the Microsoft C++ ABI

Duncan Sands baldrick at free.fr
Mon Jul 29 07:45:14 PDT 2013

Hi Reid,

On 29/07/13 16:36, Reid Kleckner wrote:
> On Mon, Jul 29, 2013 at 9:40 AM, Duncan Sands <baldrick at free.fr
> <mailto:baldrick at free.fr>> wrote:
>     On 29/07/13 15:30, Anton Korobeynikov wrote:
>                 object in place on the stack or at least call its copy constructor.
>             what does GCC do?
>         Nothing. It does not support MSVC ABI.
>     Maybe we shouldn't either :)  So the ABI requires the struct to be pushed on the
>     stack by the caller along with the other parameters, and what's more it requires
>     the caller to execute some code on that copy, in place on the stack, before
>     performing the call.  Is that right?
> Just calling the copy ctor is the bare minimum needed to support the ABI.
>   cl.exe uses a more efficient lowering that evaluates the arguments right to
> left directly into the outgoing argument stack slots.  It lowers following call
> to bar to something like:
> struct A {int x; int y;};
> A foo();
> void bar(int, A, int);
> ...
> bar(0xdead, foo(), 0xbeef);
> x86_32 pseudo intel asm:
> push 0xdead
> sub esp, 8
> push esp  # sret arg for foo
> call foo
> add esp, 4 # clear sret arg
> push 0xbeef
> call bar

I got confused by your example.  Is the struct passed on the stack, amongst the
other parameters, or can it be allocated somewhere else and a pointer to it
passed?  Because in your example it isn't clear to me how the return value of
foo() is being passed to bar().

Ciao, Duncan.

> add 16 # clear args
> With the current proposal, LLVM would generate code that adjusts the stack once
> to begin the call, and once more to end it.  Initially, it would do a blind SP
> restore, but that can be optimized to a constant SP adjustment.  Arguments will
> still be evaluated left to right and will be stored into the special alloca
> outgoing argument slots.

More information about the llvm-dev mailing list