[Lldb-commits] [lldb] draft: [lldb] Upgrade ValueObject::GetData to return llvm::Expected (PR #130516)
Julius Alexandre via lldb-commits
lldb-commits at lists.llvm.org
Sun Mar 9 13:57:41 PDT 2025
https://github.com/wizardengineer created https://github.com/llvm/llvm-project/pull/130516
Original mentioned here: [Discourse](https://discourse.llvm.org/t/rich-disassembler-for-lldb/76952/20?u=wizardengineer)
This patch consist of changing GetData method in the ValueObject to return a llvm::Expected in order to have more meaningful error messages.
cc: @adrian-prantl
>From 161bdb32b284d2370b138e72a8a1ad560b258ba9 Mon Sep 17 00:00:00 2001
From: medievalghoul <61852278+medievalghoul at users.noreply.github.com>
Date: Sun, 9 Mar 2025 16:20:47 -0400
Subject: [PATCH 1/2] Change ValueObject::GetData to return llvm::Expected
---
lldb/include/lldb/ValueObject/ValueObject.h | 2 +-
.../AppleObjCRuntime/AppleObjCRuntime.cpp | 5 ++--
.../TypeSystem/Clang/TypeSystemClang.cpp | 12 ++++----
lldb/source/ValueObject/ValueObject.cpp | 28 +++++++++++++------
4 files changed, 30 insertions(+), 17 deletions(-)
diff --git a/lldb/include/lldb/ValueObject/ValueObject.h b/lldb/include/lldb/ValueObject/ValueObject.h
index 06d2589002ed0..2ee7f99718416 100644
--- a/lldb/include/lldb/ValueObject/ValueObject.h
+++ b/lldb/include/lldb/ValueObject/ValueObject.h
@@ -757,7 +757,7 @@ class ValueObject {
virtual size_t GetPointeeData(DataExtractor &data, uint32_t item_idx = 0,
uint32_t item_count = 1);
- virtual uint64_t GetData(DataExtractor &data, Status &error);
+ virtual llvm::Expected<DataExtractor> GetData();
virtual bool SetData(DataExtractor &data, Status &error);
diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
index ad60290382c02..69856d4592843 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
@@ -551,9 +551,8 @@ ThreadSP AppleObjCRuntime::GetBacktraceThreadFromException(
DataExtractor data;
data.SetAddressByteSize(dict_entry->GetProcessSP()->GetAddressByteSize());
- Status error;
- dict_entry->GetData(data, error);
- if (error.Fail()) return ThreadSP();
+ auto data_or_err = dict_entry->GetData();
+ if (!data_or_err) return ThreadSP();
lldb::offset_t data_offset = 0;
auto dict_entry_key = data.GetAddress(&data_offset);
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index 4ca4752310868..763a80faa914a 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -247,13 +247,15 @@ static lldb::addr_t GetVTableAddress(Process &process,
// We have an object already read from process memory,
// so just extract VTable pointer from it
- DataExtractor data;
- Status err;
- auto size = valobj.GetData(data, err);
- if (err.Fail() || vbtable_ptr_offset + data.GetAddressByteSize() > size)
+ auto data_or_err = valobj.GetData();
+ if (!data_or_err)
+ return LLDB_INVALID_ADDRESS;
+
+ auto size = data_or_err->GetByteSize();
+ if (vbtable_ptr_offset + data_or_err->GetAddressByteSize() > size)
return LLDB_INVALID_ADDRESS;
- return data.GetAddress(&vbtable_ptr_offset);
+ return data_or_err->GetAddress(&vbtable_ptr_offset);
}
static int64_t ReadVBaseOffsetFromVTable(Process &process,
diff --git a/lldb/source/ValueObject/ValueObject.cpp b/lldb/source/ValueObject/ValueObject.cpp
index eac24353de90b..05cbc5489d25e 100644
--- a/lldb/source/ValueObject/ValueObject.cpp
+++ b/lldb/source/ValueObject/ValueObject.cpp
@@ -691,13 +691,20 @@ size_t ValueObject::GetPointeeData(DataExtractor &data, uint32_t item_idx,
ValueObjectSP pointee_sp = Dereference(error);
if (error.Fail() || pointee_sp.get() == nullptr)
return 0;
- return pointee_sp->GetData(data, error);
+ auto data_or_err = pointee_sp->GetData();
+ if (!data_or_err)
+ return 0;
+ data = *data_or_err;
+ return data.GetByteSize();
} else {
ValueObjectSP child_sp = GetChildAtIndex(0);
if (child_sp.get() == nullptr)
return 0;
- Status error;
- return child_sp->GetData(data, error);
+ auto data_or_err = child_sp->GetData();
+ if (!data_or_err)
+ return 0;
+ data = *data_or_err;
+ return data.GetByteSize();
}
return true;
} else /* (items > 1) */
@@ -764,22 +771,27 @@ size_t ValueObject::GetPointeeData(DataExtractor &data, uint32_t item_idx,
return 0;
}
-uint64_t ValueObject::GetData(DataExtractor &data, Status &error) {
+llvm::Expected<DataExtractor> ValueObject::GetData() {
UpdateValueIfNeeded(false);
ExecutionContext exe_ctx(GetExecutionContextRef());
- error = m_value.GetValueAsData(&exe_ctx, data, GetModule().get());
+ DataExtractor data;
+ Status error = m_value.GetValueAsData(&exe_ctx, data, GetModule().get());
if (error.Fail()) {
if (m_data.GetByteSize()) {
data = m_data;
error.Clear();
- return data.GetByteSize();
+ data.SetAddressByteSize(m_data.GetAddressByteSize());
+ data.SetByteOrder(m_data.GetByteOrder());
+ return data;
} else {
- return 0;
+ return llvm::createStringError(
+ "GetData failed: %s",
+ error.AsCString());
}
}
data.SetAddressByteSize(m_data.GetAddressByteSize());
data.SetByteOrder(m_data.GetByteOrder());
- return data.GetByteSize();
+ return data;
}
bool ValueObject::SetData(DataExtractor &data, Status &error) {
>From 7d886e2bee159d6bbe00cec9fd4004f4d71993bf Mon Sep 17 00:00:00 2001
From: medievalghoul <61852278+medievalghoul at users.noreply.github.com>
Date: Sun, 9 Mar 2025 16:43:56 -0400
Subject: [PATCH 2/2] clang format
---
.../ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp | 3 ++-
lldb/source/ValueObject/ValueObject.cpp | 4 +---
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
index 69856d4592843..648e061f3e3c5 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
@@ -552,7 +552,8 @@ ThreadSP AppleObjCRuntime::GetBacktraceThreadFromException(
DataExtractor data;
data.SetAddressByteSize(dict_entry->GetProcessSP()->GetAddressByteSize());
auto data_or_err = dict_entry->GetData();
- if (!data_or_err) return ThreadSP();
+ if (!data_or_err)
+ return ThreadSP();
lldb::offset_t data_offset = 0;
auto dict_entry_key = data.GetAddress(&data_offset);
diff --git a/lldb/source/ValueObject/ValueObject.cpp b/lldb/source/ValueObject/ValueObject.cpp
index 05cbc5489d25e..4d13e460a2ca7 100644
--- a/lldb/source/ValueObject/ValueObject.cpp
+++ b/lldb/source/ValueObject/ValueObject.cpp
@@ -784,9 +784,7 @@ llvm::Expected<DataExtractor> ValueObject::GetData() {
data.SetByteOrder(m_data.GetByteOrder());
return data;
} else {
- return llvm::createStringError(
- "GetData failed: %s",
- error.AsCString());
+ return llvm::createStringError("GetData failed: %s", error.AsCString());
}
}
data.SetAddressByteSize(m_data.GetAddressByteSize());
More information about the lldb-commits
mailing list