From 2934a985035ef87e85d6273175fc5c6ea42bd74c Mon Sep 17 00:00:00 2001 From: David Chisnall Date: Wed, 11 Apr 2018 15:28:08 +0100 Subject: [PATCH] Support building without support for old ABIs. --- CMakeLists.txt | 12 +++++++++--- Test/CMakeLists.txt | 2 +- class_table.c | 4 ++++ ivar.c | 2 ++ loader.c | 2 ++ protocol.c | 2 ++ 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a0ace72..3176aff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,6 @@ set(libobjc_OBJC_SRCS blocks_runtime.m properties.m) set(libobjc_C_SRCS - abi_version.c alias_table.c block_to_imp.c caps.c @@ -43,8 +42,6 @@ set(libobjc_C_SRCS hash_table.c hooks.c ivar.c - legacy_malloc.c - legacy.c loader.c mutation.m protocol.c @@ -120,8 +117,17 @@ else () list(APPEND libobjc_OBJC_SRCS gc_none.c) endif () +set(OLDABI_COMPAT TRUE CACHE BOOL + "Enable compatibility with GCC and old GNUstep ABIs") + set(LEGACY_COMPAT FALSE CACHE BOOL "Enable legacy compatibility features") + +if (OLDABI_COMPAT) + list(APPEND libobjc_C_SRCS legacy.c abi_version.c) + add_definitions(-DOLDABI_COMPAT=1) +endif() + if (LEGACY_COMPAT) list(APPEND libobjc_C_SRCS legacy_malloc.c) else () diff --git a/Test/CMakeLists.txt b/Test/CMakeLists.txt index 6658e82..0dd5e91 100644 --- a/Test/CMakeLists.txt +++ b/Test/CMakeLists.txt @@ -91,7 +91,7 @@ function(addtest_variants TEST TEST_SOURCE LEGACY) target_sources(${TEST} PRIVATE $) addtest_flags("${TEST}_optimised" "-O3 -fobjc-runtime=gnustep-2.0 -UNDEBUG -DGS_RUNTIME_V2" "${TEST_SOURCE}") target_sources("${TEST}_optimised" PRIVATE $) - if (LEGACY) + if (${LEGACY} AND ${OLDABI_COMPAT}) addtest_flags("${TEST}_legacy" "-O0 -fobjc-runtime=gnustep-1.7 -UNDEBUG" "${TEST_SOURCE}") target_sources("${TEST}_legacy" PRIVATE $) addtest_flags("${TEST}_legacy_optimised" "-O3 -fobjc-runtime=gnustep-1.7 -UNDEBUG" "${TEST_SOURCE}") diff --git a/class_table.c b/class_table.c index a089f2c..845638e 100644 --- a/class_table.c +++ b/class_table.c @@ -165,6 +165,7 @@ PRIVATE BOOL objc_resolve_class(Class cls) } } } +#ifdef OLDABI_COMPAT else { struct objc_class_gsv1 *ocls = objc_legacy_class_for_class(cls); @@ -183,6 +184,7 @@ PRIVATE BOOL objc_resolve_class(Class cls) } } } +#endif // Remove the class from the unresolved class list @@ -258,12 +260,14 @@ PRIVATE BOOL objc_resolve_class(Class cls) // Fix up the ivar offsets objc_compute_ivar_offsets(cls); +#ifdef OLDABI_COMPAT struct objc_class_gsv1 *oldCls = objc_legacy_class_for_class(cls); if (oldCls) { oldCls->super_class = cls->super_class; oldCls->isa->super_class = cls->isa->super_class; } +#endif // Send the +load message, if required if (!objc_test_class_flag(cls, objc_class_flag_user_created)) { diff --git a/ivar.c b/ivar.c index 940d562..5e22189 100644 --- a/ivar.c +++ b/ivar.c @@ -89,6 +89,7 @@ PRIVATE void objc_compute_ivar_offsets(Class class) } *ivar->offset += ivar_start; } +#ifdef OLDABI_COMPAT // If we have a legacy ivar list, update the offset in it too - // code from older compilers may access this directly! struct objc_class_gsv1* legacy = objc_legacy_class_for_class(class); @@ -99,6 +100,7 @@ PRIVATE void objc_compute_ivar_offsets(Class class) legacy->ivars->ivar_list[i].offset = *ivar_at_index(class->ivars, i)->offset; } } +#endif } } } diff --git a/loader.c b/loader.c index 0f905f8..2c00b57 100644 --- a/loader.c +++ b/loader.c @@ -281,6 +281,7 @@ void __objc_load(struct objc_init *init) init->version = 0xffffffffffffffffULL; } +#ifdef OLDABI_COMPAT void __objc_exec_class(struct objc_module_abi_8 *module) { init_runtime(); @@ -351,3 +352,4 @@ void __objc_exec_class(struct objc_module_abi_8 *module) } } } +#endif diff --git a/protocol.c b/protocol.c index 8728bde..91b8132 100644 --- a/protocol.c +++ b/protocol.c @@ -220,6 +220,7 @@ static BOOL init_protocols(struct objc_protocol_list *protocols) default: fprintf(stderr, "Unknown protocol version"); abort(); +#ifdef OLDABI_COMPAT case protocol_version_gcc: protocols->list[i] = aProto = objc_upgrade_protocol_gcc((struct objc_protocol_gcc *)aProto); assert(aProto->isa == protocol_class_gcc); @@ -228,6 +229,7 @@ static BOOL init_protocols(struct objc_protocol_list *protocols) protocols->list[i] = aProto = objc_upgrade_protocol_gsv1((struct objc_protocol_gsv1 *)aProto); assert(aProto->isa == protocol_class_gsv2); break; +#endif case protocol_version_gsv2: aProto->isa = protocol_class_gsv2; break;