aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ExecutionEngine
diff options
context:
space:
mode:
authorBen Langmuir <blangmuir@apple.com>2024-05-14 08:08:18 -0700
committerGitHub <noreply@github.com>2024-05-14 08:08:18 -0700
commit2766f2174e428842a9ab1a9ba5b320be5878f87d (patch)
treed7bad001c27f4c12e934672b2f3341dc3bc39258 /llvm/lib/ExecutionEngine
parent736ffdc38347f3f83cf7b3c034b8e837f46f7eab (diff)
downloadllvm-2766f2174e428842a9ab1a9ba5b320be5878f87d.zip
llvm-2766f2174e428842a9ab1a9ba5b320be5878f87d.tar.gz
llvm-2766f2174e428842a9ab1a9ba5b320be5878f87d.tar.bz2
[ORC] Loosen __objc_imageinfo flag merging to match ld (#91767)
Allow mixing objects with/without signed class ro data and category class properties as long as it happens before we register the metadata. These combinations are a warning in ld, not a hard error. The only case that is ABI-breaking is if we already registered with the feature enabled but later try to load an object that doesn't support it. rdar://127336061
Diffstat (limited to 'llvm/lib/ExecutionEngine')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
index 1fa8a12..2b397b2 100644
--- a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
@@ -1134,12 +1134,16 @@ Error MachOPlatform::MachOPlatformPlugin::mergeImageInfoFlags(
" does not match first registered flags",
inconvertibleErrorCode());
- if (Old.HasCategoryClassProperties != New.HasCategoryClassProperties)
+ // HasCategoryClassProperties and HasSignedObjCClassROs can be disabled before
+ // they are registered, if necessary, but once they are in use must be
+ // supported by subsequent objects.
+ if (Info.Finalized && Old.HasCategoryClassProperties &&
+ !New.HasCategoryClassProperties)
return make_error<StringError>("ObjC category class property support in " +
G.getName() +
" does not match first registered flags",
inconvertibleErrorCode());
- if (Old.HasSignedObjCClassROs != New.HasSignedObjCClassROs)
+ if (Info.Finalized && Old.HasSignedObjCClassROs && !New.HasSignedObjCClassROs)
return make_error<StringError>("ObjC class_ro_t pointer signing in " +
G.getName() +
" does not match first registered flags",
@@ -1158,6 +1162,12 @@ Error MachOPlatform::MachOPlatformPlugin::mergeImageInfoFlags(
// Add a Swift ABI version if it was pure objc before.
if (!New.SwiftABIVersion)
New.SwiftABIVersion = Old.SwiftABIVersion;
+ // Disable class properties if any object does not support it.
+ if (Old.HasCategoryClassProperties != New.HasCategoryClassProperties)
+ New.HasCategoryClassProperties = false;
+ // Disable signed class ro data if any object does not support it.
+ if (Old.HasSignedObjCClassROs != New.HasSignedObjCClassROs)
+ New.HasSignedObjCClassROs = false;
LLVM_DEBUG({
dbgs() << "MachOPlatform: Merging __objc_imageinfo flags for "