- case SIDE_TYPE_STRING:
- tracer_print_basic_type_header(type_desc);
- printf("\"%s\"", (const char *)(uintptr_t) item->u.string);
- break;
- case SIDE_TYPE_STRUCT:
- tracer_print_struct(type_desc, item->u.side_struct);
- break;
- case SIDE_TYPE_STRUCT_SG:
- tracer_print_struct_sg(type_desc, item->u.side_struct_sg_ptr);
- break;
- case SIDE_TYPE_ARRAY:
- tracer_print_array(type_desc, item->u.side_array);
- break;
- case SIDE_TYPE_VLA:
- tracer_print_vla(type_desc, item->u.side_vla);
- break;
- case SIDE_TYPE_VLA_VISITOR:
- tracer_print_vla_visitor(type_desc, item->u.side_vla_app_visitor_ctx);
- break;
- case SIDE_TYPE_ARRAY_U8:
- case SIDE_TYPE_ARRAY_U16:
- case SIDE_TYPE_ARRAY_U32:
- case SIDE_TYPE_ARRAY_U64:
- case SIDE_TYPE_ARRAY_S8:
- case SIDE_TYPE_ARRAY_S16:
- case SIDE_TYPE_ARRAY_S32:
- case SIDE_TYPE_ARRAY_S64:
- case SIDE_TYPE_ARRAY_BYTE:
- case SIDE_TYPE_ARRAY_POINTER32:
- case SIDE_TYPE_ARRAY_POINTER64:
- tracer_print_array_fixint(type_desc, item);
- break;
- case SIDE_TYPE_VLA_U8:
- case SIDE_TYPE_VLA_U16:
- case SIDE_TYPE_VLA_U32:
- case SIDE_TYPE_VLA_U64:
- case SIDE_TYPE_VLA_S8:
- case SIDE_TYPE_VLA_S16:
- case SIDE_TYPE_VLA_S32:
- case SIDE_TYPE_VLA_S64:
- case SIDE_TYPE_VLA_BYTE:
- case SIDE_TYPE_VLA_POINTER32:
- case SIDE_TYPE_VLA_POINTER64:
- tracer_print_vla_fixint(type_desc, item);
- break;
- case SIDE_TYPE_DYNAMIC:
- tracer_print_basic_type_header(type_desc);
- tracer_print_dynamic(&item->u.dynamic);
+ default:
+ fprintf(stderr, "ERROR: Unknown float size\n");
+ abort();
+ }
+}
+
+static
+void tracer_print_type(const struct tgif_type *type_desc, const struct tgif_arg *item)
+{
+ enum tgif_type_label type;
+
+ switch (type_desc->type) {
+ case TGIF_TYPE_ENUM:
+ switch (item->type) {
+ case TGIF_TYPE_U8:
+ case TGIF_TYPE_U16:
+ case TGIF_TYPE_U32:
+ case TGIF_TYPE_U64:
+ case TGIF_TYPE_S8:
+ case TGIF_TYPE_S16:
+ case TGIF_TYPE_S32:
+ case TGIF_TYPE_S64:
+ break;
+ default:
+ fprintf(stderr, "ERROR: type mismatch between description and arguments\n");
+ abort();
+ break;
+ }
+ break;
+
+ case TGIF_TYPE_ENUM_BITMAP:
+ switch (item->type) {
+ case TGIF_TYPE_U8:
+ case TGIF_TYPE_BYTE:
+ case TGIF_TYPE_U16:
+ case TGIF_TYPE_U32:
+ case TGIF_TYPE_U64:
+ case TGIF_TYPE_ARRAY:
+ case TGIF_TYPE_VLA:
+ break;
+ default:
+ fprintf(stderr, "ERROR: type mismatch between description and arguments\n");
+ abort();
+ break;
+ }
+ break;
+
+ case TGIF_TYPE_GATHER_ENUM:
+ switch (item->type) {
+ case TGIF_TYPE_GATHER_INTEGER:
+ break;
+ default:
+ fprintf(stderr, "ERROR: type mismatch between description and arguments\n");
+ abort();
+ break;
+ }
+ break;
+
+ case TGIF_TYPE_DYNAMIC:
+ switch (item->type) {
+ case TGIF_TYPE_DYNAMIC_NULL:
+ case TGIF_TYPE_DYNAMIC_BOOL:
+ case TGIF_TYPE_DYNAMIC_INTEGER:
+ case TGIF_TYPE_DYNAMIC_BYTE:
+ case TGIF_TYPE_DYNAMIC_POINTER:
+ case TGIF_TYPE_DYNAMIC_FLOAT:
+ case TGIF_TYPE_DYNAMIC_STRING:
+ case TGIF_TYPE_DYNAMIC_STRUCT:
+ case TGIF_TYPE_DYNAMIC_STRUCT_VISITOR:
+ case TGIF_TYPE_DYNAMIC_VLA:
+ case TGIF_TYPE_DYNAMIC_VLA_VISITOR:
+ break;
+ default:
+ fprintf(stderr, "ERROR: Unexpected dynamic type\n");
+ abort();
+ break;
+ }
+ break;
+
+ default:
+ if (type_desc->type != item->type) {
+ fprintf(stderr, "ERROR: type mismatch between description and arguments\n");
+ abort();
+ }
+ break;
+ }
+
+ if (type_desc->type == TGIF_TYPE_ENUM || type_desc->type == TGIF_TYPE_ENUM_BITMAP ||
+ type_desc->type == TGIF_TYPE_GATHER_ENUM)
+ type = (enum tgif_type_label) type_desc->type;
+ else
+ type = (enum tgif_type_label) item->type;
+
+ printf("{ ");
+ switch (type) {
+ /* Stack-copy basic types */
+ case TGIF_TYPE_NULL:
+ tracer_print_type_header(":", type_desc->u.tgif_null.attr, type_desc->u.tgif_null.nr_attr);
+ printf("<NULL TYPE>");
+ break;
+
+ case TGIF_TYPE_BOOL:
+ tracer_print_type_bool(":", &type_desc->u.tgif_bool, &item->u.tgif_static.bool_value, 0);
+ break;
+
+ case TGIF_TYPE_U8:
+ case TGIF_TYPE_U16:
+ case TGIF_TYPE_U32:
+ case TGIF_TYPE_U64:
+ case TGIF_TYPE_S8:
+ case TGIF_TYPE_S16:
+ case TGIF_TYPE_S32:
+ case TGIF_TYPE_S64:
+ tracer_print_type_integer(":", &type_desc->u.tgif_integer, &item->u.tgif_static.integer_value, 0,
+ TRACER_DISPLAY_BASE_10);
+ break;
+
+ case TGIF_TYPE_BYTE:
+ tracer_print_type_header(":", type_desc->u.tgif_byte.attr, type_desc->u.tgif_byte.nr_attr);
+ printf("0x%" PRIx8, item->u.tgif_static.byte_value);
+ break;
+
+ case TGIF_TYPE_POINTER:
+ tracer_print_type_integer(":", &type_desc->u.tgif_integer, &item->u.tgif_static.integer_value, 0,
+ TRACER_DISPLAY_BASE_16);
+ break;
+
+ case TGIF_TYPE_FLOAT_BINARY16:
+ case TGIF_TYPE_FLOAT_BINARY32:
+ case TGIF_TYPE_FLOAT_BINARY64:
+ case TGIF_TYPE_FLOAT_BINARY128:
+ tracer_print_type_float(":", &type_desc->u.tgif_float, &item->u.tgif_static.float_value);
+ break;
+
+ case TGIF_TYPE_STRING_UTF8:
+ case TGIF_TYPE_STRING_UTF16:
+ case TGIF_TYPE_STRING_UTF32:
+ tracer_print_type_header(":", type_desc->u.tgif_string.attr, type_desc->u.tgif_string.nr_attr);
+ tracer_print_string((const void *)(uintptr_t) item->u.tgif_static.string_value,
+ type_desc->u.tgif_string.unit_size, type_desc->u.tgif_string.byte_order, NULL);
+ break;
+
+ /* Stack-copy compound types */
+ case TGIF_TYPE_STRUCT:
+ tracer_print_struct(type_desc, item->u.tgif_static.tgif_struct);
+ break;
+ case TGIF_TYPE_ARRAY:
+ tracer_print_array(type_desc, item->u.tgif_static.tgif_array);
+ break;
+ case TGIF_TYPE_VLA:
+ tracer_print_vla(type_desc, item->u.tgif_static.tgif_vla);
+ break;
+ case TGIF_TYPE_VLA_VISITOR:
+ tracer_print_vla_visitor(type_desc, item->u.tgif_static.tgif_vla_app_visitor_ctx);
+ break;
+
+ /* Stack-copy enumeration types */
+ case TGIF_TYPE_ENUM:
+ tracer_print_enum(type_desc, item);
+ break;
+ case TGIF_TYPE_ENUM_BITMAP:
+ tracer_print_enum_bitmap(type_desc, item);
+ break;
+
+ /* Gather basic types */
+ case TGIF_TYPE_GATHER_BOOL:
+ (void) tracer_print_gather_bool_type(&type_desc->u.tgif_gather, item->u.tgif_static.tgif_bool_gather_ptr);
+ break;
+ case TGIF_TYPE_GATHER_INTEGER:
+ (void) tracer_print_gather_integer_type(&type_desc->u.tgif_gather, item->u.tgif_static.tgif_integer_gather_ptr,
+ TRACER_DISPLAY_BASE_10);
+ break;
+ case TGIF_TYPE_GATHER_BYTE:
+ (void) tracer_print_gather_byte_type(&type_desc->u.tgif_gather, item->u.tgif_static.tgif_byte_gather_ptr);
+ break;
+ case TGIF_TYPE_GATHER_POINTER:
+ (void) tracer_print_gather_integer_type(&type_desc->u.tgif_gather, item->u.tgif_static.tgif_integer_gather_ptr,
+ TRACER_DISPLAY_BASE_16);
+ break;
+ case TGIF_TYPE_GATHER_FLOAT:
+ (void) tracer_print_gather_float_type(&type_desc->u.tgif_gather, item->u.tgif_static.tgif_float_gather_ptr);
+ break;
+ case TGIF_TYPE_GATHER_STRING:
+ (void) tracer_print_gather_string_type(&type_desc->u.tgif_gather, item->u.tgif_static.tgif_string_gather_ptr);
+ break;
+
+ /* Gather compound type */
+ case TGIF_TYPE_GATHER_STRUCT:
+ (void) tracer_print_gather_struct(&type_desc->u.tgif_gather, item->u.tgif_static.tgif_struct_gather_ptr);
+ break;
+ case TGIF_TYPE_GATHER_ARRAY:
+ (void) tracer_print_gather_array(&type_desc->u.tgif_gather, item->u.tgif_static.tgif_array_gather_ptr);
+ break;
+ case TGIF_TYPE_GATHER_VLA:
+ (void) tracer_print_gather_vla(&type_desc->u.tgif_gather, item->u.tgif_static.tgif_vla_gather.ptr,
+ item->u.tgif_static.tgif_vla_gather.length_ptr);
+ break;
+
+ /* Gather enumeration types */
+ case TGIF_TYPE_GATHER_ENUM:
+ (void) tracer_print_gather_enum_type(&type_desc->u.tgif_gather, item->u.tgif_static.tgif_integer_gather_ptr);
+ break;
+
+ /* Dynamic basic types */
+ case TGIF_TYPE_DYNAMIC_NULL:
+ case TGIF_TYPE_DYNAMIC_BOOL:
+ case TGIF_TYPE_DYNAMIC_INTEGER:
+ case TGIF_TYPE_DYNAMIC_BYTE:
+ case TGIF_TYPE_DYNAMIC_POINTER:
+ case TGIF_TYPE_DYNAMIC_FLOAT:
+ case TGIF_TYPE_DYNAMIC_STRING:
+
+ /* Dynamic compound types */
+ case TGIF_TYPE_DYNAMIC_STRUCT:
+ case TGIF_TYPE_DYNAMIC_STRUCT_VISITOR:
+ case TGIF_TYPE_DYNAMIC_VLA:
+ case TGIF_TYPE_DYNAMIC_VLA_VISITOR:
+ tracer_print_dynamic(item);