\input texinfo   @c -*-texinfo-*-
@c %**start of header
@setfilename libffi.info
@include version.texi
@settitle libffi: the portable foreign function interface library
@setchapternewpage off
@c %**end of header

@c Merge the standard indexes into a single one.
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex ky cp
@syncodeindex pg cp
@syncodeindex tp cp

@copying

This manual is for libffi, a portable foreign function interface
library.

Copyright @copyright{} 2008--2019, 2021 Anthony Green and Red Hat, Inc.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
``Software''), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@end copying

@dircategory Development
@direntry
* libffi: (libffi).             Portable foreign function interface library.
@end direntry

@titlepage
@title libffi: a foreign function interface library
@subtitle For Version @value{VERSION} of libffi
@author Anthony Green
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage


@ifnottex
@node Top
@top libffi

@insertcopying

@menu
* Introduction::                What is libffi?
* Using libffi::                How to use libffi.
* Memory Usage::                Where memory for closures comes from.
* Missing Features::            Things libffi can't do.
* Index::                       Index.
@end menu

@end ifnottex


@node Introduction
@chapter What is libffi?

Compilers for high level languages generate code that follow certain
conventions.  These conventions are necessary, in part, for separate
compilation to work.  One such convention is the @dfn{calling
convention}.  The calling convention is a set of assumptions made by
the compiler about where function arguments will be found on entry to
a function.  A calling convention also specifies where the return
value for a function is found.  The calling convention is also
sometimes called the @dfn{ABI} or @dfn{Application Binary Interface}.
@cindex calling convention
@cindex ABI
@cindex Application Binary Interface

Some programs may not know at the time of compilation what arguments
are to be passed to a function.  For instance, an interpreter may be
told at run-time about the number and types of arguments used to call
a given function.  @samp{Libffi} can be used in such programs to
provide a bridge from the interpreter program to compiled code.

The @samp{libffi} library provides a portable, high level programming
interface to various calling conventions.  This allows a programmer to
call any function specified by a call interface description at run
time.

@acronym{FFI} stands for Foreign Function Interface.  A foreign
function interface is the popular name for the interface that allows
code written in one language to call code written in another language.
The @samp{libffi} library really only provides the lowest, machine
dependent layer of a fully featured foreign function interface.  A
layer must exist above @samp{libffi} that handles type conversions for
values passed between the two languages.
@cindex FFI
@cindex Foreign Function Interface


@node Using libffi
@chapter Using libffi

@menu
* The Basics::                  The basic libffi API.
* Simple Example::              A simple example.
* Types::                       libffi type descriptions.
* Multiple ABIs::               Different passing styles on one platform.
* The Closure API::             Writing a generic function.
* Closure Example::             A closure example.
* Thread Safety::               Thread safety.
@end menu


@node The Basics
@section The Basics

@samp{Libffi} assumes that you have a pointer to the function you wish
to call and that you know the number and types of arguments to pass
it, as well as the return type of the function.

The first thing you must do is create an @code{ffi_cif} object that
matches the signature of the function you wish to call.  This is a
separate step because it is common to make multiple calls using a
single @code{ffi_cif}.  The @dfn{cif} in @code{ffi_cif} stands for
Call InterFace.  To prepare a call interface object, use the function
@code{ffi_prep_cif}.
@cindex cif

@findex ffi_prep_cif
@defun ffi_status ffi_prep_cif (ffi_cif *@var{cif}, ffi_abi @var{abi}, unsigned int @var{nargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes})
This initializes @var{cif} according to the given parameters.

@var{abi} is the ABI to use; normally @code{FFI_DEFAULT_ABI} is what
you want.  @ref{Multiple ABIs} for more information.

@var{nargs} is the number of arguments that this function accepts.

@var{rtype} is a pointer to an @code{ffi_type} structure that
describes the return type of the function.  @xref{Types}.

@var{argtypes} is a vector of @code{ffi_type} pointers.
@var{argtypes} must have @var{nargs} elements.  If @var{nargs} is 0,
this argument is ignored.

@code{ffi_prep_cif} returns a @code{libffi} status code, of type
@code{ffi_status}.  This will be either @code{FFI_OK} if everything
worked properly; @code{FFI_BAD_TYPEDEF} if one of the @code{ffi_type}
objects is incorrect; or @code{FFI_BAD_ABI} if the @var{abi} parameter
is invalid.
@end defun

