[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