@@ -1264,9 +1264,6 @@ void ObjCProcessor::ProcessObjCData()
12641264 m_symbolQueue = new SymbolQueue ();
12651265 auto addrSize = m_data->GetAddressSize ();
12661266
1267- m_typeNames.relativePtr = defineTypedef (m_data, {" rptr_t" }, Type::IntegerType (4 , true ));
1268- auto rptr_t = Type::NamedType (m_data, m_typeNames.relativePtr );
1269-
12701267 m_typeNames.id = defineTypedef (m_data, {" id" }, Type::PointerType (addrSize, Type::VoidType ()));
12711268 m_typeNames.sel = defineTypedef (m_data, {" SEL" }, Type::PointerType (addrSize, Type::IntegerType (1 , false )));
12721269
@@ -1275,18 +1272,28 @@ void ObjCProcessor::ProcessObjCData()
12751272 m_typeNames.nsuInteger = defineTypedef (m_data, {" NSUInteger" }, Type::IntegerType (addrSize, false ));
12761273 m_typeNames.cgFloat = defineTypedef (m_data, {" CGFloat" }, Type::FloatType (addrSize));
12771274
1278- Ref<Type> relativeSelectorPtr;
1275+ BNPointerBaseType relativeSelectorBaseType = RelativeToVariableAddressPointerBaseType;
1276+ uint64_t relativeSelectorBaseOffset = 0 ;
12791277 auto reader = GetReader ();
12801278 if (auto objCRelativeMethodsBaseAddr = GetObjCRelativeMethodBaseAddress (reader.get ())) {
12811279 m_logger->LogDebug (" RelativeMethodSelector Base: 0x%llx" , objCRelativeMethodsBaseAddr);
1282-
1283- auto type = TypeBuilder::PointerType (4 , Type::PointerType (addrSize, Type::IntegerType (1 , false )))
1284- .SetPointerBase (RelativeToConstantPointerBaseType, objCRelativeMethodsBaseAddr)
1285- .Finalize ();
1286- auto relativeSelectorPtrName = defineTypedef (m_data, {" relative_SEL" }, type);
1287- relativeSelectorPtr = Type::NamedType (m_data, relativeSelectorPtrName);
1280+ relativeSelectorBaseType = RelativeToConstantPointerBaseType;
1281+ relativeSelectorBaseOffset = objCRelativeMethodsBaseAddr;
12881282 }
12891283
1284+ auto relativeSelectorPtrName = defineTypedef (m_data, {" rel_SEL" },
1285+ TypeBuilder::PointerType (4 , Type::PointerType (addrSize, Type::IntegerType (1 , false )))
1286+ .SetPointerBase (relativeSelectorBaseType, relativeSelectorBaseOffset)
1287+ .Finalize ());
1288+ auto relativeCharPtrName = defineTypedef (m_data, {" rel_cstr" },
1289+ TypeBuilder::PointerType (4 , Type::PointerType (addrSize, Type::IntegerType (1 , false )))
1290+ .SetPointerBase (RelativeToVariableAddressPointerBaseType, 0 )
1291+ .Finalize ());
1292+ auto relativeIMPPtrName = defineTypedef (m_data, {" rel_IMP" },
1293+ TypeBuilder::PointerType (4 , Type::VoidType ())
1294+ .SetPointerBase (RelativeToVariableAddressPointerBaseType, 0 )
1295+ .Finalize ());
1296+
12901297 // https://github.com/apple-oss-distributions/objc4/blob/196363c165b175ed925ef6b9b99f558717923c47/runtime/objc-abi.h
12911298 EnumerationBuilder imageInfoFlagBuilder;
12921299 imageInfoFlagBuilder.AddMemberWithValue (" IsReplacement" , 1 << 0 );
@@ -1322,9 +1329,9 @@ void ObjCProcessor::ProcessObjCData()
13221329 m_typeNames.imageInfo = imageInfoType.first ;
13231330
13241331 StructureBuilder methodEntry;
1325- methodEntry.AddMember (relativeSelectorPtr ? relativeSelectorPtr : rptr_t , " name" );
1326- methodEntry.AddMember (rptr_t , " types" );
1327- methodEntry.AddMember (rptr_t , " imp" );
1332+ methodEntry.AddMember (Type::NamedType (m_data, relativeSelectorPtrName) , " name" );
1333+ methodEntry.AddMember (Type::NamedType (m_data, relativeCharPtrName) , " types" );
1334+ methodEntry.AddMember (Type::NamedType (m_data, relativeIMPPtrName) , " imp" );
13281335 auto type = finalizeStructureBuilder (m_data, methodEntry, " objc_method_entry_t" );
13291336 m_typeNames.methodEntry = type.first ;
13301337
0 commit comments