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
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 ()

@ -91,7 +91,7 @@ function(addtest_variants TEST TEST_SOURCE LEGACY)
target_sources(${TEST} PRIVATE $<TARGET_OBJECTS:test_runtime>)
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>)
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 $<TARGET_OBJECTS:test_runtime_legacy>)
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
{
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))
{

@ -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
}
}
}

@ -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

@ -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;

Loading…
Cancel
Save