Implement pointer gather
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 8 Nov 2022 21:36:36 +0000 (16:36 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 8 Nov 2022 21:36:36 +0000 (16:36 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/side/trace.h
src/test.c
src/tracer.c

index 752a524c64aefe64f4c87b8ffaa05aa0ca2816fa..5babd3e03f681357bba3578624f1cbb76cef53fe 100644 (file)
@@ -122,6 +122,7 @@ enum side_type_label {
        SIDE_TYPE_GATHER_UNSIGNED_INT,
        SIDE_TYPE_GATHER_SIGNED_INT,
        SIDE_TYPE_GATHER_BYTE,
+       SIDE_TYPE_GATHER_POINTER,
        SIDE_TYPE_GATHER_FLOAT,
 
        /* Gather compound types */
@@ -1109,6 +1110,24 @@ struct side_event_description {
 #define side_field_gather_signed_integer_be(_name, _integer_offset, _integer_size, _offset_bits, _len_bits, _access_mode, _attr) \
        _side_field(_name, side_type_gather_signed_integer_be(_integer_offset, _integer_size, _offset_bits, _len_bits, _access_mode, SIDE_PARAM(_attr)))
 
+#define side_type_gather_pointer(_offset, _access_mode, _attr) \
+       _side_type_gather_integer(SIDE_TYPE_GATHER_POINTER, false, SIDE_TYPE_BYTE_ORDER_HOST, \
+                       _offset, sizeof(uintptr_t), 0, 0, _access_mode, SIDE_PARAM(_attr))
+#define side_field_gather_pointer(_name, _offset, _access_mode, _attr) \
+       _side_field(_name, side_type_gather_pointer(_offset, _access_mode, SIDE_PARAM(_attr)))
+
+#define side_type_gather_pointer_le(_offset, _access_mode, _attr) \
+       _side_type_gather_integer(SIDE_TYPE_GATHER_POINTER, false, SIDE_TYPE_BYTE_ORDER_LE, \
+                       _offset, sizeof(uintptr_t), 0, 0, _access_mode, SIDE_PARAM(_attr))
+#define side_field_gather_pointer_le(_name, _offset, _access_mode, _attr) \
+       _side_field(_name, side_type_gather_pointer_le(_offset, _access_mode, SIDE_PARAM(_attr)))
+
+#define side_type_gather_pointer_be(_offset, _access_mode, _attr) \
+       _side_type_gather_integer(SIDE_TYPE_GATHER_POINTER, false, SIDE_TYPE_BYTE_ORDER_BE, \
+                       _offset, sizeof(uintptr_t), 0, 0, _access_mode, SIDE_PARAM(_attr))
+#define side_field_gather_pointer_be(_name, _offset, _access_mode, _attr) \
+       _side_field(_name, side_type_gather_pointer_be(_offset, _access_mode, SIDE_PARAM(_attr)))
+
 #define _side_type_gather_float(_byte_order, _offset, _float_size, _access_mode, _attr) \
        { \
                .type = SIDE_TYPE_GATHER_FLOAT, \
@@ -1254,6 +1273,7 @@ struct side_event_description {
 
 #define side_arg_gather_bool(_ptr)             { .type = SIDE_TYPE_GATHER_BOOL, .u = { .side_static = { .side_bool_gather_ptr = (_ptr) } } }
 #define side_arg_gather_byte(_ptr)             { .type = SIDE_TYPE_GATHER_BYTE, .u = { .side_static = { .side_byte_gather_ptr = (_ptr) } } }
+#define side_arg_gather_pointer(_ptr)          { .type = SIDE_TYPE_GATHER_POINTER, .u = { .side_static = { .side_integer_gather_ptr = (_ptr) } } }
 #define side_arg_gather_unsigned_integer(_ptr) { .type = SIDE_TYPE_GATHER_UNSIGNED_INT, .u = { .side_static = { .side_integer_gather_ptr = (_ptr) } } }
 #define side_arg_gather_signed_integer(_ptr)   { .type = SIDE_TYPE_GATHER_SIGNED_INT, .u = { .side_static = { .side_integer_gather_ptr = (_ptr) } } }
 #define side_arg_gather_float(_ptr)            { .type = SIDE_TYPE_GATHER_FLOAT, .u = { .side_static = { .side_float_gather_ptr = (_ptr) } } }
index 470713e84a79c1b0875414264b6919cc28893c40..1f2bea4864efc68a88e317abee1772fee3105b2c 100644 (file)
@@ -2010,6 +2010,33 @@ void test_gather_bool(void)
        }
 }
 
+side_static_event(my_provider_event_gatherpointer,
+       "myprovider", "myeventgatherpointer", SIDE_LOGLEVEL_DEBUG,
+       side_field_list(
+               side_field_gather_pointer("ptr", 0, SIDE_TYPE_GATHER_ACCESS_DIRECT, side_attr_list()),
+               side_field_gather_array("array",
+                       side_elem(side_type_gather_pointer(0, SIDE_TYPE_GATHER_ACCESS_DIRECT, side_attr_list())),
+                       3, 0, SIDE_TYPE_GATHER_ACCESS_DIRECT, side_attr_list()
+               ),
+       ),
+       side_attr_list()
+);
+
+static
+void test_gather_pointer(void)
+{
+       side_event_cond(my_provider_event_structgatherarray) {
+               void *v = (void *)0x44;
+               void *array[3] = { (void *)0x1, (void *)0x2, (void *)0x3 };
+
+               side_event_call(my_provider_event_gatherpointer,
+                       side_arg_list(
+                               side_arg_gather_pointer(&v),
+                               side_arg_gather_array(array),
+                       )
+               );
+       }
+}
 int main()
 {
        test_fields();
@@ -2057,5 +2084,6 @@ int main()
        test_gather_vla_flex();
        test_gather_byte();
        test_gather_bool();
+       test_gather_pointer();
        return 0;
 }
index 9ae6d94751f23a78ee3e3cee7967acff54aabb6c..8d01890fec70f4d2c4f9209e8ecd447e3d24dcb6 100644 (file)
@@ -36,7 +36,8 @@ uint32_t tracer_print_gather_bool_type(const struct side_type_gather *type_gathe
 static
 uint32_t tracer_print_gather_byte_type(const struct side_type_gather *type_gather, const void *_ptr);
 static
-uint32_t tracer_print_gather_integer_type(const struct side_type_gather *type_gather, const void *_ptr);
+uint32_t tracer_print_gather_integer_type(const struct side_type_gather *type_gather, const void *_ptr,
+               enum tracer_display_base default_base);
 static
 uint32_t tracer_print_gather_float_type(const struct side_type_gather *type_gather, const void *_ptr);
 static
@@ -942,9 +943,14 @@ void tracer_print_type(const struct side_type *type_desc, const struct side_arg
        case SIDE_TYPE_GATHER_BYTE:
                (void) tracer_print_gather_byte_type(&type_desc->u.side_gather, item->u.side_static.side_byte_gather_ptr);
                break;
+       case SIDE_TYPE_GATHER_POINTER:
+               (void) tracer_print_gather_integer_type(&type_desc->u.side_gather, item->u.side_static.side_integer_gather_ptr,
+                                       TRACER_DISPLAY_BASE_16);
+               break;
        case SIDE_TYPE_GATHER_UNSIGNED_INT:
        case SIDE_TYPE_GATHER_SIGNED_INT:
-               (void) tracer_print_gather_integer_type(&type_desc->u.side_gather, item->u.side_static.side_integer_gather_ptr);
+               (void) tracer_print_gather_integer_type(&type_desc->u.side_gather, item->u.side_static.side_integer_gather_ptr,
+                                       TRACER_DISPLAY_BASE_10);
                break;
        case SIDE_TYPE_GATHER_FLOAT:
                (void) tracer_print_gather_float_type(&type_desc->u.side_gather, item->u.side_static.side_float_gather_ptr);
@@ -1148,7 +1154,8 @@ uint32_t tracer_print_gather_byte_type(const struct side_type_gather *type_gathe
 }
 
 static
-uint32_t tracer_print_gather_integer_type(const struct side_type_gather *type_gather, const void *_ptr)
+uint32_t tracer_print_gather_integer_type(const struct side_type_gather *type_gather, const void *_ptr,
+               enum tracer_display_base default_base)
 {
        enum side_type_gather_access_mode access_mode = type_gather->u.side_integer.access_mode;
        uint32_t integer_size_bytes = type_gather->u.side_integer.type.integer_size;
@@ -1167,7 +1174,7 @@ uint32_t tracer_print_gather_integer_type(const struct side_type_gather *type_ga
        ptr = tracer_gather_access(access_mode, ptr + type_gather->u.side_integer.offset);
        memcpy(&value, ptr, integer_size_bytes);
        tracer_print_type_integer(":", &type_gather->u.side_integer.type, &value,
-                       type_gather->u.side_integer.offset_bits, TRACER_DISPLAY_BASE_10);
+                       type_gather->u.side_integer.offset_bits, default_base);
        return tracer_gather_size(access_mode, integer_size_bytes);
 }
 
@@ -1207,9 +1214,14 @@ uint32_t tracer_print_gather_type(const struct side_type *type_desc, const void
        case SIDE_TYPE_GATHER_BYTE:
                len = tracer_print_gather_byte_type(&type_desc->u.side_gather, ptr);
                break;
+       case SIDE_TYPE_GATHER_POINTER:
+               len = tracer_print_gather_integer_type(&type_desc->u.side_gather, ptr,
+                               TRACER_DISPLAY_BASE_16);
+               break;
        case SIDE_TYPE_GATHER_UNSIGNED_INT:
        case SIDE_TYPE_GATHER_SIGNED_INT:
-               len = tracer_print_gather_integer_type(&type_desc->u.side_gather, ptr);
+               len = tracer_print_gather_integer_type(&type_desc->u.side_gather, ptr,
+                               TRACER_DISPLAY_BASE_10);
                break;
        case SIDE_TYPE_GATHER_FLOAT:
                len = tracer_print_gather_float_type(&type_desc->u.side_gather, ptr);
This page took 0.027673 seconds and 4 git commands to generate.