This is ../libffi/doc/libffi.info, produced by makeinfo version 4.13
from ../libffi/doc/libffi.texi.

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

   Copyright (C) 2008, 2010, 2011 Red Hat, Inc.

     Permission is granted to copy, distribute and/or modify this
     document under the terms of the GNU General Public License as
     published by the Free Software Foundation; either version 2, or
     (at your option) any later version.  A copy of the license is
     included in the section entitled "GNU General Public License".


INFO-DIR-SECTION Development
START-INFO-DIR-ENTRY
* libffi: (libffi).             Portable foreign-function interface library.
END-INFO-DIR-ENTRY


File: libffi.info,  Node: Top,  Next: Introduction,  Up: (dir)

libffi
******

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

   Copyright (C) 2008, 2010, 2011 Red Hat, Inc.

     Permission is granted to copy, distribute and/or modify this
     document under the terms of the GNU General Public License as
     published by the Free Software Foundation; either version 2, or
     (at your option) any later version.  A copy of the license is
     included in the section entitled "GNU General Public License".


* Menu:

* Introduction::                What is libffi?
* Using libffi::                How to use libffi.
* Missing Features::            Things libffi can't do.
* Index::                       Index.


File: libffi.info,  Node: Introduction,  Next: Using libffi,  Prev: Top,  Up: Top

1 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 "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 "ABI" or
"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.  `Libffi' can be used in such programs to provide a
bridge from the interpreter program to compiled code.

   The `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.

   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
`libffi' library really only provides the lowest, machine dependent
layer of a fully featured foreign function interface.  A layer must
exist above `libffi' that handles type conversions for values passed
between the two languages.  


File: libffi.info,  Node: Using libffi,  Next: Missing Features,  Prev: Introduction,  Up: Top

2 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.


File: libffi.info,  Node: The Basics,  Next: Simple Example,  Up: Using libffi

2.1 The Basics
==============

`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 `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 `ffi_cif'.  The "cif" in `ffi_cif' stands for Call InterFace.
To prepare a call interface object, use the function `ffi_prep_cif'.  

 -- Function: ffi_status ffi_prep_cif (ffi_cif *CIF, ffi_abi ABI,
          unsigned int NARGS, ffi_type *RTYPE, ffi_type **ARGTYPES)
     This initializes CIF according to the given parameters.

     ABI is the ABI to use; normally `FFI_DEFAULT_ABI' is what you
     want.  *note Multiple ABIs:: for more information.

     NARGS is the number of arguments that this function accepts.

     RTYPE is a pointer to an `ffi_type' structure that describes the
     return type of the function.  *Note Types::.

     ARGTYPES is a vector of `ffi_type' pointers.  ARGTYPES must have
     NARGS elements.  If NARGS is 0, this argument is ignored.

     `ffi_prep_cif' returns a `libffi' status code, of type
     `ffi_status'.  This will be either `FFI_OK' if everything worked
     properly; `FFI_BAD_TYPEDEF' if one of the `ffi_type' objects is
     incorrect; or `FFI_BAD_ABI' if the ABI parameter is invalid.

   If the function being called is variadic (varargs) then
`ffi_prep_cif_var' must be used instead of `ffi_prep_cif'.

 -- Function: ffi_status ffi_prep_cif_var (ffi_cif *CIF, ffi_abi
          varabi, unsigned int NFIXEDARGS, unsigned int varntotalargs,
          ffi_type *RTYPE, ffi_type **ARGTYPES)
     This initializes CIF according to the given parameters for a call
     to a variadic function.  In general it's operation is the same as
     for `ffi_prep_cif' except that:

     NFIXEDARGS is the number of fixed arguments, prior to any variadic
     arguments.  It must be greater than zero.

     NTOTALARGS the total number of arguments, including variadic and
     fixed arguments.

     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 `ffi_prep_cif_var' with
     NFIXEDARGS=NOTOTALARGS is NOT equivalent to a call to
     `ffi_prep_cif'.


   To call a function using an initialized `ffi_cif', use the
`ffi_call' function:

 -- Function: void ffi_call (ffi_cif *CIF, void *FN, void *RVALUE, void
          **AVALUES)
     This calls the function FN according to the description given in
     CIF.  CIF must have already been prepared using `ffi_prep_cif'.

     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 and must be suitably aligned; it is the caller's
     responsibility to ensure this.  If CIF declares that the function
     returns `void' (using `ffi_type_void'), then RVALUE is ignored.
     If RVALUE is `NULL', then the return value is discarded.

     AVALUES is a vector of `void *' pointers that point to the memory
     locations holding the argument values for a call.  If CIF declares
     that the function has no arguments (i.e., NARGS was 0), then
     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.


File: libffi.info,  Node: Simple Example,  Next: Types,  Prev: The Basics,  Up: Using libffi

2.2 Simple Example
==================

