xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/jit/libgccjit++.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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> &params,
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> &params,
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 = &params[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