From 6c78823f4d4da8ee85d08bc5403c259ad71f9617 Mon Sep 17 00:00:00 2001 From: kbobrovs Date: Thu, 24 Jun 2021 12:30:41 -0700 Subject: [PATCH] Support Itanium demangling of the half precision FP type. Encoded as "DF16_" by the Itanium mangler. Signed-off-by: kbobrovs --- llvm/include/llvm/Demangle/ItaniumDemangle.h | 11 ++++++++++ .../Demangle/ItaniumDemangleTest.cpp | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index d347c4c2ddfde..a1a4783c9cce9 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -3898,6 +3898,17 @@ Node *AbstractManglingParser::parseType() { case 'f': First += 2; return make("decimal32"); + // ::= DF _ + // # ISO/IEC TS 18661 binary floating point type _FloatN (N bits) + case 'F': { + First += 2; + StringView N = parseNumber(false /*disallow negatives*/); + if (N.size() == 0 || look() != '_') + return nullptr; + assert((std::string(N.begin(), N.end()) == "16") && "Unknown FP type"); + First += 1; // consume '_' + return make("_Float16"); // use FE-supoprted spelling + } // ::= Dh # IEEE 754r half-precision floating point (16 bits) case 'h': First += 2; diff --git a/llvm/unittests/Demangle/ItaniumDemangleTest.cpp b/llvm/unittests/Demangle/ItaniumDemangleTest.cpp index 11bb78429a0a9..448942ad3b5ad 100644 --- a/llvm/unittests/Demangle/ItaniumDemangleTest.cpp +++ b/llvm/unittests/Demangle/ItaniumDemangleTest.cpp @@ -51,3 +51,24 @@ TEST(ItaniumDemangle, MethodOverride) { ASSERT_NE(nullptr, Parser.parse()); EXPECT_THAT(Parser.Types, testing::ElementsAre('i', 'j', 'l')); } + +TEST(ItaniumDemangle, HalfType) { + struct TestParser : AbstractManglingParser { + std::vector Types; + + TestParser(const char *Str) + : AbstractManglingParser(Str, Str + strlen(Str)) {} + + Node *parseType() { + Node *N = AbstractManglingParser::parseType(); + StringView Name = N->getBaseName(); + Types.push_back(std::string(Name.begin(), Name.end())); + return N; + } + }; + + // void f(A<_Float16>, _Float16); + TestParser Parser("_Z1f1AIDF16_EDF16_"); + ASSERT_NE(nullptr, Parser.parse()); + EXPECT_THAT(Parser.Types, testing::ElementsAre("_Float16", "A", "_Float16")); +}