[demangler] Enhance demangling in llvm-cxxfilt for fixed-point types. (#114257)

This patch adds support for fixed-point type in demanger.

Closes #114090.
This commit is contained in:
c8ef
2024-11-05 00:18:31 +08:00
committed by GitHub
parent 1f55d77189
commit 7da9da0b19
4 changed files with 272 additions and 31 deletions

View File

@@ -4331,6 +4331,101 @@ Node *AbstractManglingParser<Derived, Alloc>::parseType() {
return nullptr;
return make<BinaryFPType>(DimensionNumber);
}
// ::= [DS] DA # N1169 fixed-point [_Sat] T _Accum
// ::= [DS] DR # N1169 fixed-point [_Sat] T _Frac
// <fixed-point-size>
// ::= s # short
// ::= t # unsigned short
// ::= i # plain
// ::= j # unsigned
// ::= l # long
// ::= m # unsigned long
case 'A': {
char c = look(2);
First += 3;
switch (c) {
case 's':
return make<NameType>("short _Accum");
case 't':
return make<NameType>("unsigned short _Accum");
case 'i':
return make<NameType>("_Accum");
case 'j':
return make<NameType>("unsigned _Accum");
case 'l':
return make<NameType>("long _Accum");
case 'm':
return make<NameType>("unsigned long _Accum");
default:
return nullptr;
}
}
case 'R': {
char c = look(2);
First += 3;
switch (c) {
case 's':
return make<NameType>("short _Fract");
case 't':
return make<NameType>("unsigned short _Fract");
case 'i':
return make<NameType>("_Fract");
case 'j':
return make<NameType>("unsigned _Fract");
case 'l':
return make<NameType>("long _Fract");
case 'm':
return make<NameType>("unsigned long _Fract");
default:
return nullptr;
}
}
case 'S': {
First += 2;
if (look() != 'D')
return nullptr;
if (look(1) == 'A') {
char c = look(2);
First += 3;
switch (c) {
case 's':
return make<NameType>("_Sat short _Accum");
case 't':
return make<NameType>("_Sat unsigned short _Accum");
case 'i':
return make<NameType>("_Sat _Accum");
case 'j':
return make<NameType>("_Sat unsigned _Accum");
case 'l':
return make<NameType>("_Sat long _Accum");
case 'm':
return make<NameType>("_Sat unsigned long _Accum");
default:
return nullptr;
}
}
if (look(1) == 'R') {
char c = look(2);
First += 3;
switch (c) {
case 's':
return make<NameType>("_Sat short _Fract");
case 't':
return make<NameType>("_Sat unsigned short _Fract");
case 'i':
return make<NameType>("_Sat _Fract");
case 'j':
return make<NameType>("_Sat unsigned _Fract");
case 'l':
return make<NameType>("_Sat long _Fract");
case 'm':
return make<NameType>("_Sat unsigned long _Fract");
default:
return nullptr;
}
}
return nullptr;
}
// ::= DB <number> _ # C23 signed _BitInt(N)
// ::= DB <instantiation-dependent expression> _ # C23 signed _BitInt(N)
// ::= DU <number> _ # C23 unsigned _BitInt(N)

View File

@@ -30218,6 +30218,32 @@ const char* cases[][2] =
{"_ZZN3Foo3fooEiENH4Foo24foo2EOKS0_", "Foo::foo(int)::Foo2::foo2(this Foo2 const&&)"},
{"_ZZNH3Foo3fooES_iENK4Foo24foo2Ev", "Foo::foo(this Foo, int)::Foo2::foo2() const" },
{"_ZNH3FooclERKS_", "Foo::operator()(this Foo const&)"},
// fixed-point types as defined in the N1169 draft of ISO/IEC DTR 18037
{"_Z1fDAs", "f(short _Accum)"},
{"_Z1fDAt", "f(unsigned short _Accum)"},
{"_Z1fDAi", "f(_Accum)"},
{"_Z1fDAj", "f(unsigned _Accum)"},
{"_Z1fDAl", "f(long _Accum)"},
{"_Z1fDAm", "f(unsigned long _Accum)"},
{"_Z1fDRs", "f(short _Fract)"},
{"_Z1fDRt", "f(unsigned short _Fract)"},
{"_Z1fDRi", "f(_Fract)"},
{"_Z1fDRj", "f(unsigned _Fract)"},
{"_Z1fDRl", "f(long _Fract)"},
{"_Z1fDRm", "f(unsigned long _Fract)"},
{"_Z1fDSDAs", "f(_Sat short _Accum)"},
{"_Z1fDSDAt", "f(_Sat unsigned short _Accum)"},
{"_Z1fDSDAi", "f(_Sat _Accum)"},
{"_Z1fDSDAj", "f(_Sat unsigned _Accum)"},
{"_Z1fDSDAl", "f(_Sat long _Accum)"},
{"_Z1fDSDAm", "f(_Sat unsigned long _Accum)"},
{"_Z1fDSDRs", "f(_Sat short _Fract)"},
{"_Z1fDSDRt", "f(_Sat unsigned short _Fract)"},
{"_Z1fDSDRi", "f(_Sat _Fract)"},
{"_Z1fDSDRj", "f(_Sat unsigned _Fract)"},
{"_Z1fDSDRl", "f(_Sat long _Fract)"},
{"_Z1fDSDRm", "f(_Sat unsigned long _Fract)"},
};
// clang-format on

