Skip to content

Commit 80c966d

Browse files
committed
Use proper character demangler node types
1 parent 361d3d1 commit 80c966d

3 files changed

Lines changed: 41 additions & 31 deletions

File tree

demangler/gnu3/demangle_gnu3.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -975,9 +975,9 @@ DemangledTypeNode DemangleGNU3::DemangleType()
975975
break;
976976
}
977977
case 'v': type = DemangledTypeNode::VoidType(); break;
978-
case 'w': type = DemangledTypeNode::IntegerType(4, false, "wchar_t"); break; //TODO: verify
978+
case 'w': type = DemangledTypeNode::WideCharType(4, "wchar_t"); break; //TODO: verify
979979
case 'b': type = DemangledTypeNode::BoolType(); break;
980-
case 'c': type = DemangledTypeNode::IntegerType(1, true, "char"); break;
980+
case 'c': type = DemangledTypeNode::IntegerType(1, true); break;
981981
case 'a': type = DemangledTypeNode::IntegerType(1, true, "signed char"); break;
982982
case 'h': type = DemangledTypeNode::IntegerType(1, false); break;
983983
case 's': type = DemangledTypeNode::IntegerType(2, true); break;
@@ -1014,8 +1014,8 @@ DemangledTypeNode DemangleGNU3::DemangleType()
10141014
case 'e': type = DemangledTypeNode::FloatType(16, "decimal128"); break;
10151015
case 'f': type = DemangledTypeNode::FloatType(4, "decimal32"); break;
10161016
case 'h': type = DemangledTypeNode::FloatType(2); break;
1017-
case 'i': type = DemangledTypeNode::IntegerType(4, true, "char32_t"); break;
1018-
case 's': type = DemangledTypeNode::IntegerType(2, true, "char16_t"); break;
1017+
case 'i': type = DemangledTypeNode::WideCharType(4, "char32_t"); break;
1018+
case 's': type = DemangledTypeNode::WideCharType(2, "char16_t"); break;
10191019
case 'a': type = CreateUnknownType("auto"); break; //auto type
10201020
case 'c': type = CreateUnknownType("decltype(auto)"); break; //decltype(auto)
10211021
case 'n':

demangler/gnu3/demangled_type_node.cpp

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -239,11 +239,6 @@ namespace
239239

240240
static DemangledTypeNode::NodeRef CachedNamedIntegerType(size_t width, bool isSigned, const string& altName)
241241
{
242-
if (width == 1 && isSigned && altName == "char")
243-
{
244-
static const auto node = MakeSharedNode(DemangledTypeNode::IntegerType(1, true, "char"));
245-
return node;
246-
}
247242
if (width == 1 && isSigned && altName == "signed char")
248243
{
249244
static const auto node = MakeSharedNode(DemangledTypeNode::IntegerType(1, true, "signed char"));
@@ -254,16 +249,6 @@ namespace
254249
static const auto node = MakeSharedNode(DemangledTypeNode::IntegerType(1, true, "char8_t"));
255250
return node;
256251
}
257-
if (width == 2 && isSigned && altName == "char16_t")
258-
{
259-
static const auto node = MakeSharedNode(DemangledTypeNode::IntegerType(2, true, "char16_t"));
260-
return node;
261-
}
262-
if (width == 4 && isSigned && altName == "char32_t")
263-
{
264-
static const auto node = MakeSharedNode(DemangledTypeNode::IntegerType(4, true, "char32_t"));
265-
return node;
266-
}
267252
if (width == 4 && isSigned && altName == "long")
268253
{
269254
static const auto node = MakeSharedNode(DemangledTypeNode::IntegerType(4, true, "long"));
@@ -274,11 +259,6 @@ namespace
274259
static const auto node = MakeSharedNode(DemangledTypeNode::IntegerType(4, false, "unsigned long"));
275260
return node;
276261
}
277-
if (width == 4 && !isSigned && altName == "wchar_t")
278-
{
279-
static const auto node = MakeSharedNode(DemangledTypeNode::IntegerType(4, false, "wchar_t"));
280-
return node;
281-
}
282262
return nullptr;
283263
}
284264

