Move attributes to specific types
[libside.git] / include / side / trace.h
CommitLineData
f611d0c3
MD
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 */
5
6#ifndef _SIDE_TRACE_H
7#define _SIDE_TRACE_H
8
9#include <stdint.h>
10#include <inttypes.h>
11#include <stdlib.h>
12#include <stdio.h>
fb25b355 13#include <math.h>
f611d0c3
MD
14#include <side/macros.h>
15
16/* SIDE stands for "Static Instrumentation Dynamically Enabled" */
17
64f5abc7
MD
18//TODO: as those structures will be ABI, we need to either consider them
19//fixed forever, or think of a scheme that would allow their binary
07f35472 20//representation to be extended if need be.
64f5abc7 21
f611d0c3 22struct side_arg_vec;
a2e2357e
MD
23struct side_arg_vec_description;
24struct side_arg_dynamic_vec;
25struct side_arg_dynamic_vec_vla;
f611d0c3
MD
26struct side_type_description;
27struct side_event_field;
352a4b77 28struct side_tracer_visitor_ctx;
c208889e 29struct side_tracer_dynamic_struct_visitor_ctx;
bdc39c09 30struct side_tracer_dynamic_vla_visitor_ctx;
d89fabc8
MD
31struct side_event_description;
32struct side_arg_dynamic_event_struct;
f611d0c3
MD
33
34enum side_type {
4f40d951
MD
35 SIDE_TYPE_BOOL,
36
f611d0c3
MD
37 SIDE_TYPE_U8,
38 SIDE_TYPE_U16,
39 SIDE_TYPE_U32,
40 SIDE_TYPE_U64,
41 SIDE_TYPE_S8,
42 SIDE_TYPE_S16,
43 SIDE_TYPE_S32,
44 SIDE_TYPE_S64,
7aec0d09 45 SIDE_TYPE_BLOB,
ba845af5 46
79f677ba
MD
47 SIDE_TYPE_ENUM_U8,
48 SIDE_TYPE_ENUM_U16,
49 SIDE_TYPE_ENUM_U32,
50 SIDE_TYPE_ENUM_U64,
51 SIDE_TYPE_ENUM_S8,
52 SIDE_TYPE_ENUM_S16,
53 SIDE_TYPE_ENUM_S32,
54 SIDE_TYPE_ENUM_S64,
55
ea32e5fc
MD
56 SIDE_TYPE_ENUM_BITMAP8,
57 SIDE_TYPE_ENUM_BITMAP16,
58 SIDE_TYPE_ENUM_BITMAP32,
59 SIDE_TYPE_ENUM_BITMAP64,
60
fb25b355
MD
61 SIDE_TYPE_FLOAT_BINARY16,
62 SIDE_TYPE_FLOAT_BINARY32,
63 SIDE_TYPE_FLOAT_BINARY64,
64 SIDE_TYPE_FLOAT_BINARY128,
65
f611d0c3 66 SIDE_TYPE_STRING,
bdc39c09 67
f611d0c3
MD
68 SIDE_TYPE_STRUCT,
69 SIDE_TYPE_ARRAY,
70 SIDE_TYPE_VLA,
71 SIDE_TYPE_VLA_VISITOR,
ba845af5
MD
72
73 SIDE_TYPE_ARRAY_U8,
74 SIDE_TYPE_ARRAY_U16,
75 SIDE_TYPE_ARRAY_U32,
76 SIDE_TYPE_ARRAY_U64,
77 SIDE_TYPE_ARRAY_S8,
78 SIDE_TYPE_ARRAY_S16,
79 SIDE_TYPE_ARRAY_S32,
80 SIDE_TYPE_ARRAY_S64,
7aec0d09 81 SIDE_TYPE_ARRAY_BLOB,
ba845af5 82
1533629f
MD
83 SIDE_TYPE_VLA_U8,
84 SIDE_TYPE_VLA_U16,
85 SIDE_TYPE_VLA_U32,
86 SIDE_TYPE_VLA_U64,
87 SIDE_TYPE_VLA_S8,
88 SIDE_TYPE_VLA_S16,
89 SIDE_TYPE_VLA_S32,
90 SIDE_TYPE_VLA_S64,
7aec0d09 91 SIDE_TYPE_VLA_BLOB,
1533629f 92
bdc39c09
MD
93 SIDE_TYPE_DYNAMIC,
94};
95
96enum side_dynamic_type {
97 SIDE_DYNAMIC_TYPE_NULL,
98
4f40d951
MD
99 SIDE_DYNAMIC_TYPE_BOOL,
100
bdc39c09
MD
101 SIDE_DYNAMIC_TYPE_U8,
102 SIDE_DYNAMIC_TYPE_U16,
103 SIDE_DYNAMIC_TYPE_U32,
104 SIDE_DYNAMIC_TYPE_U64,
105 SIDE_DYNAMIC_TYPE_S8,
106 SIDE_DYNAMIC_TYPE_S16,
107 SIDE_DYNAMIC_TYPE_S32,
108 SIDE_DYNAMIC_TYPE_S64,
199e7aa9 109 SIDE_DYNAMIC_TYPE_BLOB,
bdc39c09 110
fb25b355
MD
111 SIDE_DYNAMIC_TYPE_FLOAT_BINARY16,
112 SIDE_DYNAMIC_TYPE_FLOAT_BINARY32,
113 SIDE_DYNAMIC_TYPE_FLOAT_BINARY64,
114 SIDE_DYNAMIC_TYPE_FLOAT_BINARY128,
115
bdc39c09
MD
116 SIDE_DYNAMIC_TYPE_STRING,
117
c208889e
MD
118 SIDE_DYNAMIC_TYPE_STRUCT,
119 SIDE_DYNAMIC_TYPE_STRUCT_VISITOR,
a2e2357e
MD
120
121 SIDE_DYNAMIC_TYPE_VLA,
bdc39c09 122 SIDE_DYNAMIC_TYPE_VLA_VISITOR,
f611d0c3
MD
123};
124
bc3c89b3
MD
125enum side_attr_type {
126 SIDE_ATTR_TYPE_BOOL,
127
128 SIDE_ATTR_TYPE_U8,
129 SIDE_ATTR_TYPE_U16,
130 SIDE_ATTR_TYPE_U32,
131 SIDE_ATTR_TYPE_U64,
132 SIDE_ATTR_TYPE_S8,
133 SIDE_ATTR_TYPE_S16,
134 SIDE_ATTR_TYPE_S32,
135 SIDE_ATTR_TYPE_S64,
136
137 SIDE_ATTR_TYPE_FLOAT_BINARY16,
138 SIDE_ATTR_TYPE_FLOAT_BINARY32,
139 SIDE_ATTR_TYPE_FLOAT_BINARY64,
140 SIDE_ATTR_TYPE_FLOAT_BINARY128,
141
142 SIDE_ATTR_TYPE_STRING,
143};
144
f611d0c3
MD
145enum side_loglevel {
146 SIDE_LOGLEVEL_EMERG = 0,
147 SIDE_LOGLEVEL_ALERT = 1,
148 SIDE_LOGLEVEL_CRIT = 2,
149 SIDE_LOGLEVEL_ERR = 3,
150 SIDE_LOGLEVEL_WARNING = 4,
151 SIDE_LOGLEVEL_NOTICE = 5,
152 SIDE_LOGLEVEL_INFO = 6,
153 SIDE_LOGLEVEL_DEBUG = 7,
154};
155
156enum side_visitor_status {
f611d0c3 157 SIDE_VISITOR_STATUS_OK = 0,
db6ecef9 158 SIDE_VISITOR_STATUS_ERROR = -1,
f611d0c3
MD
159};
160
f93e01ac
MD
161typedef enum side_visitor_status (*side_visitor)(
162 const struct side_tracer_visitor_ctx *tracer_ctx,
163 void *app_ctx);
164typedef enum side_visitor_status (*side_dynamic_struct_visitor)(
165 const struct side_tracer_dynamic_struct_visitor_ctx *tracer_ctx,
166 void *app_ctx);
167typedef enum side_visitor_status (*side_dynamic_vla_visitor)(
168 const struct side_tracer_dynamic_vla_visitor_ctx *tracer_ctx,
169 void *app_ctx);
f611d0c3 170
bc3c89b3
MD
171struct side_attr_value {
172 uint32_t type; /* enum side_attr_type */
173 union {
174 uint8_t side_bool;
175
176 uint8_t side_u8;
177 uint16_t side_u16;
178 uint32_t side_u32;
179 uint64_t side_u64;
180 int8_t side_s8;
181 int16_t side_s16;
182 int32_t side_s32;
183 int64_t side_s64;
184
185#if __HAVE_FLOAT16
186 _Float16 side_float_binary16;
187#endif
188#if __HAVE_FLOAT32
189 _Float32 side_float_binary32;
190#endif
191#if __HAVE_FLOAT64
192 _Float64 side_float_binary64;
193#endif
194#if __HAVE_FLOAT128
195 _Float128 side_float_binary128;
196#endif
197
198 const char *string;
199 } u;
200};
201
65010f43
MD
202/* User attributes. */
203struct side_attr {
204 const char *key;
bc3c89b3 205 const struct side_attr_value value;
65010f43
MD
206};
207
79f677ba
MD
208struct side_enum_mapping {
209 int64_t range_begin;
210 int64_t range_end;
211 const char *label;
212};
213
214struct side_enum_mappings {
215 const struct side_enum_mapping *mappings;
d4328528 216 const struct side_attr *attr;
79f677ba 217 uint32_t nr_mappings;
d4328528 218 uint32_t nr_attr;
79f677ba
MD
219};
220
66cff328
MD
221struct side_enum_bitmap_mapping {
222 int64_t range_begin;
223 int64_t range_end;
224 const char *label;
225};
226
227struct side_enum_bitmap_mappings {
228 const struct side_enum_bitmap_mapping *mappings;
d4328528 229 const struct side_attr *attr;
66cff328 230 uint32_t nr_mappings;
d4328528 231 uint32_t nr_attr;
66cff328
MD
232};
233
c7a14585
MD
234struct side_type_struct {
235 uint32_t nr_fields;
236 uint32_t nr_attr;
237 const struct side_event_field *fields;
238 const struct side_attr *attr;
239};
240
f611d0c3 241struct side_type_description {
2f5827d5 242 uint32_t type; /* enum side_type */
f611d0c3 243 union {
f611d0c3 244 struct {
d4328528
MD
245 const struct side_attr *attr;
246 uint32_t nr_attr;
247 } side_basic;
248 struct {
f611d0c3 249 const struct side_type_description *elem_type;
d4328528
MD
250 const struct side_attr *attr;
251 uint32_t length;
252 uint32_t nr_attr;
f611d0c3
MD
253 } side_array;
254 struct {
255 const struct side_type_description *elem_type;
d4328528
MD
256 const struct side_attr *attr;
257 uint32_t nr_attr;
f611d0c3
MD
258 } side_vla;
259 struct {
260 const struct side_type_description *elem_type;
352a4b77 261 side_visitor visitor;
d4328528
MD
262 const struct side_attr *attr;
263 uint32_t nr_attr;
f611d0c3 264 } side_vla_visitor;
d4328528 265 const struct side_type_struct *side_struct;
79f677ba 266 const struct side_enum_mappings *side_enum_mappings;
66cff328 267 const struct side_enum_bitmap_mappings *side_enum_bitmap_mappings;
f611d0c3
MD
268 } u;
269};
270
271struct side_event_field {
272 const char *field_name;
273 struct side_type_description side_type;
274};
275
8a25ce77
MD
276enum side_event_flags {
277 SIDE_EVENT_FLAG_VARIADIC = (1 << 0),
278};
279
d89fabc8
MD
280struct side_callback {
281 union {
282 void (*call)(const struct side_event_description *desc,
283 const struct side_arg_vec_description *sav_desc,
284 void *priv);
285 void (*call_variadic)(const struct side_event_description *desc,
286 const struct side_arg_vec_description *sav_desc,
287 const struct side_arg_dynamic_event_struct *var_struct,
288 void *priv);
289 } u;
290 void *priv;
291};
292
293struct side_callbacks {
294 struct side_callback *cb;
295 uint32_t nr_cb;
296};
297
f611d0c3
MD
298struct side_event_description {
299 uint32_t version;
d5cdb129 300 uint32_t *enabled;
f611d0c3
MD
301 uint32_t loglevel; /* enum side_loglevel */
302 uint32_t nr_fields;
65010f43
MD
303 uint32_t nr_attr;
304 uint32_t _unused;
8a25ce77 305 uint64_t flags;
f611d0c3
MD
306 const char *provider_name;
307 const char *event_name;
308 const struct side_event_field *fields;
65010f43 309 const struct side_attr *attr;
d89fabc8 310 struct side_callbacks *callbacks;
f611d0c3
MD
311};
312
a2e2357e
MD
313struct side_arg_dynamic_vec_vla {
314 const struct side_arg_dynamic_vec *sav;
315 uint32_t len;
316};
317
bdc39c09 318struct side_arg_dynamic_vec {
2f5827d5 319 uint32_t dynamic_type; /* enum side_dynamic_type */
808bd9bf
MD
320 uint32_t nr_attr;
321 const struct side_attr *attr;
bdc39c09 322 union {
4f40d951
MD
323 uint8_t side_bool;
324
bdc39c09
MD
325 uint8_t side_u8;
326 uint16_t side_u16;
327 uint32_t side_u32;
328 uint64_t side_u64;
329 int8_t side_s8;
330 int16_t side_s16;
331 int32_t side_s32;
332 int64_t side_s64;
199e7aa9 333 uint8_t side_blob;
bdc39c09 334
fb25b355
MD
335#if __HAVE_FLOAT16
336 _Float16 side_float_binary16;
337#endif
338#if __HAVE_FLOAT32
339 _Float32 side_float_binary32;
340#endif
341#if __HAVE_FLOAT64
342 _Float64 side_float_binary64;
343#endif
344#if __HAVE_FLOAT128
345 _Float128 side_float_binary128;
346#endif
347
bdc39c09
MD
348 const char *string;
349
c208889e 350 const struct side_arg_dynamic_event_struct *side_dynamic_struct;
bdc39c09 351 struct {
8ceca0cd 352 void *app_ctx;
c208889e
MD
353 side_dynamic_struct_visitor visitor;
354 } side_dynamic_struct_visitor;
a2e2357e
MD
355
356 const struct side_arg_dynamic_vec_vla *side_dynamic_vla;
bdc39c09 357 struct {
8ceca0cd 358 void *app_ctx;
bdc39c09
MD
359 side_dynamic_vla_visitor visitor;
360 } side_dynamic_vla_visitor;
361 } u;
362};
363
465e5e7e
MD
364struct side_arg_dynamic_event_field {
365 const char *field_name;
366 const struct side_arg_dynamic_vec elem;
465e5e7e
MD
367};
368
c208889e 369struct side_arg_dynamic_event_struct {
465e5e7e
MD
370 const struct side_arg_dynamic_event_field *fields;
371 uint32_t len;
372};
373
f611d0c3 374struct side_arg_vec {
1e8256c9 375 enum side_type type;
f611d0c3 376 union {
4f40d951
MD
377 uint8_t side_bool;
378
f611d0c3
MD
379 uint8_t side_u8;
380 uint16_t side_u16;
381 uint32_t side_u32;
382 uint64_t side_u64;
383 int8_t side_s8;
384 int16_t side_s16;
385 int32_t side_s32;
386 int64_t side_s64;
7aec0d09 387 uint8_t side_blob;
ba845af5 388
fb25b355
MD
389#if __HAVE_FLOAT16
390 _Float16 side_float_binary16;
391#endif
392#if __HAVE_FLOAT32
393 _Float32 side_float_binary32;
394#endif
395#if __HAVE_FLOAT64
396 _Float64 side_float_binary64;
397#endif
398#if __HAVE_FLOAT128
399 _Float128 side_float_binary128;
400#endif
401
f611d0c3
MD
402 const char *string;
403 const struct side_arg_vec_description *side_struct;
404 const struct side_arg_vec_description *side_array;
405 const struct side_arg_vec_description *side_vla;
352a4b77 406 void *side_vla_app_visitor_ctx;
ba845af5
MD
407
408 void *side_array_fixint;
1533629f
MD
409 struct {
410 void *p;
411 uint32_t length;
412 } side_vla_fixint;
bdc39c09
MD
413
414 struct side_arg_dynamic_vec dynamic;
f611d0c3
MD
415 } u;
416};
417
418struct side_arg_vec_description {
419 const struct side_arg_vec *sav;
420 uint32_t len;
421};
422
352a4b77
MD
423/* The visitor pattern is a double-dispatch visitor. */
424struct side_tracer_visitor_ctx {
f93e01ac
MD
425 enum side_visitor_status (*write_elem)(
426 const struct side_tracer_visitor_ctx *tracer_ctx,
427 const struct side_arg_vec *elem);
352a4b77
MD
428 void *priv; /* Private tracer context. */
429};
430
c208889e 431struct side_tracer_dynamic_struct_visitor_ctx {
f93e01ac
MD
432 enum side_visitor_status (*write_field)(
433 const struct side_tracer_dynamic_struct_visitor_ctx *tracer_ctx,
2b359235 434 const struct side_arg_dynamic_event_field *dynamic_field);
bdc39c09
MD
435 void *priv; /* Private tracer context. */
436};
437
438struct side_tracer_dynamic_vla_visitor_ctx {
f93e01ac
MD
439 enum side_visitor_status (*write_elem)(
440 const struct side_tracer_dynamic_vla_visitor_ctx *tracer_ctx,
441 const struct side_arg_dynamic_vec *elem);
bdc39c09
MD
442 void *priv; /* Private tracer context. */
443};
444
65010f43
MD
445#define side_attr(_key, _value) \
446 { \
447 .key = _key, \
bc3c89b3 448 .value = SIDE_PARAM(_value), \
65010f43
MD
449 }
450
451#define side_attr_list(...) \
452 SIDE_COMPOUND_LITERAL(const struct side_attr, __VA_ARGS__)
453
d4328528 454#define _side_type_basic(_type, _attr) \
f37a556f
MD
455 { \
456 .type = _type, \
d4328528
MD
457 .u = { \
458 .side_basic = { \
459 .attr = _attr, \
460 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
461 }, \
462 }, \
f37a556f 463 }
f93e01ac 464
d4328528
MD
465#define side_type_bool(_attr) _side_type_basic(SIDE_TYPE_BOOL, SIDE_PARAM(_attr))
466#define side_type_u8(_attr) _side_type_basic(SIDE_TYPE_U8, SIDE_PARAM(_attr))
467#define side_type_u16(_attr) _side_type_basic(SIDE_TYPE_U16, SIDE_PARAM(_attr))
468#define side_type_u32(_attr) _side_type_basic(SIDE_TYPE_U32, SIDE_PARAM(_attr))
469#define side_type_u64(_attr) _side_type_basic(SIDE_TYPE_U64, SIDE_PARAM(_attr))
470#define side_type_s8(_attr) _side_type_basic(SIDE_TYPE_S8, SIDE_PARAM(_attr))
471#define side_type_s16(_attr) _side_type_basic(SIDE_TYPE_S16, SIDE_PARAM(_attr))
472#define side_type_s32(_attr) _side_type_basic(SIDE_TYPE_S32, SIDE_PARAM(_attr))
473#define side_type_s64(_attr) _side_type_basic(SIDE_TYPE_S64, SIDE_PARAM(_attr))
474#define side_type_blob(_attr) _side_type_basic(SIDE_TYPE_BLOB, SIDE_PARAM(_attr))
475#define side_type_float_binary16(_attr) _side_type_basic(SIDE_TYPE_FLOAT_BINARY16, SIDE_PARAM(_attr))
476#define side_type_float_binary32(_attr) _side_type_basic(SIDE_TYPE_FLOAT_BINARY32, SIDE_PARAM(_attr))
477#define side_type_float_binary64(_attr) _side_type_basic(SIDE_TYPE_FLOAT_BINARY64, SIDE_PARAM(_attr))
478#define side_type_float_binary128(_attr) _side_type_basic(SIDE_TYPE_FLOAT_BINARY128, SIDE_PARAM(_attr))
479#define side_type_string(_attr) _side_type_basic(SIDE_TYPE_STRING, SIDE_PARAM(_attr))
480#define side_type_dynamic(_attr) _side_type_basic(SIDE_TYPE_DYNAMIC, SIDE_PARAM(_attr))
32ba58fc 481
cb6f04c2 482#define _side_field(_name, _type) \
f93e01ac
MD
483 { \
484 .field_name = _name, \
cb6f04c2 485 .side_type = _type, \
f93e01ac 486 }
f611d0c3 487
cb6f04c2
MD
488#define side_field_bool(_name, _attr) _side_field(_name, side_type_bool(SIDE_PARAM(_attr)))
489#define side_field_u8(_name, _attr) _side_field(_name, side_type_u8(SIDE_PARAM(_attr)))
490#define side_field_u16(_name, _attr) _side_field(_name, side_type_u16(SIDE_PARAM(_attr)))
491#define side_field_u32(_name, _attr) _side_field(_name, side_type_u32(SIDE_PARAM(_attr)))
492#define side_field_u64(_name, _attr) _side_field(_name, side_type_u64(SIDE_PARAM(_attr)))
493#define side_field_s8(_name, _attr) _side_field(_name, side_type_s8(SIDE_PARAM(_attr)))
494#define side_field_s16(_name, _attr) _side_field(_name, side_type_s16(SIDE_PARAM(_attr)))
495#define side_field_s32(_name, _attr) _side_field(_name, side_type_s32(SIDE_PARAM(_attr)))
496#define side_field_s64(_name, _attr) _side_field(_name, side_type_s64(SIDE_PARAM(_attr)))
7aec0d09 497#define side_field_blob(_name, _attr) _side_field(_name, side_type_blob(SIDE_PARAM(_attr)))
cb6f04c2
MD
498#define side_field_float_binary16(_name, _attr) _side_field(_name, side_type_float_binary16(SIDE_PARAM(_attr)))
499#define side_field_float_binary32(_name, _attr) _side_field(_name, side_type_float_binary32(SIDE_PARAM(_attr)))
500#define side_field_float_binary64(_name, _attr) _side_field(_name, side_type_float_binary64(SIDE_PARAM(_attr)))
501#define side_field_float_binary128(_name, _attr) _side_field(_name, side_type_float_binary128(SIDE_PARAM(_attr)))
502#define side_field_string(_name, _attr) _side_field(_name, side_type_string(SIDE_PARAM(_attr)))
503#define side_field_dynamic(_name, _attr) _side_field(_name, side_type_dynamic(SIDE_PARAM(_attr)))
485b800a 504
d4328528 505#define side_type_enum(_type, _mappings) \
79f677ba
MD
506 { \
507 .type = _type, \
79f677ba
MD
508 .u = { \
509 .side_enum_mappings = _mappings, \
510 }, \
511 }
d4328528
MD
512#define _side_field_enum(_name, _type, _mappings) \
513 _side_field(_name, side_type_enum(_type, SIDE_PARAM(_mappings)))
514
515#define side_field_enum_u8(_name, _mappings) \
516 _side_field_enum(_name, SIDE_TYPE_ENUM_U8, SIDE_PARAM(_mappings))
517#define side_field_enum_u16(_name, _mappings) \
518 _side_field_enum(_name, SIDE_TYPE_ENUM_U16, SIDE_PARAM(_mappings))
519#define side_field_enum_u32(_name, _mappings) \
520 _side_field_enum(_name, SIDE_TYPE_ENUM_U32, SIDE_PARAM(_mappings))
521#define side_field_enum_u64(_name, _mappings) \
522 _side_field_enum(_name, SIDE_TYPE_ENUM_U64, SIDE_PARAM(_mappings))
523#define side_field_enum_s8(_name, _mappings) \
524 _side_field_enum(_name, SIDE_TYPE_ENUM_S8, SIDE_PARAM(_mappings))
525#define side_field_enum_s16(_name, _mappings) \
526 _side_field_enum(_name, SIDE_TYPE_ENUM_S16, SIDE_PARAM(_mappings))
527#define side_field_enum_s32(_name, _mappings) \
528 _side_field_enum(_name, SIDE_TYPE_ENUM_S32, SIDE_PARAM(_mappings))
529#define side_field_enum_s64(_name, _mappings) \
530 _side_field_enum(_name, SIDE_TYPE_ENUM_S64, SIDE_PARAM(_mappings))
531
532#define side_type_enum_bitmap(_type, _mappings) \
66cff328
MD
533 { \
534 .type = _type, \
66cff328
MD
535 .u = { \
536 .side_enum_bitmap_mappings = _mappings, \
537 }, \
538 }
d4328528
MD
539#define _side_field_enum_bitmap(_name, _type, _mappings) \
540 _side_field(_name, side_type_enum_bitmap(_type, SIDE_PARAM(_mappings)))
be14d73f 541
d4328528
MD
542#define side_field_enum_bitmap8(_name, _mappings) \
543 _side_field_enum_bitmap(_name, SIDE_TYPE_ENUM_BITMAP8, SIDE_PARAM(_mappings))
544#define side_field_enum_bitmap16(_name, _mappings) \
545 _side_field_enum_bitmap(_name, SIDE_TYPE_ENUM_BITMAP16, SIDE_PARAM(_mappings))
546#define side_field_enum_bitmap32(_name, _mappings) \
547 _side_field_enum_bitmap(_name, SIDE_TYPE_ENUM_BITMAP32, SIDE_PARAM(_mappings))
548#define side_field_enum_bitmap64(_name, _mappings) \
549 _side_field_enum_bitmap(_name, SIDE_TYPE_ENUM_BITMAP64, SIDE_PARAM(_mappings))
66cff328 550
c7a14585 551#define side_type_struct(_struct) \
f611d0c3
MD
552 { \
553 .type = SIDE_TYPE_STRUCT, \
554 .u = { \
c7a14585 555 .side_struct = _struct, \
f611d0c3
MD
556 }, \
557 }
c7a14585
MD
558#define side_field_struct(_name, _struct) \
559 _side_field(_name, side_type_struct(SIDE_PARAM(_struct)))
560
561#define _side_type_struct_define(_fields, _attr) \
562 { \
563 .nr_fields = SIDE_ARRAY_SIZE(SIDE_PARAM(_fields)), \
564 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
565 .fields = _fields, \
566 .attr = _attr, \
567 }
568
569#define side_define_struct(_identifier, _fields, _attr) \
570 const struct side_type_struct _identifier = _side_type_struct_define(SIDE_PARAM(_fields), SIDE_PARAM(_attr))
571
572#define side_struct_literal(_fields, _attr) \
573 SIDE_COMPOUND_LITERAL(const struct side_type_struct, \
574 _side_type_struct_define(SIDE_PARAM(_fields), SIDE_PARAM(_attr)))
f611d0c3 575
32ba58fc 576#define side_type_array(_elem_type, _length, _attr) \
f611d0c3
MD
577 { \
578 .type = SIDE_TYPE_ARRAY, \
579 .u = { \
580 .side_array = { \
f611d0c3 581 .elem_type = _elem_type, \
d4328528
MD
582 .attr = _attr, \
583 .length = _length, \
584 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
f611d0c3
MD
585 }, \
586 }, \
587 }
f37a556f 588#define side_field_array(_name, _elem_type, _length, _attr) \
be14d73f 589 _side_field(_name, side_type_array(SIDE_PARAM(_elem_type), _length, SIDE_PARAM(_attr)))
f611d0c3 590
32ba58fc 591#define side_type_vla(_elem_type, _attr) \
f611d0c3
MD
592 { \
593 .type = SIDE_TYPE_VLA, \
594 .u = { \
595 .side_vla = { \
596 .elem_type = _elem_type, \
d4328528
MD
597 .attr = _attr, \
598 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
f611d0c3
MD
599 }, \
600 }, \
601 }
f37a556f 602#define side_field_vla(_name, _elem_type, _attr) \
be14d73f 603 _side_field(_name, side_type_vla(SIDE_PARAM(_elem_type), SIDE_PARAM(_attr)))
f611d0c3 604
32ba58fc 605#define side_type_vla_visitor(_elem_type, _visitor, _attr) \
f611d0c3
MD
606 { \
607 .type = SIDE_TYPE_VLA_VISITOR, \
608 .u = { \
609 .side_vla_visitor = { \
cdd6e858 610 .elem_type = SIDE_PARAM(_elem_type), \
352a4b77 611 .visitor = _visitor, \
d4328528
MD
612 .attr = _attr, \
613 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
f611d0c3
MD
614 }, \
615 }, \
616 }
f37a556f 617#define side_field_vla_visitor(_name, _elem_type, _visitor, _attr) \
be14d73f 618 _side_field(_name, side_type_vla_visitor(SIDE_PARAM(_elem_type), _visitor, SIDE_PARAM(_attr)))
f611d0c3 619
71002b5e 620#define side_elem(...) \
cdd6e858
MD
621 SIDE_COMPOUND_LITERAL(const struct side_type_description, __VA_ARGS__)
622
f611d0c3
MD
623#define side_field_list(...) \
624 SIDE_COMPOUND_LITERAL(const struct side_event_field, __VA_ARGS__)
625
4f40d951 626#define side_arg_bool(val) { .type = SIDE_TYPE_BOOL, .u = { .side_bool = !!(val) } }
f93e01ac
MD
627#define side_arg_u8(val) { .type = SIDE_TYPE_U8, .u = { .side_u8 = (val) } }
628#define side_arg_u16(val) { .type = SIDE_TYPE_U16, .u = { .side_u16 = (val) } }
629#define side_arg_u32(val) { .type = SIDE_TYPE_U32, .u = { .side_u32 = (val) } }
630#define side_arg_u64(val) { .type = SIDE_TYPE_U64, .u = { .side_u64 = (val) } }
631#define side_arg_s8(val) { .type = SIDE_TYPE_S8, .u = { .side_s8 = (val) } }
632#define side_arg_s16(val) { .type = SIDE_TYPE_S16, .u = { .side_s16 = (val) } }
633#define side_arg_s32(val) { .type = SIDE_TYPE_S32, .u = { .side_s32 = (val) } }
634#define side_arg_s64(val) { .type = SIDE_TYPE_S64, .u = { .side_s64 = (val) } }
7aec0d09 635#define side_arg_blob(val) { .type = SIDE_TYPE_BLOB, .u = { .side_blob = (val) } }
79f677ba
MD
636#define side_arg_enum_u8(val) { .type = SIDE_TYPE_ENUM_U8, .u = { .side_u8 = (val) } }
637#define side_arg_enum_u16(val) { .type = SIDE_TYPE_ENUM_U16, .u = { .side_u16 = (val) } }
638#define side_arg_enum_u32(val) { .type = SIDE_TYPE_ENUM_U32, .u = { .side_u32 = (val) } }
639#define side_arg_enum_u64(val) { .type = SIDE_TYPE_ENUM_U64, .u = { .side_u64 = (val) } }
640#define side_arg_enum_s8(val) { .type = SIDE_TYPE_ENUM_S8, .u = { .side_s8 = (val) } }
641#define side_arg_enum_s16(val) { .type = SIDE_TYPE_ENUM_S16, .u = { .side_s16 = (val) } }
642#define side_arg_enum_s32(val) { .type = SIDE_TYPE_ENUM_S32, .u = { .side_s32 = (val) } }
643#define side_arg_enum_s64(val) { .type = SIDE_TYPE_ENUM_S64, .u = { .side_s64 = (val) } }
ea32e5fc
MD
644#define side_arg_enum_bitmap8(val) { .type = SIDE_TYPE_ENUM_BITMAP8, .u = { .side_u8 = (val) } }
645#define side_arg_enum_bitmap16(val) { .type = SIDE_TYPE_ENUM_BITMAP16, .u = { .side_u16 = (val) } }
646#define side_arg_enum_bitmap32(val) { .type = SIDE_TYPE_ENUM_BITMAP32, .u = { .side_u32 = (val) } }
647#define side_arg_enum_bitmap64(val) { .type = SIDE_TYPE_ENUM_BITMAP64, .u = { .side_u64 = (val) } }
fb25b355
MD
648#define side_arg_float_binary16(val) { .type = SIDE_TYPE_FLOAT_BINARY16, .u = { .side_float_binary16 = (val) } }
649#define side_arg_float_binary32(val) { .type = SIDE_TYPE_FLOAT_BINARY32, .u = { .side_float_binary32 = (val) } }
650#define side_arg_float_binary64(val) { .type = SIDE_TYPE_FLOAT_BINARY64, .u = { .side_float_binary64 = (val) } }
651#define side_arg_float_binary128(val) { .type = SIDE_TYPE_FLOAT_BINARY128, .u = { .side_float_binary128 = (val) } }
652
f93e01ac 653#define side_arg_string(val) { .type = SIDE_TYPE_STRING, .u = { .string = (val) } }
f611d0c3
MD
654#define side_arg_struct(_side_type) { .type = SIDE_TYPE_STRUCT, .u = { .side_struct = (_side_type) } }
655#define side_arg_array(_side_type) { .type = SIDE_TYPE_ARRAY, .u = { .side_array = (_side_type) } }
656#define side_arg_vla(_side_type) { .type = SIDE_TYPE_VLA, .u = { .side_vla = (_side_type) } }
352a4b77 657#define side_arg_vla_visitor(_ctx) { .type = SIDE_TYPE_VLA_VISITOR, .u = { .side_vla_app_visitor_ctx = (_ctx) } }
f611d0c3 658
1533629f
MD
659#define side_arg_array_u8(_ptr) { .type = SIDE_TYPE_ARRAY_U8, .u = { .side_array_fixint = (_ptr) } }
660#define side_arg_array_u16(_ptr) { .type = SIDE_TYPE_ARRAY_U16, .u = { .side_array_fixint = (_ptr) } }
661#define side_arg_array_u32(_ptr) { .type = SIDE_TYPE_ARRAY_U32, .u = { .side_array_fixint = (_ptr) } }
662#define side_arg_array_u64(_ptr) { .type = SIDE_TYPE_ARRAY_U64, .u = { .side_array_fixint = (_ptr) } }
663#define side_arg_array_s8(_ptr) { .type = SIDE_TYPE_ARRAY_S8, .u = { .side_array_fixint = (_ptr) } }
664#define side_arg_array_s16(_ptr) { .type = SIDE_TYPE_ARRAY_S16, .u = { .side_array_fixint = (_ptr) } }
665#define side_arg_array_s32(_ptr) { .type = SIDE_TYPE_ARRAY_S32, .u = { .side_array_fixint = (_ptr) } }
666#define side_arg_array_s64(_ptr) { .type = SIDE_TYPE_ARRAY_S64, .u = { .side_array_fixint = (_ptr) } }
7aec0d09 667#define side_arg_array_blob(_ptr) { .type = SIDE_TYPE_ARRAY_BLOB, .u = { .side_array_fixint = (_ptr) } }
1533629f
MD
668
669#define side_arg_vla_u8(_ptr, _length) { .type = SIDE_TYPE_VLA_U8, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } }
670#define side_arg_vla_u16(_ptr, _length) { .type = SIDE_TYPE_VLA_U16, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } }
671#define side_arg_vla_u32(_ptr, _length) { .type = SIDE_TYPE_VLA_U32, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } }
672#define side_arg_vla_u64(_ptr, _length) { .type = SIDE_TYPE_VLA_U64, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } }
673#define side_arg_vla_s8(_ptr, _length) { .type = SIDE_TYPE_VLA_S8, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } }
674#define side_arg_vla_s16(_ptr, _length) { .type = SIDE_TYPE_VLA_S16, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } }
675#define side_arg_vla_s32(_ptr, _length) { .type = SIDE_TYPE_VLA_S32, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } }
676#define side_arg_vla_s64(_ptr, _length) { .type = SIDE_TYPE_VLA_S64, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } }
7aec0d09 677#define side_arg_vla_blob(_ptr, _length) { .type = SIDE_TYPE_VLA_BLOB, .u = { .side_vla_fixint = { .p = (_ptr), .length = (_length) } } }
ba845af5 678
bdc39c09
MD
679#define side_arg_dynamic(dynamic_arg_type) \
680 { \
681 .type = SIDE_TYPE_DYNAMIC, \
682 .u = { \
683 .dynamic = dynamic_arg_type, \
684 }, \
685 }
686
808bd9bf
MD
687#define side_arg_dynamic_null(_attr) \
688 { \
689 .dynamic_type = SIDE_DYNAMIC_TYPE_NULL, \
690 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
691 .attr = _attr, \
692 }
693
694#define side_arg_dynamic_bool(_val, _attr) \
695 { \
696 .dynamic_type = SIDE_DYNAMIC_TYPE_BOOL, \
697 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
698 .attr = _attr, \
699 .u = { \
700 .side_bool = !!(_val), \
701 }, \
702 }
703
704#define side_arg_dynamic_u8(_val, _attr) \
705 { \
706 .dynamic_type = SIDE_DYNAMIC_TYPE_U8, \
707 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
708 .attr = _attr, \
709 .u = { \
710 .side_u8 = (_val), \
711 }, \
712 }
713#define side_arg_dynamic_u16(_val, _attr) \
714 { \
715 .dynamic_type = SIDE_DYNAMIC_TYPE_U16, \
716 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
717 .attr = _attr, \
718 .u = { \
719 .side_u16 = (_val), \
720 }, \
721 }
722#define side_arg_dynamic_u32(_val, _attr) \
723 { \
724 .dynamic_type = SIDE_DYNAMIC_TYPE_U32, \
725 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
726 .attr = _attr, \
727 .u = { \
728 .side_u32 = (_val), \
729 }, \
730 }
731#define side_arg_dynamic_u64(_val, _attr) \
732 { \
733 .dynamic_type = SIDE_DYNAMIC_TYPE_U64, \
734 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
735 .attr = _attr, \
736 .u = { \
737 .side_u64 = (_val), \
738 }, \
739 }
740
741#define side_arg_dynamic_s8(_val, _attr) \
742 { \
743 .dynamic_type = SIDE_DYNAMIC_TYPE_S8, \
744 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
745 .attr = _attr, \
746 .u = { \
747 .side_s8 = (_val), \
748 }, \
749 }
750#define side_arg_dynamic_s16(_val, _attr) \
751 { \
752 .dynamic_type = SIDE_DYNAMIC_TYPE_S16, \
753 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
754 .attr = _attr, \
755 .u = { \
756 .side_s16 = (_val), \
757 }, \
758 }
759#define side_arg_dynamic_s32(_val, _attr) \
760 { \
761 .dynamic_type = SIDE_DYNAMIC_TYPE_S32, \
762 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
763 .attr = _attr, \
764 .u = { \
765 .side_s32 = (_val), \
766 }, \
767 }
768#define side_arg_dynamic_s64(_val, _attr) \
769 { \
770 .dynamic_type = SIDE_DYNAMIC_TYPE_S64, \
771 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
772 .attr = _attr, \
773 .u = { \
774 .side_s64 = (_val), \
775 }, \
776 }
199e7aa9
MD
777#define side_arg_dynamic_blob(_val, _attr) \
778 { \
779 .dynamic_type = SIDE_DYNAMIC_TYPE_BLOB, \
780 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
781 .attr = _attr, \
782 .u = { \
783 .side_blob = (_val), \
784 }, \
785 }
808bd9bf 786
fb25b355
MD
787#define side_arg_dynamic_float_binary16(_val, _attr) \
788 { \
789 .dynamic_type = SIDE_DYNAMIC_TYPE_FLOAT_BINARY16, \
790 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
791 .attr = _attr, \
792 .u = { \
793 .side_float_binary16 = (_val), \
794 }, \
795 }
796#define side_arg_dynamic_float_binary32(_val, _attr) \
797 { \
798 .dynamic_type = SIDE_DYNAMIC_TYPE_FLOAT_BINARY32, \
799 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
800 .attr = _attr, \
801 .u = { \
802 .side_float_binary32 = (_val), \
803 }, \
804 }
805#define side_arg_dynamic_float_binary64(_val, _attr) \
806 { \
807 .dynamic_type = SIDE_DYNAMIC_TYPE_FLOAT_BINARY64, \
808 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
809 .attr = _attr, \
810 .u = { \
811 .side_float_binary64 = (_val), \
812 }, \
813 }
814#define side_arg_dynamic_float_binary128(_val, _attr) \
815 { \
816 .dynamic_type = SIDE_DYNAMIC_TYPE_FLOAT_BINARY128, \
817 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
818 .attr = _attr, \
819 .u = { \
820 .side_float_binary128 = (_val), \
821 }, \
822 }
823
808bd9bf
MD
824#define side_arg_dynamic_string(_val, _attr) \
825 { \
826 .dynamic_type = SIDE_DYNAMIC_TYPE_STRING, \
827 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
828 .attr = _attr, \
829 .u = { \
830 .string = (_val), \
831 }, \
832 }
833
834#define side_arg_dynamic_vla(_vla, _attr) \
835 { \
836 .dynamic_type = SIDE_DYNAMIC_TYPE_VLA, \
837 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
838 .attr = _attr, \
839 .u = { \
840 .side_dynamic_vla = (_vla), \
841 }, \
842 }
843
844#define side_arg_dynamic_vla_visitor(_dynamic_vla_visitor, _ctx, _attr) \
bdc39c09 845 { \
1e8256c9 846 .dynamic_type = SIDE_DYNAMIC_TYPE_VLA_VISITOR, \
808bd9bf
MD
847 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
848 .attr = _attr, \
bdc39c09 849 .u = { \
8ceca0cd
MD
850 .side_dynamic_vla_visitor = { \
851 .app_ctx = _ctx, \
852 .visitor = _dynamic_vla_visitor, \
853 }, \
bdc39c09
MD
854 }, \
855 }
856
808bd9bf
MD
857#define side_arg_dynamic_struct(_struct, _attr) \
858 { \
859 .dynamic_type = SIDE_DYNAMIC_TYPE_STRUCT, \
860 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
861 .attr = _attr, \
862 .u = { \
863 .side_dynamic_struct = (_struct), \
864 }, \
865 }
866
867#define side_arg_dynamic_struct_visitor(_dynamic_struct_visitor, _ctx, _attr) \
bdc39c09 868 { \
1e8256c9 869 .dynamic_type = SIDE_DYNAMIC_TYPE_STRUCT_VISITOR, \
808bd9bf
MD
870 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
871 .attr = _attr, \
bdc39c09 872 .u = { \
8ceca0cd
MD
873 .side_dynamic_struct_visitor = { \
874 .app_ctx = _ctx, \
875 .visitor = _dynamic_struct_visitor, \
876 }, \
bdc39c09
MD
877 }, \
878 }
879
a2e2357e
MD
880#define side_arg_dynamic_define_vec(_identifier, _sav) \
881 const struct side_arg_dynamic_vec _identifier##_vec[] = { _sav }; \
882 const struct side_arg_dynamic_vec_vla _identifier = { \
883 .sav = _identifier##_vec, \
884 .len = SIDE_ARRAY_SIZE(_identifier##_vec), \
885 }
886
c208889e
MD
887#define side_arg_dynamic_define_struct(_identifier, _struct_fields) \
888 const struct side_arg_dynamic_event_field _identifier##_fields[] = { _struct_fields }; \
889 const struct side_arg_dynamic_event_struct _identifier = { \
465e5e7e
MD
890 .fields = _identifier##_fields, \
891 .len = SIDE_ARRAY_SIZE(_identifier##_fields), \
892 }
893
f611d0c3
MD
894#define side_arg_define_vec(_identifier, _sav) \
895 const struct side_arg_vec _identifier##_vec[] = { _sav }; \
896 const struct side_arg_vec_description _identifier = { \
897 .sav = _identifier##_vec, \
898 .len = SIDE_ARRAY_SIZE(_identifier##_vec), \
899 }
a2e2357e 900
465e5e7e
MD
901#define side_arg_dynamic_field(_name, _elem) \
902 { \
903 .field_name = _name, \
904 .elem = _elem, \
905 }
906
f611d0c3
MD
907#define side_arg_list(...) __VA_ARGS__
908
bc3c89b3
MD
909#define side_attr_bool(val) { .type = SIDE_ATTR_TYPE_BOOL, .u = { .side_bool = !!(val) } }
910#define side_attr_u8(val) { .type = SIDE_ATTR_TYPE_U8, .u = { .side_u8 = (val) } }
911#define side_attr_u16(val) { .type = SIDE_ATTR_TYPE_U16, .u = { .side_u16 = (val) } }
912#define side_attr_u32(val) { .type = SIDE_ATTR_TYPE_U32, .u = { .side_u32 = (val) } }
913#define side_attr_u64(val) { .type = SIDE_ATTR_TYPE_U64, .u = { .side_u64 = (val) } }
914#define side_attr_s8(val) { .type = SIDE_ATTR_TYPE_S8, .u = { .side_s8 = (val) } }
915#define side_attr_s16(val) { .type = SIDE_ATTR_TYPE_S16, .u = { .side_s16 = (val) } }
916#define side_attr_s32(val) { .type = SIDE_ATTR_TYPE_S32, .u = { .side_s32 = (val) } }
917#define side_attr_s64(val) { .type = SIDE_ATTR_TYPE_S64, .u = { .side_s64 = (val) } }
918#define side_attr_float_binary16(val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY16, .u = { .side_float_binary16 = (val) } }
919#define side_attr_float_binary32(val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY32, .u = { .side_float_binary32 = (val) } }
920#define side_attr_float_binary64(val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY64, .u = { .side_float_binary64 = (val) } }
921#define side_attr_float_binary128(val) { .type = SIDE_ATTR_TYPE_FLOAT_BINARY128, .u = { .side_float_binary128 = (val) } }
922#define side_attr_string(val) { .type = SIDE_ATTR_TYPE_STRING, .u = { .string = (val) } }
923
d5cdb129 924#define side_event_cond(_desc) if (side_unlikely(_desc##_enabled))
19fa6aa2 925
d5cdb129 926#define side_event_call(_desc, _sav) \
f611d0c3
MD
927 { \
928 const struct side_arg_vec side_sav[] = { _sav }; \
929 const struct side_arg_vec_description sav_desc = { \
930 .sav = side_sav, \
931 .len = SIDE_ARRAY_SIZE(side_sav), \
932 }; \
d5cdb129 933 side_call(&(_desc), &sav_desc); \
f611d0c3
MD
934 }
935
d5cdb129
MD
936#define side_event(_desc, _sav) \
937 side_event_cond(_desc) \
938 side_event_call(_desc, SIDE_PARAM(_sav))
f611d0c3 939
d5cdb129 940#define side_event_call_variadic(_desc, _sav, _var_fields) \
19fa6aa2
MD
941 { \
942 const struct side_arg_vec side_sav[] = { _sav }; \
943 const struct side_arg_vec_description sav_desc = { \
944 .sav = side_sav, \
945 .len = SIDE_ARRAY_SIZE(side_sav), \
946 }; \
947 const struct side_arg_dynamic_event_field side_fields[] = { _var_fields }; \
948 const struct side_arg_dynamic_event_struct var_struct = { \
949 .fields = side_fields, \
950 .len = SIDE_ARRAY_SIZE(side_fields), \
951 }; \
d5cdb129 952 side_call_variadic(&(_desc), &sav_desc, &var_struct); \
19fa6aa2
MD
953 }
954
d5cdb129
MD
955#define side_event_variadic(_desc, _sav, _var) \
956 side_event_cond(_desc) \
957 side_event_call_variadic(_desc, SIDE_PARAM(_sav), SIDE_PARAM(_var))
19fa6aa2 958
d4328528 959#define side_define_enum(_identifier, _mappings, _attr) \
79f677ba
MD
960 const struct side_enum_mappings _identifier = { \
961 .mappings = _mappings, \
d4328528 962 .attr = _attr, \
79f677ba 963 .nr_mappings = SIDE_ARRAY_SIZE(SIDE_PARAM(_mappings)), \
d4328528 964 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
79f677ba
MD
965 }
966
66cff328 967#define side_enum_mapping_list(...) \
79f677ba
MD
968 SIDE_COMPOUND_LITERAL(const struct side_enum_mapping, __VA_ARGS__)
969
970#define side_enum_mapping_range(_label, _begin, _end) \
971 { \
972 .range_begin = _begin, \
973 .range_end = _end, \
974 .label = _label, \
975 }
976
977#define side_enum_mapping_value(_label, _value) \
978 { \
979 .range_begin = _value, \
980 .range_end = _value, \
981 .label = _label, \
982 }
983
d4328528 984#define side_define_enum_bitmap(_identifier, _mappings, _attr) \
66cff328
MD
985 const struct side_enum_bitmap_mappings _identifier = { \
986 .mappings = _mappings, \
d4328528 987 .attr = _attr, \
66cff328 988 .nr_mappings = SIDE_ARRAY_SIZE(SIDE_PARAM(_mappings)), \
d4328528 989 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
66cff328
MD
990 }
991
992#define side_enum_bitmap_mapping_list(...) \
993 SIDE_COMPOUND_LITERAL(const struct side_enum_bitmap_mapping, __VA_ARGS__)
994
995#define side_enum_bitmap_mapping_range(_label, _begin, _end) \
996 { \
997 .range_begin = _begin, \
998 .range_end = _end, \
999 .label = _label, \
1000 }
1001
1002#define side_enum_bitmap_mapping_value(_label, _value) \
1003 { \
1004 .range_begin = _value, \
1005 .range_end = _value, \
1006 .label = _label, \
1007 }
1008
399c836b 1009#define _side_define_event(_identifier, _provider, _event, _loglevel, _fields, _attr, _flags) \
b5b67ff2 1010 uint32_t _identifier##_enabled __attribute__((section("side_event_enable"))); \
d89fabc8 1011 struct side_callbacks _identifier##_callbacks __attribute__((section("side_event_callbacks"))); \
d5cdb129 1012 const struct side_event_description _identifier = { \
f611d0c3 1013 .version = 0, \
b5b67ff2 1014 .enabled = &(_identifier##_enabled), \
f611d0c3
MD
1015 .loglevel = _loglevel, \
1016 .nr_fields = SIDE_ARRAY_SIZE(SIDE_PARAM(_fields)), \
65010f43 1017 .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
8a25ce77 1018 .flags = (_flags), \
f611d0c3
MD
1019 .provider_name = _provider, \
1020 .event_name = _event, \
1021 .fields = _fields, \
65010f43 1022 .attr = _attr, \
d89fabc8 1023 .callbacks = &(_identifier##_callbacks), \
b5b67ff2
MD
1024 }; \
1025 const struct side_event_description *_identifier##_ptr \
1026 __attribute__((section("side_event_description"), used)) = &(_identifier);
f611d0c3 1027
399c836b
MD
1028#define side_define_event(_identifier, _provider, _event, _loglevel, _fields, _attr) \
1029 _side_define_event(_identifier, _provider, _event, _loglevel, SIDE_PARAM(_fields), \
1030 SIDE_PARAM(_attr), 0)
8a25ce77 1031
399c836b
MD
1032#define side_define_event_variadic(_identifier, _provider, _event, _loglevel, _fields, _attr) \
1033 _side_define_event(_identifier, _provider, _event, _loglevel, SIDE_PARAM(_fields), \
1034 SIDE_PARAM(_attr), SIDE_EVENT_FLAG_VARIADIC)
8a25ce77 1035
f611d0c3
MD
1036#define side_declare_event(_identifier) \
1037 struct side_event_description _identifier
1038
6841ae81
MD
1039void side_call(const struct side_event_description *desc,
1040 const struct side_arg_vec_description *sav_desc);
1041void side_call_variadic(const struct side_event_description *desc,
1042 const struct side_arg_vec_description *sav_desc,
1043 const struct side_arg_dynamic_event_struct *var_struct);
1044
f611d0c3 1045#endif /* _SIDE_TRACE_H */
This page took 0.07155 seconds and 4 git commands to generate.