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

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* A C++ API for libgccjit, purely as inline wrapper functions.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2014-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of GCC.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
7 under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
8 the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
9 any later version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but
kono
parents:
diff changeset
12 WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
kono
parents:
diff changeset
14 General Public License for more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #ifndef LIBGCCJIT_PLUS_PLUS_H
kono
parents:
diff changeset
21 #define LIBGCCJIT_PLUS_PLUS_H
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 #include "libgccjit.h"
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 #include <limits>
kono
parents:
diff changeset
26 #include <ostream>
kono
parents:
diff changeset
27 #include <vector>
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 /****************************************************************************
kono
parents:
diff changeset
30 C++ API
kono
parents:
diff changeset
31 ****************************************************************************/
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 namespace gccjit
kono
parents:
diff changeset
34 {
kono
parents:
diff changeset
35 /* Indentation indicates inheritance. */
kono
parents:
diff changeset
36 class context;
kono
parents:
diff changeset
37 class error;
kono
parents:
diff changeset
38 class object;
kono
parents:
diff changeset
39 class location;
kono
parents:
diff changeset
40 class field;
kono
parents:
diff changeset
41 class type;
kono
parents:
diff changeset
42 class struct_;
kono
parents:
diff changeset
43 class function;
kono
parents:
diff changeset
44 class block;
kono
parents:
diff changeset
45 class rvalue;
kono
parents:
diff changeset
46 class lvalue;
kono
parents:
diff changeset
47 class param;
kono
parents:
diff changeset
48 class case_;
kono
parents:
diff changeset
49 class timer;
kono
parents:
diff changeset
50 class auto_time;
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 /* Errors within the API become C++ exceptions of this class. */
kono
parents:
diff changeset
53 class error
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 };
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 class object
kono
parents:
diff changeset
58 {
kono
parents:
diff changeset
59 public:
kono
parents:
diff changeset
60 context get_context () const;
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 std::string get_debug_string () const;
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 protected:
kono
parents:
diff changeset
65 object ();
kono
parents:
diff changeset
66 object (gcc_jit_object *obj);
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 gcc_jit_object *get_inner_object () const;
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 private:
kono
parents:
diff changeset
71 gcc_jit_object *m_inner_obj;
kono
parents:
diff changeset
72 };
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 inline std::ostream& operator << (std::ostream& stream, const object &obj);
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 /* Some client code will want to supply source code locations, others
kono
parents:
diff changeset
77 won't. To avoid doubling the number of entrypoints, everything
kono
parents:
diff changeset
78 accepting a location also has a default argument. To do this, the
kono
parents:
diff changeset
79 other classes need to see that "location" has a default constructor,
kono
parents:
diff changeset
80 hence we need to declare it first. */
kono
parents:
diff changeset
81 class location : public object
kono
parents:
diff changeset
82 {
kono
parents:
diff changeset
83 public:
kono
parents:
diff changeset
84 location ();
kono
parents:
diff changeset
85 location (gcc_jit_location *loc);
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 gcc_jit_location *get_inner_location () const;
kono
parents:
diff changeset
88 };
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 class context
kono
parents:
diff changeset
91 {
kono
parents:
diff changeset
92 public:
kono
parents:
diff changeset
93 static context acquire ();
kono
parents:
diff changeset
94 context ();
kono
parents:
diff changeset
95 context (gcc_jit_context *ctxt);
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 gccjit::context new_child_context ();
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 gcc_jit_context *get_inner_context () { return m_inner_ctxt; }
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 void release ();
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 gcc_jit_result *compile ();
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 void compile_to_file (enum gcc_jit_output_kind output_kind,
kono
parents:
diff changeset
106 const char *output_path);
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 void dump_to_file (const std::string &path,
kono
parents:
diff changeset
109 bool update_locations);
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 void set_logfile (FILE *logfile,
kono
parents:
diff changeset
112 int flags,
kono
parents:
diff changeset
113 int verbosity);
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 void dump_reproducer_to_file (const char *path);
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 void set_str_option (enum gcc_jit_str_option opt,
kono
parents:
diff changeset
118 const char *value);
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 void set_int_option (enum gcc_jit_int_option opt,
kono
parents:
diff changeset
121 int value);
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 void set_bool_option (enum gcc_jit_bool_option opt,
kono
parents:
diff changeset
124 int value);
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 void set_bool_allow_unreachable_blocks (int bool_value);
kono
parents:
diff changeset
127 void set_bool_use_external_driver (int bool_value);
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 void add_command_line_option (const char *optname);
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 void set_timer (gccjit::timer t);
kono
parents:
diff changeset
132 gccjit::timer get_timer () const;
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 location
kono
parents:
diff changeset
135 new_location (const std::string &filename,
kono
parents:
diff changeset
136 int line,
kono
parents:
diff changeset
137 int column);
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 type get_type (enum gcc_jit_types kind);
kono
parents:
diff changeset
140 type get_int_type (size_t num_bytes, int is_signed);
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 /* A way to map a specific int type, using the compiler to
kono
parents:
diff changeset
143 get the details automatically e.g.:
kono
parents:
diff changeset
144 gccjit::type type = get_int_type <my_int_type_t> (); */
kono
parents:
diff changeset
145 template <typename T>
kono
parents:
diff changeset
146 type get_int_type ();
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 type new_array_type (type element_type, int num_elements,
kono
parents:
diff changeset
149 location loc = location ());
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 field new_field (type type_, const std::string &name,
kono
parents:
diff changeset
152 location loc = location ());
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 struct_ new_struct_type (const std::string &name,
kono
parents:
diff changeset
155 std::vector<field> &fields,
kono
parents:
diff changeset
156 location loc = location ());
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 struct_ new_opaque_struct_type (const std::string &name,
kono
parents:
diff changeset
159 location loc = location ());
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 param new_param (type type_,
kono
parents:
diff changeset
162 const std::string &name,
kono
parents:
diff changeset
163 location loc = location ());
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 function new_function (enum gcc_jit_function_kind kind,
kono
parents:
diff changeset
166 type return_type,
kono
parents:
diff changeset
167 const std::string &name,
kono
parents:
diff changeset
168 std::vector<param> &params,
kono
parents:
diff changeset
169 int is_variadic,
kono
parents:
diff changeset
170 location loc = location ());
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 function get_builtin_function (const std::string &name);
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 lvalue new_global (enum gcc_jit_global_kind kind,
kono
parents:
diff changeset
175 type type_,
kono
parents:
diff changeset
176 const std::string &name,
kono
parents:
diff changeset
177 location loc = location ());
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 rvalue new_rvalue (type numeric_type,
kono
parents:
diff changeset
180 int value) const;
kono
parents:
diff changeset
181 rvalue new_rvalue (type numeric_type,
kono
parents:
diff changeset
182 long value) const;
kono
parents:
diff changeset
183 rvalue zero (type numeric_type) const;
kono
parents:
diff changeset
184 rvalue one (type numeric_type) const;
kono
parents:
diff changeset
185 rvalue new_rvalue (type numeric_type,
kono
parents:
diff changeset
186 double value) const;
kono
parents:
diff changeset
187 rvalue new_rvalue (type pointer_type,
kono
parents:
diff changeset
188 void *value) const;
kono
parents:
diff changeset
189 rvalue new_rvalue (const std::string &value) const;
kono
parents:
diff changeset
190 rvalue new_rvalue (type vector_type,
kono
parents:
diff changeset
191 std::vector<rvalue> elements) const;
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 /* Generic unary operations... */
kono
parents:
diff changeset
194 rvalue new_unary_op (enum gcc_jit_unary_op op,
kono
parents:
diff changeset
195 type result_type,
kono
parents:
diff changeset
196 rvalue a,
kono
parents:
diff changeset
197 location loc = location ());
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 /* ...and shorter ways to spell the various specific kinds of
kono
parents:
diff changeset
200 unary op. */
kono
parents:
diff changeset
201 rvalue new_minus (type result_type,
kono
parents:
diff changeset
202 rvalue a,
kono
parents:
diff changeset
203 location loc = location ());
kono
parents:
diff changeset
204 rvalue new_bitwise_negate (type result_type,
kono
parents:
diff changeset
205 rvalue a,
kono
parents:
diff changeset
206 location loc = location ());
kono
parents:
diff changeset
207 rvalue new_logical_negate (type result_type,
kono
parents:
diff changeset
208 rvalue a,
kono
parents:
diff changeset
209 location loc = location ());
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 /* Generic binary operations... */
kono
parents:
diff changeset
212 rvalue new_binary_op (enum gcc_jit_binary_op op,
kono
parents:
diff changeset
213 type result_type,
kono
parents:
diff changeset
214 rvalue a, rvalue b,
kono
parents:
diff changeset
215 location loc = location ());
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 /* ...and shorter ways to spell the various specific kinds of
kono
parents:
diff changeset
218 binary op. */
kono
parents:
diff changeset
219 rvalue new_plus (type result_type,
kono
parents:
diff changeset
220 rvalue a, rvalue b,
kono
parents:
diff changeset
221 location loc = location ());
kono
parents:
diff changeset
222 rvalue new_minus (type result_type,
kono
parents:
diff changeset
223 rvalue a, rvalue b,
kono
parents:
diff changeset
224 location loc = location ());
kono
parents:
diff changeset
225 rvalue new_mult (type result_type,
kono
parents:
diff changeset
226 rvalue a, rvalue b,
kono
parents:
diff changeset
227 location loc = location ());
kono
parents:
diff changeset
228 rvalue new_divide (type result_type,
kono
parents:
diff changeset
229 rvalue a, rvalue b,
kono
parents:
diff changeset
230 location loc = location ());
kono
parents:
diff changeset
231 rvalue new_modulo (type result_type,
kono
parents:
diff changeset
232 rvalue a, rvalue b,
kono
parents:
diff changeset
233 location loc = location ());
kono
parents:
diff changeset
234 rvalue new_bitwise_and (type result_type,
kono
parents:
diff changeset
235 rvalue a, rvalue b,
kono
parents:
diff changeset
236 location loc = location ());
kono
parents:
diff changeset
237 rvalue new_bitwise_xor (type result_type,
kono
parents:
diff changeset
238 rvalue a, rvalue b,
kono
parents:
diff changeset
239 location loc = location ());
kono
parents:
diff changeset
240 rvalue new_bitwise_or (type result_type,
kono
parents:
diff changeset
241 rvalue a, rvalue b,
kono
parents:
diff changeset
242 location loc = location ());
kono
parents:
diff changeset
243 rvalue new_logical_and (type result_type,
kono
parents:
diff changeset
244 rvalue a, rvalue b,
kono
parents:
diff changeset
245 location loc = location ());
kono
parents:
diff changeset
246 rvalue new_logical_or (type result_type,
kono
parents:
diff changeset
247 rvalue a, rvalue b,
kono
parents:
diff changeset
248 location loc = location ());
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 /* Generic comparisons... */
kono
parents:
diff changeset
251 rvalue new_comparison (enum gcc_jit_comparison op,
kono
parents:
diff changeset
252 rvalue a, rvalue b,
kono
parents:
diff changeset
253 location loc = location ());
kono
parents:
diff changeset
254 /* ...and shorter ways to spell the various specific kinds of
kono
parents:
diff changeset
255 comparison. */
kono
parents:
diff changeset
256 rvalue new_eq (rvalue a, rvalue b,
kono
parents:
diff changeset
257 location loc = location ());
kono
parents:
diff changeset
258 rvalue new_ne (rvalue a, rvalue b,
kono
parents:
diff changeset
259 location loc = location ());
kono
parents:
diff changeset
260 rvalue new_lt (rvalue a, rvalue b,
kono
parents:
diff changeset
261 location loc = location ());
kono
parents:
diff changeset
262 rvalue new_le (rvalue a, rvalue b,
kono
parents:
diff changeset
263 location loc = location ());
kono
parents:
diff changeset
264 rvalue new_gt (rvalue a, rvalue b,
kono
parents:
diff changeset
265 location loc = location ());
kono
parents:
diff changeset
266 rvalue new_ge (rvalue a, rvalue b,
kono
parents:
diff changeset
267 location loc = location ());
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 /* The most general way of creating a function call. */
kono
parents:
diff changeset
270 rvalue new_call (function func,
kono
parents:
diff changeset
271 std::vector<rvalue> &args,
kono
parents:
diff changeset
272 location loc = location ());
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 /* In addition, we provide a series of overloaded "new_call" methods
kono
parents:
diff changeset
275 for specific numbers of args (from 0 - 6), to avoid the need for
kono
parents:
diff changeset
276 client code to manually build a vector. */
kono
parents:
diff changeset
277 rvalue new_call (function func,
kono
parents:
diff changeset
278 location loc = location ());
kono
parents:
diff changeset
279 rvalue new_call (function func,
kono
parents:
diff changeset
280 rvalue arg0,
kono
parents:
diff changeset
281 location loc = location ());
kono
parents:
diff changeset
282 rvalue new_call (function func,
kono
parents:
diff changeset
283 rvalue arg0, rvalue arg1,
kono
parents:
diff changeset
284 location loc = location ());
kono
parents:
diff changeset
285 rvalue new_call (function func,
kono
parents:
diff changeset
286 rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
287 location loc = location ());
kono
parents:
diff changeset
288 rvalue new_call (function func,
kono
parents:
diff changeset
289 rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
290 rvalue arg3,
kono
parents:
diff changeset
291 location loc = location ());
kono
parents:
diff changeset
292 rvalue new_call (function func,
kono
parents:
diff changeset
293 rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
294 rvalue arg3, rvalue arg4,
kono
parents:
diff changeset
295 location loc = location ());
kono
parents:
diff changeset
296 rvalue new_call (function func,
kono
parents:
diff changeset
297 rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
298 rvalue arg3, rvalue arg4, rvalue arg5,
kono
parents:
diff changeset
299 location loc = location ());
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 rvalue new_cast (rvalue expr,
kono
parents:
diff changeset
302 type type_,
kono
parents:
diff changeset
303 location loc = location ());
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 lvalue new_array_access (rvalue ptr,
kono
parents:
diff changeset
306 rvalue index,
kono
parents:
diff changeset
307 location loc = location ());
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 case_ new_case (rvalue min_value,
kono
parents:
diff changeset
310 rvalue max_value,
kono
parents:
diff changeset
311 block dest_block);
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 private:
kono
parents:
diff changeset
314 gcc_jit_context *m_inner_ctxt;
kono
parents:
diff changeset
315 };
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 class field : public object
kono
parents:
diff changeset
318 {
kono
parents:
diff changeset
319 public:
kono
parents:
diff changeset
320 field ();
kono
parents:
diff changeset
321 field (gcc_jit_field *inner);
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 gcc_jit_field *get_inner_field () const;
kono
parents:
diff changeset
324 };
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 class type : public object
kono
parents:
diff changeset
327 {
kono
parents:
diff changeset
328 public:
kono
parents:
diff changeset
329 type ();
kono
parents:
diff changeset
330 type (gcc_jit_type *inner);
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 gcc_jit_type *get_inner_type () const;
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 type get_pointer ();
kono
parents:
diff changeset
335 type get_const ();
kono
parents:
diff changeset
336 type get_volatile ();
kono
parents:
diff changeset
337 type get_aligned (size_t alignment_in_bytes);
kono
parents:
diff changeset
338 type get_vector (size_t num_units);
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 // Shortcuts for getting values of numeric types:
kono
parents:
diff changeset
341 rvalue zero ();
kono
parents:
diff changeset
342 rvalue one ();
kono
parents:
diff changeset
343 };
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 class struct_ : public type
kono
parents:
diff changeset
346 {
kono
parents:
diff changeset
347 public:
kono
parents:
diff changeset
348 struct_ ();
kono
parents:
diff changeset
349 struct_ (gcc_jit_struct *inner);
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 gcc_jit_struct *get_inner_struct () const;
kono
parents:
diff changeset
352 };
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 class function : public object
kono
parents:
diff changeset
355 {
kono
parents:
diff changeset
356 public:
kono
parents:
diff changeset
357 function ();
kono
parents:
diff changeset
358 function (gcc_jit_function *func);
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 gcc_jit_function *get_inner_function () const;
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 void dump_to_dot (const std::string &path);
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 param get_param (int index) const;
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 block new_block ();
kono
parents:
diff changeset
367 block new_block (const std::string &name);
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 lvalue new_local (type type_,
kono
parents:
diff changeset
370 const std::string &name,
kono
parents:
diff changeset
371 location loc = location ());
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 rvalue get_address (location loc = location ());
kono
parents:
diff changeset
374
kono
parents:
diff changeset
375 /* A series of overloaded operator () with various numbers of arguments
kono
parents:
diff changeset
376 for a very terse way of creating a call to this function. The call
kono
parents:
diff changeset
377 is created within the same context as the function itself, which may
kono
parents:
diff changeset
378 not be what you want. */
kono
parents:
diff changeset
379 rvalue operator() (location loc = location ());
kono
parents:
diff changeset
380 rvalue operator() (rvalue arg0,
kono
parents:
diff changeset
381 location loc = location ());
kono
parents:
diff changeset
382 rvalue operator() (rvalue arg0, rvalue arg1,
kono
parents:
diff changeset
383 location loc = location ());
kono
parents:
diff changeset
384 rvalue operator() (rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
385 location loc = location ());
kono
parents:
diff changeset
386 };
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 class block : public object
kono
parents:
diff changeset
389 {
kono
parents:
diff changeset
390 public:
kono
parents:
diff changeset
391 block ();
kono
parents:
diff changeset
392 block (gcc_jit_block *inner);
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 gcc_jit_block *get_inner_block () const;
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 function get_function () const;
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 void add_eval (rvalue rvalue,
kono
parents:
diff changeset
399 location loc = location ());
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 void add_assignment (lvalue lvalue,
kono
parents:
diff changeset
402 rvalue rvalue,
kono
parents:
diff changeset
403 location loc = location ());
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 void add_assignment_op (lvalue lvalue,
kono
parents:
diff changeset
406 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
407 rvalue rvalue,
kono
parents:
diff changeset
408 location loc = location ());
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 /* A way to add a function call to the body of a function being
kono
parents:
diff changeset
411 defined, with various numbers of args. */
kono
parents:
diff changeset
412 rvalue add_call (function other,
kono
parents:
diff changeset
413 location loc = location ());
kono
parents:
diff changeset
414 rvalue add_call (function other,
kono
parents:
diff changeset
415 rvalue arg0,
kono
parents:
diff changeset
416 location loc = location ());
kono
parents:
diff changeset
417 rvalue add_call (function other,
kono
parents:
diff changeset
418 rvalue arg0, rvalue arg1,
kono
parents:
diff changeset
419 location loc = location ());
kono
parents:
diff changeset
420 rvalue add_call (function other,
kono
parents:
diff changeset
421 rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
422 location loc = location ());
kono
parents:
diff changeset
423 rvalue add_call (function other,
kono
parents:
diff changeset
424 rvalue arg0, rvalue arg1, rvalue arg2, rvalue arg3,
kono
parents:
diff changeset
425 location loc = location ());
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 void add_comment (const std::string &text,
kono
parents:
diff changeset
428 location loc = location ());
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 void end_with_conditional (rvalue boolval,
kono
parents:
diff changeset
431 block on_true,
kono
parents:
diff changeset
432 block on_false,
kono
parents:
diff changeset
433 location loc = location ());
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 void end_with_jump (block target,
kono
parents:
diff changeset
436 location loc = location ());
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 void end_with_return (rvalue rvalue,
kono
parents:
diff changeset
439 location loc = location ());
kono
parents:
diff changeset
440 void end_with_return (location loc = location ());
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 void end_with_switch (rvalue expr,
kono
parents:
diff changeset
443 block default_block,
kono
parents:
diff changeset
444 std::vector <case_> cases,
kono
parents:
diff changeset
445 location loc = location ());
kono
parents:
diff changeset
446 };
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 class rvalue : public object
kono
parents:
diff changeset
449 {
kono
parents:
diff changeset
450 public:
kono
parents:
diff changeset
451 rvalue ();
kono
parents:
diff changeset
452 rvalue (gcc_jit_rvalue *inner);
kono
parents:
diff changeset
453 gcc_jit_rvalue *get_inner_rvalue () const;
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 type get_type ();
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 rvalue access_field (field field,
kono
parents:
diff changeset
458 location loc = location ());
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 lvalue dereference_field (field field,
kono
parents:
diff changeset
461 location loc = location ());
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 lvalue dereference (location loc = location ());
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 rvalue cast_to (type type_,
kono
parents:
diff changeset
466 location loc = location ());
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 /* Array access. */
kono
parents:
diff changeset
469 lvalue operator[] (rvalue index);
kono
parents:
diff changeset
470 lvalue operator[] (int index);
kono
parents:
diff changeset
471 };
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 class lvalue : public rvalue
kono
parents:
diff changeset
474 {
kono
parents:
diff changeset
475 public:
kono
parents:
diff changeset
476 lvalue ();
kono
parents:
diff changeset
477 lvalue (gcc_jit_lvalue *inner);
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 gcc_jit_lvalue *get_inner_lvalue () const;
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 lvalue access_field (field field,
kono
parents:
diff changeset
482 location loc = location ());
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 rvalue get_address (location loc = location ());
kono
parents:
diff changeset
485 };
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 class param : public lvalue
kono
parents:
diff changeset
488 {
kono
parents:
diff changeset
489 public:
kono
parents:
diff changeset
490 param ();
kono
parents:
diff changeset
491 param (gcc_jit_param *inner);
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 gcc_jit_param *get_inner_param () const;
kono
parents:
diff changeset
494 };
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 class case_ : public object
kono
parents:
diff changeset
497 {
kono
parents:
diff changeset
498 public:
kono
parents:
diff changeset
499 case_ ();
kono
parents:
diff changeset
500 case_ (gcc_jit_case *inner);
kono
parents:
diff changeset
501
kono
parents:
diff changeset
502 gcc_jit_case *get_inner_case () const;
kono
parents:
diff changeset
503 };
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 /* Overloaded operators, for those who want the most terse API
kono
parents:
diff changeset
506 (at the possible risk of being a little too magical).
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 In each case, the first parameter is used to determine which context
kono
parents:
diff changeset
509 owns the resulting expression, and, where appropriate, what the
kono
parents:
diff changeset
510 latter's type is. */
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 /* Unary operators. */
kono
parents:
diff changeset
513 rvalue operator- (rvalue a); // unary minus
kono
parents:
diff changeset
514 rvalue operator~ (rvalue a); // unary bitwise negate
kono
parents:
diff changeset
515 rvalue operator! (rvalue a); // unary logical negate
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 /* Binary operators. */
kono
parents:
diff changeset
518 rvalue operator+ (rvalue a, rvalue b);
kono
parents:
diff changeset
519 rvalue operator- (rvalue a, rvalue b);
kono
parents:
diff changeset
520 rvalue operator* (rvalue a, rvalue b);
kono
parents:
diff changeset
521 rvalue operator/ (rvalue a, rvalue b);
kono
parents:
diff changeset
522 rvalue operator% (rvalue a, rvalue b);
kono
parents:
diff changeset
523 rvalue operator& (rvalue a, rvalue b); // bitwise and
kono
parents:
diff changeset
524 rvalue operator^ (rvalue a, rvalue b); // bitwise_xor
kono
parents:
diff changeset
525 rvalue operator| (rvalue a, rvalue b); // bitwise_or
kono
parents:
diff changeset
526 rvalue operator&& (rvalue a, rvalue b); // logical_and
kono
parents:
diff changeset
527 rvalue operator|| (rvalue a, rvalue b); // logical_or
kono
parents:
diff changeset
528
kono
parents:
diff changeset
529 /* Comparisons. */
kono
parents:
diff changeset
530 rvalue operator== (rvalue a, rvalue b);
kono
parents:
diff changeset
531 rvalue operator!= (rvalue a, rvalue b);
kono
parents:
diff changeset
532 rvalue operator< (rvalue a, rvalue b);
kono
parents:
diff changeset
533 rvalue operator<= (rvalue a, rvalue b);
kono
parents:
diff changeset
534 rvalue operator> (rvalue a, rvalue b);
kono
parents:
diff changeset
535 rvalue operator>= (rvalue a, rvalue b);
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 /* Dereferencing. */
kono
parents:
diff changeset
538 lvalue operator* (rvalue ptr);
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 class timer
kono
parents:
diff changeset
541 {
kono
parents:
diff changeset
542 public:
kono
parents:
diff changeset
543 timer ();
kono
parents:
diff changeset
544 timer (gcc_jit_timer *inner_timer);
kono
parents:
diff changeset
545
kono
parents:
diff changeset
546 void push (const char *item_name);
kono
parents:
diff changeset
547 void pop (const char *item_name);
kono
parents:
diff changeset
548 void print (FILE *f_out) const;
kono
parents:
diff changeset
549
kono
parents:
diff changeset
550 void release ();
kono
parents:
diff changeset
551
kono
parents:
diff changeset
552 gcc_jit_timer *get_inner_timer () const;
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 private:
kono
parents:
diff changeset
555 gcc_jit_timer *m_inner_timer;
kono
parents:
diff changeset
556 };
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 class auto_time
kono
parents:
diff changeset
559 {
kono
parents:
diff changeset
560 public:
kono
parents:
diff changeset
561 auto_time (timer t, const char *item_name);
kono
parents:
diff changeset
562 auto_time (context ctxt, const char *item_name);
kono
parents:
diff changeset
563 ~auto_time ();
kono
parents:
diff changeset
564
kono
parents:
diff changeset
565 private:
kono
parents:
diff changeset
566 timer m_timer;
kono
parents:
diff changeset
567 const char *m_item_name;
kono
parents:
diff changeset
568 };
kono
parents:
diff changeset
569 }
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 /****************************************************************************
kono
parents:
diff changeset
572 Implementation of the API
kono
parents:
diff changeset
573 ****************************************************************************/
kono
parents:
diff changeset
574 namespace gccjit {
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 // class context
kono
parents:
diff changeset
577 inline context context::acquire ()
kono
parents:
diff changeset
578 {
kono
parents:
diff changeset
579 return context (gcc_jit_context_acquire ());
kono
parents:
diff changeset
580 }
kono
parents:
diff changeset
581 inline context::context () : m_inner_ctxt (NULL) {}
kono
parents:
diff changeset
582 inline context::context (gcc_jit_context *inner) : m_inner_ctxt (inner)
kono
parents:
diff changeset
583 {
kono
parents:
diff changeset
584 if (!inner)
kono
parents:
diff changeset
585 throw error ();
kono
parents:
diff changeset
586 }
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 inline gccjit::context
kono
parents:
diff changeset
589 context::new_child_context ()
kono
parents:
diff changeset
590 {
kono
parents:
diff changeset
591 return context (gcc_jit_context_new_child_context (m_inner_ctxt));
kono
parents:
diff changeset
592 }
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 inline void
kono
parents:
diff changeset
595 context::release ()
kono
parents:
diff changeset
596 {
kono
parents:
diff changeset
597 gcc_jit_context_release (m_inner_ctxt);
kono
parents:
diff changeset
598 m_inner_ctxt = NULL;
kono
parents:
diff changeset
599 }
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 inline gcc_jit_result *
kono
parents:
diff changeset
602 context::compile ()
kono
parents:
diff changeset
603 {
kono
parents:
diff changeset
604 gcc_jit_result *result = gcc_jit_context_compile (m_inner_ctxt);
kono
parents:
diff changeset
605 if (!result)
kono
parents:
diff changeset
606 throw error ();
kono
parents:
diff changeset
607 return result;
kono
parents:
diff changeset
608 }
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 inline void
kono
parents:
diff changeset
611 context::compile_to_file (enum gcc_jit_output_kind output_kind,
kono
parents:
diff changeset
612 const char *output_path)
kono
parents:
diff changeset
613 {
kono
parents:
diff changeset
614 gcc_jit_context_compile_to_file (m_inner_ctxt,
kono
parents:
diff changeset
615 output_kind,
kono
parents:
diff changeset
616 output_path);
kono
parents:
diff changeset
617 }
kono
parents:
diff changeset
618
kono
parents:
diff changeset
619 inline void
kono
parents:
diff changeset
620 context::dump_to_file (const std::string &path,
kono
parents:
diff changeset
621 bool update_locations)
kono
parents:
diff changeset
622 {
kono
parents:
diff changeset
623 gcc_jit_context_dump_to_file (m_inner_ctxt,
kono
parents:
diff changeset
624 path.c_str (),
kono
parents:
diff changeset
625 update_locations);
kono
parents:
diff changeset
626 }
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 inline void
kono
parents:
diff changeset
629 context::set_logfile (FILE *logfile,
kono
parents:
diff changeset
630 int flags,
kono
parents:
diff changeset
631 int verbosity)
kono
parents:
diff changeset
632 {
kono
parents:
diff changeset
633 gcc_jit_context_set_logfile (m_inner_ctxt,
kono
parents:
diff changeset
634 logfile,
kono
parents:
diff changeset
635 flags,
kono
parents:
diff changeset
636 verbosity);
kono
parents:
diff changeset
637 }
kono
parents:
diff changeset
638
kono
parents:
diff changeset
639 inline void
kono
parents:
diff changeset
640 context::dump_reproducer_to_file (const char *path)
kono
parents:
diff changeset
641 {
kono
parents:
diff changeset
642 gcc_jit_context_dump_reproducer_to_file (m_inner_ctxt,
kono
parents:
diff changeset
643 path);
kono
parents:
diff changeset
644 }
kono
parents:
diff changeset
645
kono
parents:
diff changeset
646 inline void
kono
parents:
diff changeset
647 context::set_str_option (enum gcc_jit_str_option opt,
kono
parents:
diff changeset
648 const char *value)
kono
parents:
diff changeset
649 {
kono
parents:
diff changeset
650 gcc_jit_context_set_str_option (m_inner_ctxt, opt, value);
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 }
kono
parents:
diff changeset
653
kono
parents:
diff changeset
654 inline void
kono
parents:
diff changeset
655 context::set_int_option (enum gcc_jit_int_option opt,
kono
parents:
diff changeset
656 int value)
kono
parents:
diff changeset
657 {
kono
parents:
diff changeset
658 gcc_jit_context_set_int_option (m_inner_ctxt, opt, value);
kono
parents:
diff changeset
659
kono
parents:
diff changeset
660 }
kono
parents:
diff changeset
661
kono
parents:
diff changeset
662 inline void
kono
parents:
diff changeset
663 context::set_bool_option (enum gcc_jit_bool_option opt,
kono
parents:
diff changeset
664 int value)
kono
parents:
diff changeset
665 {
kono
parents:
diff changeset
666 gcc_jit_context_set_bool_option (m_inner_ctxt, opt, value);
kono
parents:
diff changeset
667 }
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 inline void
kono
parents:
diff changeset
670 context::set_bool_allow_unreachable_blocks (int bool_value)
kono
parents:
diff changeset
671 {
kono
parents:
diff changeset
672 gcc_jit_context_set_bool_allow_unreachable_blocks (m_inner_ctxt,
kono
parents:
diff changeset
673 bool_value);
kono
parents:
diff changeset
674 }
kono
parents:
diff changeset
675
kono
parents:
diff changeset
676 inline void
kono
parents:
diff changeset
677 context::set_bool_use_external_driver (int bool_value)
kono
parents:
diff changeset
678 {
kono
parents:
diff changeset
679 gcc_jit_context_set_bool_use_external_driver (m_inner_ctxt,
kono
parents:
diff changeset
680 bool_value);
kono
parents:
diff changeset
681 }
kono
parents:
diff changeset
682
kono
parents:
diff changeset
683 inline void
kono
parents:
diff changeset
684 context::add_command_line_option (const char *optname)
kono
parents:
diff changeset
685 {
kono
parents:
diff changeset
686 gcc_jit_context_add_command_line_option (m_inner_ctxt, optname);
kono
parents:
diff changeset
687 }
kono
parents:
diff changeset
688
kono
parents:
diff changeset
689 inline void
kono
parents:
diff changeset
690 context::set_timer (gccjit::timer t)
kono
parents:
diff changeset
691 {
kono
parents:
diff changeset
692 gcc_jit_context_set_timer (m_inner_ctxt, t.get_inner_timer ());
kono
parents:
diff changeset
693 }
kono
parents:
diff changeset
694
kono
parents:
diff changeset
695 inline gccjit::timer
kono
parents:
diff changeset
696 context::get_timer () const
kono
parents:
diff changeset
697 {
kono
parents:
diff changeset
698 return gccjit::timer (gcc_jit_context_get_timer (m_inner_ctxt));
kono
parents:
diff changeset
699 }
kono
parents:
diff changeset
700
kono
parents:
diff changeset
701
kono
parents:
diff changeset
702 inline location
kono
parents:
diff changeset
703 context::new_location (const std::string &filename,
kono
parents:
diff changeset
704 int line,
kono
parents:
diff changeset
705 int column)
kono
parents:
diff changeset
706 {
kono
parents:
diff changeset
707 return location (gcc_jit_context_new_location (m_inner_ctxt,
kono
parents:
diff changeset
708 filename.c_str (),
kono
parents:
diff changeset
709 line,
kono
parents:
diff changeset
710 column));
kono
parents:
diff changeset
711 }
kono
parents:
diff changeset
712
kono
parents:
diff changeset
713 inline type
kono
parents:
diff changeset
714 context::get_type (enum gcc_jit_types kind)
kono
parents:
diff changeset
715 {
kono
parents:
diff changeset
716 return type (gcc_jit_context_get_type (m_inner_ctxt, kind));
kono
parents:
diff changeset
717 }
kono
parents:
diff changeset
718
kono
parents:
diff changeset
719 inline type
kono
parents:
diff changeset
720 context::get_int_type (size_t num_bytes, int is_signed)
kono
parents:
diff changeset
721 {
kono
parents:
diff changeset
722 return type (gcc_jit_context_get_int_type (m_inner_ctxt,
kono
parents:
diff changeset
723 num_bytes,
kono
parents:
diff changeset
724 is_signed));
kono
parents:
diff changeset
725 }
kono
parents:
diff changeset
726
kono
parents:
diff changeset
727 template <typename T>
kono
parents:
diff changeset
728 inline type
kono
parents:
diff changeset
729 context::get_int_type ()
kono
parents:
diff changeset
730 {
kono
parents:
diff changeset
731 return get_int_type (sizeof (T), std::numeric_limits<T>::is_signed);
kono
parents:
diff changeset
732 }
kono
parents:
diff changeset
733
kono
parents:
diff changeset
734 inline type
kono
parents:
diff changeset
735 context::new_array_type (type element_type, int num_elements, location loc)
kono
parents:
diff changeset
736 {
kono
parents:
diff changeset
737 return type (gcc_jit_context_new_array_type (
kono
parents:
diff changeset
738 m_inner_ctxt,
kono
parents:
diff changeset
739 loc.get_inner_location (),
kono
parents:
diff changeset
740 element_type.get_inner_type (),
kono
parents:
diff changeset
741 num_elements));
kono
parents:
diff changeset
742 }
kono
parents:
diff changeset
743
kono
parents:
diff changeset
744 inline field
kono
parents:
diff changeset
745 context::new_field (type type_, const std::string &name, location loc)
kono
parents:
diff changeset
746 {
kono
parents:
diff changeset
747 return field (gcc_jit_context_new_field (m_inner_ctxt,
kono
parents:
diff changeset
748 loc.get_inner_location (),
kono
parents:
diff changeset
749 type_.get_inner_type (),
kono
parents:
diff changeset
750 name.c_str ()));
kono
parents:
diff changeset
751 }
kono
parents:
diff changeset
752
kono
parents:
diff changeset
753 inline struct_
kono
parents:
diff changeset
754 context::new_struct_type (const std::string &name,
kono
parents:
diff changeset
755 std::vector<field> &fields,
kono
parents:
diff changeset
756 location loc)
kono
parents:
diff changeset
757 {
kono
parents:
diff changeset
758 /* Treat std::vector as an array, relying on it not being resized: */
kono
parents:
diff changeset
759 field *as_array_of_wrappers = &fields[0];
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 /* Treat the array as being of the underlying pointers, relying on
kono
parents:
diff changeset
762 the wrapper type being such a pointer internally. */
kono
parents:
diff changeset
763 gcc_jit_field **as_array_of_ptrs =
kono
parents:
diff changeset
764 reinterpret_cast<gcc_jit_field **> (as_array_of_wrappers);
kono
parents:
diff changeset
765
kono
parents:
diff changeset
766 return struct_ (gcc_jit_context_new_struct_type (m_inner_ctxt,
kono
parents:
diff changeset
767 loc.get_inner_location (),
kono
parents:
diff changeset
768 name.c_str (),
kono
parents:
diff changeset
769 fields.size (),
kono
parents:
diff changeset
770 as_array_of_ptrs));
kono
parents:
diff changeset
771 }
kono
parents:
diff changeset
772
kono
parents:
diff changeset
773 inline struct_
kono
parents:
diff changeset
774 context::new_opaque_struct_type (const std::string &name,
kono
parents:
diff changeset
775 location loc)
kono
parents:
diff changeset
776 {
kono
parents:
diff changeset
777 return struct_ (gcc_jit_context_new_opaque_struct (
kono
parents:
diff changeset
778 m_inner_ctxt,
kono
parents:
diff changeset
779 loc.get_inner_location (),
kono
parents:
diff changeset
780 name.c_str ()));
kono
parents:
diff changeset
781 }
kono
parents:
diff changeset
782
kono
parents:
diff changeset
783 inline param
kono
parents:
diff changeset
784 context::new_param (type type_,
kono
parents:
diff changeset
785 const std::string &name,
kono
parents:
diff changeset
786 location loc)
kono
parents:
diff changeset
787 {
kono
parents:
diff changeset
788 return param (gcc_jit_context_new_param (m_inner_ctxt,
kono
parents:
diff changeset
789 loc.get_inner_location (),
kono
parents:
diff changeset
790 type_.get_inner_type (),
kono
parents:
diff changeset
791 name.c_str ()));
kono
parents:
diff changeset
792 }
kono
parents:
diff changeset
793
kono
parents:
diff changeset
794 inline function
kono
parents:
diff changeset
795 context::new_function (enum gcc_jit_function_kind kind,
kono
parents:
diff changeset
796 type return_type,
kono
parents:
diff changeset
797 const std::string &name,
kono
parents:
diff changeset
798 std::vector<param> &params,
kono
parents:
diff changeset
799 int is_variadic,
kono
parents:
diff changeset
800 location loc)
kono
parents:
diff changeset
801 {
kono
parents:
diff changeset
802 /* Treat std::vector as an array, relying on it not being resized: */
kono
parents:
diff changeset
803 param *as_array_of_wrappers = &params[0];
kono
parents:
diff changeset
804
kono
parents:
diff changeset
805 /* Treat the array as being of the underlying pointers, relying on
kono
parents:
diff changeset
806 the wrapper type being such a pointer internally. */
kono
parents:
diff changeset
807 gcc_jit_param **as_array_of_ptrs =
kono
parents:
diff changeset
808 reinterpret_cast<gcc_jit_param **> (as_array_of_wrappers);
kono
parents:
diff changeset
809
kono
parents:
diff changeset
810 return function (gcc_jit_context_new_function (m_inner_ctxt,
kono
parents:
diff changeset
811 loc.get_inner_location (),
kono
parents:
diff changeset
812 kind,
kono
parents:
diff changeset
813 return_type.get_inner_type (),
kono
parents:
diff changeset
814 name.c_str (),
kono
parents:
diff changeset
815 params.size (),
kono
parents:
diff changeset
816 as_array_of_ptrs,
kono
parents:
diff changeset
817 is_variadic));
kono
parents:
diff changeset
818 }
kono
parents:
diff changeset
819
kono
parents:
diff changeset
820 inline function
kono
parents:
diff changeset
821 context::get_builtin_function (const std::string &name)
kono
parents:
diff changeset
822 {
kono
parents:
diff changeset
823 return function (gcc_jit_context_get_builtin_function (m_inner_ctxt,
kono
parents:
diff changeset
824 name.c_str ()));
kono
parents:
diff changeset
825 }
kono
parents:
diff changeset
826
kono
parents:
diff changeset
827 inline lvalue
kono
parents:
diff changeset
828 context::new_global (enum gcc_jit_global_kind kind,
kono
parents:
diff changeset
829 type type_,
kono
parents:
diff changeset
830 const std::string &name,
kono
parents:
diff changeset
831 location loc)
kono
parents:
diff changeset
832 {
kono
parents:
diff changeset
833 return lvalue (gcc_jit_context_new_global (m_inner_ctxt,
kono
parents:
diff changeset
834 loc.get_inner_location (),
kono
parents:
diff changeset
835 kind,
kono
parents:
diff changeset
836 type_.get_inner_type (),
kono
parents:
diff changeset
837 name.c_str ()));
kono
parents:
diff changeset
838 }
kono
parents:
diff changeset
839
kono
parents:
diff changeset
840 inline rvalue
kono
parents:
diff changeset
841 context::new_rvalue (type numeric_type,
kono
parents:
diff changeset
842 int value) const
kono
parents:
diff changeset
843 {
kono
parents:
diff changeset
844 return rvalue (
kono
parents:
diff changeset
845 gcc_jit_context_new_rvalue_from_int (m_inner_ctxt,
kono
parents:
diff changeset
846 numeric_type.get_inner_type (),
kono
parents:
diff changeset
847 value));
kono
parents:
diff changeset
848 }
kono
parents:
diff changeset
849
kono
parents:
diff changeset
850 inline rvalue
kono
parents:
diff changeset
851 context::new_rvalue (type numeric_type,
kono
parents:
diff changeset
852 long value) const
kono
parents:
diff changeset
853 {
kono
parents:
diff changeset
854 return rvalue (
kono
parents:
diff changeset
855 gcc_jit_context_new_rvalue_from_long (m_inner_ctxt,
kono
parents:
diff changeset
856 numeric_type.get_inner_type (),
kono
parents:
diff changeset
857 value));
kono
parents:
diff changeset
858 }
kono
parents:
diff changeset
859
kono
parents:
diff changeset
860 inline rvalue
kono
parents:
diff changeset
861 context::zero (type numeric_type) const
kono
parents:
diff changeset
862 {
kono
parents:
diff changeset
863 return rvalue (gcc_jit_context_zero (m_inner_ctxt,
kono
parents:
diff changeset
864 numeric_type.get_inner_type ()));
kono
parents:
diff changeset
865 }
kono
parents:
diff changeset
866
kono
parents:
diff changeset
867 inline rvalue
kono
parents:
diff changeset
868 context::one (type numeric_type) const
kono
parents:
diff changeset
869 {
kono
parents:
diff changeset
870 return rvalue (gcc_jit_context_one (m_inner_ctxt,
kono
parents:
diff changeset
871 numeric_type.get_inner_type ()));
kono
parents:
diff changeset
872 }
kono
parents:
diff changeset
873
kono
parents:
diff changeset
874 inline rvalue
kono
parents:
diff changeset
875 context::new_rvalue (type numeric_type,
kono
parents:
diff changeset
876 double value) const
kono
parents:
diff changeset
877 {
kono
parents:
diff changeset
878 return rvalue (
kono
parents:
diff changeset
879 gcc_jit_context_new_rvalue_from_double (m_inner_ctxt,
kono
parents:
diff changeset
880 numeric_type.get_inner_type (),
kono
parents:
diff changeset
881 value));
kono
parents:
diff changeset
882 }
kono
parents:
diff changeset
883
kono
parents:
diff changeset
884 inline rvalue
kono
parents:
diff changeset
885 context::new_rvalue (type pointer_type,
kono
parents:
diff changeset
886 void *value) const
kono
parents:
diff changeset
887 {
kono
parents:
diff changeset
888 return rvalue (
kono
parents:
diff changeset
889 gcc_jit_context_new_rvalue_from_ptr (m_inner_ctxt,
kono
parents:
diff changeset
890 pointer_type.get_inner_type (),
kono
parents:
diff changeset
891 value));
kono
parents:
diff changeset
892 }
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 inline rvalue
kono
parents:
diff changeset
895 context::new_rvalue (const std::string &value) const
kono
parents:
diff changeset
896 {
kono
parents:
diff changeset
897 return rvalue (
kono
parents:
diff changeset
898 gcc_jit_context_new_string_literal (m_inner_ctxt, value.c_str ()));
kono
parents:
diff changeset
899 }
kono
parents:
diff changeset
900
kono
parents:
diff changeset
901 inline rvalue
kono
parents:
diff changeset
902 context::new_rvalue (type vector_type,
kono
parents:
diff changeset
903 std::vector<rvalue> elements) const
kono
parents:
diff changeset
904 {
kono
parents:
diff changeset
905 /* Treat std::vector as an array, relying on it not being resized: */
kono
parents:
diff changeset
906 rvalue *as_array_of_wrappers = &elements[0];
kono
parents:
diff changeset
907
kono
parents:
diff changeset
908 /* Treat the array as being of the underlying pointers, relying on
kono
parents:
diff changeset
909 the wrapper type being such a pointer internally. */
kono
parents:
diff changeset
910 gcc_jit_rvalue **as_array_of_ptrs =
kono
parents:
diff changeset
911 reinterpret_cast<gcc_jit_rvalue **> (as_array_of_wrappers);
kono
parents:
diff changeset
912
kono
parents:
diff changeset
913 return rvalue (
kono
parents:
diff changeset
914 gcc_jit_context_new_rvalue_from_vector (m_inner_ctxt,
kono
parents:
diff changeset
915 NULL,
kono
parents:
diff changeset
916 vector_type.get_inner_type (),
kono
parents:
diff changeset
917 elements.size (),
kono
parents:
diff changeset
918 as_array_of_ptrs));
kono
parents:
diff changeset
919 }
kono
parents:
diff changeset
920
kono
parents:
diff changeset
921 inline rvalue
kono
parents:
diff changeset
922 context::new_unary_op (enum gcc_jit_unary_op op,
kono
parents:
diff changeset
923 type result_type,
kono
parents:
diff changeset
924 rvalue a,
kono
parents:
diff changeset
925 location loc)
kono
parents:
diff changeset
926 {
kono
parents:
diff changeset
927 return rvalue (gcc_jit_context_new_unary_op (m_inner_ctxt,
kono
parents:
diff changeset
928 loc.get_inner_location (),
kono
parents:
diff changeset
929 op,
kono
parents:
diff changeset
930 result_type.get_inner_type (),
kono
parents:
diff changeset
931 a.get_inner_rvalue ()));
kono
parents:
diff changeset
932 }
kono
parents:
diff changeset
933 inline rvalue
kono
parents:
diff changeset
934 context::new_minus (type result_type,
kono
parents:
diff changeset
935 rvalue a,
kono
parents:
diff changeset
936 location loc)
kono
parents:
diff changeset
937 {
kono
parents:
diff changeset
938 return rvalue (new_unary_op (GCC_JIT_UNARY_OP_MINUS,
kono
parents:
diff changeset
939 result_type, a, loc));
kono
parents:
diff changeset
940 }
kono
parents:
diff changeset
941 inline rvalue
kono
parents:
diff changeset
942 context::new_bitwise_negate (type result_type,
kono
parents:
diff changeset
943 rvalue a,
kono
parents:
diff changeset
944 location loc)
kono
parents:
diff changeset
945 {
kono
parents:
diff changeset
946 return rvalue (new_unary_op (GCC_JIT_UNARY_OP_BITWISE_NEGATE,
kono
parents:
diff changeset
947 result_type, a, loc));
kono
parents:
diff changeset
948 }
kono
parents:
diff changeset
949 inline rvalue
kono
parents:
diff changeset
950 context::new_logical_negate (type result_type,
kono
parents:
diff changeset
951 rvalue a,
kono
parents:
diff changeset
952 location loc)
kono
parents:
diff changeset
953 {
kono
parents:
diff changeset
954 return rvalue (new_unary_op (GCC_JIT_UNARY_OP_LOGICAL_NEGATE,
kono
parents:
diff changeset
955 result_type, a, loc));
kono
parents:
diff changeset
956 }
kono
parents:
diff changeset
957
kono
parents:
diff changeset
958 inline rvalue
kono
parents:
diff changeset
959 context::new_binary_op (enum gcc_jit_binary_op op,
kono
parents:
diff changeset
960 type result_type,
kono
parents:
diff changeset
961 rvalue a, rvalue b,
kono
parents:
diff changeset
962 location loc)
kono
parents:
diff changeset
963 {
kono
parents:
diff changeset
964 return rvalue (gcc_jit_context_new_binary_op (m_inner_ctxt,
kono
parents:
diff changeset
965 loc.get_inner_location (),
kono
parents:
diff changeset
966 op,
kono
parents:
diff changeset
967 result_type.get_inner_type (),
kono
parents:
diff changeset
968 a.get_inner_rvalue (),
kono
parents:
diff changeset
969 b.get_inner_rvalue ()));
kono
parents:
diff changeset
970 }
kono
parents:
diff changeset
971 inline rvalue
kono
parents:
diff changeset
972 context::new_plus (type result_type,
kono
parents:
diff changeset
973 rvalue a, rvalue b,
kono
parents:
diff changeset
974 location loc)
kono
parents:
diff changeset
975 {
kono
parents:
diff changeset
976 return new_binary_op (GCC_JIT_BINARY_OP_PLUS,
kono
parents:
diff changeset
977 result_type, a, b, loc);
kono
parents:
diff changeset
978 }
kono
parents:
diff changeset
979 inline rvalue
kono
parents:
diff changeset
980 context::new_minus (type result_type,
kono
parents:
diff changeset
981 rvalue a, rvalue b,
kono
parents:
diff changeset
982 location loc)
kono
parents:
diff changeset
983 {
kono
parents:
diff changeset
984 return new_binary_op (GCC_JIT_BINARY_OP_MINUS,
kono
parents:
diff changeset
985 result_type, a, b, loc);
kono
parents:
diff changeset
986 }
kono
parents:
diff changeset
987 inline rvalue
kono
parents:
diff changeset
988 context::new_mult (type result_type,
kono
parents:
diff changeset
989 rvalue a, rvalue b,
kono
parents:
diff changeset
990 location loc)
kono
parents:
diff changeset
991 {
kono
parents:
diff changeset
992 return new_binary_op (GCC_JIT_BINARY_OP_MULT,
kono
parents:
diff changeset
993 result_type, a, b, loc);
kono
parents:
diff changeset
994 }
kono
parents:
diff changeset
995 inline rvalue
kono
parents:
diff changeset
996 context::new_divide (type result_type,
kono
parents:
diff changeset
997 rvalue a, rvalue b,
kono
parents:
diff changeset
998 location loc)
kono
parents:
diff changeset
999 {
kono
parents:
diff changeset
1000 return new_binary_op (GCC_JIT_BINARY_OP_DIVIDE,
kono
parents:
diff changeset
1001 result_type, a, b, loc);
kono
parents:
diff changeset
1002 }
kono
parents:
diff changeset
1003 inline rvalue
kono
parents:
diff changeset
1004 context::new_modulo (type result_type,
kono
parents:
diff changeset
1005 rvalue a, rvalue b,
kono
parents:
diff changeset
1006 location loc)
kono
parents:
diff changeset
1007 {
kono
parents:
diff changeset
1008 return new_binary_op (GCC_JIT_BINARY_OP_MODULO,
kono
parents:
diff changeset
1009 result_type, a, b, loc);
kono
parents:
diff changeset
1010 }
kono
parents:
diff changeset
1011 inline rvalue
kono
parents:
diff changeset
1012 context::new_bitwise_and (type result_type,
kono
parents:
diff changeset
1013 rvalue a, rvalue b,
kono
parents:
diff changeset
1014 location loc)
kono
parents:
diff changeset
1015 {
kono
parents:
diff changeset
1016 return new_binary_op (GCC_JIT_BINARY_OP_BITWISE_AND,
kono
parents:
diff changeset
1017 result_type, a, b, loc);
kono
parents:
diff changeset
1018 }
kono
parents:
diff changeset
1019 inline rvalue
kono
parents:
diff changeset
1020 context::new_bitwise_xor (type result_type,
kono
parents:
diff changeset
1021 rvalue a, rvalue b,
kono
parents:
diff changeset
1022 location loc)
kono
parents:
diff changeset
1023 {
kono
parents:
diff changeset
1024 return new_binary_op (GCC_JIT_BINARY_OP_BITWISE_XOR,
kono
parents:
diff changeset
1025 result_type, a, b, loc);
kono
parents:
diff changeset
1026 }
kono
parents:
diff changeset
1027 inline rvalue
kono
parents:
diff changeset
1028 context::new_bitwise_or (type result_type,
kono
parents:
diff changeset
1029 rvalue a, rvalue b,
kono
parents:
diff changeset
1030 location loc)
kono
parents:
diff changeset
1031 {
kono
parents:
diff changeset
1032 return new_binary_op (GCC_JIT_BINARY_OP_BITWISE_OR,
kono
parents:
diff changeset
1033 result_type, a, b, loc);
kono
parents:
diff changeset
1034 }
kono
parents:
diff changeset
1035 inline rvalue
kono
parents:
diff changeset
1036 context::new_logical_and (type result_type,
kono
parents:
diff changeset
1037 rvalue a, rvalue b,
kono
parents:
diff changeset
1038 location loc)
kono
parents:
diff changeset
1039 {
kono
parents:
diff changeset
1040 return new_binary_op (GCC_JIT_BINARY_OP_LOGICAL_AND,
kono
parents:
diff changeset
1041 result_type, a, b, loc);
kono
parents:
diff changeset
1042 }
kono
parents:
diff changeset
1043 inline rvalue
kono
parents:
diff changeset
1044 context::new_logical_or (type result_type,
kono
parents:
diff changeset
1045 rvalue a, rvalue b,
kono
parents:
diff changeset
1046 location loc)
kono
parents:
diff changeset
1047 {
kono
parents:
diff changeset
1048 return new_binary_op (GCC_JIT_BINARY_OP_LOGICAL_OR,
kono
parents:
diff changeset
1049 result_type, a, b, loc);
kono
parents:
diff changeset
1050 }
kono
parents:
diff changeset
1051
kono
parents:
diff changeset
1052 inline rvalue
kono
parents:
diff changeset
1053 context::new_comparison (enum gcc_jit_comparison op,
kono
parents:
diff changeset
1054 rvalue a, rvalue b,
kono
parents:
diff changeset
1055 location loc)
kono
parents:
diff changeset
1056 {
kono
parents:
diff changeset
1057 return rvalue (gcc_jit_context_new_comparison (m_inner_ctxt,
kono
parents:
diff changeset
1058 loc.get_inner_location (),
kono
parents:
diff changeset
1059 op,
kono
parents:
diff changeset
1060 a.get_inner_rvalue (),
kono
parents:
diff changeset
1061 b.get_inner_rvalue ()));
kono
parents:
diff changeset
1062 }
kono
parents:
diff changeset
1063 inline rvalue
kono
parents:
diff changeset
1064 context::new_eq (rvalue a, rvalue b,
kono
parents:
diff changeset
1065 location loc)
kono
parents:
diff changeset
1066 {
kono
parents:
diff changeset
1067 return new_comparison (GCC_JIT_COMPARISON_EQ,
kono
parents:
diff changeset
1068 a, b, loc);
kono
parents:
diff changeset
1069 }
kono
parents:
diff changeset
1070 inline rvalue
kono
parents:
diff changeset
1071 context::new_ne (rvalue a, rvalue b,
kono
parents:
diff changeset
1072 location loc)
kono
parents:
diff changeset
1073 {
kono
parents:
diff changeset
1074 return new_comparison (GCC_JIT_COMPARISON_NE,
kono
parents:
diff changeset
1075 a, b, loc);
kono
parents:
diff changeset
1076 }
kono
parents:
diff changeset
1077 inline rvalue
kono
parents:
diff changeset
1078 context::new_lt (rvalue a, rvalue b,
kono
parents:
diff changeset
1079 location loc)
kono
parents:
diff changeset
1080 {
kono
parents:
diff changeset
1081 return new_comparison (GCC_JIT_COMPARISON_LT,
kono
parents:
diff changeset
1082 a, b, loc);
kono
parents:
diff changeset
1083 }
kono
parents:
diff changeset
1084 inline rvalue
kono
parents:
diff changeset
1085 context::new_le (rvalue a, rvalue b,
kono
parents:
diff changeset
1086 location loc)
kono
parents:
diff changeset
1087 {
kono
parents:
diff changeset
1088 return new_comparison (GCC_JIT_COMPARISON_LE,
kono
parents:
diff changeset
1089 a, b, loc);
kono
parents:
diff changeset
1090 }
kono
parents:
diff changeset
1091 inline rvalue
kono
parents:
diff changeset
1092 context::new_gt (rvalue a, rvalue b,
kono
parents:
diff changeset
1093 location loc)
kono
parents:
diff changeset
1094 {
kono
parents:
diff changeset
1095 return new_comparison (GCC_JIT_COMPARISON_GT,
kono
parents:
diff changeset
1096 a, b, loc);
kono
parents:
diff changeset
1097 }
kono
parents:
diff changeset
1098 inline rvalue
kono
parents:
diff changeset
1099 context::new_ge (rvalue a, rvalue b,
kono
parents:
diff changeset
1100 location loc)
kono
parents:
diff changeset
1101 {
kono
parents:
diff changeset
1102 return new_comparison (GCC_JIT_COMPARISON_GE,
kono
parents:
diff changeset
1103 a, b, loc);
kono
parents:
diff changeset
1104 }
kono
parents:
diff changeset
1105
kono
parents:
diff changeset
1106 inline rvalue
kono
parents:
diff changeset
1107 context::new_call (function func,
kono
parents:
diff changeset
1108 std::vector<rvalue> &args,
kono
parents:
diff changeset
1109 location loc)
kono
parents:
diff changeset
1110 {
kono
parents:
diff changeset
1111 /* Treat std::vector as an array, relying on it not being resized: */
kono
parents:
diff changeset
1112 rvalue *as_array_of_wrappers = &args[0];
kono
parents:
diff changeset
1113
kono
parents:
diff changeset
1114 /* Treat the array as being of the underlying pointers, relying on
kono
parents:
diff changeset
1115 the wrapper type being such a pointer internally. */
kono
parents:
diff changeset
1116 gcc_jit_rvalue **as_array_of_ptrs =
kono
parents:
diff changeset
1117 reinterpret_cast<gcc_jit_rvalue **> (as_array_of_wrappers);
kono
parents:
diff changeset
1118 return gcc_jit_context_new_call (m_inner_ctxt,
kono
parents:
diff changeset
1119 loc.get_inner_location (),
kono
parents:
diff changeset
1120 func.get_inner_function (),
kono
parents:
diff changeset
1121 args.size (),
kono
parents:
diff changeset
1122 as_array_of_ptrs);
kono
parents:
diff changeset
1123 }
kono
parents:
diff changeset
1124 inline rvalue
kono
parents:
diff changeset
1125 context::new_call (function func,
kono
parents:
diff changeset
1126 location loc)
kono
parents:
diff changeset
1127 {
kono
parents:
diff changeset
1128 std::vector<rvalue> args;
kono
parents:
diff changeset
1129 return new_call (func, args, loc);
kono
parents:
diff changeset
1130 }
kono
parents:
diff changeset
1131
kono
parents:
diff changeset
1132 inline rvalue
kono
parents:
diff changeset
1133 context::new_call (function func,
kono
parents:
diff changeset
1134 rvalue arg0,
kono
parents:
diff changeset
1135 location loc)
kono
parents:
diff changeset
1136 {
kono
parents:
diff changeset
1137 std::vector<rvalue> args(1);
kono
parents:
diff changeset
1138 args[0] = arg0;
kono
parents:
diff changeset
1139 return new_call (func, args, loc);
kono
parents:
diff changeset
1140 }
kono
parents:
diff changeset
1141 inline rvalue
kono
parents:
diff changeset
1142 context::new_call (function func,
kono
parents:
diff changeset
1143 rvalue arg0, rvalue arg1,
kono
parents:
diff changeset
1144 location loc)
kono
parents:
diff changeset
1145 {
kono
parents:
diff changeset
1146 std::vector<rvalue> args(2);
kono
parents:
diff changeset
1147 args[0] = arg0;
kono
parents:
diff changeset
1148 args[1] = arg1;
kono
parents:
diff changeset
1149 return new_call (func, args, loc);
kono
parents:
diff changeset
1150 }
kono
parents:
diff changeset
1151 inline rvalue
kono
parents:
diff changeset
1152 context::new_call (function func,
kono
parents:
diff changeset
1153 rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
1154 location loc)
kono
parents:
diff changeset
1155 {
kono
parents:
diff changeset
1156 std::vector<rvalue> args(3);
kono
parents:
diff changeset
1157 args[0] = arg0;
kono
parents:
diff changeset
1158 args[1] = arg1;
kono
parents:
diff changeset
1159 args[2] = arg2;
kono
parents:
diff changeset
1160 return new_call (func, args, loc);
kono
parents:
diff changeset
1161 }
kono
parents:
diff changeset
1162 inline rvalue
kono
parents:
diff changeset
1163 context::new_call (function func,
kono
parents:
diff changeset
1164 rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
1165 rvalue arg3,
kono
parents:
diff changeset
1166 location loc)
kono
parents:
diff changeset
1167 {
kono
parents:
diff changeset
1168 std::vector<rvalue> args(4);
kono
parents:
diff changeset
1169 args[0] = arg0;
kono
parents:
diff changeset
1170 args[1] = arg1;
kono
parents:
diff changeset
1171 args[2] = arg2;
kono
parents:
diff changeset
1172 args[3] = arg3;
kono
parents:
diff changeset
1173 return new_call (func, args, loc);
kono
parents:
diff changeset
1174 }
kono
parents:
diff changeset
1175 inline rvalue
kono
parents:
diff changeset
1176 context::new_call (function func,
kono
parents:
diff changeset
1177 rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
1178 rvalue arg3, rvalue arg4,
kono
parents:
diff changeset
1179 location loc)
kono
parents:
diff changeset
1180 {
kono
parents:
diff changeset
1181 std::vector<rvalue> args(5);
kono
parents:
diff changeset
1182 args[0] = arg0;
kono
parents:
diff changeset
1183 args[1] = arg1;
kono
parents:
diff changeset
1184 args[2] = arg2;
kono
parents:
diff changeset
1185 args[3] = arg3;
kono
parents:
diff changeset
1186 args[4] = arg4;
kono
parents:
diff changeset
1187 return new_call (func, args, loc);
kono
parents:
diff changeset
1188 }
kono
parents:
diff changeset
1189 inline rvalue
kono
parents:
diff changeset
1190 context::new_call (function func,
kono
parents:
diff changeset
1191 rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
1192 rvalue arg3, rvalue arg4, rvalue arg5,
kono
parents:
diff changeset
1193 location loc)
kono
parents:
diff changeset
1194 {
kono
parents:
diff changeset
1195 std::vector<rvalue> args(6);
kono
parents:
diff changeset
1196 args[0] = arg0;
kono
parents:
diff changeset
1197 args[1] = arg1;
kono
parents:
diff changeset
1198 args[2] = arg2;
kono
parents:
diff changeset
1199 args[3] = arg3;
kono
parents:
diff changeset
1200 args[4] = arg4;
kono
parents:
diff changeset
1201 args[5] = arg5;
kono
parents:
diff changeset
1202 return new_call (func, args, loc);
kono
parents:
diff changeset
1203 }
kono
parents:
diff changeset
1204
kono
parents:
diff changeset
1205 inline rvalue
kono
parents:
diff changeset
1206 context::new_cast (rvalue expr,
kono
parents:
diff changeset
1207 type type_,
kono
parents:
diff changeset
1208 location loc)
kono
parents:
diff changeset
1209 {
kono
parents:
diff changeset
1210 return rvalue (gcc_jit_context_new_cast (m_inner_ctxt,
kono
parents:
diff changeset
1211 loc.get_inner_location (),
kono
parents:
diff changeset
1212 expr.get_inner_rvalue (),
kono
parents:
diff changeset
1213 type_.get_inner_type ()));
kono
parents:
diff changeset
1214 }
kono
parents:
diff changeset
1215
kono
parents:
diff changeset
1216 inline lvalue
kono
parents:
diff changeset
1217 context::new_array_access (rvalue ptr,
kono
parents:
diff changeset
1218 rvalue index,
kono
parents:
diff changeset
1219 location loc)
kono
parents:
diff changeset
1220 {
kono
parents:
diff changeset
1221 return lvalue (gcc_jit_context_new_array_access (m_inner_ctxt,
kono
parents:
diff changeset
1222 loc.get_inner_location (),
kono
parents:
diff changeset
1223 ptr.get_inner_rvalue (),
kono
parents:
diff changeset
1224 index.get_inner_rvalue ()));
kono
parents:
diff changeset
1225 }
kono
parents:
diff changeset
1226
kono
parents:
diff changeset
1227 inline case_
kono
parents:
diff changeset
1228 context::new_case (rvalue min_value,
kono
parents:
diff changeset
1229 rvalue max_value,
kono
parents:
diff changeset
1230 block dest_block)
kono
parents:
diff changeset
1231 {
kono
parents:
diff changeset
1232 return case_ (gcc_jit_context_new_case (m_inner_ctxt,
kono
parents:
diff changeset
1233 min_value.get_inner_rvalue (),
kono
parents:
diff changeset
1234 max_value.get_inner_rvalue (),
kono
parents:
diff changeset
1235 dest_block.get_inner_block ()));
kono
parents:
diff changeset
1236 }
kono
parents:
diff changeset
1237
kono
parents:
diff changeset
1238 // class object
kono
parents:
diff changeset
1239 inline context
kono
parents:
diff changeset
1240 object::get_context () const
kono
parents:
diff changeset
1241 {
kono
parents:
diff changeset
1242 return context (gcc_jit_object_get_context (m_inner_obj));
kono
parents:
diff changeset
1243 }
kono
parents:
diff changeset
1244
kono
parents:
diff changeset
1245 inline std::string
kono
parents:
diff changeset
1246 object::get_debug_string () const
kono
parents:
diff changeset
1247 {
kono
parents:
diff changeset
1248 return gcc_jit_object_get_debug_string (m_inner_obj);
kono
parents:
diff changeset
1249 }
kono
parents:
diff changeset
1250
kono
parents:
diff changeset
1251 inline object::object () : m_inner_obj (NULL) {}
kono
parents:
diff changeset
1252 inline object::object (gcc_jit_object *obj) : m_inner_obj (obj)
kono
parents:
diff changeset
1253 {
kono
parents:
diff changeset
1254 if (!obj)
kono
parents:
diff changeset
1255 throw error ();
kono
parents:
diff changeset
1256 }
kono
parents:
diff changeset
1257
kono
parents:
diff changeset
1258 inline gcc_jit_object *
kono
parents:
diff changeset
1259 object::get_inner_object () const
kono
parents:
diff changeset
1260 {
kono
parents:
diff changeset
1261 return m_inner_obj;
kono
parents:
diff changeset
1262 }
kono
parents:
diff changeset
1263
kono
parents:
diff changeset
1264 inline std::ostream&
kono
parents:
diff changeset
1265 operator << (std::ostream& stream, const object &obj)
kono
parents:
diff changeset
1266 {
kono
parents:
diff changeset
1267 return stream << obj.get_debug_string ();
kono
parents:
diff changeset
1268 }
kono
parents:
diff changeset
1269
kono
parents:
diff changeset
1270 // class location
kono
parents:
diff changeset
1271 inline location::location () : object () {}
kono
parents:
diff changeset
1272 inline location::location (gcc_jit_location *loc)
kono
parents:
diff changeset
1273 : object (gcc_jit_location_as_object (loc))
kono
parents:
diff changeset
1274 {}
kono
parents:
diff changeset
1275
kono
parents:
diff changeset
1276 inline gcc_jit_location *
kono
parents:
diff changeset
1277 location::get_inner_location () const
kono
parents:
diff changeset
1278 {
kono
parents:
diff changeset
1279 /* Manual downcast: */
kono
parents:
diff changeset
1280 return reinterpret_cast<gcc_jit_location *> (get_inner_object ());
kono
parents:
diff changeset
1281 }
kono
parents:
diff changeset
1282
kono
parents:
diff changeset
1283 // class field
kono
parents:
diff changeset
1284 inline field::field () : object () {}
kono
parents:
diff changeset
1285 inline field::field (gcc_jit_field *inner)
kono
parents:
diff changeset
1286 : object (gcc_jit_field_as_object (inner))
kono
parents:
diff changeset
1287 {}
kono
parents:
diff changeset
1288
kono
parents:
diff changeset
1289 inline gcc_jit_field *
kono
parents:
diff changeset
1290 field::get_inner_field () const
kono
parents:
diff changeset
1291 {
kono
parents:
diff changeset
1292 /* Manual downcast: */
kono
parents:
diff changeset
1293 return reinterpret_cast<gcc_jit_field *> (get_inner_object ());
kono
parents:
diff changeset
1294 }
kono
parents:
diff changeset
1295
kono
parents:
diff changeset
1296 // class type
kono
parents:
diff changeset
1297 inline type::type () : object () {}
kono
parents:
diff changeset
1298 inline type::type (gcc_jit_type *inner)
kono
parents:
diff changeset
1299 : object (gcc_jit_type_as_object (inner))
kono
parents:
diff changeset
1300 {}
kono
parents:
diff changeset
1301
kono
parents:
diff changeset
1302 inline gcc_jit_type *
kono
parents:
diff changeset
1303 type::get_inner_type () const
kono
parents:
diff changeset
1304 {
kono
parents:
diff changeset
1305 /* Manual downcast: */
kono
parents:
diff changeset
1306 return reinterpret_cast<gcc_jit_type *> (get_inner_object ());
kono
parents:
diff changeset
1307 }
kono
parents:
diff changeset
1308
kono
parents:
diff changeset
1309 inline type
kono
parents:
diff changeset
1310 type::get_pointer ()
kono
parents:
diff changeset
1311 {
kono
parents:
diff changeset
1312 return type (gcc_jit_type_get_pointer (get_inner_type ()));
kono
parents:
diff changeset
1313 }
kono
parents:
diff changeset
1314
kono
parents:
diff changeset
1315 inline type
kono
parents:
diff changeset
1316 type::get_const ()
kono
parents:
diff changeset
1317 {
kono
parents:
diff changeset
1318 return type (gcc_jit_type_get_const (get_inner_type ()));
kono
parents:
diff changeset
1319 }
kono
parents:
diff changeset
1320
kono
parents:
diff changeset
1321 inline type
kono
parents:
diff changeset
1322 type::get_volatile ()
kono
parents:
diff changeset
1323 {
kono
parents:
diff changeset
1324 return type (gcc_jit_type_get_volatile (get_inner_type ()));
kono
parents:
diff changeset
1325 }
kono
parents:
diff changeset
1326
kono
parents:
diff changeset
1327 inline type
kono
parents:
diff changeset
1328 type::get_aligned (size_t alignment_in_bytes)
kono
parents:
diff changeset
1329 {
kono
parents:
diff changeset
1330 return type (gcc_jit_type_get_aligned (get_inner_type (),
kono
parents:
diff changeset
1331 alignment_in_bytes));
kono
parents:
diff changeset
1332 }
kono
parents:
diff changeset
1333
kono
parents:
diff changeset
1334 inline type
kono
parents:
diff changeset
1335 type::get_vector (size_t num_units)
kono
parents:
diff changeset
1336 {
kono
parents:
diff changeset
1337 return type (gcc_jit_type_get_vector (get_inner_type (),
kono
parents:
diff changeset
1338 num_units));
kono
parents:
diff changeset
1339 }
kono
parents:
diff changeset
1340
kono
parents:
diff changeset
1341 inline rvalue
kono
parents:
diff changeset
1342 type::zero ()
kono
parents:
diff changeset
1343 {
kono
parents:
diff changeset
1344 return get_context ().new_rvalue (*this, 0);
kono
parents:
diff changeset
1345 }
kono
parents:
diff changeset
1346
kono
parents:
diff changeset
1347 inline rvalue
kono
parents:
diff changeset
1348 type::one ()
kono
parents:
diff changeset
1349 {
kono
parents:
diff changeset
1350 return get_context ().new_rvalue (*this, 1);
kono
parents:
diff changeset
1351 }
kono
parents:
diff changeset
1352
kono
parents:
diff changeset
1353 // class struct_
kono
parents:
diff changeset
1354 inline struct_::struct_ () : type (NULL) {}
kono
parents:
diff changeset
1355 inline struct_::struct_ (gcc_jit_struct *inner) :
kono
parents:
diff changeset
1356 type (gcc_jit_struct_as_type (inner))
kono
parents:
diff changeset
1357 {
kono
parents:
diff changeset
1358 }
kono
parents:
diff changeset
1359
kono
parents:
diff changeset
1360 inline gcc_jit_struct *
kono
parents:
diff changeset
1361 struct_::get_inner_struct () const
kono
parents:
diff changeset
1362 {
kono
parents:
diff changeset
1363 /* Manual downcast: */
kono
parents:
diff changeset
1364 return reinterpret_cast<gcc_jit_struct *> (get_inner_object ());
kono
parents:
diff changeset
1365 }
kono
parents:
diff changeset
1366
kono
parents:
diff changeset
1367 // class function
kono
parents:
diff changeset
1368 inline function::function () : object () {}
kono
parents:
diff changeset
1369 inline function::function (gcc_jit_function *inner)
kono
parents:
diff changeset
1370 : object (gcc_jit_function_as_object (inner))
kono
parents:
diff changeset
1371 {}
kono
parents:
diff changeset
1372
kono
parents:
diff changeset
1373 inline gcc_jit_function *
kono
parents:
diff changeset
1374 function::get_inner_function () const
kono
parents:
diff changeset
1375 {
kono
parents:
diff changeset
1376 /* Manual downcast: */
kono
parents:
diff changeset
1377 return reinterpret_cast<gcc_jit_function *> (get_inner_object ());
kono
parents:
diff changeset
1378 }
kono
parents:
diff changeset
1379
kono
parents:
diff changeset
1380 inline void
kono
parents:
diff changeset
1381 function::dump_to_dot (const std::string &path)
kono
parents:
diff changeset
1382 {
kono
parents:
diff changeset
1383 gcc_jit_function_dump_to_dot (get_inner_function (),
kono
parents:
diff changeset
1384 path.c_str ());
kono
parents:
diff changeset
1385 }
kono
parents:
diff changeset
1386
kono
parents:
diff changeset
1387 inline param
kono
parents:
diff changeset
1388 function::get_param (int index) const
kono
parents:
diff changeset
1389 {
kono
parents:
diff changeset
1390 return param (gcc_jit_function_get_param (get_inner_function (),
kono
parents:
diff changeset
1391 index));
kono
parents:
diff changeset
1392 }
kono
parents:
diff changeset
1393
kono
parents:
diff changeset
1394 inline block
kono
parents:
diff changeset
1395 function::new_block ()
kono
parents:
diff changeset
1396 {
kono
parents:
diff changeset
1397 return block (gcc_jit_function_new_block (get_inner_function (),
kono
parents:
diff changeset
1398 NULL));
kono
parents:
diff changeset
1399 }
kono
parents:
diff changeset
1400
kono
parents:
diff changeset
1401 inline block
kono
parents:
diff changeset
1402 function::new_block (const std::string &name)
kono
parents:
diff changeset
1403 {
kono
parents:
diff changeset
1404 return block (gcc_jit_function_new_block (get_inner_function (),
kono
parents:
diff changeset
1405 name.c_str ()));
kono
parents:
diff changeset
1406 }
kono
parents:
diff changeset
1407
kono
parents:
diff changeset
1408 inline lvalue
kono
parents:
diff changeset
1409 function::new_local (type type_,
kono
parents:
diff changeset
1410 const std::string &name,
kono
parents:
diff changeset
1411 location loc)
kono
parents:
diff changeset
1412 {
kono
parents:
diff changeset
1413 return lvalue (gcc_jit_function_new_local (get_inner_function (),
kono
parents:
diff changeset
1414 loc.get_inner_location (),
kono
parents:
diff changeset
1415 type_.get_inner_type (),
kono
parents:
diff changeset
1416 name.c_str ()));
kono
parents:
diff changeset
1417 }
kono
parents:
diff changeset
1418
kono
parents:
diff changeset
1419 inline rvalue
kono
parents:
diff changeset
1420 function::get_address (location loc)
kono
parents:
diff changeset
1421 {
kono
parents:
diff changeset
1422 return rvalue (gcc_jit_function_get_address (get_inner_function (),
kono
parents:
diff changeset
1423 loc.get_inner_location ()));
kono
parents:
diff changeset
1424 }
kono
parents:
diff changeset
1425
kono
parents:
diff changeset
1426 inline function
kono
parents:
diff changeset
1427 block::get_function () const
kono
parents:
diff changeset
1428 {
kono
parents:
diff changeset
1429 return function (gcc_jit_block_get_function ( get_inner_block ()));
kono
parents:
diff changeset
1430 }
kono
parents:
diff changeset
1431
kono
parents:
diff changeset
1432 inline void
kono
parents:
diff changeset
1433 block::add_eval (rvalue rvalue,
kono
parents:
diff changeset
1434 location loc)
kono
parents:
diff changeset
1435 {
kono
parents:
diff changeset
1436 gcc_jit_block_add_eval (get_inner_block (),
kono
parents:
diff changeset
1437 loc.get_inner_location (),
kono
parents:
diff changeset
1438 rvalue.get_inner_rvalue ());
kono
parents:
diff changeset
1439 }
kono
parents:
diff changeset
1440
kono
parents:
diff changeset
1441 inline void
kono
parents:
diff changeset
1442 block::add_assignment (lvalue lvalue,
kono
parents:
diff changeset
1443 rvalue rvalue,
kono
parents:
diff changeset
1444 location loc)
kono
parents:
diff changeset
1445 {
kono
parents:
diff changeset
1446 gcc_jit_block_add_assignment (get_inner_block (),
kono
parents:
diff changeset
1447 loc.get_inner_location (),
kono
parents:
diff changeset
1448 lvalue.get_inner_lvalue (),
kono
parents:
diff changeset
1449 rvalue.get_inner_rvalue ());
kono
parents:
diff changeset
1450 }
kono
parents:
diff changeset
1451
kono
parents:
diff changeset
1452 inline void
kono
parents:
diff changeset
1453 block::add_assignment_op (lvalue lvalue,
kono
parents:
diff changeset
1454 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
1455 rvalue rvalue,
kono
parents:
diff changeset
1456 location loc)
kono
parents:
diff changeset
1457 {
kono
parents:
diff changeset
1458 gcc_jit_block_add_assignment_op (get_inner_block (),
kono
parents:
diff changeset
1459 loc.get_inner_location (),
kono
parents:
diff changeset
1460 lvalue.get_inner_lvalue (),
kono
parents:
diff changeset
1461 op,
kono
parents:
diff changeset
1462 rvalue.get_inner_rvalue ());
kono
parents:
diff changeset
1463 }
kono
parents:
diff changeset
1464
kono
parents:
diff changeset
1465 inline void
kono
parents:
diff changeset
1466 block::add_comment (const std::string &text,
kono
parents:
diff changeset
1467 location loc)
kono
parents:
diff changeset
1468 {
kono
parents:
diff changeset
1469 gcc_jit_block_add_comment (get_inner_block (),
kono
parents:
diff changeset
1470 loc.get_inner_location (),
kono
parents:
diff changeset
1471 text.c_str ());
kono
parents:
diff changeset
1472 }
kono
parents:
diff changeset
1473
kono
parents:
diff changeset
1474 inline void
kono
parents:
diff changeset
1475 block::end_with_conditional (rvalue boolval,
kono
parents:
diff changeset
1476 block on_true,
kono
parents:
diff changeset
1477 block on_false,
kono
parents:
diff changeset
1478 location loc)
kono
parents:
diff changeset
1479 {
kono
parents:
diff changeset
1480 gcc_jit_block_end_with_conditional (get_inner_block (),
kono
parents:
diff changeset
1481 loc.get_inner_location (),
kono
parents:
diff changeset
1482 boolval.get_inner_rvalue (),
kono
parents:
diff changeset
1483 on_true.get_inner_block (),
kono
parents:
diff changeset
1484 on_false.get_inner_block ());
kono
parents:
diff changeset
1485 }
kono
parents:
diff changeset
1486
kono
parents:
diff changeset
1487 inline void
kono
parents:
diff changeset
1488 block::end_with_jump (block target,
kono
parents:
diff changeset
1489 location loc)
kono
parents:
diff changeset
1490 {
kono
parents:
diff changeset
1491 gcc_jit_block_end_with_jump (get_inner_block (),
kono
parents:
diff changeset
1492 loc.get_inner_location (),
kono
parents:
diff changeset
1493 target.get_inner_block ());
kono
parents:
diff changeset
1494 }
kono
parents:
diff changeset
1495
kono
parents:
diff changeset
1496 inline void
kono
parents:
diff changeset
1497 block::end_with_return (rvalue rvalue,
kono
parents:
diff changeset
1498 location loc)
kono
parents:
diff changeset
1499 {
kono
parents:
diff changeset
1500 gcc_jit_block_end_with_return (get_inner_block (),
kono
parents:
diff changeset
1501 loc.get_inner_location (),
kono
parents:
diff changeset
1502 rvalue.get_inner_rvalue ());
kono
parents:
diff changeset
1503 }
kono
parents:
diff changeset
1504
kono
parents:
diff changeset
1505 inline void
kono
parents:
diff changeset
1506 block::end_with_return (location loc)
kono
parents:
diff changeset
1507 {
kono
parents:
diff changeset
1508 gcc_jit_block_end_with_void_return (get_inner_block (),
kono
parents:
diff changeset
1509 loc.get_inner_location ());
kono
parents:
diff changeset
1510 }
kono
parents:
diff changeset
1511
kono
parents:
diff changeset
1512 inline void
kono
parents:
diff changeset
1513 block::end_with_switch (rvalue expr,
kono
parents:
diff changeset
1514 block default_block,
kono
parents:
diff changeset
1515 std::vector <case_> cases,
kono
parents:
diff changeset
1516 location loc)
kono
parents:
diff changeset
1517 {
kono
parents:
diff changeset
1518 /* Treat std::vector as an array, relying on it not being resized: */
kono
parents:
diff changeset
1519 case_ *as_array_of_wrappers = &cases[0];
kono
parents:
diff changeset
1520
kono
parents:
diff changeset
1521 /* Treat the array as being of the underlying pointers, relying on
kono
parents:
diff changeset
1522 the wrapper type being such a pointer internally. */
kono
parents:
diff changeset
1523 gcc_jit_case **as_array_of_ptrs =
kono
parents:
diff changeset
1524 reinterpret_cast<gcc_jit_case **> (as_array_of_wrappers);
kono
parents:
diff changeset
1525 gcc_jit_block_end_with_switch (get_inner_block (),
kono
parents:
diff changeset
1526 loc.get_inner_location (),
kono
parents:
diff changeset
1527 expr.get_inner_rvalue (),
kono
parents:
diff changeset
1528 default_block.get_inner_block (),
kono
parents:
diff changeset
1529 cases.size (),
kono
parents:
diff changeset
1530 as_array_of_ptrs);
kono
parents:
diff changeset
1531 }
kono
parents:
diff changeset
1532
kono
parents:
diff changeset
1533 inline rvalue
kono
parents:
diff changeset
1534 block::add_call (function other,
kono
parents:
diff changeset
1535 location loc)
kono
parents:
diff changeset
1536 {
kono
parents:
diff changeset
1537 rvalue c = get_context ().new_call (other, loc);
kono
parents:
diff changeset
1538 add_eval (c);
kono
parents:
diff changeset
1539 return c;
kono
parents:
diff changeset
1540 }
kono
parents:
diff changeset
1541 inline rvalue
kono
parents:
diff changeset
1542 block::add_call (function other,
kono
parents:
diff changeset
1543 rvalue arg0,
kono
parents:
diff changeset
1544 location loc)
kono
parents:
diff changeset
1545 {
kono
parents:
diff changeset
1546 rvalue c = get_context ().new_call (other, arg0, loc);
kono
parents:
diff changeset
1547 add_eval (c);
kono
parents:
diff changeset
1548 return c;
kono
parents:
diff changeset
1549 }
kono
parents:
diff changeset
1550 inline rvalue
kono
parents:
diff changeset
1551 block::add_call (function other,
kono
parents:
diff changeset
1552 rvalue arg0, rvalue arg1,
kono
parents:
diff changeset
1553 location loc)
kono
parents:
diff changeset
1554 {
kono
parents:
diff changeset
1555 rvalue c = get_context ().new_call (other, arg0, arg1, loc);
kono
parents:
diff changeset
1556 add_eval (c);
kono
parents:
diff changeset
1557 return c;
kono
parents:
diff changeset
1558 }
kono
parents:
diff changeset
1559 inline rvalue
kono
parents:
diff changeset
1560 block::add_call (function other,
kono
parents:
diff changeset
1561 rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
1562 location loc)
kono
parents:
diff changeset
1563 {
kono
parents:
diff changeset
1564 rvalue c = get_context ().new_call (other, arg0, arg1, arg2, loc);
kono
parents:
diff changeset
1565 add_eval (c);
kono
parents:
diff changeset
1566 return c;
kono
parents:
diff changeset
1567 }
kono
parents:
diff changeset
1568
kono
parents:
diff changeset
1569 inline rvalue
kono
parents:
diff changeset
1570 block::add_call (function other,
kono
parents:
diff changeset
1571 rvalue arg0, rvalue arg1, rvalue arg2, rvalue arg3,
kono
parents:
diff changeset
1572 location loc)
kono
parents:
diff changeset
1573 {
kono
parents:
diff changeset
1574 rvalue c = get_context ().new_call (other, arg0, arg1, arg2, arg3, loc);
kono
parents:
diff changeset
1575 add_eval (c);
kono
parents:
diff changeset
1576 return c;
kono
parents:
diff changeset
1577 }
kono
parents:
diff changeset
1578
kono
parents:
diff changeset
1579 inline rvalue
kono
parents:
diff changeset
1580 function::operator() (location loc)
kono
parents:
diff changeset
1581 {
kono
parents:
diff changeset
1582 return get_context ().new_call (*this, loc);
kono
parents:
diff changeset
1583 }
kono
parents:
diff changeset
1584 inline rvalue
kono
parents:
diff changeset
1585 function::operator() (rvalue arg0,
kono
parents:
diff changeset
1586 location loc)
kono
parents:
diff changeset
1587 {
kono
parents:
diff changeset
1588 return get_context ().new_call (*this,
kono
parents:
diff changeset
1589 arg0,
kono
parents:
diff changeset
1590 loc);
kono
parents:
diff changeset
1591 }
kono
parents:
diff changeset
1592 inline rvalue
kono
parents:
diff changeset
1593 function::operator() (rvalue arg0, rvalue arg1,
kono
parents:
diff changeset
1594 location loc)
kono
parents:
diff changeset
1595 {
kono
parents:
diff changeset
1596 return get_context ().new_call (*this,
kono
parents:
diff changeset
1597 arg0, arg1,
kono
parents:
diff changeset
1598 loc);
kono
parents:
diff changeset
1599 }
kono
parents:
diff changeset
1600 inline rvalue
kono
parents:
diff changeset
1601 function::operator() (rvalue arg0, rvalue arg1, rvalue arg2,
kono
parents:
diff changeset
1602 location loc)
kono
parents:
diff changeset
1603 {
kono
parents:
diff changeset
1604 return get_context ().new_call (*this,
kono
parents:
diff changeset
1605 arg0, arg1, arg2,
kono
parents:
diff changeset
1606 loc);
kono
parents:
diff changeset
1607 }
kono
parents:
diff changeset
1608
kono
parents:
diff changeset
1609 // class block
kono
parents:
diff changeset
1610 inline block::block () : object () {}
kono
parents:
diff changeset
1611 inline block::block (gcc_jit_block *inner)
kono
parents:
diff changeset
1612 : object (gcc_jit_block_as_object (inner))
kono
parents:
diff changeset
1613 {}
kono
parents:
diff changeset
1614
kono
parents:
diff changeset
1615 inline gcc_jit_block *
kono
parents:
diff changeset
1616 block::get_inner_block () const
kono
parents:
diff changeset
1617 {
kono
parents:
diff changeset
1618 /* Manual downcast: */
kono
parents:
diff changeset
1619 return reinterpret_cast<gcc_jit_block *> (get_inner_object ());
kono
parents:
diff changeset
1620 }
kono
parents:
diff changeset
1621
kono
parents:
diff changeset
1622 // class rvalue
kono
parents:
diff changeset
1623 inline rvalue::rvalue () : object () {}
kono
parents:
diff changeset
1624 inline rvalue::rvalue (gcc_jit_rvalue *inner)
kono
parents:
diff changeset
1625 : object (gcc_jit_rvalue_as_object (inner))
kono
parents:
diff changeset
1626 {}
kono
parents:
diff changeset
1627
kono
parents:
diff changeset
1628 inline gcc_jit_rvalue *
kono
parents:
diff changeset
1629 rvalue::get_inner_rvalue () const
kono
parents:
diff changeset
1630 {
kono
parents:
diff changeset
1631 /* Manual downcast: */
kono
parents:
diff changeset
1632 return reinterpret_cast<gcc_jit_rvalue *> (get_inner_object ());
kono
parents:
diff changeset
1633 }
kono
parents:
diff changeset
1634
kono
parents:
diff changeset
1635 inline type
kono
parents:
diff changeset
1636 rvalue::get_type ()
kono
parents:
diff changeset
1637 {
kono
parents:
diff changeset
1638 return type (gcc_jit_rvalue_get_type (get_inner_rvalue ()));
kono
parents:
diff changeset
1639 }
kono
parents:
diff changeset
1640
kono
parents:
diff changeset
1641 inline rvalue
kono
parents:
diff changeset
1642 rvalue::access_field (field field,
kono
parents:
diff changeset
1643 location loc)
kono
parents:
diff changeset
1644 {
kono
parents:
diff changeset
1645 return rvalue (gcc_jit_rvalue_access_field (get_inner_rvalue (),
kono
parents:
diff changeset
1646 loc.get_inner_location (),
kono
parents:
diff changeset
1647 field.get_inner_field ()));
kono
parents:
diff changeset
1648 }
kono
parents:
diff changeset
1649
kono
parents:
diff changeset
1650 inline lvalue
kono
parents:
diff changeset
1651 rvalue::dereference_field (field field,
kono
parents:
diff changeset
1652 location loc)
kono
parents:
diff changeset
1653 {
kono
parents:
diff changeset
1654 return lvalue (gcc_jit_rvalue_dereference_field (get_inner_rvalue (),
kono
parents:
diff changeset
1655 loc.get_inner_location (),
kono
parents:
diff changeset
1656 field.get_inner_field ()));
kono
parents:
diff changeset
1657 }
kono
parents:
diff changeset
1658
kono
parents:
diff changeset
1659 inline lvalue
kono
parents:
diff changeset
1660 rvalue::dereference (location loc)
kono
parents:
diff changeset
1661 {
kono
parents:
diff changeset
1662 return lvalue (gcc_jit_rvalue_dereference (get_inner_rvalue (),
kono
parents:
diff changeset
1663 loc.get_inner_location ()));
kono
parents:
diff changeset
1664 }
kono
parents:
diff changeset
1665
kono
parents:
diff changeset
1666 inline rvalue
kono
parents:
diff changeset
1667 rvalue::cast_to (type type_,
kono
parents:
diff changeset
1668 location loc)
kono
parents:
diff changeset
1669 {
kono
parents:
diff changeset
1670 return get_context ().new_cast (*this, type_, loc);
kono
parents:
diff changeset
1671 }
kono
parents:
diff changeset
1672
kono
parents:
diff changeset
1673 inline lvalue
kono
parents:
diff changeset
1674 rvalue::operator[] (rvalue index)
kono
parents:
diff changeset
1675 {
kono
parents:
diff changeset
1676 return get_context ().new_array_access (*this, index);
kono
parents:
diff changeset
1677 }
kono
parents:
diff changeset
1678
kono
parents:
diff changeset
1679 inline lvalue
kono
parents:
diff changeset
1680 rvalue::operator[] (int index)
kono
parents:
diff changeset
1681 {
kono
parents:
diff changeset
1682 context ctxt = get_context ();
kono
parents:
diff changeset
1683 type int_t = ctxt.get_int_type <int> ();
kono
parents:
diff changeset
1684 return ctxt.new_array_access (*this,
kono
parents:
diff changeset
1685 ctxt.new_rvalue (int_t,
kono
parents:
diff changeset
1686 index));
kono
parents:
diff changeset
1687 }
kono
parents:
diff changeset
1688
kono
parents:
diff changeset
1689 // class lvalue : public rvalue
kono
parents:
diff changeset
1690 inline lvalue::lvalue () : rvalue () {}
kono
parents:
diff changeset
1691 inline lvalue::lvalue (gcc_jit_lvalue *inner)
kono
parents:
diff changeset
1692 : rvalue (gcc_jit_lvalue_as_rvalue (inner))
kono
parents:
diff changeset
1693 {}
kono
parents:
diff changeset
1694
kono
parents:
diff changeset
1695 inline gcc_jit_lvalue *
kono
parents:
diff changeset
1696 lvalue::get_inner_lvalue () const
kono
parents:
diff changeset
1697 {
kono
parents:
diff changeset
1698 /* Manual downcast: */
kono
parents:
diff changeset
1699 return reinterpret_cast<gcc_jit_lvalue *> (get_inner_object ());
kono
parents:
diff changeset
1700 }
kono
parents:
diff changeset
1701
kono
parents:
diff changeset
1702 inline lvalue
kono
parents:
diff changeset
1703 lvalue::access_field (field field, location loc)
kono
parents:
diff changeset
1704 {
kono
parents:
diff changeset
1705 return lvalue (gcc_jit_lvalue_access_field (get_inner_lvalue (),
kono
parents:
diff changeset
1706 loc.get_inner_location (),
kono
parents:
diff changeset
1707 field.get_inner_field ()));
kono
parents:
diff changeset
1708 }
kono
parents:
diff changeset
1709
kono
parents:
diff changeset
1710 inline rvalue
kono
parents:
diff changeset
1711 lvalue::get_address (location loc)
kono
parents:
diff changeset
1712 {
kono
parents:
diff changeset
1713 return rvalue (gcc_jit_lvalue_get_address (get_inner_lvalue (),
kono
parents:
diff changeset
1714 loc.get_inner_location ()));
kono
parents:
diff changeset
1715 }
kono
parents:
diff changeset
1716
kono
parents:
diff changeset
1717 // class param : public lvalue
kono
parents:
diff changeset
1718 inline param::param () : lvalue () {}
kono
parents:
diff changeset
1719 inline param::param (gcc_jit_param *inner)
kono
parents:
diff changeset
1720 : lvalue (gcc_jit_param_as_lvalue (inner))
kono
parents:
diff changeset
1721 {}
kono
parents:
diff changeset
1722
kono
parents:
diff changeset
1723 // class case_ : public object
kono
parents:
diff changeset
1724 inline case_::case_ () : object () {}
kono
parents:
diff changeset
1725 inline case_::case_ (gcc_jit_case *inner)
kono
parents:
diff changeset
1726 : object (gcc_jit_case_as_object (inner))
kono
parents:
diff changeset
1727 {
kono
parents:
diff changeset
1728 }
kono
parents:
diff changeset
1729
kono
parents:
diff changeset
1730 inline gcc_jit_case *
kono
parents:
diff changeset
1731 case_::get_inner_case () const
kono
parents:
diff changeset
1732 {
kono
parents:
diff changeset
1733 /* Manual downcast: */
kono
parents:
diff changeset
1734 return reinterpret_cast<gcc_jit_case *> (get_inner_object ());
kono
parents:
diff changeset
1735 }
kono
parents:
diff changeset
1736
kono
parents:
diff changeset
1737 /* Overloaded operators. */
kono
parents:
diff changeset
1738 // Unary operators
kono
parents:
diff changeset
1739 inline rvalue operator- (rvalue a)
kono
parents:
diff changeset
1740 {
kono
parents:
diff changeset
1741 return a.get_context ().new_minus (a.get_type (), a);
kono
parents:
diff changeset
1742 }
kono
parents:
diff changeset
1743 inline rvalue operator~ (rvalue a)
kono
parents:
diff changeset
1744 {
kono
parents:
diff changeset
1745 return a.get_context ().new_bitwise_negate (a.get_type (), a);
kono
parents:
diff changeset
1746 }
kono
parents:
diff changeset
1747 inline rvalue operator! (rvalue a)
kono
parents:
diff changeset
1748 {
kono
parents:
diff changeset
1749 return a.get_context ().new_logical_negate (a.get_type (), a);
kono
parents:
diff changeset
1750 }
kono
parents:
diff changeset
1751
kono
parents:
diff changeset
1752 // Binary operators
kono
parents:
diff changeset
1753 inline rvalue operator+ (rvalue a, rvalue b)
kono
parents:
diff changeset
1754 {
kono
parents:
diff changeset
1755 return a.get_context ().new_plus (a.get_type (), a, b);
kono
parents:
diff changeset
1756 }
kono
parents:
diff changeset
1757 inline rvalue operator- (rvalue a, rvalue b)
kono
parents:
diff changeset
1758 {
kono
parents:
diff changeset
1759 return a.get_context ().new_minus (a.get_type (), a, b);
kono
parents:
diff changeset
1760 }
kono
parents:
diff changeset
1761 inline rvalue operator* (rvalue a, rvalue b)
kono
parents:
diff changeset
1762 {
kono
parents:
diff changeset
1763 return a.get_context ().new_mult (a.get_type (), a, b);
kono
parents:
diff changeset
1764 }
kono
parents:
diff changeset
1765 inline rvalue operator/ (rvalue a, rvalue b)
kono
parents:
diff changeset
1766 {
kono
parents:
diff changeset
1767 return a.get_context ().new_divide (a.get_type (), a, b);
kono
parents:
diff changeset
1768 }
kono
parents:
diff changeset
1769 inline rvalue operator% (rvalue a, rvalue b)
kono
parents:
diff changeset
1770 {
kono
parents:
diff changeset
1771 return a.get_context ().new_modulo (a.get_type (), a, b);
kono
parents:
diff changeset
1772 }
kono
parents:
diff changeset
1773 inline rvalue operator& (rvalue a, rvalue b)
kono
parents:
diff changeset
1774 {
kono
parents:
diff changeset
1775 return a.get_context ().new_bitwise_and (a.get_type (), a, b);
kono
parents:
diff changeset
1776 }
kono
parents:
diff changeset
1777 inline rvalue operator^ (rvalue a, rvalue b)
kono
parents:
diff changeset
1778 {
kono
parents:
diff changeset
1779 return a.get_context ().new_bitwise_xor (a.get_type (), a, b);
kono
parents:
diff changeset
1780 }
kono
parents:
diff changeset
1781 inline rvalue operator| (rvalue a, rvalue b)
kono
parents:
diff changeset
1782 {
kono
parents:
diff changeset
1783 return a.get_context ().new_bitwise_or (a.get_type (), a, b);
kono
parents:
diff changeset
1784 }
kono
parents:
diff changeset
1785 inline rvalue operator&& (rvalue a, rvalue b)
kono
parents:
diff changeset
1786 {
kono
parents:
diff changeset
1787 return a.get_context ().new_logical_and (a.get_type (), a, b);
kono
parents:
diff changeset
1788 }
kono
parents:
diff changeset
1789 inline rvalue operator|| (rvalue a, rvalue b)
kono
parents:
diff changeset
1790 {
kono
parents:
diff changeset
1791 return a.get_context ().new_logical_or (a.get_type (), a, b);
kono
parents:
diff changeset
1792 }
kono
parents:
diff changeset
1793
kono
parents:
diff changeset
1794 /* Comparisons. */
kono
parents:
diff changeset
1795 inline rvalue operator== (rvalue a, rvalue b)
kono
parents:
diff changeset
1796 {
kono
parents:
diff changeset
1797 return a.get_context ().new_eq (a, b);
kono
parents:
diff changeset
1798 }
kono
parents:
diff changeset
1799 inline rvalue operator!= (rvalue a, rvalue b)
kono
parents:
diff changeset
1800 {
kono
parents:
diff changeset
1801 return a.get_context ().new_ne (a, b);
kono
parents:
diff changeset
1802 }
kono
parents:
diff changeset
1803 inline rvalue operator< (rvalue a, rvalue b)
kono
parents:
diff changeset
1804 {
kono
parents:
diff changeset
1805 return a.get_context ().new_lt (a, b);
kono
parents:
diff changeset
1806 }
kono
parents:
diff changeset
1807 inline rvalue operator<= (rvalue a, rvalue b)
kono
parents:
diff changeset
1808 {
kono
parents:
diff changeset
1809 return a.get_context ().new_le (a, b);
kono
parents:
diff changeset
1810 }
kono
parents:
diff changeset
1811 inline rvalue operator> (rvalue a, rvalue b)
kono
parents:
diff changeset
1812 {
kono
parents:
diff changeset
1813 return a.get_context ().new_gt (a, b);
kono
parents:
diff changeset
1814 }
kono
parents:
diff changeset
1815 inline rvalue operator>= (rvalue a, rvalue b)
kono
parents:
diff changeset
1816 {
kono
parents:
diff changeset
1817 return a.get_context ().new_ge (a, b);
kono
parents:
diff changeset
1818 }
kono
parents:
diff changeset
1819
kono
parents:
diff changeset
1820 /* Dereferencing. */
kono
parents:
diff changeset
1821 inline lvalue operator* (rvalue ptr)
kono
parents:
diff changeset
1822 {
kono
parents:
diff changeset
1823 return ptr.dereference ();
kono
parents:
diff changeset
1824 }
kono
parents:
diff changeset
1825
kono
parents:
diff changeset
1826 // class timer
kono
parents:
diff changeset
1827 inline
kono
parents:
diff changeset
1828 timer::timer ()
kono
parents:
diff changeset
1829 {
kono
parents:
diff changeset
1830 m_inner_timer = gcc_jit_timer_new ();
kono
parents:
diff changeset
1831 }
kono
parents:
diff changeset
1832
kono
parents:
diff changeset
1833 inline
kono
parents:
diff changeset
1834 timer::timer (gcc_jit_timer *inner_timer)
kono
parents:
diff changeset
1835 {
kono
parents:
diff changeset
1836 m_inner_timer = inner_timer;
kono
parents:
diff changeset
1837 }
kono
parents:
diff changeset
1838
kono
parents:
diff changeset
1839 inline void
kono
parents:
diff changeset
1840 timer::push (const char *item_name)
kono
parents:
diff changeset
1841 {
kono
parents:
diff changeset
1842 gcc_jit_timer_push (m_inner_timer, item_name);
kono
parents:
diff changeset
1843
kono
parents:
diff changeset
1844 }
kono
parents:
diff changeset
1845
kono
parents:
diff changeset
1846 inline void
kono
parents:
diff changeset
1847 timer::pop (const char *item_name)
kono
parents:
diff changeset
1848 {
kono
parents:
diff changeset
1849 gcc_jit_timer_pop (m_inner_timer, item_name);
kono
parents:
diff changeset
1850 }
kono
parents:
diff changeset
1851
kono
parents:
diff changeset
1852 inline void
kono
parents:
diff changeset
1853 timer::print (FILE *f_out) const
kono
parents:
diff changeset
1854 {
kono
parents:
diff changeset
1855 gcc_jit_timer_print (m_inner_timer, f_out);
kono
parents:
diff changeset
1856 }
kono
parents:
diff changeset
1857
kono
parents:
diff changeset
1858 inline gcc_jit_timer *
kono
parents:
diff changeset
1859 timer::get_inner_timer () const
kono
parents:
diff changeset
1860 {
kono
parents:
diff changeset
1861 return m_inner_timer;
kono
parents:
diff changeset
1862 }
kono
parents:
diff changeset
1863
kono
parents:
diff changeset
1864 inline void
kono
parents:
diff changeset
1865 timer::release ()
kono
parents:
diff changeset
1866 {
kono
parents:
diff changeset
1867 gcc_jit_timer_release (m_inner_timer);
kono
parents:
diff changeset
1868 m_inner_timer = NULL;
kono
parents:
diff changeset
1869 }
kono
parents:
diff changeset
1870
kono
parents:
diff changeset
1871 // class auto_time
kono
parents:
diff changeset
1872
kono
parents:
diff changeset
1873 inline
kono
parents:
diff changeset
1874 auto_time::auto_time (timer t, const char *item_name)
kono
parents:
diff changeset
1875 : m_timer (t),
kono
parents:
diff changeset
1876 m_item_name (item_name)
kono
parents:
diff changeset
1877 {
kono
parents:
diff changeset
1878 t.push (item_name);
kono
parents:
diff changeset
1879 }
kono
parents:
diff changeset
1880
kono
parents:
diff changeset
1881 inline
kono
parents:
diff changeset
1882 auto_time::auto_time (context ctxt, const char *item_name)
kono
parents:
diff changeset
1883 : m_timer (ctxt.get_timer ()),
kono
parents:
diff changeset
1884 m_item_name (item_name)
kono
parents:
diff changeset
1885 {
kono
parents:
diff changeset
1886 m_timer.push (item_name);
kono
parents:
diff changeset
1887 }
kono
parents:
diff changeset
1888
kono
parents:
diff changeset
1889 inline
kono
parents:
diff changeset
1890 auto_time::~auto_time ()
kono
parents:
diff changeset
1891 {
kono
parents:
diff changeset
1892 m_timer.pop (m_item_name);
kono
parents:
diff changeset
1893 }
kono
parents:
diff changeset
1894
kono
parents:
diff changeset
1895 } // namespace gccjit
kono
parents:
diff changeset
1896
kono
parents:
diff changeset
1897 #endif /* #ifndef LIBGCCJIT_PLUS_PLUS_H */