Skip to content

Commit a4b2a1f

Browse files
authored
Merge pull request #7829 from augusto2112/fix-simd-lldb
[lldb] Make GetClangTypeNode aware of SIMD types
2 parents 69aa326 + 9c4b291 commit a4b2a1f

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,28 @@ GetPointerTo(swift::Demangle::Demangler &dem,
282282
return bgs;
283283
}
284284

285+
NodePointer TypeSystemSwiftTypeRef::CreateBoundGenericStruct(
286+
llvm::StringRef name, llvm::StringRef module_name,
287+
llvm::ArrayRef<NodePointer> type_list_elements,
288+
swift::Demangle::Demangler &dem) {
289+
NodePointer type_list = dem.createNode(Node::Kind::TypeList);
290+
for (auto *type_list_element : type_list_elements)
291+
type_list->addChild(type_list_element, dem);
292+
NodePointer identifier = dem.createNode(Node::Kind::Identifier, name);
293+
NodePointer module = dem.createNode(Node::Kind::Module, module_name);
294+
NodePointer structure = dem.createNode(Node::Kind::Structure);
295+
structure->addChild(module, dem);
296+
structure->addChild(identifier, dem);
297+
NodePointer type = dem.createNode(Node::Kind::Type);
298+
type->addChild(structure, dem);
299+
NodePointer signature = dem.createNode(Node::Kind::BoundGenericStructure);
300+
signature->addChild(type, dem);
301+
signature->addChild(type_list, dem);
302+
NodePointer outer_type = dem.createNode(Node::Kind::Type);
303+
outer_type->addChild(signature, dem);
304+
return outer_type;
305+
}
306+
285307
/// Return a demangle tree leaf node representing \p clang_type.
286308
swift::Demangle::NodePointer
287309
TypeSystemSwiftTypeRef::GetClangTypeNode(CompilerType clang_type,
@@ -377,6 +399,28 @@ TypeSystemSwiftTypeRef::GetClangTypeNode(CompilerType clang_type,
377399
kind = Node::Kind::TypeAlias;
378400
pointee = {};
379401
break;
402+
case eTypeClassVector: {
403+
CompilerType element_type;
404+
uint64_t size;
405+
bool is_vector = clang_type.IsVectorType(&element_type, &size);
406+
if (!is_vector)
407+
break;
408+
409+
auto qual_type = ClangUtil::GetQualType(clang_type);
410+
const auto *ptr = qual_type.getTypePtrOrNull();
411+
if (!ptr)
412+
break;
413+
414+
// Check if this is an extended vector type.
415+
if (!llvm::isa<clang::DependentSizedExtVectorType>(ptr) &&
416+
!llvm::isa<clang::ExtVectorType>(ptr))
417+
break;
418+
419+
NodePointer element_type_node = GetClangTypeNode(element_type, dem);
420+
llvm::SmallVector<NodePointer, 1> elements({element_type_node});
421+
return CreateBoundGenericStruct("SIMD" + std::to_string(size),
422+
swift::STDLIB_NAME, elements, dem);
423+
}
380424
default:
381425
break;
382426
}

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,13 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
320320
CompilerType CreateGenericTypeParamType(unsigned int depth,
321321
unsigned int index) override;
322322

323+
/// Builds a bound generic struct demangle tree with the name, module name,
324+
/// and the struct's elements.
325+
static swift::Demangle::NodePointer CreateBoundGenericStruct(
326+
llvm::StringRef name, llvm::StringRef module_name,
327+
llvm::ArrayRef<swift::Demangle::NodePointer> type_list_elements,
328+
swift::Demangle::Demangler &dem);
329+
323330
/// Get the Swift raw pointer type.
324331
CompilerType GetRawPointerType();
325332
/// Determine whether \p type is a protocol.

lldb/test/Shell/SwiftREPL/SIMD.test

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ simd_quatf(vector: colf4)
170170
simd_quatd(vector: cold4)
171171
// CHECK: $R{{.*}}: simd_quatd = (1.500000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00)
172172

173+
simd_quaternion(1.0, 0.5, 0.3, 0.1)
174+
// CHECK: $R{{.*}}: simd_quatd = (1.000000e+00, 5.000000e-01, 3.000000e-01, 1.000000e-01)
175+
173176
// Test the new SIMD types
174177
let tinky = SIMD2<Int>(1, 2)
175178
// CHECK: {{tinky}}: SIMD2<Int> = (1, 2)

0 commit comments

Comments
 (0)