20 namespace formatters {
29 lldb::ValueObjectSP GetChildAtIndex(
size_t idx)
override;
31 bool Update()
override;
33 bool MightHaveChildren()
override;
35 size_t GetIndexOfChildWithName(
ConstString name)
override;
50 lldb::ValueObjectSP GetChildAtIndex(
size_t idx)
override;
52 bool Update()
override;
56 size_t GetIndexOfChildWithName(
ConstString name)
override;
86 if (!m_start || !m_finish)
88 uint64_t start_val = m_start->GetValueAsUnsigned(0);
89 uint64_t finish_val = m_finish->GetValueAsUnsigned(0);
91 if (start_val == 0 || finish_val == 0)
94 if (start_val >= finish_val)
97 size_t num_children = (finish_val - start_val);
98 if (num_children % m_element_size)
100 return num_children / m_element_size;
106 if (!m_start || !m_finish)
107 return lldb::ValueObjectSP();
109 uint64_t offset = idx * m_element_size;
110 offset = offset + m_start->GetValueAsUnsigned(0);
112 name.
Printf(
"[%" PRIu64
"]", (uint64_t)idx);
113 return CreateValueObjectFromAddress(name.
GetString(), offset,
114 m_backend.GetExecutionContextRef(),
119 m_start = m_finish =
nullptr;
120 ValueObjectSP data_type_finder_sp(
121 m_backend.GetChildMemberWithName(
ConstString(
"__end_cap_"),
true));
122 if (!data_type_finder_sp)
125 switch (data_type_finder_sp->GetCompilerType().GetNumDirectBaseClasses()) {
128 data_type_finder_sp = data_type_finder_sp->GetChildMemberWithName(
133 ValueObjectSP first_elem_parent_sp =
134 data_type_finder_sp->GetChildAtIndex(0,
true);
135 data_type_finder_sp = first_elem_parent_sp->GetChildMemberWithName(
143 if (!data_type_finder_sp)
145 m_element_type = data_type_finder_sp->GetCompilerType().GetPointeeType();
146 if (llvm::Optional<uint64_t> size = m_element_type.GetByteSize(
nullptr)) {
147 m_element_size = *size;
149 if (m_element_size > 0) {
152 m_backend.GetChildMemberWithName(
ConstString(
"__begin_"),
true).get();
154 m_backend.GetChildMemberWithName(
ConstString(
"__end_"),
true).get();
167 if (!m_start || !m_finish)
191 auto iter = m_children.find(idx), end = m_children.end();
196 if (m_base_data_address == 0 || m_count == 0)
200 size_t byte_idx = (idx >> 3);
201 size_t bit_index = (idx & 7);
202 lldb::addr_t byte_location = m_base_data_address + byte_idx;
203 ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
209 size_t bytes_read = process_sp->ReadMemory(byte_location, &
byte, 1, err);
210 if (err.
Fail() || bytes_read == 0)
212 mask = 1 << bit_index;
213 bool bit_set = ((
byte & mask) != 0);
214 llvm::Optional<uint64_t> size = m_bool_type.GetByteSize(
nullptr);
218 if (bit_set && buffer_sp && buffer_sp->GetBytes()) {
220 *(buffer_sp->GetBytes()) = 1;
223 name.
Printf(
"[%" PRIu64
"]", (uint64_t)idx);
224 ValueObjectSP retval_sp(CreateValueObjectFromData(
227 process_sp->GetAddressByteSize()),
228 m_exe_ctx_ref, m_bool_type));
230 m_children[idx] = retval_sp;
247 ValueObjectSP valobj_sp = m_backend.GetSP();
250 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
251 ValueObjectSP size_sp(
252 valobj_sp->GetChildMemberWithName(
ConstString(
"__size_"),
true));
255 m_count = size_sp->GetValueAsUnsigned(0);
258 ValueObjectSP begin_sp(
259 valobj_sp->GetChildMemberWithName(
ConstString(
"__begin_"),
true));
264 m_base_data_address = begin_sp->GetValueAsUnsigned(0);
265 if (!m_base_data_address) {
274 if (!m_count || !m_base_data_address)