Support building without support for old ABIs.

main
David Chisnall 8 years ago
parent 0f1385e1b1
commit 2934a98503

@ -31,7 +31,6 @@ set(libobjc_OBJC_SRCS
blocks_runtime.m blocks_runtime.m
properties.m) properties.m)
set(libobjc_C_SRCS set(libobjc_C_SRCS
abi_version.c
alias_table.c alias_table.c
block_to_imp.c block_to_imp.c
caps.c caps.c
@ -43,8 +42,6 @@ set(libobjc_C_SRCS
hash_table.c hash_table.c
hooks.c hooks.c
ivar.c ivar.c
legacy_malloc.c
legacy.c
loader.c loader.c
mutation.m mutation.m
protocol.c protocol.c
@ -120,8 +117,17 @@ else ()
list(APPEND libobjc_OBJC_SRCS gc_none.c) list(APPEND libobjc_OBJC_SRCS gc_none.c)
endif () endif ()
set(OLDABI_COMPAT TRUE CACHE BOOL
"Enable compatibility with GCC and old GNUstep ABIs")
set(LEGACY_COMPAT FALSE CACHE BOOL set(LEGACY_COMPAT FALSE CACHE BOOL
"Enable legacy compatibility features") "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) if (LEGACY_COMPAT)
list(APPEND libobjc_C_SRCS legacy_malloc.c) list(APPEND libobjc_C_SRCS legacy_malloc.c)
else () else ()

@ -91,7 +91,7 @@ function(addtest_variants TEST TEST_SOURCE LEGACY)
target_sources(${TEST} PRIVATE $<TARGET_OBJECTS:test_runtime>) target_sources(${TEST} PRIVATE $<TARGET_OBJECTS:test_runtime>)
addtest_flags("${TEST}_optimised" "-O3 -fobjc-runtime=gnustep-2.0 -UNDEBUG -DGS_RUNTIME_V2" "${TEST_SOURCE}") addtest_flags("${TEST}_optimised" "-O3 -fobjc-runtime=gnustep-2.0 -UNDEBUG -DGS_RUNTIME_V2" "${TEST_SOURCE}")
target_sources("${TEST}_optimised" PRIVATE $<TARGET_OBJECTS:test_runtime>) target_sources("${TEST}_optimised" PRIVATE $<TARGET_OBJECTS:test_runtime>)
if (LEGACY) if (${LEGACY} AND ${OLDABI_COMPAT})
addtest_flags("${TEST}_legacy" "-O0 -fobjc-runtime=gnustep-1.7 -UNDEBUG" "${TEST_SOURCE}") addtest_flags("${TEST}_legacy" "-O0 -fobjc-runtime=gnustep-1.7 -UNDEBUG" "${TEST_SOURCE}")
target_sources("${TEST}_legacy" PRIVATE $<TARGET_OBJECTS:test_runtime_legacy>) target_sources("${TEST}_legacy" PRIVATE $<TARGET_OBJECTS:test_runtime_legacy>)
addtest_flags("${TEST}_legacy_optimised" "-O3 -fobjc-runtime=gnustep-1.7 -UNDEBUG" "${TEST_SOURCE}") addtest_flags("${TEST}_legacy_optimised" "-O3 -fobjc-runtime=gnustep-1.7 -UNDEBUG" "${TEST_SOURCE}")

@ -165,6 +165,7 @@ PRIVATE BOOL objc_resolve_class(Class cls)
} }
} }
} }
#ifdef OLDABI_COMPAT
else else
{ {
struct objc_class_gsv1 *ocls = objc_legacy_class_for_class(cls); 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 // Remove the class from the unresolved class list
@ -258,12 +260,14 @@ PRIVATE BOOL objc_resolve_class(Class cls)
// Fix up the ivar offsets // Fix up the ivar offsets
objc_compute_ivar_offsets(cls); objc_compute_ivar_offsets(cls);
#ifdef OLDABI_COMPAT
struct objc_class_gsv1 *oldCls = objc_legacy_class_for_class(cls); struct objc_class_gsv1 *oldCls = objc_legacy_class_for_class(cls);
if (oldCls) if (oldCls)
{ {
oldCls->super_class = cls->super_class; oldCls->super_class = cls->super_class;
oldCls->isa->super_class = cls->isa->super_class; oldCls->isa->super_class = cls->isa->super_class;
} }
#endif
// Send the +load message, if required // Send the +load message, if required
if (!objc_test_class_flag(cls, objc_class_flag_user_created)) if (!objc_test_class_flag(cls, objc_class_flag_user_created))
{ {

@ -89,6 +89,7 @@ PRIVATE void objc_compute_ivar_offsets(Class class)
} }
*ivar->offset += ivar_start; *ivar->offset += ivar_start;
} }
#ifdef OLDABI_COMPAT
// If we have a legacy ivar list, update the offset in it too - // If we have a legacy ivar list, update the offset in it too -
// code from older compilers may access this directly! // code from older compilers may access this directly!
struct objc_class_gsv1* legacy = objc_legacy_class_for_class(class); 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; legacy->ivars->ivar_list[i].offset = *ivar_at_index(class->ivars, i)->offset;
} }
} }
#endif
} }
} }
} }

@ -281,6 +281,7 @@ void __objc_load(struct objc_init *init)
init->version = 0xffffffffffffffffULL; init->version = 0xffffffffffffffffULL;
} }
#ifdef OLDABI_COMPAT
void __objc_exec_class(struct objc_module_abi_8 *module) void __objc_exec_class(struct objc_module_abi_8 *module)
{ {
init_runtime(); init_runtime();
@ -351,3 +352,4 @@ void __objc_exec_class(struct objc_module_abi_8 *module)
} }
} }
} }
#endif

@ -220,6 +220,7 @@ static BOOL init_protocols(struct objc_protocol_list *protocols)
default: default:
fprintf(stderr, "Unknown protocol version"); fprintf(stderr, "Unknown protocol version");
abort(); abort();
#ifdef OLDABI_COMPAT
case protocol_version_gcc: case protocol_version_gcc:
protocols->list[i] = aProto = objc_upgrade_protocol_gcc((struct objc_protocol_gcc *)aProto); protocols->list[i] = aProto = objc_upgrade_protocol_gcc((struct objc_protocol_gcc *)aProto);
assert(aProto->isa == protocol_class_gcc); 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); protocols->list[i] = aProto = objc_upgrade_protocol_gsv1((struct objc_protocol_gsv1 *)aProto);
assert(aProto->isa == protocol_class_gsv2); assert(aProto->isa == protocol_class_gsv2);
break; break;
#endif
case protocol_version_gsv2: case protocol_version_gsv2:
aProto->isa = protocol_class_gsv2; aProto->isa = protocol_class_gsv2;
break; break;

Loading…
Cancel
Save