@@ -168,21 +168,49 @@ static lldb::Format GetItemFormatForFormat(lldb::Format format,
168
168
}
169
169
}
170
170
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;
186
214
}
187
215
188
216
namespace lldb_private {
@@ -220,11 +248,14 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
220
248
m_parent_format = m_backend.GetFormat ();
221
249
CompilerType parent_type (m_backend.GetCompilerType ());
222
250
CompilerType element_type;
223
- parent_type.IsVectorType (&element_type);
251
+ uint64_t num_elements;
252
+ parent_type.IsVectorType (&element_type, &num_elements);
224
253
m_child_type = ::GetCompilerTypeForFormat (
225
254
m_parent_format, element_type,
226
255
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 );
228
259
m_item_format = GetItemFormatForFormat (m_parent_format, m_child_type);
229
260
return false ;
230
261
}
0 commit comments