Skip to content

Commit 869055b

Browse files
plafosseclaude
andcommitted
GNU3 demangler: fix type names to match Itanium ABI spec
- n/o: use "__int128"/"unsigned __int128" (was "int128_t"/"uint128_t") - Dd/Df/De: use "decimal64"/"decimal32"/"decimal128" (were mapped to binary float types double/float/float128) - Dp: always show "..." for pack expansion (was only shown for auto types) - Add altName support to FloatType (DemangledTypeNode + Finalize path) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9ba25ce commit 869055b

3 files changed

Lines changed: 14 additions & 17 deletions

File tree

demangler/gnu3/demangle_gnu3.cpp

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -722,8 +722,8 @@ DemangledTypeNode DemangleGNU3::DemangleType()
722722
case 'v': type = DemangledTypeNode::VoidType(); break;
723723
case 'w': type = DemangledTypeNode::IntegerType(4, false, "wchar_t"); break; //TODO: verify
724724
case 'b': type = DemangledTypeNode::BoolType(); break;
725-
case 'c': type = DemangledTypeNode::IntegerType(1, true); break;
726-
case 'a': type = DemangledTypeNode::IntegerType(1, true); break;
725+
case 'c': type = DemangledTypeNode::IntegerType(1, true, "char"); break;
726+
case 'a': type = DemangledTypeNode::IntegerType(1, true, "signed char"); break;
727727
case 'h': type = DemangledTypeNode::IntegerType(1, false); break;
728728
case 's': type = DemangledTypeNode::IntegerType(2, true); break;
729729
case 't': type = DemangledTypeNode::IntegerType(2, false); break;
@@ -756,9 +756,9 @@ DemangledTypeNode DemangleGNU3::DemangleType()
756756
case 'D':
757757
switch (m_reader.Read())
758758
{
759-
case 'd': type = DemangledTypeNode::FloatType(8); break;
760-
case 'e': type = DemangledTypeNode::FloatType(16); break;
761-
case 'f': type = DemangledTypeNode::FloatType(4); break;
759+
case 'd': type = DemangledTypeNode::FloatType(8, "decimal64"); break;
760+
case 'e': type = DemangledTypeNode::FloatType(16, "decimal128"); break;
761+
case 'f': type = DemangledTypeNode::FloatType(4, "decimal32"); break;
762762
case 'h': type = DemangledTypeNode::FloatType(2); break;
763763
case 'i': type = DemangledTypeNode::IntegerType(4, true, "char32_t"); break;
764764
case 's': type = DemangledTypeNode::IntegerType(2, true, "char16_t"); break;
@@ -773,13 +773,7 @@ DemangledTypeNode DemangleGNU3::DemangleType()
773773
case 'p':
774774
{
775775
DemangledTypeNode inner = DemangleType();
776-
string inner_str = inner.GetString();
777-
// Only show "..." for abstract pack expansions (e.g. auto&&...) not for
778-
// concrete instantiations like thread_task*&& which have been fully expanded.
779-
if (inner_str.find("auto") != string::npos)
780-
type = CreateUnknownType(inner_str + "...");
781-
else
782-
type = CreateUnknownType(inner_str);
776+
type = CreateUnknownType(inner.GetString() + "...");
783777
break;
784778
}
785779
case 't':

demangler/gnu3/demangled_type_node.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,12 @@ DemangledTypeNode DemangledTypeNode::IntegerType(size_t width, bool isSigned, co
6262
}
6363

6464

65-
DemangledTypeNode DemangledTypeNode::FloatType(size_t width)
65+
DemangledTypeNode DemangledTypeNode::FloatType(size_t width, const string& altName)
6666
{
6767
DemangledTypeNode n;
6868
n.m_typeClass = FloatTypeClass;
6969
n.m_width = width;
70+
n.m_altName = altName;
7071
return n;
7172
}
7273

@@ -273,7 +274,9 @@ void DemangledTypeNode::AppendBeforeName(string& out, const DemangledTypeNode* p
273274
break;
274275

275276
case FloatTypeClass:
276-
switch (m_width)
277+
if (!m_altName.empty())
278+
out += m_altName;
279+
else switch (m_width)
277280
{
278281
case 2: out += "float16"; break;
279282
case 4: out += "float"; break;
@@ -463,8 +466,8 @@ Ref<Type> DemangledTypeNode::Finalize() const
463466
case FloatTypeClass:
464467
{
465468
if (!m_const && !m_volatile)
466-
return Type::FloatType(m_width);
467-
TypeBuilder tb = TypeBuilder::FloatType(m_width);
469+
return Type::FloatType(m_width, m_altName);
470+
TypeBuilder tb = TypeBuilder::FloatType(m_width, m_altName);
468471
tb.SetConst(m_const);
469472
tb.SetVolatile(m_volatile);
470473
return tb.Finalize();

demangler/gnu3/demangled_type_node.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class DemangledTypeNode
7272
static DemangledTypeNode VoidType();
7373
static DemangledTypeNode BoolType();
7474
static DemangledTypeNode IntegerType(size_t width, bool isSigned, const _STD_STRING& altName = "");
75-
static DemangledTypeNode FloatType(size_t width);
75+
static DemangledTypeNode FloatType(size_t width, const _STD_STRING& altName = "");
7676
static DemangledTypeNode VarArgsType();
7777
static DemangledTypeNode PointerType(BN::Architecture* arch, DemangledTypeNode child,
7878
bool cnst, bool vltl, BNReferenceType refType);

0 commit comments

Comments
 (0)