summaryrefslogtreecommitdiff
path: root/view/sharedcache/core/ObjC.cpp
diff options
context:
space:
mode:
authorWeiN76LQh <WeiN76LQh@github.com>2024-11-21 19:01:44 +0000
committerkat <kat@vector35.com>2024-12-26 10:41:53 -0500
commit934104743a0e3071606277692822be4b853288ac (patch)
tree863ee27429bdaeb5f4e56bf4ce08ca1b9a4178dd /view/sharedcache/core/ObjC.cpp
parent08d91f14061c54134038fadc2d333a3aa3da0fe1 (diff)
[SharedCache] Fix post-processing of Objective-C sections
Prior to this commit the function `DSCObjCProcessor::PostProcessObjCSections` never does anything because it doesn't use the correct names to get the Objective-C sections of the recently loaded library. In fact it never does anything because the DSC never has sections with the names its searching for. This commit passes the `baseName` (the name of the library that was loaded), which is what other Objective-C section processing code does. Combining the base name with the section names it will now find them and process them as intended. This was resulting in alot of Objective-C related stuff being missed. There is however still an issue of the fact that the way this DSC plugin works means it only analyzes Objective-C sections once. This catches alot of things but there are a number of cases where other libraries need to be loaded first due to information being referenced in another library. For instance errors like `Failed to determine base classname for category` can be caused by the class reference in the category being to a class outside of the loaded library. Once the library containing the class has been loaded, the section containing the category should be re-proccessed.
Diffstat (limited to 'view/sharedcache/core/ObjC.cpp')
-rw-r--r--view/sharedcache/core/ObjC.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/view/sharedcache/core/ObjC.cpp b/view/sharedcache/core/ObjC.cpp
index 271e5c94..95fbb2a2 100644
--- a/view/sharedcache/core/ObjC.cpp
+++ b/view/sharedcache/core/ObjC.cpp
@@ -1087,16 +1087,16 @@ void DSCObjCProcessor::ApplyMethodTypes(Class& cls)
}
}
-void DSCObjCProcessor::PostProcessObjCSections(VMReader* reader)
+void DSCObjCProcessor::PostProcessObjCSections(VMReader* reader, std::string baseName)
{
auto ptrSize = m_data->GetAddressSize();
- if (auto imageInfo = m_data->GetSectionByName("__objc_imageinfo"))
+ if (auto imageInfo = m_data->GetSectionByName(baseName + "::__objc_imageinfo"))
{
auto start = imageInfo->GetStart();
auto type = Type::NamedType(m_data, m_typeNames.imageInfo);
m_data->DefineDataVariable(start, type);
}
- if (auto selrefs = m_data->GetSectionByName("__objc_selrefs"))
+ if (auto selrefs = m_data->GetSectionByName(baseName + "::__objc_selrefs"))
{
auto start = selrefs->GetStart();
auto end = selrefs->GetEnd();
@@ -1119,7 +1119,7 @@ void DSCObjCProcessor::PostProcessObjCSections(VMReader* reader)
DefineObjCSymbol(DataSymbol, type, "selRef_" + sel, i, true);
}
}
- if (auto superRefs = m_data->GetSectionByName("__objc_classrefs"))
+ if (auto superRefs = m_data->GetSectionByName(baseName + "::__objc_classrefs"))
{
auto start = superRefs->GetStart();
auto end = superRefs->GetEnd();
@@ -1137,7 +1137,7 @@ void DSCObjCProcessor::PostProcessObjCSections(VMReader* reader)
}
}
}
- if (auto superRefs = m_data->GetSectionByName("__objc_superrefs"))
+ if (auto superRefs = m_data->GetSectionByName(baseName + "::__objc_superrefs"))
{
auto start = superRefs->GetStart();
auto end = superRefs->GetEnd();
@@ -1155,7 +1155,7 @@ void DSCObjCProcessor::PostProcessObjCSections(VMReader* reader)
}
}
}
- if (auto protoRefs = m_data->GetSectionByName("__objc_protorefs"))
+ if (auto protoRefs = m_data->GetSectionByName(baseName + "::__objc_protorefs"))
{
auto start = protoRefs->GetStart();
auto end = protoRefs->GetEnd();
@@ -1173,7 +1173,7 @@ void DSCObjCProcessor::PostProcessObjCSections(VMReader* reader)
}
}
}
- if (auto ivars = m_data->GetSectionByName("__objc_ivar"))
+ if (auto ivars = m_data->GetSectionByName(baseName + "::__objc_ivar"))
{
auto start = ivars->GetStart();
auto end = ivars->GetEnd();
@@ -1416,7 +1416,7 @@ void DSCObjCProcessor::ProcessObjCData(std::shared_ptr<VM> vm, std::string baseN
if (auto protoList = m_data->GetSectionByName(baseName + "::__objc_protolist"))
LoadProtocols(&reader, protoList);
- PostProcessObjCSections(&reader);
+ PostProcessObjCSections(&reader, baseName);
auto id = m_data->BeginUndoActions();
m_symbolQueue->Process();