If the function being called is variadic (varargs) then
@code{ffi_prep_cif_var} must be used instead of @code{ffi_prep_cif}.

@findex ffi_prep_cif_var
@defun ffi_status ffi_prep_cif_var (ffi_cif *@var{cif}, ffi_abi @var{abi}, unsigned int @var{nfixedargs}, unsigned int @var{ntotalargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes})
This initializes @var{cif} according to the given parameters for
a call to a variadic function.  In general its operation is the
same as for @code{ffi_prep_cif} except that:

@var{nfixedargs} is the number of fixed arguments, prior to any
variadic arguments.  It must be greater than zero.

@var{ntotalargs} the total number of arguments, including variadic
and fixed arguments.  @var{argtypes} must have this many elements.

@code{ffi_prep_cif_var} will return @code{FFI_BAD_ARGTYPE} if any of
the variable argument types are @code{ffi_type_float} (promote to
@code{ffi_type_double} first), or any integer type small than an int
(promote to an int-sized type first).

Note that, different cif's must be prepped for calls to the same
function when different numbers of arguments are passed.

Also note that a call to @code{ffi_prep_cif_var} with
@var{nfixedargs}=@var{nototalargs} is NOT equivalent to a call to
@code{ffi_prep_cif}.

@end defun

Note that the resulting @code{ffi_cif} holds pointers to all the
@code{ffi_type} objects that were used during initialization.  You
must ensure that these type objects have a lifetime at least as long
as that of the @code{ffi_cif}.

To call a function using an initialized @code{ffi_cif}, use the
@code{ffi_call} function:

@findex ffi_call
@defun void ffi_call (ffi_cif *@var{cif}, void *@var{fn}, void *@var{rvalue}, void **@var{avalues})
This calls the function @var{fn} according to the description given in
@var{cif}.  @var{cif} must have already been prepared using
@code{ffi_prep_cif}.

@var{rvalue} is a pointer to a chunk of memory that will hold the
result of the function call.  This must be large enough to hold the
result, no smaller than the system register size (generally 32 or 64
bits), and must be suitably aligned; it is the caller's responsibility
to ensure this.  If @var{cif} declares that the function returns
@code{void} (using @code{ffi_type_void}), then @var{rvalue} is
ignored.

In most situations, @samp{libffi} will handle promotion according to
the ABI.  However, for historical reasons, there is a special case
with return values that must be handled by your code.  In particular,
for integral (not @code{struct}) types that are narrower than the
system register size, the return value will be widened by
@samp{libffi}.  @samp{libffi} provides a type, @code{ffi_arg}, that
can be used as the return type.  For example, if the CIF was defined
with a return type of @code{char}, @samp{libffi} will try to store a
full @code{ffi_arg} into the return value.

@var{avalues} is a vector of @code{void *} pointers that point to the
memory locations holding the argument values for a call.  If @var{cif}
declares that the function has no arguments (i.e., @var{nargs} was 0),
then @var{avalues} is ignored.  Note that argument values may be
modified by the callee (for instance, structs passed by value); the
burden of copying pass-by-value arguments is placed on the caller.

Note that while the return value must be register-sized, arguments
should exactly match their declared type.  For example, if an argument
is a @code{short}, then the entry in @var{avalues} should point to an
object declared as @code{short}; but if the return type is
@code{short}, then @var{rvalue} should point to an object declared as
a larger type -- usually @code{ffi_arg}.
@end defun


@node Simple Example
@section Simple Example

Here is a trivial example that calls @code{puts} a few times.

@example
#include <stdio.h>
#include <ffi.h>

int main()
@{
  ffi_cif cif;
  ffi_type *args[1];
  void *values[1];
  char *s;
  ffi_arg rc;

  /* Initialize the argument info vectors */
  args[0] = &ffi_type_pointer;
  values[0] = &s;

  /* Initialize the cif */
  if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
		       &ffi_type_sint, args) == FFI_OK)
    @{
      s = "Hello World!";
      ffi_call(&cif, puts, &rc, values);
      /* rc now holds the result of the call to puts */

      /* values holds a pointer to the function's arg, so to
         call puts() again all we need to do is change the
         value of s */
      s = "This is cool!";
      ffi_call(&cif, puts, &rc, values);
    @}

  return 0;
@}
@end example


@node Types
@section Types

