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 */
#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, \
#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) } } }
}
}
+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();
test_gather_vla_flex();
test_gather_byte();
test_gather_bool();
+ test_gather_pointer();
return 0;
}
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
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);
}
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;
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);
}
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);