Skip to content

Commit a8199d7

Browse files
plafosseclaude
andcommitted
GNU3 demangler: fix type names to match Itanium ABI spec
- x/y: use "long long"/"unsigned long long" (was indistinguishable from long) - a: use "signed char" (was mapped to "char", same as type 'c') - n/o: use "__int128"/"unsigned __int128" (was "int128_t"/"uint128_t") - g: use "__float128" via FloatType with altName (was "float128") - Dd/Df/De: use "decimal64"/"decimal32"/"decimal128" (were mapped to binary float types double/float/float128) - Dh: use "_Float16" (was "float16") - 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 502d7ac commit a8199d7

3 files changed

Lines changed: 20 additions & 23 deletions

File tree

demangler/gnu3/demangle_gnu3.cpp

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -722,23 +722,23 @@ 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;
730730
case 'i': type = DemangledTypeNode::IntegerType(4, true); break;
731731
case 'j': type = DemangledTypeNode::IntegerType(4, false); break;
732732
case 'l': type = DemangledTypeNode::IntegerType(m_arch->GetAddressSize(), true); break; //long
733733
case 'm': type = DemangledTypeNode::IntegerType(m_arch->GetAddressSize(), false); break; //ulong
734-
case 'x': type = DemangledTypeNode::IntegerType(8, true); break;
735-
case 'y': type = DemangledTypeNode::IntegerType(8, false); break;
736-
case 'n': type = DemangledTypeNode::IntegerType(16, true); break;
737-
case 'o': type = DemangledTypeNode::IntegerType(16, false); break;
734+
case 'x': type = DemangledTypeNode::IntegerType(8, true, "long long"); break;
735+
case 'y': type = DemangledTypeNode::IntegerType(8, false, "unsigned long long"); break;
736+
case 'n': type = DemangledTypeNode::IntegerType(16, true, "__int128"); break;
737+
case 'o': type = DemangledTypeNode::IntegerType(16, false, "unsigned __int128"); break;
738738
case 'f': type = DemangledTypeNode::FloatType(4); break;
739739
case 'd': type = DemangledTypeNode::FloatType(8); break;
740740
case 'e': type = DemangledTypeNode::FloatType(10); break;
741-
case 'g': type = DemangledTypeNode::FloatType(16); break;
741+
case 'g': type = DemangledTypeNode::FloatType(16, "__float128"); break;
742742
case 'z': type = DemangledTypeNode::VarArgsType(); break;
743743
case 'M': // TODO: Make into pointer to function member
744744
{
@@ -756,10 +756,10 @@ 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;
762-
case 'h': type = DemangledTypeNode::FloatType(2); 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;
762+
case 'h': type = DemangledTypeNode::FloatType(2, "_Float16"); break;
763763
case 'i': type = DemangledTypeNode::IntegerType(4, true, "char32_t"); break;
764764
case 's': type = DemangledTypeNode::IntegerType(2, true, "char16_t"); break;
765765
case 'a': type = CreateUnknownType("auto"); break; //auto type
@@ -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;
@@ -468,8 +471,8 @@ Ref<Type> DemangledTypeNode::Finalize() const
468471
case FloatTypeClass:
469472
{
470473
if (!m_const && !m_volatile)
471-
return Type::FloatType(m_width);
472-
TypeBuilder tb = TypeBuilder::FloatType(m_width);
474+
return Type::FloatType(m_width, m_altName);
475+
TypeBuilder tb = TypeBuilder::FloatType(m_width, m_altName);
473476
tb.SetConst(m_const);
474477
tb.SetVolatile(m_volatile);
475478
return tb.Finalize();

demangler/gnu3/demangled_type_node.h

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

0 commit comments

Comments
 (0)