X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=include%2Fside%2Ftrace.h;h=a2cc0830369c3175a93489bc05be1474f22823fa;hb=6e46f5e679a8a15a0b2f37f80f81d1a28ea4dd39;hp=3581b75c9f3b2ea01f5f94098bff4bf7bb8c16e7;hpb=d89fabc8245103eaab2d9e412975721b809d00cc;p=libside.git diff --git a/include/side/trace.h b/include/side/trace.h index 3581b75..a2cc083 100644 --- a/include/side/trace.h +++ b/include/side/trace.h @@ -30,10 +30,11 @@ struct side_tracer_dynamic_struct_visitor_ctx; struct side_tracer_dynamic_vla_visitor_ctx; struct side_event_description; struct side_arg_dynamic_event_struct; +struct side_events_register_handle; enum side_type { + /* Basic types */ SIDE_TYPE_BOOL, - SIDE_TYPE_U8, SIDE_TYPE_U16, SIDE_TYPE_U32, @@ -42,29 +43,14 @@ enum side_type { SIDE_TYPE_S16, SIDE_TYPE_S32, SIDE_TYPE_S64, - SIDE_TYPE_BLOB, - - 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_BITMAP8, - SIDE_TYPE_ENUM_BITMAP16, - SIDE_TYPE_ENUM_BITMAP32, - SIDE_TYPE_ENUM_BITMAP64, - + SIDE_TYPE_BYTE, 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, @@ -78,7 +64,7 @@ enum side_type { SIDE_TYPE_ARRAY_S16, SIDE_TYPE_ARRAY_S32, SIDE_TYPE_ARRAY_S64, - SIDE_TYPE_ARRAY_BLOB, + SIDE_TYPE_ARRAY_BYTE, SIDE_TYPE_VLA_U8, SIDE_TYPE_VLA_U16, @@ -88,16 +74,20 @@ enum side_type { SIDE_TYPE_VLA_S16, SIDE_TYPE_VLA_S32, SIDE_TYPE_VLA_S64, - SIDE_TYPE_VLA_BLOB, + SIDE_TYPE_VLA_BYTE, + + /* Enumeration types */ + SIDE_TYPE_ENUM, + SIDE_TYPE_ENUM_BITMAP, + /* 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, @@ -106,25 +96,23 @@ enum side_dynamic_type { SIDE_DYNAMIC_TYPE_S16, SIDE_DYNAMIC_TYPE_S32, SIDE_DYNAMIC_TYPE_S64, - SIDE_DYNAMIC_TYPE_BLOB, - + SIDE_DYNAMIC_TYPE_BYTE, 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_NULL, SIDE_ATTR_TYPE_BOOL, - SIDE_ATTR_TYPE_U8, SIDE_ATTR_TYPE_U16, SIDE_ATTR_TYPE_U32, @@ -133,12 +121,10 @@ enum side_attr_type { 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, }; @@ -158,6 +144,15 @@ enum side_visitor_status { SIDE_VISITOR_STATUS_ERROR = -1, }; +enum side_error { + SIDE_ERROR_OK = 0, + SIDE_ERROR_INVAL = 1, + SIDE_ERROR_EXIST = 2, + SIDE_ERROR_NOMEM = 3, + SIDE_ERROR_NOENT = 4, + SIDE_ERROR_EXITING = 5, +}; + typedef enum side_visitor_status (*side_visitor)( const struct side_tracer_visitor_ctx *tracer_ctx, void *app_ctx); @@ -172,7 +167,6 @@ struct side_attr_value { uint32_t type; /* enum side_attr_type */ union { uint8_t side_bool; - uint8_t side_u8; uint16_t side_u16; uint32_t side_u32; @@ -181,7 +175,6 @@ struct side_attr_value { int16_t side_s16; int32_t side_s32; int64_t side_s64; - #if __HAVE_FLOAT16 _Float16 side_float_binary16; #endif @@ -194,7 +187,6 @@ struct side_attr_value { #if __HAVE_FLOAT128 _Float128 side_float_binary128; #endif - const char *string; } u; }; @@ -213,42 +205,69 @@ struct side_enum_mapping { struct side_enum_mappings { const struct side_enum_mapping *mappings; + const struct side_attr *attr; uint32_t nr_mappings; + uint32_t nr_attr; }; struct side_enum_bitmap_mapping { - int64_t range_begin; - int64_t range_end; + uint64_t range_begin; + uint64_t range_end; const char *label; }; struct side_enum_bitmap_mappings { const struct side_enum_bitmap_mapping *mappings; + const struct side_attr *attr; uint32_t nr_mappings; + uint32_t nr_attr; }; -struct side_type_description { - uint32_t type; /* enum side_type */ +struct side_type_struct { + uint32_t nr_fields; uint32_t nr_attr; + const struct side_event_field *fields; const struct side_attr *attr; +}; + +struct side_type_description { + uint32_t type; /* enum side_type */ union { + /* Basic types */ struct { - uint32_t nr_fields; - const struct side_event_field *fields; - } side_struct; + const struct side_attr *attr; + uint32_t nr_attr; + } side_basic; + + /* Compound types */ struct { - uint32_t length; const struct side_type_description *elem_type; + const struct side_attr *attr; + uint32_t length; + uint32_t nr_attr; } side_array; struct { const struct side_type_description *elem_type; + const struct side_attr *attr; + uint32_t nr_attr; } side_vla; struct { const struct side_type_description *elem_type; side_visitor visitor; + const struct side_attr *attr; + uint32_t nr_attr; } side_vla_visitor; - const struct side_enum_mappings *side_enum_mappings; - const struct side_enum_bitmap_mappings *side_enum_bitmap_mappings; + const struct side_type_struct *side_struct; + + /* Enumeration types */ + struct { + const struct side_enum_mappings *mappings; + const struct side_type_description *elem_type; + } side_enum; + struct { + const struct side_enum_bitmap_mappings *mappings; + const struct side_type_description *elem_type; + } side_enum_bitmap; } u; }; @@ -274,11 +293,6 @@ struct side_callback { void *priv; }; -struct side_callbacks { - struct side_callback *cb; - uint32_t nr_cb; -}; - struct side_event_description { uint32_t version; uint32_t *enabled; @@ -291,60 +305,68 @@ struct side_event_description { const char *event_name; const struct side_event_field *fields; const struct side_attr *attr; - struct side_callbacks *callbacks; -}; - -struct side_arg_dynamic_vec_vla { - const struct side_arg_dynamic_vec *sav; - uint32_t len; + const struct side_callback *callbacks; }; struct side_arg_dynamic_vec { uint32_t dynamic_type; /* enum side_dynamic_type */ - uint32_t nr_attr; - const struct side_attr *attr; union { - uint8_t side_bool; - - uint8_t side_u8; - uint16_t side_u16; - uint32_t side_u32; - uint64_t side_u64; - int8_t side_s8; - int16_t side_s16; - int32_t side_s32; - int64_t side_s64; - uint8_t side_blob; - + /* 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; + uint64_t side_u64; + int8_t side_s8; + int16_t side_s16; + int32_t side_s32; + int64_t side_s64; + uint8_t side_byte; #if __HAVE_FLOAT16 - _Float16 side_float_binary16; + _Float16 side_float_binary16; #endif #if __HAVE_FLOAT32 - _Float32 side_float_binary32; + _Float32 side_float_binary32; #endif #if __HAVE_FLOAT64 - _Float64 side_float_binary64; + _Float64 side_float_binary64; #endif #if __HAVE_FLOAT128 - _Float128 side_float_binary128; + _Float128 side_float_binary128; #endif + const char *string; + } u; + } side_basic; - const char *string; - + /* Compound types */ const struct side_arg_dynamic_event_struct *side_dynamic_struct; struct { void *app_ctx; side_dynamic_struct_visitor visitor; + 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; side_dynamic_vla_visitor visitor; + const struct side_attr *attr; + uint32_t nr_attr; } side_dynamic_vla_visitor; } u; }; +struct side_arg_dynamic_vec_vla { + const struct side_arg_dynamic_vec *sav; + const struct side_attr *attr; + uint32_t len; + uint32_t nr_attr; +}; + struct side_arg_dynamic_event_field { const char *field_name; const struct side_arg_dynamic_vec elem; @@ -352,14 +374,16 @@ struct side_arg_dynamic_event_field { struct side_arg_dynamic_event_struct { const struct side_arg_dynamic_event_field *fields; + const struct side_attr *attr; uint32_t len; + uint32_t nr_attr; }; 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; @@ -368,8 +392,7 @@ struct side_arg_vec { int16_t side_s16; int32_t side_s32; int64_t side_s64; - uint8_t side_blob; - + uint8_t side_byte; #if __HAVE_FLOAT16 _Float16 side_float_binary16; #endif @@ -382,19 +405,20 @@ struct side_arg_vec { #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; }; @@ -426,6 +450,8 @@ struct side_tracer_dynamic_vla_visitor_ctx { void *priv; /* Private tracer context. */ }; +/* Event and type attributes */ + #define side_attr(_key, _value) \ { \ .key = _key, \ @@ -435,29 +461,51 @@ struct side_tracer_dynamic_vla_visitor_ctx { #define side_attr_list(...) \ SIDE_COMPOUND_LITERAL(const struct side_attr, __VA_ARGS__) -#define _side_type(_type, _attr) \ +#define side_attr_null(_val) { .type = SIDE_ATTR_TYPE_NULL } +#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, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ + .u = { \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + }, \ + }, \ } -#define side_type_bool(_attr) _side_type(SIDE_TYPE_BOOL, SIDE_PARAM(_attr)) -#define side_type_u8(_attr) _side_type(SIDE_TYPE_U8, SIDE_PARAM(_attr)) -#define side_type_u16(_attr) _side_type(SIDE_TYPE_U16, SIDE_PARAM(_attr)) -#define side_type_u32(_attr) _side_type(SIDE_TYPE_U32, SIDE_PARAM(_attr)) -#define side_type_u64(_attr) _side_type(SIDE_TYPE_U64, SIDE_PARAM(_attr)) -#define side_type_s8(_attr) _side_type(SIDE_TYPE_S8, SIDE_PARAM(_attr)) -#define side_type_s16(_attr) _side_type(SIDE_TYPE_S16, SIDE_PARAM(_attr)) -#define side_type_s32(_attr) _side_type(SIDE_TYPE_S32, SIDE_PARAM(_attr)) -#define side_type_s64(_attr) _side_type(SIDE_TYPE_S64, SIDE_PARAM(_attr)) -#define side_type_blob(_attr) _side_type(SIDE_TYPE_BLOB, SIDE_PARAM(_attr)) -#define side_type_float_binary16(_attr) _side_type(SIDE_TYPE_FLOAT_BINARY16, SIDE_PARAM(_attr)) -#define side_type_float_binary32(_attr) _side_type(SIDE_TYPE_FLOAT_BINARY32, SIDE_PARAM(_attr)) -#define side_type_float_binary64(_attr) _side_type(SIDE_TYPE_FLOAT_BINARY64, SIDE_PARAM(_attr)) -#define side_type_float_binary128(_attr) _side_type(SIDE_TYPE_FLOAT_BINARY128, SIDE_PARAM(_attr)) -#define side_type_string(_attr) _side_type(SIDE_TYPE_STRING, SIDE_PARAM(_attr)) -#define side_type_dynamic(_attr) _side_type(SIDE_TYPE_DYNAMIC, SIDE_PARAM(_attr)) +#define side_type_bool(_attr) _side_type_basic(SIDE_TYPE_BOOL, SIDE_PARAM(_attr)) +#define side_type_u8(_attr) _side_type_basic(SIDE_TYPE_U8, SIDE_PARAM(_attr)) +#define side_type_u16(_attr) _side_type_basic(SIDE_TYPE_U16, SIDE_PARAM(_attr)) +#define side_type_u32(_attr) _side_type_basic(SIDE_TYPE_U32, SIDE_PARAM(_attr)) +#define side_type_u64(_attr) _side_type_basic(SIDE_TYPE_U64, SIDE_PARAM(_attr)) +#define side_type_s8(_attr) _side_type_basic(SIDE_TYPE_S8, SIDE_PARAM(_attr)) +#define side_type_s16(_attr) _side_type_basic(SIDE_TYPE_S16, SIDE_PARAM(_attr)) +#define side_type_s32(_attr) _side_type_basic(SIDE_TYPE_S32, SIDE_PARAM(_attr)) +#define side_type_s64(_attr) _side_type_basic(SIDE_TYPE_S64, SIDE_PARAM(_attr)) +#define side_type_byte(_attr) _side_type_basic(SIDE_TYPE_BYTE, SIDE_PARAM(_attr)) +#define side_type_float_binary16(_attr) _side_type_basic(SIDE_TYPE_FLOAT_BINARY16, SIDE_PARAM(_attr)) +#define side_type_float_binary32(_attr) _side_type_basic(SIDE_TYPE_FLOAT_BINARY32, SIDE_PARAM(_attr)) +#define side_type_float_binary64(_attr) _side_type_basic(SIDE_TYPE_FLOAT_BINARY64, SIDE_PARAM(_attr)) +#define side_type_float_binary128(_attr) _side_type_basic(SIDE_TYPE_FLOAT_BINARY128, SIDE_PARAM(_attr)) +#define side_type_string(_attr) _side_type_basic(SIDE_TYPE_STRING, SIDE_PARAM(_attr)) +#define side_type_dynamic(_attr) _side_type_basic(SIDE_TYPE_DYNAMIC, SIDE_PARAM(_attr)) #define _side_field(_name, _type) \ { \ @@ -474,7 +522,7 @@ struct side_tracer_dynamic_vla_visitor_ctx { #define side_field_s16(_name, _attr) _side_field(_name, side_type_s16(SIDE_PARAM(_attr))) #define side_field_s32(_name, _attr) _side_field(_name, side_type_s32(SIDE_PARAM(_attr))) #define side_field_s64(_name, _attr) _side_field(_name, side_type_s64(SIDE_PARAM(_attr))) -#define side_field_blob(_name, _attr) _side_field(_name, side_type_blob(SIDE_PARAM(_attr))) +#define side_field_byte(_name, _attr) _side_field(_name, side_type_byte(SIDE_PARAM(_attr))) #define side_field_float_binary16(_name, _attr) _side_field(_name, side_type_float_binary16(SIDE_PARAM(_attr))) #define side_field_float_binary32(_name, _attr) _side_field(_name, side_type_float_binary32(SIDE_PARAM(_attr))) #define side_field_float_binary64(_name, _attr) _side_field(_name, side_type_float_binary64(SIDE_PARAM(_attr))) @@ -482,80 +530,66 @@ struct side_tracer_dynamic_vla_visitor_ctx { #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, _attr) \ +#define side_type_enum(_mappings, _elem_type) \ { \ - .type = _type, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ + .type = SIDE_TYPE_ENUM, \ .u = { \ - .side_enum_mappings = _mappings, \ + .side_enum = { \ + .mappings = _mappings, \ + .elem_type = _elem_type, \ + }, \ }, \ } -#define _side_field_enum(_name, _type, _mappings, _attr) \ - _side_field(_name, side_type_enum(_type, SIDE_PARAM(_mappings), SIDE_PARAM(_attr))) - -#define side_field_enum_u8(_name, _mappings, _attr) \ - _side_field_enum(_name, SIDE_TYPE_ENUM_U8, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) -#define side_field_enum_u16(_name, _mappings, _attr) \ - _side_field_enum(_name, SIDE_TYPE_ENUM_U16, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) -#define side_field_enum_u32(_name, _mappings, _attr) \ - _side_field_enum(_name, SIDE_TYPE_ENUM_U32, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) -#define side_field_enum_u64(_name, _mappings, _attr) \ - _side_field_enum(_name, SIDE_TYPE_ENUM_U64, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) -#define side_field_enum_s8(_name, _mappings, _attr) \ - _side_field_enum(_name, SIDE_TYPE_ENUM_S8, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) -#define side_field_enum_s16(_name, _mappings, _attr) \ - _side_field_enum(_name, SIDE_TYPE_ENUM_S16, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) -#define side_field_enum_s32(_name, _mappings, _attr) \ - _side_field_enum(_name, SIDE_TYPE_ENUM_S32, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) -#define side_field_enum_s64(_name, _mappings, _attr) \ - _side_field_enum(_name, SIDE_TYPE_ENUM_S64, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) - -#define side_type_enum_bitmap(_type, _mappings, _attr) \ +#define side_field_enum(_name, _mappings, _elem_type) \ + _side_field(_name, side_type_enum(SIDE_PARAM(_mappings), SIDE_PARAM(_elem_type))) + +#define side_type_enum_bitmap(_mappings, _elem_type) \ { \ - .type = _type, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ + .type = SIDE_TYPE_ENUM_BITMAP, \ .u = { \ - .side_enum_bitmap_mappings = _mappings, \ + .side_enum_bitmap = { \ + .mappings = _mappings, \ + .elem_type = _elem_type, \ + }, \ }, \ } -#define _side_field_enum_bitmap(_name, _type, _mappings, _attr) \ - _side_field(_name, side_type_enum_bitmap(_type, SIDE_PARAM(_mappings), SIDE_PARAM(_attr))) +#define side_field_enum_bitmap(_name, _mappings, _elem_type) \ + _side_field(_name, side_type_enum_bitmap(SIDE_PARAM(_mappings), SIDE_PARAM(_elem_type))) -#define side_field_enum_bitmap8(_name, _mappings, _attr) \ - _side_field_enum_bitmap(_name, SIDE_TYPE_ENUM_BITMAP8, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) -#define side_field_enum_bitmap16(_name, _mappings, _attr) \ - _side_field_enum_bitmap(_name, SIDE_TYPE_ENUM_BITMAP16, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) -#define side_field_enum_bitmap32(_name, _mappings, _attr) \ - _side_field_enum_bitmap(_name, SIDE_TYPE_ENUM_BITMAP32, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) -#define side_field_enum_bitmap64(_name, _mappings, _attr) \ - _side_field_enum_bitmap(_name, SIDE_TYPE_ENUM_BITMAP64, SIDE_PARAM(_mappings), SIDE_PARAM(_attr)) - -#define side_type_struct(_fields, _attr) \ +#define side_type_struct(_struct) \ { \ .type = SIDE_TYPE_STRUCT, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_struct = { \ - .nr_fields = SIDE_ARRAY_SIZE(SIDE_PARAM(_fields)), \ - .fields = _fields, \ - }, \ + .side_struct = _struct, \ }, \ } -#define side_field_struct(_name, _fields, _attr) \ - _side_field(_name, side_type_struct(SIDE_PARAM(_fields), SIDE_PARAM(_attr))) +#define side_field_struct(_name, _struct) \ + _side_field(_name, side_type_struct(SIDE_PARAM(_struct))) + +#define _side_type_struct_define(_fields, _attr) \ + { \ + .nr_fields = SIDE_ARRAY_SIZE(SIDE_PARAM(_fields)), \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .fields = _fields, \ + .attr = _attr, \ + } + +#define side_define_struct(_identifier, _fields, _attr) \ + const struct side_type_struct _identifier = _side_type_struct_define(SIDE_PARAM(_fields), SIDE_PARAM(_attr)) + +#define side_struct_literal(_fields, _attr) \ + SIDE_COMPOUND_LITERAL(const struct side_type_struct, \ + _side_type_struct_define(SIDE_PARAM(_fields), SIDE_PARAM(_attr))) #define side_type_array(_elem_type, _length, _attr) \ { \ .type = SIDE_TYPE_ARRAY, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ .side_array = { \ - .length = _length, \ .elem_type = _elem_type, \ + .attr = _attr, \ + .length = _length, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ }, \ }, \ } @@ -565,11 +599,11 @@ struct side_tracer_dynamic_vla_visitor_ctx { #define side_type_vla(_elem_type, _attr) \ { \ .type = SIDE_TYPE_VLA, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ .side_vla = { \ .elem_type = _elem_type, \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ }, \ }, \ } @@ -579,12 +613,12 @@ struct side_tracer_dynamic_vla_visitor_ctx { #define side_type_vla_visitor(_elem_type, _visitor, _attr) \ { \ .type = SIDE_TYPE_VLA_VISITOR, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ .side_vla_visitor = { \ .elem_type = SIDE_PARAM(_elem_type), \ .visitor = _visitor, \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ }, \ }, \ } @@ -597,34 +631,30 @@ struct side_tracer_dynamic_vla_visitor_ctx { #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_byte(_val) { .type = SIDE_TYPE_BYTE, .u = { .side_byte = (_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_enum_bitmap_array(_side_type) { .type = SIDE_TYPE_ENUM_BITMAP_ARRAY, .u = { .side_array = (_side_type) } } +#define side_arg_enum_bitmap_vla(_side_type) { .type = SIDE_TYPE_ENUM_BITMAP_VLA, .u = { .side_vla = (_side_type) } } +#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) } } @@ -638,7 +668,7 @@ struct side_tracer_dynamic_vla_visitor_ctx { #define side_arg_array_s16(_ptr) { .type = SIDE_TYPE_ARRAY_S16, .u = { .side_array_fixint = (_ptr) } } #define side_arg_array_s32(_ptr) { .type = SIDE_TYPE_ARRAY_S32, .u = { .side_array_fixint = (_ptr) } } #define side_arg_array_s64(_ptr) { .type = SIDE_TYPE_ARRAY_S64, .u = { .side_array_fixint = (_ptr) } } -#define side_arg_array_blob(_ptr) { .type = SIDE_TYPE_ARRAY_BLOB, .u = { .side_array_fixint = (_ptr) } } +#define side_arg_array_byte(_ptr) { .type = SIDE_TYPE_ARRAY_BYTE, .u = { .side_array_fixint = (_ptr) } } #define side_arg_vla_u8(_ptr, _length) { .type = SIDE_TYPE_VLA_U8, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } #define side_arg_vla_u16(_ptr, _length) { .type = SIDE_TYPE_VLA_U16, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } } @@ -648,168 +678,232 @@ struct side_tracer_dynamic_vla_visitor_ctx { #define side_arg_vla_s16(_ptr, _length) { .type = SIDE_TYPE_VLA_S16, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } } #define side_arg_vla_s32(_ptr, _length) { .type = SIDE_TYPE_VLA_S32, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } } #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_vla_byte(_ptr, _length) { .type = SIDE_TYPE_VLA_BYTE, .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, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ + .u = { \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + }, \ + }, \ } #define side_arg_dynamic_bool(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_BOOL, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_bool = !!(_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_bool = !!(_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_u8(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_U8, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_u8 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_u8 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_u16(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_U16, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_u16 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_u16 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_u32(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_U32, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_u32 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_u32 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_u64(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_U64, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_u64 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_u64 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_s8(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_S8, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_s8 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_s8 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_s16(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_S16, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_s16 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_s16 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_s32(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_S32, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_s32 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_s32 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_s64(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_S64, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_s64 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_s64 = (_val), \ + }, \ + }, \ }, \ } -#define side_arg_dynamic_blob(_val, _attr) \ +#define side_arg_dynamic_byte(_val, _attr) \ { \ - .dynamic_type = SIDE_DYNAMIC_TYPE_BLOB, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ + .dynamic_type = SIDE_DYNAMIC_TYPE_BYTE, \ .u = { \ - .side_blob = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_byte = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_float_binary16(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_FLOAT_BINARY16, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_float_binary16 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_float_binary16 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_float_binary32(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_FLOAT_BINARY32, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_float_binary32 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_float_binary32 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_float_binary64(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_FLOAT_BINARY64, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_float_binary64 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_float_binary64 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_float_binary128(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_FLOAT_BINARY128, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .side_float_binary128 = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .side_float_binary128 = (_val), \ + }, \ + }, \ }, \ } #define side_arg_dynamic_string(_val, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_STRING, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ - .string = (_val), \ + .side_basic = { \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + .u = { \ + .string = (_val), \ + }, \ + }, \ }, \ } -#define side_arg_dynamic_vla(_vla, _attr) \ +#define side_arg_dynamic_vla(_vla) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_VLA, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ .side_dynamic_vla = (_vla), \ }, \ @@ -818,21 +912,19 @@ struct side_tracer_dynamic_vla_visitor_ctx { #define side_arg_dynamic_vla_visitor(_dynamic_vla_visitor, _ctx, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_VLA_VISITOR, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ .side_dynamic_vla_visitor = { \ .app_ctx = _ctx, \ .visitor = _dynamic_vla_visitor, \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ }, \ }, \ } -#define side_arg_dynamic_struct(_struct, _attr) \ +#define side_arg_dynamic_struct(_struct) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_STRUCT, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ .side_dynamic_struct = (_struct), \ }, \ @@ -841,28 +933,32 @@ struct side_tracer_dynamic_vla_visitor_ctx { #define side_arg_dynamic_struct_visitor(_dynamic_struct_visitor, _ctx, _attr) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_STRUCT_VISITOR, \ - .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ - .attr = _attr, \ .u = { \ .side_dynamic_struct_visitor = { \ .app_ctx = _ctx, \ .visitor = _dynamic_struct_visitor, \ + .attr = _attr, \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ }, \ }, \ } -#define side_arg_dynamic_define_vec(_identifier, _sav) \ +#define side_arg_dynamic_define_vec(_identifier, _sav, _attr) \ const struct side_arg_dynamic_vec _identifier##_vec[] = { _sav }; \ const struct side_arg_dynamic_vec_vla _identifier = { \ .sav = _identifier##_vec, \ + .attr = _attr, \ .len = SIDE_ARRAY_SIZE(_identifier##_vec), \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ } -#define side_arg_dynamic_define_struct(_identifier, _struct_fields) \ +#define side_arg_dynamic_define_struct(_identifier, _struct_fields, _attr) \ const struct side_arg_dynamic_event_field _identifier##_fields[] = { _struct_fields }; \ const struct side_arg_dynamic_event_struct _identifier = { \ .fields = _identifier##_fields, \ + .attr = _attr, \ .len = SIDE_ARRAY_SIZE(_identifier##_fields), \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ } #define side_arg_define_vec(_identifier, _sav) \ @@ -880,60 +976,12 @@ struct side_tracer_dynamic_vla_visitor_ctx { #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) \ - { \ - 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, \ - .len = SIDE_ARRAY_SIZE(side_fields), \ - }; \ - side_call_variadic(&(_desc), &sav_desc, &var_struct); \ - } - -#define side_event_variadic(_desc, _sav, _var) \ - side_event_cond(_desc) \ - side_event_call_variadic(_desc, SIDE_PARAM(_sav), SIDE_PARAM(_var)) - -#define side_define_enum(_identifier, _mappings) \ +#define side_define_enum(_identifier, _mappings, _attr) \ const struct side_enum_mappings _identifier = { \ .mappings = _mappings, \ + .attr = _attr, \ .nr_mappings = SIDE_ARRAY_SIZE(SIDE_PARAM(_mappings)), \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ } #define side_enum_mapping_list(...) \ @@ -953,10 +1001,12 @@ struct side_tracer_dynamic_vla_visitor_ctx { .label = _label, \ } -#define side_define_enum_bitmap(_identifier, _mappings) \ +#define side_define_enum_bitmap(_identifier, _mappings, _attr) \ const struct side_enum_bitmap_mappings _identifier = { \ .mappings = _mappings, \ + .attr = _attr, \ .nr_mappings = SIDE_ARRAY_SIZE(SIDE_PARAM(_mappings)), \ + .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ } #define side_enum_bitmap_mapping_list(...) \ @@ -976,35 +1026,94 @@ struct side_tracer_dynamic_vla_visitor_ctx { .label = _label, \ } -#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"))); \ - const struct side_event_description _identifier = { \ +#define side_event_cond(_identifier) \ + if (side_unlikely(__atomic_load_n(&side_event_enable__##_identifier, \ + __ATOMIC_RELAXED))) + +#define side_event_call(_identifier, _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(&(_identifier), &sav_desc); \ + } + +#define side_event(_identifier, _sav) \ + side_event_cond(_identifier) \ + side_event_call(_identifier, SIDE_PARAM(_sav)) + +#define side_event_call_variadic(_identifier, _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(&(_identifier), &sav_desc, &var_struct); \ + } + +#define side_event_variadic(_identifier, _sav, _var, _attr) \ + side_event_cond(_identifier) \ + side_event_call_variadic(_identifier, SIDE_PARAM(_sav), SIDE_PARAM(_var), SIDE_PARAM(_attr)) + +#define _side_define_event(_linkage, _identifier, _provider, _event, _loglevel, _fields, _attr, _flags) \ + _linkage uint32_t side_event_enable__##_identifier __attribute__((section("side_event_enable"))); \ + _linkage struct side_event_description __attribute__((section("side_event_description"))) \ + _identifier = { \ .version = 0, \ - .enabled = &(_identifier##_enabled), \ + .enabled = &(side_event_enable__##_identifier), \ .loglevel = _loglevel, \ .nr_fields = SIDE_ARRAY_SIZE(SIDE_PARAM(_fields)), \ .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \ + ._unused = 0, \ .flags = (_flags), \ .provider_name = _provider, \ .event_name = _event, \ .fields = _fields, \ .attr = _attr, \ - .callbacks = &(_identifier##_callbacks), \ + .callbacks = &side_empty_callback, \ }; \ - const struct side_event_description *_identifier##_ptr \ - __attribute__((section("side_event_description"), used)) = &(_identifier); + static const struct side_event_description *side_event_ptr__##_identifier \ + __attribute__((section("side_event_description_ptr"), used)) = &(_identifier); + +#define side_static_event(_identifier, _provider, _event, _loglevel, _fields, _attr) \ + _side_define_event(static, _identifier, _provider, _event, _loglevel, SIDE_PARAM(_fields), \ + SIDE_PARAM(_attr), 0) + +#define side_static_event_variadic(_identifier, _provider, _event, _loglevel, _fields, _attr) \ + _side_define_event(static, _identifier, _provider, _event, _loglevel, SIDE_PARAM(_fields), \ + SIDE_PARAM(_attr), SIDE_EVENT_FLAG_VARIADIC) -#define side_define_event(_identifier, _provider, _event, _loglevel, _fields, _attr) \ - _side_define_event(_identifier, _provider, _event, _loglevel, SIDE_PARAM(_fields), \ +#define side_hidden_event(_identifier, _provider, _event, _loglevel, _fields, _attr) \ + _side_define_event(__attribute__((visibility("hidden"))), _identifier, _provider, _event, _loglevel, SIDE_PARAM(_fields), \ SIDE_PARAM(_attr), 0) -#define side_define_event_variadic(_identifier, _provider, _event, _loglevel, _fields, _attr) \ - _side_define_event(_identifier, _provider, _event, _loglevel, SIDE_PARAM(_fields), \ +#define side_hidden_event_variadic(_identifier, _provider, _event, _loglevel, _fields, _attr) \ + _side_define_event(__attribute__((visibility("hidden"))), _identifier, _provider, _event, _loglevel, SIDE_PARAM(_fields), \ + SIDE_PARAM(_attr), SIDE_EVENT_FLAG_VARIADIC) + +#define side_export_event(_identifier, _provider, _event, _loglevel, _fields, _attr) \ + _side_define_event(__attribute__((visibility("default"))), _identifier, _provider, _event, _loglevel, SIDE_PARAM(_fields), \ + SIDE_PARAM(_attr), 0) + +#define side_export_event_variadic(_identifier, _provider, _event, _loglevel, _fields, _attr) \ + _side_define_event(__attribute__((visibility("default"))), _identifier, _provider, _event, _loglevel, SIDE_PARAM(_fields), \ SIDE_PARAM(_attr), SIDE_EVENT_FLAG_VARIADIC) #define side_declare_event(_identifier) \ - struct side_event_description _identifier + extern uint32_t side_event_enable_##_identifier; \ + extern struct side_event_description _identifier + +extern const struct side_callback side_empty_callback; void side_call(const struct side_event_description *desc, const struct side_arg_vec_description *sav_desc); @@ -1012,4 +1121,33 @@ void side_call_variadic(const struct side_event_description *desc, const struct side_arg_vec_description *sav_desc, const struct side_arg_dynamic_event_struct *var_struct); +int side_tracer_callback_register(struct side_event_description *desc, + void (*call)(const struct side_event_description *desc, + const struct side_arg_vec_description *sav_desc, + void *priv), + void *priv); +int side_tracer_callback_variadic_register(struct side_event_description *desc, + void (*call_variadic)(const struct side_event_description *desc, + const struct side_arg_vec_description *sav_desc, + const struct side_arg_dynamic_event_struct *var_struct, + void *priv), + void *priv); +int side_tracer_callback_unregister(struct side_event_description *desc, + void (*call)(const struct side_event_description *desc, + const struct side_arg_vec_description *sav_desc, + void *priv), + void *priv); +int side_tracer_callback_variadic_unregister(struct side_event_description *desc, + void (*call_variadic)(const struct side_event_description *desc, + const struct side_arg_vec_description *sav_desc, + const struct side_arg_dynamic_event_struct *var_struct, + void *priv), + void *priv); + +struct side_events_register_handle *side_events_register(struct side_event_description **events, uint32_t nr_events); +void side_events_unregister(struct side_events_register_handle *handle); + +void side_init(void); +void side_exit(void); + #endif /* _SIDE_TRACE_H */