@@ -1688,7 +1688,7 @@ CreatePackType(swift::Demangle::Demangler &dem, TypeSystemSwiftTypeRef &ts,
16881688bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack (
16891689 ValueObject &in_value, CompilerType pack_type,
16901690 lldb::DynamicValueType use_dynamic, TypeAndOrName &pack_type_or_name,
1691- Address &address) {
1691+ Address &address, Value::ValueType &value_type ) {
16921692 Log *log (GetLog (LLDBLog::Types));
16931693 auto *reflection_ctx = GetReflectionContext ();
16941694 if (!reflection_ctx)
@@ -1915,7 +1915,9 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
19151915 CompilerType expanded_type = ts->RemangleAsType (dem, transformed);
19161916 pack_type_or_name.SetCompilerType (expanded_type);
19171917
1918- lldb::addr_t addr = in_value.GetAddressOf ();
1918+ AddressType address_type;
1919+ lldb::addr_t addr = in_value.GetAddressOf (true , &address_type);
1920+ value_type = Value::GetValueTypeFromAddressType (address_type);
19191921 if (indirect) {
19201922 Status status;
19211923 addr = m_process.ReadPointerFromMemory (addr, status);
@@ -1961,9 +1963,11 @@ static bool IsPrivateNSClass(NodePointer node) {
19611963bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Class (
19621964 ValueObject &in_value, CompilerType class_type,
19631965 lldb::DynamicValueType use_dynamic, TypeAndOrName &class_type_or_name,
1964- Address &address) {
1966+ Address &address, Value::ValueType &value_type ) {
19651967 AddressType address_type;
19661968 lldb::addr_t instance_ptr = in_value.GetPointerValue (&address_type);
1969+ value_type = Value::GetValueTypeFromAddressType (address_type);
1970+
19671971 if (instance_ptr == LLDB_INVALID_ADDRESS || instance_ptr == 0 )
19681972 return false ;
19691973
@@ -2707,25 +2711,29 @@ bool SwiftLanguageRuntime::GetAbstractTypeName(StreamString &name,
27072711bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Value (
27082712 ValueObject &in_value, CompilerType &bound_type,
27092713 lldb::DynamicValueType use_dynamic, TypeAndOrName &class_type_or_name,
2710- Address &address) {
2714+ Address &address, Value::ValueType &value_type) {
2715+ value_type = Value::ValueType::Invalid;
27112716 class_type_or_name.SetCompilerType (bound_type);
27122717
27132718 ExecutionContext exe_ctx = in_value.GetExecutionContextRef ().Lock (true );
27142719 llvm::Optional<uint64_t > size =
27152720 bound_type.GetByteSize (exe_ctx.GetBestExecutionContextScope ());
27162721 if (!size)
27172722 return false ;
2718- lldb::addr_t val_address = in_value.GetAddressOf (true , nullptr );
2723+ AddressType address_type;
2724+ lldb::addr_t val_address = in_value.GetAddressOf (true , &address_type);
27192725 if (*size && (!val_address || val_address == LLDB_INVALID_ADDRESS))
27202726 return false ;
27212727
2728+ value_type = Value::GetValueTypeFromAddressType (address_type);
27222729 address.SetLoadAddress (val_address, in_value.GetTargetSP ().get ());
27232730 return true ;
27242731}
27252732
27262733bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_IndirectEnumCase (
27272734 ValueObject &in_value, lldb::DynamicValueType use_dynamic,
2728- TypeAndOrName &class_type_or_name, Address &address) {
2735+ TypeAndOrName &class_type_or_name, Address &address,
2736+ Value::ValueType &value_type) {
27292737 static ConstString g_offset (" offset" );
27302738
27312739 DataExtractor data;
@@ -2779,7 +2787,6 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_IndirectEnumCase(
27792787 if (!valobj_sp)
27802788 return false ;
27812789
2782- Value::ValueType value_type;
27832790 if (!GetDynamicTypeAndAddress (*valobj_sp, use_dynamic, class_type_or_name,
27842791 address, value_type))
27852792 return false ;
@@ -2807,7 +2814,6 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_IndirectEnumCase(
28072814 if (!valobj_sp)
28082815 return false ;
28092816
2810- Value::ValueType value_type;
28112817 if (!GetDynamicTypeAndAddress (*valobj_sp, use_dynamic, class_type_or_name,
28122818 address, value_type))
28132819 return false ;
@@ -2851,8 +2857,8 @@ Process &SwiftLanguageRuntimeImpl::GetProcess() const {
28512857Value::ValueType
28522858SwiftLanguageRuntimeImpl::GetValueType (ValueObject &in_value,
28532859 CompilerType dynamic_type,
2860+ Value::ValueType static_value_type,
28542861 bool is_indirect_enum_case) {
2855- Value::ValueType static_value_type = in_value.GetValue ().GetValueType ();
28562862 CompilerType static_type = in_value.GetCompilerType ();
28572863 Flags static_type_flags (static_type.GetTypeInfo ());
28582864 Flags dynamic_type_flags (dynamic_type.GetTypeInfo ());
@@ -3057,19 +3063,20 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress(
30573063 if (!type_info.AnySet (eTypeIsSwift))
30583064 return false ;
30593065
3066+ Value::ValueType static_value_type = Value::ValueType::Invalid;
30603067 bool success = false ;
30613068 bool is_indirect_enum_case = IsIndirectEnumCase (in_value);
30623069 // Type kinds with instance metadata don't need generic type resolution.
30633070 if (is_indirect_enum_case)
30643071 success = GetDynamicTypeAndAddress_IndirectEnumCase (
3065- in_value, use_dynamic, class_type_or_name, address);
3072+ in_value, use_dynamic, class_type_or_name, address, static_value_type );
30663073 else if (type_info.AnySet (eTypeIsPack))
30673074 success = GetDynamicTypeAndAddress_Pack (in_value, val_type, use_dynamic,
3068- class_type_or_name, address);
3075+ class_type_or_name, address, static_value_type );
30693076 else if (type_info.AnySet (eTypeIsClass) ||
30703077 type_info.AllSet (eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue))
30713078 success = GetDynamicTypeAndAddress_Class (in_value, val_type, use_dynamic,
3072- class_type_or_name, address);
3079+ class_type_or_name, address, static_value_type );
30733080 else if (type_info.AnySet (eTypeIsProtocol))
30743081 success = GetDynamicTypeAndAddress_Protocol (in_value, val_type, use_dynamic,
30753082 class_type_or_name, address);
@@ -3090,20 +3097,28 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress(
30903097
30913098 Flags subst_type_info (bound_type.GetTypeInfo ());
30923099 if (subst_type_info.AnySet (eTypeIsClass)) {
3093- success = GetDynamicTypeAndAddress_Class (
3094- in_value, bound_type, use_dynamic, class_type_or_name, address);
3100+ success = GetDynamicTypeAndAddress_Class (in_value, bound_type,
3101+ use_dynamic, class_type_or_name,
3102+ address, static_value_type);
30953103 } else if (subst_type_info.AnySet (eTypeIsProtocol)) {
30963104 success = GetDynamicTypeAndAddress_Protocol (
30973105 in_value, bound_type, use_dynamic, class_type_or_name, address);
30983106 } else {
3099- success = GetDynamicTypeAndAddress_Value (
3100- in_value, bound_type, use_dynamic, class_type_or_name, address);
3107+ success = GetDynamicTypeAndAddress_Value (in_value, bound_type,
3108+ use_dynamic, class_type_or_name,
3109+ address, static_value_type);
31013110 }
31023111 }
31033112
3104- if (success)
3113+ if (success) {
3114+ // If we haven't found a better static value type, use the value object's
3115+ // one.
3116+ if (static_value_type == Value::ValueType::Invalid)
3117+ static_value_type = in_value.GetValue ().GetValueType ();
3118+
31053119 value_type = GetValueType (in_value, class_type_or_name.GetCompilerType (),
3106- is_indirect_enum_case);
3120+ static_value_type, is_indirect_enum_case);
3121+ }
31073122 return success;
31083123}
31093124
0 commit comments