View File

@@ -4331,6 +4331,101 @@ Node *AbstractManglingParser<Derived, Alloc>::parseType() {
return nullptr;
return make<BinaryFPType>(DimensionNumber);
}
// ::= [DS] DA # N1169 fixed-point [_Sat] T _Accum
// ::= [DS] DR # N1169 fixed-point [_Sat] T _Frac
// <fixed-point-size>
// ::= s # short
// ::= t # unsigned short
// ::= i # plain
// ::= j # unsigned
// ::= l # long
// ::= m # unsigned long
case 'A': {
char c = look(2);
First += 3;
switch (c) {
case 's':
return make<NameType>("short _Accum");
case 't':
return make<NameType>("unsigned short _Accum");
case 'i':
return make<NameType>("_Accum");
case 'j':
return make<NameType>("unsigned _Accum");
case 'l':
return make<NameType>("long _Accum");
case 'm':
return make<NameType>("unsigned long _Accum");
default:
return nullptr;
}
}
case 'R': {
char c = look(2);
First += 3;
switch (c) {
case 's':
return make<NameType>("short _Fract");
case 't':
return make<NameType>("unsigned short _Fract");
case 'i':
return make<NameType>("_Fract");
case 'j':
return make<NameType>("unsigned _Fract");
case 'l':
return make<NameType>("long _Fract");
case 'm':
return make<NameType>("unsigned long _Fract");
default:
return nullptr;
}
}
case 'S': {
First += 2;
if (look() != 'D')
return nullptr;
if (look(1) == 'A') {
char c = look(2);
First += 3;
switch (c) {
case 's':
return make<NameType>("_Sat short _Accum");
case 't':
return make<NameType>("_Sat unsigned short _Accum");
case 'i':
return make<NameType>("_Sat _Accum");
case 'j':
return make<NameType>("_Sat unsigned _Accum");
case 'l':
return make<NameType>("_Sat long _Accum");
case 'm':
return make<NameType>("_Sat unsigned long _Accum");
default:
return nullptr;
}
}
if (look(1) == 'R') {
char c = look(2);
First += 3;
switch (c) {
case 's':
return make<NameType>("_Sat short _Fract");
case 't':
return make<NameType>("_Sat unsigned short _Fract");
case 'i':
return make<NameType>("_Sat _Fract");
case 'j':
return make<NameType>("_Sat unsigned _Fract");
case 'l':
return make<NameType>("_Sat long _Fract");
case 'm':
return make<NameType>("_Sat unsigned long _Fract");
default:
return nullptr;
}
}
return nullptr;
}
// ::= DB <number> _ # C23 signed _BitInt(N)
// ::= DB <instantiation-dependent expression> _ # C23 signed _BitInt(N)
// ::= DU <number> _ # C23 unsigned _BitInt(N)

View File

