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