annotate gcc/jit/docs/topics/types.rst @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1 .. Copyright (C) 2014-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
2 Originally contributed by David Malcolm <dmalcolm@redhat.com>
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This is free software: you can redistribute it and/or modify it
kono
parents:
diff changeset
5 under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
6 the Free Software Foundation, either version 3 of the License, or
kono
parents:
diff changeset
7 (at your option) any later version.
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 This program is distributed in the hope that it will be useful, but
kono
parents:
diff changeset
10 WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
kono
parents:
diff changeset
12 General Public License for more details.
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
15 along with this program. If not, see
kono
parents:
diff changeset
16 <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 .. default-domain:: c
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 Types
kono
parents:
diff changeset
21 =====
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 .. c:type:: gcc_jit_type
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 gcc_jit_type represents a type within the library.
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 .. function:: gcc_jit_object *gcc_jit_type_as_object (gcc_jit_type *type)
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 Upcast a type to an object.
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 Types can be created in several ways:
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 * fundamental types can be accessed using
kono
parents:
diff changeset
34 :func:`gcc_jit_context_get_type`:
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 .. code-block:: c
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 gcc_jit_type *int_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 See :func:`gcc_jit_context_get_type` for the available types.
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 * derived types can be accessed by using functions such as
kono
parents:
diff changeset
43 :func:`gcc_jit_type_get_pointer` and :func:`gcc_jit_type_get_const`:
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 .. code-block:: c
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 gcc_jit_type *const_int_star = gcc_jit_type_get_pointer (gcc_jit_type_get_const (int_type));
kono
parents:
diff changeset
48 gcc_jit_type *int_const_star = gcc_jit_type_get_const (gcc_jit_type_get_pointer (int_type));
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 * by creating structures (see below).
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 Standard types
kono
parents:
diff changeset
53 --------------
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 .. function:: gcc_jit_type *gcc_jit_context_get_type (gcc_jit_context *ctxt, \
kono
parents:
diff changeset
56 enum gcc_jit_types type_)
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 Access a specific type. The available types are:
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 ========================================== ================================
kono
parents:
diff changeset
61 `enum gcc_jit_types` value Meaning
kono
parents:
diff changeset
62 ========================================== ================================
kono
parents:
diff changeset
63 :c:data:`GCC_JIT_TYPE_VOID` C's ``void`` type.
kono
parents:
diff changeset
64 :c:data:`GCC_JIT_TYPE_VOID_PTR` C's ``void *``.
kono
parents:
diff changeset
65 :c:data:`GCC_JIT_TYPE_BOOL` C++'s ``bool`` type; also C99's
kono
parents:
diff changeset
66 ``_Bool`` type, aka ``bool`` if
kono
parents:
diff changeset
67 using stdbool.h.
kono
parents:
diff changeset
68 :c:data:`GCC_JIT_TYPE_CHAR` C's ``char`` (of some signedness)
kono
parents:
diff changeset
69 :c:data:`GCC_JIT_TYPE_SIGNED_CHAR` C's ``signed char``
kono
parents:
diff changeset
70 :c:data:`GCC_JIT_TYPE_UNSIGNED_CHAR` C's ``unsigned char``
kono
parents:
diff changeset
71 :c:data:`GCC_JIT_TYPE_SHORT` C's ``short`` (signed)
kono
parents:
diff changeset
72 :c:data:`GCC_JIT_TYPE_UNSIGNED_SHORT` C's ``unsigned short``
kono
parents:
diff changeset
73 :c:data:`GCC_JIT_TYPE_INT` C's ``int`` (signed)
kono
parents:
diff changeset
74 :c:data:`GCC_JIT_TYPE_UNSIGNED_INT` C's ``unsigned int``
kono
parents:
diff changeset
75 :c:data:`GCC_JIT_TYPE_LONG` C's ``long`` (signed)
kono
parents:
diff changeset
76 :c:data:`GCC_JIT_TYPE_UNSIGNED_LONG` C's ``unsigned long``
kono
parents:
diff changeset
77 :c:data:`GCC_JIT_TYPE_LONG_LONG` C99's ``long long`` (signed)
kono
parents:
diff changeset
78 :c:data:`GCC_JIT_TYPE_UNSIGNED_LONG_LONG` C99's ``unsigned long long``
kono
parents:
diff changeset
79 :c:data:`GCC_JIT_TYPE_FLOAT`
kono
parents:
diff changeset
80 :c:data:`GCC_JIT_TYPE_DOUBLE`
kono
parents:
diff changeset
81 :c:data:`GCC_JIT_TYPE_LONG_DOUBLE`
kono
parents:
diff changeset
82 :c:data:`GCC_JIT_TYPE_CONST_CHAR_PTR` C type: ``(const char *)``
kono
parents:
diff changeset
83 :c:data:`GCC_JIT_TYPE_SIZE_T` C's ``size_t`` type
kono
parents:
diff changeset
84 :c:data:`GCC_JIT_TYPE_FILE_PTR` C type: ``(FILE *)``
kono
parents:
diff changeset
85 :c:data:`GCC_JIT_TYPE_COMPLEX_FLOAT` C99's ``_Complex float``
kono
parents:
diff changeset
86 :c:data:`GCC_JIT_TYPE_COMPLEX_DOUBLE` C99's ``_Complex double``
kono
parents:
diff changeset
87 :c:data:`GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE` C99's ``_Complex long double``
kono
parents:
diff changeset
88 ========================================== ================================
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 .. function:: gcc_jit_type *\
kono
parents:
diff changeset
91 gcc_jit_context_get_int_type (gcc_jit_context *ctxt, \
kono
parents:
diff changeset
92 int num_bytes, int is_signed)
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 Access the integer type of the given size.
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 Pointers, `const`, and `volatile`
kono
parents:
diff changeset
98 ---------------------------------
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 .. function:: gcc_jit_type *gcc_jit_type_get_pointer (gcc_jit_type *type)
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 Given type "T", get type "T*".
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 .. function:: gcc_jit_type *gcc_jit_type_get_const (gcc_jit_type *type)
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 Given type "T", get type "const T".
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 .. function:: gcc_jit_type *gcc_jit_type_get_volatile (gcc_jit_type *type)
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 Given type "T", get type "volatile T".
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 .. function:: gcc_jit_type *\
kono
parents:
diff changeset
113 gcc_jit_context_new_array_type (gcc_jit_context *ctxt, \
kono
parents:
diff changeset
114 gcc_jit_location *loc, \
kono
parents:
diff changeset
115 gcc_jit_type *element_type, \
kono
parents:
diff changeset
116 int num_elements)
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 Given type "T", get type "T[N]" (for a constant N).
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 .. function:: gcc_jit_type *\
kono
parents:
diff changeset
121 gcc_jit_type_get_aligned (gcc_jit_type *type, \
kono
parents:
diff changeset
122 size_t alignment_in_bytes)
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 Given type "T", get type:
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 .. code-block:: c
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 T __attribute__ ((aligned (ALIGNMENT_IN_BYTES)))
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 The alignment must be a power of two.
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 This entrypoint was added in :ref:`LIBGCCJIT_ABI_7`; you can test for
kono
parents:
diff changeset
133 its presence using
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 .. code-block:: c
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 #ifdef LIBGCCJIT_HAVE_gcc_jit_type_get_aligned
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 Vector types
kono
parents:
diff changeset
140 ------------
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 .. function:: gcc_jit_type *\
kono
parents:
diff changeset
143 gcc_jit_type_get_vector (gcc_jit_type *type, \
kono
parents:
diff changeset
144 size_t num_units)
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 Given type "T", get type:
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 .. code-block:: c
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 T __attribute__ ((vector_size (sizeof(T) * num_units))
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 T must be integral or floating point; num_units must be a power of two.
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 This can be used to construct a vector type in which operations
kono
parents:
diff changeset
155 are applied element-wise. The compiler will automatically
kono
parents:
diff changeset
156 use SIMD instructions where possible. See:
kono
parents:
diff changeset
157 https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 For example, assuming 4-byte ``ints``, then:
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 .. code-block:: c
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 typedef int v4si __attribute__ ((vector_size (16)));
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 can be obtained using:
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 .. code-block:: c
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 gcc_jit_type *int_type = gcc_jit_context_get_type (ctxt,
kono
parents:
diff changeset
170 GCC_JIT_TYPE_INT);
kono
parents:
diff changeset
171 gcc_jit_type *v4si_type = gcc_jit_type_get_vector (int_type, 4);
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 This API entrypoint was added in :ref:`LIBGCCJIT_ABI_8`; you can test
kono
parents:
diff changeset
174 for its presence using
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 .. code-block:: c
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 #ifdef LIBGCCJIT_HAVE_gcc_jit_type_get_vector
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 Vector rvalues can be generated using
kono
parents:
diff changeset
181 :func:`gcc_jit_context_new_rvalue_from_vector`.
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 Structures and unions
kono
parents:
diff changeset
185 ---------------------
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 .. c:type:: gcc_jit_struct
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 A compound type analagous to a C `struct`.
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 .. c:type:: gcc_jit_field
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 A field within a :c:type:`gcc_jit_struct`.
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 You can model C `struct` types by creating :c:type:`gcc_jit_struct *` and
kono
parents:
diff changeset
196 :c:type:`gcc_jit_field` instances, in either order:
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 * by creating the fields, then the structure. For example, to model:
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 .. code-block:: c
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 struct coord {double x; double y; };
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 you could call:
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 .. code-block:: c
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 gcc_jit_field *field_x =
kono
parents:
diff changeset
209 gcc_jit_context_new_field (ctxt, NULL, double_type, "x");
kono
parents:
diff changeset
210 gcc_jit_field *field_y =
kono
parents:
diff changeset
211 gcc_jit_context_new_field (ctxt, NULL, double_type, "y");
kono
parents:
diff changeset
212 gcc_jit_field *fields[2] = {field_x, field_y};
kono
parents:
diff changeset
213 gcc_jit_struct *coord =
kono
parents:
diff changeset
214 gcc_jit_context_new_struct_type (ctxt, NULL, "coord", 2, fields);
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 * by creating the structure, then populating it with fields, typically
kono
parents:
diff changeset
217 to allow modelling self-referential structs such as:
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 .. code-block:: c
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 struct node { int m_hash; struct node *m_next; };
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 like this:
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 .. code-block:: c
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 gcc_jit_type *node =
kono
parents:
diff changeset
228 gcc_jit_context_new_opaque_struct (ctxt, NULL, "node");
kono
parents:
diff changeset
229 gcc_jit_type *node_ptr =
kono
parents:
diff changeset
230 gcc_jit_type_get_pointer (node);
kono
parents:
diff changeset
231 gcc_jit_field *field_hash =
kono
parents:
diff changeset
232 gcc_jit_context_new_field (ctxt, NULL, int_type, "m_hash");
kono
parents:
diff changeset
233 gcc_jit_field *field_next =
kono
parents:
diff changeset
234 gcc_jit_context_new_field (ctxt, NULL, node_ptr, "m_next");
kono
parents:
diff changeset
235 gcc_jit_field *fields[2] = {field_hash, field_next};
kono
parents:
diff changeset
236 gcc_jit_struct_set_fields (node, NULL, 2, fields);
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 .. function:: gcc_jit_field *\
kono
parents:
diff changeset
239 gcc_jit_context_new_field (gcc_jit_context *ctxt,\
kono
parents:
diff changeset
240 gcc_jit_location *loc,\
kono
parents:
diff changeset
241 gcc_jit_type *type,\
kono
parents:
diff changeset
242 const char *name)
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 Construct a new field, with the given type and name.
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 The parameter ``name`` must be non-NULL. The call takes a copy of the
kono
parents:
diff changeset
247 underlying string, so it is valid to pass in a pointer to an on-stack
kono
parents:
diff changeset
248 buffer.
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 .. function:: gcc_jit_object *\
kono
parents:
diff changeset
251 gcc_jit_field_as_object (gcc_jit_field *field)
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 Upcast from field to object.
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 .. function:: gcc_jit_struct *\
kono
parents:
diff changeset
256 gcc_jit_context_new_struct_type (gcc_jit_context *ctxt,\
kono
parents:
diff changeset
257 gcc_jit_location *loc,\
kono
parents:
diff changeset
258 const char *name,\
kono
parents:
diff changeset
259 int num_fields,\
kono
parents:
diff changeset
260 gcc_jit_field **fields)
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 Construct a new struct type, with the given name and fields.
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 The parameter ``name`` must be non-NULL. The call takes a copy of
kono
parents:
diff changeset
265 the underlying string, so it is valid to pass in a pointer to an
kono
parents:
diff changeset
266 on-stack buffer.
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 .. function:: gcc_jit_struct *\
kono
parents:
diff changeset
269 gcc_jit_context_new_opaque_struct (gcc_jit_context *ctxt,\
kono
parents:
diff changeset
270 gcc_jit_location *loc,\
kono
parents:
diff changeset
271 const char *name)
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 Construct a new struct type, with the given name, but without
kono
parents:
diff changeset
274 specifying the fields. The fields can be omitted (in which case the
kono
parents:
diff changeset
275 size of the struct is not known), or later specified using
kono
parents:
diff changeset
276 :c:func:`gcc_jit_struct_set_fields`.
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 The parameter ``name`` must be non-NULL. The call takes a copy of
kono
parents:
diff changeset
279 the underlying string, so it is valid to pass in a pointer to an
kono
parents:
diff changeset
280 on-stack buffer.
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 .. function:: gcc_jit_type *\
kono
parents:
diff changeset
283 gcc_jit_struct_as_type (gcc_jit_struct *struct_type)
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 Upcast from struct to type.
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 .. function:: void\
kono
parents:
diff changeset
288 gcc_jit_struct_set_fields (gcc_jit_struct *struct_type,\
kono
parents:
diff changeset
289 gcc_jit_location *loc,\
kono
parents:
diff changeset
290 int num_fields,\
kono
parents:
diff changeset
291 gcc_jit_field **fields)
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 Populate the fields of a formerly-opaque struct type.
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 This can only be called once on a given struct type.
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 .. function:: gcc_jit_type *\
kono
parents:
diff changeset
298 gcc_jit_context_new_union_type (gcc_jit_context *ctxt,\
kono
parents:
diff changeset
299 gcc_jit_location *loc,\
kono
parents:
diff changeset
300 const char *name,\
kono
parents:
diff changeset
301 int num_fields,\
kono
parents:
diff changeset
302 gcc_jit_field **fields)
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 Construct a new union type, with the given name and fields.
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 The parameter ``name`` must be non-NULL. It is copied, so the input
kono
parents:
diff changeset
307 buffer does not need to outlive the call.
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 Example of use:
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 .. literalinclude:: ../../../testsuite/jit.dg/test-accessing-union.c
kono
parents:
diff changeset
312 :start-after: /* Quote from here in docs/topics/types.rst. */
kono
parents:
diff changeset
313 :end-before: /* Quote up to here in docs/topics/types.rst. */
kono
parents:
diff changeset
314 :language: c
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 Function pointer types
kono
parents:
diff changeset
317 ----------------------
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 Function pointer types can be created using
kono
parents:
diff changeset
320 :c:func:`gcc_jit_context_new_function_ptr_type`.