@@ -308,7 +288,29 @@ namespace
308288
static DemangledTypeNode::NodeRef CachedWideCharType(size_t width, const string& altName)
309289
{
310290
if (!altName.empty())
291+
{
292+
if (width == 2 && altName == "char16_t")
293+
{
294+
static const auto node = MakeSharedNode(DemangledTypeNode::WideCharType(2, "char16_t"));
295+
return node;
296+
}
297+
if (width == 4 && altName == "char32_t")
298+
{
299+
static const auto node = MakeSharedNode(DemangledTypeNode::WideCharType(4, "char32_t"));
300+
return node;
301+
}
302+
if (width == 2 && altName == "wchar_t")
303+
{
304+
static const auto node = MakeSharedNode(DemangledTypeNode::WideCharType(2, "wchar_t"));
305+
return node;
306+
}
307+
if (width == 4 && altName == "wchar_t")
308+
{
309+
static const auto node = MakeSharedNode(DemangledTypeNode::WideCharType(4, "wchar_t"));
310+
return node;
311+
}
311312
return nullptr;
313+
}
312314
switch (width)
313315
{
314316
case 2: { static const auto node = MakeSharedNode(DemangledTypeNode::WideCharType(2)); return node; }
@@ -572,10 +574,18 @@ DemangledTypeNode DemangledTypeNode::BoolType()
572574
DemangledTypeNode DemangledTypeNode::IntegerType(size_t width, bool isSigned, const string& altName)
573575
{
574576
DemangledTypeNode n;
577+
if (altName == "char16_t" || altName == "char32_t" || altName == "wchar_t")
578+
{
579+
n.m_typeClass = WideCharTypeClass;
580+
n.m_width = width;
581+
n.m_altName = altName;
582+
return n;
583+
}
575584
n.m_typeClass = IntegerTypeClass;
576585
n.m_width = width;
577586
n.m_signed = isSigned;
578-
n.m_altName = altName;
587+
if (!(width == 1 && isSigned && altName == "char"))
588+
n.m_altName = altName;
579589
return n;
580590
}
581591

demangler/msvc/demangle_msvc.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -510,9 +510,9 @@ DemangledTypeNode Demangle::DemangleVarType(BackrefList& varList, bool isReturn,
510510
newType = DemangledTypeNode::ArrayType(std::move(childType), 0);
511511
break;
512512
}
513-
case 'S': newType = DemangledTypeNode::IntegerType(2, true, "char16_t"); break;
514-
case 'U': newType = DemangledTypeNode::IntegerType(4, true, "char32_t"); break;
515-
case 'W': newType = DemangledTypeNode::IntegerType(2, false, "wchar_t"); break;
513+
case 'S': newType = DemangledTypeNode::WideCharType(2, "char16_t"); break;
514+
case 'U': newType = DemangledTypeNode::WideCharType(4, "char32_t"); break;
515+
case 'W': newType = DemangledTypeNode::WideCharType(2, "wchar_t"); break;
516516
// `_P` (auto) and `_T` (decltype(auto)) are placeholder return-type
517517
// encodings. For normal source code they are deduced at the function
518518
// definition and mangled as the deduced type — you will not see `_P`
@@ -955,9 +955,9 @@ DemangledTypeNode::NodeRef Demangle::TryDemangleVarTypeRef(
955955
case 'L': return makeRef(DemangledTypeNode::IntegerType(16, true), true);
956956
case 'M': return makeRef(DemangledTypeNode::IntegerType(16, false), true);
957957
case 'N': return makeRef(DemangledTypeNode::BoolType(), true);
958-
case 'S': return makeRef(DemangledTypeNode::IntegerType(2, true, "char16_t"), true);
959-
case 'U': return makeRef(DemangledTypeNode::IntegerType(4, true, "char32_t"), true);
960-
case 'W': return makeRef(DemangledTypeNode::IntegerType(2, false, "wchar_t"), true);
958+
case 'S': return makeRef(DemangledTypeNode::WideCharType(2, "char16_t"), true);
959+
case 'U': return makeRef(DemangledTypeNode::WideCharType(4, "char32_t"), true);
960+
case 'W': return makeRef(DemangledTypeNode::WideCharType(2, "wchar_t"), true);
961961
case 'P': return makeRef(DemangledTypeNode::NamedType(UnknownNamedTypeClass, StringList{"auto"}), true);
962962
case 'Q': return makeRef(DemangledTypeNode::IntegerType(1, true, "char8_t"), true);
963963
case 'T': return makeRef(DemangledTypeNode::NamedType(UnknownNamedTypeClass, StringList{"decltype(auto)"}), true);

0 commit comments

Comments
 (0)