static
void tracer_print_struct(const struct side_type *type_desc, const struct side_arg_vec *side_arg_vec);
static
+void tracer_print_variant(const struct side_type *type_desc, const struct side_arg_variant *side_arg_variant);
+static
void tracer_print_array(const struct side_type *type_desc, const struct side_arg_vec *side_arg_vec);
static
void tracer_print_vla(const struct side_type *type_desc, const struct side_arg_vec *side_arg_vec);
char *utf8_str = NULL;
bool cmp;
- tracer_convert_string_to_utf8(attr->key.p, attr->key.unit_size,
+ tracer_convert_string_to_utf8(side_ptr_get(attr->key.p), attr->key.unit_size,
attr->key.byte_order, NULL, &utf8_str);
cmp = strcmp(utf8_str, "std.integer.base");
- if (utf8_str != attr->key.p)
+ if (utf8_str != side_ptr_get(attr->key.p))
free(utf8_str);
if (!cmp) {
int64_t val = get_attr_integer_value(attr);
{
char *utf8_str = NULL;
- tracer_convert_string_to_utf8(attr->key.p, attr->key.unit_size,
+ tracer_convert_string_to_utf8(side_ptr_get(attr->key.p), attr->key.unit_size,
attr->key.byte_order, NULL, &utf8_str);
printf("{ key%s \"%s\", value%s ", separator, utf8_str, separator);
- if (utf8_str != attr->key.p)
+ if (utf8_str != side_ptr_get(attr->key.p))
free(utf8_str);
switch (attr->value.type) {
case SIDE_ATTR_TYPE_BOOL:
fprintf(stderr, "ERROR: Unsupported binary128 float type\n");
abort();
#endif
- case SIDE_ATTR_TYPE_STRING_UTF8:
- tracer_print_string((const void *)(uintptr_t) attr->value.u.string_value,
- 1, SIDE_TYPE_BYTE_ORDER_HOST, NULL);
- break;
- case SIDE_ATTR_TYPE_STRING_UTF16:
- tracer_print_string((const void *)(uintptr_t) attr->value.u.string_value,
- 2, SIDE_TYPE_BYTE_ORDER_HOST, NULL);
- break;
- case SIDE_ATTR_TYPE_STRING_UTF32:
- tracer_print_string((const void *)(uintptr_t) attr->value.u.string_value,
- 4, SIDE_TYPE_BYTE_ORDER_HOST, NULL);
+ case SIDE_ATTR_TYPE_STRING:
+ tracer_print_string(side_ptr_get(attr->value.u.string_value.p),
+ attr->value.u.string_value.unit_size,
+ attr->value.u.string_value.byte_order, NULL);
break;
default:
fprintf(stderr, "ERROR: <UNKNOWN ATTRIBUTE TYPE>");
}
if (v64.s >= mapping->range_begin && v64.s <= mapping->range_end) {
printf("%s", print_count++ ? ", " : "");
- printf("\"%s\"", mapping->label);
+ tracer_print_string(side_ptr_get(mapping->label.p), mapping->label.unit_size, mapping->label.byte_order, NULL);
}
}
if (!print_count)
match:
if (match) {
printf("%s", print_count++ ? ", " : "");
- printf("\"%s\"", mapping->label);
+ tracer_print_string(side_ptr_get(mapping->label.p), mapping->label.unit_size, mapping->label.byte_order, NULL);
}
}
if (!print_count)
switch (type) {
/* Stack-copy basic types */
case SIDE_TYPE_NULL:
- tracer_print_type_header(":", type_desc->u.side_null.attr, type_desc->u.side_null.nr_attr);
+ tracer_print_type_header(":", side_ptr_get(type_desc->u.side_null.attr),
+ type_desc->u.side_null.nr_attr);
printf("<NULL TYPE>");
break;
case SIDE_TYPE_STRUCT:
tracer_print_struct(type_desc, item->u.side_static.side_struct);
break;
+ case SIDE_TYPE_VARIANT:
+ tracer_print_variant(type_desc, item->u.side_static.side_variant);
+ break;
case SIDE_TYPE_ARRAY:
tracer_print_array(type_desc, item->u.side_static.side_array);
break;
printf(" }");
}
+static
+void tracer_print_variant(const struct side_type *type_desc, const struct side_arg_variant *side_arg_variant)
+{
+ const struct side_type_variant *side_type_variant = type_desc->u.side_variant;
+ const struct side_type *selector_type = &side_type_variant->selector;
+ union int64_value v64;
+ uint32_t i;
+
+ if (selector_type->type != side_arg_variant->selector.type) {
+ fprintf(stderr, "ERROR: Unexpected variant selector type\n");
+ abort();
+ }
+ switch (selector_type->type) {
+ case SIDE_TYPE_U8:
+ case SIDE_TYPE_U16:
+ case SIDE_TYPE_U32:
+ case SIDE_TYPE_U64:
+ case SIDE_TYPE_S8:
+ case SIDE_TYPE_S16:
+ case SIDE_TYPE_S32:
+ case SIDE_TYPE_S64:
+ break;
+ default:
+ fprintf(stderr, "ERROR: Expecting integer variant selector type\n");
+ abort();
+ }
+ v64 = tracer_load_integer_value(&selector_type->u.side_integer,
+ &side_arg_variant->selector.u.side_static.integer_value, 0, NULL);
+ for (i = 0; i < side_type_variant->nr_options; i++) {
+ const struct side_variant_option *option = &side_type_variant->options[i];
+
+ if (v64.s >= option->range_begin && v64.s <= option->range_end) {
+ tracer_print_type(&option->side_type, &side_arg_variant->option);
+ return;
+ }
+ }
+ fprintf(stderr, "ERROR: Variant selector value unknown %" PRId64 "\n", v64.s);
+ abort();
+}
+
static
void tracer_print_array(const struct side_type *type_desc, const struct side_arg_vec *side_arg_vec)
{
return ptr;
case SIDE_TYPE_GATHER_ACCESS_POINTER:
/* Dereference pointer */
- memcpy(&ptr, ptr, sizeof(ptr));
+ memcpy(&ptr, ptr, sizeof(const char *));
return ptr;
default:
abort();
switch (item->type) {
/* Dynamic basic types */
case SIDE_TYPE_DYNAMIC_NULL:
- tracer_print_type_header("::", item->u.side_dynamic.side_null.attr, item->u.side_dynamic.side_null.nr_attr);
+ tracer_print_type_header("::", side_ptr_get(item->u.side_dynamic.side_null.attr),
+ item->u.side_dynamic.side_null.nr_attr);
printf("<NULL TYPE>");
break;
case SIDE_TYPE_DYNAMIC_BOOL:
printf(" ]");
}
+static
void tracer_call(const struct side_event_description *desc,
const struct side_arg_vec *side_arg_vec,
void *priv __attribute__((unused)))
printf("\n");
}
+static
void tracer_call_variadic(const struct side_event_description *desc,
const struct side_arg_vec *side_arg_vec,
const struct side_arg_dynamic_struct *var_struct,
printf("\n");
}
+static
void tracer_event_notification(enum side_tracer_notification notif,
- struct side_event_description **events, uint32_t nr_events, void *priv)
+ struct side_event_description **events, uint32_t nr_events,
+ void *priv __attribute__((unused)))
{
uint32_t i;
int ret;
continue;
printf("provider: %s, event: %s\n",
event->provider_name, event->event_name);
- if (notif == SIDE_TRACER_NOTIFICATION_INSERT_EVENTS) {
+ if (notif == SIDE_TRACER_NOTIFICATION_INSERT_EVENTS) {
if (event->flags & SIDE_EVENT_FLAG_VARIADIC) {
ret = side_tracer_callback_variadic_register(event, tracer_call_variadic, NULL);
if (ret)