Use side_ptr_t for side_type_null attr pointer
[libside.git] / src / tracer.c
index 8dd938807912af54f86fe2bb00b805e1b900795f..5e3157f8ab7d77afa0461ee193c7d8c88f7d6516 100644 (file)
@@ -30,6 +30,8 @@ static struct side_tracer_handle *tracer_handle;
 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);
@@ -227,10 +229,10 @@ enum tracer_display_base get_attr_display_base(const struct side_attr *_attr, ui
                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);
@@ -258,10 +260,10 @@ void tracer_print_attr_type(const char *separator, const struct side_attr *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:
@@ -324,7 +326,7 @@ void tracer_print_attr_type(const char *separator, const struct side_attr *attr)
                abort();
 #endif
        case SIDE_ATTR_TYPE_STRING:
-               tracer_print_string(attr->value.u.string_value.p,
+               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;
@@ -458,7 +460,7 @@ void print_enum_labels(const struct side_enum_mappings *mappings, union int64_va
                }
                if (v64.s >= mapping->range_begin && v64.s <= mapping->range_end) {
                        printf("%s", print_count++ ? ", " : "");
-                       tracer_print_string(mapping->label.p, mapping->label.unit_size, mapping->label.byte_order, NULL);
+                       tracer_print_string(side_ptr_get(mapping->label.p), mapping->label.unit_size, mapping->label.byte_order, NULL);
                }
        }
        if (!print_count)
@@ -587,7 +589,7 @@ void tracer_print_enum_bitmap(const struct side_type *type_desc,
 match:
                if (match) {
                        printf("%s", print_count++ ? ", " : "");
-                       tracer_print_string(mapping->label.p, mapping->label.unit_size, mapping->label.byte_order, NULL);
+                       tracer_print_string(side_ptr_get(mapping->label.p), mapping->label.unit_size, mapping->label.byte_order, NULL);
                }
        }
        if (!print_count)
@@ -902,7 +904,8 @@ void tracer_print_type(const struct side_type *type_desc, const struct side_arg
        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;
 
@@ -951,6 +954,9 @@ void tracer_print_type(const struct side_type *type_desc, const struct side_arg
        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;
@@ -1058,6 +1064,46 @@ void tracer_print_struct(const struct side_type *type_desc, const struct side_ar
        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)
 {
@@ -1104,7 +1150,7 @@ const char *tracer_gather_access(enum side_type_gather_access_mode access_mode,
                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();
@@ -1612,7 +1658,8 @@ void tracer_print_dynamic(const struct side_arg *item)
        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:
@@ -1742,7 +1789,7 @@ void tracer_event_notification(enum side_tracer_notification notif,
                        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)
This page took 0.027734 seconds and 4 git commands to generate.