Skip to content

Commit a100fd8

Browse files
authoredJan 13, 2025
[libc++abi][ItaniumDemangle] Demangle DF16b as std::bfloat16_t (#120109)
This mangling is official in the Itanium C++ ABI specification and is already supported by clang.
1 parent 0c1c49f commit a100fd8

File tree

3 files changed

+11
-3
lines changed

3 files changed

+11
-3
lines changed
 

‎libcxxabi/src/demangle/ItaniumDemangle.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -4330,9 +4330,12 @@ Node *AbstractManglingParser<Derived, Alloc>::parseType() {
43304330
case 'h':
43314331
First += 2;
43324332
return make<NameType>("half");
4333-
// ::= DF <number> _ # ISO/IEC TS 18661 binary floating point (N bits)
4333+
// ::= DF16b # C++23 std::bfloat16_t
4334+
// ::= DF <number> _ # ISO/IEC TS 18661 binary floating point (N bits)
43344335
case 'F': {
43354336
First += 2;
4337+
if (consumeIf("16b"))
4338+
return make<NameType>("std::bfloat16_t");
43364339
Node *DimensionNumber = make<NameType>(parseNumber());
43374340
if (!DimensionNumber)
43384341
return nullptr;

‎libcxxabi/test/test_demangle.pass.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
// Is long double fp128?
3434
#define LDBL_FP128 (__LDBL_MANT_DIG__ == 113)
3535

36-
const char *cases[][2] = {
36+
const char* cases[][2] = {
3737
// clang-format off
3838
{"_Z1A", "A"},
3939
{"_Z1Av", "A()"},
@@ -30245,6 +30245,8 @@ const char *cases[][2] = {
3024530245
{"_Z1fDSDRj", "f(_Sat unsigned _Fract)"},
3024630246
{"_Z1fDSDRl", "f(_Sat long _Fract)"},
3024730247
{"_Z1fDSDRm", "f(_Sat unsigned long _Fract)"},
30248+
30249+
{"_Z11bfloat16addDF16bDF16b", "bfloat16add(std::bfloat16_t, std::bfloat16_t)"},
3024830250
// clang-format on
3024930251
};
3025030252

‎llvm/include/llvm/Demangle/ItaniumDemangle.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -4330,9 +4330,12 @@ Node *AbstractManglingParser<Derived, Alloc>::parseType() {
43304330
case 'h':
43314331
First += 2;
43324332
return make<NameType>("half");
4333-
// ::= DF <number> _ # ISO/IEC TS 18661 binary floating point (N bits)
4333+
// ::= DF16b # C++23 std::bfloat16_t
4334+
// ::= DF <number> _ # ISO/IEC TS 18661 binary floating point (N bits)
43344335
case 'F': {
43354336
First += 2;
4337+
if (consumeIf("16b"))
4338+
return make<NameType>("std::bfloat16_t");
43364339
Node *DimensionNumber = make<NameType>(parseNumber());
43374340
if (!DimensionNumber)
43384341
return nullptr;

0 commit comments

Comments
 (0)
Please sign in to comment.