[llvm] [llvm][ItaniumDemangle] Use __LDBL_MANT_DIG__ for configuring demangling of long doubles (PR #135968)
Michael Buch via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 16 08:06:34 PDT 2025
https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/135968
>From 4632758c080cb853c7e405ab9d82844e2f10bf4b Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Wed, 16 Apr 2025 16:10:24 +0200
Subject: [PATCH] [llvm][ItaniumDemangle] Use __LDBL_MANT_DIG__ for configuring
demangling of long doubles
Syncing in the changes from https://github.com/llvm/llvm-project/pull/134976 using the `cp-to-llvm.sh` script.
---
llvm/include/llvm/Demangle/ItaniumDemangle.h | 22 ++++++++++++--------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h
index b0363c1a7a786..28fdfc5eff1b6 100644
--- a/llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -38,8 +38,10 @@
DEMANGLE_NAMESPACE_BEGIN
template <class T, size_t N> class PODSmallVector {
- static_assert(std::is_trivial<T>::value,
- "T is required to be a trivial type");
+ static_assert(std::is_trivially_copyable<T>::value,
+ "T is required to be a trivially copyable type");
+ static_assert(std::is_trivially_default_constructible<T>::value,
+ "T is required to be trivially default constructible");
T *First = nullptr;
T *Last = nullptr;
T *Cap = nullptr;
@@ -5739,14 +5741,16 @@ struct FloatData<double>
template <>
struct FloatData<long double>
{
-#if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \
- defined(__wasm__) || defined(__riscv) || defined(__loongarch__) || \
- defined(__ve__)
- static const size_t mangled_size = 32;
-#elif defined(__arm__) || defined(__mips__) || defined(__hexagon__)
- static const size_t mangled_size = 16;
+#if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106
+ static const size_t mangled_size = 32;
+#elif __LDBL_MANT_DIG__ == 53 || defined(_MSC_VER)
+ // MSVC doesn't define __LDBL_MANT_DIG__, but it has long double equal to
+ // regular double on all current architectures.
+ static const size_t mangled_size = 16;
+#elif __LDBL_MANT_DIG__ == 64
+ static const size_t mangled_size = 20;
#else
- static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms
+#error Unknown size for __LDBL_MANT_DIG__
#endif
// `-0x1.ffffffffffffffffffffffffffffp+16383` + 'L' + '\0' == 42 bytes.
// 28 'f's * 4 bits == 112 bits, which is the number of mantissa bits.
More information about the llvm-commits
mailing list