From be641f6e494059a2e803c654b81b75a5d6dbde0b Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Fri, 8 Nov 2024 16:00:06 -0800 Subject: [PATCH] [lldb] Wire up preliminary support for BuiltinFixedArray This is both partially incorrect due to missing stride computation and only works in SwiftASTContext right now due to missing Reflection support on the compiler side. But it eliminates the nasty warnings in SwiftASTContext.cpp and works for byte-aligned arrays. --- .../TypeSystem/Swift/SwiftASTContext.cpp | 430 ++++++++++-------- .../API/lang/swift/value_generics/Makefile | 4 + .../value_generics/TestSwiftValueGenerics.py | 21 + .../API/lang/swift/value_generics/main.swift | 50 ++ 4 files changed, 319 insertions(+), 186 deletions(-) create mode 100644 lldb/test/API/lang/swift/value_generics/Makefile create mode 100644 lldb/test/API/lang/swift/value_generics/TestSwiftValueGenerics.py create mode 100644 lldb/test/API/lang/swift/value_generics/main.swift diff --git a/lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp b/lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp index b36aa3619905c..d15eeec332db3 100644 --- a/lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp +++ b/lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp @@ -5960,15 +5960,18 @@ SwiftASTContext::GetTypeInfo(opaque_compiler_type_t type, swift_flags |= eTypeHasDynamicSelf; switch (type_kind) { case swift::TypeKind::BuiltinDefaultActorStorage: - case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: case swift::TypeKind::BuiltinExecutor: case swift::TypeKind::BuiltinJob: - case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: case swift::TypeKind::BuiltinRawUnsafeContinuation: + case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinUnboundGeneric: + case swift::TypeKind::ElementArchetype: case swift::TypeKind::Error: + case swift::TypeKind::ErrorUnion: case swift::TypeKind::InOut: + case swift::TypeKind::Integer: case swift::TypeKind::Module: - case swift::TypeKind::ElementArchetype: case swift::TypeKind::OpenedArchetype: case swift::TypeKind::ParameterizedProtocol: case swift::TypeKind::Placeholder: @@ -5979,7 +5982,6 @@ SwiftASTContext::GetTypeInfo(opaque_compiler_type_t type, case swift::TypeKind::SILMoveOnlyWrapped: case swift::TypeKind::SILToken: case swift::TypeKind::TypeVariable: - case swift::TypeKind::ErrorUnion: case swift::TypeKind::Unresolved: case swift::TypeKind::VariadicSequence: LOG_PRINTF(GetLog(LLDBLog::Types), "Unexpected type: %s", @@ -6019,6 +6021,8 @@ SwiftASTContext::GetTypeInfo(opaque_compiler_type_t type, swift_flags |= eTypeIsBuiltIn | eTypeIsPointer | eTypeIsScalar | eTypeHasValue; break; + case swift::TypeKind::BuiltinFixedArray: + return eTypeIsBuiltIn | eTypeHasChildren; case swift::TypeKind::BuiltinVector: // TODO: OR in eTypeIsFloat or eTypeIsInteger as needed return eTypeIsBuiltIn | eTypeHasChildren | eTypeIsVector; @@ -6120,6 +6124,8 @@ lldb::TypeClass SwiftASTContext::GetTypeClass(opaque_compiler_type_t type) { case swift::TypeKind::BuiltinJob: case swift::TypeKind::BuiltinPackIndex: case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinUnboundGeneric: + case swift::TypeKind::Integer: case swift::TypeKind::Pack: case swift::TypeKind::PackElement: case swift::TypeKind::PackExpansion: @@ -6146,6 +6152,7 @@ lldb::TypeClass SwiftASTContext::GetTypeClass(opaque_compiler_type_t type) { return lldb::eTypeClassBuiltin; case swift::TypeKind::BuiltinVector: return lldb::eTypeClassVector; + case swift::TypeKind::BuiltinFixedArray: case swift::TypeKind::Tuple: return lldb::eTypeClassArray; case swift::TypeKind::UnmanagedStorage: @@ -6653,10 +6660,12 @@ lldb::Encoding SwiftASTContext::GetEncoding(opaque_compiler_type_t type, case swift::TypeKind::BoundGenericClass: case swift::TypeKind::GenericTypeParam: case swift::TypeKind::DependentMember: + case swift::TypeKind::Integer: return lldb::eEncodingUint; + case swift::TypeKind::BuiltinFixedArray: + case swift::TypeKind::BuiltinUnboundGeneric: case swift::TypeKind::BuiltinVector: - break; case swift::TypeKind::Tuple: break; case swift::TypeKind::UnmanagedStorage: @@ -6712,53 +6721,59 @@ SwiftASTContext::GetNumChildren(opaque_compiler_type_t type, const swift::TypeKind type_kind = swift_can_type->getKind(); switch (type_kind) { + case swift::TypeKind::BuiltinBridgeObject: case swift::TypeKind::BuiltinDefaultActorStorage: - case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: case swift::TypeKind::BuiltinExecutor: + case swift::TypeKind::BuiltinFloat: + case swift::TypeKind::BuiltinInteger: + case swift::TypeKind::BuiltinIntegerLiteral: case swift::TypeKind::BuiltinJob: - case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinNativeObject: + case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: + case swift::TypeKind::BuiltinPackIndex: + case swift::TypeKind::BuiltinRawPointer: case swift::TypeKind::BuiltinRawUnsafeContinuation: + case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinUnboundGeneric: + case swift::TypeKind::BuiltinUnsafeValueBuffer: + case swift::TypeKind::BuiltinVector: + case swift::TypeKind::DependentMember: + case swift::TypeKind::DynamicSelf: + case swift::TypeKind::ElementArchetype: case swift::TypeKind::Error: + case swift::TypeKind::ErrorUnion: + case swift::TypeKind::ExistentialMetatype: + case swift::TypeKind::Function: + case swift::TypeKind::GenericFunction: + case swift::TypeKind::GenericTypeParam: case swift::TypeKind::InOut: + case swift::TypeKind::Integer: + case swift::TypeKind::Metatype: case swift::TypeKind::Module: - case swift::TypeKind::BuiltinPackIndex: + case swift::TypeKind::OpaqueTypeArchetype: + case swift::TypeKind::OpenedArchetype: case swift::TypeKind::Pack: + case swift::TypeKind::PackArchetype: case swift::TypeKind::PackElement: case swift::TypeKind::PackExpansion: - case swift::TypeKind::SILPack: case swift::TypeKind::ParameterizedProtocol: case swift::TypeKind::Placeholder: + case swift::TypeKind::PrimaryArchetype: case swift::TypeKind::SILBlockStorage: case swift::TypeKind::SILBox: - case swift::TypeKind::SILMoveOnlyWrapped: case swift::TypeKind::SILFunction: + case swift::TypeKind::SILMoveOnlyWrapped: + case swift::TypeKind::SILPack: case swift::TypeKind::SILToken: - case swift::TypeKind::PackArchetype: case swift::TypeKind::TypeVariable: - case swift::TypeKind::ErrorUnion: case swift::TypeKind::Unresolved: case swift::TypeKind::VariadicSequence: break; - case swift::TypeKind::BuiltinInteger: - case swift::TypeKind::BuiltinIntegerLiteral: - case swift::TypeKind::BuiltinFloat: - case swift::TypeKind::BuiltinRawPointer: - case swift::TypeKind::BuiltinNativeObject: - case swift::TypeKind::BuiltinUnsafeValueBuffer: - case swift::TypeKind::BuiltinBridgeObject: - case swift::TypeKind::BuiltinVector: - case swift::TypeKind::Function: - case swift::TypeKind::GenericFunction: - case swift::TypeKind::DynamicSelf: - break; case swift::TypeKind::UnmanagedStorage: case swift::TypeKind::UnownedStorage: case swift::TypeKind::WeakStorage: return ToCompilerType(swift_can_type->getReferenceStorageReferent()) .GetNumChildren(omit_empty_base_classes, exe_ctx); - case swift::TypeKind::GenericTypeParam: - case swift::TypeKind::DependentMember: - break; case swift::TypeKind::Enum: case swift::TypeKind::BoundGenericEnum: { @@ -6767,9 +6782,10 @@ SwiftASTContext::GetNumChildren(opaque_compiler_type_t type, return cached_enum_info->GetNumElementsWithPayload(); } break; - case swift::TypeKind::Tuple: - case swift::TypeKind::Struct: case swift::TypeKind::BoundGenericStruct: + case swift::TypeKind::BuiltinFixedArray: + case swift::TypeKind::Struct: + case swift::TypeKind::Tuple: return GetNumFields(type); case swift::TypeKind::Class: @@ -6788,15 +6804,6 @@ SwiftASTContext::GetNumChildren(opaque_compiler_type_t type, return protocol_info.m_num_storage_words; } - case swift::TypeKind::ExistentialMetatype: - case swift::TypeKind::Metatype: - case swift::TypeKind::PrimaryArchetype: - case swift::TypeKind::ElementArchetype: - case swift::TypeKind::OpaqueTypeArchetype: - case swift::TypeKind::OpenedArchetype: - - return 0; - case swift::TypeKind::LValue: { swift::LValueType *lvalue_type = swift_can_type->castTo(); @@ -6855,42 +6862,43 @@ uint32_t SwiftASTContext::GetNumFields(opaque_compiler_type_t type, const swift::TypeKind type_kind = swift_can_type->getKind(); switch (type_kind) { + case swift::TypeKind::BuiltinBridgeObject: case swift::TypeKind::BuiltinDefaultActorStorage: - case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: case swift::TypeKind::BuiltinExecutor: + case swift::TypeKind::BuiltinFloat: + case swift::TypeKind::BuiltinInteger: + case swift::TypeKind::BuiltinIntegerLiteral: case swift::TypeKind::BuiltinJob: - case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinNativeObject: + case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: + case swift::TypeKind::BuiltinPackIndex: + case swift::TypeKind::BuiltinRawPointer: case swift::TypeKind::BuiltinRawUnsafeContinuation: + case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinUnboundGeneric: + case swift::TypeKind::BuiltinUnsafeValueBuffer: + case swift::TypeKind::BuiltinVector: case swift::TypeKind::Error: + case swift::TypeKind::ErrorUnion: case swift::TypeKind::InOut: + case swift::TypeKind::Integer: case swift::TypeKind::Module: - case swift::TypeKind::BuiltinPackIndex: case swift::TypeKind::Pack: + case swift::TypeKind::PackArchetype: case swift::TypeKind::PackElement: case swift::TypeKind::PackExpansion: - case swift::TypeKind::SILPack: case swift::TypeKind::ParameterizedProtocol: case swift::TypeKind::Placeholder: case swift::TypeKind::SILBlockStorage: case swift::TypeKind::SILBox: - case swift::TypeKind::SILMoveOnlyWrapped: case swift::TypeKind::SILFunction: + case swift::TypeKind::SILMoveOnlyWrapped: + case swift::TypeKind::SILPack: case swift::TypeKind::SILToken: - case swift::TypeKind::PackArchetype: case swift::TypeKind::TypeVariable: - case swift::TypeKind::ErrorUnion: case swift::TypeKind::Unresolved: case swift::TypeKind::VariadicSequence: break; - case swift::TypeKind::BuiltinInteger: - case swift::TypeKind::BuiltinIntegerLiteral: - case swift::TypeKind::BuiltinFloat: - case swift::TypeKind::BuiltinRawPointer: - case swift::TypeKind::BuiltinNativeObject: - case swift::TypeKind::BuiltinUnsafeValueBuffer: - case swift::TypeKind::BuiltinBridgeObject: - case swift::TypeKind::BuiltinVector: - break; case swift::TypeKind::UnmanagedStorage: case swift::TypeKind::UnownedStorage: case swift::TypeKind::WeakStorage: @@ -6909,6 +6917,10 @@ uint32_t SwiftASTContext::GetNumFields(opaque_compiler_type_t type, case swift::TypeKind::Tuple: return swift::cast(swift_can_type)->getNumElements(); + case swift::TypeKind::BuiltinFixedArray: + return swift::cast(swift_can_type) + ->getFixedInhabitedSize() + .value_or(0); case swift::TypeKind::Struct: case swift::TypeKind::Class: @@ -7081,42 +7093,43 @@ CompilerType SwiftASTContext::GetFieldAtIndex(opaque_compiler_type_t type, const swift::TypeKind type_kind = swift_can_type->getKind(); switch (type_kind) { + case swift::TypeKind::BuiltinBridgeObject: case swift::TypeKind::BuiltinDefaultActorStorage: - case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: case swift::TypeKind::BuiltinExecutor: + case swift::TypeKind::BuiltinFloat: + case swift::TypeKind::BuiltinInteger: + case swift::TypeKind::BuiltinIntegerLiteral: case swift::TypeKind::BuiltinJob: - case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinNativeObject: + case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: + case swift::TypeKind::BuiltinPackIndex: + case swift::TypeKind::BuiltinRawPointer: case swift::TypeKind::BuiltinRawUnsafeContinuation: + case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinUnboundGeneric: + case swift::TypeKind::BuiltinUnsafeValueBuffer: + case swift::TypeKind::BuiltinVector: case swift::TypeKind::Error: + case swift::TypeKind::ErrorUnion: case swift::TypeKind::InOut: + case swift::TypeKind::Integer: case swift::TypeKind::Module: - case swift::TypeKind::BuiltinPackIndex: case swift::TypeKind::Pack: + case swift::TypeKind::PackArchetype: case swift::TypeKind::PackElement: case swift::TypeKind::PackExpansion: - case swift::TypeKind::SILPack: case swift::TypeKind::ParameterizedProtocol: case swift::TypeKind::Placeholder: case swift::TypeKind::SILBlockStorage: case swift::TypeKind::SILBox: - case swift::TypeKind::SILMoveOnlyWrapped: case swift::TypeKind::SILFunction: + case swift::TypeKind::SILMoveOnlyWrapped: + case swift::TypeKind::SILPack: case swift::TypeKind::SILToken: - case swift::TypeKind::PackArchetype: case swift::TypeKind::TypeVariable: - case swift::TypeKind::ErrorUnion: case swift::TypeKind::Unresolved: case swift::TypeKind::VariadicSequence: break; - case swift::TypeKind::BuiltinInteger: - case swift::TypeKind::BuiltinIntegerLiteral: - case swift::TypeKind::BuiltinFloat: - case swift::TypeKind::BuiltinRawPointer: - case swift::TypeKind::BuiltinNativeObject: - case swift::TypeKind::BuiltinUnsafeValueBuffer: - case swift::TypeKind::BuiltinBridgeObject: - case swift::TypeKind::BuiltinVector: - break; case swift::TypeKind::UnmanagedStorage: case swift::TypeKind::UnownedStorage: case swift::TypeKind::WeakStorage: @@ -7151,6 +7164,12 @@ CompilerType SwiftASTContext::GetFieldAtIndex(opaque_compiler_type_t type, return ToCompilerType(child.getType().getPointer()); } + case swift::TypeKind::BuiltinFixedArray: { + auto fixed_array = + swift::cast(swift_can_type); + return ToCompilerType(fixed_array->getElementType()); + } + case swift::TypeKind::Class: case swift::TypeKind::BoundGenericClass: { auto class_decl = swift_can_type->getClassOrBoundGenericClass(); @@ -7275,30 +7294,55 @@ uint32_t SwiftASTContext::GetNumPointeeChildren(opaque_compiler_type_t type) { const swift::TypeKind type_kind = swift_can_type->getKind(); switch (type_kind) { + case swift::TypeKind::BoundGenericClass: + case swift::TypeKind::BoundGenericEnum: + case swift::TypeKind::BoundGenericStruct: case swift::TypeKind::BuiltinDefaultActorStorage: - case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: case swift::TypeKind::BuiltinExecutor: + case swift::TypeKind::BuiltinFixedArray: case swift::TypeKind::BuiltinJob: - case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: + case swift::TypeKind::BuiltinPackIndex: case swift::TypeKind::BuiltinRawUnsafeContinuation: + case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinUnboundGeneric: + case swift::TypeKind::Class: + case swift::TypeKind::DependentMember: + case swift::TypeKind::DynamicSelf: + case swift::TypeKind::ElementArchetype: + case swift::TypeKind::Enum: case swift::TypeKind::Error: + case swift::TypeKind::ErrorUnion: + case swift::TypeKind::Existential: + case swift::TypeKind::ExistentialMetatype: + case swift::TypeKind::Function: + case swift::TypeKind::GenericFunction: + case swift::TypeKind::GenericTypeParam: case swift::TypeKind::InOut: + case swift::TypeKind::Integer: + case swift::TypeKind::Metatype: case swift::TypeKind::Module: - case swift::TypeKind::BuiltinPackIndex: + case swift::TypeKind::OpaqueTypeArchetype: + case swift::TypeKind::OpenedArchetype: case swift::TypeKind::Pack: + case swift::TypeKind::PackArchetype: case swift::TypeKind::PackElement: case swift::TypeKind::PackExpansion: - case swift::TypeKind::SILPack: case swift::TypeKind::ParameterizedProtocol: case swift::TypeKind::Placeholder: + case swift::TypeKind::PrimaryArchetype: + case swift::TypeKind::Protocol: + case swift::TypeKind::ProtocolComposition: case swift::TypeKind::SILBlockStorage: case swift::TypeKind::SILBox: - case swift::TypeKind::SILMoveOnlyWrapped: case swift::TypeKind::SILFunction: + case swift::TypeKind::SILMoveOnlyWrapped: + case swift::TypeKind::SILPack: case swift::TypeKind::SILToken: - case swift::TypeKind::PackArchetype: + case swift::TypeKind::Struct: + case swift::TypeKind::Tuple: case swift::TypeKind::TypeVariable: - case swift::TypeKind::ErrorUnion: + case swift::TypeKind::UnboundGeneric: case swift::TypeKind::Unresolved: case swift::TypeKind::VariadicSequence: return 0; @@ -7317,32 +7361,8 @@ uint32_t SwiftASTContext::GetNumPointeeChildren(opaque_compiler_type_t type) { case swift::TypeKind::WeakStorage: return GetNumPointeeChildren( swift::cast(swift_can_type).getPointer()); - case swift::TypeKind::Tuple: - case swift::TypeKind::GenericTypeParam: - case swift::TypeKind::DependentMember: - case swift::TypeKind::Enum: - case swift::TypeKind::Struct: - case swift::TypeKind::Class: - case swift::TypeKind::Protocol: - case swift::TypeKind::Metatype: - case swift::TypeKind::ElementArchetype: - case swift::TypeKind::OpaqueTypeArchetype: - case swift::TypeKind::OpenedArchetype: - case swift::TypeKind::PrimaryArchetype: - case swift::TypeKind::Function: - case swift::TypeKind::GenericFunction: - case swift::TypeKind::ProtocolComposition: - case swift::TypeKind::Existential: - return 0; case swift::TypeKind::LValue: return 1; - case swift::TypeKind::UnboundGeneric: - case swift::TypeKind::BoundGenericClass: - case swift::TypeKind::BoundGenericEnum: - case swift::TypeKind::BoundGenericStruct: - case swift::TypeKind::ExistentialMetatype: - case swift::TypeKind::DynamicSelf: - return 0; case swift::TypeKind::Optional: case swift::TypeKind::TypeAlias: @@ -7433,42 +7453,56 @@ llvm::Expected SwiftASTContext::GetChildCompilerTypeAtIndex( const swift::TypeKind type_kind = swift_can_type->getKind(); switch (type_kind) { + case swift::TypeKind::BuiltinBridgeObject: case swift::TypeKind::BuiltinDefaultActorStorage: - case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: case swift::TypeKind::BuiltinExecutor: + case swift::TypeKind::BuiltinFloat: + case swift::TypeKind::BuiltinInteger: + case swift::TypeKind::BuiltinIntegerLiteral: case swift::TypeKind::BuiltinJob: - case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinNativeObject: + case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: + case swift::TypeKind::BuiltinPackIndex: + case swift::TypeKind::BuiltinRawPointer: case swift::TypeKind::BuiltinRawUnsafeContinuation: + case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinUnboundGeneric: + case swift::TypeKind::BuiltinUnsafeValueBuffer: + case swift::TypeKind::BuiltinVector: + case swift::TypeKind::DependentMember: + case swift::TypeKind::DynamicSelf: + case swift::TypeKind::ElementArchetype: case swift::TypeKind::Error: + case swift::TypeKind::ErrorUnion: + case swift::TypeKind::ExistentialMetatype: + case swift::TypeKind::Function: + case swift::TypeKind::GenericFunction: + case swift::TypeKind::GenericTypeParam: case swift::TypeKind::InOut: + case swift::TypeKind::Integer: + case swift::TypeKind::Metatype: case swift::TypeKind::Module: - case swift::TypeKind::BuiltinPackIndex: + case swift::TypeKind::OpaqueTypeArchetype: + case swift::TypeKind::OpenedArchetype: case swift::TypeKind::Pack: + case swift::TypeKind::PackArchetype: case swift::TypeKind::PackElement: case swift::TypeKind::PackExpansion: - case swift::TypeKind::SILPack: case swift::TypeKind::ParameterizedProtocol: case swift::TypeKind::Placeholder: + case swift::TypeKind::PrimaryArchetype: case swift::TypeKind::SILBlockStorage: case swift::TypeKind::SILBox: - case swift::TypeKind::SILMoveOnlyWrapped: case swift::TypeKind::SILFunction: + case swift::TypeKind::SILMoveOnlyWrapped: + case swift::TypeKind::SILPack: case swift::TypeKind::SILToken: - case swift::TypeKind::PackArchetype: case swift::TypeKind::TypeVariable: - case swift::TypeKind::ErrorUnion: + case swift::TypeKind::UnboundGeneric: case swift::TypeKind::Unresolved: case swift::TypeKind::VariadicSequence: break; - case swift::TypeKind::BuiltinInteger: - case swift::TypeKind::BuiltinIntegerLiteral: - case swift::TypeKind::BuiltinFloat: - case swift::TypeKind::BuiltinRawPointer: - case swift::TypeKind::BuiltinNativeObject: - case swift::TypeKind::BuiltinUnsafeValueBuffer: - case swift::TypeKind::BuiltinBridgeObject: - case swift::TypeKind::BuiltinVector: - break; + case swift::TypeKind::UnmanagedStorage: case swift::TypeKind::UnownedStorage: case swift::TypeKind::WeakStorage: @@ -7479,9 +7513,6 @@ llvm::Expected SwiftASTContext::GetChildCompilerTypeAtIndex( child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class, child_is_deref_of_parent, valobj, language_flags); - case swift::TypeKind::GenericTypeParam: - case swift::TypeKind::DependentMember: - break; case swift::TypeKind::Enum: case swift::TypeKind::BoundGenericEnum: { @@ -7540,6 +7571,37 @@ llvm::Expected SwiftASTContext::GetChildCompilerTypeAtIndex( return child_type; } + case swift::TypeKind::BuiltinFixedArray: { + auto fixed_array = + swift::cast(swift_can_type); + auto num_elts = fixed_array->getFixedInhabitedSize(); + if (!num_elts) + break; + if (idx >= *num_elts) + break; + + CompilerType child_type = ToCompilerType(fixed_array->getElementType()); + llvm::raw_string_ostream(child_name) << idx; + + if (!get_type_size(child_byte_size, child_type)) + return llvm::createStringError( + "could not get size of fixed array element " + child_name); + child_is_base_class = false; + child_is_deref_of_parent = false; + + CompilerType compiler_type = ToCompilerType(GetSwiftType(type)); + // FIXME: This is *not* generally correct, but there is no + // reflection metadata yet. + uint64_t offset = idx * child_byte_size; + + // FIXME: Are there sub-byte strides? + child_byte_offset = offset; + child_bitfield_bit_size = 0; + child_bitfield_bit_offset = 0; + + return child_type; + } + case swift::TypeKind::Class: case swift::TypeKind::BoundGenericClass: { auto class_decl = swift_can_type->getClassOrBoundGenericClass(); @@ -7664,18 +7726,6 @@ llvm::Expected SwiftASTContext::GetChildCompilerTypeAtIndex( return child_type; } - case swift::TypeKind::ExistentialMetatype: - case swift::TypeKind::Metatype: - break; - - case swift::TypeKind::ElementArchetype: - case swift::TypeKind::OpaqueTypeArchetype: - case swift::TypeKind::OpenedArchetype: - case swift::TypeKind::PrimaryArchetype: - case swift::TypeKind::Function: - case swift::TypeKind::GenericFunction: - break; - case swift::TypeKind::LValue: if (idx < llvm::expectedToStdOptional( GetNumChildren(type, omit_empty_base_classes, exe_ctx)) @@ -7697,9 +7747,6 @@ llvm::Expected SwiftASTContext::GetChildCompilerTypeAtIndex( } } break; - case swift::TypeKind::UnboundGeneric: - case swift::TypeKind::DynamicSelf: - break; case swift::TypeKind::Optional: case swift::TypeKind::TypeAlias: @@ -7758,42 +7805,53 @@ size_t SwiftASTContext::GetIndexOfChildMemberWithName( const swift::TypeKind type_kind = swift_can_type->getKind(); switch (type_kind) { + case swift::TypeKind::BuiltinBridgeObject: case swift::TypeKind::BuiltinDefaultActorStorage: - case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: case swift::TypeKind::BuiltinExecutor: + case swift::TypeKind::BuiltinFloat: + case swift::TypeKind::BuiltinInteger: + case swift::TypeKind::BuiltinIntegerLiteral: case swift::TypeKind::BuiltinJob: - case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinNativeObject: + case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: + case swift::TypeKind::BuiltinPackIndex: + case swift::TypeKind::BuiltinRawPointer: case swift::TypeKind::BuiltinRawUnsafeContinuation: + case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinUnboundGeneric: + case swift::TypeKind::BuiltinUnsafeValueBuffer: + case swift::TypeKind::BuiltinVector: + case swift::TypeKind::DynamicSelf: + case swift::TypeKind::ElementArchetype: case swift::TypeKind::Error: + case swift::TypeKind::ErrorUnion: + case swift::TypeKind::ExistentialMetatype: + case swift::TypeKind::Function: + case swift::TypeKind::GenericFunction: case swift::TypeKind::InOut: + case swift::TypeKind::Integer: + case swift::TypeKind::Metatype: case swift::TypeKind::Module: - case swift::TypeKind::BuiltinPackIndex: + case swift::TypeKind::OpaqueTypeArchetype: + case swift::TypeKind::OpenedArchetype: case swift::TypeKind::Pack: + case swift::TypeKind::PackArchetype: case swift::TypeKind::PackElement: case swift::TypeKind::PackExpansion: - case swift::TypeKind::SILPack: case swift::TypeKind::ParameterizedProtocol: case swift::TypeKind::Placeholder: + case swift::TypeKind::PrimaryArchetype: case swift::TypeKind::SILBlockStorage: case swift::TypeKind::SILBox: - case swift::TypeKind::SILMoveOnlyWrapped: case swift::TypeKind::SILFunction: + case swift::TypeKind::SILMoveOnlyWrapped: + case swift::TypeKind::SILPack: case swift::TypeKind::SILToken: - case swift::TypeKind::PackArchetype: case swift::TypeKind::TypeVariable: - case swift::TypeKind::ErrorUnion: + case swift::TypeKind::UnboundGeneric: case swift::TypeKind::Unresolved: case swift::TypeKind::VariadicSequence: break; - case swift::TypeKind::BuiltinInteger: - case swift::TypeKind::BuiltinIntegerLiteral: - case swift::TypeKind::BuiltinFloat: - case swift::TypeKind::BuiltinRawPointer: - case swift::TypeKind::BuiltinNativeObject: - case swift::TypeKind::BuiltinUnsafeValueBuffer: - case swift::TypeKind::BuiltinBridgeObject: - case swift::TypeKind::BuiltinVector: - break; case swift::TypeKind::UnmanagedStorage: case swift::TypeKind::UnownedStorage: @@ -7832,8 +7890,8 @@ size_t SwiftASTContext::GetIndexOfChildMemberWithName( if (tuple_idx < tuple_type->getNumElements()) { child_indexes.push_back(tuple_idx); return child_indexes.size(); - } else - return 0; + } + return 0; } // Otherwise, perform lookup by name. @@ -7846,6 +7904,22 @@ size_t SwiftASTContext::GetIndexOfChildMemberWithName( return 0; } + case swift::TypeKind::BuiltinFixedArray: { + auto fixed_array = + swift::cast(swift_can_type); + auto num_elts = fixed_array->getFixedInhabitedSize(); + if (!num_elts) + return 0; + + uint32_t array_idx = 0; + if (llvm::to_integer(name, array_idx)) + if (array_idx < *num_elts) { + child_indexes.push_back(array_idx); + return child_indexes.size(); + } + + return 0; + } case swift::TypeKind::Struct: case swift::TypeKind::Class: @@ -7914,17 +7988,6 @@ size_t SwiftASTContext::GetIndexOfChildMemberWithName( } } break; - case swift::TypeKind::ExistentialMetatype: - case swift::TypeKind::Metatype: - break; - - case swift::TypeKind::ElementArchetype: - case swift::TypeKind::OpaqueTypeArchetype: - case swift::TypeKind::OpenedArchetype: - case swift::TypeKind::PrimaryArchetype: - case swift::TypeKind::Function: - case swift::TypeKind::GenericFunction: - break; case swift::TypeKind::LValue: { CompilerType pointee_clang_type(GetNonReferenceType(type)); @@ -7933,9 +7996,6 @@ size_t SwiftASTContext::GetIndexOfChildMemberWithName( name, exe_ctx, omit_empty_base_classes, child_indexes); } } break; - case swift::TypeKind::UnboundGeneric: - case swift::TypeKind::DynamicSelf: - break; case swift::TypeKind::Optional: case swift::TypeKind::TypeAlias: @@ -8149,30 +8209,40 @@ bool SwiftASTContext::DumpTypeValue( const swift::TypeKind type_kind = swift_can_type->getKind(); switch (type_kind) { + case swift::TypeKind::BoundGenericStruct: case swift::TypeKind::BuiltinDefaultActorStorage: - case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: case swift::TypeKind::BuiltinExecutor: + case swift::TypeKind::BuiltinFixedArray: case swift::TypeKind::BuiltinJob: - case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinNonDefaultDistributedActorStorage: + case swift::TypeKind::BuiltinPackIndex: case swift::TypeKind::BuiltinRawUnsafeContinuation: + case swift::TypeKind::BuiltinTuple: + case swift::TypeKind::BuiltinUnboundGeneric: + case swift::TypeKind::BuiltinVector: + case swift::TypeKind::DynamicSelf: case swift::TypeKind::Error: + case swift::TypeKind::ErrorUnion: + case swift::TypeKind::Existential: case swift::TypeKind::InOut: + case swift::TypeKind::Integer: case swift::TypeKind::Module: - case swift::TypeKind::BuiltinPackIndex: case swift::TypeKind::Pack: + case swift::TypeKind::PackArchetype: case swift::TypeKind::PackElement: case swift::TypeKind::PackExpansion: - case swift::TypeKind::SILPack: case swift::TypeKind::ParameterizedProtocol: case swift::TypeKind::Placeholder: + case swift::TypeKind::ProtocolComposition: case swift::TypeKind::SILBlockStorage: case swift::TypeKind::SILBox: - case swift::TypeKind::SILMoveOnlyWrapped: case swift::TypeKind::SILFunction: + case swift::TypeKind::SILMoveOnlyWrapped: + case swift::TypeKind::SILPack: case swift::TypeKind::SILToken: - case swift::TypeKind::PackArchetype: + case swift::TypeKind::Tuple: case swift::TypeKind::TypeVariable: - case swift::TypeKind::ErrorUnion: + case swift::TypeKind::UnboundGeneric: case swift::TypeKind::Unresolved: case swift::TypeKind::VariadicSequence: break; @@ -8264,11 +8334,6 @@ bool SwiftASTContext::DumpTypeValue( item_count, UINT32_MAX, LLDB_INVALID_ADDRESS, bitfield_bit_size, bitfield_bit_offset, exe_scope); } break; - case swift::TypeKind::BuiltinVector: - break; - - case swift::TypeKind::Tuple: - break; case swift::TypeKind::UnmanagedStorage: case swift::TypeKind::UnownedStorage: @@ -8308,13 +8373,6 @@ bool SwiftASTContext::DumpTypeValue( bitfield_bit_size, bitfield_bit_offset, exe_scope); } break; - case swift::TypeKind::ProtocolComposition: - case swift::TypeKind::Existential: - case swift::TypeKind::UnboundGeneric: - case swift::TypeKind::BoundGenericStruct: - case swift::TypeKind::DynamicSelf: - break; - case swift::TypeKind::Optional: case swift::TypeKind::TypeAlias: case swift::TypeKind::Dictionary: diff --git a/lldb/test/API/lang/swift/value_generics/Makefile b/lldb/test/API/lang/swift/value_generics/Makefile new file mode 100644 index 0000000000000..60ccfce7beb1c --- /dev/null +++ b/lldb/test/API/lang/swift/value_generics/Makefile @@ -0,0 +1,4 @@ +SWIFT_SOURCES := main.swift +SWIFTFLAGS_EXTRAS = -Xfrontend -enable-builtin-module -Xfrontend -enable-experimental-feature -Xfrontend ValueGenerics -Xfrontend -disable-experimental-parser-round-trip -Xfrontend -disable-availability-checking + +include Makefile.rules diff --git a/lldb/test/API/lang/swift/value_generics/TestSwiftValueGenerics.py b/lldb/test/API/lang/swift/value_generics/TestSwiftValueGenerics.py new file mode 100644 index 0000000000000..d1f8e51c402e5 --- /dev/null +++ b/lldb/test/API/lang/swift/value_generics/TestSwiftValueGenerics.py @@ -0,0 +1,21 @@ +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test.decorators import * +import lldbsuite.test.lldbutil as lldbutil + +class TestSwiftVariadicGenerics(TestBase): + + @skipUnlessDarwin + @swiftTest + def test(self): + self.build() + + target, process, _, _ = lldbutil.run_to_source_breakpoint( + self, "break here", lldb.SBFileSpec('main.swift')) + self.expect('log enable lldb types') + self.expect("frame variable v", + substrs=["a.Vector<4, Int>", "storage", + "0", "0", + "1", "1", + "2", "2", + "3", "3"]) diff --git a/lldb/test/API/lang/swift/value_generics/main.swift b/lldb/test/API/lang/swift/value_generics/main.swift new file mode 100644 index 0000000000000..020d69f08e6d4 --- /dev/null +++ b/lldb/test/API/lang/swift/value_generics/main.swift @@ -0,0 +1,50 @@ +import Builtin + +@frozen +public struct Vector: ~Copyable { + private var storage: Builtin.FixedArray + + public init(_ valueForIndex: (Int) -> Element) { + storage = Builtin.emplace { rawPointer in + let base = UnsafeMutablePointer(rawPointer) + for i in 0.. Element { + _read { + assert(i >= 0 && i < Count) + let rawPointer = Builtin.addressOfBorrow(self) + let base = UnsafePointer(rawPointer) + yield ((base + i).pointee) + } + + _modify { + assert(i >= 0 && i < Count) + let rawPointer = Builtin.addressof(&self) + let base = UnsafeMutablePointer(rawPointer) + yield (&(base + i).pointee) + } + } +} +extension Vector: Copyable where Element: Copyable { + public init(repeating value: Element) { + self.init { _ in value } + } +} +extension Vector: BitwiseCopyable where Element: BitwiseCopyable {} + +func main() { + var v = Vector<4, Int>(repeating: 0) + v[0] = 0 + v[1] = 1 + v[2] = 2 + v[3] = 3 + + // break here + print(v) + +} +main()