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
) {
188 case SIDE_TYPE_U8
: /* Fall-through */
202 printf("ERROR: Unexpected enum element type\n");
209 void print_enum_bitmap(const struct side_type_description
*type_desc
,
210 const struct side_arg_vec
*item
)
212 const struct side_type_description
*elem_type
= type_desc
->u
.side_enum_bitmap
.elem_type
;
213 const struct side_enum_bitmap_mappings
*side_enum_mappings
= type_desc
->u
.side_enum_bitmap
.mappings
;
214 int i
, print_count
= 0;
215 uint32_t stride_bit
, nr_items
;
216 const struct side_arg_vec
*array_item
;
218 switch (elem_type
->type
) {
219 case SIDE_TYPE_U8
: /* Fall-through */
220 case SIDE_TYPE_BYTE
: /* Fall-through */
221 case SIDE_TYPE_U16
: /* Fall-through */
222 case SIDE_TYPE_U32
: /* Fall-through */
224 stride_bit
= enum_elem_type_to_stride(elem_type
);
228 case SIDE_TYPE_ARRAY
:
229 stride_bit
= enum_elem_type_to_stride(elem_type
->u
.side_array
.elem_type
);
230 array_item
= item
->u
.side_array
->sav
;
231 nr_items
= type_desc
->u
.side_array
.length
;
234 stride_bit
= enum_elem_type_to_stride(elem_type
->u
.side_vla
.elem_type
);
235 array_item
= item
->u
.side_vla
->sav
;
236 nr_items
= item
->u
.side_vla
->len
;
239 printf("ERROR: Unexpected enum element type\n");
243 print_attributes("attr: ", side_enum_mappings
->attr
, side_enum_mappings
->nr_attr
);
244 printf("%s", side_enum_mappings
->nr_attr
? ", " : "");
245 printf("labels: [ ");
246 for (i
= 0; i
< side_enum_mappings
->nr_mappings
; i
++) {
247 const struct side_enum_bitmap_mapping
*mapping
= &side_enum_mappings
->mappings
[i
];
251 if (mapping
->range_begin
< 0 || mapping
->range_end
< mapping
->range_begin
) {
252 printf("ERROR: Unexpected enum bitmap range: %" PRIu64
"-%" PRIu64
"\n",
253 mapping
->range_begin
, mapping
->range_end
);
256 for (bit
= mapping
->range_begin
; bit
<= mapping
->range_end
; bit
++) {
257 if (bit
> (nr_items
* stride_bit
) - 1)
259 switch (stride_bit
) {
262 uint8_t v
= array_item
[bit
/ 8].u
.side_u8
;
263 if (v
& (1ULL << (bit
% 8))) {
271 uint16_t v
= array_item
[bit
/ 16].u
.side_u16
;
272 if (v
& (1ULL << (bit
% 16))) {
280 uint32_t v
= array_item
[bit
/ 32].u
.side_u32
;
281 if (v
& (1ULL << (bit
% 32))) {
289 uint64_t v
= array_item
[bit
/ 64].u
.side_u64
;
290 if (v
& (1ULL << (bit
% 64))) {
302 printf("%s", print_count
++ ? ", " : "");
303 printf("\"%s\"", mapping
->label
);
307 printf("<NO LABEL>");
312 void tracer_print_basic_type_header(const struct side_type_description
*type_desc
)
314 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
315 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
320 void tracer_print_type(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
324 switch (type_desc
->type
) {
325 case SIDE_TYPE_ARRAY
:
326 switch (item
->type
) {
327 case SIDE_TYPE_ARRAY_U8
:
328 case SIDE_TYPE_ARRAY_U16
:
329 case SIDE_TYPE_ARRAY_U32
:
330 case SIDE_TYPE_ARRAY_U64
:
331 case SIDE_TYPE_ARRAY_S8
:
332 case SIDE_TYPE_ARRAY_S16
:
333 case SIDE_TYPE_ARRAY_S32
:
334 case SIDE_TYPE_ARRAY_S64
:
335 case SIDE_TYPE_ARRAY_BYTE
:
336 case SIDE_TYPE_ARRAY
:
339 printf("ERROR: type mismatch between description and arguments\n");
346 switch (item
->type
) {
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_BYTE
:
359 printf("ERROR: type mismatch between description and arguments\n");
366 switch (item
->type
) {
377 printf("ERROR: type mismatch between description and arguments\n");
383 case SIDE_TYPE_ENUM_BITMAP
:
384 switch (item
->type
) {
390 case SIDE_TYPE_ARRAY
:
394 printf("ERROR: type mismatch between description and arguments\n");
401 if (type_desc
->type
!= item
->type
) {
402 printf("ERROR: type mismatch between description and arguments\n");
408 if (type_desc
->type
== SIDE_TYPE_ENUM
|| type_desc
->type
== SIDE_TYPE_ENUM_BITMAP
)
409 type
= type_desc
->type
;
416 tracer_print_basic_type_header(type_desc
);
417 printf("%s", item
->u
.side_bool
? "true" : "false");
420 tracer_print_basic_type_header(type_desc
);
421 printf("%" PRIu8
, item
->u
.side_u8
);
424 tracer_print_basic_type_header(type_desc
);
425 printf("%" PRIu16
, item
->u
.side_u16
);
428 tracer_print_basic_type_header(type_desc
);
429 printf("%" PRIu32
, item
->u
.side_u32
);
432 tracer_print_basic_type_header(type_desc
);
433 printf("%" PRIu64
, item
->u
.side_u64
);
436 tracer_print_basic_type_header(type_desc
);
437 printf("%" PRId8
, item
->u
.side_s8
);
440 tracer_print_basic_type_header(type_desc
);
441 printf("%" PRId16
, item
->u
.side_s16
);
444 tracer_print_basic_type_header(type_desc
);
445 printf("%" PRId32
, item
->u
.side_s32
);
448 tracer_print_basic_type_header(type_desc
);
449 printf("%" PRId64
, item
->u
.side_s64
);
452 tracer_print_basic_type_header(type_desc
);
453 printf("0x%" PRIx8
, item
->u
.side_byte
);
457 print_enum(type_desc
, item
);
460 case SIDE_TYPE_ENUM_BITMAP
:
461 print_enum_bitmap(type_desc
, item
);
464 case SIDE_TYPE_FLOAT_BINARY16
:
465 tracer_print_basic_type_header(type_desc
);
467 printf("%g", (double) item
->u
.side_float_binary16
);
470 printf("ERROR: Unsupported binary16 float type\n");
473 case SIDE_TYPE_FLOAT_BINARY32
:
474 tracer_print_basic_type_header(type_desc
);
476 printf("%g", (double) item
->u
.side_float_binary32
);
479 printf("ERROR: Unsupported binary32 float type\n");
482 case SIDE_TYPE_FLOAT_BINARY64
:
483 tracer_print_basic_type_header(type_desc
);
485 printf("%g", (double) item
->u
.side_float_binary64
);
488 printf("ERROR: Unsupported binary64 float type\n");
491 case SIDE_TYPE_FLOAT_BINARY128
:
492 tracer_print_basic_type_header(type_desc
);
494 printf("%Lg", (long double) item
->u
.side_float_binary128
);
497 printf("ERROR: Unsupported binary128 float type\n");
500 case SIDE_TYPE_STRING
:
501 tracer_print_basic_type_header(type_desc
);
502 printf("\"%s\"", item
->u
.string
);
504 case SIDE_TYPE_STRUCT
:
505 tracer_print_struct(type_desc
, item
->u
.side_struct
);
507 case SIDE_TYPE_ARRAY
:
508 tracer_print_array(type_desc
, item
->u
.side_array
);
511 tracer_print_vla(type_desc
, item
->u
.side_vla
);
513 case SIDE_TYPE_VLA_VISITOR
:
514 tracer_print_vla_visitor(type_desc
, item
->u
.side_vla_app_visitor_ctx
);
516 case SIDE_TYPE_ARRAY_U8
:
517 case SIDE_TYPE_ARRAY_U16
:
518 case SIDE_TYPE_ARRAY_U32
:
519 case SIDE_TYPE_ARRAY_U64
:
520 case SIDE_TYPE_ARRAY_S8
:
521 case SIDE_TYPE_ARRAY_S16
:
522 case SIDE_TYPE_ARRAY_S32
:
523 case SIDE_TYPE_ARRAY_S64
:
524 case SIDE_TYPE_ARRAY_BYTE
:
525 tracer_print_array_fixint(type_desc
, item
);
527 case SIDE_TYPE_VLA_U8
:
528 case SIDE_TYPE_VLA_U16
:
529 case SIDE_TYPE_VLA_U32
:
530 case SIDE_TYPE_VLA_U64
:
531 case SIDE_TYPE_VLA_S8
:
532 case SIDE_TYPE_VLA_S16
:
533 case SIDE_TYPE_VLA_S32
:
534 case SIDE_TYPE_VLA_S64
:
535 case SIDE_TYPE_VLA_BYTE
:
536 tracer_print_vla_fixint(type_desc
, item
);
538 case SIDE_TYPE_DYNAMIC
:
539 tracer_print_basic_type_header(type_desc
);
540 tracer_print_dynamic(&item
->u
.dynamic
);
543 printf("<UNKNOWN TYPE>");
550 void tracer_print_field(const struct side_event_field
*item_desc
, const struct side_arg_vec
*item
)
552 printf("%s: ", item_desc
->field_name
);
553 tracer_print_type(&item_desc
->side_type
, item
);
557 void tracer_print_struct(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
559 const struct side_arg_vec
*sav
= sav_desc
->sav
;
560 uint32_t side_sav_len
= sav_desc
->len
;
563 if (type_desc
->u
.side_struct
->nr_fields
!= side_sav_len
) {
564 printf("ERROR: number of fields mismatch between description and arguments of structure\n");
567 print_attributes("attr: ", type_desc
->u
.side_struct
->attr
, type_desc
->u
.side_struct
->nr_attr
);
568 printf("%s", type_desc
->u
.side_struct
->nr_attr
? ", " : "");
569 printf("fields: { ");
570 for (i
= 0; i
< side_sav_len
; i
++) {
571 printf("%s", i
? ", " : "");
572 tracer_print_field(&type_desc
->u
.side_struct
->fields
[i
], &sav
[i
]);
578 void tracer_print_array(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
580 const struct side_arg_vec
*sav
= sav_desc
->sav
;
581 uint32_t side_sav_len
= sav_desc
->len
;
584 if (type_desc
->u
.side_array
.length
!= side_sav_len
) {
585 printf("ERROR: length mismatch between description and arguments of array\n");
588 print_attributes("attr: ", type_desc
->u
.side_array
.attr
, type_desc
->u
.side_array
.nr_attr
);
589 printf("%s", type_desc
->u
.side_array
.nr_attr
? ", " : "");
590 printf("elements: ");
592 for (i
= 0; i
< side_sav_len
; i
++) {
593 printf("%s", i
? ", " : "");
594 tracer_print_type(type_desc
->u
.side_array
.elem_type
, &sav
[i
]);
600 void tracer_print_vla(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
602 const struct side_arg_vec
*sav
= sav_desc
->sav
;
603 uint32_t side_sav_len
= sav_desc
->len
;
606 print_attributes("attr: ", type_desc
->u
.side_vla
.attr
, type_desc
->u
.side_vla
.nr_attr
);
607 printf("%s", type_desc
->u
.side_vla
.nr_attr
? ", " : "");
608 printf("elements: ");
610 for (i
= 0; i
< side_sav_len
; i
++) {
611 printf("%s", i
? ", " : "");
612 tracer_print_type(type_desc
->u
.side_vla
.elem_type
, &sav
[i
]);
617 struct tracer_visitor_priv
{
618 const struct side_type_description
*elem_type
;
623 enum side_visitor_status
tracer_write_elem_cb(const struct side_tracer_visitor_ctx
*tracer_ctx
,
624 const struct side_arg_vec
*elem
)
626 struct tracer_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
628 printf("%s", tracer_priv
->i
++ ? ", " : "");
629 tracer_print_type(tracer_priv
->elem_type
, elem
);
630 return SIDE_VISITOR_STATUS_OK
;
634 void tracer_print_vla_visitor(const struct side_type_description
*type_desc
, void *app_ctx
)
636 enum side_visitor_status status
;
637 struct tracer_visitor_priv tracer_priv
= {
638 .elem_type
= type_desc
->u
.side_vla_visitor
.elem_type
,
641 const struct side_tracer_visitor_ctx tracer_ctx
= {
642 .write_elem
= tracer_write_elem_cb
,
643 .priv
= &tracer_priv
,
646 print_attributes("attr: ", type_desc
->u
.side_vla_visitor
.attr
, type_desc
->u
.side_vla_visitor
.nr_attr
);
647 printf("%s", type_desc
->u
.side_vla_visitor
.nr_attr
? ", " : "");
648 printf("elements: ");
650 status
= type_desc
->u
.side_vla_visitor
.visitor(&tracer_ctx
, app_ctx
);
652 case SIDE_VISITOR_STATUS_OK
:
654 case SIDE_VISITOR_STATUS_ERROR
:
655 printf("ERROR: Visitor error\n");
661 void tracer_print_array_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
663 const struct side_type_description
*elem_type
= type_desc
->u
.side_array
.elem_type
;
664 uint32_t side_sav_len
= type_desc
->u
.side_array
.length
;
665 void *p
= item
->u
.side_array_fixint
;
666 enum side_type side_type
;
669 print_attributes("attr: ", type_desc
->u
.side_array
.attr
, type_desc
->u
.side_array
.nr_attr
);
670 printf("%s", type_desc
->u
.side_array
.nr_attr
? ", " : "");
671 printf("elements: ");
672 switch (item
->type
) {
673 case SIDE_TYPE_ARRAY_U8
:
674 if (elem_type
->type
!= SIDE_TYPE_U8
)
677 case SIDE_TYPE_ARRAY_U16
:
678 if (elem_type
->type
!= SIDE_TYPE_U16
)
681 case SIDE_TYPE_ARRAY_U32
:
682 if (elem_type
->type
!= SIDE_TYPE_U32
)
685 case SIDE_TYPE_ARRAY_U64
:
686 if (elem_type
->type
!= SIDE_TYPE_U64
)
689 case SIDE_TYPE_ARRAY_S8
:
690 if (elem_type
->type
!= SIDE_TYPE_S8
)
693 case SIDE_TYPE_ARRAY_S16
:
694 if (elem_type
->type
!= SIDE_TYPE_S16
)
697 case SIDE_TYPE_ARRAY_S32
:
698 if (elem_type
->type
!= SIDE_TYPE_S32
)
701 case SIDE_TYPE_ARRAY_S64
:
702 if (elem_type
->type
!= SIDE_TYPE_S64
)
705 case SIDE_TYPE_ARRAY_BYTE
:
706 if (elem_type
->type
!= SIDE_TYPE_BYTE
)
712 side_type
= elem_type
->type
;
715 for (i
= 0; i
< side_sav_len
; i
++) {
716 struct side_arg_vec sav_elem
= {
722 sav_elem
.u
.side_u8
= ((const uint8_t *) p
)[i
];
725 sav_elem
.u
.side_s8
= ((const int8_t *) p
)[i
];
728 sav_elem
.u
.side_u16
= ((const uint16_t *) p
)[i
];
731 sav_elem
.u
.side_s16
= ((const int16_t *) p
)[i
];
734 sav_elem
.u
.side_u32
= ((const uint32_t *) p
)[i
];
737 sav_elem
.u
.side_s32
= ((const int32_t *) p
)[i
];
740 sav_elem
.u
.side_u64
= ((const uint64_t *) p
)[i
];
743 sav_elem
.u
.side_s64
= ((const int64_t *) p
)[i
];
746 sav_elem
.u
.side_byte
= ((const uint8_t *) p
)[i
];
750 printf("ERROR: Unexpected type\n");
754 printf("%s", i
? ", " : "");
755 tracer_print_type(elem_type
, &sav_elem
);
761 printf("ERROR: type mismatch\n");
765 void tracer_print_vla_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
767 const struct side_type_description
*elem_type
= type_desc
->u
.side_vla
.elem_type
;
768 uint32_t side_sav_len
= item
->u
.side_vla_fixint
.length
;
769 void *p
= item
->u
.side_vla_fixint
.p
;
770 enum side_type side_type
;
773 print_attributes("attr: ", type_desc
->u
.side_vla
.attr
, type_desc
->u
.side_vla
.nr_attr
);
774 printf("%s", type_desc
->u
.side_vla
.nr_attr
? ", " : "");
775 printf("elements: ");
776 switch (item
->type
) {
777 case SIDE_TYPE_VLA_U8
:
778 if (elem_type
->type
!= SIDE_TYPE_U8
)
781 case SIDE_TYPE_VLA_U16
:
782 if (elem_type
->type
!= SIDE_TYPE_U16
)
785 case SIDE_TYPE_VLA_U32
:
786 if (elem_type
->type
!= SIDE_TYPE_U32
)
789 case SIDE_TYPE_VLA_U64
:
790 if (elem_type
->type
!= SIDE_TYPE_U64
)
793 case SIDE_TYPE_VLA_S8
:
794 if (elem_type
->type
!= SIDE_TYPE_S8
)
797 case SIDE_TYPE_VLA_S16
:
798 if (elem_type
->type
!= SIDE_TYPE_S16
)
801 case SIDE_TYPE_VLA_S32
:
802 if (elem_type
->type
!= SIDE_TYPE_S32
)
805 case SIDE_TYPE_VLA_S64
:
806 if (elem_type
->type
!= SIDE_TYPE_S64
)
809 case SIDE_TYPE_VLA_BYTE
:
810 if (elem_type
->type
!= SIDE_TYPE_BYTE
)
816 side_type
= elem_type
->type
;
819 for (i
= 0; i
< side_sav_len
; i
++) {
820 struct side_arg_vec sav_elem
= {
826 sav_elem
.u
.side_u8
= ((const uint8_t *) p
)[i
];
829 sav_elem
.u
.side_s8
= ((const int8_t *) p
)[i
];
832 sav_elem
.u
.side_u16
= ((const uint16_t *) p
)[i
];
835 sav_elem
.u
.side_s16
= ((const int16_t *) p
)[i
];
838 sav_elem
.u
.side_u32
= ((const uint32_t *) p
)[i
];
841 sav_elem
.u
.side_s32
= ((const int32_t *) p
)[i
];
844 sav_elem
.u
.side_u64
= ((const uint64_t *) p
)[i
];
847 sav_elem
.u
.side_s64
= ((const int64_t *) p
)[i
];
850 sav_elem
.u
.side_byte
= ((const uint8_t *) p
)[i
];
854 printf("ERROR: Unexpected type\n");
858 printf("%s", i
? ", " : "");
859 tracer_print_type(elem_type
, &sav_elem
);
865 printf("ERROR: type mismatch\n");
870 void tracer_print_dynamic_struct(const struct side_arg_dynamic_event_struct
*dynamic_struct
)
872 const struct side_arg_dynamic_event_field
*fields
= dynamic_struct
->fields
;
873 uint32_t len
= dynamic_struct
->len
;
876 print_attributes("attr:: ", dynamic_struct
->attr
, dynamic_struct
->nr_attr
);
877 printf("%s", dynamic_struct
->nr_attr
? ", " : "");
880 for (i
= 0; i
< len
; i
++) {
881 printf("%s", i
? ", " : "");
882 printf("%s:: ", fields
[i
].field_name
);
883 tracer_print_dynamic(&fields
[i
].elem
);
888 struct tracer_dynamic_struct_visitor_priv
{
893 enum side_visitor_status
tracer_dynamic_struct_write_elem_cb(
894 const struct side_tracer_dynamic_struct_visitor_ctx
*tracer_ctx
,
895 const struct side_arg_dynamic_event_field
*dynamic_field
)
897 struct tracer_dynamic_struct_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
899 printf("%s", tracer_priv
->i
++ ? ", " : "");
900 printf("%s:: ", dynamic_field
->field_name
);
901 tracer_print_dynamic(&dynamic_field
->elem
);
902 return SIDE_VISITOR_STATUS_OK
;
906 void tracer_print_dynamic_struct_visitor(const struct side_arg_dynamic_vec
*item
)
908 enum side_visitor_status status
;
909 struct tracer_dynamic_struct_visitor_priv tracer_priv
= {
912 const struct side_tracer_dynamic_struct_visitor_ctx tracer_ctx
= {
913 .write_field
= tracer_dynamic_struct_write_elem_cb
,
914 .priv
= &tracer_priv
,
916 void *app_ctx
= item
->u
.side_dynamic_struct_visitor
.app_ctx
;
918 print_attributes("attr:: ", item
->u
.side_dynamic_struct_visitor
.attr
, item
->u
.side_dynamic_struct_visitor
.nr_attr
);
919 printf("%s", item
->u
.side_dynamic_struct_visitor
.nr_attr
? ", " : "");
922 status
= item
->u
.side_dynamic_struct_visitor
.visitor(&tracer_ctx
, app_ctx
);
924 case SIDE_VISITOR_STATUS_OK
:
926 case SIDE_VISITOR_STATUS_ERROR
:
927 printf("ERROR: Visitor error\n");
934 void tracer_print_dynamic_vla(const struct side_arg_dynamic_vec_vla
*vla
)
936 const struct side_arg_dynamic_vec
*sav
= vla
->sav
;
937 uint32_t side_sav_len
= vla
->len
;
940 print_attributes("attr:: ", vla
->attr
, vla
->nr_attr
);
941 printf("%s", vla
->nr_attr
? ", " : "");
942 printf("elements:: ");
944 for (i
= 0; i
< side_sav_len
; i
++) {
945 printf("%s", i
? ", " : "");
946 tracer_print_dynamic(&sav
[i
]);
951 struct tracer_dynamic_vla_visitor_priv
{
956 enum side_visitor_status
tracer_dynamic_vla_write_elem_cb(
957 const struct side_tracer_dynamic_vla_visitor_ctx
*tracer_ctx
,
958 const struct side_arg_dynamic_vec
*elem
)
960 struct tracer_dynamic_vla_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
962 printf("%s", tracer_priv
->i
++ ? ", " : "");
963 tracer_print_dynamic(elem
);
964 return SIDE_VISITOR_STATUS_OK
;
968 void tracer_print_dynamic_vla_visitor(const struct side_arg_dynamic_vec
*item
)
970 enum side_visitor_status status
;
971 struct tracer_dynamic_vla_visitor_priv tracer_priv
= {
974 const struct side_tracer_dynamic_vla_visitor_ctx tracer_ctx
= {
975 .write_elem
= tracer_dynamic_vla_write_elem_cb
,
976 .priv
= &tracer_priv
,
978 void *app_ctx
= item
->u
.side_dynamic_vla_visitor
.app_ctx
;
980 print_attributes("attr:: ", item
->u
.side_dynamic_vla_visitor
.attr
, item
->u
.side_dynamic_vla_visitor
.nr_attr
);
981 printf("%s", item
->u
.side_dynamic_vla_visitor
.nr_attr
? ", " : "");
982 printf("elements:: ");
984 status
= item
->u
.side_dynamic_vla_visitor
.visitor(&tracer_ctx
, app_ctx
);
986 case SIDE_VISITOR_STATUS_OK
:
988 case SIDE_VISITOR_STATUS_ERROR
:
989 printf("ERROR: Visitor error\n");
996 void tracer_print_dynamic_basic_type_header(const struct side_arg_dynamic_vec
*item
)
998 print_attributes("attr:: ", item
->u
.side_basic
.attr
, item
->u
.side_basic
.nr_attr
);
999 printf("%s", item
->u
.side_basic
.nr_attr
? ", " : "");
1004 void tracer_print_dynamic(const struct side_arg_dynamic_vec
*item
)
1007 switch (item
->dynamic_type
) {
1008 case SIDE_DYNAMIC_TYPE_NULL
:
1009 tracer_print_dynamic_basic_type_header(item
);
1010 printf("<NULL TYPE>");
1012 case SIDE_DYNAMIC_TYPE_BOOL
:
1013 tracer_print_dynamic_basic_type_header(item
);
1014 printf("%s", item
->u
.side_basic
.u
.side_bool
? "true" : "false");
1016 case SIDE_DYNAMIC_TYPE_U8
:
1017 tracer_print_dynamic_basic_type_header(item
);
1018 printf("%" PRIu8
, item
->u
.side_basic
.u
.side_u8
);
1020 case SIDE_DYNAMIC_TYPE_U16
:
1021 tracer_print_dynamic_basic_type_header(item
);
1022 printf("%" PRIu16
, item
->u
.side_basic
.u
.side_u16
);
1024 case SIDE_DYNAMIC_TYPE_U32
:
1025 tracer_print_dynamic_basic_type_header(item
);
1026 printf("%" PRIu32
, item
->u
.side_basic
.u
.side_u32
);
1028 case SIDE_DYNAMIC_TYPE_U64
:
1029 tracer_print_dynamic_basic_type_header(item
);
1030 printf("%" PRIu64
, item
->u
.side_basic
.u
.side_u64
);
1032 case SIDE_DYNAMIC_TYPE_S8
:
1033 tracer_print_dynamic_basic_type_header(item
);
1034 printf("%" PRId8
, item
->u
.side_basic
.u
.side_s8
);
1036 case SIDE_DYNAMIC_TYPE_S16
:
1037 tracer_print_dynamic_basic_type_header(item
);
1038 printf("%" PRId16
, item
->u
.side_basic
.u
.side_s16
);
1040 case SIDE_DYNAMIC_TYPE_S32
:
1041 tracer_print_dynamic_basic_type_header(item
);
1042 printf("%" PRId32
, item
->u
.side_basic
.u
.side_s32
);
1044 case SIDE_DYNAMIC_TYPE_S64
:
1045 tracer_print_dynamic_basic_type_header(item
);
1046 printf("%" PRId64
, item
->u
.side_basic
.u
.side_s64
);
1048 case SIDE_DYNAMIC_TYPE_BYTE
:
1049 tracer_print_dynamic_basic_type_header(item
);
1050 printf("0x%" PRIx8
, item
->u
.side_basic
.u
.side_byte
);
1053 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY16
:
1054 tracer_print_dynamic_basic_type_header(item
);
1056 printf("%g", (double) item
->u
.side_basic
.u
.side_float_binary16
);
1059 printf("ERROR: Unsupported binary16 float type\n");
1062 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY32
:
1063 tracer_print_dynamic_basic_type_header(item
);
1065 printf("%g", (double) item
->u
.side_basic
.u
.side_float_binary32
);
1068 printf("ERROR: Unsupported binary32 float type\n");
1071 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY64
:
1072 tracer_print_dynamic_basic_type_header(item
);
1074 printf("%g", (double) item
->u
.side_basic
.u
.side_float_binary64
);
1077 printf("ERROR: Unsupported binary64 float type\n");
1080 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY128
:
1081 tracer_print_dynamic_basic_type_header(item
);
1083 printf("%Lg", (long double) item
->u
.side_basic
.u
.side_float_binary128
);
1086 printf("ERROR: Unsupported binary128 float type\n");
1089 case SIDE_DYNAMIC_TYPE_STRING
:
1090 tracer_print_dynamic_basic_type_header(item
);
1091 printf("\"%s\"", item
->u
.side_basic
.u
.string
);
1093 case SIDE_DYNAMIC_TYPE_STRUCT
:
1094 tracer_print_dynamic_struct(item
->u
.side_dynamic_struct
);
1096 case SIDE_DYNAMIC_TYPE_STRUCT_VISITOR
:
1097 tracer_print_dynamic_struct_visitor(item
);
1099 case SIDE_DYNAMIC_TYPE_VLA
:
1100 tracer_print_dynamic_vla(item
->u
.side_dynamic_vla
);
1102 case SIDE_DYNAMIC_TYPE_VLA_VISITOR
:
1103 tracer_print_dynamic_vla_visitor(item
);
1106 printf("<UNKNOWN TYPE>");
1113 void tracer_print_static_fields(const struct side_event_description
*desc
,
1114 const struct side_arg_vec_description
*sav_desc
,
1117 const struct side_arg_vec
*sav
= sav_desc
->sav
;
1118 uint32_t side_sav_len
= sav_desc
->len
;
1121 printf("provider: %s, event: %s", desc
->provider_name
, desc
->event_name
);
1122 if (desc
->nr_fields
!= side_sav_len
) {
1123 printf("ERROR: number of fields mismatch between description and arguments\n");
1126 print_attributes(", attributes: ", desc
->attr
, desc
->nr_attr
);
1127 printf("%s", side_sav_len
? ", fields: [ " : "");
1128 for (i
= 0; i
< side_sav_len
; i
++) {
1129 printf("%s", i
? ", " : "");
1130 tracer_print_field(&desc
->fields
[i
], &sav
[i
]);
1138 void tracer_call(const struct side_event_description
*desc
,
1139 const struct side_arg_vec_description
*sav_desc
,
1140 void *priv
__attribute__((unused
)))
1144 tracer_print_static_fields(desc
, sav_desc
, &nr_fields
);
1148 void tracer_call_variadic(const struct side_event_description
*desc
,
1149 const struct side_arg_vec_description
*sav_desc
,
1150 const struct side_arg_dynamic_event_struct
*var_struct
,
1151 void *priv
__attribute__((unused
)))
1153 uint32_t var_struct_len
= var_struct
->len
;
1154 int nr_fields
= 0, i
;
1156 tracer_print_static_fields(desc
, sav_desc
, &nr_fields
);
1158 if (side_unlikely(!(desc
->flags
& SIDE_EVENT_FLAG_VARIADIC
))) {
1159 printf("ERROR: unexpected non-variadic event description\n");
1162 printf("%s", var_struct
->nr_attr
&& nr_fields
? ", " : "");
1163 print_attributes("attributes:: ", var_struct
->attr
, var_struct
->nr_attr
);
1164 printf("%s", var_struct_len
&& (nr_fields
|| var_struct
->nr_attr
) ? ", fields:: [ " : "");
1165 for (i
= 0; i
< var_struct_len
; i
++, nr_fields
++) {
1166 printf("%s", i
? ", " : "");
1167 printf("%s:: ", var_struct
->fields
[i
].field_name
);
1168 tracer_print_dynamic(&var_struct
->fields
[i
].elem
);