@menu
* Primitive Types::             Built-in types.
* Structures::                  Structure types.
* Size and Alignment::          Size and alignment of types.
* Arrays Unions Enums::         Arrays, unions, and enumerations.
* Type Example::                Structure type example.
* Complex::                     Complex types.
* Complex Type Example::        Complex type example.
@end menu

@node Primitive Types
@subsection Primitive Types

@code{Libffi} provides a number of built-in type descriptors that can
be used to describe argument and return types:

@table @code
@item ffi_type_void
@tindex ffi_type_void
The type @code{void}.  This cannot be used for argument types, only
for return values.

@item ffi_type_uint8
@tindex ffi_type_uint8
An unsigned, 8-bit integer type.

@item ffi_type_sint8
@tindex ffi_type_sint8
A signed, 8-bit integer type.

@item ffi_type_uint16
@tindex ffi_type_uint16
An unsigned, 16-bit integer type.

@item ffi_type_sint16
@tindex ffi_type_sint16
A signed, 16-bit integer type.

@item ffi_type_uint32
@tindex ffi_type_uint32
An unsigned, 32-bit integer type.

@item ffi_type_sint32
@tindex ffi_type_sint32
A signed, 32-bit integer type.

@item ffi_type_uint64
@tindex ffi_type_uint64
An unsigned, 64-bit integer type.

@item ffi_type_sint64
@tindex ffi_type_sint64
A signed, 64-bit integer type.

@item ffi_type_float
@tindex ffi_type_float
The C @code{float} type.

@item ffi_type_double
@tindex ffi_type_double
The C @code{double} type.

@item ffi_type_uchar
@tindex ffi_type_uchar
The C @code{unsigned char} type.

@item ffi_type_schar
@tindex ffi_type_schar
The C @code{signed char} type.  (Note that there is not an exact
equivalent to the C @code{char} type in @code{libffi}; ordinarily you
should either use @code{ffi_type_schar} or @code{ffi_type_uchar}
depending on whether @code{char} is signed.)

@item ffi_type_ushort
@tindex ffi_type_ushort
The C @code{unsigned short} type.

@item ffi_type_sshort
@tindex ffi_type_sshort
The C @code{short} type.

@item ffi_type_uint
@tindex ffi_type_uint
The C @code{unsigned int} type.

@item ffi_type_sint
@tindex ffi_type_sint
The C @code{int} type.

@item ffi_type_ulong
@tindex ffi_type_ulong
The C @code{unsigned long} type.

@item ffi_type_slong
@tindex ffi_type_slong
The C @code{long} type.

@item ffi_type_longdouble
@tindex ffi_type_longdouble
On platforms that have a C @code{long double} type, this is defined.
On other platforms, it is not.

@item ffi_type_pointer
@tindex ffi_type_pointer
A generic @code{void *} pointer.  You should use this for all
pointers, regardless of their real type.

@item ffi_type_complex_float
@tindex ffi_type_complex_float
The C @code{_Complex float} type.

@item ffi_type_complex_double
@tindex ffi_type_complex_double
The C @code{_Complex double} type.

@item ffi_type_complex_longdouble
@tindex ffi_type_complex_longdouble
The C @code{_Complex long double} type.
On platforms that have a C @code{long double} type, this is defined.
On other platforms, it is not.
@end table

Each of these is of type @code{ffi_type}, so you must take the address
when passing to @code{ffi_prep_cif}.


@node Structures
@subsection Structures

@samp{libffi} is perfectly happy passing structures back and forth.
You must first describe the structure to @samp{libffi} by creating a
new @code{ffi_type} object for it.

@tindex ffi_type
@deftp {Data type} ffi_type
The @code{ffi_type} has the following members:
@table @code
@item size_t size
This is set by @code{libffi}; you should initialize it to zero.

@item unsigned short alignment
This is set by @code{libffi}; you should initialize it to zero.

@item unsigned short type
For a structure, this should be set to @code{FFI_TYPE_STRUCT}.

@item ffi_type **elements
This is a @samp{NULL}-terminated array of pointers to @code{ffi_type}
objects.  There is one element per field of the struct.

Note that @samp{libffi} has no special support for bit-fields.  You
must manage these manually.
@end table
@end deftp

The @code{size} and @code{alignment} fields will be filled in by
@code{ffi_prep_cif} or @code{ffi_prep_cif_var}, as needed.

