[Lldb-commits] [lldb] [lldb] upgrade HandleFrameFormatVariable callees to llvm::Expected (PR #144731)
Charles Zablit via lldb-commits
lldb-commits at lists.llvm.org
Thu Jun 19 09:08:52 PDT 2025
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_zablit at apple.com>
Date: Wed, 18 Jun 2025 16:41:40 +0100
Subject: [PATCH 1/7] [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_zablit at apple.com>
Date: Wed, 18 Jun 2025 16:55:49 +0100
Subject: [PATCH 2/7] 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_zablit at apple.com>
Date: Wed, 18 Jun 2025 18:16:51 +0100
Subject: [PATCH 3/7] 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_zablit at apple.com>
Date: Thu, 19 Jun 2025 12:27:44 +0100
Subject: [PATCH 4/7] 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_zablit at apple.com>
Date: Thu, 19 Jun 2025 14:54:04 +0100
Subject: [PATCH 5/7] 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_zablit at apple.com>
Date: Thu, 19 Jun 2025 17:06:43 +0100
Subject: [PATCH 6/7] 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_zablit at apple.com>
Date: Thu, 19 Jun 2025 17:08:38 +0100
Subject: [PATCH 7/7] 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);
}
More information about the lldb-commits
mailing list