Skip to content
Draft
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lldb/include/lldb/ValueObject/ValueObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
16 changes: 6 additions & 10 deletions lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,9 @@ static bool CharStringSummaryProvider(ValueObject &valobj, Stream &stream) {

template <StringElementType ElemType>
static bool CharSummaryProvider(ValueObject &valobj, Stream &stream) {
DataExtractor data;
Status error;
valobj.GetData(data, error);
auto data_or_err = valobj.GetData();

if (error.Fail())
if (!data_or_err)
return false;

std::string value;
Expand All @@ -84,7 +82,7 @@ static bool CharSummaryProvider(ValueObject &valobj, Stream &stream) {
if (!value.empty())
stream.Printf("%s ", value.c_str());

options.SetData(std::move(data));
options.SetData(std::move(*data_or_err));
options.SetStream(&stream);
options.SetPrefixToken(ElemTraits.first);
options.SetQuote('\'');
Expand Down Expand Up @@ -169,11 +167,9 @@ bool lldb_private::formatters::Char32SummaryProvider(

bool lldb_private::formatters::WCharSummaryProvider(
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &) {
DataExtractor data;
Status error;
valobj.GetData(data, error);
auto data_or_err = valobj.GetData();

if (error.Fail())
if (!data_or_err)
return false;

// Get a wchar_t basic type from the current type system
Expand All @@ -191,7 +187,7 @@ bool lldb_private::formatters::WCharSummaryProvider(
const uint32_t wchar_size = *size;

StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj);
options.SetData(std::move(data));
options.SetData(std::move(*data_or_err));
options.SetStream(&stream);
options.SetPrefixToken("L");
options.SetQuote('\'');
Expand Down
20 changes: 8 additions & 12 deletions lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -273,15 +273,13 @@ ValueObjectSP ForwardListFrontEnd::GetChildAtIndex(uint32_t idx) {

// we need to copy current_sp into a new object otherwise we will end up with
// all items named __value_
DataExtractor data;
Status error;
current_sp->GetData(data, error);
if (error.Fail())
auto data_or_err = current_sp->GetData();
if (!data_or_err)
return nullptr;

return CreateValueObjectFromData(llvm::formatv("[{0}]", idx).str(), data,
m_backend.GetExecutionContextRef(),
m_element_type);
return CreateValueObjectFromData(
llvm::formatv("[{0}]", idx).str(), *data_or_err,
m_backend.GetExecutionContextRef(), m_element_type);
}

lldb::ChildCacheState ForwardListFrontEnd::Update() {
Expand Down Expand Up @@ -394,15 +392,13 @@ lldb::ValueObjectSP ListFrontEnd::GetChildAtIndex(uint32_t idx) {

// we need to copy current_sp into a new object otherwise we will end up with
// all items named __value_
DataExtractor data;
Status error;
current_sp->GetData(data, error);
if (error.Fail())
auto data_or_err = current_sp->GetData();
if (!data_or_err)
return lldb::ValueObjectSP();

StreamString name;
name.Printf("[%" PRIu64 "]", (uint64_t)idx);
return CreateValueObjectFromData(name.GetString(), data,
return CreateValueObjectFromData(name.GetString(), *data_or_err,
m_backend.GetExecutionContextRef(),
m_element_type);
}
Expand Down
10 changes: 4 additions & 6 deletions lldb/source/Plugins/Language/ObjC/Cocoa.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1205,13 +1205,11 @@ bool lldb_private::formatters::ObjCSELSummaryProvider(
valobj_sp = ValueObject::CreateValueObjectFromAddress("text", data_address,
exe_ctx, charstar);
} else {
DataExtractor data;
Status error;
valobj.GetData(data, error);
if (error.Fail())
auto data_or_err = valobj.GetData();
if (!data_or_err)
return false;
valobj_sp =
ValueObject::CreateValueObjectFromData("text", data, exe_ctx, charstar);
valobj_sp = ValueObject::CreateValueObjectFromData("text", *data_or_err,
exe_ctx, charstar);
}

if (!valobj_sp)
Expand Down
8 changes: 3 additions & 5 deletions lldb/source/Plugins/Language/ObjC/NSString.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -291,13 +291,11 @@ bool lldb_private::formatters::NSAttributedStringSummaryProvider(
"string_ptr", pointer_value, exe_ctx, type));
if (!child_ptr_sp)
return false;
DataExtractor data;
Status error;
child_ptr_sp->GetData(data, error);
if (error.Fail())
auto data_or_err = child_ptr_sp->GetData();
if (!data_or_err)
return false;
ValueObjectSP child_sp(child_ptr_sp->CreateValueObjectFromData(
"string_data", data, exe_ctx, type));
"string_data", *data_or_err, exe_ctx, type));
child_sp->GetValueAsUnsigned(0);
if (child_sp)
return NSStringSummaryProvider(*child_sp, stream, options);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -549,15 +549,15 @@ ThreadSP AppleObjCRuntime::GetBacktraceThreadFromException(
idx++) {
ValueObjectSP dict_entry = reserved_dict->GetChildAtIndex(idx);

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();
data_or_err->SetAddressByteSize(
dict_entry->GetProcessSP()->GetAddressByteSize());

lldb::offset_t data_offset = 0;
auto dict_entry_key = data.GetAddress(&data_offset);
auto dict_entry_value = data.GetAddress(&data_offset);
auto dict_entry_key = data_or_err->GetAddress(&data_offset);
auto dict_entry_value = data_or_err->GetAddress(&data_offset);

auto key_nsstring = objc_object_from_address(dict_entry_key, "key");
StreamString key_summary;
Expand Down
12 changes: 7 additions & 5 deletions lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
26 changes: 18 additions & 8 deletions lldb/source/ValueObject/ValueObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) */
Expand Down Expand Up @@ -764,22 +771,25 @@ 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) {
Expand Down
Loading