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
);
29 void tracer_print_type(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
);
32 void tracer_print_attr_type(const struct side_attr
*attr
)
34 printf("{ key: \"%s\", value: ", attr
->key
);
35 switch (attr
->value
.type
) {
36 case SIDE_ATTR_TYPE_BOOL
:
37 printf("%s", attr
->value
.u
.side_bool
? "true" : "false");
39 case SIDE_ATTR_TYPE_U8
:
40 printf("%" PRIu8
, attr
->value
.u
.side_u8
);
42 case SIDE_ATTR_TYPE_U16
:
43 printf("%" PRIu16
, attr
->value
.u
.side_u16
);
45 case SIDE_ATTR_TYPE_U32
:
46 printf("%" PRIu32
, attr
->value
.u
.side_u32
);
48 case SIDE_ATTR_TYPE_U64
:
49 printf("%" PRIu64
, attr
->value
.u
.side_u64
);
51 case SIDE_ATTR_TYPE_S8
:
52 printf("%" PRId8
, attr
->value
.u
.side_s8
);
54 case SIDE_ATTR_TYPE_S16
:
55 printf("%" PRId16
, attr
->value
.u
.side_s16
);
57 case SIDE_ATTR_TYPE_S32
:
58 printf("%" PRId32
, attr
->value
.u
.side_s32
);
60 case SIDE_ATTR_TYPE_S64
:
61 printf("%" PRId64
, attr
->value
.u
.side_s64
);
63 case SIDE_ATTR_TYPE_FLOAT_BINARY16
:
65 printf("%g", (double) attr
->value
.u
.side_float_binary16
);
68 printf("ERROR: Unsupported binary16 float type\n");
71 case SIDE_ATTR_TYPE_FLOAT_BINARY32
:
73 printf("%g", (double) attr
->value
.u
.side_float_binary32
);
76 printf("ERROR: Unsupported binary32 float type\n");
79 case SIDE_ATTR_TYPE_FLOAT_BINARY64
:
81 printf("%g", (double) attr
->value
.u
.side_float_binary64
);
84 printf("ERROR: Unsupported binary64 float type\n");
87 case SIDE_ATTR_TYPE_FLOAT_BINARY128
:
89 printf("%Lg", (long double) attr
->value
.u
.side_float_binary128
);
92 printf("ERROR: Unsupported binary128 float type\n");
95 case SIDE_ATTR_TYPE_STRING
:
96 printf("\"%s\"", attr
->value
.u
.string
);
99 printf("<UNKNOWN TYPE>");
106 void print_attributes(const char *prefix_str
, const struct side_attr
*attr
, uint32_t nr_attr
)
112 printf("%s[ ", prefix_str
);
113 for (i
= 0; i
< nr_attr
; i
++) {
114 printf("%s", i
? ", " : "");
115 tracer_print_attr_type(&attr
[i
]);
121 void print_enum(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
123 const struct side_enum_mappings
*mappings
= type_desc
->u
.side_enum
.mappings
;
124 int i
, print_count
= 0;
127 if (type_desc
->u
.side_enum
.elem_type
->type
!= item
->type
) {
128 printf("ERROR: Unexpected enum element type\n");
131 switch (item
->type
) {
133 value
= (int64_t) item
->u
.side_u8
;
136 value
= (int64_t) item
->u
.side_u16
;
139 value
= (int64_t) item
->u
.side_u32
;
142 value
= (int64_t) item
->u
.side_u64
;
145 value
= (int64_t) item
->u
.side_s8
;
148 value
= (int64_t) item
->u
.side_s16
;
151 value
= (int64_t) item
->u
.side_s32
;
154 value
= (int64_t) item
->u
.side_s64
;
157 printf("ERROR: Unexpected enum element type\n");
160 print_attributes("attr: ", mappings
->attr
, mappings
->nr_attr
);
161 printf("%s", mappings
->nr_attr
? ", " : "");
162 tracer_print_type(type_desc
->u
.side_enum
.elem_type
, item
);
163 printf(", labels: [ ");
164 for (i
= 0; i
< mappings
->nr_mappings
; i
++) {
165 const struct side_enum_mapping
*mapping
= &mappings
->mappings
[i
];
167 if (mapping
->range_end
< mapping
->range_begin
) {
168 printf("ERROR: Unexpected enum range: %" PRIu64
"-%" PRIu64
"\n",
169 mapping
->range_begin
, mapping
->range_end
);
172 if (value
>= mapping
->range_begin
&& value
<= mapping
->range_end
) {
173 printf("%s", print_count
++ ? ", " : "");
174 printf("\"%s\"", mapping
->label
);
178 printf("<NO LABEL>");
183 uint32_t enum_elem_type_to_stride(const struct side_type_description
*elem_type
)
187 switch (elem_type
->type
) {
204 case SIDE_TYPE_ARRAY
:
205 return enum_elem_type_to_stride(elem_type
->u
.side_array
.elem_type
);
207 return enum_elem_type_to_stride(elem_type
->u
.side_vla
.elem_type
);
215 void print_enum_bitmap(const struct side_type_description
*type_desc
,
216 const struct side_arg_vec
*item
)
218 const struct side_type_description
*elem_type
= type_desc
->u
.side_enum_bitmap
.elem_type
;
219 const struct side_enum_bitmap_mappings
*side_enum_mappings
= type_desc
->u
.side_enum_bitmap
.mappings
;
220 int i
, print_count
= 0;
221 uint32_t stride_bit
, nr_items
;
222 const struct side_arg_vec
*array_item
;
224 stride_bit
= enum_elem_type_to_stride(elem_type
);
226 switch (elem_type
->type
) {
227 case SIDE_TYPE_U8
: /* Fall-through */
228 case SIDE_TYPE_U16
: /* Fall-through */
229 case SIDE_TYPE_U32
: /* Fall-through */
230 case SIDE_TYPE_U64
: /* Fall-through */
231 case SIDE_TYPE_S8
: /* Fall-through */
232 case SIDE_TYPE_S16
: /* Fall-through */
233 case SIDE_TYPE_S32
: /* Fall-through */
238 case SIDE_TYPE_ARRAY
:
239 array_item
= item
->u
.side_array
->sav
;
240 nr_items
= type_desc
->u
.side_array
.length
;
243 array_item
= item
->u
.side_vla
->sav
;
244 nr_items
= item
->u
.side_vla
->len
;
247 printf("ERROR: Unexpected enum element type\n");
251 print_attributes("attr: ", side_enum_mappings
->attr
, side_enum_mappings
->nr_attr
);
252 printf("%s", side_enum_mappings
->nr_attr
? ", " : "");
253 printf("labels: [ ");
254 for (i
= 0; i
< side_enum_mappings
->nr_mappings
; i
++) {
255 const struct side_enum_bitmap_mapping
*mapping
= &side_enum_mappings
->mappings
[i
];
259 if (mapping
->range_begin
< 0 || mapping
->range_end
< mapping
->range_begin
) {
260 printf("ERROR: Unexpected enum bitmap range: %" PRIu64
"-%" PRIu64
"\n",
261 mapping
->range_begin
, mapping
->range_end
);
264 for (bit
= mapping
->range_begin
; bit
<= mapping
->range_end
; bit
++) {
265 if (bit
> (nr_items
* stride_bit
) - 1)
267 switch (stride_bit
) {
270 uint8_t v
= array_item
[bit
/ 8].u
.side_u8
;
271 if (v
& (1ULL << (bit
% 8))) {
279 uint16_t v
= array_item
[bit
/ 16].u
.side_u16
;
280 if (v
& (1ULL << (bit
% 16))) {
288 uint32_t v
= array_item
[bit
/ 32].u
.side_u32
;
289 if (v
& (1ULL << (bit
% 32))) {
297 uint64_t v
= array_item
[bit
/ 64].u
.side_u64
;
298 if (v
& (1ULL << (bit
% 64))) {
310 printf("%s", print_count
++ ? ", " : "");
311 printf("\"%s\"", mapping
->label
);
315 printf("<NO LABEL>");
320 void tracer_print_basic_type_header(const struct side_type_description
*type_desc
)
322 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
323 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
328 void tracer_print_type(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
332 switch (item
->type
) {
333 case SIDE_TYPE_ARRAY_U8
:
334 case SIDE_TYPE_ARRAY_U16
:
335 case SIDE_TYPE_ARRAY_U32
:
336 case SIDE_TYPE_ARRAY_U64
:
337 case SIDE_TYPE_ARRAY_S8
:
338 case SIDE_TYPE_ARRAY_S16
:
339 case SIDE_TYPE_ARRAY_S32
:
340 case SIDE_TYPE_ARRAY_S64
:
341 case SIDE_TYPE_ARRAY_BLOB
:
342 if (type_desc
->type
!= SIDE_TYPE_ARRAY
) {
343 printf("ERROR: type mismatch between description and arguments\n");
347 case SIDE_TYPE_VLA_U8
:
348 case SIDE_TYPE_VLA_U16
:
349 case SIDE_TYPE_VLA_U32
:
350 case SIDE_TYPE_VLA_U64
:
351 case SIDE_TYPE_VLA_S8
:
352 case SIDE_TYPE_VLA_S16
:
353 case SIDE_TYPE_VLA_S32
:
354 case SIDE_TYPE_VLA_S64
:
355 case SIDE_TYPE_VLA_BLOB
:
356 if (type_desc
->type
!= SIDE_TYPE_VLA
) {
357 printf("ERROR: type mismatch between description and arguments\n");
370 case SIDE_TYPE_ARRAY
:
372 switch (type_desc
->type
) {
373 case SIDE_TYPE_ENUM
: /* Fall-through */
374 case SIDE_TYPE_ENUM_BITMAP
:
377 if (type_desc
->type
!= item
->type
) {
378 printf("ERROR: type mismatch between description and arguments\n");
385 if (type_desc
->type
!= item
->type
) {
386 printf("ERROR: type mismatch between description and arguments\n");
392 if (type_desc
->type
== SIDE_TYPE_ENUM
|| type_desc
->type
== SIDE_TYPE_ENUM_BITMAP
)
393 type
= type_desc
->type
;
400 tracer_print_basic_type_header(type_desc
);
401 printf("%s", item
->u
.side_bool
? "true" : "false");
404 tracer_print_basic_type_header(type_desc
);
405 printf("%" PRIu8
, item
->u
.side_u8
);
408 tracer_print_basic_type_header(type_desc
);
409 printf("%" PRIu16
, item
->u
.side_u16
);
412 tracer_print_basic_type_header(type_desc
);
413 printf("%" PRIu32
, item
->u
.side_u32
);
416 tracer_print_basic_type_header(type_desc
);
417 printf("%" PRIu64
, item
->u
.side_u64
);
420 tracer_print_basic_type_header(type_desc
);
421 printf("%" PRId8
, item
->u
.side_s8
);
424 tracer_print_basic_type_header(type_desc
);
425 printf("%" PRId16
, item
->u
.side_s16
);
428 tracer_print_basic_type_header(type_desc
);
429 printf("%" PRId32
, item
->u
.side_s32
);
432 tracer_print_basic_type_header(type_desc
);
433 printf("%" PRId64
, item
->u
.side_s64
);
436 tracer_print_basic_type_header(type_desc
);
437 printf("0x%" PRIx8
, item
->u
.side_blob
);
441 print_enum(type_desc
, item
);
444 case SIDE_TYPE_ENUM_BITMAP
:
445 print_enum_bitmap(type_desc
, item
);
448 case SIDE_TYPE_FLOAT_BINARY16
:
449 tracer_print_basic_type_header(type_desc
);
451 printf("%g", (double) item
->u
.side_float_binary16
);
454 printf("ERROR: Unsupported binary16 float type\n");
457 case SIDE_TYPE_FLOAT_BINARY32
:
458 tracer_print_basic_type_header(type_desc
);
460 printf("%g", (double) item
->u
.side_float_binary32
);
463 printf("ERROR: Unsupported binary32 float type\n");
466 case SIDE_TYPE_FLOAT_BINARY64
:
467 tracer_print_basic_type_header(type_desc
);
469 printf("%g", (double) item
->u
.side_float_binary64
);
472 printf("ERROR: Unsupported binary64 float type\n");
475 case SIDE_TYPE_FLOAT_BINARY128
:
476 tracer_print_basic_type_header(type_desc
);
478 printf("%Lg", (long double) item
->u
.side_float_binary128
);
481 printf("ERROR: Unsupported binary128 float type\n");
484 case SIDE_TYPE_STRING
:
485 tracer_print_basic_type_header(type_desc
);
486 printf("\"%s\"", item
->u
.string
);
488 case SIDE_TYPE_STRUCT
:
489 tracer_print_struct(type_desc
, item
->u
.side_struct
);
491 case SIDE_TYPE_ARRAY
:
492 tracer_print_array(type_desc
, item
->u
.side_array
);
495 tracer_print_vla(type_desc
, item
->u
.side_vla
);
497 case SIDE_TYPE_VLA_VISITOR
:
498 tracer_print_vla_visitor(type_desc
, item
->u
.side_vla_app_visitor_ctx
);
500 case SIDE_TYPE_ARRAY_U8
:
501 case SIDE_TYPE_ARRAY_U16
:
502 case SIDE_TYPE_ARRAY_U32
:
503 case SIDE_TYPE_ARRAY_U64
:
504 case SIDE_TYPE_ARRAY_S8
:
505 case SIDE_TYPE_ARRAY_S16
:
506 case SIDE_TYPE_ARRAY_S32
:
507 case SIDE_TYPE_ARRAY_S64
:
508 case SIDE_TYPE_ARRAY_BLOB
:
509 tracer_print_array_fixint(type_desc
, item
);
511 case SIDE_TYPE_VLA_U8
:
512 case SIDE_TYPE_VLA_U16
:
513 case SIDE_TYPE_VLA_U32
:
514 case SIDE_TYPE_VLA_U64
:
515 case SIDE_TYPE_VLA_S8
:
516 case SIDE_TYPE_VLA_S16
:
517 case SIDE_TYPE_VLA_S32
:
518 case SIDE_TYPE_VLA_S64
:
519 case SIDE_TYPE_VLA_BLOB
:
520 tracer_print_vla_fixint(type_desc
, item
);
522 case SIDE_TYPE_DYNAMIC
:
523 tracer_print_basic_type_header(type_desc
);
524 tracer_print_dynamic(&item
->u
.dynamic
);
527 printf("<UNKNOWN TYPE>");
534 void tracer_print_field(const struct side_event_field
*item_desc
, const struct side_arg_vec
*item
)
536 printf("%s: ", item_desc
->field_name
);
537 tracer_print_type(&item_desc
->side_type
, item
);
541 void tracer_print_struct(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
543 const struct side_arg_vec
*sav
= sav_desc
->sav
;
544 uint32_t side_sav_len
= sav_desc
->len
;
547 if (type_desc
->u
.side_struct
->nr_fields
!= side_sav_len
) {
548 printf("ERROR: number of fields mismatch between description and arguments of structure\n");
551 print_attributes("attr: ", type_desc
->u
.side_struct
->attr
, type_desc
->u
.side_struct
->nr_attr
);
552 printf("%s", type_desc
->u
.side_struct
->nr_attr
? ", " : "");
553 printf("fields: { ");
554 for (i
= 0; i
< side_sav_len
; i
++) {
555 printf("%s", i
? ", " : "");
556 tracer_print_field(&type_desc
->u
.side_struct
->fields
[i
], &sav
[i
]);
562 void tracer_print_array(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
564 const struct side_arg_vec
*sav
= sav_desc
->sav
;
565 uint32_t side_sav_len
= sav_desc
->len
;
568 if (type_desc
->u
.side_array
.length
!= side_sav_len
) {
569 printf("ERROR: length mismatch between description and arguments of array\n");
572 print_attributes("attr: ", type_desc
->u
.side_array
.attr
, type_desc
->u
.side_array
.nr_attr
);
573 printf("%s", type_desc
->u
.side_array
.nr_attr
? ", " : "");
574 printf("elements: ");
576 for (i
= 0; i
< side_sav_len
; i
++) {
577 printf("%s", i
? ", " : "");
578 tracer_print_type(type_desc
->u
.side_array
.elem_type
, &sav
[i
]);
584 void tracer_print_vla(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
586 const struct side_arg_vec
*sav
= sav_desc
->sav
;
587 uint32_t side_sav_len
= sav_desc
->len
;
590 print_attributes("attr: ", type_desc
->u
.side_vla
.attr
, type_desc
->u
.side_vla
.nr_attr
);
591 printf("%s", type_desc
->u
.side_vla
.nr_attr
? ", " : "");
592 printf("elements: ");
594 for (i
= 0; i
< side_sav_len
; i
++) {
595 printf("%s", i
? ", " : "");
596 tracer_print_type(type_desc
->u
.side_vla
.elem_type
, &sav
[i
]);
601 struct tracer_visitor_priv
{
602 const struct side_type_description
*elem_type
;
607 enum side_visitor_status
tracer_write_elem_cb(const struct side_tracer_visitor_ctx
*tracer_ctx
,
608 const struct side_arg_vec
*elem
)
610 struct tracer_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
612 printf("%s", tracer_priv
->i
++ ? ", " : "");
613 tracer_print_type(tracer_priv
->elem_type
, elem
);
614 return SIDE_VISITOR_STATUS_OK
;
618 void tracer_print_vla_visitor(const struct side_type_description
*type_desc
, void *app_ctx
)
620 enum side_visitor_status status
;
621 struct tracer_visitor_priv tracer_priv
= {
622 .elem_type
= type_desc
->u
.side_vla_visitor
.elem_type
,
625 const struct side_tracer_visitor_ctx tracer_ctx
= {
626 .write_elem
= tracer_write_elem_cb
,
627 .priv
= &tracer_priv
,
630 print_attributes("attr: ", type_desc
->u
.side_vla_visitor
.attr
, type_desc
->u
.side_vla_visitor
.nr_attr
);
631 printf("%s", type_desc
->u
.side_vla_visitor
.nr_attr
? ", " : "");
632 printf("elements: ");
634 status
= type_desc
->u
.side_vla_visitor
.visitor(&tracer_ctx
, app_ctx
);
636 case SIDE_VISITOR_STATUS_OK
:
638 case SIDE_VISITOR_STATUS_ERROR
:
639 printf("ERROR: Visitor error\n");
645 void tracer_print_array_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_array
.elem_type
;
648 uint32_t side_sav_len
= type_desc
->u
.side_array
.length
;
649 void *p
= item
->u
.side_array_fixint
;
650 enum side_type side_type
;
653 print_attributes("attr: ", type_desc
->u
.side_array
.attr
, type_desc
->u
.side_array
.nr_attr
);
654 printf("%s", type_desc
->u
.side_array
.nr_attr
? ", " : "");
655 printf("elements: ");
656 switch (item
->type
) {
657 case SIDE_TYPE_ARRAY_U8
:
658 if (elem_type
->type
!= SIDE_TYPE_U8
)
661 case SIDE_TYPE_ARRAY_U16
:
662 if (elem_type
->type
!= SIDE_TYPE_U16
)
665 case SIDE_TYPE_ARRAY_U32
:
666 if (elem_type
->type
!= SIDE_TYPE_U32
)
669 case SIDE_TYPE_ARRAY_U64
:
670 if (elem_type
->type
!= SIDE_TYPE_U64
)
673 case SIDE_TYPE_ARRAY_S8
:
674 if (elem_type
->type
!= SIDE_TYPE_S8
)
677 case SIDE_TYPE_ARRAY_S16
:
678 if (elem_type
->type
!= SIDE_TYPE_S16
)
681 case SIDE_TYPE_ARRAY_S32
:
682 if (elem_type
->type
!= SIDE_TYPE_S32
)
685 case SIDE_TYPE_ARRAY_S64
:
686 if (elem_type
->type
!= SIDE_TYPE_S64
)
689 case SIDE_TYPE_ARRAY_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");
749 void tracer_print_vla_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
751 const struct side_type_description
*elem_type
= type_desc
->u
.side_vla
.elem_type
;
752 uint32_t side_sav_len
= item
->u
.side_vla_fixint
.length
;
753 void *p
= item
->u
.side_vla_fixint
.p
;
754 enum side_type side_type
;
757 print_attributes("attr: ", type_desc
->u
.side_vla
.attr
, type_desc
->u
.side_vla
.nr_attr
);
758 printf("%s", type_desc
->u
.side_vla
.nr_attr
? ", " : "");
759 printf("elements: ");
760 switch (item
->type
) {
761 case SIDE_TYPE_VLA_U8
:
762 if (elem_type
->type
!= SIDE_TYPE_U8
)
765 case SIDE_TYPE_VLA_U16
:
766 if (elem_type
->type
!= SIDE_TYPE_U16
)
769 case SIDE_TYPE_VLA_U32
:
770 if (elem_type
->type
!= SIDE_TYPE_U32
)
773 case SIDE_TYPE_VLA_U64
:
774 if (elem_type
->type
!= SIDE_TYPE_U64
)
777 case SIDE_TYPE_VLA_S8
:
778 if (elem_type
->type
!= SIDE_TYPE_S8
)
781 case SIDE_TYPE_VLA_S16
:
782 if (elem_type
->type
!= SIDE_TYPE_S16
)
785 case SIDE_TYPE_VLA_S32
:
786 if (elem_type
->type
!= SIDE_TYPE_S32
)
789 case SIDE_TYPE_VLA_S64
:
790 if (elem_type
->type
!= SIDE_TYPE_S64
)
793 case SIDE_TYPE_VLA_BLOB
:
794 if (elem_type
->type
!= SIDE_TYPE_BLOB
)
800 side_type
= elem_type
->type
;
803 for (i
= 0; i
< side_sav_len
; i
++) {
804 struct side_arg_vec sav_elem
= {
810 sav_elem
.u
.side_u8
= ((const uint8_t *) p
)[i
];
813 sav_elem
.u
.side_s8
= ((const int8_t *) p
)[i
];
816 sav_elem
.u
.side_u16
= ((const uint16_t *) p
)[i
];
819 sav_elem
.u
.side_s16
= ((const int16_t *) p
)[i
];
822 sav_elem
.u
.side_u32
= ((const uint32_t *) p
)[i
];
825 sav_elem
.u
.side_s32
= ((const int32_t *) p
)[i
];
828 sav_elem
.u
.side_u64
= ((const uint64_t *) p
)[i
];
831 sav_elem
.u
.side_s64
= ((const int64_t *) p
)[i
];
834 sav_elem
.u
.side_blob
= ((const uint8_t *) p
)[i
];
838 printf("ERROR: Unexpected type\n");
842 printf("%s", i
? ", " : "");
843 tracer_print_type(elem_type
, &sav_elem
);
849 printf("ERROR: type mismatch\n");
854 void tracer_print_dynamic_struct(const struct side_arg_dynamic_event_struct
*dynamic_struct
)
856 const struct side_arg_dynamic_event_field
*fields
= dynamic_struct
->fields
;
857 uint32_t len
= dynamic_struct
->len
;
860 print_attributes("attr:: ", dynamic_struct
->attr
, dynamic_struct
->nr_attr
);
861 printf("%s", dynamic_struct
->nr_attr
? ", " : "");
864 for (i
= 0; i
< len
; i
++) {
865 printf("%s", i
? ", " : "");
866 printf("%s:: ", fields
[i
].field_name
);
867 tracer_print_dynamic(&fields
[i
].elem
);
872 struct tracer_dynamic_struct_visitor_priv
{
877 enum side_visitor_status
tracer_dynamic_struct_write_elem_cb(
878 const struct side_tracer_dynamic_struct_visitor_ctx
*tracer_ctx
,
879 const struct side_arg_dynamic_event_field
*dynamic_field
)
881 struct tracer_dynamic_struct_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
883 printf("%s", tracer_priv
->i
++ ? ", " : "");
884 printf("%s:: ", dynamic_field
->field_name
);
885 tracer_print_dynamic(&dynamic_field
->elem
);
886 return SIDE_VISITOR_STATUS_OK
;
890 void tracer_print_dynamic_struct_visitor(const struct side_arg_dynamic_vec
*item
)
892 enum side_visitor_status status
;
893 struct tracer_dynamic_struct_visitor_priv tracer_priv
= {
896 const struct side_tracer_dynamic_struct_visitor_ctx tracer_ctx
= {
897 .write_field
= tracer_dynamic_struct_write_elem_cb
,
898 .priv
= &tracer_priv
,
900 void *app_ctx
= item
->u
.side_dynamic_struct_visitor
.app_ctx
;
902 print_attributes("attr:: ", item
->u
.side_dynamic_struct_visitor
.attr
, item
->u
.side_dynamic_struct_visitor
.nr_attr
);
903 printf("%s", item
->u
.side_dynamic_struct_visitor
.nr_attr
? ", " : "");
906 status
= item
->u
.side_dynamic_struct_visitor
.visitor(&tracer_ctx
, app_ctx
);
908 case SIDE_VISITOR_STATUS_OK
:
910 case SIDE_VISITOR_STATUS_ERROR
:
911 printf("ERROR: Visitor error\n");
918 void tracer_print_dynamic_vla(const struct side_arg_dynamic_vec_vla
*vla
)
920 const struct side_arg_dynamic_vec
*sav
= vla
->sav
;
921 uint32_t side_sav_len
= vla
->len
;
924 print_attributes("attr:: ", vla
->attr
, vla
->nr_attr
);
925 printf("%s", vla
->nr_attr
? ", " : "");
926 printf("elements:: ");
928 for (i
= 0; i
< side_sav_len
; i
++) {
929 printf("%s", i
? ", " : "");
930 tracer_print_dynamic(&sav
[i
]);
935 struct tracer_dynamic_vla_visitor_priv
{
940 enum side_visitor_status
tracer_dynamic_vla_write_elem_cb(
941 const struct side_tracer_dynamic_vla_visitor_ctx
*tracer_ctx
,
942 const struct side_arg_dynamic_vec
*elem
)
944 struct tracer_dynamic_vla_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
946 printf("%s", tracer_priv
->i
++ ? ", " : "");
947 tracer_print_dynamic(elem
);
948 return SIDE_VISITOR_STATUS_OK
;
952 void tracer_print_dynamic_vla_visitor(const struct side_arg_dynamic_vec
*item
)
954 enum side_visitor_status status
;
955 struct tracer_dynamic_vla_visitor_priv tracer_priv
= {
958 const struct side_tracer_dynamic_vla_visitor_ctx tracer_ctx
= {
959 .write_elem
= tracer_dynamic_vla_write_elem_cb
,
960 .priv
= &tracer_priv
,
962 void *app_ctx
= item
->u
.side_dynamic_vla_visitor
.app_ctx
;
964 print_attributes("attr:: ", item
->u
.side_dynamic_vla_visitor
.attr
, item
->u
.side_dynamic_vla_visitor
.nr_attr
);
965 printf("%s", item
->u
.side_dynamic_vla_visitor
.nr_attr
? ", " : "");
966 printf("elements:: ");
968 status
= item
->u
.side_dynamic_vla_visitor
.visitor(&tracer_ctx
, app_ctx
);
970 case SIDE_VISITOR_STATUS_OK
:
972 case SIDE_VISITOR_STATUS_ERROR
:
973 printf("ERROR: Visitor error\n");
980 void tracer_print_dynamic_basic_type_header(const struct side_arg_dynamic_vec
*item
)
982 print_attributes("attr:: ", item
->u
.side_basic
.attr
, item
->u
.side_basic
.nr_attr
);
983 printf("%s", item
->u
.side_basic
.nr_attr
? ", " : "");
988 void tracer_print_dynamic(const struct side_arg_dynamic_vec
*item
)
991 switch (item
->dynamic_type
) {
992 case SIDE_DYNAMIC_TYPE_NULL
:
993 tracer_print_dynamic_basic_type_header(item
);
994 printf("<NULL TYPE>");
996 case SIDE_DYNAMIC_TYPE_BOOL
:
997 tracer_print_dynamic_basic_type_header(item
);
998 printf("%s", item
->u
.side_basic
.u
.side_bool
? "true" : "false");
1000 case SIDE_DYNAMIC_TYPE_U8
:
1001 tracer_print_dynamic_basic_type_header(item
);
1002 printf("%" PRIu8
, item
->u
.side_basic
.u
.side_u8
);
1004 case SIDE_DYNAMIC_TYPE_U16
:
1005 tracer_print_dynamic_basic_type_header(item
);
1006 printf("%" PRIu16
, item
->u
.side_basic
.u
.side_u16
);
1008 case SIDE_DYNAMIC_TYPE_U32
:
1009 tracer_print_dynamic_basic_type_header(item
);
1010 printf("%" PRIu32
, item
->u
.side_basic
.u
.side_u32
);
1012 case SIDE_DYNAMIC_TYPE_U64
:
1013 tracer_print_dynamic_basic_type_header(item
);
1014 printf("%" PRIu64
, item
->u
.side_basic
.u
.side_u64
);
1016 case SIDE_DYNAMIC_TYPE_S8
:
1017 tracer_print_dynamic_basic_type_header(item
);
1018 printf("%" PRId8
, item
->u
.side_basic
.u
.side_s8
);
1020 case SIDE_DYNAMIC_TYPE_S16
:
1021 tracer_print_dynamic_basic_type_header(item
);
1022 printf("%" PRId16
, item
->u
.side_basic
.u
.side_s16
);
1024 case SIDE_DYNAMIC_TYPE_S32
:
1025 tracer_print_dynamic_basic_type_header(item
);
1026 printf("%" PRId32
, item
->u
.side_basic
.u
.side_s32
);
1028 case SIDE_DYNAMIC_TYPE_S64
:
1029 tracer_print_dynamic_basic_type_header(item
);
1030 printf("%" PRId64
, item
->u
.side_basic
.u
.side_s64
);
1032 case SIDE_DYNAMIC_TYPE_BLOB
:
1033 tracer_print_dynamic_basic_type_header(item
);
1034 printf("0x%" PRIx8
, item
->u
.side_basic
.u
.side_blob
);
1037 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY16
:
1038 tracer_print_dynamic_basic_type_header(item
);
1040 printf("%g", (double) item
->u
.side_basic
.u
.side_float_binary16
);
1043 printf("ERROR: Unsupported binary16 float type\n");
1046 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY32
:
1047 tracer_print_dynamic_basic_type_header(item
);
1049 printf("%g", (double) item
->u
.side_basic
.u
.side_float_binary32
);
1052 printf("ERROR: Unsupported binary32 float type\n");
1055 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY64
:
1056 tracer_print_dynamic_basic_type_header(item
);
1058 printf("%g", (double) item
->u
.side_basic
.u
.side_float_binary64
);
1061 printf("ERROR: Unsupported binary64 float type\n");
1064 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY128
:
1065 tracer_print_dynamic_basic_type_header(item
);
1067 printf("%Lg", (long double) item
->u
.side_basic
.u
.side_float_binary128
);
1070 printf("ERROR: Unsupported binary128 float type\n");
1073 case SIDE_DYNAMIC_TYPE_STRING
:
1074 tracer_print_dynamic_basic_type_header(item
);
1075 printf("\"%s\"", item
->u
.side_basic
.u
.string
);
1077 case SIDE_DYNAMIC_TYPE_STRUCT
:
1078 tracer_print_dynamic_struct(item
->u
.side_dynamic_struct
);
1080 case SIDE_DYNAMIC_TYPE_STRUCT_VISITOR
:
1081 tracer_print_dynamic_struct_visitor(item
);
1083 case SIDE_DYNAMIC_TYPE_VLA
:
1084 tracer_print_dynamic_vla(item
->u
.side_dynamic_vla
);
1086 case SIDE_DYNAMIC_TYPE_VLA_VISITOR
:
1087 tracer_print_dynamic_vla_visitor(item
);
1090 printf("<UNKNOWN TYPE>");
1097 void tracer_print_static_fields(const struct side_event_description
*desc
,
1098 const struct side_arg_vec_description
*sav_desc
,
1101 const struct side_arg_vec
*sav
= sav_desc
->sav
;
1102 uint32_t side_sav_len
= sav_desc
->len
;
1105 printf("provider: %s, event: %s", desc
->provider_name
, desc
->event_name
);
1106 if (desc
->nr_fields
!= side_sav_len
) {
1107 printf("ERROR: number of fields mismatch between description and arguments\n");
1110 print_attributes(", attributes: ", desc
->attr
, desc
->nr_attr
);
1111 printf("%s", side_sav_len
? ", fields: [ " : "");
1112 for (i
= 0; i
< side_sav_len
; i
++) {
1113 printf("%s", i
? ", " : "");
1114 tracer_print_field(&desc
->fields
[i
], &sav
[i
]);
1122 void tracer_call(const struct side_event_description
*desc
,
1123 const struct side_arg_vec_description
*sav_desc
,
1124 void *priv
__attribute__((unused
)))
1128 tracer_print_static_fields(desc
, sav_desc
, &nr_fields
);
1132 void tracer_call_variadic(const struct side_event_description
*desc
,
1133 const struct side_arg_vec_description
*sav_desc
,
1134 const struct side_arg_dynamic_event_struct
*var_struct
,
1135 void *priv
__attribute__((unused
)))
1137 uint32_t var_struct_len
= var_struct
->len
;
1138 int nr_fields
= 0, i
;
1140 tracer_print_static_fields(desc
, sav_desc
, &nr_fields
);
1142 if (side_unlikely(!(desc
->flags
& SIDE_EVENT_FLAG_VARIADIC
))) {
1143 printf("ERROR: unexpected non-variadic event description\n");
1146 printf("%s", var_struct
->nr_attr
&& nr_fields
? ", " : "");
1147 print_attributes("attributes:: ", var_struct
->attr
, var_struct
->nr_attr
);
1148 printf("%s", var_struct_len
&& (nr_fields
|| var_struct
->nr_attr
) ? ", fields:: [ " : "");
1149 for (i
= 0; i
< var_struct_len
; i
++, nr_fields
++) {
1150 printf("%s", i
? ", " : "");
1151 printf("%s:: ", var_struct
->fields
[i
].field_name
);
1152 tracer_print_dynamic(&var_struct
->fields
[i
].elem
);