xref: /aosp_15_r20/external/libffi/doc/libffi.texi (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan\input texinfo   @c -*-texinfo-*-
2*1fd5a2e1SPrashanth Swaminathan@c %**start of header
3*1fd5a2e1SPrashanth Swaminathan@setfilename libffi.info
4*1fd5a2e1SPrashanth Swaminathan@include version.texi
5*1fd5a2e1SPrashanth Swaminathan@settitle libffi: the portable foreign function interface library
6*1fd5a2e1SPrashanth Swaminathan@setchapternewpage off
7*1fd5a2e1SPrashanth Swaminathan@c %**end of header
8*1fd5a2e1SPrashanth Swaminathan
9*1fd5a2e1SPrashanth Swaminathan@c Merge the standard indexes into a single one.
10*1fd5a2e1SPrashanth Swaminathan@syncodeindex fn cp
11*1fd5a2e1SPrashanth Swaminathan@syncodeindex vr cp
12*1fd5a2e1SPrashanth Swaminathan@syncodeindex ky cp
13*1fd5a2e1SPrashanth Swaminathan@syncodeindex pg cp
14*1fd5a2e1SPrashanth Swaminathan@syncodeindex tp cp
15*1fd5a2e1SPrashanth Swaminathan
16*1fd5a2e1SPrashanth Swaminathan@copying
17*1fd5a2e1SPrashanth Swaminathan
18*1fd5a2e1SPrashanth SwaminathanThis manual is for libffi, a portable foreign function interface
19*1fd5a2e1SPrashanth Swaminathanlibrary.
20*1fd5a2e1SPrashanth Swaminathan
21*1fd5a2e1SPrashanth SwaminathanCopyright @copyright{} 2008--2019 Anthony Green and Red Hat, Inc.
22*1fd5a2e1SPrashanth Swaminathan
23*1fd5a2e1SPrashanth SwaminathanPermission is hereby granted, free of charge, to any person obtaining
24*1fd5a2e1SPrashanth Swaminathana copy of this software and associated documentation files (the
25*1fd5a2e1SPrashanth Swaminathan``Software''), to deal in the Software without restriction, including
26*1fd5a2e1SPrashanth Swaminathanwithout limitation the rights to use, copy, modify, merge, publish,
27*1fd5a2e1SPrashanth Swaminathandistribute, sublicense, and/or sell copies of the Software, and to
28*1fd5a2e1SPrashanth Swaminathanpermit persons to whom the Software is furnished to do so, subject to
29*1fd5a2e1SPrashanth Swaminathanthe following conditions:
30*1fd5a2e1SPrashanth Swaminathan
31*1fd5a2e1SPrashanth SwaminathanThe above copyright notice and this permission notice shall be
32*1fd5a2e1SPrashanth Swaminathanincluded in all copies or substantial portions of the Software.
33*1fd5a2e1SPrashanth Swaminathan
34*1fd5a2e1SPrashanth SwaminathanTHE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
35*1fd5a2e1SPrashanth SwaminathanEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
36*1fd5a2e1SPrashanth SwaminathanMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
37*1fd5a2e1SPrashanth SwaminathanIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
38*1fd5a2e1SPrashanth SwaminathanCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
39*1fd5a2e1SPrashanth SwaminathanTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
40*1fd5a2e1SPrashanth SwaminathanSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
41*1fd5a2e1SPrashanth Swaminathan
42*1fd5a2e1SPrashanth Swaminathan@end copying
43*1fd5a2e1SPrashanth Swaminathan
44*1fd5a2e1SPrashanth Swaminathan@dircategory Development
45*1fd5a2e1SPrashanth Swaminathan@direntry
46*1fd5a2e1SPrashanth Swaminathan* libffi: (libffi).             Portable foreign function interface library.
47*1fd5a2e1SPrashanth Swaminathan@end direntry
48*1fd5a2e1SPrashanth Swaminathan
49*1fd5a2e1SPrashanth Swaminathan@titlepage
50*1fd5a2e1SPrashanth Swaminathan@title libffi: a foreign function interface library
51*1fd5a2e1SPrashanth Swaminathan@subtitle For Version @value{VERSION} of libffi
52*1fd5a2e1SPrashanth Swaminathan@author Anthony Green
53*1fd5a2e1SPrashanth Swaminathan@page
54*1fd5a2e1SPrashanth Swaminathan@vskip 0pt plus 1filll
55*1fd5a2e1SPrashanth Swaminathan@insertcopying
56*1fd5a2e1SPrashanth Swaminathan@end titlepage
57*1fd5a2e1SPrashanth Swaminathan
58*1fd5a2e1SPrashanth Swaminathan
59*1fd5a2e1SPrashanth Swaminathan@ifnottex
60*1fd5a2e1SPrashanth Swaminathan@node Top
61*1fd5a2e1SPrashanth Swaminathan@top libffi
62*1fd5a2e1SPrashanth Swaminathan
63*1fd5a2e1SPrashanth Swaminathan@insertcopying
64*1fd5a2e1SPrashanth Swaminathan
65*1fd5a2e1SPrashanth Swaminathan@menu
66*1fd5a2e1SPrashanth Swaminathan* Introduction::                What is libffi?
67*1fd5a2e1SPrashanth Swaminathan* Using libffi::                How to use libffi.
68*1fd5a2e1SPrashanth Swaminathan* Missing Features::            Things libffi can't do.
69*1fd5a2e1SPrashanth Swaminathan* Index::                       Index.
70*1fd5a2e1SPrashanth Swaminathan@end menu
71*1fd5a2e1SPrashanth Swaminathan
72*1fd5a2e1SPrashanth Swaminathan@end ifnottex
73*1fd5a2e1SPrashanth Swaminathan
74*1fd5a2e1SPrashanth Swaminathan
75*1fd5a2e1SPrashanth Swaminathan@node Introduction
76*1fd5a2e1SPrashanth Swaminathan@chapter What is libffi?
77*1fd5a2e1SPrashanth Swaminathan
78*1fd5a2e1SPrashanth SwaminathanCompilers for high level languages generate code that follow certain
79*1fd5a2e1SPrashanth Swaminathanconventions.  These conventions are necessary, in part, for separate
80*1fd5a2e1SPrashanth Swaminathancompilation to work.  One such convention is the @dfn{calling
81*1fd5a2e1SPrashanth Swaminathanconvention}.  The calling convention is a set of assumptions made by
82*1fd5a2e1SPrashanth Swaminathanthe compiler about where function arguments will be found on entry to
83*1fd5a2e1SPrashanth Swaminathana function.  A calling convention also specifies where the return
84*1fd5a2e1SPrashanth Swaminathanvalue for a function is found.  The calling convention is also
85*1fd5a2e1SPrashanth Swaminathansometimes called the @dfn{ABI} or @dfn{Application Binary Interface}.
86*1fd5a2e1SPrashanth Swaminathan@cindex calling convention
87*1fd5a2e1SPrashanth Swaminathan@cindex ABI
88*1fd5a2e1SPrashanth Swaminathan@cindex Application Binary Interface
89*1fd5a2e1SPrashanth Swaminathan
90*1fd5a2e1SPrashanth SwaminathanSome programs may not know at the time of compilation what arguments
91*1fd5a2e1SPrashanth Swaminathanare to be passed to a function.  For instance, an interpreter may be
92*1fd5a2e1SPrashanth Swaminathantold at run-time about the number and types of arguments used to call
93*1fd5a2e1SPrashanth Swaminathana given function.  @samp{Libffi} can be used in such programs to
94*1fd5a2e1SPrashanth Swaminathanprovide a bridge from the interpreter program to compiled code.
95*1fd5a2e1SPrashanth Swaminathan
96*1fd5a2e1SPrashanth SwaminathanThe @samp{libffi} library provides a portable, high level programming
97*1fd5a2e1SPrashanth Swaminathaninterface to various calling conventions.  This allows a programmer to
98*1fd5a2e1SPrashanth Swaminathancall any function specified by a call interface description at run
99*1fd5a2e1SPrashanth Swaminathantime.
100*1fd5a2e1SPrashanth Swaminathan
101*1fd5a2e1SPrashanth Swaminathan@acronym{FFI} stands for Foreign Function Interface.  A foreign
102*1fd5a2e1SPrashanth Swaminathanfunction interface is the popular name for the interface that allows
103*1fd5a2e1SPrashanth Swaminathancode written in one language to call code written in another language.
104*1fd5a2e1SPrashanth SwaminathanThe @samp{libffi} library really only provides the lowest, machine
105*1fd5a2e1SPrashanth Swaminathandependent layer of a fully featured foreign function interface.  A
106*1fd5a2e1SPrashanth Swaminathanlayer must exist above @samp{libffi} that handles type conversions for
107*1fd5a2e1SPrashanth Swaminathanvalues passed between the two languages.
108*1fd5a2e1SPrashanth Swaminathan@cindex FFI
109*1fd5a2e1SPrashanth Swaminathan@cindex Foreign Function Interface
110*1fd5a2e1SPrashanth Swaminathan
111*1fd5a2e1SPrashanth Swaminathan
112*1fd5a2e1SPrashanth Swaminathan@node Using libffi
113*1fd5a2e1SPrashanth Swaminathan@chapter Using libffi
114*1fd5a2e1SPrashanth Swaminathan
115*1fd5a2e1SPrashanth Swaminathan@menu
116*1fd5a2e1SPrashanth Swaminathan* The Basics::                  The basic libffi API.
117*1fd5a2e1SPrashanth Swaminathan* Simple Example::              A simple example.
118*1fd5a2e1SPrashanth Swaminathan* Types::                       libffi type descriptions.
119*1fd5a2e1SPrashanth Swaminathan* Multiple ABIs::               Different passing styles on one platform.
120*1fd5a2e1SPrashanth Swaminathan* The Closure API::             Writing a generic function.
121*1fd5a2e1SPrashanth Swaminathan* Closure Example::             A closure example.
122*1fd5a2e1SPrashanth Swaminathan* Thread Safety::               Thread safety.
123*1fd5a2e1SPrashanth Swaminathan@end menu
124*1fd5a2e1SPrashanth Swaminathan
125*1fd5a2e1SPrashanth Swaminathan
126*1fd5a2e1SPrashanth Swaminathan@node The Basics
127*1fd5a2e1SPrashanth Swaminathan@section The Basics
128*1fd5a2e1SPrashanth Swaminathan
129*1fd5a2e1SPrashanth Swaminathan@samp{Libffi} assumes that you have a pointer to the function you wish
130*1fd5a2e1SPrashanth Swaminathanto call and that you know the number and types of arguments to pass
131*1fd5a2e1SPrashanth Swaminathanit, as well as the return type of the function.
132*1fd5a2e1SPrashanth Swaminathan
133*1fd5a2e1SPrashanth SwaminathanThe first thing you must do is create an @code{ffi_cif} object that
134*1fd5a2e1SPrashanth Swaminathanmatches the signature of the function you wish to call.  This is a
135*1fd5a2e1SPrashanth Swaminathanseparate step because it is common to make multiple calls using a
136*1fd5a2e1SPrashanth Swaminathansingle @code{ffi_cif}.  The @dfn{cif} in @code{ffi_cif} stands for
137*1fd5a2e1SPrashanth SwaminathanCall InterFace.  To prepare a call interface object, use the function
138*1fd5a2e1SPrashanth Swaminathan@code{ffi_prep_cif}.
139*1fd5a2e1SPrashanth Swaminathan@cindex cif
140*1fd5a2e1SPrashanth Swaminathan
141*1fd5a2e1SPrashanth Swaminathan@findex ffi_prep_cif
142*1fd5a2e1SPrashanth Swaminathan@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})
143*1fd5a2e1SPrashanth SwaminathanThis initializes @var{cif} according to the given parameters.
144*1fd5a2e1SPrashanth Swaminathan
145*1fd5a2e1SPrashanth Swaminathan@var{abi} is the ABI to use; normally @code{FFI_DEFAULT_ABI} is what
146*1fd5a2e1SPrashanth Swaminathanyou want.  @ref{Multiple ABIs} for more information.
147*1fd5a2e1SPrashanth Swaminathan
148*1fd5a2e1SPrashanth Swaminathan@var{nargs} is the number of arguments that this function accepts.
149*1fd5a2e1SPrashanth Swaminathan
150*1fd5a2e1SPrashanth Swaminathan@var{rtype} is a pointer to an @code{ffi_type} structure that
151*1fd5a2e1SPrashanth Swaminathandescribes the return type of the function.  @xref{Types}.
152*1fd5a2e1SPrashanth Swaminathan
153*1fd5a2e1SPrashanth Swaminathan@var{argtypes} is a vector of @code{ffi_type} pointers.
154*1fd5a2e1SPrashanth Swaminathan@var{argtypes} must have @var{nargs} elements.  If @var{nargs} is 0,
155*1fd5a2e1SPrashanth Swaminathanthis argument is ignored.
156*1fd5a2e1SPrashanth Swaminathan
157*1fd5a2e1SPrashanth Swaminathan@code{ffi_prep_cif} returns a @code{libffi} status code, of type
158*1fd5a2e1SPrashanth Swaminathan@code{ffi_status}.  This will be either @code{FFI_OK} if everything
159*1fd5a2e1SPrashanth Swaminathanworked properly; @code{FFI_BAD_TYPEDEF} if one of the @code{ffi_type}
160*1fd5a2e1SPrashanth Swaminathanobjects is incorrect; or @code{FFI_BAD_ABI} if the @var{abi} parameter
161*1fd5a2e1SPrashanth Swaminathanis invalid.
162*1fd5a2e1SPrashanth Swaminathan@end defun
163*1fd5a2e1SPrashanth Swaminathan
164*1fd5a2e1SPrashanth SwaminathanIf the function being called is variadic (varargs) then
165*1fd5a2e1SPrashanth Swaminathan@code{ffi_prep_cif_var} must be used instead of @code{ffi_prep_cif}.
166*1fd5a2e1SPrashanth Swaminathan
167*1fd5a2e1SPrashanth Swaminathan@findex ffi_prep_cif_var
168*1fd5a2e1SPrashanth Swaminathan@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})
169*1fd5a2e1SPrashanth SwaminathanThis initializes @var{cif} according to the given parameters for
170*1fd5a2e1SPrashanth Swaminathana call to a variadic function.  In general its operation is the
171*1fd5a2e1SPrashanth Swaminathansame as for @code{ffi_prep_cif} except that:
172*1fd5a2e1SPrashanth Swaminathan
173*1fd5a2e1SPrashanth Swaminathan@var{nfixedargs} is the number of fixed arguments, prior to any
174*1fd5a2e1SPrashanth Swaminathanvariadic arguments.  It must be greater than zero.
175*1fd5a2e1SPrashanth Swaminathan
176*1fd5a2e1SPrashanth Swaminathan@var{ntotalargs} the total number of arguments, including variadic
177*1fd5a2e1SPrashanth Swaminathanand fixed arguments.  @var{argtypes} must have this many elements.
178*1fd5a2e1SPrashanth Swaminathan
179*1fd5a2e1SPrashanth SwaminathanNote that, different cif's must be prepped for calls to the same
180*1fd5a2e1SPrashanth Swaminathanfunction when different numbers of arguments are passed.
181*1fd5a2e1SPrashanth Swaminathan
182*1fd5a2e1SPrashanth SwaminathanAlso note that a call to @code{ffi_prep_cif_var} with
183*1fd5a2e1SPrashanth Swaminathan@var{nfixedargs}=@var{nototalargs} is NOT equivalent to a call to
184*1fd5a2e1SPrashanth Swaminathan@code{ffi_prep_cif}.
185*1fd5a2e1SPrashanth Swaminathan
186*1fd5a2e1SPrashanth Swaminathan@end defun
187*1fd5a2e1SPrashanth Swaminathan
188*1fd5a2e1SPrashanth SwaminathanNote that the resulting @code{ffi_cif} holds pointers to all the
189*1fd5a2e1SPrashanth Swaminathan@code{ffi_type} objects that were used during initialization.  You
190*1fd5a2e1SPrashanth Swaminathanmust ensure that these type objects have a lifetime at least as long
191*1fd5a2e1SPrashanth Swaminathanas that of the @code{ffi_cif}.
192*1fd5a2e1SPrashanth Swaminathan
193*1fd5a2e1SPrashanth SwaminathanTo call a function using an initialized @code{ffi_cif}, use the
194*1fd5a2e1SPrashanth Swaminathan@code{ffi_call} function:
195*1fd5a2e1SPrashanth Swaminathan
196*1fd5a2e1SPrashanth Swaminathan@findex ffi_call
197*1fd5a2e1SPrashanth Swaminathan@defun void ffi_call (ffi_cif *@var{cif}, void *@var{fn}, void *@var{rvalue}, void **@var{avalues})
198*1fd5a2e1SPrashanth SwaminathanThis calls the function @var{fn} according to the description given in
199*1fd5a2e1SPrashanth Swaminathan@var{cif}.  @var{cif} must have already been prepared using
200*1fd5a2e1SPrashanth Swaminathan@code{ffi_prep_cif}.
201*1fd5a2e1SPrashanth Swaminathan
202*1fd5a2e1SPrashanth Swaminathan@var{rvalue} is a pointer to a chunk of memory that will hold the
203*1fd5a2e1SPrashanth Swaminathanresult of the function call.  This must be large enough to hold the
204*1fd5a2e1SPrashanth Swaminathanresult, no smaller than the system register size (generally 32 or 64
205*1fd5a2e1SPrashanth Swaminathanbits), and must be suitably aligned; it is the caller's responsibility
206*1fd5a2e1SPrashanth Swaminathanto ensure this.  If @var{cif} declares that the function returns
207*1fd5a2e1SPrashanth Swaminathan@code{void} (using @code{ffi_type_void}), then @var{rvalue} is
208*1fd5a2e1SPrashanth Swaminathanignored.
209*1fd5a2e1SPrashanth Swaminathan
210*1fd5a2e1SPrashanth SwaminathanIn most situations, @samp{libffi} will handle promotion according to
211*1fd5a2e1SPrashanth Swaminathanthe ABI.  However, for historical reasons, there is a special case
212*1fd5a2e1SPrashanth Swaminathanwith return values that must be handled by your code.  In particular,
213*1fd5a2e1SPrashanth Swaminathanfor integral (not @code{struct}) types that are narrower than the
214*1fd5a2e1SPrashanth Swaminathansystem register size, the return value will be widened by
215*1fd5a2e1SPrashanth Swaminathan@samp{libffi}.  @samp{libffi} provides a type, @code{ffi_arg}, that
216*1fd5a2e1SPrashanth Swaminathancan be used as the return type.  For example, if the CIF was defined
217*1fd5a2e1SPrashanth Swaminathanwith a return type of @code{char}, @samp{libffi} will try to store a
218*1fd5a2e1SPrashanth Swaminathanfull @code{ffi_arg} into the return value.
219*1fd5a2e1SPrashanth Swaminathan
220*1fd5a2e1SPrashanth Swaminathan@var{avalues} is a vector of @code{void *} pointers that point to the
221*1fd5a2e1SPrashanth Swaminathanmemory locations holding the argument values for a call.  If @var{cif}
222*1fd5a2e1SPrashanth Swaminathandeclares that the function has no arguments (i.e., @var{nargs} was 0),
223*1fd5a2e1SPrashanth Swaminathanthen @var{avalues} is ignored.  Note that argument values may be
224*1fd5a2e1SPrashanth Swaminathanmodified by the callee (for instance, structs passed by value); the
225*1fd5a2e1SPrashanth Swaminathanburden of copying pass-by-value arguments is placed on the caller.
226*1fd5a2e1SPrashanth Swaminathan
227*1fd5a2e1SPrashanth SwaminathanNote that while the return value must be register-sized, arguments
228*1fd5a2e1SPrashanth Swaminathanshould exactly match their declared type.  For example, if an argument
229*1fd5a2e1SPrashanth Swaminathanis a @code{short}, then the entry in @var{avalues} should point to an
230*1fd5a2e1SPrashanth Swaminathanobject declared as @code{short}; but if the return type is
231*1fd5a2e1SPrashanth Swaminathan@code{short}, then @var{rvalue} should point to an object declared as
232*1fd5a2e1SPrashanth Swaminathana larger type -- usually @code{ffi_arg}.
233*1fd5a2e1SPrashanth Swaminathan@end defun
234*1fd5a2e1SPrashanth Swaminathan
235*1fd5a2e1SPrashanth Swaminathan
236*1fd5a2e1SPrashanth Swaminathan@node Simple Example
237*1fd5a2e1SPrashanth Swaminathan@section Simple Example
238*1fd5a2e1SPrashanth Swaminathan
239*1fd5a2e1SPrashanth SwaminathanHere is a trivial example that calls @code{puts} a few times.
240*1fd5a2e1SPrashanth Swaminathan
241*1fd5a2e1SPrashanth Swaminathan@example
242*1fd5a2e1SPrashanth Swaminathan#include <stdio.h>
243*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
244*1fd5a2e1SPrashanth Swaminathan
245*1fd5a2e1SPrashanth Swaminathanint main()
246*1fd5a2e1SPrashanth Swaminathan@{
247*1fd5a2e1SPrashanth Swaminathan  ffi_cif cif;
248*1fd5a2e1SPrashanth Swaminathan  ffi_type *args[1];
249*1fd5a2e1SPrashanth Swaminathan  void *values[1];
250*1fd5a2e1SPrashanth Swaminathan  char *s;
251*1fd5a2e1SPrashanth Swaminathan  ffi_arg rc;
252*1fd5a2e1SPrashanth Swaminathan
253*1fd5a2e1SPrashanth Swaminathan  /* Initialize the argument info vectors */
254*1fd5a2e1SPrashanth Swaminathan  args[0] = &ffi_type_pointer;
255*1fd5a2e1SPrashanth Swaminathan  values[0] = &s;
256*1fd5a2e1SPrashanth Swaminathan
257*1fd5a2e1SPrashanth Swaminathan  /* Initialize the cif */
258*1fd5a2e1SPrashanth Swaminathan  if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
259*1fd5a2e1SPrashanth Swaminathan		       &ffi_type_sint, args) == FFI_OK)
260*1fd5a2e1SPrashanth Swaminathan    @{
261*1fd5a2e1SPrashanth Swaminathan      s = "Hello World!";
262*1fd5a2e1SPrashanth Swaminathan      ffi_call(&cif, puts, &rc, values);
263*1fd5a2e1SPrashanth Swaminathan      /* rc now holds the result of the call to puts */
264*1fd5a2e1SPrashanth Swaminathan
265*1fd5a2e1SPrashanth Swaminathan      /* values holds a pointer to the function's arg, so to
266*1fd5a2e1SPrashanth Swaminathan         call puts() again all we need to do is change the
267*1fd5a2e1SPrashanth Swaminathan         value of s */
268*1fd5a2e1SPrashanth Swaminathan      s = "This is cool!";
269*1fd5a2e1SPrashanth Swaminathan      ffi_call(&cif, puts, &rc, values);
270*1fd5a2e1SPrashanth Swaminathan    @}
271*1fd5a2e1SPrashanth Swaminathan
272*1fd5a2e1SPrashanth Swaminathan  return 0;
273*1fd5a2e1SPrashanth Swaminathan@}
274*1fd5a2e1SPrashanth Swaminathan@end example
275*1fd5a2e1SPrashanth Swaminathan
276*1fd5a2e1SPrashanth Swaminathan
277*1fd5a2e1SPrashanth Swaminathan@node Types
278*1fd5a2e1SPrashanth Swaminathan@section Types
279*1fd5a2e1SPrashanth Swaminathan
280*1fd5a2e1SPrashanth Swaminathan@menu
281*1fd5a2e1SPrashanth Swaminathan* Primitive Types::             Built-in types.
282*1fd5a2e1SPrashanth Swaminathan* Structures::                  Structure types.
283*1fd5a2e1SPrashanth Swaminathan* Size and Alignment::          Size and alignment of types.
284*1fd5a2e1SPrashanth Swaminathan* Arrays Unions Enums::         Arrays, unions, and enumerations.
285*1fd5a2e1SPrashanth Swaminathan* Type Example::                Structure type example.
286*1fd5a2e1SPrashanth Swaminathan* Complex::                     Complex types.
287*1fd5a2e1SPrashanth Swaminathan* Complex Type Example::        Complex type example.
288*1fd5a2e1SPrashanth Swaminathan@end menu
289*1fd5a2e1SPrashanth Swaminathan
290*1fd5a2e1SPrashanth Swaminathan@node Primitive Types
291*1fd5a2e1SPrashanth Swaminathan@subsection Primitive Types
292*1fd5a2e1SPrashanth Swaminathan
293*1fd5a2e1SPrashanth Swaminathan@code{Libffi} provides a number of built-in type descriptors that can
294*1fd5a2e1SPrashanth Swaminathanbe used to describe argument and return types:
295*1fd5a2e1SPrashanth Swaminathan
296*1fd5a2e1SPrashanth Swaminathan@table @code
297*1fd5a2e1SPrashanth Swaminathan@item ffi_type_void
298*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_void
299*1fd5a2e1SPrashanth SwaminathanThe type @code{void}.  This cannot be used for argument types, only
300*1fd5a2e1SPrashanth Swaminathanfor return values.
301*1fd5a2e1SPrashanth Swaminathan
302*1fd5a2e1SPrashanth Swaminathan@item ffi_type_uint8
303*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_uint8
304*1fd5a2e1SPrashanth SwaminathanAn unsigned, 8-bit integer type.
305*1fd5a2e1SPrashanth Swaminathan
306*1fd5a2e1SPrashanth Swaminathan@item ffi_type_sint8
307*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_sint8
308*1fd5a2e1SPrashanth SwaminathanA signed, 8-bit integer type.
309*1fd5a2e1SPrashanth Swaminathan
310*1fd5a2e1SPrashanth Swaminathan@item ffi_type_uint16
311*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_uint16
312*1fd5a2e1SPrashanth SwaminathanAn unsigned, 16-bit integer type.
313*1fd5a2e1SPrashanth Swaminathan
314*1fd5a2e1SPrashanth Swaminathan@item ffi_type_sint16
315*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_sint16
316*1fd5a2e1SPrashanth SwaminathanA signed, 16-bit integer type.
317*1fd5a2e1SPrashanth Swaminathan
318*1fd5a2e1SPrashanth Swaminathan@item ffi_type_uint32
319*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_uint32
320*1fd5a2e1SPrashanth SwaminathanAn unsigned, 32-bit integer type.
321*1fd5a2e1SPrashanth Swaminathan
322*1fd5a2e1SPrashanth Swaminathan@item ffi_type_sint32
323*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_sint32
324*1fd5a2e1SPrashanth SwaminathanA signed, 32-bit integer type.
325*1fd5a2e1SPrashanth Swaminathan
326*1fd5a2e1SPrashanth Swaminathan@item ffi_type_uint64
327*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_uint64
328*1fd5a2e1SPrashanth SwaminathanAn unsigned, 64-bit integer type.
329*1fd5a2e1SPrashanth Swaminathan
330*1fd5a2e1SPrashanth Swaminathan@item ffi_type_sint64
331*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_sint64
332*1fd5a2e1SPrashanth SwaminathanA signed, 64-bit integer type.
333*1fd5a2e1SPrashanth Swaminathan
334*1fd5a2e1SPrashanth Swaminathan@item ffi_type_float
335*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_float
336*1fd5a2e1SPrashanth SwaminathanThe C @code{float} type.
337*1fd5a2e1SPrashanth Swaminathan
338*1fd5a2e1SPrashanth Swaminathan@item ffi_type_double
339*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_double
340*1fd5a2e1SPrashanth SwaminathanThe C @code{double} type.
341*1fd5a2e1SPrashanth Swaminathan
342*1fd5a2e1SPrashanth Swaminathan@item ffi_type_uchar
343*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_uchar
344*1fd5a2e1SPrashanth SwaminathanThe C @code{unsigned char} type.
345*1fd5a2e1SPrashanth Swaminathan
346*1fd5a2e1SPrashanth Swaminathan@item ffi_type_schar
347*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_schar
348*1fd5a2e1SPrashanth SwaminathanThe C @code{signed char} type.  (Note that there is not an exact
349*1fd5a2e1SPrashanth Swaminathanequivalent to the C @code{char} type in @code{libffi}; ordinarily you
350*1fd5a2e1SPrashanth Swaminathanshould either use @code{ffi_type_schar} or @code{ffi_type_uchar}
351*1fd5a2e1SPrashanth Swaminathandepending on whether @code{char} is signed.)
352*1fd5a2e1SPrashanth Swaminathan
353*1fd5a2e1SPrashanth Swaminathan@item ffi_type_ushort
354*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_ushort
355*1fd5a2e1SPrashanth SwaminathanThe C @code{unsigned short} type.
356*1fd5a2e1SPrashanth Swaminathan
357*1fd5a2e1SPrashanth Swaminathan@item ffi_type_sshort
358*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_sshort
359*1fd5a2e1SPrashanth SwaminathanThe C @code{short} type.
360*1fd5a2e1SPrashanth Swaminathan
361*1fd5a2e1SPrashanth Swaminathan@item ffi_type_uint
362*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_uint
363*1fd5a2e1SPrashanth SwaminathanThe C @code{unsigned int} type.
364*1fd5a2e1SPrashanth Swaminathan
365*1fd5a2e1SPrashanth Swaminathan@item ffi_type_sint
366*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_sint
367*1fd5a2e1SPrashanth SwaminathanThe C @code{int} type.
368*1fd5a2e1SPrashanth Swaminathan
369*1fd5a2e1SPrashanth Swaminathan@item ffi_type_ulong
370*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_ulong
371*1fd5a2e1SPrashanth SwaminathanThe C @code{unsigned long} type.
372*1fd5a2e1SPrashanth Swaminathan
373*1fd5a2e1SPrashanth Swaminathan@item ffi_type_slong
374*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_slong
375*1fd5a2e1SPrashanth SwaminathanThe C @code{long} type.
376*1fd5a2e1SPrashanth Swaminathan
377*1fd5a2e1SPrashanth Swaminathan@item ffi_type_longdouble
378*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_longdouble
379*1fd5a2e1SPrashanth SwaminathanOn platforms that have a C @code{long double} type, this is defined.
380*1fd5a2e1SPrashanth SwaminathanOn other platforms, it is not.
381*1fd5a2e1SPrashanth Swaminathan
382*1fd5a2e1SPrashanth Swaminathan@item ffi_type_pointer
383*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_pointer
384*1fd5a2e1SPrashanth SwaminathanA generic @code{void *} pointer.  You should use this for all
385*1fd5a2e1SPrashanth Swaminathanpointers, regardless of their real type.
386*1fd5a2e1SPrashanth Swaminathan
387*1fd5a2e1SPrashanth Swaminathan@item ffi_type_complex_float
388*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_complex_float
389*1fd5a2e1SPrashanth SwaminathanThe C @code{_Complex float} type.
390*1fd5a2e1SPrashanth Swaminathan
391*1fd5a2e1SPrashanth Swaminathan@item ffi_type_complex_double
392*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_complex_double
393*1fd5a2e1SPrashanth SwaminathanThe C @code{_Complex double} type.
394*1fd5a2e1SPrashanth Swaminathan
395*1fd5a2e1SPrashanth Swaminathan@item ffi_type_complex_longdouble
396*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type_complex_longdouble
397*1fd5a2e1SPrashanth SwaminathanThe C @code{_Complex long double} type.
398*1fd5a2e1SPrashanth SwaminathanOn platforms that have a C @code{long double} type, this is defined.
399*1fd5a2e1SPrashanth SwaminathanOn other platforms, it is not.
400*1fd5a2e1SPrashanth Swaminathan@end table
401*1fd5a2e1SPrashanth Swaminathan
402*1fd5a2e1SPrashanth SwaminathanEach of these is of type @code{ffi_type}, so you must take the address
403*1fd5a2e1SPrashanth Swaminathanwhen passing to @code{ffi_prep_cif}.
404*1fd5a2e1SPrashanth Swaminathan
405*1fd5a2e1SPrashanth Swaminathan
406*1fd5a2e1SPrashanth Swaminathan@node Structures
407*1fd5a2e1SPrashanth Swaminathan@subsection Structures
408*1fd5a2e1SPrashanth Swaminathan
409*1fd5a2e1SPrashanth Swaminathan@samp{libffi} is perfectly happy passing structures back and forth.
410*1fd5a2e1SPrashanth SwaminathanYou must first describe the structure to @samp{libffi} by creating a
411*1fd5a2e1SPrashanth Swaminathannew @code{ffi_type} object for it.
412*1fd5a2e1SPrashanth Swaminathan
413*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type
414*1fd5a2e1SPrashanth Swaminathan@deftp {Data type} ffi_type
415*1fd5a2e1SPrashanth SwaminathanThe @code{ffi_type} has the following members:
416*1fd5a2e1SPrashanth Swaminathan@table @code
417*1fd5a2e1SPrashanth Swaminathan@item size_t size
418*1fd5a2e1SPrashanth SwaminathanThis is set by @code{libffi}; you should initialize it to zero.
419*1fd5a2e1SPrashanth Swaminathan
420*1fd5a2e1SPrashanth Swaminathan@item unsigned short alignment
421*1fd5a2e1SPrashanth SwaminathanThis is set by @code{libffi}; you should initialize it to zero.
422*1fd5a2e1SPrashanth Swaminathan
423*1fd5a2e1SPrashanth Swaminathan@item unsigned short type
424*1fd5a2e1SPrashanth SwaminathanFor a structure, this should be set to @code{FFI_TYPE_STRUCT}.
425*1fd5a2e1SPrashanth Swaminathan
426*1fd5a2e1SPrashanth Swaminathan@item ffi_type **elements
427*1fd5a2e1SPrashanth SwaminathanThis is a @samp{NULL}-terminated array of pointers to @code{ffi_type}
428*1fd5a2e1SPrashanth Swaminathanobjects.  There is one element per field of the struct.
429*1fd5a2e1SPrashanth Swaminathan
430*1fd5a2e1SPrashanth SwaminathanNote that @samp{libffi} has no special support for bit-fields.  You
431*1fd5a2e1SPrashanth Swaminathanmust manage these manually.
432*1fd5a2e1SPrashanth Swaminathan@end table
433*1fd5a2e1SPrashanth Swaminathan@end deftp
434*1fd5a2e1SPrashanth Swaminathan
435*1fd5a2e1SPrashanth SwaminathanThe @code{size} and @code{alignment} fields will be filled in by
436*1fd5a2e1SPrashanth Swaminathan@code{ffi_prep_cif} or @code{ffi_prep_cif_var}, as needed.
437*1fd5a2e1SPrashanth Swaminathan
438*1fd5a2e1SPrashanth Swaminathan@node Size and Alignment
439*1fd5a2e1SPrashanth Swaminathan@subsection Size and Alignment
440*1fd5a2e1SPrashanth Swaminathan
441*1fd5a2e1SPrashanth Swaminathan@code{libffi} will set the @code{size} and @code{alignment} fields of
442*1fd5a2e1SPrashanth Swaminathanan @code{ffi_type} object for you.  It does so using its knowledge of
443*1fd5a2e1SPrashanth Swaminathanthe ABI.
444*1fd5a2e1SPrashanth Swaminathan
445*1fd5a2e1SPrashanth SwaminathanYou might expect that you can simply read these fields for a type that
446*1fd5a2e1SPrashanth Swaminathanhas been laid out by @code{libffi}.  However, there are some caveats.
447*1fd5a2e1SPrashanth Swaminathan
448*1fd5a2e1SPrashanth Swaminathan@itemize @bullet
449*1fd5a2e1SPrashanth Swaminathan@item
450*1fd5a2e1SPrashanth SwaminathanThe size or alignment of some of the built-in types may vary depending
451*1fd5a2e1SPrashanth Swaminathanon the chosen ABI.
452*1fd5a2e1SPrashanth Swaminathan
453*1fd5a2e1SPrashanth Swaminathan@item
454*1fd5a2e1SPrashanth SwaminathanThe size and alignment of a new structure type will not be set by
455*1fd5a2e1SPrashanth Swaminathan@code{libffi} until it has been passed to @code{ffi_prep_cif} or
456*1fd5a2e1SPrashanth Swaminathan@code{ffi_get_struct_offsets}.
457*1fd5a2e1SPrashanth Swaminathan
458*1fd5a2e1SPrashanth Swaminathan@item
459*1fd5a2e1SPrashanth SwaminathanA structure type cannot be shared across ABIs.  Instead each ABI needs
460*1fd5a2e1SPrashanth Swaminathanits own copy of the structure type.
461*1fd5a2e1SPrashanth Swaminathan@end itemize
462*1fd5a2e1SPrashanth Swaminathan
463*1fd5a2e1SPrashanth SwaminathanSo, before examining these fields, it is safest to pass the
464*1fd5a2e1SPrashanth Swaminathan@code{ffi_type} object to @code{ffi_prep_cif} or
465*1fd5a2e1SPrashanth Swaminathan@code{ffi_get_struct_offsets} first.  This function will do all the
466*1fd5a2e1SPrashanth Swaminathanneeded setup.
467*1fd5a2e1SPrashanth Swaminathan
468*1fd5a2e1SPrashanth Swaminathan@example
469*1fd5a2e1SPrashanth Swaminathanffi_type *desired_type;
470*1fd5a2e1SPrashanth Swaminathanffi_abi desired_abi;
471*1fd5a2e1SPrashanth Swaminathan@dots{}
472*1fd5a2e1SPrashanth Swaminathanffi_cif cif;
473*1fd5a2e1SPrashanth Swaminathanif (ffi_prep_cif (&cif, desired_abi, 0, desired_type, NULL) == FFI_OK)
474*1fd5a2e1SPrashanth Swaminathan  @{
475*1fd5a2e1SPrashanth Swaminathan    size_t size = desired_type->size;
476*1fd5a2e1SPrashanth Swaminathan    unsigned short alignment = desired_type->alignment;
477*1fd5a2e1SPrashanth Swaminathan  @}
478*1fd5a2e1SPrashanth Swaminathan@end example
479*1fd5a2e1SPrashanth Swaminathan
480*1fd5a2e1SPrashanth Swaminathan@code{libffi} also provides a way to get the offsets of the members of
481*1fd5a2e1SPrashanth Swaminathana structure.
482*1fd5a2e1SPrashanth Swaminathan
483*1fd5a2e1SPrashanth Swaminathan@findex ffi_get_struct_offsets
484*1fd5a2e1SPrashanth Swaminathan@defun ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets)
485*1fd5a2e1SPrashanth SwaminathanCompute the offset of each element of the given structure type.
486*1fd5a2e1SPrashanth Swaminathan@var{abi} is the ABI to use; this is needed because in some cases the
487*1fd5a2e1SPrashanth Swaminathanlayout depends on the ABI.
488*1fd5a2e1SPrashanth Swaminathan
489*1fd5a2e1SPrashanth Swaminathan@var{offsets} is an out parameter.  The caller is responsible for
490*1fd5a2e1SPrashanth Swaminathanproviding enough space for all the results to be written -- one
491*1fd5a2e1SPrashanth Swaminathanelement per element type in @var{struct_type}.  If @var{offsets} is
492*1fd5a2e1SPrashanth Swaminathan@code{NULL}, then the type will be laid out but not otherwise
493*1fd5a2e1SPrashanth Swaminathanmodified.  This can be useful for accessing the type's size or layout,
494*1fd5a2e1SPrashanth Swaminathanas mentioned above.
495*1fd5a2e1SPrashanth Swaminathan
496*1fd5a2e1SPrashanth SwaminathanThis function returns @code{FFI_OK} on success; @code{FFI_BAD_ABI} if
497*1fd5a2e1SPrashanth Swaminathan@var{abi} is invalid; or @code{FFI_BAD_TYPEDEF} if @var{struct_type}
498*1fd5a2e1SPrashanth Swaminathanis invalid in some way.  Note that only @code{FFI_STRUCT} types are
499*1fd5a2e1SPrashanth Swaminathanvalid here.
500*1fd5a2e1SPrashanth Swaminathan@end defun
501*1fd5a2e1SPrashanth Swaminathan
502*1fd5a2e1SPrashanth Swaminathan@node Arrays Unions Enums
503*1fd5a2e1SPrashanth Swaminathan@subsection Arrays, Unions, and Enumerations
504*1fd5a2e1SPrashanth Swaminathan
505*1fd5a2e1SPrashanth Swaminathan@subsubsection Arrays
506*1fd5a2e1SPrashanth Swaminathan
507*1fd5a2e1SPrashanth Swaminathan@samp{libffi} does not have direct support for arrays or unions.
508*1fd5a2e1SPrashanth SwaminathanHowever, they can be emulated using structures.
509*1fd5a2e1SPrashanth Swaminathan
510*1fd5a2e1SPrashanth SwaminathanTo emulate an array, simply create an @code{ffi_type} using
511*1fd5a2e1SPrashanth Swaminathan@code{FFI_TYPE_STRUCT} with as many members as there are elements in
512*1fd5a2e1SPrashanth Swaminathanthe array.
513*1fd5a2e1SPrashanth Swaminathan
514*1fd5a2e1SPrashanth Swaminathan@example
515*1fd5a2e1SPrashanth Swaminathanffi_type array_type;
516*1fd5a2e1SPrashanth Swaminathanffi_type **elements
517*1fd5a2e1SPrashanth Swaminathanint i;
518*1fd5a2e1SPrashanth Swaminathan
519*1fd5a2e1SPrashanth Swaminathanelements = malloc ((n + 1) * sizeof (ffi_type *));
520*1fd5a2e1SPrashanth Swaminathanfor (i = 0; i < n; ++i)
521*1fd5a2e1SPrashanth Swaminathan  elements[i] = array_element_type;
522*1fd5a2e1SPrashanth Swaminathanelements[n] = NULL;
523*1fd5a2e1SPrashanth Swaminathan
524*1fd5a2e1SPrashanth Swaminathanarray_type.size = array_type.alignment = 0;
525*1fd5a2e1SPrashanth Swaminathanarray_type.type = FFI_TYPE_STRUCT;
526*1fd5a2e1SPrashanth Swaminathanarray_type.elements = elements;
527*1fd5a2e1SPrashanth Swaminathan@end example
528*1fd5a2e1SPrashanth Swaminathan
529*1fd5a2e1SPrashanth SwaminathanNote that arrays cannot be passed or returned by value in C --
530*1fd5a2e1SPrashanth Swaminathanstructure types created like this should only be used to refer to
531*1fd5a2e1SPrashanth Swaminathanmembers of real @code{FFI_TYPE_STRUCT} objects.
532*1fd5a2e1SPrashanth Swaminathan
533*1fd5a2e1SPrashanth SwaminathanHowever, a phony array type like this will not cause any errors from
534*1fd5a2e1SPrashanth Swaminathan@samp{libffi} if you use it as an argument or return type.  This may
535*1fd5a2e1SPrashanth Swaminathanbe confusing.
536*1fd5a2e1SPrashanth Swaminathan
537*1fd5a2e1SPrashanth Swaminathan@subsubsection Unions
538*1fd5a2e1SPrashanth Swaminathan
539*1fd5a2e1SPrashanth SwaminathanA union can also be emulated using @code{FFI_TYPE_STRUCT}.  In this
540*1fd5a2e1SPrashanth Swaminathancase, however, you must make sure that the size and alignment match
541*1fd5a2e1SPrashanth Swaminathanthe real requirements of the union.
542*1fd5a2e1SPrashanth Swaminathan
543*1fd5a2e1SPrashanth SwaminathanOne simple way to do this is to ensue that each element type is laid
544*1fd5a2e1SPrashanth Swaminathanout.  Then, give the new structure type a single element; the size of
545*1fd5a2e1SPrashanth Swaminathanthe largest element; and the largest alignment seen as well.
546*1fd5a2e1SPrashanth Swaminathan
547*1fd5a2e1SPrashanth SwaminathanThis example uses the @code{ffi_prep_cif} trick to ensure that each
548*1fd5a2e1SPrashanth Swaminathanelement type is laid out.
549*1fd5a2e1SPrashanth Swaminathan
550*1fd5a2e1SPrashanth Swaminathan@example
551*1fd5a2e1SPrashanth Swaminathanffi_abi desired_abi;
552*1fd5a2e1SPrashanth Swaminathanffi_type union_type;
553*1fd5a2e1SPrashanth Swaminathanffi_type **union_elements;
554*1fd5a2e1SPrashanth Swaminathan
555*1fd5a2e1SPrashanth Swaminathanint i;
556*1fd5a2e1SPrashanth Swaminathanffi_type element_types[2];
557*1fd5a2e1SPrashanth Swaminathan
558*1fd5a2e1SPrashanth Swaminathanelement_types[1] = NULL;
559*1fd5a2e1SPrashanth Swaminathan
560*1fd5a2e1SPrashanth Swaminathanunion_type.size = union_type.alignment = 0;
561*1fd5a2e1SPrashanth Swaminathanunion_type.type = FFI_TYPE_STRUCT;
562*1fd5a2e1SPrashanth Swaminathanunion_type.elements = element_types;
563*1fd5a2e1SPrashanth Swaminathan
564*1fd5a2e1SPrashanth Swaminathanfor (i = 0; union_elements[i]; ++i)
565*1fd5a2e1SPrashanth Swaminathan  @{
566*1fd5a2e1SPrashanth Swaminathan    ffi_cif cif;
567*1fd5a2e1SPrashanth Swaminathan    if (ffi_prep_cif (&cif, desired_abi, 0, union_elements[i], NULL) == FFI_OK)
568*1fd5a2e1SPrashanth Swaminathan      @{
569*1fd5a2e1SPrashanth Swaminathan        if (union_elements[i]->size > union_type.size)
570*1fd5a2e1SPrashanth Swaminathan          @{
571*1fd5a2e1SPrashanth Swaminathan            union_type.size = union_elements[i];
572*1fd5a2e1SPrashanth Swaminathan            size = union_elements[i]->size;
573*1fd5a2e1SPrashanth Swaminathan          @}
574*1fd5a2e1SPrashanth Swaminathan        if (union_elements[i]->alignment > union_type.alignment)
575*1fd5a2e1SPrashanth Swaminathan          union_type.alignment = union_elements[i]->alignment;
576*1fd5a2e1SPrashanth Swaminathan      @}
577*1fd5a2e1SPrashanth Swaminathan  @}
578*1fd5a2e1SPrashanth Swaminathan@end example
579*1fd5a2e1SPrashanth Swaminathan
580*1fd5a2e1SPrashanth Swaminathan@subsubsection Enumerations
581*1fd5a2e1SPrashanth Swaminathan
582*1fd5a2e1SPrashanth Swaminathan@code{libffi} does not have any special support for C @code{enum}s.
583*1fd5a2e1SPrashanth SwaminathanAlthough any given @code{enum} is implemented using a specific
584*1fd5a2e1SPrashanth Swaminathanunderlying integral type, exactly which type will be used cannot be
585*1fd5a2e1SPrashanth Swaminathandetermined by @code{libffi} -- it may depend on the values in the
586*1fd5a2e1SPrashanth Swaminathanenumeration or on compiler flags such as @option{-fshort-enums}.
587*1fd5a2e1SPrashanth Swaminathan@xref{Structures unions enumerations and bit-fields implementation, , , gcc},
588*1fd5a2e1SPrashanth Swaminathanfor more information about how GCC handles enumerations.
589*1fd5a2e1SPrashanth Swaminathan
590*1fd5a2e1SPrashanth Swaminathan@node Type Example
591*1fd5a2e1SPrashanth Swaminathan@subsection Type Example
592*1fd5a2e1SPrashanth Swaminathan
593*1fd5a2e1SPrashanth SwaminathanThe following example initializes a @code{ffi_type} object
594*1fd5a2e1SPrashanth Swaminathanrepresenting the @code{tm} struct from Linux's @file{time.h}.
595*1fd5a2e1SPrashanth Swaminathan
596*1fd5a2e1SPrashanth SwaminathanHere is how the struct is defined:
597*1fd5a2e1SPrashanth Swaminathan
598*1fd5a2e1SPrashanth Swaminathan@example
599*1fd5a2e1SPrashanth Swaminathanstruct tm @{
600*1fd5a2e1SPrashanth Swaminathan    int tm_sec;
601*1fd5a2e1SPrashanth Swaminathan    int tm_min;
602*1fd5a2e1SPrashanth Swaminathan    int tm_hour;
603*1fd5a2e1SPrashanth Swaminathan    int tm_mday;
604*1fd5a2e1SPrashanth Swaminathan    int tm_mon;
605*1fd5a2e1SPrashanth Swaminathan    int tm_year;
606*1fd5a2e1SPrashanth Swaminathan    int tm_wday;
607*1fd5a2e1SPrashanth Swaminathan    int tm_yday;
608*1fd5a2e1SPrashanth Swaminathan    int tm_isdst;
609*1fd5a2e1SPrashanth Swaminathan    /* Those are for future use. */
610*1fd5a2e1SPrashanth Swaminathan    long int __tm_gmtoff__;
611*1fd5a2e1SPrashanth Swaminathan    __const char *__tm_zone__;
612*1fd5a2e1SPrashanth Swaminathan@};
613*1fd5a2e1SPrashanth Swaminathan@end example
614*1fd5a2e1SPrashanth Swaminathan
615*1fd5a2e1SPrashanth SwaminathanHere is the corresponding code to describe this struct to
616*1fd5a2e1SPrashanth Swaminathan@code{libffi}:
617*1fd5a2e1SPrashanth Swaminathan
618*1fd5a2e1SPrashanth Swaminathan@example
619*1fd5a2e1SPrashanth Swaminathan    @{
620*1fd5a2e1SPrashanth Swaminathan      ffi_type tm_type;
621*1fd5a2e1SPrashanth Swaminathan      ffi_type *tm_type_elements[12];
622*1fd5a2e1SPrashanth Swaminathan      int i;
623*1fd5a2e1SPrashanth Swaminathan
624*1fd5a2e1SPrashanth Swaminathan      tm_type.size = tm_type.alignment = 0;
625*1fd5a2e1SPrashanth Swaminathan      tm_type.type = FFI_TYPE_STRUCT;
626*1fd5a2e1SPrashanth Swaminathan      tm_type.elements = &tm_type_elements;
627*1fd5a2e1SPrashanth Swaminathan
628*1fd5a2e1SPrashanth Swaminathan      for (i = 0; i < 9; i++)
629*1fd5a2e1SPrashanth Swaminathan          tm_type_elements[i] = &ffi_type_sint;
630*1fd5a2e1SPrashanth Swaminathan
631*1fd5a2e1SPrashanth Swaminathan      tm_type_elements[9] = &ffi_type_slong;
632*1fd5a2e1SPrashanth Swaminathan      tm_type_elements[10] = &ffi_type_pointer;
633*1fd5a2e1SPrashanth Swaminathan      tm_type_elements[11] = NULL;
634*1fd5a2e1SPrashanth Swaminathan
635*1fd5a2e1SPrashanth Swaminathan      /* tm_type can now be used to represent tm argument types and
636*1fd5a2e1SPrashanth Swaminathan	 return types for ffi_prep_cif() */
637*1fd5a2e1SPrashanth Swaminathan    @}
638*1fd5a2e1SPrashanth Swaminathan@end example
639*1fd5a2e1SPrashanth Swaminathan
640*1fd5a2e1SPrashanth Swaminathan@node Complex
641*1fd5a2e1SPrashanth Swaminathan@subsection Complex Types
642*1fd5a2e1SPrashanth Swaminathan
643*1fd5a2e1SPrashanth Swaminathan@samp{libffi} supports the complex types defined by the C99
644*1fd5a2e1SPrashanth Swaminathanstandard (@code{_Complex float}, @code{_Complex double} and
645*1fd5a2e1SPrashanth Swaminathan@code{_Complex long double} with the built-in type descriptors
646*1fd5a2e1SPrashanth Swaminathan@code{ffi_type_complex_float}, @code{ffi_type_complex_double} and
647*1fd5a2e1SPrashanth Swaminathan@code{ffi_type_complex_longdouble}.
648*1fd5a2e1SPrashanth Swaminathan
649*1fd5a2e1SPrashanth SwaminathanCustom complex types like @code{_Complex int} can also be used.
650*1fd5a2e1SPrashanth SwaminathanAn @code{ffi_type} object has to be defined to describe the
651*1fd5a2e1SPrashanth Swaminathancomplex type to @samp{libffi}.
652*1fd5a2e1SPrashanth Swaminathan
653*1fd5a2e1SPrashanth Swaminathan@tindex ffi_type
654*1fd5a2e1SPrashanth Swaminathan@deftp {Data type} ffi_type
655*1fd5a2e1SPrashanth Swaminathan@table @code
656*1fd5a2e1SPrashanth Swaminathan@item size_t size
657*1fd5a2e1SPrashanth SwaminathanThis must be manually set to the size of the complex type.
658*1fd5a2e1SPrashanth Swaminathan
659*1fd5a2e1SPrashanth Swaminathan@item unsigned short alignment
660*1fd5a2e1SPrashanth SwaminathanThis must be manually set to the alignment of the complex type.
661*1fd5a2e1SPrashanth Swaminathan
662*1fd5a2e1SPrashanth Swaminathan@item unsigned short type
663*1fd5a2e1SPrashanth SwaminathanFor a complex type, this must be set to @code{FFI_TYPE_COMPLEX}.
664*1fd5a2e1SPrashanth Swaminathan
665*1fd5a2e1SPrashanth Swaminathan@item ffi_type **elements
666*1fd5a2e1SPrashanth Swaminathan
667*1fd5a2e1SPrashanth SwaminathanThis is a @samp{NULL}-terminated array of pointers to
668*1fd5a2e1SPrashanth Swaminathan@code{ffi_type} objects.  The first element is set to the
669*1fd5a2e1SPrashanth Swaminathan@code{ffi_type} of the complex's base type.  The second element
670*1fd5a2e1SPrashanth Swaminathanmust be set to @code{NULL}.
671*1fd5a2e1SPrashanth Swaminathan@end table
672*1fd5a2e1SPrashanth Swaminathan@end deftp
673*1fd5a2e1SPrashanth Swaminathan
674*1fd5a2e1SPrashanth SwaminathanThe section @ref{Complex Type Example} shows a way to determine
675*1fd5a2e1SPrashanth Swaminathanthe @code{size} and @code{alignment} members in a platform
676*1fd5a2e1SPrashanth Swaminathanindependent way.
677*1fd5a2e1SPrashanth Swaminathan
678*1fd5a2e1SPrashanth SwaminathanFor platforms that have no complex support in @code{libffi} yet,
679*1fd5a2e1SPrashanth Swaminathanthe functions @code{ffi_prep_cif} and @code{ffi_prep_args} abort
680*1fd5a2e1SPrashanth Swaminathanthe program if they encounter a complex type.
681*1fd5a2e1SPrashanth Swaminathan
682*1fd5a2e1SPrashanth Swaminathan@node Complex Type Example
683*1fd5a2e1SPrashanth Swaminathan@subsection Complex Type Example
684*1fd5a2e1SPrashanth Swaminathan
685*1fd5a2e1SPrashanth SwaminathanThis example demonstrates how to use complex types:
686*1fd5a2e1SPrashanth Swaminathan
687*1fd5a2e1SPrashanth Swaminathan@example
688*1fd5a2e1SPrashanth Swaminathan#include <stdio.h>
689*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
690*1fd5a2e1SPrashanth Swaminathan#include <complex.h>
691*1fd5a2e1SPrashanth Swaminathan
692*1fd5a2e1SPrashanth Swaminathanvoid complex_fn(_Complex float cf,
693*1fd5a2e1SPrashanth Swaminathan                _Complex double cd,
694*1fd5a2e1SPrashanth Swaminathan                _Complex long double cld)
695*1fd5a2e1SPrashanth Swaminathan@{
696*1fd5a2e1SPrashanth Swaminathan  printf("cf=%f+%fi\ncd=%f+%fi\ncld=%f+%fi\n",
697*1fd5a2e1SPrashanth Swaminathan         (float)creal (cf), (float)cimag (cf),
698*1fd5a2e1SPrashanth Swaminathan         (float)creal (cd), (float)cimag (cd),
699*1fd5a2e1SPrashanth Swaminathan         (float)creal (cld), (float)cimag (cld));
700*1fd5a2e1SPrashanth Swaminathan@}
701*1fd5a2e1SPrashanth Swaminathan
702*1fd5a2e1SPrashanth Swaminathanint main()
703*1fd5a2e1SPrashanth Swaminathan@{
704*1fd5a2e1SPrashanth Swaminathan  ffi_cif cif;
705*1fd5a2e1SPrashanth Swaminathan  ffi_type *args[3];
706*1fd5a2e1SPrashanth Swaminathan  void *values[3];
707*1fd5a2e1SPrashanth Swaminathan  _Complex float cf;
708*1fd5a2e1SPrashanth Swaminathan  _Complex double cd;
709*1fd5a2e1SPrashanth Swaminathan  _Complex long double cld;
710*1fd5a2e1SPrashanth Swaminathan
711*1fd5a2e1SPrashanth Swaminathan  /* Initialize the argument info vectors */
712*1fd5a2e1SPrashanth Swaminathan  args[0] = &ffi_type_complex_float;
713*1fd5a2e1SPrashanth Swaminathan  args[1] = &ffi_type_complex_double;
714*1fd5a2e1SPrashanth Swaminathan  args[2] = &ffi_type_complex_longdouble;
715*1fd5a2e1SPrashanth Swaminathan  values[0] = &cf;
716*1fd5a2e1SPrashanth Swaminathan  values[1] = &cd;
717*1fd5a2e1SPrashanth Swaminathan  values[2] = &cld;
718*1fd5a2e1SPrashanth Swaminathan
719*1fd5a2e1SPrashanth Swaminathan  /* Initialize the cif */
720*1fd5a2e1SPrashanth Swaminathan  if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
721*1fd5a2e1SPrashanth Swaminathan                   &ffi_type_void, args) == FFI_OK)
722*1fd5a2e1SPrashanth Swaminathan    @{
723*1fd5a2e1SPrashanth Swaminathan      cf = 1.0 + 20.0 * I;
724*1fd5a2e1SPrashanth Swaminathan      cd = 300.0 + 4000.0 * I;
725*1fd5a2e1SPrashanth Swaminathan      cld = 50000.0 + 600000.0 * I;
726*1fd5a2e1SPrashanth Swaminathan      /* Call the function */
727*1fd5a2e1SPrashanth Swaminathan      ffi_call(&cif, (void (*)(void))complex_fn, 0, values);
728*1fd5a2e1SPrashanth Swaminathan    @}
729*1fd5a2e1SPrashanth Swaminathan
730*1fd5a2e1SPrashanth Swaminathan  return 0;
731*1fd5a2e1SPrashanth Swaminathan@}
732*1fd5a2e1SPrashanth Swaminathan@end example
733*1fd5a2e1SPrashanth Swaminathan
734*1fd5a2e1SPrashanth SwaminathanThis is an example for defining a custom complex type descriptor
735*1fd5a2e1SPrashanth Swaminathanfor compilers that support them:
736*1fd5a2e1SPrashanth Swaminathan
737*1fd5a2e1SPrashanth Swaminathan@example
738*1fd5a2e1SPrashanth Swaminathan/*
739*1fd5a2e1SPrashanth Swaminathan * This macro can be used to define new complex type descriptors
740*1fd5a2e1SPrashanth Swaminathan * in a platform independent way.
741*1fd5a2e1SPrashanth Swaminathan *
742*1fd5a2e1SPrashanth Swaminathan * name: Name of the new descriptor is ffi_type_complex_<name>.
743*1fd5a2e1SPrashanth Swaminathan * type: The C base type of the complex type.
744*1fd5a2e1SPrashanth Swaminathan */
745*1fd5a2e1SPrashanth Swaminathan#define FFI_COMPLEX_TYPEDEF(name, type, ffitype)             \
746*1fd5a2e1SPrashanth Swaminathan  static ffi_type *ffi_elements_complex_##name [2] = @{      \
747*1fd5a2e1SPrashanth Swaminathan    (ffi_type *)(&ffitype), NULL                             \
748*1fd5a2e1SPrashanth Swaminathan  @};                                                        \
749*1fd5a2e1SPrashanth Swaminathan  struct struct_align_complex_##name @{                      \
750*1fd5a2e1SPrashanth Swaminathan    char c;                                                  \
751*1fd5a2e1SPrashanth Swaminathan    _Complex type x;                                         \
752*1fd5a2e1SPrashanth Swaminathan  @};                                                        \
753*1fd5a2e1SPrashanth Swaminathan  ffi_type ffi_type_complex_##name = @{                      \
754*1fd5a2e1SPrashanth Swaminathan    sizeof(_Complex type),                                   \
755*1fd5a2e1SPrashanth Swaminathan    offsetof(struct struct_align_complex_##name, x),         \
756*1fd5a2e1SPrashanth Swaminathan    FFI_TYPE_COMPLEX,                                        \
757*1fd5a2e1SPrashanth Swaminathan    (ffi_type **)ffi_elements_complex_##name                 \
758*1fd5a2e1SPrashanth Swaminathan  @}
759*1fd5a2e1SPrashanth Swaminathan
760*1fd5a2e1SPrashanth Swaminathan/* Define new complex type descriptors using the macro: */
761*1fd5a2e1SPrashanth Swaminathan/* ffi_type_complex_sint */
762*1fd5a2e1SPrashanth SwaminathanFFI_COMPLEX_TYPEDEF(sint, int, ffi_type_sint);
763*1fd5a2e1SPrashanth Swaminathan/* ffi_type_complex_uchar */
764*1fd5a2e1SPrashanth SwaminathanFFI_COMPLEX_TYPEDEF(uchar, unsigned char, ffi_type_uint8);
765*1fd5a2e1SPrashanth Swaminathan@end example
766*1fd5a2e1SPrashanth Swaminathan
767*1fd5a2e1SPrashanth SwaminathanThe new type descriptors can then be used like one of the built-in
768*1fd5a2e1SPrashanth Swaminathantype descriptors in the previous example.
769*1fd5a2e1SPrashanth Swaminathan
770*1fd5a2e1SPrashanth Swaminathan@node Multiple ABIs
771*1fd5a2e1SPrashanth Swaminathan@section Multiple ABIs
772*1fd5a2e1SPrashanth Swaminathan
773*1fd5a2e1SPrashanth SwaminathanA given platform may provide multiple different ABIs at once.  For
774*1fd5a2e1SPrashanth Swaminathaninstance, the x86 platform has both @samp{stdcall} and @samp{fastcall}
775*1fd5a2e1SPrashanth Swaminathanfunctions.
776*1fd5a2e1SPrashanth Swaminathan
777*1fd5a2e1SPrashanth Swaminathan@code{libffi} provides some support for this.  However, this is
778*1fd5a2e1SPrashanth Swaminathannecessarily platform-specific.
779*1fd5a2e1SPrashanth Swaminathan
780*1fd5a2e1SPrashanth Swaminathan@c FIXME: document the platforms
781*1fd5a2e1SPrashanth Swaminathan
782*1fd5a2e1SPrashanth Swaminathan@node The Closure API
783*1fd5a2e1SPrashanth Swaminathan@section The Closure API
784*1fd5a2e1SPrashanth Swaminathan
785*1fd5a2e1SPrashanth Swaminathan@code{libffi} also provides a way to write a generic function -- a
786*1fd5a2e1SPrashanth Swaminathanfunction that can accept and decode any combination of arguments.
787*1fd5a2e1SPrashanth SwaminathanThis can be useful when writing an interpreter, or to provide wrappers
788*1fd5a2e1SPrashanth Swaminathanfor arbitrary functions.
789*1fd5a2e1SPrashanth Swaminathan
790*1fd5a2e1SPrashanth SwaminathanThis facility is called the @dfn{closure API}.  Closures are not
791*1fd5a2e1SPrashanth Swaminathansupported on all platforms; you can check the @code{FFI_CLOSURES}
792*1fd5a2e1SPrashanth Swaminathandefine to determine whether they are supported on the current
793*1fd5a2e1SPrashanth Swaminathanplatform.
794*1fd5a2e1SPrashanth Swaminathan@cindex closures
795*1fd5a2e1SPrashanth Swaminathan@cindex closure API
796*1fd5a2e1SPrashanth Swaminathan@findex FFI_CLOSURES
797*1fd5a2e1SPrashanth Swaminathan
798*1fd5a2e1SPrashanth SwaminathanBecause closures work by assembling a tiny function at runtime, they
799*1fd5a2e1SPrashanth Swaminathanrequire special allocation on platforms that have a non-executable
800*1fd5a2e1SPrashanth Swaminathanheap.  Memory management for closures is handled by a pair of
801*1fd5a2e1SPrashanth Swaminathanfunctions:
802*1fd5a2e1SPrashanth Swaminathan
803*1fd5a2e1SPrashanth Swaminathan@findex ffi_closure_alloc
804*1fd5a2e1SPrashanth Swaminathan@defun void *ffi_closure_alloc (size_t @var{size}, void **@var{code})
805*1fd5a2e1SPrashanth SwaminathanAllocate a chunk of memory holding @var{size} bytes.  This returns a
806*1fd5a2e1SPrashanth Swaminathanpointer to the writable address, and sets *@var{code} to the
807*1fd5a2e1SPrashanth Swaminathancorresponding executable address.
808*1fd5a2e1SPrashanth Swaminathan
809*1fd5a2e1SPrashanth Swaminathan@var{size} should be sufficient to hold a @code{ffi_closure} object.
810*1fd5a2e1SPrashanth Swaminathan@end defun
811*1fd5a2e1SPrashanth Swaminathan
812*1fd5a2e1SPrashanth Swaminathan@findex ffi_closure_free
813*1fd5a2e1SPrashanth Swaminathan@defun void ffi_closure_free (void *@var{writable})
814*1fd5a2e1SPrashanth SwaminathanFree memory allocated using @code{ffi_closure_alloc}.  The argument is
815*1fd5a2e1SPrashanth Swaminathanthe writable address that was returned.
816*1fd5a2e1SPrashanth Swaminathan@end defun
817*1fd5a2e1SPrashanth Swaminathan
818*1fd5a2e1SPrashanth Swaminathan
819*1fd5a2e1SPrashanth SwaminathanOnce you have allocated the memory for a closure, you must construct a
820*1fd5a2e1SPrashanth Swaminathan@code{ffi_cif} describing the function call.  Finally you can prepare
821*1fd5a2e1SPrashanth Swaminathanthe closure function:
822*1fd5a2e1SPrashanth Swaminathan
823*1fd5a2e1SPrashanth Swaminathan@findex ffi_prep_closure_loc
824*1fd5a2e1SPrashanth Swaminathan@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})
825*1fd5a2e1SPrashanth SwaminathanPrepare a closure function.  The arguments to
826*1fd5a2e1SPrashanth Swaminathan@code{ffi_prep_closure_loc} are:
827*1fd5a2e1SPrashanth Swaminathan
828*1fd5a2e1SPrashanth Swaminathan@table @var
829*1fd5a2e1SPrashanth Swaminathan@item closure
830*1fd5a2e1SPrashanth SwaminathanThe address of a @code{ffi_closure} object; this is the writable
831*1fd5a2e1SPrashanth Swaminathanaddress returned by @code{ffi_closure_alloc}.
832*1fd5a2e1SPrashanth Swaminathan
833*1fd5a2e1SPrashanth Swaminathan@item cif
834*1fd5a2e1SPrashanth SwaminathanThe @code{ffi_cif} describing the function parameters.  Note that this
835*1fd5a2e1SPrashanth Swaminathanobject, and the types to which it refers, must be kept alive until the
836*1fd5a2e1SPrashanth Swaminathanclosure itself is freed.
837*1fd5a2e1SPrashanth Swaminathan
838*1fd5a2e1SPrashanth Swaminathan@item user_data
839*1fd5a2e1SPrashanth SwaminathanAn arbitrary datum that is passed, uninterpreted, to your closure
840*1fd5a2e1SPrashanth Swaminathanfunction.
841*1fd5a2e1SPrashanth Swaminathan
842*1fd5a2e1SPrashanth Swaminathan@item codeloc
843*1fd5a2e1SPrashanth SwaminathanThe executable address returned by @code{ffi_closure_alloc}.
844*1fd5a2e1SPrashanth Swaminathan
845*1fd5a2e1SPrashanth Swaminathan@item fun
846*1fd5a2e1SPrashanth SwaminathanThe function which will be called when the closure is invoked.  It is
847*1fd5a2e1SPrashanth Swaminathancalled with the arguments:
848*1fd5a2e1SPrashanth Swaminathan
849*1fd5a2e1SPrashanth Swaminathan@table @var
850*1fd5a2e1SPrashanth Swaminathan@item cif
851*1fd5a2e1SPrashanth SwaminathanThe @code{ffi_cif} passed to @code{ffi_prep_closure_loc}.
852*1fd5a2e1SPrashanth Swaminathan
853*1fd5a2e1SPrashanth Swaminathan@item ret
854*1fd5a2e1SPrashanth SwaminathanA pointer to the memory used for the function's return value.
855*1fd5a2e1SPrashanth Swaminathan
856*1fd5a2e1SPrashanth SwaminathanIf the function is declared as returning @code{void}, then this value
857*1fd5a2e1SPrashanth Swaminathanis garbage and should not be used.
858*1fd5a2e1SPrashanth Swaminathan
859*1fd5a2e1SPrashanth SwaminathanOtherwise, @var{fun} must fill the object to which this points,
860*1fd5a2e1SPrashanth Swaminathanfollowing the same special promotion behavior as @code{ffi_call}.
861*1fd5a2e1SPrashanth SwaminathanThat is, in most cases, @var{ret} points to an object of exactly the
862*1fd5a2e1SPrashanth Swaminathansize of the type specified when @var{cif} was constructed.  However,
863*1fd5a2e1SPrashanth Swaminathanintegral types narrower than the system register size are widened.  In
864*1fd5a2e1SPrashanth Swaminathanthese cases your program may assume that @var{ret} points to an
865*1fd5a2e1SPrashanth Swaminathan@code{ffi_arg} object.
866*1fd5a2e1SPrashanth Swaminathan
867*1fd5a2e1SPrashanth Swaminathan@item args
868*1fd5a2e1SPrashanth SwaminathanA vector of pointers to memory holding the arguments to the function.
869*1fd5a2e1SPrashanth Swaminathan
870*1fd5a2e1SPrashanth Swaminathan@item user_data
871*1fd5a2e1SPrashanth SwaminathanThe same @var{user_data} that was passed to
872*1fd5a2e1SPrashanth Swaminathan@code{ffi_prep_closure_loc}.
873*1fd5a2e1SPrashanth Swaminathan@end table
874*1fd5a2e1SPrashanth Swaminathan@end table
875*1fd5a2e1SPrashanth Swaminathan
876*1fd5a2e1SPrashanth Swaminathan@code{ffi_prep_closure_loc} will return @code{FFI_OK} if everything
877*1fd5a2e1SPrashanth Swaminathanwent ok, and one of the other @code{ffi_status} values on error.
878*1fd5a2e1SPrashanth Swaminathan
879*1fd5a2e1SPrashanth SwaminathanAfter calling @code{ffi_prep_closure_loc}, you can cast @var{codeloc}
880*1fd5a2e1SPrashanth Swaminathanto the appropriate pointer-to-function type.
881*1fd5a2e1SPrashanth Swaminathan@end defun
882*1fd5a2e1SPrashanth Swaminathan
883*1fd5a2e1SPrashanth SwaminathanYou may see old code referring to @code{ffi_prep_closure}.  This
884*1fd5a2e1SPrashanth Swaminathanfunction is deprecated, as it cannot handle the need for separate
885*1fd5a2e1SPrashanth Swaminathanwritable and executable addresses.
886*1fd5a2e1SPrashanth Swaminathan
887*1fd5a2e1SPrashanth Swaminathan@node Closure Example
888*1fd5a2e1SPrashanth Swaminathan@section Closure Example
889*1fd5a2e1SPrashanth Swaminathan
890*1fd5a2e1SPrashanth SwaminathanA trivial example that creates a new @code{puts} by binding
891*1fd5a2e1SPrashanth Swaminathan@code{fputs} with @code{stdout}.
892*1fd5a2e1SPrashanth Swaminathan
893*1fd5a2e1SPrashanth Swaminathan@example
894*1fd5a2e1SPrashanth Swaminathan#include <stdio.h>
895*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
896*1fd5a2e1SPrashanth Swaminathan
897*1fd5a2e1SPrashanth Swaminathan/* Acts like puts with the file given at time of enclosure. */
898*1fd5a2e1SPrashanth Swaminathanvoid puts_binding(ffi_cif *cif, void *ret, void* args[],
899*1fd5a2e1SPrashanth Swaminathan                  void *stream)
900*1fd5a2e1SPrashanth Swaminathan@{
901*1fd5a2e1SPrashanth Swaminathan  *(ffi_arg *)ret = fputs(*(char **)args[0], (FILE *)stream);
902*1fd5a2e1SPrashanth Swaminathan@}
903*1fd5a2e1SPrashanth Swaminathan
904*1fd5a2e1SPrashanth Swaminathantypedef int (*puts_t)(char *);
905*1fd5a2e1SPrashanth Swaminathan
906*1fd5a2e1SPrashanth Swaminathanint main()
907*1fd5a2e1SPrashanth Swaminathan@{
908*1fd5a2e1SPrashanth Swaminathan  ffi_cif cif;
909*1fd5a2e1SPrashanth Swaminathan  ffi_type *args[1];
910*1fd5a2e1SPrashanth Swaminathan  ffi_closure *closure;
911*1fd5a2e1SPrashanth Swaminathan
912*1fd5a2e1SPrashanth Swaminathan  void *bound_puts;
913*1fd5a2e1SPrashanth Swaminathan  int rc;
914*1fd5a2e1SPrashanth Swaminathan
915*1fd5a2e1SPrashanth Swaminathan  /* Allocate closure and bound_puts */
916*1fd5a2e1SPrashanth Swaminathan  closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);
917*1fd5a2e1SPrashanth Swaminathan
918*1fd5a2e1SPrashanth Swaminathan  if (closure)
919*1fd5a2e1SPrashanth Swaminathan    @{
920*1fd5a2e1SPrashanth Swaminathan      /* Initialize the argument info vectors */
921*1fd5a2e1SPrashanth Swaminathan      args[0] = &ffi_type_pointer;
922*1fd5a2e1SPrashanth Swaminathan
923*1fd5a2e1SPrashanth Swaminathan      /* Initialize the cif */
924*1fd5a2e1SPrashanth Swaminathan      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
925*1fd5a2e1SPrashanth Swaminathan                       &ffi_type_sint, args) == FFI_OK)
926*1fd5a2e1SPrashanth Swaminathan        @{
927*1fd5a2e1SPrashanth Swaminathan          /* Initialize the closure, setting stream to stdout */
928*1fd5a2e1SPrashanth Swaminathan          if (ffi_prep_closure_loc(closure, &cif, puts_binding,
929*1fd5a2e1SPrashanth Swaminathan                                   stdout, bound_puts) == FFI_OK)
930*1fd5a2e1SPrashanth Swaminathan            @{
931*1fd5a2e1SPrashanth Swaminathan              rc = ((puts_t)bound_puts)("Hello World!");
932*1fd5a2e1SPrashanth Swaminathan              /* rc now holds the result of the call to fputs */
933*1fd5a2e1SPrashanth Swaminathan            @}
934*1fd5a2e1SPrashanth Swaminathan        @}
935*1fd5a2e1SPrashanth Swaminathan    @}
936*1fd5a2e1SPrashanth Swaminathan
937*1fd5a2e1SPrashanth Swaminathan  /* Deallocate both closure, and bound_puts */
938*1fd5a2e1SPrashanth Swaminathan  ffi_closure_free(closure);
939*1fd5a2e1SPrashanth Swaminathan
940*1fd5a2e1SPrashanth Swaminathan  return 0;
941*1fd5a2e1SPrashanth Swaminathan@}
942*1fd5a2e1SPrashanth Swaminathan
943*1fd5a2e1SPrashanth Swaminathan@end example
944*1fd5a2e1SPrashanth Swaminathan
945*1fd5a2e1SPrashanth Swaminathan@node Thread Safety
946*1fd5a2e1SPrashanth Swaminathan@section Thread Safety
947*1fd5a2e1SPrashanth Swaminathan
948*1fd5a2e1SPrashanth Swaminathan@code{libffi} is not completely thread-safe.  However, many parts are,
949*1fd5a2e1SPrashanth Swaminathanand if you follow some simple rules, you can use it safely in a
950*1fd5a2e1SPrashanth Swaminathanmulti-threaded program.
951*1fd5a2e1SPrashanth Swaminathan
952*1fd5a2e1SPrashanth Swaminathan@itemize @bullet
953*1fd5a2e1SPrashanth Swaminathan@item
954*1fd5a2e1SPrashanth Swaminathan@code{ffi_prep_cif} may modify the @code{ffi_type} objects passed to
955*1fd5a2e1SPrashanth Swaminathanit.  It is best to ensure that only a single thread prepares a given
956*1fd5a2e1SPrashanth Swaminathan@code{ffi_cif} at a time.
957*1fd5a2e1SPrashanth Swaminathan
958*1fd5a2e1SPrashanth Swaminathan@item
959*1fd5a2e1SPrashanth SwaminathanOn some platforms, @code{ffi_prep_cif} may modify the size and
960*1fd5a2e1SPrashanth Swaminathanalignment of some types, depending on the chosen ABI.  On these
961*1fd5a2e1SPrashanth Swaminathanplatforms, if you switch between ABIs, you must ensure that there is
962*1fd5a2e1SPrashanth Swaminathanonly one call to @code{ffi_prep_cif} at a time.
963*1fd5a2e1SPrashanth Swaminathan
964*1fd5a2e1SPrashanth SwaminathanCurrently the only affected platform is PowerPC and the only affected
965*1fd5a2e1SPrashanth Swaminathantype is @code{long double}.
966*1fd5a2e1SPrashanth Swaminathan@end itemize
967*1fd5a2e1SPrashanth Swaminathan
968*1fd5a2e1SPrashanth Swaminathan@node Missing Features
969*1fd5a2e1SPrashanth Swaminathan@chapter Missing Features
970*1fd5a2e1SPrashanth Swaminathan
971*1fd5a2e1SPrashanth Swaminathan@code{libffi} is missing a few features.  We welcome patches to add
972*1fd5a2e1SPrashanth Swaminathansupport for these.
973*1fd5a2e1SPrashanth Swaminathan
974*1fd5a2e1SPrashanth Swaminathan@itemize @bullet
975*1fd5a2e1SPrashanth Swaminathan@item
976*1fd5a2e1SPrashanth SwaminathanVariadic closures.
977*1fd5a2e1SPrashanth Swaminathan
978*1fd5a2e1SPrashanth Swaminathan@item
979*1fd5a2e1SPrashanth SwaminathanThere is no support for bit fields in structures.
980*1fd5a2e1SPrashanth Swaminathan
981*1fd5a2e1SPrashanth Swaminathan@item
982*1fd5a2e1SPrashanth SwaminathanThe ``raw'' API is undocumented.
983*1fd5a2e1SPrashanth Swaminathan@c anything else?
984*1fd5a2e1SPrashanth Swaminathan
985*1fd5a2e1SPrashanth Swaminathan@item
986*1fd5a2e1SPrashanth SwaminathanThe Go API is undocumented.
987*1fd5a2e1SPrashanth Swaminathan@end itemize
988*1fd5a2e1SPrashanth Swaminathan
989*1fd5a2e1SPrashanth SwaminathanNote that variadic support is very new and tested on a relatively
990*1fd5a2e1SPrashanth Swaminathansmall number of platforms.
991*1fd5a2e1SPrashanth Swaminathan
992*1fd5a2e1SPrashanth Swaminathan@node Index
993*1fd5a2e1SPrashanth Swaminathan@unnumbered Index
994*1fd5a2e1SPrashanth Swaminathan
995*1fd5a2e1SPrashanth Swaminathan@printindex cp
996*1fd5a2e1SPrashanth Swaminathan
997*1fd5a2e1SPrashanth Swaminathan@bye
998