struct side_arg_dynamic_event_struct;
enum side_type {
+ /* Basic types */
SIDE_TYPE_BOOL,
-
SIDE_TYPE_U8,
SIDE_TYPE_U16,
SIDE_TYPE_U32,
SIDE_TYPE_S32,
SIDE_TYPE_S64,
SIDE_TYPE_BLOB,
+ SIDE_TYPE_FLOAT_BINARY16,
+ SIDE_TYPE_FLOAT_BINARY32,
+ SIDE_TYPE_FLOAT_BINARY64,
+ SIDE_TYPE_FLOAT_BINARY128,
+ SIDE_TYPE_STRING,
+ /* Enumeration types */
SIDE_TYPE_ENUM_U8,
SIDE_TYPE_ENUM_U16,
SIDE_TYPE_ENUM_U32,
SIDE_TYPE_ENUM_BITMAP32,
SIDE_TYPE_ENUM_BITMAP64,
- SIDE_TYPE_FLOAT_BINARY16,
- SIDE_TYPE_FLOAT_BINARY32,
- SIDE_TYPE_FLOAT_BINARY64,
- SIDE_TYPE_FLOAT_BINARY128,
-
- SIDE_TYPE_STRING,
-
+ /* Compound types */
SIDE_TYPE_STRUCT,
SIDE_TYPE_ARRAY,
SIDE_TYPE_VLA,
SIDE_TYPE_VLA_S64,
SIDE_TYPE_VLA_BLOB,
+ /* Dynamic type */
SIDE_TYPE_DYNAMIC,
};
enum side_dynamic_type {
+ /* Basic types */
SIDE_DYNAMIC_TYPE_NULL,
-
SIDE_DYNAMIC_TYPE_BOOL,
-
SIDE_DYNAMIC_TYPE_U8,
SIDE_DYNAMIC_TYPE_U16,
SIDE_DYNAMIC_TYPE_U32,
SIDE_DYNAMIC_TYPE_S32,
SIDE_DYNAMIC_TYPE_S64,
SIDE_DYNAMIC_TYPE_BLOB,
-
SIDE_DYNAMIC_TYPE_FLOAT_BINARY16,
SIDE_DYNAMIC_TYPE_FLOAT_BINARY32,
SIDE_DYNAMIC_TYPE_FLOAT_BINARY64,
SIDE_DYNAMIC_TYPE_FLOAT_BINARY128,
-
SIDE_DYNAMIC_TYPE_STRING,
+ /* Compound types */
SIDE_DYNAMIC_TYPE_STRUCT,
SIDE_DYNAMIC_TYPE_STRUCT_VISITOR,
-
SIDE_DYNAMIC_TYPE_VLA,
SIDE_DYNAMIC_TYPE_VLA_VISITOR,
};
enum side_attr_type {
SIDE_ATTR_TYPE_BOOL,
-
SIDE_ATTR_TYPE_U8,
SIDE_ATTR_TYPE_U16,
SIDE_ATTR_TYPE_U32,
SIDE_ATTR_TYPE_S16,
SIDE_ATTR_TYPE_S32,
SIDE_ATTR_TYPE_S64,
-
SIDE_ATTR_TYPE_FLOAT_BINARY16,
SIDE_ATTR_TYPE_FLOAT_BINARY32,
SIDE_ATTR_TYPE_FLOAT_BINARY64,
SIDE_ATTR_TYPE_FLOAT_BINARY128,
-
SIDE_ATTR_TYPE_STRING,
};
uint32_t type; /* enum side_attr_type */
union {
uint8_t side_bool;
-
uint8_t side_u8;
uint16_t side_u16;
uint32_t side_u32;
int16_t side_s16;
int32_t side_s32;
int64_t side_s64;
-
#if __HAVE_FLOAT16
_Float16 side_float_binary16;
#endif
#if __HAVE_FLOAT128
_Float128 side_float_binary128;
#endif
-
const char *string;
} u;
};
struct side_type_description {
uint32_t type; /* enum side_type */
union {
+ /* Basic types */
struct {
const struct side_attr *attr;
uint32_t nr_attr;
} side_basic;
+
+ /* Enumeration types */
+ const struct side_enum_mappings *side_enum_mappings;
+ const struct side_enum_bitmap_mappings *side_enum_bitmap_mappings;
+
+ /* Compound types */
struct {
const struct side_type_description *elem_type;
const struct side_attr *attr;
uint32_t nr_attr;
} side_vla_visitor;
const struct side_type_struct *side_struct;
- const struct side_enum_mappings *side_enum_mappings;
- const struct side_enum_bitmap_mappings *side_enum_bitmap_mappings;
} u;
};
struct side_arg_dynamic_vec {
uint32_t dynamic_type; /* enum side_dynamic_type */
union {
+ /* Basic types */
struct {
const struct side_attr *attr;
uint32_t nr_attr;
union {
uint8_t side_bool;
-
uint8_t side_u8;
uint16_t side_u16;
uint32_t side_u32;
int32_t side_s32;
int64_t side_s64;
uint8_t side_blob;
-
#if __HAVE_FLOAT16
_Float16 side_float_binary16;
#endif
#if __HAVE_FLOAT128
_Float128 side_float_binary128;
#endif
-
const char *string;
} u;
} side_basic;
+ /* Compound types */
const struct side_arg_dynamic_event_struct *side_dynamic_struct;
struct {
void *app_ctx;
const struct side_attr *attr;
uint32_t nr_attr;
} side_dynamic_struct_visitor;
-
const struct side_arg_dynamic_vec_vla *side_dynamic_vla;
struct {
void *app_ctx;
struct side_arg_vec {
enum side_type type;
union {
+ /* Basic types */
uint8_t side_bool;
-
uint8_t side_u8;
uint16_t side_u16;
uint32_t side_u32;
int32_t side_s32;
int64_t side_s64;
uint8_t side_blob;
-
#if __HAVE_FLOAT16
_Float16 side_float_binary16;
#endif
#if __HAVE_FLOAT128
_Float128 side_float_binary128;
#endif
-
const char *string;
+
+ /* Compound types */
const struct side_arg_vec_description *side_struct;
const struct side_arg_vec_description *side_array;
const struct side_arg_vec_description *side_vla;
void *side_vla_app_visitor_ctx;
-
void *side_array_fixint;
struct {
void *p;
uint32_t length;
} side_vla_fixint;
+ /* Dynamic type */
struct side_arg_dynamic_vec dynamic;
} u;
};
void *priv; /* Private tracer context. */
};
+/* Event and type attributes */
+
#define side_attr(_key, _value) \
{ \
.key = _key, \
#define side_attr_list(...) \
SIDE_COMPOUND_LITERAL(const struct side_attr, __VA_ARGS__)
+#define side_attr_bool(_val) { .type = SIDE_ATTR_TYPE_BOOL, .u = { .side_bool = !!(_val) } }
+#define side_attr_u8(_val) { .type = SIDE_ATTR_TYPE_U8, .u = { .side_u8 = (_val) } }
+#define side_attr_u16(_val) { .type = SIDE_ATTR_TYPE_U16, .u = { .side_u16 = (_val) } }
+#define side_attr_u32(_val) { .type = SIDE_ATTR_TYPE_U32, .u = { .side_u32 = (_val) } }
+#define side_attr_u64(_val) { .type = SIDE_ATTR_TYPE_U64, .u = { .side_u64 = (_val) } }
+#define side_attr_s8(_val) { .type = SIDE_ATTR_TYPE_S8, .u = { .side_s8 = (_val) } }
+#define side_attr_s16(_val) { .type = SIDE_ATTR_TYPE_S16, .u = { .side_s16 = (_val) } }
+#define side_attr_s32(_val) { .type = SIDE_ATTR_TYPE_S32, .u = { .side_s32 = (_val) } }
+#define side_attr_s64(_val) { .type = SIDE_ATTR_TYPE_S64, .u = { .side_s64 = (_val) } }
+#define side_attr_float_binary16(_val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY16, .u = { .side_float_binary16 = (_val) } }
+#define side_attr_float_binary32(_val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY32, .u = { .side_float_binary32 = (_val) } }
+#define side_attr_float_binary64(_val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY64, .u = { .side_float_binary64 = (_val) } }
+#define side_attr_float_binary128(_val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY128, .u = { .side_float_binary128 = (_val) } }
+#define side_attr_string(_val) { .type = SIDE_ATTR_TYPE_STRING, .u = { .string = (_val) } }
+
+/* Static field definition */
+
#define _side_type_basic(_type, _attr) \
{ \
.type = _type, \
#define side_field_list(...) \
SIDE_COMPOUND_LITERAL(const struct side_event_field, __VA_ARGS__)
-#define side_arg_bool(val) { .type = SIDE_TYPE_BOOL, .u = { .side_bool = !!(val) } }
-#define side_arg_u8(val) { .type = SIDE_TYPE_U8, .u = { .side_u8 = (val) } }
-#define side_arg_u16(val) { .type = SIDE_TYPE_U16, .u = { .side_u16 = (val) } }
-#define side_arg_u32(val) { .type = SIDE_TYPE_U32, .u = { .side_u32 = (val) } }
-#define side_arg_u64(val) { .type = SIDE_TYPE_U64, .u = { .side_u64 = (val) } }
-#define side_arg_s8(val) { .type = SIDE_TYPE_S8, .u = { .side_s8 = (val) } }
-#define side_arg_s16(val) { .type = SIDE_TYPE_S16, .u = { .side_s16 = (val) } }
-#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) } }
-#define side_arg_enum_bitmap64(val) { .type = SIDE_TYPE_ENUM_BITMAP64, .u = { .side_u64 = (val) } }
-#define side_arg_float_binary16(val) { .type = SIDE_TYPE_FLOAT_BINARY16, .u = { .side_float_binary16 = (val) } }
-#define side_arg_float_binary32(val) { .type = SIDE_TYPE_FLOAT_BINARY32, .u = { .side_float_binary32 = (val) } }
-#define side_arg_float_binary64(val) { .type = SIDE_TYPE_FLOAT_BINARY64, .u = { .side_float_binary64 = (val) } }
-#define side_arg_float_binary128(val) { .type = SIDE_TYPE_FLOAT_BINARY128, .u = { .side_float_binary128 = (val) } }
-
-#define side_arg_string(val) { .type = SIDE_TYPE_STRING, .u = { .string = (val) } }
+/* Static field arguments */
+
+#define side_arg_bool(_val) { .type = SIDE_TYPE_BOOL, .u = { .side_bool = !!(_val) } }
+#define side_arg_u8(_val) { .type = SIDE_TYPE_U8, .u = { .side_u8 = (_val) } }
+#define side_arg_u16(_val) { .type = SIDE_TYPE_U16, .u = { .side_u16 = (_val) } }
+#define side_arg_u32(_val) { .type = SIDE_TYPE_U32, .u = { .side_u32 = (_val) } }
+#define side_arg_u64(_val) { .type = SIDE_TYPE_U64, .u = { .side_u64 = (_val) } }
+#define side_arg_s8(_val) { .type = SIDE_TYPE_S8, .u = { .side_s8 = (_val) } }
+#define side_arg_s16(_val) { .type = SIDE_TYPE_S16, .u = { .side_s16 = (_val) } }
+#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) } }
+#define side_arg_enum_bitmap64(_val) { .type = SIDE_TYPE_ENUM_BITMAP64, .u = { .side_u64 = (_val) } }
+#define side_arg_float_binary16(_val) { .type = SIDE_TYPE_FLOAT_BINARY16, .u = { .side_float_binary16 = (_val) } }
+#define side_arg_float_binary32(_val) { .type = SIDE_TYPE_FLOAT_BINARY32, .u = { .side_float_binary32 = (_val) } }
+#define side_arg_float_binary64(_val) { .type = SIDE_TYPE_FLOAT_BINARY64, .u = { .side_float_binary64 = (_val) } }
+#define side_arg_float_binary128(_val) { .type = SIDE_TYPE_FLOAT_BINARY128, .u = { .side_float_binary128 = (_val) } }
+
+#define side_arg_string(_val) { .type = SIDE_TYPE_STRING, .u = { .string = (_val) } }
#define side_arg_struct(_side_type) { .type = SIDE_TYPE_STRUCT, .u = { .side_struct = (_side_type) } }
#define side_arg_array(_side_type) { .type = SIDE_TYPE_ARRAY, .u = { .side_array = (_side_type) } }
#define side_arg_vla(_side_type) { .type = SIDE_TYPE_VLA, .u = { .side_vla = (_side_type) } }
#define side_arg_vla_s64(_ptr, _length) { .type = SIDE_TYPE_VLA_S64, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } }
#define side_arg_vla_blob(_ptr, _length) { .type = SIDE_TYPE_VLA_BLOB, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } }
-#define side_arg_dynamic(dynamic_arg_type) \
+#define side_arg_dynamic(_dynamic_arg_type) \
{ \
.type = SIDE_TYPE_DYNAMIC, \
.u = { \
- .dynamic = dynamic_arg_type, \
+ .dynamic = _dynamic_arg_type, \
}, \
}
+/* Dynamic field arguments */
+
#define side_arg_dynamic_null(_attr) \
{ \
.dynamic_type = SIDE_DYNAMIC_TYPE_NULL, \
#define side_arg_list(...) __VA_ARGS__
-#define side_attr_bool(val) { .type = SIDE_ATTR_TYPE_BOOL, .u = { .side_bool = !!(val) } }
-#define side_attr_u8(val) { .type = SIDE_ATTR_TYPE_U8, .u = { .side_u8 = (val) } }
-#define side_attr_u16(val) { .type = SIDE_ATTR_TYPE_U16, .u = { .side_u16 = (val) } }
-#define side_attr_u32(val) { .type = SIDE_ATTR_TYPE_U32, .u = { .side_u32 = (val) } }
-#define side_attr_u64(val) { .type = SIDE_ATTR_TYPE_U64, .u = { .side_u64 = (val) } }
-#define side_attr_s8(val) { .type = SIDE_ATTR_TYPE_S8, .u = { .side_s8 = (val) } }
-#define side_attr_s16(val) { .type = SIDE_ATTR_TYPE_S16, .u = { .side_s16 = (val) } }
-#define side_attr_s32(val) { .type = SIDE_ATTR_TYPE_S32, .u = { .side_s32 = (val) } }
-#define side_attr_s64(val) { .type = SIDE_ATTR_TYPE_S64, .u = { .side_s64 = (val) } }
-#define side_attr_float_binary16(val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY16, .u = { .side_float_binary16 = (val) } }
-#define side_attr_float_binary32(val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY32, .u = { .side_float_binary32 = (val) } }
-#define side_attr_float_binary64(val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY64, .u = { .side_float_binary64 = (val) } }
-#define side_attr_float_binary128(val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY128, .u = { .side_float_binary128 = (val) } }
-#define side_attr_string(val) { .type = SIDE_ATTR_TYPE_STRING, .u = { .string = (val) } }
-
-#define side_event_cond(_desc) if (side_unlikely(_desc##_enabled))
-
-#define side_event_call(_desc, _sav) \
- { \
- const struct side_arg_vec side_sav[] = { _sav }; \
- const struct side_arg_vec_description sav_desc = { \
- .sav = side_sav, \
- .len = SIDE_ARRAY_SIZE(side_sav), \
- }; \
- side_call(&(_desc), &sav_desc); \
- }
-
-#define side_event(_desc, _sav) \
- side_event_cond(_desc) \
- side_event_call(_desc, SIDE_PARAM(_sav))
-
-#define side_event_call_variadic(_desc, _sav, _var_fields, _attr) \
- { \
- const struct side_arg_vec side_sav[] = { _sav }; \
- const struct side_arg_vec_description sav_desc = { \
- .sav = side_sav, \
- .len = SIDE_ARRAY_SIZE(side_sav), \
- }; \
- const struct side_arg_dynamic_event_field side_fields[] = { _var_fields }; \
- const struct side_arg_dynamic_event_struct var_struct = { \
- .fields = side_fields, \
- .attr = _attr, \
- .len = SIDE_ARRAY_SIZE(side_fields), \
- .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
- }; \
- side_call_variadic(&(_desc), &sav_desc, &var_struct); \
- }
-
-#define side_event_variadic(_desc, _sav, _var, _attr) \
- side_event_cond(_desc) \
- side_event_call_variadic(_desc, SIDE_PARAM(_sav), SIDE_PARAM(_var), SIDE_PARAM(_attr))
-
#define side_define_enum(_identifier, _mappings, _attr) \
const struct side_enum_mappings _identifier = { \
.mappings = _mappings, \
.label = _label, \
}
+#define side_event_cond(_desc) if (side_unlikely(_desc##_enabled))
+
+#define side_event_call(_desc, _sav) \
+ { \
+ const struct side_arg_vec side_sav[] = { _sav }; \
+ const struct side_arg_vec_description sav_desc = { \
+ .sav = side_sav, \
+ .len = SIDE_ARRAY_SIZE(side_sav), \
+ }; \
+ side_call(&(_desc), &sav_desc); \
+ }
+
+#define side_event(_desc, _sav) \
+ side_event_cond(_desc) \
+ side_event_call(_desc, SIDE_PARAM(_sav))
+
+#define side_event_call_variadic(_desc, _sav, _var_fields, _attr) \
+ { \
+ const struct side_arg_vec side_sav[] = { _sav }; \
+ const struct side_arg_vec_description sav_desc = { \
+ .sav = side_sav, \
+ .len = SIDE_ARRAY_SIZE(side_sav), \
+ }; \
+ const struct side_arg_dynamic_event_field side_fields[] = { _var_fields }; \
+ const struct side_arg_dynamic_event_struct var_struct = { \
+ .fields = side_fields, \
+ .attr = _attr, \
+ .len = SIDE_ARRAY_SIZE(side_fields), \
+ .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
+ }; \
+ side_call_variadic(&(_desc), &sav_desc, &var_struct); \
+ }
+
+#define side_event_variadic(_desc, _sav, _var, _attr) \
+ side_event_cond(_desc) \
+ side_event_call_variadic(_desc, SIDE_PARAM(_sav), SIDE_PARAM(_var), SIDE_PARAM(_attr))
+
#define _side_define_event(_identifier, _provider, _event, _loglevel, _fields, _attr, _flags) \
uint32_t _identifier##_enabled __attribute__((section("side_event_enable"))); \
struct side_callbacks _identifier##_callbacks __attribute__((section("side_event_callbacks"))); \