Skip to content

Commit e56ea28

Browse files
Merge pull request #1822 from adrian-prantl/refactor-foreach
Factor out ForEachSuperClassTypeInfo (NFC)
2 parents 6c69ba3 + d8d1112 commit e56ea28

File tree

6 files changed

+114
-87
lines changed

6 files changed

+114
-87
lines changed

lldb/include/lldb/Target/SwiftLanguageRuntime.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ class SwiftLanguageRuntime : public LanguageRuntime {
249249
/// \param instance_type
250250
llvm::Optional<uint64_t> GetMemberVariableOffset(CompilerType instance_type,
251251
ValueObject *instance,
252-
ConstString member_name,
252+
llvm::StringRef member_name,
253253
Status *error = nullptr);
254254

255255
/// Ask Remote Mirrors for the size of a Swift type.

lldb/source/Plugins/Language/Swift/SwiftHashedContainer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ NativeHashedStorageHandler::NativeHashedStorageHandler(
463463
if (llvm::isa<::swift::TupleType>(swift_type)) {
464464
Status error;
465465
llvm::Optional<uint64_t> result = runtime->GetMemberVariableOffset(
466-
{swift_ast, swift_type}, nativeStorage_sp.get(), ConstString("1"),
466+
{swift_ast, swift_type}, nativeStorage_sp.get(), "1",
467467
&error);
468468
if (result)
469469
m_key_stride_padded = result.getValue();

lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6851,8 +6851,8 @@ static llvm::Optional<uint64_t> GetInstanceVariableOffset_Metadata(
68516851
}
68526852

68536853
Status error;
6854-
llvm::Optional<uint64_t> offset = runtime->GetMemberVariableOffset(
6855-
type, valobj, ConstString(ivar_name), &error);
6854+
llvm::Optional<uint64_t> offset =
6855+
runtime->GetMemberVariableOffset(type, valobj, ivar_name, &error);
68566856
if (offset)
68576857
LOG_PRINTF(LIBLLDB_LOG_TYPES, "for %s: %llu", ivar_name.str().c_str(),
68586858
*offset);

lldb/source/Target/SwiftLanguageRuntime.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ class SwiftLanguageRuntimeStub {
228228

229229
llvm::Optional<uint64_t> GetMemberVariableOffset(CompilerType instance_type,
230230
ValueObject *instance,
231-
ConstString member_name,
231+
llvm::StringRef member_name,
232232
Status *error) {
233233
STUB_LOG();
234234
return {};
@@ -2082,8 +2082,8 @@ bool SwiftLanguageRuntime::IsStoredInlineInBuffer(CompilerType type) {
20822082
}
20832083

20842084
llvm::Optional<uint64_t> SwiftLanguageRuntime::GetMemberVariableOffset(
2085-
CompilerType instance_type, ValueObject *instance, ConstString member_name,
2086-
Status *error) {
2085+
CompilerType instance_type, ValueObject *instance,
2086+
llvm::StringRef member_name, Status *error) {
20872087
FORWARD(GetMemberVariableOffset, instance_type, instance, member_name, error);
20882088
}
20892089

lldb/source/Target/SwiftLanguageRuntimeDynamicTypeResolution.cpp

Lines changed: 94 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,7 @@ SwiftLanguageRuntimeImpl::emplaceClangTypeInfo(
765765
llvm::Optional<uint64_t>
766766
SwiftLanguageRuntimeImpl::GetMemberVariableOffsetRemoteAST(
767767
CompilerType instance_type, ValueObject *instance,
768-
ConstString member_name) {
768+
llvm::StringRef member_name) {
769769
auto *scratch_ctx =
770770
llvm::cast<SwiftASTContext>(instance_type.GetTypeSystem());
771771
if (scratch_ctx->HasFatalErrors())
@@ -777,7 +777,7 @@ SwiftLanguageRuntimeImpl::GetMemberVariableOffsetRemoteAST(
777777
GetCanonicalSwiftType(instance_type).getPointer();
778778

779779
// Perform the cache lookup.
780-
MemberID key{swift_type, member_name.GetCString()};
780+
MemberID key{swift_type, ConstString(member_name).GetCString()};
781781
auto it = m_member_offsets.find(key);
782782
if (it != m_member_offsets.end())
783783
return it->second;
@@ -818,7 +818,7 @@ SwiftLanguageRuntimeImpl::GetMemberVariableOffsetRemoteAST(
818818
bound.GetTypeName().AsCString());
819819

820820
swift_type = GetCanonicalSwiftType(bound).getPointer();
821-
MemberID key{swift_type, member_name.GetCString()};
821+
MemberID key{swift_type, ConstString(member_name).GetCString()};
822822
auto it = m_member_offsets.find(key);
823823
if (it != m_member_offsets.end())
824824
return it->second;
@@ -834,15 +834,15 @@ SwiftLanguageRuntimeImpl::GetMemberVariableOffsetRemoteAST(
834834

835835
// Use RemoteAST to determine the member offset.
836836
if (safe_to_use_remote_ast) {
837-
swift::remoteAST::Result<uint64_t> result = remote_ast->getOffsetOfMember(
838-
swift_type, optmeta, member_name.GetStringRef());
837+
swift::remoteAST::Result<uint64_t> result =
838+
remote_ast->getOffsetOfMember(swift_type, optmeta, member_name);
839839
if (result) {
840840
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
841841
"[MemberVariableOffsetResolver] offset discovered = %" PRIu64,
842842
(uint64_t)result.getValue());
843843

844844
// Cache this result.
845-
MemberID key{swift_type, member_name.GetCString()};
845+
MemberID key{swift_type, ConstString(member_name).GetCString()};
846846
m_member_offsets.insert({key, result.getValue()});
847847
return result.getValue();
848848
}
@@ -856,8 +856,10 @@ SwiftLanguageRuntimeImpl::GetMemberVariableOffsetRemoteAST(
856856
}
857857

858858
llvm::Optional<uint64_t> SwiftLanguageRuntimeImpl::GetMemberVariableOffsetRemoteMirrors(
859-
CompilerType instance_type, ValueObject *instance, ConstString member_name,
859+
CompilerType instance_type, ValueObject *instance, llvm::StringRef member_name,
860860
Status *error) {
861+
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
862+
"using remote mirrors");
861863
auto *ts = llvm::dyn_cast_or_null<TypeSystemSwiftTypeRef>(
862864
instance_type.GetTypeSystem());
863865
if (!ts) {
@@ -866,86 +868,66 @@ llvm::Optional<uint64_t> SwiftLanguageRuntimeImpl::GetMemberVariableOffsetRemote
866868
return {};
867869
}
868870

869-
// Try remote mirrors.
870-
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
871-
"[GetMemberVariableOffsetRemoteMirrors] using remote mirrors");
872-
if (const swift::reflection::TypeInfo *type_info = GetTypeInfo(
873-
instance_type,
874-
instance ? instance->GetExecutionContextRef().GetFrameSP().get()
875-
: nullptr)) {
876-
auto record_type_info =
877-
llvm::dyn_cast<swift::reflection::RecordTypeInfo>(type_info);
878-
if (record_type_info) {
879-
// Handle tuples.
880-
LLDB_LOGF(
881-
GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
882-
"[GetMemberVariableOffsetRemoteMirrors] using record type info");
883-
if (record_type_info->getRecordKind() ==
884-
swift::reflection::RecordKind::Tuple) {
885-
unsigned tuple_idx;
886-
if (member_name.GetStringRef().getAsInteger(10, tuple_idx) ||
887-
tuple_idx >= record_type_info->getNumFields()) {
888-
if (error)
889-
error->SetErrorString("tuple index out of bounds");
890-
return {};
891-
}
892-
return record_type_info->getFields()[tuple_idx].Offset;
893-
}
894-
895-
// Handle other record types.
896-
for (auto &field : record_type_info->getFields()) {
897-
if (ConstString(field.Name) == member_name)
898-
return field.Offset;
871+
// Try the static type metadata.
872+
auto frame = instance ? instance->GetExecutionContextRef().GetFrameSP().get()
873+
: nullptr;
874+
if (auto *ti = llvm::dyn_cast_or_null<swift::reflection::RecordTypeInfo>(
875+
GetTypeInfo(instance_type, frame))) {
876+
auto fields = ti->getFields();
877+
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
878+
"using record type info");
879+
880+
// Handle tuples.
881+
if (ti->getRecordKind() == swift::reflection::RecordKind::Tuple) {
882+
unsigned tuple_idx;
883+
if (member_name.getAsInteger(10, tuple_idx) ||
884+
tuple_idx >= ti->getNumFields()) {
885+
if (error)
886+
error->SetErrorString("tuple index out of bounds");
887+
return {};
899888
}
889+
return fields[tuple_idx].Offset;
900890
}
901-
}
902891

903-
lldb::addr_t pointer = instance->GetPointerValue();
904-
auto *reflection_ctx = GetReflectionContext();
905-
if (!reflection_ctx)
906-
return {};
907-
908-
auto find_field =
909-
[&](const swift::reflection::TypeInfo *ti) -> llvm::Optional<uint64_t> {
910-
auto class_type_info =
911-
llvm::dyn_cast_or_null<swift::reflection::RecordTypeInfo>(ti);
912-
if (class_type_info) {
913-
for (auto &field : class_type_info->getFields()) {
914-
if (ConstString(field.Name) == member_name)
915-
return field.Offset;
916-
}
917-
}
918-
return {};
919-
};
920-
921-
LLDBTypeInfoProvider provider(*this, *ts);
922-
auto md_ptr = reflection_ctx->readMetadataFromInstance(pointer);
923-
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
924-
"[GetMemberVariableOffsetRemoteMirrors] using instance type info");
925-
while (md_ptr && *md_ptr) {
926-
if (auto offset =
927-
find_field(reflection_ctx->getMetadataTypeInfo(*md_ptr, &provider)))
928-
return offset;
929-
930-
// Continue with the base class.
931-
md_ptr = reflection_ctx->readSuperClassFromClassMetadata(*md_ptr);
892+
// Handle other record types.
893+
for (auto &field : fields)
894+
if (StringRef(field.Name) == member_name)
895+
return field.Offset;
932896
}
933897

934-
return {};
898+
// Try the instance type metadata.
899+
bool did_log = false;
900+
llvm::Optional<uint64_t> result;
901+
if (instance)
902+
ForEachSuperClassTypeInfo(
903+
*instance, [&](const swift::reflection::RecordTypeInfo &ti) -> bool {
904+
if (!did_log) {
905+
did_log = true;
906+
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
907+
"using instance type info");
908+
}
909+
for (auto &field : ti.getFields())
910+
if (StringRef(field.Name) == member_name) {
911+
result = field.Offset;
912+
return true;
913+
}
914+
return false;
915+
});
916+
917+
return result;
935918
}
936919

937-
938920
llvm::Optional<uint64_t> SwiftLanguageRuntimeImpl::GetMemberVariableOffset(
939-
CompilerType instance_type, ValueObject *instance, ConstString member_name,
940-
Status *error) {
921+
CompilerType instance_type, ValueObject *instance,
922+
llvm::StringRef member_name, Status *error) {
941923
llvm::Optional<uint64_t> offset;
942924

943925
if (!instance_type.IsValid())
944926
return {};
945927

946928
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
947929
"[GetMemberVariableOffset] asked to resolve offset for member %s",
948-
member_name.AsCString());
930+
member_name.str().c_str());
949931

950932
// Using the module context for RemoteAST is cheaper bit only safe
951933
// when there is no dynamic type resolution involved.
@@ -984,16 +966,54 @@ llvm::Optional<uint64_t> SwiftLanguageRuntimeImpl::GetMemberVariableOffset(
984966
if (offset) {
985967
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
986968
"[GetMemberVariableOffset] offset of %s is %d",
987-
member_name.AsCString(), *offset);
969+
member_name.str().c_str(), *offset);
988970
} else {
989971
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
990972
"[GetMemberVariableOffset] failed for %s",
991-
member_name.AsCString());
973+
member_name.str().c_str());
992974
if (error)
993975
error->SetErrorStringWithFormat("could not resolve member offset");
994976
}
995977
return offset;
996978
}
979+
980+
bool SwiftLanguageRuntimeImpl::ForEachSuperClassTypeInfo(
981+
ValueObject &instance,
982+
std::function<bool(const swift::reflection::RecordTypeInfo &rti)> fn) {
983+
lldb::addr_t pointer = instance.GetPointerValue();
984+
auto *reflection_ctx = GetReflectionContext();
985+
if (!reflection_ctx)
986+
return false;
987+
988+
auto *ts = llvm::dyn_cast_or_null<TypeSystemSwiftTypeRef>(
989+
instance.GetCompilerType().GetTypeSystem());
990+
if (!ts)
991+
return false;
992+
993+
LLDBTypeInfoProvider provider(*this, *ts);
994+
auto md_ptr = reflection_ctx->readMetadataFromInstance(pointer);
995+
if (!md_ptr)
996+
return false;
997+
998+
// Class object.
999+
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
1000+
"found RecordTypeInfo for instance");
1001+
while (md_ptr && *md_ptr) {
1002+
auto *ti = reflection_ctx->getMetadataTypeInfo(*md_ptr, &provider);
1003+
if (auto *class_type_info =
1004+
llvm::dyn_cast_or_null<swift::reflection::RecordTypeInfo>(ti)) {
1005+
if (fn(*class_type_info))
1006+
return true;
1007+
}
1008+
1009+
// Continue with the base class.
1010+
md_ptr = reflection_ctx->readSuperClassFromClassMetadata(*md_ptr);
1011+
}
1012+
return false;
1013+
}
1014+
1015+
1016+
9971017
bool SwiftLanguageRuntime::IsSelf(Variable &variable) {
9981018
// A variable is self if its name if "self", and it's either a
9991019
// function argument or a local variable and it's scope is a

lldb/source/Target/SwiftLanguageRuntimeImpl.h

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,13 @@ class SwiftLanguageRuntimeImpl {
100100
llvm::Optional<uint64_t>
101101
GetMemberVariableOffsetRemoteAST(CompilerType instance_type,
102102
ValueObject *instance,
103-
ConstString member_name);
104-
llvm::Optional<uint64_t>
105-
GetMemberVariableOffsetRemoteMirrors(CompilerType instance_type,
106-
ValueObject *instance,
107-
ConstString member_name, Status *error);
103+
llvm::StringRef member_name);
104+
llvm::Optional<uint64_t> GetMemberVariableOffsetRemoteMirrors(
105+
CompilerType instance_type, ValueObject *instance,
106+
llvm::StringRef member_name, Status *error);
108107
llvm::Optional<uint64_t> GetMemberVariableOffset(CompilerType instance_type,
109108
ValueObject *instance,
110-
ConstString member_name,
109+
llvm::StringRef member_name,
111110
Status *error);
112111

113112
/// Like \p BindGenericTypeParameters but for TypeSystemSwiftTypeRef.
@@ -162,6 +161,14 @@ class SwiftLanguageRuntimeImpl {
162161
const swift::reflection::TypeRef *GetTypeRef(CompilerType type,
163162
Module *module = nullptr);
164163

164+
/// If \p instance points to a Swift object, retrieve its
165+
/// RecordTypeInfo pass it to the callback \p fn. Repeat the process
166+
/// with all superclasses. If \p fn returns \p true, early exit and
167+
/// return \ptrue. Otherwise return \p false.
168+
bool ForEachSuperClassTypeInfo(
169+
ValueObject &instance,
170+
std::function<bool(const swift::reflection::RecordTypeInfo &rti)> fn);
171+
165172
// Classes that inherit from SwiftLanguageRuntime can see and modify these
166173
Value::ValueType GetValueType(Value::ValueType static_value_type,
167174
CompilerType static_type,

0 commit comments

Comments
 (0)