[demangle] Support for ISO/IEC TS 18661 binary floating point type
Reviewed By: #libc_abi, ldionne
Differential Revision: https://reviews.llvm.org/D105278
GitOrigin-RevId: 1873f3be78a5255df8c36c195f4c778f9f47fc5c
diff --git a/src/demangle/ItaniumDemangle.h b/src/demangle/ItaniumDemangle.h
index f739598..c581ed7 100644
--- a/src/demangle/ItaniumDemangle.h
+++ b/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 BinaryFPType final : public Node {
+ const Node *Dimension;
+
+public:
+ BinaryFPType(const Node *Dimension_)
+ : Node(KBinaryFPType), Dimension(Dimension_) {}
+
+ template<typename Fn> 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 @@
case 'h':
First += 2;
return make<NameType>("half");
+ // ::= DF <number> _ # ISO/IEC TS 18661 binary floating point (N bits)
+ case 'F': {
+ First += 2;
+ Node *DimensionNumber = make<NameType>(parseNumber());
+ if (!DimensionNumber)
+ return nullptr;
+ if (!consumeIf('_'))
+ return nullptr;
+ return make<BinaryFPType>(DimensionNumber);
+ }
// ::= Di # char32_t
case 'i':
First += 2;
diff --git a/test/test_demangle.pass.cpp b/test/test_demangle.pass.cpp
index 0744172..903b00e 100644
--- a/test/test_demangle.pass.cpp
+++ b/test/test_demangle.pass.cpp
@@ -23433,6 +23433,8 @@
{"_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<char>&, unsigned int, unsigned int) const"},
{"_ZNK4llvm5APIntngEv", "llvm::APInt::operator-() const"},
{"_ZN4llvm5APIntlSEj", "llvm::APInt::operator<<=(unsigned int)"},
@@ -29569,6 +29571,7 @@
{"_Z2f3IJEEvDpPKT_", "void f3<>()"},
{"_Z2f3IJiEEvDpPKT_", "void f3<int>(int const*)"},
{"_Z2f3IJifEEvDpPKT_", "void f3<int, float>(int const*, float const*)"},
+ {"_Z10float16addDF16_DF16_", "float16add(_Float16, _Float16)"},
{"_Z2f4IJifdEE5tupleIJDpT_EEv", "tuple<int, float, double> f4<int, float, double>()"},
{"_Z2f5IiJifdEE8identityIFT_DpT0_EEv", "identity<int (int, float, double)> f5<int, int, float, double>()"},
{"_Z2f6IJLi1ELi2ELi3EEE9int_tupleIJXspT_EEEv", "int_tuple<1, 2, 3> f6<1, 2, 3>()"},