diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp --- a/libcxxabi/src/cxa_demangle.cpp +++ b/libcxxabi/src/cxa_demangle.cpp @@ -6,6 +6,13 @@ // //===----------------------------------------------------------------------===// +#if defined(__powerpc__) && \ + (!defined(__LONG_DOUBLE_128__) || defined(__LONG_DOUBLE_IEEE128__)) +#error "Demangler must be built in double-double long double 128 mode on PPC." +#elif defined(__s390__) && !defined(__LONG_DOUBLE_128__) +#error "Demangler must be built in long double 128 mode on S390." +#endif + // FIXME: (possibly) incomplete list of features that clang mangles that this // file does not yet support: // - C++ modules TS diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -3789,10 +3789,16 @@ case 'e': ++First; return make("long double"); - // ::= g # __float128 + // ::= g # long double, __float128 +#if defined(__powerpc__) || defined(__s390__) + case 'g': + ++First; + return make("long double"); +#else case 'g': ++First; return make("__float128"); +#endif // ::= z # ellipsis case 'z': ++First; @@ -4223,9 +4229,18 @@ case 'd': ++First; return getDerived().template parseFloatingLiteral(); +#if defined(__powerpc__) || defined(__s390__) + case 'e': + ++First; + return getDerived().template parseFloatingLiteral(); + case 'g': + ++First; + return getDerived().template parseFloatingLiteral(); +#else case 'e': ++First; return getDerived().template parseFloatingLiteral(); +#endif case '_': if (consumeIf("_Z")) { Node *R = getDerived().parseEncoding(); @@ -5167,7 +5182,7 @@ struct FloatData { #if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \ - defined(__wasm__) + defined(__wasm__) || defined(__powerpc__) || defined(__s390__) static const size_t mangled_size = 32; #elif defined(__arm__) || defined(__mips__) || defined(__hexagon__) static const size_t mangled_size = 16;