[Lldb-commits] [lldb] ab6923b - [lldb] add TemplateRange and NameQualifiersRange to DemangledNameInfo (#150999)
via lldb-commits
lldb-commits at lists.llvm.org
Tue Aug 5 05:07:39 PDT 2025
Author: Charles Zablit
Date: 2025-08-05T14:07:35+02:00
New Revision: ab6923b9b7a75de79ee06b400ae73771e130339e
URL: https://github.com/llvm/llvm-project/commit/ab6923b9b7a75de79ee06b400ae73771e130339e
DIFF: https://github.com/llvm/llvm-project/commit/ab6923b9b7a75de79ee06b400ae73771e130339e.diff
LOG: [lldb] add TemplateRange and NameQualifiersRange to DemangledNameInfo (#150999)
This patch adds 2 new attributes to `DemangledNameInfo`: `TemplateRange`
and `NameQualifiersRange`. It also introduces the
`function.name-qualifiers` entity formatter which allows tracking
qualifiers between the name of a function and its arguments/template.
This will be used downstream in Swift but may have applications in C++:
https://github.com/swiftlang/llvm-project/pull/11068.
Added:
Modified:
lldb/docs/use/formatting.rst
lldb/include/lldb/Core/DemangledNameInfo.h
lldb/include/lldb/Core/FormatEntity.h
lldb/source/Core/DemangledNameInfo.cpp
lldb/source/Core/FormatEntity.cpp
lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
lldb/unittests/Core/MangledTest.cpp
Removed:
################################################################################
diff --git a/lldb/docs/use/formatting.rst b/lldb/docs/use/formatting.rst
index c5a880c392ce2..f33a96e7a8924 100644
--- a/lldb/docs/use/formatting.rst
+++ b/lldb/docs/use/formatting.rst
@@ -89,6 +89,8 @@ A complete list of currently supported format string variables is listed below:
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.name-without-args`` | The name of the current function without arguments and values (used to include a function name in-line in the ``disassembly-format``) |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| ``function.name-qualifiers`` | Any qualifiers added after the name of a function and before its arguments or template arguments. E.g., for Swift the name qualifier for ``closure #1 in A.foo<Int>()`` is `` in A.foo``. |
++---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.basename`` | The basename of the current function depending on the frame's language. E.g., for C++ the basename for ``void ns::foo<float>::bar<int>(int) const`` is ``bar``. |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.prefix`` | Any prefix added to the demangled function name of the current function. This depends on the frame's language. E.g., for C++ the prefix will always be empty. |
@@ -332,6 +334,7 @@ The function names displayed in backtraces/``frame info``/``thread info`` are th
- ``${function.prefix}``
- ``${function.scope}``
- ``${function.basename}``
+- ``${function.name-qualifiers}``
- ``${function.template-arguments}``
- ``${function.formatted-arguments}``
- ``${function.qualifiers}``
diff --git a/lldb/include/lldb/Core/DemangledNameInfo.h b/lldb/include/lldb/Core/DemangledNameInfo.h
index 9f567232dc50f..2b7c0f2039c1c 100644
--- a/lldb/include/lldb/Core/DemangledNameInfo.h
+++ b/lldb/include/lldb/Core/DemangledNameInfo.h
@@ -22,7 +22,9 @@ namespace lldb_private {
struct DemangledNameInfo {
/// A [start, end) pair for the function basename.
/// The basename is the name without scope qualifiers
- /// and without template parameters. E.g.,
+ /// and without template parameters.
+ ///
+ /// E.g.,
/// \code{.cpp}
/// void foo::bar<int>::someFunc<float>(int) const &&
/// ^ ^
@@ -30,8 +32,19 @@ struct DemangledNameInfo {
/// \endcode
std::pair<size_t, size_t> BasenameRange;
+ /// A [start, end) pair for the function template arguments.
+ ///
+ /// E.g.,
+ /// \code{.cpp}
+ /// void foo::bar<int>::someFunc<float>(int) const &&
+ /// ^ ^
+ /// start end
+ /// \endcode
+ std::pair<size_t, size_t> TemplateArgumentsRange;
+
/// A [start, end) pair for the function scope qualifiers.
- /// E.g., for
+ ///
+ /// E.g.,
/// \code{.cpp}
/// void foo::bar<int>::qux<float>(int) const &&
/// ^ ^
@@ -40,6 +53,7 @@ struct DemangledNameInfo {
std::pair<size_t, size_t> ScopeRange;
/// Indicates the [start, end) of the function argument list.
+ ///
/// E.g.,
/// \code{.cpp}
/// int (*getFunc<float>(float, double))(int, int)
@@ -59,6 +73,19 @@ struct DemangledNameInfo {
/// \endcode
std::pair<size_t, size_t> QualifiersRange;
+ /// Indicates the [start, end) of the function's name qualifiers. This is a
+ /// catch-all range for anything in between the basename and the function's
+ /// arguments or template arguments, that is not tracked by the rest of the
+ /// pairs.
+ ///
+ /// E.g.,
+ /// \code{.swift}
+ /// closure #1 in A.foo<Int>()
+ /// ^ ^
+ /// start end
+ /// \endcode
+ std::pair<size_t, size_t> NameQualifiersRange;
+
/// Indicates the [start, end) of the function's prefix. This is a
/// catch-all range for anything that is not tracked by the rest of
/// the pairs.
@@ -75,6 +102,11 @@ struct DemangledNameInfo {
return BasenameRange.second > BasenameRange.first;
}
+ /// Returns \c true if this object holds a valid template arguments range.
+ bool hasTemplateArguments() const {
+ return TemplateArgumentsRange.second >= TemplateArgumentsRange.first;
+ }
+
/// Returns \c true if this object holds a valid scope range.
bool hasScope() const { return ScopeRange.second >= ScopeRange.first; }
@@ -88,6 +120,11 @@ struct DemangledNameInfo {
return QualifiersRange.second >= QualifiersRange.first;
}
+ /// Returns \c true if this object holds a valid name qualifiers range.
+ bool hasNameQualifiers() const {
+ return NameQualifiersRange.second >= NameQualifiersRange.first;
+ }
+
/// Returns \c true if this object holds a valid prefix range.
bool hasPrefix() const { return PrefixRange.second >= PrefixRange.first; }
diff --git a/lldb/include/lldb/Core/FormatEntity.h b/lldb/include/lldb/Core/FormatEntity.h
index 17fee068230b2..d602edffb4c88 100644
--- a/lldb/include/lldb/Core/FormatEntity.h
+++ b/lldb/include/lldb/Core/FormatEntity.h
@@ -91,6 +91,7 @@ struct Entry {
FunctionPrefix,
FunctionScope,
FunctionBasename,
+ FunctionNameQualifiers,
FunctionTemplateArguments,
FunctionFormattedArguments,
FunctionReturnLeft,
diff --git a/lldb/source/Core/DemangledNameInfo.cpp b/lldb/source/Core/DemangledNameInfo.cpp
index 54a06edc5ec1d..00227f02bbff8 100644
--- a/lldb/source/Core/DemangledNameInfo.cpp
+++ b/lldb/source/Core/DemangledNameInfo.cpp
@@ -92,6 +92,14 @@ void TrackingOutputBuffer::finalizeStart() {
if (NameInfo.BasenameRange.second == 0)
NameInfo.BasenameRange.second = getCurrentPosition();
+ // There is something between the basename and the start of the function
+ // arguments. Assume those are template arguments (which *should* be true for
+ // C++ demangled names, but this assumption may change in the future, in
+ // which case this needs to be adjusted).
+ if (NameInfo.BasenameRange.second != NameInfo.ArgumentsRange.first)
+ NameInfo.TemplateArgumentsRange = {NameInfo.BasenameRange.second,
+ NameInfo.ArgumentsRange.first};
+
assert(!shouldTrack());
assert(canFinalize());
}
diff --git a/lldb/source/Core/FormatEntity.cpp b/lldb/source/Core/FormatEntity.cpp
index 370b51e726ec2..5d3c8b421d5d1 100644
--- a/lldb/source/Core/FormatEntity.cpp
+++ b/lldb/source/Core/FormatEntity.cpp
@@ -128,6 +128,7 @@ constexpr Definition g_function_child_entries[] = {
Definition("prefix", EntryType::FunctionPrefix),
Definition("scope", EntryType::FunctionScope),
Definition("basename", EntryType::FunctionBasename),
+ Definition("name-qualifiers", EntryType::FunctionNameQualifiers),
Definition("template-arguments", EntryType::FunctionTemplateArguments),
Definition("formatted-arguments", EntryType::FunctionFormattedArguments),
Definition("return-left", EntryType::FunctionReturnLeft),
@@ -390,6 +391,7 @@ const char *FormatEntity::Entry::TypeToCString(Type t) {
ENUM_TO_CSTR(FunctionPrefix);
ENUM_TO_CSTR(FunctionScope);
ENUM_TO_CSTR(FunctionBasename);
+ ENUM_TO_CSTR(FunctionNameQualifiers);
ENUM_TO_CSTR(FunctionTemplateArguments);
ENUM_TO_CSTR(FunctionFormattedArguments);
ENUM_TO_CSTR(FunctionReturnLeft);
@@ -1842,6 +1844,7 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
case Entry::Type::FunctionPrefix:
case Entry::Type::FunctionScope:
case Entry::Type::FunctionBasename:
+ case Entry::Type::FunctionNameQualifiers:
case Entry::Type::FunctionTemplateArguments:
case Entry::Type::FunctionFormattedArguments:
case Entry::Type::FunctionReturnRight:
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index 46753c5efc331..3353d5a898898 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -283,12 +283,12 @@ GetDemangledTemplateArguments(const SymbolContext &sc) {
auto [demangled_name, info] = *info_or_err;
- if (info.ArgumentsRange.first < info.BasenameRange.second)
- return llvm::createStringError("Arguments range for '%s' is invalid.",
- demangled_name.data());
+ if (!info.hasTemplateArguments())
+ return llvm::createStringError(
+ "Template arguments range for '%s' is invalid.", demangled_name.data());
- return demangled_name.slice(info.BasenameRange.second,
- info.ArgumentsRange.first);
+ return demangled_name.slice(info.TemplateArgumentsRange.first,
+ info.TemplateArgumentsRange.second);
}
static llvm::Expected<llvm::StringRef>
diff --git a/lldb/unittests/Core/MangledTest.cpp b/lldb/unittests/Core/MangledTest.cpp
index 4bda657047541..eecef033aa349 100644
--- a/lldb/unittests/Core/MangledTest.cpp
+++ b/lldb/unittests/Core/MangledTest.cpp
@@ -435,142 +435,202 @@ struct DemanglingPartsTestCase {
DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
// clang-format off
{ "_ZNVKO3BarIN2ns3QuxIiEEE1CIPFi3FooIS_IiES6_EEE6methodIS6_EENS5_IT_SC_E5InnerIiEESD_SD_",
- { /*.BasenameRange=*/{92, 98}, /*.ScopeRange=*/{36, 92}, /*.ArgumentsRange=*/{ 108, 158 },
- /*.QualifiersRange=*/{158, 176}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{92, 98}, /*.TemplateArgumentsRange=*/{98, 108}, /*.ScopeRange=*/{36, 92},
+ /*.ArgumentsRange=*/{108, 158}, /*.QualifiersRange=*/{158, 176}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"method",
/*.scope=*/"Bar<ns::Qux<int>>::C<int (*)(Foo<Bar<int>, Bar<int>>)>::",
/*.qualifiers=*/" const volatile &&"
},
{ "_Z7getFuncIfEPFiiiET_",
- { /*.BasenameRange=*/{6, 13}, /*.ScopeRange=*/{6, 6}, /*.ArgumentsRange=*/{ 20, 27 },
- /*.QualifiersRange=*/{38, 38}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{6, 13}, /*.TemplateArgumentsRange=*/{13, 20}, /*.ScopeRange=*/{6, 6},
+ /*.ArgumentsRange=*/{20, 27}, /*.QualifiersRange=*/{38, 38}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"getFunc",
/*.scope=*/"",
/*.qualifiers=*/""
},
{ "_ZN1f1b1c1gEv",
- { /*.BasenameRange=*/{9, 10}, /*.ScopeRange=*/{0, 9}, /*.ArgumentsRange=*/{ 10, 12 },
- /*.QualifiersRange=*/{12, 12}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{9, 10}, /*.TemplateArgumentsRange=*/{0, 0}, /*.ScopeRange=*/{0, 9},
+ /*.ArgumentsRange=*/{10, 12}, /*.QualifiersRange=*/{12, 12}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"g",
/*.scope=*/"f::b::c::",
/*.qualifiers=*/""
},
{ "_ZN5test73fD1IiEEDTcmtlNS_1DEL_ZNS_1bEEEcvT__EES2_",
- { /*.BasenameRange=*/{45, 48}, /*.ScopeRange=*/{38, 45}, /*.ArgumentsRange=*/{ 53, 58 },
- /*.QualifiersRange=*/{58, 58}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{45, 48}, /*.TemplateArgumentsRange=*/{48, 53}, /*.ScopeRange=*/{38, 45},
+ /*.ArgumentsRange=*/{53, 58}, /*.QualifiersRange=*/{58, 58}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"fD1",
/*.scope=*/"test7::",
/*.qualifiers=*/""
},
{ "_ZN5test73fD1IiEEDTcmtlNS_1DEL_ZNS_1bINDT1cE1dEEEEEcvT__EES2_",
- { /*.BasenameRange=*/{61, 64}, /*.ScopeRange=*/{54, 61}, /*.ArgumentsRange=*/{ 69, 79 },
- /*.QualifiersRange=*/{79, 79}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{61, 64}, /*.TemplateArgumentsRange=*/{64, 69},/*.ScopeRange=*/{54, 61},
+ /*.ArgumentsRange=*/{69, 79}, /*.QualifiersRange=*/{79, 79}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"fD1",
/*.scope=*/"test7::",
/*.qualifiers=*/""
},
{ "_ZN5test7INDT1cE1dINDT1cE1dEEEE3fD1INDT1cE1dINDT1cE1dEEEEEDTcmtlNS_1DEL_ZNS_1bINDT1cE1dEEEEEcvT__EES2_",
- { /*.BasenameRange=*/{120, 123}, /*.ScopeRange=*/{81, 120}, /*.ArgumentsRange=*/{ 155, 168 },
- /*.QualifiersRange=*/{168, 168}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{120, 123}, /*.TemplateArgumentsRange=*/{123, 155}, /*.ScopeRange=*/{81, 120},
+ /*.ArgumentsRange=*/{155, 168}, /*.QualifiersRange=*/{168, 168}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"fD1",
/*.scope=*/"test7<decltype(c)::d<decltype(c)::d>>::",
/*.qualifiers=*/""
},
{ "_ZN8nlohmann16json_abi_v3_11_310basic_jsonINSt3__13mapENS2_6vectorENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbxydS8_NS0_14adl_serializerENS4_IhNS8_IhEEEEvE5parseIRA29_KcEESE_OT_NS2_8functionIFbiNS0_6detail13parse_event_tERSE_EEEbb",
- { /*.BasenameRange=*/{687, 692}, /*.ScopeRange=*/{343, 687}, /*.ArgumentsRange=*/{ 713, 1174 },
- /*.QualifiersRange=*/{1174, 1174}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{687, 692}, /*.TemplateArgumentsRange=*/{692, 713}, /*.ScopeRange=*/{343, 687},
+ /*.ArgumentsRange=*/{713, 1174}, /*.QualifiersRange=*/{1174, 1174}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"parse",
/*.scope=*/"nlohmann::json_abi_v3_11_3::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::json_abi_v3_11_3::adl_serializer, std::__1::vector<unsigned char, std::__1::allocator<unsigned char>>, void>::",
/*.qualifiers=*/""
},
{ "_ZN8nlohmann16json_abi_v3_11_310basic_jsonINSt3__13mapENS2_6vectorENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbxydS8_NS0_14adl_serializerENS4_IhNS8_IhEEEEvEC1EDn",
- { /*.BasenameRange=*/{344, 354}, /*.ScopeRange=*/{0, 344}, /*.ArgumentsRange=*/{ 354, 370 },
- /*.QualifiersRange=*/{370, 370}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{344, 354}, /*.TemplateArgumentsRange=*/{0, 0}, /*.ScopeRange=*/{0, 344},
+ /*.ArgumentsRange=*/{354, 370}, /*.QualifiersRange=*/{370, 370}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"basic_json",
/*.scope=*/"nlohmann::json_abi_v3_11_3::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::json_abi_v3_11_3::adl_serializer, std::__1::vector<unsigned char, std::__1::allocator<unsigned char>>, void>::",
/*.qualifiers=*/""
},
{ "_Z3fppIiEPFPFvvEiEf",
- { /*.BasenameRange=*/{10, 13}, /*.ScopeRange=*/{10, 10}, /*.ArgumentsRange=*/{ 18, 25 },
- /*.QualifiersRange=*/{34,34}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{10, 13}, /*.TemplateArgumentsRange=*/{13, 18}, /*.ScopeRange=*/{10, 10},
+ /*.ArgumentsRange=*/{18, 25}, /*.QualifiersRange=*/{34,34}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"fpp",
/*.scope=*/"",
/*.qualifiers=*/""
},
{ "_Z3fppIiEPFPFvvEN2ns3FooIiEEEf",
- { /*.BasenameRange=*/{10, 13}, /*.ScopeRange=*/{10, 10}, /*.ArgumentsRange=*/{ 18, 25 },
- /*.QualifiersRange=*/{43, 43}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{10, 13}, /*.TemplateArgumentsRange=*/{13, 18}, /*.ScopeRange=*/{10, 10},
+ /*.ArgumentsRange=*/{18, 25}, /*.QualifiersRange=*/{43, 43}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"fpp",
/*.scope=*/"",
/*.qualifiers=*/""
},
{ "_Z3fppIiEPFPFvPFN2ns3FooIiEENS2_3BarIfE3QuxEEEPFS2_S2_EEf",
- { /*.BasenameRange=*/{10, 13}, /*.ScopeRange=*/{10, 10}, /*.ArgumentsRange=*/{ 18, 25 },
- /*.QualifiersRange=*/{108, 108}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{10, 13}, /*.TemplateArgumentsRange=*/{13, 18}, /*.ScopeRange=*/{10, 10},
+ /*.ArgumentsRange=*/{18, 25}, /*.QualifiersRange=*/{108, 108}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"fpp",
/*.scope=*/"",
/*.qualifiers=*/""
},
{ "_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvvEiEf",
- { /*.BasenameRange=*/{64, 67}, /*.ScopeRange=*/{10, 64}, /*.ArgumentsRange=*/{ 72, 79 },
- /*.QualifiersRange=*/{88, 88}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{64, 67}, /*.TemplateArgumentsRange=*/{67, 72}, /*.ScopeRange=*/{10, 64},
+ /*.ArgumentsRange=*/{72, 79}, /*.QualifiersRange=*/{88, 88}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"fpp",
/*.scope=*/"ns::HasFuncs<ns::Foo<ns::Foo<int>::Bar<float>::Qux>>::",
/*.qualifiers=*/""
},
{ "_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvvES2_Ef",
- { /*.BasenameRange=*/{64, 67}, /*.ScopeRange=*/{10, 64}, /*.ArgumentsRange=*/{ 72, 79 },
- /*.QualifiersRange=*/{97, 97}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{64, 67}, /*.TemplateArgumentsRange=*/{67, 72}, /*.ScopeRange=*/{10, 64},
+ /*.ArgumentsRange=*/{72, 79}, /*.QualifiersRange=*/{97, 97}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"fpp",
/*.scope=*/"ns::HasFuncs<ns::Foo<ns::Foo<int>::Bar<float>::Qux>>::",
/*.qualifiers=*/"",
},
{ "_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvPFS2_S5_EEPFS2_S2_EEf",
- { /*.BasenameRange=*/{64, 67}, /*.ScopeRange=*/{10, 64}, /*.ArgumentsRange=*/{ 72, 79 },
- /*.QualifiersRange=*/{162, 162}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{64, 67}, /*.TemplateArgumentsRange=*/{67, 72}, /*.ScopeRange=*/{10, 64},
+ /*.ArgumentsRange=*/{72, 79}, /*.QualifiersRange=*/{162, 162}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"fpp",
/*.scope=*/"ns::HasFuncs<ns::Foo<ns::Foo<int>::Bar<float>::Qux>>::",
/*.qualifiers=*/"",
},
{ "_ZNKO2ns3ns23Bar3fooIiEEPFPFNS0_3FooIiEEiENS3_IfEEEi",
- { /*.BasenameRange=*/{37, 40}, /*.ScopeRange=*/{23, 37}, /*.ArgumentsRange=*/{ 45, 50 },
- /*.QualifiersRange=*/{78, 87}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{37, 40}, /*.TemplateArgumentsRange=*/{40, 45}, /*.ScopeRange=*/{23, 37},
+ /*.ArgumentsRange=*/{45, 50}, /*.QualifiersRange=*/{78, 87}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"foo",
/*.scope=*/"ns::ns2::Bar::",
/*.qualifiers=*/" const &&",
},
{ "_ZTV11ImageLoader",
- { /*.BasenameRange=*/{0, 0}, /*.ScopeRange=*/{0, 0}, /*.ArgumentsRange=*/{ 0, 0 },
- /*.QualifiersRange=*/{0, 0}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{0, 0}, /*.TemplateArgumentsRange=*/{0, 0}, /*.ScopeRange=*/{0, 0},
+ /*.ArgumentsRange=*/{0, 0}, /*.QualifiersRange=*/{0, 0}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"",
/*.scope=*/"",
/*.qualifiers=*/"",
/*.valid_basename=*/false
},
{ "___ZNK5dyld313MachOAnalyzer18forEachInitializerER11DiagnosticsRKNS0_15VMAddrConverterEU13block_pointerFvjEPKv_block_invoke.204",
- { /*.BasenameRange=*/{55, 73}, /*.ScopeRange=*/{33, 55}, /*.ArgumentsRange=*/{ 73, 181 },
- /*.QualifiersRange=*/{181, 187}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{55, 73}, /*.TemplateArgumentsRange=*/{0, 0}, /*.ScopeRange=*/{33, 55},
+ /*.ArgumentsRange=*/{73, 181}, /*.QualifiersRange=*/{181, 187}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"forEachInitializer",
/*.scope=*/"dyld3::MachOAnalyzer::",
/*.qualifiers=*/" const",
},
{ "_ZZN5dyld45startEPNS_10KernelArgsEPvS2_ENK3$_1clEv",
- { /*.BasenameRange=*/{53, 63}, /*.ScopeRange=*/{0, 53}, /*.ArgumentsRange=*/{ 63, 65 },
- /*.QualifiersRange=*/{65, 71}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{53, 63}, /*.TemplateArgumentsRange=*/{0, 0}, /*.ScopeRange=*/{0, 53},
+ /*.ArgumentsRange=*/{63, 65}, /*.QualifiersRange=*/{65, 71}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"operator()",
/*.scope=*/"dyld4::start(dyld4::KernelArgs*, void*, void*)::$_1::",
/*.qualifiers=*/" const",
},
{ "_ZZNK5dyld46Loader38runInitializersBottomUpPlusUpwardLinksERNS_12RuntimeStateEENK3$_0clEv",
- { /*.BasenameRange=*/{88, 98}, /*.ScopeRange=*/{0, 88}, /*.ArgumentsRange=*/{ 98, 100 },
- /*.QualifiersRange=*/{100, 106}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{88, 98}, /*.TemplateArgumentsRange=*/{0, 0}, /*.ScopeRange=*/{0, 88},
+ /*.ArgumentsRange=*/{98, 100}, /*.QualifiersRange=*/{100, 106}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"operator()",
/*.scope=*/"dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const::$_0::",
/*.qualifiers=*/" const",
},
{ "_ZZNK5dyld46Loader38runInitializersBottomUpPlusUpwardLinksERNS_12RuntimeStateEENK3$_0clEv.cold",
- { /*.BasenameRange=*/{88, 98}, /*.ScopeRange=*/{0, 88}, /*.ArgumentsRange=*/{ 98, 100 },
- /*.QualifiersRange=*/{100, 106}, /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0} },
+ {
+ /*.BasenameRange=*/{88, 98}, /*.TemplateArgumentsRange=*/{0, 0}, /*.ScopeRange=*/{0, 88},
+ /*.ArgumentsRange=*/{98, 100}, /*.QualifiersRange=*/{100, 106}, /*.NameQualifiersRange=*/{0, 0},
+ /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+ },
/*.basename=*/"operator()",
/*.scope=*/"dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const::$_0::",
/*.qualifiers=*/" const",
@@ -617,11 +677,12 @@ TEST_P(DemanglingPartsTestFixture, DemanglingParts) {
auto demangled = std::string_view(*OB);
ASSERT_EQ(OB->NameInfo.hasBasename(), valid_basename);
-
EXPECT_EQ(OB->NameInfo.BasenameRange, info.BasenameRange);
+ EXPECT_EQ(OB->NameInfo.TemplateArgumentsRange, info.TemplateArgumentsRange);
EXPECT_EQ(OB->NameInfo.ScopeRange, info.ScopeRange);
EXPECT_EQ(OB->NameInfo.ArgumentsRange, info.ArgumentsRange);
EXPECT_EQ(OB->NameInfo.QualifiersRange, info.QualifiersRange);
+ EXPECT_EQ(OB->NameInfo.NameQualifiersRange, info.NameQualifiersRange);
auto get_part = [&](const std::pair<size_t, size_t> &loc) {
return demangled.substr(loc.first, loc.second - loc.first);
@@ -638,57 +699,97 @@ INSTANTIATE_TEST_SUITE_P(DemanglingPartsTests, DemanglingPartsTestFixture,
struct DemangledNameInfoTestCase {
DemangledNameInfo expected_info;
bool valid_basename;
+ bool valid_template;
bool valid_scope;
bool valid_arguments;
bool valid_qualifiers;
+ bool valid_name_qualifiers;
bool valid_prefix;
bool valid_suffix;
};
DemangledNameInfoTestCase g_demangled_name_info_test_cases[] = {
// clang-format off
- {
- { /*.BasenameRange=*/{0, 10}, /*.ScopeRange=*/{1, 0}, /*.ArgumentsRange=*/{1, 0},
- /*.QualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
+ {
+ {
+ /*.BasenameRange=*/{0, 10}, /*.TemplateArgumentsRange=*/{1, 0}, /*.ScopeRange=*/{1, 0},
+ /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, /*.NameQualifiersRange=*/{1, 0},
+ /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
},
- /*valid_basename=*/true, /*valid_scope=*/false, /*valid_arguments=*/false,
- /*valid_qualifiers=*/false, /*valid_prefix=*/false, /*valid_suffix=*/false,
- },
- {
- { /*.BasenameRange=*/{1, 0}, /*.ScopeRange=*/{0, 10}, /*.ArgumentsRange=*/{1, 0},
- /*.QualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
+ /*valid_basename=*/true, /*valid_template=*/false, /*valid_scope=*/false,
+ /*valid_arguments=*/false, /*valid_qualifiers=*/false, /*valid_name_qualifiers=*/false,
+ /*valid_prefix=*/false, /*valid_suffix=*/false,
+ },
+ {
+ {
+ /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{0, 10}, /*.ScopeRange=*/{1, 0},
+ /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, /*.NameQualifiersRange=*/{1, 0},
+ /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
},
- /*valid_basename=*/false, /*valid_scope=*/true, /*valid_arguments=*/false,
- /*valid_qualifiers=*/false, /*valid_prefix=*/false, /*valid_suffix=*/false,
- },
- {
- { /*.BasenameRange=*/{1, 0}, /*.ScopeRange=*/{1, 0}, /*.ArgumentsRange=*/{0, 10},
- /*.QualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
+ /*valid_basename=*/false, /*valid_name_qualifiers=*/true, /*valid_scope=*/false,
+ /*valid_arguments=*/false, /*valid_qualifiers=*/false, /*valid_name_qualifiers=*/false,
+ /*valid_prefix=*/false, /*valid_suffix=*/false,
+ },
+ {
+ {
+ /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, /*.ScopeRange=*/{0, 10},
+ /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, /*.NameQualifiersRange=*/{1, 0},
+ /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
},
- /*valid_basename=*/false, /*valid_scope=*/false, /*valid_arguments=*/true,
- /*valid_qualifiers=*/false, /*valid_prefix=*/false, /*valid_suffix=*/false,
- },
- {
- { /*.BasenameRange=*/{1, 0}, /*.ScopeRange=*/{1, 0}, /*.ArgumentsRange=*/{1, 0},
- /*.QualifiersRange=*/{0, 10}, /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
+ /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/true,
+ /*valid_arguments=*/false, /*valid_qualifiers=*/false, /*valid_name_qualifiers=*/false,
+ /*valid_prefix=*/false, /*valid_suffix=*/false,
+ },
+ {
+ {
+ /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, /*.ScopeRange=*/{1, 0},
+ /*.ArgumentsRange=*/{0, 10}, /*.QualifiersRange=*/{1, 0}, /*.NameQualifiersRange=*/{1, 0},
+ /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
},
- /*valid_basename=*/false, /*valid_scope=*/false, /*valid_arguments=*/false,
- /*valid_qualifiers=*/true, /*valid_prefix=*/false, /*valid_suffix=*/false,
- },
- {
- { /*.BasenameRange=*/{1, 0}, /*.ScopeRange=*/{1, 0}, /*.ArgumentsRange=*/{1, 0},
- /*.QualifiersRange=*/{1, 0}, /*.PrefixRange=*/{0, 10}, /*.SuffixRange=*/{1, 0}
+ /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
+ /*valid_arguments=*/true, /*valid_qualifiers=*/false, /*valid_name_qualifiers=*/false,
+ /*valid_prefix=*/false, /*valid_suffix=*/false,
+ },
+ {
+ {
+ /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, /*.ScopeRange=*/{1, 0},
+ /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{0, 10}, /*.NameQualifiersRange=*/{1, 0},
+ /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
},
- /*valid_basename=*/false, /*valid_scope=*/false, /*valid_arguments=*/false,
- /*valid_qualifiers=*/false, /*valid_prefix=*/true, /*valid_suffix=*/false,
- },
- {
- { /*.BasenameRange=*/{1, 0}, /*.ScopeRange=*/{1, 0}, /*.ArgumentsRange=*/{1, 0},
- /*.QualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{0, 10}
+ /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
+ /*valid_arguments=*/false, /*valid_qualifiers=*/true, /*valid_name_qualifiers=*/false,
+ /*valid_prefix=*/false, /*valid_suffix=*/false,
+ },
+ {
+ {
+ /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, /*.ScopeRange=*/{1, 0},
+ /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, /*.NameQualifiersRange=*/{0, 10},
+ /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
},
- /*valid_basename=*/false, /*valid_scope=*/false, /*valid_arguments=*/false,
- /*valid_qualifiers=*/false, /*valid_prefix=*/false, /*valid_suffix=*/true,
- },
+ /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
+ /*valid_arguments=*/false, /*valid_qualifiers=*/false, /*valid_name_qualifiers=*/true,
+ /*valid_prefix=*/false, /*valid_suffix=*/false,
+ },
+ {
+ {
+ /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, /*.ScopeRange=*/{1, 0},
+ /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, /*.NameQualifiersRange=*/{1, 0},
+ /*.PrefixRange=*/{0, 10}, /*.SuffixRange=*/{1, 0}
+ },
+ /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
+ /*valid_arguments=*/false, /*valid_qualifiers=*/false, /*valid_name_qualifiers=*/false,
+ /*valid_prefix=*/true, /*valid_suffix=*/false,
+ },
+ {
+ {
+ /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, /*.ScopeRange=*/{1, 0},
+ /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, /*.NameQualifiersRange=*/{1, 0},
+ /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{0, 10}
+ },
+ /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
+ /*valid_arguments=*/false, /*valid_qualifiers=*/false, /*valid_name_qualifiers=*/false,
+ /*valid_prefix=*/false, /*valid_suffix=*/true,
+ },
// clang-format on
};
@@ -696,13 +797,16 @@ struct DemangledNameInfoTestFixture
: public ::testing::TestWithParam<DemangledNameInfoTestCase> {};
TEST_P(DemangledNameInfoTestFixture, DemangledNameInfoRanges) {
- const auto &[info, valid_basename, valid_scope, valid_arguments,
- valid_qualifiers, valid_prefix, valid_suffix] = GetParam();
+ const auto &[info, valid_basename, valid_template_arguments, valid_scope,
+ valid_arguments, valid_qualifiers, valid_name_qualifiers,
+ valid_prefix, valid_suffix] = GetParam();
ASSERT_EQ(info.hasBasename(), valid_basename);
+ ASSERT_EQ(info.hasTemplateArguments(), valid_template_arguments);
ASSERT_EQ(info.hasScope(), valid_scope);
ASSERT_EQ(info.hasArguments(), valid_arguments);
ASSERT_EQ(info.hasQualifiers(), valid_qualifiers);
+ ASSERT_EQ(info.hasNameQualifiers(), valid_name_qualifiers);
ASSERT_EQ(info.hasPrefix(), valid_prefix);
ASSERT_EQ(info.hasSuffix(), valid_suffix);
}
More information about the lldb-commits
mailing list