136ac495dSmrg /* A C++ API for libgccjit, purely as inline wrapper functions.
2*8feb0f0bSmrg Copyright (C) 2014-2020 Free Software Foundation, Inc.
336ac495dSmrg
436ac495dSmrg This file is part of GCC.
536ac495dSmrg
636ac495dSmrg GCC is free software; you can redistribute it and/or modify it
736ac495dSmrg under the terms of the GNU General Public License as published by
836ac495dSmrg the Free Software Foundation; either version 3, or (at your option)
936ac495dSmrg any later version.
1036ac495dSmrg
1136ac495dSmrg GCC is distributed in the hope that it will be useful, but
1236ac495dSmrg WITHOUT ANY WARRANTY; without even the implied warranty of
1336ac495dSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1436ac495dSmrg General Public License for more details.
1536ac495dSmrg
1636ac495dSmrg You should have received a copy of the GNU General Public License
1736ac495dSmrg along with GCC; see the file COPYING3. If not see
1836ac495dSmrg <http://www.gnu.org/licenses/>. */
1936ac495dSmrg
2036ac495dSmrg #ifndef LIBGCCJIT_PLUS_PLUS_H
2136ac495dSmrg #define LIBGCCJIT_PLUS_PLUS_H
2236ac495dSmrg
2336ac495dSmrg #include "libgccjit.h"
2436ac495dSmrg
2536ac495dSmrg #include <limits>
2636ac495dSmrg #include <ostream>
2736ac495dSmrg #include <vector>
2836ac495dSmrg
2936ac495dSmrg /****************************************************************************
3036ac495dSmrg C++ API
3136ac495dSmrg ****************************************************************************/
3236ac495dSmrg
3336ac495dSmrg namespace gccjit
3436ac495dSmrg {
3536ac495dSmrg /* Indentation indicates inheritance. */
3636ac495dSmrg class context;
3736ac495dSmrg class error;
3836ac495dSmrg class object;
3936ac495dSmrg class location;
4036ac495dSmrg class field;
4136ac495dSmrg class type;
4236ac495dSmrg class struct_;
4336ac495dSmrg class function;
4436ac495dSmrg class block;
4536ac495dSmrg class rvalue;
4636ac495dSmrg class lvalue;
4736ac495dSmrg class param;
4836ac495dSmrg class case_;
4936ac495dSmrg class timer;
5036ac495dSmrg class auto_time;
5136ac495dSmrg
52*8feb0f0bSmrg namespace version {};
53*8feb0f0bSmrg
5436ac495dSmrg /* Errors within the API become C++ exceptions of this class. */
5536ac495dSmrg class error
5636ac495dSmrg {
5736ac495dSmrg };
5836ac495dSmrg
5936ac495dSmrg class object
6036ac495dSmrg {
6136ac495dSmrg public:
6236ac495dSmrg context get_context () const;
6336ac495dSmrg
6436ac495dSmrg std::string get_debug_string () const;
6536ac495dSmrg
6636ac495dSmrg protected:
6736ac495dSmrg object ();
6836ac495dSmrg object (gcc_jit_object *obj);
6936ac495dSmrg
7036ac495dSmrg gcc_jit_object *get_inner_object () const;
7136ac495dSmrg
7236ac495dSmrg private:
7336ac495dSmrg gcc_jit_object *m_inner_obj;
7436ac495dSmrg };
7536ac495dSmrg
7636ac495dSmrg inline std::ostream& operator << (std::ostream& stream, const object &obj);
7736ac495dSmrg
7836ac495dSmrg /* Some client code will want to supply source code locations, others
7936ac495dSmrg won't. To avoid doubling the number of entrypoints, everything
8036ac495dSmrg accepting a location also has a default argument. To do this, the
8136ac495dSmrg other classes need to see that "location" has a default constructor,
8236ac495dSmrg hence we need to declare it first. */
8336ac495dSmrg class location : public object
8436ac495dSmrg {
8536ac495dSmrg public:
8636ac495dSmrg location ();
8736ac495dSmrg location (gcc_jit_location *loc);
8836ac495dSmrg
8936ac495dSmrg gcc_jit_location *get_inner_location () const;
9036ac495dSmrg };
9136ac495dSmrg
9236ac495dSmrg class context
9336ac495dSmrg {
9436ac495dSmrg public:
9536ac495dSmrg static context acquire ();
9636ac495dSmrg context ();
9736ac495dSmrg context (gcc_jit_context *ctxt);
9836ac495dSmrg
9936ac495dSmrg gccjit::context new_child_context ();
10036ac495dSmrg
get_inner_context()10136ac495dSmrg gcc_jit_context *get_inner_context () { return m_inner_ctxt; }
10236ac495dSmrg
10336ac495dSmrg void release ();
10436ac495dSmrg
10536ac495dSmrg gcc_jit_result *compile ();
10636ac495dSmrg
10736ac495dSmrg void compile_to_file (enum gcc_jit_output_kind output_kind,
10836ac495dSmrg const char *output_path);
10936ac495dSmrg
11036ac495dSmrg void dump_to_file (const std::string &path,
11136ac495dSmrg bool update_locations);
11236ac495dSmrg
11336ac495dSmrg void set_logfile (FILE *logfile,
11436ac495dSmrg int flags,
11536ac495dSmrg int verbosity);
11636ac495dSmrg
11736ac495dSmrg void dump_reproducer_to_file (const char *path);
11836ac495dSmrg
11936ac495dSmrg void set_str_option (enum gcc_jit_str_option opt,
12036ac495dSmrg const char *value);
12136ac495dSmrg
12236ac495dSmrg void set_int_option (enum gcc_jit_int_option opt,
12336ac495dSmrg int value);
12436ac495dSmrg
12536ac495dSmrg void set_bool_option (enum gcc_jit_bool_option opt,
12636ac495dSmrg int value);
12736ac495dSmrg
12836ac495dSmrg void set_bool_allow_unreachable_blocks (int bool_value);
12936ac495dSmrg void set_bool_use_external_driver (int bool_value);
13036ac495dSmrg
13136ac495dSmrg void add_command_line_option (const char *optname);
132c0a68be4Smrg void add_driver_option (const char *optname);
13336ac495dSmrg
13436ac495dSmrg void set_timer (gccjit::timer t);
13536ac495dSmrg gccjit::timer get_timer () const;
13636ac495dSmrg
13736ac495dSmrg location
13836ac495dSmrg new_location (const std::string &filename,
13936ac495dSmrg int line,
14036ac495dSmrg int column);
14136ac495dSmrg
14236ac495dSmrg type get_type (enum gcc_jit_types kind);
14336ac495dSmrg type get_int_type (size_t num_bytes, int is_signed);
14436ac495dSmrg
14536ac495dSmrg /* A way to map a specific int type, using the compiler to
14636ac495dSmrg get the details automatically e.g.:
14736ac495dSmrg gccjit::type type = get_int_type <my_int_type_t> (); */
14836ac495dSmrg template <typename T>
14936ac495dSmrg type get_int_type ();
15036ac495dSmrg
15136ac495dSmrg type new_array_type (type element_type, int num_elements,
15236ac495dSmrg location loc = location ());
15336ac495dSmrg
15436ac495dSmrg field new_field (type type_, const std::string &name,
15536ac495dSmrg location loc = location ());
15636ac495dSmrg
157*8feb0f0bSmrg field new_bitfield (type type_, int width, const std::string &name,
158*8feb0f0bSmrg location loc = location ());
159*8feb0f0bSmrg
16036ac495dSmrg struct_ new_struct_type (const std::string &name,
16136ac495dSmrg std::vector<field> &fields,
16236ac495dSmrg location loc = location ());
16336ac495dSmrg
16436ac495dSmrg struct_ new_opaque_struct_type (const std::string &name,
16536ac495dSmrg location loc = location ());
16636ac495dSmrg
16736ac495dSmrg param new_param (type type_,
16836ac495dSmrg const std::string &name,
16936ac495dSmrg location loc = location ());
17036ac495dSmrg
17136ac495dSmrg function new_function (enum gcc_jit_function_kind kind,
17236ac495dSmrg type return_type,
17336ac495dSmrg const std::string &name,
17436ac495dSmrg std::vector<param> ¶ms,
17536ac495dSmrg int is_variadic,
17636ac495dSmrg location loc = location ());
17736ac495dSmrg
17836ac495dSmrg function get_builtin_function (const std::string &name);
17936ac495dSmrg
18036ac495dSmrg lvalue new_global (enum gcc_jit_global_kind kind,
18136ac495dSmrg type type_,
18236ac495dSmrg const std::string &name,
18336ac495dSmrg location loc = location ());
18436ac495dSmrg
18536ac495dSmrg rvalue new_rvalue (type numeric_type,
18636ac495dSmrg int value) const;
18736ac495dSmrg rvalue new_rvalue (type numeric_type,
18836ac495dSmrg long value) const;
18936ac495dSmrg rvalue zero (type numeric_type) const;
19036ac495dSmrg rvalue one (type numeric_type) const;
19136ac495dSmrg rvalue new_rvalue (type numeric_type,
19236ac495dSmrg double value) const;
19336ac495dSmrg rvalue new_rvalue (type pointer_type,
19436ac495dSmrg void *value) const;
19536ac495dSmrg rvalue new_rvalue (const std::string &value) const;
196a2dc1f3fSmrg rvalue new_rvalue (type vector_type,
197a2dc1f3fSmrg std::vector<rvalue> elements) const;
19836ac495dSmrg
19936ac495dSmrg /* Generic unary operations... */
20036ac495dSmrg rvalue new_unary_op (enum gcc_jit_unary_op op,
20136ac495dSmrg type result_type,
20236ac495dSmrg rvalue a,
20336ac495dSmrg location loc = location ());
20436ac495dSmrg
20536ac495dSmrg /* ...and shorter ways to spell the various specific kinds of
20636ac495dSmrg unary op. */
20736ac495dSmrg rvalue new_minus (type result_type,
20836ac495dSmrg rvalue a,
20936ac495dSmrg location loc = location ());
21036ac495dSmrg rvalue new_bitwise_negate (type result_type,
21136ac495dSmrg rvalue a,
21236ac495dSmrg location loc = location ());
21336ac495dSmrg rvalue new_logical_negate (type result_type,
21436ac495dSmrg rvalue a,
21536ac495dSmrg location loc = location ());
21636ac495dSmrg
21736ac495dSmrg /* Generic binary operations... */
21836ac495dSmrg rvalue new_binary_op (enum gcc_jit_binary_op op,
21936ac495dSmrg type result_type,
22036ac495dSmrg rvalue a, rvalue b,
22136ac495dSmrg location loc = location ());
22236ac495dSmrg
22336ac495dSmrg /* ...and shorter ways to spell the various specific kinds of
22436ac495dSmrg binary op. */
22536ac495dSmrg rvalue new_plus (type result_type,
22636ac495dSmrg rvalue a, rvalue b,
22736ac495dSmrg location loc = location ());
22836ac495dSmrg rvalue new_minus (type result_type,
22936ac495dSmrg rvalue a, rvalue b,
23036ac495dSmrg location loc = location ());
23136ac495dSmrg rvalue new_mult (type result_type,
23236ac495dSmrg rvalue a, rvalue b,
23336ac495dSmrg location loc = location ());
23436ac495dSmrg rvalue new_divide (type result_type,
23536ac495dSmrg rvalue a, rvalue b,
23636ac495dSmrg location loc = location ());
23736ac495dSmrg rvalue new_modulo (type result_type,
23836ac495dSmrg rvalue a, rvalue b,
23936ac495dSmrg location loc = location ());
24036ac495dSmrg rvalue new_bitwise_and (type result_type,
24136ac495dSmrg rvalue a, rvalue b,
24236ac495dSmrg location loc = location ());
24336ac495dSmrg rvalue new_bitwise_xor (type result_type,
24436ac495dSmrg rvalue a, rvalue b,
24536ac495dSmrg location loc = location ());
24636ac495dSmrg rvalue new_bitwise_or (type result_type,
24736ac495dSmrg rvalue a, rvalue b,
24836ac495dSmrg location loc = location ());
24936ac495dSmrg rvalue new_logical_and (type result_type,
25036ac495dSmrg rvalue a, rvalue b,
25136ac495dSmrg location loc = location ());
25236ac495dSmrg rvalue new_logical_or (type result_type,
25336ac495dSmrg rvalue a, rvalue b,
25436ac495dSmrg location loc = location ());
25536ac495dSmrg
25636ac495dSmrg /* Generic comparisons... */
25736ac495dSmrg rvalue new_comparison (enum gcc_jit_comparison op,
25836ac495dSmrg rvalue a, rvalue b,
25936ac495dSmrg location loc = location ());
26036ac495dSmrg /* ...and shorter ways to spell the various specific kinds of
26136ac495dSmrg comparison. */
26236ac495dSmrg rvalue new_eq (rvalue a, rvalue b,
26336ac495dSmrg location loc = location ());
26436ac495dSmrg rvalue new_ne (rvalue a, rvalue b,
26536ac495dSmrg location loc = location ());
26636ac495dSmrg rvalue new_lt (rvalue a, rvalue b,
26736ac495dSmrg location loc = location ());
26836ac495dSmrg rvalue new_le (rvalue a, rvalue b,
26936ac495dSmrg location loc = location ());
27036ac495dSmrg rvalue new_gt (rvalue a, rvalue b,
27136ac495dSmrg location loc = location ());
27236ac495dSmrg rvalue new_ge (rvalue a, rvalue b,
27336ac495dSmrg location loc = location ());
27436ac495dSmrg
27536ac495dSmrg /* The most general way of creating a function call. */
27636ac495dSmrg rvalue new_call (function func,
27736ac495dSmrg std::vector<rvalue> &args,
27836ac495dSmrg location loc = location ());
27936ac495dSmrg
28036ac495dSmrg /* In addition, we provide a series of overloaded "new_call" methods
28136ac495dSmrg for specific numbers of args (from 0 - 6), to avoid the need for
28236ac495dSmrg client code to manually build a vector. */
28336ac495dSmrg rvalue new_call (function func,
28436ac495dSmrg location loc = location ());
28536ac495dSmrg rvalue new_call (function func,
28636ac495dSmrg rvalue arg0,
28736ac495dSmrg location loc = location ());
28836ac495dSmrg rvalue new_call (function func,
28936ac495dSmrg rvalue arg0, rvalue arg1,
29036ac495dSmrg location loc = location ());
29136ac495dSmrg rvalue new_call (function func,
29236ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2,
29336ac495dSmrg location loc = location ());
29436ac495dSmrg rvalue new_call (function func,
29536ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2,
29636ac495dSmrg rvalue arg3,
29736ac495dSmrg location loc = location ());
29836ac495dSmrg rvalue new_call (function func,
29936ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2,
30036ac495dSmrg rvalue arg3, rvalue arg4,
30136ac495dSmrg location loc = location ());
30236ac495dSmrg rvalue new_call (function func,
30336ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2,
30436ac495dSmrg rvalue arg3, rvalue arg4, rvalue arg5,
30536ac495dSmrg location loc = location ());
30636ac495dSmrg
30736ac495dSmrg rvalue new_cast (rvalue expr,
30836ac495dSmrg type type_,
30936ac495dSmrg location loc = location ());
31036ac495dSmrg
31136ac495dSmrg lvalue new_array_access (rvalue ptr,
31236ac495dSmrg rvalue index,
31336ac495dSmrg location loc = location ());
31436ac495dSmrg
31536ac495dSmrg case_ new_case (rvalue min_value,
31636ac495dSmrg rvalue max_value,
31736ac495dSmrg block dest_block);
31836ac495dSmrg
31936ac495dSmrg private:
32036ac495dSmrg gcc_jit_context *m_inner_ctxt;
32136ac495dSmrg };
32236ac495dSmrg
32336ac495dSmrg class field : public object
32436ac495dSmrg {
32536ac495dSmrg public:
32636ac495dSmrg field ();
32736ac495dSmrg field (gcc_jit_field *inner);
32836ac495dSmrg
32936ac495dSmrg gcc_jit_field *get_inner_field () const;
33036ac495dSmrg };
33136ac495dSmrg
33236ac495dSmrg class type : public object
33336ac495dSmrg {
33436ac495dSmrg public:
33536ac495dSmrg type ();
33636ac495dSmrg type (gcc_jit_type *inner);
33736ac495dSmrg
33836ac495dSmrg gcc_jit_type *get_inner_type () const;
33936ac495dSmrg
34036ac495dSmrg type get_pointer ();
341a2dc1f3fSmrg type get_const ();
34236ac495dSmrg type get_volatile ();
343a2dc1f3fSmrg type get_aligned (size_t alignment_in_bytes);
344a2dc1f3fSmrg type get_vector (size_t num_units);
34536ac495dSmrg
34636ac495dSmrg // Shortcuts for getting values of numeric types:
34736ac495dSmrg rvalue zero ();
34836ac495dSmrg rvalue one ();
34936ac495dSmrg };
35036ac495dSmrg
35136ac495dSmrg class struct_ : public type
35236ac495dSmrg {
35336ac495dSmrg public:
35436ac495dSmrg struct_ ();
35536ac495dSmrg struct_ (gcc_jit_struct *inner);
35636ac495dSmrg
35736ac495dSmrg gcc_jit_struct *get_inner_struct () const;
35836ac495dSmrg };
35936ac495dSmrg
36036ac495dSmrg class function : public object
36136ac495dSmrg {
36236ac495dSmrg public:
36336ac495dSmrg function ();
36436ac495dSmrg function (gcc_jit_function *func);
36536ac495dSmrg
36636ac495dSmrg gcc_jit_function *get_inner_function () const;
36736ac495dSmrg
36836ac495dSmrg void dump_to_dot (const std::string &path);
36936ac495dSmrg
37036ac495dSmrg param get_param (int index) const;
37136ac495dSmrg
37236ac495dSmrg block new_block ();
37336ac495dSmrg block new_block (const std::string &name);
37436ac495dSmrg
37536ac495dSmrg lvalue new_local (type type_,
37636ac495dSmrg const std::string &name,
37736ac495dSmrg location loc = location ());
37836ac495dSmrg
379a2dc1f3fSmrg rvalue get_address (location loc = location ());
380a2dc1f3fSmrg
38136ac495dSmrg /* A series of overloaded operator () with various numbers of arguments
38236ac495dSmrg for a very terse way of creating a call to this function. The call
38336ac495dSmrg is created within the same context as the function itself, which may
38436ac495dSmrg not be what you want. */
38536ac495dSmrg rvalue operator() (location loc = location ());
38636ac495dSmrg rvalue operator() (rvalue arg0,
38736ac495dSmrg location loc = location ());
38836ac495dSmrg rvalue operator() (rvalue arg0, rvalue arg1,
38936ac495dSmrg location loc = location ());
39036ac495dSmrg rvalue operator() (rvalue arg0, rvalue arg1, rvalue arg2,
39136ac495dSmrg location loc = location ());
39236ac495dSmrg };
39336ac495dSmrg
39436ac495dSmrg class block : public object
39536ac495dSmrg {
39636ac495dSmrg public:
39736ac495dSmrg block ();
39836ac495dSmrg block (gcc_jit_block *inner);
39936ac495dSmrg
40036ac495dSmrg gcc_jit_block *get_inner_block () const;
40136ac495dSmrg
40236ac495dSmrg function get_function () const;
40336ac495dSmrg
40436ac495dSmrg void add_eval (rvalue rvalue,
40536ac495dSmrg location loc = location ());
40636ac495dSmrg
40736ac495dSmrg void add_assignment (lvalue lvalue,
40836ac495dSmrg rvalue rvalue,
40936ac495dSmrg location loc = location ());
41036ac495dSmrg
41136ac495dSmrg void add_assignment_op (lvalue lvalue,
41236ac495dSmrg enum gcc_jit_binary_op op,
41336ac495dSmrg rvalue rvalue,
41436ac495dSmrg location loc = location ());
41536ac495dSmrg
41636ac495dSmrg /* A way to add a function call to the body of a function being
41736ac495dSmrg defined, with various numbers of args. */
41836ac495dSmrg rvalue add_call (function other,
41936ac495dSmrg location loc = location ());
42036ac495dSmrg rvalue add_call (function other,
42136ac495dSmrg rvalue arg0,
42236ac495dSmrg location loc = location ());
42336ac495dSmrg rvalue add_call (function other,
42436ac495dSmrg rvalue arg0, rvalue arg1,
42536ac495dSmrg location loc = location ());
42636ac495dSmrg rvalue add_call (function other,
42736ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2,
42836ac495dSmrg location loc = location ());
42936ac495dSmrg rvalue add_call (function other,
43036ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2, rvalue arg3,
43136ac495dSmrg location loc = location ());
43236ac495dSmrg
43336ac495dSmrg void add_comment (const std::string &text,
43436ac495dSmrg location loc = location ());
43536ac495dSmrg
43636ac495dSmrg void end_with_conditional (rvalue boolval,
43736ac495dSmrg block on_true,
43836ac495dSmrg block on_false,
43936ac495dSmrg location loc = location ());
44036ac495dSmrg
44136ac495dSmrg void end_with_jump (block target,
44236ac495dSmrg location loc = location ());
44336ac495dSmrg
44436ac495dSmrg void end_with_return (rvalue rvalue,
44536ac495dSmrg location loc = location ());
44636ac495dSmrg void end_with_return (location loc = location ());
44736ac495dSmrg
44836ac495dSmrg void end_with_switch (rvalue expr,
44936ac495dSmrg block default_block,
45036ac495dSmrg std::vector <case_> cases,
45136ac495dSmrg location loc = location ());
45236ac495dSmrg };
45336ac495dSmrg
45436ac495dSmrg class rvalue : public object
45536ac495dSmrg {
45636ac495dSmrg public:
45736ac495dSmrg rvalue ();
45836ac495dSmrg rvalue (gcc_jit_rvalue *inner);
45936ac495dSmrg gcc_jit_rvalue *get_inner_rvalue () const;
46036ac495dSmrg
46136ac495dSmrg type get_type ();
46236ac495dSmrg
46336ac495dSmrg rvalue access_field (field field,
46436ac495dSmrg location loc = location ());
46536ac495dSmrg
46636ac495dSmrg lvalue dereference_field (field field,
46736ac495dSmrg location loc = location ());
46836ac495dSmrg
46936ac495dSmrg lvalue dereference (location loc = location ());
47036ac495dSmrg
47136ac495dSmrg rvalue cast_to (type type_,
47236ac495dSmrg location loc = location ());
47336ac495dSmrg
47436ac495dSmrg /* Array access. */
47536ac495dSmrg lvalue operator[] (rvalue index);
47636ac495dSmrg lvalue operator[] (int index);
47736ac495dSmrg };
47836ac495dSmrg
47936ac495dSmrg class lvalue : public rvalue
48036ac495dSmrg {
48136ac495dSmrg public:
48236ac495dSmrg lvalue ();
48336ac495dSmrg lvalue (gcc_jit_lvalue *inner);
48436ac495dSmrg
48536ac495dSmrg gcc_jit_lvalue *get_inner_lvalue () const;
48636ac495dSmrg
48736ac495dSmrg lvalue access_field (field field,
48836ac495dSmrg location loc = location ());
48936ac495dSmrg
49036ac495dSmrg rvalue get_address (location loc = location ());
49136ac495dSmrg };
49236ac495dSmrg
49336ac495dSmrg class param : public lvalue
49436ac495dSmrg {
49536ac495dSmrg public:
49636ac495dSmrg param ();
49736ac495dSmrg param (gcc_jit_param *inner);
49836ac495dSmrg
49936ac495dSmrg gcc_jit_param *get_inner_param () const;
50036ac495dSmrg };
50136ac495dSmrg
50236ac495dSmrg class case_ : public object
50336ac495dSmrg {
50436ac495dSmrg public:
50536ac495dSmrg case_ ();
50636ac495dSmrg case_ (gcc_jit_case *inner);
50736ac495dSmrg
50836ac495dSmrg gcc_jit_case *get_inner_case () const;
50936ac495dSmrg };
51036ac495dSmrg
51136ac495dSmrg /* Overloaded operators, for those who want the most terse API
51236ac495dSmrg (at the possible risk of being a little too magical).
51336ac495dSmrg
51436ac495dSmrg In each case, the first parameter is used to determine which context
51536ac495dSmrg owns the resulting expression, and, where appropriate, what the
51636ac495dSmrg latter's type is. */
51736ac495dSmrg
51836ac495dSmrg /* Unary operators. */
51936ac495dSmrg rvalue operator- (rvalue a); // unary minus
52036ac495dSmrg rvalue operator~ (rvalue a); // unary bitwise negate
52136ac495dSmrg rvalue operator! (rvalue a); // unary logical negate
52236ac495dSmrg
52336ac495dSmrg /* Binary operators. */
52436ac495dSmrg rvalue operator+ (rvalue a, rvalue b);
52536ac495dSmrg rvalue operator- (rvalue a, rvalue b);
52636ac495dSmrg rvalue operator* (rvalue a, rvalue b);
52736ac495dSmrg rvalue operator/ (rvalue a, rvalue b);
52836ac495dSmrg rvalue operator% (rvalue a, rvalue b);
52936ac495dSmrg rvalue operator& (rvalue a, rvalue b); // bitwise and
53036ac495dSmrg rvalue operator^ (rvalue a, rvalue b); // bitwise_xor
53136ac495dSmrg rvalue operator| (rvalue a, rvalue b); // bitwise_or
53236ac495dSmrg rvalue operator&& (rvalue a, rvalue b); // logical_and
53336ac495dSmrg rvalue operator|| (rvalue a, rvalue b); // logical_or
53436ac495dSmrg
53536ac495dSmrg /* Comparisons. */
53636ac495dSmrg rvalue operator== (rvalue a, rvalue b);
53736ac495dSmrg rvalue operator!= (rvalue a, rvalue b);
53836ac495dSmrg rvalue operator< (rvalue a, rvalue b);
53936ac495dSmrg rvalue operator<= (rvalue a, rvalue b);
54036ac495dSmrg rvalue operator> (rvalue a, rvalue b);
54136ac495dSmrg rvalue operator>= (rvalue a, rvalue b);
54236ac495dSmrg
54336ac495dSmrg /* Dereferencing. */
54436ac495dSmrg lvalue operator* (rvalue ptr);
54536ac495dSmrg
54636ac495dSmrg class timer
54736ac495dSmrg {
54836ac495dSmrg public:
54936ac495dSmrg timer ();
55036ac495dSmrg timer (gcc_jit_timer *inner_timer);
55136ac495dSmrg
55236ac495dSmrg void push (const char *item_name);
55336ac495dSmrg void pop (const char *item_name);
55436ac495dSmrg void print (FILE *f_out) const;
55536ac495dSmrg
55636ac495dSmrg void release ();
55736ac495dSmrg
55836ac495dSmrg gcc_jit_timer *get_inner_timer () const;
55936ac495dSmrg
56036ac495dSmrg private:
56136ac495dSmrg gcc_jit_timer *m_inner_timer;
56236ac495dSmrg };
56336ac495dSmrg
56436ac495dSmrg class auto_time
56536ac495dSmrg {
56636ac495dSmrg public:
56736ac495dSmrg auto_time (timer t, const char *item_name);
56836ac495dSmrg auto_time (context ctxt, const char *item_name);
56936ac495dSmrg ~auto_time ();
57036ac495dSmrg
57136ac495dSmrg private:
57236ac495dSmrg timer m_timer;
57336ac495dSmrg const char *m_item_name;
57436ac495dSmrg };
57536ac495dSmrg }
57636ac495dSmrg
57736ac495dSmrg /****************************************************************************
57836ac495dSmrg Implementation of the API
57936ac495dSmrg ****************************************************************************/
58036ac495dSmrg namespace gccjit {
58136ac495dSmrg
58236ac495dSmrg // class context
acquire()58336ac495dSmrg inline context context::acquire ()
58436ac495dSmrg {
58536ac495dSmrg return context (gcc_jit_context_acquire ());
58636ac495dSmrg }
context()58736ac495dSmrg inline context::context () : m_inner_ctxt (NULL) {}
context(gcc_jit_context * inner)58836ac495dSmrg inline context::context (gcc_jit_context *inner) : m_inner_ctxt (inner)
58936ac495dSmrg {
59036ac495dSmrg if (!inner)
59136ac495dSmrg throw error ();
59236ac495dSmrg }
59336ac495dSmrg
59436ac495dSmrg inline gccjit::context
new_child_context()59536ac495dSmrg context::new_child_context ()
59636ac495dSmrg {
59736ac495dSmrg return context (gcc_jit_context_new_child_context (m_inner_ctxt));
59836ac495dSmrg }
59936ac495dSmrg
60036ac495dSmrg inline void
release()60136ac495dSmrg context::release ()
60236ac495dSmrg {
60336ac495dSmrg gcc_jit_context_release (m_inner_ctxt);
60436ac495dSmrg m_inner_ctxt = NULL;
60536ac495dSmrg }
60636ac495dSmrg
60736ac495dSmrg inline gcc_jit_result *
compile()60836ac495dSmrg context::compile ()
60936ac495dSmrg {
61036ac495dSmrg gcc_jit_result *result = gcc_jit_context_compile (m_inner_ctxt);
61136ac495dSmrg if (!result)
61236ac495dSmrg throw error ();
61336ac495dSmrg return result;
61436ac495dSmrg }
61536ac495dSmrg
61636ac495dSmrg inline void
compile_to_file(enum gcc_jit_output_kind output_kind,const char * output_path)61736ac495dSmrg context::compile_to_file (enum gcc_jit_output_kind output_kind,
61836ac495dSmrg const char *output_path)
61936ac495dSmrg {
62036ac495dSmrg gcc_jit_context_compile_to_file (m_inner_ctxt,
62136ac495dSmrg output_kind,
62236ac495dSmrg output_path);
62336ac495dSmrg }
62436ac495dSmrg
62536ac495dSmrg inline void
dump_to_file(const std::string & path,bool update_locations)62636ac495dSmrg context::dump_to_file (const std::string &path,
62736ac495dSmrg bool update_locations)
62836ac495dSmrg {
62936ac495dSmrg gcc_jit_context_dump_to_file (m_inner_ctxt,
63036ac495dSmrg path.c_str (),
63136ac495dSmrg update_locations);
63236ac495dSmrg }
63336ac495dSmrg
63436ac495dSmrg inline void
set_logfile(FILE * logfile,int flags,int verbosity)63536ac495dSmrg context::set_logfile (FILE *logfile,
63636ac495dSmrg int flags,
63736ac495dSmrg int verbosity)
63836ac495dSmrg {
63936ac495dSmrg gcc_jit_context_set_logfile (m_inner_ctxt,
64036ac495dSmrg logfile,
64136ac495dSmrg flags,
64236ac495dSmrg verbosity);
64336ac495dSmrg }
64436ac495dSmrg
64536ac495dSmrg inline void
dump_reproducer_to_file(const char * path)64636ac495dSmrg context::dump_reproducer_to_file (const char *path)
64736ac495dSmrg {
64836ac495dSmrg gcc_jit_context_dump_reproducer_to_file (m_inner_ctxt,
64936ac495dSmrg path);
65036ac495dSmrg }
65136ac495dSmrg
65236ac495dSmrg inline void
set_str_option(enum gcc_jit_str_option opt,const char * value)65336ac495dSmrg context::set_str_option (enum gcc_jit_str_option opt,
65436ac495dSmrg const char *value)
65536ac495dSmrg {
65636ac495dSmrg gcc_jit_context_set_str_option (m_inner_ctxt, opt, value);
65736ac495dSmrg
65836ac495dSmrg }
65936ac495dSmrg
66036ac495dSmrg inline void
set_int_option(enum gcc_jit_int_option opt,int value)66136ac495dSmrg context::set_int_option (enum gcc_jit_int_option opt,
66236ac495dSmrg int value)
66336ac495dSmrg {
66436ac495dSmrg gcc_jit_context_set_int_option (m_inner_ctxt, opt, value);
66536ac495dSmrg
66636ac495dSmrg }
66736ac495dSmrg
66836ac495dSmrg inline void
set_bool_option(enum gcc_jit_bool_option opt,int value)66936ac495dSmrg context::set_bool_option (enum gcc_jit_bool_option opt,
67036ac495dSmrg int value)
67136ac495dSmrg {
67236ac495dSmrg gcc_jit_context_set_bool_option (m_inner_ctxt, opt, value);
67336ac495dSmrg }
67436ac495dSmrg
67536ac495dSmrg inline void
set_bool_allow_unreachable_blocks(int bool_value)67636ac495dSmrg context::set_bool_allow_unreachable_blocks (int bool_value)
67736ac495dSmrg {
67836ac495dSmrg gcc_jit_context_set_bool_allow_unreachable_blocks (m_inner_ctxt,
67936ac495dSmrg bool_value);
68036ac495dSmrg }
68136ac495dSmrg
68236ac495dSmrg inline void
set_bool_use_external_driver(int bool_value)68336ac495dSmrg context::set_bool_use_external_driver (int bool_value)
68436ac495dSmrg {
68536ac495dSmrg gcc_jit_context_set_bool_use_external_driver (m_inner_ctxt,
68636ac495dSmrg bool_value);
68736ac495dSmrg }
68836ac495dSmrg
68936ac495dSmrg inline void
add_command_line_option(const char * optname)69036ac495dSmrg context::add_command_line_option (const char *optname)
69136ac495dSmrg {
69236ac495dSmrg gcc_jit_context_add_command_line_option (m_inner_ctxt, optname);
69336ac495dSmrg }
69436ac495dSmrg
69536ac495dSmrg inline void
add_driver_option(const char * optname)696c0a68be4Smrg context::add_driver_option (const char *optname)
697c0a68be4Smrg {
698c0a68be4Smrg gcc_jit_context_add_driver_option (m_inner_ctxt, optname);
699c0a68be4Smrg }
700c0a68be4Smrg
701c0a68be4Smrg inline void
set_timer(gccjit::timer t)70236ac495dSmrg context::set_timer (gccjit::timer t)
70336ac495dSmrg {
70436ac495dSmrg gcc_jit_context_set_timer (m_inner_ctxt, t.get_inner_timer ());
70536ac495dSmrg }
70636ac495dSmrg
70736ac495dSmrg inline gccjit::timer
get_timer()70836ac495dSmrg context::get_timer () const
70936ac495dSmrg {
71036ac495dSmrg return gccjit::timer (gcc_jit_context_get_timer (m_inner_ctxt));
71136ac495dSmrg }
71236ac495dSmrg
71336ac495dSmrg
71436ac495dSmrg inline location
new_location(const std::string & filename,int line,int column)71536ac495dSmrg context::new_location (const std::string &filename,
71636ac495dSmrg int line,
71736ac495dSmrg int column)
71836ac495dSmrg {
71936ac495dSmrg return location (gcc_jit_context_new_location (m_inner_ctxt,
72036ac495dSmrg filename.c_str (),
72136ac495dSmrg line,
72236ac495dSmrg column));
72336ac495dSmrg }
72436ac495dSmrg
72536ac495dSmrg inline type
get_type(enum gcc_jit_types kind)72636ac495dSmrg context::get_type (enum gcc_jit_types kind)
72736ac495dSmrg {
72836ac495dSmrg return type (gcc_jit_context_get_type (m_inner_ctxt, kind));
72936ac495dSmrg }
73036ac495dSmrg
73136ac495dSmrg inline type
get_int_type(size_t num_bytes,int is_signed)73236ac495dSmrg context::get_int_type (size_t num_bytes, int is_signed)
73336ac495dSmrg {
73436ac495dSmrg return type (gcc_jit_context_get_int_type (m_inner_ctxt,
73536ac495dSmrg num_bytes,
73636ac495dSmrg is_signed));
73736ac495dSmrg }
73836ac495dSmrg
73936ac495dSmrg template <typename T>
74036ac495dSmrg inline type
get_int_type()74136ac495dSmrg context::get_int_type ()
74236ac495dSmrg {
74336ac495dSmrg return get_int_type (sizeof (T), std::numeric_limits<T>::is_signed);
74436ac495dSmrg }
74536ac495dSmrg
74636ac495dSmrg inline type
new_array_type(type element_type,int num_elements,location loc)74736ac495dSmrg context::new_array_type (type element_type, int num_elements, location loc)
74836ac495dSmrg {
74936ac495dSmrg return type (gcc_jit_context_new_array_type (
75036ac495dSmrg m_inner_ctxt,
75136ac495dSmrg loc.get_inner_location (),
75236ac495dSmrg element_type.get_inner_type (),
75336ac495dSmrg num_elements));
75436ac495dSmrg }
75536ac495dSmrg
75636ac495dSmrg inline field
new_field(type type_,const std::string & name,location loc)75736ac495dSmrg context::new_field (type type_, const std::string &name, location loc)
75836ac495dSmrg {
75936ac495dSmrg return field (gcc_jit_context_new_field (m_inner_ctxt,
76036ac495dSmrg loc.get_inner_location (),
76136ac495dSmrg type_.get_inner_type (),
76236ac495dSmrg name.c_str ()));
76336ac495dSmrg }
76436ac495dSmrg
765*8feb0f0bSmrg inline field
new_bitfield(type type_,int width,const std::string & name,location loc)766*8feb0f0bSmrg context::new_bitfield (type type_, int width, const std::string &name,
767*8feb0f0bSmrg location loc)
768*8feb0f0bSmrg {
769*8feb0f0bSmrg return field (gcc_jit_context_new_bitfield (m_inner_ctxt,
770*8feb0f0bSmrg loc.get_inner_location (),
771*8feb0f0bSmrg type_.get_inner_type (),
772*8feb0f0bSmrg width,
773*8feb0f0bSmrg name.c_str ()));
774*8feb0f0bSmrg }
775*8feb0f0bSmrg
77636ac495dSmrg inline struct_
new_struct_type(const std::string & name,std::vector<field> & fields,location loc)77736ac495dSmrg context::new_struct_type (const std::string &name,
77836ac495dSmrg std::vector<field> &fields,
77936ac495dSmrg location loc)
78036ac495dSmrg {
78136ac495dSmrg /* Treat std::vector as an array, relying on it not being resized: */
78236ac495dSmrg field *as_array_of_wrappers = &fields[0];
78336ac495dSmrg
78436ac495dSmrg /* Treat the array as being of the underlying pointers, relying on
78536ac495dSmrg the wrapper type being such a pointer internally. */
78636ac495dSmrg gcc_jit_field **as_array_of_ptrs =
78736ac495dSmrg reinterpret_cast<gcc_jit_field **> (as_array_of_wrappers);
78836ac495dSmrg
78936ac495dSmrg return struct_ (gcc_jit_context_new_struct_type (m_inner_ctxt,
79036ac495dSmrg loc.get_inner_location (),
79136ac495dSmrg name.c_str (),
79236ac495dSmrg fields.size (),
79336ac495dSmrg as_array_of_ptrs));
79436ac495dSmrg }
79536ac495dSmrg
79636ac495dSmrg inline struct_
new_opaque_struct_type(const std::string & name,location loc)79736ac495dSmrg context::new_opaque_struct_type (const std::string &name,
79836ac495dSmrg location loc)
79936ac495dSmrg {
80036ac495dSmrg return struct_ (gcc_jit_context_new_opaque_struct (
80136ac495dSmrg m_inner_ctxt,
80236ac495dSmrg loc.get_inner_location (),
80336ac495dSmrg name.c_str ()));
80436ac495dSmrg }
80536ac495dSmrg
80636ac495dSmrg inline param
new_param(type type_,const std::string & name,location loc)80736ac495dSmrg context::new_param (type type_,
80836ac495dSmrg const std::string &name,
80936ac495dSmrg location loc)
81036ac495dSmrg {
81136ac495dSmrg return param (gcc_jit_context_new_param (m_inner_ctxt,
81236ac495dSmrg loc.get_inner_location (),
81336ac495dSmrg type_.get_inner_type (),
81436ac495dSmrg name.c_str ()));
81536ac495dSmrg }
81636ac495dSmrg
81736ac495dSmrg inline function
new_function(enum gcc_jit_function_kind kind,type return_type,const std::string & name,std::vector<param> & params,int is_variadic,location loc)81836ac495dSmrg context::new_function (enum gcc_jit_function_kind kind,
81936ac495dSmrg type return_type,
82036ac495dSmrg const std::string &name,
82136ac495dSmrg std::vector<param> ¶ms,
82236ac495dSmrg int is_variadic,
82336ac495dSmrg location loc)
82436ac495dSmrg {
82536ac495dSmrg /* Treat std::vector as an array, relying on it not being resized: */
82636ac495dSmrg param *as_array_of_wrappers = ¶ms[0];
82736ac495dSmrg
82836ac495dSmrg /* Treat the array as being of the underlying pointers, relying on
82936ac495dSmrg the wrapper type being such a pointer internally. */
83036ac495dSmrg gcc_jit_param **as_array_of_ptrs =
83136ac495dSmrg reinterpret_cast<gcc_jit_param **> (as_array_of_wrappers);
83236ac495dSmrg
83336ac495dSmrg return function (gcc_jit_context_new_function (m_inner_ctxt,
83436ac495dSmrg loc.get_inner_location (),
83536ac495dSmrg kind,
83636ac495dSmrg return_type.get_inner_type (),
83736ac495dSmrg name.c_str (),
83836ac495dSmrg params.size (),
83936ac495dSmrg as_array_of_ptrs,
84036ac495dSmrg is_variadic));
84136ac495dSmrg }
84236ac495dSmrg
84336ac495dSmrg inline function
get_builtin_function(const std::string & name)84436ac495dSmrg context::get_builtin_function (const std::string &name)
84536ac495dSmrg {
84636ac495dSmrg return function (gcc_jit_context_get_builtin_function (m_inner_ctxt,
84736ac495dSmrg name.c_str ()));
84836ac495dSmrg }
84936ac495dSmrg
85036ac495dSmrg inline lvalue
new_global(enum gcc_jit_global_kind kind,type type_,const std::string & name,location loc)85136ac495dSmrg context::new_global (enum gcc_jit_global_kind kind,
85236ac495dSmrg type type_,
85336ac495dSmrg const std::string &name,
85436ac495dSmrg location loc)
85536ac495dSmrg {
85636ac495dSmrg return lvalue (gcc_jit_context_new_global (m_inner_ctxt,
85736ac495dSmrg loc.get_inner_location (),
85836ac495dSmrg kind,
85936ac495dSmrg type_.get_inner_type (),
86036ac495dSmrg name.c_str ()));
86136ac495dSmrg }
86236ac495dSmrg
86336ac495dSmrg inline rvalue
new_rvalue(type numeric_type,int value)86436ac495dSmrg context::new_rvalue (type numeric_type,
86536ac495dSmrg int value) const
86636ac495dSmrg {
86736ac495dSmrg return rvalue (
86836ac495dSmrg gcc_jit_context_new_rvalue_from_int (m_inner_ctxt,
86936ac495dSmrg numeric_type.get_inner_type (),
87036ac495dSmrg value));
87136ac495dSmrg }
87236ac495dSmrg
87336ac495dSmrg inline rvalue
new_rvalue(type numeric_type,long value)87436ac495dSmrg context::new_rvalue (type numeric_type,
87536ac495dSmrg long value) const
87636ac495dSmrg {
87736ac495dSmrg return rvalue (
87836ac495dSmrg gcc_jit_context_new_rvalue_from_long (m_inner_ctxt,
87936ac495dSmrg numeric_type.get_inner_type (),
88036ac495dSmrg value));
88136ac495dSmrg }
88236ac495dSmrg
88336ac495dSmrg inline rvalue
zero(type numeric_type)88436ac495dSmrg context::zero (type numeric_type) const
88536ac495dSmrg {
88636ac495dSmrg return rvalue (gcc_jit_context_zero (m_inner_ctxt,
88736ac495dSmrg numeric_type.get_inner_type ()));
88836ac495dSmrg }
88936ac495dSmrg
89036ac495dSmrg inline rvalue
one(type numeric_type)89136ac495dSmrg context::one (type numeric_type) const
89236ac495dSmrg {
89336ac495dSmrg return rvalue (gcc_jit_context_one (m_inner_ctxt,
89436ac495dSmrg numeric_type.get_inner_type ()));
89536ac495dSmrg }
89636ac495dSmrg
89736ac495dSmrg inline rvalue
new_rvalue(type numeric_type,double value)89836ac495dSmrg context::new_rvalue (type numeric_type,
89936ac495dSmrg double value) const
90036ac495dSmrg {
90136ac495dSmrg return rvalue (
90236ac495dSmrg gcc_jit_context_new_rvalue_from_double (m_inner_ctxt,
90336ac495dSmrg numeric_type.get_inner_type (),
90436ac495dSmrg value));
90536ac495dSmrg }
90636ac495dSmrg
90736ac495dSmrg inline rvalue
new_rvalue(type pointer_type,void * value)90836ac495dSmrg context::new_rvalue (type pointer_type,
90936ac495dSmrg void *value) const
91036ac495dSmrg {
91136ac495dSmrg return rvalue (
91236ac495dSmrg gcc_jit_context_new_rvalue_from_ptr (m_inner_ctxt,
91336ac495dSmrg pointer_type.get_inner_type (),
91436ac495dSmrg value));
91536ac495dSmrg }
91636ac495dSmrg
91736ac495dSmrg inline rvalue
new_rvalue(const std::string & value)91836ac495dSmrg context::new_rvalue (const std::string &value) const
91936ac495dSmrg {
92036ac495dSmrg return rvalue (
92136ac495dSmrg gcc_jit_context_new_string_literal (m_inner_ctxt, value.c_str ()));
92236ac495dSmrg }
92336ac495dSmrg
92436ac495dSmrg inline rvalue
new_rvalue(type vector_type,std::vector<rvalue> elements)925a2dc1f3fSmrg context::new_rvalue (type vector_type,
926a2dc1f3fSmrg std::vector<rvalue> elements) const
927a2dc1f3fSmrg {
928a2dc1f3fSmrg /* Treat std::vector as an array, relying on it not being resized: */
929a2dc1f3fSmrg rvalue *as_array_of_wrappers = &elements[0];
930a2dc1f3fSmrg
931a2dc1f3fSmrg /* Treat the array as being of the underlying pointers, relying on
932a2dc1f3fSmrg the wrapper type being such a pointer internally. */
933a2dc1f3fSmrg gcc_jit_rvalue **as_array_of_ptrs =
934a2dc1f3fSmrg reinterpret_cast<gcc_jit_rvalue **> (as_array_of_wrappers);
935a2dc1f3fSmrg
936a2dc1f3fSmrg return rvalue (
937a2dc1f3fSmrg gcc_jit_context_new_rvalue_from_vector (m_inner_ctxt,
938a2dc1f3fSmrg NULL,
939a2dc1f3fSmrg vector_type.get_inner_type (),
940a2dc1f3fSmrg elements.size (),
941a2dc1f3fSmrg as_array_of_ptrs));
942a2dc1f3fSmrg }
943a2dc1f3fSmrg
944a2dc1f3fSmrg inline rvalue
new_unary_op(enum gcc_jit_unary_op op,type result_type,rvalue a,location loc)94536ac495dSmrg context::new_unary_op (enum gcc_jit_unary_op op,
94636ac495dSmrg type result_type,
94736ac495dSmrg rvalue a,
94836ac495dSmrg location loc)
94936ac495dSmrg {
95036ac495dSmrg return rvalue (gcc_jit_context_new_unary_op (m_inner_ctxt,
95136ac495dSmrg loc.get_inner_location (),
95236ac495dSmrg op,
95336ac495dSmrg result_type.get_inner_type (),
95436ac495dSmrg a.get_inner_rvalue ()));
95536ac495dSmrg }
95636ac495dSmrg inline rvalue
new_minus(type result_type,rvalue a,location loc)95736ac495dSmrg context::new_minus (type result_type,
95836ac495dSmrg rvalue a,
95936ac495dSmrg location loc)
96036ac495dSmrg {
96136ac495dSmrg return rvalue (new_unary_op (GCC_JIT_UNARY_OP_MINUS,
96236ac495dSmrg result_type, a, loc));
96336ac495dSmrg }
96436ac495dSmrg inline rvalue
new_bitwise_negate(type result_type,rvalue a,location loc)96536ac495dSmrg context::new_bitwise_negate (type result_type,
96636ac495dSmrg rvalue a,
96736ac495dSmrg location loc)
96836ac495dSmrg {
96936ac495dSmrg return rvalue (new_unary_op (GCC_JIT_UNARY_OP_BITWISE_NEGATE,
97036ac495dSmrg result_type, a, loc));
97136ac495dSmrg }
97236ac495dSmrg inline rvalue
new_logical_negate(type result_type,rvalue a,location loc)97336ac495dSmrg context::new_logical_negate (type result_type,
97436ac495dSmrg rvalue a,
97536ac495dSmrg location loc)
97636ac495dSmrg {
97736ac495dSmrg return rvalue (new_unary_op (GCC_JIT_UNARY_OP_LOGICAL_NEGATE,
97836ac495dSmrg result_type, a, loc));
97936ac495dSmrg }
98036ac495dSmrg
98136ac495dSmrg inline rvalue
new_binary_op(enum gcc_jit_binary_op op,type result_type,rvalue a,rvalue b,location loc)98236ac495dSmrg context::new_binary_op (enum gcc_jit_binary_op op,
98336ac495dSmrg type result_type,
98436ac495dSmrg rvalue a, rvalue b,
98536ac495dSmrg location loc)
98636ac495dSmrg {
98736ac495dSmrg return rvalue (gcc_jit_context_new_binary_op (m_inner_ctxt,
98836ac495dSmrg loc.get_inner_location (),
98936ac495dSmrg op,
99036ac495dSmrg result_type.get_inner_type (),
99136ac495dSmrg a.get_inner_rvalue (),
99236ac495dSmrg b.get_inner_rvalue ()));
99336ac495dSmrg }
99436ac495dSmrg inline rvalue
new_plus(type result_type,rvalue a,rvalue b,location loc)99536ac495dSmrg context::new_plus (type result_type,
99636ac495dSmrg rvalue a, rvalue b,
99736ac495dSmrg location loc)
99836ac495dSmrg {
99936ac495dSmrg return new_binary_op (GCC_JIT_BINARY_OP_PLUS,
100036ac495dSmrg result_type, a, b, loc);
100136ac495dSmrg }
100236ac495dSmrg inline rvalue
new_minus(type result_type,rvalue a,rvalue b,location loc)100336ac495dSmrg context::new_minus (type result_type,
100436ac495dSmrg rvalue a, rvalue b,
100536ac495dSmrg location loc)
100636ac495dSmrg {
100736ac495dSmrg return new_binary_op (GCC_JIT_BINARY_OP_MINUS,
100836ac495dSmrg result_type, a, b, loc);
100936ac495dSmrg }
101036ac495dSmrg inline rvalue
new_mult(type result_type,rvalue a,rvalue b,location loc)101136ac495dSmrg context::new_mult (type result_type,
101236ac495dSmrg rvalue a, rvalue b,
101336ac495dSmrg location loc)
101436ac495dSmrg {
101536ac495dSmrg return new_binary_op (GCC_JIT_BINARY_OP_MULT,
101636ac495dSmrg result_type, a, b, loc);
101736ac495dSmrg }
101836ac495dSmrg inline rvalue
new_divide(type result_type,rvalue a,rvalue b,location loc)101936ac495dSmrg context::new_divide (type result_type,
102036ac495dSmrg rvalue a, rvalue b,
102136ac495dSmrg location loc)
102236ac495dSmrg {
102336ac495dSmrg return new_binary_op (GCC_JIT_BINARY_OP_DIVIDE,
102436ac495dSmrg result_type, a, b, loc);
102536ac495dSmrg }
102636ac495dSmrg inline rvalue
new_modulo(type result_type,rvalue a,rvalue b,location loc)102736ac495dSmrg context::new_modulo (type result_type,
102836ac495dSmrg rvalue a, rvalue b,
102936ac495dSmrg location loc)
103036ac495dSmrg {
103136ac495dSmrg return new_binary_op (GCC_JIT_BINARY_OP_MODULO,
103236ac495dSmrg result_type, a, b, loc);
103336ac495dSmrg }
103436ac495dSmrg inline rvalue
new_bitwise_and(type result_type,rvalue a,rvalue b,location loc)103536ac495dSmrg context::new_bitwise_and (type result_type,
103636ac495dSmrg rvalue a, rvalue b,
103736ac495dSmrg location loc)
103836ac495dSmrg {
103936ac495dSmrg return new_binary_op (GCC_JIT_BINARY_OP_BITWISE_AND,
104036ac495dSmrg result_type, a, b, loc);
104136ac495dSmrg }
104236ac495dSmrg inline rvalue
new_bitwise_xor(type result_type,rvalue a,rvalue b,location loc)104336ac495dSmrg context::new_bitwise_xor (type result_type,
104436ac495dSmrg rvalue a, rvalue b,
104536ac495dSmrg location loc)
104636ac495dSmrg {
104736ac495dSmrg return new_binary_op (GCC_JIT_BINARY_OP_BITWISE_XOR,
104836ac495dSmrg result_type, a, b, loc);
104936ac495dSmrg }
105036ac495dSmrg inline rvalue
new_bitwise_or(type result_type,rvalue a,rvalue b,location loc)105136ac495dSmrg context::new_bitwise_or (type result_type,
105236ac495dSmrg rvalue a, rvalue b,
105336ac495dSmrg location loc)
105436ac495dSmrg {
105536ac495dSmrg return new_binary_op (GCC_JIT_BINARY_OP_BITWISE_OR,
105636ac495dSmrg result_type, a, b, loc);
105736ac495dSmrg }
105836ac495dSmrg inline rvalue
new_logical_and(type result_type,rvalue a,rvalue b,location loc)105936ac495dSmrg context::new_logical_and (type result_type,
106036ac495dSmrg rvalue a, rvalue b,
106136ac495dSmrg location loc)
106236ac495dSmrg {
106336ac495dSmrg return new_binary_op (GCC_JIT_BINARY_OP_LOGICAL_AND,
106436ac495dSmrg result_type, a, b, loc);
106536ac495dSmrg }
106636ac495dSmrg inline rvalue
new_logical_or(type result_type,rvalue a,rvalue b,location loc)106736ac495dSmrg context::new_logical_or (type result_type,
106836ac495dSmrg rvalue a, rvalue b,
106936ac495dSmrg location loc)
107036ac495dSmrg {
107136ac495dSmrg return new_binary_op (GCC_JIT_BINARY_OP_LOGICAL_OR,
107236ac495dSmrg result_type, a, b, loc);
107336ac495dSmrg }
107436ac495dSmrg
107536ac495dSmrg inline rvalue
new_comparison(enum gcc_jit_comparison op,rvalue a,rvalue b,location loc)107636ac495dSmrg context::new_comparison (enum gcc_jit_comparison op,
107736ac495dSmrg rvalue a, rvalue b,
107836ac495dSmrg location loc)
107936ac495dSmrg {
108036ac495dSmrg return rvalue (gcc_jit_context_new_comparison (m_inner_ctxt,
108136ac495dSmrg loc.get_inner_location (),
108236ac495dSmrg op,
108336ac495dSmrg a.get_inner_rvalue (),
108436ac495dSmrg b.get_inner_rvalue ()));
108536ac495dSmrg }
108636ac495dSmrg inline rvalue
new_eq(rvalue a,rvalue b,location loc)108736ac495dSmrg context::new_eq (rvalue a, rvalue b,
108836ac495dSmrg location loc)
108936ac495dSmrg {
109036ac495dSmrg return new_comparison (GCC_JIT_COMPARISON_EQ,
109136ac495dSmrg a, b, loc);
109236ac495dSmrg }
109336ac495dSmrg inline rvalue
new_ne(rvalue a,rvalue b,location loc)109436ac495dSmrg context::new_ne (rvalue a, rvalue b,
109536ac495dSmrg location loc)
109636ac495dSmrg {
109736ac495dSmrg return new_comparison (GCC_JIT_COMPARISON_NE,
109836ac495dSmrg a, b, loc);
109936ac495dSmrg }
110036ac495dSmrg inline rvalue
new_lt(rvalue a,rvalue b,location loc)110136ac495dSmrg context::new_lt (rvalue a, rvalue b,
110236ac495dSmrg location loc)
110336ac495dSmrg {
110436ac495dSmrg return new_comparison (GCC_JIT_COMPARISON_LT,
110536ac495dSmrg a, b, loc);
110636ac495dSmrg }
110736ac495dSmrg inline rvalue
new_le(rvalue a,rvalue b,location loc)110836ac495dSmrg context::new_le (rvalue a, rvalue b,
110936ac495dSmrg location loc)
111036ac495dSmrg {
111136ac495dSmrg return new_comparison (GCC_JIT_COMPARISON_LE,
111236ac495dSmrg a, b, loc);
111336ac495dSmrg }
111436ac495dSmrg inline rvalue
new_gt(rvalue a,rvalue b,location loc)111536ac495dSmrg context::new_gt (rvalue a, rvalue b,
111636ac495dSmrg location loc)
111736ac495dSmrg {
111836ac495dSmrg return new_comparison (GCC_JIT_COMPARISON_GT,
111936ac495dSmrg a, b, loc);
112036ac495dSmrg }
112136ac495dSmrg inline rvalue
new_ge(rvalue a,rvalue b,location loc)112236ac495dSmrg context::new_ge (rvalue a, rvalue b,
112336ac495dSmrg location loc)
112436ac495dSmrg {
112536ac495dSmrg return new_comparison (GCC_JIT_COMPARISON_GE,
112636ac495dSmrg a, b, loc);
112736ac495dSmrg }
112836ac495dSmrg
112936ac495dSmrg inline rvalue
new_call(function func,std::vector<rvalue> & args,location loc)113036ac495dSmrg context::new_call (function func,
113136ac495dSmrg std::vector<rvalue> &args,
113236ac495dSmrg location loc)
113336ac495dSmrg {
113436ac495dSmrg /* Treat std::vector as an array, relying on it not being resized: */
113536ac495dSmrg rvalue *as_array_of_wrappers = &args[0];
113636ac495dSmrg
113736ac495dSmrg /* Treat the array as being of the underlying pointers, relying on
113836ac495dSmrg the wrapper type being such a pointer internally. */
113936ac495dSmrg gcc_jit_rvalue **as_array_of_ptrs =
114036ac495dSmrg reinterpret_cast<gcc_jit_rvalue **> (as_array_of_wrappers);
114136ac495dSmrg return gcc_jit_context_new_call (m_inner_ctxt,
114236ac495dSmrg loc.get_inner_location (),
114336ac495dSmrg func.get_inner_function (),
114436ac495dSmrg args.size (),
114536ac495dSmrg as_array_of_ptrs);
114636ac495dSmrg }
114736ac495dSmrg inline rvalue
new_call(function func,location loc)114836ac495dSmrg context::new_call (function func,
114936ac495dSmrg location loc)
115036ac495dSmrg {
115136ac495dSmrg std::vector<rvalue> args;
115236ac495dSmrg return new_call (func, args, loc);
115336ac495dSmrg }
115436ac495dSmrg
115536ac495dSmrg inline rvalue
new_call(function func,rvalue arg0,location loc)115636ac495dSmrg context::new_call (function func,
115736ac495dSmrg rvalue arg0,
115836ac495dSmrg location loc)
115936ac495dSmrg {
116036ac495dSmrg std::vector<rvalue> args(1);
116136ac495dSmrg args[0] = arg0;
116236ac495dSmrg return new_call (func, args, loc);
116336ac495dSmrg }
116436ac495dSmrg inline rvalue
new_call(function func,rvalue arg0,rvalue arg1,location loc)116536ac495dSmrg context::new_call (function func,
116636ac495dSmrg rvalue arg0, rvalue arg1,
116736ac495dSmrg location loc)
116836ac495dSmrg {
116936ac495dSmrg std::vector<rvalue> args(2);
117036ac495dSmrg args[0] = arg0;
117136ac495dSmrg args[1] = arg1;
117236ac495dSmrg return new_call (func, args, loc);
117336ac495dSmrg }
117436ac495dSmrg inline rvalue
new_call(function func,rvalue arg0,rvalue arg1,rvalue arg2,location loc)117536ac495dSmrg context::new_call (function func,
117636ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2,
117736ac495dSmrg location loc)
117836ac495dSmrg {
117936ac495dSmrg std::vector<rvalue> args(3);
118036ac495dSmrg args[0] = arg0;
118136ac495dSmrg args[1] = arg1;
118236ac495dSmrg args[2] = arg2;
118336ac495dSmrg return new_call (func, args, loc);
118436ac495dSmrg }
118536ac495dSmrg inline rvalue
new_call(function func,rvalue arg0,rvalue arg1,rvalue arg2,rvalue arg3,location loc)118636ac495dSmrg context::new_call (function func,
118736ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2,
118836ac495dSmrg rvalue arg3,
118936ac495dSmrg location loc)
119036ac495dSmrg {
119136ac495dSmrg std::vector<rvalue> args(4);
119236ac495dSmrg args[0] = arg0;
119336ac495dSmrg args[1] = arg1;
119436ac495dSmrg args[2] = arg2;
119536ac495dSmrg args[3] = arg3;
119636ac495dSmrg return new_call (func, args, loc);
119736ac495dSmrg }
119836ac495dSmrg inline rvalue
new_call(function func,rvalue arg0,rvalue arg1,rvalue arg2,rvalue arg3,rvalue arg4,location loc)119936ac495dSmrg context::new_call (function func,
120036ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2,
120136ac495dSmrg rvalue arg3, rvalue arg4,
120236ac495dSmrg location loc)
120336ac495dSmrg {
120436ac495dSmrg std::vector<rvalue> args(5);
120536ac495dSmrg args[0] = arg0;
120636ac495dSmrg args[1] = arg1;
120736ac495dSmrg args[2] = arg2;
120836ac495dSmrg args[3] = arg3;
120936ac495dSmrg args[4] = arg4;
121036ac495dSmrg return new_call (func, args, loc);
121136ac495dSmrg }
121236ac495dSmrg inline rvalue
new_call(function func,rvalue arg0,rvalue arg1,rvalue arg2,rvalue arg3,rvalue arg4,rvalue arg5,location loc)121336ac495dSmrg context::new_call (function func,
121436ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2,
121536ac495dSmrg rvalue arg3, rvalue arg4, rvalue arg5,
121636ac495dSmrg location loc)
121736ac495dSmrg {
121836ac495dSmrg std::vector<rvalue> args(6);
121936ac495dSmrg args[0] = arg0;
122036ac495dSmrg args[1] = arg1;
122136ac495dSmrg args[2] = arg2;
122236ac495dSmrg args[3] = arg3;
122336ac495dSmrg args[4] = arg4;
122436ac495dSmrg args[5] = arg5;
122536ac495dSmrg return new_call (func, args, loc);
122636ac495dSmrg }
122736ac495dSmrg
122836ac495dSmrg inline rvalue
new_cast(rvalue expr,type type_,location loc)122936ac495dSmrg context::new_cast (rvalue expr,
123036ac495dSmrg type type_,
123136ac495dSmrg location loc)
123236ac495dSmrg {
123336ac495dSmrg return rvalue (gcc_jit_context_new_cast (m_inner_ctxt,
123436ac495dSmrg loc.get_inner_location (),
123536ac495dSmrg expr.get_inner_rvalue (),
123636ac495dSmrg type_.get_inner_type ()));
123736ac495dSmrg }
123836ac495dSmrg
123936ac495dSmrg inline lvalue
new_array_access(rvalue ptr,rvalue index,location loc)124036ac495dSmrg context::new_array_access (rvalue ptr,
124136ac495dSmrg rvalue index,
124236ac495dSmrg location loc)
124336ac495dSmrg {
124436ac495dSmrg return lvalue (gcc_jit_context_new_array_access (m_inner_ctxt,
124536ac495dSmrg loc.get_inner_location (),
124636ac495dSmrg ptr.get_inner_rvalue (),
124736ac495dSmrg index.get_inner_rvalue ()));
124836ac495dSmrg }
124936ac495dSmrg
125036ac495dSmrg inline case_
new_case(rvalue min_value,rvalue max_value,block dest_block)125136ac495dSmrg context::new_case (rvalue min_value,
125236ac495dSmrg rvalue max_value,
125336ac495dSmrg block dest_block)
125436ac495dSmrg {
125536ac495dSmrg return case_ (gcc_jit_context_new_case (m_inner_ctxt,
125636ac495dSmrg min_value.get_inner_rvalue (),
125736ac495dSmrg max_value.get_inner_rvalue (),
125836ac495dSmrg dest_block.get_inner_block ()));
125936ac495dSmrg }
126036ac495dSmrg
126136ac495dSmrg // class object
126236ac495dSmrg inline context
get_context()126336ac495dSmrg object::get_context () const
126436ac495dSmrg {
126536ac495dSmrg return context (gcc_jit_object_get_context (m_inner_obj));
126636ac495dSmrg }
126736ac495dSmrg
126836ac495dSmrg inline std::string
get_debug_string()126936ac495dSmrg object::get_debug_string () const
127036ac495dSmrg {
127136ac495dSmrg return gcc_jit_object_get_debug_string (m_inner_obj);
127236ac495dSmrg }
127336ac495dSmrg
object()127436ac495dSmrg inline object::object () : m_inner_obj (NULL) {}
object(gcc_jit_object * obj)127536ac495dSmrg inline object::object (gcc_jit_object *obj) : m_inner_obj (obj)
127636ac495dSmrg {
127736ac495dSmrg if (!obj)
127836ac495dSmrg throw error ();
127936ac495dSmrg }
128036ac495dSmrg
128136ac495dSmrg inline gcc_jit_object *
get_inner_object()128236ac495dSmrg object::get_inner_object () const
128336ac495dSmrg {
128436ac495dSmrg return m_inner_obj;
128536ac495dSmrg }
128636ac495dSmrg
128736ac495dSmrg inline std::ostream&
128836ac495dSmrg operator << (std::ostream& stream, const object &obj)
128936ac495dSmrg {
129036ac495dSmrg return stream << obj.get_debug_string ();
129136ac495dSmrg }
129236ac495dSmrg
129336ac495dSmrg // class location
location()129436ac495dSmrg inline location::location () : object () {}
location(gcc_jit_location * loc)129536ac495dSmrg inline location::location (gcc_jit_location *loc)
129636ac495dSmrg : object (gcc_jit_location_as_object (loc))
129736ac495dSmrg {}
129836ac495dSmrg
129936ac495dSmrg inline gcc_jit_location *
get_inner_location()130036ac495dSmrg location::get_inner_location () const
130136ac495dSmrg {
130236ac495dSmrg /* Manual downcast: */
130336ac495dSmrg return reinterpret_cast<gcc_jit_location *> (get_inner_object ());
130436ac495dSmrg }
130536ac495dSmrg
130636ac495dSmrg // class field
field()130736ac495dSmrg inline field::field () : object () {}
field(gcc_jit_field * inner)130836ac495dSmrg inline field::field (gcc_jit_field *inner)
130936ac495dSmrg : object (gcc_jit_field_as_object (inner))
131036ac495dSmrg {}
131136ac495dSmrg
131236ac495dSmrg inline gcc_jit_field *
get_inner_field()131336ac495dSmrg field::get_inner_field () const
131436ac495dSmrg {
131536ac495dSmrg /* Manual downcast: */
131636ac495dSmrg return reinterpret_cast<gcc_jit_field *> (get_inner_object ());
131736ac495dSmrg }
131836ac495dSmrg
131936ac495dSmrg // class type
type()132036ac495dSmrg inline type::type () : object () {}
type(gcc_jit_type * inner)132136ac495dSmrg inline type::type (gcc_jit_type *inner)
132236ac495dSmrg : object (gcc_jit_type_as_object (inner))
132336ac495dSmrg {}
132436ac495dSmrg
132536ac495dSmrg inline gcc_jit_type *
get_inner_type()132636ac495dSmrg type::get_inner_type () const
132736ac495dSmrg {
132836ac495dSmrg /* Manual downcast: */
132936ac495dSmrg return reinterpret_cast<gcc_jit_type *> (get_inner_object ());
133036ac495dSmrg }
133136ac495dSmrg
133236ac495dSmrg inline type
get_pointer()133336ac495dSmrg type::get_pointer ()
133436ac495dSmrg {
133536ac495dSmrg return type (gcc_jit_type_get_pointer (get_inner_type ()));
133636ac495dSmrg }
133736ac495dSmrg
133836ac495dSmrg inline type
get_const()1339a2dc1f3fSmrg type::get_const ()
1340a2dc1f3fSmrg {
1341a2dc1f3fSmrg return type (gcc_jit_type_get_const (get_inner_type ()));
1342a2dc1f3fSmrg }
1343a2dc1f3fSmrg
1344a2dc1f3fSmrg inline type
get_volatile()134536ac495dSmrg type::get_volatile ()
134636ac495dSmrg {
134736ac495dSmrg return type (gcc_jit_type_get_volatile (get_inner_type ()));
134836ac495dSmrg }
134936ac495dSmrg
1350a2dc1f3fSmrg inline type
get_aligned(size_t alignment_in_bytes)1351a2dc1f3fSmrg type::get_aligned (size_t alignment_in_bytes)
1352a2dc1f3fSmrg {
1353a2dc1f3fSmrg return type (gcc_jit_type_get_aligned (get_inner_type (),
1354a2dc1f3fSmrg alignment_in_bytes));
1355a2dc1f3fSmrg }
1356a2dc1f3fSmrg
1357a2dc1f3fSmrg inline type
get_vector(size_t num_units)1358a2dc1f3fSmrg type::get_vector (size_t num_units)
1359a2dc1f3fSmrg {
1360a2dc1f3fSmrg return type (gcc_jit_type_get_vector (get_inner_type (),
1361a2dc1f3fSmrg num_units));
1362a2dc1f3fSmrg }
1363a2dc1f3fSmrg
136436ac495dSmrg inline rvalue
zero()136536ac495dSmrg type::zero ()
136636ac495dSmrg {
136736ac495dSmrg return get_context ().new_rvalue (*this, 0);
136836ac495dSmrg }
136936ac495dSmrg
137036ac495dSmrg inline rvalue
one()137136ac495dSmrg type::one ()
137236ac495dSmrg {
137336ac495dSmrg return get_context ().new_rvalue (*this, 1);
137436ac495dSmrg }
137536ac495dSmrg
137636ac495dSmrg // class struct_
struct_()137736ac495dSmrg inline struct_::struct_ () : type (NULL) {}
struct_(gcc_jit_struct * inner)137836ac495dSmrg inline struct_::struct_ (gcc_jit_struct *inner) :
137936ac495dSmrg type (gcc_jit_struct_as_type (inner))
138036ac495dSmrg {
138136ac495dSmrg }
138236ac495dSmrg
138336ac495dSmrg inline gcc_jit_struct *
get_inner_struct()138436ac495dSmrg struct_::get_inner_struct () const
138536ac495dSmrg {
138636ac495dSmrg /* Manual downcast: */
138736ac495dSmrg return reinterpret_cast<gcc_jit_struct *> (get_inner_object ());
138836ac495dSmrg }
138936ac495dSmrg
139036ac495dSmrg // class function
function()139136ac495dSmrg inline function::function () : object () {}
function(gcc_jit_function * inner)139236ac495dSmrg inline function::function (gcc_jit_function *inner)
139336ac495dSmrg : object (gcc_jit_function_as_object (inner))
139436ac495dSmrg {}
139536ac495dSmrg
139636ac495dSmrg inline gcc_jit_function *
get_inner_function()139736ac495dSmrg function::get_inner_function () const
139836ac495dSmrg {
139936ac495dSmrg /* Manual downcast: */
140036ac495dSmrg return reinterpret_cast<gcc_jit_function *> (get_inner_object ());
140136ac495dSmrg }
140236ac495dSmrg
140336ac495dSmrg inline void
dump_to_dot(const std::string & path)140436ac495dSmrg function::dump_to_dot (const std::string &path)
140536ac495dSmrg {
140636ac495dSmrg gcc_jit_function_dump_to_dot (get_inner_function (),
140736ac495dSmrg path.c_str ());
140836ac495dSmrg }
140936ac495dSmrg
141036ac495dSmrg inline param
get_param(int index)141136ac495dSmrg function::get_param (int index) const
141236ac495dSmrg {
141336ac495dSmrg return param (gcc_jit_function_get_param (get_inner_function (),
141436ac495dSmrg index));
141536ac495dSmrg }
141636ac495dSmrg
141736ac495dSmrg inline block
new_block()141836ac495dSmrg function::new_block ()
141936ac495dSmrg {
142036ac495dSmrg return block (gcc_jit_function_new_block (get_inner_function (),
142136ac495dSmrg NULL));
142236ac495dSmrg }
142336ac495dSmrg
142436ac495dSmrg inline block
new_block(const std::string & name)142536ac495dSmrg function::new_block (const std::string &name)
142636ac495dSmrg {
142736ac495dSmrg return block (gcc_jit_function_new_block (get_inner_function (),
142836ac495dSmrg name.c_str ()));
142936ac495dSmrg }
143036ac495dSmrg
143136ac495dSmrg inline lvalue
new_local(type type_,const std::string & name,location loc)143236ac495dSmrg function::new_local (type type_,
143336ac495dSmrg const std::string &name,
143436ac495dSmrg location loc)
143536ac495dSmrg {
143636ac495dSmrg return lvalue (gcc_jit_function_new_local (get_inner_function (),
143736ac495dSmrg loc.get_inner_location (),
143836ac495dSmrg type_.get_inner_type (),
143936ac495dSmrg name.c_str ()));
144036ac495dSmrg }
144136ac495dSmrg
1442a2dc1f3fSmrg inline rvalue
get_address(location loc)1443a2dc1f3fSmrg function::get_address (location loc)
1444a2dc1f3fSmrg {
1445a2dc1f3fSmrg return rvalue (gcc_jit_function_get_address (get_inner_function (),
1446a2dc1f3fSmrg loc.get_inner_location ()));
1447a2dc1f3fSmrg }
1448a2dc1f3fSmrg
144936ac495dSmrg inline function
get_function()145036ac495dSmrg block::get_function () const
145136ac495dSmrg {
145236ac495dSmrg return function (gcc_jit_block_get_function ( get_inner_block ()));
145336ac495dSmrg }
145436ac495dSmrg
145536ac495dSmrg inline void
add_eval(rvalue rvalue,location loc)145636ac495dSmrg block::add_eval (rvalue rvalue,
145736ac495dSmrg location loc)
145836ac495dSmrg {
145936ac495dSmrg gcc_jit_block_add_eval (get_inner_block (),
146036ac495dSmrg loc.get_inner_location (),
146136ac495dSmrg rvalue.get_inner_rvalue ());
146236ac495dSmrg }
146336ac495dSmrg
146436ac495dSmrg inline void
add_assignment(lvalue lvalue,rvalue rvalue,location loc)146536ac495dSmrg block::add_assignment (lvalue lvalue,
146636ac495dSmrg rvalue rvalue,
146736ac495dSmrg location loc)
146836ac495dSmrg {
146936ac495dSmrg gcc_jit_block_add_assignment (get_inner_block (),
147036ac495dSmrg loc.get_inner_location (),
147136ac495dSmrg lvalue.get_inner_lvalue (),
147236ac495dSmrg rvalue.get_inner_rvalue ());
147336ac495dSmrg }
147436ac495dSmrg
147536ac495dSmrg inline void
add_assignment_op(lvalue lvalue,enum gcc_jit_binary_op op,rvalue rvalue,location loc)147636ac495dSmrg block::add_assignment_op (lvalue lvalue,
147736ac495dSmrg enum gcc_jit_binary_op op,
147836ac495dSmrg rvalue rvalue,
147936ac495dSmrg location loc)
148036ac495dSmrg {
148136ac495dSmrg gcc_jit_block_add_assignment_op (get_inner_block (),
148236ac495dSmrg loc.get_inner_location (),
148336ac495dSmrg lvalue.get_inner_lvalue (),
148436ac495dSmrg op,
148536ac495dSmrg rvalue.get_inner_rvalue ());
148636ac495dSmrg }
148736ac495dSmrg
148836ac495dSmrg inline void
add_comment(const std::string & text,location loc)148936ac495dSmrg block::add_comment (const std::string &text,
149036ac495dSmrg location loc)
149136ac495dSmrg {
149236ac495dSmrg gcc_jit_block_add_comment (get_inner_block (),
149336ac495dSmrg loc.get_inner_location (),
149436ac495dSmrg text.c_str ());
149536ac495dSmrg }
149636ac495dSmrg
149736ac495dSmrg inline void
end_with_conditional(rvalue boolval,block on_true,block on_false,location loc)149836ac495dSmrg block::end_with_conditional (rvalue boolval,
149936ac495dSmrg block on_true,
150036ac495dSmrg block on_false,
150136ac495dSmrg location loc)
150236ac495dSmrg {
150336ac495dSmrg gcc_jit_block_end_with_conditional (get_inner_block (),
150436ac495dSmrg loc.get_inner_location (),
150536ac495dSmrg boolval.get_inner_rvalue (),
150636ac495dSmrg on_true.get_inner_block (),
150736ac495dSmrg on_false.get_inner_block ());
150836ac495dSmrg }
150936ac495dSmrg
151036ac495dSmrg inline void
end_with_jump(block target,location loc)151136ac495dSmrg block::end_with_jump (block target,
151236ac495dSmrg location loc)
151336ac495dSmrg {
151436ac495dSmrg gcc_jit_block_end_with_jump (get_inner_block (),
151536ac495dSmrg loc.get_inner_location (),
151636ac495dSmrg target.get_inner_block ());
151736ac495dSmrg }
151836ac495dSmrg
151936ac495dSmrg inline void
end_with_return(rvalue rvalue,location loc)152036ac495dSmrg block::end_with_return (rvalue rvalue,
152136ac495dSmrg location loc)
152236ac495dSmrg {
152336ac495dSmrg gcc_jit_block_end_with_return (get_inner_block (),
152436ac495dSmrg loc.get_inner_location (),
152536ac495dSmrg rvalue.get_inner_rvalue ());
152636ac495dSmrg }
152736ac495dSmrg
152836ac495dSmrg inline void
end_with_return(location loc)152936ac495dSmrg block::end_with_return (location loc)
153036ac495dSmrg {
153136ac495dSmrg gcc_jit_block_end_with_void_return (get_inner_block (),
153236ac495dSmrg loc.get_inner_location ());
153336ac495dSmrg }
153436ac495dSmrg
153536ac495dSmrg inline void
end_with_switch(rvalue expr,block default_block,std::vector<case_> cases,location loc)153636ac495dSmrg block::end_with_switch (rvalue expr,
153736ac495dSmrg block default_block,
153836ac495dSmrg std::vector <case_> cases,
153936ac495dSmrg location loc)
154036ac495dSmrg {
154136ac495dSmrg /* Treat std::vector as an array, relying on it not being resized: */
154236ac495dSmrg case_ *as_array_of_wrappers = &cases[0];
154336ac495dSmrg
154436ac495dSmrg /* Treat the array as being of the underlying pointers, relying on
154536ac495dSmrg the wrapper type being such a pointer internally. */
154636ac495dSmrg gcc_jit_case **as_array_of_ptrs =
154736ac495dSmrg reinterpret_cast<gcc_jit_case **> (as_array_of_wrappers);
154836ac495dSmrg gcc_jit_block_end_with_switch (get_inner_block (),
154936ac495dSmrg loc.get_inner_location (),
155036ac495dSmrg expr.get_inner_rvalue (),
155136ac495dSmrg default_block.get_inner_block (),
155236ac495dSmrg cases.size (),
155336ac495dSmrg as_array_of_ptrs);
155436ac495dSmrg }
155536ac495dSmrg
155636ac495dSmrg inline rvalue
add_call(function other,location loc)155736ac495dSmrg block::add_call (function other,
155836ac495dSmrg location loc)
155936ac495dSmrg {
156036ac495dSmrg rvalue c = get_context ().new_call (other, loc);
156136ac495dSmrg add_eval (c);
156236ac495dSmrg return c;
156336ac495dSmrg }
156436ac495dSmrg inline rvalue
add_call(function other,rvalue arg0,location loc)156536ac495dSmrg block::add_call (function other,
156636ac495dSmrg rvalue arg0,
156736ac495dSmrg location loc)
156836ac495dSmrg {
156936ac495dSmrg rvalue c = get_context ().new_call (other, arg0, loc);
157036ac495dSmrg add_eval (c);
157136ac495dSmrg return c;
157236ac495dSmrg }
157336ac495dSmrg inline rvalue
add_call(function other,rvalue arg0,rvalue arg1,location loc)157436ac495dSmrg block::add_call (function other,
157536ac495dSmrg rvalue arg0, rvalue arg1,
157636ac495dSmrg location loc)
157736ac495dSmrg {
157836ac495dSmrg rvalue c = get_context ().new_call (other, arg0, arg1, loc);
157936ac495dSmrg add_eval (c);
158036ac495dSmrg return c;
158136ac495dSmrg }
158236ac495dSmrg inline rvalue
add_call(function other,rvalue arg0,rvalue arg1,rvalue arg2,location loc)158336ac495dSmrg block::add_call (function other,
158436ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2,
158536ac495dSmrg location loc)
158636ac495dSmrg {
158736ac495dSmrg rvalue c = get_context ().new_call (other, arg0, arg1, arg2, loc);
158836ac495dSmrg add_eval (c);
158936ac495dSmrg return c;
159036ac495dSmrg }
159136ac495dSmrg
159236ac495dSmrg inline rvalue
add_call(function other,rvalue arg0,rvalue arg1,rvalue arg2,rvalue arg3,location loc)159336ac495dSmrg block::add_call (function other,
159436ac495dSmrg rvalue arg0, rvalue arg1, rvalue arg2, rvalue arg3,
159536ac495dSmrg location loc)
159636ac495dSmrg {
159736ac495dSmrg rvalue c = get_context ().new_call (other, arg0, arg1, arg2, arg3, loc);
159836ac495dSmrg add_eval (c);
159936ac495dSmrg return c;
160036ac495dSmrg }
160136ac495dSmrg
160236ac495dSmrg inline rvalue
operator()160336ac495dSmrg function::operator() (location loc)
160436ac495dSmrg {
160536ac495dSmrg return get_context ().new_call (*this, loc);
160636ac495dSmrg }
160736ac495dSmrg inline rvalue
operator()160836ac495dSmrg function::operator() (rvalue arg0,
160936ac495dSmrg location loc)
161036ac495dSmrg {
161136ac495dSmrg return get_context ().new_call (*this,
161236ac495dSmrg arg0,
161336ac495dSmrg loc);
161436ac495dSmrg }
161536ac495dSmrg inline rvalue
operator()161636ac495dSmrg function::operator() (rvalue arg0, rvalue arg1,
161736ac495dSmrg location loc)
161836ac495dSmrg {
161936ac495dSmrg return get_context ().new_call (*this,
162036ac495dSmrg arg0, arg1,
162136ac495dSmrg loc);
162236ac495dSmrg }
162336ac495dSmrg inline rvalue
operator()162436ac495dSmrg function::operator() (rvalue arg0, rvalue arg1, rvalue arg2,
162536ac495dSmrg location loc)
162636ac495dSmrg {
162736ac495dSmrg return get_context ().new_call (*this,
162836ac495dSmrg arg0, arg1, arg2,
162936ac495dSmrg loc);
163036ac495dSmrg }
163136ac495dSmrg
163236ac495dSmrg // class block
block()163336ac495dSmrg inline block::block () : object () {}
block(gcc_jit_block * inner)163436ac495dSmrg inline block::block (gcc_jit_block *inner)
163536ac495dSmrg : object (gcc_jit_block_as_object (inner))
163636ac495dSmrg {}
163736ac495dSmrg
163836ac495dSmrg inline gcc_jit_block *
get_inner_block()163936ac495dSmrg block::get_inner_block () const
164036ac495dSmrg {
164136ac495dSmrg /* Manual downcast: */
164236ac495dSmrg return reinterpret_cast<gcc_jit_block *> (get_inner_object ());
164336ac495dSmrg }
164436ac495dSmrg
164536ac495dSmrg // class rvalue
rvalue()164636ac495dSmrg inline rvalue::rvalue () : object () {}
rvalue(gcc_jit_rvalue * inner)164736ac495dSmrg inline rvalue::rvalue (gcc_jit_rvalue *inner)
164836ac495dSmrg : object (gcc_jit_rvalue_as_object (inner))
164936ac495dSmrg {}
165036ac495dSmrg
165136ac495dSmrg inline gcc_jit_rvalue *
get_inner_rvalue()165236ac495dSmrg rvalue::get_inner_rvalue () const
165336ac495dSmrg {
165436ac495dSmrg /* Manual downcast: */
165536ac495dSmrg return reinterpret_cast<gcc_jit_rvalue *> (get_inner_object ());
165636ac495dSmrg }
165736ac495dSmrg
165836ac495dSmrg inline type
get_type()165936ac495dSmrg rvalue::get_type ()
166036ac495dSmrg {
166136ac495dSmrg return type (gcc_jit_rvalue_get_type (get_inner_rvalue ()));
166236ac495dSmrg }
166336ac495dSmrg
166436ac495dSmrg inline rvalue
access_field(field field,location loc)166536ac495dSmrg rvalue::access_field (field field,
166636ac495dSmrg location loc)
166736ac495dSmrg {
166836ac495dSmrg return rvalue (gcc_jit_rvalue_access_field (get_inner_rvalue (),
166936ac495dSmrg loc.get_inner_location (),
167036ac495dSmrg field.get_inner_field ()));
167136ac495dSmrg }
167236ac495dSmrg
167336ac495dSmrg inline lvalue
dereference_field(field field,location loc)167436ac495dSmrg rvalue::dereference_field (field field,
167536ac495dSmrg location loc)
167636ac495dSmrg {
167736ac495dSmrg return lvalue (gcc_jit_rvalue_dereference_field (get_inner_rvalue (),
167836ac495dSmrg loc.get_inner_location (),
167936ac495dSmrg field.get_inner_field ()));
168036ac495dSmrg }
168136ac495dSmrg
168236ac495dSmrg inline lvalue
dereference(location loc)168336ac495dSmrg rvalue::dereference (location loc)
168436ac495dSmrg {
168536ac495dSmrg return lvalue (gcc_jit_rvalue_dereference (get_inner_rvalue (),
168636ac495dSmrg loc.get_inner_location ()));
168736ac495dSmrg }
168836ac495dSmrg
168936ac495dSmrg inline rvalue
cast_to(type type_,location loc)169036ac495dSmrg rvalue::cast_to (type type_,
169136ac495dSmrg location loc)
169236ac495dSmrg {
169336ac495dSmrg return get_context ().new_cast (*this, type_, loc);
169436ac495dSmrg }
169536ac495dSmrg
169636ac495dSmrg inline lvalue
169736ac495dSmrg rvalue::operator[] (rvalue index)
169836ac495dSmrg {
169936ac495dSmrg return get_context ().new_array_access (*this, index);
170036ac495dSmrg }
170136ac495dSmrg
170236ac495dSmrg inline lvalue
170336ac495dSmrg rvalue::operator[] (int index)
170436ac495dSmrg {
170536ac495dSmrg context ctxt = get_context ();
170636ac495dSmrg type int_t = ctxt.get_int_type <int> ();
170736ac495dSmrg return ctxt.new_array_access (*this,
170836ac495dSmrg ctxt.new_rvalue (int_t,
170936ac495dSmrg index));
171036ac495dSmrg }
171136ac495dSmrg
171236ac495dSmrg // class lvalue : public rvalue
lvalue()171336ac495dSmrg inline lvalue::lvalue () : rvalue () {}
lvalue(gcc_jit_lvalue * inner)171436ac495dSmrg inline lvalue::lvalue (gcc_jit_lvalue *inner)
171536ac495dSmrg : rvalue (gcc_jit_lvalue_as_rvalue (inner))
171636ac495dSmrg {}
171736ac495dSmrg
171836ac495dSmrg inline gcc_jit_lvalue *
get_inner_lvalue()171936ac495dSmrg lvalue::get_inner_lvalue () const
172036ac495dSmrg {
172136ac495dSmrg /* Manual downcast: */
172236ac495dSmrg return reinterpret_cast<gcc_jit_lvalue *> (get_inner_object ());
172336ac495dSmrg }
172436ac495dSmrg
172536ac495dSmrg inline lvalue
access_field(field field,location loc)172636ac495dSmrg lvalue::access_field (field field, location loc)
172736ac495dSmrg {
172836ac495dSmrg return lvalue (gcc_jit_lvalue_access_field (get_inner_lvalue (),
172936ac495dSmrg loc.get_inner_location (),
173036ac495dSmrg field.get_inner_field ()));
173136ac495dSmrg }
173236ac495dSmrg
173336ac495dSmrg inline rvalue
get_address(location loc)173436ac495dSmrg lvalue::get_address (location loc)
173536ac495dSmrg {
173636ac495dSmrg return rvalue (gcc_jit_lvalue_get_address (get_inner_lvalue (),
173736ac495dSmrg loc.get_inner_location ()));
173836ac495dSmrg }
173936ac495dSmrg
174036ac495dSmrg // class param : public lvalue
param()174136ac495dSmrg inline param::param () : lvalue () {}
param(gcc_jit_param * inner)174236ac495dSmrg inline param::param (gcc_jit_param *inner)
174336ac495dSmrg : lvalue (gcc_jit_param_as_lvalue (inner))
174436ac495dSmrg {}
174536ac495dSmrg
174636ac495dSmrg // class case_ : public object
case_()174736ac495dSmrg inline case_::case_ () : object () {}
case_(gcc_jit_case * inner)174836ac495dSmrg inline case_::case_ (gcc_jit_case *inner)
174936ac495dSmrg : object (gcc_jit_case_as_object (inner))
175036ac495dSmrg {
175136ac495dSmrg }
175236ac495dSmrg
175336ac495dSmrg inline gcc_jit_case *
get_inner_case()175436ac495dSmrg case_::get_inner_case () const
175536ac495dSmrg {
175636ac495dSmrg /* Manual downcast: */
175736ac495dSmrg return reinterpret_cast<gcc_jit_case *> (get_inner_object ());
175836ac495dSmrg }
175936ac495dSmrg
176036ac495dSmrg /* Overloaded operators. */
176136ac495dSmrg // Unary operators
176236ac495dSmrg inline rvalue operator- (rvalue a)
176336ac495dSmrg {
176436ac495dSmrg return a.get_context ().new_minus (a.get_type (), a);
176536ac495dSmrg }
176636ac495dSmrg inline rvalue operator~ (rvalue a)
176736ac495dSmrg {
176836ac495dSmrg return a.get_context ().new_bitwise_negate (a.get_type (), a);
176936ac495dSmrg }
177036ac495dSmrg inline rvalue operator! (rvalue a)
177136ac495dSmrg {
177236ac495dSmrg return a.get_context ().new_logical_negate (a.get_type (), a);
177336ac495dSmrg }
177436ac495dSmrg
177536ac495dSmrg // Binary operators
177636ac495dSmrg inline rvalue operator+ (rvalue a, rvalue b)
177736ac495dSmrg {
177836ac495dSmrg return a.get_context ().new_plus (a.get_type (), a, b);
177936ac495dSmrg }
178036ac495dSmrg inline rvalue operator- (rvalue a, rvalue b)
178136ac495dSmrg {
178236ac495dSmrg return a.get_context ().new_minus (a.get_type (), a, b);
178336ac495dSmrg }
178436ac495dSmrg inline rvalue operator* (rvalue a, rvalue b)
178536ac495dSmrg {
178636ac495dSmrg return a.get_context ().new_mult (a.get_type (), a, b);
178736ac495dSmrg }
178836ac495dSmrg inline rvalue operator/ (rvalue a, rvalue b)
178936ac495dSmrg {
179036ac495dSmrg return a.get_context ().new_divide (a.get_type (), a, b);
179136ac495dSmrg }
179236ac495dSmrg inline rvalue operator% (rvalue a, rvalue b)
179336ac495dSmrg {
179436ac495dSmrg return a.get_context ().new_modulo (a.get_type (), a, b);
179536ac495dSmrg }
179636ac495dSmrg inline rvalue operator& (rvalue a, rvalue b)
179736ac495dSmrg {
179836ac495dSmrg return a.get_context ().new_bitwise_and (a.get_type (), a, b);
179936ac495dSmrg }
180036ac495dSmrg inline rvalue operator^ (rvalue a, rvalue b)
180136ac495dSmrg {
180236ac495dSmrg return a.get_context ().new_bitwise_xor (a.get_type (), a, b);
180336ac495dSmrg }
180436ac495dSmrg inline rvalue operator| (rvalue a, rvalue b)
180536ac495dSmrg {
180636ac495dSmrg return a.get_context ().new_bitwise_or (a.get_type (), a, b);
180736ac495dSmrg }
180836ac495dSmrg inline rvalue operator&& (rvalue a, rvalue b)
180936ac495dSmrg {
181036ac495dSmrg return a.get_context ().new_logical_and (a.get_type (), a, b);
181136ac495dSmrg }
181236ac495dSmrg inline rvalue operator|| (rvalue a, rvalue b)
181336ac495dSmrg {
181436ac495dSmrg return a.get_context ().new_logical_or (a.get_type (), a, b);
181536ac495dSmrg }
181636ac495dSmrg
181736ac495dSmrg /* Comparisons. */
181836ac495dSmrg inline rvalue operator== (rvalue a, rvalue b)
181936ac495dSmrg {
182036ac495dSmrg return a.get_context ().new_eq (a, b);
182136ac495dSmrg }
182236ac495dSmrg inline rvalue operator!= (rvalue a, rvalue b)
182336ac495dSmrg {
182436ac495dSmrg return a.get_context ().new_ne (a, b);
182536ac495dSmrg }
182636ac495dSmrg inline rvalue operator< (rvalue a, rvalue b)
182736ac495dSmrg {
182836ac495dSmrg return a.get_context ().new_lt (a, b);
182936ac495dSmrg }
183036ac495dSmrg inline rvalue operator<= (rvalue a, rvalue b)
183136ac495dSmrg {
183236ac495dSmrg return a.get_context ().new_le (a, b);
183336ac495dSmrg }
183436ac495dSmrg inline rvalue operator> (rvalue a, rvalue b)
183536ac495dSmrg {
183636ac495dSmrg return a.get_context ().new_gt (a, b);
183736ac495dSmrg }
183836ac495dSmrg inline rvalue operator>= (rvalue a, rvalue b)
183936ac495dSmrg {
184036ac495dSmrg return a.get_context ().new_ge (a, b);
184136ac495dSmrg }
184236ac495dSmrg
184336ac495dSmrg /* Dereferencing. */
184436ac495dSmrg inline lvalue operator* (rvalue ptr)
184536ac495dSmrg {
184636ac495dSmrg return ptr.dereference ();
184736ac495dSmrg }
184836ac495dSmrg
184936ac495dSmrg // class timer
185036ac495dSmrg inline
timer()185136ac495dSmrg timer::timer ()
185236ac495dSmrg {
185336ac495dSmrg m_inner_timer = gcc_jit_timer_new ();
185436ac495dSmrg }
185536ac495dSmrg
185636ac495dSmrg inline
timer(gcc_jit_timer * inner_timer)185736ac495dSmrg timer::timer (gcc_jit_timer *inner_timer)
185836ac495dSmrg {
185936ac495dSmrg m_inner_timer = inner_timer;
186036ac495dSmrg }
186136ac495dSmrg
186236ac495dSmrg inline void
push(const char * item_name)186336ac495dSmrg timer::push (const char *item_name)
186436ac495dSmrg {
186536ac495dSmrg gcc_jit_timer_push (m_inner_timer, item_name);
186636ac495dSmrg
186736ac495dSmrg }
186836ac495dSmrg
186936ac495dSmrg inline void
pop(const char * item_name)187036ac495dSmrg timer::pop (const char *item_name)
187136ac495dSmrg {
187236ac495dSmrg gcc_jit_timer_pop (m_inner_timer, item_name);
187336ac495dSmrg }
187436ac495dSmrg
187536ac495dSmrg inline void
print(FILE * f_out)187636ac495dSmrg timer::print (FILE *f_out) const
187736ac495dSmrg {
187836ac495dSmrg gcc_jit_timer_print (m_inner_timer, f_out);
187936ac495dSmrg }
188036ac495dSmrg
188136ac495dSmrg inline gcc_jit_timer *
get_inner_timer()188236ac495dSmrg timer::get_inner_timer () const
188336ac495dSmrg {
188436ac495dSmrg return m_inner_timer;
188536ac495dSmrg }
188636ac495dSmrg
188736ac495dSmrg inline void
release()188836ac495dSmrg timer::release ()
188936ac495dSmrg {
189036ac495dSmrg gcc_jit_timer_release (m_inner_timer);
189136ac495dSmrg m_inner_timer = NULL;
189236ac495dSmrg }
189336ac495dSmrg
189436ac495dSmrg // class auto_time
189536ac495dSmrg
189636ac495dSmrg inline
auto_time(timer t,const char * item_name)189736ac495dSmrg auto_time::auto_time (timer t, const char *item_name)
189836ac495dSmrg : m_timer (t),
189936ac495dSmrg m_item_name (item_name)
190036ac495dSmrg {
190136ac495dSmrg t.push (item_name);
190236ac495dSmrg }
190336ac495dSmrg
190436ac495dSmrg inline
auto_time(context ctxt,const char * item_name)190536ac495dSmrg auto_time::auto_time (context ctxt, const char *item_name)
190636ac495dSmrg : m_timer (ctxt.get_timer ()),
190736ac495dSmrg m_item_name (item_name)
190836ac495dSmrg {
190936ac495dSmrg m_timer.push (item_name);
191036ac495dSmrg }
191136ac495dSmrg
191236ac495dSmrg inline
~auto_time()191336ac495dSmrg auto_time::~auto_time ()
191436ac495dSmrg {
191536ac495dSmrg m_timer.pop (m_item_name);
191636ac495dSmrg }
191736ac495dSmrg
1918*8feb0f0bSmrg namespace version
1919*8feb0f0bSmrg {
1920*8feb0f0bSmrg inline int
major_v()1921*8feb0f0bSmrg major_v ()
1922*8feb0f0bSmrg {
1923*8feb0f0bSmrg return gcc_jit_version_major ();
1924*8feb0f0bSmrg }
1925*8feb0f0bSmrg
1926*8feb0f0bSmrg inline int
minor_v()1927*8feb0f0bSmrg minor_v ()
1928*8feb0f0bSmrg {
1929*8feb0f0bSmrg return gcc_jit_version_minor ();
1930*8feb0f0bSmrg }
1931*8feb0f0bSmrg
1932*8feb0f0bSmrg inline int
patchlevel_v()1933*8feb0f0bSmrg patchlevel_v ()
1934*8feb0f0bSmrg {
1935*8feb0f0bSmrg return gcc_jit_version_patchlevel ();
1936*8feb0f0bSmrg }
1937*8feb0f0bSmrg } // namespace version
193836ac495dSmrg } // namespace gccjit
193936ac495dSmrg
194036ac495dSmrg #endif /* #ifndef LIBGCCJIT_PLUS_PLUS_H */
1941