1 // SPDX-License-Identifier: MIT
3 * Copyright 2022-2023 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 #ifndef SIDE_TYPE_DESCRIPTION_ABI_H
7 #define SIDE_TYPE_DESCRIPTION_ABI_H
10 #include <side/macros.h>
11 #include <side/endian.h>
13 #include <side/type-value-abi.h>
14 #include <side/attribute-abi.h>
15 #include <side/visitor-abi.h>
17 enum side_type_label
{
18 /* Stack-copy basic types */
31 SIDE_TYPE_FLOAT_BINARY16
,
32 SIDE_TYPE_FLOAT_BINARY32
,
33 SIDE_TYPE_FLOAT_BINARY64
,
34 SIDE_TYPE_FLOAT_BINARY128
,
35 SIDE_TYPE_STRING_UTF8
,
36 SIDE_TYPE_STRING_UTF16
,
37 SIDE_TYPE_STRING_UTF32
,
39 /* Stack-copy compound types */
44 SIDE_TYPE_VLA_VISITOR
,
46 /* Stack-copy enumeration types */
48 SIDE_TYPE_ENUM_BITMAP
,
50 /* Stack-copy place holder for dynamic types */
53 /* Gather basic types */
54 SIDE_TYPE_GATHER_BOOL
,
55 SIDE_TYPE_GATHER_INTEGER
,
56 SIDE_TYPE_GATHER_BYTE
,
57 SIDE_TYPE_GATHER_POINTER
,
58 SIDE_TYPE_GATHER_FLOAT
,
59 SIDE_TYPE_GATHER_STRING
,
61 /* Gather compound types */
62 SIDE_TYPE_GATHER_STRUCT
,
63 SIDE_TYPE_GATHER_ARRAY
,
66 /* Gather enumeration types */
67 SIDE_TYPE_GATHER_ENUM
,
69 /* Dynamic basic types */
70 SIDE_TYPE_DYNAMIC_NULL
,
71 SIDE_TYPE_DYNAMIC_BOOL
,
72 SIDE_TYPE_DYNAMIC_INTEGER
,
73 SIDE_TYPE_DYNAMIC_BYTE
,
74 SIDE_TYPE_DYNAMIC_POINTER
,
75 SIDE_TYPE_DYNAMIC_FLOAT
,
76 SIDE_TYPE_DYNAMIC_STRING
,
78 /* Dynamic compound types */
79 SIDE_TYPE_DYNAMIC_STRUCT
,
80 SIDE_TYPE_DYNAMIC_STRUCT_VISITOR
,
81 SIDE_TYPE_DYNAMIC_VLA
,
82 SIDE_TYPE_DYNAMIC_VLA_VISITOR
,
84 _NR_SIDE_TYPE_LABEL
, /* Last entry. */
87 enum side_visitor_status
{
88 SIDE_VISITOR_STATUS_OK
= 0,
89 SIDE_VISITOR_STATUS_ERROR
= -1,
92 enum side_type_gather_access_mode
{
93 SIDE_TYPE_GATHER_ACCESS_DIRECT
,
94 SIDE_TYPE_GATHER_ACCESS_POINTER
, /* Pointer dereference */
97 /* Type descriptions */
98 struct side_type_null
{
99 side_ptr_t(const struct side_attr
) attr
;
102 side_check_size(struct side_type_null
, 20);
104 struct side_type_bool
{
105 side_ptr_t(const struct side_attr
) attr
;
107 uint16_t bool_size
; /* bytes */
108 uint16_t len_bits
; /* bits. 0 for (bool_size * CHAR_BITS) */
109 side_enum_t(enum side_type_label_byte_order
, uint8_t) byte_order
;
111 side_check_size(struct side_type_bool
, 25);
113 struct side_type_byte
{
114 side_ptr_t(const struct side_attr
) attr
;
117 side_check_size(struct side_type_byte
, 20);
119 struct side_type_string
{
120 side_ptr_t(const struct side_attr
) attr
;
122 uint8_t unit_size
; /* 1, 2, or 4 bytes */
123 side_enum_t(enum side_type_label_byte_order
, uint8_t) byte_order
;
125 side_check_size(struct side_type_string
, 22);
127 struct side_type_integer
{
128 side_ptr_t(const struct side_attr
) attr
;
130 uint16_t integer_size
; /* bytes */
131 uint16_t len_bits
; /* bits. 0 for (integer_size * CHAR_BITS) */
132 uint8_t signedness
; /* true/false */
133 side_enum_t(enum side_type_label_byte_order
, uint8_t) byte_order
;
135 side_check_size(struct side_type_integer
, 26);
137 struct side_type_float
{
138 side_ptr_t(const struct side_attr
) attr
;
140 uint16_t float_size
; /* bytes */
141 side_enum_t(enum side_type_label_byte_order
, uint8_t) byte_order
;
143 side_check_size(struct side_type_float
, 23);
145 struct side_enum_mapping
{
148 struct side_type_raw_string label
;
150 side_check_size(struct side_enum_mapping
, 16 + sizeof(struct side_type_raw_string
));
152 struct side_enum_mappings
{
153 side_ptr_t(const struct side_enum_mapping
) mappings
;
154 side_ptr_t(const struct side_attr
) attr
;
155 uint32_t nr_mappings
;
158 side_check_size(struct side_enum_mappings
, 40);
160 struct side_enum_bitmap_mapping
{
161 uint64_t range_begin
;
163 struct side_type_raw_string label
;
165 side_check_size(struct side_enum_bitmap_mapping
, 16 + sizeof(struct side_type_raw_string
));
167 struct side_enum_bitmap_mappings
{
168 side_ptr_t(const struct side_enum_bitmap_mapping
) mappings
;
169 side_ptr_t(const struct side_attr
) attr
;
170 uint32_t nr_mappings
;
173 side_check_size(struct side_enum_bitmap_mappings
, 40);
175 struct side_type_struct
{
176 side_ptr_t(const struct side_event_field
) fields
;
177 side_ptr_t(const struct side_attr
) attr
;
181 side_check_size(struct side_type_struct
, 40);
183 struct side_type_array
{
184 side_ptr_t(const struct side_type
) elem_type
;
185 side_ptr_t(const struct side_attr
) attr
;
189 side_check_size(struct side_type_array
, 40);
191 struct side_type_vla
{
192 side_ptr_t(const struct side_type
) elem_type
;
193 side_ptr_t(const struct side_attr
) attr
;
196 side_check_size(struct side_type_vla
, 36);
198 struct side_type_vla_visitor
{
199 side_ptr_t(const struct side_type
) elem_type
;
200 side_func_ptr_t(side_visitor_func
) visitor
;
201 side_ptr_t(const struct side_attr
) attr
;
204 side_check_size(struct side_type_vla_visitor
, 52);
206 struct side_type_enum
{
207 side_ptr_t(const struct side_enum_mappings
) mappings
;
208 side_ptr_t(const struct side_type
) elem_type
;
210 side_check_size(struct side_type_enum
, 32);
212 struct side_type_enum_bitmap
{
213 side_ptr_t(const struct side_enum_bitmap_mappings
) mappings
;
214 side_ptr_t(const struct side_type
) elem_type
;
216 side_check_size(struct side_type_enum_bitmap
, 32);
218 struct side_type_gather_bool
{
219 uint64_t offset
; /* bytes */
220 uint16_t offset_bits
; /* bits */
221 uint8_t access_mode
; /* enum side_type_gather_access_mode */
222 struct side_type_bool type
;
224 side_check_size(struct side_type_gather_bool
, 11 + sizeof(struct side_type_bool
));
226 struct side_type_gather_byte
{
227 uint64_t offset
; /* bytes */
228 uint8_t access_mode
; /* enum side_type_gather_access_mode */
229 struct side_type_byte type
;
231 side_check_size(struct side_type_gather_byte
, 9 + sizeof(struct side_type_byte
));
233 struct side_type_gather_integer
{
234 uint64_t offset
; /* bytes */
235 uint16_t offset_bits
; /* bits */
236 uint8_t access_mode
; /* enum side_type_gather_access_mode */
237 struct side_type_integer type
;
239 side_check_size(struct side_type_gather_integer
, 11 + sizeof(struct side_type_integer
));
241 struct side_type_gather_float
{
242 uint64_t offset
; /* bytes */
243 uint8_t access_mode
; /* enum side_type_gather_access_mode */
244 struct side_type_float type
;
246 side_check_size(struct side_type_gather_float
, 9 + sizeof(struct side_type_float
));
248 struct side_type_gather_string
{
249 uint64_t offset
; /* bytes */
250 uint8_t access_mode
; /* enum side_type_gather_access_mode */
251 struct side_type_string type
;
253 side_check_size(struct side_type_gather_string
, 9 + sizeof(struct side_type_string
));
255 struct side_type_gather_enum
{
256 side_ptr_t(const struct side_enum_mappings
) mappings
;
257 side_ptr_t(const struct side_type
) elem_type
;
259 side_check_size(struct side_type_gather_enum
, 32);
261 struct side_type_gather_struct
{
262 side_ptr_t(const struct side_type_struct
) type
;
263 uint64_t offset
; /* bytes */
264 uint8_t access_mode
; /* enum side_type_gather_access_mode */
265 uint32_t size
; /* bytes */
267 side_check_size(struct side_type_gather_struct
, 29);
269 struct side_type_gather_array
{
270 uint64_t offset
; /* bytes */
271 uint8_t access_mode
; /* enum side_type_gather_access_mode */
272 struct side_type_array type
;
274 side_check_size(struct side_type_gather_array
, 9 + sizeof(struct side_type_array
));
276 struct side_type_gather_vla
{
277 side_ptr_t(const struct side_type
) length_type
; /* side_length() */
278 uint64_t offset
; /* bytes */
279 uint8_t access_mode
; /* enum side_type_gather_access_mode */
280 struct side_type_vla type
;
282 side_check_size(struct side_type_gather_vla
, 25 + sizeof(struct side_type_vla
));
284 struct side_type_gather
{
286 struct side_type_gather_bool side_bool
;
287 struct side_type_gather_byte side_byte
;
288 struct side_type_gather_integer side_integer
;
289 struct side_type_gather_float side_float
;
290 struct side_type_gather_string side_string
;
291 struct side_type_gather_enum side_enum
;
292 struct side_type_gather_array side_array
;
293 struct side_type_gather_vla side_vla
;
294 struct side_type_gather_struct side_struct
;
298 side_check_size(struct side_type_gather
, 61);
301 side_enum_t(enum side_type_label
, uint16_t) type
;
303 /* Stack-copy basic types */
304 struct side_type_null side_null
;
305 struct side_type_bool side_bool
;
306 struct side_type_byte side_byte
;
307 struct side_type_string side_string
;
308 struct side_type_integer side_integer
;
309 struct side_type_float side_float
;
311 /* Stack-copy compound types */
312 struct side_type_array side_array
;
313 struct side_type_vla side_vla
;
314 struct side_type_vla_visitor side_vla_visitor
;
315 side_ptr_t(const struct side_type_struct
) side_struct
;
316 side_ptr_t(const struct side_type_variant
) side_variant
;
318 /* Stack-copy enumeration types */
319 struct side_type_enum side_enum
;
320 struct side_type_enum_bitmap side_enum_bitmap
;
323 struct side_type_gather side_gather
;
327 side_check_size(struct side_type
, 64);
329 struct side_variant_option
{
332 const struct side_type side_type
;
334 side_check_size(struct side_variant_option
, 16 + sizeof(const struct side_type
));
336 struct side_type_variant
{
337 side_ptr_t(const struct side_variant_option
) options
;
338 side_ptr_t(const struct side_attr
) attr
;
341 const struct side_type selector
;
343 side_check_size(struct side_type_variant
, 40 + sizeof(const struct side_type
));
345 struct side_event_field
{
346 side_ptr_t(const char) field_name
;
347 struct side_type side_type
;
349 side_check_size(struct side_event_field
, 16 + sizeof(struct side_type
));
351 #endif /* SIDE_TYPE_DESCRIPTION_ABI_H */