diff --git a/src/lib_rdi_format/rdi_format.c b/src/lib_rdi_format/rdi_format.c index 563e4b42..74fc9ed3 100644 --- a/src/lib_rdi_format/rdi_format.c +++ b/src/lib_rdi_format/rdi_format.c @@ -180,6 +180,74 @@ rdi_hash(RDI_U8 *ptr, RDI_U64 size) return result; } +RDI_PROC RDI_U8 * +rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out) +{ +RDI_U8 *result = 0; +*size_out = 0; +switch (kind) +{ +default:{}break; +case RDI_TypeKind_NULL: {result = "NULL"; *size_out = sizeof("NULL")-1;}break; +case RDI_TypeKind_Void: {result = "Void"; *size_out = sizeof("Void")-1;}break; +case RDI_TypeKind_Handle: {result = "Handle"; *size_out = sizeof("Handle")-1;}break; +case RDI_TypeKind_HResult: {result = "HResult"; *size_out = sizeof("HResult")-1;}break; +case RDI_TypeKind_Char8: {result = "Char8"; *size_out = sizeof("Char8")-1;}break; +case RDI_TypeKind_Char16: {result = "Char16"; *size_out = sizeof("Char16")-1;}break; +case RDI_TypeKind_Char32: {result = "Char32"; *size_out = sizeof("Char32")-1;}break; +case RDI_TypeKind_UChar8: {result = "UChar8"; *size_out = sizeof("UChar8")-1;}break; +case RDI_TypeKind_UChar16: {result = "UChar16"; *size_out = sizeof("UChar16")-1;}break; +case RDI_TypeKind_UChar32: {result = "UChar32"; *size_out = sizeof("UChar32")-1;}break; +case RDI_TypeKind_U8: {result = "U8"; *size_out = sizeof("U8")-1;}break; +case RDI_TypeKind_U16: {result = "U16"; *size_out = sizeof("U16")-1;}break; +case RDI_TypeKind_U32: {result = "U32"; *size_out = sizeof("U32")-1;}break; +case RDI_TypeKind_U64: {result = "U64"; *size_out = sizeof("U64")-1;}break; +case RDI_TypeKind_U128: {result = "U128"; *size_out = sizeof("U128")-1;}break; +case RDI_TypeKind_U256: {result = "U256"; *size_out = sizeof("U256")-1;}break; +case RDI_TypeKind_U512: {result = "U512"; *size_out = sizeof("U512")-1;}break; +case RDI_TypeKind_S8: {result = "S8"; *size_out = sizeof("S8")-1;}break; +case RDI_TypeKind_S16: {result = "S16"; *size_out = sizeof("S16")-1;}break; +case RDI_TypeKind_S32: {result = "S32"; *size_out = sizeof("S32")-1;}break; +case RDI_TypeKind_S64: {result = "S64"; *size_out = sizeof("S64")-1;}break; +case RDI_TypeKind_S128: {result = "S128"; *size_out = sizeof("S128")-1;}break; +case RDI_TypeKind_S256: {result = "S256"; *size_out = sizeof("S256")-1;}break; +case RDI_TypeKind_S512: {result = "S512"; *size_out = sizeof("S512")-1;}break; +case RDI_TypeKind_Bool: {result = "Bool"; *size_out = sizeof("Bool")-1;}break; +case RDI_TypeKind_F16: {result = "F16"; *size_out = sizeof("F16")-1;}break; +case RDI_TypeKind_F32: {result = "F32"; *size_out = sizeof("F32")-1;}break; +case RDI_TypeKind_F32PP: {result = "F32PP"; *size_out = sizeof("F32PP")-1;}break; +case RDI_TypeKind_F48: {result = "F48"; *size_out = sizeof("F48")-1;}break; +case RDI_TypeKind_F64: {result = "F64"; *size_out = sizeof("F64")-1;}break; +case RDI_TypeKind_F80: {result = "F80"; *size_out = sizeof("F80")-1;}break; +case RDI_TypeKind_F128: {result = "F128"; *size_out = sizeof("F128")-1;}break; +case RDI_TypeKind_ComplexF32: {result = "ComplexF32"; *size_out = sizeof("ComplexF32")-1;}break; +case RDI_TypeKind_ComplexF64: {result = "ComplexF64"; *size_out = sizeof("ComplexF64")-1;}break; +case RDI_TypeKind_ComplexF80: {result = "ComplexF80"; *size_out = sizeof("ComplexF80")-1;}break; +case RDI_TypeKind_ComplexF128: {result = "ComplexF128"; *size_out = sizeof("ComplexF128")-1;}break; +case RDI_TypeKind_Modifier: {result = "Modifier"; *size_out = sizeof("Modifier")-1;}break; +case RDI_TypeKind_Ptr: {result = "Ptr"; *size_out = sizeof("Ptr")-1;}break; +case RDI_TypeKind_LRef: {result = "LRef"; *size_out = sizeof("LRef")-1;}break; +case RDI_TypeKind_RRef: {result = "RRef"; *size_out = sizeof("RRef")-1;}break; +case RDI_TypeKind_Array: {result = "Array"; *size_out = sizeof("Array")-1;}break; +case RDI_TypeKind_Function: {result = "Function"; *size_out = sizeof("Function")-1;}break; +case RDI_TypeKind_Method: {result = "Method"; *size_out = sizeof("Method")-1;}break; +case RDI_TypeKind_MemberPtr: {result = "MemberPtr"; *size_out = sizeof("MemberPtr")-1;}break; +case RDI_TypeKind_Struct: {result = "Struct"; *size_out = sizeof("Struct")-1;}break; +case RDI_TypeKind_Class: {result = "Class"; *size_out = sizeof("Class")-1;}break; +case RDI_TypeKind_Union: {result = "Union"; *size_out = sizeof("Union")-1;}break; +case RDI_TypeKind_Enum: {result = "Enum"; *size_out = sizeof("Enum")-1;}break; +case RDI_TypeKind_Alias: {result = "Alias"; *size_out = sizeof("Alias")-1;}break; +case RDI_TypeKind_IncompleteStruct: {result = "IncompleteStruct"; *size_out = sizeof("IncompleteStruct")-1;}break; +case RDI_TypeKind_IncompleteUnion: {result = "IncompleteUnion"; *size_out = sizeof("IncompleteUnion")-1;}break; +case RDI_TypeKind_IncompleteClass: {result = "IncompleteClass"; *size_out = sizeof("IncompleteClass")-1;}break; +case RDI_TypeKind_IncompleteEnum: {result = "IncompleteEnum"; *size_out = sizeof("IncompleteEnum")-1;}break; +case RDI_TypeKind_Bitfield: {result = "Bitfield"; *size_out = sizeof("Bitfield")-1;}break; +case RDI_TypeKind_Variadic: {result = "Variadic"; *size_out = sizeof("Variadic")-1;}break; +case RDI_TypeKind_Count: {result = "Count"; *size_out = sizeof("Count")-1;}break; +} +return result; +} + RDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind) { diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 340d0883..40a1bf0f 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -444,7 +444,8 @@ rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r RDI_PROC RDI_TypeKind rdim_short_type_from_data_model(RDIM_DataModel data_model) { - switch (data_model) { + switch(data_model) + { case RDIM_DataModel_Null : break; case RDIM_DataModel_ILP32 : return RDI_TypeKind_S16; case RDIM_DataModel_LLP64 : return RDI_TypeKind_S16; @@ -459,7 +460,8 @@ rdim_short_type_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_unsigned_short_type_from_data_model(RDIM_DataModel data_model) { - switch (data_model) { + switch(data_model) + { case RDIM_DataModel_Null : break; case RDIM_DataModel_ILP32 : return RDI_TypeKind_U16; case RDIM_DataModel_LLP64 : return RDI_TypeKind_U16; @@ -474,7 +476,8 @@ rdim_unsigned_short_type_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_int_type_from_data_model(RDIM_DataModel data_model) { - switch (data_model) { + switch(data_model) + { case RDIM_DataModel_Null : break; case RDIM_DataModel_ILP32 : return RDI_TypeKind_S32; case RDIM_DataModel_LLP64 : return RDI_TypeKind_S32; @@ -489,7 +492,8 @@ rdim_int_type_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_unsigned_int_type_from_data_model(RDIM_DataModel data_model) { - switch (data_model) { + switch(data_model) + { case RDIM_DataModel_Null : break; case RDIM_DataModel_ILP32 : return RDI_TypeKind_U32; case RDIM_DataModel_LLP64 : return RDI_TypeKind_U32; @@ -504,7 +508,8 @@ rdim_unsigned_int_type_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_long_type_from_data_model(RDIM_DataModel data_model) { - switch (data_model) { + switch(data_model) + { case RDIM_DataModel_Null : break; case RDIM_DataModel_ILP32 : return RDI_TypeKind_S32; case RDIM_DataModel_LLP64 : return RDI_TypeKind_S32; @@ -519,7 +524,8 @@ rdim_long_type_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_unsigned_long_type_from_data_model(RDIM_DataModel data_model) { - switch (data_model) { + switch(data_model) + { case RDIM_DataModel_Null : break; case RDIM_DataModel_ILP32 : return RDI_TypeKind_U32; case RDIM_DataModel_LLP64 : return RDI_TypeKind_U32; @@ -534,7 +540,8 @@ rdim_unsigned_long_type_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_long_long_type_from_data_model(RDIM_DataModel data_model) { - switch (data_model) { + switch(data_model) + { case RDIM_DataModel_Null : break; case RDIM_DataModel_ILP32 : return RDI_TypeKind_S64; case RDIM_DataModel_LLP64 : return RDI_TypeKind_S64; @@ -549,7 +556,8 @@ rdim_long_long_type_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_unsigned_long_long_type_from_data_model(RDIM_DataModel data_model) { - switch (data_model) { + switch(data_model) + { case RDIM_DataModel_Null : break; case RDIM_DataModel_ILP32 : return RDI_TypeKind_U64; case RDIM_DataModel_LLP64 : return RDI_TypeKind_U64; @@ -564,7 +572,8 @@ rdim_unsigned_long_long_type_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_pointer_size_t_type_from_data_model(RDIM_DataModel data_model) { - switch (data_model) { + switch(data_model) + { case RDIM_DataModel_Null : break; case RDIM_DataModel_ILP32 : return RDI_TypeKind_U32; case RDIM_DataModel_LLP64 : return RDI_TypeKind_U64; @@ -1298,6 +1307,48 @@ rdim_count_from_location_block_chunk_list(RDIM_String8List *list) //////////////////////////////// +RDI_PROC RDIM_Type * +rdim_builtin_type_from_kind(RDIM_TypeChunkList list, RDI_TypeKind type_kind) +{ + RDI_U64 type_idx = 0; + if (type_kind != RDI_TypeKind_NULL) { + type_idx = (type_kind - RDI_TypeKind_FirstBuiltIn) + 1; + } + RDIM_Type *builtin = &list.first->v[type_idx]; + return builtin; +} + +RDI_PROC RDIM_TypeChunkList +rdim_init_type_chunk_list(RDIM_Arena *arena, RDI_Arch arch) +{ + RDIM_TypeChunkList list = {0}; + + RDI_U64 type_cap = (RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn) + 2; + + RDIM_Type *null_type = rdim_type_chunk_list_push(arena, &list, type_cap); + + for(RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; type_kind <= RDI_TypeKind_LastBuiltIn; type_kind += 1) + { + RDIM_String8 name = {0}; + name.str = rdi_string_from_type_kind(type_kind, &name.size); + + RDIM_Type *type = rdim_type_chunk_list_push(arena, &list, type_cap); + type->name = name; + type->kind = type_kind; + type->byte_size = rdi_size_from_basic_type_kind(type_kind); + } + + RDIM_Type *void_type = rdim_builtin_type_from_kind(list, RDI_TypeKind_Void); + void_type->byte_size = rdi_addr_size_from_arch(arch); + + RDIM_Type *handle_type = rdim_builtin_type_from_kind(list, RDI_TypeKind_Handle); + handle_type->byte_size = rdi_addr_size_from_arch(arch); + + return list; +} + +//////////////////////////////// + RDI_PROC void rdim_assign_type_index(RDIM_Type *type, U64 *type_indices, U64 *curr_type_idx) { diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 943b373f..43afb3c9 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -1459,6 +1459,11 @@ RDI_PROC void rdim_location_set_push_case(RDIM_Arena *arena, RDIM_ScopeChunkList RDI_PROC RDI_LocationBlock * rdim_location_block_chunk_list_push_array(RDIM_Arena *arena, RDIM_String8List *list, RDI_U32 count); RDI_PROC RDI_U32 rdim_count_from_location_block_chunk_list(RDIM_String8List *list); +//////////////////////////////// + +RDI_PROC RDIM_TypeChunkList rdim_init_type_chunk_list(RDIM_Arena *arena, RDI_Arch arch); +RDI_PROC RDIM_Type * rdim_builtin_type_from_kind(RDIM_TypeChunkList list, RDI_TypeKind type_kind); + //////////////////////////////// // Type Index diff --git a/src/radcon/radcon_dwarf.c b/src/radcon/radcon_dwarf.c index 98ad228c..4cfd0ca6 100644 --- a/src/radcon/radcon_dwarf.c +++ b/src/radcon/radcon_dwarf.c @@ -38,8 +38,8 @@ d2r_rdi_reg_from_dw_reg_code(Arch arch, U64 reg_code) case Arch_Null: return 0; case Arch_x64: return d2r_rdi_reg_from_dw_reg_code_x64(reg_code); case Arch_x86: return d2r_rdi_reg_from_dw_reg_code_x86(reg_code); + default: InvalidPath; } - InvalidPath; return 0; } @@ -89,7 +89,7 @@ d2r_type_from_attrib(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, D Assert(!"unexpected attrib class"); } } else if (attrib->attrib_kind == DW_Attrib_Null) { - type = type_table->void_type; + type = rdim_builtin_type_from_kind(*type_table->types, RDI_TypeKind_NULL); } return type; @@ -1154,7 +1154,7 @@ d2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in) RDIM_UnitChunkList units = {0}; RDIM_UDTChunkList udts = {0}; - RDIM_TypeChunkList types = {0}; + RDIM_TypeChunkList types = rdim_init_type_chunk_list(arena, arch); RDIM_SymbolChunkList gvars = {0}; RDIM_SymbolChunkList tvars = {0}; RDIM_SymbolChunkList procs = {0}; @@ -1356,8 +1356,6 @@ d2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in) type_table->ht = hash_table_init(comp_temp.arena, 0x4000); type_table->types = &types; type_table->type_chunk_cap = TYPE_CHUNK_CAP; - type_table->void_type = d2r_create_type(arena, type_table); - type_table->void_type->kind = RDI_TypeKind_Void; type_table->varg_type = d2r_create_type(arena, type_table); type_table->varg_type->kind = RDI_TypeKind_Variadic; @@ -1597,7 +1595,7 @@ d2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in) default: AssertAlways(!"unexpected base type encoding"); break; // TODO: error handling } - RDIM_Type *base_type = d2r_create_type(arena, type_table); + RDIM_Type *base_type = rdim_builtin_type_from_kind(types, kind); base_type->kind = kind; base_type->byte_size = byte_size; diff --git a/src/radcon/radcon_dwarf.h b/src/radcon/radcon_dwarf.h index b9a3912c..3029b314 100644 --- a/src/radcon/radcon_dwarf.h +++ b/src/radcon/radcon_dwarf.h @@ -9,7 +9,6 @@ typedef struct D2R_TypeTable HashTable *ht; RDIM_TypeChunkList *types; U64 type_chunk_cap; - RDIM_Type *void_type; RDIM_Type *varg_type; } D2R_TypeTable; diff --git a/src/radcon/radcon_pdb.c b/src/radcon/radcon_pdb.c index 4a24ed43..ca9a4f7d 100644 --- a/src/radcon/radcon_pdb.c +++ b/src/radcon/radcon_pdb.c @@ -2445,27 +2445,24 @@ p2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in) // from regular type info. // RDIM_Type **itype_type_ptrs = 0; - RDIM_TypeChunkList all_types = {0}; + RDIM_TypeChunkList all_types = rdim_init_type_chunk_list(arena, arch); #define p2r_type_ptr_from_itype(itype) (((itype) < tpi_leaf->itype_opl) ? itype_type_ptrs[itype] : 0) if(in->flags & RC_Flag_Types) ProfScope("types pass 1: construct all root/stub types from TPI") { itype_type_ptrs = push_array(arena, RDIM_Type *, tpi_leaf->itype_opl); ////////////////////////// - //- build basic type + //- build basic types // { - RDIM_DataModel data_model = rdim_infer_data_model(OperatingSystem_Windows, top_level_info.arch); - - RDI_TypeKind short_type = rdim_short_type_from_data_model(data_model); - RDI_TypeKind ushort_type = rdim_unsigned_short_type_from_data_model(data_model); - RDI_TypeKind int_type = rdim_int_type_from_data_model(data_model); - RDI_TypeKind uint_type = rdim_unsigned_int_type_from_data_model(data_model); - RDI_TypeKind long_type = rdim_long_type_from_data_model(data_model); - RDI_TypeKind ulong_type = rdim_unsigned_long_type_from_data_model(data_model); - RDI_TypeKind long_long_type = rdim_long_long_type_from_data_model(data_model); - RDI_TypeKind ulong_long_type = rdim_unsigned_long_long_type_from_data_model(data_model); - RDI_TypeKind ptr_type = rdim_pointer_size_t_type_from_data_model(data_model); + RDIM_DataModel data_model = rdim_infer_data_model(OperatingSystem_Windows, top_level_info.arch); + RDI_TypeKind short_type = rdim_short_type_from_data_model(data_model); + RDI_TypeKind long_type = rdim_long_type_from_data_model(data_model); + RDI_TypeKind long_long_type = rdim_long_long_type_from_data_model(data_model); + RDI_TypeKind ushort_type = rdim_unsigned_short_type_from_data_model(data_model); + RDI_TypeKind ulong_type = rdim_unsigned_long_type_from_data_model(data_model); + RDI_TypeKind ulong_long_type = rdim_unsigned_long_long_type_from_data_model(data_model); + RDI_TypeKind ptr_type = rdim_pointer_size_t_type_from_data_model(data_model); struct { @@ -2508,8 +2505,8 @@ p2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in) { "__uint8" , RDI_TypeKind_U8 , CV_BasicType_UINT8 , 1, 1, 1 }, { "__int16" , RDI_TypeKind_S16 , CV_BasicType_INT16 , 1, 1, 1 }, { "__uint16" , RDI_TypeKind_U16 , CV_BasicType_UINT16 , 1, 1, 1 }, - { "int" , int_type , CV_BasicType_INT32 , 1, 1, 1 }, - { "unsigned int" , uint_type , CV_BasicType_UINT32 , 1, 1, 1 }, + { "int" , RDI_TypeKind_S32 , CV_BasicType_INT32 , 1, 1, 1 }, + { "unsigned int" , RDI_TypeKind_U32 , CV_BasicType_UINT32 , 1, 1, 1 }, { "__int64" , RDI_TypeKind_S64 , CV_BasicType_INT64 , 1, 1, 1 }, { "__uint64" , RDI_TypeKind_U64 , CV_BasicType_UINT64 , 1, 1, 1 }, { "__int128" , RDI_TypeKind_S128 , CV_BasicType_INT128 , 1, 1, 1 }, @@ -2524,22 +2521,11 @@ p2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in) for(U64 i = 0; i < ArrayCount(table); i += 1) { - U64 builtin_size; - if(table[i].kind_rdi == RDI_TypeKind_Void || table[i].kind_rdi == RDI_TypeKind_Handle) - { - builtin_size = arch_addr_size; - } - else - { - builtin_size = rdi_size_from_basic_type_kind(table[i].kind_rdi); - } - - RDIM_Type *builtin = rdim_type_chunk_list_push(arena, &all_types, tpi_leaf->itype_opl); - builtin->kind = table[i].kind_rdi; - builtin->name = str8_cstring(table[i].name); - builtin->byte_size = builtin_size; - - itype_type_ptrs[table[i].kind_cv] = builtin; + RDIM_Type *type = rdim_type_chunk_list_push(arena, &all_types, tpi_leaf->itype_opl); + type->kind = RDI_TypeKind_Alias; + type->name = str8_cstring(table[i].name); + type->direct_type = rdim_builtin_type_from_kind(all_types, table[i].kind_rdi); + itype_type_ptrs[table[i].kind_cv] = type; if(table[i].make_pointer_near) { @@ -2547,8 +2533,7 @@ p2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in) RDIM_Type *ptr_near = rdim_type_chunk_list_push(arena, &all_types, tpi_leaf->itype_opl); ptr_near->kind = RDI_TypeKind_Ptr; ptr_near->byte_size = 2; - ptr_near->direct_type = builtin; - + ptr_near->direct_type = type; itype_type_ptrs[near_ptr_itype] = ptr_near; } if(table[i].make_pointer_32) @@ -2557,8 +2542,7 @@ p2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in) RDIM_Type *ptr_32 = rdim_type_chunk_list_push(arena, &all_types, tpi_leaf->itype_opl); ptr_32->kind = RDI_TypeKind_Ptr; ptr_32->byte_size = 4; - ptr_32->direct_type = builtin; - + ptr_32->direct_type = type; itype_type_ptrs[ptr_32_itype] = ptr_32; } if(table[i].make_pointer_64) @@ -2567,15 +2551,14 @@ p2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in) RDIM_Type *ptr_64 = rdim_type_chunk_list_push(arena, &all_types, tpi_leaf->itype_opl); ptr_64->kind = RDI_TypeKind_Ptr; ptr_64->byte_size = 8; - ptr_64->direct_type = builtin; - + ptr_64->direct_type = type; itype_type_ptrs[ptr_64_itype] = ptr_64; } } } ////////////////////////// - //- rjf: build non-basic type + //- rjf: build complex type // for(CV_TypeId itype = tpi_leaf->itype_first; itype < tpi_leaf->itype_opl; itype += 1) { diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index 4fadfabd..1a32964f 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -1489,6 +1489,23 @@ rdi_hash(RDI_U8 *ptr, RDI_U64 size) } ``` +@gen(functions) @c_file +{ + `RDI_PROC RDI_U8 *`; + `rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out)`; + `{`; + `RDI_U8 *result = 0;`; + `*size_out = 0;`; + `switch (kind)`; + `{`; + `default:{}break;`; + @expand(RDI_TypeKindTable a) ` case RDI_TypeKind_$(a.name): {result = "$(a.name)"; *size_out = sizeof("$(a.name)")-1;}break;`, + `}`; + `return result;`; + `}`; + ``; +} + @gen(functions) @c_file { `RDI_PROC RDI_U32`;