SIDE_TYPE_VLA_BLOB,
/* Enumeration types */
- SIDE_TYPE_ENUM_U8,
- SIDE_TYPE_ENUM_U16,
- SIDE_TYPE_ENUM_U32,
- SIDE_TYPE_ENUM_U64,
- SIDE_TYPE_ENUM_S8,
- SIDE_TYPE_ENUM_S16,
- SIDE_TYPE_ENUM_S32,
- SIDE_TYPE_ENUM_S64,
+ SIDE_TYPE_ENUM,
SIDE_TYPE_ENUM_BITMAP8,
SIDE_TYPE_ENUM_BITMAP16,
const struct side_type_struct *side_struct;
/* Enumeration types */
- const struct side_enum_mappings *side_enum_mappings;
+ struct {
+ const struct side_type_description *elem_type;
+ const struct side_enum_mappings *mappings;
+ } side_enum;
+
const struct side_enum_bitmap_mappings *side_enum_bitmap_mappings;
struct {
const struct side_type_description *elem_type;
#define side_field_string(_name, _attr) _side_field(_name, side_type_string(SIDE_PARAM(_attr)))
#define side_field_dynamic(_name, _attr) _side_field(_name, side_type_dynamic(SIDE_PARAM(_attr)))
-#define side_type_enum(_type, _mappings) \
+#define side_type_enum(_elem_type, _mappings) \
{ \
- .type = _type, \
+ .type = SIDE_TYPE_ENUM, \
.u = { \
- .side_enum_mappings = _mappings, \
+ .side_enum = { \
+ .elem_type = _elem_type, \
+ .mappings = _mappings, \
+ }, \
}, \
}
-#define _side_field_enum(_name, _type, _mappings) \
- _side_field(_name, side_type_enum(_type, SIDE_PARAM(_mappings)))
-
-#define side_field_enum_u8(_name, _mappings) \
- _side_field_enum(_name, SIDE_TYPE_ENUM_U8, SIDE_PARAM(_mappings))
-#define side_field_enum_u16(_name, _mappings) \
- _side_field_enum(_name, SIDE_TYPE_ENUM_U16, SIDE_PARAM(_mappings))
-#define side_field_enum_u32(_name, _mappings) \
- _side_field_enum(_name, SIDE_TYPE_ENUM_U32, SIDE_PARAM(_mappings))
-#define side_field_enum_u64(_name, _mappings) \
- _side_field_enum(_name, SIDE_TYPE_ENUM_U64, SIDE_PARAM(_mappings))
-#define side_field_enum_s8(_name, _mappings) \
- _side_field_enum(_name, SIDE_TYPE_ENUM_S8, SIDE_PARAM(_mappings))
-#define side_field_enum_s16(_name, _mappings) \
- _side_field_enum(_name, SIDE_TYPE_ENUM_S16, SIDE_PARAM(_mappings))
-#define side_field_enum_s32(_name, _mappings) \
- _side_field_enum(_name, SIDE_TYPE_ENUM_S32, SIDE_PARAM(_mappings))
-#define side_field_enum_s64(_name, _mappings) \
- _side_field_enum(_name, SIDE_TYPE_ENUM_S64, SIDE_PARAM(_mappings))
+#define side_field_enum(_name, _elem_type, _mappings) \
+ _side_field(_name, side_type_enum(SIDE_PARAM(_elem_type), SIDE_PARAM(_mappings)))
#define side_type_enum_bitmap(_type, _mappings) \
{ \
#define side_arg_s32(_val) { .type = SIDE_TYPE_S32, .u = { .side_s32 = (_val) } }
#define side_arg_s64(_val) { .type = SIDE_TYPE_S64, .u = { .side_s64 = (_val) } }
#define side_arg_blob(_val) { .type = SIDE_TYPE_BLOB, .u = { .side_blob = (_val) } }
-#define side_arg_enum_u8(_val) { .type = SIDE_TYPE_ENUM_U8, .u = { .side_u8 = (_val) } }
-#define side_arg_enum_u16(_val) { .type = SIDE_TYPE_ENUM_U16, .u = { .side_u16 = (_val) } }
-#define side_arg_enum_u32(_val) { .type = SIDE_TYPE_ENUM_U32, .u = { .side_u32 = (_val) } }
-#define side_arg_enum_u64(_val) { .type = SIDE_TYPE_ENUM_U64, .u = { .side_u64 = (_val) } }
-#define side_arg_enum_s8(_val) { .type = SIDE_TYPE_ENUM_S8, .u = { .side_s8 = (_val) } }
-#define side_arg_enum_s16(_val) { .type = SIDE_TYPE_ENUM_S16, .u = { .side_s16 = (_val) } }
-#define side_arg_enum_s32(_val) { .type = SIDE_TYPE_ENUM_S32, .u = { .side_s32 = (_val) } }
-#define side_arg_enum_s64(_val) { .type = SIDE_TYPE_ENUM_S64, .u = { .side_s64 = (_val) } }
#define side_arg_enum_bitmap8(_val) { .type = SIDE_TYPE_ENUM_BITMAP8, .u = { .side_u8 = (_val) } }
#define side_arg_enum_bitmap16(_val) { .type = SIDE_TYPE_ENUM_BITMAP16, .u = { .side_u16 = (_val) } }
#define side_arg_enum_bitmap32(_val) { .type = SIDE_TYPE_ENUM_BITMAP32, .u = { .side_u32 = (_val) } }
static side_define_event(my_provider_event_enum, "myprovider", "myeventenum", SIDE_LOGLEVEL_DEBUG,
side_field_list(
- side_field_enum_u32("5", &myenum),
- side_field_enum_u64("400", &myenum),
- side_field_enum_u8("200", &myenum),
- side_field_enum_s8("-100", &myenum),
+ side_field_enum("5", side_elem(side_type_u32(side_attr_list())), &myenum),
+ side_field_enum("400", side_elem(side_type_u64(side_attr_list())), &myenum),
+ side_field_enum("200", side_elem(side_type_u8(side_attr_list())), &myenum),
+ side_field_enum("-100", side_elem(side_type_s8(side_attr_list())), &myenum),
),
side_attr_list()
);
my_provider_event_enum_enabled = 1;
side_event(my_provider_event_enum,
side_arg_list(
- side_arg_enum_u32(5),
- side_arg_enum_u64(400),
- side_arg_enum_u8(200),
- side_arg_enum_s8(-100),
+ side_arg_u32(5),
+ side_arg_u64(400),
+ side_arg_u8(200),
+ side_arg_s8(-100),
)
);
}
void tracer_print_vla_fixint(const struct side_type_description *type_desc, const struct side_arg_vec *item);
static
void tracer_print_dynamic(const struct side_arg_dynamic_vec *dynamic_item);
+static
+void tracer_print_type(const struct side_type_description *type_desc, const struct side_arg_vec *item);
static
void tracer_print_attr_type(const struct side_attr *attr)
}
static
-void print_enum(const struct side_enum_mappings *side_enum_mappings, int64_t value)
+void print_enum(const struct side_type_description *type_desc, const struct side_arg_vec *item)
{
+ const struct side_enum_mappings *mappings = type_desc->u.side_enum.mappings;
int i, print_count = 0;
+ int64_t value;
- print_attributes("attr: ", side_enum_mappings->attr, side_enum_mappings->nr_attr);
- printf("%s", side_enum_mappings->nr_attr ? ", " : "");
- printf("value: %" PRId64 ", labels: [ ", value);
- for (i = 0; i < side_enum_mappings->nr_mappings; i++) {
- const struct side_enum_mapping *mapping = &side_enum_mappings->mappings[i];
+ if (type_desc->u.side_enum.elem_type->type != item->type) {
+ printf("ERROR: Unexpected enum element type\n");
+ abort();
+ }
+ switch (item->type) {
+ case SIDE_TYPE_U8:
+ value = (int64_t) item->u.side_u8;
+ break;
+ case SIDE_TYPE_U16:
+ value = (int64_t) item->u.side_u16;
+ break;
+ case SIDE_TYPE_U32:
+ value = (int64_t) item->u.side_u32;
+ break;
+ case SIDE_TYPE_U64:
+ value = (int64_t) item->u.side_u64;
+ break;
+ case SIDE_TYPE_S8:
+ value = (int64_t) item->u.side_s8;
+ break;
+ case SIDE_TYPE_S16:
+ value = (int64_t) item->u.side_s16;
+ break;
+ case SIDE_TYPE_S32:
+ value = (int64_t) item->u.side_s32;
+ break;
+ case SIDE_TYPE_S64:
+ value = (int64_t) item->u.side_s64;
+ break;
+ default:
+ printf("ERROR: Unexpected enum element type\n");
+ abort();
+ }
+ print_attributes("attr: ", mappings->attr, mappings->nr_attr);
+ printf("%s", mappings->nr_attr ? ", " : "");
+ tracer_print_type(type_desc->u.side_enum.elem_type, item);
+ printf(", labels: [ ");
+ for (i = 0; i < mappings->nr_mappings; i++) {
+ const struct side_enum_mapping *mapping = &mappings->mappings[i];
if (mapping->range_end < mapping->range_begin) {
printf("ERROR: Unexpected enum range: %" PRIu64 "-%" PRIu64 "\n",
static
void tracer_print_type(const struct side_type_description *type_desc, const struct side_arg_vec *item)
{
+ enum side_type type;
+
switch (item->type) {
case SIDE_TYPE_ARRAY_U8:
case SIDE_TYPE_ARRAY_U16:
}
break;
+ case SIDE_TYPE_U8:
+ case SIDE_TYPE_U16:
+ case SIDE_TYPE_U32:
+ case SIDE_TYPE_U64:
+ case SIDE_TYPE_S8:
+ case SIDE_TYPE_S16:
+ case SIDE_TYPE_S32:
+ case SIDE_TYPE_S64:
+ if (type_desc->type != item->type && type_desc->type != SIDE_TYPE_ENUM) {
+ printf("ERROR: type mismatch between description and arguments\n");
+ abort();
+ }
+ break;
+
default:
if (type_desc->type != item->type) {
printf("ERROR: type mismatch between description and arguments\n");
}
break;
}
+
+ if (type_desc->type == SIDE_TYPE_ENUM)
+ type = SIDE_TYPE_ENUM;
+ else
+ type = item->type;
+
printf("{ ");
- switch (item->type) {
+ switch (type) {
case SIDE_TYPE_BOOL:
tracer_print_basic_type_header(type_desc);
printf("%s", item->u.side_bool ? "true" : "false");
printf("0x%" PRIx8, item->u.side_blob);
break;
- case SIDE_TYPE_ENUM_U8:
- print_enum(type_desc->u.side_enum_mappings,
- (int64_t) item->u.side_u8);
- break;
- case SIDE_TYPE_ENUM_U16:
- print_enum(type_desc->u.side_enum_mappings,
- (int64_t) item->u.side_u16);
- break;
- case SIDE_TYPE_ENUM_U32:
- print_enum(type_desc->u.side_enum_mappings,
- (int64_t) item->u.side_u32);
- break;
- case SIDE_TYPE_ENUM_U64:
- print_enum(type_desc->u.side_enum_mappings,
- (int64_t) item->u.side_u64);
- break;
- case SIDE_TYPE_ENUM_S8:
- print_enum(type_desc->u.side_enum_mappings,
- (int64_t) item->u.side_s8);
- break;
- case SIDE_TYPE_ENUM_S16:
- print_enum(type_desc->u.side_enum_mappings,
- (int64_t) item->u.side_s16);
- break;
- case SIDE_TYPE_ENUM_S32:
- print_enum(type_desc->u.side_enum_mappings,
- (int64_t) item->u.side_s32);
- break;
- case SIDE_TYPE_ENUM_S64:
- print_enum(type_desc->u.side_enum_mappings,
- item->u.side_s64);
+ case SIDE_TYPE_ENUM:
+ print_enum(type_desc, item);
break;
case SIDE_TYPE_ENUM_BITMAP8: /* Fall-through */