Skip to content

Commit 3f96eff

Browse files
author
git apple-llvm automerger
committed
Merge commit '04e8b2d8e59d' from swift/release/5.9 into stable/20221013
2 parents 6189b49 + 04e8b2d commit 3f96eff

File tree

4 files changed

+59
-22
lines changed

4 files changed

+59
-22
lines changed

lldb/include/lldb/Core/Value.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ class Value {
145145

146146
void Clear();
147147

148+
static ValueType GetValueTypeFromAddressType(AddressType address_type);
149+
148150
protected:
149151
Scalar m_value;
150152
CompilerType m_compiler_type;

lldb/source/Core/Value.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,20 @@ AddressType Value::GetValueAddressType() const {
120120
return eAddressTypeInvalid;
121121
}
122122

123+
Value::ValueType Value::GetValueTypeFromAddressType(AddressType address_type) {
124+
switch (address_type) {
125+
case eAddressTypeFile:
126+
return Value::ValueType::FileAddress;
127+
case eAddressTypeLoad:
128+
return Value::ValueType::LoadAddress;
129+
case eAddressTypeHost:
130+
return Value::ValueType::HostAddress;
131+
case eAddressTypeInvalid:
132+
return Value::ValueType::Invalid;
133+
}
134+
llvm_unreachable("Unexpected address type!");
135+
}
136+
123137
RegisterInfo *Value::GetRegisterInfo() const {
124138
if (m_context_type == ContextType::RegisterInfo)
125139
return static_cast<RegisterInfo *>(m_context);

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

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,7 +1668,7 @@ CreatePackType(swift::Demangle::Demangler &dem, TypeSystemSwiftTypeRef &ts,
16681668
bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
16691669
ValueObject &in_value, CompilerType pack_type,
16701670
lldb::DynamicValueType use_dynamic, TypeAndOrName &pack_type_or_name,
1671-
Address &address) {
1671+
Address &address, Value::ValueType &value_type) {
16721672
Log *log(GetLog(LLDBLog::Types));
16731673
auto *reflection_ctx = GetReflectionContext();
16741674
if (!reflection_ctx)
@@ -1895,7 +1895,9 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
18951895
CompilerType expanded_type = ts->RemangleAsType(dem, transformed);
18961896
pack_type_or_name.SetCompilerType(expanded_type);
18971897

1898-
lldb::addr_t addr = in_value.GetAddressOf();
1898+
AddressType address_type;
1899+
lldb::addr_t addr = in_value.GetAddressOf(true, &address_type);
1900+
value_type = Value::GetValueTypeFromAddressType(address_type);
18991901
if (indirect) {
19001902
Status status;
19011903
addr = m_process.ReadPointerFromMemory(addr, status);
@@ -1943,9 +1945,11 @@ static bool IsPrivateNSClass(NodePointer node) {
19431945
bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Class(
19441946
ValueObject &in_value, CompilerType class_type,
19451947
lldb::DynamicValueType use_dynamic, TypeAndOrName &class_type_or_name,
1946-
Address &address) {
1948+
Address &address, Value::ValueType &value_type) {
19471949
AddressType address_type;
19481950
lldb::addr_t instance_ptr = in_value.GetPointerValue(&address_type);
1951+
value_type = Value::GetValueTypeFromAddressType(address_type);
1952+
19491953
if (instance_ptr == LLDB_INVALID_ADDRESS || instance_ptr == 0)
19501954
return false;
19511955

@@ -2689,25 +2693,29 @@ bool SwiftLanguageRuntime::GetAbstractTypeName(StreamString &name,
26892693
bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Value(
26902694
ValueObject &in_value, CompilerType &bound_type,
26912695
lldb::DynamicValueType use_dynamic, TypeAndOrName &class_type_or_name,
2692-
Address &address) {
2696+
Address &address, Value::ValueType &value_type) {
2697+
value_type = Value::ValueType::Invalid;
26932698
class_type_or_name.SetCompilerType(bound_type);
26942699

26952700
ExecutionContext exe_ctx = in_value.GetExecutionContextRef().Lock(true);
26962701
llvm::Optional<uint64_t> size =
26972702
bound_type.GetByteSize(exe_ctx.GetBestExecutionContextScope());
26982703
if (!size)
26992704
return false;
2700-
lldb::addr_t val_address = in_value.GetAddressOf(true, nullptr);
2705+
AddressType address_type;
2706+
lldb::addr_t val_address = in_value.GetAddressOf(true, &address_type);
27012707
if (*size && (!val_address || val_address == LLDB_INVALID_ADDRESS))
27022708
return false;
27032709

2710+
value_type = Value::GetValueTypeFromAddressType(address_type);
27042711
address.SetLoadAddress(val_address, in_value.GetTargetSP().get());
27052712
return true;
27062713
}
27072714

27082715
bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_IndirectEnumCase(
27092716
ValueObject &in_value, lldb::DynamicValueType use_dynamic,
2710-
TypeAndOrName &class_type_or_name, Address &address) {
2717+
TypeAndOrName &class_type_or_name, Address &address,
2718+
Value::ValueType &value_type) {
27112719
static ConstString g_offset("offset");
27122720

27132721
DataExtractor data;
@@ -2761,7 +2769,6 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_IndirectEnumCase(
27612769
if (!valobj_sp)
27622770
return false;
27632771

2764-
Value::ValueType value_type;
27652772
if (!GetDynamicTypeAndAddress(*valobj_sp, use_dynamic, class_type_or_name,
27662773
address, value_type))
27672774
return false;
@@ -2789,7 +2796,6 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_IndirectEnumCase(
27892796
if (!valobj_sp)
27902797
return false;
27912798

2792-
Value::ValueType value_type;
27932799
if (!GetDynamicTypeAndAddress(*valobj_sp, use_dynamic, class_type_or_name,
27942800
address, value_type))
27952801
return false;
@@ -2833,8 +2839,8 @@ Process &SwiftLanguageRuntimeImpl::GetProcess() const {
28332839
Value::ValueType
28342840
SwiftLanguageRuntimeImpl::GetValueType(ValueObject &in_value,
28352841
CompilerType dynamic_type,
2842+
Value::ValueType static_value_type,
28362843
bool is_indirect_enum_case) {
2837-
Value::ValueType static_value_type = in_value.GetValue().GetValueType();
28382844
CompilerType static_type = in_value.GetCompilerType();
28392845
Flags static_type_flags(static_type.GetTypeInfo());
28402846
Flags dynamic_type_flags(dynamic_type.GetTypeInfo());
@@ -3039,19 +3045,20 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress(
30393045
if (!type_info.AnySet(eTypeIsSwift))
30403046
return false;
30413047

3048+
Value::ValueType static_value_type = Value::ValueType::Invalid;
30423049
bool success = false;
30433050
bool is_indirect_enum_case = IsIndirectEnumCase(in_value);
30443051
// Type kinds with instance metadata don't need generic type resolution.
30453052
if (is_indirect_enum_case)
30463053
success = GetDynamicTypeAndAddress_IndirectEnumCase(
3047-
in_value, use_dynamic, class_type_or_name, address);
3054+
in_value, use_dynamic, class_type_or_name, address, static_value_type);
30483055
else if (type_info.AnySet(eTypeIsPack))
30493056
success = GetDynamicTypeAndAddress_Pack(in_value, val_type, use_dynamic,
3050-
class_type_or_name, address);
3057+
class_type_or_name, address, static_value_type);
30513058
else if (type_info.AnySet(eTypeIsClass) ||
30523059
type_info.AllSet(eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue))
30533060
success = GetDynamicTypeAndAddress_Class(in_value, val_type, use_dynamic,
3054-
class_type_or_name, address);
3061+
class_type_or_name, address, static_value_type);
30553062
else if (type_info.AnySet(eTypeIsProtocol))
30563063
success = GetDynamicTypeAndAddress_Protocol(in_value, val_type, use_dynamic,
30573064
class_type_or_name, address);
@@ -3072,20 +3079,28 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress(
30723079

30733080
Flags subst_type_info(bound_type.GetTypeInfo());
30743081
if (subst_type_info.AnySet(eTypeIsClass)) {
3075-
success = GetDynamicTypeAndAddress_Class(
3076-
in_value, bound_type, use_dynamic, class_type_or_name, address);
3082+
success = GetDynamicTypeAndAddress_Class(in_value, bound_type,
3083+
use_dynamic, class_type_or_name,
3084+
address, static_value_type);
30773085
} else if (subst_type_info.AnySet(eTypeIsProtocol)) {
30783086
success = GetDynamicTypeAndAddress_Protocol(
30793087
in_value, bound_type, use_dynamic, class_type_or_name, address);
30803088
} else {
3081-
success = GetDynamicTypeAndAddress_Value(
3082-
in_value, bound_type, use_dynamic, class_type_or_name, address);
3089+
success = GetDynamicTypeAndAddress_Value(in_value, bound_type,
3090+
use_dynamic, class_type_or_name,
3091+
address, static_value_type);
30833092
}
30843093
}
30853094

3086-
if (success)
3095+
if (success) {
3096+
// If we haven't found a better static value type, use the value object's
3097+
// one.
3098+
if (static_value_type == Value::ValueType::Invalid)
3099+
static_value_type = in_value.GetValue().GetValueType();
3100+
30873101
value_type = GetValueType(in_value, class_type_or_name.GetCompilerType(),
3088-
is_indirect_enum_case);
3102+
static_value_type, is_indirect_enum_case);
3103+
}
30893104
return success;
30903105
}
30913106

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)