@@ -16,45 +16,70 @@ struct ChoppedName {
};
static ChoppedName NamesToTest[] = {
{"_Z1fv", "", "f", "", "()"},
{"_ZN1a1b1cIiiiEEvm", "a::b", "c", "void", "(unsigned long)"},
{"_ZZ5OuterIiEivEN5Inner12inner_memberEv",
"int Outer<int>()::Inner", "inner_member", "", "()"},
{"_Z1fIiEPFvvEv", "", "f", "void (*)()", "()"},
{"_ZN1S1fIiEEvv", "S", "f", "void", "()"},
{"_Z1fv", "", "f", "", "()"},
{"_ZN1a1b1cIiiiEEvm", "a::b", "c", "void", "(unsigned long)"},
{"_ZZ5OuterIiEivEN5Inner12inner_memberEv", "int Outer<int>()::Inner",
"inner_member", "", "()"},
{"_Z1fIiEPFvvEv", "", "f", "void (*)()", "()"},
{"_ZN1S1fIiEEvv", "S", "f", "void", "()"},
// Call operator for a lambda in f().
{"_ZZ1fvENK3$_0clEi", "f()::$_0", "operator()", "", "(int)"},
// Call operator for a lambda in f().
{"_ZZ1fvENK3$_0clEi", "f()::$_0", "operator()", "", "(int)"},
// A call operator for a lambda in a lambda in f().
{"_ZZZ1fvENK3$_0clEvENKUlvE_clEv",
"f()::$_0::operator()() const::'lambda'()", "operator()", "", "()"},
// A call operator for a lambda in a lambda in f().
{"_ZZZ1fvENK3$_0clEvENKUlvE_clEv",
"f()::$_0::operator()() const::'lambda'()", "operator()", "", "()"},
{"_ZZN1S1fEiiEd0_NKUlvE_clEv",
"S::f(int, int)::'lambda'()", "operator()", "", "()"},
{"_ZZN1S1fEiiEd0_NKUlvE_clEv", "S::f(int, int)::'lambda'()", "operator()",
"", "()"},
{"_ZN1Scv7MuncherIJDpPT_EEIJFivEA_iEEEv",
"S", "operator Muncher<int (*)(), int (*) []>", "", "()"},
{"_ZN1Scv7MuncherIJDpPT_EEIJFivEA_iEEEv", "S",
"operator Muncher<int (*)(), int (*) []>", "", "()"},
// Attributes.
{"_ZN5test4IdE1fEUa9enable_ifIXeqfL0p_Li1EEXeqfL0p0_Li2EEEi",
"test4<double>", "f", "", "(int)"},
{"_ZN1SC2B8ctor_tagEv", "S", "S", "", "()"},
{"_ZN1S1fB4MERPIiEEvv", "S", "f", "void", "()"},
// Attributes.
{"_ZN5test4IdE1fEUa9enable_ifIXeqfL0p_Li1EEXeqfL0p0_Li2EEEi",
"test4<double>", "f", "", "(int)"},
{"_ZN1SC2B8ctor_tagEv", "S", "S", "", "()"},
{"_ZN1S1fB4MERPIiEEvv", "S", "f", "void", "()"},
{"_ZNSsC1EmcRKSaIcE",
"std::basic_string<char, std::char_traits<char>, std::allocator<char>>",
"basic_string", "", "(unsigned long, char, std::allocator<char> const&)"},
{"_ZNSsixEm", "std::string", "operator[]", "", "(unsigned long)"},
{"_ZSt17__throw_bad_allocv", "std", "__throw_bad_alloc", "", "()"},
{"_ZNSsC1EmcRKSaIcE",
"std::basic_string<char, std::char_traits<char>, std::allocator<char>>",
"basic_string", "", "(unsigned long, char, std::allocator<char> const&)"},
{"_ZNSsixEm", "std::string", "operator[]", "", "(unsigned long)"},
{"_ZSt17__throw_bad_allocv", "std", "__throw_bad_alloc", "", "()"},
{"_ZN1AI1BEC2Ev", "A<B>", "A", "", "()"},
{"_ZN1AI1BED2Ev", "A<B>", "~A", "", "()"},
{"_ZN1AI1BECI24BaseEi", "A<B>", "A", "", "(int)"},
{"_ZNKR1AI1BE1fIiEEiv", "A<B>", "f", "int", "()"},
{"_ZN1AI1BEC2Ev", "A<B>", "A", "", "()"},
{"_ZN1AI1BED2Ev", "A<B>", "~A", "", "()"},
{"_ZN1AI1BECI24BaseEi", "A<B>", "A", "", "(int)"},
{"_ZNKR1AI1BE1fIiEEiv", "A<B>", "f", "int", "()"},
{"_ZN1SIJicfEE3mfnIJjcdEEEvicfDpT_", "S<int, char, float>",
"mfn", "void", "(int, char, float, unsigned int, char, double)"},
{"_ZN1SIJicfEE3mfnIJjcdEEEvicfDpT_", "S<int, char, float>", "mfn", "void",
"(int, char, float, unsigned int, char, double)"},
{"_Z1fDAs", "", "f", "", "(short _Accum)"},
{"_Z1fDAt", "", "f", "", "(unsigned short _Accum)"},
{"_Z1fDAi", "", "f", "", "(_Accum)"},
{"_Z1fDAj", "", "f", "", "(unsigned _Accum)"},
{"_Z1fDAl", "", "f", "", "(long _Accum)"},
{"_Z1fDAm", "", "f", "", "(unsigned long _Accum)"},
{"_Z1fDRs", "", "f", "", "(short _Fract)"},
{"_Z1fDRt", "", "f", "", "(unsigned short _Fract)"},
{"_Z1fDRi", "", "f", "", "(_Fract)"},
{"_Z1fDRj", "", "f", "", "(unsigned _Fract)"},
{"_Z1fDRl", "", "f", "", "(long _Fract)"},
{"_Z1fDRm", "", "f", "", "(unsigned long _Fract)"},
{"_Z1fDSDAs", "", "f", "", "(_Sat short _Accum)"},
{"_Z1fDSDAt", "", "f", "", "(_Sat unsigned short _Accum)"},
{"_Z1fDSDAi", "", "f", "", "(_Sat _Accum)"},
{"_Z1fDSDAj", "", "f", "", "(_Sat unsigned _Accum)"},
{"_Z1fDSDAl", "", "f", "", "(_Sat long _Accum)"},
{"_Z1fDSDAm", "", "f", "", "(_Sat unsigned long _Accum)"},
{"_Z1fDSDRs", "", "f", "", "(_Sat short _Fract)"},
{"_Z1fDSDRt", "", "f", "", "(_Sat unsigned short _Fract)"},
{"_Z1fDSDRi", "", "f", "", "(_Sat _Fract)"},
{"_Z1fDSDRj", "", "f", "", "(_Sat unsigned _Fract)"},
{"_Z1fDSDRl", "", "f", "", "(_Sat long _Fract)"},
{"_Z1fDSDRm", "", "f", "", "(_Sat unsigned long _Fract)"},
};
TEST(PartialDemanglerTest, TestNameChopping) {