Skip to content

[llvm][ItaniumDemangle] Use __LDBL_MANT_DIG__ for configuring demangling of long doubles #135968

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 16, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions llvm/include/llvm/Demangle/ItaniumDemangle.h
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just for the record; these changes here didn't stem from #134976, but from #130573 - the file hasn't been synced after that change.

T *First = nullptr;
T *Last = nullptr;
T *Cap = nullptr;
Expand Down Expand Up @@ -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.
Expand Down
Loading