Index: src/OFSystemInfo.m ================================================================== --- src/OFSystemInfo.m +++ src/OFSystemInfo.m @@ -239,11 +239,11 @@ x86_cpuid(uint32_t eax, uint32_t ecx) { struct x86_regs regs; # if defined(OF_X86_64_ASM) - __asm__( + __asm__ ( "cpuid" : "=a"(regs.eax), "=b"(regs.ebx), "=c"(regs.ecx), "=d"(regs.edx) : "a"(eax), "c"(ecx) ); # elif defined(OF_X86_ASM) @@ -251,11 +251,11 @@ * This workaround is required by GCC when using -fPIC, as ebx is a * special register in PIC code. Yes, GCC is indeed not able to just * push a register onto the stack before the __asm__ block and to pop * it afterwards. */ - __asm__( + __asm__ ( "pushl %%ebx\n\t" "cpuid\n\t" "movl %%ebx, %1\n\t" "popl %%ebx" : "=a"(regs.eax), "=r"(regs.ebx), "=c"(regs.ecx), "=d"(regs.edx) Index: src/runtime/ObjFW_RT.h ================================================================== --- src/runtime/ObjFW_RT.h +++ src/runtime/ObjFW_RT.h @@ -292,11 +292,10 @@ * Used by the compiler, but can also be called manually. * * These declarations are also required to prevent Clang's implicit * declarations which include __declspec(dllimport) on Windows. */ -struct objc_abi_module; extern void __objc_exec_class(void *_Nonnull module); extern IMP _Nonnull objc_msg_lookup(id _Nullable obj, SEL _Nonnull sel); extern IMP _Nonnull objc_msg_lookup_stret(id _Nullable obj, SEL _Nonnull sel); extern IMP _Nonnull objc_msg_lookup_super(struct objc_super *_Nonnull super, SEL _Nonnull sel); @@ -315,49 +314,10 @@ extern void objc_getPropertyStruct(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong); extern void objc_setPropertyStruct(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong); extern void objc_enumerationMutation(id _Nonnull obj); - -# ifdef OBJC_AMIGA_LIBRARY -extern void glue___objc_exec_class(void *_Nonnull module OBJC_M68K_REG("a0")); -extern IMP _Nonnull glue_objc_msg_lookup(id _Nullable obj OBJC_M68K_REG("a0"), - SEL _Nonnull sel OBJC_M68K_REG("a1")); -extern IMP _Nonnull glue_objc_msg_lookup_stret( - id _Nullable obj OBJC_M68K_REG("a0"), SEL _Nonnull sel OBJC_M68K_REG("a1")); -extern IMP _Nonnull glue_objc_msg_lookup_super( - struct objc_super *_Nonnull super OBJC_M68K_REG("a0"), - SEL _Nonnull sel OBJC_M68K_REG("a1")); -extern IMP _Nonnull glue_objc_msg_lookup_super_stret( - struct objc_super *_Nonnull super OBJC_M68K_REG("a0"), - SEL _Nonnull sel OBJC_M68K_REG("a1")); -extern id _Nullable glue_objc_lookUpClass( - const char *_Nonnull name OBJC_M68K_REG("a0")); -extern id _Nullable glue_objc_getClass( - const char *_Nonnull name OBJC_M68K_REG("a0")); -extern id _Nonnull glue_objc_getRequiredClass( - const char *_Nonnull name OBJC_M68K_REG("a0")); -extern void glue_objc_exception_throw(id _Nullable object OBJC_M68K_REG("a0")); -extern int glue_objc_sync_enter(id _Nullable object OBJC_M68K_REG("a0")); -extern int glue_objc_sync_exit(id _Nullable object OBJC_M68K_REG("a0")); -extern id _Nullable glue_objc_getProperty(id _Nonnull self OBJC_M68K_REG("a0"), - SEL _Nonnull _cmd OBJC_M68K_REG("a1"), ptrdiff_t offset OBJC_M68K_REG("d0"), - bool atomic OBJC_M68K_REG("d1")); -extern void glue_objc_setProperty(id _Nonnull self OBJC_M68K_REG("a0"), - SEL _Nonnull _cmd OBJC_M68K_REG("a1"), ptrdiff_t offset OBJC_M68K_REG("d0"), - id _Nullable value OBJC_M68K_REG("a2"), bool atomic OBJC_M68K_REG("d1"), - signed char copy OBJC_M68K_REG("d2")); -extern void glue_objc_getPropertyStruct(void *_Nonnull dest OBJC_M68K_REG("a0"), - const void *_Nonnull src OBJC_M68K_REG("a1"), - ptrdiff_t size OBJC_M68K_REG("d0"), bool atomic OBJC_M68K_REG("d1"), - bool strong OBJC_M68K_REG("d2")); -extern void glue_objc_setPropertyStruct(void *_Nonnull dest OBJC_M68K_REG("a0"), - const void *_Nonnull src OBJC_M68K_REG("a1"), - ptrdiff_t size OBJC_M68K_REG("d0"), bool atomic OBJC_M68K_REG("d1"), - bool strong OBJC_M68K_REG("d2")); -extern void glue_objc_enumerationMutation(id _Nonnull obj OBJC_M68K_REG("a0")); -# endif #ifdef __cplusplus } #endif #endif Index: src/runtime/amiga-glue.m ================================================================== --- src/runtime/amiga-glue.m +++ src/runtime/amiga-glue.m @@ -20,104 +20,111 @@ #import "ObjFW_RT.h" #import "private.h" #import "macros.h" void -__objc_exec_class(void *module) +glue___objc_exec_class(void *module OBJC_M68K_REG("a0")) { glue___objc_exec_class(module); } IMP -objc_msg_lookup(id obj, SEL sel) -{ - return glue_objc_msg_lookup(obj, sel); -} - -IMP -objc_msg_lookup_stret(id obj, SEL sel) -{ - return glue_objc_msg_lookup_stret(obj, sel); -} - -IMP -objc_msg_lookup_super(struct objc_super *super, SEL sel) -{ - return glue_objc_msg_lookup_super(super, sel); -} - -IMP -objc_msg_lookup_super_stret(struct objc_super *super, SEL sel) -{ - return glue_objc_msg_lookup_super_stret(super, sel); -} - -id -objc_lookUpClass(const char *name) -{ - return glue_objc_lookUpClass(name); -} - -id -objc_getClass(const char *name) -{ - return glue_objc_getClass(name); -} - -id -objc_getRequiredClass(const char *name) -{ - return glue_objc_getRequiredClass(name); -} - -void -objc_exception_throw(id object) -{ - glue_objc_exception_throw(object); - - OF_UNREACHABLE -} - -int -objc_sync_enter(id object) -{ - return glue_objc_sync_enter(object); -} - -int -objc_sync_exit(id object) -{ - return glue_objc_sync_exit(object); -} - -id -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 obj) -{ - glue_objc_enumerationMutation(obj); +glue_objc_msg_lookup(id obj OBJC_M68K_REG("a0"), SEL sel OBJC_M68K_REG("a1")) +{ + return objc_msg_lookup(obj, sel); +} + +IMP +glue_objc_msg_lookup_stret(id obj OBJC_M68K_REG("a0"), + SEL sel OBJC_M68K_REG("a1")) +{ + return objc_msg_lookup_stret(obj, sel); +} + +IMP +glue_objc_msg_lookup_super(struct objc_super *super OBJC_M68K_REG("a0"), + SEL sel OBJC_M68K_REG("a1")) +{ + return objc_msg_lookup_super(super, sel); +} + +IMP +glue_objc_msg_lookup_super_stret(struct objc_super *super OBJC_M68K_REG("a0"), + SEL sel OBJC_M68K_REG("a1")) +{ + return objc_msg_lookup_super_stret(super, sel); +} + +id +glue_objc_lookUpClass(const char *name OBJC_M68K_REG("a0")) +{ + return objc_lookUpClass(name); +} + +id +glue_objc_getClass(const char *name OBJC_M68K_REG("a0")) +{ + return objc_getClass(name); +} + +id +glue_objc_getRequiredClass(const char *name OBJC_M68K_REG("a0")) +{ + return objc_getRequiredClass(name); +} + +void +glue_objc_exception_throw(id object OBJC_M68K_REG("a0")) +{ + objc_exception_throw(object); + + OF_UNREACHABLE +} + +int +glue_objc_sync_enter(id object OBJC_M68K_REG("a0")) +{ + return objc_sync_enter(object); +} + +int +glue_objc_sync_exit(id object OBJC_M68K_REG("a0")) +{ + return objc_sync_exit(object); +} + +id +glue_objc_getProperty(id self OBJC_M68K_REG("a0"), SEL _cmd OBJC_M68K_REG("a1"), + ptrdiff_t offset OBJC_M68K_REG("d0"), bool atomic OBJC_M68K_REG("d1")) +{ + return objc_getProperty(self, _cmd, offset, atomic); +} + +void +glue_objc_setProperty(id self OBJC_M68K_REG("a0"), SEL _cmd OBJC_M68K_REG("a1"), + ptrdiff_t offset OBJC_M68K_REG("d0"), id value OBJC_M68K_REG("a2"), + bool atomic OBJC_M68K_REG("d1"), signed char copy OBJC_M68K_REG("d2")) +{ + objc_setProperty(self, _cmd, offset, value, atomic, copy); +} + +void +glue_objc_getPropertyStruct(void *dest OBJC_M68K_REG("a0"), + const void *src OBJC_M68K_REG("a1"), ptrdiff_t size OBJC_M68K_REG("d0"), + bool atomic OBJC_M68K_REG("d1"), bool strong OBJC_M68K_REG("d2")) +{ + objc_getPropertyStruct(dest, src, size, atomic, strong); +} + +void +glue_objc_setPropertyStruct(void *dest OBJC_M68K_REG("a0"), + const void *src OBJC_M68K_REG("a1"), ptrdiff_t size OBJC_M68K_REG("d0"), + bool atomic OBJC_M68K_REG("d1"), bool strong OBJC_M68K_REG("d2")) +{ + objc_setPropertyStruct(dest, src, size, atomic, strong); +} + +void +glue_objc_enumerationMutation(id obj OBJC_M68K_REG("a0")) +{ + objc_enumerationMutation(obj); } Index: src/runtime/class.m ================================================================== --- src/runtime/class.m +++ src/runtime/class.m @@ -478,11 +478,11 @@ objc_global_mutex_unlock(); } id -OBJC_GLUE(objc_lookUpClass, const char *name OBJC_GLUE_M68K_REG("a0")) +objc_lookUpClass(const char *name) { Class cls; if ((cls = objc_classname_to_class(name, true)) == NULL) return Nil; @@ -501,21 +501,21 @@ return cls; } id -OBJC_GLUE(objc_getClass, const char *name OBJC_GLUE_M68K_REG("a0")) +objc_getClass(const char *name) { - return OBJC_GLUE(objc_lookUpClass, name); + return objc_lookUpClass(name); } id -OBJC_GLUE(objc_getRequiredClass, const char *name OBJC_GLUE_M68K_REG("a0")) +objc_getRequiredClass(const char *name) { Class cls; - if ((cls = OBJC_GLUE(objc_getClass, name)) == Nil) + if ((cls = objc_getClass(name)) == Nil) OBJC_ERROR("Class %s not found!", name); return cls; } Index: src/runtime/exception.m ================================================================== --- src/runtime/exception.m +++ src/runtime/exception.m @@ -714,11 +714,11 @@ OBJC_ERROR("Cannot unlock spinlock!"); #endif } void -OBJC_GLUE(objc_exception_throw, id object OBJC_GLUE_M68K_REG("a0")) +objc_exception_throw(id object) { struct objc_exception *e = malloc(sizeof(*e)); bool emergency = false; if (e == NULL) { Index: src/runtime/init.m ================================================================== --- src/runtime/init.m +++ src/runtime/init.m @@ -19,11 +19,11 @@ #import "ObjFW_RT.h" #import "private.h" void -OBJC_GLUE(__objc_exec_class, void *module_ OBJC_GLUE_M68K_REG("a0")) +__objc_exec_class(void *module_) { struct objc_abi_module *module = module_; objc_global_mutex_lock(); Index: src/runtime/lookup.m ================================================================== --- src/runtime/lookup.m +++ src/runtime/lookup.m @@ -156,19 +156,17 @@ return imp; } IMP -OBJC_GLUE(objc_msg_lookup, id obj OBJC_GLUE_M68K_REG("a0"), - SEL sel OBJC_GLUE_M68K_REG("a1")) +objc_msg_lookup(id obj, SEL sel) { return common_lookup(obj, sel, objc_method_not_found); } IMP -OBJC_GLUE(objc_msg_lookup_stret, id obj OBJC_GLUE_M68K_REG("a0"), - SEL sel OBJC_GLUE_M68K_REG("a1")) +objc_msg_lookup_stret(id obj, SEL sel) { return common_lookup(obj, sel, objc_method_not_found_stret); } static OF_INLINE IMP @@ -187,20 +185,16 @@ return imp; } IMP -OBJC_GLUE(objc_msg_lookup_super, - struct objc_super *super OBJC_GLUE_M68K_REG("a0"), - SEL sel OBJC_GLUE_M68K_REG("a1")) +objc_msg_lookup_super(struct objc_super *super, SEL sel) { return common_lookup_super(super, sel, objc_method_not_found); } IMP -OBJC_GLUE(objc_msg_lookup_super_stret, - struct objc_super *super OBJC_GLUE_M68K_REG("a0"), - SEL sel OBJC_GLUE_M68K_REG("a1")) +objc_msg_lookup_super_stret(struct objc_super *super, SEL sel) { return common_lookup_super(super, sel, objc_method_not_found_stret); } #endif Index: src/runtime/misc.m ================================================================== --- src/runtime/misc.m +++ src/runtime/misc.m @@ -24,11 +24,11 @@ #include "private.h" static objc_enumeration_mutation_handler enumeration_mutation_handler = NULL; void -OBJC_GLUE(objc_enumerationMutation, id obj OBJC_GLUE_M68K_REG("a0")) +objc_enumerationMutation(id obj) { if (enumeration_mutation_handler != NULL) enumeration_mutation_handler(obj); else OBJC_ERROR("Object was mutated during enumeration!"); Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -27,18 +27,10 @@ # ifndef _Nullable # define _Nullable # endif #endif -#ifdef OBJC_AMIGA_LIBRARY -# define OBJC_GLUE(name, ...) glue_##name(__VA_ARGS__) -# define OBJC_GLUE_M68K_REG(reg) OBJC_M68K_REG(reg) -#else -# define OBJC_GLUE(name, ...) name(__VA_ARGS__) -# define OBJC_GLUE_M68K_REG(reg) -#endif - struct objc_abi_class { struct objc_abi_class *_Nonnull metaclass; const char *_Nullable superclass; const char *_Nonnull name; unsigned long version; @@ -156,10 +148,47 @@ void (*abort)(void); FILE *stdout; FILE *stderr; } *objc_libc; extern FILE *stdout, *stderr; + +extern void glue___objc_exec_class(void *_Nonnull module OBJC_M68K_REG("a0")); +extern IMP _Nonnull glue_objc_msg_lookup(id _Nullable obj OBJC_M68K_REG("a0"), + SEL _Nonnull sel OBJC_M68K_REG("a1")); +extern IMP _Nonnull glue_objc_msg_lookup_stret( + id _Nullable obj OBJC_M68K_REG("a0"), SEL _Nonnull sel OBJC_M68K_REG("a1")); +extern IMP _Nonnull glue_objc_msg_lookup_super( + struct objc_super *_Nonnull super OBJC_M68K_REG("a0"), + SEL _Nonnull sel OBJC_M68K_REG("a1")); +extern IMP _Nonnull glue_objc_msg_lookup_super_stret( + struct objc_super *_Nonnull super OBJC_M68K_REG("a0"), + SEL _Nonnull sel OBJC_M68K_REG("a1")); +extern id _Nullable glue_objc_lookUpClass( + const char *_Nonnull name OBJC_M68K_REG("a0")); +extern id _Nullable glue_objc_getClass( + const char *_Nonnull name OBJC_M68K_REG("a0")); +extern id _Nonnull glue_objc_getRequiredClass( + const char *_Nonnull name OBJC_M68K_REG("a0")); +extern void glue_objc_exception_throw(id _Nullable object OBJC_M68K_REG("a0")); +extern int glue_objc_sync_enter(id _Nullable object OBJC_M68K_REG("a0")); +extern int glue_objc_sync_exit(id _Nullable object OBJC_M68K_REG("a0")); +extern id _Nullable glue_objc_getProperty(id _Nonnull self OBJC_M68K_REG("a0"), + SEL _Nonnull _cmd OBJC_M68K_REG("a1"), ptrdiff_t offset OBJC_M68K_REG("d0"), + bool atomic OBJC_M68K_REG("d1")); +extern void glue_objc_setProperty(id _Nonnull self OBJC_M68K_REG("a0"), + SEL _Nonnull _cmd OBJC_M68K_REG("a1"), ptrdiff_t offset OBJC_M68K_REG("d0"), + id _Nullable value OBJC_M68K_REG("a2"), bool atomic OBJC_M68K_REG("d1"), + signed char copy OBJC_M68K_REG("d2")); +extern void glue_objc_getPropertyStruct(void *_Nonnull dest OBJC_M68K_REG("a0"), + const void *_Nonnull src OBJC_M68K_REG("a1"), + ptrdiff_t size OBJC_M68K_REG("d0"), bool atomic OBJC_M68K_REG("d1"), + bool strong OBJC_M68K_REG("d2")); +extern void glue_objc_setPropertyStruct(void *_Nonnull dest OBJC_M68K_REG("a0"), + const void *_Nonnull src OBJC_M68K_REG("a1"), + ptrdiff_t size OBJC_M68K_REG("d0"), bool atomic OBJC_M68K_REG("d1"), + bool strong OBJC_M68K_REG("d2")); +extern void glue_objc_enumerationMutation(id _Nonnull obj OBJC_M68K_REG("a0")); #endif extern void objc_register_all_categories(struct objc_abi_symtab *_Nonnull); extern struct objc_category *_Nullable *_Nullable objc_categories_for_class(Class _Nonnull); Index: src/runtime/property.m ================================================================== --- src/runtime/property.m +++ src/runtime/property.m @@ -39,14 +39,11 @@ OBJC_ERROR("Failed to initialize spinlocks!") } #endif id -OBJC_GLUE(objc_getProperty, id self OBJC_GLUE_M68K_REG("a0"), - SEL _cmd OBJC_GLUE_M68K_REG("a1"), - ptrdiff_t offset OBJC_GLUE_M68K_REG("d0"), - bool atomic OBJC_GLUE_M68K_REG("d1")) +objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, bool atomic) { if (atomic) { id *ptr = (id *)(void *)((char *)self + offset); #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(ptr); @@ -64,15 +61,12 @@ return *(id *)(void *)((char *)self + offset); } void -OBJC_GLUE(objc_setProperty, id self OBJC_GLUE_M68K_REG("a0"), - SEL _cmd OBJC_GLUE_M68K_REG("a1"), - ptrdiff_t offset OBJC_GLUE_M68K_REG("d0"), - id value OBJC_GLUE_M68K_REG("a2"), bool atomic OBJC_GLUE_M68K_REG("d1"), - signed char copy OBJC_GLUE_M68K_REG("d2")) +objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id value, bool atomic, + signed char copy) { if (atomic) { id *ptr = (id *)(void *)((char *)self + offset); #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(ptr); @@ -120,14 +114,12 @@ [old release]; } /* The following methods are only required for GCC >= 4.6 */ void -OBJC_GLUE(objc_getPropertyStruct, void *dest OBJC_GLUE_M68K_REG("a0"), - const void *src OBJC_GLUE_M68K_REG("a1"), - ptrdiff_t size OBJC_GLUE_M68K_REG("d0"), - bool atomic OBJC_GLUE_M68K_REG("d1"), bool strong OBJC_GLUE_M68K_REG("d2")) +objc_getPropertyStruct(void *dest, const void *src, ptrdiff_t size, bool atomic, + bool strong) { if (atomic) { #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(src); @@ -143,14 +135,12 @@ memcpy(dest, src, size); } void -OBJC_GLUE(objc_setPropertyStruct, void *dest OBJC_GLUE_M68K_REG("a0"), - const void *src OBJC_GLUE_M68K_REG("a1"), - ptrdiff_t size OBJC_GLUE_M68K_REG("d0"), - bool atomic OBJC_GLUE_M68K_REG("d1"), bool strong OBJC_GLUE_M68K_REG("d2")) +objc_setPropertyStruct(void *dest, const void *src, ptrdiff_t size, bool atomic, + bool strong) { if (atomic) { #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(src); Index: src/runtime/static-instances.m ================================================================== --- src/runtime/static-instances.m +++ src/runtime/static-instances.m @@ -31,12 +31,11 @@ { struct objc_abi_static_instances **si; /* Check if the class for a static instance became available */ for (size_t i = 0; i < static_instances_cnt; i++) { - Class cls = OBJC_GLUE(objc_lookUpClass, - static_instances[i]->class_name); + Class cls = objc_lookUpClass(static_instances[i]->class_name); if (cls != Nil) { for (id *instances = static_instances[i]->instances; *instances != nil; instances++) object_setClass(*instances, cls); @@ -73,11 +72,11 @@ if (si == NULL) return; for (; *si != NULL; si++) { - Class cls = OBJC_GLUE(objc_lookUpClass, (*si)->class_name); + Class cls = objc_lookUpClass((*si)->class_name); if (cls != Nil) { for (id *instances = (*si)->instances; *instances != nil; instances++) object_setClass(*instances, cls); Index: src/runtime/synchronized.m ================================================================== --- src/runtime/synchronized.m +++ src/runtime/synchronized.m @@ -41,11 +41,11 @@ OBJC_ERROR("Failed to create mutex!") } #endif int -OBJC_GLUE(objc_sync_enter, id object OBJC_GLUE_M68K_REG("a0")) +objc_sync_enter(id object) { if (object == nil) return 0; #ifdef OF_HAVE_THREADS @@ -92,11 +92,11 @@ return 0; } int -OBJC_GLUE(objc_sync_exit, id object OBJC_GLUE_M68K_REG("a0")) +objc_sync_exit(id object) { if (object == nil) return 0; #ifdef OF_HAVE_THREADS