1 /* Internals of libgccjit: classes for playing back recorded API calls.
2 Copyright (C) 2013-2014 Free Software Foundation, Inc.
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #ifndef JIT_PLAYBACK_H
22 #define JIT_PLAYBACK_H
24 #include <utility> // for std::pair
26 #include "jit-recording.h"
32 /**********************************************************************
34 **********************************************************************/
41 context (::gcc::jit::recording::context *ctxt);
49 new_location (recording::location *rloc,
55 get_type (enum gcc_jit_types type);
58 new_array_type (location *loc,
63 new_field (location *loc,
68 new_compound_type (location *loc,
70 bool is_struct); /* else is union */
73 new_function_type (type *return_type,
74 const auto_vec<type *> *param_types,
78 new_param (location *loc,
83 new_function (location *loc,
84 enum gcc_jit_function_kind kind,
87 const auto_vec<param *> *params,
89 enum built_in_function builtin_id);
92 new_global (location *loc,
97 new_rvalue_from_int (type *type,
101 new_rvalue_from_double (type *type,
105 new_rvalue_from_ptr (type *type,
109 new_string_literal (const char *value);
112 new_unary_op (location *loc,
113 enum gcc_jit_unary_op op,
118 new_binary_op (location *loc,
119 enum gcc_jit_binary_op op,
121 rvalue *a, rvalue *b);
124 new_comparison (location *loc,
125 enum gcc_jit_comparison op,
126 rvalue *a, rvalue *b);
129 new_call (location *loc,
131 const auto_vec<rvalue *> *args);
134 new_call_through_ptr (location *loc,
136 const auto_vec<rvalue *> *args);
139 new_cast (location *loc,
144 new_array_access (location *loc,
149 set_str_option (enum gcc_jit_str_option opt,
153 set_int_option (enum gcc_jit_int_option opt,
157 set_bool_option (enum gcc_jit_bool_option opt,
161 get_str_option (enum gcc_jit_str_option opt) const
163 return m_recording_ctxt->get_str_option (opt);
167 get_int_option (enum gcc_jit_int_option opt) const
169 return m_recording_ctxt->get_int_option (opt);
173 get_bool_option (enum gcc_jit_bool_option opt) const
175 return m_recording_ctxt->get_bool_option (opt);
182 add_error (location *loc, const char *fmt, ...)
186 add_error_va (location *loc, const char *fmt, va_list ap)
190 get_first_error () const;
193 set_tree_location (tree t, location *loc);
196 new_field_access (location *loc,
201 new_dereference (tree ptr, location *loc);
204 as_truth_value (tree expr, location *loc);
206 bool errors_occurred () const
208 return m_recording_ctxt->errors_occurred ();
212 void dump_generated_code ();
215 build_call (location *loc,
217 const auto_vec<rvalue *> *args);
220 build_cast (location *loc,
225 get_source_file (const char *filename);
227 void handle_locations ();
231 /* Functions for implementing "compile". */
234 make_fake_args (auto_vec <const char *> *argvec,
235 const char *ctxt_progname);
238 convert_to_dso (const char *ctxt_progname);
241 ::gcc::jit::recording::context *m_recording_ctxt;
243 /* Allocated using xmalloc (by xstrdup). */
244 char *m_path_template;
246 /* This either aliases m_path_template, or is NULL. */
247 char *m_path_tempdir;
249 /* The following are allocated using xmalloc. */
252 char *m_path_so_file;
254 auto_vec<function *> m_functions;
255 tree m_char_array_type_node;
256 tree m_const_char_ptr;
258 /* Source location handling. */
259 auto_vec<source_file *> m_source_files;
261 auto_vec<std::pair<tree, location *> > m_cached_locations;
264 /* A temporary wrapper object.
265 These objects are (mostly) only valid during replay.
266 We allocate them on the GC heap, so that they will be cleaned
267 the next time the GC collects.
268 The exception is the "function" class, which is tracked and marked by
269 the jit::context, since it needs to stay alive during post-processing
270 (when the GC could run). */
274 /* Allocate in the GC heap. */
275 void *operator new (size_t sz);
277 /* Some wrapper subclasses contain vec<> and so need to
278 release them when they are GC-ed. */
279 virtual void finalizer () { }
283 class type : public wrapper
290 tree as_tree () const { return m_inner; }
292 type *get_pointer () const { return new type (build_pointer_type (m_inner)); }
294 type *get_const () const
296 return new type (build_qualified_type (m_inner, TYPE_QUAL_CONST));
299 type *get_volatile () const
301 return new type (build_qualified_type (m_inner, TYPE_QUAL_VOLATILE));
308 class compound_type : public type
311 compound_type (tree inner)
315 void set_fields (const auto_vec<field *> *fields);
318 class field : public wrapper
325 tree as_tree () const { return m_inner; }
331 class function : public wrapper
334 function(context *ctxt, tree fndecl, enum gcc_jit_function_kind kind);
339 tree get_return_type_as_tree () const;
341 tree as_fndecl () const { return m_inner_fndecl; }
343 enum gcc_jit_function_kind get_kind () const { return m_kind; }
346 new_local (location *loc,
351 new_block (const char *name);
364 set_tree_location (tree t, location *loc)
366 m_ctxt->set_tree_location (t, loc);
372 tree m_inner_bind_expr;
373 enum gcc_jit_function_kind m_kind;
375 tree_stmt_iterator m_stmt_iter;
376 vec<block *> m_blocks;
379 class block : public wrapper
382 block (function *func,
387 tree as_label_decl () const { return m_label_decl; }
390 add_eval (location *loc,
394 add_assignment (location *loc,
399 add_comment (location *loc,
403 add_conditional (location *loc,
409 add_block (location *loc,
413 add_jump (location *loc,
417 add_return (location *loc,
422 set_tree_location (tree t, location *loc)
424 m_func->set_tree_location (t, loc);
427 void add_stmt (tree stmt)
429 /* TODO: use one stmt_list per block. */
430 m_stmts.safe_push (stmt);
441 friend class function;
444 class rvalue : public wrapper
447 rvalue (context *ctxt, tree inner)
453 as_rvalue () { return this; }
455 tree as_tree () const { return m_inner; }
457 context *get_context () const { return m_ctxt; }
460 get_type () { return new type (TREE_TYPE (m_inner)); }
463 access_field (location *loc,
467 dereference_field (location *loc,
471 dereference (location *loc);
478 class lvalue : public rvalue
481 lvalue (context *ctxt, tree inner)
482 : rvalue(ctxt, inner)
486 as_lvalue () { return this; }
489 access_field (location *loc,
493 get_address (location *loc);
497 class param : public lvalue
500 param (context *ctxt, tree inner)
501 : lvalue(ctxt, inner)
505 /* Dealing with the linemap API.
507 It appears that libcpp requires locations to be created as if by
508 a tokenizer, creating them by filename, in ascending order of
509 line/column, whereas our API doesn't impose any such constraints:
510 we allow client code to create locations in arbitrary orders.
512 To square this circle, we need to cache all location creation,
513 grouping things up by filename/line, and then creating the linemap
514 entries in a post-processing phase. */
516 /* A set of locations, all sharing a filename */
517 class source_file : public wrapper
520 source_file (tree filename);
524 get_source_line (int line_num);
526 tree filename_as_tree () const { return m_filename; }
529 get_filename () const { return IDENTIFIER_POINTER (m_filename); }
531 vec<source_line *> m_source_lines;
537 /* A source line, with one or more locations of interest. */
538 class source_line : public wrapper
541 source_line (source_file *file, int line_num);
545 get_location (recording::location *rloc, int column_num);
547 int get_line_num () const { return m_line_num; }
549 vec<location *> m_locations;
552 source_file *m_source_file;
556 /* A specific location on a source line. This is what we expose
557 to the client API. */
558 class location : public wrapper
561 location (recording::location *loc, source_line *line, int column_num);
563 int get_column_num () const { return m_column_num; }
565 recording::location *get_recording_loc () const { return m_recording_loc; }
567 source_location m_srcloc;
570 recording::location *m_recording_loc;
575 } // namespace gcc::jit::playback
577 extern playback::context *active_playback_ctxt;
579 } // namespace gcc::jit
583 #endif /* JIT_PLAYBACK_H */