@node Size and Alignment
@subsection Size and Alignment

@code{libffi} will set the @code{size} and @code{alignment} fields of
an @code{ffi_type} object for you.  It does so using its knowledge of
the ABI.

You might expect that you can simply read these fields for a type that
has been laid out by @code{libffi}.  However, there are some caveats.

@itemize @bullet
@item
The size or alignment of some of the built-in types may vary depending
on the chosen ABI.

@item
The size and alignment of a new structure type will not be set by
@code{libffi} until it has been passed to @code{ffi_prep_cif} or
@code{ffi_get_struct_offsets}.

@item
A structure type cannot be shared across ABIs.  Instead each ABI needs
its own copy of the structure type.
@end itemize

So, before examining these fields, it is safest to pass the
@code{ffi_type} object to @code{ffi_prep_cif} or
@code{ffi_get_struct_offsets} first.  This function will do all the
needed setup.

@example
ffi_type *desired_type;
ffi_abi desired_abi;
@dots{}
ffi_cif cif;
if (ffi_prep_cif (&cif, desired_abi, 0, desired_type, NULL) == FFI_OK)
  @{
    size_t size = desired_type->size;
    unsigned short alignment = desired_type->alignment;
  @}
@end example

@code{libffi} also provides a way to get the offsets of the members of
a structure.

@findex ffi_get_struct_offsets
@defun ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets)
Compute the offset of each element of the given structure type.
@var{abi} is the ABI to use; this is needed because in some cases the
layout depends on the ABI.

@var{offsets} is an out parameter.  The caller is responsible for
providing enough space for all the results to be written -- one
element per element type in @var{struct_type}.  If @var{offsets} is
@code{NULL}, then the type will be laid out but not otherwise
modified.  This can be useful for accessing the type's size or layout,
as mentioned above.

This function returns @code{FFI_OK} on success; @code{FFI_BAD_ABI} if
@var{abi} is invalid; or @code{FFI_BAD_TYPEDEF} if @var{struct_type}
is invalid in some way.  Note that only @code{FFI_STRUCT} types are
valid here.
@end defun

@node Arrays Unions Enums
@subsection Arrays, Unions, and Enumerations

@subsubsection Arrays

@samp{libffi} does not have direct support for arrays or unions.
However, they can be emulated using structures.

To emulate an array, simply create an @code{ffi_type} using
@code{FFI_TYPE_STRUCT} with as many members as there are elements in
the array.

@example
ffi_type array_type;
ffi_type **elements
int i;

elements = malloc ((n + 1) * sizeof (ffi_type *));
for (i = 0; i < n; ++i)
  elements[i] = array_element_type;
elements[n] = NULL;

array_type.size = array_type.alignment = 0;
array_type.type = FFI_TYPE_STRUCT;
array_type.elements = elements;
@end example

Note that arrays cannot be passed or returned by value in C --
structure types created like this should only be used to refer to
members of real @code{FFI_TYPE_STRUCT} objects.

However, a phony array type like this will not cause any errors from
@samp{libffi} if you use it as an argument or return type.  This may
be confusing.

@subsubsection Unions

A union can also be emulated using @code{FFI_TYPE_STRUCT}.  In this
case, however, you must make sure that the size and alignment match
the real requirements of the union.

One simple way to do this is to ensue that each element type is laid
out.  Then, give the new structure type a single element; the size of
the largest element; and the largest alignment seen as well.

This example uses the @code{ffi_prep_cif} trick to ensure that each
element type is laid out.

@example
ffi_abi desired_abi;
ffi_type union_type;
ffi_type **union_elements;

int i;
ffi_type element_types[2];

element_types[1] = NULL;

union_type.size = union_type.alignment = 0;
union_type.type = FFI_TYPE_STRUCT;
union_type.elements = element_types;

for (i = 0; union_elements[i]; ++i)
  @{
    ffi_cif cif;
    if (ffi_prep_cif (&cif, desired_abi, 0, union_elements[i], NULL) == FFI_OK)
      @{
        if (union_elements[i]->size > union_type.size)
          @{
            union_type.size = union_elements[i];
            size = union_elements[i]->size;
          @}
        if (union_elements[i]->alignment > union_type.alignment)
          union_type.alignment = union_elements[i]->alignment;
      @}
  @}
@end example

@subsubsection Enumerations

