[Haskell-cafe] Re: Could FFI support pass-by-value of
structs?
Duncan Coutts
duncan.coutts at worc.ox.ac.uk
Mon Jun 29 20:18:32 EDT 2009
On Tue, 2009-06-30 at 00:45 +0400, Bulat Ziganshin wrote:
> Hello Duncan,
>
> Tuesday, June 30, 2009, 12:03:15 AM, you wrote:
>
> > struct ex {
> > int x;
> > int y;
> > int z;
> > };
>
> > ex example_functions (ex p)
>
> afaik, there is C ABI, that defines how to pass and return parameters
> of simple types, it's common for all compilers supporting so-called
> "cdecl" on any architecture (x86, x86-64, ppc, so on). C ABI doesn't
> define how to pass structures, so we can't generate universal
> assembler code for this example - it depends on what compiler we want
> to interact to
Actually passing structs and unions as arguments or function results is
specified by the C ABI. See for example the IA32 ABI:
http://www.caldera.com/developers/devspecs/abi386-4.pdf
linked from the LSB:
http://refspecs.linux-foundation.org/LSB_3.1.0/LSB-Core-IA32/LSB-Core-IA32/normativerefs.html
See the section Function Calling Sequence, 3-9. Specifically:
3-14: Functions Returning Structures or Unions
3-18: Structure and Union Arguments
On IA32 structs/unions passed as parameters go by value on the stack.
For structs/unions as function results, they are stored into a
caller-allocated area on the stack, pointed to by a "hidden" first arg.
It's different on each arch, but it's all completely specified.
> moreover, even for pointers-to-structures, there is no definitive
> layout due to packing problem
Actually the padding is also specified by the C ABI. See section 3-3.
Compiler pragmas to use packed layout are not ABI conformant (and so
typically are only used internally).
Duncan
More information about the Haskell-Cafe
mailing list