enum side_type {
/* Basic types */
+ SIDE_TYPE_NULL,
SIDE_TYPE_BOOL,
SIDE_TYPE_U8,
SIDE_TYPE_U16,
};
enum side_type_sg {
+ SIDE_TYPE_SG_NULL,
SIDE_TYPE_SG_UNSIGNED_INT,
SIDE_TYPE_SG_SIGNED_INT,
};
uint64_t offset; /* bytes */
uint32_t type; /* enum side_type_sg */
union {
+ struct side_type_null side_null;
struct {
struct side_type_integer type;
uint16_t offset_bits; /* bits */
uint32_t type; /* enum side_type */
union {
/* Basic types */
+ struct side_type_null side_null;
struct side_type_bool side_bool;
struct side_type_byte side_byte;
struct side_type_dynamic side_dynamic;
struct side_arg_dynamic_vec {
uint32_t dynamic_type; /* enum side_dynamic_type */
union {
- struct side_type_null side_null_type;
+ struct side_type_null side_null;
/* Basic types */
struct {
/* Static field definition */
+#define side_type_null(_attr) \
+ { \
+ .type = SIDE_TYPE_NULL, \
+ .u = { \
+ .side_null = { \
+ .attr = _attr, \
+ .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
+ }, \
+ }, \
+ }
+
#define side_type_bool(_attr) \
{ \
.type = SIDE_TYPE_BOOL, \
#define side_type_float_binary64(_attr) _side_type_float(SIDE_TYPE_FLOAT_BINARY64, SIDE_TYPE_FLOAT_WORD_ORDER_HOST, 64, SIDE_PARAM(_attr))
#define side_type_float_binary128(_attr) _side_type_float(SIDE_TYPE_FLOAT_BINARY128, SIDE_TYPE_FLOAT_WORD_ORDER_HOST, 128, SIDE_PARAM(_attr))
+#define side_field_null(_name, _attr) _side_field(_name, side_type_null(SIDE_PARAM(_attr)))
#define side_field_bool(_name, _attr) _side_field(_name, side_type_bool(SIDE_PARAM(_attr)))
#define side_field_u8(_name, _attr) _side_field(_name, side_type_u8(SIDE_PARAM(_attr)))
#define side_field_u16(_name, _attr) _side_field(_name, side_type_u16(SIDE_PARAM(_attr)))
/* Scatter-gather struct */
+#define _side_field_sg(_name, _type) \
+ { \
+ .field_name = _name, \
+ .side_type = _type, \
+ }
+
+#define side_type_sg_null(_attr) \
+ { \
+ .offset = 0, \
+ .type = SIDE_TYPE_SG_NULL, \
+ .u = { \
+ .side_null = { \
+ .attr = _attr, \
+ .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
+ }, \
+ }, \
+ }
+
+#define side_field_sg_null(_name, _attr) \
+ _side_field_sg(_name, side_type_sg_null(SIDE_PARAM(_attr)))
+
#define _side_type_sg_integer(_type, _signedness, _byte_order, _offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
{ \
.offset = _offset, \
}, \
}
-#define _side_field_sg(_name, _type) \
- { \
- .field_name = _name, \
- .side_type = _type, \
- }
-
#define side_type_sg_unsigned_integer(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
_side_type_sg_integer(SIDE_TYPE_SG_UNSIGNED_INT, false, SIDE_TYPE_BYTE_ORDER_HOST, \
_integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr))
/* Static field arguments */
+#define side_arg_null(_val) { .type = SIDE_TYPE_NULL }
#define side_arg_bool(_val) { .type = SIDE_TYPE_BOOL, .u = { .bool_value = !!(_val) } }
#define side_arg_byte(_val) { .type = SIDE_TYPE_BYTE, .u = { .byte_value = (_val) } }
#define side_arg_string(_val) { .type = SIDE_TYPE_STRING, .u = { .string_value = (uintptr_t) (_val) } }
{ \
.dynamic_type = SIDE_DYNAMIC_TYPE_NULL, \
.u = { \
- .side_null_type = { \
+ .side_null = { \
.attr = _attr, \
.nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
}, \
side_field_pointer("ptr", side_attr_list()),
side_field_dynamic("dynamic", side_attr_list()),
side_field_dynamic("dynamic_pointer", side_attr_list()),
+ side_field_null("null", side_attr_list()),
),
side_attr_list()
);
side_arg_pointer((void *) 0x1),
side_arg_dynamic(side_arg_dynamic_string("zzz", side_attr_list())),
side_arg_dynamic(side_arg_dynamic_pointer((void *) 0x1, side_attr_list())),
+ side_arg_null(),
)
);
}
side_field_sg_signed_integer("k", offsetof(struct test, k),
side_struct_field_sizeof_bit(struct test, k), 1, 63,
side_attr_list(side_attr("std.integer.base", side_attr_u8(10)))),
+ side_field_sg_null("null", side_attr_list()),
),
side_attr_list()
);
printf("{ ");
switch (type) {
+ case SIDE_TYPE_NULL:
+ tracer_print_type_header(":", type_desc->u.side_null.attr, type_desc->u.side_null.nr_attr);
+ printf("<NULL TYPE>");
+ break;
+
case SIDE_TYPE_BOOL:
tracer_print_type_header(":", type_desc->u.side_bool.attr, type_desc->u.side_bool.nr_attr);
printf("%s", item->u.bool_value ? "true" : "false");
printf("{ ");
switch (sg_type->type) {
+ case SIDE_TYPE_SG_NULL:
+ tracer_print_type_header(":", sg_type->u.side_null.attr, sg_type->u.side_null.nr_attr);
+ printf("<NULL TYPE>");
+ break;
+
case SIDE_TYPE_SG_UNSIGNED_INT:
case SIDE_TYPE_SG_SIGNED_INT:
switch (sg_type->u.side_integer.type.integer_size_bits) {
default:
abort();
}
+ memcpy(&value, ptr + sg_type->offset, sg_type->u.side_integer.type.integer_size_bits >> 3);
+ tracer_print_type_integer(":", &sg_type->u.side_integer.type, &value,
+ sg_type->u.side_integer.offset_bits, TRACER_DISPLAY_BASE_10);
+ break;
+ default:
+ fprintf(stderr, "<UNKNOWN TYPE>");
+ abort();
}
- memcpy(&value, ptr + sg_type->offset, sg_type->u.side_integer.type.integer_size_bits >> 3);
- tracer_print_type_integer(":", &sg_type->u.side_integer.type, &value,
- sg_type->u.side_integer.offset_bits, TRACER_DISPLAY_BASE_10);
printf(" }");
}
printf("{ ");
switch (item->dynamic_type) {
case SIDE_DYNAMIC_TYPE_NULL:
- tracer_print_type_header("::", item->u.side_null_type.attr, item->u.side_null_type.nr_attr);
+ tracer_print_type_header("::", item->u.side_null.attr, item->u.side_null.nr_attr);
printf("<NULL TYPE>");
break;
case SIDE_DYNAMIC_TYPE_BOOL: