Mercurial > hg > CbC > CbC_gcc
diff gcc/jit/docs/cp/topics/types.rst @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/jit/docs/cp/topics/types.rst Fri Oct 27 22:46:09 2017 +0900 @@ -0,0 +1,205 @@ +.. Copyright (C) 2014-2017 Free Software Foundation, Inc. + Originally contributed by David Malcolm <dmalcolm@redhat.com> + + This is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see + <http://www.gnu.org/licenses/>. + +.. default-domain:: cpp + +Types +===== + +.. class:: gccjit::type + + gccjit::type represents a type within the library. It is a subclass + of :class:`gccjit::object`. + +Types can be created in several ways: + +* fundamental types can be accessed using + :func:`gccjit::context::get_type`: + + .. code-block:: c++ + + gccjit::type int_type = ctxt.get_type (GCC_JIT_TYPE_INT); + + or using the :func:`gccjit::context::get_int_type<T>` template: + + .. code-block:: c++ + + gccjit::type t = ctxt.get_int_type <unsigned short> (); + + See :c:func:`gcc_jit_context_get_type` for the available types. + +* derived types can be accessed by using functions such as + :func:`gccjit::type::get_pointer` and :func:`gccjit::type::get_const`: + + .. code-block:: c++ + + gccjit::type const_int_star = int_type.get_const ().get_pointer (); + gccjit::type int_const_star = int_type.get_pointer ().get_const (); + +* by creating structures (see below). + +Standard types +-------------- + +.. function:: gccjit::type gccjit::context::get_type (enum gcc_jit_types) + + Access a specific type. This is a thin wrapper around + :c:func:`gcc_jit_context_get_type`; the parameter has the same meaning. + +.. function:: gccjit::type \ + gccjit::context::get_int_type (size_t num_bytes, int is_signed) + + Access the integer type of the given size. + +.. function:: gccjit::type \ + gccjit::context::get_int_type <T> () + + Access the given integer type. For example, you could map the + ``unsigned short`` type into a gccjit::type via: + + .. code-block:: c++ + + gccjit::type t = ctxt.get_int_type <unsigned short> (); + +Pointers, `const`, and `volatile` +--------------------------------- + +.. function:: gccjit::type gccjit::type::get_pointer () + + Given type "T", get type "T*". + +.. function:: gccjit::type gccjit::type::get_const () + + Given type "T", get type "const T". + +.. function:: gccjit::type gccjit::type::get_volatile () + + Given type "T", get type "volatile T". + +.. function:: gccjit::type gccjit::type::get_aligned (size_t alignment_in_bytes) + + Given type "T", get type: + + .. code-block:: c + + T __attribute__ ((aligned (ALIGNMENT_IN_BYTES))) + + The alignment must be a power of two. + +.. function:: gccjit::type \ + gccjit::context::new_array_type (gccjit::type element_type, \ + int num_elements, \ + gccjit::location loc) + + Given type "T", get type "T[N]" (for a constant N). + Param "loc" is optional. + + +Vector types +------------ + +.. function:: gccjit::type gccjit::type::get_vector (size_t num_units) + + Given type "T", get type: + + .. code-block:: c + + T __attribute__ ((vector_size (sizeof(T) * num_units)) + + T must be integral or floating point; num_units must be a power of two. + + +Structures and unions +--------------------- + +.. class:: gccjit::struct_ + +A compound type analagous to a C `struct`. + +:class:`gccjit::struct_` is a subclass of :class:`gccjit::type` (and thus +of :class:`gccjit::object` in turn). + +.. class:: gccjit::field + +A field within a :class:`gccjit::struct_`. + +:class:`gccjit::field` is a subclass of :class:`gccjit::object`. + +You can model C `struct` types by creating :class:`gccjit::struct_` and +:class:`gccjit::field` instances, in either order: + +* by creating the fields, then the structure. For example, to model: + + .. code-block:: c + + struct coord {double x; double y; }; + + you could call: + + .. code-block:: c++ + + gccjit::field field_x = ctxt.new_field (double_type, "x"); + gccjit::field field_y = ctxt.new_field (double_type, "y"); + std::vector fields; + fields.push_back (field_x); + fields.push_back (field_y); + gccjit::struct_ coord = ctxt.new_struct_type ("coord", fields); + +* by creating the structure, then populating it with fields, typically + to allow modelling self-referential structs such as: + + .. code-block:: c + + struct node { int m_hash; struct node *m_next; }; + + like this: + + .. code-block:: c++ + + gccjit::struct_ node = ctxt.new_opaque_struct_type ("node"); + gccjit::type node_ptr = node.get_pointer (); + gccjit::field field_hash = ctxt.new_field (int_type, "m_hash"); + gccjit::field field_next = ctxt.new_field (node_ptr, "m_next"); + std::vector fields; + fields.push_back (field_hash); + fields.push_back (field_next); + node.set_fields (fields); + +.. FIXME: the above API doesn't seem to exist yet + +.. function:: gccjit::field \ + gccjit::context::new_field (gccjit::type type,\ + const char *name, \ + gccjit::location loc) + + Construct a new field, with the given type and name. + +.. function:: gccjit::struct_ \ + gccjit::context::new_struct_type (const std::string &name,\ + std::vector<field> &fields,\ + gccjit::location loc) + + Construct a new struct type, with the given name and fields. + +.. function:: gccjit::struct_ \ + gccjit::context::new_opaque_struct (const std::string &name, \ + gccjit::location loc) + + Construct a new struct type, with the given name, but without + specifying the fields. The fields can be omitted (in which case the + size of the struct is not known), or later specified using + :c:func:`gcc_jit_struct_set_fields`.