@@ -260,6 +260,7 @@ bool ClassDescriptorV2::method_list_t::Read(Process *process,
260260 uint32_t entsize = extractor.GetU32_unchecked (&cursor);
261261 m_is_small = (entsize & 0x80000000 ) != 0 ;
262262 m_has_direct_selector = (entsize & 0x40000000 ) != 0 ;
263+ m_has_relative_types = (entsize & 0x20000000 ) != 0 ;
263264 m_entsize = entsize & 0xfffc ;
264265 m_count = extractor.GetU32_unchecked (&cursor);
265266 m_first_ptr = addr + cursor;
@@ -269,8 +270,9 @@ bool ClassDescriptorV2::method_list_t::Read(Process *process,
269270
270271llvm::SmallVector<ClassDescriptorV2::method_t , 0 >
271272ClassDescriptorV2::ReadMethods (llvm::ArrayRef<lldb::addr_t > addresses,
272- lldb::addr_t relative_selector_base_addr,
273- bool is_small, bool has_direct_sel) const {
273+ lldb::addr_t relative_string_base_addr,
274+ bool is_small, bool has_direct_sel,
275+ bool has_relative_types) const {
274276 lldb_private::Process *process = m_runtime.GetProcess ();
275277 if (!process)
276278 return {};
@@ -297,17 +299,18 @@ ClassDescriptorV2::ReadMethods(llvm::ArrayRef<lldb::addr_t> addresses,
297299 process->GetByteOrder (),
298300 process->GetAddressByteSize ());
299301 methods.push_back (method_t ());
300- methods.back ().Read (extractor, process, addr, relative_selector_base_addr ,
301- is_small, has_direct_sel);
302+ methods.back ().Read (extractor, process, addr, relative_string_base_addr ,
303+ is_small, has_direct_sel, has_relative_types );
302304 }
303305
304306 return methods;
305307}
306308
307309bool ClassDescriptorV2::method_t::Read (DataExtractor &extractor,
308310 Process *process, lldb::addr_t addr,
309- lldb::addr_t relative_selector_base_addr,
310- bool is_small, bool has_direct_sel) {
311+ lldb::addr_t relative_string_base_addr,
312+ bool is_small, bool has_direct_sel,
313+ bool has_relative_types) {
311314 lldb::offset_t cursor = 0 ;
312315
313316 if (is_small) {
@@ -323,10 +326,13 @@ bool ClassDescriptorV2::method_t::Read(DataExtractor &extractor,
323326 m_name_ptr = process->ReadPointerFromMemory (m_name_ptr, error);
324327 if (error.Fail ())
325328 return false ;
326- } else if (relative_selector_base_addr != LLDB_INVALID_ADDRESS) {
327- m_name_ptr = relative_selector_base_addr + nameref_offset;
329+ } else if (relative_string_base_addr != LLDB_INVALID_ADDRESS) {
330+ m_name_ptr = relative_string_base_addr + nameref_offset;
328331 }
329- m_types_ptr = addr + 4 + types_offset;
332+ if (has_relative_types)
333+ m_types_ptr = relative_string_base_addr + types_offset;
334+ else
335+ m_types_ptr = addr + 4 + types_offset;
330336 m_imp_ptr = addr + 8 + imp_offset;
331337 } else {
332338 m_name_ptr = extractor.GetAddress_unchecked (&cursor);
@@ -481,7 +487,8 @@ bool ClassDescriptorV2::ProcessMethodList(
481487
482488 llvm::SmallVector<method_t , 0 > methods =
483489 ReadMethods (addresses, m_runtime.GetRelativeSelectorBaseAddr (),
484- method_list.m_is_small , method_list.m_has_direct_selector );
490+ method_list.m_is_small , method_list.m_has_direct_selector ,
491+ method_list.m_has_relative_types );
485492
486493 for (const auto &method : methods)
487494 if (instance_method_func (method.m_name .c_str (), method.m_types .c_str ()))
0 commit comments