[Lldb-commits] [lldb] 4a674b6 - [lldb/ObjC] Add support for direct selector references

Fred Riss via lldb-commits lldb-commits at lists.llvm.org
Wed Jul 1 20:30:47 PDT 2020


Author: Fred Riss
Date: 2020-07-01T20:27:37-07:00
New Revision: 4a674b623796dc5c5778fc6998f788044137d61d

URL: https://github.com/llvm/llvm-project/commit/4a674b623796dc5c5778fc6998f788044137d61d
DIFF: https://github.com/llvm/llvm-project/commit/4a674b623796dc5c5778fc6998f788044137d61d.diff

LOG: [lldb/ObjC] Add support for direct selector references

On macOS 11 (and other aligned OSs), the shared cache method
lists get an additional optimization which removes one level
of indirection to get to the selector.
This patch supports this new optimization. Both codepaths are
covered byt the existing Objective-C tests.

Added: 
    

Modified: 
    lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
    lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h

Removed: 
    


################################################################################
diff  --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
index ff9c86608b8a..bdd5c29db848 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
@@ -243,6 +243,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_entsize = entsize & 0xfffc;
   m_count = extractor.GetU32_unchecked(&cursor);
   m_first_ptr = addr + cursor;
@@ -251,7 +252,7 @@ bool ClassDescriptorV2::method_list_t::Read(Process *process,
 }
 
 bool ClassDescriptorV2::method_t::Read(Process *process, lldb::addr_t addr,
-                                       bool is_small) {
+                                       bool is_small, bool has_direct_sel) {
   size_t ptr_size = process->GetAddressByteSize();
   size_t size = GetSize(process, is_small);
 
@@ -272,12 +273,15 @@ bool ClassDescriptorV2::method_t::Read(Process *process, lldb::addr_t addr,
     uint32_t types_offset = extractor.GetU32_unchecked(&cursor);
     uint32_t imp_offset = extractor.GetU32_unchecked(&cursor);
 
-    // The SEL offset points to a SELRef. We need to dereference twice.
-    lldb::addr_t selref_addr = addr + nameref_offset;
-    m_name_ptr =
-        process->ReadUnsignedIntegerFromMemory(selref_addr, ptr_size, 0, error);
-    if (!error.Success())
-      return false;
+    m_name_ptr = addr + nameref_offset;
+
+    if (!has_direct_sel) {
+      // The SEL offset points to a SELRef. We need to dereference twice.
+      m_name_ptr = process->ReadUnsignedIntegerFromMemory(m_name_ptr, ptr_size,
+                                                          0, error);
+      if (!error.Success())
+        return false;
+    }
     m_types_ptr = addr + 4 + types_offset;
     m_imp_ptr = addr + 8 + imp_offset;
   } else {
@@ -380,6 +384,8 @@ bool ClassDescriptorV2::Describe(
       return false;
 
     bool is_small = base_method_list->m_is_small;
+    bool has_direct_selector = base_method_list->m_has_direct_selector;
+
     if (base_method_list->m_entsize != method_t::GetSize(process, is_small))
       return false;
 
@@ -390,7 +396,7 @@ bool ClassDescriptorV2::Describe(
       method->Read(process,
                    base_method_list->m_first_ptr +
                        (i * base_method_list->m_entsize),
-                   is_small);
+                   is_small, has_direct_selector);
 
       if (instance_method_func(method->m_name.c_str(), method->m_types.c_str()))
         break;

diff  --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h
index a8db060c5b56..9ef21c6e7208 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h
@@ -135,6 +135,7 @@ class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor {
   struct method_list_t {
     uint16_t m_entsize;
     bool m_is_small;
+    bool m_has_direct_selector;
     uint32_t m_count;
     lldb::addr_t m_first_ptr;
 
@@ -161,7 +162,7 @@ class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor {
              + field_size; // IMP imp;
     }
 
-    bool Read(Process *process, lldb::addr_t addr, bool);
+    bool Read(Process *process, lldb::addr_t addr, bool, bool);
   };
 
   struct ivar_list_t {


        


More information about the lldb-commits mailing list