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