1 /* Internals of libgccjit: classes for recording calls made to the JIT API.
2 Copyright (C) 2013-2017 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_RECORDING_H
22 #define JIT_RECORDING_H
24 #include "jit-common.h"
25 #include "jit-logging.h"
37 /**********************************************************************
39 **********************************************************************/
44 playback_location (replayer
*r
, location
*loc
);
47 playback_string (string
*str
);
50 playback_block (block
*b
);
52 /* A recording of a call to gcc_jit_context_enable_dump. */
55 const char *m_dumpname
;
59 /* A JIT-compilation context. */
60 class context
: public log_user
63 context (context
*parent_ctxt
);
67 get_builtins_manager ();
69 void record (memento
*m
);
70 void replay_into (replayer
*r
);
71 void disassociate_from_playback ();
74 new_string (const char *text
);
77 new_location (const char *filename
,
80 bool created_by_user
);
83 get_type (enum gcc_jit_types type
);
86 get_int_type (int num_bytes
, int is_signed
);
89 new_array_type (location
*loc
,
94 new_field (location
*loc
,
99 new_struct_type (location
*loc
,
103 new_union_type (location
*loc
,
107 new_function_type (type
*return_type
,
113 new_function_ptr_type (location
*loc
,
120 new_param (location
*loc
,
125 new_function (location
*loc
,
126 enum gcc_jit_function_kind kind
,
132 enum built_in_function builtin_id
);
135 get_builtin_function (const char *name
);
138 new_global (location
*loc
,
139 enum gcc_jit_global_kind kind
,
143 template <typename HOST_TYPE
>
145 new_rvalue_from_const (type
*type
,
149 new_string_literal (const char *value
);
152 new_rvalue_from_vector (location
*loc
,
157 new_unary_op (location
*loc
,
158 enum gcc_jit_unary_op op
,
163 new_binary_op (location
*loc
,
164 enum gcc_jit_binary_op op
,
166 rvalue
*a
, rvalue
*b
);
169 new_comparison (location
*loc
,
170 enum gcc_jit_comparison op
,
171 rvalue
*a
, rvalue
*b
);
174 new_call (location
*loc
,
176 int numargs
, rvalue
**args
);
179 new_call_through_ptr (location
*loc
,
181 int numargs
, rvalue
**args
);
184 new_cast (location
*loc
,
189 new_array_access (location
*loc
,
194 new_case (rvalue
*min_value
,
199 set_str_option (enum gcc_jit_str_option opt
,
203 set_int_option (enum gcc_jit_int_option opt
,
207 set_bool_option (enum gcc_jit_bool_option opt
,
211 set_inner_bool_option (enum inner_bool_option inner_opt
,
215 add_command_line_option (const char *optname
);
218 append_command_line_options (vec
<char *> *argvec
);
221 enable_dump (const char *dumpname
,
225 get_str_option (enum gcc_jit_str_option opt
) const
227 return m_str_options
[opt
];
231 get_int_option (enum gcc_jit_int_option opt
) const
233 return m_int_options
[opt
];
237 get_bool_option (enum gcc_jit_bool_option opt
) const
239 return m_bool_options
[opt
];
243 get_inner_bool_option (enum inner_bool_option opt
) const
245 return m_inner_bool_options
[opt
];
252 compile_to_file (enum gcc_jit_output_kind output_kind
,
253 const char *output_path
);
256 add_error (location
*loc
, const char *fmt
, ...)
260 add_error_va (location
*loc
, const char *fmt
, va_list ap
)
264 get_first_error () const;
267 get_last_error () const;
269 bool errors_occurred () const
272 if (m_parent_ctxt
->errors_occurred ())
274 return m_error_count
;
277 type
*get_opaque_FILE_type ();
279 void dump_to_file (const char *path
, bool update_locations
);
281 void dump_reproducer_to_file (const char *path
);
284 get_all_requested_dumps (vec
<recording::requested_dump
> *out
);
286 void set_timer (timer
*t
) { m_timer
= t
; }
287 timer
*get_timer () const { return m_timer
; }
290 void log_all_options () const;
291 void log_str_option (enum gcc_jit_str_option opt
) const;
292 void log_int_option (enum gcc_jit_int_option opt
) const;
293 void log_bool_option (enum gcc_jit_bool_option opt
) const;
294 void log_inner_bool_option (enum inner_bool_option opt
) const;
299 context
*m_parent_ctxt
;
301 /* The ultimate ancestor of the contexts within a family tree of
302 contexts. This has itself as its own m_toplevel_ctxt. */
303 context
*m_toplevel_ctxt
;
309 char *m_first_error_str
;
310 bool m_owns_first_error_str
;
312 char *m_last_error_str
;
313 bool m_owns_last_error_str
;
315 char *m_str_options
[GCC_JIT_NUM_STR_OPTIONS
];
316 int m_int_options
[GCC_JIT_NUM_INT_OPTIONS
];
317 bool m_bool_options
[GCC_JIT_NUM_BOOL_OPTIONS
];
318 bool m_inner_bool_options
[NUM_INNER_BOOL_OPTIONS
];
319 auto_vec
<char *> m_command_line_options
;
321 /* Dumpfiles that were requested via gcc_jit_context_enable_dump. */
322 auto_vec
<requested_dump
> m_requested_dumps
;
324 /* Recorded API usage. */
325 auto_vec
<memento
*> m_mementos
;
327 /* Specific recordings, for use by dump_to_file. */
328 auto_vec
<compound_type
*> m_compound_types
;
329 auto_vec
<global
*> m_globals
;
330 auto_vec
<function
*> m_functions
;
332 type
*m_basic_types
[NUM_GCC_JIT_TYPES
];
335 builtins_manager
*m_builtins_manager
; // lazily created
339 /* An object with lifetime managed by the context i.e.
340 it lives until the context is released, at which
341 point it itself is cleaned up. */
346 virtual ~memento () {}
348 /* Hook for replaying this. */
349 virtual void replay_into (replayer
*r
) = 0;
351 void set_playback_obj (void *obj
) { m_playback_obj
= obj
; }
354 /* Get the context that owns this object.
356 Implements the post-error-checking part of
357 gcc_jit_object_get_context. */
358 context
*get_context () { return m_ctxt
; }
361 as_object () { return this; }
363 /* Debugging hook, for use in generating error messages etc.
364 Implements the post-error-checking part of
365 gcc_jit_object_get_debug_string. */
369 virtual void write_to_dump (dump
&d
);
370 virtual void write_reproducer (reproducer
&r
) = 0;
371 virtual location
*dyn_cast_location () { return NULL
; }
374 memento (context
*ctxt
)
376 m_playback_obj (NULL
),
377 m_debug_string (NULL
)
382 string
*new_string (const char *text
) { return m_ctxt
->new_string (text
); }
385 virtual string
* make_debug_string () = 0;
391 void *m_playback_obj
;
394 string
*m_debug_string
;
397 /* or just use std::string? */
398 class string
: public memento
401 string (context
*ctxt
, const char *text
);
404 const char *c_str () { return m_buffer
; }
406 static string
* from_printf (context
*ctxt
, const char *fmt
, ...)
409 void replay_into (replayer
*) FINAL OVERRIDE
{}
412 string
* make_debug_string () FINAL OVERRIDE
;
413 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
420 class location
: public memento
423 location (context
*ctxt
, string
*filename
, int line
, int column
,
424 bool created_by_user
)
426 m_filename (filename
),
429 m_created_by_user (created_by_user
)
432 void replay_into (replayer
*r
) FINAL OVERRIDE
;
435 playback_location (replayer
*r
)
437 /* Normally during playback, we can walk forwards through the list of
438 recording objects, playing them back. The ordering of recording
439 ensures that everything that a recording object refers to has
440 already been played back, so we can simply look up the relevant
443 Locations are an exception, due to the "write_to_dump" method of
444 recording::statement. This method can set a new location on a
445 statement after the statement is created, and thus the location
446 appears in the context's memento list *after* the statement that
449 In such circumstances, the statement is replayed *before* the location,
450 when the latter doesn't yet have a playback object.
452 Hence we need to ensure that locations have playback objects. */
457 gcc_assert (m_playback_obj
);
458 return static_cast <playback::location
*> (m_playback_obj
);
461 location
*dyn_cast_location () FINAL OVERRIDE
{ return this; }
462 bool created_by_user () const { return m_created_by_user
; }
465 string
* make_debug_string () FINAL OVERRIDE
;
466 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
472 bool m_created_by_user
;
475 class type
: public memento
478 type
*get_pointer ();
480 type
*get_volatile ();
481 type
*get_aligned (size_t alignment_in_bytes
);
482 type
*get_vector (size_t num_units
);
484 /* Get the type obtained when dereferencing this type.
486 This will return NULL if it's not valid to dereference this type.
487 The caller is responsible for setting an error. */
488 virtual type
*dereference () = 0;
491 virtual function_type
*dyn_cast_function_type () { return NULL
; }
492 virtual function_type
*as_a_function_type() { gcc_unreachable (); return NULL
; }
493 virtual struct_
*dyn_cast_struct () { return NULL
; }
494 virtual vector_type
*dyn_cast_vector_type () { return NULL
; }
496 /* Is it typesafe to copy to this type from rtype? */
497 virtual bool accepts_writes_from (type
*rtype
)
500 return this->unqualified ()->is_same_type_as (rtype
->unqualified ());
503 virtual bool is_same_type_as (type
*other
)
505 return this == other
;
508 /* Strip off "const" etc */
509 virtual type
*unqualified ()
514 virtual bool is_int () const = 0;
515 virtual bool is_float () const = 0;
516 virtual bool is_bool () const = 0;
517 virtual type
*is_pointer () = 0;
518 virtual type
*is_array () = 0;
519 virtual bool is_void () const { return false; }
520 virtual bool has_known_size () const { return true; }
522 bool is_numeric () const
524 return is_int () || is_float () || is_bool ();
530 return static_cast <playback::type
*> (m_playback_obj
);
533 virtual const char *access_as_type (reproducer
&r
);
538 m_pointer_to_this_type (NULL
)
542 type
*m_pointer_to_this_type
;
545 /* Result of "gcc_jit_context_get_type". */
546 class memento_of_get_type
: public type
549 memento_of_get_type (context
*ctxt
,
550 enum gcc_jit_types kind
)
554 type
*dereference () FINAL OVERRIDE
;
556 bool accepts_writes_from (type
*rtype
) FINAL OVERRIDE
558 if (m_kind
== GCC_JIT_TYPE_VOID_PTR
)
559 if (rtype
->is_pointer ())
561 /* LHS (this) is type (void *), and the RHS is a pointer:
566 return type::accepts_writes_from (rtype
);
569 bool is_int () const FINAL OVERRIDE
;
570 bool is_float () const FINAL OVERRIDE
;
571 bool is_bool () const FINAL OVERRIDE
;
572 type
*is_pointer () FINAL OVERRIDE
{ return dereference (); }
573 type
*is_array () FINAL OVERRIDE
{ return NULL
; }
574 bool is_void () const FINAL OVERRIDE
{ return m_kind
== GCC_JIT_TYPE_VOID
; }
577 void replay_into (replayer
*r
) FINAL OVERRIDE
;
580 string
* make_debug_string () FINAL OVERRIDE
;
581 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
584 enum gcc_jit_types m_kind
;
587 /* Result of "gcc_jit_type_get_pointer". */
588 class memento_of_get_pointer
: public type
591 memento_of_get_pointer (type
*other_type
)
592 : type (other_type
->m_ctxt
),
593 m_other_type (other_type
) {}
595 type
*dereference () FINAL OVERRIDE
{ return m_other_type
; }
597 bool accepts_writes_from (type
*rtype
) FINAL OVERRIDE
;
599 void replay_into (replayer
*r
) FINAL OVERRIDE
;
601 bool is_int () const FINAL OVERRIDE
{ return false; }
602 bool is_float () const FINAL OVERRIDE
{ return false; }
603 bool is_bool () const FINAL OVERRIDE
{ return false; }
604 type
*is_pointer () FINAL OVERRIDE
{ return m_other_type
; }
605 type
*is_array () FINAL OVERRIDE
{ return NULL
; }
608 string
* make_debug_string () FINAL OVERRIDE
;
609 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
615 /* A decorated version of a type, for get_const, get_volatile,
616 get_aligned, and get_vector. */
618 class decorated_type
: public type
621 decorated_type (type
*other_type
)
622 : type (other_type
->m_ctxt
),
623 m_other_type (other_type
) {}
625 type
*dereference () FINAL OVERRIDE
{ return m_other_type
->dereference (); }
627 bool is_int () const FINAL OVERRIDE
{ return m_other_type
->is_int (); }
628 bool is_float () const FINAL OVERRIDE
{ return m_other_type
->is_float (); }
629 bool is_bool () const FINAL OVERRIDE
{ return m_other_type
->is_bool (); }
630 type
*is_pointer () FINAL OVERRIDE
{ return m_other_type
->is_pointer (); }
631 type
*is_array () FINAL OVERRIDE
{ return m_other_type
->is_array (); }
637 /* Result of "gcc_jit_type_get_const". */
638 class memento_of_get_const
: public decorated_type
641 memento_of_get_const (type
*other_type
)
642 : decorated_type (other_type
) {}
644 bool accepts_writes_from (type */
*rtype*/
) FINAL OVERRIDE
646 /* Can't write to a "const". */
650 /* Strip off the "const", giving the underlying type. */
651 type
*unqualified () FINAL OVERRIDE
{ return m_other_type
; }
653 void replay_into (replayer
*) FINAL OVERRIDE
;
656 string
* make_debug_string () FINAL OVERRIDE
;
657 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
660 /* Result of "gcc_jit_type_get_volatile". */
661 class memento_of_get_volatile
: public decorated_type
664 memento_of_get_volatile (type
*other_type
)
665 : decorated_type (other_type
) {}
667 /* Strip off the "volatile", giving the underlying type. */
668 type
*unqualified () FINAL OVERRIDE
{ return m_other_type
; }
670 void replay_into (replayer
*) FINAL OVERRIDE
;
673 string
* make_debug_string () FINAL OVERRIDE
;
674 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
677 /* Result of "gcc_jit_type_get_aligned". */
678 class memento_of_get_aligned
: public decorated_type
681 memento_of_get_aligned (type
*other_type
, size_t alignment_in_bytes
)
682 : decorated_type (other_type
),
683 m_alignment_in_bytes (alignment_in_bytes
) {}
685 /* Strip off the alignment, giving the underlying type. */
686 type
*unqualified () FINAL OVERRIDE
{ return m_other_type
; }
688 void replay_into (replayer
*) FINAL OVERRIDE
;
691 string
* make_debug_string () FINAL OVERRIDE
;
692 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
695 size_t m_alignment_in_bytes
;
698 /* Result of "gcc_jit_type_get_vector". */
699 class vector_type
: public decorated_type
702 vector_type (type
*other_type
, size_t num_units
)
703 : decorated_type (other_type
),
704 m_num_units (num_units
) {}
706 size_t get_num_units () const { return m_num_units
; }
708 vector_type
*dyn_cast_vector_type () FINAL OVERRIDE
{ return this; }
710 type
*get_element_type () { return m_other_type
; }
712 void replay_into (replayer
*) FINAL OVERRIDE
;
715 string
* make_debug_string () FINAL OVERRIDE
;
716 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
722 class array_type
: public type
725 array_type (context
*ctxt
,
731 m_element_type (element_type
),
732 m_num_elements (num_elements
)
735 type
*dereference () FINAL OVERRIDE
;
737 bool is_int () const FINAL OVERRIDE
{ return false; }
738 bool is_float () const FINAL OVERRIDE
{ return false; }
739 bool is_bool () const FINAL OVERRIDE
{ return false; }
740 type
*is_pointer () FINAL OVERRIDE
{ return NULL
; }
741 type
*is_array () FINAL OVERRIDE
{ return m_element_type
; }
743 void replay_into (replayer
*) FINAL OVERRIDE
;
746 string
* make_debug_string () FINAL OVERRIDE
;
747 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
751 type
*m_element_type
;
755 class function_type
: public type
758 function_type (context
*ctxt
,
764 type
*dereference () FINAL OVERRIDE
;
765 function_type
*dyn_cast_function_type () FINAL OVERRIDE
{ return this; }
766 function_type
*as_a_function_type () FINAL OVERRIDE
{ return this; }
768 bool is_same_type_as (type
*other
) FINAL OVERRIDE
;
770 bool is_int () const FINAL OVERRIDE
{ return false; }
771 bool is_float () const FINAL OVERRIDE
{ return false; }
772 bool is_bool () const FINAL OVERRIDE
{ return false; }
773 type
*is_pointer () FINAL OVERRIDE
{ return NULL
; }
774 type
*is_array () FINAL OVERRIDE
{ return NULL
; }
776 void replay_into (replayer
*) FINAL OVERRIDE
;
778 type
* get_return_type () const { return m_return_type
; }
779 const vec
<type
*> &get_param_types () const { return m_param_types
; }
780 int is_variadic () const { return m_is_variadic
; }
782 string
* make_debug_string_with_ptr ();
785 write_deferred_reproducer (reproducer
&r
,
789 string
* make_debug_string () FINAL OVERRIDE
;
790 string
* make_debug_string_with (const char *);
791 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
795 auto_vec
<type
*> m_param_types
;
799 class field
: public memento
802 field (context
*ctxt
,
813 type
* get_type () const { return m_type
; }
815 compound_type
* get_container () const { return m_container
; }
816 void set_container (compound_type
*c
) { m_container
= c
; }
818 void replay_into (replayer
*) FINAL OVERRIDE
;
820 void write_to_dump (dump
&d
) FINAL OVERRIDE
;
823 playback_field () const
825 return static_cast <playback::field
*> (m_playback_obj
);
829 string
* make_debug_string () FINAL OVERRIDE
;
830 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
836 compound_type
*m_container
;
839 /* Base class for struct_ and union_ */
840 class compound_type
: public type
843 compound_type (context
*ctxt
,
847 string
*get_name () const { return m_name
; }
848 location
*get_loc () const { return m_loc
; }
849 fields
* get_fields () { return m_fields
; }
852 set_fields (location
*loc
,
856 type
*dereference () FINAL OVERRIDE
;
858 bool is_int () const FINAL OVERRIDE
{ return false; }
859 bool is_float () const FINAL OVERRIDE
{ return false; }
860 bool is_bool () const FINAL OVERRIDE
{ return false; }
861 type
*is_pointer () FINAL OVERRIDE
{ return NULL
; }
862 type
*is_array () FINAL OVERRIDE
{ return NULL
; }
864 bool has_known_size () const FINAL OVERRIDE
{ return m_fields
!= NULL
; }
866 playback::compound_type
*
867 playback_compound_type ()
869 return static_cast <playback::compound_type
*> (m_playback_obj
);
878 class struct_
: public compound_type
881 struct_ (context
*ctxt
,
885 struct_
*dyn_cast_struct () FINAL OVERRIDE
{ return this; }
888 as_type () { return this; }
890 void replay_into (replayer
*r
) FINAL OVERRIDE
;
892 const char *access_as_type (reproducer
&r
) FINAL OVERRIDE
;
895 string
* make_debug_string () FINAL OVERRIDE
;
896 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
899 // memento of struct_::set_fields
900 class fields
: public memento
903 fields (compound_type
*struct_or_union
,
907 void replay_into (replayer
*r
) FINAL OVERRIDE
;
909 void write_to_dump (dump
&d
) FINAL OVERRIDE
;
911 int length () const { return m_fields
.length (); }
912 field
*get_field (int i
) const { return m_fields
[i
]; }
915 string
* make_debug_string () FINAL OVERRIDE
;
916 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
919 compound_type
*m_struct_or_union
;
920 auto_vec
<field
*> m_fields
;
923 class union_
: public compound_type
926 union_ (context
*ctxt
,
930 void replay_into (replayer
*r
) FINAL OVERRIDE
;
933 string
* make_debug_string () FINAL OVERRIDE
;
934 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
941 /* An abstract base class for operations that visit all rvalues within an
943 Currently the only implementation is class rvalue_usage_validator within
949 virtual ~rvalue_visitor () {}
950 virtual void visit (rvalue
*rvalue
) = 0;
953 /* When generating debug strings for rvalues we mimic C, so we need to
954 mimic C's precedence levels when handling compound expressions.
955 These are in order from strongest precedence to weakest. */
962 PRECEDENCE_MULTIPLICATIVE
,
965 PRECEDENCE_RELATIONAL
,
967 PRECEDENCE_BITWISE_AND
,
968 PRECEDENCE_BITWISE_XOR
,
969 PRECEDENCE_BITWISE_IOR
,
970 PRECEDENCE_LOGICAL_AND
,
971 PRECEDENCE_LOGICAL_OR
974 class rvalue
: public memento
977 rvalue (context
*ctxt
,
984 m_parenthesized_string (NULL
)
989 location
* get_loc () const { return m_loc
; }
991 /* Get the recording::type of this rvalue.
993 Implements the post-error-checking part of
994 gcc_jit_rvalue_get_type. */
995 type
* get_type () const { return m_type
; }
998 playback_rvalue () const
1000 return static_cast <playback::rvalue
*> (m_playback_obj
);
1003 access_field (location
*loc
,
1007 dereference_field (location
*loc
,
1011 dereference (location
*loc
);
1014 verify_valid_within_stmt (const char *api_funcname
, statement
*s
);
1016 virtual void visit_children (rvalue_visitor
*v
) = 0;
1018 void set_scope (function
*scope
);
1019 function
*get_scope () const { return m_scope
; }
1021 /* Dynamic casts. */
1022 virtual param
*dyn_cast_param () { return NULL
; }
1023 virtual base_call
*dyn_cast_base_call () { return NULL
; }
1025 virtual const char *access_as_rvalue (reproducer
&r
);
1027 /* Get the debug string, wrapped in parentheses. */
1029 get_debug_string_parens (enum precedence outer_prec
);
1031 virtual bool is_constant () const { return false; }
1032 virtual bool get_wide_int (wide_int
*) const { return false; }
1035 virtual enum precedence
get_precedence () const = 0;
1042 function
*m_scope
; /* NULL for globals, non-NULL for locals/params */
1043 string
*m_parenthesized_string
;
1046 class lvalue
: public rvalue
1049 lvalue (context
*ctxt
,
1052 : rvalue (ctxt
, loc
, type_
)
1056 playback_lvalue () const
1058 return static_cast <playback::lvalue
*> (m_playback_obj
);
1062 access_field (location
*loc
,
1066 get_address (location
*loc
);
1069 as_rvalue () { return this; }
1071 const char *access_as_rvalue (reproducer
&r
) OVERRIDE
;
1072 virtual const char *access_as_lvalue (reproducer
&r
);
1075 class param
: public lvalue
1078 param (context
*ctxt
,
1082 : lvalue (ctxt
, loc
, type
),
1086 as_lvalue () { return this; }
1088 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1090 void visit_children (rvalue_visitor
*) FINAL OVERRIDE
{}
1093 playback_param () const
1095 return static_cast <playback::param
*> (m_playback_obj
);
1098 param
*dyn_cast_param () FINAL OVERRIDE
{ return this; }
1100 const char *access_as_rvalue (reproducer
&r
) FINAL OVERRIDE
;
1101 const char *access_as_lvalue (reproducer
&r
) FINAL OVERRIDE
;
1104 string
* make_debug_string () FINAL OVERRIDE
{ return m_name
; }
1105 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1106 enum precedence
get_precedence () const FINAL OVERRIDE
1108 return PRECEDENCE_PRIMARY
;
1115 class function
: public memento
1118 function (context
*ctxt
,
1120 enum gcc_jit_function_kind kind
,
1126 enum built_in_function builtin_id
);
1128 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1130 playback::function
*
1131 playback_function () const
1133 return static_cast <playback::function
*> (m_playback_obj
);
1136 enum gcc_jit_function_kind
get_kind () const { return m_kind
; }
1139 new_local (location
*loc
,
1144 new_block (const char *name
);
1146 location
*get_loc () const { return m_loc
; }
1147 type
*get_return_type () const { return m_return_type
; }
1148 string
* get_name () const { return m_name
; }
1149 const vec
<param
*> &get_params () const { return m_params
; }
1151 /* Get the given param by index.
1152 Implements the post-error-checking part of
1153 gcc_jit_function_get_param. */
1154 param
*get_param (int i
) const { return m_params
[i
]; }
1156 bool is_variadic () const { return m_is_variadic
; }
1158 void write_to_dump (dump
&d
) FINAL OVERRIDE
;
1162 void dump_to_dot (const char *path
);
1164 rvalue
*get_address (location
*loc
);
1167 string
* make_debug_string () FINAL OVERRIDE
;
1168 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1172 enum gcc_jit_function_kind m_kind
;
1173 type
*m_return_type
;
1175 auto_vec
<param
*> m_params
;
1177 enum built_in_function m_builtin_id
;
1178 auto_vec
<local
*> m_locals
;
1179 auto_vec
<block
*> m_blocks
;
1180 type
*m_fn_ptr_type
;
1183 class block
: public memento
1186 block (function
*func
, int index
, string
*name
)
1187 : memento (func
->m_ctxt
),
1192 m_has_been_terminated (false),
1193 m_is_reachable (false)
1197 /* Get the recording::function containing this block.
1198 Implements the post-error-checking part of
1199 gcc_jit_block_get_function. */
1200 function
*get_function () { return m_func
; }
1202 bool has_been_terminated () { return m_has_been_terminated
; }
1203 bool is_reachable () { return m_is_reachable
; }
1206 add_eval (location
*loc
,
1210 add_assignment (location
*loc
,
1215 add_assignment_op (location
*loc
,
1217 enum gcc_jit_binary_op op
,
1221 add_comment (location
*loc
,
1225 end_with_conditional (location
*loc
,
1231 end_with_jump (location
*loc
,
1235 end_with_return (location
*loc
,
1239 end_with_switch (location
*loc
,
1241 block
*default_block
,
1246 playback_block () const
1248 return static_cast <playback::block
*> (m_playback_obj
);
1251 void write_to_dump (dump
&d
) FINAL OVERRIDE
;
1255 location
*get_loc () const;
1257 statement
*get_first_statement () const;
1258 statement
*get_last_statement () const;
1260 vec
<block
*> get_successor_blocks () const;
1263 string
* make_debug_string () FINAL OVERRIDE
;
1264 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1266 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1268 void dump_to_dot (pretty_printer
*pp
);
1269 void dump_edges_to_dot (pretty_printer
*pp
);
1275 auto_vec
<statement
*> m_statements
;
1276 bool m_has_been_terminated
;
1277 bool m_is_reachable
;
1279 friend class function
;
1282 class global
: public lvalue
1285 global (context
*ctxt
,
1287 enum gcc_jit_global_kind kind
,
1290 : lvalue (ctxt
, loc
, type
),
1295 void replay_into (replayer
*) FINAL OVERRIDE
;
1297 void visit_children (rvalue_visitor
*) FINAL OVERRIDE
{}
1299 void write_to_dump (dump
&d
) FINAL OVERRIDE
;
1302 string
* make_debug_string () FINAL OVERRIDE
{ return m_name
; }
1303 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1304 enum precedence
get_precedence () const FINAL OVERRIDE
1306 return PRECEDENCE_PRIMARY
;
1310 enum gcc_jit_global_kind m_kind
;
1314 template <typename HOST_TYPE
>
1315 class memento_of_new_rvalue_from_const
: public rvalue
1318 memento_of_new_rvalue_from_const (context
*ctxt
,
1322 : rvalue (ctxt
, loc
, type
),
1325 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1327 void visit_children (rvalue_visitor
*) FINAL OVERRIDE
{}
1329 bool is_constant () const FINAL OVERRIDE
{ return true; }
1331 bool get_wide_int (wide_int
*out
) const FINAL OVERRIDE
;
1334 string
* make_debug_string () FINAL OVERRIDE
;
1335 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1336 enum precedence
get_precedence () const FINAL OVERRIDE
1338 return PRECEDENCE_PRIMARY
;
1345 class memento_of_new_string_literal
: public rvalue
1348 memento_of_new_string_literal (context
*ctxt
,
1351 : rvalue (ctxt
, loc
, ctxt
->get_type (GCC_JIT_TYPE_CONST_CHAR_PTR
)),
1354 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1356 void visit_children (rvalue_visitor
*) FINAL OVERRIDE
{}
1359 string
* make_debug_string () FINAL OVERRIDE
;
1360 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1361 enum precedence
get_precedence () const FINAL OVERRIDE
1363 return PRECEDENCE_PRIMARY
;
1370 class memento_of_new_rvalue_from_vector
: public rvalue
1373 memento_of_new_rvalue_from_vector (context
*ctxt
,
1378 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1380 void visit_children (rvalue_visitor
*) FINAL OVERRIDE
;
1383 string
* make_debug_string () FINAL OVERRIDE
;
1384 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1385 enum precedence
get_precedence () const FINAL OVERRIDE
1387 return PRECEDENCE_PRIMARY
;
1391 vector_type
*m_vector_type
;
1392 auto_vec
<rvalue
*> m_elements
;
1395 class unary_op
: public rvalue
1398 unary_op (context
*ctxt
,
1400 enum gcc_jit_unary_op op
,
1403 : rvalue (ctxt
, loc
, result_type
),
1408 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1410 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1413 string
* make_debug_string () FINAL OVERRIDE
;
1414 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1415 enum precedence
get_precedence () const FINAL OVERRIDE
1417 return PRECEDENCE_UNARY
;
1421 enum gcc_jit_unary_op m_op
;
1425 class binary_op
: public rvalue
1428 binary_op (context
*ctxt
,
1430 enum gcc_jit_binary_op op
,
1432 rvalue
*a
, rvalue
*b
)
1433 : rvalue (ctxt
, loc
, result_type
),
1438 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1440 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1443 string
* make_debug_string () FINAL OVERRIDE
;
1444 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1445 enum precedence
get_precedence () const FINAL OVERRIDE
;
1448 enum gcc_jit_binary_op m_op
;
1453 class comparison
: public rvalue
1456 comparison (context
*ctxt
,
1458 enum gcc_jit_comparison op
,
1459 rvalue
*a
, rvalue
*b
)
1460 : rvalue (ctxt
, loc
, ctxt
->get_type (GCC_JIT_TYPE_BOOL
)),
1466 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1468 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1471 string
* make_debug_string () FINAL OVERRIDE
;
1472 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1473 enum precedence
get_precedence () const FINAL OVERRIDE
;
1476 enum gcc_jit_comparison m_op
;
1481 class cast
: public rvalue
1484 cast (context
*ctxt
,
1488 : rvalue (ctxt
, loc
, type_
),
1492 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1494 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1497 string
* make_debug_string () FINAL OVERRIDE
;
1498 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1499 enum precedence
get_precedence () const FINAL OVERRIDE
1501 return PRECEDENCE_CAST
;
1508 class base_call
: public rvalue
1511 base_call (context
*ctxt
,
1517 enum precedence
get_precedence () const FINAL OVERRIDE
1519 return PRECEDENCE_POSTFIX
;
1522 base_call
*dyn_cast_base_call () FINAL OVERRIDE
{ return this; }
1524 void set_require_tail_call (bool require_tail_call
)
1526 m_require_tail_call
= require_tail_call
;
1530 void write_reproducer_tail_call (reproducer
&r
, const char *id
);
1533 auto_vec
<rvalue
*> m_args
;
1534 bool m_require_tail_call
;
1537 class call
: public base_call
1540 call (context
*ctxt
,
1546 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1548 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1551 string
* make_debug_string () FINAL OVERRIDE
;
1552 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1558 class call_through_ptr
: public base_call
1561 call_through_ptr (context
*ctxt
,
1567 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1569 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1572 string
* make_debug_string () FINAL OVERRIDE
;
1573 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1579 class array_access
: public lvalue
1582 array_access (context
*ctxt
,
1586 : lvalue (ctxt
, loc
, ptr
->get_type ()->dereference ()),
1591 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1593 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1596 string
* make_debug_string () FINAL OVERRIDE
;
1597 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1598 enum precedence
get_precedence () const FINAL OVERRIDE
1600 return PRECEDENCE_POSTFIX
;
1608 class access_field_of_lvalue
: public lvalue
1611 access_field_of_lvalue (context
*ctxt
,
1615 : lvalue (ctxt
, loc
, field
->get_type ()),
1620 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1622 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1625 string
* make_debug_string () FINAL OVERRIDE
;
1626 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1627 enum precedence
get_precedence () const FINAL OVERRIDE
1629 return PRECEDENCE_POSTFIX
;
1637 class access_field_rvalue
: public rvalue
1640 access_field_rvalue (context
*ctxt
,
1644 : rvalue (ctxt
, loc
, field
->get_type ()),
1649 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1651 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1654 string
* make_debug_string () FINAL OVERRIDE
;
1655 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1656 enum precedence
get_precedence () const FINAL OVERRIDE
1658 return PRECEDENCE_POSTFIX
;
1666 class dereference_field_rvalue
: public lvalue
1669 dereference_field_rvalue (context
*ctxt
,
1673 : lvalue (ctxt
, loc
, field
->get_type ()),
1678 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1680 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1683 string
* make_debug_string () FINAL OVERRIDE
;
1684 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1685 enum precedence
get_precedence () const FINAL OVERRIDE
1687 return PRECEDENCE_POSTFIX
;
1695 class dereference_rvalue
: public lvalue
1698 dereference_rvalue (context
*ctxt
,
1701 : lvalue (ctxt
, loc
, val
->get_type ()->dereference ()),
1704 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1706 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1709 string
* make_debug_string () FINAL OVERRIDE
;
1710 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1711 enum precedence
get_precedence () const FINAL OVERRIDE
1713 return PRECEDENCE_UNARY
;
1720 class get_address_of_lvalue
: public rvalue
1723 get_address_of_lvalue (context
*ctxt
,
1726 : rvalue (ctxt
, loc
, val
->get_type ()->get_pointer ()),
1730 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1732 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1735 string
* make_debug_string () FINAL OVERRIDE
;
1736 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1737 enum precedence
get_precedence () const FINAL OVERRIDE
1739 return PRECEDENCE_UNARY
;
1746 class function_pointer
: public rvalue
1749 function_pointer (context
*ctxt
,
1753 : rvalue (ctxt
, loc
, type
),
1756 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1758 void visit_children (rvalue_visitor
*v
) FINAL OVERRIDE
;
1761 string
* make_debug_string () FINAL OVERRIDE
;
1762 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1763 enum precedence
get_precedence () const FINAL OVERRIDE
1765 return PRECEDENCE_UNARY
;
1772 class local
: public lvalue
1775 local (function
*func
, location
*loc
, type
*type_
, string
*name
)
1776 : lvalue (func
->m_ctxt
, loc
, type_
),
1783 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1785 void visit_children (rvalue_visitor
*) FINAL OVERRIDE
{}
1787 void write_to_dump (dump
&d
) FINAL OVERRIDE
;
1790 string
* make_debug_string () FINAL OVERRIDE
{ return m_name
; }
1791 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1792 enum precedence
get_precedence () const FINAL OVERRIDE
1794 return PRECEDENCE_PRIMARY
;
1802 class statement
: public memento
1805 virtual vec
<block
*> get_successor_blocks () const;
1807 void write_to_dump (dump
&d
) FINAL OVERRIDE
;
1809 block
*get_block () const { return m_block
; }
1810 location
*get_loc () const { return m_loc
; }
1813 statement (block
*b
, location
*loc
)
1814 : memento (b
->m_ctxt
),
1818 playback::location
*
1819 playback_location (replayer
*r
) const
1821 return ::gcc::jit::recording::playback_location (r
, m_loc
);
1829 class eval
: public statement
1835 : statement (b
, loc
),
1836 m_rvalue (rvalue
) {}
1838 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1841 string
* make_debug_string () FINAL OVERRIDE
;
1842 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1848 class assignment
: public statement
1851 assignment (block
*b
,
1855 : statement (b
, loc
),
1857 m_rvalue (rvalue
) {}
1859 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1862 string
* make_debug_string () FINAL OVERRIDE
;
1863 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1870 class assignment_op
: public statement
1873 assignment_op (block
*b
,
1876 enum gcc_jit_binary_op op
,
1878 : statement (b
, loc
),
1881 m_rvalue (rvalue
) {}
1883 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1886 string
* make_debug_string () FINAL OVERRIDE
;
1887 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1891 enum gcc_jit_binary_op m_op
;
1895 class comment
: public statement
1901 : statement (b
, loc
),
1904 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1907 string
* make_debug_string () FINAL OVERRIDE
;
1908 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1914 class conditional
: public statement
1917 conditional (block
*b
,
1922 : statement (b
, loc
),
1923 m_boolval (boolval
),
1924 m_on_true (on_true
),
1925 m_on_false (on_false
) {}
1927 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1929 vec
<block
*> get_successor_blocks () const FINAL OVERRIDE
;
1932 string
* make_debug_string () FINAL OVERRIDE
;
1933 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1941 class jump
: public statement
1947 : statement (b
, loc
),
1948 m_target (target
) {}
1950 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1952 vec
<block
*> get_successor_blocks () const FINAL OVERRIDE
;
1955 string
* make_debug_string () FINAL OVERRIDE
;
1956 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1962 class return_
: public statement
1968 : statement (b
, loc
),
1969 m_rvalue (rvalue
) {}
1971 void replay_into (replayer
*r
) FINAL OVERRIDE
;
1973 vec
<block
*> get_successor_blocks () const FINAL OVERRIDE
;
1976 string
* make_debug_string () FINAL OVERRIDE
;
1977 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
1983 class case_
: public memento
1986 case_ (context
*ctxt
,
1991 m_min_value (min_value
),
1992 m_max_value (max_value
),
1993 m_dest_block (dest_block
)
1996 rvalue
*get_min_value () const { return m_min_value
; }
1997 rvalue
*get_max_value () const { return m_max_value
; }
1998 block
*get_dest_block () const { return m_dest_block
; }
2000 void replay_into (replayer
*) FINAL OVERRIDE
{ /* empty */ }
2002 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
2005 string
* make_debug_string () FINAL OVERRIDE
;
2008 rvalue
*m_min_value
;
2009 rvalue
*m_max_value
;
2010 block
*m_dest_block
;
2013 class switch_
: public statement
2019 block
*default_block
,
2023 void replay_into (replayer
*r
) FINAL OVERRIDE
;
2025 vec
<block
*> get_successor_blocks () const FINAL OVERRIDE
;
2028 string
* make_debug_string () FINAL OVERRIDE
;
2029 void write_reproducer (reproducer
&r
) FINAL OVERRIDE
;
2033 block
*m_default_block
;
2034 auto_vec
<case_
*> m_cases
;
2037 } // namespace gcc::jit::recording
2039 /* Create a recording::memento_of_new_rvalue_from_const instance and add
2040 it to this context's list of mementos.
2042 Implements the post-error-checking part of
2043 gcc_jit_context_new_rvalue_from_{int|long|double|ptr}. */
2045 template <typename HOST_TYPE
>
2047 recording::context::new_rvalue_from_const (recording::type
*type
,
2050 recording::rvalue
*result
=
2051 new memento_of_new_rvalue_from_const
<HOST_TYPE
> (this, NULL
, type
, value
);
2056 } // namespace gcc::jit
2060 #endif /* JIT_RECORDING_H */