@@ -833,6 +833,22 @@ SwiftLanguageRuntime::GetNumChildren(CompilerType type,
833833 type.GetMangledTypeName ().GetString ());
834834 }
835835
836+ if (auto *ati = llvm::dyn_cast<swift::reflection::ArrayTypeInfo>(ti)) {
837+ LLDB_LOG (GetLog (LLDBLog::Types), " {0}: ArrayTypeInfo()" ,
838+ type.GetMangledTypeName ().GetCString ());
839+ auto *el_ti = ati->getElementTypeInfo ();
840+ if (!el_ti)
841+ return llvm::createStringError (" Array without element type info: " +
842+ type.GetMangledTypeName ().GetString ());
843+ // We could also get the value out of the mangled type name, but
844+ // this is cheaper.
845+ unsigned stride = el_ti->getStride ();
846+ if (!stride)
847+ return llvm::createStringError (" Array without element stride: " +
848+ type.GetMangledTypeName ().GetString ());
849+ return ati->getSize () / stride;
850+ }
851+
836852 LogUnimplementedTypeKind (__FUNCTION__, type);
837853 return llvm::createStringError (" GetNumChildren unimplemented for type " +
838854 type.GetMangledTypeName ().GetString ());
@@ -1451,6 +1467,40 @@ llvm::Expected<CompilerType> SwiftLanguageRuntime::GetChildCompilerTypeAtIndex(
14511467 " is out of bounds (" + llvm::Twine (i - 1 ) +
14521468 " )" );
14531469 }
1470+ // Fixed array.
1471+ if (auto *ati = llvm::dyn_cast<swift::reflection::ArrayTypeInfo>(ti)) {
1472+ LLDB_LOG (GetLog (LLDBLog::Types), " {0}: ArrayTypeInfo()" ,
1473+ type.GetMangledTypeName ().GetCString ());
1474+ auto *el_ti = ati->getElementTypeInfo ();
1475+ if (!el_ti)
1476+ return llvm::createStringError (" array without element type info: " +
1477+ type.GetMangledTypeName ().GetString ());
1478+ child_name.clear ();
1479+ llvm::raw_string_ostream (child_name) << idx;
1480+ child_byte_size = el_ti->getSize ();
1481+ child_byte_offset = el_ti->getStride () * idx;
1482+ if (!ignore_array_bounds &&
1483+ (int64_t )child_byte_offset > (int64_t )ati->getSize ())
1484+ return llvm::createStringError (" array index out of bounds" );
1485+
1486+ child_bitfield_bit_size = 0 ;
1487+ child_bitfield_bit_offset = 0 ;
1488+ child_is_base_class = false ;
1489+ child_is_deref_of_parent = false ;
1490+ language_flags = 0 ;
1491+
1492+ swift::Demangle::Demangler dem;
1493+ swift::Demangle::NodePointer global =
1494+ dem.demangleSymbol (type.GetMangledTypeName ().GetStringRef ());
1495+ using Kind = Node::Kind;
1496+ auto *dem_array_type = swift_demangle::ChildAtPath (
1497+ global, {Kind::TypeMangling, Kind::Type, Kind::BuiltinFixedArray});
1498+ if (!dem_array_type || dem_array_type->getNumChildren () != 2 )
1499+ return llvm::createStringError (" Expected fixed array, but found: " +
1500+ type.GetMangledTypeName ().GetString ());
1501+ return ts->RemangleAsType (dem, dem_array_type->getChild (1 ),
1502+ ts->GetManglingFlavor ());
1503+ }
14541504 if (llvm::dyn_cast_or_null<swift::reflection::BuiltinTypeInfo>(ti)) {
14551505 // Clang enums have an artificial rawValue property. We could
14561506 // consider handling them here, but
0 commit comments