diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h index f73959868d7061..c581ed72747642 100644 --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -57,6 +57,7 @@ X(LocalName) \ X(VectorType) \ X(PixelVectorType) \ + X(BinaryFPType) \ X(SyntheticTemplateParamName) \ X(TypeTemplateParamDecl) \ X(NonTypeTemplateParamDecl) \ @@ -1074,6 +1075,21 @@ class PixelVectorType final : public Node { } }; +class BinaryFPType final : public Node { + const Node *Dimension; + +public: + BinaryFPType(const Node *Dimension_) + : Node(KBinaryFPType), Dimension(Dimension_) {} + + template void match(Fn F) const { F(Dimension); } + + void printLeft(OutputStream &S) const override { + S += "_Float"; + Dimension->print(S); + } +}; + enum class TemplateParamKind { Type, NonType, Template }; /// An invented name for a template parameter for which we don't have a @@ -3904,6 +3920,16 @@ Node *AbstractManglingParser::parseType() { case 'h': First += 2; return make("half"); + // ::= DF _ # ISO/IEC TS 18661 binary floating point (N bits) + case 'F': { + First += 2; + Node *DimensionNumber = make(parseNumber()); + if (!DimensionNumber) + return nullptr; + if (!consumeIf('_')) + return nullptr; + return make(DimensionNumber); + } // ::= Di # char32_t case 'i': First += 2; diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index 0744172a6cbb41..903b00ee548631 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -23433,6 +23433,8 @@ const char* cases[][2] = {"_ZN4llvm7APFloatC2Ef", "llvm::APFloat::APFloat(float)"}, {"_ZN4llvm7APFloatC1Ed", "llvm::APFloat::APFloat(double)"}, {"_ZN4llvm7APFloatC2Ed", "llvm::APFloat::APFloat(double)"}, + {"_ZN4llvm7APFloatC1EDF16_", "llvm::APFloat::APFloat(_Float16)"}, + {"_ZN4llvm7APFloatC2EDF16_", "llvm::APFloat::APFloat(_Float16)"}, {"_ZNK4llvm7APFloat8toStringERNS_15SmallVectorImplIcEEjj", "llvm::APFloat::toString(llvm::SmallVectorImpl&, unsigned int, unsigned int) const"}, {"_ZNK4llvm5APIntngEv", "llvm::APInt::operator-() const"}, {"_ZN4llvm5APIntlSEj", "llvm::APInt::operator<<=(unsigned int)"}, @@ -29569,6 +29571,7 @@ const char* cases[][2] = {"_Z2f3IJEEvDpPKT_", "void f3<>()"}, {"_Z2f3IJiEEvDpPKT_", "void f3(int const*)"}, {"_Z2f3IJifEEvDpPKT_", "void f3(int const*, float const*)"}, + {"_Z10float16addDF16_DF16_", "float16add(_Float16, _Float16)"}, {"_Z2f4IJifdEE5tupleIJDpT_EEv", "tuple f4()"}, {"_Z2f5IiJifdEE8identityIFT_DpT0_EEv", "identity f5()"}, {"_Z2f6IJLi1ELi2ELi3EEE9int_tupleIJXspT_EEEv", "int_tuple<1, 2, 3> f6<1, 2, 3>()"}, diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index dd824a50359d11..c921decdedae93 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -57,6 +57,7 @@ X(LocalName) \ X(VectorType) \ X(PixelVectorType) \ + X(BinaryFPType) \ X(SyntheticTemplateParamName) \ X(TypeTemplateParamDecl) \ X(NonTypeTemplateParamDecl) \ @@ -1074,6 +1075,21 @@ class PixelVectorType final : public Node { } }; +class BinaryFPType final : public Node { + const Node *Dimension; + +public: + BinaryFPType(const Node *Dimension_) + : Node(KBinaryFPType), Dimension(Dimension_) {} + + template void match(Fn F) const { F(Dimension); } + + void printLeft(OutputStream &S) const override { + S += "_Float"; + Dimension->print(S); + } +}; + enum class TemplateParamKind { Type, NonType, Template }; /// An invented name for a template parameter for which we don't have a @@ -3904,6 +3920,16 @@ Node *AbstractManglingParser::parseType() { case 'h': First += 2; return make("half"); + // ::= DF _ # ISO/IEC TS 18661 binary floating point (N bits) + case 'F': { + First += 2; + Node *DimensionNumber = make(parseNumber()); + if (!DimensionNumber) + return nullptr; + if (!consumeIf('_')) + return nullptr; + return make(DimensionNumber); + } // ::= Di # char32_t case 'i': First += 2;