@@ -168,21 +168,49 @@ static lldb::Format GetItemFormatForFormat(lldb::Format format,
168168 }
169169}
170170
171- static size_t CalculateNumChildren (
172- CompilerType container_type, CompilerType element_type,
173- lldb_private::ExecutionContextScope *exe_scope =
174- nullptr // does not matter here because all we trade in are basic types
175- ) {
176- llvm::Optional<uint64_t > container_size =
177- container_type.GetByteSize (exe_scope);
178- llvm::Optional<uint64_t > element_size = element_type.GetByteSize (exe_scope);
179-
180- if (container_size && element_size && *element_size) {
181- if (*container_size % *element_size)
182- return 0 ;
183- return *container_size / *element_size;
184- }
185- return 0 ;
171+ // / Calculates the number of elements stored in a container (with
172+ // / element type 'container_elem_type') as if it had elements of type
173+ // / 'element_type'.
174+ // /
175+ // / For example, a container of type
176+ // / `uint8_t __attribute__((vector_size(16)))` has 16 elements.
177+ // / But calling `CalculateNumChildren` with an 'element_type'
178+ // / of `float` (4-bytes) will return `4` because we are interpreting
179+ // / the byte-array as a `float32[]`.
180+ // /
181+ // / \param[in] container_elem_type The type of the elements stored
182+ // / in the container we are calculating the children of.
183+ // /
184+ // / \param[in] num_elements Number of 'container_elem_type's our
185+ // / container stores.
186+ // /
187+ // / \param[in] element_type The type of elements we interpret
188+ // / container_type to contain for the purposes of calculating
189+ // / the number of children.
190+ // /
191+ // / \returns The number of elements stored in a container of
192+ // / type 'element_type'. Returns a std::nullopt if the
193+ // / size of the container is not a multiple of 'element_type'
194+ // / or if an error occurs.
195+ static llvm::Optional<size_t >
196+ CalculateNumChildren (CompilerType container_elem_type, uint64_t num_elements,
197+ CompilerType element_type) {
198+ llvm::Optional<uint64_t > container_elem_size =
199+ container_elem_type.GetByteSize (/* exe_scope */ nullptr );
200+ if (!container_elem_size)
201+ return {};
202+
203+ auto container_size = *container_elem_size * num_elements;
204+
205+ llvm::Optional<uint64_t > element_size =
206+ element_type.GetByteSize (/* exe_scope */ nullptr );
207+ if (!element_size || !*element_size)
208+ return {};
209+
210+ if (container_size % *element_size)
211+ return {};
212+
213+ return container_size / *element_size;
186214}
187215
188216namespace lldb_private {
@@ -220,11 +248,14 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
220248 m_parent_format = m_backend.GetFormat ();
221249 CompilerType parent_type (m_backend.GetCompilerType ());
222250 CompilerType element_type;
223- parent_type.IsVectorType (&element_type);
251+ uint64_t num_elements;
252+ parent_type.IsVectorType (&element_type, &num_elements);
224253 m_child_type = ::GetCompilerTypeForFormat (
225254 m_parent_format, element_type,
226255 parent_type.GetTypeSystem ().GetSharedPointer ());
227- m_num_children = ::CalculateNumChildren (parent_type, m_child_type);
256+ m_num_children =
257+ ::CalculateNumChildren (element_type, num_elements, m_child_type)
258+ .value_or(0 );
228259 m_item_format = GetItemFormatForFormat (m_parent_format, m_child_type);
229260 return false ;
230261 }
0 commit comments