Types¶
Types can be created in several ways:
fundamental types can be accessed using
gccjit.Context.get_type()
:int_type = ctxt.get_type(gccjit.TypeKind.INT)
See
gccjit.TypeKind
for the available types.You can get int types of specific sizes (in bytes) using
gccjit.Context.get_int_type()
:int_type = ctxt.get_int_type(4, is_signed=True)
derived types can be accessed by calling methods on an existing type:
const_int_star = int_type.get_const().get_pointer() int_const_star = int_type.get_pointer().get_const()
by creating structures (see below).
- class gccjit.Type¶
- get_pointer()¶
Given type T get type T*.
- Return type
- get_const()¶
Given type T get type const T.
- Return type
- get_volatile()¶
Given type T get type volatile T.
- Return type
Standard types¶
- gccjit.Context.get_type(self, type_enum)¶
Look up one of the standard types (see
gccjit.TypeKind
):int_type = ctxt.get_type(gccjit.TypeKind.INT)
- Parameters
type_enum (
gccjit.TypeKind
) – Which type to lookup
- class gccjit.TypeKind¶
- VOID¶
C’s “void” type.
- VOID_PTR¶
C’s “void *”.
- BOOL¶
C++’s bool type; also C99’s “_Bool” type, aka “bool” if using stdbool.h.
- CHAR¶
- SIGNED_CHAR¶
- UNSIGNED_CHAR¶
C’s “char” (of some signedness) and the variants where the signedness is specified.
- SHORT¶
- UNSIGNED_SHORT¶
C’s “short” (signed) and “unsigned short”.
- INT¶
- UNSIGNED_INT¶
C’s “int” (signed) and “unsigned int”:
int_type = ctxt.get_type(gccjit.TypeKind.INT)
- LONG¶
- UNSIGNED_LONG¶
C’s “long” (signed) and “unsigned long”.
- LONG_LONG¶
- UNSIGNED_LONG_LONG¶
C99’s “long long” (signed) and “unsigned long long”.
- FLOAT¶
- DOUBLE¶
- LONG_DOUBLE¶
Floating-point types
- CONST_CHAR_PTR¶
C type: (const char *):
const_char_p = ctxt.get_type(gccjit.TypeKind.CONST_CHAR_PTR)
- SIZE_T¶
The C “size_t” type.
- FILE_PTR¶
C type: (FILE *)
- gccjit.Context.get_int_type(self, num_bytes, is_signed)¶
Look up an integet type of the given size:
int_type = ctxt.get_int_type(4, is_signed=True)
Structures¶
You can model C struct types by creating gccjit.Struct
and
gccjit.Field
instances, in either order:
by creating the fields, then the structure. For example, to model:
struct coord {double x; double y; };
you could call:
field_x = ctxt.new_field(double_type, b'x') field_y = ctxt.new_field(double_type, b'y') coord = ctxt.new_struct(b'coord', [field_x, field_y])
(see
gccjit.Context.new_field()
andgccjit.Context.new_struct()
), orby creating the structure, then populating it with fields, typically to allow modelling self-referential structs such as:
struct node { int m_hash; struct node *m_next; };
like this:
node = ctxt.new_struct(b'node') node_ptr = node.get_pointer() field_hash = ctxt.new_field(int_type, b'm_hash') field_next = ctxt.new_field(node_ptr, b'm_next') node.set_fields([field_hash, field_next])
- class gccjit.Field¶