From 338d2177ff236a93f7a4708be20e1f07e6a30928 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 21:25:35 -0800 Subject: [PATCH] added _Decimal* and __bf16 types to RDI and DWARF converter --- src/lib_rdi/rdi.c | 8 ++++ src/lib_rdi/rdi.h | 34 +++++++++------ src/rdi/rdi.mdesk | 28 +++++++------ src/rdi_from_dwarf/rdi_from_dwarf.c | 13 ++++-- src/torture/torture_d2r.c | 65 ++++++++++++++++------------- 5 files changed, 89 insertions(+), 59 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index 0e9f5352..adfe99bd 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -187,6 +187,7 @@ case RDI_TypeKind_S128: {result = (RDI_U8*)"S128"; *size_out = sizeof("S128")-1; case RDI_TypeKind_S256: {result = (RDI_U8*)"S256"; *size_out = sizeof("S256")-1;}break; case RDI_TypeKind_S512: {result = (RDI_U8*)"S512"; *size_out = sizeof("S512")-1;}break; case RDI_TypeKind_Bool: {result = (RDI_U8*)"Bool"; *size_out = sizeof("Bool")-1;}break; +case RDI_TypeKind_BF16: {result = (RDI_U8*)"BF16"; *size_out = sizeof("BF16")-1;}break; case RDI_TypeKind_F16: {result = (RDI_U8*)"F16"; *size_out = sizeof("F16")-1;}break; case RDI_TypeKind_F32: {result = (RDI_U8*)"F32"; *size_out = sizeof("F32")-1;}break; case RDI_TypeKind_F32PP: {result = (RDI_U8*)"F32PP"; *size_out = sizeof("F32PP")-1;}break; @@ -199,6 +200,9 @@ case RDI_TypeKind_ComplexF32: {result = (RDI_U8*)"ComplexF32"; *size_out = sizeo case RDI_TypeKind_ComplexF64: {result = (RDI_U8*)"ComplexF64"; *size_out = sizeof("ComplexF64")-1;}break; case RDI_TypeKind_ComplexF80: {result = (RDI_U8*)"ComplexF80"; *size_out = sizeof("ComplexF80")-1;}break; case RDI_TypeKind_ComplexF128: {result = (RDI_U8*)"ComplexF128"; *size_out = sizeof("ComplexF128")-1;}break; +case RDI_TypeKind_Decimal32: {result = (RDI_U8*)"Decimal32"; *size_out = sizeof("Decimal32")-1;}break; +case RDI_TypeKind_Decimal64: {result = (RDI_U8*)"Decimal64"; *size_out = sizeof("Decimal64")-1;}break; +case RDI_TypeKind_Decimal128: {result = (RDI_U8*)"Decimal128"; *size_out = sizeof("Decimal128")-1;}break; case RDI_TypeKind_Modifier: {result = (RDI_U8*)"Modifier"; *size_out = sizeof("Modifier")-1;}break; case RDI_TypeKind_Ptr: {result = (RDI_U8*)"Ptr"; *size_out = sizeof("Ptr")-1;}break; case RDI_TypeKind_LRef: {result = (RDI_U8*)"LRef"; *size_out = sizeof("LRef")-1;}break; @@ -253,6 +257,7 @@ case RDI_TypeKind_S128:{result = 16;}break; case RDI_TypeKind_S256:{result = 32;}break; case RDI_TypeKind_S512:{result = 64;}break; case RDI_TypeKind_Bool:{result = 1;}break; +case RDI_TypeKind_BF16:{result = 2;}break; case RDI_TypeKind_F16:{result = 2;}break; case RDI_TypeKind_F32:{result = 4;}break; case RDI_TypeKind_F32PP:{result = 4;}break; @@ -265,6 +270,9 @@ case RDI_TypeKind_ComplexF32:{result = 8;}break; case RDI_TypeKind_ComplexF64:{result = 16;}break; case RDI_TypeKind_ComplexF80:{result = 20;}break; case RDI_TypeKind_ComplexF128:{result = 32;}break; +case RDI_TypeKind_Decimal32:{result = 4;}break; +case RDI_TypeKind_Decimal64:{result = 8;}break; +case RDI_TypeKind_Decimal128:{result = 16;}break; } return result; } diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index dd91bbd6..f51d6c42 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -298,18 +298,22 @@ RDI_TypeKind_S128 = 0x0015, RDI_TypeKind_S256 = 0x0016, RDI_TypeKind_S512 = 0x0017, RDI_TypeKind_Bool = 0x0018, -RDI_TypeKind_F16 = 0x0019, -RDI_TypeKind_F32 = 0x001A, -RDI_TypeKind_F32PP = 0x001B, -RDI_TypeKind_F48 = 0x001C, -RDI_TypeKind_F64 = 0x001D, -RDI_TypeKind_F80 = 0x001E, -RDI_TypeKind_F96 = 0x001F, -RDI_TypeKind_F128 = 0x0020, -RDI_TypeKind_ComplexF32 = 0x0021, -RDI_TypeKind_ComplexF64 = 0x0022, -RDI_TypeKind_ComplexF80 = 0x0023, -RDI_TypeKind_ComplexF128 = 0x0024, +RDI_TypeKind_BF16 = 0x0019, +RDI_TypeKind_F16 = 0x001A, +RDI_TypeKind_F32 = 0x001B, +RDI_TypeKind_F32PP = 0x001C, +RDI_TypeKind_F48 = 0x001D, +RDI_TypeKind_F64 = 0x001E, +RDI_TypeKind_F80 = 0x001F, +RDI_TypeKind_F96 = 0x0020, +RDI_TypeKind_F128 = 0x0021, +RDI_TypeKind_ComplexF32 = 0x0022, +RDI_TypeKind_ComplexF64 = 0x0023, +RDI_TypeKind_ComplexF80 = 0x0024, +RDI_TypeKind_ComplexF128 = 0x0025, +RDI_TypeKind_Decimal32 = 0x0026, +RDI_TypeKind_Decimal64 = 0x0027, +RDI_TypeKind_Decimal128 = 0x0028, RDI_TypeKind_Modifier = 0x1000, RDI_TypeKind_Ptr = 0x1001, RDI_TypeKind_LRef = 0x1002, @@ -331,7 +335,7 @@ RDI_TypeKind_Bitfield = 0xF000, RDI_TypeKind_Variadic = 0xF001, RDI_TypeKind_Count = 0xF002, RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, -RDI_TypeKind_LastBuiltIn = RDI_TypeKind_ComplexF128, +RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Decimal128, RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, @@ -770,6 +774,7 @@ X(S128)\ X(S256)\ X(S512)\ X(Bool)\ +X(BF16)\ X(F16)\ X(F32)\ X(F32PP)\ @@ -782,6 +787,9 @@ X(ComplexF32)\ X(ComplexF64)\ X(ComplexF80)\ X(ComplexF128)\ +X(Decimal32)\ +X(Decimal64)\ +X(Decimal128)\ X(Modifier)\ X(Ptr)\ X(LRef)\ diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 6a07dab5..0a4012ee 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -705,18 +705,22 @@ RDI_TypeKindTable: {S256 0x0016 32 } {S512 0x0017 64 } {Bool 0x0018 1 } - {F16 0x0019 2 } - {F32 0x001A 4 } - {F32PP 0x001B 4 } - {F48 0x001C 6 } - {F64 0x001D 8 } - {F80 0x001E 10 } - {F96 0x001F 12 } - {F128 0x0020 16 } - {ComplexF32 0x0021 8 } - {ComplexF64 0x0022 16 } - {ComplexF80 0x0023 20 } - {ComplexF128 0x0024 32 LastBuiltIn } + {BF16 0x0019 2 } + {F16 0x001A 2 } + {F32 0x001B 4 } + {F32PP 0x001C 4 } + {F48 0x001D 6 } + {F64 0x001E 8 } + {F80 0x001F 10 } + {F96 0x0020 12 } + {F128 0x0021 16 } + {ComplexF32 0x0022 8 } + {ComplexF64 0x0023 16 } + {ComplexF80 0x0024 20 } + {ComplexF128 0x0025 32 } + {Decimal32 0x0026 4 } + {Decimal64 0x0027 8 } + {Decimal128 0x0028 16 LastBuiltIn } //- {Modifier 0x1000 0 FirstConstructed } {Ptr 0x1001 0 } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 15ded770..369e22a0 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1775,7 +1775,7 @@ d2r_convert_types(Arena *arena, } else if (str8_match(name, str8_lit("_Float16"), 0)) { kind = RDI_TypeKind_F16; } else if (str8_match(name, str8_lit("__bf16"), 0)) { - NotImplemented; + kind = RDI_TypeKind_BF16; } if (kind != RDI_TypeKind_NULL) { break; } } @@ -1818,6 +1818,14 @@ d2r_convert_types(Arena *arena, default: log_user_errorf("unexpected size"); break; } } break; + case DW_ATE_DecimalFloat: { + switch (byte_size) { + case 4: kind = RDI_TypeKind_Decimal32; break; + case 8: kind = RDI_TypeKind_Decimal64; break; + case 16: kind = RDI_TypeKind_Decimal128; break; + default: log_user_errorf("unexpected size"); break; + } + } break; case DW_ATE_ImaginaryFloat: { NotImplemented; } break; @@ -1836,9 +1844,6 @@ d2r_convert_types(Arena *arena, case DW_ATE_UnsignedFixed: { NotImplemented; } break; - case DW_ATE_DecimalFloat: { - NotImplemented; - } break; case DW_ATE_Ucs: { NotImplemented; } break; diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 2b837911..a2fcbf99 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -70,33 +70,36 @@ T_BeginTest(d2r_types) dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_##e); \ dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ dw_writer_tag_end(writer); - DeclBaseType(char_type, "char", SignedChar, 1); - DeclBaseType(unsigned_char_type, "unsigned char", UnsignedChar, 1); - DeclBaseType(char8_type, "char8_t", Utf, 1); - DeclBaseType(char16_type, "char16_t", Utf, 2); - DeclBaseType(char32_type, "char32_t", Utf, 4); - DeclBaseType(wchar_type, "wchar_t", Signed, 4); - DeclBaseType(bool_type, "_Bool", Boolean, 1); - DeclBaseType(short_type, "short", Signed, 2); - DeclBaseType(unsigned_short_type, "unsigned short", Unsigned, 2); - DeclBaseType(short_unsigned_int_type, "short unsigned int", Unsigned, 2); - DeclBaseType(short_int_type, "short int", Signed, 2); - DeclBaseType(unsigned_int_type, "unsigned int", Unsigned, 4); - DeclBaseType(int_type, "int", Signed, 4); - DeclBaseType(long_int_type, "long int", Signed, 8); - DeclBaseType(long_unsigned_int_type, "long unsigned int", Unsigned, 8); - DeclBaseType(long_long_int_type, "long long int", Signed, 8); - DeclBaseType(long_long_unsigned_int, "long long unsigned int", Unsigned, 8); - DeclBaseType(float_type, "float", Float, 4); - DeclBaseType(double_type, "double", Float, 8); - DeclBaseType(long_double_type, "long double", Float, 16); - DeclBaseType(float16_type, "_Float16", Float, 2); - DeclBaseType(float80_type, "__float80", Float, 16); - DeclBaseType(float128_type, "_float128", Float, 16); - DeclBaseType(complex_float, "complex float", ComplexFloat, 8); - DeclBaseType(complex_doulbe, "complex double", ComplexFloat, 16); - DeclBaseType(complex_long_double, "complex long double", ComplexFloat, 32); - //DeclBaseType("__bf16", Float, 2); + DeclBaseType(char_type, "char", SignedChar, 1); + DeclBaseType(unsigned_char_type, "unsigned char", UnsignedChar, 1); + DeclBaseType(char8_type, "char8_t", Utf, 1); + DeclBaseType(char16_type, "char16_t", Utf, 2); + DeclBaseType(char32_type, "char32_t", Utf, 4); + DeclBaseType(wchar_type, "wchar_t", Signed, 4); + DeclBaseType(bool_type, "_Bool", Boolean, 1); + DeclBaseType(short_type, "short", Signed, 2); + DeclBaseType(unsigned_short_type, "unsigned short", Unsigned, 2); + DeclBaseType(short_unsigned_int_type, "short unsigned int", Unsigned, 2); + DeclBaseType(short_int_type, "short int", Signed, 2); + DeclBaseType(unsigned_int_type, "unsigned int", Unsigned, 4); + DeclBaseType(int_type, "int", Signed, 4); + DeclBaseType(long_int_type, "long int", Signed, 8); + DeclBaseType(long_unsigned_int_type, "long unsigned int", Unsigned, 8); + DeclBaseType(long_long_int_type, "long long int", Signed, 8); + DeclBaseType(long_long_unsigned_int, "long long unsigned int", Unsigned, 8); + DeclBaseType(float_type, "float", Float, 4); + DeclBaseType(double_type, "double", Float, 8); + DeclBaseType(long_double_type, "long double", Float, 16); + DeclBaseType(float16_type, "_Float16", Float, 2); + DeclBaseType(bfloat16_type, "__bf16", Float, 2); + DeclBaseType(float80_type, "__float80", Float, 16); + DeclBaseType(float128_type, "_float128", Float, 16); + DeclBaseType(complex_float_type, "complex float", ComplexFloat, 8); + DeclBaseType(complex_doulbe_type, "complex double", ComplexFloat, 16); + DeclBaseType(complex_long_double_type, "complex long double", ComplexFloat, 32); + DeclBaseType(decimal32_type, "_Decimal32", DecimalFloat, 4); + DeclBaseType(decimal64_type, "_Decimal64", DecimalFloat, 8); + DeclBaseType(decimal128_type, "_Decimal128", DecimalFloat, 16); #undef DeclBaseType #define DeclStdint(n, a) \ @@ -160,16 +163,18 @@ T_BeginTest(d2r_types) TestBuiltinType("double", 8, F64); TestBuiltinType("long double", 16, F128); TestBuiltinType("_Float16", 2, F16); + TestBuiltinType("__bf16", 2, BF16); TestBuiltinType("__float80", 16, F80); TestBuiltinType("_float128", 16, F128); TestBuiltinType("complex float", 8, ComplexF32); TestBuiltinType("complex double", 16, ComplexF64); TestBuiltinType("complex long double", 32, ComplexF128); - // TODO: bfloat16 - //TestBuiltinType("__bf16", 2, BF16); + TestBuiltinType("_Decimal32", 4, Decimal32); + TestBuiltinType("_Decimal64", 8, Decimal64); + TestBuiltinType("_Decimal128", 16, Decimal128); #undef TestBuiltinType -#define TestStdint(n, s, t) \ +#define TestStdint(n, s, t) \ do { \ RDI_TypeNode *td = d2rt_type_from_name(rdi, &types_map, n); \ T_Ok(td); \