@code{libffi} does not have any special support for C @code{enum}s.
Although any given @code{enum} is implemented using a specific
underlying integral type, exactly which type will be used cannot be
determined by @code{libffi} -- it may depend on the values in the
enumeration or on compiler flags such as @option{-fshort-enums}.
@xref{Structures unions enumerations and bit-fields implementation, , , gcc},
for more information about how GCC handles enumerations.

@node Type Example
@subsection Type Example

The following example initializes a @code{ffi_type} object
representing the @code{tm} struct from Linux's @file{time.h}.

Here is how the struct is defined:

@example
struct tm @{
    int tm_sec;
    int tm_min;
    int tm_hour;
    int tm_mday;
    int tm_mon;
    int tm_year;
    int tm_wday;
    int tm_yday;
    int tm_isdst;
    /* Those are for future use. */
    long int __tm_gmtoff__;
    __const char *__tm_zone__;
@};
@end example

Here is the corresponding code to describe this struct to
@code{libffi}:

@example
    @{
      ffi_type tm_type;
      ffi_type *tm_type_elements[12];
      int i;

      tm_type.size = tm_type.alignment = 0;
      tm_type.type = FFI_TYPE_STRUCT;
      tm_type.elements = &tm_type_elements;

      for (i = 0; i < 9; i++)
          tm_type_elements[i] = &ffi_type_sint;

      tm_type_elements[9] = &ffi_type_slong;
      tm_type_elements[10] = &ffi_type_pointer;
      tm_type_elements[11] = NULL;

      /* tm_type can now be used to represent tm argument types and
	 return types for ffi_prep_cif() */
    @}
@end example

@node Complex
@subsection Complex Types

@samp{libffi} supports the complex types defined by the C99
standard (@code{_Complex float}, @code{_Complex double} and
@code{_Complex long double} with the built-in type descriptors
@code{ffi_type_complex_float}, @code{ffi_type_complex_double} and
@code{ffi_type_complex_longdouble}.

Custom complex types like @code{_Complex int} can also be used.
An @code{ffi_type} object has to be defined to describe the
complex type to @samp{libffi}.

@tindex ffi_type
@deftp {Data type} ffi_type
@table @code
@item size_t size
This must be manually set to the size of the complex type.

@item unsigned short alignment
This must be manually set to the alignment of the complex type.

@item unsigned short type
For a complex type, this must be set to @code{FFI_TYPE_COMPLEX}.

@item ffi_type **elements

This is a @samp{NULL}-terminated array of pointers to
@code{ffi_type} objects.  The first element is set to the
@code{ffi_type} of the complex's base type.  The second element
must be set to @code{NULL}.
@end table
@end deftp

The section @ref{Complex Type Example} shows a way to determine
the @code{size} and @code{alignment} members in a platform
independent way.

For platforms that have no complex support in @code{libffi} yet,
the functions @code{ffi_prep_cif} and @code{ffi_prep_args} abort
the program if they encounter a complex type.

@node Complex Type Example
@subsection Complex Type Example

This example demonstrates how to use complex types:

@example
#include <stdio.h>
#include <ffi.h>
#include <complex.h>

void complex_fn(_Complex float cf,
                _Complex double cd,
                _Complex long double cld)
@{
  printf("cf=%f+%fi\ncd=%f+%fi\ncld=%f+%fi\n",
         (float)creal (cf), (float)cimag (cf),
         (float)creal (cd), (float)cimag (cd),
         (float)creal (cld), (float)cimag (cld));
@}

int main()
@{
  ffi_cif cif;
  ffi_type *args[3];
  void *values[3];
  _Complex float cf;
  _Complex double cd;
  _Complex long double cld;

  /* Initialize the argument info vectors */
  args[0] = &ffi_type_complex_float;
  args[1] = &ffi_type_complex_double;
  args[2] = &ffi_type_complex_longdouble;
  values[0] = &cf;
  values[1] = &cd;
  values[2] = &cld;

  /* Initialize the cif */
  if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
                   &ffi_type_void, args) == FFI_OK)
    @{
      cf = 1.0 + 20.0 * I;
      cd = 300.0 + 4000.0 * I;
      cld = 50000.0 + 600000.0 * I;
      /* Call the function */
      ffi_call(&cif, (void (*)(void))complex_fn, 0, values);
    @}

  return 0;
@}
@end example

