annotate gcc/jit/jit-playback.h @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Internals of libgccjit: classes for playing back recorded API calls.
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_PLAYBACK_H
kono
parents:
diff changeset
22 #define JIT_PLAYBACK_H
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 #include <utility> // for std::pair
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 #include "timevar.h"
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 #include "jit-recording.h"
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 struct diagnostic_context;
kono
parents:
diff changeset
31 struct diagnostic_info;
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 namespace gcc {
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 namespace jit {
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 /**********************************************************************
kono
parents:
diff changeset
38 Playback.
kono
parents:
diff changeset
39 **********************************************************************/
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 namespace playback {
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 /* playback::context is an abstract base class.
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 The two concrete subclasses are:
kono
parents:
diff changeset
46 - playback::compile_to_memory
kono
parents:
diff changeset
47 - playback::compile_to_file. */
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 class context : public log_user
kono
parents:
diff changeset
50 {
kono
parents:
diff changeset
51 public:
kono
parents:
diff changeset
52 context (::gcc::jit::recording::context *ctxt);
kono
parents:
diff changeset
53 ~context ();
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 void gt_ggc_mx ();
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 void replay ();
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 location *
kono
parents:
diff changeset
60 new_location (recording::location *rloc,
kono
parents:
diff changeset
61 const char *filename,
kono
parents:
diff changeset
62 int line,
kono
parents:
diff changeset
63 int column);
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 type *
kono
parents:
diff changeset
66 get_type (enum gcc_jit_types type);
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 type *
kono
parents:
diff changeset
69 new_array_type (location *loc,
kono
parents:
diff changeset
70 type *element_type,
kono
parents:
diff changeset
71 int num_elements);
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 field *
kono
parents:
diff changeset
74 new_field (location *loc,
kono
parents:
diff changeset
75 type *type,
kono
parents:
diff changeset
76 const char *name);
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 compound_type *
kono
parents:
diff changeset
79 new_compound_type (location *loc,
kono
parents:
diff changeset
80 const char *name,
kono
parents:
diff changeset
81 bool is_struct); /* else is union */
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 type *
kono
parents:
diff changeset
84 new_function_type (type *return_type,
kono
parents:
diff changeset
85 const auto_vec<type *> *param_types,
kono
parents:
diff changeset
86 int is_variadic);
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 param *
kono
parents:
diff changeset
89 new_param (location *loc,
kono
parents:
diff changeset
90 type *type,
kono
parents:
diff changeset
91 const char *name);
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 function *
kono
parents:
diff changeset
94 new_function (location *loc,
kono
parents:
diff changeset
95 enum gcc_jit_function_kind kind,
kono
parents:
diff changeset
96 type *return_type,
kono
parents:
diff changeset
97 const char *name,
kono
parents:
diff changeset
98 const auto_vec<param *> *params,
kono
parents:
diff changeset
99 int is_variadic,
kono
parents:
diff changeset
100 enum built_in_function builtin_id);
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 lvalue *
kono
parents:
diff changeset
103 new_global (location *loc,
kono
parents:
diff changeset
104 enum gcc_jit_global_kind kind,
kono
parents:
diff changeset
105 type *type,
kono
parents:
diff changeset
106 const char *name);
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 template <typename HOST_TYPE>
kono
parents:
diff changeset
109 rvalue *
kono
parents:
diff changeset
110 new_rvalue_from_const (type *type,
kono
parents:
diff changeset
111 HOST_TYPE value);
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 rvalue *
kono
parents:
diff changeset
114 new_string_literal (const char *value);
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 rvalue *
kono
parents:
diff changeset
117 new_rvalue_from_vector (location *loc,
kono
parents:
diff changeset
118 type *type,
kono
parents:
diff changeset
119 const auto_vec<rvalue *> &elements);
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 rvalue *
kono
parents:
diff changeset
122 new_unary_op (location *loc,
kono
parents:
diff changeset
123 enum gcc_jit_unary_op op,
kono
parents:
diff changeset
124 type *result_type,
kono
parents:
diff changeset
125 rvalue *a);
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 rvalue *
kono
parents:
diff changeset
128 new_binary_op (location *loc,
kono
parents:
diff changeset
129 enum gcc_jit_binary_op op,
kono
parents:
diff changeset
130 type *result_type,
kono
parents:
diff changeset
131 rvalue *a, rvalue *b);
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 rvalue *
kono
parents:
diff changeset
134 new_comparison (location *loc,
kono
parents:
diff changeset
135 enum gcc_jit_comparison op,
kono
parents:
diff changeset
136 rvalue *a, rvalue *b);
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 rvalue *
kono
parents:
diff changeset
139 new_call (location *loc,
kono
parents:
diff changeset
140 function *func,
kono
parents:
diff changeset
141 const auto_vec<rvalue *> *args,
kono
parents:
diff changeset
142 bool require_tail_call);
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 rvalue *
kono
parents:
diff changeset
145 new_call_through_ptr (location *loc,
kono
parents:
diff changeset
146 rvalue *fn_ptr,
kono
parents:
diff changeset
147 const auto_vec<rvalue *> *args,
kono
parents:
diff changeset
148 bool require_tail_call);
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 rvalue *
kono
parents:
diff changeset
151 new_cast (location *loc,
kono
parents:
diff changeset
152 rvalue *expr,
kono
parents:
diff changeset
153 type *type_);
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 lvalue *
kono
parents:
diff changeset
156 new_array_access (location *loc,
kono
parents:
diff changeset
157 rvalue *ptr,
kono
parents:
diff changeset
158 rvalue *index);
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 void
kono
parents:
diff changeset
161 set_str_option (enum gcc_jit_str_option opt,
kono
parents:
diff changeset
162 const char *value);
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 void
kono
parents:
diff changeset
165 set_int_option (enum gcc_jit_int_option opt,
kono
parents:
diff changeset
166 int value);
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 void
kono
parents:
diff changeset
169 set_bool_option (enum gcc_jit_bool_option opt,
kono
parents:
diff changeset
170 int value);
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 const char *
kono
parents:
diff changeset
173 get_str_option (enum gcc_jit_str_option opt) const
kono
parents:
diff changeset
174 {
kono
parents:
diff changeset
175 return m_recording_ctxt->get_str_option (opt);
kono
parents:
diff changeset
176 }
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 int
kono
parents:
diff changeset
179 get_int_option (enum gcc_jit_int_option opt) const
kono
parents:
diff changeset
180 {
kono
parents:
diff changeset
181 return m_recording_ctxt->get_int_option (opt);
kono
parents:
diff changeset
182 }
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 int
kono
parents:
diff changeset
185 get_bool_option (enum gcc_jit_bool_option opt) const
kono
parents:
diff changeset
186 {
kono
parents:
diff changeset
187 return m_recording_ctxt->get_bool_option (opt);
kono
parents:
diff changeset
188 }
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 int
kono
parents:
diff changeset
191 get_inner_bool_option (enum inner_bool_option opt) const
kono
parents:
diff changeset
192 {
kono
parents:
diff changeset
193 return m_recording_ctxt->get_inner_bool_option (opt);
kono
parents:
diff changeset
194 }
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 builtins_manager *get_builtins_manager () const
kono
parents:
diff changeset
197 {
kono
parents:
diff changeset
198 return m_recording_ctxt->get_builtins_manager ();
kono
parents:
diff changeset
199 }
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 void
kono
parents:
diff changeset
202 compile ();
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 void
kono
parents:
diff changeset
205 add_error (location *loc, const char *fmt, ...)
kono
parents:
diff changeset
206 GNU_PRINTF(3, 4);
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 void
kono
parents:
diff changeset
209 add_error_va (location *loc, const char *fmt, va_list ap)
kono
parents:
diff changeset
210 GNU_PRINTF(3, 0);
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 const char *
kono
parents:
diff changeset
213 get_first_error () const;
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 void
kono
parents:
diff changeset
216 add_diagnostic (struct diagnostic_context *context,
kono
parents:
diff changeset
217 struct diagnostic_info *diagnostic);
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 void
kono
parents:
diff changeset
220 set_tree_location (tree t, location *loc);
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 tree
kono
parents:
diff changeset
223 new_field_access (location *loc,
kono
parents:
diff changeset
224 tree datum,
kono
parents:
diff changeset
225 field *field);
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 tree
kono
parents:
diff changeset
228 new_dereference (tree ptr, location *loc);
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 tree
kono
parents:
diff changeset
231 as_truth_value (tree expr, location *loc);
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 bool errors_occurred () const
kono
parents:
diff changeset
234 {
kono
parents:
diff changeset
235 return m_recording_ctxt->errors_occurred ();
kono
parents:
diff changeset
236 }
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 timer *get_timer () const { return m_recording_ctxt->get_timer (); }
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 private:
kono
parents:
diff changeset
241 void dump_generated_code ();
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 rvalue *
kono
parents:
diff changeset
244 build_call (location *loc,
kono
parents:
diff changeset
245 tree fn_ptr,
kono
parents:
diff changeset
246 const auto_vec<rvalue *> *args,
kono
parents:
diff changeset
247 bool require_tail_call);
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 tree
kono
parents:
diff changeset
250 build_cast (location *loc,
kono
parents:
diff changeset
251 rvalue *expr,
kono
parents:
diff changeset
252 type *type_);
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 source_file *
kono
parents:
diff changeset
255 get_source_file (const char *filename);
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 void handle_locations ();
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 const char * get_path_c_file () const;
kono
parents:
diff changeset
260 const char * get_path_s_file () const;
kono
parents:
diff changeset
261 const char * get_path_so_file () const;
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 private:
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 /* Functions for implementing "compile". */
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 void acquire_mutex ();
kono
parents:
diff changeset
268 void release_mutex ();
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 void
kono
parents:
diff changeset
271 make_fake_args (vec <char *> *argvec,
kono
parents:
diff changeset
272 const char *ctxt_progname,
kono
parents:
diff changeset
273 vec <recording::requested_dump> *requested_dumps);
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 void
kono
parents:
diff changeset
276 extract_any_requested_dumps
kono
parents:
diff changeset
277 (vec <recording::requested_dump> *requested_dumps);
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 char *
kono
parents:
diff changeset
280 read_dump_file (const char *path);
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 virtual void postprocess (const char *ctxt_progname) = 0;
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 protected:
kono
parents:
diff changeset
285 tempdir *get_tempdir () { return m_tempdir; }
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 void
kono
parents:
diff changeset
288 convert_to_dso (const char *ctxt_progname);
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 void
kono
parents:
diff changeset
291 invoke_driver (const char *ctxt_progname,
kono
parents:
diff changeset
292 const char *input_file,
kono
parents:
diff changeset
293 const char *output_file,
kono
parents:
diff changeset
294 timevar_id_t tv_id,
kono
parents:
diff changeset
295 bool shared,
kono
parents:
diff changeset
296 bool run_linker);
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 void
kono
parents:
diff changeset
299 add_multilib_driver_arguments (vec <char *> *argvec);
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 result *
kono
parents:
diff changeset
302 dlopen_built_dso ();
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 private:
kono
parents:
diff changeset
305 void
kono
parents:
diff changeset
306 invoke_embedded_driver (const vec <char *> *argvec);
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 void
kono
parents:
diff changeset
309 invoke_external_driver (const char *ctxt_progname,
kono
parents:
diff changeset
310 vec <char *> *argvec);
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 private:
kono
parents:
diff changeset
313 ::gcc::jit::recording::context *m_recording_ctxt;
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 tempdir *m_tempdir;
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 auto_vec<function *> m_functions;
kono
parents:
diff changeset
318 auto_vec<tree> m_globals;
kono
parents:
diff changeset
319 tree m_char_array_type_node;
kono
parents:
diff changeset
320 tree m_const_char_ptr;
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 /* Source location handling. */
kono
parents:
diff changeset
323 auto_vec<source_file *> m_source_files;
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 auto_vec<std::pair<tree, location *> > m_cached_locations;
kono
parents:
diff changeset
326 };
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 class compile_to_memory : public context
kono
parents:
diff changeset
329 {
kono
parents:
diff changeset
330 public:
kono
parents:
diff changeset
331 compile_to_memory (recording::context *ctxt);
kono
parents:
diff changeset
332 void postprocess (const char *ctxt_progname) FINAL OVERRIDE;
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 result *get_result_obj () const { return m_result; }
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 private:
kono
parents:
diff changeset
337 result *m_result;
kono
parents:
diff changeset
338 };
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 class compile_to_file : public context
kono
parents:
diff changeset
341 {
kono
parents:
diff changeset
342 public:
kono
parents:
diff changeset
343 compile_to_file (recording::context *ctxt,
kono
parents:
diff changeset
344 enum gcc_jit_output_kind output_kind,
kono
parents:
diff changeset
345 const char *output_path);
kono
parents:
diff changeset
346 void postprocess (const char *ctxt_progname) FINAL OVERRIDE;
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 private:
kono
parents:
diff changeset
349 void
kono
parents:
diff changeset
350 copy_file (const char *src_path,
kono
parents:
diff changeset
351 const char *dst_path);
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 private:
kono
parents:
diff changeset
354 enum gcc_jit_output_kind m_output_kind;
kono
parents:
diff changeset
355 const char *m_output_path;
kono
parents:
diff changeset
356 };
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 /* A temporary wrapper object.
kono
parents:
diff changeset
360 These objects are (mostly) only valid during replay.
kono
parents:
diff changeset
361 We allocate them on the GC heap, so that they will be cleaned
kono
parents:
diff changeset
362 the next time the GC collects.
kono
parents:
diff changeset
363 The exception is the "function" class, which is tracked and marked by
kono
parents:
diff changeset
364 the jit::context, since it needs to stay alive during post-processing
kono
parents:
diff changeset
365 (when the GC could run). */
kono
parents:
diff changeset
366 class wrapper
kono
parents:
diff changeset
367 {
kono
parents:
diff changeset
368 public:
kono
parents:
diff changeset
369 /* Allocate in the GC heap. */
kono
parents:
diff changeset
370 void *operator new (size_t sz);
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 /* Some wrapper subclasses contain vec<> and so need to
kono
parents:
diff changeset
373 release them when they are GC-ed. */
kono
parents:
diff changeset
374 virtual void finalizer () { }
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 };
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 class type : public wrapper
kono
parents:
diff changeset
379 {
kono
parents:
diff changeset
380 public:
kono
parents:
diff changeset
381 type (tree inner)
kono
parents:
diff changeset
382 : m_inner(inner)
kono
parents:
diff changeset
383 {}
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 tree as_tree () const { return m_inner; }
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 type *get_pointer () const { return new type (build_pointer_type (m_inner)); }
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 type *get_const () const
kono
parents:
diff changeset
390 {
kono
parents:
diff changeset
391 return new type (build_qualified_type (m_inner, TYPE_QUAL_CONST));
kono
parents:
diff changeset
392 }
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 type *get_volatile () const
kono
parents:
diff changeset
395 {
kono
parents:
diff changeset
396 return new type (build_qualified_type (m_inner, TYPE_QUAL_VOLATILE));
kono
parents:
diff changeset
397 }
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 type *get_aligned (size_t alignment_in_bytes) const;
kono
parents:
diff changeset
400 type *get_vector (size_t num_units) const;
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 private:
kono
parents:
diff changeset
403 tree m_inner;
kono
parents:
diff changeset
404 };
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 class compound_type : public type
kono
parents:
diff changeset
407 {
kono
parents:
diff changeset
408 public:
kono
parents:
diff changeset
409 compound_type (tree inner)
kono
parents:
diff changeset
410 : type (inner)
kono
parents:
diff changeset
411 {}
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 void set_fields (const auto_vec<field *> *fields);
kono
parents:
diff changeset
414 };
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 class field : public wrapper
kono
parents:
diff changeset
417 {
kono
parents:
diff changeset
418 public:
kono
parents:
diff changeset
419 field (tree inner)
kono
parents:
diff changeset
420 : m_inner(inner)
kono
parents:
diff changeset
421 {}
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 tree as_tree () const { return m_inner; }
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 private:
kono
parents:
diff changeset
426 tree m_inner;
kono
parents:
diff changeset
427 };
kono
parents:
diff changeset
428
kono
parents:
diff changeset
429 class function : public wrapper
kono
parents:
diff changeset
430 {
kono
parents:
diff changeset
431 public:
kono
parents:
diff changeset
432 function(context *ctxt, tree fndecl, enum gcc_jit_function_kind kind);
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 void gt_ggc_mx ();
kono
parents:
diff changeset
435 void finalizer () FINAL OVERRIDE;
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 tree get_return_type_as_tree () const;
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 tree as_fndecl () const { return m_inner_fndecl; }
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 enum gcc_jit_function_kind get_kind () const { return m_kind; }
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 lvalue *
kono
parents:
diff changeset
444 new_local (location *loc,
kono
parents:
diff changeset
445 type *type,
kono
parents:
diff changeset
446 const char *name);
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 block*
kono
parents:
diff changeset
449 new_block (const char *name);
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 rvalue *
kono
parents:
diff changeset
452 get_address (location *loc);
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 void
kono
parents:
diff changeset
455 build_stmt_list ();
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 void
kono
parents:
diff changeset
458 postprocess ();
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 public:
kono
parents:
diff changeset
461 context *m_ctxt;
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 public:
kono
parents:
diff changeset
464 void
kono
parents:
diff changeset
465 set_tree_location (tree t, location *loc)
kono
parents:
diff changeset
466 {
kono
parents:
diff changeset
467 m_ctxt->set_tree_location (t, loc);
kono
parents:
diff changeset
468 }
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 private:
kono
parents:
diff changeset
471 tree m_inner_fndecl;
kono
parents:
diff changeset
472 tree m_inner_block;
kono
parents:
diff changeset
473 tree m_inner_bind_expr;
kono
parents:
diff changeset
474 enum gcc_jit_function_kind m_kind;
kono
parents:
diff changeset
475 tree m_stmt_list;
kono
parents:
diff changeset
476 tree_stmt_iterator m_stmt_iter;
kono
parents:
diff changeset
477 vec<block *> m_blocks;
kono
parents:
diff changeset
478 };
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 struct case_
kono
parents:
diff changeset
481 {
kono
parents:
diff changeset
482 case_ (rvalue *min_value, rvalue *max_value, block *dest_block)
kono
parents:
diff changeset
483 : m_min_value (min_value),
kono
parents:
diff changeset
484 m_max_value (max_value),
kono
parents:
diff changeset
485 m_dest_block (dest_block)
kono
parents:
diff changeset
486 {}
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 rvalue *m_min_value;
kono
parents:
diff changeset
489 rvalue *m_max_value;
kono
parents:
diff changeset
490 block *m_dest_block;
kono
parents:
diff changeset
491 };
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 class block : public wrapper
kono
parents:
diff changeset
494 {
kono
parents:
diff changeset
495 public:
kono
parents:
diff changeset
496 block (function *func,
kono
parents:
diff changeset
497 const char *name);
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 void finalizer () FINAL OVERRIDE;
kono
parents:
diff changeset
500
kono
parents:
diff changeset
501 tree as_label_decl () const { return m_label_decl; }
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 function *get_function () const { return m_func; }
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 void
kono
parents:
diff changeset
506 add_eval (location *loc,
kono
parents:
diff changeset
507 rvalue *rvalue);
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 void
kono
parents:
diff changeset
510 add_assignment (location *loc,
kono
parents:
diff changeset
511 lvalue *lvalue,
kono
parents:
diff changeset
512 rvalue *rvalue);
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 void
kono
parents:
diff changeset
515 add_comment (location *loc,
kono
parents:
diff changeset
516 const char *text);
kono
parents:
diff changeset
517
kono
parents:
diff changeset
518 void
kono
parents:
diff changeset
519 add_conditional (location *loc,
kono
parents:
diff changeset
520 rvalue *boolval,
kono
parents:
diff changeset
521 block *on_true,
kono
parents:
diff changeset
522 block *on_false);
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 block *
kono
parents:
diff changeset
525 add_block (location *loc,
kono
parents:
diff changeset
526 const char *name);
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 void
kono
parents:
diff changeset
529 add_jump (location *loc,
kono
parents:
diff changeset
530 block *target);
kono
parents:
diff changeset
531
kono
parents:
diff changeset
532 void
kono
parents:
diff changeset
533 add_return (location *loc,
kono
parents:
diff changeset
534 rvalue *rvalue);
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 void
kono
parents:
diff changeset
537 add_switch (location *loc,
kono
parents:
diff changeset
538 rvalue *expr,
kono
parents:
diff changeset
539 block *default_block,
kono
parents:
diff changeset
540 const auto_vec <case_> *cases);
kono
parents:
diff changeset
541
kono
parents:
diff changeset
542 private:
kono
parents:
diff changeset
543 void
kono
parents:
diff changeset
544 set_tree_location (tree t, location *loc)
kono
parents:
diff changeset
545 {
kono
parents:
diff changeset
546 m_func->set_tree_location (t, loc);
kono
parents:
diff changeset
547 }
kono
parents:
diff changeset
548
kono
parents:
diff changeset
549 void add_stmt (tree stmt)
kono
parents:
diff changeset
550 {
kono
parents:
diff changeset
551 /* TODO: use one stmt_list per block. */
kono
parents:
diff changeset
552 m_stmts.safe_push (stmt);
kono
parents:
diff changeset
553 }
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 private:
kono
parents:
diff changeset
556 function *m_func;
kono
parents:
diff changeset
557 tree m_label_decl;
kono
parents:
diff changeset
558 vec<tree> m_stmts;
kono
parents:
diff changeset
559
kono
parents:
diff changeset
560 public: // for now
kono
parents:
diff changeset
561 tree m_label_expr;
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 friend class function;
kono
parents:
diff changeset
564 };
kono
parents:
diff changeset
565
kono
parents:
diff changeset
566 class rvalue : public wrapper
kono
parents:
diff changeset
567 {
kono
parents:
diff changeset
568 public:
kono
parents:
diff changeset
569 rvalue (context *ctxt, tree inner)
kono
parents:
diff changeset
570 : m_ctxt (ctxt),
kono
parents:
diff changeset
571 m_inner (inner)
kono
parents:
diff changeset
572 {}
kono
parents:
diff changeset
573
kono
parents:
diff changeset
574 rvalue *
kono
parents:
diff changeset
575 as_rvalue () { return this; }
kono
parents:
diff changeset
576
kono
parents:
diff changeset
577 tree as_tree () const { return m_inner; }
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579 context *get_context () const { return m_ctxt; }
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 type *
kono
parents:
diff changeset
582 get_type () { return new type (TREE_TYPE (m_inner)); }
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 rvalue *
kono
parents:
diff changeset
585 access_field (location *loc,
kono
parents:
diff changeset
586 field *field);
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 lvalue *
kono
parents:
diff changeset
589 dereference_field (location *loc,
kono
parents:
diff changeset
590 field *field);
kono
parents:
diff changeset
591
kono
parents:
diff changeset
592 lvalue *
kono
parents:
diff changeset
593 dereference (location *loc);
kono
parents:
diff changeset
594
kono
parents:
diff changeset
595 private:
kono
parents:
diff changeset
596 context *m_ctxt;
kono
parents:
diff changeset
597 tree m_inner;
kono
parents:
diff changeset
598 };
kono
parents:
diff changeset
599
kono
parents:
diff changeset
600 class lvalue : public rvalue
kono
parents:
diff changeset
601 {
kono
parents:
diff changeset
602 public:
kono
parents:
diff changeset
603 lvalue (context *ctxt, tree inner)
kono
parents:
diff changeset
604 : rvalue(ctxt, inner)
kono
parents:
diff changeset
605 {}
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 lvalue *
kono
parents:
diff changeset
608 as_lvalue () { return this; }
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 lvalue *
kono
parents:
diff changeset
611 access_field (location *loc,
kono
parents:
diff changeset
612 field *field);
kono
parents:
diff changeset
613
kono
parents:
diff changeset
614 rvalue *
kono
parents:
diff changeset
615 get_address (location *loc);
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 };
kono
parents:
diff changeset
618
kono
parents:
diff changeset
619 class param : public lvalue
kono
parents:
diff changeset
620 {
kono
parents:
diff changeset
621 public:
kono
parents:
diff changeset
622 param (context *ctxt, tree inner)
kono
parents:
diff changeset
623 : lvalue(ctxt, inner)
kono
parents:
diff changeset
624 {}
kono
parents:
diff changeset
625 };
kono
parents:
diff changeset
626
kono
parents:
diff changeset
627 /* Dealing with the linemap API.
kono
parents:
diff changeset
628
kono
parents:
diff changeset
629 It appears that libcpp requires locations to be created as if by
kono
parents:
diff changeset
630 a tokenizer, creating them by filename, in ascending order of
kono
parents:
diff changeset
631 line/column, whereas our API doesn't impose any such constraints:
kono
parents:
diff changeset
632 we allow client code to create locations in arbitrary orders.
kono
parents:
diff changeset
633
kono
parents:
diff changeset
634 To square this circle, we need to cache all location creation,
kono
parents:
diff changeset
635 grouping things up by filename/line, and then creating the linemap
kono
parents:
diff changeset
636 entries in a post-processing phase. */
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 /* A set of locations, all sharing a filename */
kono
parents:
diff changeset
639 class source_file : public wrapper
kono
parents:
diff changeset
640 {
kono
parents:
diff changeset
641 public:
kono
parents:
diff changeset
642 source_file (tree filename);
kono
parents:
diff changeset
643 void finalizer () FINAL OVERRIDE;
kono
parents:
diff changeset
644
kono
parents:
diff changeset
645 source_line *
kono
parents:
diff changeset
646 get_source_line (int line_num);
kono
parents:
diff changeset
647
kono
parents:
diff changeset
648 tree filename_as_tree () const { return m_filename; }
kono
parents:
diff changeset
649
kono
parents:
diff changeset
650 const char*
kono
parents:
diff changeset
651 get_filename () const { return IDENTIFIER_POINTER (m_filename); }
kono
parents:
diff changeset
652
kono
parents:
diff changeset
653 vec<source_line *> m_source_lines;
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 private:
kono
parents:
diff changeset
656 tree m_filename;
kono
parents:
diff changeset
657 };
kono
parents:
diff changeset
658
kono
parents:
diff changeset
659 /* A source line, with one or more locations of interest. */
kono
parents:
diff changeset
660 class source_line : public wrapper
kono
parents:
diff changeset
661 {
kono
parents:
diff changeset
662 public:
kono
parents:
diff changeset
663 source_line (source_file *file, int line_num);
kono
parents:
diff changeset
664 void finalizer () FINAL OVERRIDE;
kono
parents:
diff changeset
665
kono
parents:
diff changeset
666 location *
kono
parents:
diff changeset
667 get_location (recording::location *rloc, int column_num);
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 int get_line_num () const { return m_line_num; }
kono
parents:
diff changeset
670
kono
parents:
diff changeset
671 vec<location *> m_locations;
kono
parents:
diff changeset
672
kono
parents:
diff changeset
673 private:
kono
parents:
diff changeset
674 source_file *m_source_file;
kono
parents:
diff changeset
675 int m_line_num;
kono
parents:
diff changeset
676 };
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678 /* A specific location on a source line. This is what we expose
kono
parents:
diff changeset
679 to the client API. */
kono
parents:
diff changeset
680 class location : public wrapper
kono
parents:
diff changeset
681 {
kono
parents:
diff changeset
682 public:
kono
parents:
diff changeset
683 location (recording::location *loc, source_line *line, int column_num);
kono
parents:
diff changeset
684
kono
parents:
diff changeset
685 int get_column_num () const { return m_column_num; }
kono
parents:
diff changeset
686
kono
parents:
diff changeset
687 recording::location *get_recording_loc () const { return m_recording_loc; }
kono
parents:
diff changeset
688
kono
parents:
diff changeset
689 source_location m_srcloc;
kono
parents:
diff changeset
690
kono
parents:
diff changeset
691 private:
kono
parents:
diff changeset
692 recording::location *m_recording_loc;
kono
parents:
diff changeset
693 source_line *m_line;
kono
parents:
diff changeset
694 int m_column_num;
kono
parents:
diff changeset
695 };
kono
parents:
diff changeset
696
kono
parents:
diff changeset
697 } // namespace gcc::jit::playback
kono
parents:
diff changeset
698
kono
parents:
diff changeset
699 extern playback::context *active_playback_ctxt;
kono
parents:
diff changeset
700
kono
parents:
diff changeset
701 } // namespace gcc::jit
kono
parents:
diff changeset
702
kono
parents:
diff changeset
703 } // namespace gcc
kono
parents:
diff changeset
704
kono
parents:
diff changeset
705 #endif /* JIT_PLAYBACK_H */
kono
parents:
diff changeset
706