Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ bool ClassDescriptorV2::method_list_t::Read(Process *process,
uint32_t entsize = extractor.GetU32_unchecked(&cursor);
m_is_small = (entsize & 0x80000000) != 0;
m_has_direct_selector = (entsize & 0x40000000) != 0;
m_has_relative_types = (entsize & 0x20000000) != 0;
m_entsize = entsize & 0xfffc;
m_count = extractor.GetU32_unchecked(&cursor);
m_first_ptr = addr + cursor;
Expand All @@ -269,8 +270,9 @@ bool ClassDescriptorV2::method_list_t::Read(Process *process,

llvm::SmallVector<ClassDescriptorV2::method_t, 0>
ClassDescriptorV2::ReadMethods(llvm::ArrayRef<lldb::addr_t> addresses,
lldb::addr_t relative_selector_base_addr,
bool is_small, bool has_direct_sel) const {
lldb::addr_t relative_string_base_addr,
bool is_small, bool has_direct_sel,
bool has_relative_types) const {
lldb_private::Process *process = m_runtime.GetProcess();
if (!process)
return {};
Expand All @@ -297,17 +299,18 @@ ClassDescriptorV2::ReadMethods(llvm::ArrayRef<lldb::addr_t> addresses,
process->GetByteOrder(),
process->GetAddressByteSize());
methods.push_back(method_t());
methods.back().Read(extractor, process, addr, relative_selector_base_addr,
is_small, has_direct_sel);
methods.back().Read(extractor, process, addr, relative_string_base_addr,
is_small, has_direct_sel, has_relative_types);
}

return methods;
}

bool ClassDescriptorV2::method_t::Read(DataExtractor &extractor,
Process *process, lldb::addr_t addr,
lldb::addr_t relative_selector_base_addr,
bool is_small, bool has_direct_sel) {
lldb::addr_t relative_string_base_addr,
bool is_small, bool has_direct_sel,
bool has_relative_types) {
lldb::offset_t cursor = 0;

if (is_small) {
Expand All @@ -323,10 +326,13 @@ bool ClassDescriptorV2::method_t::Read(DataExtractor &extractor,
m_name_ptr = process->ReadPointerFromMemory(m_name_ptr, error);
if (error.Fail())
return false;
} else if (relative_selector_base_addr != LLDB_INVALID_ADDRESS) {
m_name_ptr = relative_selector_base_addr + nameref_offset;
} else if (relative_string_base_addr != LLDB_INVALID_ADDRESS) {
m_name_ptr = relative_string_base_addr + nameref_offset;
}
m_types_ptr = addr + 4 + types_offset;
if (has_relative_types)
m_types_ptr = relative_string_base_addr + types_offset;
else
m_types_ptr = addr + 4 + types_offset;
m_imp_ptr = addr + 8 + imp_offset;
} else {
m_name_ptr = extractor.GetAddress_unchecked(&cursor);
Expand Down Expand Up @@ -481,7 +487,8 @@ bool ClassDescriptorV2::ProcessMethodList(

llvm::SmallVector<method_t, 0> methods =
ReadMethods(addresses, m_runtime.GetRelativeSelectorBaseAddr(),
method_list.m_is_small, method_list.m_has_direct_selector);
method_list.m_is_small, method_list.m_has_direct_selector,
method_list.m_has_relative_types);

for (const auto &method : methods)
if (instance_method_func(method.m_name.c_str(), method.m_types.c_str()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor {
uint16_t m_entsize;
bool m_is_small;
bool m_has_direct_selector;
bool m_has_relative_types;
uint32_t m_count;
lldb::addr_t m_first_ptr;

Expand Down Expand Up @@ -173,14 +174,14 @@ class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor {
}

bool Read(DataExtractor &extractor, Process *process, lldb::addr_t addr,
lldb::addr_t relative_selector_base_addr, bool is_small,
bool has_direct_sel);
lldb::addr_t relative_string_base_addr, bool is_small,
bool has_direct_sel, bool has_relative_types);
};

llvm::SmallVector<method_t, 0>
ReadMethods(llvm::ArrayRef<lldb::addr_t> addresses,
lldb::addr_t relative_selector_base_addr, bool is_small,
bool has_direct_sel) const;
lldb::addr_t relative_string_base_addr, bool is_small,
bool has_direct_sel, bool has_relative_types) const;

struct ivar_list_t {
uint32_t m_entsize;
Expand Down
Loading