This is an example for defining a custom complex type descriptor
for compilers that support them:

@example
/*
 * This macro can be used to define new complex type descriptors
 * in a platform independent way.
 *
 * name: Name of the new descriptor is ffi_type_complex_<name>.
 * type: The C base type of the complex type.
 */
#define FFI_COMPLEX_TYPEDEF(name, type, ffitype)             \
  static ffi_type *ffi_elements_complex_##name [2] = @{      \
    (ffi_type *)(&ffitype), NULL                             \
  @};                                                        \
  struct struct_align_complex_##name @{                      \
    char c;                                                  \
    _Complex type x;                                         \
  @};                                                        \
  ffi_type ffi_type_complex_##name = @{                      \
    sizeof(_Complex type),                                   \
    offsetof(struct struct_align_complex_##name, x),         \
    FFI_TYPE_COMPLEX,                                        \
    (ffi_type **)ffi_elements_complex_##name                 \
  @}

/* Define new complex type descriptors using the macro: */
/* ffi_type_complex_sint */
FFI_COMPLEX_TYPEDEF(sint, int, ffi_type_sint);
/* ffi_type_complex_uchar */
FFI_COMPLEX_TYPEDEF(uchar, unsigned char, ffi_type_uint8);
@end example

The new type descriptors can then be used like one of the built-in
type descriptors in the previous example.

@node Multiple ABIs
@section Multiple ABIs

A given platform may provide multiple different ABIs at once.  For
instance, the x86 platform has both @samp{stdcall} and @samp{fastcall}
functions.

@code{libffi} provides some support for this.  However, this is
necessarily platform-specific.

@c FIXME: document the platforms

@node The Closure API
@section The Closure API

@code{libffi} also provides a way to write a generic function -- a
function that can accept and decode any combination of arguments.
This can be useful when writing an interpreter, or to provide wrappers
for arbitrary functions.

This facility is called the @dfn{closure API}.  Closures are not
supported on all platforms; you can check the @code{FFI_CLOSURES}
define to determine whether they are supported on the current
platform.
@cindex closures
@cindex closure API
@findex FFI_CLOSURES

Because closures work by assembling a tiny function at runtime, they
require special allocation on platforms that have a non-executable
heap.  Memory management for closures is handled by a pair of
functions:

@findex ffi_closure_alloc
@defun void *ffi_closure_alloc (size_t @var{size}, void **@var{code})
Allocate a chunk of memory holding @var{size} bytes.  This returns a
pointer to the writable address, and sets *@var{code} to the
corresponding executable address.

@var{size} should be sufficient to hold a @code{ffi_closure} object.
@end defun

@findex ffi_closure_free
@defun void ffi_closure_free (void *@var{writable})
Free memory allocated using @code{ffi_closure_alloc}.  The argument is
the writable address that was returned.
@end defun


Once you have allocated the memory for a closure, you must construct a
@code{ffi_cif} describing the function call.  Finally you can prepare
the closure function:

@findex ffi_prep_closure_loc
@defun ffi_status ffi_prep_closure_loc (ffi_closure *@var{closure}, ffi_cif *@var{cif}, void (*@var{fun}) (ffi_cif *@var{cif}, void *@var{ret}, void **@var{args}, void *@var{user_data}), void *@var{user_data}, void *@var{codeloc})
Prepare a closure function.  The arguments to
@code{ffi_prep_closure_loc} are:

@table @var
@item closure
The address of a @code{ffi_closure} object; this is the writable
address returned by @code{ffi_closure_alloc}.

@item cif
The @code{ffi_cif} describing the function parameters.  Note that this
object, and the types to which it refers, must be kept alive until the
closure itself is freed.

@item user_data
An arbitrary datum that is passed, uninterpreted, to your closure
function.

@item codeloc
The executable address returned by @code{ffi_closure_alloc}.

@item fun
The function which will be called when the closure is invoked.  It is
called with the arguments:

@table @var
@item cif
The @code{ffi_cif} passed to @code{ffi_prep_closure_loc}.

@item ret
A pointer to the memory used for the function's return value.

If the function is declared as returning @code{void}, then this value
is garbage and should not be used.

Otherwise, @var{fun} must fill the object to which this points,
following the same special promotion behavior as @code{ffi_call}.
That is, in most cases, @var{ret} points to an object of exactly the
size of the type specified when @var{cif} was constructed.  However,
integral types narrower than the system register size are widened.  In
these cases your program may assume that @var{ret} points to an
@code{ffi_arg} object.

