From cf9a634a5115d143e67616ea26df71adf7428840 Mon Sep 17 00:00:00 2001 From: Mark Rowe Date: Mon, 21 Apr 2025 09:29:43 -0700 Subject: [ObjC] Use relative pointer types for members of `objc_method_entry_t` They were previously relying on the Objective-C workflow to render the `rptr_t` typedef. Relative pointer types are now a first class citizen and are rendered correctly without any additional work. --- objectivec/objc.cpp | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'objectivec/objc.cpp') diff --git a/objectivec/objc.cpp b/objectivec/objc.cpp index 84abd142..46add246 100644 --- a/objectivec/objc.cpp +++ b/objectivec/objc.cpp @@ -1264,9 +1264,6 @@ void ObjCProcessor::ProcessObjCData() m_symbolQueue = new SymbolQueue(); auto addrSize = m_data->GetAddressSize(); - m_typeNames.relativePtr = defineTypedef(m_data, {"rptr_t"}, Type::IntegerType(4, true)); - auto rptr_t = Type::NamedType(m_data, m_typeNames.relativePtr); - m_typeNames.id = defineTypedef(m_data, {"id"}, Type::PointerType(addrSize, Type::VoidType())); m_typeNames.sel = defineTypedef(m_data, {"SEL"}, Type::PointerType(addrSize, Type::IntegerType(1, false))); @@ -1275,18 +1272,28 @@ void ObjCProcessor::ProcessObjCData() m_typeNames.nsuInteger = defineTypedef(m_data, {"NSUInteger"}, Type::IntegerType(addrSize, false)); m_typeNames.cgFloat = defineTypedef(m_data, {"CGFloat"}, Type::FloatType(addrSize)); - Ref relativeSelectorPtr; + BNPointerBaseType relativeSelectorBaseType = RelativeToVariableAddressPointerBaseType; + uint64_t relativeSelectorBaseOffset = 0; auto reader = GetReader(); if (auto objCRelativeMethodsBaseAddr = GetObjCRelativeMethodBaseAddress(reader.get())) { m_logger->LogDebug("RelativeMethodSelector Base: 0x%llx", objCRelativeMethodsBaseAddr); - - auto type = TypeBuilder::PointerType(4, Type::PointerType(addrSize, Type::IntegerType(1, false))) - .SetPointerBase(RelativeToConstantPointerBaseType, objCRelativeMethodsBaseAddr) - .Finalize(); - auto relativeSelectorPtrName = defineTypedef(m_data, {"relative_SEL"}, type); - relativeSelectorPtr = Type::NamedType(m_data, relativeSelectorPtrName); + relativeSelectorBaseType = RelativeToConstantPointerBaseType; + relativeSelectorBaseOffset = objCRelativeMethodsBaseAddr; } + auto relativeSelectorPtrName = defineTypedef(m_data, {"rel_SEL"}, + TypeBuilder::PointerType(4, Type::PointerType(addrSize, Type::IntegerType(1, false))) + .SetPointerBase(relativeSelectorBaseType, relativeSelectorBaseOffset) + .Finalize()); + auto relativeCharPtrName = defineTypedef(m_data, {"rel_cstr"}, + TypeBuilder::PointerType(4, Type::PointerType(addrSize, Type::IntegerType(1, false))) + .SetPointerBase(RelativeToVariableAddressPointerBaseType, 0) + .Finalize()); + auto relativeIMPPtrName = defineTypedef(m_data, {"rel_IMP"}, + TypeBuilder::PointerType(4, Type::VoidType()) + .SetPointerBase(RelativeToVariableAddressPointerBaseType, 0) + .Finalize()); + // https://github.com/apple-oss-distributions/objc4/blob/196363c165b175ed925ef6b9b99f558717923c47/runtime/objc-abi.h EnumerationBuilder imageInfoFlagBuilder; imageInfoFlagBuilder.AddMemberWithValue("IsReplacement", 1 << 0); @@ -1322,9 +1329,9 @@ void ObjCProcessor::ProcessObjCData() m_typeNames.imageInfo = imageInfoType.first; StructureBuilder methodEntry; - methodEntry.AddMember(relativeSelectorPtr ? relativeSelectorPtr : rptr_t, "name"); - methodEntry.AddMember(rptr_t, "types"); - methodEntry.AddMember(rptr_t, "imp"); + methodEntry.AddMember(Type::NamedType(m_data, relativeSelectorPtrName), "name"); + methodEntry.AddMember(Type::NamedType(m_data, relativeCharPtrName), "types"); + methodEntry.AddMember(Type::NamedType(m_data, relativeIMPPtrName), "imp"); auto type = finalizeStructureBuilder(m_data, methodEntry, "objc_method_entry_t"); m_typeNames.methodEntry = type.first; -- cgit v1.3.1