diff options
author | Ben Langmuir <blangmuir@apple.com> | 2024-05-14 08:08:18 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-14 08:08:18 -0700 |
commit | 2766f2174e428842a9ab1a9ba5b320be5878f87d (patch) | |
tree | d7bad001c27f4c12e934672b2f3341dc3bc39258 /llvm/lib/ExecutionEngine | |
parent | 736ffdc38347f3f83cf7b3c034b8e837f46f7eab (diff) | |
download | llvm-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.cpp | 14 |
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 " |