Mercurial > pub > dyncall > dyncall
diff doc/manual/manual_dyncall_api.tex @ 0:3e629dc19168
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:24:28 +0100 |
parents | |
children | 9bd3c5219505 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/manual/manual_dyncall_api.tex Thu Mar 19 22:24:28 2015 +0100 @@ -0,0 +1,299 @@ +%////////////////////////////////////////////////////////////////////////////// +% +% Copyright (c) 2007,2010 Daniel Adler <dadler@uni-goettingen.de>, +% Tassilo Philipp <tphilipp@potion-studios.com> +% +% Permission to use, copy, modify, and distribute this software for any +% purpose with or without fee is hereby granted, provided that the above +% copyright notice and this permission notice appear in all copies. +% +% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +% +%////////////////////////////////////////////////////////////////////////////// + +\newpage +\section{\emph{Dyncall} C library API} + +The library provides low-level functionality to make foreign function calls +from different run-time environments. The flexibility is constrained by the +set of supported types. + +\paragraph{C interface style conventions} + +This manual and the \product{dyncall} library's C interface {\tt "dyncall.h"} +use the following C source code style. + + +\begin{table}[h] +\begin{center} +\begin{tabular*}{0.8\textwidth}{llll} +\hline +Subject & C symbol & Details & Example \\ +\hline +Types + & {\tt DC\group{type name}} + & lower-case & \capi{DCint}, \capi{DCfloat}, \capi{DClong}, \ldots\\ +Structures + & {\tt DC\group{structure name}} + & camel-case + & \capi{DCCallVM}\\ +Functions & {\tt dc\group{function name}} & camel-case & \capi{dcNewCallVM}, \capi{dcArgInt}, \ldots\\ +\hline +\end{tabular*} +\caption{C interface conventions} +\label{sourcecode} +\end{center} +\end{table} + +\subsection{Supported C/C++ argument and return types} + +\begin{table}[h] +\begin{center} +\begin{tabular*}{0.75\textwidth}{ll} +\hline +Type alias & C/C++ data type\\ +\hline +DCbool & \_Bool, bool\\ +DCchar & char\\ +DCshort & short\\ +DCint & int\\ +DClong & long\\ +DClonglong & long long\\ +DCfloat & float\\ +DCdouble & double\\ +DCpointer & void*\\ +DCvoid & void\\ +\hline +\end{tabular*} +\caption{Supported C/C++ argument and return types} +\label{types} +\end{center} +\end{table} + +\pagebreak + +\subsection{Call Virtual Machine - CallVM} + +This \emph{CallVM} is the main entry to the functionality of the library. + +\paragraph{Types} + +\begin{lstlisting}[language=c] +typedef void DCCallVM; /* abstract handle */ +\end{lstlisting} + +\paragraph{Details} +The \emph{CallVM} is a state machine that manages all aspects of a function +call from configuration, argument passing up the actual function call on +the processor. + +\subsection{Allocation} + +\paragraph{Functions} + +\begin{lstlisting}[language=c] +DCCallVM* dcNewCallVM (DCsize size); +void dcFree(DCCallVM* vm); +\end{lstlisting} + +\lstinline{dcNewCallVM} creates a new \emph{CallVM} object, where +\lstinline{size} specifies the max size of the internal stack that will be +allocated and used to bind arguments to. Use \lstinline{dcFree} to +destroy the \emph{CallVM} object.\\ +\\ +This will allocate memory using the system allocators or custom ones provided +custom \capi{dcAllocMem} and \capi{dcFreeMem} macros are defined to override the +default behaviour. See \capi{dyncall\_alloc.h} for defails. + + +\subsection{Error Reporting} + +\paragraph{Function} + +\begin{lstlisting}[language=c] +DCint dcGetError(DCCallVM* vm); +\end{lstlisting} + +Returns the most recent error state code out of the following: + +\paragraph{Errors} + +\begin{table}[h] +\begin{center} +\begin{tabular*}{0.75\textwidth}{ll} +\hline +Constant & Description\\ +\hline +\lstinline@DC_ERROR_NONE@ & No error occured. \\ +\lstinline@DC_ERROR_UNSUPPORTED_MODE@ & Unsupported mode, caused by \lstinline@dcMode()@ \\ +\hline +\end{tabular*} +\caption{CallVM calling convention modes} +\label{errorcodes} +\end{center} +\end{table} + +\pagebreak + +\subsection{Configuration} + +\paragraph{Function} + +\begin{lstlisting}[language=c] +void dcMode (DCCallVM* vm, DCint mode); +\end{lstlisting} + +Sets the calling convention to use. Note that some mode/platform combination +don't make any sense (e.g. using a PowerPC calling convention on a MIPS +platform) and are silently ignored. + +\paragraph{Modes} + +\begin{table}[h] +\begin{center} +\begin{tabular*}{0.75\textwidth}{ll} +\hline +Constant & Description\\ +\hline +\lstinline@DC_CALL_C_DEFAULT@ & C default function call for current platform\\ +\lstinline@DC_CALL_C_ELLIPSIS@ & C ellipsis function call (named arguments (before '...'))\\ +\lstinline@DC_CALL_C_ELLIPSIS_VARARGS@ & C ellipsis function call (variable/unnamed arguments (after '...'))\\ +\lstinline@DC_CALL_C_X86_CDECL@ & C x86 platforms standard call\\ +\lstinline@DC_CALL_C_X86_WIN32_STD@ & C x86 Windows standard call\\ +\lstinline@DC_CALL_C_X86_WIN32_FAST_MS@ & C x86 Windows Microsoft fast call\\ +\lstinline@DC_CALL_C_X86_WIN32_FAST_GNU@ & C x86 Windows GCC fast call\\ +\lstinline@DC_CALL_C_X86_WIN32_THIS_MS@ & C x86 Windows Microsoft this call\\ +\lstinline@DC_CALL_C_X86_WIN32_THIS_GNU@ & C x86 Windows GCC this call\\ +\lstinline@DC_CALL_C_X86_PLAN9@ & C x86 Plan9 call\\ +\lstinline@DC_CALL_C_X64_WIN64@ & C x64 Windows standard call\\ +\lstinline@DC_CALL_C_X64_SYSV@ & C x64 System V standard call\\ +\lstinline@DC_CALL_C_PPC32_DARWIN@ & C ppc32 Mac OS X standard call\\ +\lstinline@DC_CALL_C_PPC32_OSX@ & alias for DC\_CALL\_C\_PPC32\_DARWIN\\ +\lstinline@DC_CALL_C_PPC32_SYSV@ & C ppc32 SystemV standard call\\ +\lstinline@DC_CALL_C_PPC32_LINUX@ & alias for DC\_CALL\_C\_PPC32\_SYSV\\ +\lstinline@DC_CALL_C_PPC64@ & C ppc64 SystemV standard call\\ +\lstinline@DC_CALL_C_PPC64_LINUX@ & alias for DC\_CALL\_C\_PPC64\\ +\lstinline@DC_CALL_C_ARM_ARM@ & C arm call (arm mode)\\ +\lstinline@DC_CALL_C_ARM_THUMB@ & C arm call (thumb mode)\\ +\lstinline@DC_CALL_C_ARM_ARM_EABI@ & C arm eabi call (arm mode)\\ +\lstinline@DC_CALL_C_ARM_THUMB_EABI@ & C arm eabi call (thumb mode)\\ +\lstinline@DC_CALL_C_ARM_ARMHF@ & C arm call (arm hardfloat - e.g. raspberry pi)\\ +\lstinline@DC_CALL_C_ARM64@ & C arm64 call (AArch64)\\ +\lstinline@DC_CALL_C_MIPS32_EABI@ & C mips32 eabi call\\ +\lstinline@DC_CALL_C_MIPS32_PSPSDK@ & alias for DC\_CALL\_C\_MIPS32\_EABI (deprecated)\\ +\lstinline@DC_CALL_C_MIPS32_O32@ & C mips32 o32 call\\ +\lstinline@DC_CALL_C_MIPS64_N64@ & C mips64 n64 call\\ +\lstinline@DC_CALL_C_MIPS64_N32@ & C mips64 n32 call\\ +\lstinline@DC_CALL_C_SPARC32@ & C sparc32 call\\ +\lstinline@DC_CALL_C_SPARC64@ & C sparc64 call\\ +\lstinline@DC_CALL_SYS_DEFAULT@ & C default syscall for current platform\\ +\lstinline@DC_CALL_SYS_X86_INT80H_BSD@ & C syscall for x86 BSD platforms\\ +\lstinline@DC_CALL_SYS_X86_INT80H_LINUX@ & C syscall for x86 Linux\\ +\lstinline@DC_CALL_SYS_PPC32@ & C syscall for ppc32 Linux\\ +\hline +\end{tabular*} +\caption{CallVM calling convention modes} +\label{callingconventionmodes} +\end{center} +\end{table} + +\paragraph{Details} + +\lstinline@DC_CALL_C_DEFAULT@ is the default standard C call on the target +platform. It uses the standard C calling convention. +\lstinline@DC_CALL_C_ELLIPSIS@ is used for C ellipsis calls which allow +to build up a variable argument list. +On many platforms, there is only one C calling convention. +The X86 platform provides a rich family of different calling conventions. +\\ + + +\subsection{Machine state reset} + +\begin{lstlisting}[language=c] +void dcReset(DCCallVM* vm); +\end{lstlisting} + +Resets the internal stack of arguments and prepares it for the selected mode. +This function should be called after setting the call mode (using dcMode), but +prior to binding arguments to the CallVM. Use it also when reusing a CallVM, as +arguments don't get flushed automatically after a function call invocation.\\ + +\subsection{Argument binding} + +\paragraph{Functions} + +\begin{lstlisting}[language=c] +void dcArgBool (DCCallVM* vm, DCbool arg); +void dcArgChar (DCCallVM* vm, DCchar arg); +void dcArgShort (DCCallVM* vm, DCshort arg); +void dcArgInt (DCCallVM* vm, DCint arg); +void dcArgLong (DCCallVM* vm, DClong arg); +void dcArgLongLong(DCCallVM* vm, DClonglong arg); +void dcArgFloat (DCCallVM* vm, DCfloat arg); +void dcArgDouble (DCCallVM* vm, DCdouble arg); +void dcArgPointer (DCCallVM* vm, DCpointer arg); +\end{lstlisting} + +\paragraph{Details} + +Used to bind arguments of the named types to the CallVM object. +Arguments should be bound in \emph{left-to-right} order regarding the C +function prototype.\\ + +\subsection{Call invocation} + +\paragraph{Functions} + +\begin{lstlisting}[language=c] +DCvoid dcCallVoid (DCCallVM* vm, DCpointer funcptr); +DCbool dcCallBool (DCCallVM* vm, DCpointer funcptr); +DCchar dcCallChar (DCCallVM* vm, DCpointer funcptr); +DCshort dcCallShort (DCCallVM* vm, DCpointer funcptr); +DCint dcCallInt (DCCallVM* vm, DCpointer funcptr); +DClong dcCallLong (DCCallVM* vm, DCpointer funcptr); +DClonglong dcCallLongLong(DCCallVM* vm, DCpointer funcptr); +DCfloat dcCallFloat (DCCallVM* vm, DCpointer funcptr); +DCdouble dcCallDouble (DCCallVM* vm, DCpointer funcptr); +DCpointer dcCallPointer (DCCallVM* vm, DCpointer funcptr); +\end{lstlisting} + +\paragraph{Details} +Calls the function specified by \emph{funcptr} with the arguments bound to +the \emph{CallVM} and returns. Use the function that corresponds to the +dynamically called function's return value.\\ +\\ +After the invocation of the foreign function call, the argument values are +still bound and a second call using the same arguments can be issued. If you +need to clear the argument bindings, you have to reset the \emph{CallVM}. + +\subsection{Formatted argument binding and calls (ANSI C ellipsis interface)} + +\paragraph{Functions} + +\begin{lstlisting}[language=c] +void dcArgF (DCCallVM* vm, const DCsigchar* signature, ...); +void dcVArgF(DCCallVM* vm, const DCsigchar* signature, va_list args); +void dcCallF (DCCallVM* vm, DCValue* result, DCpointer funcptr, + const DCsigchar* signature, ...); +void dcVCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, + const DCsigchar* signature, va_list args); +\end{lstlisting} + +\paragraph{Details} + +These functions can be used to operate \product{dyncall} via a printf-style +functional interface, using a signature string encoding the argument types and +return type. +\capi{dcArgF()} and \capi{dcVArgF()} just bind arguments to the \capi{DCCallVM} +object, so any return value specified in the signature is ignored. \capi{dcCallF()} +and \capi{dcVCallF()} also take a function pointer to call after binding the arguments. +The return value will be stored in what \lstinline{result} points to. +For more information about the signature format, refer to \ref{sigchar}. +