diff options
author | Michael Buch <michaelbuch12@gmail.com> | 2025-08-05 18:12:22 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-05 18:12:22 +0100 |
commit | 406f61fd3a28b9628f50cf009c6e65562f93a2cc (patch) | |
tree | f7b832a1c4a54556387bf9f55018eb47e97732cf /lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp | |
parent | 3b2a1a5d9bb071bf210a2b070ee931b1d8e29b9e (diff) | |
download | llvm-406f61fd3a28b9628f50cf009c6e65562f93a2cc.zip llvm-406f61fd3a28b9628f50cf009c6e65562f93a2cc.tar.gz llvm-406f61fd3a28b9628f50cf009c6e65562f93a2cc.tar.bz2 |
[lldb][CPlusPlusLanguage] Create public accessors for getting DemangledNameInfo components and use them in tests (#152134)
This way we make sure that the logic to reconstruct demangled names in
the tests is the same as the logic when reconstructing the actual
frame-format variable.
`DemangledNameInfo::SuffixRange` is currently the only one which we
can't test in the same way until we set it from inside the
`TrackingOutputBuffer`. I added TODOs to track this.
Diffstat (limited to 'lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp')
-rw-r--r-- | lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp | 132 |
1 files changed, 95 insertions, 37 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 3353d5a..3bc8708 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -19,6 +19,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Demangle/ItaniumDemangle.h" +#include "lldb/Core/DemangledNameInfo.h" #include "lldb/Core/Mangled.h" #include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" @@ -271,8 +272,25 @@ GetDemangledBasename(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - return demangled_name.slice(info.BasenameRange.first, - info.BasenameRange.second); + return CPlusPlusLanguage::GetDemangledBasename(demangled_name, info); +} + +llvm::StringRef +CPlusPlusLanguage::GetDemangledBasename(llvm::StringRef demangled, + const DemangledNameInfo &info) { + assert(info.hasBasename()); + return demangled.slice(info.BasenameRange.first, info.BasenameRange.second); +} + +llvm::Expected<llvm::StringRef> +CPlusPlusLanguage::GetDemangledTemplateArguments( + llvm::StringRef demangled, const DemangledNameInfo &info) { + if (!info.hasTemplateArguments()) + return llvm::createStringError( + "Template arguments range for '%s' is invalid.", demangled.data()); + + return demangled.slice(info.TemplateArgumentsRange.first, + info.TemplateArgumentsRange.second); } static llvm::Expected<llvm::StringRef> @@ -283,12 +301,17 @@ GetDemangledTemplateArguments(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - if (!info.hasTemplateArguments()) + return CPlusPlusLanguage::GetDemangledTemplateArguments(demangled_name, info); +} + +llvm::Expected<llvm::StringRef> +CPlusPlusLanguage::GetDemangledReturnTypeLHS(llvm::StringRef demangled, + const DemangledNameInfo &info) { + if (info.ScopeRange.first >= demangled.size()) return llvm::createStringError( - "Template arguments range for '%s' is invalid.", demangled_name.data()); + "Scope range for '%s' LHS return type is invalid.", demangled.data()); - return demangled_name.slice(info.TemplateArgumentsRange.first, - info.TemplateArgumentsRange.second); + return demangled.substr(0, info.ScopeRange.first); } static llvm::Expected<llvm::StringRef> @@ -299,12 +322,18 @@ GetDemangledReturnTypeLHS(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - if (info.ScopeRange.first >= demangled_name.size()) - return llvm::createStringError( - "Scope range for '%s' LHS return type is invalid.", - demangled_name.data()); + return CPlusPlusLanguage::GetDemangledReturnTypeLHS(demangled_name, info); +} + +llvm::Expected<llvm::StringRef> +CPlusPlusLanguage::GetDemangledFunctionQualifiers( + llvm::StringRef demangled, const DemangledNameInfo &info) { + if (!info.hasQualifiers()) + return llvm::createStringError("Qualifiers range for '%s' is invalid.", + demangled.data()); - return demangled_name.substr(0, info.ScopeRange.first); + return demangled.slice(info.QualifiersRange.first, + info.QualifiersRange.second); } static llvm::Expected<llvm::StringRef> @@ -315,12 +344,20 @@ GetDemangledFunctionQualifiers(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - if (!info.hasQualifiers()) - return llvm::createStringError("Qualifiers range for '%s' is invalid.", - demangled_name.data()); + return CPlusPlusLanguage::GetDemangledFunctionQualifiers(demangled_name, + info); +} - return demangled_name.slice(info.QualifiersRange.first, - info.QualifiersRange.second); +llvm::Expected<llvm::StringRef> +CPlusPlusLanguage::GetDemangledReturnTypeRHS(llvm::StringRef demangled, + const DemangledNameInfo &info) { + if (info.QualifiersRange.first < info.ArgumentsRange.second) + return llvm::createStringError( + "Qualifiers range for '%s' RHS return type is invalid.", + demangled.data()); + + return demangled.slice(info.ArgumentsRange.second, + info.QualifiersRange.first); } static llvm::Expected<llvm::StringRef> @@ -331,13 +368,17 @@ GetDemangledReturnTypeRHS(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - if (info.QualifiersRange.first < info.ArgumentsRange.second) - return llvm::createStringError( - "Qualifiers range for '%s' RHS return type is invalid.", - demangled_name.data()); + return CPlusPlusLanguage::GetDemangledReturnTypeRHS(demangled_name, info); +} - return demangled_name.slice(info.ArgumentsRange.second, - info.QualifiersRange.first); +llvm::Expected<llvm::StringRef> +CPlusPlusLanguage::GetDemangledScope(llvm::StringRef demangled, + const DemangledNameInfo &info) { + if (!info.hasScope()) + return llvm::createStringError("Scope range for '%s' is invalid.", + demangled.data()); + + return demangled.slice(info.ScopeRange.first, info.ScopeRange.second); } static llvm::Expected<llvm::StringRef> @@ -348,15 +389,16 @@ GetDemangledScope(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - if (!info.hasScope()) - return llvm::createStringError("Scope range for '%s' is invalid.", - demangled_name.data()); - - return demangled_name.slice(info.ScopeRange.first, info.ScopeRange.second); + return CPlusPlusLanguage::GetDemangledScope(demangled_name, info); } /// Handles anything printed after the FunctionEncoding ItaniumDemangle -/// node. Most notably the DotSUffix node. +/// node. Most notably the DotSuffix node. +/// +/// FIXME: the suffix should also have an associated +/// CPlusPlusLanguage::GetDemangledFunctionSuffix +/// once we start setting the `DemangledNameInfo::SuffixRange` +/// from inside the `TrackingOutputBuffer`. static llvm::Expected<llvm::StringRef> GetDemangledFunctionSuffix(const SymbolContext &sc) { auto info_or_err = GetAndValidateInfo(sc); @@ -372,6 +414,16 @@ GetDemangledFunctionSuffix(const SymbolContext &sc) { return demangled_name.slice(info.SuffixRange.first, info.SuffixRange.second); } +llvm::Expected<llvm::StringRef> +CPlusPlusLanguage::GetDemangledFunctionArguments( + llvm::StringRef demangled, const DemangledNameInfo &info) { + if (!info.hasArguments()) + return llvm::createStringError( + "Function arguments range for '%s' is invalid.", demangled.data()); + + return demangled.slice(info.ArgumentsRange.first, info.ArgumentsRange.second); +} + static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) { assert(sc.symbol); @@ -382,13 +434,19 @@ static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) { "frame-format variable: {0}"); return false; } + auto [demangled_name, info] = *info_or_err; - if (!info.hasArguments()) + auto args_or_err = + CPlusPlusLanguage::GetDemangledFunctionArguments(demangled_name, info); + if (!args_or_err) { + LLDB_LOG_ERROR(GetLog(LLDBLog::Language), args_or_err.takeError(), + "Failed to handle ${{function.formatted-arguments}} " + "frame-format variable: {0}"); return false; + } - s << demangled_name.slice(info.ArgumentsRange.first, - info.ArgumentsRange.second); + s << *args_or_err; return true; } @@ -2261,7 +2319,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( FormatEntity::Entry::Type type, Stream &s) { switch (type) { case FormatEntity::Entry::Type::FunctionScope: { - auto scope_or_err = GetDemangledScope(sc); + auto scope_or_err = ::GetDemangledScope(sc); if (!scope_or_err) { LLDB_LOG_ERROR( GetLog(LLDBLog::Language), scope_or_err.takeError(), @@ -2275,7 +2333,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( } case FormatEntity::Entry::Type::FunctionBasename: { - auto name_or_err = GetDemangledBasename(sc); + auto name_or_err = ::GetDemangledBasename(sc); if (!name_or_err) { LLDB_LOG_ERROR( GetLog(LLDBLog::Language), name_or_err.takeError(), @@ -2289,7 +2347,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( } case FormatEntity::Entry::Type::FunctionTemplateArguments: { - auto template_args_or_err = GetDemangledTemplateArguments(sc); + auto template_args_or_err = ::GetDemangledTemplateArguments(sc); if (!template_args_or_err) { LLDB_LOG_ERROR(GetLog(LLDBLog::Language), template_args_or_err.takeError(), @@ -2327,7 +2385,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( return true; } case FormatEntity::Entry::Type::FunctionReturnRight: { - auto return_rhs_or_err = GetDemangledReturnTypeRHS(sc); + auto return_rhs_or_err = ::GetDemangledReturnTypeRHS(sc); if (!return_rhs_or_err) { LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_rhs_or_err.takeError(), "Failed to handle ${{function.return-right}} frame-format " @@ -2340,7 +2398,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( return true; } case FormatEntity::Entry::Type::FunctionReturnLeft: { - auto return_lhs_or_err = GetDemangledReturnTypeLHS(sc); + auto return_lhs_or_err = ::GetDemangledReturnTypeLHS(sc); if (!return_lhs_or_err) { LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_lhs_or_err.takeError(), "Failed to handle ${{function.return-left}} frame-format " @@ -2353,7 +2411,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( return true; } case FormatEntity::Entry::Type::FunctionQualifiers: { - auto quals_or_err = GetDemangledFunctionQualifiers(sc); + auto quals_or_err = ::GetDemangledFunctionQualifiers(sc); if (!quals_or_err) { LLDB_LOG_ERROR(GetLog(LLDBLog::Language), quals_or_err.takeError(), "Failed to handle ${{function.qualifiers}} frame-format " |