Refactoring: Use tracer_print_type_integer for scatter-gather type
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 4 Nov 2022 14:05:45 +0000 (10:05 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 4 Nov 2022 14:05:45 +0000 (10:05 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/side/trace.h
src/tracer.c

index 53c287cf28e8573a7641bcc0ba6fd6663096f6bc..a3be0fe8f4a6aea162afdace46f34abe914e00cb 100644 (file)
@@ -240,6 +240,22 @@ struct side_attr {
        const struct side_attr_value value;
 };
 
+struct side_type_integer {
+       const struct side_attr *attr;
+       uint32_t nr_attr;
+       uint16_t integer_size_bits;     /* bits */
+       uint16_t len_bits;              /* bits */
+       uint8_t signedness;             /* true/false */
+       uint8_t byte_order;             /* enum side_type_byte_order */
+};
+
+struct side_type_float {
+       const struct side_attr *attr;
+       uint32_t nr_attr;
+       uint32_t byte_order;            /* enum side_type_byte_order */
+       uint16_t float_size_bits;       /* bits */
+};
+
 struct side_enum_mapping {
        int64_t range_begin;
        int64_t range_end;
@@ -274,18 +290,13 @@ struct side_type_struct {
 };
 
 struct side_type_sg_description {
-       uint32_t type;  /* enum side_type_sg */
+       uint64_t offset;        /* bytes */
+       uint32_t type;          /* enum side_type_sg */
        union {
-               /* Basic types */
                struct {
-                       uint64_t integer_offset;        /* bytes */
-                       const struct side_attr *attr;
-                       uint32_t nr_attr;
-                       uint32_t byte_order;            /* enum side_type_byte_order */
-                       uint8_t integer_size_bits;      /* bits */
-                       uint8_t offset_bits;            /* bits */
-                       uint8_t len_bits;               /* bits */
-               } side_basic;
+                       struct side_type_integer type;
+                       uint16_t offset_bits;           /* bits */
+               } side_integer;
        } u;
 };
 
@@ -302,22 +313,6 @@ struct side_type_struct_sg {
        const struct side_attr *attr;
 };
 
-struct side_type_integer {
-       const struct side_attr *attr;
-       uint32_t nr_attr;
-       uint16_t integer_size_bits;     /* bits */
-       uint16_t len_bits;              /* bits */
-       uint8_t signedness;             /* true/false */
-       uint8_t byte_order;             /* enum side_type_byte_order */
-};
-
-struct side_type_float {
-       const struct side_attr *attr;
-       uint32_t nr_attr;
-       uint32_t byte_order;            /* enum side_type_byte_order */
-       uint16_t float_size_bits;       /* bits */
-};
-
 struct side_type_description {
        uint32_t type;  /* enum side_type */
        union {
@@ -752,18 +747,21 @@ struct side_tracer_dynamic_vla_visitor_ctx {
 
 /* Scatter-gather struct */
 
-#define _side_type_sg_integer(_type, _byte_order, _integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
+#define _side_type_sg_integer(_type, _signedness, _byte_order, _offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
        { \
+               .offset = _offset, \
                .type = _type, \
                .u = { \
-                       .side_basic = { \
-                               .attr = _attr, \
-                               .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
-                               .byte_order = _byte_order, \
-                               .integer_offset = _integer_offset, \
-                               .integer_size_bits = _integer_size_bits, \
+                       .side_integer = { \
+                               .type = { \
+                                       .attr = _attr, \
+                                       .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
+                                       .integer_size_bits = _integer_size_bits, \
+                                       .len_bits = _len_bits, \
+                                       .signedness = _signedness, \
+                                       .byte_order = _byte_order, \
+                               }, \
                                .offset_bits = _offset_bits, \
-                               .len_bits = _len_bits, \
                        }, \
                }, \
        }
@@ -775,10 +773,10 @@ struct side_tracer_dynamic_vla_visitor_ctx {
        }
 
 #define side_type_sg_unsigned_integer(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
-       _side_type_sg_integer(SIDE_TYPE_SG_UNSIGNED_INT, SIDE_TYPE_BYTE_ORDER_HOST, \
+       _side_type_sg_integer(SIDE_TYPE_SG_UNSIGNED_INT, false,  SIDE_TYPE_BYTE_ORDER_HOST, \
                        _integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr))
 #define side_type_sg_signed_integer(_integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
-       _side_type_sg_integer(SIDE_TYPE_SG_SIGNED_INT, SIDE_TYPE_BYTE_ORDER_HOST, \
+       _side_type_sg_integer(SIDE_TYPE_SG_SIGNED_INT, true, SIDE_TYPE_BYTE_ORDER_HOST, \
                        _integer_offset, _integer_size_bits, _offset_bits, _len_bits, SIDE_PARAM(_attr))
 
 #define side_field_sg_unsigned_integer(_name, _integer_offset, _integer_size_bits, _offset_bits, _len_bits, _attr) \
index 0fd484d931c122afe675937759b46962435be1c2..6a291bb4cad4f0c1164f4f1ced8b5534b6731323 100644 (file)
@@ -147,23 +147,6 @@ bool type_to_host_reverse_bo(const struct side_type_description *type_desc)
        }
 }
 
-static
-bool sg_type_to_host_reverse_bo(const struct side_type_sg_description *sg_type)
-{
-       switch (sg_type->type) {
-       case SIDE_TYPE_SG_UNSIGNED_INT:
-       case SIDE_TYPE_SG_SIGNED_INT:
-               if (sg_type->u.side_basic.byte_order != SIDE_TYPE_BYTE_ORDER_HOST)
-                       return true;
-               else
-                       return false;
-               break;
-       default:
-               fprintf(stderr, "Unexpected type\n");
-               abort();
-       }
-}
-
 static
 bool dynamic_type_to_host_reverse_bo(const struct side_arg_dynamic_vec *item)
 {
@@ -565,7 +548,8 @@ void tracer_print_type_header(const char *separator,
 static
 void tracer_print_type_integer(const char *separator,
                const struct side_type_integer *type_integer,
-               const union side_integer_value *value)
+               const union side_integer_value *value,
+               uint16_t offset_bits)
 {
        enum tracer_display_base base;
        bool reverse_bo;
@@ -575,7 +559,7 @@ void tracer_print_type_integer(const char *separator,
        } v;
 
        if (!type_integer->len_bits ||
-                       type_integer->len_bits > type_integer->integer_size_bits)
+                       type_integer->len_bits + offset_bits > type_integer->integer_size_bits)
                abort();
        reverse_bo = type_integer->byte_order != SIDE_TYPE_BYTE_ORDER_HOST;
        base = get_attr_display_base(type_integer->attr,
@@ -641,6 +625,7 @@ void tracer_print_type_integer(const char *separator,
        default:
                abort();
        }
+       v.v_unsigned >>= offset_bits;
        if (type_integer->len_bits < 64)
                v.v_unsigned &= (1ULL << type_integer->len_bits) - 1;
        tracer_print_type_header(separator, type_integer->attr, type_integer->nr_attr);
@@ -877,8 +862,7 @@ void tracer_print_type(const struct side_type_description *type_desc, const stru
        case SIDE_TYPE_S16:
        case SIDE_TYPE_S32:
        case SIDE_TYPE_S64:
-               tracer_print_type_integer(":", &type_desc->u.side_integer,
-                                       &item->u.integer_value);
+               tracer_print_type_integer(":", &type_desc->u.side_integer, &item->u.integer_value, 0);
                break;
 
        case SIDE_TYPE_POINTER32:
@@ -1008,312 +992,29 @@ void tracer_print_struct(const struct side_type_description *type_desc, const st
        printf(" }");
 }
 
-static
-void tracer_print_sg_integer_type_header(const struct side_type_sg_description *sg_type)
-{
-       print_attributes("attr", ":", sg_type->u.side_basic.attr, sg_type->u.side_basic.nr_attr);
-       printf("%s", sg_type->u.side_basic.nr_attr ? ", " : "");
-       printf("value: ");
-}
-
 static
 void tracer_print_sg_type(const struct side_type_sg_description *sg_type, void *_ptr)
 {
-       enum tracer_display_base base = TRACER_DISPLAY_BASE_10;
        const char *ptr = (const char *) _ptr;
-
-       switch (sg_type->type) {
-       case SIDE_TYPE_SG_UNSIGNED_INT:
-       case SIDE_TYPE_SG_SIGNED_INT:
-               base = get_attr_display_base(sg_type->u.side_basic.attr,
-                               sg_type->u.side_basic.nr_attr);
-               break;
-       default:
-               break;
-       }
+       union side_integer_value value;
 
        printf("{ ");
        switch (sg_type->type) {
        case SIDE_TYPE_SG_UNSIGNED_INT:
-       {
-               tracer_print_sg_integer_type_header(sg_type);
-               switch (sg_type->u.side_basic.integer_size_bits) {
-               case 8:
-               {
-                       uint8_t v;
-
-                       if (!sg_type->u.side_basic.len_bits || sg_type->u.side_basic.len_bits + sg_type->u.side_basic.offset_bits > 8)
-                               abort();
-                       memcpy(&v, ptr + sg_type->u.side_basic.integer_offset, sizeof(v));
-                       v >>= sg_type->u.side_basic.offset_bits;
-                       if (sg_type->u.side_basic.len_bits < 8)
-                               v &= (1U << sg_type->u.side_basic.len_bits) - 1;
-                       switch (base) {
-                       case TRACER_DISPLAY_BASE_2:
-                               print_integer_binary(v, sg_type->u.side_basic.len_bits);
-                               break;
-                       case TRACER_DISPLAY_BASE_8:
-                               printf("0%" PRIo8, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_10:
-                               printf("%" PRIu8, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_16:
-                               printf("0x%" PRIx8, v);
-                               break;
-                       default:
-                               abort();
-                       }
-                       break;
-               }
-               case 16:
-               {
-                       uint16_t v;
-
-                       if (!sg_type->u.side_basic.len_bits || sg_type->u.side_basic.len_bits + sg_type->u.side_basic.offset_bits > 16)
-                               abort();
-                       memcpy(&v, ptr + sg_type->u.side_basic.integer_offset, sizeof(v));
-                       if (sg_type_to_host_reverse_bo(sg_type))
-                               v = side_bswap_16(v);
-                       v >>= sg_type->u.side_basic.offset_bits;
-                       if (sg_type->u.side_basic.len_bits < 16)
-                               v &= (1U << sg_type->u.side_basic.len_bits) - 1;
-                       switch (base) {
-                       case TRACER_DISPLAY_BASE_2:
-                               print_integer_binary(v, sg_type->u.side_basic.len_bits);
-                               break;
-                       case TRACER_DISPLAY_BASE_8:
-                               printf("0%" PRIo16, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_10:
-                               printf("%" PRIu16, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_16:
-                               printf("0x%" PRIx16, v);
-                               break;
-                       default:
-                               abort();
-                       }
-                       break;
-               }
-               case 32:
-               {
-                       uint32_t v;
-
-                       if (!sg_type->u.side_basic.len_bits || sg_type->u.side_basic.len_bits + sg_type->u.side_basic.offset_bits > 32)
-                               abort();
-                       memcpy(&v, ptr + sg_type->u.side_basic.integer_offset, sizeof(v));
-                       if (sg_type_to_host_reverse_bo(sg_type))
-                               v = side_bswap_32(v);
-                       v >>= sg_type->u.side_basic.offset_bits;
-                       if (sg_type->u.side_basic.len_bits < 32)
-                               v &= (1U << sg_type->u.side_basic.len_bits) - 1;
-                       switch (base) {
-                       case TRACER_DISPLAY_BASE_2:
-                               print_integer_binary(v, sg_type->u.side_basic.len_bits);
-                               break;
-                       case TRACER_DISPLAY_BASE_8:
-                               printf("0%" PRIo32, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_10:
-                               printf("%" PRIu32, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_16:
-                               printf("0x%" PRIx32, v);
-                               break;
-                       default:
-                               abort();
-                       }
-                       break;
-               }
-               case 64:
-               {
-                       uint64_t v;
-
-                       if (!sg_type->u.side_basic.len_bits || sg_type->u.side_basic.len_bits + sg_type->u.side_basic.offset_bits > 64)
-                               abort();
-                       memcpy(&v, ptr + sg_type->u.side_basic.integer_offset, sizeof(v));
-                       if (sg_type_to_host_reverse_bo(sg_type))
-                               v = side_bswap_64(v);
-                       v >>= sg_type->u.side_basic.offset_bits;
-                       if (sg_type->u.side_basic.len_bits < 64)
-                               v &= (1ULL << sg_type->u.side_basic.len_bits) - 1;
-                       switch (base) {
-                       case TRACER_DISPLAY_BASE_2:
-                               print_integer_binary(v, sg_type->u.side_basic.len_bits);
-                               break;
-                       case TRACER_DISPLAY_BASE_8:
-                               printf("0%" PRIo64, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_10:
-                               printf("%" PRIu64, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_16:
-                               printf("0x%" PRIx64, v);
-                               break;
-                       default:
-                               abort();
-                       }
-                       break;
-               }
-               default:
-                       fprintf(stderr, "<UNKNOWN SCATTER-GATHER INTEGER SIZE>");
-                       abort();
-               }
-               break;
-       }
        case SIDE_TYPE_SG_SIGNED_INT:
-       {
-               tracer_print_sg_integer_type_header(sg_type);
-               switch (sg_type->u.side_basic.integer_size_bits) {
+               switch (sg_type->u.side_integer.type.integer_size_bits) {
                case 8:
-               {
-                       int8_t v;
-
-                       if (!sg_type->u.side_basic.len_bits || sg_type->u.side_basic.len_bits + sg_type->u.side_basic.offset_bits > 8)
-                               abort();
-                       memcpy(&v, ptr + sg_type->u.side_basic.integer_offset, sizeof(v));
-                       v >>= sg_type->u.side_basic.offset_bits;
-                       if (sg_type->u.side_basic.len_bits < 8)
-                               v &= (1U << sg_type->u.side_basic.len_bits) - 1;
-                       switch (base) {
-                       case TRACER_DISPLAY_BASE_2:
-                               print_integer_binary(v, sg_type->u.side_basic.len_bits);
-                               break;
-                       case TRACER_DISPLAY_BASE_8:
-                               printf("0%" PRIo8, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_10:
-                               /* Sign-extend. */
-                               if (sg_type->u.side_basic.len_bits < 8) {
-                                       if (v & (1U << (sg_type->u.side_basic.len_bits - 1)))
-                                               v |= ~((1U << sg_type->u.side_basic.len_bits) - 1);
-                               }
-                               printf("%" PRId8, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_16:
-                               printf("0x%" PRIx8, v);
-                               break;
-                       default:
-                               abort();
-                       }
-                       break;
-               }
                case 16:
-               {
-                       int16_t v;
-
-                       if (!sg_type->u.side_basic.len_bits || sg_type->u.side_basic.len_bits + sg_type->u.side_basic.offset_bits > 16)
-                               abort();
-                       memcpy(&v, ptr + sg_type->u.side_basic.integer_offset, sizeof(v));
-                       if (sg_type_to_host_reverse_bo(sg_type))
-                               v = side_bswap_16(v);
-                       v >>= sg_type->u.side_basic.offset_bits;
-                       if (sg_type->u.side_basic.len_bits < 16)
-                               v &= (1U << sg_type->u.side_basic.len_bits) - 1;
-                       switch (base) {
-                       case TRACER_DISPLAY_BASE_2:
-                               print_integer_binary(v, sg_type->u.side_basic.len_bits);
-                               break;
-                       case TRACER_DISPLAY_BASE_8:
-                               printf("0%" PRIo16, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_10:
-                               /* Sign-extend. */
-                               if (sg_type->u.side_basic.len_bits < 16) {
-                                       if (v & (1U << (sg_type->u.side_basic.len_bits - 1)))
-                                               v |= ~((1U << sg_type->u.side_basic.len_bits) - 1);
-                               }
-                               printf("%" PRId16, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_16:
-                               printf("0x%" PRIx16, v);
-                               break;
-                       default:
-                               abort();
-                       }
-                       break;
-               }
                case 32:
-               {
-                       uint32_t v;
-
-                       if (!sg_type->u.side_basic.len_bits || sg_type->u.side_basic.len_bits + sg_type->u.side_basic.offset_bits > 32)
-                               abort();
-                       memcpy(&v, ptr + sg_type->u.side_basic.integer_offset, sizeof(v));
-                       if (sg_type_to_host_reverse_bo(sg_type))
-                               v = side_bswap_32(v);
-                       v >>= sg_type->u.side_basic.offset_bits;
-                       if (sg_type->u.side_basic.len_bits < 32)
-                               v &= (1U << sg_type->u.side_basic.len_bits) - 1;
-                       switch (base) {
-                       case TRACER_DISPLAY_BASE_2:
-                               print_integer_binary(v, sg_type->u.side_basic.len_bits);
-                               break;
-                       case TRACER_DISPLAY_BASE_8:
-                               printf("0%" PRIo32, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_10:
-                               /* Sign-extend. */
-                               if (sg_type->u.side_basic.len_bits < 32) {
-                                       if (v & (1U << (sg_type->u.side_basic.len_bits - 1)))
-                                               v |= ~((1U << sg_type->u.side_basic.len_bits) - 1);
-                               }
-                               printf("%" PRId32, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_16:
-                               printf("0x%" PRIx32, v);
-                               break;
-                       default:
-                               abort();
-                       }
-                       break;
-               }
                case 64:
-               {
-                       uint64_t v;
-
-                       if (!sg_type->u.side_basic.len_bits || sg_type->u.side_basic.len_bits + sg_type->u.side_basic.offset_bits > 64)
-                               abort();
-                       memcpy(&v, ptr + sg_type->u.side_basic.integer_offset, sizeof(v));
-                       if (sg_type_to_host_reverse_bo(sg_type))
-                               v = side_bswap_64(v);
-                       v >>= sg_type->u.side_basic.offset_bits;
-                       if (sg_type->u.side_basic.len_bits < 64)
-                               v &= (1ULL << sg_type->u.side_basic.len_bits) - 1;
-                       switch (base) {
-                       case TRACER_DISPLAY_BASE_2:
-                               print_integer_binary(v, sg_type->u.side_basic.len_bits);
-                               break;
-                       case TRACER_DISPLAY_BASE_8:
-                               printf("0%" PRIo64, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_10:
-                               /* Sign-extend. */
-                               if (sg_type->u.side_basic.len_bits < 64) {
-                                       if (v & (1ULL << (sg_type->u.side_basic.len_bits - 1)))
-                                               v |= ~((1ULL << sg_type->u.side_basic.len_bits) - 1);
-                               }
-                               printf("%" PRId64, v);
-                               break;
-                       case TRACER_DISPLAY_BASE_16:
-                               printf("0x%" PRIx64, v);
-                               break;
-                       default:
-                               abort();
-                       }
                        break;
-               }
                default:
-                       fprintf(stderr, "<UNKNOWN SCATTER-GATHER INTEGER SIZE>");
                        abort();
                }
-               break;
-       }
-       default:
-               fprintf(stderr, "<UNKNOWN SCATTER-GATHER TYPE>");
-               abort();
        }
+       memcpy(&value, ptr + sg_type->offset, sg_type->u.side_integer.type.integer_size_bits >> 3);
+       tracer_print_type_integer(":", &sg_type->u.side_integer.type, &value,
+                       sg_type->u.side_integer.offset_bits);
        printf(" }");
 }
 
@@ -1806,7 +1507,7 @@ void tracer_print_dynamic(const struct side_arg_dynamic_vec *item)
        case SIDE_DYNAMIC_TYPE_S32:
        case SIDE_DYNAMIC_TYPE_S64:
                tracer_print_type_integer("::", &item->u.side_integer.type,
-                                       &item->u.side_integer.value);
+                                       &item->u.side_integer.value, 0);
                break;
        case SIDE_DYNAMIC_TYPE_BYTE:
                tracer_print_type_header("::", item->u.side_basic.attr, item->u.side_basic.nr_attr);
This page took 0.031069 seconds and 4 git commands to generate.