annotate gcc/jit/libgccjit.h @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* A pure C API to enable client code to embed GCC as a JIT-compiler.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2013-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of GCC.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
7 under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
8 the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
9 any later version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but
kono
parents:
diff changeset
12 WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
kono
parents:
diff changeset
14 General Public License for more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #ifndef LIBGCCJIT_H
kono
parents:
diff changeset
21 #define LIBGCCJIT_H
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 #include <stdio.h>
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 #ifdef __cplusplus
kono
parents:
diff changeset
26 extern "C" {
kono
parents:
diff changeset
27 #endif /* __cplusplus */
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 /**********************************************************************
kono
parents:
diff changeset
30 Data structures.
kono
parents:
diff changeset
31 **********************************************************************/
kono
parents:
diff changeset
32 /* All structs within the API are opaque. */
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 /* A gcc_jit_context encapsulates the state of a compilation.
kono
parents:
diff changeset
35 You can set up options on it, and add types, functions and code, using
kono
parents:
diff changeset
36 the API below.
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 Invoking gcc_jit_context_compile on it gives you a gcc_jit_result *
kono
parents:
diff changeset
39 (or NULL), representing in-memory machine code.
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 You can call gcc_jit_context_compile repeatedly on one context, giving
kono
parents:
diff changeset
42 multiple independent results.
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 Similarly, you can call gcc_jit_context_compile_to_file on a context
kono
parents:
diff changeset
45 to compile to disk.
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 Eventually you can call gcc_jit_context_release to clean up the
kono
parents:
diff changeset
48 context; any in-memory results created from it are still usable, and
kono
parents:
diff changeset
49 should be cleaned up via gcc_jit_result_release. */
kono
parents:
diff changeset
50 typedef struct gcc_jit_context gcc_jit_context;
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 /* A gcc_jit_result encapsulates the result of an in-memory compilation. */
kono
parents:
diff changeset
53 typedef struct gcc_jit_result gcc_jit_result;
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 /* An object created within a context. Such objects are automatically
kono
parents:
diff changeset
56 cleaned up when the context is released.
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 The class hierarchy looks like this:
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 +- gcc_jit_object
kono
parents:
diff changeset
61 +- gcc_jit_location
kono
parents:
diff changeset
62 +- gcc_jit_type
kono
parents:
diff changeset
63 +- gcc_jit_struct
kono
parents:
diff changeset
64 +- gcc_jit_field
kono
parents:
diff changeset
65 +- gcc_jit_function
kono
parents:
diff changeset
66 +- gcc_jit_block
kono
parents:
diff changeset
67 +- gcc_jit_rvalue
kono
parents:
diff changeset
68 +- gcc_jit_lvalue
kono
parents:
diff changeset
69 +- gcc_jit_param
kono
parents:
diff changeset
70 +- gcc_jit_case
kono
parents:
diff changeset
71 */
kono
parents:
diff changeset
72 typedef struct gcc_jit_object gcc_jit_object;
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 /* A gcc_jit_location encapsulates a source code location, so that
kono
parents:
diff changeset
75 you can (optionally) associate locations in your language with
kono
parents:
diff changeset
76 statements in the JIT-compiled code, allowing the debugger to
kono
parents:
diff changeset
77 single-step through your language.
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 Note that to do so, you also need to enable
kono
parents:
diff changeset
80 GCC_JIT_BOOL_OPTION_DEBUGINFO
kono
parents:
diff changeset
81 on the gcc_jit_context.
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 gcc_jit_location instances are optional; you can always pass
kono
parents:
diff changeset
84 NULL. */
kono
parents:
diff changeset
85 typedef struct gcc_jit_location gcc_jit_location;
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 /* A gcc_jit_type encapsulates a type e.g. "int" or a "struct foo*". */
kono
parents:
diff changeset
88 typedef struct gcc_jit_type gcc_jit_type;
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 /* A gcc_jit_field encapsulates a field within a struct; it is used
kono
parents:
diff changeset
91 when creating a struct type (using gcc_jit_context_new_struct_type).
kono
parents:
diff changeset
92 Fields cannot be shared between structs. */
kono
parents:
diff changeset
93 typedef struct gcc_jit_field gcc_jit_field;
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 /* A gcc_jit_struct encapsulates a struct type, either one that we have
kono
parents:
diff changeset
96 the layout for, or an opaque type. */
kono
parents:
diff changeset
97 typedef struct gcc_jit_struct gcc_jit_struct;
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 /* A gcc_jit_function encapsulates a function: either one that you're
kono
parents:
diff changeset
100 creating yourself, or a reference to one that you're dynamically
kono
parents:
diff changeset
101 linking to within the rest of the process. */
kono
parents:
diff changeset
102 typedef struct gcc_jit_function gcc_jit_function;
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 /* A gcc_jit_block encapsulates a "basic block" of statements within a
kono
parents:
diff changeset
105 function (i.e. with one entry point and one exit point).
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 Every block within a function must be terminated with a conditional,
kono
parents:
diff changeset
108 a branch, or a return.
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 The blocks within a function form a directed graph.
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 The entrypoint to the function is the first block created within
kono
parents:
diff changeset
113 it.
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 All of the blocks in a function must be reachable via some path from
kono
parents:
diff changeset
116 the first block.
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 It's OK to have more than one "return" from a function (i.e. multiple
kono
parents:
diff changeset
119 blocks that terminate by returning). */
kono
parents:
diff changeset
120 typedef struct gcc_jit_block gcc_jit_block;
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 /* A gcc_jit_rvalue is an expression within your code, with some type. */
kono
parents:
diff changeset
123 typedef struct gcc_jit_rvalue gcc_jit_rvalue;
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 /* A gcc_jit_lvalue is a storage location within your code (e.g. a
kono
parents:
diff changeset
126 variable, a parameter, etc). It is also a gcc_jit_rvalue; use
kono
parents:
diff changeset
127 gcc_jit_lvalue_as_rvalue to cast. */
kono
parents:
diff changeset
128 typedef struct gcc_jit_lvalue gcc_jit_lvalue;
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 /* A gcc_jit_param is a function parameter, used when creating a
kono
parents:
diff changeset
131 gcc_jit_function. It is also a gcc_jit_lvalue (and thus also an
kono
parents:
diff changeset
132 rvalue); use gcc_jit_param_as_lvalue to convert. */
kono
parents:
diff changeset
133 typedef struct gcc_jit_param gcc_jit_param;
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 /* A gcc_jit_case is for use when building multiway branches via
kono
parents:
diff changeset
136 gcc_jit_block_end_with_switch and represents a range of integer
kono
parents:
diff changeset
137 values (or an individual integer value) together with an associated
kono
parents:
diff changeset
138 destination block. */
kono
parents:
diff changeset
139 typedef struct gcc_jit_case gcc_jit_case;
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 /* Acquire a JIT-compilation context. */
kono
parents:
diff changeset
142 extern gcc_jit_context *
kono
parents:
diff changeset
143 gcc_jit_context_acquire (void);
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 /* Release the context. After this call, it's no longer valid to use
kono
parents:
diff changeset
146 the ctxt. */
kono
parents:
diff changeset
147 extern void
kono
parents:
diff changeset
148 gcc_jit_context_release (gcc_jit_context *ctxt);
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 /* Options present in the initial release of libgccjit.
kono
parents:
diff changeset
151 These were handled using enums. */
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 /* Options taking string values. */
kono
parents:
diff changeset
154 enum gcc_jit_str_option
kono
parents:
diff changeset
155 {
kono
parents:
diff changeset
156 /* The name of the program, for use as a prefix when printing error
kono
parents:
diff changeset
157 messages to stderr. If NULL, or default, "libgccjit.so" is used. */
kono
parents:
diff changeset
158 GCC_JIT_STR_OPTION_PROGNAME,
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 GCC_JIT_NUM_STR_OPTIONS
kono
parents:
diff changeset
161 };
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 /* Options taking int values. */
kono
parents:
diff changeset
164 enum gcc_jit_int_option
kono
parents:
diff changeset
165 {
kono
parents:
diff changeset
166 /* How much to optimize the code.
kono
parents:
diff changeset
167 Valid values are 0-3, corresponding to GCC's command-line options
kono
parents:
diff changeset
168 -O0 through -O3.
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 The default value is 0 (unoptimized). */
kono
parents:
diff changeset
171 GCC_JIT_INT_OPTION_OPTIMIZATION_LEVEL,
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 GCC_JIT_NUM_INT_OPTIONS
kono
parents:
diff changeset
174 };
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 /* Options taking boolean values.
kono
parents:
diff changeset
177 These all default to "false". */
kono
parents:
diff changeset
178 enum gcc_jit_bool_option
kono
parents:
diff changeset
179 {
kono
parents:
diff changeset
180 /* If true, gcc_jit_context_compile will attempt to do the right
kono
parents:
diff changeset
181 thing so that if you attach a debugger to the process, it will
kono
parents:
diff changeset
182 be able to inspect variables and step through your code.
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 Note that you can't step through code unless you set up source
kono
parents:
diff changeset
185 location information for the code (by creating and passing in
kono
parents:
diff changeset
186 gcc_jit_location instances). */
kono
parents:
diff changeset
187 GCC_JIT_BOOL_OPTION_DEBUGINFO,
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 /* If true, gcc_jit_context_compile will dump its initial "tree"
kono
parents:
diff changeset
190 representation of your code to stderr (before any
kono
parents:
diff changeset
191 optimizations). */
kono
parents:
diff changeset
192 GCC_JIT_BOOL_OPTION_DUMP_INITIAL_TREE,
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 /* If true, gcc_jit_context_compile will dump the "gimple"
kono
parents:
diff changeset
195 representation of your code to stderr, before any optimizations
kono
parents:
diff changeset
196 are performed. The dump resembles C code. */
kono
parents:
diff changeset
197 GCC_JIT_BOOL_OPTION_DUMP_INITIAL_GIMPLE,
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 /* If true, gcc_jit_context_compile will dump the final
kono
parents:
diff changeset
200 generated code to stderr, in the form of assembly language. */
kono
parents:
diff changeset
201 GCC_JIT_BOOL_OPTION_DUMP_GENERATED_CODE,
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 /* If true, gcc_jit_context_compile will print information to stderr
kono
parents:
diff changeset
204 on the actions it is performing, followed by a profile showing
kono
parents:
diff changeset
205 the time taken and memory usage of each phase.
kono
parents:
diff changeset
206 */
kono
parents:
diff changeset
207 GCC_JIT_BOOL_OPTION_DUMP_SUMMARY,
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 /* If true, gcc_jit_context_compile will dump copious
kono
parents:
diff changeset
210 amount of information on what it's doing to various
kono
parents:
diff changeset
211 files within a temporary directory. Use
kono
parents:
diff changeset
212 GCC_JIT_BOOL_OPTION_KEEP_INTERMEDIATES (see below) to
kono
parents:
diff changeset
213 see the results. The files are intended to be human-readable,
kono
parents:
diff changeset
214 but the exact files and their formats are subject to change.
kono
parents:
diff changeset
215 */
kono
parents:
diff changeset
216 GCC_JIT_BOOL_OPTION_DUMP_EVERYTHING,
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 /* If true, libgccjit will aggressively run its garbage collector, to
kono
parents:
diff changeset
219 shake out bugs (greatly slowing down the compile). This is likely
kono
parents:
diff changeset
220 to only be of interest to developers *of* the library. It is
kono
parents:
diff changeset
221 used when running the selftest suite. */
kono
parents:
diff changeset
222 GCC_JIT_BOOL_OPTION_SELFCHECK_GC,
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 /* If true, gcc_jit_context_release will not clean up
kono
parents:
diff changeset
225 intermediate files written to the filesystem, and will display
kono
parents:
diff changeset
226 their location on stderr. */
kono
parents:
diff changeset
227 GCC_JIT_BOOL_OPTION_KEEP_INTERMEDIATES,
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 GCC_JIT_NUM_BOOL_OPTIONS
kono
parents:
diff changeset
230 };
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 /* Set a string option on the given context.
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 The context takes a copy of the string, so the
kono
parents:
diff changeset
235 (const char *) buffer is not needed anymore after the call
kono
parents:
diff changeset
236 returns. */
kono
parents:
diff changeset
237 extern void
kono
parents:
diff changeset
238 gcc_jit_context_set_str_option (gcc_jit_context *ctxt,
kono
parents:
diff changeset
239 enum gcc_jit_str_option opt,
kono
parents:
diff changeset
240 const char *value);
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 /* Set an int option on the given context. */
kono
parents:
diff changeset
243 extern void
kono
parents:
diff changeset
244 gcc_jit_context_set_int_option (gcc_jit_context *ctxt,
kono
parents:
diff changeset
245 enum gcc_jit_int_option opt,
kono
parents:
diff changeset
246 int value);
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 /* Set a boolean option on the given context.
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 Zero is "false" (the default), non-zero is "true". */
kono
parents:
diff changeset
251 extern void
kono
parents:
diff changeset
252 gcc_jit_context_set_bool_option (gcc_jit_context *ctxt,
kono
parents:
diff changeset
253 enum gcc_jit_bool_option opt,
kono
parents:
diff changeset
254 int value);
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 /* Options added after the initial release of libgccjit.
kono
parents:
diff changeset
257 These are handled by providing an entrypoint per option,
kono
parents:
diff changeset
258 rather than by extending the enum gcc_jit_*_option,
kono
parents:
diff changeset
259 so that client code that use these new options can be identified
kono
parents:
diff changeset
260 from binary metadata. */
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 /* By default, libgccjit will issue an error about unreachable blocks
kono
parents:
diff changeset
263 within a function.
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 This option can be used to disable that error.
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 This entrypoint was added in LIBGCCJIT_ABI_2; you can test for
kono
parents:
diff changeset
268 its presence using
kono
parents:
diff changeset
269 #ifdef LIBGCCJIT_HAVE_gcc_jit_context_set_bool_allow_unreachable_blocks
kono
parents:
diff changeset
270 */
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 extern void
kono
parents:
diff changeset
273 gcc_jit_context_set_bool_allow_unreachable_blocks (gcc_jit_context *ctxt,
kono
parents:
diff changeset
274 int bool_value);
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 /* Pre-canned feature macro to indicate the presence of
kono
parents:
diff changeset
277 gcc_jit_context_set_bool_allow_unreachable_blocks. This can be
kono
parents:
diff changeset
278 tested for with #ifdef. */
kono
parents:
diff changeset
279 #define LIBGCCJIT_HAVE_gcc_jit_context_set_bool_allow_unreachable_blocks
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 /* Implementation detail:
kono
parents:
diff changeset
282 libgccjit internally generates assembler, and uses "driver" code
kono
parents:
diff changeset
283 for converting it to other formats (e.g. shared libraries).
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 By default, libgccjit will use an embedded copy of the driver
kono
parents:
diff changeset
286 code.
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 This option can be used to instead invoke an external driver executable
kono
parents:
diff changeset
289 as a subprocess.
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 This entrypoint was added in LIBGCCJIT_ABI_5; you can test for
kono
parents:
diff changeset
292 its presence using
kono
parents:
diff changeset
293 #ifdef LIBGCCJIT_HAVE_gcc_jit_context_set_bool_use_external_driver
kono
parents:
diff changeset
294 */
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 extern void
kono
parents:
diff changeset
297 gcc_jit_context_set_bool_use_external_driver (gcc_jit_context *ctxt,
kono
parents:
diff changeset
298 int bool_value);
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 /* Pre-canned feature macro to indicate the presence of
kono
parents:
diff changeset
301 gcc_jit_context_set_bool_use_external_driver. This can be
kono
parents:
diff changeset
302 tested for with #ifdef. */
kono
parents:
diff changeset
303 #define LIBGCCJIT_HAVE_gcc_jit_context_set_bool_use_external_driver
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 /* Add an arbitrary gcc command-line option to the context.
kono
parents:
diff changeset
306 The context takes a copy of the string, so the
kono
parents:
diff changeset
307 (const char *) optname is not needed anymore after the call
kono
parents:
diff changeset
308 returns.
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 Note that only some options are likely to be meaningful; there is no
kono
parents:
diff changeset
311 "frontend" within libgccjit, so typically only those affecting
kono
parents:
diff changeset
312 optimization and code-generation are likely to be useful.
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 This entrypoint was added in LIBGCCJIT_ABI_1; you can test for
kono
parents:
diff changeset
315 its presence using
kono
parents:
diff changeset
316 #ifdef LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option
kono
parents:
diff changeset
317 */
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 extern void
kono
parents:
diff changeset
320 gcc_jit_context_add_command_line_option (gcc_jit_context *ctxt,
kono
parents:
diff changeset
321 const char *optname);
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 /* Pre-canned feature-test macro for detecting the presence of
kono
parents:
diff changeset
324 gcc_jit_context_add_command_line_option within libgccjit.h. */
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 #define LIBGCCJIT_HAVE_gcc_jit_context_add_command_line_option
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 /* Compile the context to in-memory machine code.
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 This can be called more that once on a given context,
kono
parents:
diff changeset
331 although any errors that occur will block further compilation. */
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 extern gcc_jit_result *
kono
parents:
diff changeset
334 gcc_jit_context_compile (gcc_jit_context *ctxt);
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 /* Kinds of ahead-of-time compilation, for use with
kono
parents:
diff changeset
337 gcc_jit_context_compile_to_file. */
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 enum gcc_jit_output_kind
kono
parents:
diff changeset
340 {
kono
parents:
diff changeset
341 /* Compile the context to an assembler file. */
kono
parents:
diff changeset
342 GCC_JIT_OUTPUT_KIND_ASSEMBLER,
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 /* Compile the context to an object file. */
kono
parents:
diff changeset
345 GCC_JIT_OUTPUT_KIND_OBJECT_FILE,
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 /* Compile the context to a dynamic library. */
kono
parents:
diff changeset
348 GCC_JIT_OUTPUT_KIND_DYNAMIC_LIBRARY,
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 /* Compile the context to an executable. */
kono
parents:
diff changeset
351 GCC_JIT_OUTPUT_KIND_EXECUTABLE
kono
parents:
diff changeset
352 };
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 /* Compile the context to a file of the given kind.
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 This can be called more that once on a given context,
kono
parents:
diff changeset
357 although any errors that occur will block further compilation. */
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 extern void
kono
parents:
diff changeset
360 gcc_jit_context_compile_to_file (gcc_jit_context *ctxt,
kono
parents:
diff changeset
361 enum gcc_jit_output_kind output_kind,
kono
parents:
diff changeset
362 const char *output_path);
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 /* To help with debugging: dump a C-like representation to the given path,
kono
parents:
diff changeset
365 describing what's been set up on the context.
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 If "update_locations" is true, then also set up gcc_jit_location
kono
parents:
diff changeset
368 information throughout the context, pointing at the dump file as if it
kono
parents:
diff changeset
369 were a source file. This may be of use in conjunction with
kono
parents:
diff changeset
370 GCC_JIT_BOOL_OPTION_DEBUGINFO to allow stepping through the code in a
kono
parents:
diff changeset
371 debugger. */
kono
parents:
diff changeset
372 extern void
kono
parents:
diff changeset
373 gcc_jit_context_dump_to_file (gcc_jit_context *ctxt,
kono
parents:
diff changeset
374 const char *path,
kono
parents:
diff changeset
375 int update_locations);
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 /* To help with debugging; enable ongoing logging of the context's
kono
parents:
diff changeset
378 activity to the given FILE *.
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 The caller remains responsible for closing "logfile".
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 Params "flags" and "verbosity" are reserved for future use, and
kono
parents:
diff changeset
383 must both be 0 for now. */
kono
parents:
diff changeset
384 extern void
kono
parents:
diff changeset
385 gcc_jit_context_set_logfile (gcc_jit_context *ctxt,
kono
parents:
diff changeset
386 FILE *logfile,
kono
parents:
diff changeset
387 int flags,
kono
parents:
diff changeset
388 int verbosity);
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 /* To be called after any API call, this gives the first error message
kono
parents:
diff changeset
391 that occurred on the context.
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 The returned string is valid for the rest of the lifetime of the
kono
parents:
diff changeset
394 context.
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 If no errors occurred, this will be NULL. */
kono
parents:
diff changeset
397 extern const char *
kono
parents:
diff changeset
398 gcc_jit_context_get_first_error (gcc_jit_context *ctxt);
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 /* To be called after any API call, this gives the last error message
kono
parents:
diff changeset
401 that occurred on the context.
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 If no errors occurred, this will be NULL.
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 If non-NULL, the returned string is only guaranteed to be valid until
kono
parents:
diff changeset
406 the next call to libgccjit relating to this context. */
kono
parents:
diff changeset
407 extern const char *
kono
parents:
diff changeset
408 gcc_jit_context_get_last_error (gcc_jit_context *ctxt);
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 /* Locate a given function within the built machine code.
kono
parents:
diff changeset
411 This will need to be cast to a function pointer of the
kono
parents:
diff changeset
412 correct type before it can be called. */
kono
parents:
diff changeset
413 extern void *
kono
parents:
diff changeset
414 gcc_jit_result_get_code (gcc_jit_result *result,
kono
parents:
diff changeset
415 const char *funcname);
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 /* Locate a given global within the built machine code.
kono
parents:
diff changeset
418 It must have been created using GCC_JIT_GLOBAL_EXPORTED.
kono
parents:
diff changeset
419 This is a ptr to the global, so e.g. for an int this is an int *. */
kono
parents:
diff changeset
420 extern void *
kono
parents:
diff changeset
421 gcc_jit_result_get_global (gcc_jit_result *result,
kono
parents:
diff changeset
422 const char *name);
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 /* Once we're done with the code, this unloads the built .so file.
kono
parents:
diff changeset
425 This cleans up the result; after calling this, it's no longer
kono
parents:
diff changeset
426 valid to use the result. */
kono
parents:
diff changeset
427 extern void
kono
parents:
diff changeset
428 gcc_jit_result_release (gcc_jit_result *result);
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 /**********************************************************************
kono
parents:
diff changeset
432 Functions for creating "contextual" objects.
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 All objects created by these functions share the lifetime of the context
kono
parents:
diff changeset
435 they are created within, and are automatically cleaned up for you when
kono
parents:
diff changeset
436 you call gcc_jit_context_release on the context.
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 Note that this means you can't use references to them after you've
kono
parents:
diff changeset
439 released their context.
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 All (const char *) string arguments passed to these functions are
kono
parents:
diff changeset
442 copied, so you don't need to keep them around.
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 You create code by adding a sequence of statements to blocks.
kono
parents:
diff changeset
445 **********************************************************************/
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 /**********************************************************************
kono
parents:
diff changeset
448 The base class of "contextual" object.
kono
parents:
diff changeset
449 **********************************************************************/
kono
parents:
diff changeset
450 /* Which context is "obj" within? */
kono
parents:
diff changeset
451 extern gcc_jit_context *
kono
parents:
diff changeset
452 gcc_jit_object_get_context (gcc_jit_object *obj);
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 /* Get a human-readable description of this object.
kono
parents:
diff changeset
455 The string buffer is created the first time this is called on a given
kono
parents:
diff changeset
456 object, and persists until the object's context is released. */
kono
parents:
diff changeset
457 extern const char *
kono
parents:
diff changeset
458 gcc_jit_object_get_debug_string (gcc_jit_object *obj);
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 /**********************************************************************
kono
parents:
diff changeset
461 Debugging information.
kono
parents:
diff changeset
462 **********************************************************************/
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 /* Creating source code locations for use by the debugger.
kono
parents:
diff changeset
465 Line and column numbers are 1-based. */
kono
parents:
diff changeset
466 extern gcc_jit_location *
kono
parents:
diff changeset
467 gcc_jit_context_new_location (gcc_jit_context *ctxt,
kono
parents:
diff changeset
468 const char *filename,
kono
parents:
diff changeset
469 int line,
kono
parents:
diff changeset
470 int column);
kono
parents:
diff changeset
471
kono
parents:
diff changeset
472 /* Upcasting from location to object. */
kono
parents:
diff changeset
473 extern gcc_jit_object *
kono
parents:
diff changeset
474 gcc_jit_location_as_object (gcc_jit_location *loc);
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 /**********************************************************************
kono
parents:
diff changeset
478 Types.
kono
parents:
diff changeset
479 **********************************************************************/
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 /* Upcasting from type to object. */
kono
parents:
diff changeset
482 extern gcc_jit_object *
kono
parents:
diff changeset
483 gcc_jit_type_as_object (gcc_jit_type *type);
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 /* Access to specific types. */
kono
parents:
diff changeset
486 enum gcc_jit_types
kono
parents:
diff changeset
487 {
kono
parents:
diff changeset
488 /* C's "void" type. */
kono
parents:
diff changeset
489 GCC_JIT_TYPE_VOID,
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 /* "void *". */
kono
parents:
diff changeset
492 GCC_JIT_TYPE_VOID_PTR,
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 /* C++'s bool type; also C99's "_Bool" type, aka "bool" if using
kono
parents:
diff changeset
495 stdbool.h. */
kono
parents:
diff changeset
496 GCC_JIT_TYPE_BOOL,
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 /* Various integer types. */
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 /* C's "char" (of some signedness) and the variants where the
kono
parents:
diff changeset
501 signedness is specified. */
kono
parents:
diff changeset
502 GCC_JIT_TYPE_CHAR,
kono
parents:
diff changeset
503 GCC_JIT_TYPE_SIGNED_CHAR,
kono
parents:
diff changeset
504 GCC_JIT_TYPE_UNSIGNED_CHAR,
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 /* C's "short" and "unsigned short". */
kono
parents:
diff changeset
507 GCC_JIT_TYPE_SHORT, /* signed */
kono
parents:
diff changeset
508 GCC_JIT_TYPE_UNSIGNED_SHORT,
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 /* C's "int" and "unsigned int". */
kono
parents:
diff changeset
511 GCC_JIT_TYPE_INT, /* signed */
kono
parents:
diff changeset
512 GCC_JIT_TYPE_UNSIGNED_INT,
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 /* C's "long" and "unsigned long". */
kono
parents:
diff changeset
515 GCC_JIT_TYPE_LONG, /* signed */
kono
parents:
diff changeset
516 GCC_JIT_TYPE_UNSIGNED_LONG,
kono
parents:
diff changeset
517
kono
parents:
diff changeset
518 /* C99's "long long" and "unsigned long long". */
kono
parents:
diff changeset
519 GCC_JIT_TYPE_LONG_LONG, /* signed */
kono
parents:
diff changeset
520 GCC_JIT_TYPE_UNSIGNED_LONG_LONG,
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 /* Floating-point types */
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 GCC_JIT_TYPE_FLOAT,
kono
parents:
diff changeset
525 GCC_JIT_TYPE_DOUBLE,
kono
parents:
diff changeset
526 GCC_JIT_TYPE_LONG_DOUBLE,
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 /* C type: (const char *). */
kono
parents:
diff changeset
529 GCC_JIT_TYPE_CONST_CHAR_PTR,
kono
parents:
diff changeset
530
kono
parents:
diff changeset
531 /* The C "size_t" type. */
kono
parents:
diff changeset
532 GCC_JIT_TYPE_SIZE_T,
kono
parents:
diff changeset
533
kono
parents:
diff changeset
534 /* C type: (FILE *) */
kono
parents:
diff changeset
535 GCC_JIT_TYPE_FILE_PTR,
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 /* Complex numbers. */
kono
parents:
diff changeset
538 GCC_JIT_TYPE_COMPLEX_FLOAT,
kono
parents:
diff changeset
539 GCC_JIT_TYPE_COMPLEX_DOUBLE,
kono
parents:
diff changeset
540 GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE
kono
parents:
diff changeset
541
kono
parents:
diff changeset
542 };
kono
parents:
diff changeset
543
kono
parents:
diff changeset
544 extern gcc_jit_type *
kono
parents:
diff changeset
545 gcc_jit_context_get_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
546 enum gcc_jit_types type_);
kono
parents:
diff changeset
547
kono
parents:
diff changeset
548 /* Get the integer type of the given size and signedness. */
kono
parents:
diff changeset
549 extern gcc_jit_type *
kono
parents:
diff changeset
550 gcc_jit_context_get_int_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
551 int num_bytes, int is_signed);
kono
parents:
diff changeset
552
kono
parents:
diff changeset
553 /* Constructing new types. */
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 /* Given type "T", get type "T*". */
kono
parents:
diff changeset
556 extern gcc_jit_type *
kono
parents:
diff changeset
557 gcc_jit_type_get_pointer (gcc_jit_type *type);
kono
parents:
diff changeset
558
kono
parents:
diff changeset
559 /* Given type "T", get type "const T". */
kono
parents:
diff changeset
560 extern gcc_jit_type *
kono
parents:
diff changeset
561 gcc_jit_type_get_const (gcc_jit_type *type);
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 /* Given type "T", get type "volatile T". */
kono
parents:
diff changeset
564 extern gcc_jit_type *
kono
parents:
diff changeset
565 gcc_jit_type_get_volatile (gcc_jit_type *type);
kono
parents:
diff changeset
566
kono
parents:
diff changeset
567 /* Given type "T", get type "T[N]" (for a constant N). */
kono
parents:
diff changeset
568 extern gcc_jit_type *
kono
parents:
diff changeset
569 gcc_jit_context_new_array_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
570 gcc_jit_location *loc,
kono
parents:
diff changeset
571 gcc_jit_type *element_type,
kono
parents:
diff changeset
572 int num_elements);
kono
parents:
diff changeset
573
kono
parents:
diff changeset
574 /* Struct-handling. */
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 /* Create a field, for use within a struct or union. */
kono
parents:
diff changeset
577 extern gcc_jit_field *
kono
parents:
diff changeset
578 gcc_jit_context_new_field (gcc_jit_context *ctxt,
kono
parents:
diff changeset
579 gcc_jit_location *loc,
kono
parents:
diff changeset
580 gcc_jit_type *type,
kono
parents:
diff changeset
581 const char *name);
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 /* Upcasting from field to object. */
kono
parents:
diff changeset
584 extern gcc_jit_object *
kono
parents:
diff changeset
585 gcc_jit_field_as_object (gcc_jit_field *field);
kono
parents:
diff changeset
586
kono
parents:
diff changeset
587 /* Create a struct type from an array of fields. */
kono
parents:
diff changeset
588 extern gcc_jit_struct *
kono
parents:
diff changeset
589 gcc_jit_context_new_struct_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
590 gcc_jit_location *loc,
kono
parents:
diff changeset
591 const char *name,
kono
parents:
diff changeset
592 int num_fields,
kono
parents:
diff changeset
593 gcc_jit_field **fields);
kono
parents:
diff changeset
594
kono
parents:
diff changeset
595 /* Create an opaque struct type. */
kono
parents:
diff changeset
596 extern gcc_jit_struct *
kono
parents:
diff changeset
597 gcc_jit_context_new_opaque_struct (gcc_jit_context *ctxt,
kono
parents:
diff changeset
598 gcc_jit_location *loc,
kono
parents:
diff changeset
599 const char *name);
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 /* Upcast a struct to a type. */
kono
parents:
diff changeset
602 extern gcc_jit_type *
kono
parents:
diff changeset
603 gcc_jit_struct_as_type (gcc_jit_struct *struct_type);
kono
parents:
diff changeset
604
kono
parents:
diff changeset
605 /* Populating the fields of a formerly-opaque struct type.
kono
parents:
diff changeset
606 This can only be called once on a given struct type. */
kono
parents:
diff changeset
607 extern void
kono
parents:
diff changeset
608 gcc_jit_struct_set_fields (gcc_jit_struct *struct_type,
kono
parents:
diff changeset
609 gcc_jit_location *loc,
kono
parents:
diff changeset
610 int num_fields,
kono
parents:
diff changeset
611 gcc_jit_field **fields);
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 /* Unions work similarly to structs. */
kono
parents:
diff changeset
614 extern gcc_jit_type *
kono
parents:
diff changeset
615 gcc_jit_context_new_union_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
616 gcc_jit_location *loc,
kono
parents:
diff changeset
617 const char *name,
kono
parents:
diff changeset
618 int num_fields,
kono
parents:
diff changeset
619 gcc_jit_field **fields);
kono
parents:
diff changeset
620
kono
parents:
diff changeset
621 /* Function pointers. */
kono
parents:
diff changeset
622
kono
parents:
diff changeset
623 extern gcc_jit_type *
kono
parents:
diff changeset
624 gcc_jit_context_new_function_ptr_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
625 gcc_jit_location *loc,
kono
parents:
diff changeset
626 gcc_jit_type *return_type,
kono
parents:
diff changeset
627 int num_params,
kono
parents:
diff changeset
628 gcc_jit_type **param_types,
kono
parents:
diff changeset
629 int is_variadic);
kono
parents:
diff changeset
630
kono
parents:
diff changeset
631 /**********************************************************************
kono
parents:
diff changeset
632 Constructing functions.
kono
parents:
diff changeset
633 **********************************************************************/
kono
parents:
diff changeset
634 /* Create a function param. */
kono
parents:
diff changeset
635 extern gcc_jit_param *
kono
parents:
diff changeset
636 gcc_jit_context_new_param (gcc_jit_context *ctxt,
kono
parents:
diff changeset
637 gcc_jit_location *loc,
kono
parents:
diff changeset
638 gcc_jit_type *type,
kono
parents:
diff changeset
639 const char *name);
kono
parents:
diff changeset
640
kono
parents:
diff changeset
641 /* Upcasting from param to object. */
kono
parents:
diff changeset
642 extern gcc_jit_object *
kono
parents:
diff changeset
643 gcc_jit_param_as_object (gcc_jit_param *param);
kono
parents:
diff changeset
644
kono
parents:
diff changeset
645 /* Upcasting from param to lvalue. */
kono
parents:
diff changeset
646 extern gcc_jit_lvalue *
kono
parents:
diff changeset
647 gcc_jit_param_as_lvalue (gcc_jit_param *param);
kono
parents:
diff changeset
648
kono
parents:
diff changeset
649 /* Upcasting from param to rvalue. */
kono
parents:
diff changeset
650 extern gcc_jit_rvalue *
kono
parents:
diff changeset
651 gcc_jit_param_as_rvalue (gcc_jit_param *param);
kono
parents:
diff changeset
652
kono
parents:
diff changeset
653 /* Kinds of function. */
kono
parents:
diff changeset
654 enum gcc_jit_function_kind
kono
parents:
diff changeset
655 {
kono
parents:
diff changeset
656 /* Function is defined by the client code and visible
kono
parents:
diff changeset
657 by name outside of the JIT. */
kono
parents:
diff changeset
658 GCC_JIT_FUNCTION_EXPORTED,
kono
parents:
diff changeset
659
kono
parents:
diff changeset
660 /* Function is defined by the client code, but is invisible
kono
parents:
diff changeset
661 outside of the JIT. Analogous to a "static" function. */
kono
parents:
diff changeset
662 GCC_JIT_FUNCTION_INTERNAL,
kono
parents:
diff changeset
663
kono
parents:
diff changeset
664 /* Function is not defined by the client code; we're merely
kono
parents:
diff changeset
665 referring to it. Analogous to using an "extern" function from a
kono
parents:
diff changeset
666 header file. */
kono
parents:
diff changeset
667 GCC_JIT_FUNCTION_IMPORTED,
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 /* Function is only ever inlined into other functions, and is
kono
parents:
diff changeset
670 invisible outside of the JIT.
kono
parents:
diff changeset
671
kono
parents:
diff changeset
672 Analogous to prefixing with "inline" and adding
kono
parents:
diff changeset
673 __attribute__((always_inline)).
kono
parents:
diff changeset
674
kono
parents:
diff changeset
675 Inlining will only occur when the optimization level is
kono
parents:
diff changeset
676 above 0; when optimization is off, this is essentially the
kono
parents:
diff changeset
677 same as GCC_JIT_FUNCTION_INTERNAL. */
kono
parents:
diff changeset
678 GCC_JIT_FUNCTION_ALWAYS_INLINE
kono
parents:
diff changeset
679 };
kono
parents:
diff changeset
680
kono
parents:
diff changeset
681 /* Create a function. */
kono
parents:
diff changeset
682 extern gcc_jit_function *
kono
parents:
diff changeset
683 gcc_jit_context_new_function (gcc_jit_context *ctxt,
kono
parents:
diff changeset
684 gcc_jit_location *loc,
kono
parents:
diff changeset
685 enum gcc_jit_function_kind kind,
kono
parents:
diff changeset
686 gcc_jit_type *return_type,
kono
parents:
diff changeset
687 const char *name,
kono
parents:
diff changeset
688 int num_params,
kono
parents:
diff changeset
689 gcc_jit_param **params,
kono
parents:
diff changeset
690 int is_variadic);
kono
parents:
diff changeset
691
kono
parents:
diff changeset
692 /* Create a reference to a builtin function (sometimes called
kono
parents:
diff changeset
693 intrinsic functions). */
kono
parents:
diff changeset
694 extern gcc_jit_function *
kono
parents:
diff changeset
695 gcc_jit_context_get_builtin_function (gcc_jit_context *ctxt,
kono
parents:
diff changeset
696 const char *name);
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 /* Upcasting from function to object. */
kono
parents:
diff changeset
699 extern gcc_jit_object *
kono
parents:
diff changeset
700 gcc_jit_function_as_object (gcc_jit_function *func);
kono
parents:
diff changeset
701
kono
parents:
diff changeset
702 /* Get a specific param of a function by index. */
kono
parents:
diff changeset
703 extern gcc_jit_param *
kono
parents:
diff changeset
704 gcc_jit_function_get_param (gcc_jit_function *func, int index);
kono
parents:
diff changeset
705
kono
parents:
diff changeset
706 /* Emit the function in graphviz format. */
kono
parents:
diff changeset
707 extern void
kono
parents:
diff changeset
708 gcc_jit_function_dump_to_dot (gcc_jit_function *func,
kono
parents:
diff changeset
709 const char *path);
kono
parents:
diff changeset
710
kono
parents:
diff changeset
711 /* Create a block.
kono
parents:
diff changeset
712
kono
parents:
diff changeset
713 The name can be NULL, or you can give it a meaningful name, which
kono
parents:
diff changeset
714 may show up in dumps of the internal representation, and in error
kono
parents:
diff changeset
715 messages. */
kono
parents:
diff changeset
716 extern gcc_jit_block *
kono
parents:
diff changeset
717 gcc_jit_function_new_block (gcc_jit_function *func,
kono
parents:
diff changeset
718 const char *name);
kono
parents:
diff changeset
719
kono
parents:
diff changeset
720 /* Upcasting from block to object. */
kono
parents:
diff changeset
721 extern gcc_jit_object *
kono
parents:
diff changeset
722 gcc_jit_block_as_object (gcc_jit_block *block);
kono
parents:
diff changeset
723
kono
parents:
diff changeset
724 /* Which function is this block within? */
kono
parents:
diff changeset
725 extern gcc_jit_function *
kono
parents:
diff changeset
726 gcc_jit_block_get_function (gcc_jit_block *block);
kono
parents:
diff changeset
727
kono
parents:
diff changeset
728 /**********************************************************************
kono
parents:
diff changeset
729 lvalues, rvalues and expressions.
kono
parents:
diff changeset
730 **********************************************************************/
kono
parents:
diff changeset
731 enum gcc_jit_global_kind
kono
parents:
diff changeset
732 {
kono
parents:
diff changeset
733 /* Global is defined by the client code and visible
kono
parents:
diff changeset
734 by name outside of this JIT context via gcc_jit_result_get_global. */
kono
parents:
diff changeset
735 GCC_JIT_GLOBAL_EXPORTED,
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 /* Global is defined by the client code, but is invisible
kono
parents:
diff changeset
738 outside of this JIT context. Analogous to a "static" global. */
kono
parents:
diff changeset
739 GCC_JIT_GLOBAL_INTERNAL,
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741 /* Global is not defined by the client code; we're merely
kono
parents:
diff changeset
742 referring to it. Analogous to using an "extern" global from a
kono
parents:
diff changeset
743 header file. */
kono
parents:
diff changeset
744 GCC_JIT_GLOBAL_IMPORTED
kono
parents:
diff changeset
745 };
kono
parents:
diff changeset
746
kono
parents:
diff changeset
747 extern gcc_jit_lvalue *
kono
parents:
diff changeset
748 gcc_jit_context_new_global (gcc_jit_context *ctxt,
kono
parents:
diff changeset
749 gcc_jit_location *loc,
kono
parents:
diff changeset
750 enum gcc_jit_global_kind kind,
kono
parents:
diff changeset
751 gcc_jit_type *type,
kono
parents:
diff changeset
752 const char *name);
kono
parents:
diff changeset
753
kono
parents:
diff changeset
754 /* Upcasting. */
kono
parents:
diff changeset
755 extern gcc_jit_object *
kono
parents:
diff changeset
756 gcc_jit_lvalue_as_object (gcc_jit_lvalue *lvalue);
kono
parents:
diff changeset
757
kono
parents:
diff changeset
758 extern gcc_jit_rvalue *
kono
parents:
diff changeset
759 gcc_jit_lvalue_as_rvalue (gcc_jit_lvalue *lvalue);
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 extern gcc_jit_object *
kono
parents:
diff changeset
762 gcc_jit_rvalue_as_object (gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
763
kono
parents:
diff changeset
764 extern gcc_jit_type *
kono
parents:
diff changeset
765 gcc_jit_rvalue_get_type (gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
766
kono
parents:
diff changeset
767 /* Integer constants. */
kono
parents:
diff changeset
768 extern gcc_jit_rvalue *
kono
parents:
diff changeset
769 gcc_jit_context_new_rvalue_from_int (gcc_jit_context *ctxt,
kono
parents:
diff changeset
770 gcc_jit_type *numeric_type,
kono
parents:
diff changeset
771 int value);
kono
parents:
diff changeset
772
kono
parents:
diff changeset
773 extern gcc_jit_rvalue *
kono
parents:
diff changeset
774 gcc_jit_context_new_rvalue_from_long (gcc_jit_context *ctxt,
kono
parents:
diff changeset
775 gcc_jit_type *numeric_type,
kono
parents:
diff changeset
776 long value);
kono
parents:
diff changeset
777
kono
parents:
diff changeset
778 extern gcc_jit_rvalue *
kono
parents:
diff changeset
779 gcc_jit_context_zero (gcc_jit_context *ctxt,
kono
parents:
diff changeset
780 gcc_jit_type *numeric_type);
kono
parents:
diff changeset
781
kono
parents:
diff changeset
782 extern gcc_jit_rvalue *
kono
parents:
diff changeset
783 gcc_jit_context_one (gcc_jit_context *ctxt,
kono
parents:
diff changeset
784 gcc_jit_type *numeric_type);
kono
parents:
diff changeset
785
kono
parents:
diff changeset
786 /* Floating-point constants. */
kono
parents:
diff changeset
787 extern gcc_jit_rvalue *
kono
parents:
diff changeset
788 gcc_jit_context_new_rvalue_from_double (gcc_jit_context *ctxt,
kono
parents:
diff changeset
789 gcc_jit_type *numeric_type,
kono
parents:
diff changeset
790 double value);
kono
parents:
diff changeset
791
kono
parents:
diff changeset
792 /* Pointers. */
kono
parents:
diff changeset
793 extern gcc_jit_rvalue *
kono
parents:
diff changeset
794 gcc_jit_context_new_rvalue_from_ptr (gcc_jit_context *ctxt,
kono
parents:
diff changeset
795 gcc_jit_type *pointer_type,
kono
parents:
diff changeset
796 void *value);
kono
parents:
diff changeset
797
kono
parents:
diff changeset
798 extern gcc_jit_rvalue *
kono
parents:
diff changeset
799 gcc_jit_context_null (gcc_jit_context *ctxt,
kono
parents:
diff changeset
800 gcc_jit_type *pointer_type);
kono
parents:
diff changeset
801
kono
parents:
diff changeset
802 /* String literals. */
kono
parents:
diff changeset
803 extern gcc_jit_rvalue *
kono
parents:
diff changeset
804 gcc_jit_context_new_string_literal (gcc_jit_context *ctxt,
kono
parents:
diff changeset
805 const char *value);
kono
parents:
diff changeset
806
kono
parents:
diff changeset
807 enum gcc_jit_unary_op
kono
parents:
diff changeset
808 {
kono
parents:
diff changeset
809 /* Negate an arithmetic value; analogous to:
kono
parents:
diff changeset
810 -(EXPR)
kono
parents:
diff changeset
811 in C. */
kono
parents:
diff changeset
812 GCC_JIT_UNARY_OP_MINUS,
kono
parents:
diff changeset
813
kono
parents:
diff changeset
814 /* Bitwise negation of an integer value (one's complement); analogous
kono
parents:
diff changeset
815 to:
kono
parents:
diff changeset
816 ~(EXPR)
kono
parents:
diff changeset
817 in C. */
kono
parents:
diff changeset
818 GCC_JIT_UNARY_OP_BITWISE_NEGATE,
kono
parents:
diff changeset
819
kono
parents:
diff changeset
820 /* Logical negation of an arithmetic or pointer value; analogous to:
kono
parents:
diff changeset
821 !(EXPR)
kono
parents:
diff changeset
822 in C. */
kono
parents:
diff changeset
823 GCC_JIT_UNARY_OP_LOGICAL_NEGATE,
kono
parents:
diff changeset
824
kono
parents:
diff changeset
825 /* Absolute value of an arithmetic expression; analogous to:
kono
parents:
diff changeset
826 abs (EXPR)
kono
parents:
diff changeset
827 in C. */
kono
parents:
diff changeset
828 GCC_JIT_UNARY_OP_ABS
kono
parents:
diff changeset
829
kono
parents:
diff changeset
830 };
kono
parents:
diff changeset
831
kono
parents:
diff changeset
832 extern gcc_jit_rvalue *
kono
parents:
diff changeset
833 gcc_jit_context_new_unary_op (gcc_jit_context *ctxt,
kono
parents:
diff changeset
834 gcc_jit_location *loc,
kono
parents:
diff changeset
835 enum gcc_jit_unary_op op,
kono
parents:
diff changeset
836 gcc_jit_type *result_type,
kono
parents:
diff changeset
837 gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 enum gcc_jit_binary_op
kono
parents:
diff changeset
840 {
kono
parents:
diff changeset
841 /* Addition of arithmetic values; analogous to:
kono
parents:
diff changeset
842 (EXPR_A) + (EXPR_B)
kono
parents:
diff changeset
843 in C.
kono
parents:
diff changeset
844 For pointer addition, use gcc_jit_context_new_array_access. */
kono
parents:
diff changeset
845 GCC_JIT_BINARY_OP_PLUS,
kono
parents:
diff changeset
846
kono
parents:
diff changeset
847 /* Subtraction of arithmetic values; analogous to:
kono
parents:
diff changeset
848 (EXPR_A) - (EXPR_B)
kono
parents:
diff changeset
849 in C. */
kono
parents:
diff changeset
850 GCC_JIT_BINARY_OP_MINUS,
kono
parents:
diff changeset
851
kono
parents:
diff changeset
852 /* Multiplication of a pair of arithmetic values; analogous to:
kono
parents:
diff changeset
853 (EXPR_A) * (EXPR_B)
kono
parents:
diff changeset
854 in C. */
kono
parents:
diff changeset
855 GCC_JIT_BINARY_OP_MULT,
kono
parents:
diff changeset
856
kono
parents:
diff changeset
857 /* Quotient of division of arithmetic values; analogous to:
kono
parents:
diff changeset
858 (EXPR_A) / (EXPR_B)
kono
parents:
diff changeset
859 in C.
kono
parents:
diff changeset
860 The result type affects the kind of division: if the result type is
kono
parents:
diff changeset
861 integer-based, then the result is truncated towards zero, whereas
kono
parents:
diff changeset
862 a floating-point result type indicates floating-point division. */
kono
parents:
diff changeset
863 GCC_JIT_BINARY_OP_DIVIDE,
kono
parents:
diff changeset
864
kono
parents:
diff changeset
865 /* Remainder of division of arithmetic values; analogous to:
kono
parents:
diff changeset
866 (EXPR_A) % (EXPR_B)
kono
parents:
diff changeset
867 in C. */
kono
parents:
diff changeset
868 GCC_JIT_BINARY_OP_MODULO,
kono
parents:
diff changeset
869
kono
parents:
diff changeset
870 /* Bitwise AND; analogous to:
kono
parents:
diff changeset
871 (EXPR_A) & (EXPR_B)
kono
parents:
diff changeset
872 in C. */
kono
parents:
diff changeset
873 GCC_JIT_BINARY_OP_BITWISE_AND,
kono
parents:
diff changeset
874
kono
parents:
diff changeset
875 /* Bitwise exclusive OR; analogous to:
kono
parents:
diff changeset
876 (EXPR_A) ^ (EXPR_B)
kono
parents:
diff changeset
877 in C. */
kono
parents:
diff changeset
878 GCC_JIT_BINARY_OP_BITWISE_XOR,
kono
parents:
diff changeset
879
kono
parents:
diff changeset
880 /* Bitwise inclusive OR; analogous to:
kono
parents:
diff changeset
881 (EXPR_A) | (EXPR_B)
kono
parents:
diff changeset
882 in C. */
kono
parents:
diff changeset
883 GCC_JIT_BINARY_OP_BITWISE_OR,
kono
parents:
diff changeset
884
kono
parents:
diff changeset
885 /* Logical AND; analogous to:
kono
parents:
diff changeset
886 (EXPR_A) && (EXPR_B)
kono
parents:
diff changeset
887 in C. */
kono
parents:
diff changeset
888 GCC_JIT_BINARY_OP_LOGICAL_AND,
kono
parents:
diff changeset
889
kono
parents:
diff changeset
890 /* Logical OR; analogous to:
kono
parents:
diff changeset
891 (EXPR_A) || (EXPR_B)
kono
parents:
diff changeset
892 in C. */
kono
parents:
diff changeset
893 GCC_JIT_BINARY_OP_LOGICAL_OR,
kono
parents:
diff changeset
894
kono
parents:
diff changeset
895 /* Left shift; analogous to:
kono
parents:
diff changeset
896 (EXPR_A) << (EXPR_B)
kono
parents:
diff changeset
897 in C. */
kono
parents:
diff changeset
898 GCC_JIT_BINARY_OP_LSHIFT,
kono
parents:
diff changeset
899
kono
parents:
diff changeset
900 /* Right shift; analogous to:
kono
parents:
diff changeset
901 (EXPR_A) >> (EXPR_B)
kono
parents:
diff changeset
902 in C. */
kono
parents:
diff changeset
903 GCC_JIT_BINARY_OP_RSHIFT
kono
parents:
diff changeset
904 };
kono
parents:
diff changeset
905
kono
parents:
diff changeset
906 extern gcc_jit_rvalue *
kono
parents:
diff changeset
907 gcc_jit_context_new_binary_op (gcc_jit_context *ctxt,
kono
parents:
diff changeset
908 gcc_jit_location *loc,
kono
parents:
diff changeset
909 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
910 gcc_jit_type *result_type,
kono
parents:
diff changeset
911 gcc_jit_rvalue *a, gcc_jit_rvalue *b);
kono
parents:
diff changeset
912
kono
parents:
diff changeset
913 /* (Comparisons are treated as separate from "binary_op" to save
kono
parents:
diff changeset
914 you having to specify the result_type). */
kono
parents:
diff changeset
915
kono
parents:
diff changeset
916 enum gcc_jit_comparison
kono
parents:
diff changeset
917 {
kono
parents:
diff changeset
918 /* (EXPR_A) == (EXPR_B). */
kono
parents:
diff changeset
919 GCC_JIT_COMPARISON_EQ,
kono
parents:
diff changeset
920
kono
parents:
diff changeset
921 /* (EXPR_A) != (EXPR_B). */
kono
parents:
diff changeset
922 GCC_JIT_COMPARISON_NE,
kono
parents:
diff changeset
923
kono
parents:
diff changeset
924 /* (EXPR_A) < (EXPR_B). */
kono
parents:
diff changeset
925 GCC_JIT_COMPARISON_LT,
kono
parents:
diff changeset
926
kono
parents:
diff changeset
927 /* (EXPR_A) <=(EXPR_B). */
kono
parents:
diff changeset
928 GCC_JIT_COMPARISON_LE,
kono
parents:
diff changeset
929
kono
parents:
diff changeset
930 /* (EXPR_A) > (EXPR_B). */
kono
parents:
diff changeset
931 GCC_JIT_COMPARISON_GT,
kono
parents:
diff changeset
932
kono
parents:
diff changeset
933 /* (EXPR_A) >= (EXPR_B). */
kono
parents:
diff changeset
934 GCC_JIT_COMPARISON_GE
kono
parents:
diff changeset
935 };
kono
parents:
diff changeset
936
kono
parents:
diff changeset
937 extern gcc_jit_rvalue *
kono
parents:
diff changeset
938 gcc_jit_context_new_comparison (gcc_jit_context *ctxt,
kono
parents:
diff changeset
939 gcc_jit_location *loc,
kono
parents:
diff changeset
940 enum gcc_jit_comparison op,
kono
parents:
diff changeset
941 gcc_jit_rvalue *a, gcc_jit_rvalue *b);
kono
parents:
diff changeset
942
kono
parents:
diff changeset
943 /* Function calls. */
kono
parents:
diff changeset
944
kono
parents:
diff changeset
945 /* Call of a specific function. */
kono
parents:
diff changeset
946 extern gcc_jit_rvalue *
kono
parents:
diff changeset
947 gcc_jit_context_new_call (gcc_jit_context *ctxt,
kono
parents:
diff changeset
948 gcc_jit_location *loc,
kono
parents:
diff changeset
949 gcc_jit_function *func,
kono
parents:
diff changeset
950 int numargs , gcc_jit_rvalue **args);
kono
parents:
diff changeset
951
kono
parents:
diff changeset
952 /* Call through a function pointer. */
kono
parents:
diff changeset
953 extern gcc_jit_rvalue *
kono
parents:
diff changeset
954 gcc_jit_context_new_call_through_ptr (gcc_jit_context *ctxt,
kono
parents:
diff changeset
955 gcc_jit_location *loc,
kono
parents:
diff changeset
956 gcc_jit_rvalue *fn_ptr,
kono
parents:
diff changeset
957 int numargs, gcc_jit_rvalue **args);
kono
parents:
diff changeset
958
kono
parents:
diff changeset
959 /* Type-coercion.
kono
parents:
diff changeset
960
kono
parents:
diff changeset
961 Currently only a limited set of conversions are possible:
kono
parents:
diff changeset
962 int <-> float
kono
parents:
diff changeset
963 int <-> bool */
kono
parents:
diff changeset
964 extern gcc_jit_rvalue *
kono
parents:
diff changeset
965 gcc_jit_context_new_cast (gcc_jit_context *ctxt,
kono
parents:
diff changeset
966 gcc_jit_location *loc,
kono
parents:
diff changeset
967 gcc_jit_rvalue *rvalue,
kono
parents:
diff changeset
968 gcc_jit_type *type);
kono
parents:
diff changeset
969
kono
parents:
diff changeset
970 extern gcc_jit_lvalue *
kono
parents:
diff changeset
971 gcc_jit_context_new_array_access (gcc_jit_context *ctxt,
kono
parents:
diff changeset
972 gcc_jit_location *loc,
kono
parents:
diff changeset
973 gcc_jit_rvalue *ptr,
kono
parents:
diff changeset
974 gcc_jit_rvalue *index);
kono
parents:
diff changeset
975
kono
parents:
diff changeset
976 /* Field access is provided separately for both lvalues and rvalues. */
kono
parents:
diff changeset
977
kono
parents:
diff changeset
978 /* Accessing a field of an lvalue of struct type, analogous to:
kono
parents:
diff changeset
979 (EXPR).field = ...;
kono
parents:
diff changeset
980 in C. */
kono
parents:
diff changeset
981 extern gcc_jit_lvalue *
kono
parents:
diff changeset
982 gcc_jit_lvalue_access_field (gcc_jit_lvalue *struct_or_union,
kono
parents:
diff changeset
983 gcc_jit_location *loc,
kono
parents:
diff changeset
984 gcc_jit_field *field);
kono
parents:
diff changeset
985
kono
parents:
diff changeset
986 /* Accessing a field of an rvalue of struct type, analogous to:
kono
parents:
diff changeset
987 (EXPR).field
kono
parents:
diff changeset
988 in C. */
kono
parents:
diff changeset
989 extern gcc_jit_rvalue *
kono
parents:
diff changeset
990 gcc_jit_rvalue_access_field (gcc_jit_rvalue *struct_or_union,
kono
parents:
diff changeset
991 gcc_jit_location *loc,
kono
parents:
diff changeset
992 gcc_jit_field *field);
kono
parents:
diff changeset
993
kono
parents:
diff changeset
994 /* Accessing a field of an rvalue of pointer type, analogous to:
kono
parents:
diff changeset
995 (EXPR)->field
kono
parents:
diff changeset
996 in C, itself equivalent to (*EXPR).FIELD */
kono
parents:
diff changeset
997 extern gcc_jit_lvalue *
kono
parents:
diff changeset
998 gcc_jit_rvalue_dereference_field (gcc_jit_rvalue *ptr,
kono
parents:
diff changeset
999 gcc_jit_location *loc,
kono
parents:
diff changeset
1000 gcc_jit_field *field);
kono
parents:
diff changeset
1001
kono
parents:
diff changeset
1002 /* Dereferencing a pointer; analogous to:
kono
parents:
diff changeset
1003 *(EXPR)
kono
parents:
diff changeset
1004 */
kono
parents:
diff changeset
1005 extern gcc_jit_lvalue *
kono
parents:
diff changeset
1006 gcc_jit_rvalue_dereference (gcc_jit_rvalue *rvalue,
kono
parents:
diff changeset
1007 gcc_jit_location *loc);
kono
parents:
diff changeset
1008
kono
parents:
diff changeset
1009 /* Taking the address of an lvalue; analogous to:
kono
parents:
diff changeset
1010 &(EXPR)
kono
parents:
diff changeset
1011 in C. */
kono
parents:
diff changeset
1012 extern gcc_jit_rvalue *
kono
parents:
diff changeset
1013 gcc_jit_lvalue_get_address (gcc_jit_lvalue *lvalue,
kono
parents:
diff changeset
1014 gcc_jit_location *loc);
kono
parents:
diff changeset
1015
kono
parents:
diff changeset
1016 extern gcc_jit_lvalue *
kono
parents:
diff changeset
1017 gcc_jit_function_new_local (gcc_jit_function *func,
kono
parents:
diff changeset
1018 gcc_jit_location *loc,
kono
parents:
diff changeset
1019 gcc_jit_type *type,
kono
parents:
diff changeset
1020 const char *name);
kono
parents:
diff changeset
1021
kono
parents:
diff changeset
1022 /**********************************************************************
kono
parents:
diff changeset
1023 Statement-creation.
kono
parents:
diff changeset
1024 **********************************************************************/
kono
parents:
diff changeset
1025
kono
parents:
diff changeset
1026 /* Add evaluation of an rvalue, discarding the result
kono
parents:
diff changeset
1027 (e.g. a function call that "returns" void).
kono
parents:
diff changeset
1028
kono
parents:
diff changeset
1029 This is equivalent to this C code:
kono
parents:
diff changeset
1030
kono
parents:
diff changeset
1031 (void)expression;
kono
parents:
diff changeset
1032 */
kono
parents:
diff changeset
1033 extern void
kono
parents:
diff changeset
1034 gcc_jit_block_add_eval (gcc_jit_block *block,
kono
parents:
diff changeset
1035 gcc_jit_location *loc,
kono
parents:
diff changeset
1036 gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
1037
kono
parents:
diff changeset
1038 /* Add evaluation of an rvalue, assigning the result to the given
kono
parents:
diff changeset
1039 lvalue.
kono
parents:
diff changeset
1040
kono
parents:
diff changeset
1041 This is roughly equivalent to this C code:
kono
parents:
diff changeset
1042
kono
parents:
diff changeset
1043 lvalue = rvalue;
kono
parents:
diff changeset
1044 */
kono
parents:
diff changeset
1045 extern void
kono
parents:
diff changeset
1046 gcc_jit_block_add_assignment (gcc_jit_block *block,
kono
parents:
diff changeset
1047 gcc_jit_location *loc,
kono
parents:
diff changeset
1048 gcc_jit_lvalue *lvalue,
kono
parents:
diff changeset
1049 gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
1050
kono
parents:
diff changeset
1051 /* Add evaluation of an rvalue, using the result to modify an
kono
parents:
diff changeset
1052 lvalue.
kono
parents:
diff changeset
1053
kono
parents:
diff changeset
1054 This is analogous to "+=" and friends:
kono
parents:
diff changeset
1055
kono
parents:
diff changeset
1056 lvalue += rvalue;
kono
parents:
diff changeset
1057 lvalue *= rvalue;
kono
parents:
diff changeset
1058 lvalue /= rvalue;
kono
parents:
diff changeset
1059 etc */
kono
parents:
diff changeset
1060 extern void
kono
parents:
diff changeset
1061 gcc_jit_block_add_assignment_op (gcc_jit_block *block,
kono
parents:
diff changeset
1062 gcc_jit_location *loc,
kono
parents:
diff changeset
1063 gcc_jit_lvalue *lvalue,
kono
parents:
diff changeset
1064 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
1065 gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
1066
kono
parents:
diff changeset
1067 /* Add a no-op textual comment to the internal representation of the
kono
parents:
diff changeset
1068 code. It will be optimized away, but will be visible in the dumps
kono
parents:
diff changeset
1069 seen via
kono
parents:
diff changeset
1070 GCC_JIT_BOOL_OPTION_DUMP_INITIAL_TREE
kono
parents:
diff changeset
1071 and
kono
parents:
diff changeset
1072 GCC_JIT_BOOL_OPTION_DUMP_INITIAL_GIMPLE,
kono
parents:
diff changeset
1073 and thus may be of use when debugging how your project's internal
kono
parents:
diff changeset
1074 representation gets converted to the libgccjit IR. */
kono
parents:
diff changeset
1075 extern void
kono
parents:
diff changeset
1076 gcc_jit_block_add_comment (gcc_jit_block *block,
kono
parents:
diff changeset
1077 gcc_jit_location *loc,
kono
parents:
diff changeset
1078 const char *text);
kono
parents:
diff changeset
1079
kono
parents:
diff changeset
1080 /* Terminate a block by adding evaluation of an rvalue, branching on the
kono
parents:
diff changeset
1081 result to the appropriate successor block.
kono
parents:
diff changeset
1082
kono
parents:
diff changeset
1083 This is roughly equivalent to this C code:
kono
parents:
diff changeset
1084
kono
parents:
diff changeset
1085 if (boolval)
kono
parents:
diff changeset
1086 goto on_true;
kono
parents:
diff changeset
1087 else
kono
parents:
diff changeset
1088 goto on_false;
kono
parents:
diff changeset
1089
kono
parents:
diff changeset
1090 block, boolval, on_true, and on_false must be non-NULL. */
kono
parents:
diff changeset
1091 extern void
kono
parents:
diff changeset
1092 gcc_jit_block_end_with_conditional (gcc_jit_block *block,
kono
parents:
diff changeset
1093 gcc_jit_location *loc,
kono
parents:
diff changeset
1094 gcc_jit_rvalue *boolval,
kono
parents:
diff changeset
1095 gcc_jit_block *on_true,
kono
parents:
diff changeset
1096 gcc_jit_block *on_false);
kono
parents:
diff changeset
1097
kono
parents:
diff changeset
1098 /* Terminate a block by adding a jump to the given target block.
kono
parents:
diff changeset
1099
kono
parents:
diff changeset
1100 This is roughly equivalent to this C code:
kono
parents:
diff changeset
1101
kono
parents:
diff changeset
1102 goto target;
kono
parents:
diff changeset
1103 */
kono
parents:
diff changeset
1104 extern void
kono
parents:
diff changeset
1105 gcc_jit_block_end_with_jump (gcc_jit_block *block,
kono
parents:
diff changeset
1106 gcc_jit_location *loc,
kono
parents:
diff changeset
1107 gcc_jit_block *target);
kono
parents:
diff changeset
1108
kono
parents:
diff changeset
1109 /* Terminate a block by adding evaluation of an rvalue, returning the value.
kono
parents:
diff changeset
1110
kono
parents:
diff changeset
1111 This is roughly equivalent to this C code:
kono
parents:
diff changeset
1112
kono
parents:
diff changeset
1113 return expression;
kono
parents:
diff changeset
1114 */
kono
parents:
diff changeset
1115 extern void
kono
parents:
diff changeset
1116 gcc_jit_block_end_with_return (gcc_jit_block *block,
kono
parents:
diff changeset
1117 gcc_jit_location *loc,
kono
parents:
diff changeset
1118 gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
1119
kono
parents:
diff changeset
1120 /* Terminate a block by adding a valueless return, for use within a function
kono
parents:
diff changeset
1121 with "void" return type.
kono
parents:
diff changeset
1122
kono
parents:
diff changeset
1123 This is equivalent to this C code:
kono
parents:
diff changeset
1124
kono
parents:
diff changeset
1125 return;
kono
parents:
diff changeset
1126 */
kono
parents:
diff changeset
1127 extern void
kono
parents:
diff changeset
1128 gcc_jit_block_end_with_void_return (gcc_jit_block *block,
kono
parents:
diff changeset
1129 gcc_jit_location *loc);
kono
parents:
diff changeset
1130
kono
parents:
diff changeset
1131 /* Create a new gcc_jit_case instance for use in a switch statement.
kono
parents:
diff changeset
1132 min_value and max_value must be constants of integer type.
kono
parents:
diff changeset
1133
kono
parents:
diff changeset
1134 This API entrypoint was added in LIBGCCJIT_ABI_3; you can test for its
kono
parents:
diff changeset
1135 presence using
kono
parents:
diff changeset
1136 #ifdef LIBGCCJIT_HAVE_SWITCH_STATEMENTS
kono
parents:
diff changeset
1137 */
kono
parents:
diff changeset
1138 extern gcc_jit_case *
kono
parents:
diff changeset
1139 gcc_jit_context_new_case (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1140 gcc_jit_rvalue *min_value,
kono
parents:
diff changeset
1141 gcc_jit_rvalue *max_value,
kono
parents:
diff changeset
1142 gcc_jit_block *dest_block);
kono
parents:
diff changeset
1143
kono
parents:
diff changeset
1144 /* Upcasting from case to object.
kono
parents:
diff changeset
1145
kono
parents:
diff changeset
1146 This API entrypoint was added in LIBGCCJIT_ABI_3; you can test for its
kono
parents:
diff changeset
1147 presence using
kono
parents:
diff changeset
1148 #ifdef LIBGCCJIT_HAVE_SWITCH_STATEMENTS
kono
parents:
diff changeset
1149 */
kono
parents:
diff changeset
1150
kono
parents:
diff changeset
1151 extern gcc_jit_object *
kono
parents:
diff changeset
1152 gcc_jit_case_as_object (gcc_jit_case *case_);
kono
parents:
diff changeset
1153
kono
parents:
diff changeset
1154 /* Terminate a block by adding evalation of an rvalue, then performing
kono
parents:
diff changeset
1155 a multiway branch.
kono
parents:
diff changeset
1156
kono
parents:
diff changeset
1157 This is roughly equivalent to this C code:
kono
parents:
diff changeset
1158
kono
parents:
diff changeset
1159 switch (expr)
kono
parents:
diff changeset
1160 {
kono
parents:
diff changeset
1161 default:
kono
parents:
diff changeset
1162 goto default_block;
kono
parents:
diff changeset
1163
kono
parents:
diff changeset
1164 case C0.min_value ... C0.max_value:
kono
parents:
diff changeset
1165 goto C0.dest_block;
kono
parents:
diff changeset
1166
kono
parents:
diff changeset
1167 case C1.min_value ... C1.max_value:
kono
parents:
diff changeset
1168 goto C1.dest_block;
kono
parents:
diff changeset
1169
kono
parents:
diff changeset
1170 ...etc...
kono
parents:
diff changeset
1171
kono
parents:
diff changeset
1172 case C[N - 1].min_value ... C[N - 1].max_value:
kono
parents:
diff changeset
1173 goto C[N - 1].dest_block;
kono
parents:
diff changeset
1174 }
kono
parents:
diff changeset
1175
kono
parents:
diff changeset
1176 block, expr, default_block and cases must all be non-NULL.
kono
parents:
diff changeset
1177
kono
parents:
diff changeset
1178 expr must be of the same integer type as all of the min_value
kono
parents:
diff changeset
1179 and max_value within the cases.
kono
parents:
diff changeset
1180
kono
parents:
diff changeset
1181 num_cases must be >= 0.
kono
parents:
diff changeset
1182
kono
parents:
diff changeset
1183 The ranges of the cases must not overlap (or have duplicate
kono
parents:
diff changeset
1184 values).
kono
parents:
diff changeset
1185
kono
parents:
diff changeset
1186 This API entrypoint was added in LIBGCCJIT_ABI_3; you can test for its
kono
parents:
diff changeset
1187 presence using
kono
parents:
diff changeset
1188 #ifdef LIBGCCJIT_HAVE_SWITCH_STATEMENTS
kono
parents:
diff changeset
1189 */
kono
parents:
diff changeset
1190
kono
parents:
diff changeset
1191 extern void
kono
parents:
diff changeset
1192 gcc_jit_block_end_with_switch (gcc_jit_block *block,
kono
parents:
diff changeset
1193 gcc_jit_location *loc,
kono
parents:
diff changeset
1194 gcc_jit_rvalue *expr,
kono
parents:
diff changeset
1195 gcc_jit_block *default_block,
kono
parents:
diff changeset
1196 int num_cases,
kono
parents:
diff changeset
1197 gcc_jit_case **cases);
kono
parents:
diff changeset
1198
kono
parents:
diff changeset
1199 /* Pre-canned feature macro to indicate the presence of
kono
parents:
diff changeset
1200 gcc_jit_block_end_with_switch, gcc_jit_case_as_object, and
kono
parents:
diff changeset
1201 gcc_jit_context_new_case.
kono
parents:
diff changeset
1202
kono
parents:
diff changeset
1203 This can be tested for with #ifdef. */
kono
parents:
diff changeset
1204 #define LIBGCCJIT_HAVE_SWITCH_STATEMENTS
kono
parents:
diff changeset
1205
kono
parents:
diff changeset
1206 /**********************************************************************
kono
parents:
diff changeset
1207 Nested contexts.
kono
parents:
diff changeset
1208 **********************************************************************/
kono
parents:
diff changeset
1209
kono
parents:
diff changeset
1210 /* Given an existing JIT context, create a child context.
kono
parents:
diff changeset
1211
kono
parents:
diff changeset
1212 The child inherits a copy of all option-settings from the parent.
kono
parents:
diff changeset
1213
kono
parents:
diff changeset
1214 The child can reference objects created within the parent, but not
kono
parents:
diff changeset
1215 vice-versa.
kono
parents:
diff changeset
1216
kono
parents:
diff changeset
1217 The lifetime of the child context must be bounded by that of the
kono
parents:
diff changeset
1218 parent: you should release a child context before releasing the parent
kono
parents:
diff changeset
1219 context.
kono
parents:
diff changeset
1220
kono
parents:
diff changeset
1221 If you use a function from a parent context within a child context,
kono
parents:
diff changeset
1222 you have to compile the parent context before you can compile the
kono
parents:
diff changeset
1223 child context, and the gcc_jit_result of the parent context must
kono
parents:
diff changeset
1224 outlive the gcc_jit_result of the child context.
kono
parents:
diff changeset
1225
kono
parents:
diff changeset
1226 This allows caching of shared initializations. For example, you could
kono
parents:
diff changeset
1227 create types and declarations of global functions in a parent context
kono
parents:
diff changeset
1228 once within a process, and then create child contexts whenever a
kono
parents:
diff changeset
1229 function or loop becomes hot. Each such child context can be used for
kono
parents:
diff changeset
1230 JIT-compiling just one function or loop, but can reference types
kono
parents:
diff changeset
1231 and helper functions created within the parent context.
kono
parents:
diff changeset
1232
kono
parents:
diff changeset
1233 Contexts can be arbitrarily nested, provided the above rules are
kono
parents:
diff changeset
1234 followed, but it's probably not worth going above 2 or 3 levels, and
kono
parents:
diff changeset
1235 there will likely be a performance hit for such nesting. */
kono
parents:
diff changeset
1236
kono
parents:
diff changeset
1237 extern gcc_jit_context *
kono
parents:
diff changeset
1238 gcc_jit_context_new_child_context (gcc_jit_context *parent_ctxt);
kono
parents:
diff changeset
1239
kono
parents:
diff changeset
1240 /**********************************************************************
kono
parents:
diff changeset
1241 Implementation support.
kono
parents:
diff changeset
1242 **********************************************************************/
kono
parents:
diff changeset
1243
kono
parents:
diff changeset
1244 /* Write C source code into "path" that can be compiled into a
kono
parents:
diff changeset
1245 self-contained executable (i.e. with libgccjit as the only dependency).
kono
parents:
diff changeset
1246 The generated code will attempt to replay the API calls that have been
kono
parents:
diff changeset
1247 made into the given context.
kono
parents:
diff changeset
1248
kono
parents:
diff changeset
1249 This may be useful when debugging the library or client code, for
kono
parents:
diff changeset
1250 reducing a complicated recipe for reproducing a bug into a simpler
kono
parents:
diff changeset
1251 form.
kono
parents:
diff changeset
1252
kono
parents:
diff changeset
1253 Typically you need to supply the option "-Wno-unused-variable" when
kono
parents:
diff changeset
1254 compiling the generated file (since the result of each API call is
kono
parents:
diff changeset
1255 assigned to a unique variable within the generated C source, and not
kono
parents:
diff changeset
1256 all are necessarily then used). */
kono
parents:
diff changeset
1257
kono
parents:
diff changeset
1258 extern void
kono
parents:
diff changeset
1259 gcc_jit_context_dump_reproducer_to_file (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1260 const char *path);
kono
parents:
diff changeset
1261
kono
parents:
diff changeset
1262 /* Enable the dumping of a specific set of internal state from the
kono
parents:
diff changeset
1263 compilation, capturing the result in-memory as a buffer.
kono
parents:
diff changeset
1264
kono
parents:
diff changeset
1265 Parameter "dumpname" corresponds to the equivalent gcc command-line
kono
parents:
diff changeset
1266 option, without the "-fdump-" prefix.
kono
parents:
diff changeset
1267 For example, to get the equivalent of "-fdump-tree-vrp1", supply
kono
parents:
diff changeset
1268 "tree-vrp1".
kono
parents:
diff changeset
1269 The context directly stores the dumpname as a (const char *), so the
kono
parents:
diff changeset
1270 passed string must outlive the context.
kono
parents:
diff changeset
1271
kono
parents:
diff changeset
1272 gcc_jit_context_compile and gcc_jit_context_to_file
kono
parents:
diff changeset
1273 will capture the dump as a dynamically-allocated buffer, writing
kono
parents:
diff changeset
1274 it to ``*out_ptr``.
kono
parents:
diff changeset
1275
kono
parents:
diff changeset
1276 The caller becomes responsible for calling
kono
parents:
diff changeset
1277 free (*out_ptr)
kono
parents:
diff changeset
1278 each time that gcc_jit_context_compile or gcc_jit_context_to_file
kono
parents:
diff changeset
1279 are called. *out_ptr will be written to, either with the address of a
kono
parents:
diff changeset
1280 buffer, or with NULL if an error occurred.
kono
parents:
diff changeset
1281
kono
parents:
diff changeset
1282 This API entrypoint is likely to be less stable than the others.
kono
parents:
diff changeset
1283 In particular, both the precise dumpnames, and the format and content
kono
parents:
diff changeset
1284 of the dumps are subject to change.
kono
parents:
diff changeset
1285
kono
parents:
diff changeset
1286 It exists primarily for writing the library's own test suite. */
kono
parents:
diff changeset
1287
kono
parents:
diff changeset
1288 extern void
kono
parents:
diff changeset
1289 gcc_jit_context_enable_dump (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1290 const char *dumpname,
kono
parents:
diff changeset
1291 char **out_ptr);
kono
parents:
diff changeset
1292
kono
parents:
diff changeset
1293 /**********************************************************************
kono
parents:
diff changeset
1294 Timing support.
kono
parents:
diff changeset
1295 **********************************************************************/
kono
parents:
diff changeset
1296
kono
parents:
diff changeset
1297 /* The timing API was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1298 presence using
kono
parents:
diff changeset
1299 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1300 */
kono
parents:
diff changeset
1301 #define LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1302
kono
parents:
diff changeset
1303 typedef struct gcc_jit_timer gcc_jit_timer;
kono
parents:
diff changeset
1304
kono
parents:
diff changeset
1305 /* Create a gcc_jit_timer instance, and start timing.
kono
parents:
diff changeset
1306
kono
parents:
diff changeset
1307 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1308 presence using
kono
parents:
diff changeset
1309 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1310 */
kono
parents:
diff changeset
1311 extern gcc_jit_timer *
kono
parents:
diff changeset
1312 gcc_jit_timer_new (void);
kono
parents:
diff changeset
1313
kono
parents:
diff changeset
1314 /* Release a gcc_jit_timer instance.
kono
parents:
diff changeset
1315
kono
parents:
diff changeset
1316 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1317 presence using
kono
parents:
diff changeset
1318 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1319 */
kono
parents:
diff changeset
1320 extern void
kono
parents:
diff changeset
1321 gcc_jit_timer_release (gcc_jit_timer *timer);
kono
parents:
diff changeset
1322
kono
parents:
diff changeset
1323 /* Associate a gcc_jit_timer instance with a context.
kono
parents:
diff changeset
1324
kono
parents:
diff changeset
1325 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1326 presence using
kono
parents:
diff changeset
1327 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1328 */
kono
parents:
diff changeset
1329 extern void
kono
parents:
diff changeset
1330 gcc_jit_context_set_timer (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1331 gcc_jit_timer *timer);
kono
parents:
diff changeset
1332
kono
parents:
diff changeset
1333 /* Get the timer associated with a context (if any).
kono
parents:
diff changeset
1334
kono
parents:
diff changeset
1335 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1336 presence using
kono
parents:
diff changeset
1337 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1338 */
kono
parents:
diff changeset
1339
kono
parents:
diff changeset
1340 extern gcc_jit_timer *
kono
parents:
diff changeset
1341 gcc_jit_context_get_timer (gcc_jit_context *ctxt);
kono
parents:
diff changeset
1342
kono
parents:
diff changeset
1343 /* Push the given item onto the timing stack.
kono
parents:
diff changeset
1344
kono
parents:
diff changeset
1345 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1346 presence using
kono
parents:
diff changeset
1347 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1348 */
kono
parents:
diff changeset
1349
kono
parents:
diff changeset
1350 extern void
kono
parents:
diff changeset
1351 gcc_jit_timer_push (gcc_jit_timer *timer,
kono
parents:
diff changeset
1352 const char *item_name);
kono
parents:
diff changeset
1353
kono
parents:
diff changeset
1354 /* Pop the top item from the timing stack.
kono
parents:
diff changeset
1355
kono
parents:
diff changeset
1356 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1357 presence using
kono
parents:
diff changeset
1358 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1359 */
kono
parents:
diff changeset
1360
kono
parents:
diff changeset
1361 extern void
kono
parents:
diff changeset
1362 gcc_jit_timer_pop (gcc_jit_timer *timer,
kono
parents:
diff changeset
1363 const char *item_name);
kono
parents:
diff changeset
1364
kono
parents:
diff changeset
1365 /* Print timing information to the given stream about activity since
kono
parents:
diff changeset
1366 the timer was started.
kono
parents:
diff changeset
1367
kono
parents:
diff changeset
1368 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1369 presence using
kono
parents:
diff changeset
1370 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1371 */
kono
parents:
diff changeset
1372
kono
parents:
diff changeset
1373 extern void
kono
parents:
diff changeset
1374 gcc_jit_timer_print (gcc_jit_timer *timer,
kono
parents:
diff changeset
1375 FILE *f_out);
kono
parents:
diff changeset
1376
kono
parents:
diff changeset
1377
kono
parents:
diff changeset
1378 #define LIBGCCJIT_HAVE_gcc_jit_rvalue_set_bool_require_tail_call
kono
parents:
diff changeset
1379
kono
parents:
diff changeset
1380 /* Mark/clear a call as needing tail-call optimization.
kono
parents:
diff changeset
1381
kono
parents:
diff changeset
1382 This API entrypoint was added in LIBGCCJIT_ABI_6; you can test for its
kono
parents:
diff changeset
1383 presence using
kono
parents:
diff changeset
1384 #ifdef LIBGCCJIT_HAVE_gcc_jit_rvalue_set_bool_require_tail_call
kono
parents:
diff changeset
1385 */
kono
parents:
diff changeset
1386 extern void
kono
parents:
diff changeset
1387 gcc_jit_rvalue_set_bool_require_tail_call (gcc_jit_rvalue *call,
kono
parents:
diff changeset
1388 int require_tail_call);
kono
parents:
diff changeset
1389
kono
parents:
diff changeset
1390 #define LIBGCCJIT_HAVE_gcc_jit_type_get_aligned
kono
parents:
diff changeset
1391
kono
parents:
diff changeset
1392 /* Given type "T", get type:
kono
parents:
diff changeset
1393
kono
parents:
diff changeset
1394 T __attribute__ ((aligned (ALIGNMENT_IN_BYTES)))
kono
parents:
diff changeset
1395
kono
parents:
diff changeset
1396 The alignment must be a power of two.
kono
parents:
diff changeset
1397
kono
parents:
diff changeset
1398 This API entrypoint was added in LIBGCCJIT_ABI_7; you can test for its
kono
parents:
diff changeset
1399 presence using
kono
parents:
diff changeset
1400 #ifdef LIBGCCJIT_HAVE_gcc_jit_type_get_aligned
kono
parents:
diff changeset
1401 */
kono
parents:
diff changeset
1402 extern gcc_jit_type *
kono
parents:
diff changeset
1403 gcc_jit_type_get_aligned (gcc_jit_type *type,
kono
parents:
diff changeset
1404 size_t alignment_in_bytes);
kono
parents:
diff changeset
1405
kono
parents:
diff changeset
1406 #define LIBGCCJIT_HAVE_gcc_jit_type_get_vector
kono
parents:
diff changeset
1407
kono
parents:
diff changeset
1408 /* Given type "T", get type:
kono
parents:
diff changeset
1409
kono
parents:
diff changeset
1410 T __attribute__ ((vector_size (sizeof(T) * num_units))
kono
parents:
diff changeset
1411
kono
parents:
diff changeset
1412 T must be integral/floating point; num_units must be a power of two.
kono
parents:
diff changeset
1413
kono
parents:
diff changeset
1414 This API entrypoint was added in LIBGCCJIT_ABI_8; you can test for its
kono
parents:
diff changeset
1415 presence using
kono
parents:
diff changeset
1416 #ifdef LIBGCCJIT_HAVE_gcc_jit_type_get_vector
kono
parents:
diff changeset
1417 */
kono
parents:
diff changeset
1418 extern gcc_jit_type *
kono
parents:
diff changeset
1419 gcc_jit_type_get_vector (gcc_jit_type *type, size_t num_units);
kono
parents:
diff changeset
1420
kono
parents:
diff changeset
1421
kono
parents:
diff changeset
1422 #define LIBGCCJIT_HAVE_gcc_jit_function_get_address
kono
parents:
diff changeset
1423
kono
parents:
diff changeset
1424 /* Get the address of a function as an rvalue, of function pointer
kono
parents:
diff changeset
1425 type.
kono
parents:
diff changeset
1426
kono
parents:
diff changeset
1427 This API entrypoint was added in LIBGCCJIT_ABI_9; you can test for its
kono
parents:
diff changeset
1428 presence using
kono
parents:
diff changeset
1429 #ifdef LIBGCCJIT_HAVE_gcc_jit_function_get_address
kono
parents:
diff changeset
1430 */
kono
parents:
diff changeset
1431 extern gcc_jit_rvalue *
kono
parents:
diff changeset
1432 gcc_jit_function_get_address (gcc_jit_function *fn,
kono
parents:
diff changeset
1433 gcc_jit_location *loc);
kono
parents:
diff changeset
1434
kono
parents:
diff changeset
1435
kono
parents:
diff changeset
1436 #define LIBGCCJIT_HAVE_gcc_jit_context_new_rvalue_from_vector
kono
parents:
diff changeset
1437
kono
parents:
diff changeset
1438 /* Build a vector rvalue from an array of elements.
kono
parents:
diff changeset
1439
kono
parents:
diff changeset
1440 "vec_type" should be a vector type, created using gcc_jit_type_get_vector.
kono
parents:
diff changeset
1441
kono
parents:
diff changeset
1442 This API entrypoint was added in LIBGCCJIT_ABI_10; you can test for its
kono
parents:
diff changeset
1443 presence using
kono
parents:
diff changeset
1444 #ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_rvalue_from_vector
kono
parents:
diff changeset
1445 */
kono
parents:
diff changeset
1446 extern gcc_jit_rvalue *
kono
parents:
diff changeset
1447 gcc_jit_context_new_rvalue_from_vector (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1448 gcc_jit_location *loc,
kono
parents:
diff changeset
1449 gcc_jit_type *vec_type,
kono
parents:
diff changeset
1450 size_t num_elements,
kono
parents:
diff changeset
1451 gcc_jit_rvalue **elements);
kono
parents:
diff changeset
1452
kono
parents:
diff changeset
1453 #ifdef __cplusplus
kono
parents:
diff changeset
1454 }
kono
parents:
diff changeset
1455 #endif /* __cplusplus */
kono
parents:
diff changeset
1456
kono
parents:
diff changeset
1457 #endif /* LIBGCCJIT_H */