Imported Upstream version 1.0.0
[platform/upstream/js.git] / js / src / ctypes / libffi / doc / libffi.info
1 This is ../libffi/doc/libffi.info, produced by makeinfo version 4.13
2 from ../libffi/doc/libffi.texi.
3
4 This manual is for Libffi, a portable foreign-function interface
5 library.
6
7    Copyright (C) 2008, 2010 Red Hat, Inc.
8
9      Permission is granted to copy, distribute and/or modify this
10      document under the terms of the GNU General Public License as
11      published by the Free Software Foundation; either version 2, or
12      (at your option) any later version.  A copy of the license is
13      included in the section entitled "GNU General Public License".
14
15
16 INFO-DIR-SECTION Development
17 START-INFO-DIR-ENTRY
18 * libffi: (libffi).             Portable foreign-function interface library.
19 END-INFO-DIR-ENTRY
20
21 \1f
22 File: libffi.info,  Node: Top,  Next: Introduction,  Up: (dir)
23
24 libffi
25 ******
26
27 This manual is for Libffi, a portable foreign-function interface
28 library.
29
30    Copyright (C) 2008, 2010 Red Hat, Inc.
31
32      Permission is granted to copy, distribute and/or modify this
33      document under the terms of the GNU General Public License as
34      published by the Free Software Foundation; either version 2, or
35      (at your option) any later version.  A copy of the license is
36      included in the section entitled "GNU General Public License".
37
38
39 * Menu:
40
41 * Introduction::                What is libffi?
42 * Using libffi::                How to use libffi.
43 * Missing Features::            Things libffi can't do.
44 * Index::                       Index.
45
46 \1f
47 File: libffi.info,  Node: Introduction,  Next: Using libffi,  Prev: Top,  Up: Top
48
49 1 What is libffi?
50 *****************
51
52 Compilers for high level languages generate code that follow certain
53 conventions.  These conventions are necessary, in part, for separate
54 compilation to work.  One such convention is the "calling convention".
55 The calling convention is a set of assumptions made by the compiler
56 about where function arguments will be found on entry to a function.  A
57 calling convention also specifies where the return value for a function
58 is found.  The calling convention is also sometimes called the "ABI" or
59 "Application Binary Interface".  
60
61    Some programs may not know at the time of compilation what arguments
62 are to be passed to a function.  For instance, an interpreter may be
63 told at run-time about the number and types of arguments used to call a
64 given function.  `Libffi' can be used in such programs to provide a
65 bridge from the interpreter program to compiled code.
66
67    The `libffi' library provides a portable, high level programming
68 interface to various calling conventions.  This allows a programmer to
69 call any function specified by a call interface description at run time.
70
71    FFI stands for Foreign Function Interface.  A foreign function
72 interface is the popular name for the interface that allows code
73 written in one language to call code written in another language.  The
74 `libffi' library really only provides the lowest, machine dependent
75 layer of a fully featured foreign function interface.  A layer must
76 exist above `libffi' that handles type conversions for values passed
77 between the two languages.  
78
79 \1f
80 File: libffi.info,  Node: Using libffi,  Next: Missing Features,  Prev: Introduction,  Up: Top
81
82 2 Using libffi
83 **************
84
85 * Menu:
86
87 * The Basics::                  The basic libffi API.
88 * Simple Example::              A simple example.
89 * Types::                       libffi type descriptions.
90 * Multiple ABIs::               Different passing styles on one platform.
91 * The Closure API::             Writing a generic function.
92 * Closure Example::             A closure example.
93
94 \1f
95 File: libffi.info,  Node: The Basics,  Next: Simple Example,  Up: Using libffi
96
97 2.1 The Basics
98 ==============
99
100 `Libffi' assumes that you have a pointer to the function you wish to
101 call and that you know the number and types of arguments to pass it, as
102 well as the return type of the function.
103
104    The first thing you must do is create an `ffi_cif' object that
105 matches the signature of the function you wish to call.  This is a
106 separate step because it is common to make multiple calls using a
107 single `ffi_cif'.  The "cif" in `ffi_cif' stands for Call InterFace.
108 To prepare a call interface object, use the function `ffi_prep_cif'.  
109
110  -- Function: ffi_status ffi_prep_cif (ffi_cif *CIF, ffi_abi ABI,
111           unsigned int NARGS, ffi_type *RTYPE, ffi_type **ARGTYPES)
112      This initializes CIF according to the given parameters.
113
114      ABI is the ABI to use; normally `FFI_DEFAULT_ABI' is what you
115      want.  *note Multiple ABIs:: for more information.
116
117      NARGS is the number of arguments that this function accepts.
118      `libffi' does not yet handle varargs functions; see *note Missing
119      Features:: for more information.
120
121      RTYPE is a pointer to an `ffi_type' structure that describes the
122      return type of the function.  *Note Types::.
123
124      ARGTYPES is a vector of `ffi_type' pointers.  ARGTYPES must have
125      NARGS elements.  If NARGS is 0, this argument is ignored.
126
127      `ffi_prep_cif' returns a `libffi' status code, of type
128      `ffi_status'.  This will be either `FFI_OK' if everything worked
129      properly; `FFI_BAD_TYPEDEF' if one of the `ffi_type' objects is
130      incorrect; or `FFI_BAD_ABI' if the ABI parameter is invalid.
131
132    To call a function using an initialized `ffi_cif', use the
133 `ffi_call' function:
134
135  -- Function: void ffi_call (ffi_cif *CIF, void *FN, void *RVALUE, void
136           **AVALUES)
137      This calls the function FN according to the description given in
138      CIF.  CIF must have already been prepared using `ffi_prep_cif'.
139
140      RVALUE is a pointer to a chunk of memory that will hold the result
141      of the function call.  This must be large enough to hold the
142      result and must be suitably aligned; it is the caller's
143      responsibility to ensure this.  If CIF declares that the function
144      returns `void' (using `ffi_type_void'), then RVALUE is ignored.
145      If RVALUE is `NULL', then the return value is discarded.
146
147      AVALUES is a vector of `void *' pointers that point to the memory
148      locations holding the argument values for a call.  If CIF declares
149      that the function has no arguments (i.e., NARGS was 0), then
150      AVALUES is ignored.  Note that argument values may be modified by
151      the callee (for instance, structs passed by value); the burden of
152      copying pass-by-value arguments is placed on the caller.
153
154 \1f
155 File: libffi.info,  Node: Simple Example,  Next: Types,  Prev: The Basics,  Up: Using libffi
156
157 2.2 Simple Example
158 ==================
159
160 Here is a trivial example that calls `puts' a few times.
161
162      #include <stdio.h>
163      #include <ffi.h>
164
165      int main()
166      {
167        ffi_cif cif;
168        ffi_type *args[1];
169        void *values[1];
170        char *s;
171        int rc;
172
173        /* Initialize the argument info vectors */
174        args[0] = &ffi_type_pointer;
175        values[0] = &s;
176
177        /* Initialize the cif */
178        if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
179                        &ffi_type_uint, args) == FFI_OK)
180          {
181            s = "Hello World!";
182            ffi_call(&cif, puts, &rc, values);
183            /* rc now holds the result of the call to puts */
184
185            /* values holds a pointer to the function's arg, so to
186               call puts() again all we need to do is change the
187               value of s */
188            s = "This is cool!";
189            ffi_call(&cif, puts, &rc, values);
190          }
191
192        return 0;
193      }
194
195 \1f
196 File: libffi.info,  Node: Types,  Next: Multiple ABIs,  Prev: Simple Example,  Up: Using libffi
197
198 2.3 Types
199 =========
200
201 * Menu:
202
203 * Primitive Types::             Built-in types.
204 * Structures::                  Structure types.
205 * Type Example::                Structure type example.
206
207 \1f
208 File: libffi.info,  Node: Primitive Types,  Next: Structures,  Up: Types
209
210 2.3.1 Primitive Types
211 ---------------------
212
213 `Libffi' provides a number of built-in type descriptors that can be
214 used to describe argument and return types:
215
216 `ffi_type_void'
217      The type `void'.  This cannot be used for argument types, only for
218      return values.
219
220 `ffi_type_uint8'
221      An unsigned, 8-bit integer type.
222
223 `ffi_type_sint8'
224      A signed, 8-bit integer type.
225
226 `ffi_type_uint16'
227      An unsigned, 16-bit integer type.
228
229 `ffi_type_sint16'
230      A signed, 16-bit integer type.
231
232 `ffi_type_uint32'
233      An unsigned, 32-bit integer type.
234
235 `ffi_type_sint32'
236      A signed, 32-bit integer type.
237
238 `ffi_type_uint64'
239      An unsigned, 64-bit integer type.
240
241 `ffi_type_sint64'
242      A signed, 64-bit integer type.
243
244 `ffi_type_float'
245      The C `float' type.
246
247 `ffi_type_double'
248      The C `double' type.
249
250 `ffi_type_uchar'
251      The C `unsigned char' type.
252
253 `ffi_type_schar'
254      The C `signed char' type.  (Note that there is not an exact
255      equivalent to the C `char' type in `libffi'; ordinarily you should
256      either use `ffi_type_schar' or `ffi_type_uchar' depending on
257      whether `char' is signed.)
258
259 `ffi_type_ushort'
260      The C `unsigned short' type.
261
262 `ffi_type_sshort'
263      The C `short' type.
264
265 `ffi_type_uint'
266      The C `unsigned int' type.
267
268 `ffi_type_sint'
269      The C `int' type.
270
271 `ffi_type_ulong'
272      The C `unsigned long' type.
273
274 `ffi_type_slong'
275      The C `long' type.
276
277 `ffi_type_longdouble'
278      On platforms that have a C `long double' type, this is defined.
279      On other platforms, it is not.
280
281 `ffi_type_pointer'
282      A generic `void *' pointer.  You should use this for all pointers,
283      regardless of their real type.
284
285    Each of these is of type `ffi_type', so you must take the address
286 when passing to `ffi_prep_cif'.
287
288 \1f
289 File: libffi.info,  Node: Structures,  Next: Type Example,  Prev: Primitive Types,  Up: Types
290
291 2.3.2 Structures
292 ----------------
293
294 Although `libffi' has no special support for unions or bit-fields, it
295 is perfectly happy passing structures back and forth.  You must first
296 describe the structure to `libffi' by creating a new `ffi_type' object
297 for it.
298
299  -- ffi_type:
300      The `ffi_type' has the following members:
301     `size_t size'
302           This is set by `libffi'; you should initialize it to zero.
303
304     `unsigned short alignment'
305           This is set by `libffi'; you should initialize it to zero.
306
307     `unsigned short type'
308           For a structure, this should be set to `FFI_TYPE_STRUCT'.
309
310     `ffi_type **elements'
311           This is a `NULL'-terminated array of pointers to `ffi_type'
312           objects.  There is one element per field of the struct.
313
314 \1f
315 File: libffi.info,  Node: Type Example,  Prev: Structures,  Up: Types
316
317 2.3.3 Type Example
318 ------------------
319
320 The following example initializes a `ffi_type' object representing the
321 `tm' struct from Linux's `time.h'.
322
323    Here is how the struct is defined:
324
325      struct tm {
326          int tm_sec;
327          int tm_min;
328          int tm_hour;
329          int tm_mday;
330          int tm_mon;
331          int tm_year;
332          int tm_wday;
333          int tm_yday;
334          int tm_isdst;
335          /* Those are for future use. */
336          long int __tm_gmtoff__;
337          __const char *__tm_zone__;
338      };
339
340    Here is the corresponding code to describe this struct to `libffi':
341
342          {
343            ffi_type tm_type;
344            ffi_type *tm_type_elements[12];
345            int i;
346
347            tm_type.size = tm_type.alignment = 0;
348            tm_type.elements = &tm_type_elements;
349
350            for (i = 0; i < 9; i++)
351                tm_type_elements[i] = &ffi_type_sint;
352
353            tm_type_elements[9] = &ffi_type_slong;
354            tm_type_elements[10] = &ffi_type_pointer;
355            tm_type_elements[11] = NULL;
356
357            /* tm_type can now be used to represent tm argument types and
358          return types for ffi_prep_cif() */
359          }
360
361 \1f
362 File: libffi.info,  Node: Multiple ABIs,  Next: The Closure API,  Prev: Types,  Up: Using libffi
363
364 2.4 Multiple ABIs
365 =================
366
367 A given platform may provide multiple different ABIs at once.  For
368 instance, the x86 platform has both `stdcall' and `fastcall' functions.
369
370    `libffi' provides some support for this.  However, this is
371 necessarily platform-specific.
372
373 \1f
374 File: libffi.info,  Node: The Closure API,  Next: Closure Example,  Prev: Multiple ABIs,  Up: Using libffi
375
376 2.5 The Closure API
377 ===================
378
379 `libffi' also provides a way to write a generic function - a function
380 that can accept and decode any combination of arguments.  This can be
381 useful when writing an interpreter, or to provide wrappers for
382 arbitrary functions.
383
384    This facility is called the "closure API".  Closures are not
385 supported on all platforms; you can check the `FFI_CLOSURES' define to
386 determine whether they are supported on the current platform.  
387
388    Because closures work by assembling a tiny function at runtime, they
389 require special allocation on platforms that have a non-executable
390 heap.  Memory management for closures is handled by a pair of functions:
391
392  -- Function: void *ffi_closure_alloc (size_t SIZE, void **CODE)
393      Allocate a chunk of memory holding SIZE bytes.  This returns a
394      pointer to the writable address, and sets *CODE to the
395      corresponding executable address.
396
397      SIZE should be sufficient to hold a `ffi_closure' object.
398
399  -- Function: void ffi_closure_free (void *WRITABLE)
400      Free memory allocated using `ffi_closure_alloc'.  The argument is
401      the writable address that was returned.
402
403    Once you have allocated the memory for a closure, you must construct
404 a `ffi_cif' describing the function call.  Finally you can prepare the
405 closure function:
406
407  -- Function: ffi_status ffi_prep_closure_loc (ffi_closure *CLOSURE,
408           ffi_cif *CIF, void (*FUN) (ffi_cif *CIF, void *RET, void
409           **ARGS, void *USER_DATA), void *USER_DATA, void *CODELOC)
410      Prepare a closure function.
411
412      CLOSURE is the address of a `ffi_closure' object; this is the
413      writable address returned by `ffi_closure_alloc'.
414
415      CIF is the `ffi_cif' describing the function parameters.
416
417      USER_DATA is an arbitrary datum that is passed, uninterpreted, to
418      your closure function.
419
420      CODELOC is the executable address returned by `ffi_closure_alloc'.
421
422      FUN is the function which will be called when the closure is
423      invoked.  It is called with the arguments:
424     CIF
425           The `ffi_cif' passed to `ffi_prep_closure_loc'.
426
427     RET
428           A pointer to the memory used for the function's return value.
429           FUN must fill this, unless the function is declared as
430           returning `void'.
431
432     ARGS
433           A vector of pointers to memory holding the arguments to the
434           function.
435
436     USER_DATA
437           The same USER_DATA that was passed to `ffi_prep_closure_loc'.
438
439      `ffi_prep_closure_loc' will return `FFI_OK' if everything went ok,
440      and something else on error.
441
442      After calling `ffi_prep_closure_loc', you can cast CODELOC to the
443      appropriate pointer-to-function type.
444
445    You may see old code referring to `ffi_prep_closure'.  This function
446 is deprecated, as it cannot handle the need for separate writable and
447 executable addresses.
448
449 \1f
450 File: libffi.info,  Node: Closure Example,  Prev: The Closure API,  Up: Using libffi
451
452 2.6 Closure Example
453 ===================
454
455 A trivial example that creates a new `puts' by binding `fputs' with
456 `stdin'.
457
458      #include <stdio.h>
459      #include <ffi.h>
460
461      /* Acts like puts with the file given at time of enclosure. */
462      void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[],
463                        FILE *stream)
464      {
465        *ret = fputs(*(char **)args[0], stream);
466      }
467
468      int main()
469      {
470        ffi_cif cif;
471        ffi_type *args[1];
472        ffi_closure *closure;
473
474        int (*bound_puts)(char *);
475        int rc;
476
477        /* Allocate closure and bound_puts */
478        closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);
479
480        if (closure)
481          {
482            /* Initialize the argument info vectors */
483            args[0] = &ffi_type_pointer;
484
485            /* Initialize the cif */
486            if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
487                             &ffi_type_uint, args) == FFI_OK)
488              {
489                /* Initialize the closure, setting stream to stdout */
490                if (ffi_prep_closure_loc(closure, &cif, puts_binding,
491                                         stdout, bound_puts) == FFI_OK)
492                  {
493                    rc = bound_puts("Hello World!");
494                    /* rc now holds the result of the call to fputs */
495                  }
496              }
497          }
498
499        /* Deallocate both closure, and bound_puts */
500        ffi_closure_free(closure);
501
502        return 0;
503      }
504
505 \1f
506 File: libffi.info,  Node: Missing Features,  Next: Index,  Prev: Using libffi,  Up: Top
507
508 3 Missing Features
509 ******************
510
511 `libffi' is missing a few features.  We welcome patches to add support
512 for these.
513
514    * There is no support for calling varargs functions.  This may work
515      on some platforms, depending on how the ABI is defined, but it is
516      not reliable.
517
518    * There is no support for bit fields in structures.
519
520    * The closure API is
521
522    * The "raw" API is undocumented.
523
524 \1f
525 File: libffi.info,  Node: Index,  Prev: Missing Features,  Up: Top
526
527 Index
528 *****
529
530 \0\b[index\0\b]
531 * Menu:
532
533 * :                                      Structures.           (line 12)
534 * ABI:                                   Introduction.         (line 13)
535 * Application Binary Interface:          Introduction.         (line 13)
536 * calling convention:                    Introduction.         (line 13)
537 * cif:                                   The Basics.           (line 14)
538 * closure API:                           The Closure API.      (line 13)
539 * closures:                              The Closure API.      (line 13)
540 * FFI:                                   Introduction.         (line 31)
541 * ffi_call:                              The Basics.           (line 41)
542 * ffi_closure_alloc:                     The Closure API.      (line 19)
543 * ffi_closure_free:                      The Closure API.      (line 26)
544 * FFI_CLOSURES:                          The Closure API.      (line 13)
545 * ffi_prep_cif:                          The Basics.           (line 16)
546 * ffi_prep_closure_loc:                  The Closure API.      (line 34)
547 * ffi_status <1>:                        The Closure API.      (line 37)
548 * ffi_status:                            The Basics.           (line 18)
549 * ffi_type:                              Structures.           (line 11)
550 * ffi_type_double:                       Primitive Types.      (line 41)
551 * ffi_type_float:                        Primitive Types.      (line 38)
552 * ffi_type_longdouble:                   Primitive Types.      (line 71)
553 * ffi_type_pointer:                      Primitive Types.      (line 75)
554 * ffi_type_schar:                        Primitive Types.      (line 47)
555 * ffi_type_sint:                         Primitive Types.      (line 62)
556 * ffi_type_sint16:                       Primitive Types.      (line 23)
557 * ffi_type_sint32:                       Primitive Types.      (line 29)
558 * ffi_type_sint64:                       Primitive Types.      (line 35)
559 * ffi_type_sint8:                        Primitive Types.      (line 17)
560 * ffi_type_slong:                        Primitive Types.      (line 68)
561 * ffi_type_sshort:                       Primitive Types.      (line 56)
562 * ffi_type_uchar:                        Primitive Types.      (line 44)
563 * ffi_type_uint:                         Primitive Types.      (line 59)
564 * ffi_type_uint16:                       Primitive Types.      (line 20)
565 * ffi_type_uint32:                       Primitive Types.      (line 26)
566 * ffi_type_uint64:                       Primitive Types.      (line 32)
567 * ffi_type_uint8:                        Primitive Types.      (line 14)
568 * ffi_type_ulong:                        Primitive Types.      (line 65)
569 * ffi_type_ushort:                       Primitive Types.      (line 53)
570 * ffi_type_void:                         Primitive Types.      (line 10)
571 * Foreign Function Interface:            Introduction.         (line 31)
572 * void <1>:                              The Closure API.      (line 20)
573 * void:                                  The Basics.           (line 43)
574
575
576 \1f
577 Tag Table:
578 Node: Top\7f706
579 Node: Introduction\7f1448
580 Node: Using libffi\7f3084
581 Node: The Basics\7f3570
582 Node: Simple Example\7f6356
583 Node: Types\7f7383
584 Node: Primitive Types\7f7666
585 Node: Structures\7f9486
586 Node: Type Example\7f10346
587 Node: Multiple ABIs\7f11569
588 Node: The Closure API\7f11940
589 Node: Closure Example\7f14884
590 Node: Missing Features\7f16443
591 Node: Index\7f16936
592 \1f
593 End Tag Table