Here is a trivial example that calls `puts' a few times.

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

     int main()
     {
       ffi_cif cif;
       ffi_type *args[1];
       void *values[1];
       char *s;
       int 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_uint, 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;
     }


File: libffi.info,  Node: Types,  Next: Multiple ABIs,  Prev: Simple Example,  Up: Using libffi

2.3 Types
=========

* Menu:

* Primitive Types::             Built-in types.
* Structures::                  Structure types.
* Type Example::                Structure type example.


File: libffi.info,  Node: Primitive Types,  Next: Structures,  Up: Types

2.3.1 Primitive Types
---------------------

`Libffi' provides a number of built-in type descriptors that can be
used to describe argument and return types:

`ffi_type_void'
     The type `void'.  This cannot be used for argument types, only for
     return values.

`ffi_type_uint8'
     An unsigned, 8-bit integer type.

`ffi_type_sint8'
     A signed, 8-bit integer type.

`ffi_type_uint16'
     An unsigned, 16-bit integer type.

`ffi_type_sint16'
     A signed, 16-bit integer type.

`ffi_type_uint32'
     An unsigned, 32-bit integer type.

`ffi_type_sint32'
     A signed, 32-bit integer type.

`ffi_type_uint64'
     An unsigned, 64-bit integer type.

`ffi_type_sint64'
     A signed, 64-bit integer type.

`ffi_type_float'
     The C `float' type.

`ffi_type_double'
     The C `double' type.

`ffi_type_uchar'
     The C `unsigned char' type.

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

`ffi_type_ushort'
     The C `unsigned short' type.

`ffi_type_sshort'
     The C `short' type.

`ffi_type_uint'
     The C `unsigned int' type.

`ffi_type_sint'
     The C `int' type.

`ffi_type_ulong'
     The C `unsigned long' type.

`ffi_type_slong'
     The C `long' type.

`ffi_type_longdouble'
     On platforms that have a C `long double' type, this is defined.
     On other platforms, it is not.

`ffi_type_pointer'
     A generic `void *' pointer.  You should use this for all pointers,
     regardless of their real type.

   Each of these is of type `ffi_type', so you must take the address
when passing to `ffi_prep_cif'.


File: libffi.info,  Node: Structures,  Next: Type Example,  Prev: Primitive Types,  Up: Types

2.3.2 Structures
----------------

Although `libffi' has no special support for unions or bit-fields, it
is perfectly happy passing structures back and forth.  You must first
describe the structure to `libffi' by creating a new `ffi_type' object
for it.

 -- ffi_type:
     The `ffi_type' has the following members:
    `size_t size'
          This is set by `libffi'; you should initialize it to zero.

    `unsigned short alignment'
          This is set by `libffi'; you should initialize it to zero.

    `unsigned short type'
          For a structure, this should be set to `FFI_TYPE_STRUCT'.

    `ffi_type **elements'
          This is a `NULL'-terminated array of pointers to `ffi_type'
          objects.  There is one element per field of the struct.


File: libffi.info,  Node: Type Example,  Prev: Structures,  Up: Types

2.3.3 Type Example
------------------

The following example initializes a `ffi_type' object representing the
`tm' struct from Linux's `time.h'.

   Here is how the struct is defined:

     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__;
     };

   Here is the corresponding code to describe this struct to `libffi':

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

           tm_type.size = tm_type.alignment = 0;
           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() */
         }


File: libffi.info,  Node: Multiple ABIs,  Next: The Closure API,  Prev: Types,  Up: Using libffi

2.4 Multiple ABIs
=================

