Index: src/runtime/amiga-glue.m ================================================================== --- src/runtime/amiga-glue.m +++ src/runtime/amiga-glue.m @@ -18,603 +18,618 @@ #include "config.h" #import "ObjFWRT.h" #import "private.h" #import "macros.h" + +#ifdef OF_AMIGAOS_M68K +# define PPC_PARAMS(...) (void) +# define M68K_ARG OBJC_M68K_ARG +#else +# define PPC_PARAMS(...) (__VA_ARGS__) +# define M68K_ARG(...) +#endif extern bool objc_init(unsigned int, struct objc_libc *, FILE *, FILE *); + +#ifdef OF_MORPHOS +/* All __saveds functions in this file need to use the SysV ABI */ +__asm__ ( + ".section .text\n" + ".align 2\n" + "__restore_r13:\n" + " lwz %r13, 44(%r12)\n" + " blr\n" +); +#endif bool __saveds -objc_init_m68k(void) +glue_objc_init PPC_PARAMS(unsigned int version, struct objc_libc *libc, + FILE *stdout_, FILE *stderr_) { - OBJC_M68K_ARG(unsigned int, version, d0) - OBJC_M68K_ARG(struct objc_libc *, libc, a0) - OBJC_M68K_ARG(FILE *, stdout_, a1) - OBJC_M68K_ARG(FILE *, stderr_, a2) + M68K_ARG(unsigned int, version, d0) + M68K_ARG(struct objc_libc *, libc, a0) + M68K_ARG(FILE *, stdout_, a1) + M68K_ARG(FILE *, stderr_, a2) return objc_init(version, libc, stdout_, stderr_); } void __saveds -__objc_exec_class_m68k(void) +glue___objc_exec_class PPC_PARAMS(void *module) { - OBJC_M68K_ARG(void *, module, a0) + M68K_ARG(void *, module, a0) __objc_exec_class(module); } IMP __saveds -objc_msg_lookup_m68k(void) +glue_objc_msg_lookup PPC_PARAMS(id object, SEL selector) { - OBJC_M68K_ARG(id, object, a0) - OBJC_M68K_ARG(SEL, selector, a1) + M68K_ARG(id, object, a0) + M68K_ARG(SEL, selector, a1) return objc_msg_lookup(object, selector); } IMP __saveds -objc_msg_lookup_stret_m68k(void) +glue_objc_msg_lookup_stret PPC_PARAMS(id object, SEL selector) { - OBJC_M68K_ARG(id, object, a0) - OBJC_M68K_ARG(SEL, selector, a1) + M68K_ARG(id, object, a0) + M68K_ARG(SEL, selector, a1) return objc_msg_lookup_stret(object, selector); } IMP __saveds -objc_msg_lookup_super_m68k(void) +glue_objc_msg_lookup_super PPC_PARAMS(struct objc_super *super, SEL selector) { - OBJC_M68K_ARG(struct objc_super *, super, a0) - OBJC_M68K_ARG(SEL, selector, a1) + M68K_ARG(struct objc_super *, super, a0) + M68K_ARG(SEL, selector, a1) return objc_msg_lookup_super(super, selector); } IMP __saveds -objc_msg_lookup_super_stret_m68k(void) +glue_objc_msg_lookup_super_stret PPC_PARAMS(struct objc_super *super, + SEL selector) { - OBJC_M68K_ARG(struct objc_super *, super, a0) - OBJC_M68K_ARG(SEL, selector, a1) + M68K_ARG(struct objc_super *, super, a0) + M68K_ARG(SEL, selector, a1) return objc_msg_lookup_super_stret(super, selector); } Class __saveds -objc_lookUpClass_m68k(void) +glue_objc_lookUpClass PPC_PARAMS(const char *name) { - OBJC_M68K_ARG(const char *, name, a0) + M68K_ARG(const char *, name, a0) return objc_lookUpClass(name); } Class __saveds -objc_getClass_m68k(void) +glue_objc_getClass PPC_PARAMS(const char *name) { - OBJC_M68K_ARG(const char *, name, a0) + M68K_ARG(const char *, name, a0) return objc_getClass(name); } Class __saveds -objc_getRequiredClass_m68k(void) +glue_objc_getRequiredClass PPC_PARAMS(const char *name) { - OBJC_M68K_ARG(const char *, name, a0) + M68K_ARG(const char *, name, a0) return objc_getRequiredClass(name); } Class __saveds -objc_lookup_class_m68k(void) +glue_objc_lookup_class PPC_PARAMS(const char *name) { - OBJC_M68K_ARG(const char *, name, a0) + M68K_ARG(const char *, name, a0) return objc_lookup_class(name); } Class __saveds -objc_get_class_m68k(void) +glue_objc_get_class PPC_PARAMS(const char *name) { - OBJC_M68K_ARG(const char *, name, a0) + M68K_ARG(const char *, name, a0) return objc_get_class(name); } void __saveds -objc_exception_throw_m68k(void) +glue_objc_exception_throw PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) objc_exception_throw(object); OF_UNREACHABLE } int __saveds -objc_sync_enter_m68k(void) +glue_objc_sync_enter PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) return objc_sync_enter(object); } int __saveds -objc_sync_exit_m68k(void) +glue_objc_sync_exit PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) return objc_sync_exit(object); } id __saveds -objc_getProperty_m68k(void) +glue_objc_getProperty PPC_PARAMS(id self, SEL _cmd, ptrdiff_t offset, + bool atomic) { - OBJC_M68K_ARG(id, self, a0) - OBJC_M68K_ARG(SEL, _cmd, a1) - OBJC_M68K_ARG(ptrdiff_t, offset, d0) - OBJC_M68K_ARG(bool, atomic, d1) + M68K_ARG(id, self, a0) + M68K_ARG(SEL, _cmd, a1) + M68K_ARG(ptrdiff_t, offset, d0) + M68K_ARG(bool, atomic, d1) return objc_getProperty(self, _cmd, offset, atomic); } void __saveds -objc_setProperty_m68k(void) -{ - OBJC_M68K_ARG(id, self, a0) - OBJC_M68K_ARG(SEL, _cmd, a1) - OBJC_M68K_ARG(ptrdiff_t, offset, d0) - OBJC_M68K_ARG(id, value, a2) - OBJC_M68K_ARG(bool, atomic, d1) - OBJC_M68K_ARG(signed char, copy, d2) +glue_objc_setProperty PPC_PARAMS(id self, SEL _cmd, ptrdiff_t offset, id value, + bool atomic, signed char copy) +{ + M68K_ARG(id, self, a0) + M68K_ARG(SEL, _cmd, a1) + M68K_ARG(ptrdiff_t, offset, d0) + M68K_ARG(id, value, a2) + M68K_ARG(bool, atomic, d1) + M68K_ARG(signed char, copy, d2) objc_setProperty(self, _cmd, offset, value, atomic, copy); } void __saveds -objc_getPropertyStruct_m68k(void) +glue_objc_getPropertyStruct PPC_PARAMS(void *dest, const void *src, + ptrdiff_t size, bool atomic, bool strong) { - OBJC_M68K_ARG(void *, dest, a0) - OBJC_M68K_ARG(const void *, src, a1) - OBJC_M68K_ARG(ptrdiff_t, size, d0) - OBJC_M68K_ARG(bool, atomic, d1) - OBJC_M68K_ARG(bool, strong, d2) + M68K_ARG(void *, dest, a0) + M68K_ARG(const void *, src, a1) + M68K_ARG(ptrdiff_t, size, d0) + M68K_ARG(bool, atomic, d1) + M68K_ARG(bool, strong, d2) objc_getPropertyStruct(dest, src, size, atomic, strong); } void __saveds -objc_setPropertyStruct_m68k(void) +glue_objc_setPropertyStruct PPC_PARAMS(void *dest, const void *src, + ptrdiff_t size, bool atomic, bool strong) { - OBJC_M68K_ARG(void *, dest, a0) - OBJC_M68K_ARG(const void *, src, a1) - OBJC_M68K_ARG(ptrdiff_t, size, d0) - OBJC_M68K_ARG(bool, atomic, d1) - OBJC_M68K_ARG(bool, strong, d2) + M68K_ARG(void *, dest, a0) + M68K_ARG(const void *, src, a1) + M68K_ARG(ptrdiff_t, size, d0) + M68K_ARG(bool, atomic, d1) + M68K_ARG(bool, strong, d2) objc_setPropertyStruct(dest, src, size, atomic, strong); } void __saveds -objc_enumerationMutation_m68k(void) +glue_objc_enumerationMutation PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) objc_enumerationMutation(object); } int __saveds -__gnu_objc_personality_v0_m68k(void) -{ -#ifndef HAVE_SJLJ_EXCEPTIONS - OBJC_M68K_ARG(int, version, d0) - OBJC_M68K_ARG(int, actions, d1) - OBJC_M68K_ARG(uint64_t *, exClass, d2) - OBJC_M68K_ARG(void *, ex, a0) - OBJC_M68K_ARG(void *, ctx, a1) - - return __gnu_objc_personality_v0(version, actions, *exClass, ex, ctx); -#else - abort(); - - OF_UNREACHABLE +glue___gnu_objc_personality PPC_PARAMS(int version, int actions, + uint64_t exClass, void *ex, void *ctx) +{ + M68K_ARG(int, version, d0) + M68K_ARG(int, actions, d1) + M68K_ARG(uint64_t *, exClassPtr, d2) + M68K_ARG(void *, ex, a0) + M68K_ARG(void *, ctx, a1) +#ifdef OF_AMIGAOS_M68K + uint64_t exClass = *exClassPtr; #endif -} -int __saveds -__gnu_objc_personality_sj0_m68k(void) -{ #ifdef HAVE_SJLJ_EXCEPTIONS - OBJC_M68K_ARG(int, version, d0) - OBJC_M68K_ARG(int, actions, d1) - OBJC_M68K_ARG(uint64_t *, exClass, d2) - OBJC_M68K_ARG(void *, ex, a0) - OBJC_M68K_ARG(void *, ctx, a1) - - return __gnu_objc_personality_sj0(version, actions, *exClass, ex, ctx); + return __gnu_objc_personality_sj0(version, actions, exClass, ex, ctx); #else - abort(); - - OF_UNREACHABLE + return __gnu_objc_personality_v0(version, actions, exClass, ex, ctx); #endif } id __saveds -objc_retain_m68k(void) +glue_objc_retain PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) return objc_retain(object); } id __saveds -objc_retainBlock_m68k(void) +glue_objc_retainBlock PPC_PARAMS(id block) { - OBJC_M68K_ARG(id, block, a0) + M68K_ARG(id, block, a0) return objc_retainBlock(block); } id __saveds -objc_retainAutorelease_m68k(void) +glue_objc_retainAutorelease PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) return objc_retainAutorelease(object); } void __saveds -objc_release_m68k(void) +glue_objc_release PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) objc_release(object); } id __saveds -objc_autorelease_m68k(void) +glue_objc_autorelease PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) return objc_autorelease(object); } id __saveds -objc_autoreleaseReturnValue_m68k(void) +glue_objc_autoreleaseReturnValue PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) return objc_autoreleaseReturnValue(object); } id __saveds -objc_retainAutoreleaseReturnValue_m68k(void) +glue_objc_retainAutoreleaseReturnValue PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) return objc_retainAutoreleaseReturnValue(object); } id __saveds -objc_retainAutoreleasedReturnValue_m68k(void) +glue_objc_retainAutoreleasedReturnValue PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) return objc_retainAutoreleasedReturnValue(object); } id __saveds -objc_storeStrong_m68k(void) +glue_objc_storeStrong PPC_PARAMS(id *object, id value) { - OBJC_M68K_ARG(id *, object, a0) - OBJC_M68K_ARG(id, value, a1) + M68K_ARG(id *, object, a0) + M68K_ARG(id, value, a1) return objc_storeStrong(object, value); } id __saveds -objc_storeWeak_m68k(void) +glue_objc_storeWeak PPC_PARAMS(id *object, id value) { - OBJC_M68K_ARG(id *, object, a0) - OBJC_M68K_ARG(id, value, a1) + M68K_ARG(id *, object, a0) + M68K_ARG(id, value, a1) return objc_storeWeak(object, value); } id __saveds -objc_loadWeakRetained_m68k(void) +glue_objc_loadWeakRetained PPC_PARAMS(id *object) { - OBJC_M68K_ARG(id *, object, a0) + M68K_ARG(id *, object, a0) return objc_loadWeakRetained(object); } id __saveds -objc_initWeak_m68k(void) +glue_objc_initWeak PPC_PARAMS(id *object, id value) { - OBJC_M68K_ARG(id *, object, a0) - OBJC_M68K_ARG(id, value, a1) + M68K_ARG(id *, object, a0) + M68K_ARG(id, value, a1) return objc_initWeak(object, value); } void __saveds -objc_destroyWeak_m68k(void) +glue_objc_destroyWeak PPC_PARAMS(id *object) { - OBJC_M68K_ARG(id *, object, a0) + M68K_ARG(id *, object, a0) objc_destroyWeak(object); } id __saveds -objc_loadWeak_m68k(void) +glue_objc_loadWeak PPC_PARAMS(id *object) { - OBJC_M68K_ARG(id *, object, a0) + M68K_ARG(id *, object, a0) return objc_loadWeak(object); } void __saveds -objc_copyWeak_m68k(void) +glue_objc_copyWeak PPC_PARAMS(id *dest, id *src) { - OBJC_M68K_ARG(id *, dest, a0) - OBJC_M68K_ARG(id *, src, a1) + M68K_ARG(id *, dest, a0) + M68K_ARG(id *, src, a1) objc_copyWeak(dest, src); } void __saveds -objc_moveWeak_m68k(void) +glue_objc_moveWeak PPC_PARAMS(id *dest, id *src) { - OBJC_M68K_ARG(id *, dest, a0) - OBJC_M68K_ARG(id *, src, a1) + M68K_ARG(id *, dest, a0) + M68K_ARG(id *, src, a1) objc_moveWeak(dest, src); } SEL __saveds -sel_registerName_m68k(void) +glue_sel_registerName PPC_PARAMS(const char *name) { - OBJC_M68K_ARG(const char *, name, a0) + M68K_ARG(const char *, name, a0) return sel_registerName(name); } const char *__saveds -sel_getName_m68k(void) +glue_sel_getName PPC_PARAMS(SEL selector) { - OBJC_M68K_ARG(SEL, selector, a0) + M68K_ARG(SEL, selector, a0) return sel_getName(selector); } bool __saveds -sel_isEqual_m68k(void) +glue_sel_isEqual PPC_PARAMS(SEL selector1, SEL selector2) { - OBJC_M68K_ARG(SEL, selector1, a0) - OBJC_M68K_ARG(SEL, selector2, a1) + M68K_ARG(SEL, selector1, a0) + M68K_ARG(SEL, selector2, a1) return sel_isEqual(selector1, selector2); } Class __saveds -objc_allocateClassPair_m68k(void) +glue_objc_allocateClassPair PPC_PARAMS(Class superclass, const char *name, + size_t extraBytes) { - OBJC_M68K_ARG(Class, superclass, a0) - OBJC_M68K_ARG(const char *, name, a1) - OBJC_M68K_ARG(size_t, extraBytes, d0) + M68K_ARG(Class, superclass, a0) + M68K_ARG(const char *, name, a1) + M68K_ARG(size_t, extraBytes, d0) return objc_allocateClassPair(superclass, name, extraBytes); } void __saveds -objc_registerClassPair_m68k(void) +glue_objc_registerClassPair PPC_PARAMS(Class class) { - OBJC_M68K_ARG(Class, class, a0) + M68K_ARG(Class, class, a0) objc_registerClassPair(class); } unsigned int __saveds -objc_getClassList_m68k(void) +glue_objc_getClassList PPC_PARAMS(Class *buffer, unsigned int count) { - OBJC_M68K_ARG(Class *, buffer, a0) - OBJC_M68K_ARG(unsigned int, count, d0) + M68K_ARG(Class *, buffer, a0) + M68K_ARG(unsigned int, count, d0) return objc_getClassList(buffer, count); } Class *__saveds -objc_copyClassList_m68k(void) +glue_objc_copyClassList PPC_PARAMS(unsigned int *length) { - OBJC_M68K_ARG(unsigned int *, length, a0) + M68K_ARG(unsigned int *, length, a0) return objc_copyClassList(length); } bool __saveds -class_isMetaClass_m68k(void) +glue_class_isMetaClass PPC_PARAMS(Class class) { - OBJC_M68K_ARG(Class, class, a0) + M68K_ARG(Class, class, a0) return class_isMetaClass(class); } const char *__saveds -class_getName_m68k(void) +glue_class_getName PPC_PARAMS(Class class) { - OBJC_M68K_ARG(Class, class, a0) + M68K_ARG(Class, class, a0) return class_getName(class); } Class __saveds -class_getSuperclass_m68k(void) +glue_class_getSuperclass PPC_PARAMS(Class class) { - OBJC_M68K_ARG(Class, class, a0) + M68K_ARG(Class, class, a0) return class_getSuperclass(class); } unsigned long __saveds -class_getInstanceSize_m68k(void) +glue_class_getInstanceSize PPC_PARAMS(Class class) { - OBJC_M68K_ARG(Class, class, a0) + M68K_ARG(Class, class, a0) return class_getInstanceSize(class); } bool __saveds -class_respondsToSelector_m68k(void) +glue_class_respondsToSelector PPC_PARAMS(Class class, SEL selector) { - OBJC_M68K_ARG(Class, class, a0) - OBJC_M68K_ARG(SEL, selector, a1) + M68K_ARG(Class, class, a0) + M68K_ARG(SEL, selector, a1) return class_respondsToSelector(class, selector); } bool __saveds -class_conformsToProtocol_m68k(void) +glue_class_conformsToProtocol PPC_PARAMS(Class class, Protocol *protocol) { - OBJC_M68K_ARG(Class, class, a0) - OBJC_M68K_ARG(Protocol *, protocol, a1) + M68K_ARG(Class, class, a0) + M68K_ARG(Protocol *, protocol, a1) return class_conformsToProtocol(class, protocol); } IMP __saveds -class_getMethodImplementation_m68k(void) +glue_class_getMethodImplementation PPC_PARAMS(Class class, SEL selector) { - OBJC_M68K_ARG(Class, class, a0) - OBJC_M68K_ARG(SEL, selector, a1) + M68K_ARG(Class, class, a0) + M68K_ARG(SEL, selector, a1) return class_getMethodImplementation(class, selector); } IMP __saveds -class_getMethodImplementation_stret_m68k(void) +glue_class_getMethodImplementation_stret PPC_PARAMS(Class class, SEL selector) { - OBJC_M68K_ARG(Class, class, a0) - OBJC_M68K_ARG(SEL, selector, a1) + M68K_ARG(Class, class, a0) + M68K_ARG(SEL, selector, a1) return class_getMethodImplementation_stret(class, selector); } const char *__saveds -class_getMethodTypeEncoding_m68k(void) +glue_class_getMethodTypeEncoding PPC_PARAMS(Class class, SEL selector) { - OBJC_M68K_ARG(Class, class, a0) - OBJC_M68K_ARG(SEL, selector, a1) + M68K_ARG(Class, class, a0) + M68K_ARG(SEL, selector, a1) return class_getMethodTypeEncoding(class, selector); } bool __saveds -class_addMethod_m68k(void) +glue_class_addMethod PPC_PARAMS(Class class, SEL selector, IMP implementation, + const char *typeEncoding) { - OBJC_M68K_ARG(Class, class, a0) - OBJC_M68K_ARG(SEL, selector, a1) - OBJC_M68K_ARG(IMP, implementation, a2) - OBJC_M68K_ARG(const char *, typeEncoding, a3) + M68K_ARG(Class, class, a0) + M68K_ARG(SEL, selector, a1) + M68K_ARG(IMP, implementation, a2) + M68K_ARG(const char *, typeEncoding, a3) return class_addMethod(class, selector, implementation, typeEncoding); } IMP __saveds -class_replaceMethod_m68k(void) +glue_class_replaceMethod PPC_PARAMS(Class class, SEL selector, + IMP implementation, const char *typeEncoding) { - OBJC_M68K_ARG(Class, class, a0) - OBJC_M68K_ARG(SEL, selector, a1) - OBJC_M68K_ARG(IMP, implementation, a2) - OBJC_M68K_ARG(const char *, typeEncoding, a3) + M68K_ARG(Class, class, a0) + M68K_ARG(SEL, selector, a1) + M68K_ARG(IMP, implementation, a2) + M68K_ARG(const char *, typeEncoding, a3) return class_replaceMethod(class, selector, implementation, typeEncoding); } Class __saveds -object_getClass_m68k(void) +glue_object_getClass PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) return object_getClass(object); } Class __saveds -object_setClass_m68k(void) +glue_object_setClass PPC_PARAMS(id object, Class class) { - OBJC_M68K_ARG(id, object, a0) - OBJC_M68K_ARG(Class, class, a1) + M68K_ARG(id, object, a0) + M68K_ARG(Class, class, a1) return object_setClass(object, class); } const char *__saveds -object_getClassName_m68k(void) +glue_object_getClassName PPC_PARAMS(id object) { - OBJC_M68K_ARG(id, object, a0) + M68K_ARG(id, object, a0) return object_getClassName(object); } const char *__saveds -protocol_getName_m68k(void) +glue_protocol_getName PPC_PARAMS(Protocol *protocol) { - OBJC_M68K_ARG(Protocol *, protocol, a0) + M68K_ARG(Protocol *, protocol, a0) return protocol_getName(protocol); } bool __saveds -protocol_isEqual_m68k(void) +glue_protocol_isEqual PPC_PARAMS(Protocol *protocol1, Protocol *protocol2) { - OBJC_M68K_ARG(Protocol *, protocol1, a0) - OBJC_M68K_ARG(Protocol *, protocol2, a1) + M68K_ARG(Protocol *, protocol1, a0) + M68K_ARG(Protocol *, protocol2, a1) return protocol_isEqual(protocol1, protocol2); } bool __saveds -protocol_conformsToProtocol_m68k(void) +glue_protocol_conformsToProtocol PPC_PARAMS(Protocol *protocol1, + Protocol *protocol2) { - OBJC_M68K_ARG(Protocol *, protocol1, a0) - OBJC_M68K_ARG(Protocol *, protocol2, a1) + M68K_ARG(Protocol *, protocol1, a0) + M68K_ARG(Protocol *, protocol2, a1) return protocol_conformsToProtocol(protocol1, protocol2); } -void __saveds -objc_exit_m68k(void) -{ - objc_exit(); -} - -objc_uncaught_exception_handler_t __saveds -objc_setUncaughtExceptionHandler_m68k(void) -{ - OBJC_M68K_ARG(objc_uncaught_exception_handler_t, handler, a0) +objc_uncaught_exception_handler_t __saveds +glue_objc_setUncaughtExceptionHandler PPC_PARAMS( + objc_uncaught_exception_handler_t handler) +{ + M68K_ARG(objc_uncaught_exception_handler_t, handler, a0) return objc_setUncaughtExceptionHandler(handler); } void __saveds -objc_setForwardHandler_m68k(void) +glue_objc_setForwardHandler PPC_PARAMS(IMP forward, IMP stretForward) { - OBJC_M68K_ARG(IMP, forward, a0) - OBJC_M68K_ARG(IMP, stretForward, a1) + M68K_ARG(IMP, forward, a0) + M68K_ARG(IMP, stretForward, a1) objc_setForwardHandler(forward, stretForward); } void __saveds -objc_setEnumerationMutationHandler_m68k(void) +glue_objc_setEnumerationMutationHandler PPC_PARAMS( + objc_enumeration_mutation_handler_t handler) { - OBJC_M68K_ARG(objc_enumeration_mutation_handler_t, handler, a0) + M68K_ARG(objc_enumeration_mutation_handler_t, handler, a0) objc_setEnumerationMutationHandler(handler); } void __saveds -objc_zero_weak_references_m68k(void) +glue_objc_zero_weak_references PPC_PARAMS(id value) { - OBJC_M68K_ARG(id, value, a0) + M68K_ARG(id, value, a0) objc_zero_weak_references(value); } + +void __saveds +glue_objc_exit(void) +{ + objc_exit(); +} Index: src/runtime/amiga-library.m ================================================================== --- src/runtime/amiga-library.m +++ src/runtime/amiga-library.m @@ -60,77 +60,76 @@ extern uintptr_t __CTOR_LIST__[]; extern const void *_EH_FRAME_BEGINS__; extern void *_EH_FRAME_OBJECTS__; #endif -extern bool objc_init_m68k(void); -extern void __objc_exec_class_m68k(void); -extern IMP _Nonnull objc_msg_lookup_m68k(void); -extern IMP _Nonnull objc_msg_lookup_stret_m68k(void); -extern IMP _Nonnull objc_msg_lookup_super_m68k(void); -extern IMP _Nonnull objc_msg_lookup_super_stret_m68k(void); -extern Class _Nullable objc_lookUpClass_m68k(void); -extern Class _Nullable objc_getClass_m68k(void); -extern Class _Nonnull objc_getRequiredClass_m68k(void); -extern Class _Nullable objc_lookup_class_m68k(void); -extern Class _Nonnull objc_get_class_m68k(void); -extern void objc_exception_throw_m68k(void); -extern int objc_sync_enter_m68k(void); -extern int objc_sync_exit_m68k(void); -extern id _Nullable objc_getProperty_m68k(void); -extern void objc_setProperty_m68k(void); -extern void objc_getPropertyStruct_m68k(void); -extern void objc_setPropertyStruct_m68k(void); -extern void objc_enumerationMutation_m68k(void); -extern int __gnu_objc_personality_v0_m68k(void); -extern int __gnu_objc_personality_sj0_m68k(void); -extern id _Nullable objc_retain_m68k(void); -extern id _Nullable objc_retainBlock_m68k(void); -extern id _Nullable objc_retainAutorelease_m68k(void); -extern void objc_release_m68k(void); -extern id _Nullable objc_autorelease_m68k(void); -extern id _Nullable objc_autoreleaseReturnValue_m68k(void); -extern id _Nullable objc_retainAutoreleaseReturnValue_m68k(void); -extern id _Nullable objc_retainAutoreleasedReturnValue_m68k(void); -extern id _Nullable objc_storeStrong_m68k(void); -extern id _Nullable objc_storeWeak_m68k(void); -extern id _Nullable objc_loadWeakRetained_m68k(void); -extern id _Nullable objc_initWeak_m68k(void); -extern void objc_destroyWeak_m68k(void); -extern id _Nullable objc_loadWeak_m68k(void); -extern void objc_copyWeak_m68k(void); -extern void objc_moveWeak_m68k(void); -extern SEL _Nonnull sel_registerName_m68k(void); -extern const char *_Nonnull sel_getName_m68k(void); -extern bool sel_isEqual_m68k(void); -extern Class _Nonnull objc_allocateClassPair_m68k(void); -extern void objc_registerClassPair_m68k(void); -extern unsigned int objc_getClassList_m68k(void); -extern Class _Nonnull *_Nonnull objc_copyClassList_m68k(void); -extern bool class_isMetaClass_m68k(void); -extern const char *_Nullable class_getName_m68k(void); -extern Class _Nullable class_getSuperclass_m68k(void); -extern unsigned long class_getInstanceSize_m68k(void); -extern bool class_respondsToSelector_m68k(void); -extern bool class_conformsToProtocol_m68k(void); -extern IMP _Nullable class_getMethodImplementation_m68k(void); -extern IMP _Nullable class_getMethodImplementation_stret_m68k(void); -extern const char *_Nullable class_getMethodTypeEncoding_m68k(void); -extern bool class_addMethod_m68k(void); -extern IMP _Nullable class_replaceMethod_m68k(void); -extern Class _Nullable object_getClass_m68k(void); -extern Class _Nullable object_setClass_m68k(void); -extern const char *_Nullable object_getClassName_m68k(void); -extern const char *_Nonnull protocol_getName_m68k(void); -extern bool protocol_isEqual_m68k(void); -extern bool protocol_conformsToProtocol_m68k(void); -extern void objc_exit_m68k(void); +extern bool glue_objc_init(void); +extern void glue___objc_exec_class(void); +extern IMP _Nonnull glue_objc_msg_lookup(void); +extern IMP _Nonnull glue_objc_msg_lookup_stret(void); +extern IMP _Nonnull glue_objc_msg_lookup_super(void); +extern IMP _Nonnull glue_objc_msg_lookup_super_stret(void); +extern Class _Nullable glue_objc_lookUpClass(void); +extern Class _Nullable glue_objc_getClass(void); +extern Class _Nonnull glue_objc_getRequiredClass(void); +extern Class _Nullable glue_objc_lookup_class(void); +extern Class _Nonnull glue_objc_get_class(void); +extern void glue_objc_exception_throw(void); +extern int glue_objc_sync_enter(void); +extern int glue_objc_sync_exit(void); +extern id _Nullable glue_objc_getProperty(void); +extern void glue_objc_setProperty(void); +extern void glue_objc_getPropertyStruct(void); +extern void glue_objc_setPropertyStruct(void); +extern void glue_objc_enumerationMutation(void); +extern int glue___gnu_objc_personality(void); +extern id _Nullable glue_objc_retain(void); +extern id _Nullable glue_objc_retainBlock(void); +extern id _Nullable glue_objc_retainAutorelease(void); +extern void glue_objc_release(void); +extern id _Nullable glue_objc_autorelease(void); +extern id _Nullable glue_objc_autoreleaseReturnValue(void); +extern id _Nullable glue_objc_retainAutoreleaseReturnValue(void); +extern id _Nullable glue_objc_retainAutoreleasedReturnValue(void); +extern id _Nullable glue_objc_storeStrong(void); +extern id _Nullable glue_objc_storeWeak(void); +extern id _Nullable glue_objc_loadWeakRetained(void); +extern id _Nullable glue_objc_initWeak(void); +extern void glue_objc_destroyWeak(void); +extern id _Nullable glue_objc_loadWeak(void); +extern void glue_objc_copyWeak(void); +extern void glue_objc_moveWeak(void); +extern SEL _Nonnull glue_sel_registerName(void); +extern const char *_Nonnull glue_sel_getName(void); +extern bool glue_sel_isEqual(void); +extern Class _Nonnull glue_objc_allocateClassPair(void); +extern void glue_objc_registerClassPair(void); +extern unsigned int glue_objc_getClassList(void); +extern Class _Nonnull *_Nonnull glue_objc_copyClassList(void); +extern bool glue_class_isMetaClass(void); +extern const char *_Nullable glue_class_getName(void); +extern Class _Nullable glue_class_getSuperclass(void); +extern unsigned long glue_class_getInstanceSize(void); +extern bool glue_class_respondsToSelector(void); +extern bool glue_class_conformsToProtocol(void); +extern IMP _Nullable glue_class_getMethodImplementation(void); +extern IMP _Nullable glue_class_getMethodImplementation_stret(void); +extern const char *_Nullable glue_class_getMethodTypeEncoding(void); +extern bool glue_class_addMethod(void); +extern IMP _Nullable glue_class_replaceMethod(void); +extern Class _Nullable glue_object_getClass(void); +extern Class _Nullable glue_object_setClass(void); +extern const char *_Nullable glue_object_getClassName(void); +extern const char *_Nonnull glue_protocol_getName(void); +extern bool glue_protocol_isEqual(void); +extern bool glue_protocol_conformsToProtocol(void); extern _Nullable objc_uncaught_exception_handler_t - objc_setUncaughtExceptionHandler_m68k(void); -extern void objc_setForwardHandler_m68k(void); -extern void objc_setEnumerationMutationHandler_m68k(void); -extern void objc_zero_weak_references_m68k(void); + glue_objc_setUncaughtExceptionHandler(void); +extern void glue_objc_setForwardHandler(void); +extern void glue_objc_setEnumerationMutationHandler(void); +extern void glue_objc_zero_weak_references(void); +extern void glue_objc_exit(void); #ifdef OF_MORPHOS const ULONG __abox__ = 1; #endif struct ExecBase *SysBase; @@ -146,20 +145,18 @@ "___restore_a4:\n" " movea.l 42(a6), a4\n" " rts" ); #elif defined(OF_MORPHOS) +/* All __saveds functions in this file need to use the M68K ABI */ __asm__ ( ".section .text\n" - ".globl __restore_r13\n" ".align 2\n" "__restore_r13:\n" " lwz %r13, 56(%r2)\n" " lwz %r13, 44(%r13)\n" " blr\n" - ".type __restore_r13, @function\n" - ".size __restore_r13, .-__restore_r13" ); #endif static OF_INLINE char * getDataSeg(void) @@ -375,18 +372,19 @@ { return NULL; } bool -objc_init(void) +objc_init(unsigned int version, struct objc_libc *libc_, FILE *stdout_, + FILE *stderr_) { +#ifdef OF_AMIGAOS_M68K OBJC_M68K_ARG(struct ObjFWRTBase *, base, a6) - OBJC_M68K_ARG(unsigned int, version, d0) - OBJC_M68K_ARG(struct objc_libc *, libc_, a0) - OBJC_M68K_ARG(FILE *, stdout_, a1) - OBJC_M68K_ARG(FILE *, stderr_, a2) - +#else + register struct ObjFWRTBase *r12 __asm__("r12"); + struct ObjFWRTBase *base = r12; +#endif uintptr_t *iter, *iter0; if (version > 1) return false; @@ -565,76 +563,79 @@ #endif (CONST_APTR)lib_open, (CONST_APTR)lib_close, (CONST_APTR)lib_expunge, (CONST_APTR)lib_null, - (CONST_APTR)objc_init_m68k, - (CONST_APTR)__objc_exec_class_m68k, - (CONST_APTR)objc_msg_lookup_m68k, - (CONST_APTR)objc_msg_lookup_stret_m68k, - (CONST_APTR)objc_msg_lookup_super_m68k, - (CONST_APTR)objc_msg_lookup_super_stret_m68k, - (CONST_APTR)objc_lookUpClass_m68k, - (CONST_APTR)objc_getClass_m68k, - (CONST_APTR)objc_getRequiredClass_m68k, - (CONST_APTR)objc_lookup_class_m68k, - (CONST_APTR)objc_get_class_m68k, - (CONST_APTR)objc_exception_throw_m68k, - (CONST_APTR)objc_sync_enter_m68k, - (CONST_APTR)objc_sync_exit_m68k, - (CONST_APTR)objc_getProperty_m68k, - (CONST_APTR)objc_setProperty_m68k, - (CONST_APTR)objc_getPropertyStruct_m68k, - (CONST_APTR)objc_setPropertyStruct_m68k, - (CONST_APTR)objc_enumerationMutation_m68k, - (CONST_APTR)__gnu_objc_personality_v0_m68k, - (CONST_APTR)__gnu_objc_personality_sj0_m68k, - (CONST_APTR)objc_retain_m68k, - (CONST_APTR)objc_retainBlock_m68k, - (CONST_APTR)objc_retainAutorelease_m68k, - (CONST_APTR)objc_release_m68k, - (CONST_APTR)objc_autorelease_m68k, - (CONST_APTR)objc_autoreleaseReturnValue_m68k, - (CONST_APTR)objc_retainAutoreleaseReturnValue_m68k, - (CONST_APTR)objc_retainAutoreleasedReturnValue_m68k, - (CONST_APTR)objc_storeStrong_m68k, - (CONST_APTR)objc_storeWeak_m68k, - (CONST_APTR)objc_loadWeakRetained_m68k, - (CONST_APTR)objc_initWeak_m68k, - (CONST_APTR)objc_destroyWeak_m68k, - (CONST_APTR)objc_loadWeak_m68k, - (CONST_APTR)objc_copyWeak_m68k, - (CONST_APTR)objc_moveWeak_m68k, - (CONST_APTR)sel_registerName_m68k, - (CONST_APTR)sel_getName_m68k, - (CONST_APTR)sel_isEqual_m68k, - (CONST_APTR)objc_allocateClassPair_m68k, - (CONST_APTR)objc_registerClassPair_m68k, - (CONST_APTR)objc_getClassList_m68k, - (CONST_APTR)objc_copyClassList_m68k, - (CONST_APTR)class_isMetaClass_m68k, - (CONST_APTR)class_getName_m68k, - (CONST_APTR)class_getSuperclass_m68k, - (CONST_APTR)class_getInstanceSize_m68k, - (CONST_APTR)class_respondsToSelector_m68k, - (CONST_APTR)class_conformsToProtocol_m68k, - (CONST_APTR)class_getMethodImplementation_m68k, - (CONST_APTR)class_getMethodImplementation_stret_m68k, - (CONST_APTR)class_getMethodTypeEncoding_m68k, - (CONST_APTR)class_addMethod_m68k, - (CONST_APTR)class_replaceMethod_m68k, - (CONST_APTR)object_getClass_m68k, - (CONST_APTR)object_setClass_m68k, - (CONST_APTR)object_getClassName_m68k, - (CONST_APTR)protocol_getName_m68k, - (CONST_APTR)protocol_isEqual_m68k, - (CONST_APTR)protocol_conformsToProtocol_m68k, - (CONST_APTR)objc_exit_m68k, - (CONST_APTR)objc_setUncaughtExceptionHandler_m68k, - (CONST_APTR)objc_setForwardHandler_m68k, - (CONST_APTR)objc_setEnumerationMutationHandler_m68k, - (CONST_APTR)objc_zero_weak_references_m68k, +#ifdef OF_MORPHOS + (CONST_APTR)-1, + (CONST_APTR)FUNCARRAY_32BIT_SYSTEMV, +#endif + (CONST_APTR)glue_objc_init, + (CONST_APTR)glue___objc_exec_class, + (CONST_APTR)glue_objc_msg_lookup, + (CONST_APTR)glue_objc_msg_lookup_stret, + (CONST_APTR)glue_objc_msg_lookup_super, + (CONST_APTR)glue_objc_msg_lookup_super_stret, + (CONST_APTR)glue_objc_lookUpClass, + (CONST_APTR)glue_objc_getClass, + (CONST_APTR)glue_objc_getRequiredClass, + (CONST_APTR)glue_objc_lookup_class, + (CONST_APTR)glue_objc_get_class, + (CONST_APTR)glue_objc_exception_throw, + (CONST_APTR)glue_objc_sync_enter, + (CONST_APTR)glue_objc_sync_exit, + (CONST_APTR)glue_objc_getProperty, + (CONST_APTR)glue_objc_setProperty, + (CONST_APTR)glue_objc_getPropertyStruct, + (CONST_APTR)glue_objc_setPropertyStruct, + (CONST_APTR)glue_objc_enumerationMutation, + (CONST_APTR)glue___gnu_objc_personality, + (CONST_APTR)glue_objc_retain, + (CONST_APTR)glue_objc_retainBlock, + (CONST_APTR)glue_objc_retainAutorelease, + (CONST_APTR)glue_objc_release, + (CONST_APTR)glue_objc_autorelease, + (CONST_APTR)glue_objc_autoreleaseReturnValue, + (CONST_APTR)glue_objc_retainAutoreleaseReturnValue, + (CONST_APTR)glue_objc_retainAutoreleasedReturnValue, + (CONST_APTR)glue_objc_storeStrong, + (CONST_APTR)glue_objc_storeWeak, + (CONST_APTR)glue_objc_loadWeakRetained, + (CONST_APTR)glue_objc_initWeak, + (CONST_APTR)glue_objc_destroyWeak, + (CONST_APTR)glue_objc_loadWeak, + (CONST_APTR)glue_objc_copyWeak, + (CONST_APTR)glue_objc_moveWeak, + (CONST_APTR)glue_sel_registerName, + (CONST_APTR)glue_sel_getName, + (CONST_APTR)glue_sel_isEqual, + (CONST_APTR)glue_objc_allocateClassPair, + (CONST_APTR)glue_objc_registerClassPair, + (CONST_APTR)glue_objc_getClassList, + (CONST_APTR)glue_objc_copyClassList, + (CONST_APTR)glue_class_isMetaClass, + (CONST_APTR)glue_class_getName, + (CONST_APTR)glue_class_getSuperclass, + (CONST_APTR)glue_class_getInstanceSize, + (CONST_APTR)glue_class_respondsToSelector, + (CONST_APTR)glue_class_conformsToProtocol, + (CONST_APTR)glue_class_getMethodImplementation, + (CONST_APTR)glue_class_getMethodImplementation_stret, + (CONST_APTR)glue_class_getMethodTypeEncoding, + (CONST_APTR)glue_class_addMethod, + (CONST_APTR)glue_class_replaceMethod, + (CONST_APTR)glue_object_getClass, + (CONST_APTR)glue_object_setClass, + (CONST_APTR)glue_object_getClassName, + (CONST_APTR)glue_protocol_getName, + (CONST_APTR)glue_protocol_isEqual, + (CONST_APTR)glue_protocol_conformsToProtocol, + (CONST_APTR)glue_objc_setUncaughtExceptionHandler, + (CONST_APTR)glue_objc_setForwardHandler, + (CONST_APTR)glue_objc_setEnumerationMutationHandler, + (CONST_APTR)glue_objc_zero_weak_references, + (CONST_APTR)glue_objc_exit, (CONST_APTR)-1, #ifdef OF_MORPHOS (CONST_APTR)FUNCARRAY_END #endif }; Index: src/runtime/amigaos3.sfd ================================================================== --- src/runtime/amigaos3.sfd +++ src/runtime/amigaos3.sfd @@ -2,74 +2,73 @@ ==basetype struct Library * ==libname objfwrt68k.library ==bias 30 ==public * Functions that are only for the linklib. -bool objc_init(unsigned int version, struct objc_libc *libc, FILE *stdout, FILE *stderr)(d0,a0,a1,a2) +bool glue_objc_init(unsigned int version, struct objc_libc *libc, FILE *stdout, FILE *stderr)(d0,a0,a1,a2) * These have a built-in declaration in the compiler that does not use the * registers and thus always need glue. -void __objc_exec_class(void *_Nonnull module)(a0) -IMP _Nonnull objc_msg_lookup(id _Nullable object, SEL _Nonnull selector)(a0,a1) -IMP _Nonnull objc_msg_lookup_stret(id _Nullable object, SEL _Nonnull selector)(a0,a1) -IMP _Nonnull objc_msg_lookup_super(struct objc_super *_Nonnull super, SEL _Nonnull selector)(a0,a1) -IMP _Nonnull objc_msg_lookup_super_stret(struct objc_super *_Nonnull super, SEL _Nonnull selector)(a0,a1) -Class _Nullable objc_lookUpClass(const char *_Nonnull name)(a0) -Class _Nullable objc_getClass(const char *_Nonnull name)(a0) -Class _Nonnull objc_getRequiredClass(const char *_Nonnull name)(a0) -Class _Nullable objc_lookup_class(const char *_Nonnull name)(a0) -Class _Nonnull objc_get_class(const char *_Nonnull name)(a0) -void objc_exception_throw(id _Nonnull object)(a0) -int objc_sync_enter(id _Nullable object)(a0) -int objc_sync_exit(id _Nullable object)(a0) -id objc_getProperty(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, bool atomic)(a0,a1,d0,d1) -void objc_setProperty(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, id value, bool atomic, signed char copy)(a0,a1,d0,a2,d1,d2) -void objc_getPropertyStruct(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong)(a0,a1,d0,d1,d2) -void objc_setPropertyStruct(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong)(a0,a1,d0,d1,d2) -void objc_enumerationMutation(id _Nonnull object)(a0) -int __gnu_objc_personality_v0_m68k(int version, int actions, uint64_t *_Nonnull exClass, void *_Nonnull ex, void *_Nonnull ctx)(d0,d1,d2,a0,a1) -int __gnu_objc_personality_sj0_m68k(int version, int actions, uint64_t *_Nonnull exClass, void *_Nonnull ex, void *_Nonnull ctx)(d0,d1,d2,a0,a1) -id _Nullable objc_retain(id _Nullable object)(a0) -id _Nullable objc_retainBlock(id _Nullable block)(a0) -id _Nullable objc_retainAutorelease(id _Nullable object)(a0) -void objc_release(id _Nullable object)(a0) -id _Nullable objc_autorelease(id _Nullable object)(a0) -id _Nullable objc_autoreleaseReturnValue(id _Nullable object)(a0) -id _Nullable objc_retainAutoreleaseReturnValue(id _Nullable object)(a0) -id _Nullable objc_retainAutoreleasedReturnValue(id _Nullable object)(a0) -id _Nullable objc_storeStrong(id _Nullable *_Nonnull object, id _Nullable value)(a0,a1) -id _Nullable objc_storeWeak(id _Nullable *_Nonnull object, id _Nullable value)(a0,a1) -id _Nullable objc_loadWeakRetained(id _Nullable *_Nonnull object)(a0) -id _Nullable objc_initWeak(id _Nullable *_Nonnull object, id _Nullable value)(a0,a1) -void objc_destroyWeak(id _Nullable *_Nonnull object)(a0) -id _Nullable objc_loadWeak(id _Nullable *_Nonnull object)(a0) -void objc_copyWeak(id _Nullable *_Nonnull dest, id _Nullable *_Nonnull src)(a0,a1) -void objc_moveWeak(id _Nullable *_Nonnull dest, id _Nullable *_Nonnull src)(a0,a1) -SEL _Nonnull sel_registerName(const char *_Nonnull name)(a0) -const char *_Nonnull sel_getName(SEL _Nonnull selector)(a0) -bool sel_isEqual(SEL _Nonnull selector1, SEL _Nonnull selector2)(a0,a1) -Class _Nonnull objc_allocateClassPair(Class _Nullable superclass, const char *_Nonnull name, size_t extraBytes)(a0,a1,d0) -void objc_registerClassPair(Class _Nonnull class_)(a0) -unsigned int objc_getClassList(Class _Nonnull *_Nullable buffer, unsigned int count)(a0,d0) -Class _Nonnull *_Nonnull objc_copyClassList(unsigned int *_Nullable length)(a0) -bool class_isMetaClass(Class _Nullable class_)(a0) -const char *_Nullable class_getName(Class _Nullable class_)(a0) -Class _Nullable class_getSuperclass(Class _Nullable class_)(a0) -unsigned long class_getInstanceSize(Class _Nullable class_)(a0) -bool class_respondsToSelector(Class _Nullable class_, SEL _Nonnull selector)(a0,a1) -bool class_conformsToProtocol(Class _Nullable class_, Protocol *_Nonnull p)(a0,a1) -IMP _Nullable class_getMethodImplementation(Class _Nullable class_, SEL _Nonnull selector)(a0,a1) -IMP _Nullable class_getMethodImplementation_stret(Class _Nullable class_, SEL _Nonnull selector)(a0,a1) -const char *_Nullable class_getMethodTypeEncoding(Class _Nullable class_, SEL _Nonnull selector)(a0,a1) -bool class_addMethod(Class _Nonnull class_, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding)(a0,a1,a2,a3) -IMP _Nullable class_replaceMethod(Class _Nonnull class_, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding)(a0,a1,a2,a3) -Class _Nullable object_getClass(id _Nullable object)(a0) -Class _Nullable object_setClass(id _Nullable object, Class _Nonnull class_)(a0,a1) -const char *_Nullable object_getClassName(id _Nullable object)(a0) -const char *_Nonnull protocol_getName(Protocol *_Nonnull protocol)(a0) -bool protocol_isEqual(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2)(a0,a1) -bool protocol_conformsToProtocol(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2)(a0,a1) -void objc_exit(void)() -_Nullable objc_uncaught_exception_handler_t objc_setUncaughtExceptionHandler(objc_uncaught_exception_handler_t _Nullable handler)(a0) -void objc_setForwardHandler(IMP _Nullable forward, IMP _Nullable stretForward)(a0,a1) -void objc_setEnumerationMutationHandler(objc_enumeration_mutation_handler_t _Nullable handler)(a0) -void objc_zero_weak_references(id _Nonnull value)(a0) +void glue___objc_exec_class(void *_Nonnull module)(a0) +IMP _Nonnull glue_objc_msg_lookup(id _Nullable object, SEL _Nonnull selector)(a0,a1) +IMP _Nonnull glue_objc_msg_lookup_stret(id _Nullable object, SEL _Nonnull selector)(a0,a1) +IMP _Nonnull glue_objc_msg_lookup_super(struct objc_super *_Nonnull super, SEL _Nonnull selector)(a0,a1) +IMP _Nonnull glue_objc_msg_lookup_super_stret(struct objc_super *_Nonnull super, SEL _Nonnull selector)(a0,a1) +Class _Nullable glue_objc_lookUpClass(const char *_Nonnull name)(a0) +Class _Nullable glue_objc_getClass(const char *_Nonnull name)(a0) +Class _Nonnull glue_objc_getRequiredClass(const char *_Nonnull name)(a0) +Class _Nullable glue_objc_lookup_class(const char *_Nonnull name)(a0) +Class _Nonnull glue_objc_get_class(const char *_Nonnull name)(a0) +void glue_objc_exception_throw(id _Nonnull object)(a0) +int glue_objc_sync_enter(id _Nullable object)(a0) +int glue_objc_sync_exit(id _Nullable object)(a0) +id glue_objc_getProperty(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, bool atomic)(a0,a1,d0,d1) +void glue_objc_setProperty(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, id value, bool atomic, signed char copy)(a0,a1,d0,a2,d1,d2) +void glue_objc_getPropertyStruct(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong)(a0,a1,d0,d1,d2) +void glue_objc_setPropertyStruct(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong)(a0,a1,d0,d1,d2) +void glue_objc_enumerationMutation(id _Nonnull object)(a0) +int glue___gnu_objc_personality(int version, int actions, uint64_t *_Nonnull exClass, void *_Nonnull ex, void *_Nonnull ctx)(d0,d1,d2,a0,a1) +id _Nullable glue_objc_retain(id _Nullable object)(a0) +id _Nullable glue_objc_retainBlock(id _Nullable block)(a0) +id _Nullable glue_objc_retainAutorelease(id _Nullable object)(a0) +void glue_objc_release(id _Nullable object)(a0) +id _Nullable glue_objc_autorelease(id _Nullable object)(a0) +id _Nullable glue_objc_autoreleaseReturnValue(id _Nullable object)(a0) +id _Nullable glue_objc_retainAutoreleaseReturnValue(id _Nullable object)(a0) +id _Nullable glue_objc_retainAutoreleasedReturnValue(id _Nullable object)(a0) +id _Nullable glue_objc_storeStrong(id _Nullable *_Nonnull object, id _Nullable value)(a0,a1) +id _Nullable glue_objc_storeWeak(id _Nullable *_Nonnull object, id _Nullable value)(a0,a1) +id _Nullable glue_objc_loadWeakRetained(id _Nullable *_Nonnull object)(a0) +id _Nullable glue_objc_initWeak(id _Nullable *_Nonnull object, id _Nullable value)(a0,a1) +void glue_objc_destroyWeak(id _Nullable *_Nonnull object)(a0) +id _Nullable glue_objc_loadWeak(id _Nullable *_Nonnull object)(a0) +void glue_objc_copyWeak(id _Nullable *_Nonnull dest, id _Nullable *_Nonnull src)(a0,a1) +void glue_objc_moveWeak(id _Nullable *_Nonnull dest, id _Nullable *_Nonnull src)(a0,a1) +SEL _Nonnull glue_sel_registerName(const char *_Nonnull name)(a0) +const char *_Nonnull glue_sel_getName(SEL _Nonnull selector)(a0) +bool glue_sel_isEqual(SEL _Nonnull selector1, SEL _Nonnull selector2)(a0,a1) +Class _Nonnull glue_objc_allocateClassPair(Class _Nullable superclass, const char *_Nonnull name, size_t extraBytes)(a0,a1,d0) +void glue_objc_registerClassPair(Class _Nonnull class_)(a0) +unsigned int glue_objc_getClassList(Class _Nonnull *_Nullable buffer, unsigned int count)(a0,d0) +Class _Nonnull *_Nonnull glue_objc_copyClassList(unsigned int *_Nullable length)(a0) +bool glue_class_isMetaClass(Class _Nullable class_)(a0) +const char *_Nullable glue_class_getName(Class _Nullable class_)(a0) +Class _Nullable glue_class_getSuperclass(Class _Nullable class_)(a0) +unsigned long glue_class_getInstanceSize(Class _Nullable class_)(a0) +bool glue_class_respondsToSelector(Class _Nullable class_, SEL _Nonnull selector)(a0,a1) +bool glue_class_conformsToProtocol(Class _Nullable class_, Protocol *_Nonnull p)(a0,a1) +IMP _Nullable glue_class_getMethodImplementation(Class _Nullable class_, SEL _Nonnull selector)(a0,a1) +IMP _Nullable glue_class_getMethodImplementation_stret(Class _Nullable class_, SEL _Nonnull selector)(a0,a1) +const char *_Nullable glue_class_getMethodTypeEncoding(Class _Nullable class_, SEL _Nonnull selector)(a0,a1) +bool glue_class_addMethod(Class _Nonnull class_, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding)(a0,a1,a2,a3) +IMP _Nullable glue_class_replaceMethod(Class _Nonnull class_, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding)(a0,a1,a2,a3) +Class _Nullable glue_object_getClass(id _Nullable object)(a0) +Class _Nullable glue_object_setClass(id _Nullable object, Class _Nonnull class_)(a0,a1) +const char *_Nullable glue_object_getClassName(id _Nullable object)(a0) +const char *_Nonnull glue_protocol_getName(Protocol *_Nonnull protocol)(a0) +bool glue_protocol_isEqual(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2)(a0,a1) +bool glue_protocol_conformsToProtocol(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2)(a0,a1) +_Nullable objc_uncaught_exception_handler_t glue_objc_setUncaughtExceptionHandler(objc_uncaught_exception_handler_t _Nullable handler)(a0) +void glue_objc_setForwardHandler(IMP _Nullable forward, IMP _Nullable stretForward)(a0,a1) +void glue_objc_setEnumerationMutationHandler(objc_enumeration_mutation_handler_t _Nullable handler)(a0) +void glue_objc_zero_weak_references(id _Nonnull value)(a0) +void glue_objc_exit(void)() ==end Index: src/runtime/linklib/linklib.m ================================================================== --- src/runtime/linklib/linklib.m +++ src/runtime/linklib/linklib.m @@ -61,114 +61,10 @@ extern void __deregister_frame_info(const void *); struct Library *ObjFWRTBase; void *__objc_class_name_Protocol; -void linklib___objc_exec_class(void *module) SYM("__objc_exec_class"); -IMP linklib_objc_msg_lookup(id object, SEL selector) SYM("objc_msg_lookup"); -IMP linklib_objc_msg_lookup_stret(id object, SEL selector) - SYM("objc_msg_lookup_stret"); -IMP linklib_objc_msg_lookup_super(struct objc_super *super, SEL selector) - SYM("objc_msg_lookup_super"); -IMP linklib_objc_msg_lookup_super_stret(struct objc_super *super, SEL selector) - SYM("objc_msg_lookup_super_stret"); -Class linklib_objc_lookUpClass(const char *name) SYM("objc_lookUpClass"); -Class linklib_objc_getClass(const char *name) SYM("objc_getClass"); -Class linklib_objc_getRequiredClass(const char *name) - SYM("objc_getRequiredClass"); -Class linklib_objc_lookup_class(const char *name) SYM("objc_lookup_class"); -Class linklib_objc_get_class(const char *name) SYM("objc_get_class"); -void linklib_objc_exception_throw(id object) SYM("objc_exception_throw"); -int linklib_objc_sync_enter(id object) SYM("objc_sync_enter"); -int linklib_objc_sync_exit(id object) SYM("objc_sync_exit"); -id linklib_objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, bool atomic) - SYM("objc_getProperty"); -void linklib_objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id value, - bool atomic, signed char copy) SYM("objc_setProperty"); -void linklib_objc_getPropertyStruct(void *dest, const void *src, ptrdiff_t size, - bool atomic, bool strong) SYM("objc_getPropertyStruct"); -void linklib_objc_setPropertyStruct(void *dest, const void *src, ptrdiff_t size, - bool atomic, bool strong) SYM("objc_setPropertyStruct"); -void linklib_objc_enumerationMutation(id object) - SYM("objc_enumerationMutation"); -#ifndef HAVE_SJLJ_EXCEPTIONS -int linklib___gnu_objc_personality_v0(int version, int actions, - uint64_t exClass, void *ex, void *ctx) SYM("__gnu_objc_personality_v0"); -#else -int linklib___gnu_objc_personality_sj0(int version, int actions, - uint64_t exClass, void *ex, void *ctx) SYM("__gnu_objc_personality_sj0"); -#endif -id linklib_objc_retain(id object) SYM("objc_retain"); -id linklib_objc_retainBlock(id block) SYM("objc_retainBlock"); -id linklib_objc_retainAutorelease(id object) SYM("objc_retainAutorelease"); -void linklib_objc_release(id object) SYM("objc_release"); -id linklib_objc_autorelease(id object) SYM("objc_autorelease"); -id linklib_objc_autoreleaseReturnValue(id object) - SYM("objc_autoreleaseReturnValue"); -id linklib_objc_retainAutoreleaseReturnValue(id object) - SYM("objc_retainAutoreleaseReturnValue"); -id linklib_objc_retainAutoreleasedReturnValue(id object) - SYM("objc_retainAutoreleasedReturnValue"); -id linklib_objc_storeStrong(id *object, id value) SYM("objc_storeStrong"); -id linklib_objc_storeWeak(id *object, id value) SYM("objc_storeWeak"); -id linklib_objc_loadWeakRetained(id *object) SYM("objc_loadWeakRetained"); -id linklib_objc_initWeak(id *object, id value) SYM("objc_initWeak"); -void linklib_objc_destroyWeak(id *object) SYM("objc_destroyWeak"); -id linklib_objc_loadWeak(id *object) SYM("objc_loadWeak"); -void linklib_objc_copyWeak(id *dest, id *src) SYM("objc_copyWeak"); -void linklib_objc_moveWeak(id *dest, id *src) SYM("objc_moveWeak"); -SEL linklib_sel_registerName(const char *name) SYM("sel_registerName"); -const char *linklib_sel_getName(SEL selector) SYM("sel_getName"); -bool linklib_sel_isEqual(SEL selector1, SEL selector2) SYM("sel_isEqual"); -Class linklib_objc_allocateClassPair(Class superclass, const char *name, - size_t extraBytes) SYM("objc_allocateClassPair"); -void linklib_objc_registerClassPair(Class class) SYM("objc_registerClassPair"); -unsigned int linklib_objc_getClassList(Class *buffer, unsigned int count) - SYM("objc_getClassList"); -Class *linklib_objc_copyClassList(unsigned int *length) - SYM("objc_copyClassList"); -bool linklib_class_isMetaClass(Class class) SYM("class_isMetaClass"); -const char *linklib_class_getName(Class class) SYM("class_getName"); -Class linklib_class_getSuperclass(Class class) SYM("class_getSuperclass"); -unsigned long linklib_class_getInstanceSize(Class class) - SYM("class_getInstanceSize"); -bool linklib_class_respondsToSelector(Class class, SEL selector) - SYM("class_respondsToSelector"); -bool linklib_class_conformsToProtocol(Class class, Protocol *protocol) - SYM("class_conformsToProtocol"); -IMP linklib_class_getMethodImplementation(Class class, SEL selector) - SYM("class_getMethodImplementation"); -IMP linklib_class_getMethodImplementation_stret(Class class, SEL selector) - SYM("class_getMethodImplementation_stret"); -const char *linklib_class_getMethodTypeEncoding(Class class, SEL selector) - SYM("class_getMethodTypeEncoding"); -bool linklib_class_addMethod(Class class, SEL selector, IMP implementation, - const char *typeEncoding) SYM("class_addMethod"); -IMP linklib_class_replaceMethod(Class class, SEL selector, IMP implementation, - const char *typeEncoding) SYM("class_replaceMethod"); -Class linklib_object_getClass(id object) SYM("object_getClass"); -Class linklib_object_setClass(id object, Class class) SYM("object_setClass"); -const char *linklib_object_getClassName(id object) - SYM("object_getClassName"); -const char *linklib_protocol_getName(Protocol *protocol) - SYM("protocol_getName"); -bool linklib_protocol_isEqual(Protocol *protocol1, Protocol *protocol2) - SYM("protocol_isEqual"); -bool linklib_protocol_conformsToProtocol(Protocol *protocol1, - Protocol *protocol2) SYM("protocol_conformsToProtocol"); -void linklib_objc_exit(void) SYM("objc_exit"); -objc_uncaught_exception_handler_t linklib_objc_setUncaughtExceptionHandler( - objc_uncaught_exception_handler_t handler) - SYM("objc_setUncaughtExceptionHandler"); -void linklib_objc_setForwardHandler(IMP forward, IMP stretForward) - SYM("objc_setForwardHandler"); -void linklib_objc_setEnumerationMutationHandler( - objc_enumeration_mutation_handler_t handler) - SYM("objc_setEnumerationMutationHandler"); -void linklib_objc_zero_weak_references(id value) - SYM("objc_zero_weak_references"); - static void ctor(void) { static bool initialized = false; struct objc_libc libc = { @@ -210,11 +106,11 @@ OBJFWRT_LIB_MINOR)) == NULL) { fputs("Failed to open " OBJFWRT_AMIGA_LIB "!\n", stderr); abort(); } - if (!objc_init(1, &libc, stdout, stderr)) { + if (!glue_objc_init(1, &libc, stdout, stderr)) { fputs("Failed to initialize " OBJFWRT_AMIGA_LIB "!\n", stderr); abort(); } initialized = true; @@ -242,77 +138,77 @@ dtor(); } #endif void -linklib___objc_exec_class(void *module) +__objc_exec_class(void *module) { /* * The compiler generates constructors that call into this, so it is * possible that we are not set up yet when we get called. */ ctor(); - __objc_exec_class(module); -} - -IMP -linklib_objc_msg_lookup(id object, SEL selector) -{ - return objc_msg_lookup(object, selector); -} - -IMP -linklib_objc_msg_lookup_stret(id object, SEL selector) -{ - return objc_msg_lookup_stret(object, selector); -} - -IMP -linklib_objc_msg_lookup_super(struct objc_super *super, SEL selector) -{ - return objc_msg_lookup_super(super, selector); -} - -IMP -linklib_objc_msg_lookup_super_stret(struct objc_super *super, SEL selector) -{ - return objc_msg_lookup_super_stret(super, selector); -} - -Class -linklib_objc_lookUpClass(const char *name) -{ - return objc_lookUpClass(name); -} - -Class -linklib_objc_getClass(const char *name) -{ - return objc_getClass(name); -} - -Class -linklib_objc_getRequiredClass(const char *name) -{ - return objc_getRequiredClass(name); -} - -Class -linklib_objc_lookup_class(const char *name) -{ - return objc_lookup_class(name); -} - -Class -linklib_objc_get_class(const char *name) -{ - return objc_get_class(name); -} - -void -linklib_objc_exception_throw(id object) + glue___objc_exec_class(module); +} + +IMP +objc_msg_lookup(id object, SEL selector) +{ + return glue_objc_msg_lookup(object, selector); +} + +IMP +objc_msg_lookup_stret(id object, SEL selector) +{ + return glue_objc_msg_lookup_stret(object, selector); +} + +IMP +objc_msg_lookup_super(struct objc_super *super, SEL selector) +{ + return glue_objc_msg_lookup_super(super, selector); +} + +IMP +objc_msg_lookup_super_stret(struct objc_super *super, SEL selector) +{ + return glue_objc_msg_lookup_super_stret(super, selector); +} + +Class +objc_lookUpClass(const char *name) +{ + return glue_objc_lookUpClass(name); +} + +Class +objc_getClass(const char *name) +{ + return glue_objc_getClass(name); +} + +Class +objc_getRequiredClass(const char *name) +{ + return glue_objc_getRequiredClass(name); +} + +Class +objc_lookup_class(const char *name) +{ + return glue_objc_lookup_class(name); +} + +Class +objc_get_class(const char *name) +{ + return glue_objc_get_class(name); +} + +void +objc_exception_throw(id object) { #ifdef OF_AMIGAOS_M68K /* * This does not use the glue code to hack around a compiler bug. * @@ -326,57 +222,57 @@ register void *a6 __asm__("a6") = ObjFWRTBase; uintptr_t throw = (((uintptr_t)ObjFWRTBase) - 0x60); ((void (*)(id __asm__("a0")))throw)(object); (void)a6; #else - objc_exception_throw(object); + glue_objc_exception_throw(object); #endif OF_UNREACHABLE } int -linklib_objc_sync_enter(id object) +objc_sync_enter(id object) { - return objc_sync_enter(object); + return glue_objc_sync_enter(object); } int -linklib_objc_sync_exit(id object) +objc_sync_exit(id object) { - return objc_sync_exit(object); + return glue_objc_sync_exit(object); } id -linklib_objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, bool atomic) -{ - return objc_getProperty(self, _cmd, offset, atomic); -} - -void -linklib_objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id value, - bool atomic, signed char copy) -{ - objc_setProperty(self, _cmd, offset, value, atomic, copy); -} - -void -linklib_objc_getPropertyStruct(void *dest, const void *src, ptrdiff_t size, - bool atomic, bool strong) -{ - objc_getPropertyStruct(dest, src, size, atomic, strong); -} - -void -linklib_objc_setPropertyStruct(void *dest, const void *src, ptrdiff_t size, - bool atomic, bool strong) -{ - objc_setPropertyStruct(dest, src, size, atomic, strong); -} - -void -linklib_objc_enumerationMutation(id object) +objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, bool atomic) +{ + return glue_objc_getProperty(self, _cmd, offset, atomic); +} + +void +objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id value, bool atomic, + signed char copy) +{ + glue_objc_setProperty(self, _cmd, offset, value, atomic, copy); +} + +void +objc_getPropertyStruct(void *dest, const void *src, ptrdiff_t size, bool atomic, + bool strong) +{ + glue_objc_getPropertyStruct(dest, src, size, atomic, strong); +} + +void +objc_setPropertyStruct(void *dest, const void *src, ptrdiff_t size, bool atomic, + bool strong) +{ + glue_objc_setPropertyStruct(dest, src, size, atomic, strong); +} + +void +objc_enumerationMutation(id object) { #ifdef OF_AMIGAOS_M68K /* * This does not use the glue code to hack around a compiler bug. * @@ -390,310 +286,308 @@ register void *a6 __asm__("a6") = ObjFWRTBase; uintptr_t enumerationMutation = (((uintptr_t)ObjFWRTBase) - 0x8A); ((void (*)(id __asm__("a0")))enumerationMutation)(object); (void)a6; #else - objc_enumerationMutation(object); + glue_objc_enumerationMutation(object); #endif OF_UNREACHABLE } -int -linklib___gnu_objc_personality_v0(int version, int actions, uint64_t exClass, - void *ex, void *ctx) -{ -#ifndef HAVE_SJLJ_EXCEPTIONS - return __gnu_objc_personality_v0_m68k(version, actions, &exClass, ex, - ctx); -#else - abort(); -#endif -} - -int -linklib___gnu_objc_personality_sj0(int version, int actions, uint64_t exClass, - void *ex, void *ctx) -{ -#ifdef HAVE_SJLJ_EXCEPTIONS - return __gnu_objc_personality_sj0_m68k(version, actions, &exClass, ex, - ctx); -#else - abort(); -#endif -} - -id -linklib_objc_retain(id object) -{ - return objc_retain(object); -} - -id -linklib_objc_retainBlock(id block) -{ - return objc_retainBlock(block); -} - -id -linklib_objc_retainAutorelease(id object) -{ - return objc_retainAutorelease(object); -} - -void -linklib_objc_release(id object) -{ - objc_release(object); -} - -id -linklib_objc_autorelease(id object) -{ - return objc_autorelease(object); -} - -id -linklib_objc_autoreleaseReturnValue(id object) -{ - return objc_autoreleaseReturnValue(object); -} - -id -linklib_objc_retainAutoreleaseReturnValue(id object) -{ - return objc_retainAutoreleaseReturnValue(object); -} - -id -linklib_objc_retainAutoreleasedReturnValue(id object) -{ - return objc_retainAutoreleasedReturnValue(object); -} - -id -linklib_objc_storeStrong(id *object, id value) -{ - return objc_storeStrong(object, value); -} - -id -linklib_objc_storeWeak(id *object, id value) -{ - return objc_storeWeak(object, value); -} - -id -linklib_objc_loadWeakRetained(id *object) -{ - return objc_loadWeakRetained(object); -} - -id -linklib_objc_initWeak(id *object, id value) -{ - return objc_initWeak(object, value); -} - -void -linklib_objc_destroyWeak(id *object) -{ - objc_destroyWeak(object); -} - -id -linklib_objc_loadWeak(id *object) -{ - return objc_loadWeak(object); -} - -void -linklib_objc_copyWeak(id *dest, id *src) -{ - objc_copyWeak(dest, src); -} - -void -linklib_objc_moveWeak(id *dest, id *src) -{ - objc_moveWeak(dest, src); +#ifdef HAVE_SJLJ_EXCEPTIONS +int +__gnu_objc_personality_sj0(int version, int actions, uint64_t exClass, + void *ex, void *ctx) +{ +# ifdef OF_AMIGAOS_M68K + return glue___gnu_objc_personality(version, actions, &exClass, ex, ctx); +# else + return glue___gnu_objc_personality(version, actions, exClass, ex, ctx); +# endif +} +#else +int +__gnu_objc_personality_v0(int version, int actions, uint64_t exClass, + void *ex, void *ctx) +{ +# ifdef OF_AMIGAOS_M68K + return glue___gnu_objc_personality(version, actions, &exClass, ex, ctx); +# else + return glue___gnu_objc_personality(version, actions, exClass, ex, ctx); +# endif +} +#endif + +id +objc_retain(id object) +{ + return glue_objc_retain(object); +} + +id +objc_retainBlock(id block) +{ + return glue_objc_retainBlock(block); +} + +id +objc_retainAutorelease(id object) +{ + return glue_objc_retainAutorelease(object); +} + +void +objc_release(id object) +{ + glue_objc_release(object); +} + +id +objc_autorelease(id object) +{ + return glue_objc_autorelease(object); +} + +id +objc_autoreleaseReturnValue(id object) +{ + return glue_objc_autoreleaseReturnValue(object); +} + +id +objc_retainAutoreleaseReturnValue(id object) +{ + return glue_objc_retainAutoreleaseReturnValue(object); +} + +id +objc_retainAutoreleasedReturnValue(id object) +{ + return glue_objc_retainAutoreleasedReturnValue(object); +} + +id +objc_linklib_objc_storeStrong(id *object, id value) +{ + return glue_objc_storeStrong(object, value); +} + +id +objc_storeWeak(id *object, id value) +{ + return glue_objc_storeWeak(object, value); +} + +id +objc_loadWeakRetained(id *object) +{ + return glue_objc_loadWeakRetained(object); +} + +id +objc_initWeak(id *object, id value) +{ + return glue_objc_initWeak(object, value); +} + +void +objc_destroyWeak(id *object) +{ + glue_objc_destroyWeak(object); +} + +id +objc_loadWeak(id *object) +{ + return glue_objc_loadWeak(object); +} + +void +objc_copyWeak(id *dest, id *src) +{ + glue_objc_copyWeak(dest, src); +} + +void +objc_moveWeak(id *dest, id *src) +{ + glue_objc_moveWeak(dest, src); } SEL -linklib_sel_registerName(const char *name) -{ - return sel_registerName(name); -} - -const char * -linklib_sel_getName(SEL selector) -{ - return sel_getName(selector); -} - -bool -linklib_sel_isEqual(SEL selector1, SEL selector2) -{ - return sel_isEqual(selector1, selector2); -} - -Class -linklib_objc_allocateClassPair(Class superclass, const char *name, - size_t extraBytes) -{ - return objc_allocateClassPair(superclass, name, extraBytes); -} - -void -linklib_objc_registerClassPair(Class class) -{ - objc_registerClassPair(class); -} - -unsigned int -linklib_objc_getClassList(Class *buffer, unsigned int count) -{ - return objc_getClassList(buffer, count); -} - -Class * -linklib_objc_copyClassList(unsigned int *length) -{ - return objc_copyClassList(length); -} - -bool -linklib_class_isMetaClass(Class class) -{ - return class_isMetaClass(class); -} - -const char * -linklib_class_getName(Class class) -{ - return class_getName(class); -} - -Class -linklib_class_getSuperclass(Class class) -{ - return class_getSuperclass(class); -} - -unsigned long -linklib_class_getInstanceSize(Class class) -{ - return class_getInstanceSize(class); -} - -bool -linklib_class_respondsToSelector(Class class, SEL selector) -{ - return class_respondsToSelector(class, selector); -} - -bool -linklib_class_conformsToProtocol(Class class, Protocol *protocol) -{ - return class_conformsToProtocol(class, protocol); -} - -IMP -linklib_class_getMethodImplementation(Class class, SEL selector) -{ - return class_getMethodImplementation(class, selector); -} - -IMP -linklib_class_getMethodImplementation_stret(Class class, SEL selector) -{ - return class_getMethodImplementation_stret(class, selector); -} - -const char * -linklib_class_getMethodTypeEncoding(Class class, SEL selector) -{ - return class_getMethodTypeEncoding(class, selector); -} - -bool -linklib_class_addMethod(Class class, SEL selector, IMP implementation, - const char *typeEncoding) -{ - return class_addMethod(class, selector, implementation, typeEncoding); -} - -IMP -linklib_class_replaceMethod(Class class, SEL selector, IMP implementation, - const char *typeEncoding) -{ - return class_replaceMethod(class, selector, implementation, +sel_registerName(const char *name) +{ + return glue_sel_registerName(name); +} + +const char * +sel_getName(SEL selector) +{ + return glue_sel_getName(selector); +} + +bool +sel_isEqual(SEL selector1, SEL selector2) +{ + return glue_sel_isEqual(selector1, selector2); +} + +Class +objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes) +{ + return glue_objc_allocateClassPair(superclass, name, extraBytes); +} + +void +objc_registerClassPair(Class class) +{ + glue_objc_registerClassPair(class); +} + +unsigned int +objc_getClassList(Class *buffer, unsigned int count) +{ + return glue_objc_getClassList(buffer, count); +} + +Class * +objc_copyClassList(unsigned int *length) +{ + return glue_objc_copyClassList(length); +} + +bool +class_isMetaClass(Class class) +{ + return glue_class_isMetaClass(class); +} + +const char * +class_getName(Class class) +{ + return glue_class_getName(class); +} + +Class +class_getSuperclass(Class class) +{ + return glue_class_getSuperclass(class); +} + +unsigned long +class_getInstanceSize(Class class) +{ + return glue_class_getInstanceSize(class); +} + +bool +class_respondsToSelector(Class class, SEL selector) +{ + return glue_class_respondsToSelector(class, selector); +} + +bool +class_conformsToProtocol(Class class, Protocol *protocol) +{ + return glue_class_conformsToProtocol(class, protocol); +} + +IMP +class_getMethodImplementation(Class class, SEL selector) +{ + return glue_class_getMethodImplementation(class, selector); +} + +IMP +class_getMethodImplementation_stret(Class class, SEL selector) +{ + return glue_class_getMethodImplementation_stret(class, selector); +} + +const char * +class_getMethodTypeEncoding(Class class, SEL selector) +{ + return glue_class_getMethodTypeEncoding(class, selector); +} + +bool +class_addMethod(Class class, SEL selector, IMP implementation, + const char *typeEncoding) +{ + return glue_class_addMethod(class, selector, implementation, + typeEncoding); +} + +IMP +class_replaceMethod(Class class, SEL selector, IMP implementation, + const char *typeEncoding) +{ + return glue_class_replaceMethod(class, selector, implementation, typeEncoding); } Class -linklib_object_getClass(id object) -{ - return object_getClass(object); -} - -Class -linklib_object_setClass(id object, Class class) -{ - return object_setClass(object, class); -} - -const char * -linklib_object_getClassName(id object) -{ - return object_getClassName(object); -} - -const char * -linklib_protocol_getName(Protocol *protocol) -{ - return protocol_getName(protocol); -} - -bool -linklib_protocol_isEqual(Protocol *protocol1, Protocol *protocol2) -{ - return protocol_isEqual(protocol1, protocol2); -} - -bool -linklib_protocol_conformsToProtocol(Protocol *protocol1, Protocol *protocol2) -{ - return protocol_conformsToProtocol(protocol1, protocol2); -} - -void -linklib_objc_exit(void) -{ - objc_exit(); -} - -objc_uncaught_exception_handler_t -linklib_objc_setUncaughtExceptionHandler( - objc_uncaught_exception_handler_t handler) -{ - return objc_setUncaughtExceptionHandler(handler); -} - -void -linklib_objc_setForwardHandler(IMP forward, IMP stretForward) -{ - objc_setForwardHandler(forward, stretForward); -} - -void -linklib_objc_setEnumerationMutationHandler( - objc_enumeration_mutation_handler_t handler) -{ - objc_setEnumerationMutationHandler(handler); -} - -void -linklib_objc_zero_weak_references(id value) -{ - objc_zero_weak_references(value); +object_getClass(id object) +{ + return glue_object_getClass(object); +} + +Class +object_setClass(id object, Class class) +{ + return glue_object_setClass(object, class); +} + +const char * +object_getClassName(id object) +{ + return glue_object_getClassName(object); +} + +const char * +protocol_getName(Protocol *protocol) +{ + return glue_protocol_getName(protocol); +} + +bool +protocol_isEqual(Protocol *protocol1, Protocol *protocol2) +{ + return glue_protocol_isEqual(protocol1, protocol2); +} + +bool +protocol_conformsToProtocol(Protocol *protocol1, Protocol *protocol2) +{ + return glue_protocol_conformsToProtocol(protocol1, protocol2); +} + +objc_uncaught_exception_handler_t +objc_setUncaughtExceptionHandler(objc_uncaught_exception_handler_t handler) +{ + return glue_objc_setUncaughtExceptionHandler(handler); +} + +void +objc_setForwardHandler(IMP forward, IMP stretForward) +{ + glue_objc_setForwardHandler(forward, stretForward); +} + +void +objc_setEnumerationMutationHandler(objc_enumeration_mutation_handler_t handler) +{ + glue_objc_setEnumerationMutationHandler(handler); +} + +void +objc_zero_weak_references(id value) +{ + glue_objc_zero_weak_references(value); +} + +void +objc_exit(void) +{ + glue_objc_exit(); } Index: src/runtime/morphos-clib.h ================================================================== --- src/runtime/morphos-clib.h +++ src/runtime/morphos-clib.h @@ -1,68 +1,67 @@ /* Functions that are only for the linklib. */ -bool objc_init(unsigned int, struct objc_libc *, FILE *, FILE *); +bool glue_objc_init(unsigned int, struct objc_libc *, FILE *, FILE *); /* All other functions. */ -void __objc_exec_class(void *); -IMP objc_msg_lookup(id, SEL); -IMP objc_msg_lookup_stret(id, SEL); -IMP objc_msg_lookup_super(struct objc_super *, SEL); -IMP objc_msg_lookup_super_stret(struct objc_super *, SEL); -Class objc_lookUpClass(const char *); -Class objc_getClass(const char *); -Class objc_getRequiredClass(const char *); -Class objc_lookup_class(const char *); -Class objc_get_class(const char *); -void objc_exception_throw(id); -int objc_sync_enter(id); -int objc_sync_exit(id); -id objc_getProperty(id, SEL, ptrdiff_t, bool); -void objc_setProperty(id, SEL, ptrdiff_t, id, bool, signed char); -void objc_getPropertyStruct(void *, const void *, ptrdiff_t, bool, bool); -void objc_setPropertyStruct(void *, const void *, ptrdiff_t, bool, bool); -void objc_enumerationMutation(id); -int __gnu_objc_personality_v0_m68k(int, int, uint64_t *, void *, void *); -int __gnu_objc_personality_sj0_m68k(int, int, uint64_t *, void *, void *); -id objc_retain(id); -id objc_retainBlock(id); -id objc_retainAutorelease(id); -void objc_release(id); -id objc_autorelease(id); -id objc_autoreleaseReturnValue(id); -id objc_retainAutoreleaseReturnValue(id); -id objc_retainAutoreleasedReturnValue(id); -id objc_storeStrong(id *, id); -id objc_storeWeak(id *, id); -id objc_loadWeakRetained(id *); -id objc_initWeak(id *, id); -void objc_destroyWeak(id *); -id objc_loadWeak(id *); -void objc_copyWeak(id *, id *); -void objc_moveWeak(id *, id *); -SEL sel_registerName(const char *); -const char *sel_getName(SEL); -bool sel_isEqual(SEL, SEL); -Class objc_allocateClassPair(Class, const char *, size_t); -void objc_registerClassPair(Class); -unsigned int objc_getClassList(Class *, unsigned int); -Class *objc_copyClassList(unsigned int *); -bool class_isMetaClass(Class); -const char *class_getName(Class); -Class class_getSuperclass(Class); -unsigned long class_getInstanceSize(Class); -bool class_respondsToSelector(Class, SEL); -bool class_conformsToProtocol(Class, Protocol *); -IMP class_getMethodImplementation(Class, SEL); -IMP class_getMethodImplementation_stret(Class, SEL); -const char *class_getMethodTypeEncoding(Class, SEL); -bool class_addMethod(Class class_, SEL selector, IMP, const char *); -IMP class_replaceMethod(Class, SEL, IMP, const char *); -Class object_getClass(id); -Class object_setClass(id, Class); -const char *object_getClassName(id); -const char *protocol_getName(Protocol *); -bool protocol_isEqual(Protocol *, Protocol *); -bool protocol_conformsToProtocol(Protocol *, Protocol *); -void objc_exit(void); -objc_uncaught_exception_handler_t objc_setUncaughtExceptionHandler(objc_uncaught_exception_handler_t); -void objc_setForwardHandler(IMP, IMP); -void objc_setEnumerationMutationHandler(objc_enumeration_mutation_handler_t); -void objc_zero_weak_references(id); +void glue___objc_exec_class(void *); +IMP glue_objc_msg_lookup(id, SEL); +IMP glue_objc_msg_lookup_stret(id, SEL); +IMP glue_objc_msg_lookup_super(struct objc_super *, SEL); +IMP glue_objc_msg_lookup_super_stret(struct objc_super *, SEL); +Class glue_objc_lookUpClass(const char *); +Class glue_objc_getClass(const char *); +Class glue_objc_getRequiredClass(const char *); +Class glue_objc_lookup_class(const char *); +Class glue_objc_get_class(const char *); +void glue_objc_exception_throw(id); +int glue_objc_sync_enter(id); +int glue_objc_sync_exit(id); +id glue_objc_getProperty(id, SEL, ptrdiff_t, bool); +void glue_objc_setProperty(id, SEL, ptrdiff_t, id, bool, signed char); +void glue_objc_getPropertyStruct(void *, const void *, ptrdiff_t, bool, bool); +void glue_objc_setPropertyStruct(void *, const void *, ptrdiff_t, bool, bool); +void glue_objc_enumerationMutation(id); +int glue___gnu_objc_personality(int, int, uint64_t, void *, void *); +id glue_objc_retain(id); +id glue_objc_retainBlock(id); +id glue_objc_retainAutorelease(id); +void glue_objc_release(id); +id glue_objc_autorelease(id); +id glue_objc_autoreleaseReturnValue(id); +id glue_objc_retainAutoreleaseReturnValue(id); +id glue_objc_retainAutoreleasedReturnValue(id); +id glue_objc_storeStrong(id *, id); +id glue_objc_storeWeak(id *, id); +id glue_objc_loadWeakRetained(id *); +id glue_objc_initWeak(id *, id); +void glue_objc_destroyWeak(id *); +id glue_objc_loadWeak(id *); +void glue_objc_copyWeak(id *, id *); +void glue_objc_moveWeak(id *, id *); +SEL glue_sel_registerName(const char *); +const char *glue_sel_getName(SEL); +bool glue_sel_isEqual(SEL, SEL); +Class glue_objc_allocateClassPair(Class, const char *, size_t); +void glue_objc_registerClassPair(Class); +unsigned int glue_objc_getClassList(Class *, unsigned int); +Class *glue_objc_copyClassList(unsigned int *); +bool glue_class_isMetaClass(Class); +const char *glue_class_getName(Class); +Class glue_class_getSuperclass(Class); +unsigned long glue_class_getInstanceSize(Class); +bool glue_class_respondsToSelector(Class, SEL); +bool glue_class_conformsToProtocol(Class, Protocol *); +IMP glue_class_getMethodImplementation(Class, SEL); +IMP glue_class_getMethodImplementation_stret(Class, SEL); +const char *glue_class_getMethodTypeEncoding(Class, SEL); +bool glue_class_addMethod(Class class_, SEL selector, IMP, const char *); +IMP glue_class_replaceMethod(Class, SEL, IMP, const char *); +Class glue_object_getClass(id); +Class glue_object_setClass(id, Class); +const char *glue_object_getClassName(id); +const char *glue_protocol_getName(Protocol *); +bool glue_protocol_isEqual(Protocol *, Protocol *); +bool glue_protocol_conformsToProtocol(Protocol *, Protocol *); +objc_uncaught_exception_handler_t glue_objc_setUncaughtExceptionHandler(objc_uncaught_exception_handler_t); +void glue_objc_setForwardHandler(IMP, IMP); +void glue_objc_setEnumerationMutationHandler(objc_enumeration_mutation_handler_t); +void glue_objc_zero_weak_references(id); +void glue_objc_exit(void); Index: src/runtime/morphos.fd ================================================================== --- src/runtime/morphos.fd +++ src/runtime/morphos.fd @@ -1,76 +1,70 @@ ##base _ObjFWRTBase ##bias 30 ##public * Functions that are only for the linklib. -objc_init(version,libc,stdout,stderr)(d0,a0,a1,a2) -* These have a built-in declaration in the compiler that does not use the - registers and thus always need glue. -__objc_exec_class(module)(a0) -objc_msg_lookup(object,selector)(a0,a1) -objc_msg_lookup_stret(object,selector)(a0,a1) -objc_msg_lookup_super(super,selector)(a0,a1) -objc_msg_lookup_super_stret(super,selector)(a0,a1) -objc_lookUpClass(name)(a0) -objc_getClass(name)(a0) -objc_getRequiredClass(name)(a0) -objc_lookup_class(name)(a0) -objc_get_class(name)(a0) -objc_exception_throw(object)(a0) -objc_sync_enter(object)(a0) -objc_sync_exit(object)(a0) -objc_getProperty(self,_cmd,offset,atomic)(a0,a1,d0,d1) -objc_setProperty(self,_cmd,offset,value,atomic,copy)(a0,a1,d0,a2,d1,d2) -objc_getPropertyStruct(dest,src,size,atomic,strong)(a0,a1,d0,d1,d2) -objc_setPropertyStruct(dest,src,size,atomic,strong)(a0,a1,d0,d1,d2) -objc_enumerationMutation(object)(a0) -__gnu_objc_personality_v0_m68k(version,actions,exClass,ex,ctx)(d0,d1,d2,a0,a1) -__gnu_objc_personality_sj0_m68k(version,actions,exClass,ex,ctx)(d0,d1,d2,a0,a1) -objc_retain(object)(a0) -objc_retainBlock(block)(a0) -objc_retainAutorelease(object)(a0) -objc_release(object)(a0) -objc_autorelease(object)(a0) -objc_autoreleaseReturnValue(object)(a0) -objc_retainAutoreleaseReturnValue(object)(a0) -objc_retainAutoreleasedReturnValue(object)(a0) -objc_storeStrong(object,value)(a0,a1) -objc_storeWeak(object,value)(a0,a1) -objc_loadWeakRetained(object)(a0) -objc_initWeak(object,value)(a0,a1) -objc_destroyWeak(object)(a0) -objc_loadWeak(object)(a0) -objc_copyWeak(dest,src)(a0,a1) -objc_moveWeak(dest,src)(a0,a1) -* These only need glue on MorphOS. As none of them are functions that are used - in hot paths, it's easier to also use the glue on AmigaOS 3, which also has - the benefit of having all __saveds in a single place. -sel_registerName(name)(a0) -sel_getName(selector)(a0) -sel_isEqual(selector1,selector2)(a0,a1) -objc_allocateClassPair(superclass,name,extraBytes)(a0,a1,d0) -objc_registerClassPair(class_)(a0) -objc_getClassList(buffer,count)(a0,d0) -objc_copyClassList(length)(a0) -class_isMetaClass(class_)(a0) -class_getName(class_)(a0) -class_getSuperclass(class_)(a0) -class_getInstanceSize(class_)(a0) -class_respondsToSelector(class_,selector)(a0,a1) -class_conformsToProtocol(class_,p)(a0,a1) -class_getMethodImplementation(class_,selector)(a0,a1) -class_getMethodImplementation_stret(class_,selector)(a0,a1) -class_getMethodTypeEncoding(class_,selector)(a0,a1) -class_addMethod(class_,selector,implementation,typeEncoding)(a0,a1,a2,a3) -class_replaceMethod(class_,selector,implementation,typeEncoding)(a0,a1,a2,a3) -object_getClass(object)(a0) -object_setClass(object,class_)(a0,a1) -object_getClassName(object)(a0) -protocol_getName(protocol)(a0) -protocol_isEqual(protocol1,protocol2)(a0,a1) -protocol_conformsToProtocol(protocol1,protocol2)(a0,a1) -objc_exit()() -objc_setUncaughtExceptionHandler(handler)(a0) -objc_setForwardHandler(forward,stretForward)(a0,a1) -objc_setEnumerationMutationHandler(handler)(a0) -objc_zero_weak_references(value)(a0) +glue_objc_init(version,libc,stdout,stderr)(sysv,r12base) +glue___objc_exec_class(module)(sysv,r12base) +glue_objc_msg_lookup(object,selector)(sysv,r12base) +glue_objc_msg_lookup_stret(object,selector)(sysv,r12base) +glue_objc_msg_lookup_super(super,selector)(sysv,r12base) +glue_objc_msg_lookup_super_stret(super,selector)(sysv,r12base) +glue_objc_lookUpClass(name)(sysv,r12base) +glue_objc_getClass(name)(sysv,r12base) +glue_objc_getRequiredClass(name)(sysv,r12base) +glue_objc_lookup_class(name)(sysv,r12base) +glue_objc_get_class(name)(sysv,r12base) +glue_objc_exception_throw(object)(sysv,r12base) +glue_objc_sync_enter(object)(sysv,r12base) +glue_objc_sync_exit(object)(sysv,r12base) +glue_objc_getProperty(self,_cmd,offset,atomic)(sysv,r12base) +glue_objc_setProperty(self,_cmd,offset,value,atomic,copy)(sysv,r12base) +glue_objc_getPropertyStruct(dest,src,size,atomic,strong)(sysv,r12base) +glue_objc_setPropertyStruct(dest,src,size,atomic,strong)(sysv,r12base) +glue_objc_enumerationMutation(object)(sysv,r12base) +glue___gnu_objc_personality(version,actions,exClass,ex,ctx)(sysv,r12base) +glue_objc_retain(object)(sysv,r12base) +glue_objc_retainBlock(block)(sysv,r12base) +glue_objc_retainAutorelease(object)(sysv,r12base) +glue_objc_release(object)(sysv,r12base) +glue_objc_autorelease(object)(sysv,r12base) +glue_objc_autoreleaseReturnValue(object)(sysv,r12base) +glue_objc_retainAutoreleaseReturnValue(object)(sysv,r12base) +glue_objc_retainAutoreleasedReturnValue(object)(sysv,r12base) +glue_objc_storeStrong(object,value)(sysv,r12base) +glue_objc_storeWeak(object,value)(sysv,r12base) +glue_objc_loadWeakRetained(object)(sysv,r12base) +glue_objc_initWeak(object,value)(sysv,r12base) +glue_objc_destroyWeak(object)(sysv,r12base) +glue_objc_loadWeak(object)(sysv,r12base) +glue_objc_copyWeak(dest,src)(sysv,r12base) +glue_objc_moveWeak(dest,src)(sysv,r12base) +glue_sel_registerName(name)(sysv,r12base) +glue_sel_getName(selector)(sysv,r12base) +glue_sel_isEqual(selector1,selector2)(sysv,r12base) +glue_objc_allocateClassPair(superclass,name,extraBytes)(sysv,r12base) +glue_objc_registerClassPair(class_)(sysv,r12base) +glue_objc_getClassList(buffer,count)(sysv,r12base) +glue_objc_copyClassList(length)(sysv,r12base) +glue_class_isMetaClass(class_)(sysv,r12base) +glue_class_getName(class_)(sysv,r12base) +glue_class_getSuperclass(class_)(sysv,r12base) +glue_class_getInstanceSize(class_)(sysv,r12base) +glue_class_respondsToSelector(class_,selector)(sysv,r12base) +glue_class_conformsToProtocol(class_,p)(sysv,r12base) +glue_class_getMethodImplementation(class_,selector)(sysv,r12base) +glue_class_getMethodImplementation_stret(class_,selector)(sysv,r12base) +glue_class_getMethodTypeEncoding(class_,selector)(sysv,r12base) +glue_class_addMethod(class_,selector,implementation,typeEncoding)(sysv,r12base) +glue_class_replaceMethod(class_,selector,implementation,typeEncoding)(sysv,r12base) +glue_object_getClass(object)(sysv,r12base) +glue_object_setClass(object,class_)(sysv,r12base) +glue_object_getClassName(object)(sysv,r12base) +glue_protocol_getName(protocol)(sysv,r12base) +glue_protocol_isEqual(protocol1,protocol2)(sysv,r12base) +glue_protocol_conformsToProtocol(protocol1,protocol2)(sysv,r12base) +glue_objc_setUncaughtExceptionHandler(handler)(sysv,r12base) +glue_objc_setForwardHandler(forward,stretForward)(sysv,r12base) +glue_objc_setEnumerationMutationHandler(handler)(sysv,r12base) +glue_objc_zero_weak_references(value)(sysv,r12base) +glue_objc_exit()(sysv,r12base) ##end