Skip to content

Commit 3de0020

Browse files
committed
[lldb] [NFC] Refactor the extraction of children from Swift pointer into
standalone function (cherry picked from commit 8daa0d5)
1 parent 1afd93b commit 3de0020

File tree

2 files changed

+78
-56
lines changed

2 files changed

+78
-56
lines changed

lldb/source/Plugins/Language/Swift/SwiftUnsafeTypes.cpp

Lines changed: 73 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -423,9 +423,80 @@ bool lldb_private::formatters::swift::UnsafeTypeSummaryProvider(
423423
return true;
424424
}
425425

426+
static std::vector<ValueObjectSP>
427+
ExtractChildrenFromSwiftPointerValueObject(ValueObjectSP valobj_sp,
428+
SwiftUnsafeType &unsafe_ptr) {
429+
if (!valobj_sp)
430+
return {};
431+
432+
lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
433+
434+
if (!process_sp)
435+
return {};
436+
437+
const addr_t start_addr = unsafe_ptr.GetStartAddress();
438+
const size_t num_children = unsafe_ptr.GetCount();
439+
const CompilerType element_type = unsafe_ptr.GetElementType();
440+
441+
auto stride = element_type.GetByteStride(process_sp.get());
442+
if (!stride)
443+
return {};
444+
445+
auto element_stride = *stride;
446+
size_t buffer_size = num_children * element_stride;
447+
if (buffer_size > 512 * 1024 * 1024) {
448+
LLDB_LOG(GetLog(LLDBLog::DataFormatters),
449+
"Suspiciously large object: num_children={0}, stride={1}",
450+
num_children, element_stride);
451+
return {};
452+
}
453+
454+
std::unique_ptr<lldb_private::WritableDataBuffer> buffer_up(
455+
new DataBufferHeap(buffer_size, 0));
456+
Status error;
457+
size_t read_bytes = process_sp->ReadMemory(start_addr, buffer_up->GetBytes(),
458+
buffer_size, error);
459+
460+
if (!read_bytes || error.Fail())
461+
return {};
462+
463+
auto ptr_size = process_sp->GetAddressByteSize();
464+
auto order = process_sp->GetByteOrder();
465+
DataExtractor buffer_data(buffer_up->GetBytes(), buffer_up->GetByteSize(),
466+
order, ptr_size);
467+
468+
std::vector<ValueObjectSP> children;
469+
auto exe_ctx_ref = valobj_sp->GetExecutionContextRef();
470+
// UnsafePointer/UnsafeMutablePointer have a `pointee` property.
471+
if (unsafe_ptr.HasPointee()) {
472+
DataExtractor data(buffer_data, 0, element_stride);
473+
children.push_back(ValueObject::CreateValueObjectFromData(
474+
"pointee", data, exe_ctx_ref, element_type));
475+
return children;
476+
}
477+
478+
for (size_t i = 0; i < num_children; i++) {
479+
StreamString idx_name;
480+
idx_name.Printf("[%zu]", i);
481+
DataExtractor data(buffer_data, i * element_stride, element_stride);
482+
children.push_back(ValueObject::CreateValueObjectFromData(
483+
idx_name.GetString(), data, exe_ctx_ref, element_type));
484+
}
485+
486+
return children;
487+
}
488+
426489
namespace lldb_private {
427490
namespace formatters {
428491
namespace swift {
492+
std::vector<ValueObjectSP>
493+
ExtractChildrenFromSwiftPointerValueObject(ValueObjectSP valobj_sp) {
494+
auto unsafe_ptr = ::SwiftUnsafeType::Create(*valobj_sp.get());
495+
unsafe_ptr->Update();
496+
return ::ExtractChildrenFromSwiftPointerValueObject(valobj_sp,
497+
*unsafe_ptr.get());
498+
}
499+
429500
class UnsafeTypeSyntheticFrontEnd : public SwiftBasicTypeSyntheticFrontEnd {
430501
public:
431502
UnsafeTypeSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
@@ -437,12 +508,7 @@ class UnsafeTypeSyntheticFrontEnd : public SwiftBasicTypeSyntheticFrontEnd {
437508
size_t GetIndexOfChildWithName(ConstString name) override;
438509

439510
private:
440-
ExecutionContextRef m_exe_ctx_ref;
441-
uint8_t m_ptr_size;
442-
lldb::ByteOrder m_order;
443-
444511
std::unique_ptr<SwiftUnsafeType> m_unsafe_ptr;
445-
size_t m_element_stride;
446512
WritableDataBufferSP m_buffer_sp;
447513
std::vector<ValueObjectSP> m_children;
448514
};
@@ -458,8 +524,6 @@ lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::
458524
if (!process_sp)
459525
return;
460526

461-
m_ptr_size = process_sp->GetAddressByteSize();
462-
m_order = process_sp->GetByteOrder();
463527

464528
m_unsafe_ptr = ::SwiftUnsafeType::Create(*valobj_sp.get());
465529

@@ -491,62 +555,15 @@ bool lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::Update() {
491555
ValueObjectSP valobj_sp = m_backend.GetSP();
492556
if (!valobj_sp)
493557
return false;
494-
m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
495558

496-
lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
497-
if (!process_sp)
498-
return false;
499559
if (!m_unsafe_ptr)
500560
return false;
501561
if (!m_unsafe_ptr->Update())
502562
return false;
503563

504-
const addr_t start_addr = m_unsafe_ptr->GetStartAddress();
505564
const size_t num_children = CalculateNumChildren();
506-
const CompilerType element_type = m_unsafe_ptr->GetElementType();
507-
508-
auto stride = element_type.GetByteStride(process_sp.get());
509-
if (!stride)
510-
return false;
511-
512-
m_element_stride = *stride;
513-
if (m_children.empty()) {
514-
size_t buffer_size = num_children * m_element_stride;
515-
if (buffer_size > 512*1024*1024) {
516-
LLDB_LOG(GetLog(LLDBLog::DataFormatters),
517-
"Suspiciously large object: num_children={0}, stride={1}",
518-
num_children, m_element_stride);
519-
return false;
520-
}
521-
m_buffer_sp.reset(new DataBufferHeap(buffer_size, 0));
522-
523-
Status error;
524-
size_t read_bytes = process_sp->ReadMemory(
525-
start_addr, m_buffer_sp->GetBytes(), buffer_size, error);
526-
527-
if (!read_bytes || error.Fail())
528-
return false;
529-
530-
DataExtractor buffer_data(m_buffer_sp->GetBytes(),
531-
m_buffer_sp->GetByteSize(), m_order, m_ptr_size);
532-
533-
// UnsafePointer/UnsafeMutablePointer have a `pointee` property.
534-
if (m_unsafe_ptr->HasPointee()) {
535-
DataExtractor data(buffer_data, 0, m_element_stride);
536-
m_children.push_back(CreateValueObjectFromData(
537-
"pointee", data, m_exe_ctx_ref, element_type));
538-
return true;
539-
}
540-
541-
for (size_t i = 0; i < num_children; i++) {
542-
StreamString idx_name;
543-
idx_name.Printf("[%zu]", i);
544-
DataExtractor data(buffer_data, i * m_element_stride, m_element_stride);
545-
m_children.push_back(CreateValueObjectFromData(
546-
idx_name.GetString(), data, m_exe_ctx_ref, element_type));
547-
}
548-
}
549-
565+
m_children = ::ExtractChildrenFromSwiftPointerValueObject(valobj_sp,
566+
*m_unsafe_ptr.get());
550567
return m_children.size() == num_children;
551568
}
552569

lldb/source/Plugins/Language/Swift/SwiftUnsafeTypes.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ bool UnsafeTypeSummaryProvider(ValueObject &valobj, Stream &stream,
2626
SyntheticChildrenFrontEnd *
2727
UnsafeTypeSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP);
2828

29+
/// Extracts a value object with a given Swift pointer type, returning a vector
30+
/// of it's children. The number and types of children will depend on which type
31+
/// of Swift pointer type the value object has.
32+
std::vector<lldb::ValueObjectSP>
33+
ExtractChildrenFromSwiftPointerValueObject(lldb::ValueObjectSP valobj_sp);
2934
}; // namespace swift
3035
}; // namespace formatters
3136
}; // namespace lldb_private

0 commit comments

Comments
 (0)