A given platform may provide multiple different ABIs at once.  For
instance, the x86 platform has both `stdcall' and `fastcall' functions.

   `libffi' provides some support for this.  However, this is
necessarily platform-specific.


File: libffi.info,  Node: The Closure API,  Next: Closure Example,  Prev: Multiple ABIs,  Up: Using libffi

2.5 The Closure API
===================

`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 "closure API".  Closures are not
supported on all platforms; you can check the `FFI_CLOSURES' define to
determine whether they are supported on the current platform.  

   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:

 -- Function: void *ffi_closure_alloc (size_t SIZE, void **CODE)
     Allocate a chunk of memory holding SIZE bytes.  This returns a
     pointer to the writable address, and sets *CODE to the
     corresponding executable address.

     SIZE should be sufficient to hold a `ffi_closure' object.

 -- Function: void ffi_closure_free (void *WRITABLE)
     Free memory allocated using `ffi_closure_alloc'.  The argument is
     the writable address that was returned.

   Once you have allocated the memory for a closure, you must construct
a `ffi_cif' describing the function call.  Finally you can prepare the
closure function:

 -- Function: ffi_status ffi_prep_closure_loc (ffi_closure *CLOSURE,
          ffi_cif *CIF, void (*FUN) (ffi_cif *CIF, void *RET, void
          **ARGS, void *USER_DATA), void *USER_DATA, void *CODELOC)
     Prepare a closure function.

     CLOSURE is the address of a `ffi_closure' object; this is the
     writable address returned by `ffi_closure_alloc'.

     CIF is the `ffi_cif' describing the function parameters.

     USER_DATA is an arbitrary datum that is passed, uninterpreted, to
     your closure function.

     CODELOC is the executable address returned by `ffi_closure_alloc'.

     FUN is the function which will be called when the closure is
     invoked.  It is called with the arguments:
    CIF
          The `ffi_cif' passed to `ffi_prep_closure_loc'.

    RET
          A pointer to the memory used for the function's return value.
          FUN must fill this, unless the function is declared as
          returning `void'.

    ARGS
          A vector of pointers to memory holding the arguments to the
          function.

    USER_DATA
          The same USER_DATA that was passed to `ffi_prep_closure_loc'.

     `ffi_prep_closure_loc' will return `FFI_OK' if everything went ok,
     and something else on error.

     After calling `ffi_prep_closure_loc', you can cast CODELOC to the
     appropriate pointer-to-function type.

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


File: libffi.info,  Node: Closure Example,  Prev: The Closure API,  Up: Using libffi

2.6 Closure Example
===================

A trivial example that creates a new `puts' by binding `fputs' with
`stdin'.

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

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

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

       int (*bound_puts)(char *);
       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_uint, 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 = 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;
     }


File: libffi.info,  Node: Missing Features,  Next: Index,  Prev: Using libffi,  Up: Top

3 Missing Features
******************

`libffi' is missing a few features.  We welcome patches to add support
for these.

   * Variadic closures.

   * There is no support for bit fields in structures.

   * The closure API is

   * The "raw" API is undocumented.

   Note that variadic support is very new and tested on a relatively
small number of platforms.


File: libffi.info,  Node: Index,  Prev: Missing Features,  Up: Top

Index
*****

 [index ]
* Menu:

* :                                      Structures.           (line 12)
* ABI:                                   Introduction.         (line 13)
* Application Binary Interface:          Introduction.         (line 13)
* calling convention:                    Introduction.         (line 13)
* cif:                                   The Basics.           (line 14)
* closure API:                           The Closure API.      (line 13)
* closures:                              The Closure API.      (line 13)
* FFI:                                   Introduction.         (line 31)
* ffi_call:                              The Basics.           (line 63)
* ffi_closure_alloc:                     The Closure API.      (line 19)
* ffi_closure_free:                      The Closure API.      (line 26)
* FFI_CLOSURES:                          The Closure API.      (line 13)
* ffi_prep_cif:                          The Basics.           (line 16)
* ffi_prep_cif_var:                      The Basics.           (line 39)
* ffi_prep_closure_loc:                  The Closure API.      (line 34)
* ffi_status <1>:                        The Closure API.      (line 37)
* ffi_status:                            The Basics.           (line 18)
* ffi_type:                              Structures.           (line 11)
* ffi_type_double:                       Primitive Types.      (line 41)
* ffi_type_float:                        Primitive Types.      (line 38)
* ffi_type_longdouble:                   Primitive Types.      (line 71)
* ffi_type_pointer:                      Primitive Types.      (line 75)
* ffi_type_schar:                        Primitive Types.      (line 47)
* ffi_type_sint:                         Primitive Types.      (line 62)
* ffi_type_sint16:                       Primitive Types.      (line 23)
* ffi_type_sint32:                       Primitive Types.      (line 29)
* ffi_type_sint64:                       Primitive Types.      (line 35)
* ffi_type_sint8:                        Primitive Types.      (line 17)
* ffi_type_slong:                        Primitive Types.      (line 68)
* ffi_type_sshort:                       Primitive Types.      (line 56)
* ffi_type_uchar:                        Primitive Types.      (line 44)
* ffi_type_uint:                         Primitive Types.      (line 59)
* ffi_type_uint16:                       Primitive Types.      (line 20)
* ffi_type_uint32:                       Primitive Types.      (line 26)
* ffi_type_uint64:                       Primitive Types.      (line 32)
* ffi_type_uint8:                        Primitive Types.      (line 14)
* ffi_type_ulong:                        Primitive Types.      (line 65)
* ffi_type_ushort:                       Primitive Types.      (line 53)
* ffi_type_void:                         Primitive Types.      (line 10)
* Foreign Function Interface:            Introduction.         (line 31)
* void <1>:                              The Closure API.      (line 20)
* void:                                  The Basics.           (line 65)



Tag Table:
Node: Top712
Node: Introduction1460
Node: Using libffi3096
Node: The Basics3582
Node: Simple Example7224
Node: Types8251
Node: Primitive Types8534
Node: Structures10354
Node: Type Example11214
Node: Multiple ABIs12437
Node: The Closure API12808
Node: Closure Example15752
Node: Missing Features17311
Node: Index17764

End Tag Table
