annotate gcc/jit/libgccjit.h @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
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.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2013-2020 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
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
328 /* Add an arbitrary gcc driver option to the context.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
329 The context takes a copy of the string, so the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
330 (const char *) optname is not needed anymore after the call
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
331 returns.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
332
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
333 Note that only some options are likely to be meaningful; there is no
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
334 "frontend" within libgccjit, so typically only those affecting
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
335 assembler and linker are likely to be useful.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
336
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
337 This entrypoint was added in LIBGCCJIT_ABI_11; you can test for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
338 its presence using
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
339 #ifdef LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
340 */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
341 extern void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
342 gcc_jit_context_add_driver_option (gcc_jit_context *ctxt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
343 const char *optname);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
344
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
345 /* Pre-canned feature-test macro for detecting the presence of
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
346 gcc_jit_context_add_driver_option within libgccjit.h. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
347
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
348 #define LIBGCCJIT_HAVE_gcc_jit_context_add_driver_option
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
349
111
kono
parents:
diff changeset
350 /* Compile the context to in-memory machine code.
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 This can be called more that once on a given context,
kono
parents:
diff changeset
353 although any errors that occur will block further compilation. */
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 extern gcc_jit_result *
kono
parents:
diff changeset
356 gcc_jit_context_compile (gcc_jit_context *ctxt);
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 /* Kinds of ahead-of-time compilation, for use with
kono
parents:
diff changeset
359 gcc_jit_context_compile_to_file. */
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 enum gcc_jit_output_kind
kono
parents:
diff changeset
362 {
kono
parents:
diff changeset
363 /* Compile the context to an assembler file. */
kono
parents:
diff changeset
364 GCC_JIT_OUTPUT_KIND_ASSEMBLER,
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 /* Compile the context to an object file. */
kono
parents:
diff changeset
367 GCC_JIT_OUTPUT_KIND_OBJECT_FILE,
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 /* Compile the context to a dynamic library. */
kono
parents:
diff changeset
370 GCC_JIT_OUTPUT_KIND_DYNAMIC_LIBRARY,
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 /* Compile the context to an executable. */
kono
parents:
diff changeset
373 GCC_JIT_OUTPUT_KIND_EXECUTABLE
kono
parents:
diff changeset
374 };
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 /* Compile the context to a file of the given kind.
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 This can be called more that once on a given context,
kono
parents:
diff changeset
379 although any errors that occur will block further compilation. */
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 extern void
kono
parents:
diff changeset
382 gcc_jit_context_compile_to_file (gcc_jit_context *ctxt,
kono
parents:
diff changeset
383 enum gcc_jit_output_kind output_kind,
kono
parents:
diff changeset
384 const char *output_path);
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 /* To help with debugging: dump a C-like representation to the given path,
kono
parents:
diff changeset
387 describing what's been set up on the context.
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 If "update_locations" is true, then also set up gcc_jit_location
kono
parents:
diff changeset
390 information throughout the context, pointing at the dump file as if it
kono
parents:
diff changeset
391 were a source file. This may be of use in conjunction with
kono
parents:
diff changeset
392 GCC_JIT_BOOL_OPTION_DEBUGINFO to allow stepping through the code in a
kono
parents:
diff changeset
393 debugger. */
kono
parents:
diff changeset
394 extern void
kono
parents:
diff changeset
395 gcc_jit_context_dump_to_file (gcc_jit_context *ctxt,
kono
parents:
diff changeset
396 const char *path,
kono
parents:
diff changeset
397 int update_locations);
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 /* To help with debugging; enable ongoing logging of the context's
kono
parents:
diff changeset
400 activity to the given FILE *.
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 The caller remains responsible for closing "logfile".
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 Params "flags" and "verbosity" are reserved for future use, and
kono
parents:
diff changeset
405 must both be 0 for now. */
kono
parents:
diff changeset
406 extern void
kono
parents:
diff changeset
407 gcc_jit_context_set_logfile (gcc_jit_context *ctxt,
kono
parents:
diff changeset
408 FILE *logfile,
kono
parents:
diff changeset
409 int flags,
kono
parents:
diff changeset
410 int verbosity);
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 /* To be called after any API call, this gives the first error message
kono
parents:
diff changeset
413 that occurred on the context.
kono
parents:
diff changeset
414
kono
parents:
diff changeset
415 The returned string is valid for the rest of the lifetime of the
kono
parents:
diff changeset
416 context.
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 If no errors occurred, this will be NULL. */
kono
parents:
diff changeset
419 extern const char *
kono
parents:
diff changeset
420 gcc_jit_context_get_first_error (gcc_jit_context *ctxt);
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 /* To be called after any API call, this gives the last error message
kono
parents:
diff changeset
423 that occurred on the context.
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 If no errors occurred, this will be NULL.
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 If non-NULL, the returned string is only guaranteed to be valid until
kono
parents:
diff changeset
428 the next call to libgccjit relating to this context. */
kono
parents:
diff changeset
429 extern const char *
kono
parents:
diff changeset
430 gcc_jit_context_get_last_error (gcc_jit_context *ctxt);
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 /* Locate a given function within the built machine code.
kono
parents:
diff changeset
433 This will need to be cast to a function pointer of the
kono
parents:
diff changeset
434 correct type before it can be called. */
kono
parents:
diff changeset
435 extern void *
kono
parents:
diff changeset
436 gcc_jit_result_get_code (gcc_jit_result *result,
kono
parents:
diff changeset
437 const char *funcname);
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 /* Locate a given global within the built machine code.
kono
parents:
diff changeset
440 It must have been created using GCC_JIT_GLOBAL_EXPORTED.
kono
parents:
diff changeset
441 This is a ptr to the global, so e.g. for an int this is an int *. */
kono
parents:
diff changeset
442 extern void *
kono
parents:
diff changeset
443 gcc_jit_result_get_global (gcc_jit_result *result,
kono
parents:
diff changeset
444 const char *name);
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 /* Once we're done with the code, this unloads the built .so file.
kono
parents:
diff changeset
447 This cleans up the result; after calling this, it's no longer
kono
parents:
diff changeset
448 valid to use the result. */
kono
parents:
diff changeset
449 extern void
kono
parents:
diff changeset
450 gcc_jit_result_release (gcc_jit_result *result);
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 /**********************************************************************
kono
parents:
diff changeset
454 Functions for creating "contextual" objects.
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 All objects created by these functions share the lifetime of the context
kono
parents:
diff changeset
457 they are created within, and are automatically cleaned up for you when
kono
parents:
diff changeset
458 you call gcc_jit_context_release on the context.
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 Note that this means you can't use references to them after you've
kono
parents:
diff changeset
461 released their context.
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 All (const char *) string arguments passed to these functions are
kono
parents:
diff changeset
464 copied, so you don't need to keep them around.
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 You create code by adding a sequence of statements to blocks.
kono
parents:
diff changeset
467 **********************************************************************/
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 /**********************************************************************
kono
parents:
diff changeset
470 The base class of "contextual" object.
kono
parents:
diff changeset
471 **********************************************************************/
kono
parents:
diff changeset
472 /* Which context is "obj" within? */
kono
parents:
diff changeset
473 extern gcc_jit_context *
kono
parents:
diff changeset
474 gcc_jit_object_get_context (gcc_jit_object *obj);
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 /* Get a human-readable description of this object.
kono
parents:
diff changeset
477 The string buffer is created the first time this is called on a given
kono
parents:
diff changeset
478 object, and persists until the object's context is released. */
kono
parents:
diff changeset
479 extern const char *
kono
parents:
diff changeset
480 gcc_jit_object_get_debug_string (gcc_jit_object *obj);
kono
parents:
diff changeset
481
kono
parents:
diff changeset
482 /**********************************************************************
kono
parents:
diff changeset
483 Debugging information.
kono
parents:
diff changeset
484 **********************************************************************/
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 /* Creating source code locations for use by the debugger.
kono
parents:
diff changeset
487 Line and column numbers are 1-based. */
kono
parents:
diff changeset
488 extern gcc_jit_location *
kono
parents:
diff changeset
489 gcc_jit_context_new_location (gcc_jit_context *ctxt,
kono
parents:
diff changeset
490 const char *filename,
kono
parents:
diff changeset
491 int line,
kono
parents:
diff changeset
492 int column);
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 /* Upcasting from location to object. */
kono
parents:
diff changeset
495 extern gcc_jit_object *
kono
parents:
diff changeset
496 gcc_jit_location_as_object (gcc_jit_location *loc);
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 /**********************************************************************
kono
parents:
diff changeset
500 Types.
kono
parents:
diff changeset
501 **********************************************************************/
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 /* Upcasting from type to object. */
kono
parents:
diff changeset
504 extern gcc_jit_object *
kono
parents:
diff changeset
505 gcc_jit_type_as_object (gcc_jit_type *type);
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 /* Access to specific types. */
kono
parents:
diff changeset
508 enum gcc_jit_types
kono
parents:
diff changeset
509 {
kono
parents:
diff changeset
510 /* C's "void" type. */
kono
parents:
diff changeset
511 GCC_JIT_TYPE_VOID,
kono
parents:
diff changeset
512
kono
parents:
diff changeset
513 /* "void *". */
kono
parents:
diff changeset
514 GCC_JIT_TYPE_VOID_PTR,
kono
parents:
diff changeset
515
kono
parents:
diff changeset
516 /* C++'s bool type; also C99's "_Bool" type, aka "bool" if using
kono
parents:
diff changeset
517 stdbool.h. */
kono
parents:
diff changeset
518 GCC_JIT_TYPE_BOOL,
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 /* Various integer types. */
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 /* C's "char" (of some signedness) and the variants where the
kono
parents:
diff changeset
523 signedness is specified. */
kono
parents:
diff changeset
524 GCC_JIT_TYPE_CHAR,
kono
parents:
diff changeset
525 GCC_JIT_TYPE_SIGNED_CHAR,
kono
parents:
diff changeset
526 GCC_JIT_TYPE_UNSIGNED_CHAR,
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 /* C's "short" and "unsigned short". */
kono
parents:
diff changeset
529 GCC_JIT_TYPE_SHORT, /* signed */
kono
parents:
diff changeset
530 GCC_JIT_TYPE_UNSIGNED_SHORT,
kono
parents:
diff changeset
531
kono
parents:
diff changeset
532 /* C's "int" and "unsigned int". */
kono
parents:
diff changeset
533 GCC_JIT_TYPE_INT, /* signed */
kono
parents:
diff changeset
534 GCC_JIT_TYPE_UNSIGNED_INT,
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 /* C's "long" and "unsigned long". */
kono
parents:
diff changeset
537 GCC_JIT_TYPE_LONG, /* signed */
kono
parents:
diff changeset
538 GCC_JIT_TYPE_UNSIGNED_LONG,
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 /* C99's "long long" and "unsigned long long". */
kono
parents:
diff changeset
541 GCC_JIT_TYPE_LONG_LONG, /* signed */
kono
parents:
diff changeset
542 GCC_JIT_TYPE_UNSIGNED_LONG_LONG,
kono
parents:
diff changeset
543
kono
parents:
diff changeset
544 /* Floating-point types */
kono
parents:
diff changeset
545
kono
parents:
diff changeset
546 GCC_JIT_TYPE_FLOAT,
kono
parents:
diff changeset
547 GCC_JIT_TYPE_DOUBLE,
kono
parents:
diff changeset
548 GCC_JIT_TYPE_LONG_DOUBLE,
kono
parents:
diff changeset
549
kono
parents:
diff changeset
550 /* C type: (const char *). */
kono
parents:
diff changeset
551 GCC_JIT_TYPE_CONST_CHAR_PTR,
kono
parents:
diff changeset
552
kono
parents:
diff changeset
553 /* The C "size_t" type. */
kono
parents:
diff changeset
554 GCC_JIT_TYPE_SIZE_T,
kono
parents:
diff changeset
555
kono
parents:
diff changeset
556 /* C type: (FILE *) */
kono
parents:
diff changeset
557 GCC_JIT_TYPE_FILE_PTR,
kono
parents:
diff changeset
558
kono
parents:
diff changeset
559 /* Complex numbers. */
kono
parents:
diff changeset
560 GCC_JIT_TYPE_COMPLEX_FLOAT,
kono
parents:
diff changeset
561 GCC_JIT_TYPE_COMPLEX_DOUBLE,
kono
parents:
diff changeset
562 GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 };
kono
parents:
diff changeset
565
kono
parents:
diff changeset
566 extern gcc_jit_type *
kono
parents:
diff changeset
567 gcc_jit_context_get_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
568 enum gcc_jit_types type_);
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 /* Get the integer type of the given size and signedness. */
kono
parents:
diff changeset
571 extern gcc_jit_type *
kono
parents:
diff changeset
572 gcc_jit_context_get_int_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
573 int num_bytes, int is_signed);
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 /* Constructing new types. */
kono
parents:
diff changeset
576
kono
parents:
diff changeset
577 /* Given type "T", get type "T*". */
kono
parents:
diff changeset
578 extern gcc_jit_type *
kono
parents:
diff changeset
579 gcc_jit_type_get_pointer (gcc_jit_type *type);
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 /* Given type "T", get type "const T". */
kono
parents:
diff changeset
582 extern gcc_jit_type *
kono
parents:
diff changeset
583 gcc_jit_type_get_const (gcc_jit_type *type);
kono
parents:
diff changeset
584
kono
parents:
diff changeset
585 /* Given type "T", get type "volatile T". */
kono
parents:
diff changeset
586 extern gcc_jit_type *
kono
parents:
diff changeset
587 gcc_jit_type_get_volatile (gcc_jit_type *type);
kono
parents:
diff changeset
588
kono
parents:
diff changeset
589 /* Given type "T", get type "T[N]" (for a constant N). */
kono
parents:
diff changeset
590 extern gcc_jit_type *
kono
parents:
diff changeset
591 gcc_jit_context_new_array_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
592 gcc_jit_location *loc,
kono
parents:
diff changeset
593 gcc_jit_type *element_type,
kono
parents:
diff changeset
594 int num_elements);
kono
parents:
diff changeset
595
kono
parents:
diff changeset
596 /* Struct-handling. */
kono
parents:
diff changeset
597
kono
parents:
diff changeset
598 /* Create a field, for use within a struct or union. */
kono
parents:
diff changeset
599 extern gcc_jit_field *
kono
parents:
diff changeset
600 gcc_jit_context_new_field (gcc_jit_context *ctxt,
kono
parents:
diff changeset
601 gcc_jit_location *loc,
kono
parents:
diff changeset
602 gcc_jit_type *type,
kono
parents:
diff changeset
603 const char *name);
kono
parents:
diff changeset
604
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
605 #define LIBGCCJIT_HAVE_gcc_jit_context_new_bitfield
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
606
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
607 /* Create a bit field, for use within a struct or union.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
608
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
609 This API entrypoint was added in LIBGCCJIT_ABI_12; you can test for its
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
610 presence using
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
611 #ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_bitfield
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
612 */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
613 extern gcc_jit_field *
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
614 gcc_jit_context_new_bitfield (gcc_jit_context *ctxt,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
615 gcc_jit_location *loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
616 gcc_jit_type *type,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
617 int width,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
618 const char *name);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
619
111
kono
parents:
diff changeset
620 /* Upcasting from field to object. */
kono
parents:
diff changeset
621 extern gcc_jit_object *
kono
parents:
diff changeset
622 gcc_jit_field_as_object (gcc_jit_field *field);
kono
parents:
diff changeset
623
kono
parents:
diff changeset
624 /* Create a struct type from an array of fields. */
kono
parents:
diff changeset
625 extern gcc_jit_struct *
kono
parents:
diff changeset
626 gcc_jit_context_new_struct_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
627 gcc_jit_location *loc,
kono
parents:
diff changeset
628 const char *name,
kono
parents:
diff changeset
629 int num_fields,
kono
parents:
diff changeset
630 gcc_jit_field **fields);
kono
parents:
diff changeset
631
kono
parents:
diff changeset
632 /* Create an opaque struct type. */
kono
parents:
diff changeset
633 extern gcc_jit_struct *
kono
parents:
diff changeset
634 gcc_jit_context_new_opaque_struct (gcc_jit_context *ctxt,
kono
parents:
diff changeset
635 gcc_jit_location *loc,
kono
parents:
diff changeset
636 const char *name);
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 /* Upcast a struct to a type. */
kono
parents:
diff changeset
639 extern gcc_jit_type *
kono
parents:
diff changeset
640 gcc_jit_struct_as_type (gcc_jit_struct *struct_type);
kono
parents:
diff changeset
641
kono
parents:
diff changeset
642 /* Populating the fields of a formerly-opaque struct type.
kono
parents:
diff changeset
643 This can only be called once on a given struct type. */
kono
parents:
diff changeset
644 extern void
kono
parents:
diff changeset
645 gcc_jit_struct_set_fields (gcc_jit_struct *struct_type,
kono
parents:
diff changeset
646 gcc_jit_location *loc,
kono
parents:
diff changeset
647 int num_fields,
kono
parents:
diff changeset
648 gcc_jit_field **fields);
kono
parents:
diff changeset
649
kono
parents:
diff changeset
650 /* Unions work similarly to structs. */
kono
parents:
diff changeset
651 extern gcc_jit_type *
kono
parents:
diff changeset
652 gcc_jit_context_new_union_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
653 gcc_jit_location *loc,
kono
parents:
diff changeset
654 const char *name,
kono
parents:
diff changeset
655 int num_fields,
kono
parents:
diff changeset
656 gcc_jit_field **fields);
kono
parents:
diff changeset
657
kono
parents:
diff changeset
658 /* Function pointers. */
kono
parents:
diff changeset
659
kono
parents:
diff changeset
660 extern gcc_jit_type *
kono
parents:
diff changeset
661 gcc_jit_context_new_function_ptr_type (gcc_jit_context *ctxt,
kono
parents:
diff changeset
662 gcc_jit_location *loc,
kono
parents:
diff changeset
663 gcc_jit_type *return_type,
kono
parents:
diff changeset
664 int num_params,
kono
parents:
diff changeset
665 gcc_jit_type **param_types,
kono
parents:
diff changeset
666 int is_variadic);
kono
parents:
diff changeset
667
kono
parents:
diff changeset
668 /**********************************************************************
kono
parents:
diff changeset
669 Constructing functions.
kono
parents:
diff changeset
670 **********************************************************************/
kono
parents:
diff changeset
671 /* Create a function param. */
kono
parents:
diff changeset
672 extern gcc_jit_param *
kono
parents:
diff changeset
673 gcc_jit_context_new_param (gcc_jit_context *ctxt,
kono
parents:
diff changeset
674 gcc_jit_location *loc,
kono
parents:
diff changeset
675 gcc_jit_type *type,
kono
parents:
diff changeset
676 const char *name);
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678 /* Upcasting from param to object. */
kono
parents:
diff changeset
679 extern gcc_jit_object *
kono
parents:
diff changeset
680 gcc_jit_param_as_object (gcc_jit_param *param);
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 /* Upcasting from param to lvalue. */
kono
parents:
diff changeset
683 extern gcc_jit_lvalue *
kono
parents:
diff changeset
684 gcc_jit_param_as_lvalue (gcc_jit_param *param);
kono
parents:
diff changeset
685
kono
parents:
diff changeset
686 /* Upcasting from param to rvalue. */
kono
parents:
diff changeset
687 extern gcc_jit_rvalue *
kono
parents:
diff changeset
688 gcc_jit_param_as_rvalue (gcc_jit_param *param);
kono
parents:
diff changeset
689
kono
parents:
diff changeset
690 /* Kinds of function. */
kono
parents:
diff changeset
691 enum gcc_jit_function_kind
kono
parents:
diff changeset
692 {
kono
parents:
diff changeset
693 /* Function is defined by the client code and visible
kono
parents:
diff changeset
694 by name outside of the JIT. */
kono
parents:
diff changeset
695 GCC_JIT_FUNCTION_EXPORTED,
kono
parents:
diff changeset
696
kono
parents:
diff changeset
697 /* Function is defined by the client code, but is invisible
kono
parents:
diff changeset
698 outside of the JIT. Analogous to a "static" function. */
kono
parents:
diff changeset
699 GCC_JIT_FUNCTION_INTERNAL,
kono
parents:
diff changeset
700
kono
parents:
diff changeset
701 /* Function is not defined by the client code; we're merely
kono
parents:
diff changeset
702 referring to it. Analogous to using an "extern" function from a
kono
parents:
diff changeset
703 header file. */
kono
parents:
diff changeset
704 GCC_JIT_FUNCTION_IMPORTED,
kono
parents:
diff changeset
705
kono
parents:
diff changeset
706 /* Function is only ever inlined into other functions, and is
kono
parents:
diff changeset
707 invisible outside of the JIT.
kono
parents:
diff changeset
708
kono
parents:
diff changeset
709 Analogous to prefixing with "inline" and adding
kono
parents:
diff changeset
710 __attribute__((always_inline)).
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712 Inlining will only occur when the optimization level is
kono
parents:
diff changeset
713 above 0; when optimization is off, this is essentially the
kono
parents:
diff changeset
714 same as GCC_JIT_FUNCTION_INTERNAL. */
kono
parents:
diff changeset
715 GCC_JIT_FUNCTION_ALWAYS_INLINE
kono
parents:
diff changeset
716 };
kono
parents:
diff changeset
717
kono
parents:
diff changeset
718 /* Create a function. */
kono
parents:
diff changeset
719 extern gcc_jit_function *
kono
parents:
diff changeset
720 gcc_jit_context_new_function (gcc_jit_context *ctxt,
kono
parents:
diff changeset
721 gcc_jit_location *loc,
kono
parents:
diff changeset
722 enum gcc_jit_function_kind kind,
kono
parents:
diff changeset
723 gcc_jit_type *return_type,
kono
parents:
diff changeset
724 const char *name,
kono
parents:
diff changeset
725 int num_params,
kono
parents:
diff changeset
726 gcc_jit_param **params,
kono
parents:
diff changeset
727 int is_variadic);
kono
parents:
diff changeset
728
kono
parents:
diff changeset
729 /* Create a reference to a builtin function (sometimes called
kono
parents:
diff changeset
730 intrinsic functions). */
kono
parents:
diff changeset
731 extern gcc_jit_function *
kono
parents:
diff changeset
732 gcc_jit_context_get_builtin_function (gcc_jit_context *ctxt,
kono
parents:
diff changeset
733 const char *name);
kono
parents:
diff changeset
734
kono
parents:
diff changeset
735 /* Upcasting from function to object. */
kono
parents:
diff changeset
736 extern gcc_jit_object *
kono
parents:
diff changeset
737 gcc_jit_function_as_object (gcc_jit_function *func);
kono
parents:
diff changeset
738
kono
parents:
diff changeset
739 /* Get a specific param of a function by index. */
kono
parents:
diff changeset
740 extern gcc_jit_param *
kono
parents:
diff changeset
741 gcc_jit_function_get_param (gcc_jit_function *func, int index);
kono
parents:
diff changeset
742
kono
parents:
diff changeset
743 /* Emit the function in graphviz format. */
kono
parents:
diff changeset
744 extern void
kono
parents:
diff changeset
745 gcc_jit_function_dump_to_dot (gcc_jit_function *func,
kono
parents:
diff changeset
746 const char *path);
kono
parents:
diff changeset
747
kono
parents:
diff changeset
748 /* Create a block.
kono
parents:
diff changeset
749
kono
parents:
diff changeset
750 The name can be NULL, or you can give it a meaningful name, which
kono
parents:
diff changeset
751 may show up in dumps of the internal representation, and in error
kono
parents:
diff changeset
752 messages. */
kono
parents:
diff changeset
753 extern gcc_jit_block *
kono
parents:
diff changeset
754 gcc_jit_function_new_block (gcc_jit_function *func,
kono
parents:
diff changeset
755 const char *name);
kono
parents:
diff changeset
756
kono
parents:
diff changeset
757 /* Upcasting from block to object. */
kono
parents:
diff changeset
758 extern gcc_jit_object *
kono
parents:
diff changeset
759 gcc_jit_block_as_object (gcc_jit_block *block);
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 /* Which function is this block within? */
kono
parents:
diff changeset
762 extern gcc_jit_function *
kono
parents:
diff changeset
763 gcc_jit_block_get_function (gcc_jit_block *block);
kono
parents:
diff changeset
764
kono
parents:
diff changeset
765 /**********************************************************************
kono
parents:
diff changeset
766 lvalues, rvalues and expressions.
kono
parents:
diff changeset
767 **********************************************************************/
kono
parents:
diff changeset
768 enum gcc_jit_global_kind
kono
parents:
diff changeset
769 {
kono
parents:
diff changeset
770 /* Global is defined by the client code and visible
kono
parents:
diff changeset
771 by name outside of this JIT context via gcc_jit_result_get_global. */
kono
parents:
diff changeset
772 GCC_JIT_GLOBAL_EXPORTED,
kono
parents:
diff changeset
773
kono
parents:
diff changeset
774 /* Global is defined by the client code, but is invisible
kono
parents:
diff changeset
775 outside of this JIT context. Analogous to a "static" global. */
kono
parents:
diff changeset
776 GCC_JIT_GLOBAL_INTERNAL,
kono
parents:
diff changeset
777
kono
parents:
diff changeset
778 /* Global is not defined by the client code; we're merely
kono
parents:
diff changeset
779 referring to it. Analogous to using an "extern" global from a
kono
parents:
diff changeset
780 header file. */
kono
parents:
diff changeset
781 GCC_JIT_GLOBAL_IMPORTED
kono
parents:
diff changeset
782 };
kono
parents:
diff changeset
783
kono
parents:
diff changeset
784 extern gcc_jit_lvalue *
kono
parents:
diff changeset
785 gcc_jit_context_new_global (gcc_jit_context *ctxt,
kono
parents:
diff changeset
786 gcc_jit_location *loc,
kono
parents:
diff changeset
787 enum gcc_jit_global_kind kind,
kono
parents:
diff changeset
788 gcc_jit_type *type,
kono
parents:
diff changeset
789 const char *name);
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 /* Upcasting. */
kono
parents:
diff changeset
792 extern gcc_jit_object *
kono
parents:
diff changeset
793 gcc_jit_lvalue_as_object (gcc_jit_lvalue *lvalue);
kono
parents:
diff changeset
794
kono
parents:
diff changeset
795 extern gcc_jit_rvalue *
kono
parents:
diff changeset
796 gcc_jit_lvalue_as_rvalue (gcc_jit_lvalue *lvalue);
kono
parents:
diff changeset
797
kono
parents:
diff changeset
798 extern gcc_jit_object *
kono
parents:
diff changeset
799 gcc_jit_rvalue_as_object (gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
800
kono
parents:
diff changeset
801 extern gcc_jit_type *
kono
parents:
diff changeset
802 gcc_jit_rvalue_get_type (gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
803
kono
parents:
diff changeset
804 /* Integer constants. */
kono
parents:
diff changeset
805 extern gcc_jit_rvalue *
kono
parents:
diff changeset
806 gcc_jit_context_new_rvalue_from_int (gcc_jit_context *ctxt,
kono
parents:
diff changeset
807 gcc_jit_type *numeric_type,
kono
parents:
diff changeset
808 int value);
kono
parents:
diff changeset
809
kono
parents:
diff changeset
810 extern gcc_jit_rvalue *
kono
parents:
diff changeset
811 gcc_jit_context_new_rvalue_from_long (gcc_jit_context *ctxt,
kono
parents:
diff changeset
812 gcc_jit_type *numeric_type,
kono
parents:
diff changeset
813 long value);
kono
parents:
diff changeset
814
kono
parents:
diff changeset
815 extern gcc_jit_rvalue *
kono
parents:
diff changeset
816 gcc_jit_context_zero (gcc_jit_context *ctxt,
kono
parents:
diff changeset
817 gcc_jit_type *numeric_type);
kono
parents:
diff changeset
818
kono
parents:
diff changeset
819 extern gcc_jit_rvalue *
kono
parents:
diff changeset
820 gcc_jit_context_one (gcc_jit_context *ctxt,
kono
parents:
diff changeset
821 gcc_jit_type *numeric_type);
kono
parents:
diff changeset
822
kono
parents:
diff changeset
823 /* Floating-point constants. */
kono
parents:
diff changeset
824 extern gcc_jit_rvalue *
kono
parents:
diff changeset
825 gcc_jit_context_new_rvalue_from_double (gcc_jit_context *ctxt,
kono
parents:
diff changeset
826 gcc_jit_type *numeric_type,
kono
parents:
diff changeset
827 double value);
kono
parents:
diff changeset
828
kono
parents:
diff changeset
829 /* Pointers. */
kono
parents:
diff changeset
830 extern gcc_jit_rvalue *
kono
parents:
diff changeset
831 gcc_jit_context_new_rvalue_from_ptr (gcc_jit_context *ctxt,
kono
parents:
diff changeset
832 gcc_jit_type *pointer_type,
kono
parents:
diff changeset
833 void *value);
kono
parents:
diff changeset
834
kono
parents:
diff changeset
835 extern gcc_jit_rvalue *
kono
parents:
diff changeset
836 gcc_jit_context_null (gcc_jit_context *ctxt,
kono
parents:
diff changeset
837 gcc_jit_type *pointer_type);
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 /* String literals. */
kono
parents:
diff changeset
840 extern gcc_jit_rvalue *
kono
parents:
diff changeset
841 gcc_jit_context_new_string_literal (gcc_jit_context *ctxt,
kono
parents:
diff changeset
842 const char *value);
kono
parents:
diff changeset
843
kono
parents:
diff changeset
844 enum gcc_jit_unary_op
kono
parents:
diff changeset
845 {
kono
parents:
diff changeset
846 /* Negate an arithmetic value; analogous to:
kono
parents:
diff changeset
847 -(EXPR)
kono
parents:
diff changeset
848 in C. */
kono
parents:
diff changeset
849 GCC_JIT_UNARY_OP_MINUS,
kono
parents:
diff changeset
850
kono
parents:
diff changeset
851 /* Bitwise negation of an integer value (one's complement); analogous
kono
parents:
diff changeset
852 to:
kono
parents:
diff changeset
853 ~(EXPR)
kono
parents:
diff changeset
854 in C. */
kono
parents:
diff changeset
855 GCC_JIT_UNARY_OP_BITWISE_NEGATE,
kono
parents:
diff changeset
856
kono
parents:
diff changeset
857 /* Logical negation of an arithmetic or pointer value; analogous to:
kono
parents:
diff changeset
858 !(EXPR)
kono
parents:
diff changeset
859 in C. */
kono
parents:
diff changeset
860 GCC_JIT_UNARY_OP_LOGICAL_NEGATE,
kono
parents:
diff changeset
861
kono
parents:
diff changeset
862 /* Absolute value of an arithmetic expression; analogous to:
kono
parents:
diff changeset
863 abs (EXPR)
kono
parents:
diff changeset
864 in C. */
kono
parents:
diff changeset
865 GCC_JIT_UNARY_OP_ABS
kono
parents:
diff changeset
866
kono
parents:
diff changeset
867 };
kono
parents:
diff changeset
868
kono
parents:
diff changeset
869 extern gcc_jit_rvalue *
kono
parents:
diff changeset
870 gcc_jit_context_new_unary_op (gcc_jit_context *ctxt,
kono
parents:
diff changeset
871 gcc_jit_location *loc,
kono
parents:
diff changeset
872 enum gcc_jit_unary_op op,
kono
parents:
diff changeset
873 gcc_jit_type *result_type,
kono
parents:
diff changeset
874 gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
875
kono
parents:
diff changeset
876 enum gcc_jit_binary_op
kono
parents:
diff changeset
877 {
kono
parents:
diff changeset
878 /* Addition of arithmetic values; analogous to:
kono
parents:
diff changeset
879 (EXPR_A) + (EXPR_B)
kono
parents:
diff changeset
880 in C.
kono
parents:
diff changeset
881 For pointer addition, use gcc_jit_context_new_array_access. */
kono
parents:
diff changeset
882 GCC_JIT_BINARY_OP_PLUS,
kono
parents:
diff changeset
883
kono
parents:
diff changeset
884 /* Subtraction of arithmetic values; analogous to:
kono
parents:
diff changeset
885 (EXPR_A) - (EXPR_B)
kono
parents:
diff changeset
886 in C. */
kono
parents:
diff changeset
887 GCC_JIT_BINARY_OP_MINUS,
kono
parents:
diff changeset
888
kono
parents:
diff changeset
889 /* Multiplication of a pair of arithmetic values; analogous to:
kono
parents:
diff changeset
890 (EXPR_A) * (EXPR_B)
kono
parents:
diff changeset
891 in C. */
kono
parents:
diff changeset
892 GCC_JIT_BINARY_OP_MULT,
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 /* Quotient of division of arithmetic values; analogous to:
kono
parents:
diff changeset
895 (EXPR_A) / (EXPR_B)
kono
parents:
diff changeset
896 in C.
kono
parents:
diff changeset
897 The result type affects the kind of division: if the result type is
kono
parents:
diff changeset
898 integer-based, then the result is truncated towards zero, whereas
kono
parents:
diff changeset
899 a floating-point result type indicates floating-point division. */
kono
parents:
diff changeset
900 GCC_JIT_BINARY_OP_DIVIDE,
kono
parents:
diff changeset
901
kono
parents:
diff changeset
902 /* Remainder of division of arithmetic values; analogous to:
kono
parents:
diff changeset
903 (EXPR_A) % (EXPR_B)
kono
parents:
diff changeset
904 in C. */
kono
parents:
diff changeset
905 GCC_JIT_BINARY_OP_MODULO,
kono
parents:
diff changeset
906
kono
parents:
diff changeset
907 /* Bitwise AND; analogous to:
kono
parents:
diff changeset
908 (EXPR_A) & (EXPR_B)
kono
parents:
diff changeset
909 in C. */
kono
parents:
diff changeset
910 GCC_JIT_BINARY_OP_BITWISE_AND,
kono
parents:
diff changeset
911
kono
parents:
diff changeset
912 /* Bitwise exclusive OR; analogous to:
kono
parents:
diff changeset
913 (EXPR_A) ^ (EXPR_B)
kono
parents:
diff changeset
914 in C. */
kono
parents:
diff changeset
915 GCC_JIT_BINARY_OP_BITWISE_XOR,
kono
parents:
diff changeset
916
kono
parents:
diff changeset
917 /* Bitwise inclusive OR; analogous to:
kono
parents:
diff changeset
918 (EXPR_A) | (EXPR_B)
kono
parents:
diff changeset
919 in C. */
kono
parents:
diff changeset
920 GCC_JIT_BINARY_OP_BITWISE_OR,
kono
parents:
diff changeset
921
kono
parents:
diff changeset
922 /* Logical AND; analogous to:
kono
parents:
diff changeset
923 (EXPR_A) && (EXPR_B)
kono
parents:
diff changeset
924 in C. */
kono
parents:
diff changeset
925 GCC_JIT_BINARY_OP_LOGICAL_AND,
kono
parents:
diff changeset
926
kono
parents:
diff changeset
927 /* Logical OR; analogous to:
kono
parents:
diff changeset
928 (EXPR_A) || (EXPR_B)
kono
parents:
diff changeset
929 in C. */
kono
parents:
diff changeset
930 GCC_JIT_BINARY_OP_LOGICAL_OR,
kono
parents:
diff changeset
931
kono
parents:
diff changeset
932 /* Left shift; analogous to:
kono
parents:
diff changeset
933 (EXPR_A) << (EXPR_B)
kono
parents:
diff changeset
934 in C. */
kono
parents:
diff changeset
935 GCC_JIT_BINARY_OP_LSHIFT,
kono
parents:
diff changeset
936
kono
parents:
diff changeset
937 /* Right shift; analogous to:
kono
parents:
diff changeset
938 (EXPR_A) >> (EXPR_B)
kono
parents:
diff changeset
939 in C. */
kono
parents:
diff changeset
940 GCC_JIT_BINARY_OP_RSHIFT
kono
parents:
diff changeset
941 };
kono
parents:
diff changeset
942
kono
parents:
diff changeset
943 extern gcc_jit_rvalue *
kono
parents:
diff changeset
944 gcc_jit_context_new_binary_op (gcc_jit_context *ctxt,
kono
parents:
diff changeset
945 gcc_jit_location *loc,
kono
parents:
diff changeset
946 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
947 gcc_jit_type *result_type,
kono
parents:
diff changeset
948 gcc_jit_rvalue *a, gcc_jit_rvalue *b);
kono
parents:
diff changeset
949
kono
parents:
diff changeset
950 /* (Comparisons are treated as separate from "binary_op" to save
kono
parents:
diff changeset
951 you having to specify the result_type). */
kono
parents:
diff changeset
952
kono
parents:
diff changeset
953 enum gcc_jit_comparison
kono
parents:
diff changeset
954 {
kono
parents:
diff changeset
955 /* (EXPR_A) == (EXPR_B). */
kono
parents:
diff changeset
956 GCC_JIT_COMPARISON_EQ,
kono
parents:
diff changeset
957
kono
parents:
diff changeset
958 /* (EXPR_A) != (EXPR_B). */
kono
parents:
diff changeset
959 GCC_JIT_COMPARISON_NE,
kono
parents:
diff changeset
960
kono
parents:
diff changeset
961 /* (EXPR_A) < (EXPR_B). */
kono
parents:
diff changeset
962 GCC_JIT_COMPARISON_LT,
kono
parents:
diff changeset
963
kono
parents:
diff changeset
964 /* (EXPR_A) <=(EXPR_B). */
kono
parents:
diff changeset
965 GCC_JIT_COMPARISON_LE,
kono
parents:
diff changeset
966
kono
parents:
diff changeset
967 /* (EXPR_A) > (EXPR_B). */
kono
parents:
diff changeset
968 GCC_JIT_COMPARISON_GT,
kono
parents:
diff changeset
969
kono
parents:
diff changeset
970 /* (EXPR_A) >= (EXPR_B). */
kono
parents:
diff changeset
971 GCC_JIT_COMPARISON_GE
kono
parents:
diff changeset
972 };
kono
parents:
diff changeset
973
kono
parents:
diff changeset
974 extern gcc_jit_rvalue *
kono
parents:
diff changeset
975 gcc_jit_context_new_comparison (gcc_jit_context *ctxt,
kono
parents:
diff changeset
976 gcc_jit_location *loc,
kono
parents:
diff changeset
977 enum gcc_jit_comparison op,
kono
parents:
diff changeset
978 gcc_jit_rvalue *a, gcc_jit_rvalue *b);
kono
parents:
diff changeset
979
kono
parents:
diff changeset
980 /* Function calls. */
kono
parents:
diff changeset
981
kono
parents:
diff changeset
982 /* Call of a specific function. */
kono
parents:
diff changeset
983 extern gcc_jit_rvalue *
kono
parents:
diff changeset
984 gcc_jit_context_new_call (gcc_jit_context *ctxt,
kono
parents:
diff changeset
985 gcc_jit_location *loc,
kono
parents:
diff changeset
986 gcc_jit_function *func,
kono
parents:
diff changeset
987 int numargs , gcc_jit_rvalue **args);
kono
parents:
diff changeset
988
kono
parents:
diff changeset
989 /* Call through a function pointer. */
kono
parents:
diff changeset
990 extern gcc_jit_rvalue *
kono
parents:
diff changeset
991 gcc_jit_context_new_call_through_ptr (gcc_jit_context *ctxt,
kono
parents:
diff changeset
992 gcc_jit_location *loc,
kono
parents:
diff changeset
993 gcc_jit_rvalue *fn_ptr,
kono
parents:
diff changeset
994 int numargs, gcc_jit_rvalue **args);
kono
parents:
diff changeset
995
kono
parents:
diff changeset
996 /* Type-coercion.
kono
parents:
diff changeset
997
kono
parents:
diff changeset
998 Currently only a limited set of conversions are possible:
kono
parents:
diff changeset
999 int <-> float
kono
parents:
diff changeset
1000 int <-> bool */
kono
parents:
diff changeset
1001 extern gcc_jit_rvalue *
kono
parents:
diff changeset
1002 gcc_jit_context_new_cast (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1003 gcc_jit_location *loc,
kono
parents:
diff changeset
1004 gcc_jit_rvalue *rvalue,
kono
parents:
diff changeset
1005 gcc_jit_type *type);
kono
parents:
diff changeset
1006
kono
parents:
diff changeset
1007 extern gcc_jit_lvalue *
kono
parents:
diff changeset
1008 gcc_jit_context_new_array_access (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1009 gcc_jit_location *loc,
kono
parents:
diff changeset
1010 gcc_jit_rvalue *ptr,
kono
parents:
diff changeset
1011 gcc_jit_rvalue *index);
kono
parents:
diff changeset
1012
kono
parents:
diff changeset
1013 /* Field access is provided separately for both lvalues and rvalues. */
kono
parents:
diff changeset
1014
kono
parents:
diff changeset
1015 /* Accessing a field of an lvalue of struct type, analogous to:
kono
parents:
diff changeset
1016 (EXPR).field = ...;
kono
parents:
diff changeset
1017 in C. */
kono
parents:
diff changeset
1018 extern gcc_jit_lvalue *
kono
parents:
diff changeset
1019 gcc_jit_lvalue_access_field (gcc_jit_lvalue *struct_or_union,
kono
parents:
diff changeset
1020 gcc_jit_location *loc,
kono
parents:
diff changeset
1021 gcc_jit_field *field);
kono
parents:
diff changeset
1022
kono
parents:
diff changeset
1023 /* Accessing a field of an rvalue of struct type, analogous to:
kono
parents:
diff changeset
1024 (EXPR).field
kono
parents:
diff changeset
1025 in C. */
kono
parents:
diff changeset
1026 extern gcc_jit_rvalue *
kono
parents:
diff changeset
1027 gcc_jit_rvalue_access_field (gcc_jit_rvalue *struct_or_union,
kono
parents:
diff changeset
1028 gcc_jit_location *loc,
kono
parents:
diff changeset
1029 gcc_jit_field *field);
kono
parents:
diff changeset
1030
kono
parents:
diff changeset
1031 /* Accessing a field of an rvalue of pointer type, analogous to:
kono
parents:
diff changeset
1032 (EXPR)->field
kono
parents:
diff changeset
1033 in C, itself equivalent to (*EXPR).FIELD */
kono
parents:
diff changeset
1034 extern gcc_jit_lvalue *
kono
parents:
diff changeset
1035 gcc_jit_rvalue_dereference_field (gcc_jit_rvalue *ptr,
kono
parents:
diff changeset
1036 gcc_jit_location *loc,
kono
parents:
diff changeset
1037 gcc_jit_field *field);
kono
parents:
diff changeset
1038
kono
parents:
diff changeset
1039 /* Dereferencing a pointer; analogous to:
kono
parents:
diff changeset
1040 *(EXPR)
kono
parents:
diff changeset
1041 */
kono
parents:
diff changeset
1042 extern gcc_jit_lvalue *
kono
parents:
diff changeset
1043 gcc_jit_rvalue_dereference (gcc_jit_rvalue *rvalue,
kono
parents:
diff changeset
1044 gcc_jit_location *loc);
kono
parents:
diff changeset
1045
kono
parents:
diff changeset
1046 /* Taking the address of an lvalue; analogous to:
kono
parents:
diff changeset
1047 &(EXPR)
kono
parents:
diff changeset
1048 in C. */
kono
parents:
diff changeset
1049 extern gcc_jit_rvalue *
kono
parents:
diff changeset
1050 gcc_jit_lvalue_get_address (gcc_jit_lvalue *lvalue,
kono
parents:
diff changeset
1051 gcc_jit_location *loc);
kono
parents:
diff changeset
1052
kono
parents:
diff changeset
1053 extern gcc_jit_lvalue *
kono
parents:
diff changeset
1054 gcc_jit_function_new_local (gcc_jit_function *func,
kono
parents:
diff changeset
1055 gcc_jit_location *loc,
kono
parents:
diff changeset
1056 gcc_jit_type *type,
kono
parents:
diff changeset
1057 const char *name);
kono
parents:
diff changeset
1058
kono
parents:
diff changeset
1059 /**********************************************************************
kono
parents:
diff changeset
1060 Statement-creation.
kono
parents:
diff changeset
1061 **********************************************************************/
kono
parents:
diff changeset
1062
kono
parents:
diff changeset
1063 /* Add evaluation of an rvalue, discarding the result
kono
parents:
diff changeset
1064 (e.g. a function call that "returns" void).
kono
parents:
diff changeset
1065
kono
parents:
diff changeset
1066 This is equivalent to this C code:
kono
parents:
diff changeset
1067
kono
parents:
diff changeset
1068 (void)expression;
kono
parents:
diff changeset
1069 */
kono
parents:
diff changeset
1070 extern void
kono
parents:
diff changeset
1071 gcc_jit_block_add_eval (gcc_jit_block *block,
kono
parents:
diff changeset
1072 gcc_jit_location *loc,
kono
parents:
diff changeset
1073 gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
1074
kono
parents:
diff changeset
1075 /* Add evaluation of an rvalue, assigning the result to the given
kono
parents:
diff changeset
1076 lvalue.
kono
parents:
diff changeset
1077
kono
parents:
diff changeset
1078 This is roughly equivalent to this C code:
kono
parents:
diff changeset
1079
kono
parents:
diff changeset
1080 lvalue = rvalue;
kono
parents:
diff changeset
1081 */
kono
parents:
diff changeset
1082 extern void
kono
parents:
diff changeset
1083 gcc_jit_block_add_assignment (gcc_jit_block *block,
kono
parents:
diff changeset
1084 gcc_jit_location *loc,
kono
parents:
diff changeset
1085 gcc_jit_lvalue *lvalue,
kono
parents:
diff changeset
1086 gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
1087
kono
parents:
diff changeset
1088 /* Add evaluation of an rvalue, using the result to modify an
kono
parents:
diff changeset
1089 lvalue.
kono
parents:
diff changeset
1090
kono
parents:
diff changeset
1091 This is analogous to "+=" and friends:
kono
parents:
diff changeset
1092
kono
parents:
diff changeset
1093 lvalue += rvalue;
kono
parents:
diff changeset
1094 lvalue *= rvalue;
kono
parents:
diff changeset
1095 lvalue /= rvalue;
kono
parents:
diff changeset
1096 etc */
kono
parents:
diff changeset
1097 extern void
kono
parents:
diff changeset
1098 gcc_jit_block_add_assignment_op (gcc_jit_block *block,
kono
parents:
diff changeset
1099 gcc_jit_location *loc,
kono
parents:
diff changeset
1100 gcc_jit_lvalue *lvalue,
kono
parents:
diff changeset
1101 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
1102 gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
1103
kono
parents:
diff changeset
1104 /* Add a no-op textual comment to the internal representation of the
kono
parents:
diff changeset
1105 code. It will be optimized away, but will be visible in the dumps
kono
parents:
diff changeset
1106 seen via
kono
parents:
diff changeset
1107 GCC_JIT_BOOL_OPTION_DUMP_INITIAL_TREE
kono
parents:
diff changeset
1108 and
kono
parents:
diff changeset
1109 GCC_JIT_BOOL_OPTION_DUMP_INITIAL_GIMPLE,
kono
parents:
diff changeset
1110 and thus may be of use when debugging how your project's internal
kono
parents:
diff changeset
1111 representation gets converted to the libgccjit IR. */
kono
parents:
diff changeset
1112 extern void
kono
parents:
diff changeset
1113 gcc_jit_block_add_comment (gcc_jit_block *block,
kono
parents:
diff changeset
1114 gcc_jit_location *loc,
kono
parents:
diff changeset
1115 const char *text);
kono
parents:
diff changeset
1116
kono
parents:
diff changeset
1117 /* Terminate a block by adding evaluation of an rvalue, branching on the
kono
parents:
diff changeset
1118 result to the appropriate successor block.
kono
parents:
diff changeset
1119
kono
parents:
diff changeset
1120 This is roughly equivalent to this C code:
kono
parents:
diff changeset
1121
kono
parents:
diff changeset
1122 if (boolval)
kono
parents:
diff changeset
1123 goto on_true;
kono
parents:
diff changeset
1124 else
kono
parents:
diff changeset
1125 goto on_false;
kono
parents:
diff changeset
1126
kono
parents:
diff changeset
1127 block, boolval, on_true, and on_false must be non-NULL. */
kono
parents:
diff changeset
1128 extern void
kono
parents:
diff changeset
1129 gcc_jit_block_end_with_conditional (gcc_jit_block *block,
kono
parents:
diff changeset
1130 gcc_jit_location *loc,
kono
parents:
diff changeset
1131 gcc_jit_rvalue *boolval,
kono
parents:
diff changeset
1132 gcc_jit_block *on_true,
kono
parents:
diff changeset
1133 gcc_jit_block *on_false);
kono
parents:
diff changeset
1134
kono
parents:
diff changeset
1135 /* Terminate a block by adding a jump to the given target block.
kono
parents:
diff changeset
1136
kono
parents:
diff changeset
1137 This is roughly equivalent to this C code:
kono
parents:
diff changeset
1138
kono
parents:
diff changeset
1139 goto target;
kono
parents:
diff changeset
1140 */
kono
parents:
diff changeset
1141 extern void
kono
parents:
diff changeset
1142 gcc_jit_block_end_with_jump (gcc_jit_block *block,
kono
parents:
diff changeset
1143 gcc_jit_location *loc,
kono
parents:
diff changeset
1144 gcc_jit_block *target);
kono
parents:
diff changeset
1145
kono
parents:
diff changeset
1146 /* Terminate a block by adding evaluation of an rvalue, returning the value.
kono
parents:
diff changeset
1147
kono
parents:
diff changeset
1148 This is roughly equivalent to this C code:
kono
parents:
diff changeset
1149
kono
parents:
diff changeset
1150 return expression;
kono
parents:
diff changeset
1151 */
kono
parents:
diff changeset
1152 extern void
kono
parents:
diff changeset
1153 gcc_jit_block_end_with_return (gcc_jit_block *block,
kono
parents:
diff changeset
1154 gcc_jit_location *loc,
kono
parents:
diff changeset
1155 gcc_jit_rvalue *rvalue);
kono
parents:
diff changeset
1156
kono
parents:
diff changeset
1157 /* Terminate a block by adding a valueless return, for use within a function
kono
parents:
diff changeset
1158 with "void" return type.
kono
parents:
diff changeset
1159
kono
parents:
diff changeset
1160 This is equivalent to this C code:
kono
parents:
diff changeset
1161
kono
parents:
diff changeset
1162 return;
kono
parents:
diff changeset
1163 */
kono
parents:
diff changeset
1164 extern void
kono
parents:
diff changeset
1165 gcc_jit_block_end_with_void_return (gcc_jit_block *block,
kono
parents:
diff changeset
1166 gcc_jit_location *loc);
kono
parents:
diff changeset
1167
kono
parents:
diff changeset
1168 /* Create a new gcc_jit_case instance for use in a switch statement.
kono
parents:
diff changeset
1169 min_value and max_value must be constants of integer type.
kono
parents:
diff changeset
1170
kono
parents:
diff changeset
1171 This API entrypoint was added in LIBGCCJIT_ABI_3; you can test for its
kono
parents:
diff changeset
1172 presence using
kono
parents:
diff changeset
1173 #ifdef LIBGCCJIT_HAVE_SWITCH_STATEMENTS
kono
parents:
diff changeset
1174 */
kono
parents:
diff changeset
1175 extern gcc_jit_case *
kono
parents:
diff changeset
1176 gcc_jit_context_new_case (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1177 gcc_jit_rvalue *min_value,
kono
parents:
diff changeset
1178 gcc_jit_rvalue *max_value,
kono
parents:
diff changeset
1179 gcc_jit_block *dest_block);
kono
parents:
diff changeset
1180
kono
parents:
diff changeset
1181 /* Upcasting from case to object.
kono
parents:
diff changeset
1182
kono
parents:
diff changeset
1183 This API entrypoint was added in LIBGCCJIT_ABI_3; you can test for its
kono
parents:
diff changeset
1184 presence using
kono
parents:
diff changeset
1185 #ifdef LIBGCCJIT_HAVE_SWITCH_STATEMENTS
kono
parents:
diff changeset
1186 */
kono
parents:
diff changeset
1187
kono
parents:
diff changeset
1188 extern gcc_jit_object *
kono
parents:
diff changeset
1189 gcc_jit_case_as_object (gcc_jit_case *case_);
kono
parents:
diff changeset
1190
kono
parents:
diff changeset
1191 /* Terminate a block by adding evalation of an rvalue, then performing
kono
parents:
diff changeset
1192 a multiway branch.
kono
parents:
diff changeset
1193
kono
parents:
diff changeset
1194 This is roughly equivalent to this C code:
kono
parents:
diff changeset
1195
kono
parents:
diff changeset
1196 switch (expr)
kono
parents:
diff changeset
1197 {
kono
parents:
diff changeset
1198 default:
kono
parents:
diff changeset
1199 goto default_block;
kono
parents:
diff changeset
1200
kono
parents:
diff changeset
1201 case C0.min_value ... C0.max_value:
kono
parents:
diff changeset
1202 goto C0.dest_block;
kono
parents:
diff changeset
1203
kono
parents:
diff changeset
1204 case C1.min_value ... C1.max_value:
kono
parents:
diff changeset
1205 goto C1.dest_block;
kono
parents:
diff changeset
1206
kono
parents:
diff changeset
1207 ...etc...
kono
parents:
diff changeset
1208
kono
parents:
diff changeset
1209 case C[N - 1].min_value ... C[N - 1].max_value:
kono
parents:
diff changeset
1210 goto C[N - 1].dest_block;
kono
parents:
diff changeset
1211 }
kono
parents:
diff changeset
1212
kono
parents:
diff changeset
1213 block, expr, default_block and cases must all be non-NULL.
kono
parents:
diff changeset
1214
kono
parents:
diff changeset
1215 expr must be of the same integer type as all of the min_value
kono
parents:
diff changeset
1216 and max_value within the cases.
kono
parents:
diff changeset
1217
kono
parents:
diff changeset
1218 num_cases must be >= 0.
kono
parents:
diff changeset
1219
kono
parents:
diff changeset
1220 The ranges of the cases must not overlap (or have duplicate
kono
parents:
diff changeset
1221 values).
kono
parents:
diff changeset
1222
kono
parents:
diff changeset
1223 This API entrypoint was added in LIBGCCJIT_ABI_3; you can test for its
kono
parents:
diff changeset
1224 presence using
kono
parents:
diff changeset
1225 #ifdef LIBGCCJIT_HAVE_SWITCH_STATEMENTS
kono
parents:
diff changeset
1226 */
kono
parents:
diff changeset
1227
kono
parents:
diff changeset
1228 extern void
kono
parents:
diff changeset
1229 gcc_jit_block_end_with_switch (gcc_jit_block *block,
kono
parents:
diff changeset
1230 gcc_jit_location *loc,
kono
parents:
diff changeset
1231 gcc_jit_rvalue *expr,
kono
parents:
diff changeset
1232 gcc_jit_block *default_block,
kono
parents:
diff changeset
1233 int num_cases,
kono
parents:
diff changeset
1234 gcc_jit_case **cases);
kono
parents:
diff changeset
1235
kono
parents:
diff changeset
1236 /* Pre-canned feature macro to indicate the presence of
kono
parents:
diff changeset
1237 gcc_jit_block_end_with_switch, gcc_jit_case_as_object, and
kono
parents:
diff changeset
1238 gcc_jit_context_new_case.
kono
parents:
diff changeset
1239
kono
parents:
diff changeset
1240 This can be tested for with #ifdef. */
kono
parents:
diff changeset
1241 #define LIBGCCJIT_HAVE_SWITCH_STATEMENTS
kono
parents:
diff changeset
1242
kono
parents:
diff changeset
1243 /**********************************************************************
kono
parents:
diff changeset
1244 Nested contexts.
kono
parents:
diff changeset
1245 **********************************************************************/
kono
parents:
diff changeset
1246
kono
parents:
diff changeset
1247 /* Given an existing JIT context, create a child context.
kono
parents:
diff changeset
1248
kono
parents:
diff changeset
1249 The child inherits a copy of all option-settings from the parent.
kono
parents:
diff changeset
1250
kono
parents:
diff changeset
1251 The child can reference objects created within the parent, but not
kono
parents:
diff changeset
1252 vice-versa.
kono
parents:
diff changeset
1253
kono
parents:
diff changeset
1254 The lifetime of the child context must be bounded by that of the
kono
parents:
diff changeset
1255 parent: you should release a child context before releasing the parent
kono
parents:
diff changeset
1256 context.
kono
parents:
diff changeset
1257
kono
parents:
diff changeset
1258 If you use a function from a parent context within a child context,
kono
parents:
diff changeset
1259 you have to compile the parent context before you can compile the
kono
parents:
diff changeset
1260 child context, and the gcc_jit_result of the parent context must
kono
parents:
diff changeset
1261 outlive the gcc_jit_result of the child context.
kono
parents:
diff changeset
1262
kono
parents:
diff changeset
1263 This allows caching of shared initializations. For example, you could
kono
parents:
diff changeset
1264 create types and declarations of global functions in a parent context
kono
parents:
diff changeset
1265 once within a process, and then create child contexts whenever a
kono
parents:
diff changeset
1266 function or loop becomes hot. Each such child context can be used for
kono
parents:
diff changeset
1267 JIT-compiling just one function or loop, but can reference types
kono
parents:
diff changeset
1268 and helper functions created within the parent context.
kono
parents:
diff changeset
1269
kono
parents:
diff changeset
1270 Contexts can be arbitrarily nested, provided the above rules are
kono
parents:
diff changeset
1271 followed, but it's probably not worth going above 2 or 3 levels, and
kono
parents:
diff changeset
1272 there will likely be a performance hit for such nesting. */
kono
parents:
diff changeset
1273
kono
parents:
diff changeset
1274 extern gcc_jit_context *
kono
parents:
diff changeset
1275 gcc_jit_context_new_child_context (gcc_jit_context *parent_ctxt);
kono
parents:
diff changeset
1276
kono
parents:
diff changeset
1277 /**********************************************************************
kono
parents:
diff changeset
1278 Implementation support.
kono
parents:
diff changeset
1279 **********************************************************************/
kono
parents:
diff changeset
1280
kono
parents:
diff changeset
1281 /* Write C source code into "path" that can be compiled into a
kono
parents:
diff changeset
1282 self-contained executable (i.e. with libgccjit as the only dependency).
kono
parents:
diff changeset
1283 The generated code will attempt to replay the API calls that have been
kono
parents:
diff changeset
1284 made into the given context.
kono
parents:
diff changeset
1285
kono
parents:
diff changeset
1286 This may be useful when debugging the library or client code, for
kono
parents:
diff changeset
1287 reducing a complicated recipe for reproducing a bug into a simpler
kono
parents:
diff changeset
1288 form.
kono
parents:
diff changeset
1289
kono
parents:
diff changeset
1290 Typically you need to supply the option "-Wno-unused-variable" when
kono
parents:
diff changeset
1291 compiling the generated file (since the result of each API call is
kono
parents:
diff changeset
1292 assigned to a unique variable within the generated C source, and not
kono
parents:
diff changeset
1293 all are necessarily then used). */
kono
parents:
diff changeset
1294
kono
parents:
diff changeset
1295 extern void
kono
parents:
diff changeset
1296 gcc_jit_context_dump_reproducer_to_file (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1297 const char *path);
kono
parents:
diff changeset
1298
kono
parents:
diff changeset
1299 /* Enable the dumping of a specific set of internal state from the
kono
parents:
diff changeset
1300 compilation, capturing the result in-memory as a buffer.
kono
parents:
diff changeset
1301
kono
parents:
diff changeset
1302 Parameter "dumpname" corresponds to the equivalent gcc command-line
kono
parents:
diff changeset
1303 option, without the "-fdump-" prefix.
kono
parents:
diff changeset
1304 For example, to get the equivalent of "-fdump-tree-vrp1", supply
kono
parents:
diff changeset
1305 "tree-vrp1".
kono
parents:
diff changeset
1306 The context directly stores the dumpname as a (const char *), so the
kono
parents:
diff changeset
1307 passed string must outlive the context.
kono
parents:
diff changeset
1308
kono
parents:
diff changeset
1309 gcc_jit_context_compile and gcc_jit_context_to_file
kono
parents:
diff changeset
1310 will capture the dump as a dynamically-allocated buffer, writing
kono
parents:
diff changeset
1311 it to ``*out_ptr``.
kono
parents:
diff changeset
1312
kono
parents:
diff changeset
1313 The caller becomes responsible for calling
kono
parents:
diff changeset
1314 free (*out_ptr)
kono
parents:
diff changeset
1315 each time that gcc_jit_context_compile or gcc_jit_context_to_file
kono
parents:
diff changeset
1316 are called. *out_ptr will be written to, either with the address of a
kono
parents:
diff changeset
1317 buffer, or with NULL if an error occurred.
kono
parents:
diff changeset
1318
kono
parents:
diff changeset
1319 This API entrypoint is likely to be less stable than the others.
kono
parents:
diff changeset
1320 In particular, both the precise dumpnames, and the format and content
kono
parents:
diff changeset
1321 of the dumps are subject to change.
kono
parents:
diff changeset
1322
kono
parents:
diff changeset
1323 It exists primarily for writing the library's own test suite. */
kono
parents:
diff changeset
1324
kono
parents:
diff changeset
1325 extern void
kono
parents:
diff changeset
1326 gcc_jit_context_enable_dump (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1327 const char *dumpname,
kono
parents:
diff changeset
1328 char **out_ptr);
kono
parents:
diff changeset
1329
kono
parents:
diff changeset
1330 /**********************************************************************
kono
parents:
diff changeset
1331 Timing support.
kono
parents:
diff changeset
1332 **********************************************************************/
kono
parents:
diff changeset
1333
kono
parents:
diff changeset
1334 /* The timing API was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1335 presence using
kono
parents:
diff changeset
1336 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1337 */
kono
parents:
diff changeset
1338 #define LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1339
kono
parents:
diff changeset
1340 typedef struct gcc_jit_timer gcc_jit_timer;
kono
parents:
diff changeset
1341
kono
parents:
diff changeset
1342 /* Create a gcc_jit_timer instance, and start timing.
kono
parents:
diff changeset
1343
kono
parents:
diff changeset
1344 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1345 presence using
kono
parents:
diff changeset
1346 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1347 */
kono
parents:
diff changeset
1348 extern gcc_jit_timer *
kono
parents:
diff changeset
1349 gcc_jit_timer_new (void);
kono
parents:
diff changeset
1350
kono
parents:
diff changeset
1351 /* Release a gcc_jit_timer instance.
kono
parents:
diff changeset
1352
kono
parents:
diff changeset
1353 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1354 presence using
kono
parents:
diff changeset
1355 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1356 */
kono
parents:
diff changeset
1357 extern void
kono
parents:
diff changeset
1358 gcc_jit_timer_release (gcc_jit_timer *timer);
kono
parents:
diff changeset
1359
kono
parents:
diff changeset
1360 /* Associate a gcc_jit_timer instance with a context.
kono
parents:
diff changeset
1361
kono
parents:
diff changeset
1362 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1363 presence using
kono
parents:
diff changeset
1364 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1365 */
kono
parents:
diff changeset
1366 extern void
kono
parents:
diff changeset
1367 gcc_jit_context_set_timer (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1368 gcc_jit_timer *timer);
kono
parents:
diff changeset
1369
kono
parents:
diff changeset
1370 /* Get the timer associated with a context (if any).
kono
parents:
diff changeset
1371
kono
parents:
diff changeset
1372 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1373 presence using
kono
parents:
diff changeset
1374 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1375 */
kono
parents:
diff changeset
1376
kono
parents:
diff changeset
1377 extern gcc_jit_timer *
kono
parents:
diff changeset
1378 gcc_jit_context_get_timer (gcc_jit_context *ctxt);
kono
parents:
diff changeset
1379
kono
parents:
diff changeset
1380 /* Push the given item onto the timing stack.
kono
parents:
diff changeset
1381
kono
parents:
diff changeset
1382 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1383 presence using
kono
parents:
diff changeset
1384 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1385 */
kono
parents:
diff changeset
1386
kono
parents:
diff changeset
1387 extern void
kono
parents:
diff changeset
1388 gcc_jit_timer_push (gcc_jit_timer *timer,
kono
parents:
diff changeset
1389 const char *item_name);
kono
parents:
diff changeset
1390
kono
parents:
diff changeset
1391 /* Pop the top item from the timing stack.
kono
parents:
diff changeset
1392
kono
parents:
diff changeset
1393 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1394 presence using
kono
parents:
diff changeset
1395 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1396 */
kono
parents:
diff changeset
1397
kono
parents:
diff changeset
1398 extern void
kono
parents:
diff changeset
1399 gcc_jit_timer_pop (gcc_jit_timer *timer,
kono
parents:
diff changeset
1400 const char *item_name);
kono
parents:
diff changeset
1401
kono
parents:
diff changeset
1402 /* Print timing information to the given stream about activity since
kono
parents:
diff changeset
1403 the timer was started.
kono
parents:
diff changeset
1404
kono
parents:
diff changeset
1405 This API entrypoint was added in LIBGCCJIT_ABI_4; you can test for its
kono
parents:
diff changeset
1406 presence using
kono
parents:
diff changeset
1407 #ifdef LIBGCCJIT_HAVE_TIMING_API
kono
parents:
diff changeset
1408 */
kono
parents:
diff changeset
1409
kono
parents:
diff changeset
1410 extern void
kono
parents:
diff changeset
1411 gcc_jit_timer_print (gcc_jit_timer *timer,
kono
parents:
diff changeset
1412 FILE *f_out);
kono
parents:
diff changeset
1413
kono
parents:
diff changeset
1414
kono
parents:
diff changeset
1415 #define LIBGCCJIT_HAVE_gcc_jit_rvalue_set_bool_require_tail_call
kono
parents:
diff changeset
1416
kono
parents:
diff changeset
1417 /* Mark/clear a call as needing tail-call optimization.
kono
parents:
diff changeset
1418
kono
parents:
diff changeset
1419 This API entrypoint was added in LIBGCCJIT_ABI_6; you can test for its
kono
parents:
diff changeset
1420 presence using
kono
parents:
diff changeset
1421 #ifdef LIBGCCJIT_HAVE_gcc_jit_rvalue_set_bool_require_tail_call
kono
parents:
diff changeset
1422 */
kono
parents:
diff changeset
1423 extern void
kono
parents:
diff changeset
1424 gcc_jit_rvalue_set_bool_require_tail_call (gcc_jit_rvalue *call,
kono
parents:
diff changeset
1425 int require_tail_call);
kono
parents:
diff changeset
1426
kono
parents:
diff changeset
1427 #define LIBGCCJIT_HAVE_gcc_jit_type_get_aligned
kono
parents:
diff changeset
1428
kono
parents:
diff changeset
1429 /* Given type "T", get type:
kono
parents:
diff changeset
1430
kono
parents:
diff changeset
1431 T __attribute__ ((aligned (ALIGNMENT_IN_BYTES)))
kono
parents:
diff changeset
1432
kono
parents:
diff changeset
1433 The alignment must be a power of two.
kono
parents:
diff changeset
1434
kono
parents:
diff changeset
1435 This API entrypoint was added in LIBGCCJIT_ABI_7; you can test for its
kono
parents:
diff changeset
1436 presence using
kono
parents:
diff changeset
1437 #ifdef LIBGCCJIT_HAVE_gcc_jit_type_get_aligned
kono
parents:
diff changeset
1438 */
kono
parents:
diff changeset
1439 extern gcc_jit_type *
kono
parents:
diff changeset
1440 gcc_jit_type_get_aligned (gcc_jit_type *type,
kono
parents:
diff changeset
1441 size_t alignment_in_bytes);
kono
parents:
diff changeset
1442
kono
parents:
diff changeset
1443 #define LIBGCCJIT_HAVE_gcc_jit_type_get_vector
kono
parents:
diff changeset
1444
kono
parents:
diff changeset
1445 /* Given type "T", get type:
kono
parents:
diff changeset
1446
kono
parents:
diff changeset
1447 T __attribute__ ((vector_size (sizeof(T) * num_units))
kono
parents:
diff changeset
1448
kono
parents:
diff changeset
1449 T must be integral/floating point; num_units must be a power of two.
kono
parents:
diff changeset
1450
kono
parents:
diff changeset
1451 This API entrypoint was added in LIBGCCJIT_ABI_8; you can test for its
kono
parents:
diff changeset
1452 presence using
kono
parents:
diff changeset
1453 #ifdef LIBGCCJIT_HAVE_gcc_jit_type_get_vector
kono
parents:
diff changeset
1454 */
kono
parents:
diff changeset
1455 extern gcc_jit_type *
kono
parents:
diff changeset
1456 gcc_jit_type_get_vector (gcc_jit_type *type, size_t num_units);
kono
parents:
diff changeset
1457
kono
parents:
diff changeset
1458
kono
parents:
diff changeset
1459 #define LIBGCCJIT_HAVE_gcc_jit_function_get_address
kono
parents:
diff changeset
1460
kono
parents:
diff changeset
1461 /* Get the address of a function as an rvalue, of function pointer
kono
parents:
diff changeset
1462 type.
kono
parents:
diff changeset
1463
kono
parents:
diff changeset
1464 This API entrypoint was added in LIBGCCJIT_ABI_9; you can test for its
kono
parents:
diff changeset
1465 presence using
kono
parents:
diff changeset
1466 #ifdef LIBGCCJIT_HAVE_gcc_jit_function_get_address
kono
parents:
diff changeset
1467 */
kono
parents:
diff changeset
1468 extern gcc_jit_rvalue *
kono
parents:
diff changeset
1469 gcc_jit_function_get_address (gcc_jit_function *fn,
kono
parents:
diff changeset
1470 gcc_jit_location *loc);
kono
parents:
diff changeset
1471
kono
parents:
diff changeset
1472
kono
parents:
diff changeset
1473 #define LIBGCCJIT_HAVE_gcc_jit_context_new_rvalue_from_vector
kono
parents:
diff changeset
1474
kono
parents:
diff changeset
1475 /* Build a vector rvalue from an array of elements.
kono
parents:
diff changeset
1476
kono
parents:
diff changeset
1477 "vec_type" should be a vector type, created using gcc_jit_type_get_vector.
kono
parents:
diff changeset
1478
kono
parents:
diff changeset
1479 This API entrypoint was added in LIBGCCJIT_ABI_10; you can test for its
kono
parents:
diff changeset
1480 presence using
kono
parents:
diff changeset
1481 #ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_rvalue_from_vector
kono
parents:
diff changeset
1482 */
kono
parents:
diff changeset
1483 extern gcc_jit_rvalue *
kono
parents:
diff changeset
1484 gcc_jit_context_new_rvalue_from_vector (gcc_jit_context *ctxt,
kono
parents:
diff changeset
1485 gcc_jit_location *loc,
kono
parents:
diff changeset
1486 gcc_jit_type *vec_type,
kono
parents:
diff changeset
1487 size_t num_elements,
kono
parents:
diff changeset
1488 gcc_jit_rvalue **elements);
kono
parents:
diff changeset
1489
kono
parents:
diff changeset
1490 #ifdef __cplusplus
kono
parents:
diff changeset
1491 }
kono
parents:
diff changeset
1492 #endif /* __cplusplus */
kono
parents:
diff changeset
1493
kono
parents:
diff changeset
1494 #endif /* LIBGCCJIT_H */