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_basic_type_header(const struct side_type_description
*type_desc
)
182 print_attributes("attr: ", type_desc
->u
.side_basic
.attr
, type_desc
->u
.side_basic
.nr_attr
);
183 printf("%s", type_desc
->u
.side_basic
.nr_attr
? ", " : "");
188 void tracer_print_type(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
190 switch (item
->type
) {
191 case SIDE_TYPE_ARRAY_U8
:
192 case SIDE_TYPE_ARRAY_U16
:
193 case SIDE_TYPE_ARRAY_U32
:
194 case SIDE_TYPE_ARRAY_U64
:
195 case SIDE_TYPE_ARRAY_S8
:
196 case SIDE_TYPE_ARRAY_S16
:
197 case SIDE_TYPE_ARRAY_S32
:
198 case SIDE_TYPE_ARRAY_S64
:
199 case SIDE_TYPE_ARRAY_BLOB
:
200 if (type_desc
->type
!= SIDE_TYPE_ARRAY
) {
201 printf("ERROR: type mismatch between description and arguments\n");
205 case SIDE_TYPE_VLA_U8
:
206 case SIDE_TYPE_VLA_U16
:
207 case SIDE_TYPE_VLA_U32
:
208 case SIDE_TYPE_VLA_U64
:
209 case SIDE_TYPE_VLA_S8
:
210 case SIDE_TYPE_VLA_S16
:
211 case SIDE_TYPE_VLA_S32
:
212 case SIDE_TYPE_VLA_S64
:
213 case SIDE_TYPE_VLA_BLOB
:
214 if (type_desc
->type
!= SIDE_TYPE_VLA
) {
215 printf("ERROR: type mismatch between description and arguments\n");
221 if (type_desc
->type
!= item
->type
) {
222 printf("ERROR: type mismatch between description and arguments\n");
228 switch (item
->type
) {
230 tracer_print_basic_type_header(type_desc
);
231 printf("%s", item
->u
.side_bool
? "true" : "false");
234 tracer_print_basic_type_header(type_desc
);
235 printf("%" PRIu8
, item
->u
.side_u8
);
238 tracer_print_basic_type_header(type_desc
);
239 printf("%" PRIu16
, item
->u
.side_u16
);
242 tracer_print_basic_type_header(type_desc
);
243 printf("%" PRIu32
, item
->u
.side_u32
);
246 tracer_print_basic_type_header(type_desc
);
247 printf("%" PRIu64
, item
->u
.side_u64
);
250 tracer_print_basic_type_header(type_desc
);
251 printf("%" PRId8
, item
->u
.side_s8
);
254 tracer_print_basic_type_header(type_desc
);
255 printf("%" PRId16
, item
->u
.side_s16
);
258 tracer_print_basic_type_header(type_desc
);
259 printf("%" PRId32
, item
->u
.side_s32
);
262 tracer_print_basic_type_header(type_desc
);
263 printf("%" PRId64
, item
->u
.side_s64
);
266 tracer_print_basic_type_header(type_desc
);
267 printf("0x%" PRIx8
, item
->u
.side_blob
);
270 case SIDE_TYPE_ENUM_U8
:
271 print_enum(type_desc
->u
.side_enum_mappings
,
272 (int64_t) item
->u
.side_u8
);
274 case SIDE_TYPE_ENUM_U16
:
275 print_enum(type_desc
->u
.side_enum_mappings
,
276 (int64_t) item
->u
.side_u16
);
278 case SIDE_TYPE_ENUM_U32
:
279 print_enum(type_desc
->u
.side_enum_mappings
,
280 (int64_t) item
->u
.side_u32
);
282 case SIDE_TYPE_ENUM_U64
:
283 print_enum(type_desc
->u
.side_enum_mappings
,
284 (int64_t) item
->u
.side_u64
);
286 case SIDE_TYPE_ENUM_S8
:
287 print_enum(type_desc
->u
.side_enum_mappings
,
288 (int64_t) item
->u
.side_s8
);
290 case SIDE_TYPE_ENUM_S16
:
291 print_enum(type_desc
->u
.side_enum_mappings
,
292 (int64_t) item
->u
.side_s16
);
294 case SIDE_TYPE_ENUM_S32
:
295 print_enum(type_desc
->u
.side_enum_mappings
,
296 (int64_t) item
->u
.side_s32
);
298 case SIDE_TYPE_ENUM_S64
:
299 print_enum(type_desc
->u
.side_enum_mappings
,
303 case SIDE_TYPE_ENUM_BITMAP8
:
304 print_enum_bitmap(type_desc
->u
.side_enum_bitmap_mappings
,
305 (uint64_t) item
->u
.side_u8
);
307 case SIDE_TYPE_ENUM_BITMAP16
:
308 print_enum_bitmap(type_desc
->u
.side_enum_bitmap_mappings
,
309 (uint64_t) item
->u
.side_u16
);
311 case SIDE_TYPE_ENUM_BITMAP32
:
312 print_enum_bitmap(type_desc
->u
.side_enum_bitmap_mappings
,
313 (uint64_t) item
->u
.side_u32
);
315 case SIDE_TYPE_ENUM_BITMAP64
:
316 print_enum_bitmap(type_desc
->u
.side_enum_bitmap_mappings
,
320 case SIDE_TYPE_FLOAT_BINARY16
:
321 tracer_print_basic_type_header(type_desc
);
323 printf("%g", (double) item
->u
.side_float_binary16
);
326 printf("ERROR: Unsupported binary16 float type\n");
329 case SIDE_TYPE_FLOAT_BINARY32
:
330 tracer_print_basic_type_header(type_desc
);
332 printf("%g", (double) item
->u
.side_float_binary32
);
335 printf("ERROR: Unsupported binary32 float type\n");
338 case SIDE_TYPE_FLOAT_BINARY64
:
339 tracer_print_basic_type_header(type_desc
);
341 printf("%g", (double) item
->u
.side_float_binary64
);
344 printf("ERROR: Unsupported binary64 float type\n");
347 case SIDE_TYPE_FLOAT_BINARY128
:
348 tracer_print_basic_type_header(type_desc
);
350 printf("%Lg", (long double) item
->u
.side_float_binary128
);
353 printf("ERROR: Unsupported binary128 float type\n");
356 case SIDE_TYPE_STRING
:
357 tracer_print_basic_type_header(type_desc
);
358 printf("\"%s\"", item
->u
.string
);
360 case SIDE_TYPE_STRUCT
:
361 tracer_print_struct(type_desc
, item
->u
.side_struct
);
363 case SIDE_TYPE_ARRAY
:
364 tracer_print_array(type_desc
, item
->u
.side_array
);
367 tracer_print_vla(type_desc
, item
->u
.side_vla
);
369 case SIDE_TYPE_VLA_VISITOR
:
370 tracer_print_vla_visitor(type_desc
, item
->u
.side_vla_app_visitor_ctx
);
372 case SIDE_TYPE_ARRAY_U8
:
373 case SIDE_TYPE_ARRAY_U16
:
374 case SIDE_TYPE_ARRAY_U32
:
375 case SIDE_TYPE_ARRAY_U64
:
376 case SIDE_TYPE_ARRAY_S8
:
377 case SIDE_TYPE_ARRAY_S16
:
378 case SIDE_TYPE_ARRAY_S32
:
379 case SIDE_TYPE_ARRAY_S64
:
380 case SIDE_TYPE_ARRAY_BLOB
:
381 tracer_print_array_fixint(type_desc
, item
);
383 case SIDE_TYPE_VLA_U8
:
384 case SIDE_TYPE_VLA_U16
:
385 case SIDE_TYPE_VLA_U32
:
386 case SIDE_TYPE_VLA_U64
:
387 case SIDE_TYPE_VLA_S8
:
388 case SIDE_TYPE_VLA_S16
:
389 case SIDE_TYPE_VLA_S32
:
390 case SIDE_TYPE_VLA_S64
:
391 case SIDE_TYPE_VLA_BLOB
:
392 tracer_print_vla_fixint(type_desc
, item
);
394 case SIDE_TYPE_DYNAMIC
:
395 tracer_print_basic_type_header(type_desc
);
396 tracer_print_dynamic(&item
->u
.dynamic
);
399 printf("<UNKNOWN TYPE>");
406 void tracer_print_field(const struct side_event_field
*item_desc
, const struct side_arg_vec
*item
)
408 printf("%s: ", item_desc
->field_name
);
409 tracer_print_type(&item_desc
->side_type
, item
);
413 void tracer_print_struct(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
415 const struct side_arg_vec
*sav
= sav_desc
->sav
;
416 uint32_t side_sav_len
= sav_desc
->len
;
419 if (type_desc
->u
.side_struct
->nr_fields
!= side_sav_len
) {
420 printf("ERROR: number of fields mismatch between description and arguments of structure\n");
423 print_attributes("attr: ", type_desc
->u
.side_struct
->attr
, type_desc
->u
.side_struct
->nr_attr
);
424 printf("%s", type_desc
->u
.side_struct
->nr_attr
? ", " : "");
425 printf("fields: { ");
426 for (i
= 0; i
< side_sav_len
; i
++) {
427 printf("%s", i
? ", " : "");
428 tracer_print_field(&type_desc
->u
.side_struct
->fields
[i
], &sav
[i
]);
434 void tracer_print_array(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
436 const struct side_arg_vec
*sav
= sav_desc
->sav
;
437 uint32_t side_sav_len
= sav_desc
->len
;
440 if (type_desc
->u
.side_array
.length
!= side_sav_len
) {
441 printf("ERROR: length mismatch between description and arguments of array\n");
444 print_attributes("attr: ", type_desc
->u
.side_array
.attr
, type_desc
->u
.side_array
.nr_attr
);
445 printf("%s", type_desc
->u
.side_array
.nr_attr
? ", " : "");
446 printf("elements: ");
448 for (i
= 0; i
< side_sav_len
; i
++) {
449 printf("%s", i
? ", " : "");
450 tracer_print_type(type_desc
->u
.side_array
.elem_type
, &sav
[i
]);
456 void tracer_print_vla(const struct side_type_description
*type_desc
, const struct side_arg_vec_description
*sav_desc
)
458 const struct side_arg_vec
*sav
= sav_desc
->sav
;
459 uint32_t side_sav_len
= sav_desc
->len
;
462 print_attributes("attr: ", type_desc
->u
.side_vla
.attr
, type_desc
->u
.side_vla
.nr_attr
);
463 printf("%s", type_desc
->u
.side_vla
.nr_attr
? ", " : "");
464 printf("elements: ");
466 for (i
= 0; i
< side_sav_len
; i
++) {
467 printf("%s", i
? ", " : "");
468 tracer_print_type(type_desc
->u
.side_vla
.elem_type
, &sav
[i
]);
473 struct tracer_visitor_priv
{
474 const struct side_type_description
*elem_type
;
479 enum side_visitor_status
tracer_write_elem_cb(const struct side_tracer_visitor_ctx
*tracer_ctx
,
480 const struct side_arg_vec
*elem
)
482 struct tracer_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
484 printf("%s", tracer_priv
->i
++ ? ", " : "");
485 tracer_print_type(tracer_priv
->elem_type
, elem
);
486 return SIDE_VISITOR_STATUS_OK
;
490 void tracer_print_vla_visitor(const struct side_type_description
*type_desc
, void *app_ctx
)
492 enum side_visitor_status status
;
493 struct tracer_visitor_priv tracer_priv
= {
494 .elem_type
= type_desc
->u
.side_vla_visitor
.elem_type
,
497 const struct side_tracer_visitor_ctx tracer_ctx
= {
498 .write_elem
= tracer_write_elem_cb
,
499 .priv
= &tracer_priv
,
502 print_attributes("attr: ", type_desc
->u
.side_vla_visitor
.attr
, type_desc
->u
.side_vla_visitor
.nr_attr
);
503 printf("%s", type_desc
->u
.side_vla_visitor
.nr_attr
? ", " : "");
504 printf("elements: ");
506 status
= type_desc
->u
.side_vla_visitor
.visitor(&tracer_ctx
, app_ctx
);
508 case SIDE_VISITOR_STATUS_OK
:
510 case SIDE_VISITOR_STATUS_ERROR
:
511 printf("ERROR: Visitor error\n");
517 void tracer_print_array_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
519 const struct side_type_description
*elem_type
= type_desc
->u
.side_array
.elem_type
;
520 uint32_t side_sav_len
= type_desc
->u
.side_array
.length
;
521 void *p
= item
->u
.side_array_fixint
;
522 enum side_type side_type
;
525 print_attributes("attr: ", type_desc
->u
.side_array
.attr
, type_desc
->u
.side_array
.nr_attr
);
526 printf("%s", type_desc
->u
.side_array
.nr_attr
? ", " : "");
527 printf("elements: ");
528 switch (item
->type
) {
529 case SIDE_TYPE_ARRAY_U8
:
530 if (elem_type
->type
!= SIDE_TYPE_U8
)
533 case SIDE_TYPE_ARRAY_U16
:
534 if (elem_type
->type
!= SIDE_TYPE_U16
)
537 case SIDE_TYPE_ARRAY_U32
:
538 if (elem_type
->type
!= SIDE_TYPE_U32
)
541 case SIDE_TYPE_ARRAY_U64
:
542 if (elem_type
->type
!= SIDE_TYPE_U64
)
545 case SIDE_TYPE_ARRAY_S8
:
546 if (elem_type
->type
!= SIDE_TYPE_S8
)
549 case SIDE_TYPE_ARRAY_S16
:
550 if (elem_type
->type
!= SIDE_TYPE_S16
)
553 case SIDE_TYPE_ARRAY_S32
:
554 if (elem_type
->type
!= SIDE_TYPE_S32
)
557 case SIDE_TYPE_ARRAY_S64
:
558 if (elem_type
->type
!= SIDE_TYPE_S64
)
561 case SIDE_TYPE_ARRAY_BLOB
:
562 if (elem_type
->type
!= SIDE_TYPE_BLOB
)
568 side_type
= elem_type
->type
;
571 for (i
= 0; i
< side_sav_len
; i
++) {
572 struct side_arg_vec sav_elem
= {
578 sav_elem
.u
.side_u8
= ((const uint8_t *) p
)[i
];
581 sav_elem
.u
.side_s8
= ((const int8_t *) p
)[i
];
584 sav_elem
.u
.side_u16
= ((const uint16_t *) p
)[i
];
587 sav_elem
.u
.side_s16
= ((const int16_t *) p
)[i
];
590 sav_elem
.u
.side_u32
= ((const uint32_t *) p
)[i
];
593 sav_elem
.u
.side_s32
= ((const int32_t *) p
)[i
];
596 sav_elem
.u
.side_u64
= ((const uint64_t *) p
)[i
];
599 sav_elem
.u
.side_s64
= ((const int64_t *) p
)[i
];
602 sav_elem
.u
.side_blob
= ((const uint8_t *) p
)[i
];
606 printf("ERROR: Unexpected type\n");
610 printf("%s", i
? ", " : "");
611 tracer_print_type(elem_type
, &sav_elem
);
617 printf("ERROR: type mismatch\n");
621 void tracer_print_vla_fixint(const struct side_type_description
*type_desc
, const struct side_arg_vec
*item
)
623 const struct side_type_description
*elem_type
= type_desc
->u
.side_vla
.elem_type
;
624 uint32_t side_sav_len
= item
->u
.side_vla_fixint
.length
;
625 void *p
= item
->u
.side_vla_fixint
.p
;
626 enum side_type side_type
;
629 print_attributes("attr: ", type_desc
->u
.side_vla
.attr
, type_desc
->u
.side_vla
.nr_attr
);
630 printf("%s", type_desc
->u
.side_vla
.nr_attr
? ", " : "");
631 printf("elements: ");
632 switch (item
->type
) {
633 case SIDE_TYPE_VLA_U8
:
634 if (elem_type
->type
!= SIDE_TYPE_U8
)
637 case SIDE_TYPE_VLA_U16
:
638 if (elem_type
->type
!= SIDE_TYPE_U16
)
641 case SIDE_TYPE_VLA_U32
:
642 if (elem_type
->type
!= SIDE_TYPE_U32
)
645 case SIDE_TYPE_VLA_U64
:
646 if (elem_type
->type
!= SIDE_TYPE_U64
)
649 case SIDE_TYPE_VLA_S8
:
650 if (elem_type
->type
!= SIDE_TYPE_S8
)
653 case SIDE_TYPE_VLA_S16
:
654 if (elem_type
->type
!= SIDE_TYPE_S16
)
657 case SIDE_TYPE_VLA_S32
:
658 if (elem_type
->type
!= SIDE_TYPE_S32
)
661 case SIDE_TYPE_VLA_S64
:
662 if (elem_type
->type
!= SIDE_TYPE_S64
)
665 case SIDE_TYPE_VLA_BLOB
:
666 if (elem_type
->type
!= SIDE_TYPE_BLOB
)
672 side_type
= elem_type
->type
;
675 for (i
= 0; i
< side_sav_len
; i
++) {
676 struct side_arg_vec sav_elem
= {
682 sav_elem
.u
.side_u8
= ((const uint8_t *) p
)[i
];
685 sav_elem
.u
.side_s8
= ((const int8_t *) p
)[i
];
688 sav_elem
.u
.side_u16
= ((const uint16_t *) p
)[i
];
691 sav_elem
.u
.side_s16
= ((const int16_t *) p
)[i
];
694 sav_elem
.u
.side_u32
= ((const uint32_t *) p
)[i
];
697 sav_elem
.u
.side_s32
= ((const int32_t *) p
)[i
];
700 sav_elem
.u
.side_u64
= ((const uint64_t *) p
)[i
];
703 sav_elem
.u
.side_s64
= ((const int64_t *) p
)[i
];
706 sav_elem
.u
.side_blob
= ((const uint8_t *) p
)[i
];
710 printf("ERROR: Unexpected type\n");
714 printf("%s", i
? ", " : "");
715 tracer_print_type(elem_type
, &sav_elem
);
721 printf("ERROR: type mismatch\n");
726 void tracer_print_dynamic_struct(const struct side_arg_dynamic_event_struct
*dynamic_struct
)
728 const struct side_arg_dynamic_event_field
*fields
= dynamic_struct
->fields
;
729 uint32_t len
= dynamic_struct
->len
;
732 print_attributes("attr:: ", dynamic_struct
->attr
, dynamic_struct
->nr_attr
);
733 printf("%s", dynamic_struct
->nr_attr
? ", " : "");
736 for (i
= 0; i
< len
; i
++) {
737 printf("%s", i
? ", " : "");
738 printf("%s:: ", fields
[i
].field_name
);
739 tracer_print_dynamic(&fields
[i
].elem
);
744 struct tracer_dynamic_struct_visitor_priv
{
749 enum side_visitor_status
tracer_dynamic_struct_write_elem_cb(
750 const struct side_tracer_dynamic_struct_visitor_ctx
*tracer_ctx
,
751 const struct side_arg_dynamic_event_field
*dynamic_field
)
753 struct tracer_dynamic_struct_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
755 printf("%s", tracer_priv
->i
++ ? ", " : "");
756 printf("%s:: ", dynamic_field
->field_name
);
757 tracer_print_dynamic(&dynamic_field
->elem
);
758 return SIDE_VISITOR_STATUS_OK
;
762 void tracer_print_dynamic_struct_visitor(const struct side_arg_dynamic_vec
*item
)
764 enum side_visitor_status status
;
765 struct tracer_dynamic_struct_visitor_priv tracer_priv
= {
768 const struct side_tracer_dynamic_struct_visitor_ctx tracer_ctx
= {
769 .write_field
= tracer_dynamic_struct_write_elem_cb
,
770 .priv
= &tracer_priv
,
772 void *app_ctx
= item
->u
.side_dynamic_struct_visitor
.app_ctx
;
774 print_attributes("attr:: ", item
->u
.side_dynamic_struct_visitor
.attr
, item
->u
.side_dynamic_struct_visitor
.nr_attr
);
775 printf("%s", item
->u
.side_dynamic_struct_visitor
.nr_attr
? ", " : "");
778 status
= item
->u
.side_dynamic_struct_visitor
.visitor(&tracer_ctx
, app_ctx
);
780 case SIDE_VISITOR_STATUS_OK
:
782 case SIDE_VISITOR_STATUS_ERROR
:
783 printf("ERROR: Visitor error\n");
790 void tracer_print_dynamic_vla(const struct side_arg_dynamic_vec_vla
*vla
)
792 const struct side_arg_dynamic_vec
*sav
= vla
->sav
;
793 uint32_t side_sav_len
= vla
->len
;
796 print_attributes("attr:: ", vla
->attr
, vla
->nr_attr
);
797 printf("%s", vla
->nr_attr
? ", " : "");
798 printf("elements:: ");
800 for (i
= 0; i
< side_sav_len
; i
++) {
801 printf("%s", i
? ", " : "");
802 tracer_print_dynamic(&sav
[i
]);
807 struct tracer_dynamic_vla_visitor_priv
{
812 enum side_visitor_status
tracer_dynamic_vla_write_elem_cb(
813 const struct side_tracer_dynamic_vla_visitor_ctx
*tracer_ctx
,
814 const struct side_arg_dynamic_vec
*elem
)
816 struct tracer_dynamic_vla_visitor_priv
*tracer_priv
= tracer_ctx
->priv
;
818 printf("%s", tracer_priv
->i
++ ? ", " : "");
819 tracer_print_dynamic(elem
);
820 return SIDE_VISITOR_STATUS_OK
;
824 void tracer_print_dynamic_vla_visitor(const struct side_arg_dynamic_vec
*item
)
826 enum side_visitor_status status
;
827 struct tracer_dynamic_vla_visitor_priv tracer_priv
= {
830 const struct side_tracer_dynamic_vla_visitor_ctx tracer_ctx
= {
831 .write_elem
= tracer_dynamic_vla_write_elem_cb
,
832 .priv
= &tracer_priv
,
834 void *app_ctx
= item
->u
.side_dynamic_vla_visitor
.app_ctx
;
836 print_attributes("attr:: ", item
->u
.side_dynamic_vla_visitor
.attr
, item
->u
.side_dynamic_vla_visitor
.nr_attr
);
837 printf("%s", item
->u
.side_dynamic_vla_visitor
.nr_attr
? ", " : "");
838 printf("elements:: ");
840 status
= item
->u
.side_dynamic_vla_visitor
.visitor(&tracer_ctx
, app_ctx
);
842 case SIDE_VISITOR_STATUS_OK
:
844 case SIDE_VISITOR_STATUS_ERROR
:
845 printf("ERROR: Visitor error\n");
852 void tracer_print_dynamic_basic_type_header(const struct side_arg_dynamic_vec
*item
)
854 print_attributes("attr:: ", item
->u
.side_basic
.attr
, item
->u
.side_basic
.nr_attr
);
855 printf("%s", item
->u
.side_basic
.nr_attr
? ", " : "");
860 void tracer_print_dynamic(const struct side_arg_dynamic_vec
*item
)
863 switch (item
->dynamic_type
) {
864 case SIDE_DYNAMIC_TYPE_NULL
:
865 tracer_print_dynamic_basic_type_header(item
);
866 printf("<NULL TYPE>");
868 case SIDE_DYNAMIC_TYPE_BOOL
:
869 tracer_print_dynamic_basic_type_header(item
);
870 printf("%s", item
->u
.side_basic
.u
.side_bool
? "true" : "false");
872 case SIDE_DYNAMIC_TYPE_U8
:
873 tracer_print_dynamic_basic_type_header(item
);
874 printf("%" PRIu8
, item
->u
.side_basic
.u
.side_u8
);
876 case SIDE_DYNAMIC_TYPE_U16
:
877 tracer_print_dynamic_basic_type_header(item
);
878 printf("%" PRIu16
, item
->u
.side_basic
.u
.side_u16
);
880 case SIDE_DYNAMIC_TYPE_U32
:
881 tracer_print_dynamic_basic_type_header(item
);
882 printf("%" PRIu32
, item
->u
.side_basic
.u
.side_u32
);
884 case SIDE_DYNAMIC_TYPE_U64
:
885 tracer_print_dynamic_basic_type_header(item
);
886 printf("%" PRIu64
, item
->u
.side_basic
.u
.side_u64
);
888 case SIDE_DYNAMIC_TYPE_S8
:
889 tracer_print_dynamic_basic_type_header(item
);
890 printf("%" PRId8
, item
->u
.side_basic
.u
.side_s8
);
892 case SIDE_DYNAMIC_TYPE_S16
:
893 tracer_print_dynamic_basic_type_header(item
);
894 printf("%" PRId16
, item
->u
.side_basic
.u
.side_s16
);
896 case SIDE_DYNAMIC_TYPE_S32
:
897 tracer_print_dynamic_basic_type_header(item
);
898 printf("%" PRId32
, item
->u
.side_basic
.u
.side_s32
);
900 case SIDE_DYNAMIC_TYPE_S64
:
901 tracer_print_dynamic_basic_type_header(item
);
902 printf("%" PRId64
, item
->u
.side_basic
.u
.side_s64
);
904 case SIDE_DYNAMIC_TYPE_BLOB
:
905 tracer_print_dynamic_basic_type_header(item
);
906 printf("0x%" PRIx8
, item
->u
.side_basic
.u
.side_blob
);
909 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY16
:
910 tracer_print_dynamic_basic_type_header(item
);
912 printf("%g", (double) item
->u
.side_basic
.u
.side_float_binary16
);
915 printf("ERROR: Unsupported binary16 float type\n");
918 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY32
:
919 tracer_print_dynamic_basic_type_header(item
);
921 printf("%g", (double) item
->u
.side_basic
.u
.side_float_binary32
);
924 printf("ERROR: Unsupported binary32 float type\n");
927 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY64
:
928 tracer_print_dynamic_basic_type_header(item
);
930 printf("%g", (double) item
->u
.side_basic
.u
.side_float_binary64
);
933 printf("ERROR: Unsupported binary64 float type\n");
936 case SIDE_DYNAMIC_TYPE_FLOAT_BINARY128
:
937 tracer_print_dynamic_basic_type_header(item
);
939 printf("%Lg", (long double) item
->u
.side_basic
.u
.side_float_binary128
);
942 printf("ERROR: Unsupported binary128 float type\n");
945 case SIDE_DYNAMIC_TYPE_STRING
:
946 tracer_print_dynamic_basic_type_header(item
);
947 printf("\"%s\"", item
->u
.side_basic
.u
.string
);
949 case SIDE_DYNAMIC_TYPE_STRUCT
:
950 tracer_print_dynamic_struct(item
->u
.side_dynamic_struct
);
952 case SIDE_DYNAMIC_TYPE_STRUCT_VISITOR
:
953 tracer_print_dynamic_struct_visitor(item
);
955 case SIDE_DYNAMIC_TYPE_VLA
:
956 tracer_print_dynamic_vla(item
->u
.side_dynamic_vla
);
958 case SIDE_DYNAMIC_TYPE_VLA_VISITOR
:
959 tracer_print_dynamic_vla_visitor(item
);
962 printf("<UNKNOWN TYPE>");
969 void tracer_print_static_fields(const struct side_event_description
*desc
,
970 const struct side_arg_vec_description
*sav_desc
,
973 const struct side_arg_vec
*sav
= sav_desc
->sav
;
974 uint32_t side_sav_len
= sav_desc
->len
;
977 printf("provider: %s, event: %s", desc
->provider_name
, desc
->event_name
);
978 if (desc
->nr_fields
!= side_sav_len
) {
979 printf("ERROR: number of fields mismatch between description and arguments\n");
982 print_attributes(", attributes: ", desc
->attr
, desc
->nr_attr
);
983 printf("%s", side_sav_len
? ", fields: [ " : "");
984 for (i
= 0; i
< side_sav_len
; i
++) {
985 printf("%s", i
? ", " : "");
986 tracer_print_field(&desc
->fields
[i
], &sav
[i
]);
994 void tracer_call(const struct side_event_description
*desc
,
995 const struct side_arg_vec_description
*sav_desc
,
996 void *priv
__attribute__((unused
)))
1000 tracer_print_static_fields(desc
, sav_desc
, &nr_fields
);
1004 void tracer_call_variadic(const struct side_event_description
*desc
,
1005 const struct side_arg_vec_description
*sav_desc
,
1006 const struct side_arg_dynamic_event_struct
*var_struct
,
1007 void *priv
__attribute__((unused
)))
1009 uint32_t var_struct_len
= var_struct
->len
;
1010 int nr_fields
= 0, i
;
1012 tracer_print_static_fields(desc
, sav_desc
, &nr_fields
);
1014 if (side_unlikely(!(desc
->flags
& SIDE_EVENT_FLAG_VARIADIC
))) {
1015 printf("ERROR: unexpected non-variadic event description\n");
1018 printf("%s", var_struct
->nr_attr
&& nr_fields
? ", " : "");
1019 print_attributes("attributes:: ", var_struct
->attr
, var_struct
->nr_attr
);
1020 printf("%s", var_struct_len
&& (nr_fields
|| var_struct
->nr_attr
) ? ", fields:: [ " : "");
1021 for (i
= 0; i
< var_struct_len
; i
++, nr_fields
++) {
1022 printf("%s", i
? ", " : "");
1023 printf("%s:: ", var_struct
->fields
[i
].field_name
);
1024 tracer_print_dynamic(&var_struct
->fields
[i
].elem
);