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+medievalgh...@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+medievalgh...@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()); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits