Skip to content

Commit 35c8d4d

Browse files
committed
[lldb] Use the address type when discovering the dynamic address
Instead of trying to guess the value type after doing dynamic type resolution, use the address type when performing it instead.
1 parent cee7200 commit 35c8d4d

File tree

2 files changed

+43
-22
lines changed

2 files changed

+43
-22
lines changed

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeDynamicTypeResolution.cpp

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,7 +1688,7 @@ CreatePackType(swift::Demangle::Demangler &dem, TypeSystemSwiftTypeRef &ts,
16881688
bool 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) {
19611963
bool 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,
27072711
bool 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

27262733
bool 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 {
28512857
Value::ValueType
28522858
SwiftLanguageRuntimeImpl::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

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeImpl.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,17 +277,21 @@ class SwiftLanguageRuntimeImpl {
277277
// Classes that inherit from SwiftLanguageRuntime can see and modify these
278278
Value::ValueType GetValueType(ValueObject &in_value,
279279
CompilerType dynamic_type,
280+
Value::ValueType static_value_type,
280281
bool is_indirect_enum_case);
281282
bool GetDynamicTypeAndAddress_Pack(ValueObject &in_value,
282283
CompilerType pack_type,
283284
lldb::DynamicValueType use_dynamic,
284285
TypeAndOrName &class_type_or_name,
285-
Address &address);
286+
Address &address,
287+
Value::ValueType &value_type);
288+
286289
bool GetDynamicTypeAndAddress_Class(ValueObject &in_value,
287290
CompilerType class_type,
288291
lldb::DynamicValueType use_dynamic,
289292
TypeAndOrName &class_type_or_name,
290-
Address &address);
293+
Address &address,
294+
Value::ValueType &value_type);
291295

292296
bool GetDynamicTypeAndAddress_Protocol(ValueObject &in_value,
293297
CompilerType protocol_type,
@@ -299,11 +303,13 @@ class SwiftLanguageRuntimeImpl {
299303
CompilerType &bound_type,
300304
lldb::DynamicValueType use_dynamic,
301305
TypeAndOrName &class_type_or_name,
302-
Address &address);
306+
Address &address,
307+
Value::ValueType &value_type);
303308

304309
bool GetDynamicTypeAndAddress_IndirectEnumCase(
305310
ValueObject &in_value, lldb::DynamicValueType use_dynamic,
306-
TypeAndOrName &class_type_or_name, Address &address);
311+
TypeAndOrName &class_type_or_name, Address &address,
312+
Value::ValueType &value_type);
307313

308314
bool GetDynamicTypeAndAddress_ClangType(ValueObject &in_value,
309315
lldb::DynamicValueType use_dynamic,

0 commit comments

Comments
 (0)