From 4578fa8a1cc39dbb6c2a47a5358b7e298d2a4c17 Mon Sep 17 00:00:00 2001 From: Xing Xue Date: Wed, 15 Apr 2020 09:59:06 -0400 Subject: [PATCH] [demangler] PPC and S390: Fix parsing of e-prefixed long double literals Summary: This patch is to fix the parsing of long double literals encoded with the e prefix on PowerPC and S390. For both PowerPC and S390, type code e is used for 64-bit long double literals and g is used for 128-bit long double literals. libcxxabi test case test_demangle.pass.cpp fails without the fix. Authored by: xingxue-ibm Reviewers: hubert.reinterpretcast, jasonliu, erik.pilkington, uweigand, mclow.li sts, libc++abi Reviewed by: hubert.reinterpretcast, erik.pilkington Differential Revision: https://reviews.llvm.org/D74163 --- libcxxabi/src/demangle/ItaniumDemangle.h | 6 ++++++ llvm/include/llvm/Demangle/ItaniumDemangle.h | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h index 376e0ef..85694d9 100644 --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -4225,7 +4225,13 @@ Node *AbstractManglingParser::parseExprPrimary() { return getDerived().template parseFloatingLiteral(); case 'e': ++First; +#if defined(__powerpc__) || defined(__s390__) + // Handle cases where long doubles encoded with e have the same size + // and representation as doubles. + return getDerived().template parseFloatingLiteral(); +#else return getDerived().template parseFloatingLiteral(); +#endif case '_': if (consumeIf("_Z")) { Node *R = getDerived().parseEncoding(); diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index 376e0ef..85694d9 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -4225,7 +4225,13 @@ Node *AbstractManglingParser::parseExprPrimary() { return getDerived().template parseFloatingLiteral(); case 'e': ++First; +#if defined(__powerpc__) || defined(__s390__) + // Handle cases where long doubles encoded with e have the same size + // and representation as doubles. + return getDerived().template parseFloatingLiteral(); +#else return getDerived().template parseFloatingLiteral(); +#endif case '_': if (consumeIf("_Z")) { Node *R = getDerived().parseEncoding(); -- 2.7.4