[Lldb-commits] [lldb] afddfe0 - [lldb][NFCI] Cleanup AppleObjCClassDescriptorV2::class_ro_t API (#200213)

via lldb-commits lldb-commits at lists.llvm.org
Fri May 29 02:47:19 PDT 2026


Author: Felipe de Azevedo Piovezan
Date: 2026-05-29T10:47:13+01:00
New Revision: afddfe074afb19681e2d7628f37f5d621df2ff3a

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

LOG: [lldb][NFCI] Cleanup AppleObjCClassDescriptorV2::class_ro_t API (#200213)

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 4ab0413f0773a..2180787437e6b 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
@@ -78,7 +78,8 @@ ClassDescriptorV2::objc_class_t::Read(Process *process, lldb::addr_t addr) {
   return objc_class_t{isa, superclass, cache_ptr, vtable_ptr, data_ptr, flags};
 }
 
-bool ClassDescriptorV2::class_rw_t::Read(Process *process, lldb::addr_t addr) {
+llvm::Expected<ClassDescriptorV2::class_rw_t>
+ClassDescriptorV2::class_rw_t::Read(Process *process, lldb::addr_t addr) {
   size_t ptr_size = process->GetAddressByteSize();
 
   size_t size = sizeof(uint32_t)   // uint32_t flags;
@@ -95,40 +96,42 @@ bool ClassDescriptorV2::class_rw_t::Read(Process *process, lldb::addr_t addr) {
   Status error;
 
   process->ReadMemory(addr, buffer.GetBytes(), size, error);
-  if (error.Fail()) {
-    return false;
-  }
+  if (error.Fail())
+    return error.takeError();
 
   DataExtractor extractor(buffer.GetBytes(), size, process->GetByteOrder(),
                           process->GetAddressByteSize());
 
+  class_rw_t result{};
   lldb::offset_t cursor = 0;
-  m_flags = extractor.GetU32_unchecked(&cursor);
-  m_version = extractor.GetU32_unchecked(&cursor);
-  m_ro_ptr = extractor.GetAddress_unchecked(&cursor);
+  result.m_flags = extractor.GetU32_unchecked(&cursor);
+  result.m_version = extractor.GetU32_unchecked(&cursor);
+  result.m_ro_ptr = extractor.GetAddress_unchecked(&cursor);
   if (ABISP abi_sp = process->GetABI())
-    m_ro_ptr = abi_sp->FixCodeAddress(m_ro_ptr);
-  m_method_list_ptr = extractor.GetAddress_unchecked(&cursor);
-  m_properties_ptr = extractor.GetAddress_unchecked(&cursor);
+    result.m_ro_ptr = abi_sp->FixCodeAddress(result.m_ro_ptr);
+  result.m_method_list_ptr = extractor.GetAddress_unchecked(&cursor);
+  result.m_properties_ptr = extractor.GetAddress_unchecked(&cursor);
 
-  if (m_ro_ptr & 1) {
+  if (result.m_ro_ptr & 1) {
     DataBufferHeap buffer(ptr_size, '\0');
-    process->ReadMemory(m_ro_ptr ^ 1, buffer.GetBytes(), ptr_size, error);
+    process->ReadMemory(result.m_ro_ptr ^ 1, buffer.GetBytes(), ptr_size,
+                        error);
     if (error.Fail())
-      return false;
+      return error.takeError();
     DataExtractor extractor(buffer.GetBytes(), ptr_size,
                             process->GetByteOrder(),
                             process->GetAddressByteSize());
     lldb::offset_t cursor = 0;
-    m_ro_ptr = extractor.GetAddress_unchecked(&cursor);
+    result.m_ro_ptr = extractor.GetAddress_unchecked(&cursor);
     if (ABISP abi_sp = process->GetABI())
-      m_ro_ptr = abi_sp->FixCodeAddress(m_ro_ptr);
+      result.m_ro_ptr = abi_sp->FixCodeAddress(result.m_ro_ptr);
   }
 
-  return true;
+  return result;
 }
 
-bool ClassDescriptorV2::class_ro_t::Read(Process *process, lldb::addr_t addr) {
+llvm::Expected<ClassDescriptorV2::class_ro_t>
+ClassDescriptorV2::class_ro_t::Read(Process *process, lldb::addr_t addr) {
   size_t ptr_size = process->GetAddressByteSize();
 
   size_t size = sizeof(uint32_t)   // uint32_t flags;
@@ -148,82 +151,60 @@ bool ClassDescriptorV2::class_ro_t::Read(Process *process, lldb::addr_t addr) {
   Status error;
 
   process->ReadMemory(addr, buffer.GetBytes(), size, error);
-  if (error.Fail()) {
-    return false;
-  }
+  if (error.Fail())
+    return error.takeError();
 
   DataExtractor extractor(buffer.GetBytes(), size, process->GetByteOrder(),
                           process->GetAddressByteSize());
 
+  class_ro_t result{};
   lldb::offset_t cursor = 0;
 
-  m_flags = extractor.GetU32_unchecked(&cursor);
-  m_instanceStart = extractor.GetU32_unchecked(&cursor);
-  m_instanceSize = extractor.GetU32_unchecked(&cursor);
+  result.m_flags = extractor.GetU32_unchecked(&cursor);
+  result.m_instanceStart = extractor.GetU32_unchecked(&cursor);
+  result.m_instanceSize = extractor.GetU32_unchecked(&cursor);
   if (ptr_size == 8)
-    m_reserved = extractor.GetU32_unchecked(&cursor);
+    result.m_reserved = extractor.GetU32_unchecked(&cursor);
   else
-    m_reserved = 0;
-  m_ivarLayout_ptr = extractor.GetAddress_unchecked(&cursor);
-  m_name_ptr = extractor.GetAddress_unchecked(&cursor);
-  m_baseMethods_ptr = extractor.GetAddress_unchecked(&cursor);
-  m_baseProtocols_ptr = extractor.GetAddress_unchecked(&cursor);
-  m_ivars_ptr = extractor.GetAddress_unchecked(&cursor);
-  m_weakIvarLayout_ptr = extractor.GetAddress_unchecked(&cursor);
-  m_baseProperties_ptr = extractor.GetAddress_unchecked(&cursor);
+    result.m_reserved = 0;
+  result.m_ivarLayout_ptr = extractor.GetAddress_unchecked(&cursor);
+  result.m_name_ptr = extractor.GetAddress_unchecked(&cursor);
+  result.m_baseMethods_ptr = extractor.GetAddress_unchecked(&cursor);
+  result.m_baseProtocols_ptr = extractor.GetAddress_unchecked(&cursor);
+  result.m_ivars_ptr = extractor.GetAddress_unchecked(&cursor);
+  result.m_weakIvarLayout_ptr = extractor.GetAddress_unchecked(&cursor);
+  result.m_baseProperties_ptr = extractor.GetAddress_unchecked(&cursor);
 
   DataBufferHeap name_buf(1024, '\0');
 
-  process->ReadCStringFromMemory(m_name_ptr, (char *)name_buf.GetBytes(),
+  process->ReadCStringFromMemory(result.m_name_ptr, (char *)name_buf.GetBytes(),
                                  name_buf.GetByteSize(), error);
 
-  if (error.Fail()) {
-    return false;
-  }
+  if (error.Fail())
+    return error.takeError();
 
-  m_name.assign((char *)name_buf.GetBytes());
+  result.m_name.assign((char *)name_buf.GetBytes());
 
-  return true;
+  return result;
 }
 
-bool ClassDescriptorV2::Read_class_row(
-    Process *process, const objc_class_t &objc_class,
-    std::unique_ptr<class_ro_t> &class_ro,
-    std::unique_ptr<class_rw_t> &class_rw) const {
-  class_ro.reset();
-  class_rw.reset();
-
+llvm::Expected<ClassDescriptorV2::class_ro_t>
+ClassDescriptorV2::Read_class_row(Process *process,
+                                  const objc_class_t &objc_class) {
   Status error;
   uint32_t class_row_t_flags = process->ReadUnsignedIntegerFromMemory(
       objc_class.m_data_ptr, sizeof(uint32_t), 0, error);
   if (!error.Success())
-    return false;
+    return error.takeError();
 
   if (class_row_t_flags & RW_REALIZED) {
-    class_rw = std::make_unique<class_rw_t>();
-
-    if (!class_rw->Read(process, objc_class.m_data_ptr)) {
-      class_rw.reset();
-      return false;
-    }
-
-    class_ro = std::make_unique<class_ro_t>();
-
-    if (!class_ro->Read(process, class_rw->m_ro_ptr)) {
-      class_rw.reset();
-      class_ro.reset();
-      return false;
-    }
-  } else {
-    class_ro = std::make_unique<class_ro_t>();
-
-    if (!class_ro->Read(process, objc_class.m_data_ptr)) {
-      class_ro.reset();
-      return false;
-    }
+    // Only class_rw->m_ro_ptr is used, the rw class doesn't need to exist.
+    auto class_rw = class_rw_t::Read(process, objc_class.m_data_ptr);
+    if (!class_rw)
+      return class_rw.takeError();
+    return class_ro_t::Read(process, class_rw->m_ro_ptr);
   }
-
-  return true;
+  return class_ro_t::Read(process, objc_class.m_data_ptr);
 }
 
 llvm::Expected<ClassDescriptorV2::method_list_t>
@@ -568,16 +549,16 @@ bool ClassDescriptorV2::Describe(
                        uint64_t)> const &ivar_func) const {
   lldb_private::Process *process = m_runtime.GetProcess();
 
-  std::unique_ptr<class_ro_t> class_ro;
-  std::unique_ptr<class_rw_t> class_rw;
-
   auto objc_class = objc_class_t::Read(process, m_objc_class_ptr);
   if (!objc_class) {
     LLDB_LOG_ERROR(GetLog(LLDBLog::Types), objc_class.takeError(), "{0}");
     return false;
   }
-  if (!Read_class_row(process, *objc_class, class_ro, class_rw))
+  auto class_ro = Read_class_row(process, *objc_class);
+  if (!class_ro) {
+    LLDB_LOG_ERROR(GetLog(LLDBLog::Types), class_ro.takeError(), "{0}");
     return false;
+  }
 
   static ConstString NSObject_name("NSObject");
 
@@ -648,16 +629,16 @@ ConstString ClassDescriptorV2::GetClassName() {
     lldb_private::Process *process = m_runtime.GetProcess();
 
     if (process) {
-      std::unique_ptr<class_ro_t> class_ro;
-      std::unique_ptr<class_rw_t> class_rw;
-
       auto objc_class = objc_class_t::Read(process, m_objc_class_ptr);
       if (!objc_class) {
         LLDB_LOG_ERROR(GetLog(LLDBLog::Types), objc_class.takeError(), "{0}");
         return m_name;
       }
-      if (!Read_class_row(process, *objc_class, class_ro, class_rw))
+      auto class_ro = Read_class_row(process, *objc_class);
+      if (!class_ro) {
+        LLDB_LOG_ERROR(GetLog(LLDBLog::Types), class_ro.takeError(), "{0}");
         return m_name;
+      }
 
       m_name = ConstString(class_ro->m_name);
     }
@@ -703,16 +684,16 @@ uint64_t ClassDescriptorV2::GetInstanceSize() {
   lldb_private::Process *process = m_runtime.GetProcess();
 
   if (process) {
-    std::unique_ptr<class_ro_t> class_ro;
-    std::unique_ptr<class_rw_t> class_rw;
-
     auto objc_class = objc_class_t::Read(process, m_objc_class_ptr);
     if (!objc_class) {
       LLDB_LOG_ERROR(GetLog(LLDBLog::Types), objc_class.takeError(), "{0}");
       return 0;
     }
-    if (!Read_class_row(process, *objc_class, class_ro, class_rw))
+    auto class_ro = Read_class_row(process, *objc_class);
+    if (!class_ro) {
+      LLDB_LOG_ERROR(GetLog(LLDBLog::Types), class_ro.takeError(), "{0}");
       return 0;
+    }
 
     return class_ro->m_instanceSize;
   }

diff  --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h
index e5370ed91d1c5..e7269d6b89c9b 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h
@@ -108,7 +108,7 @@ class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor {
 
     std::string m_name;
 
-    bool Read(Process *process, lldb::addr_t addr);
+    static llvm::Expected<class_ro_t> Read(Process *process, lldb::addr_t addr);
   };
 
   struct class_rw_t {
@@ -123,7 +123,7 @@ class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor {
     lldb::addr_t m_properties_ptr;
     lldb::addr_t m_protocols_ptr;
 
-    bool Read(Process *process, lldb::addr_t addr);
+    static llvm::Expected<class_rw_t> Read(Process *process, lldb::addr_t addr);
   };
 
   struct method_list_t {
@@ -248,9 +248,8 @@ class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor {
         m_ivars_storage(), m_image_to_method_lists(), m_last_version_updated() {
   }
 
-  bool Read_class_row(Process *process, const objc_class_t &objc_class,
-                      std::unique_ptr<class_ro_t> &class_ro,
-                      std::unique_ptr<class_rw_t> &class_rw) const;
+  static llvm::Expected<class_ro_t>
+  Read_class_row(Process *process, const objc_class_t &objc_class);
 
   void ProcessMethodList(std::function<bool(const char *, const char *)> const
                              &instance_method_func,


        


More information about the lldb-commits mailing list