annotate gcc/jit/jit-recording.h @ 136:4627f235cf2a

fix c-next example
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 08 Nov 2018 14:11:56 +0900
parents 84e7813d76e9
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Internals of libgccjit: classes for recording calls made to the JIT API.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2013-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
8 under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
10 any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but
kono
parents:
diff changeset
13 WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
kono
parents:
diff changeset
15 General Public License for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 #ifndef JIT_RECORDING_H
kono
parents:
diff changeset
22 #define JIT_RECORDING_H
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 #include "jit-common.h"
kono
parents:
diff changeset
25 #include "jit-logging.h"
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 class timer;
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 namespace gcc {
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 namespace jit {
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 class result;
kono
parents:
diff changeset
34 class dump;
kono
parents:
diff changeset
35 class reproducer;
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 /**********************************************************************
kono
parents:
diff changeset
38 Recording.
kono
parents:
diff changeset
39 **********************************************************************/
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 namespace recording {
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 playback::location *
kono
parents:
diff changeset
44 playback_location (replayer *r, location *loc);
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 const char *
kono
parents:
diff changeset
47 playback_string (string *str);
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 playback::block *
kono
parents:
diff changeset
50 playback_block (block *b);
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 /* A recording of a call to gcc_jit_context_enable_dump. */
kono
parents:
diff changeset
53 struct requested_dump
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 const char *m_dumpname;
kono
parents:
diff changeset
56 char **m_out_ptr;
kono
parents:
diff changeset
57 };
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 /* A JIT-compilation context. */
kono
parents:
diff changeset
60 class context : public log_user
kono
parents:
diff changeset
61 {
kono
parents:
diff changeset
62 public:
kono
parents:
diff changeset
63 context (context *parent_ctxt);
kono
parents:
diff changeset
64 ~context ();
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 builtins_manager *
kono
parents:
diff changeset
67 get_builtins_manager ();
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 void record (memento *m);
kono
parents:
diff changeset
70 void replay_into (replayer *r);
kono
parents:
diff changeset
71 void disassociate_from_playback ();
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 string *
kono
parents:
diff changeset
74 new_string (const char *text);
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 location *
kono
parents:
diff changeset
77 new_location (const char *filename,
kono
parents:
diff changeset
78 int line,
kono
parents:
diff changeset
79 int column,
kono
parents:
diff changeset
80 bool created_by_user);
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 type *
kono
parents:
diff changeset
83 get_type (enum gcc_jit_types type);
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 type *
kono
parents:
diff changeset
86 get_int_type (int num_bytes, int is_signed);
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 type *
kono
parents:
diff changeset
89 new_array_type (location *loc,
kono
parents:
diff changeset
90 type *element_type,
kono
parents:
diff changeset
91 int num_elements);
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 field *
kono
parents:
diff changeset
94 new_field (location *loc,
kono
parents:
diff changeset
95 type *type,
kono
parents:
diff changeset
96 const char *name);
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 struct_ *
kono
parents:
diff changeset
99 new_struct_type (location *loc,
kono
parents:
diff changeset
100 const char *name);
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 union_ *
kono
parents:
diff changeset
103 new_union_type (location *loc,
kono
parents:
diff changeset
104 const char *name);
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 function_type *
kono
parents:
diff changeset
107 new_function_type (type *return_type,
kono
parents:
diff changeset
108 int num_params,
kono
parents:
diff changeset
109 type **param_types,
kono
parents:
diff changeset
110 int is_variadic);
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 type *
kono
parents:
diff changeset
113 new_function_ptr_type (location *loc,
kono
parents:
diff changeset
114 type *return_type,
kono
parents:
diff changeset
115 int num_params,
kono
parents:
diff changeset
116 type **param_types,
kono
parents:
diff changeset
117 int is_variadic);
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 param *
kono
parents:
diff changeset
120 new_param (location *loc,
kono
parents:
diff changeset
121 type *type,
kono
parents:
diff changeset
122 const char *name);
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 function *
kono
parents:
diff changeset
125 new_function (location *loc,
kono
parents:
diff changeset
126 enum gcc_jit_function_kind kind,
kono
parents:
diff changeset
127 type *return_type,
kono
parents:
diff changeset
128 const char *name,
kono
parents:
diff changeset
129 int num_params,
kono
parents:
diff changeset
130 param **params,
kono
parents:
diff changeset
131 int is_variadic,
kono
parents:
diff changeset
132 enum built_in_function builtin_id);
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 function *
kono
parents:
diff changeset
135 get_builtin_function (const char *name);
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 lvalue *
kono
parents:
diff changeset
138 new_global (location *loc,
kono
parents:
diff changeset
139 enum gcc_jit_global_kind kind,
kono
parents:
diff changeset
140 type *type,
kono
parents:
diff changeset
141 const char *name);
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 template <typename HOST_TYPE>
kono
parents:
diff changeset
144 rvalue *
kono
parents:
diff changeset
145 new_rvalue_from_const (type *type,
kono
parents:
diff changeset
146 HOST_TYPE value);
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 rvalue *
kono
parents:
diff changeset
149 new_string_literal (const char *value);
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 rvalue *
kono
parents:
diff changeset
152 new_rvalue_from_vector (location *loc,
kono
parents:
diff changeset
153 vector_type *type,
kono
parents:
diff changeset
154 rvalue **elements);
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 rvalue *
kono
parents:
diff changeset
157 new_unary_op (location *loc,
kono
parents:
diff changeset
158 enum gcc_jit_unary_op op,
kono
parents:
diff changeset
159 type *result_type,
kono
parents:
diff changeset
160 rvalue *a);
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 rvalue *
kono
parents:
diff changeset
163 new_binary_op (location *loc,
kono
parents:
diff changeset
164 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
165 type *result_type,
kono
parents:
diff changeset
166 rvalue *a, rvalue *b);
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 rvalue *
kono
parents:
diff changeset
169 new_comparison (location *loc,
kono
parents:
diff changeset
170 enum gcc_jit_comparison op,
kono
parents:
diff changeset
171 rvalue *a, rvalue *b);
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 rvalue *
kono
parents:
diff changeset
174 new_call (location *loc,
kono
parents:
diff changeset
175 function *func,
kono
parents:
diff changeset
176 int numargs, rvalue **args);
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 rvalue *
kono
parents:
diff changeset
179 new_call_through_ptr (location *loc,
kono
parents:
diff changeset
180 rvalue *fn_ptr,
kono
parents:
diff changeset
181 int numargs, rvalue **args);
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 rvalue *
kono
parents:
diff changeset
184 new_cast (location *loc,
kono
parents:
diff changeset
185 rvalue *expr,
kono
parents:
diff changeset
186 type *type_);
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 lvalue *
kono
parents:
diff changeset
189 new_array_access (location *loc,
kono
parents:
diff changeset
190 rvalue *ptr,
kono
parents:
diff changeset
191 rvalue *index);
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 case_ *
kono
parents:
diff changeset
194 new_case (rvalue *min_value,
kono
parents:
diff changeset
195 rvalue *max_value,
kono
parents:
diff changeset
196 block *block);
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 void
kono
parents:
diff changeset
199 set_str_option (enum gcc_jit_str_option opt,
kono
parents:
diff changeset
200 const char *value);
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 void
kono
parents:
diff changeset
203 set_int_option (enum gcc_jit_int_option opt,
kono
parents:
diff changeset
204 int value);
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 void
kono
parents:
diff changeset
207 set_bool_option (enum gcc_jit_bool_option opt,
kono
parents:
diff changeset
208 int value);
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 void
kono
parents:
diff changeset
211 set_inner_bool_option (enum inner_bool_option inner_opt,
kono
parents:
diff changeset
212 int value);
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 void
kono
parents:
diff changeset
215 add_command_line_option (const char *optname);
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 void
kono
parents:
diff changeset
218 append_command_line_options (vec <char *> *argvec);
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 void
kono
parents:
diff changeset
221 enable_dump (const char *dumpname,
kono
parents:
diff changeset
222 char **out_ptr);
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 const char *
kono
parents:
diff changeset
225 get_str_option (enum gcc_jit_str_option opt) const
kono
parents:
diff changeset
226 {
kono
parents:
diff changeset
227 return m_str_options[opt];
kono
parents:
diff changeset
228 }
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 int
kono
parents:
diff changeset
231 get_int_option (enum gcc_jit_int_option opt) const
kono
parents:
diff changeset
232 {
kono
parents:
diff changeset
233 return m_int_options[opt];
kono
parents:
diff changeset
234 }
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 int
kono
parents:
diff changeset
237 get_bool_option (enum gcc_jit_bool_option opt) const
kono
parents:
diff changeset
238 {
kono
parents:
diff changeset
239 return m_bool_options[opt];
kono
parents:
diff changeset
240 }
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 int
kono
parents:
diff changeset
243 get_inner_bool_option (enum inner_bool_option opt) const
kono
parents:
diff changeset
244 {
kono
parents:
diff changeset
245 return m_inner_bool_options[opt];
kono
parents:
diff changeset
246 }
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 result *
kono
parents:
diff changeset
249 compile ();
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 void
kono
parents:
diff changeset
252 compile_to_file (enum gcc_jit_output_kind output_kind,
kono
parents:
diff changeset
253 const char *output_path);
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 void
kono
parents:
diff changeset
256 add_error (location *loc, const char *fmt, ...)
kono
parents:
diff changeset
257 GNU_PRINTF(3, 4);
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 void
kono
parents:
diff changeset
260 add_error_va (location *loc, const char *fmt, va_list ap)
kono
parents:
diff changeset
261 GNU_PRINTF(3, 0);
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 const char *
kono
parents:
diff changeset
264 get_first_error () const;
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 const char *
kono
parents:
diff changeset
267 get_last_error () const;
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 bool errors_occurred () const
kono
parents:
diff changeset
270 {
kono
parents:
diff changeset
271 if (m_parent_ctxt)
kono
parents:
diff changeset
272 if (m_parent_ctxt->errors_occurred ())
kono
parents:
diff changeset
273 return true;
kono
parents:
diff changeset
274 return m_error_count;
kono
parents:
diff changeset
275 }
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 type *get_opaque_FILE_type ();
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 void dump_to_file (const char *path, bool update_locations);
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 void dump_reproducer_to_file (const char *path);
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 void
kono
parents:
diff changeset
284 get_all_requested_dumps (vec <recording::requested_dump> *out);
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 void set_timer (timer *t) { m_timer = t; }
kono
parents:
diff changeset
287 timer *get_timer () const { return m_timer; }
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 private:
kono
parents:
diff changeset
290 void log_all_options () const;
kono
parents:
diff changeset
291 void log_str_option (enum gcc_jit_str_option opt) const;
kono
parents:
diff changeset
292 void log_int_option (enum gcc_jit_int_option opt) const;
kono
parents:
diff changeset
293 void log_bool_option (enum gcc_jit_bool_option opt) const;
kono
parents:
diff changeset
294 void log_inner_bool_option (enum inner_bool_option opt) const;
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 void validate ();
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 private:
kono
parents:
diff changeset
299 context *m_parent_ctxt;
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 /* The ultimate ancestor of the contexts within a family tree of
kono
parents:
diff changeset
302 contexts. This has itself as its own m_toplevel_ctxt. */
kono
parents:
diff changeset
303 context *m_toplevel_ctxt;
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 timer *m_timer;
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 int m_error_count;
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 char *m_first_error_str;
kono
parents:
diff changeset
310 bool m_owns_first_error_str;
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 char *m_last_error_str;
kono
parents:
diff changeset
313 bool m_owns_last_error_str;
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 char *m_str_options[GCC_JIT_NUM_STR_OPTIONS];
kono
parents:
diff changeset
316 int m_int_options[GCC_JIT_NUM_INT_OPTIONS];
kono
parents:
diff changeset
317 bool m_bool_options[GCC_JIT_NUM_BOOL_OPTIONS];
kono
parents:
diff changeset
318 bool m_inner_bool_options[NUM_INNER_BOOL_OPTIONS];
kono
parents:
diff changeset
319 auto_vec <char *> m_command_line_options;
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 /* Dumpfiles that were requested via gcc_jit_context_enable_dump. */
kono
parents:
diff changeset
322 auto_vec<requested_dump> m_requested_dumps;
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 /* Recorded API usage. */
kono
parents:
diff changeset
325 auto_vec<memento *> m_mementos;
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 /* Specific recordings, for use by dump_to_file. */
kono
parents:
diff changeset
328 auto_vec<compound_type *> m_compound_types;
kono
parents:
diff changeset
329 auto_vec<global *> m_globals;
kono
parents:
diff changeset
330 auto_vec<function *> m_functions;
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 type *m_basic_types[NUM_GCC_JIT_TYPES];
kono
parents:
diff changeset
333 type *m_FILE_type;
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 builtins_manager *m_builtins_manager; // lazily created
kono
parents:
diff changeset
336 };
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 /* An object with lifetime managed by the context i.e.
kono
parents:
diff changeset
340 it lives until the context is released, at which
kono
parents:
diff changeset
341 point it itself is cleaned up. */
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 class memento
kono
parents:
diff changeset
344 {
kono
parents:
diff changeset
345 public:
kono
parents:
diff changeset
346 virtual ~memento () {}
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 /* Hook for replaying this. */
kono
parents:
diff changeset
349 virtual void replay_into (replayer *r) = 0;
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 void set_playback_obj (void *obj) { m_playback_obj = obj; }
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 /* Get the context that owns this object.
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 Implements the post-error-checking part of
kono
parents:
diff changeset
357 gcc_jit_object_get_context. */
kono
parents:
diff changeset
358 context *get_context () { return m_ctxt; }
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 memento *
kono
parents:
diff changeset
361 as_object () { return this; }
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 /* Debugging hook, for use in generating error messages etc.
kono
parents:
diff changeset
364 Implements the post-error-checking part of
kono
parents:
diff changeset
365 gcc_jit_object_get_debug_string. */
kono
parents:
diff changeset
366 const char *
kono
parents:
diff changeset
367 get_debug_string ();
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 virtual void write_to_dump (dump &d);
kono
parents:
diff changeset
370 virtual void write_reproducer (reproducer &r) = 0;
kono
parents:
diff changeset
371 virtual location *dyn_cast_location () { return NULL; }
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 protected:
kono
parents:
diff changeset
374 memento (context *ctxt)
kono
parents:
diff changeset
375 : m_ctxt (ctxt),
kono
parents:
diff changeset
376 m_playback_obj (NULL),
kono
parents:
diff changeset
377 m_debug_string (NULL)
kono
parents:
diff changeset
378 {
kono
parents:
diff changeset
379 gcc_assert (ctxt);
kono
parents:
diff changeset
380 }
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 string *new_string (const char *text) { return m_ctxt->new_string (text); }
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 private:
kono
parents:
diff changeset
385 virtual string * make_debug_string () = 0;
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 public:
kono
parents:
diff changeset
388 context *m_ctxt;
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 protected:
kono
parents:
diff changeset
391 void *m_playback_obj;
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 private:
kono
parents:
diff changeset
394 string *m_debug_string;
kono
parents:
diff changeset
395 };
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 /* or just use std::string? */
kono
parents:
diff changeset
398 class string : public memento
kono
parents:
diff changeset
399 {
kono
parents:
diff changeset
400 public:
kono
parents:
diff changeset
401 string (context *ctxt, const char *text);
kono
parents:
diff changeset
402 ~string ();
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 const char *c_str () { return m_buffer; }
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 static string * from_printf (context *ctxt, const char *fmt, ...)
kono
parents:
diff changeset
407 GNU_PRINTF(2, 3);
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 void replay_into (replayer *) FINAL OVERRIDE {}
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 private:
kono
parents:
diff changeset
412 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
413 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
414
kono
parents:
diff changeset
415 private:
kono
parents:
diff changeset
416 size_t m_len;
kono
parents:
diff changeset
417 char *m_buffer;
kono
parents:
diff changeset
418 };
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 class location : public memento
kono
parents:
diff changeset
421 {
kono
parents:
diff changeset
422 public:
kono
parents:
diff changeset
423 location (context *ctxt, string *filename, int line, int column,
kono
parents:
diff changeset
424 bool created_by_user)
kono
parents:
diff changeset
425 : memento (ctxt),
kono
parents:
diff changeset
426 m_filename (filename),
kono
parents:
diff changeset
427 m_line (line),
kono
parents:
diff changeset
428 m_column (column),
kono
parents:
diff changeset
429 m_created_by_user (created_by_user)
kono
parents:
diff changeset
430 {}
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 playback::location *
kono
parents:
diff changeset
435 playback_location (replayer *r)
kono
parents:
diff changeset
436 {
kono
parents:
diff changeset
437 /* Normally during playback, we can walk forwards through the list of
kono
parents:
diff changeset
438 recording objects, playing them back. The ordering of recording
kono
parents:
diff changeset
439 ensures that everything that a recording object refers to has
kono
parents:
diff changeset
440 already been played back, so we can simply look up the relevant
kono
parents:
diff changeset
441 m_playback_obj.
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 Locations are an exception, due to the "write_to_dump" method of
kono
parents:
diff changeset
444 recording::statement. This method can set a new location on a
kono
parents:
diff changeset
445 statement after the statement is created, and thus the location
kono
parents:
diff changeset
446 appears in the context's memento list *after* the statement that
kono
parents:
diff changeset
447 refers to it.
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 In such circumstances, the statement is replayed *before* the location,
kono
parents:
diff changeset
450 when the latter doesn't yet have a playback object.
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 Hence we need to ensure that locations have playback objects. */
kono
parents:
diff changeset
453 if (!m_playback_obj)
kono
parents:
diff changeset
454 {
kono
parents:
diff changeset
455 replay_into (r);
kono
parents:
diff changeset
456 }
kono
parents:
diff changeset
457 gcc_assert (m_playback_obj);
kono
parents:
diff changeset
458 return static_cast <playback::location *> (m_playback_obj);
kono
parents:
diff changeset
459 }
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 location *dyn_cast_location () FINAL OVERRIDE { return this; }
kono
parents:
diff changeset
462 bool created_by_user () const { return m_created_by_user; }
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 private:
kono
parents:
diff changeset
465 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
466 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 private:
kono
parents:
diff changeset
469 string *m_filename;
kono
parents:
diff changeset
470 int m_line;
kono
parents:
diff changeset
471 int m_column;
kono
parents:
diff changeset
472 bool m_created_by_user;
kono
parents:
diff changeset
473 };
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 class type : public memento
kono
parents:
diff changeset
476 {
kono
parents:
diff changeset
477 public:
kono
parents:
diff changeset
478 type *get_pointer ();
kono
parents:
diff changeset
479 type *get_const ();
kono
parents:
diff changeset
480 type *get_volatile ();
kono
parents:
diff changeset
481 type *get_aligned (size_t alignment_in_bytes);
kono
parents:
diff changeset
482 type *get_vector (size_t num_units);
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 /* Get the type obtained when dereferencing this type.
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 This will return NULL if it's not valid to dereference this type.
kono
parents:
diff changeset
487 The caller is responsible for setting an error. */
kono
parents:
diff changeset
488 virtual type *dereference () = 0;
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 /* Dynamic casts. */
kono
parents:
diff changeset
491 virtual function_type *dyn_cast_function_type () { return NULL; }
kono
parents:
diff changeset
492 virtual function_type *as_a_function_type() { gcc_unreachable (); return NULL; }
kono
parents:
diff changeset
493 virtual struct_ *dyn_cast_struct () { return NULL; }
kono
parents:
diff changeset
494 virtual vector_type *dyn_cast_vector_type () { return NULL; }
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 /* Is it typesafe to copy to this type from rtype? */
kono
parents:
diff changeset
497 virtual bool accepts_writes_from (type *rtype)
kono
parents:
diff changeset
498 {
kono
parents:
diff changeset
499 gcc_assert (rtype);
kono
parents:
diff changeset
500 return this->unqualified ()->is_same_type_as (rtype->unqualified ());
kono
parents:
diff changeset
501 }
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 virtual bool is_same_type_as (type *other)
kono
parents:
diff changeset
504 {
kono
parents:
diff changeset
505 return this == other;
kono
parents:
diff changeset
506 }
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 /* Strip off "const" etc */
kono
parents:
diff changeset
509 virtual type *unqualified ()
kono
parents:
diff changeset
510 {
kono
parents:
diff changeset
511 return this;
kono
parents:
diff changeset
512 }
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 virtual bool is_int () const = 0;
kono
parents:
diff changeset
515 virtual bool is_float () const = 0;
kono
parents:
diff changeset
516 virtual bool is_bool () const = 0;
kono
parents:
diff changeset
517 virtual type *is_pointer () = 0;
kono
parents:
diff changeset
518 virtual type *is_array () = 0;
kono
parents:
diff changeset
519 virtual bool is_void () const { return false; }
kono
parents:
diff changeset
520 virtual bool has_known_size () const { return true; }
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 bool is_numeric () const
kono
parents:
diff changeset
523 {
kono
parents:
diff changeset
524 return is_int () || is_float () || is_bool ();
kono
parents:
diff changeset
525 }
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 playback::type *
kono
parents:
diff changeset
528 playback_type ()
kono
parents:
diff changeset
529 {
kono
parents:
diff changeset
530 return static_cast <playback::type *> (m_playback_obj);
kono
parents:
diff changeset
531 }
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 virtual const char *access_as_type (reproducer &r);
kono
parents:
diff changeset
534
kono
parents:
diff changeset
535 protected:
kono
parents:
diff changeset
536 type (context *ctxt)
kono
parents:
diff changeset
537 : memento (ctxt),
kono
parents:
diff changeset
538 m_pointer_to_this_type (NULL)
kono
parents:
diff changeset
539 {}
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 private:
kono
parents:
diff changeset
542 type *m_pointer_to_this_type;
kono
parents:
diff changeset
543 };
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 /* Result of "gcc_jit_context_get_type". */
kono
parents:
diff changeset
546 class memento_of_get_type : public type
kono
parents:
diff changeset
547 {
kono
parents:
diff changeset
548 public:
kono
parents:
diff changeset
549 memento_of_get_type (context *ctxt,
kono
parents:
diff changeset
550 enum gcc_jit_types kind)
kono
parents:
diff changeset
551 : type (ctxt),
kono
parents:
diff changeset
552 m_kind (kind) {}
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 type *dereference () FINAL OVERRIDE;
kono
parents:
diff changeset
555
kono
parents:
diff changeset
556 bool accepts_writes_from (type *rtype) FINAL OVERRIDE
kono
parents:
diff changeset
557 {
kono
parents:
diff changeset
558 if (m_kind == GCC_JIT_TYPE_VOID_PTR)
kono
parents:
diff changeset
559 if (rtype->is_pointer ())
kono
parents:
diff changeset
560 {
kono
parents:
diff changeset
561 /* LHS (this) is type (void *), and the RHS is a pointer:
kono
parents:
diff changeset
562 accept it: */
kono
parents:
diff changeset
563 return true;
kono
parents:
diff changeset
564 }
kono
parents:
diff changeset
565
kono
parents:
diff changeset
566 return type::accepts_writes_from (rtype);
kono
parents:
diff changeset
567 }
kono
parents:
diff changeset
568
kono
parents:
diff changeset
569 bool is_int () const FINAL OVERRIDE;
kono
parents:
diff changeset
570 bool is_float () const FINAL OVERRIDE;
kono
parents:
diff changeset
571 bool is_bool () const FINAL OVERRIDE;
kono
parents:
diff changeset
572 type *is_pointer () FINAL OVERRIDE { return dereference (); }
kono
parents:
diff changeset
573 type *is_array () FINAL OVERRIDE { return NULL; }
kono
parents:
diff changeset
574 bool is_void () const FINAL OVERRIDE { return m_kind == GCC_JIT_TYPE_VOID; }
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 public:
kono
parents:
diff changeset
577 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579 private:
kono
parents:
diff changeset
580 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
581 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 private:
kono
parents:
diff changeset
584 enum gcc_jit_types m_kind;
kono
parents:
diff changeset
585 };
kono
parents:
diff changeset
586
kono
parents:
diff changeset
587 /* Result of "gcc_jit_type_get_pointer". */
kono
parents:
diff changeset
588 class memento_of_get_pointer : public type
kono
parents:
diff changeset
589 {
kono
parents:
diff changeset
590 public:
kono
parents:
diff changeset
591 memento_of_get_pointer (type *other_type)
kono
parents:
diff changeset
592 : type (other_type->m_ctxt),
kono
parents:
diff changeset
593 m_other_type (other_type) {}
kono
parents:
diff changeset
594
kono
parents:
diff changeset
595 type *dereference () FINAL OVERRIDE { return m_other_type; }
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 bool accepts_writes_from (type *rtype) FINAL OVERRIDE;
kono
parents:
diff changeset
598
kono
parents:
diff changeset
599 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 bool is_int () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
602 bool is_float () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
603 bool is_bool () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
604 type *is_pointer () FINAL OVERRIDE { return m_other_type; }
kono
parents:
diff changeset
605 type *is_array () FINAL OVERRIDE { return NULL; }
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 private:
kono
parents:
diff changeset
608 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
609 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
610
kono
parents:
diff changeset
611 private:
kono
parents:
diff changeset
612 type *m_other_type;
kono
parents:
diff changeset
613 };
kono
parents:
diff changeset
614
kono
parents:
diff changeset
615 /* A decorated version of a type, for get_const, get_volatile,
kono
parents:
diff changeset
616 get_aligned, and get_vector. */
kono
parents:
diff changeset
617
kono
parents:
diff changeset
618 class decorated_type : public type
kono
parents:
diff changeset
619 {
kono
parents:
diff changeset
620 public:
kono
parents:
diff changeset
621 decorated_type (type *other_type)
kono
parents:
diff changeset
622 : type (other_type->m_ctxt),
kono
parents:
diff changeset
623 m_other_type (other_type) {}
kono
parents:
diff changeset
624
kono
parents:
diff changeset
625 type *dereference () FINAL OVERRIDE { return m_other_type->dereference (); }
kono
parents:
diff changeset
626
kono
parents:
diff changeset
627 bool is_int () const FINAL OVERRIDE { return m_other_type->is_int (); }
kono
parents:
diff changeset
628 bool is_float () const FINAL OVERRIDE { return m_other_type->is_float (); }
kono
parents:
diff changeset
629 bool is_bool () const FINAL OVERRIDE { return m_other_type->is_bool (); }
kono
parents:
diff changeset
630 type *is_pointer () FINAL OVERRIDE { return m_other_type->is_pointer (); }
kono
parents:
diff changeset
631 type *is_array () FINAL OVERRIDE { return m_other_type->is_array (); }
kono
parents:
diff changeset
632
kono
parents:
diff changeset
633 protected:
kono
parents:
diff changeset
634 type *m_other_type;
kono
parents:
diff changeset
635 };
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 /* Result of "gcc_jit_type_get_const". */
kono
parents:
diff changeset
638 class memento_of_get_const : public decorated_type
kono
parents:
diff changeset
639 {
kono
parents:
diff changeset
640 public:
kono
parents:
diff changeset
641 memento_of_get_const (type *other_type)
kono
parents:
diff changeset
642 : decorated_type (other_type) {}
kono
parents:
diff changeset
643
kono
parents:
diff changeset
644 bool accepts_writes_from (type */*rtype*/) FINAL OVERRIDE
kono
parents:
diff changeset
645 {
kono
parents:
diff changeset
646 /* Can't write to a "const". */
kono
parents:
diff changeset
647 return false;
kono
parents:
diff changeset
648 }
kono
parents:
diff changeset
649
kono
parents:
diff changeset
650 /* Strip off the "const", giving the underlying type. */
kono
parents:
diff changeset
651 type *unqualified () FINAL OVERRIDE { return m_other_type; }
kono
parents:
diff changeset
652
kono
parents:
diff changeset
653 void replay_into (replayer *) FINAL OVERRIDE;
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 private:
kono
parents:
diff changeset
656 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
657 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
658 };
kono
parents:
diff changeset
659
kono
parents:
diff changeset
660 /* Result of "gcc_jit_type_get_volatile". */
kono
parents:
diff changeset
661 class memento_of_get_volatile : public decorated_type
kono
parents:
diff changeset
662 {
kono
parents:
diff changeset
663 public:
kono
parents:
diff changeset
664 memento_of_get_volatile (type *other_type)
kono
parents:
diff changeset
665 : decorated_type (other_type) {}
kono
parents:
diff changeset
666
kono
parents:
diff changeset
667 /* Strip off the "volatile", giving the underlying type. */
kono
parents:
diff changeset
668 type *unqualified () FINAL OVERRIDE { return m_other_type; }
kono
parents:
diff changeset
669
kono
parents:
diff changeset
670 void replay_into (replayer *) FINAL OVERRIDE;
kono
parents:
diff changeset
671
kono
parents:
diff changeset
672 private:
kono
parents:
diff changeset
673 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
674 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
675 };
kono
parents:
diff changeset
676
kono
parents:
diff changeset
677 /* Result of "gcc_jit_type_get_aligned". */
kono
parents:
diff changeset
678 class memento_of_get_aligned : public decorated_type
kono
parents:
diff changeset
679 {
kono
parents:
diff changeset
680 public:
kono
parents:
diff changeset
681 memento_of_get_aligned (type *other_type, size_t alignment_in_bytes)
kono
parents:
diff changeset
682 : decorated_type (other_type),
kono
parents:
diff changeset
683 m_alignment_in_bytes (alignment_in_bytes) {}
kono
parents:
diff changeset
684
kono
parents:
diff changeset
685 /* Strip off the alignment, giving the underlying type. */
kono
parents:
diff changeset
686 type *unqualified () FINAL OVERRIDE { return m_other_type; }
kono
parents:
diff changeset
687
kono
parents:
diff changeset
688 void replay_into (replayer *) FINAL OVERRIDE;
kono
parents:
diff changeset
689
kono
parents:
diff changeset
690 private:
kono
parents:
diff changeset
691 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
692 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
693
kono
parents:
diff changeset
694 private:
kono
parents:
diff changeset
695 size_t m_alignment_in_bytes;
kono
parents:
diff changeset
696 };
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 /* Result of "gcc_jit_type_get_vector". */
kono
parents:
diff changeset
699 class vector_type : public decorated_type
kono
parents:
diff changeset
700 {
kono
parents:
diff changeset
701 public:
kono
parents:
diff changeset
702 vector_type (type *other_type, size_t num_units)
kono
parents:
diff changeset
703 : decorated_type (other_type),
kono
parents:
diff changeset
704 m_num_units (num_units) {}
kono
parents:
diff changeset
705
kono
parents:
diff changeset
706 size_t get_num_units () const { return m_num_units; }
kono
parents:
diff changeset
707
kono
parents:
diff changeset
708 vector_type *dyn_cast_vector_type () FINAL OVERRIDE { return this; }
kono
parents:
diff changeset
709
kono
parents:
diff changeset
710 type *get_element_type () { return m_other_type; }
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712 void replay_into (replayer *) FINAL OVERRIDE;
kono
parents:
diff changeset
713
kono
parents:
diff changeset
714 private:
kono
parents:
diff changeset
715 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
716 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
717
kono
parents:
diff changeset
718 private:
kono
parents:
diff changeset
719 size_t m_num_units;
kono
parents:
diff changeset
720 };
kono
parents:
diff changeset
721
kono
parents:
diff changeset
722 class array_type : public type
kono
parents:
diff changeset
723 {
kono
parents:
diff changeset
724 public:
kono
parents:
diff changeset
725 array_type (context *ctxt,
kono
parents:
diff changeset
726 location *loc,
kono
parents:
diff changeset
727 type *element_type,
kono
parents:
diff changeset
728 int num_elements)
kono
parents:
diff changeset
729 : type (ctxt),
kono
parents:
diff changeset
730 m_loc (loc),
kono
parents:
diff changeset
731 m_element_type (element_type),
kono
parents:
diff changeset
732 m_num_elements (num_elements)
kono
parents:
diff changeset
733 {}
kono
parents:
diff changeset
734
kono
parents:
diff changeset
735 type *dereference () FINAL OVERRIDE;
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 bool is_int () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
738 bool is_float () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
739 bool is_bool () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
740 type *is_pointer () FINAL OVERRIDE { return NULL; }
kono
parents:
diff changeset
741 type *is_array () FINAL OVERRIDE { return m_element_type; }
kono
parents:
diff changeset
742
kono
parents:
diff changeset
743 void replay_into (replayer *) FINAL OVERRIDE;
kono
parents:
diff changeset
744
kono
parents:
diff changeset
745 private:
kono
parents:
diff changeset
746 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
747 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
748
kono
parents:
diff changeset
749 private:
kono
parents:
diff changeset
750 location *m_loc;
kono
parents:
diff changeset
751 type *m_element_type;
kono
parents:
diff changeset
752 int m_num_elements;
kono
parents:
diff changeset
753 };
kono
parents:
diff changeset
754
kono
parents:
diff changeset
755 class function_type : public type
kono
parents:
diff changeset
756 {
kono
parents:
diff changeset
757 public:
kono
parents:
diff changeset
758 function_type (context *ctxt,
kono
parents:
diff changeset
759 type *return_type,
kono
parents:
diff changeset
760 int num_params,
kono
parents:
diff changeset
761 type **param_types,
kono
parents:
diff changeset
762 int is_variadic);
kono
parents:
diff changeset
763
kono
parents:
diff changeset
764 type *dereference () FINAL OVERRIDE;
kono
parents:
diff changeset
765 function_type *dyn_cast_function_type () FINAL OVERRIDE { return this; }
kono
parents:
diff changeset
766 function_type *as_a_function_type () FINAL OVERRIDE { return this; }
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 bool is_same_type_as (type *other) FINAL OVERRIDE;
kono
parents:
diff changeset
769
kono
parents:
diff changeset
770 bool is_int () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
771 bool is_float () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
772 bool is_bool () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
773 type *is_pointer () FINAL OVERRIDE { return NULL; }
kono
parents:
diff changeset
774 type *is_array () FINAL OVERRIDE { return NULL; }
kono
parents:
diff changeset
775
kono
parents:
diff changeset
776 void replay_into (replayer *) FINAL OVERRIDE;
kono
parents:
diff changeset
777
kono
parents:
diff changeset
778 type * get_return_type () const { return m_return_type; }
kono
parents:
diff changeset
779 const vec<type *> &get_param_types () const { return m_param_types; }
kono
parents:
diff changeset
780 int is_variadic () const { return m_is_variadic; }
kono
parents:
diff changeset
781
kono
parents:
diff changeset
782 string * make_debug_string_with_ptr ();
kono
parents:
diff changeset
783
kono
parents:
diff changeset
784 void
kono
parents:
diff changeset
785 write_deferred_reproducer (reproducer &r,
kono
parents:
diff changeset
786 memento *ptr_type);
kono
parents:
diff changeset
787
kono
parents:
diff changeset
788 private:
kono
parents:
diff changeset
789 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
790 string * make_debug_string_with (const char *);
kono
parents:
diff changeset
791 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
792
kono
parents:
diff changeset
793 private:
kono
parents:
diff changeset
794 type *m_return_type;
kono
parents:
diff changeset
795 auto_vec<type *> m_param_types;
kono
parents:
diff changeset
796 int m_is_variadic;
kono
parents:
diff changeset
797 };
kono
parents:
diff changeset
798
kono
parents:
diff changeset
799 class field : public memento
kono
parents:
diff changeset
800 {
kono
parents:
diff changeset
801 public:
kono
parents:
diff changeset
802 field (context *ctxt,
kono
parents:
diff changeset
803 location *loc,
kono
parents:
diff changeset
804 type *type,
kono
parents:
diff changeset
805 string *name)
kono
parents:
diff changeset
806 : memento (ctxt),
kono
parents:
diff changeset
807 m_loc (loc),
kono
parents:
diff changeset
808 m_type (type),
kono
parents:
diff changeset
809 m_name (name),
kono
parents:
diff changeset
810 m_container (NULL)
kono
parents:
diff changeset
811 {}
kono
parents:
diff changeset
812
kono
parents:
diff changeset
813 type * get_type () const { return m_type; }
kono
parents:
diff changeset
814
kono
parents:
diff changeset
815 compound_type * get_container () const { return m_container; }
kono
parents:
diff changeset
816 void set_container (compound_type *c) { m_container = c; }
kono
parents:
diff changeset
817
kono
parents:
diff changeset
818 void replay_into (replayer *) FINAL OVERRIDE;
kono
parents:
diff changeset
819
kono
parents:
diff changeset
820 void write_to_dump (dump &d) FINAL OVERRIDE;
kono
parents:
diff changeset
821
kono
parents:
diff changeset
822 playback::field *
kono
parents:
diff changeset
823 playback_field () const
kono
parents:
diff changeset
824 {
kono
parents:
diff changeset
825 return static_cast <playback::field *> (m_playback_obj);
kono
parents:
diff changeset
826 }
kono
parents:
diff changeset
827
kono
parents:
diff changeset
828 private:
kono
parents:
diff changeset
829 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
830 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
831
kono
parents:
diff changeset
832 private:
kono
parents:
diff changeset
833 location *m_loc;
kono
parents:
diff changeset
834 type *m_type;
kono
parents:
diff changeset
835 string *m_name;
kono
parents:
diff changeset
836 compound_type *m_container;
kono
parents:
diff changeset
837 };
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 /* Base class for struct_ and union_ */
kono
parents:
diff changeset
840 class compound_type : public type
kono
parents:
diff changeset
841 {
kono
parents:
diff changeset
842 public:
kono
parents:
diff changeset
843 compound_type (context *ctxt,
kono
parents:
diff changeset
844 location *loc,
kono
parents:
diff changeset
845 string *name);
kono
parents:
diff changeset
846
kono
parents:
diff changeset
847 string *get_name () const { return m_name; }
kono
parents:
diff changeset
848 location *get_loc () const { return m_loc; }
kono
parents:
diff changeset
849 fields * get_fields () { return m_fields; }
kono
parents:
diff changeset
850
kono
parents:
diff changeset
851 void
kono
parents:
diff changeset
852 set_fields (location *loc,
kono
parents:
diff changeset
853 int num_fields,
kono
parents:
diff changeset
854 field **fields);
kono
parents:
diff changeset
855
kono
parents:
diff changeset
856 type *dereference () FINAL OVERRIDE;
kono
parents:
diff changeset
857
kono
parents:
diff changeset
858 bool is_int () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
859 bool is_float () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
860 bool is_bool () const FINAL OVERRIDE { return false; }
kono
parents:
diff changeset
861 type *is_pointer () FINAL OVERRIDE { return NULL; }
kono
parents:
diff changeset
862 type *is_array () FINAL OVERRIDE { return NULL; }
kono
parents:
diff changeset
863
kono
parents:
diff changeset
864 bool has_known_size () const FINAL OVERRIDE { return m_fields != NULL; }
kono
parents:
diff changeset
865
kono
parents:
diff changeset
866 playback::compound_type *
kono
parents:
diff changeset
867 playback_compound_type ()
kono
parents:
diff changeset
868 {
kono
parents:
diff changeset
869 return static_cast <playback::compound_type *> (m_playback_obj);
kono
parents:
diff changeset
870 }
kono
parents:
diff changeset
871
kono
parents:
diff changeset
872 private:
kono
parents:
diff changeset
873 location *m_loc;
kono
parents:
diff changeset
874 string *m_name;
kono
parents:
diff changeset
875 fields *m_fields;
kono
parents:
diff changeset
876 };
kono
parents:
diff changeset
877
kono
parents:
diff changeset
878 class struct_ : public compound_type
kono
parents:
diff changeset
879 {
kono
parents:
diff changeset
880 public:
kono
parents:
diff changeset
881 struct_ (context *ctxt,
kono
parents:
diff changeset
882 location *loc,
kono
parents:
diff changeset
883 string *name);
kono
parents:
diff changeset
884
kono
parents:
diff changeset
885 struct_ *dyn_cast_struct () FINAL OVERRIDE { return this; }
kono
parents:
diff changeset
886
kono
parents:
diff changeset
887 type *
kono
parents:
diff changeset
888 as_type () { return this; }
kono
parents:
diff changeset
889
kono
parents:
diff changeset
890 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 const char *access_as_type (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 private:
kono
parents:
diff changeset
895 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
896 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
897 };
kono
parents:
diff changeset
898
kono
parents:
diff changeset
899 // memento of struct_::set_fields
kono
parents:
diff changeset
900 class fields : public memento
kono
parents:
diff changeset
901 {
kono
parents:
diff changeset
902 public:
kono
parents:
diff changeset
903 fields (compound_type *struct_or_union,
kono
parents:
diff changeset
904 int num_fields,
kono
parents:
diff changeset
905 field **fields);
kono
parents:
diff changeset
906
kono
parents:
diff changeset
907 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
908
kono
parents:
diff changeset
909 void write_to_dump (dump &d) FINAL OVERRIDE;
kono
parents:
diff changeset
910
kono
parents:
diff changeset
911 int length () const { return m_fields.length (); }
kono
parents:
diff changeset
912 field *get_field (int i) const { return m_fields[i]; }
kono
parents:
diff changeset
913
kono
parents:
diff changeset
914 private:
kono
parents:
diff changeset
915 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
916 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
917
kono
parents:
diff changeset
918 private:
kono
parents:
diff changeset
919 compound_type *m_struct_or_union;
kono
parents:
diff changeset
920 auto_vec<field *> m_fields;
kono
parents:
diff changeset
921 };
kono
parents:
diff changeset
922
kono
parents:
diff changeset
923 class union_ : public compound_type
kono
parents:
diff changeset
924 {
kono
parents:
diff changeset
925 public:
kono
parents:
diff changeset
926 union_ (context *ctxt,
kono
parents:
diff changeset
927 location *loc,
kono
parents:
diff changeset
928 string *name);
kono
parents:
diff changeset
929
kono
parents:
diff changeset
930 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
931
kono
parents:
diff changeset
932 private:
kono
parents:
diff changeset
933 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
934 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
935 };
kono
parents:
diff changeset
936
kono
parents:
diff changeset
937 /* An abstract base class for operations that visit all rvalues within an
kono
parents:
diff changeset
938 expression tree.
kono
parents:
diff changeset
939 Currently the only implementation is class rvalue_usage_validator within
kono
parents:
diff changeset
940 jit-recording.c. */
kono
parents:
diff changeset
941
kono
parents:
diff changeset
942 class rvalue_visitor
kono
parents:
diff changeset
943 {
kono
parents:
diff changeset
944 public:
kono
parents:
diff changeset
945 virtual ~rvalue_visitor () {}
kono
parents:
diff changeset
946 virtual void visit (rvalue *rvalue) = 0;
kono
parents:
diff changeset
947 };
kono
parents:
diff changeset
948
kono
parents:
diff changeset
949 /* When generating debug strings for rvalues we mimic C, so we need to
kono
parents:
diff changeset
950 mimic C's precedence levels when handling compound expressions.
kono
parents:
diff changeset
951 These are in order from strongest precedence to weakest. */
kono
parents:
diff changeset
952 enum precedence
kono
parents:
diff changeset
953 {
kono
parents:
diff changeset
954 PRECEDENCE_PRIMARY,
kono
parents:
diff changeset
955 PRECEDENCE_POSTFIX,
kono
parents:
diff changeset
956 PRECEDENCE_UNARY,
kono
parents:
diff changeset
957 PRECEDENCE_CAST,
kono
parents:
diff changeset
958 PRECEDENCE_MULTIPLICATIVE,
kono
parents:
diff changeset
959 PRECEDENCE_ADDITIVE,
kono
parents:
diff changeset
960 PRECEDENCE_SHIFT,
kono
parents:
diff changeset
961 PRECEDENCE_RELATIONAL,
kono
parents:
diff changeset
962 PRECEDENCE_EQUALITY,
kono
parents:
diff changeset
963 PRECEDENCE_BITWISE_AND,
kono
parents:
diff changeset
964 PRECEDENCE_BITWISE_XOR,
kono
parents:
diff changeset
965 PRECEDENCE_BITWISE_IOR,
kono
parents:
diff changeset
966 PRECEDENCE_LOGICAL_AND,
kono
parents:
diff changeset
967 PRECEDENCE_LOGICAL_OR
kono
parents:
diff changeset
968 };
kono
parents:
diff changeset
969
kono
parents:
diff changeset
970 class rvalue : public memento
kono
parents:
diff changeset
971 {
kono
parents:
diff changeset
972 public:
kono
parents:
diff changeset
973 rvalue (context *ctxt,
kono
parents:
diff changeset
974 location *loc,
kono
parents:
diff changeset
975 type *type_)
kono
parents:
diff changeset
976 : memento (ctxt),
kono
parents:
diff changeset
977 m_loc (loc),
kono
parents:
diff changeset
978 m_type (type_),
kono
parents:
diff changeset
979 m_scope (NULL),
kono
parents:
diff changeset
980 m_parenthesized_string (NULL)
kono
parents:
diff changeset
981 {
kono
parents:
diff changeset
982 gcc_assert (type_);
kono
parents:
diff changeset
983 }
kono
parents:
diff changeset
984
kono
parents:
diff changeset
985 location * get_loc () const { return m_loc; }
kono
parents:
diff changeset
986
kono
parents:
diff changeset
987 /* Get the recording::type of this rvalue.
kono
parents:
diff changeset
988
kono
parents:
diff changeset
989 Implements the post-error-checking part of
kono
parents:
diff changeset
990 gcc_jit_rvalue_get_type. */
kono
parents:
diff changeset
991 type * get_type () const { return m_type; }
kono
parents:
diff changeset
992
kono
parents:
diff changeset
993 playback::rvalue *
kono
parents:
diff changeset
994 playback_rvalue () const
kono
parents:
diff changeset
995 {
kono
parents:
diff changeset
996 return static_cast <playback::rvalue *> (m_playback_obj);
kono
parents:
diff changeset
997 }
kono
parents:
diff changeset
998 rvalue *
kono
parents:
diff changeset
999 access_field (location *loc,
kono
parents:
diff changeset
1000 field *field);
kono
parents:
diff changeset
1001
kono
parents:
diff changeset
1002 lvalue *
kono
parents:
diff changeset
1003 dereference_field (location *loc,
kono
parents:
diff changeset
1004 field *field);
kono
parents:
diff changeset
1005
kono
parents:
diff changeset
1006 lvalue *
kono
parents:
diff changeset
1007 dereference (location *loc);
kono
parents:
diff changeset
1008
kono
parents:
diff changeset
1009 void
kono
parents:
diff changeset
1010 verify_valid_within_stmt (const char *api_funcname, statement *s);
kono
parents:
diff changeset
1011
kono
parents:
diff changeset
1012 virtual void visit_children (rvalue_visitor *v) = 0;
kono
parents:
diff changeset
1013
kono
parents:
diff changeset
1014 void set_scope (function *scope);
kono
parents:
diff changeset
1015 function *get_scope () const { return m_scope; }
kono
parents:
diff changeset
1016
kono
parents:
diff changeset
1017 /* Dynamic casts. */
kono
parents:
diff changeset
1018 virtual param *dyn_cast_param () { return NULL; }
kono
parents:
diff changeset
1019 virtual base_call *dyn_cast_base_call () { return NULL; }
kono
parents:
diff changeset
1020
kono
parents:
diff changeset
1021 virtual const char *access_as_rvalue (reproducer &r);
kono
parents:
diff changeset
1022
kono
parents:
diff changeset
1023 /* Get the debug string, wrapped in parentheses. */
kono
parents:
diff changeset
1024 const char *
kono
parents:
diff changeset
1025 get_debug_string_parens (enum precedence outer_prec);
kono
parents:
diff changeset
1026
kono
parents:
diff changeset
1027 virtual bool is_constant () const { return false; }
kono
parents:
diff changeset
1028 virtual bool get_wide_int (wide_int *) const { return false; }
kono
parents:
diff changeset
1029
kono
parents:
diff changeset
1030 private:
kono
parents:
diff changeset
1031 virtual enum precedence get_precedence () const = 0;
kono
parents:
diff changeset
1032
kono
parents:
diff changeset
1033 protected:
kono
parents:
diff changeset
1034 location *m_loc;
kono
parents:
diff changeset
1035 type *m_type;
kono
parents:
diff changeset
1036
kono
parents:
diff changeset
1037 private:
kono
parents:
diff changeset
1038 function *m_scope; /* NULL for globals, non-NULL for locals/params */
kono
parents:
diff changeset
1039 string *m_parenthesized_string;
kono
parents:
diff changeset
1040 };
kono
parents:
diff changeset
1041
kono
parents:
diff changeset
1042 class lvalue : public rvalue
kono
parents:
diff changeset
1043 {
kono
parents:
diff changeset
1044 public:
kono
parents:
diff changeset
1045 lvalue (context *ctxt,
kono
parents:
diff changeset
1046 location *loc,
kono
parents:
diff changeset
1047 type *type_)
kono
parents:
diff changeset
1048 : rvalue (ctxt, loc, type_)
kono
parents:
diff changeset
1049 {}
kono
parents:
diff changeset
1050
kono
parents:
diff changeset
1051 playback::lvalue *
kono
parents:
diff changeset
1052 playback_lvalue () const
kono
parents:
diff changeset
1053 {
kono
parents:
diff changeset
1054 return static_cast <playback::lvalue *> (m_playback_obj);
kono
parents:
diff changeset
1055 }
kono
parents:
diff changeset
1056
kono
parents:
diff changeset
1057 lvalue *
kono
parents:
diff changeset
1058 access_field (location *loc,
kono
parents:
diff changeset
1059 field *field);
kono
parents:
diff changeset
1060
kono
parents:
diff changeset
1061 rvalue *
kono
parents:
diff changeset
1062 get_address (location *loc);
kono
parents:
diff changeset
1063
kono
parents:
diff changeset
1064 rvalue *
kono
parents:
diff changeset
1065 as_rvalue () { return this; }
kono
parents:
diff changeset
1066
kono
parents:
diff changeset
1067 const char *access_as_rvalue (reproducer &r) OVERRIDE;
kono
parents:
diff changeset
1068 virtual const char *access_as_lvalue (reproducer &r);
kono
parents:
diff changeset
1069 };
kono
parents:
diff changeset
1070
kono
parents:
diff changeset
1071 class param : public lvalue
kono
parents:
diff changeset
1072 {
kono
parents:
diff changeset
1073 public:
kono
parents:
diff changeset
1074 param (context *ctxt,
kono
parents:
diff changeset
1075 location *loc,
kono
parents:
diff changeset
1076 type *type,
kono
parents:
diff changeset
1077 string *name)
kono
parents:
diff changeset
1078 : lvalue (ctxt, loc, type),
kono
parents:
diff changeset
1079 m_name (name) {}
kono
parents:
diff changeset
1080
kono
parents:
diff changeset
1081 lvalue *
kono
parents:
diff changeset
1082 as_lvalue () { return this; }
kono
parents:
diff changeset
1083
kono
parents:
diff changeset
1084 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1085
kono
parents:
diff changeset
1086 void visit_children (rvalue_visitor *) FINAL OVERRIDE {}
kono
parents:
diff changeset
1087
kono
parents:
diff changeset
1088 playback::param *
kono
parents:
diff changeset
1089 playback_param () const
kono
parents:
diff changeset
1090 {
kono
parents:
diff changeset
1091 return static_cast <playback::param *> (m_playback_obj);
kono
parents:
diff changeset
1092 }
kono
parents:
diff changeset
1093
kono
parents:
diff changeset
1094 param *dyn_cast_param () FINAL OVERRIDE { return this; }
kono
parents:
diff changeset
1095
kono
parents:
diff changeset
1096 const char *access_as_rvalue (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1097 const char *access_as_lvalue (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1098
kono
parents:
diff changeset
1099 private:
kono
parents:
diff changeset
1100 string * make_debug_string () FINAL OVERRIDE { return m_name; }
kono
parents:
diff changeset
1101 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1102 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1103 {
kono
parents:
diff changeset
1104 return PRECEDENCE_PRIMARY;
kono
parents:
diff changeset
1105 }
kono
parents:
diff changeset
1106
kono
parents:
diff changeset
1107 private:
kono
parents:
diff changeset
1108 string *m_name;
kono
parents:
diff changeset
1109 };
kono
parents:
diff changeset
1110
kono
parents:
diff changeset
1111 class function : public memento
kono
parents:
diff changeset
1112 {
kono
parents:
diff changeset
1113 public:
kono
parents:
diff changeset
1114 function (context *ctxt,
kono
parents:
diff changeset
1115 location *loc,
kono
parents:
diff changeset
1116 enum gcc_jit_function_kind kind,
kono
parents:
diff changeset
1117 type *return_type,
kono
parents:
diff changeset
1118 string *name,
kono
parents:
diff changeset
1119 int num_params,
kono
parents:
diff changeset
1120 param **params,
kono
parents:
diff changeset
1121 int is_variadic,
kono
parents:
diff changeset
1122 enum built_in_function builtin_id);
kono
parents:
diff changeset
1123
kono
parents:
diff changeset
1124 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1125
kono
parents:
diff changeset
1126 playback::function *
kono
parents:
diff changeset
1127 playback_function () const
kono
parents:
diff changeset
1128 {
kono
parents:
diff changeset
1129 return static_cast <playback::function *> (m_playback_obj);
kono
parents:
diff changeset
1130 }
kono
parents:
diff changeset
1131
kono
parents:
diff changeset
1132 enum gcc_jit_function_kind get_kind () const { return m_kind; }
kono
parents:
diff changeset
1133
kono
parents:
diff changeset
1134 lvalue *
kono
parents:
diff changeset
1135 new_local (location *loc,
kono
parents:
diff changeset
1136 type *type,
kono
parents:
diff changeset
1137 const char *name);
kono
parents:
diff changeset
1138
kono
parents:
diff changeset
1139 block*
kono
parents:
diff changeset
1140 new_block (const char *name);
kono
parents:
diff changeset
1141
kono
parents:
diff changeset
1142 location *get_loc () const { return m_loc; }
kono
parents:
diff changeset
1143 type *get_return_type () const { return m_return_type; }
kono
parents:
diff changeset
1144 string * get_name () const { return m_name; }
kono
parents:
diff changeset
1145 const vec<param *> &get_params () const { return m_params; }
kono
parents:
diff changeset
1146
kono
parents:
diff changeset
1147 /* Get the given param by index.
kono
parents:
diff changeset
1148 Implements the post-error-checking part of
kono
parents:
diff changeset
1149 gcc_jit_function_get_param. */
kono
parents:
diff changeset
1150 param *get_param (int i) const { return m_params[i]; }
kono
parents:
diff changeset
1151
kono
parents:
diff changeset
1152 bool is_variadic () const { return m_is_variadic; }
kono
parents:
diff changeset
1153
kono
parents:
diff changeset
1154 void write_to_dump (dump &d) FINAL OVERRIDE;
kono
parents:
diff changeset
1155
kono
parents:
diff changeset
1156 void validate ();
kono
parents:
diff changeset
1157
kono
parents:
diff changeset
1158 void dump_to_dot (const char *path);
kono
parents:
diff changeset
1159
kono
parents:
diff changeset
1160 rvalue *get_address (location *loc);
kono
parents:
diff changeset
1161
kono
parents:
diff changeset
1162 private:
kono
parents:
diff changeset
1163 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1164 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1165
kono
parents:
diff changeset
1166 private:
kono
parents:
diff changeset
1167 location *m_loc;
kono
parents:
diff changeset
1168 enum gcc_jit_function_kind m_kind;
kono
parents:
diff changeset
1169 type *m_return_type;
kono
parents:
diff changeset
1170 string *m_name;
kono
parents:
diff changeset
1171 auto_vec<param *> m_params;
kono
parents:
diff changeset
1172 int m_is_variadic;
kono
parents:
diff changeset
1173 enum built_in_function m_builtin_id;
kono
parents:
diff changeset
1174 auto_vec<local *> m_locals;
kono
parents:
diff changeset
1175 auto_vec<block *> m_blocks;
kono
parents:
diff changeset
1176 type *m_fn_ptr_type;
kono
parents:
diff changeset
1177 };
kono
parents:
diff changeset
1178
kono
parents:
diff changeset
1179 class block : public memento
kono
parents:
diff changeset
1180 {
kono
parents:
diff changeset
1181 public:
kono
parents:
diff changeset
1182 block (function *func, int index, string *name)
kono
parents:
diff changeset
1183 : memento (func->m_ctxt),
kono
parents:
diff changeset
1184 m_func (func),
kono
parents:
diff changeset
1185 m_index (index),
kono
parents:
diff changeset
1186 m_name (name),
kono
parents:
diff changeset
1187 m_statements (),
kono
parents:
diff changeset
1188 m_has_been_terminated (false),
kono
parents:
diff changeset
1189 m_is_reachable (false)
kono
parents:
diff changeset
1190 {
kono
parents:
diff changeset
1191 }
kono
parents:
diff changeset
1192
kono
parents:
diff changeset
1193 /* Get the recording::function containing this block.
kono
parents:
diff changeset
1194 Implements the post-error-checking part of
kono
parents:
diff changeset
1195 gcc_jit_block_get_function. */
kono
parents:
diff changeset
1196 function *get_function () { return m_func; }
kono
parents:
diff changeset
1197
kono
parents:
diff changeset
1198 bool has_been_terminated () { return m_has_been_terminated; }
kono
parents:
diff changeset
1199 bool is_reachable () { return m_is_reachable; }
kono
parents:
diff changeset
1200
kono
parents:
diff changeset
1201 statement *
kono
parents:
diff changeset
1202 add_eval (location *loc,
kono
parents:
diff changeset
1203 rvalue *rvalue);
kono
parents:
diff changeset
1204
kono
parents:
diff changeset
1205 statement *
kono
parents:
diff changeset
1206 add_assignment (location *loc,
kono
parents:
diff changeset
1207 lvalue *lvalue,
kono
parents:
diff changeset
1208 rvalue *rvalue);
kono
parents:
diff changeset
1209
kono
parents:
diff changeset
1210 statement *
kono
parents:
diff changeset
1211 add_assignment_op (location *loc,
kono
parents:
diff changeset
1212 lvalue *lvalue,
kono
parents:
diff changeset
1213 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
1214 rvalue *rvalue);
kono
parents:
diff changeset
1215
kono
parents:
diff changeset
1216 statement *
kono
parents:
diff changeset
1217 add_comment (location *loc,
kono
parents:
diff changeset
1218 const char *text);
kono
parents:
diff changeset
1219
kono
parents:
diff changeset
1220 statement *
kono
parents:
diff changeset
1221 end_with_conditional (location *loc,
kono
parents:
diff changeset
1222 rvalue *boolval,
kono
parents:
diff changeset
1223 block *on_true,
kono
parents:
diff changeset
1224 block *on_false);
kono
parents:
diff changeset
1225
kono
parents:
diff changeset
1226 statement *
kono
parents:
diff changeset
1227 end_with_jump (location *loc,
kono
parents:
diff changeset
1228 block *target);
kono
parents:
diff changeset
1229
kono
parents:
diff changeset
1230 statement *
kono
parents:
diff changeset
1231 end_with_return (location *loc,
kono
parents:
diff changeset
1232 rvalue *rvalue);
kono
parents:
diff changeset
1233
kono
parents:
diff changeset
1234 statement *
kono
parents:
diff changeset
1235 end_with_switch (location *loc,
kono
parents:
diff changeset
1236 rvalue *expr,
kono
parents:
diff changeset
1237 block *default_block,
kono
parents:
diff changeset
1238 int num_cases,
kono
parents:
diff changeset
1239 case_ **cases);
kono
parents:
diff changeset
1240
kono
parents:
diff changeset
1241 playback::block *
kono
parents:
diff changeset
1242 playback_block () const
kono
parents:
diff changeset
1243 {
kono
parents:
diff changeset
1244 return static_cast <playback::block *> (m_playback_obj);
kono
parents:
diff changeset
1245 }
kono
parents:
diff changeset
1246
kono
parents:
diff changeset
1247 void write_to_dump (dump &d) FINAL OVERRIDE;
kono
parents:
diff changeset
1248
kono
parents:
diff changeset
1249 bool validate ();
kono
parents:
diff changeset
1250
kono
parents:
diff changeset
1251 location *get_loc () const;
kono
parents:
diff changeset
1252
kono
parents:
diff changeset
1253 statement *get_first_statement () const;
kono
parents:
diff changeset
1254 statement *get_last_statement () const;
kono
parents:
diff changeset
1255
kono
parents:
diff changeset
1256 vec <block *> get_successor_blocks () const;
kono
parents:
diff changeset
1257
kono
parents:
diff changeset
1258 private:
kono
parents:
diff changeset
1259 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1260 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1261
kono
parents:
diff changeset
1262 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1263
kono
parents:
diff changeset
1264 void dump_to_dot (pretty_printer *pp);
kono
parents:
diff changeset
1265 void dump_edges_to_dot (pretty_printer *pp);
kono
parents:
diff changeset
1266
kono
parents:
diff changeset
1267 private:
kono
parents:
diff changeset
1268 function *m_func;
kono
parents:
diff changeset
1269 int m_index;
kono
parents:
diff changeset
1270 string *m_name;
kono
parents:
diff changeset
1271 auto_vec<statement *> m_statements;
kono
parents:
diff changeset
1272 bool m_has_been_terminated;
kono
parents:
diff changeset
1273 bool m_is_reachable;
kono
parents:
diff changeset
1274
kono
parents:
diff changeset
1275 friend class function;
kono
parents:
diff changeset
1276 };
kono
parents:
diff changeset
1277
kono
parents:
diff changeset
1278 class global : public lvalue
kono
parents:
diff changeset
1279 {
kono
parents:
diff changeset
1280 public:
kono
parents:
diff changeset
1281 global (context *ctxt,
kono
parents:
diff changeset
1282 location *loc,
kono
parents:
diff changeset
1283 enum gcc_jit_global_kind kind,
kono
parents:
diff changeset
1284 type *type,
kono
parents:
diff changeset
1285 string *name)
kono
parents:
diff changeset
1286 : lvalue (ctxt, loc, type),
kono
parents:
diff changeset
1287 m_kind (kind),
kono
parents:
diff changeset
1288 m_name (name)
kono
parents:
diff changeset
1289 {}
kono
parents:
diff changeset
1290
kono
parents:
diff changeset
1291 void replay_into (replayer *) FINAL OVERRIDE;
kono
parents:
diff changeset
1292
kono
parents:
diff changeset
1293 void visit_children (rvalue_visitor *) FINAL OVERRIDE {}
kono
parents:
diff changeset
1294
kono
parents:
diff changeset
1295 void write_to_dump (dump &d) FINAL OVERRIDE;
kono
parents:
diff changeset
1296
kono
parents:
diff changeset
1297 private:
kono
parents:
diff changeset
1298 string * make_debug_string () FINAL OVERRIDE { return m_name; }
kono
parents:
diff changeset
1299 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1300 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1301 {
kono
parents:
diff changeset
1302 return PRECEDENCE_PRIMARY;
kono
parents:
diff changeset
1303 }
kono
parents:
diff changeset
1304
kono
parents:
diff changeset
1305 private:
kono
parents:
diff changeset
1306 enum gcc_jit_global_kind m_kind;
kono
parents:
diff changeset
1307 string *m_name;
kono
parents:
diff changeset
1308 };
kono
parents:
diff changeset
1309
kono
parents:
diff changeset
1310 template <typename HOST_TYPE>
kono
parents:
diff changeset
1311 class memento_of_new_rvalue_from_const : public rvalue
kono
parents:
diff changeset
1312 {
kono
parents:
diff changeset
1313 public:
kono
parents:
diff changeset
1314 memento_of_new_rvalue_from_const (context *ctxt,
kono
parents:
diff changeset
1315 location *loc,
kono
parents:
diff changeset
1316 type *type,
kono
parents:
diff changeset
1317 HOST_TYPE value)
kono
parents:
diff changeset
1318 : rvalue (ctxt, loc, type),
kono
parents:
diff changeset
1319 m_value (value) {}
kono
parents:
diff changeset
1320
kono
parents:
diff changeset
1321 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1322
kono
parents:
diff changeset
1323 void visit_children (rvalue_visitor *) FINAL OVERRIDE {}
kono
parents:
diff changeset
1324
kono
parents:
diff changeset
1325 bool is_constant () const FINAL OVERRIDE { return true; }
kono
parents:
diff changeset
1326
kono
parents:
diff changeset
1327 bool get_wide_int (wide_int *out) const FINAL OVERRIDE;
kono
parents:
diff changeset
1328
kono
parents:
diff changeset
1329 private:
kono
parents:
diff changeset
1330 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1331 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1332 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1333 {
kono
parents:
diff changeset
1334 return PRECEDENCE_PRIMARY;
kono
parents:
diff changeset
1335 }
kono
parents:
diff changeset
1336
kono
parents:
diff changeset
1337 private:
kono
parents:
diff changeset
1338 HOST_TYPE m_value;
kono
parents:
diff changeset
1339 };
kono
parents:
diff changeset
1340
kono
parents:
diff changeset
1341 class memento_of_new_string_literal : public rvalue
kono
parents:
diff changeset
1342 {
kono
parents:
diff changeset
1343 public:
kono
parents:
diff changeset
1344 memento_of_new_string_literal (context *ctxt,
kono
parents:
diff changeset
1345 location *loc,
kono
parents:
diff changeset
1346 string *value)
kono
parents:
diff changeset
1347 : rvalue (ctxt, loc, ctxt->get_type (GCC_JIT_TYPE_CONST_CHAR_PTR)),
kono
parents:
diff changeset
1348 m_value (value) {}
kono
parents:
diff changeset
1349
kono
parents:
diff changeset
1350 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1351
kono
parents:
diff changeset
1352 void visit_children (rvalue_visitor *) FINAL OVERRIDE {}
kono
parents:
diff changeset
1353
kono
parents:
diff changeset
1354 private:
kono
parents:
diff changeset
1355 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1356 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1357 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1358 {
kono
parents:
diff changeset
1359 return PRECEDENCE_PRIMARY;
kono
parents:
diff changeset
1360 }
kono
parents:
diff changeset
1361
kono
parents:
diff changeset
1362 private:
kono
parents:
diff changeset
1363 string *m_value;
kono
parents:
diff changeset
1364 };
kono
parents:
diff changeset
1365
kono
parents:
diff changeset
1366 class memento_of_new_rvalue_from_vector : public rvalue
kono
parents:
diff changeset
1367 {
kono
parents:
diff changeset
1368 public:
kono
parents:
diff changeset
1369 memento_of_new_rvalue_from_vector (context *ctxt,
kono
parents:
diff changeset
1370 location *loc,
kono
parents:
diff changeset
1371 vector_type *type,
kono
parents:
diff changeset
1372 rvalue **elements);
kono
parents:
diff changeset
1373
kono
parents:
diff changeset
1374 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1375
kono
parents:
diff changeset
1376 void visit_children (rvalue_visitor *) FINAL OVERRIDE;
kono
parents:
diff changeset
1377
kono
parents:
diff changeset
1378 private:
kono
parents:
diff changeset
1379 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1380 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1381 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1382 {
kono
parents:
diff changeset
1383 return PRECEDENCE_PRIMARY;
kono
parents:
diff changeset
1384 }
kono
parents:
diff changeset
1385
kono
parents:
diff changeset
1386 private:
kono
parents:
diff changeset
1387 vector_type *m_vector_type;
kono
parents:
diff changeset
1388 auto_vec<rvalue *> m_elements;
kono
parents:
diff changeset
1389 };
kono
parents:
diff changeset
1390
kono
parents:
diff changeset
1391 class unary_op : public rvalue
kono
parents:
diff changeset
1392 {
kono
parents:
diff changeset
1393 public:
kono
parents:
diff changeset
1394 unary_op (context *ctxt,
kono
parents:
diff changeset
1395 location *loc,
kono
parents:
diff changeset
1396 enum gcc_jit_unary_op op,
kono
parents:
diff changeset
1397 type *result_type,
kono
parents:
diff changeset
1398 rvalue *a)
kono
parents:
diff changeset
1399 : rvalue (ctxt, loc, result_type),
kono
parents:
diff changeset
1400 m_op (op),
kono
parents:
diff changeset
1401 m_a (a)
kono
parents:
diff changeset
1402 {}
kono
parents:
diff changeset
1403
kono
parents:
diff changeset
1404 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1405
kono
parents:
diff changeset
1406 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1407
kono
parents:
diff changeset
1408 private:
kono
parents:
diff changeset
1409 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1410 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1411 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1412 {
kono
parents:
diff changeset
1413 return PRECEDENCE_UNARY;
kono
parents:
diff changeset
1414 }
kono
parents:
diff changeset
1415
kono
parents:
diff changeset
1416 private:
kono
parents:
diff changeset
1417 enum gcc_jit_unary_op m_op;
kono
parents:
diff changeset
1418 rvalue *m_a;
kono
parents:
diff changeset
1419 };
kono
parents:
diff changeset
1420
kono
parents:
diff changeset
1421 class binary_op : public rvalue
kono
parents:
diff changeset
1422 {
kono
parents:
diff changeset
1423 public:
kono
parents:
diff changeset
1424 binary_op (context *ctxt,
kono
parents:
diff changeset
1425 location *loc,
kono
parents:
diff changeset
1426 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
1427 type *result_type,
kono
parents:
diff changeset
1428 rvalue *a, rvalue *b)
kono
parents:
diff changeset
1429 : rvalue (ctxt, loc, result_type),
kono
parents:
diff changeset
1430 m_op (op),
kono
parents:
diff changeset
1431 m_a (a),
kono
parents:
diff changeset
1432 m_b (b) {}
kono
parents:
diff changeset
1433
kono
parents:
diff changeset
1434 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1435
kono
parents:
diff changeset
1436 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1437
kono
parents:
diff changeset
1438 private:
kono
parents:
diff changeset
1439 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1440 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1441 enum precedence get_precedence () const FINAL OVERRIDE;
kono
parents:
diff changeset
1442
kono
parents:
diff changeset
1443 private:
kono
parents:
diff changeset
1444 enum gcc_jit_binary_op m_op;
kono
parents:
diff changeset
1445 rvalue *m_a;
kono
parents:
diff changeset
1446 rvalue *m_b;
kono
parents:
diff changeset
1447 };
kono
parents:
diff changeset
1448
kono
parents:
diff changeset
1449 class comparison : public rvalue
kono
parents:
diff changeset
1450 {
kono
parents:
diff changeset
1451 public:
kono
parents:
diff changeset
1452 comparison (context *ctxt,
kono
parents:
diff changeset
1453 location *loc,
kono
parents:
diff changeset
1454 enum gcc_jit_comparison op,
kono
parents:
diff changeset
1455 rvalue *a, rvalue *b)
kono
parents:
diff changeset
1456 : rvalue (ctxt, loc, ctxt->get_type (GCC_JIT_TYPE_BOOL)),
kono
parents:
diff changeset
1457 m_op (op),
kono
parents:
diff changeset
1458 m_a (a),
kono
parents:
diff changeset
1459 m_b (b)
kono
parents:
diff changeset
1460 {}
kono
parents:
diff changeset
1461
kono
parents:
diff changeset
1462 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1463
kono
parents:
diff changeset
1464 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1465
kono
parents:
diff changeset
1466 private:
kono
parents:
diff changeset
1467 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1468 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1469 enum precedence get_precedence () const FINAL OVERRIDE;
kono
parents:
diff changeset
1470
kono
parents:
diff changeset
1471 private:
kono
parents:
diff changeset
1472 enum gcc_jit_comparison m_op;
kono
parents:
diff changeset
1473 rvalue *m_a;
kono
parents:
diff changeset
1474 rvalue *m_b;
kono
parents:
diff changeset
1475 };
kono
parents:
diff changeset
1476
kono
parents:
diff changeset
1477 class cast : public rvalue
kono
parents:
diff changeset
1478 {
kono
parents:
diff changeset
1479 public:
kono
parents:
diff changeset
1480 cast (context *ctxt,
kono
parents:
diff changeset
1481 location *loc,
kono
parents:
diff changeset
1482 rvalue *a,
kono
parents:
diff changeset
1483 type *type_)
kono
parents:
diff changeset
1484 : rvalue (ctxt, loc, type_),
kono
parents:
diff changeset
1485 m_rvalue (a)
kono
parents:
diff changeset
1486 {}
kono
parents:
diff changeset
1487
kono
parents:
diff changeset
1488 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1489
kono
parents:
diff changeset
1490 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1491
kono
parents:
diff changeset
1492 private:
kono
parents:
diff changeset
1493 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1494 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1495 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1496 {
kono
parents:
diff changeset
1497 return PRECEDENCE_CAST;
kono
parents:
diff changeset
1498 }
kono
parents:
diff changeset
1499
kono
parents:
diff changeset
1500 private:
kono
parents:
diff changeset
1501 rvalue *m_rvalue;
kono
parents:
diff changeset
1502 };
kono
parents:
diff changeset
1503
kono
parents:
diff changeset
1504 class base_call : public rvalue
kono
parents:
diff changeset
1505 {
kono
parents:
diff changeset
1506 public:
kono
parents:
diff changeset
1507 base_call (context *ctxt,
kono
parents:
diff changeset
1508 location *loc,
kono
parents:
diff changeset
1509 type *type_,
kono
parents:
diff changeset
1510 int numargs,
kono
parents:
diff changeset
1511 rvalue **args);
kono
parents:
diff changeset
1512
kono
parents:
diff changeset
1513 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1514 {
kono
parents:
diff changeset
1515 return PRECEDENCE_POSTFIX;
kono
parents:
diff changeset
1516 }
kono
parents:
diff changeset
1517
kono
parents:
diff changeset
1518 base_call *dyn_cast_base_call () FINAL OVERRIDE { return this; }
kono
parents:
diff changeset
1519
kono
parents:
diff changeset
1520 void set_require_tail_call (bool require_tail_call)
kono
parents:
diff changeset
1521 {
kono
parents:
diff changeset
1522 m_require_tail_call = require_tail_call;
kono
parents:
diff changeset
1523 }
kono
parents:
diff changeset
1524
kono
parents:
diff changeset
1525 protected:
kono
parents:
diff changeset
1526 void write_reproducer_tail_call (reproducer &r, const char *id);
kono
parents:
diff changeset
1527
kono
parents:
diff changeset
1528 protected:
kono
parents:
diff changeset
1529 auto_vec<rvalue *> m_args;
kono
parents:
diff changeset
1530 bool m_require_tail_call;
kono
parents:
diff changeset
1531 };
kono
parents:
diff changeset
1532
kono
parents:
diff changeset
1533 class call : public base_call
kono
parents:
diff changeset
1534 {
kono
parents:
diff changeset
1535 public:
kono
parents:
diff changeset
1536 call (context *ctxt,
kono
parents:
diff changeset
1537 location *loc,
kono
parents:
diff changeset
1538 function *func,
kono
parents:
diff changeset
1539 int numargs,
kono
parents:
diff changeset
1540 rvalue **args);
kono
parents:
diff changeset
1541
kono
parents:
diff changeset
1542 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1543
kono
parents:
diff changeset
1544 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1545
kono
parents:
diff changeset
1546 private:
kono
parents:
diff changeset
1547 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1548 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1549
kono
parents:
diff changeset
1550 private:
kono
parents:
diff changeset
1551 function *m_func;
kono
parents:
diff changeset
1552 };
kono
parents:
diff changeset
1553
kono
parents:
diff changeset
1554 class call_through_ptr : public base_call
kono
parents:
diff changeset
1555 {
kono
parents:
diff changeset
1556 public:
kono
parents:
diff changeset
1557 call_through_ptr (context *ctxt,
kono
parents:
diff changeset
1558 location *loc,
kono
parents:
diff changeset
1559 rvalue *fn_ptr,
kono
parents:
diff changeset
1560 int numargs,
kono
parents:
diff changeset
1561 rvalue **args);
kono
parents:
diff changeset
1562
kono
parents:
diff changeset
1563 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1564
kono
parents:
diff changeset
1565 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1566
kono
parents:
diff changeset
1567 private:
kono
parents:
diff changeset
1568 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1569 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1570
kono
parents:
diff changeset
1571 private:
kono
parents:
diff changeset
1572 rvalue *m_fn_ptr;
kono
parents:
diff changeset
1573 };
kono
parents:
diff changeset
1574
kono
parents:
diff changeset
1575 class array_access : public lvalue
kono
parents:
diff changeset
1576 {
kono
parents:
diff changeset
1577 public:
kono
parents:
diff changeset
1578 array_access (context *ctxt,
kono
parents:
diff changeset
1579 location *loc,
kono
parents:
diff changeset
1580 rvalue *ptr,
kono
parents:
diff changeset
1581 rvalue *index)
kono
parents:
diff changeset
1582 : lvalue (ctxt, loc, ptr->get_type ()->dereference ()),
kono
parents:
diff changeset
1583 m_ptr (ptr),
kono
parents:
diff changeset
1584 m_index (index)
kono
parents:
diff changeset
1585 {}
kono
parents:
diff changeset
1586
kono
parents:
diff changeset
1587 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1588
kono
parents:
diff changeset
1589 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1590
kono
parents:
diff changeset
1591 private:
kono
parents:
diff changeset
1592 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1593 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1594 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1595 {
kono
parents:
diff changeset
1596 return PRECEDENCE_POSTFIX;
kono
parents:
diff changeset
1597 }
kono
parents:
diff changeset
1598
kono
parents:
diff changeset
1599 private:
kono
parents:
diff changeset
1600 rvalue *m_ptr;
kono
parents:
diff changeset
1601 rvalue *m_index;
kono
parents:
diff changeset
1602 };
kono
parents:
diff changeset
1603
kono
parents:
diff changeset
1604 class access_field_of_lvalue : public lvalue
kono
parents:
diff changeset
1605 {
kono
parents:
diff changeset
1606 public:
kono
parents:
diff changeset
1607 access_field_of_lvalue (context *ctxt,
kono
parents:
diff changeset
1608 location *loc,
kono
parents:
diff changeset
1609 lvalue *val,
kono
parents:
diff changeset
1610 field *field)
kono
parents:
diff changeset
1611 : lvalue (ctxt, loc, field->get_type ()),
kono
parents:
diff changeset
1612 m_lvalue (val),
kono
parents:
diff changeset
1613 m_field (field)
kono
parents:
diff changeset
1614 {}
kono
parents:
diff changeset
1615
kono
parents:
diff changeset
1616 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1617
kono
parents:
diff changeset
1618 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1619
kono
parents:
diff changeset
1620 private:
kono
parents:
diff changeset
1621 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1622 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1623 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1624 {
kono
parents:
diff changeset
1625 return PRECEDENCE_POSTFIX;
kono
parents:
diff changeset
1626 }
kono
parents:
diff changeset
1627
kono
parents:
diff changeset
1628 private:
kono
parents:
diff changeset
1629 lvalue *m_lvalue;
kono
parents:
diff changeset
1630 field *m_field;
kono
parents:
diff changeset
1631 };
kono
parents:
diff changeset
1632
kono
parents:
diff changeset
1633 class access_field_rvalue : public rvalue
kono
parents:
diff changeset
1634 {
kono
parents:
diff changeset
1635 public:
kono
parents:
diff changeset
1636 access_field_rvalue (context *ctxt,
kono
parents:
diff changeset
1637 location *loc,
kono
parents:
diff changeset
1638 rvalue *val,
kono
parents:
diff changeset
1639 field *field)
kono
parents:
diff changeset
1640 : rvalue (ctxt, loc, field->get_type ()),
kono
parents:
diff changeset
1641 m_rvalue (val),
kono
parents:
diff changeset
1642 m_field (field)
kono
parents:
diff changeset
1643 {}
kono
parents:
diff changeset
1644
kono
parents:
diff changeset
1645 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1646
kono
parents:
diff changeset
1647 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1648
kono
parents:
diff changeset
1649 private:
kono
parents:
diff changeset
1650 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1651 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1652 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1653 {
kono
parents:
diff changeset
1654 return PRECEDENCE_POSTFIX;
kono
parents:
diff changeset
1655 }
kono
parents:
diff changeset
1656
kono
parents:
diff changeset
1657 private:
kono
parents:
diff changeset
1658 rvalue *m_rvalue;
kono
parents:
diff changeset
1659 field *m_field;
kono
parents:
diff changeset
1660 };
kono
parents:
diff changeset
1661
kono
parents:
diff changeset
1662 class dereference_field_rvalue : public lvalue
kono
parents:
diff changeset
1663 {
kono
parents:
diff changeset
1664 public:
kono
parents:
diff changeset
1665 dereference_field_rvalue (context *ctxt,
kono
parents:
diff changeset
1666 location *loc,
kono
parents:
diff changeset
1667 rvalue *val,
kono
parents:
diff changeset
1668 field *field)
kono
parents:
diff changeset
1669 : lvalue (ctxt, loc, field->get_type ()),
kono
parents:
diff changeset
1670 m_rvalue (val),
kono
parents:
diff changeset
1671 m_field (field)
kono
parents:
diff changeset
1672 {}
kono
parents:
diff changeset
1673
kono
parents:
diff changeset
1674 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1675
kono
parents:
diff changeset
1676 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1677
kono
parents:
diff changeset
1678 private:
kono
parents:
diff changeset
1679 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1680 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1681 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1682 {
kono
parents:
diff changeset
1683 return PRECEDENCE_POSTFIX;
kono
parents:
diff changeset
1684 }
kono
parents:
diff changeset
1685
kono
parents:
diff changeset
1686 private:
kono
parents:
diff changeset
1687 rvalue *m_rvalue;
kono
parents:
diff changeset
1688 field *m_field;
kono
parents:
diff changeset
1689 };
kono
parents:
diff changeset
1690
kono
parents:
diff changeset
1691 class dereference_rvalue : public lvalue
kono
parents:
diff changeset
1692 {
kono
parents:
diff changeset
1693 public:
kono
parents:
diff changeset
1694 dereference_rvalue (context *ctxt,
kono
parents:
diff changeset
1695 location *loc,
kono
parents:
diff changeset
1696 rvalue *val)
kono
parents:
diff changeset
1697 : lvalue (ctxt, loc, val->get_type ()->dereference ()),
kono
parents:
diff changeset
1698 m_rvalue (val) {}
kono
parents:
diff changeset
1699
kono
parents:
diff changeset
1700 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1701
kono
parents:
diff changeset
1702 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1703
kono
parents:
diff changeset
1704 private:
kono
parents:
diff changeset
1705 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1706 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1707 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1708 {
kono
parents:
diff changeset
1709 return PRECEDENCE_UNARY;
kono
parents:
diff changeset
1710 }
kono
parents:
diff changeset
1711
kono
parents:
diff changeset
1712 private:
kono
parents:
diff changeset
1713 rvalue *m_rvalue;
kono
parents:
diff changeset
1714 };
kono
parents:
diff changeset
1715
kono
parents:
diff changeset
1716 class get_address_of_lvalue : public rvalue
kono
parents:
diff changeset
1717 {
kono
parents:
diff changeset
1718 public:
kono
parents:
diff changeset
1719 get_address_of_lvalue (context *ctxt,
kono
parents:
diff changeset
1720 location *loc,
kono
parents:
diff changeset
1721 lvalue *val)
kono
parents:
diff changeset
1722 : rvalue (ctxt, loc, val->get_type ()->get_pointer ()),
kono
parents:
diff changeset
1723 m_lvalue (val)
kono
parents:
diff changeset
1724 {}
kono
parents:
diff changeset
1725
kono
parents:
diff changeset
1726 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1727
kono
parents:
diff changeset
1728 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1729
kono
parents:
diff changeset
1730 private:
kono
parents:
diff changeset
1731 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1732 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1733 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1734 {
kono
parents:
diff changeset
1735 return PRECEDENCE_UNARY;
kono
parents:
diff changeset
1736 }
kono
parents:
diff changeset
1737
kono
parents:
diff changeset
1738 private:
kono
parents:
diff changeset
1739 lvalue *m_lvalue;
kono
parents:
diff changeset
1740 };
kono
parents:
diff changeset
1741
kono
parents:
diff changeset
1742 class function_pointer : public rvalue
kono
parents:
diff changeset
1743 {
kono
parents:
diff changeset
1744 public:
kono
parents:
diff changeset
1745 function_pointer (context *ctxt,
kono
parents:
diff changeset
1746 location *loc,
kono
parents:
diff changeset
1747 function *fn,
kono
parents:
diff changeset
1748 type *type)
kono
parents:
diff changeset
1749 : rvalue (ctxt, loc, type),
kono
parents:
diff changeset
1750 m_fn (fn) {}
kono
parents:
diff changeset
1751
kono
parents:
diff changeset
1752 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1753
kono
parents:
diff changeset
1754 void visit_children (rvalue_visitor *v) FINAL OVERRIDE;
kono
parents:
diff changeset
1755
kono
parents:
diff changeset
1756 private:
kono
parents:
diff changeset
1757 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1758 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1759 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1760 {
kono
parents:
diff changeset
1761 return PRECEDENCE_UNARY;
kono
parents:
diff changeset
1762 }
kono
parents:
diff changeset
1763
kono
parents:
diff changeset
1764 private:
kono
parents:
diff changeset
1765 function *m_fn;
kono
parents:
diff changeset
1766 };
kono
parents:
diff changeset
1767
kono
parents:
diff changeset
1768 class local : public lvalue
kono
parents:
diff changeset
1769 {
kono
parents:
diff changeset
1770 public:
kono
parents:
diff changeset
1771 local (function *func, location *loc, type *type_, string *name)
kono
parents:
diff changeset
1772 : lvalue (func->m_ctxt, loc, type_),
kono
parents:
diff changeset
1773 m_func (func),
kono
parents:
diff changeset
1774 m_name (name)
kono
parents:
diff changeset
1775 {
kono
parents:
diff changeset
1776 set_scope (func);
kono
parents:
diff changeset
1777 }
kono
parents:
diff changeset
1778
kono
parents:
diff changeset
1779 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1780
kono
parents:
diff changeset
1781 void visit_children (rvalue_visitor *) FINAL OVERRIDE {}
kono
parents:
diff changeset
1782
kono
parents:
diff changeset
1783 void write_to_dump (dump &d) FINAL OVERRIDE;
kono
parents:
diff changeset
1784
kono
parents:
diff changeset
1785 private:
kono
parents:
diff changeset
1786 string * make_debug_string () FINAL OVERRIDE { return m_name; }
kono
parents:
diff changeset
1787 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1788 enum precedence get_precedence () const FINAL OVERRIDE
kono
parents:
diff changeset
1789 {
kono
parents:
diff changeset
1790 return PRECEDENCE_PRIMARY;
kono
parents:
diff changeset
1791 }
kono
parents:
diff changeset
1792
kono
parents:
diff changeset
1793 private:
kono
parents:
diff changeset
1794 function *m_func;
kono
parents:
diff changeset
1795 string *m_name;
kono
parents:
diff changeset
1796 };
kono
parents:
diff changeset
1797
kono
parents:
diff changeset
1798 class statement : public memento
kono
parents:
diff changeset
1799 {
kono
parents:
diff changeset
1800 public:
kono
parents:
diff changeset
1801 virtual vec <block *> get_successor_blocks () const;
kono
parents:
diff changeset
1802
kono
parents:
diff changeset
1803 void write_to_dump (dump &d) FINAL OVERRIDE;
kono
parents:
diff changeset
1804
kono
parents:
diff changeset
1805 block *get_block () const { return m_block; }
kono
parents:
diff changeset
1806 location *get_loc () const { return m_loc; }
kono
parents:
diff changeset
1807
kono
parents:
diff changeset
1808 protected:
kono
parents:
diff changeset
1809 statement (block *b, location *loc)
kono
parents:
diff changeset
1810 : memento (b->m_ctxt),
kono
parents:
diff changeset
1811 m_block (b),
kono
parents:
diff changeset
1812 m_loc (loc) {}
kono
parents:
diff changeset
1813
kono
parents:
diff changeset
1814 playback::location *
kono
parents:
diff changeset
1815 playback_location (replayer *r) const
kono
parents:
diff changeset
1816 {
kono
parents:
diff changeset
1817 return ::gcc::jit::recording::playback_location (r, m_loc);
kono
parents:
diff changeset
1818 }
kono
parents:
diff changeset
1819
kono
parents:
diff changeset
1820 private:
kono
parents:
diff changeset
1821 block *m_block;
kono
parents:
diff changeset
1822 location *m_loc;
kono
parents:
diff changeset
1823 };
kono
parents:
diff changeset
1824
kono
parents:
diff changeset
1825 class eval : public statement
kono
parents:
diff changeset
1826 {
kono
parents:
diff changeset
1827 public:
kono
parents:
diff changeset
1828 eval (block *b,
kono
parents:
diff changeset
1829 location *loc,
kono
parents:
diff changeset
1830 rvalue *rvalue)
kono
parents:
diff changeset
1831 : statement (b, loc),
kono
parents:
diff changeset
1832 m_rvalue (rvalue) {}
kono
parents:
diff changeset
1833
kono
parents:
diff changeset
1834 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1835
kono
parents:
diff changeset
1836 private:
kono
parents:
diff changeset
1837 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1838 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1839
kono
parents:
diff changeset
1840 private:
kono
parents:
diff changeset
1841 rvalue *m_rvalue;
kono
parents:
diff changeset
1842 };
kono
parents:
diff changeset
1843
kono
parents:
diff changeset
1844 class assignment : public statement
kono
parents:
diff changeset
1845 {
kono
parents:
diff changeset
1846 public:
kono
parents:
diff changeset
1847 assignment (block *b,
kono
parents:
diff changeset
1848 location *loc,
kono
parents:
diff changeset
1849 lvalue *lvalue,
kono
parents:
diff changeset
1850 rvalue *rvalue)
kono
parents:
diff changeset
1851 : statement (b, loc),
kono
parents:
diff changeset
1852 m_lvalue (lvalue),
kono
parents:
diff changeset
1853 m_rvalue (rvalue) {}
kono
parents:
diff changeset
1854
kono
parents:
diff changeset
1855 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1856
kono
parents:
diff changeset
1857 private:
kono
parents:
diff changeset
1858 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1859 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1860
kono
parents:
diff changeset
1861 private:
kono
parents:
diff changeset
1862 lvalue *m_lvalue;
kono
parents:
diff changeset
1863 rvalue *m_rvalue;
kono
parents:
diff changeset
1864 };
kono
parents:
diff changeset
1865
kono
parents:
diff changeset
1866 class assignment_op : public statement
kono
parents:
diff changeset
1867 {
kono
parents:
diff changeset
1868 public:
kono
parents:
diff changeset
1869 assignment_op (block *b,
kono
parents:
diff changeset
1870 location *loc,
kono
parents:
diff changeset
1871 lvalue *lvalue,
kono
parents:
diff changeset
1872 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
1873 rvalue *rvalue)
kono
parents:
diff changeset
1874 : statement (b, loc),
kono
parents:
diff changeset
1875 m_lvalue (lvalue),
kono
parents:
diff changeset
1876 m_op (op),
kono
parents:
diff changeset
1877 m_rvalue (rvalue) {}
kono
parents:
diff changeset
1878
kono
parents:
diff changeset
1879 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1880
kono
parents:
diff changeset
1881 private:
kono
parents:
diff changeset
1882 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1883 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1884
kono
parents:
diff changeset
1885 private:
kono
parents:
diff changeset
1886 lvalue *m_lvalue;
kono
parents:
diff changeset
1887 enum gcc_jit_binary_op m_op;
kono
parents:
diff changeset
1888 rvalue *m_rvalue;
kono
parents:
diff changeset
1889 };
kono
parents:
diff changeset
1890
kono
parents:
diff changeset
1891 class comment : public statement
kono
parents:
diff changeset
1892 {
kono
parents:
diff changeset
1893 public:
kono
parents:
diff changeset
1894 comment (block *b,
kono
parents:
diff changeset
1895 location *loc,
kono
parents:
diff changeset
1896 string *text)
kono
parents:
diff changeset
1897 : statement (b, loc),
kono
parents:
diff changeset
1898 m_text (text) {}
kono
parents:
diff changeset
1899
kono
parents:
diff changeset
1900 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1901
kono
parents:
diff changeset
1902 private:
kono
parents:
diff changeset
1903 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1904 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1905
kono
parents:
diff changeset
1906 private:
kono
parents:
diff changeset
1907 string *m_text;
kono
parents:
diff changeset
1908 };
kono
parents:
diff changeset
1909
kono
parents:
diff changeset
1910 class conditional : public statement
kono
parents:
diff changeset
1911 {
kono
parents:
diff changeset
1912 public:
kono
parents:
diff changeset
1913 conditional (block *b,
kono
parents:
diff changeset
1914 location *loc,
kono
parents:
diff changeset
1915 rvalue *boolval,
kono
parents:
diff changeset
1916 block *on_true,
kono
parents:
diff changeset
1917 block *on_false)
kono
parents:
diff changeset
1918 : statement (b, loc),
kono
parents:
diff changeset
1919 m_boolval (boolval),
kono
parents:
diff changeset
1920 m_on_true (on_true),
kono
parents:
diff changeset
1921 m_on_false (on_false) {}
kono
parents:
diff changeset
1922
kono
parents:
diff changeset
1923 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1924
kono
parents:
diff changeset
1925 vec <block *> get_successor_blocks () const FINAL OVERRIDE;
kono
parents:
diff changeset
1926
kono
parents:
diff changeset
1927 private:
kono
parents:
diff changeset
1928 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1929 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1930
kono
parents:
diff changeset
1931 private:
kono
parents:
diff changeset
1932 rvalue *m_boolval;
kono
parents:
diff changeset
1933 block *m_on_true;
kono
parents:
diff changeset
1934 block *m_on_false;
kono
parents:
diff changeset
1935 };
kono
parents:
diff changeset
1936
kono
parents:
diff changeset
1937 class jump : public statement
kono
parents:
diff changeset
1938 {
kono
parents:
diff changeset
1939 public:
kono
parents:
diff changeset
1940 jump (block *b,
kono
parents:
diff changeset
1941 location *loc,
kono
parents:
diff changeset
1942 block *target)
kono
parents:
diff changeset
1943 : statement (b, loc),
kono
parents:
diff changeset
1944 m_target (target) {}
kono
parents:
diff changeset
1945
kono
parents:
diff changeset
1946 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1947
kono
parents:
diff changeset
1948 vec <block *> get_successor_blocks () const FINAL OVERRIDE;
kono
parents:
diff changeset
1949
kono
parents:
diff changeset
1950 private:
kono
parents:
diff changeset
1951 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1952 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1953
kono
parents:
diff changeset
1954 private:
kono
parents:
diff changeset
1955 block *m_target;
kono
parents:
diff changeset
1956 };
kono
parents:
diff changeset
1957
kono
parents:
diff changeset
1958 class return_ : public statement
kono
parents:
diff changeset
1959 {
kono
parents:
diff changeset
1960 public:
kono
parents:
diff changeset
1961 return_ (block *b,
kono
parents:
diff changeset
1962 location *loc,
kono
parents:
diff changeset
1963 rvalue *rvalue)
kono
parents:
diff changeset
1964 : statement (b, loc),
kono
parents:
diff changeset
1965 m_rvalue (rvalue) {}
kono
parents:
diff changeset
1966
kono
parents:
diff changeset
1967 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
1968
kono
parents:
diff changeset
1969 vec <block *> get_successor_blocks () const FINAL OVERRIDE;
kono
parents:
diff changeset
1970
kono
parents:
diff changeset
1971 private:
kono
parents:
diff changeset
1972 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
1973 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1974
kono
parents:
diff changeset
1975 private:
kono
parents:
diff changeset
1976 rvalue *m_rvalue;
kono
parents:
diff changeset
1977 };
kono
parents:
diff changeset
1978
kono
parents:
diff changeset
1979 class case_ : public memento
kono
parents:
diff changeset
1980 {
kono
parents:
diff changeset
1981 public:
kono
parents:
diff changeset
1982 case_ (context *ctxt,
kono
parents:
diff changeset
1983 rvalue *min_value,
kono
parents:
diff changeset
1984 rvalue *max_value,
kono
parents:
diff changeset
1985 block *dest_block)
kono
parents:
diff changeset
1986 : memento (ctxt),
kono
parents:
diff changeset
1987 m_min_value (min_value),
kono
parents:
diff changeset
1988 m_max_value (max_value),
kono
parents:
diff changeset
1989 m_dest_block (dest_block)
kono
parents:
diff changeset
1990 {}
kono
parents:
diff changeset
1991
kono
parents:
diff changeset
1992 rvalue *get_min_value () const { return m_min_value; }
kono
parents:
diff changeset
1993 rvalue *get_max_value () const { return m_max_value; }
kono
parents:
diff changeset
1994 block *get_dest_block () const { return m_dest_block; }
kono
parents:
diff changeset
1995
kono
parents:
diff changeset
1996 void replay_into (replayer *) FINAL OVERRIDE { /* empty */ }
kono
parents:
diff changeset
1997
kono
parents:
diff changeset
1998 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
1999
kono
parents:
diff changeset
2000 private:
kono
parents:
diff changeset
2001 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
2002
kono
parents:
diff changeset
2003 private:
kono
parents:
diff changeset
2004 rvalue *m_min_value;
kono
parents:
diff changeset
2005 rvalue *m_max_value;
kono
parents:
diff changeset
2006 block *m_dest_block;
kono
parents:
diff changeset
2007 };
kono
parents:
diff changeset
2008
kono
parents:
diff changeset
2009 class switch_ : public statement
kono
parents:
diff changeset
2010 {
kono
parents:
diff changeset
2011 public:
kono
parents:
diff changeset
2012 switch_ (block *b,
kono
parents:
diff changeset
2013 location *loc,
kono
parents:
diff changeset
2014 rvalue *expr,
kono
parents:
diff changeset
2015 block *default_block,
kono
parents:
diff changeset
2016 int num_cases,
kono
parents:
diff changeset
2017 case_ **cases);
kono
parents:
diff changeset
2018
kono
parents:
diff changeset
2019 void replay_into (replayer *r) FINAL OVERRIDE;
kono
parents:
diff changeset
2020
kono
parents:
diff changeset
2021 vec <block *> get_successor_blocks () const FINAL OVERRIDE;
kono
parents:
diff changeset
2022
kono
parents:
diff changeset
2023 private:
kono
parents:
diff changeset
2024 string * make_debug_string () FINAL OVERRIDE;
kono
parents:
diff changeset
2025 void write_reproducer (reproducer &r) FINAL OVERRIDE;
kono
parents:
diff changeset
2026
kono
parents:
diff changeset
2027 private:
kono
parents:
diff changeset
2028 rvalue *m_expr;
kono
parents:
diff changeset
2029 block *m_default_block;
kono
parents:
diff changeset
2030 auto_vec <case_ *> m_cases;
kono
parents:
diff changeset
2031 };
kono
parents:
diff changeset
2032
kono
parents:
diff changeset
2033 } // namespace gcc::jit::recording
kono
parents:
diff changeset
2034
kono
parents:
diff changeset
2035 /* Create a recording::memento_of_new_rvalue_from_const instance and add
kono
parents:
diff changeset
2036 it to this context's list of mementos.
kono
parents:
diff changeset
2037
kono
parents:
diff changeset
2038 Implements the post-error-checking part of
kono
parents:
diff changeset
2039 gcc_jit_context_new_rvalue_from_{int|long|double|ptr}. */
kono
parents:
diff changeset
2040
kono
parents:
diff changeset
2041 template <typename HOST_TYPE>
kono
parents:
diff changeset
2042 recording::rvalue *
kono
parents:
diff changeset
2043 recording::context::new_rvalue_from_const (recording::type *type,
kono
parents:
diff changeset
2044 HOST_TYPE value)
kono
parents:
diff changeset
2045 {
kono
parents:
diff changeset
2046 recording::rvalue *result =
kono
parents:
diff changeset
2047 new memento_of_new_rvalue_from_const <HOST_TYPE> (this, NULL, type, value);
kono
parents:
diff changeset
2048 record (result);
kono
parents:
diff changeset
2049 return result;
kono
parents:
diff changeset
2050 }
kono
parents:
diff changeset
2051
kono
parents:
diff changeset
2052 } // namespace gcc::jit
kono
parents:
diff changeset
2053
kono
parents:
diff changeset
2054 } // namespace gcc
kono
parents:
diff changeset
2055
kono
parents:
diff changeset
2056 #endif /* JIT_RECORDING_H */