[Lldb-commits] [lldb] [lldb][NFCI] Cleanup AppleObjCClassDescriptorV2::objc_class_t API (PR #200180)
Felipe de Azevedo Piovezan via lldb-commits
lldb-commits at lists.llvm.org
Thu May 28 06:39:50 PDT 2026
https://github.com/felipepiovezan created https://github.com/llvm/llvm-project/pull/200180
None
>From 371db1eaab7176abd772213a75a8ca0e65d17e65 Mon Sep 17 00:00:00 2001
From: Felipe de Azevedo Piovezan <fpiovezan at apple.com>
Date: Thu, 28 May 2026 08:57:02 +0100
Subject: [PATCH] [lldb][NFCI] Cleanup AppleObjCClassDescriptorV2::objc_class_t
API
---
.../AppleObjCClassDescriptorV2.cpp | 88 ++++++++++---------
.../AppleObjCClassDescriptorV2.h | 17 +---
2 files changed, 47 insertions(+), 58 deletions(-)
diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
index 4718ffe1cc2a3..4ab0413f0773a 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
@@ -20,18 +20,6 @@
using namespace lldb;
using namespace lldb_private;
-bool ClassDescriptorV2::Read_objc_class(
- Process *process, std::unique_ptr<objc_class_t> &objc_class) const {
- objc_class = std::make_unique<objc_class_t>();
-
- bool ret = objc_class->Read(process, m_objc_class_ptr);
-
- if (!ret)
- objc_class.reset();
-
- return ret;
-}
-
static lldb::addr_t GetClassDataMask(Process *process) {
switch (process->GetAddressByteSize()) {
case 4:
@@ -45,8 +33,8 @@ static lldb::addr_t GetClassDataMask(Process *process) {
return LLDB_INVALID_ADDRESS;
}
-bool ClassDescriptorV2::objc_class_t::Read(Process *process,
- lldb::addr_t addr) {
+llvm::Expected<ClassDescriptorV2::objc_class_t>
+ClassDescriptorV2::objc_class_t::Read(Process *process, lldb::addr_t addr) {
size_t ptr_size = process->GetAddressByteSize();
size_t objc_class_size = ptr_size // uintptr_t isa;
@@ -59,9 +47,8 @@ bool ClassDescriptorV2::objc_class_t::Read(Process *process,
Status error;
process->ReadMemory(addr, objc_class_buf.GetBytes(), objc_class_size, error);
- if (error.Fail()) {
- return false;
- }
+ if (error.Fail())
+ return error.takeError();
DataExtractor extractor(objc_class_buf.GetBytes(), objc_class_size,
process->GetByteOrder(),
@@ -69,22 +56,26 @@ bool ClassDescriptorV2::objc_class_t::Read(Process *process,
lldb::offset_t cursor = 0;
- m_isa = extractor.GetAddress_unchecked(&cursor); // uintptr_t isa;
- m_superclass = extractor.GetAddress_unchecked(&cursor); // Class superclass;
- m_cache_ptr = extractor.GetAddress_unchecked(&cursor); // void *cache;
- m_vtable_ptr = extractor.GetAddress_unchecked(&cursor); // IMP *vtable;
+ ObjCLanguageRuntime::ObjCISA isa =
+ extractor.GetAddress_unchecked(&cursor); // uintptr_t isa;
+ ObjCLanguageRuntime::ObjCISA superclass =
+ extractor.GetAddress_unchecked(&cursor); // Class superclass;
+ lldb::addr_t cache_ptr =
+ extractor.GetAddress_unchecked(&cursor); // void *cache;
+ lldb::addr_t vtable_ptr =
+ extractor.GetAddress_unchecked(&cursor); // IMP *vtable;
lldb::addr_t data_NEVER_USE =
extractor.GetAddress_unchecked(&cursor); // uintptr_t data_NEVER_USE;
- m_flags = (uint8_t)(data_NEVER_USE & (lldb::addr_t)3);
- m_data_ptr = data_NEVER_USE & GetClassDataMask(process);
+ uint8_t flags = (uint8_t)(data_NEVER_USE & (lldb::addr_t)3);
+ lldb::addr_t data_ptr = data_NEVER_USE & GetClassDataMask(process);
if (ABISP abi_sp = process->GetABI()) {
- m_isa = abi_sp->FixCodeAddress(m_isa);
- m_superclass = abi_sp->FixCodeAddress(m_superclass);
- m_data_ptr = abi_sp->FixCodeAddress(m_data_ptr);
+ isa = abi_sp->FixCodeAddress(isa);
+ superclass = abi_sp->FixCodeAddress(superclass);
+ data_ptr = abi_sp->FixCodeAddress(data_ptr);
}
- return true;
+ 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) {
@@ -577,12 +568,14 @@ bool ClassDescriptorV2::Describe(
uint64_t)> const &ivar_func) const {
lldb_private::Process *process = m_runtime.GetProcess();
- std::unique_ptr<objc_class_t> objc_class;
std::unique_ptr<class_ro_t> class_ro;
std::unique_ptr<class_rw_t> class_rw;
- if (!Read_objc_class(process, objc_class))
+ 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))
return false;
@@ -655,12 +648,14 @@ ConstString ClassDescriptorV2::GetClassName() {
lldb_private::Process *process = m_runtime.GetProcess();
if (process) {
- std::unique_ptr<objc_class_t> objc_class;
std::unique_ptr<class_ro_t> class_ro;
std::unique_ptr<class_rw_t> class_rw;
- if (!Read_objc_class(process, objc_class))
+ 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))
return m_name;
@@ -676,10 +671,11 @@ ObjCLanguageRuntime::ClassDescriptorSP ClassDescriptorV2::GetSuperclass() {
if (!process)
return ObjCLanguageRuntime::ClassDescriptorSP();
- std::unique_ptr<objc_class_t> objc_class;
-
- if (!Read_objc_class(process, objc_class))
+ 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 ObjCLanguageRuntime::ClassDescriptorSP();
+ }
return m_runtime.ObjCLanguageRuntime::GetClassDescriptorFromISA(
objc_class->m_superclass);
@@ -691,10 +687,11 @@ ObjCLanguageRuntime::ClassDescriptorSP ClassDescriptorV2::GetMetaclass() const {
if (!process)
return ObjCLanguageRuntime::ClassDescriptorSP();
- std::unique_ptr<objc_class_t> objc_class;
-
- if (!Read_objc_class(process, objc_class))
+ 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 ObjCLanguageRuntime::ClassDescriptorSP();
+ }
lldb::addr_t candidate_isa = m_runtime.GetPointerISA(objc_class->m_isa);
@@ -706,12 +703,14 @@ uint64_t ClassDescriptorV2::GetInstanceSize() {
lldb_private::Process *process = m_runtime.GetProcess();
if (process) {
- std::unique_ptr<objc_class_t> objc_class;
std::unique_ptr<class_ro_t> class_ro;
std::unique_ptr<class_rw_t> class_rw;
- if (!Read_objc_class(process, objc_class))
+ 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))
return 0;
@@ -725,12 +724,15 @@ uint64_t ClassDescriptorV2::GetInstanceSize() {
static uint8_t IS_SWIFT_STABLE = 1U << 1;
LanguageType ClassDescriptorV2::GetImplementationLanguage() const {
- std::unique_ptr<objc_class_t> objc_class;
- if (auto *process = m_runtime.GetProcess())
- if (Read_objc_class(process, objc_class))
+ if (auto *process = m_runtime.GetProcess()) {
+ auto objc_class = objc_class_t::Read(process, m_objc_class_ptr);
+ if (objc_class) {
if (objc_class->m_flags & IS_SWIFT_STABLE)
return lldb::eLanguageTypeSwift;
-
+ } else {
+ LLDB_LOG_ERROR(GetLog(LLDBLog::Types), objc_class.takeError(), "{0}");
+ }
+ }
return lldb::eLanguageTypeObjC;
}
diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h
index 9b3c3ccbc2ce7..e5370ed91d1c5 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.h
@@ -87,18 +87,8 @@ class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor {
lldb::addr_t m_data_ptr = 0;
uint8_t m_flags = 0;
- objc_class_t() = default;
-
- void Clear() {
- m_isa = 0;
- m_superclass = 0;
- m_cache_ptr = 0;
- m_vtable_ptr = 0;
- m_data_ptr = 0;
- m_flags = 0;
- }
-
- bool Read(Process *process, lldb::addr_t addr);
+ static llvm::Expected<objc_class_t> Read(Process *process,
+ lldb::addr_t addr);
};
struct class_ro_t {
@@ -258,9 +248,6 @@ class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor {
m_ivars_storage(), m_image_to_method_lists(), m_last_version_updated() {
}
- bool Read_objc_class(Process *process,
- std::unique_ptr<objc_class_t> &objc_class) const;
-
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;
More information about the lldb-commits
mailing list