1 // SPDX-License-Identifier: MIT
3 * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
11 #include <side/trace.h>
14 void tracer_print_struct(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
);
16 void tracer_print_array(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
);
18 void tracer_print_vla(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
);
20 void tracer_print_vla_visitor(const struct side_type_description
*type_desc
, void *app_ctx
);
22 void tracer_print_array_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
);
24 void tracer_print_vla_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
);
26 void tracer_print_dynamic(const struct side_arg_dynamic_vec
*dynamic_item
);
29 void tracer_print_attr_type(const struct side_attr
*attr
)
31 printf("{ key: \"%s\", value: ", attr
->key
);
32 switch (attr
->value
.type
) {
33 case SIDE_ATTR_TYPE_BOOL
:
34 printf("%s", attr
->value
.u
.side_bool
? "true" : "false");
36 case SIDE_ATTR_TYPE_U8
:
37 printf("%" PRIu8
, attr
->value
.u
.side_u8
);
39 case SIDE_ATTR_TYPE_U16
:
40 printf("%" PRIu16
, attr
->value
.u
.side_u16
);
42 case SIDE_ATTR_TYPE_U32
:
43 printf("%" PRIu32
, attr
->value
.u
.side_u32
);
45 case SIDE_ATTR_TYPE_U64
:
46 printf("%" PRIu64
, attr
->value
.u
.side_u64
);
48 case SIDE_ATTR_TYPE_S8
:
49 printf("%" PRId8
, attr
->value
.u
.side_s8
);
51 case SIDE_ATTR_TYPE_S16
:
52 printf("%" PRId16
, attr
->value
.u
.side_s16
);
54 case SIDE_ATTR_TYPE_S32
:
55 printf("%" PRId32
, attr
->value
.u
.side_s32
);
57 case SIDE_ATTR_TYPE_S64
:
58 printf("%" PRId64
, attr
->value
.u
.side_s64
);
60 case SIDE_ATTR_TYPE_FLOAT_BINARY16
:
62 printf("%g", (double) attr
->value
.u
.side_float_binary16
);
65 printf("ERROR: Unsupported binary16 float type\n");
68 case SIDE_ATTR_TYPE_FLOAT_BINARY32
:
70 printf("%g", (double) attr
->value
.u
.side_float_binary32
);
73 printf("ERROR: Unsupported binary32 float type\n");
76 case SIDE_ATTR_TYPE_FLOAT_BINARY64
:
78 printf("%g", (double) attr
->value
.u
.side_float_binary64
);
81 printf("ERROR: Unsupported binary64 float type\n");
84 case SIDE_ATTR_TYPE_FLOAT_BINARY128
:
86 printf("%Lg", (long double) attr
->value
.u
.side_float_binary128
);
89 printf("ERROR: Unsupported binary128 float type\n");
92 case SIDE_ATTR_TYPE_STRING
:
93 printf("\"%s\"", attr
->value
.u
.string
);
96 printf("<UNKNOWN TYPE>");
103 void print_attributes(const char *prefix_str
, const struct side_attr
*attr
, uint32_t nr_attr
)
109 printf("%s[ ", prefix_str
);
110 for (i
= 0; i
< nr_attr
; i
++) {
111 printf("%s", i
? ", " : "");
112 tracer_print_attr_type(&attr
[i
]);
118 void print_enum(const struct side_enum_mappings
*side_enum_mappings
, int64_t value
)
120 int i
, print_count
= 0;
122 printf("%" PRId64
", labels: [ ", value
);
123 for (i
= 0; i
< side_enum_mappings
->nr_mappings
; i
++) {
124 const struct side_enum_mapping
*mapping
= &side_enum_mappings
->mappings
[i
];
126 if (value
>= mapping
->range_begin
&& value
<= mapping
->range_end
) {
127 printf("%s", print_count
++ ? ", " : "");
128 printf("\"%s\"", mapping
->label
);
132 printf("<NO LABEL>");
137 void tracer_print_type(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
139 switch (item
->type
) {
140 case SIDE_TYPE_ARRAY_U8
:
141 case SIDE_TYPE_ARRAY_U16
:
142 case SIDE_TYPE_ARRAY_U32
:
143 case SIDE_TYPE_ARRAY_U64
:
144 case SIDE_TYPE_ARRAY_S8
:
145 case SIDE_TYPE_ARRAY_S16
:
146 case SIDE_TYPE_ARRAY_S32
:
147 case SIDE_TYPE_ARRAY_S64
:
148 if (type_desc
->type
!= SIDE_TYPE_ARRAY
) {
149 printf("ERROR: type mismatch between description and arguments\n");
153 case SIDE_TYPE_VLA_U8
:
154 case SIDE_TYPE_VLA_U16
:
155 case SIDE_TYPE_VLA_U32
:
156 case SIDE_TYPE_VLA_U64
:
157 case SIDE_TYPE_VLA_S8
:
158 case SIDE_TYPE_VLA_S16
:
159 case SIDE_TYPE_VLA_S32
:
160 case SIDE_TYPE_VLA_S64
:
161 if (type_desc
->type
!= SIDE_TYPE_VLA
) {
162 printf("ERROR: type mismatch between description and arguments\n");
168 if (type_desc
->type
!= item
->type
) {
169 printf("ERROR: type mismatch between description and arguments\n");
175 print_attributes("attr: ", type_desc
->attr
, type_desc
->nr_attr
);
176 printf("%s", type_desc
->nr_attr
? ", " : "");
178 switch (item
->type
) {
180 printf("%s", item
->u
.side_bool
? "true" : "false");
183 printf("%" PRIu8
, item
->u
.side_u8
);
186 printf("%" PRIu16
, item
->u
.side_u16
);
189 printf("%" PRIu32
, item
->u
.side_u32
);
192 printf("%" PRIu64
, item
->u
.side_u64
);
195 printf("%" PRId8
, item
->u
.side_s8
);
198 printf("%" PRId16
, item
->u
.side_s16
);
201 printf("%" PRId32
, item
->u
.side_s32
);
204 printf("%" PRId64
, item
->u
.side_s64
);
207 case SIDE_TYPE_ENUM_U8
:
208 print_enum(type_desc
->u
.side_enum_mappings
,
209 (int64_t) item
->u
.side_u8
);
211 case SIDE_TYPE_ENUM_U16
:
212 print_enum(type_desc
->u
.side_enum_mappings
,
213 (int64_t) item
->u
.side_u16
);
215 case SIDE_TYPE_ENUM_U32
:
216 print_enum(type_desc
->u
.side_enum_mappings
,
217 (int64_t) item
->u
.side_u32
);
219 case SIDE_TYPE_ENUM_U64
:
220 print_enum(type_desc
->u
.side_enum_mappings
,
221 (int64_t) item
->u
.side_u64
);
223 case SIDE_TYPE_ENUM_S8
:
224 print_enum(type_desc
->u
.side_enum_mappings
,
225 (int64_t) item
->u
.side_s8
);
227 case SIDE_TYPE_ENUM_S16
:
228 print_enum(type_desc
->u
.side_enum_mappings
,
229 (int64_t) item
->u
.side_s16
);
231 case SIDE_TYPE_ENUM_S32
:
232 print_enum(type_desc
->u
.side_enum_mappings
,
233 (int64_t) item
->u
.side_s32
);
235 case SIDE_TYPE_ENUM_S64
:
236 print_enum(type_desc
->u
.side_enum_mappings
,
240 case SIDE_TYPE_FLOAT_BINARY16
:
242 printf("%g", (double) item
->u
.side_float_binary16
);
245 printf("ERROR: Unsupported binary16 float type\n");
248 case SIDE_TYPE_FLOAT_BINARY32
:
250 printf("%g", (double) item
->u
.side_float_binary32
);
253 printf("ERROR: Unsupported binary32 float type\n");
256 case SIDE_TYPE_FLOAT_BINARY64
:
258 printf("%g", (double) item
->u
.side_float_binary64
);
261 printf("ERROR: Unsupported binary64 float type\n");
264 case SIDE_TYPE_FLOAT_BINARY128
:
266 printf("%Lg", (long double) item
->u
.side_float_binary128
);
269 printf("ERROR: Unsupported binary128 float type\n");
272 case SIDE_TYPE_STRING
:
273 printf("\"%s\"", item
->u
.string
);
275 case SIDE_TYPE_STRUCT
:
276 tracer_print_struct(type_desc
, item
->u
.side_struct
);
278 case SIDE_TYPE_ARRAY
:
279 tracer_print_array(type_desc
, item
->u
.side_array
);
282 tracer_print_vla(type_desc
, item
->u
.side_vla
);
284 case SIDE_TYPE_VLA_VISITOR
:
285 tracer_print_vla_visitor(type_desc
, item
->u
.side_vla_app_visitor_ctx
);
287 case SIDE_TYPE_ARRAY_U8
:
288 case SIDE_TYPE_ARRAY_U16
:
289 case SIDE_TYPE_ARRAY_U32
:
290 case SIDE_TYPE_ARRAY_U64
:
291 case SIDE_TYPE_ARRAY_S8
:
292 case SIDE_TYPE_ARRAY_S16
:
293 case SIDE_TYPE_ARRAY_S32
:
294 case SIDE_TYPE_ARRAY_S64
:
295 tracer_print_array_fixint(type_desc
, item
);
297 case SIDE_TYPE_VLA_U8
:
298 case SIDE_TYPE_VLA_U16
:
299 case SIDE_TYPE_VLA_U32
:
300 case SIDE_TYPE_VLA_U64
:
301 case SIDE_TYPE_VLA_S8
:
302 case SIDE_TYPE_VLA_S16
:
303 case SIDE_TYPE_VLA_S32
:
304 case SIDE_TYPE_VLA_S64
:
305 tracer_print_vla_fixint(type_desc
, item
);
307 case SIDE_TYPE_DYNAMIC
:
308 tracer_print_dynamic(&item
->u
.dynamic
);
311 printf("<UNKNOWN TYPE>");
318 void tracer_print_field(const struct side_event_field
*item_desc
, const struct side_arg_vec
*item
)
320 printf("%s: ", item_desc
->field_name
);
321 tracer_print_type(&item_desc
->side_type
, item
);
325 void tracer_print_struct(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
327 const struct side_arg_vec
*sav
= sav_desc
->sav
;
328 uint32_t side_sav_len
= sav_desc
->len
;
331 if (type_desc
->u
.side_struct
.nr_fields
!= side_sav_len
) {
332 printf("ERROR: number of fields mismatch between description and arguments of structure\n");
336 for (i
= 0; i
< side_sav_len
; i
++) {
337 printf("%s", i
? ", " : "");
338 tracer_print_field(&type_desc
->u
.side_struct
.fields
[i
], &sav
[i
]);
344 void tracer_print_array(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
346 const struct side_arg_vec
*sav
= sav_desc
->sav
;
347 uint32_t side_sav_len
= sav_desc
->len
;
350 if (type_desc
->u
.side_array
.length
!= side_sav_len
) {
351 printf("ERROR: length mismatch between description and arguments of array\n");
355 for (i
= 0; i
< side_sav_len
; i
++) {
356 printf("%s", i
? ", " : "");
357 tracer_print_type(type_desc
->u
.side_array
.elem_type
, &sav
[i
]);
363 void tracer_print_vla(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
365 const struct side_arg_vec
*sav
= sav_desc
->sav
;
366 uint32_t side_sav_len
= sav_desc
->len
;
370 for (i
= 0; i
< side_sav_len
; i
++) {
371 printf("%s", i
? ", " : "");
372 tracer_print_type(type_desc
->u
.side_vla
.elem_type
, &sav
[i
]);
377 struct tracer_visitor_priv
{
378 const struct side_type_description
*elem_type
;
383 enum side_visitor_status
tracer_write_elem_cb(const struct side_tracer_visitor_ctx
*tracer_ctx
,
384 const struct side_arg_vec
*elem
)
386 struct tracer_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
388 printf("%s", tracer_priv
->i
++ ? ", " : "");
389 tracer_print_type(tracer_priv
->elem_type
, elem
);
390 return SIDE_VISITOR_STATUS_OK
;
394 void tracer_print_vla_visitor(const struct side_type_description
*type_desc
, void *app_ctx
)
396 enum side_visitor_status status
;
397 struct tracer_visitor_priv tracer_priv
= {
398 .elem_type
= type_desc
->u
.side_vla_visitor
.elem_type
,
401 const struct side_tracer_visitor_ctx tracer_ctx
= {
402 .write_elem
= tracer_write_elem_cb
,
403 .priv
= &tracer_priv
,
407 status
= type_desc
->u
.side_vla_visitor
.visitor(&tracer_ctx
, app_ctx
);
409 case SIDE_VISITOR_STATUS_OK
:
411 case SIDE_VISITOR_STATUS_ERROR
:
412 printf("ERROR: Visitor error\n");
418 void tracer_print_array_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
420 const struct side_type_description
*elem_type
= type_desc
->u
.side_array
.elem_type
;
421 uint32_t side_sav_len
= type_desc
->u
.side_array
.length
;
422 void *p
= item
->u
.side_array_fixint
;
423 enum side_type side_type
;
426 switch (item
->type
) {
427 case SIDE_TYPE_ARRAY_U8
:
428 if (elem_type
->type
!= SIDE_TYPE_U8
)
431 case SIDE_TYPE_ARRAY_U16
:
432 if (elem_type
->type
!= SIDE_TYPE_U16
)
435 case SIDE_TYPE_ARRAY_U32
:
436 if (elem_type
->type
!= SIDE_TYPE_U32
)
439 case SIDE_TYPE_ARRAY_U64
:
440 if (elem_type
->type
!= SIDE_TYPE_U64
)
443 case SIDE_TYPE_ARRAY_S8
:
444 if (elem_type
->type
!= SIDE_TYPE_S8
)
447 case SIDE_TYPE_ARRAY_S16
:
448 if (elem_type
->type
!= SIDE_TYPE_S16
)
451 case SIDE_TYPE_ARRAY_S32
:
452 if (elem_type
->type
!= SIDE_TYPE_S32
)
455 case SIDE_TYPE_ARRAY_S64
:
456 if (elem_type
->type
!= SIDE_TYPE_S64
)
462 side_type
= elem_type
->type
;
465 for (i
= 0; i
< side_sav_len
; i
++) {
466 struct side_arg_vec sav_elem
= {
472 sav_elem
.u
.side_u8
= ((const uint8_t *) p
)[i
];
475 sav_elem
.u
.side_s8
= ((const int8_t *) p
)[i
];
478 sav_elem
.u
.side_u16
= ((const uint16_t *) p
)[i
];
481 sav_elem
.u
.side_s16
= ((const int16_t *) p
)[i
];
484 sav_elem
.u
.side_u32
= ((const uint32_t *) p
)[i
];
487 sav_elem
.u
.side_s32
= ((const int32_t *) p
)[i
];
490 sav_elem
.u
.side_u64
= ((const uint64_t *) p
)[i
];
493 sav_elem
.u
.side_s64
= ((const int64_t *) p
)[i
];
497 printf("ERROR: Unexpected type\n");
501 printf("%s", i
? ", " : "");
502 tracer_print_type(elem_type
, &sav_elem
);
508 printf("ERROR: type mismatch\n");
512 void tracer_print_vla_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
514 const struct side_type_description
*elem_type
= type_desc
->u
.side_vla
.elem_type
;
515 uint32_t side_sav_len
= item
->u
.side_vla_fixint
.length
;
516 void *p
= item
->u
.side_vla_fixint
.p
;
517 enum side_type side_type
;
520 switch (item
->type
) {
521 case SIDE_TYPE_VLA_U8
:
522 if (elem_type
->type
!= SIDE_TYPE_U8
)
525 case SIDE_TYPE_VLA_U16
:
526 if (elem_type
->type
!= SIDE_TYPE_U16
)
529 case SIDE_TYPE_VLA_U32
:
530 if (elem_type
->type
!= SIDE_TYPE_U32
)
533 case SIDE_TYPE_VLA_U64
:
534 if (elem_type
->type
!= SIDE_TYPE_U64
)
537 case SIDE_TYPE_VLA_S8
:
538 if (elem_type
->type
!= SIDE_TYPE_S8
)
541 case SIDE_TYPE_VLA_S16
:
542 if (elem_type
->type
!= SIDE_TYPE_S16
)
545 case SIDE_TYPE_VLA_S32
:
546 if (elem_type
->type
!= SIDE_TYPE_S32
)
549 case SIDE_TYPE_VLA_S64
:
550 if (elem_type
->type
!= SIDE_TYPE_S64
)
556 side_type
= elem_type
->type
;
559 for (i
= 0; i
< side_sav_len
; i
++) {
560 struct side_arg_vec sav_elem
= {
566 sav_elem
.u
.side_u8
= ((const uint8_t *) p
)[i
];
569 sav_elem
.u
.side_s8
= ((const int8_t *) p
)[i
];
572 sav_elem
.u
.side_u16
= ((const uint16_t *) p
)[i
];
575 sav_elem
.u
.side_s16
= ((const int16_t *) p
)[i
];
578 sav_elem
.u
.side_u32
= ((const uint32_t *) p
)[i
];
581 sav_elem
.u
.side_s32
= ((const int32_t *) p
)[i
];
584 sav_elem
.u
.side_u64
= ((const uint64_t *) p
)[i
];
587 sav_elem
.u
.side_s64
= ((const int64_t *) p
)[i
];
591 printf("ERROR: Unexpected type\n");
595 printf("%s", i
? ", " : "");
596 tracer_print_type(elem_type
, &sav_elem
);
602 printf("ERROR: type mismatch\n");
607 void tracer_print_dynamic_struct(const struct side_arg_dynamic_event_struct
*dynamic_struct
)
609 const struct side_arg_dynamic_event_field
*fields
= dynamic_struct
->fields
;
610 uint32_t len
= dynamic_struct
->len
;
614 for (i
= 0; i
< len
; i
++) {
615 printf("%s", i
? ", " : "");
616 printf("%s:: ", fields
[i
].field_name
);
617 tracer_print_dynamic(&fields
[i
].elem
);
622 struct tracer_dynamic_struct_visitor_priv
{
627 enum side_visitor_status
tracer_dynamic_struct_write_elem_cb(
628 const struct side_tracer_dynamic_struct_visitor_ctx
*tracer_ctx
,
629 const struct side_arg_dynamic_event_field
*dynamic_field
)
631 struct tracer_dynamic_struct_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
633 printf("%s", tracer_priv
->i
++ ? ", " : "");
634 printf("%s:: ", dynamic_field
->field_name
);
635 tracer_print_dynamic(&dynamic_field
->elem
);
636 return SIDE_VISITOR_STATUS_OK
;
640 void tracer_print_dynamic_struct_visitor(const struct side_arg_dynamic_vec
*item
)
642 enum side_visitor_status status
;
643 struct tracer_dynamic_struct_visitor_priv tracer_priv
= {
646 const struct side_tracer_dynamic_struct_visitor_ctx tracer_ctx
= {
647 .write_field
= tracer_dynamic_struct_write_elem_cb
,
648 .priv
= &tracer_priv
,
650 void *app_ctx
= item
->u
.side_dynamic_struct_visitor
.app_ctx
;
653 status
= item
->u
.side_dynamic_struct_visitor
.visitor(&tracer_ctx
, app_ctx
);
655 case SIDE_VISITOR_STATUS_OK
:
657 case SIDE_VISITOR_STATUS_ERROR
:
658 printf("ERROR: Visitor error\n");
665 void tracer_print_dynamic_vla(const struct side_arg_dynamic_vec_vla
*vla
)
667 const struct side_arg_dynamic_vec
*sav
= vla
->sav
;
668 uint32_t side_sav_len
= vla
->len
;
672 for (i
= 0; i
< side_sav_len
; i
++) {
673 printf("%s", i
? ", " : "");
674 tracer_print_dynamic(&sav
[i
]);
679 struct tracer_dynamic_vla_visitor_priv
{
684 enum side_visitor_status
tracer_dynamic_vla_write_elem_cb(
685 const struct side_tracer_dynamic_vla_visitor_ctx
*tracer_ctx
,
686 const struct side_arg_dynamic_vec
*elem
)
688 struct tracer_dynamic_vla_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
690 printf("%s", tracer_priv
->i
++ ? ", " : "");
691 tracer_print_dynamic(elem
);
692 return SIDE_VISITOR_STATUS_OK
;
696 void tracer_print_dynamic_vla_visitor(const struct side_arg_dynamic_vec
*item
)
698 enum side_visitor_status status
;
699 struct tracer_dynamic_vla_visitor_priv tracer_priv
= {
702 const struct side_tracer_dynamic_vla_visitor_ctx tracer_ctx
= {
703 .write_elem
= tracer_dynamic_vla_write_elem_cb
,
704 .priv
= &tracer_priv
,
706 void *app_ctx
= item
->u
.side_dynamic_vla_visitor
.app_ctx
;
709 status
= item
->u
.side_dynamic_vla_visitor
.visitor(&tracer_ctx
, app_ctx
);
711 case SIDE_VISITOR_STATUS_OK
:
713 case SIDE_VISITOR_STATUS_ERROR
:
714 printf("ERROR: Visitor error\n");
721 void tracer_print_dynamic(const struct side_arg_dynamic_vec
*item
)
724 print_attributes("attr:: ", item
->attr
, item
->nr_attr
);
725 printf("%s", item
->nr_attr
? ", " : "");
727 switch (item
->dynamic_type
) {
728 case SIDE_DYNAMIC_TYPE_NULL
:
729 printf("<NULL TYPE>");
731 case SIDE_DYNAMIC_TYPE_BOOL
:
732 printf("%s", item
->u
.side_bool
? "true" : "false");
734 case SIDE_DYNAMIC_TYPE_U8
:
735 printf("%" PRIu8
, item
->u
.side_u8
);
737 case SIDE_DYNAMIC_TYPE_U16
:
738 printf("%" PRIu16
, item
->u
.side_u16
);
740 case SIDE_DYNAMIC_TYPE_U32
:
741 printf("%" PRIu32
, item
->u
.side_u32
);
743 case SIDE_DYNAMIC_TYPE_U64
:
744 printf("%" PRIu64
, item
->u
.side_u64
);
746 case SIDE_DYNAMIC_TYPE_S8
:
747 printf("%" PRId8
, item
->u
.side_s8
);
749 case SIDE_DYNAMIC_TYPE_S16
:
750 printf("%" PRId16
, item
->u
.side_s16
);
752 case SIDE_DYNAMIC_TYPE_S32
:
753 printf("%" PRId32
, item
->u
.side_s32
);
755 case SIDE_DYNAMIC_TYPE_S64
:
756 printf("%" PRId64
, item
->u
.side_s64
);
758 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY16
:
760 printf("%g", (double) item
->u
.side_float_binary16
);
763 printf("ERROR: Unsupported binary16 float type\n");
766 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY32
:
768 printf("%g", (double) item
->u
.side_float_binary32
);
771 printf("ERROR: Unsupported binary32 float type\n");
774 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY64
:
776 printf("%g", (double) item
->u
.side_float_binary64
);
779 printf("ERROR: Unsupported binary64 float type\n");
782 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY128
:
784 printf("%Lg", (long double) item
->u
.side_float_binary128
);
787 printf("ERROR: Unsupported binary128 float type\n");
790 case SIDE_DYNAMIC_TYPE_STRING
:
791 printf("\"%s\"", item
->u
.string
);
793 case SIDE_DYNAMIC_TYPE_STRUCT
:
794 tracer_print_dynamic_struct(item
->u
.side_dynamic_struct
);
796 case SIDE_DYNAMIC_TYPE_STRUCT_VISITOR
:
797 tracer_print_dynamic_struct_visitor(item
);
799 case SIDE_DYNAMIC_TYPE_VLA
:
800 tracer_print_dynamic_vla(item
->u
.side_dynamic_vla
);
802 case SIDE_DYNAMIC_TYPE_VLA_VISITOR
:
803 tracer_print_dynamic_vla_visitor(item
);
806 printf("<UNKNOWN TYPE>");
813 void tracer_print_static_fields(const struct side_event_description
*desc
,
814 const struct side_arg_vec_description
*sav_desc
,
817 const struct side_arg_vec
*sav
= sav_desc
->sav
;
818 uint32_t side_sav_len
= sav_desc
->len
;
821 printf("provider: %s, event: %s", desc
->provider_name
, desc
->event_name
);
822 if (desc
->nr_fields
!= side_sav_len
) {
823 printf("ERROR: number of fields mismatch between description and arguments\n");
826 print_attributes(", attributes: ", desc
->attr
, desc
->nr_attr
);
827 printf("%s", side_sav_len
? ", fields: [ " : "");
828 for (i
= 0; i
< side_sav_len
; i
++) {
829 printf("%s", i
? ", " : "");
830 tracer_print_field(&desc
->fields
[i
], &sav
[i
]);
836 void tracer_call(const struct side_event_description
*desc
, const struct side_arg_vec_description
*sav_desc
)
840 if (side_unlikely(desc
->flags
& SIDE_EVENT_FLAG_VARIADIC
)) {
841 printf("ERROR: unexpected variadic event description\n");
844 tracer_print_static_fields(desc
, sav_desc
, &nr_fields
);
850 void tracer_call_variadic(const struct side_event_description
*desc
,
851 const struct side_arg_vec_description
*sav_desc
,
852 const struct side_arg_dynamic_event_struct
*var_struct
)
854 uint32_t var_struct_len
= var_struct
->len
;
855 int nr_fields
= 0, i
;
857 tracer_print_static_fields(desc
, sav_desc
, &nr_fields
);
859 if (side_unlikely(!(desc
->flags
& SIDE_EVENT_FLAG_VARIADIC
))) {
860 printf("ERROR: unexpected non-variadic event description\n");
863 printf("%s", var_struct_len
&& !nr_fields
? ", fields: [ " : "");
864 for (i
= 0; i
< var_struct_len
; i
++, nr_fields
++) {
865 printf("%s", nr_fields
? ", " : "");
866 printf("%s:: ", var_struct
->fields
[i
].field_name
);
867 tracer_print_dynamic(&var_struct
->fields
[i
].elem
);