1 // SPDX-License-Identifier: MIT
3 * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
12 #include <side/trace.h>
15 void tracer_print_struct(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
);
17 void tracer_print_array(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
);
19 void tracer_print_vla(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
);
21 void tracer_print_vla_visitor(const struct side_type_description
*type_desc
, void *app_ctx
);
23 void tracer_print_array_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
);
25 void tracer_print_vla_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
);
27 void tracer_print_dynamic(const struct side_arg_dynamic_vec
*dynamic_item
);
30 void tracer_print_attr_type(const struct side_attr
*attr
)
32 printf("{ key: \"%s\", value: ", attr
->key
);
33 switch (attr
->value
.type
) {
34 case SIDE_ATTR_TYPE_BOOL
:
35 printf("%s", attr
->value
.u
.side_bool
? "true" : "false");
37 case SIDE_ATTR_TYPE_U8
:
38 printf("%" PRIu8
, attr
->value
.u
.side_u8
);
40 case SIDE_ATTR_TYPE_U16
:
41 printf("%" PRIu16
, attr
->value
.u
.side_u16
);
43 case SIDE_ATTR_TYPE_U32
:
44 printf("%" PRIu32
, attr
->value
.u
.side_u32
);
46 case SIDE_ATTR_TYPE_U64
:
47 printf("%" PRIu64
, attr
->value
.u
.side_u64
);
49 case SIDE_ATTR_TYPE_S8
:
50 printf("%" PRId8
, attr
->value
.u
.side_s8
);
52 case SIDE_ATTR_TYPE_S16
:
53 printf("%" PRId16
, attr
->value
.u
.side_s16
);
55 case SIDE_ATTR_TYPE_S32
:
56 printf("%" PRId32
, attr
->value
.u
.side_s32
);
58 case SIDE_ATTR_TYPE_S64
:
59 printf("%" PRId64
, attr
->value
.u
.side_s64
);
61 case SIDE_ATTR_TYPE_FLOAT_BINARY16
:
63 printf("%g", (double) attr
->value
.u
.side_float_binary16
);
66 printf("ERROR: Unsupported binary16 float type\n");
69 case SIDE_ATTR_TYPE_FLOAT_BINARY32
:
71 printf("%g", (double) attr
->value
.u
.side_float_binary32
);
74 printf("ERROR: Unsupported binary32 float type\n");
77 case SIDE_ATTR_TYPE_FLOAT_BINARY64
:
79 printf("%g", (double) attr
->value
.u
.side_float_binary64
);
82 printf("ERROR: Unsupported binary64 float type\n");
85 case SIDE_ATTR_TYPE_FLOAT_BINARY128
:
87 printf("%Lg", (long double) attr
->value
.u
.side_float_binary128
);
90 printf("ERROR: Unsupported binary128 float type\n");
93 case SIDE_ATTR_TYPE_STRING
:
94 printf("\"%s\"", attr
->value
.u
.string
);
97 printf("<UNKNOWN TYPE>");
104 void print_attributes(const char *prefix_str
, const struct side_attr
*attr
, uint32_t nr_attr
)
110 printf("%s[ ", prefix_str
);
111 for (i
= 0; i
< nr_attr
; i
++) {
112 printf("%s", i
? ", " : "");
113 tracer_print_attr_type(&attr
[i
]);
119 void print_enum(const struct side_enum_mappings
*side_enum_mappings
, int64_t value
)
121 int i
, print_count
= 0;
123 print_attributes("attr: ", side_enum_mappings
->attr
, side_enum_mappings
->nr_attr
);
124 printf("%s", side_enum_mappings
->nr_attr
? ", " : "");
125 printf("value: %" PRId64
", labels: [ ", value
);
126 for (i
= 0; i
< side_enum_mappings
->nr_mappings
; i
++) {
127 const struct side_enum_mapping
*mapping
= &side_enum_mappings
->mappings
[i
];
129 if (mapping
->range_end
< mapping
->range_begin
) {
130 printf("ERROR: Unexpected enum range: %" PRIu64
"-%" PRIu64
"\n",
131 mapping
->range_begin
, mapping
->range_end
);
134 if (value
>= mapping
->range_begin
&& value
<= mapping
->range_end
) {
135 printf("%s", print_count
++ ? ", " : "");
136 printf("\"%s\"", mapping
->label
);
140 printf("<NO LABEL>");
145 void print_enum_bitmap(const struct side_enum_bitmap_mappings
*side_enum_mappings
, uint64_t value
)
147 int i
, print_count
= 0;
149 print_attributes("attr: ", side_enum_mappings
->attr
, side_enum_mappings
->nr_attr
);
150 printf("%s", side_enum_mappings
->nr_attr
? ", " : "");
151 printf("value: 0x%" PRIx64
", labels: [ ", value
);
152 for (i
= 0; i
< side_enum_mappings
->nr_mappings
; i
++) {
153 const struct side_enum_bitmap_mapping
*mapping
= &side_enum_mappings
->mappings
[i
];
157 if (mapping
->range_begin
< 0 || mapping
->range_end
> 63
158 || mapping
->range_end
< mapping
->range_begin
) {
159 printf("ERROR: Unexpected enum bitmap range: %" PRIu64
"-%" PRIu64
"\n",
160 mapping
->range_begin
, mapping
->range_end
);
163 for (bit
= mapping
->range_begin
; bit
<= mapping
->range_end
; bit
++) {
164 if (value
& (1ULL << bit
)) {
170 printf("%s", print_count
++ ? ", " : "");
171 printf("\"%s\"", mapping
->label
);
175 printf("<NO LABEL>");
180 void tracer_print_type(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
182 switch (item
->type
) {
183 case SIDE_TYPE_ARRAY_U8
:
184 case SIDE_TYPE_ARRAY_U16
:
185 case SIDE_TYPE_ARRAY_U32
:
186 case SIDE_TYPE_ARRAY_U64
:
187 case SIDE_TYPE_ARRAY_S8
:
188 case SIDE_TYPE_ARRAY_S16
:
189 case SIDE_TYPE_ARRAY_S32
:
190 case SIDE_TYPE_ARRAY_S64
:
191 case SIDE_TYPE_ARRAY_BLOB
:
192 if (type_desc
->type
!= SIDE_TYPE_ARRAY
) {
193 printf("ERROR: type mismatch between description and arguments\n");
197 case SIDE_TYPE_VLA_U8
:
198 case SIDE_TYPE_VLA_U16
:
199 case SIDE_TYPE_VLA_U32
:
200 case SIDE_TYPE_VLA_U64
:
201 case SIDE_TYPE_VLA_S8
:
202 case SIDE_TYPE_VLA_S16
:
203 case SIDE_TYPE_VLA_S32
:
204 case SIDE_TYPE_VLA_S64
:
205 case SIDE_TYPE_VLA_BLOB
:
206 if (type_desc
->type
!= SIDE_TYPE_VLA
) {
207 printf("ERROR: type mismatch between description and arguments\n");
213 if (type_desc
->type
!= item
->type
) {
214 printf("ERROR: type mismatch between description and arguments\n");
220 switch (item
->type
) {
222 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
223 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
225 printf("%s", item
->u
.side_bool
? "true" : "false");
228 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
229 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
231 printf("%" PRIu8
, item
->u
.side_u8
);
234 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
235 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
237 printf("%" PRIu16
, item
->u
.side_u16
);
240 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
241 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
243 printf("%" PRIu32
, item
->u
.side_u32
);
246 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
247 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
249 printf("%" PRIu64
, item
->u
.side_u64
);
252 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
253 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
255 printf("%" PRId8
, item
->u
.side_s8
);
258 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
259 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
261 printf("%" PRId16
, item
->u
.side_s16
);
264 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
265 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
267 printf("%" PRId32
, item
->u
.side_s32
);
270 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
271 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
273 printf("%" PRId64
, item
->u
.side_s64
);
276 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
277 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
279 printf("0x%" PRIx8
, item
->u
.side_blob
);
282 case SIDE_TYPE_ENUM_U8
:
283 print_enum(type_desc
->u
.side_enum_mappings
,
284 (int64_t) item
->u
.side_u8
);
286 case SIDE_TYPE_ENUM_U16
:
287 print_enum(type_desc
->u
.side_enum_mappings
,
288 (int64_t) item
->u
.side_u16
);
290 case SIDE_TYPE_ENUM_U32
:
291 print_enum(type_desc
->u
.side_enum_mappings
,
292 (int64_t) item
->u
.side_u32
);
294 case SIDE_TYPE_ENUM_U64
:
295 print_enum(type_desc
->u
.side_enum_mappings
,
296 (int64_t) item
->u
.side_u64
);
298 case SIDE_TYPE_ENUM_S8
:
299 print_enum(type_desc
->u
.side_enum_mappings
,
300 (int64_t) item
->u
.side_s8
);
302 case SIDE_TYPE_ENUM_S16
:
303 print_enum(type_desc
->u
.side_enum_mappings
,
304 (int64_t) item
->u
.side_s16
);
306 case SIDE_TYPE_ENUM_S32
:
307 print_enum(type_desc
->u
.side_enum_mappings
,
308 (int64_t) item
->u
.side_s32
);
310 case SIDE_TYPE_ENUM_S64
:
311 print_enum(type_desc
->u
.side_enum_mappings
,
315 case SIDE_TYPE_ENUM_BITMAP8
:
316 print_enum_bitmap(type_desc
->u
.side_enum_bitmap_mappings
,
317 (uint64_t) item
->u
.side_u8
);
319 case SIDE_TYPE_ENUM_BITMAP16
:
320 print_enum_bitmap(type_desc
->u
.side_enum_bitmap_mappings
,
321 (uint64_t) item
->u
.side_u16
);
323 case SIDE_TYPE_ENUM_BITMAP32
:
324 print_enum_bitmap(type_desc
->u
.side_enum_bitmap_mappings
,
325 (uint64_t) item
->u
.side_u32
);
327 case SIDE_TYPE_ENUM_BITMAP64
:
328 print_enum_bitmap(type_desc
->u
.side_enum_bitmap_mappings
,
332 case SIDE_TYPE_FLOAT_BINARY16
:
333 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
334 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
337 printf("%g", (double) item
->u
.side_float_binary16
);
340 printf("ERROR: Unsupported binary16 float type\n");
343 case SIDE_TYPE_FLOAT_BINARY32
:
344 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
345 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
348 printf("%g", (double) item
->u
.side_float_binary32
);
351 printf("ERROR: Unsupported binary32 float type\n");
354 case SIDE_TYPE_FLOAT_BINARY64
:
355 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
356 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
359 printf("%g", (double) item
->u
.side_float_binary64
);
362 printf("ERROR: Unsupported binary64 float type\n");
365 case SIDE_TYPE_FLOAT_BINARY128
:
366 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
367 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
370 printf("%Lg", (long double) item
->u
.side_float_binary128
);
373 printf("ERROR: Unsupported binary128 float type\n");
376 case SIDE_TYPE_STRING
:
377 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
378 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
380 printf("\"%s\"", item
->u
.string
);
382 case SIDE_TYPE_STRUCT
:
383 tracer_print_struct(type_desc
, item
->u
.side_struct
);
385 case SIDE_TYPE_ARRAY
:
386 tracer_print_array(type_desc
, item
->u
.side_array
);
389 tracer_print_vla(type_desc
, item
->u
.side_vla
);
391 case SIDE_TYPE_VLA_VISITOR
:
392 tracer_print_vla_visitor(type_desc
, item
->u
.side_vla_app_visitor_ctx
);
394 case SIDE_TYPE_ARRAY_U8
:
395 case SIDE_TYPE_ARRAY_U16
:
396 case SIDE_TYPE_ARRAY_U32
:
397 case SIDE_TYPE_ARRAY_U64
:
398 case SIDE_TYPE_ARRAY_S8
:
399 case SIDE_TYPE_ARRAY_S16
:
400 case SIDE_TYPE_ARRAY_S32
:
401 case SIDE_TYPE_ARRAY_S64
:
402 case SIDE_TYPE_ARRAY_BLOB
:
403 tracer_print_array_fixint(type_desc
, item
);
405 case SIDE_TYPE_VLA_U8
:
406 case SIDE_TYPE_VLA_U16
:
407 case SIDE_TYPE_VLA_U32
:
408 case SIDE_TYPE_VLA_U64
:
409 case SIDE_TYPE_VLA_S8
:
410 case SIDE_TYPE_VLA_S16
:
411 case SIDE_TYPE_VLA_S32
:
412 case SIDE_TYPE_VLA_S64
:
413 case SIDE_TYPE_VLA_BLOB
:
414 tracer_print_vla_fixint(type_desc
, item
);
416 case SIDE_TYPE_DYNAMIC
:
417 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
418 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
420 tracer_print_dynamic(&item
->u
.dynamic
);
423 printf("<UNKNOWN TYPE>");
430 void tracer_print_field(const struct side_event_field
*item_desc
, const struct side_arg_vec
*item
)
432 printf("%s: ", item_desc
->field_name
);
433 tracer_print_type(&item_desc
->side_type
, item
);
437 void tracer_print_struct(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
439 const struct side_arg_vec
*sav
= sav_desc
->sav
;
440 uint32_t side_sav_len
= sav_desc
->len
;
443 if (type_desc
->u
.side_struct
->nr_fields
!= side_sav_len
) {
444 printf("ERROR: number of fields mismatch between description and arguments of structure\n");
447 print_attributes("attr: ", type_desc
->u
.side_struct
->attr
, type_desc
->u
.side_struct
->nr_attr
);
448 printf("%s", type_desc
->u
.side_struct
->nr_attr
? ", " : "");
449 printf("fields: { ");
450 for (i
= 0; i
< side_sav_len
; i
++) {
451 printf("%s", i
? ", " : "");
452 tracer_print_field(&type_desc
->u
.side_struct
->fields
[i
], &sav
[i
]);
458 void tracer_print_array(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
460 const struct side_arg_vec
*sav
= sav_desc
->sav
;
461 uint32_t side_sav_len
= sav_desc
->len
;
464 if (type_desc
->u
.side_array
.length
!= side_sav_len
) {
465 printf("ERROR: length mismatch between description and arguments of array\n");
468 print_attributes("attr: ", type_desc
->u
.side_array
.attr
, type_desc
->u
.side_array
.nr_attr
);
469 printf("%s", type_desc
->u
.side_array
.nr_attr
? ", " : "");
470 printf("elements: ");
472 for (i
= 0; i
< side_sav_len
; i
++) {
473 printf("%s", i
? ", " : "");
474 tracer_print_type(type_desc
->u
.side_array
.elem_type
, &sav
[i
]);
480 void tracer_print_vla(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
482 const struct side_arg_vec
*sav
= sav_desc
->sav
;
483 uint32_t side_sav_len
= sav_desc
->len
;
486 print_attributes("attr: ", type_desc
->u
.side_vla
.attr
, type_desc
->u
.side_vla
.nr_attr
);
487 printf("%s", type_desc
->u
.side_vla
.nr_attr
? ", " : "");
488 printf("elements: ");
490 for (i
= 0; i
< side_sav_len
; i
++) {
491 printf("%s", i
? ", " : "");
492 tracer_print_type(type_desc
->u
.side_vla
.elem_type
, &sav
[i
]);
497 struct tracer_visitor_priv
{
498 const struct side_type_description
*elem_type
;
503 enum side_visitor_status
tracer_write_elem_cb(const struct side_tracer_visitor_ctx
*tracer_ctx
,
504 const struct side_arg_vec
*elem
)
506 struct tracer_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
508 printf("%s", tracer_priv
->i
++ ? ", " : "");
509 tracer_print_type(tracer_priv
->elem_type
, elem
);
510 return SIDE_VISITOR_STATUS_OK
;
514 void tracer_print_vla_visitor(const struct side_type_description
*type_desc
, void *app_ctx
)
516 enum side_visitor_status status
;
517 struct tracer_visitor_priv tracer_priv
= {
518 .elem_type
= type_desc
->u
.side_vla_visitor
.elem_type
,
521 const struct side_tracer_visitor_ctx tracer_ctx
= {
522 .write_elem
= tracer_write_elem_cb
,
523 .priv
= &tracer_priv
,
526 print_attributes("attr: ", type_desc
->u
.side_vla_visitor
.attr
, type_desc
->u
.side_vla_visitor
.nr_attr
);
527 printf("%s", type_desc
->u
.side_vla_visitor
.nr_attr
? ", " : "");
528 printf("elements: ");
530 status
= type_desc
->u
.side_vla_visitor
.visitor(&tracer_ctx
, app_ctx
);
532 case SIDE_VISITOR_STATUS_OK
:
534 case SIDE_VISITOR_STATUS_ERROR
:
535 printf("ERROR: Visitor error\n");
541 void tracer_print_array_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
543 const struct side_type_description
*elem_type
= type_desc
->u
.side_array
.elem_type
;
544 uint32_t side_sav_len
= type_desc
->u
.side_array
.length
;
545 void *p
= item
->u
.side_array_fixint
;
546 enum side_type side_type
;
549 print_attributes("attr: ", type_desc
->u
.side_array
.attr
, type_desc
->u
.side_array
.nr_attr
);
550 printf("%s", type_desc
->u
.side_array
.nr_attr
? ", " : "");
551 printf("elements: ");
552 switch (item
->type
) {
553 case SIDE_TYPE_ARRAY_U8
:
554 if (elem_type
->type
!= SIDE_TYPE_U8
)
557 case SIDE_TYPE_ARRAY_U16
:
558 if (elem_type
->type
!= SIDE_TYPE_U16
)
561 case SIDE_TYPE_ARRAY_U32
:
562 if (elem_type
->type
!= SIDE_TYPE_U32
)
565 case SIDE_TYPE_ARRAY_U64
:
566 if (elem_type
->type
!= SIDE_TYPE_U64
)
569 case SIDE_TYPE_ARRAY_S8
:
570 if (elem_type
->type
!= SIDE_TYPE_S8
)
573 case SIDE_TYPE_ARRAY_S16
:
574 if (elem_type
->type
!= SIDE_TYPE_S16
)
577 case SIDE_TYPE_ARRAY_S32
:
578 if (elem_type
->type
!= SIDE_TYPE_S32
)
581 case SIDE_TYPE_ARRAY_S64
:
582 if (elem_type
->type
!= SIDE_TYPE_S64
)
585 case SIDE_TYPE_ARRAY_BLOB
:
586 if (elem_type
->type
!= SIDE_TYPE_BLOB
)
592 side_type
= elem_type
->type
;
595 for (i
= 0; i
< side_sav_len
; i
++) {
596 struct side_arg_vec sav_elem
= {
602 sav_elem
.u
.side_u8
= ((const uint8_t *) p
)[i
];
605 sav_elem
.u
.side_s8
= ((const int8_t *) p
)[i
];
608 sav_elem
.u
.side_u16
= ((const uint16_t *) p
)[i
];
611 sav_elem
.u
.side_s16
= ((const int16_t *) p
)[i
];
614 sav_elem
.u
.side_u32
= ((const uint32_t *) p
)[i
];
617 sav_elem
.u
.side_s32
= ((const int32_t *) p
)[i
];
620 sav_elem
.u
.side_u64
= ((const uint64_t *) p
)[i
];
623 sav_elem
.u
.side_s64
= ((const int64_t *) p
)[i
];
626 sav_elem
.u
.side_blob
= ((const uint8_t *) p
)[i
];
630 printf("ERROR: Unexpected type\n");
634 printf("%s", i
? ", " : "");
635 tracer_print_type(elem_type
, &sav_elem
);
641 printf("ERROR: type mismatch\n");
645 void tracer_print_vla_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
647 const struct side_type_description
*elem_type
= type_desc
->u
.side_vla
.elem_type
;
648 uint32_t side_sav_len
= item
->u
.side_vla_fixint
.length
;
649 void *p
= item
->u
.side_vla_fixint
.p
;
650 enum side_type side_type
;
653 print_attributes("attr: ", type_desc
->u
.side_vla
.attr
, type_desc
->u
.side_vla
.nr_attr
);
654 printf("%s", type_desc
->u
.side_vla
.nr_attr
? ", " : "");
655 printf("elements: ");
656 switch (item
->type
) {
657 case SIDE_TYPE_VLA_U8
:
658 if (elem_type
->type
!= SIDE_TYPE_U8
)
661 case SIDE_TYPE_VLA_U16
:
662 if (elem_type
->type
!= SIDE_TYPE_U16
)
665 case SIDE_TYPE_VLA_U32
:
666 if (elem_type
->type
!= SIDE_TYPE_U32
)
669 case SIDE_TYPE_VLA_U64
:
670 if (elem_type
->type
!= SIDE_TYPE_U64
)
673 case SIDE_TYPE_VLA_S8
:
674 if (elem_type
->type
!= SIDE_TYPE_S8
)
677 case SIDE_TYPE_VLA_S16
:
678 if (elem_type
->type
!= SIDE_TYPE_S16
)
681 case SIDE_TYPE_VLA_S32
:
682 if (elem_type
->type
!= SIDE_TYPE_S32
)
685 case SIDE_TYPE_VLA_S64
:
686 if (elem_type
->type
!= SIDE_TYPE_S64
)
689 case SIDE_TYPE_VLA_BLOB
:
690 if (elem_type
->type
!= SIDE_TYPE_BLOB
)
696 side_type
= elem_type
->type
;
699 for (i
= 0; i
< side_sav_len
; i
++) {
700 struct side_arg_vec sav_elem
= {
706 sav_elem
.u
.side_u8
= ((const uint8_t *) p
)[i
];
709 sav_elem
.u
.side_s8
= ((const int8_t *) p
)[i
];
712 sav_elem
.u
.side_u16
= ((const uint16_t *) p
)[i
];
715 sav_elem
.u
.side_s16
= ((const int16_t *) p
)[i
];
718 sav_elem
.u
.side_u32
= ((const uint32_t *) p
)[i
];
721 sav_elem
.u
.side_s32
= ((const int32_t *) p
)[i
];
724 sav_elem
.u
.side_u64
= ((const uint64_t *) p
)[i
];
727 sav_elem
.u
.side_s64
= ((const int64_t *) p
)[i
];
730 sav_elem
.u
.side_blob
= ((const uint8_t *) p
)[i
];
734 printf("ERROR: Unexpected type\n");
738 printf("%s", i
? ", " : "");
739 tracer_print_type(elem_type
, &sav_elem
);
745 printf("ERROR: type mismatch\n");
750 void tracer_print_dynamic_struct(const struct side_arg_dynamic_event_struct
*dynamic_struct
)
752 const struct side_arg_dynamic_event_field
*fields
= dynamic_struct
->fields
;
753 uint32_t len
= dynamic_struct
->len
;
758 for (i
= 0; i
< len
; i
++) {
759 printf("%s", i
? ", " : "");
760 printf("%s:: ", fields
[i
].field_name
);
761 tracer_print_dynamic(&fields
[i
].elem
);
766 struct tracer_dynamic_struct_visitor_priv
{
771 enum side_visitor_status
tracer_dynamic_struct_write_elem_cb(
772 const struct side_tracer_dynamic_struct_visitor_ctx
*tracer_ctx
,
773 const struct side_arg_dynamic_event_field
*dynamic_field
)
775 struct tracer_dynamic_struct_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
777 printf("%s", tracer_priv
->i
++ ? ", " : "");
778 printf("%s:: ", dynamic_field
->field_name
);
779 tracer_print_dynamic(&dynamic_field
->elem
);
780 return SIDE_VISITOR_STATUS_OK
;
784 void tracer_print_dynamic_struct_visitor(const struct side_arg_dynamic_vec
*item
)
786 enum side_visitor_status status
;
787 struct tracer_dynamic_struct_visitor_priv tracer_priv
= {
790 const struct side_tracer_dynamic_struct_visitor_ctx tracer_ctx
= {
791 .write_field
= tracer_dynamic_struct_write_elem_cb
,
792 .priv
= &tracer_priv
,
794 void *app_ctx
= item
->u
.side_dynamic_struct_visitor
.app_ctx
;
798 status
= item
->u
.side_dynamic_struct_visitor
.visitor(&tracer_ctx
, app_ctx
);
800 case SIDE_VISITOR_STATUS_OK
:
802 case SIDE_VISITOR_STATUS_ERROR
:
803 printf("ERROR: Visitor error\n");
810 void tracer_print_dynamic_vla(const struct side_arg_dynamic_vec_vla
*vla
)
812 const struct side_arg_dynamic_vec
*sav
= vla
->sav
;
813 uint32_t side_sav_len
= vla
->len
;
816 printf("elements:: ");
818 for (i
= 0; i
< side_sav_len
; i
++) {
819 printf("%s", i
? ", " : "");
820 tracer_print_dynamic(&sav
[i
]);
825 struct tracer_dynamic_vla_visitor_priv
{
830 enum side_visitor_status
tracer_dynamic_vla_write_elem_cb(
831 const struct side_tracer_dynamic_vla_visitor_ctx
*tracer_ctx
,
832 const struct side_arg_dynamic_vec
*elem
)
834 struct tracer_dynamic_vla_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
836 printf("%s", tracer_priv
->i
++ ? ", " : "");
837 tracer_print_dynamic(elem
);
838 return SIDE_VISITOR_STATUS_OK
;
842 void tracer_print_dynamic_vla_visitor(const struct side_arg_dynamic_vec
*item
)
844 enum side_visitor_status status
;
845 struct tracer_dynamic_vla_visitor_priv tracer_priv
= {
848 const struct side_tracer_dynamic_vla_visitor_ctx tracer_ctx
= {
849 .write_elem
= tracer_dynamic_vla_write_elem_cb
,
850 .priv
= &tracer_priv
,
852 void *app_ctx
= item
->u
.side_dynamic_vla_visitor
.app_ctx
;
854 printf("elements:: ");
856 status
= item
->u
.side_dynamic_vla_visitor
.visitor(&tracer_ctx
, app_ctx
);
858 case SIDE_VISITOR_STATUS_OK
:
860 case SIDE_VISITOR_STATUS_ERROR
:
861 printf("ERROR: Visitor error\n");
868 void tracer_print_dynamic(const struct side_arg_dynamic_vec
*item
)
871 print_attributes("attr:: ", item
->attr
, item
->nr_attr
);
872 printf("%s", item
->nr_attr
? ", " : "");
873 switch (item
->dynamic_type
) {
874 case SIDE_DYNAMIC_TYPE_NULL
:
876 printf("<NULL TYPE>");
878 case SIDE_DYNAMIC_TYPE_BOOL
:
880 printf("%s", item
->u
.side_bool
? "true" : "false");
882 case SIDE_DYNAMIC_TYPE_U8
:
884 printf("%" PRIu8
, item
->u
.side_u8
);
886 case SIDE_DYNAMIC_TYPE_U16
:
888 printf("%" PRIu16
, item
->u
.side_u16
);
890 case SIDE_DYNAMIC_TYPE_U32
:
892 printf("%" PRIu32
, item
->u
.side_u32
);
894 case SIDE_DYNAMIC_TYPE_U64
:
896 printf("%" PRIu64
, item
->u
.side_u64
);
898 case SIDE_DYNAMIC_TYPE_S8
:
900 printf("%" PRId8
, item
->u
.side_s8
);
902 case SIDE_DYNAMIC_TYPE_S16
:
904 printf("%" PRId16
, item
->u
.side_s16
);
906 case SIDE_DYNAMIC_TYPE_S32
:
908 printf("%" PRId32
, item
->u
.side_s32
);
910 case SIDE_DYNAMIC_TYPE_S64
:
912 printf("%" PRId64
, item
->u
.side_s64
);
914 case SIDE_DYNAMIC_TYPE_BLOB
:
916 printf("0x%" PRIx8
, item
->u
.side_blob
);
919 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY16
:
922 printf("%g", (double) item
->u
.side_float_binary16
);
925 printf("ERROR: Unsupported binary16 float type\n");
928 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY32
:
931 printf("%g", (double) item
->u
.side_float_binary32
);
934 printf("ERROR: Unsupported binary32 float type\n");
937 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY64
:
940 printf("%g", (double) item
->u
.side_float_binary64
);
943 printf("ERROR: Unsupported binary64 float type\n");
946 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY128
:
949 printf("%Lg", (long double) item
->u
.side_float_binary128
);
952 printf("ERROR: Unsupported binary128 float type\n");
955 case SIDE_DYNAMIC_TYPE_STRING
:
957 printf("\"%s\"", item
->u
.string
);
959 case SIDE_DYNAMIC_TYPE_STRUCT
:
960 tracer_print_dynamic_struct(item
->u
.side_dynamic_struct
);
962 case SIDE_DYNAMIC_TYPE_STRUCT_VISITOR
:
963 tracer_print_dynamic_struct_visitor(item
);
965 case SIDE_DYNAMIC_TYPE_VLA
:
966 tracer_print_dynamic_vla(item
->u
.side_dynamic_vla
);
968 case SIDE_DYNAMIC_TYPE_VLA_VISITOR
:
969 tracer_print_dynamic_vla_visitor(item
);
972 printf("<UNKNOWN TYPE>");
979 void tracer_print_static_fields(const struct side_event_description
*desc
,
980 const struct side_arg_vec_description
*sav_desc
,
983 const struct side_arg_vec
*sav
= sav_desc
->sav
;
984 uint32_t side_sav_len
= sav_desc
->len
;
987 printf("provider: %s, event: %s", desc
->provider_name
, desc
->event_name
);
988 if (desc
->nr_fields
!= side_sav_len
) {
989 printf("ERROR: number of fields mismatch between description and arguments\n");
992 print_attributes(", attributes: ", desc
->attr
, desc
->nr_attr
);
993 printf("%s", side_sav_len
? ", fields: [ " : "");
994 for (i
= 0; i
< side_sav_len
; i
++) {
995 printf("%s", i
? ", " : "");
996 tracer_print_field(&desc
->fields
[i
], &sav
[i
]);
1002 void tracer_call(const struct side_event_description
*desc
,
1003 const struct side_arg_vec_description
*sav_desc
,
1004 void *priv
__attribute__((unused
)))
1008 tracer_print_static_fields(desc
, sav_desc
, &nr_fields
);
1014 void tracer_call_variadic(const struct side_event_description
*desc
,
1015 const struct side_arg_vec_description
*sav_desc
,
1016 const struct side_arg_dynamic_event_struct
*var_struct
,
1017 void *priv
__attribute__((unused
)))
1019 uint32_t var_struct_len
= var_struct
->len
;
1020 int nr_fields
= 0, i
;
1022 tracer_print_static_fields(desc
, sav_desc
, &nr_fields
);
1024 if (side_unlikely(!(desc
->flags
& SIDE_EVENT_FLAG_VARIADIC
))) {
1025 printf("ERROR: unexpected non-variadic event description\n");
1028 printf("%s", var_struct_len
&& !nr_fields
? ", fields: [ " : "");
1029 for (i
= 0; i
< var_struct_len
; i
++, nr_fields
++) {
1030 printf("%s", nr_fields
? ", " : "");
1031 printf("%s:: ", var_struct
->fields
[i
].field_name
);
1032 tracer_print_dynamic(&var_struct
->fields
[i
].elem
);