@item args
A vector of pointers to memory holding the arguments to the function.

@item user_data
The same @var{user_data} that was passed to
@code{ffi_prep_closure_loc}.
@end table
@end table

@code{ffi_prep_closure_loc} will return @code{FFI_OK} if everything
went ok, and one of the other @code{ffi_status} values on error.

After calling @code{ffi_prep_closure_loc}, you can cast @var{codeloc}
to the appropriate pointer-to-function type.
@end defun

You may see old code referring to @code{ffi_prep_closure}.  This
function is deprecated, as it cannot handle the need for separate
writable and executable addresses.

@node Closure Example
@section Closure Example

A trivial example that creates a new @code{puts} by binding
@code{fputs} with @code{stdout}.

@example
#include <stdio.h>
#include <ffi.h>

/* Acts like puts with the file given at time of enclosure. */
void puts_binding(ffi_cif *cif, void *ret, void* args[],
                  void *stream)
@{
  *(ffi_arg *)ret = fputs(*(char **)args[0], (FILE *)stream);
@}

typedef int (*puts_t)(char *);

int main()
@{
  ffi_cif cif;
  ffi_type *args[1];
  ffi_closure *closure;

  void *bound_puts;
  int rc;

  /* Allocate closure and bound_puts */
  closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);

  if (closure)
    @{
      /* Initialize the argument info vectors */
      args[0] = &ffi_type_pointer;

      /* Initialize the cif */
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
                       &ffi_type_sint, args) == FFI_OK)
        @{
          /* Initialize the closure, setting stream to stdout */
          if (ffi_prep_closure_loc(closure, &cif, puts_binding,
                                   stdout, bound_puts) == FFI_OK)
            @{
              rc = ((puts_t)bound_puts)("Hello World!");
              /* rc now holds the result of the call to fputs */
            @}
        @}
    @}

  /* Deallocate both closure, and bound_puts */
  ffi_closure_free(closure);

  return 0;
@}

@end example

@node Thread Safety
@section Thread Safety

@code{libffi} is not completely thread-safe.  However, many parts are,
and if you follow some simple rules, you can use it safely in a
multi-threaded program.

@itemize @bullet
@item
@code{ffi_prep_cif} may modify the @code{ffi_type} objects passed to
it.  It is best to ensure that only a single thread prepares a given
@code{ffi_cif} at a time.

@item
On some platforms, @code{ffi_prep_cif} may modify the size and
alignment of some types, depending on the chosen ABI.  On these
platforms, if you switch between ABIs, you must ensure that there is
only one call to @code{ffi_prep_cif} at a time.

Currently the only affected platform is PowerPC and the only affected
type is @code{long double}.
@end itemize

@node Memory Usage
@chapter Memory Usage

Note that memory allocated by @code{ffi_closure_alloc} and freed by
@code{ffi_closure_free} does not come from the same general pool of
memory that @code{malloc} and @code{free} use.  To accomodate security
settings, @samp{libffi} may aquire memory, for example, by mapping
temporary files into multiple places in the address space (once to
write out the closure, a second to execute it).  The search follows
this list, using the first that works:

@itemize @bullet

@item
A anonymous mapping (i.e. not file-backed)

@item
@code{memfd_create()}, if the kernel supports it.

@item
A file created in the directory referenced by the environment variable
@code{LIBFFI_TMPDIR}.

@item
Likewise for the environment variable @code{TMPDIR}.

@item
A file created in @code{/tmp}.

@item
A file created in @code{/var/tmp}.

@item
A file created in @code{/dev/shm}.

@item
A file created in the user's home directory (@code{$HOME}).

@item
A file created in any directory listed in @code{/etc/mtab}.

@item
A file created in any directory listed in @code{/proc/mounts}.

@end itemize

If security settings prohibit using any of these for closures,
@code{ffi_closure_alloc} will fail.

@node Missing Features
@chapter Missing Features

@code{libffi} is missing a few features.  We welcome patches to add
support for these.

@itemize @bullet
@item
Variadic closures.

@item
There is no support for bit fields in structures.

@item
The ``raw'' API is undocumented.
@c anything else?

@item
The Go API is undocumented.
@end itemize

@node Index
@unnumbered Index

@printindex cp

@bye
