Support side_field_gather_vla in core type system
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 8 Nov 2022 13:18:35 +0000 (08:18 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 8 Nov 2022 13:18:35 +0000 (08:18 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
src/test.c
src/tracer.c

index 81e308869dfd49aab8e4a039e18f1f673e318ebc..9cfcc9f6a55b7f1fd479dcb6cafbdc21d5524603 100644 (file)
@@ -1868,6 +1868,7 @@ void test_gather_structnest(void)
 }
 
 uint32_t gathervla[] = { 1, 2, 3, 4 };
+uint32_t gathervla2[] = { 5, 6, 7, 8, 9 };
 
 struct testgathervla {
        int a;
@@ -1899,6 +1900,12 @@ side_static_event(my_provider_event_gathervla,
        side_field_list(
                side_field_gather_struct("structgathervla", &mystructgathervla, 0,
                                sizeof(struct testgathervla), SIDE_TYPE_GATHER_ACCESS_ADDRESS),
+               side_field_gather_vla("vla",
+                       side_elem(side_type_gather_unsigned_integer(0, 32, 0, 32, SIDE_TYPE_GATHER_ACCESS_ADDRESS, side_attr_list())),
+                       0, SIDE_TYPE_GATHER_ACCESS_ADDRESS,
+                       side_length(side_type_gather_unsigned_integer(0, 16, 0, 16, SIDE_TYPE_GATHER_ACCESS_ADDRESS, side_attr_list())),
+                       side_attr_list()
+               ),
        ),
        side_attr_list()
 );
@@ -1912,9 +1919,11 @@ void test_gather_vla(void)
                        .len = SIDE_ARRAY_SIZE(gathervla),
                        .p = gathervla,
                };
+               uint16_t vla2_len = 5;
                side_event_call(my_provider_event_gathervla,
                        side_arg_list(
                                side_arg_gather_struct(&mystruct),
+                               side_arg_gather_vla(gathervla2, &vla2_len),
                        )
                );
        }
index 70db6101348f063a71d0726d70b73da2987200aa..1debb54c76d5fee7734377ea9eb598308d86de12 100644 (file)
@@ -46,7 +46,8 @@ uint32_t tracer_print_gather_struct(const struct side_type_gather *type_gather,
 static
 uint32_t tracer_print_gather_array(const struct side_type_gather *type_gather, const void *_ptr);
 static
-uint32_t tracer_print_gather_vla(const struct side_type_gather *type_gather, const void *_ptr);
+uint32_t tracer_print_gather_vla(const struct side_type_gather *type_gather, const void *_ptr,
+               const void *_length_ptr);
 static
 void tracer_print_type(const struct side_type *type_desc, const struct side_arg *item);
 
@@ -913,6 +914,10 @@ void tracer_print_type(const struct side_type *type_desc, const struct side_arg
        case SIDE_TYPE_GATHER_ARRAY:
                (void) tracer_print_gather_array(&type_desc->u.side_gather, item->u.side_static.side_array_gather_ptr);
                break;
+       case SIDE_TYPE_GATHER_VLA:
+               (void) tracer_print_gather_vla(&type_desc->u.side_gather, item->u.side_static.side_vla_gather.ptr,
+                               item->u.side_static.side_vla_gather.length_ptr);
+               break;
        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;
@@ -984,9 +989,6 @@ void tracer_print_type(const struct side_type *type_desc, const struct side_arg
        case SIDE_TYPE_DYNAMIC_VLA_VISITOR:
                tracer_print_dynamic(item);
                break;
-       case SIDE_TYPE_GATHER_VLA:
-               fprintf(stderr, "<gather VLA only supported within gather structures>\n");
-               abort();
        default:
                fprintf(stderr, "<UNKNOWN TYPE>");
                abort();
@@ -1197,7 +1199,7 @@ uint32_t tracer_print_gather_type(const struct side_type *type_desc, const void
                len = tracer_print_gather_array(&type_desc->u.side_gather, ptr);
                break;
        case SIDE_TYPE_GATHER_VLA:
-               len = tracer_print_gather_vla(&type_desc->u.side_gather, ptr);
+               len = tracer_print_gather_vla(&type_desc->u.side_gather, ptr, ptr);
                break;
        default:
                fprintf(stderr, "<UNKNOWN GATHER TYPE>");
@@ -1262,10 +1264,12 @@ uint32_t tracer_print_gather_array(const struct side_type_gather *type_gather, c
 }
 
 static
-uint32_t tracer_print_gather_vla(const struct side_type_gather *type_gather, const void *_ptr)
+uint32_t tracer_print_gather_vla(const struct side_type_gather *type_gather, const void *_ptr,
+               const void *_length_ptr)
 {
        enum side_type_gather_access_mode access_mode = type_gather->u.side_vla.access_mode;
        const char *ptr = (const char *) _ptr, *orig_ptr;
+       const char *length_ptr = (const char *) _length_ptr;
        uint32_t i, length;
 
        /* Access length */
@@ -1277,7 +1281,7 @@ uint32_t tracer_print_gather_vla(const struct side_type_gather *type_gather, con
                fprintf(stderr, "<gather VLA expects integer gather length type>\n");
                abort();
        }
-       length = (uint32_t) tracer_load_gather_integer_type(&type_gather->u.side_vla.length_type->u.side_gather, ptr);
+       length = (uint32_t) tracer_load_gather_integer_type(&type_gather->u.side_vla.length_type->u.side_gather, length_ptr);
        ptr = tracer_gather_access(access_mode, ptr + type_gather->u.side_vla.offset);
        orig_ptr = ptr;
        print_attributes("attr", ":", type_gather->u.side_vla.type.attr, type_gather->u.side_vla.type.nr_attr);
This page took 0.025496 seconds and 4 git commands to generate.