annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 %//////////////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 % Copyright (c) 2007,2010 Daniel Adler <dadler@uni-goettingen.de>,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 % Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 % Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 % purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8 % copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 %//////////////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 \newpage
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 \section{\emph{Dyncall} C library API}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 The library provides low-level functionality to make foreign function calls
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 from different run-time environments. The flexibility is constrained by the
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25 set of supported types.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27 \paragraph{C interface style conventions}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 This manual and the \product{dyncall} library's C interface {\tt "dyncall.h"}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 use the following C source code style.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 \begin{table}[h]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 \begin{center}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 \begin{tabular*}{0.8\textwidth}{llll}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 Subject & C symbol & Details & Example \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 Types
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 & {\tt DC\group{type name}}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 & lower-case & \capi{DCint}, \capi{DCfloat}, \capi{DClong}, \ldots\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 Structures
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 & {\tt DC\group{structure name}}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 & camel-case
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 & \capi{DCCallVM}\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 Functions & {\tt dc\group{function name}} & camel-case & \capi{dcNewCallVM}, \capi{dcArgInt}, \ldots\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 \end{tabular*}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 \caption{C interface conventions}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 \label{sourcecode}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 \end{center}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 \end{table}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 \subsection{Supported C/C++ argument and return types}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 \begin{table}[h]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 \begin{center}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 \begin{tabular*}{0.75\textwidth}{ll}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 Type alias & C/C++ data type\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 DCbool & \_Bool, bool\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 DCchar & char\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 DCshort & short\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 DCint & int\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 DClong & long\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 DClonglong & long long\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 DCfloat & float\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 DCdouble & double\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 DCpointer & void*\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 DCvoid & void\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 \end{tabular*}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 \caption{Supported C/C++ argument and return types}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 \label{types}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 \end{center}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 \end{table}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 \pagebreak
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 \subsection{Call Virtual Machine - CallVM}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 This \emph{CallVM} is the main entry to the functionality of the library.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 \paragraph{Types}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 \begin{lstlisting}[language=c]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 typedef void DCCallVM; /* abstract handle */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 \end{lstlisting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 \paragraph{Details}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 The \emph{CallVM} is a state machine that manages all aspects of a function
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 call from configuration, argument passing up the actual function call on
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 the processor.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 \subsection{Allocation}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 \paragraph{Functions}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 \begin{lstlisting}[language=c]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 DCCallVM* dcNewCallVM (DCsize size);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 void dcFree(DCCallVM* vm);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 \end{lstlisting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 \lstinline{dcNewCallVM} creates a new \emph{CallVM} object, where
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 \lstinline{size} specifies the max size of the internal stack that will be
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 allocated and used to bind arguments to. Use \lstinline{dcFree} to
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 destroy the \emph{CallVM} object.\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 This will allocate memory using the system allocators or custom ones provided
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 custom \capi{dcAllocMem} and \capi{dcFreeMem} macros are defined to override the
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 default behaviour. See \capi{dyncall\_alloc.h} for defails.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 \subsection{Error Reporting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 \paragraph{Function}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 \begin{lstlisting}[language=c]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 DCint dcGetError(DCCallVM* vm);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 \end{lstlisting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 Returns the most recent error state code out of the following:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 \paragraph{Errors}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 \begin{table}[h]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 \begin{center}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 \begin{tabular*}{0.75\textwidth}{ll}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 Constant & Description\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 \lstinline@DC_ERROR_NONE@ & No error occured. \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 \lstinline@DC_ERROR_UNSUPPORTED_MODE@ & Unsupported mode, caused by \lstinline@dcMode()@ \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 \end{tabular*}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 \caption{CallVM calling convention modes}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 \label{errorcodes}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 \end{center}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 \end{table}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 \pagebreak
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 \subsection{Configuration}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 \paragraph{Function}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 \begin{lstlisting}[language=c]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 void dcMode (DCCallVM* vm, DCint mode);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 \end{lstlisting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 Sets the calling convention to use. Note that some mode/platform combination
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 don't make any sense (e.g. using a PowerPC calling convention on a MIPS
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 platform) and are silently ignored.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 \paragraph{Modes}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 \begin{table}[h]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 \begin{center}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 \begin{tabular*}{0.75\textwidth}{ll}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 Constant & Description\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 \lstinline@DC_CALL_C_DEFAULT@ & C default function call for current platform\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 \lstinline@DC_CALL_C_ELLIPSIS@ & C ellipsis function call (named arguments (before '...'))\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 \lstinline@DC_CALL_C_ELLIPSIS_VARARGS@ & C ellipsis function call (variable/unnamed arguments (after '...'))\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 \lstinline@DC_CALL_C_X86_CDECL@ & C x86 platforms standard call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 \lstinline@DC_CALL_C_X86_WIN32_STD@ & C x86 Windows standard call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 \lstinline@DC_CALL_C_X86_WIN32_FAST_MS@ & C x86 Windows Microsoft fast call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 \lstinline@DC_CALL_C_X86_WIN32_FAST_GNU@ & C x86 Windows GCC fast call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 \lstinline@DC_CALL_C_X86_WIN32_THIS_MS@ & C x86 Windows Microsoft this call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 \lstinline@DC_CALL_C_X86_WIN32_THIS_GNU@ & C x86 Windows GCC this call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 \lstinline@DC_CALL_C_X86_PLAN9@ & C x86 Plan9 call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 \lstinline@DC_CALL_C_X64_WIN64@ & C x64 Windows standard call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 \lstinline@DC_CALL_C_X64_SYSV@ & C x64 System V standard call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 \lstinline@DC_CALL_C_PPC32_DARWIN@ & C ppc32 Mac OS X standard call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 \lstinline@DC_CALL_C_PPC32_OSX@ & alias for DC\_CALL\_C\_PPC32\_DARWIN\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 \lstinline@DC_CALL_C_PPC32_SYSV@ & C ppc32 SystemV standard call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 \lstinline@DC_CALL_C_PPC32_LINUX@ & alias for DC\_CALL\_C\_PPC32\_SYSV\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 \lstinline@DC_CALL_C_PPC64@ & C ppc64 SystemV standard call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 \lstinline@DC_CALL_C_PPC64_LINUX@ & alias for DC\_CALL\_C\_PPC64\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 \lstinline@DC_CALL_C_ARM_ARM@ & C arm call (arm mode)\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 \lstinline@DC_CALL_C_ARM_THUMB@ & C arm call (thumb mode)\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 \lstinline@DC_CALL_C_ARM_ARM_EABI@ & C arm eabi call (arm mode)\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 \lstinline@DC_CALL_C_ARM_THUMB_EABI@ & C arm eabi call (thumb mode)\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186 \lstinline@DC_CALL_C_ARM_ARMHF@ & C arm call (arm hardfloat - e.g. raspberry pi)\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 \lstinline@DC_CALL_C_ARM64@ & C arm64 call (AArch64)\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 \lstinline@DC_CALL_C_MIPS32_EABI@ & C mips32 eabi call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 \lstinline@DC_CALL_C_MIPS32_PSPSDK@ & alias for DC\_CALL\_C\_MIPS32\_EABI (deprecated)\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 \lstinline@DC_CALL_C_MIPS32_O32@ & C mips32 o32 call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 \lstinline@DC_CALL_C_MIPS64_N64@ & C mips64 n64 call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 \lstinline@DC_CALL_C_MIPS64_N32@ & C mips64 n32 call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 \lstinline@DC_CALL_C_SPARC32@ & C sparc32 call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 \lstinline@DC_CALL_C_SPARC64@ & C sparc64 call\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 \lstinline@DC_CALL_SYS_DEFAULT@ & C default syscall for current platform\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 \lstinline@DC_CALL_SYS_X86_INT80H_BSD@ & C syscall for x86 BSD platforms\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 \lstinline@DC_CALL_SYS_X86_INT80H_LINUX@ & C syscall for x86 Linux\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 \lstinline@DC_CALL_SYS_PPC32@ & C syscall for ppc32 Linux\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 \end{tabular*}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 \caption{CallVM calling convention modes}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 \label{callingconventionmodes}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 \end{center}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 \end{table}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 \paragraph{Details}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 \lstinline@DC_CALL_C_DEFAULT@ is the default standard C call on the target
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 platform. It uses the standard C calling convention.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 \lstinline@DC_CALL_C_ELLIPSIS@ is used for C ellipsis calls which allow
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 to build up a variable argument list.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 On many platforms, there is only one C calling convention.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 The X86 platform provides a rich family of different calling conventions.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214 \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
216
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
217 \subsection{Machine state reset}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219 \begin{lstlisting}[language=c]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220 void dcReset(DCCallVM* vm);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221 \end{lstlisting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223 Resets the internal stack of arguments and prepares it for the selected mode.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224 This function should be called after setting the call mode (using dcMode), but
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225 prior to binding arguments to the CallVM. Use it also when reusing a CallVM, as
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
226 arguments don't get flushed automatically after a function call invocation.\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
228 \subsection{Argument binding}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
230 \paragraph{Functions}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
231
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
232 \begin{lstlisting}[language=c]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 void dcArgBool (DCCallVM* vm, DCbool arg);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
234 void dcArgChar (DCCallVM* vm, DCchar arg);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
235 void dcArgShort (DCCallVM* vm, DCshort arg);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
236 void dcArgInt (DCCallVM* vm, DCint arg);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
237 void dcArgLong (DCCallVM* vm, DClong arg);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238 void dcArgLongLong(DCCallVM* vm, DClonglong arg);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
239 void dcArgFloat (DCCallVM* vm, DCfloat arg);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
240 void dcArgDouble (DCCallVM* vm, DCdouble arg);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
241 void dcArgPointer (DCCallVM* vm, DCpointer arg);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
242 \end{lstlisting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
243
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
244 \paragraph{Details}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
245
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
246 Used to bind arguments of the named types to the CallVM object.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
247 Arguments should be bound in \emph{left-to-right} order regarding the C
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
248 function prototype.\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
249
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
250 \subsection{Call invocation}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
251
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
252 \paragraph{Functions}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
253
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
254 \begin{lstlisting}[language=c]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
255 DCvoid dcCallVoid (DCCallVM* vm, DCpointer funcptr);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
256 DCbool dcCallBool (DCCallVM* vm, DCpointer funcptr);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
257 DCchar dcCallChar (DCCallVM* vm, DCpointer funcptr);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
258 DCshort dcCallShort (DCCallVM* vm, DCpointer funcptr);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
259 DCint dcCallInt (DCCallVM* vm, DCpointer funcptr);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
260 DClong dcCallLong (DCCallVM* vm, DCpointer funcptr);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
261 DClonglong dcCallLongLong(DCCallVM* vm, DCpointer funcptr);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
262 DCfloat dcCallFloat (DCCallVM* vm, DCpointer funcptr);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
263 DCdouble dcCallDouble (DCCallVM* vm, DCpointer funcptr);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
264 DCpointer dcCallPointer (DCCallVM* vm, DCpointer funcptr);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
265 \end{lstlisting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
266
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
267 \paragraph{Details}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
268 Calls the function specified by \emph{funcptr} with the arguments bound to
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
269 the \emph{CallVM} and returns. Use the function that corresponds to the
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
270 dynamically called function's return value.\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
271 \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
272 After the invocation of the foreign function call, the argument values are
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
273 still bound and a second call using the same arguments can be issued. If you
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
274 need to clear the argument bindings, you have to reset the \emph{CallVM}.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
275
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
276 \subsection{Formatted argument binding and calls (ANSI C ellipsis interface)}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
277
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
278 \paragraph{Functions}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
279
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
280 \begin{lstlisting}[language=c]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
281 void dcArgF (DCCallVM* vm, const DCsigchar* signature, ...);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
282 void dcVArgF(DCCallVM* vm, const DCsigchar* signature, va_list args);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
283 void dcCallF (DCCallVM* vm, DCValue* result, DCpointer funcptr,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
284 const DCsigchar* signature, ...);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
285 void dcVCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
286 const DCsigchar* signature, va_list args);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
287 \end{lstlisting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
288
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
289 \paragraph{Details}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
290
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
291 These functions can be used to operate \product{dyncall} via a printf-style
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
292 functional interface, using a signature string encoding the argument types and
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
293 return type.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
294 \capi{dcArgF()} and \capi{dcVArgF()} just bind arguments to the \capi{DCCallVM}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
295 object, so any return value specified in the signature is ignored. \capi{dcCallF()}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
296 and \capi{dcVCallF()} also take a function pointer to call after binding the arguments.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
297 The return value will be stored in what \lstinline{result} points to.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
298 For more information about the signature format, refer to \ref{sigchar}.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
299