https://github.com/charles-zablit updated https://github.com/llvm/llvm-project/pull/144731
>From 3c9a3e5e9af0c9d58783c11490bda473ada84ef3 Mon Sep 17 00:00:00 2001 From: Charles Zablit <c_zab...@apple.com> Date: Wed, 18 Jun 2025 16:41:40 +0100 Subject: [PATCH 1/8] [lldb] upgrade HandleFrameFormatVariable callees to llvm::Expected --- .../Language/CPlusPlus/CPlusPlusLanguage.cpp | 266 ++++++++---------- 1 file changed, 110 insertions(+), 156 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 0f18abb47591d..1810c07652a2b 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -236,199 +236,140 @@ static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream, return true; } -static std::optional<llvm::StringRef> -GetDemangledBasename(const SymbolContext &sc) { +static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>> +GetAndValidateInfo(const SymbolContext &sc) { Mangled mangled = sc.GetPossiblyInlinedFunctionName(); if (!mangled) - return std::nullopt; + return llvm::createStringError("Function does not have a mangled name."); auto demangled_name = mangled.GetDemangledName().GetStringRef(); if (demangled_name.empty()) - return std::nullopt; + return llvm::createStringError("Function does not have a demangled name."); const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); if (!info) - return std::nullopt; + return llvm::createStringError("Function does not have demangled info."); // Function without a basename is nonsense. if (!info->hasBasename()) - return std::nullopt; + return llvm::createStringError("Info do not have basename range."); - return demangled_name.slice(info->BasenameRange.first, - info->BasenameRange.second); + return std::make_pair(demangled_name, *info); } -static std::optional<llvm::StringRef> -GetDemangledTemplateArguments(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; +static llvm::Expected<llvm::StringRef> +GetDemangledBasename(const SymbolContext &sc) { + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; + return demangled_name.slice(info.BasenameRange.first, + info.BasenameRange.second); +} - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; +static llvm::Expected<llvm::StringRef> +GetDemangledTemplateArguments(const SymbolContext &sc) { + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); + + auto [demangled_name, info] = *info_or_err; - if (info->ArgumentsRange.first < info->BasenameRange.second) - return std::nullopt; + if (info.ArgumentsRange.first < info.BasenameRange.second) + return llvm::createStringError("Arguments in info are invalid."); - return demangled_name.slice(info->BasenameRange.second, - info->ArgumentsRange.first); + return demangled_name.slice(info.BasenameRange.second, + info.ArgumentsRange.first); } -static std::optional<llvm::StringRef> +static llvm::Expected<llvm::StringRef> GetDemangledReturnTypeLHS(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; + if (info.ScopeRange.first >= demangled_name.size()) + return llvm::createStringError("Scope range is invalid."); - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; - - if (info->ScopeRange.first >= demangled_name.size()) - return std::nullopt; - - return demangled_name.substr(0, info->ScopeRange.first); + return demangled_name.substr(0, info.ScopeRange.first); } -static std::optional<llvm::StringRef> +static llvm::Expected<llvm::StringRef> GetDemangledFunctionQualifiers(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; - - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; + if (info.QualifiersRange.second < info.QualifiersRange.first) + return llvm::createStringError("Qualifiers range is invalid."); - if (info->QualifiersRange.second < info->QualifiersRange.first) - return std::nullopt; - - return demangled_name.slice(info->QualifiersRange.first, - info->QualifiersRange.second); + return demangled_name.slice(info.QualifiersRange.first, + info.QualifiersRange.second); } -static std::optional<llvm::StringRef> +static llvm::Expected<llvm::StringRef> GetDemangledReturnTypeRHS(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; - - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; - - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - if (info->QualifiersRange.first < info->ArgumentsRange.second) - return std::nullopt; + if (info.QualifiersRange.first < info.ArgumentsRange.second) + return llvm::createStringError("Qualifiers range is invalid."); - return demangled_name.slice(info->ArgumentsRange.second, - info->QualifiersRange.first); + return demangled_name.slice(info.ArgumentsRange.second, + info.QualifiersRange.first); } -static std::optional<llvm::StringRef> +static llvm::Expected<llvm::StringRef> GetDemangledScope(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; - - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; - - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - if (info->ScopeRange.second < info->ScopeRange.first) - return std::nullopt; + if (info.ScopeRange.second < info.ScopeRange.first) + return llvm::createStringError("Info do not have basename range."); - return demangled_name.slice(info->ScopeRange.first, info->ScopeRange.second); + return demangled_name.slice(info.ScopeRange.first, info.ScopeRange.second); } /// Handles anything printed after the FunctionEncoding ItaniumDemangle /// node. Most notably the DotSUffix node. -static std::optional<llvm::StringRef> +static llvm::Expected<llvm::StringRef> GetDemangledFunctionSuffix(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; - - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; - - return demangled_name.slice(info->SuffixRange.first, - info->SuffixRange.second); + return demangled_name.slice(info.SuffixRange.first, info.SuffixRange.second); } static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) { assert(sc.symbol); - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return false; - - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return false; - - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return false; - - // Function without a basename is nonsense. - if (!info->hasBasename()) + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) { + info_or_err.takeError(); return false; + } + auto [demangled_name, info] = *info_or_err; - if (info->ArgumentsRange.second < info->ArgumentsRange.first) + if (info.ArgumentsRange.second < info.ArgumentsRange.first) return false; - s << demangled_name.slice(info->ArgumentsRange.first, - info->ArgumentsRange.second); + s << demangled_name.slice(info.ArgumentsRange.first, + info.ArgumentsRange.second); return true; } @@ -1954,32 +1895,37 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( FormatEntity::Entry::Type type, Stream &s) { switch (type) { case FormatEntity::Entry::Type::FunctionScope: { - std::optional<llvm::StringRef> scope = GetDemangledScope(sc); - if (!scope) + auto scope_or_err = GetDemangledScope(sc); + if (!scope_or_err) { + llvm::consumeError(scope_or_err.takeError()); return false; + } - s << *scope; + s << *scope_or_err; return true; } case FormatEntity::Entry::Type::FunctionBasename: { - std::optional<llvm::StringRef> name = GetDemangledBasename(sc); - if (!name) + auto name_or_err = GetDemangledBasename(sc); + if (!name_or_err) { + llvm::consumeError(name_or_err.takeError()); return false; + } - s << *name; + s << *name_or_err; return true; } case FormatEntity::Entry::Type::FunctionTemplateArguments: { - std::optional<llvm::StringRef> template_args = - GetDemangledTemplateArguments(sc); - if (!template_args) + auto template_args_or_err = GetDemangledTemplateArguments(sc); + if (!template_args_or_err) { + llvm::consumeError(template_args_or_err.takeError()); return false; + } - s << *template_args; + s << *template_args_or_err; return true; } @@ -2008,38 +1954,46 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( return true; } case FormatEntity::Entry::Type::FunctionReturnRight: { - std::optional<llvm::StringRef> return_rhs = GetDemangledReturnTypeRHS(sc); - if (!return_rhs) + auto return_rhs_or_err = GetDemangledReturnTypeRHS(sc); + if (!return_rhs_or_err) { + llvm::consumeError(return_rhs_or_err.takeError()); return false; + } - s << *return_rhs; + s << *return_rhs_or_err; return true; } case FormatEntity::Entry::Type::FunctionReturnLeft: { - std::optional<llvm::StringRef> return_lhs = GetDemangledReturnTypeLHS(sc); - if (!return_lhs) + auto return_lhs_or_err = GetDemangledReturnTypeLHS(sc); + if (!return_lhs_or_err) { + llvm::consumeError(return_lhs_or_err.takeError()); return false; + } - s << *return_lhs; + s << *return_lhs_or_err; return true; } case FormatEntity::Entry::Type::FunctionQualifiers: { - std::optional<llvm::StringRef> quals = GetDemangledFunctionQualifiers(sc); - if (!quals) + auto quals_or_err = GetDemangledFunctionQualifiers(sc); + if (!quals_or_err) { + llvm::consumeError(quals_or_err.takeError()); return false; + } - s << *quals; + s << *quals_or_err; return true; } case FormatEntity::Entry::Type::FunctionSuffix: { - std::optional<llvm::StringRef> suffix = GetDemangledFunctionSuffix(sc); - if (!suffix) + auto suffix_or_err = GetDemangledFunctionSuffix(sc); + if (!suffix_or_err) { + llvm::consumeError(suffix_or_err.takeError()); return false; + } - s << *suffix; + s << *suffix_or_err; return true; } >From 9000c4d889aa815ea06042f3aab7118c624c9d16 Mon Sep 17 00:00:00 2001 From: Charles Zablit <c_zab...@apple.com> Date: Wed, 18 Jun 2025 16:55:49 +0100 Subject: [PATCH 2/8] fixup! [lldb] upgrade HandleFrameFormatVariable callees to llvm::Expected --- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 1810c07652a2b..5859f07659297 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -360,7 +360,7 @@ static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) { auto info_or_err = GetAndValidateInfo(sc); if (!info_or_err) { - info_or_err.takeError(); + llvm::consumeError(info_or_err.takeError()); return false; } auto [demangled_name, info] = *info_or_err; >From b0e4f74f4adb3e578a968d3ae9ee0809b80c6d46 Mon Sep 17 00:00:00 2001 From: Charles Zablit <c_zab...@apple.com> Date: Wed, 18 Jun 2025 18:16:51 +0100 Subject: [PATCH 3/8] log the error instead of just consuming it --- .../Language/CPlusPlus/CPlusPlusLanguage.cpp | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 5859f07659297..20ecac44eafd2 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -360,7 +360,8 @@ static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) { auto info_or_err = GetAndValidateInfo(sc); if (!info_or_err) { - llvm::consumeError(info_or_err.takeError()); + LLDB_LOG_ERROR(GetLog(LLDBLog::Language), info_or_err.takeError(), + "Failed to retrieve demangled info: {0}"); return false; } auto [demangled_name, info] = *info_or_err; @@ -1897,7 +1898,8 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionScope: { auto scope_or_err = GetDemangledScope(sc); if (!scope_or_err) { - llvm::consumeError(scope_or_err.takeError()); + LLDB_LOG_ERROR(GetLog(LLDBLog::Language), scope_or_err.takeError(), + "Failed to retrieve scope: {0}"); return false; } @@ -1909,7 +1911,8 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionBasename: { auto name_or_err = GetDemangledBasename(sc); if (!name_or_err) { - llvm::consumeError(name_or_err.takeError()); + LLDB_LOG_ERROR(GetLog(LLDBLog::Language), name_or_err.takeError(), + "Failed to retrieve basename: {0}"); return false; } @@ -1921,7 +1924,9 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionTemplateArguments: { auto template_args_or_err = GetDemangledTemplateArguments(sc); if (!template_args_or_err) { - llvm::consumeError(template_args_or_err.takeError()); + LLDB_LOG_ERROR(GetLog(LLDBLog::Language), + template_args_or_err.takeError(), + "Failed to retrieve template arguments: {0}"); return false; } @@ -1956,7 +1961,8 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionReturnRight: { auto return_rhs_or_err = GetDemangledReturnTypeRHS(sc); if (!return_rhs_or_err) { - llvm::consumeError(return_rhs_or_err.takeError()); + LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_rhs_or_err.takeError(), + "Failed to retrieve RHS return type: {0}"); return false; } @@ -1967,7 +1973,8 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionReturnLeft: { auto return_lhs_or_err = GetDemangledReturnTypeLHS(sc); if (!return_lhs_or_err) { - llvm::consumeError(return_lhs_or_err.takeError()); + LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_lhs_or_err.takeError(), + "Failed to retrieve LHS return type: {0}"); return false; } @@ -1978,7 +1985,8 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionQualifiers: { auto quals_or_err = GetDemangledFunctionQualifiers(sc); if (!quals_or_err) { - llvm::consumeError(quals_or_err.takeError()); + LLDB_LOG_ERROR(GetLog(LLDBLog::Language), quals_or_err.takeError(), + "Failed to retrieve function qualifiers: {0}"); return false; } @@ -1989,7 +1997,8 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionSuffix: { auto suffix_or_err = GetDemangledFunctionSuffix(sc); if (!suffix_or_err) { - llvm::consumeError(suffix_or_err.takeError()); + LLDB_LOG_ERROR(GetLog(LLDBLog::Language), suffix_or_err.takeError(), + "Failed to retrieve suffix: {0}"); return false; } >From 68d8d5a699a53097351e45a46854563bf85544c2 Mon Sep 17 00:00:00 2001 From: Charles Zablit <c_zab...@apple.com> Date: Thu, 19 Jun 2025 12:27:44 +0100 Subject: [PATCH 4/8] improve error messages --- .../Language/CPlusPlus/CPlusPlusLanguage.cpp | 66 ++++++++++++------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 20ecac44eafd2..95cd2e8ea87c5 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -244,15 +244,20 @@ GetAndValidateInfo(const SymbolContext &sc) { auto demangled_name = mangled.GetDemangledName().GetStringRef(); if (demangled_name.empty()) - return llvm::createStringError("Function does not have a demangled name."); + return llvm::createStringError( + "Function '%s' does not have a demangled name.", + mangled.GetMangledName().AsCString("")); const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); if (!info) - return llvm::createStringError("Function does not have demangled info."); + return llvm::createStringError( + "Function '%s' does not have demangled info.", demangled_name.data()); // Function without a basename is nonsense. if (!info->hasBasename()) - return llvm::createStringError("Info do not have basename range."); + return llvm::createStringError( + "DemangledInfo for '%s does not have basename range.", + demangled_name.data()); return std::make_pair(demangled_name, *info); } @@ -278,7 +283,8 @@ GetDemangledTemplateArguments(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; if (info.ArgumentsRange.first < info.BasenameRange.second) - return llvm::createStringError("Arguments in info are invalid."); + return llvm::createStringError("Arguments range for '%s' is invalid.", + demangled_name.data()); return demangled_name.slice(info.BasenameRange.second, info.ArgumentsRange.first); @@ -293,7 +299,9 @@ GetDemangledReturnTypeLHS(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; if (info.ScopeRange.first >= demangled_name.size()) - return llvm::createStringError("Scope range is invalid."); + return llvm::createStringError( + "Scope range for '%s' LHS return type is invalid.", + demangled_name.data()); return demangled_name.substr(0, info.ScopeRange.first); } @@ -307,7 +315,8 @@ GetDemangledFunctionQualifiers(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; if (info.QualifiersRange.second < info.QualifiersRange.first) - return llvm::createStringError("Qualifiers range is invalid."); + return llvm::createStringError("Qualifiers range for '%s' is invalid.", + demangled_name.data()); return demangled_name.slice(info.QualifiersRange.first, info.QualifiersRange.second); @@ -321,8 +330,12 @@ GetDemangledReturnTypeRHS(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - if (info.QualifiersRange.first < info.ArgumentsRange.second) - return llvm::createStringError("Qualifiers range is invalid."); + if (info.QualifiersRange.first < + info.ArgumentsRange.second) // TODO: Replace with .hasArgumentsRange() + // once #144549 lands. + return llvm::createStringError( + "Qualifiers range for '%s' RHS return type is invalid.", + demangled_name.data()); return demangled_name.slice(info.ArgumentsRange.second, info.QualifiersRange.first); @@ -337,7 +350,8 @@ GetDemangledScope(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; if (info.ScopeRange.second < info.ScopeRange.first) - return llvm::createStringError("Info do not have basename range."); + return llvm::createStringError("Scope range for '%s' is invalid.", + demangled_name.data()); return demangled_name.slice(info.ScopeRange.first, info.ScopeRange.second); } @@ -360,8 +374,9 @@ static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) { auto info_or_err = GetAndValidateInfo(sc); if (!info_or_err) { - LLDB_LOG_ERROR(GetLog(LLDBLog::Language), info_or_err.takeError(), - "Failed to retrieve demangled info: {0}"); + LLDB_LOG_ERROR( + GetLog(LLDBLog::Language), info_or_err.takeError(), + "Failed to handle ${function.basename} frame-format variable: {0}"); return false; } auto [demangled_name, info] = *info_or_err; @@ -1898,8 +1913,9 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionScope: { auto scope_or_err = GetDemangledScope(sc); if (!scope_or_err) { - LLDB_LOG_ERROR(GetLog(LLDBLog::Language), scope_or_err.takeError(), - "Failed to retrieve scope: {0}"); + LLDB_LOG_ERROR( + GetLog(LLDBLog::Language), scope_or_err.takeError(), + "Failed to handle ${function.scope} frame-format variable: {0}"); return false; } @@ -1911,8 +1927,9 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionBasename: { auto name_or_err = GetDemangledBasename(sc); if (!name_or_err) { - LLDB_LOG_ERROR(GetLog(LLDBLog::Language), name_or_err.takeError(), - "Failed to retrieve basename: {0}"); + LLDB_LOG_ERROR( + GetLog(LLDBLog::Language), name_or_err.takeError(), + "Failed to handle ${function.basename} frame-format variable: {0}"); return false; } @@ -1926,7 +1943,8 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( if (!template_args_or_err) { LLDB_LOG_ERROR(GetLog(LLDBLog::Language), template_args_or_err.takeError(), - "Failed to retrieve template arguments: {0}"); + "Failed to handle ${function.template-arguments} " + "frame-format variable: {0}"); return false; } @@ -1962,7 +1980,8 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( 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 retrieve RHS return type: {0}"); + "Failed to handle ${function.return-right} frame-format " + "variable: {0}"); return false; } @@ -1974,7 +1993,8 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( 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 retrieve LHS return type: {0}"); + "Failed to handle ${function.return-left} frame-format " + "variable: {0}"); return false; } @@ -1985,8 +2005,9 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionQualifiers: { auto quals_or_err = GetDemangledFunctionQualifiers(sc); if (!quals_or_err) { - LLDB_LOG_ERROR(GetLog(LLDBLog::Language), quals_or_err.takeError(), - "Failed to retrieve function qualifiers: {0}"); + LLDB_LOG_ERROR( + GetLog(LLDBLog::Language), quals_or_err.takeError(), + "Failed to handle ${function.qualifiers} frame-format variable: {0}"); return false; } @@ -1997,8 +2018,9 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( case FormatEntity::Entry::Type::FunctionSuffix: { auto suffix_or_err = GetDemangledFunctionSuffix(sc); if (!suffix_or_err) { - LLDB_LOG_ERROR(GetLog(LLDBLog::Language), suffix_or_err.takeError(), - "Failed to retrieve suffix: {0}"); + LLDB_LOG_ERROR( + GetLog(LLDBLog::Language), suffix_or_err.takeError(), + "Failed to handle ${function.suffix} frame-format variable: {0}"); return false; } >From 6d8e8c077729a7c540ed6b2090f8b08c7a0e56d9 Mon Sep 17 00:00:00 2001 From: Charles Zablit <c_zab...@apple.com> Date: Thu, 19 Jun 2025 14:54:04 +0100 Subject: [PATCH 5/8] switch to `has` methods --- .../source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 95cd2e8ea87c5..0a816ef8eeaa7 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -314,7 +314,7 @@ GetDemangledFunctionQualifiers(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - if (info.QualifiersRange.second < info.QualifiersRange.first) + if (!info.hasQualifiers()) return llvm::createStringError("Qualifiers range for '%s' is invalid.", demangled_name.data()); @@ -349,7 +349,7 @@ GetDemangledScope(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - if (info.ScopeRange.second < info.ScopeRange.first) + if (!info.hasScope()) return llvm::createStringError("Scope range for '%s' is invalid.", demangled_name.data()); @@ -381,7 +381,7 @@ static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) { } auto [demangled_name, info] = *info_or_err; - if (info.ArgumentsRange.second < info.ArgumentsRange.first) + if (!info.hasArguments()) return false; s << demangled_name.slice(info.ArgumentsRange.first, >From 34c1b1d8ab086c9af604308e8f0f6037b33dd9e7 Mon Sep 17 00:00:00 2001 From: Charles Zablit <c_zab...@apple.com> Date: Thu, 19 Jun 2025 17:06:43 +0100 Subject: [PATCH 6/8] remove comment --- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 0a816ef8eeaa7..71bdc4c2b33a9 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -330,9 +330,7 @@ GetDemangledReturnTypeRHS(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - if (info.QualifiersRange.first < - info.ArgumentsRange.second) // TODO: Replace with .hasArgumentsRange() - // once #144549 lands. + if (info.QualifiersRange.first < info.ArgumentsRange.second) return llvm::createStringError( "Qualifiers range for '%s' RHS return type is invalid.", demangled_name.data()); >From abfa26686e21143821ea7c820c143c3233987351 Mon Sep 17 00:00:00 2001 From: Charles Zablit <c_zab...@apple.com> Date: Thu, 19 Jun 2025 17:08:38 +0100 Subject: [PATCH 7/8] add hasSuffix check --- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 71bdc4c2b33a9..4ecffc22d4eea 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -364,6 +364,10 @@ GetDemangledFunctionSuffix(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; + if (!info.hasSuffix()) + return llvm::createStringError("Suffix range for '%s' is invalid.", + demangled_name.data()); + return demangled_name.slice(info.SuffixRange.first, info.SuffixRange.second); } >From 1bf92c9ce6334dff9caa72354c85554c7f7b21de Mon Sep 17 00:00:00 2001 From: Charles Zablit <c_zab...@apple.com> Date: Fri, 20 Jun 2025 10:15:54 +0100 Subject: [PATCH 8/8] escape format variables in log message --- .../Language/CPlusPlus/CPlusPlusLanguage.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 4ecffc22d4eea..1e3f4e52bd39c 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -378,7 +378,7 @@ static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) { if (!info_or_err) { LLDB_LOG_ERROR( GetLog(LLDBLog::Language), info_or_err.takeError(), - "Failed to handle ${function.basename} frame-format variable: {0}"); + "Failed to handle ${{function.basename}} frame-format variable: {0}"); return false; } auto [demangled_name, info] = *info_or_err; @@ -1917,7 +1917,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( if (!scope_or_err) { LLDB_LOG_ERROR( GetLog(LLDBLog::Language), scope_or_err.takeError(), - "Failed to handle ${function.scope} frame-format variable: {0}"); + "Failed to handle ${{function.scope}} frame-format variable: {0}"); return false; } @@ -1931,7 +1931,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( if (!name_or_err) { LLDB_LOG_ERROR( GetLog(LLDBLog::Language), name_or_err.takeError(), - "Failed to handle ${function.basename} frame-format variable: {0}"); + "Failed to handle ${{function.basename}} frame-format variable: {0}"); return false; } @@ -1945,7 +1945,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( if (!template_args_or_err) { LLDB_LOG_ERROR(GetLog(LLDBLog::Language), template_args_or_err.takeError(), - "Failed to handle ${function.template-arguments} " + "Failed to handle ${{function.template-arguments}} " "frame-format variable: {0}"); return false; } @@ -1982,7 +1982,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( 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 " + "Failed to handle ${{function.return-right}} frame-format " "variable: {0}"); return false; } @@ -1995,7 +1995,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( 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 " + "Failed to handle ${{function.return-left}} frame-format " "variable: {0}"); return false; } @@ -2009,7 +2009,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( if (!quals_or_err) { LLDB_LOG_ERROR( GetLog(LLDBLog::Language), quals_or_err.takeError(), - "Failed to handle ${function.qualifiers} frame-format variable: {0}"); + "Failed to handle ${{function.qualifiers}} frame-format variable: {0}"); return false; } @@ -2022,7 +2022,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( if (!suffix_or_err) { LLDB_LOG_ERROR( GetLog(LLDBLog::Language), suffix_or_err.takeError(), - "Failed to handle ${function.suffix} frame-format variable: {0}"); + "Failed to handle ${{function.suffix}} frame-format variable: {0}"); return false; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits