ADDED src/forwarding/apple-forwarding-powerpc.S Index: src/forwarding/apple-forwarding-powerpc.S ================================================================== --- src/forwarding/apple-forwarding-powerpc.S +++ src/forwarding/apple-forwarding-powerpc.S @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +.globl _of_forward +.globl _of_forward_stret + +.section __TEXT, __cstring, cstring_literals +str_forwardingTargetForSelector_: + .asciz "forwardingTargetForSelector:" + +.section __OBJC, __message_refs +sel_forwardingTargetForSelector_: + .long str_forwardingTargetForSelector_ + +.section __OBJC, __image_info + .long 0, 0 + +.section __TEXT, __text, regular, pure_instructions +_of_forward: + mflr r0 + stw r0, 8(r1) + stwu r1, -192(r1) + + /* + * Save all arguments and r13. + * + * We can dump two parameters in the parameter area as we know that + * space has been reserved for at least two parameters. + */ + stw r3, 216(r1) + stw r4, 220(r1) + stw r5, 56(r1) + stw r6, 60(r1) + stw r7, 64(r1) + stw r8, 68(r1) + stw r9, 72(r1) + stw r10, 76(r1) + stw r13, 80(r1) + + /* Save all floating point arguments */ + stfd f1, 88(r1) + stfd f2, 96(r1) + stfd f3, 104(r1) + stfd f4, 112(r1) + stfd f5, 120(r1) + stfd f6, 128(r1) + stfd f7, 136(r1) + stfd f8, 144(r1) + stfd f9, 152(r1) + stfd f10, 160(r1) + stfd f11, 168(r1) + stfd f12, 176(r1) + stfd f13, 184(r1) + + bl _object_getClass + + bl 0f +0: + mflr r13 + addis r13, r13, ha16(sel_forwardingTargetForSelector_-0b) + lwz r13, lo16(sel_forwardingTargetForSelector_-0b)(r13) + + mr r4, r13 + bl _class_respondsToSelector + + cmpwi r3, 0 + beq- 0f + + lwz r3, 216(r1) + mr r4, r13 + lwz r5, 220(r1) + bl _objc_msgSend + + cmpwi r3, 0 + beq- 0f + lwz r4, 216(r1) + cmpw r3, r4 + beq- 0f + + /* Restore all arguments and r13, except r3 */ + lwz r4, 220(r1) + lwz r5, 56(r1) + lwz r6, 60(r1) + lwz r7, 64(r1) + lwz r8, 68(r1) + lwz r9, 72(r1) + lwz r10, 76(r1) + lwz r13, 80(r1) + + /* Restore all floating point arguments */ + lfd f1, 88(r1) + lfd f2, 96(r1) + lfd f3, 104(r1) + lfd f4, 112(r1) + lfd f5, 120(r1) + lfd f6, 128(r1) + lfd f7, 136(r1) + lfd f8, 144(r1) + lfd f9, 152(r1) + lfd f10, 160(r1) + lfd f11, 168(r1) + lfd f12, 176(r1) + lfd f13, 184(r1) + + addi r1, r1, 192 + lwz r0, 8(r1) + mtlr r0 + + b _objc_msgSend + +0: + lwz r3, 216(r1) + lwz r4, 220(r1) + + addi r1, r1, 192 + lwz r0, 8(r1) + mtlr r0 + + b _of_method_not_found + +_of_forward_stret: + mflr r0 + stw r0, 8(r1) + stwu r1, -184(r1) + + /* + * Save all arguments and r13. + * + * We can dump three parameters in the parameter area as we know that + * space has been reserved for at least three parameters. + */ + stw r3, 208(r1) + stw r4, 212(r1) + stw r5, 216(r1) + stw r6, 56(r1) + stw r7, 60(r1) + stw r8, 64(r1) + stw r9, 68(r1) + stw r10, 72(r1) + stw r13, 76(r1) + + /* Save all floating point arguments */ + stfd f1, 80(r1) + stfd f2, 88(r1) + stfd f3, 96(r1) + stfd f4, 104(r1) + stfd f5, 112(r1) + stfd f6, 120(r1) + stfd f7, 128(r1) + stfd f8, 136(r1) + stfd f9, 144(r1) + stfd f10, 152(r1) + stfd f11, 160(r1) + stfd f12, 168(r1) + stfd f13, 176(r1) + + mr r3, r4 + bl _object_getClass + + bl 0f +0: + mflr r13 + addis r13, r13, ha16(sel_forwardingTargetForSelector_-0b) + lwz r13, lo16(sel_forwardingTargetForSelector_-0b)(r13) + + mr r4, r13 + bl _class_respondsToSelector + + cmpwi r3, 0 + beq- 0f + + lwz r3, 212(r1) + mr r4, r13 + lwz r5, 216(r1) + bl _objc_msgSend + + cmpwi r3, 0 + beq- 0f + lwz r4, 212(r1) + cmpw r3, r4 + beq- 0f + + mr r4, r3 + + /* Restore all arguments and r13, except r4 */ + lwz r3, 208(r1) + lwz r5, 216(r1) + lwz r6, 56(r1) + lwz r7, 60(r1) + lwz r8, 64(r1) + lwz r9, 68(r1) + lwz r10, 72(r1) + lwz r13, 76(r1) + + /* Restore all floating point arguments */ + lfd f1, 80(r1) + lfd f2, 88(r1) + lfd f3, 96(r1) + lfd f4, 104(r1) + lfd f5, 112(r1) + lfd f6, 120(r1) + lfd f7, 128(r1) + lfd f8, 136(r1) + lfd f9, 144(r1) + lfd f10, 152(r1) + lfd f11, 160(r1) + lfd f12, 168(r1) + lfd f13, 176(r1) + + addi r1, r1, 184 + lwz r0, 8(r1) + mtlr r0 + + b _objc_msgSend_stret + +0: + lwz r3, 208(r1) + lwz r4, 212(r1) + lwz r5, 216(r1) + + addi r1, r1, 184 + lwz r0, 8(r1) + mtlr r0 + + b _of_method_not_found_stret DELETED src/forwarding/apple-forwarding-ppc.S Index: src/forwarding/apple-forwarding-ppc.S ================================================================== --- src/forwarding/apple-forwarding-ppc.S +++ src/forwarding/apple-forwarding-ppc.S @@ -1,240 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -.globl _of_forward -.globl _of_forward_stret - -.section __TEXT, __cstring, cstring_literals -str_forwardingTargetForSelector_: - .asciz "forwardingTargetForSelector:" - -.section __OBJC, __message_refs -sel_forwardingTargetForSelector_: - .long str_forwardingTargetForSelector_ - -.section __OBJC, __image_info - .long 0, 0 - -.section __TEXT, __text, regular, pure_instructions -_of_forward: - mflr r0 - stw r0, 8(r1) - stwu r1, -192(r1) - - /* - * Save all arguments and r13. - * - * We can dump two parameters in the parameter area as we know that - * space has been reserved for at least two parameters. - */ - stw r3, 216(r1) - stw r4, 220(r1) - stw r5, 56(r1) - stw r6, 60(r1) - stw r7, 64(r1) - stw r8, 68(r1) - stw r9, 72(r1) - stw r10, 76(r1) - stw r13, 80(r1) - - /* Save all floating point arguments */ - stfd f1, 88(r1) - stfd f2, 96(r1) - stfd f3, 104(r1) - stfd f4, 112(r1) - stfd f5, 120(r1) - stfd f6, 128(r1) - stfd f7, 136(r1) - stfd f8, 144(r1) - stfd f9, 152(r1) - stfd f10, 160(r1) - stfd f11, 168(r1) - stfd f12, 176(r1) - stfd f13, 184(r1) - - bl _object_getClass - - bl 0f -0: - mflr r13 - addis r13, r13, ha16(sel_forwardingTargetForSelector_-0b) - lwz r13, lo16(sel_forwardingTargetForSelector_-0b)(r13) - - mr r4, r13 - bl _class_respondsToSelector - - cmpwi r3, 0 - beq- 0f - - lwz r3, 216(r1) - mr r4, r13 - lwz r5, 220(r1) - bl _objc_msgSend - - cmpwi r3, 0 - beq- 0f - lwz r4, 216(r1) - cmpw r3, r4 - beq- 0f - - /* Restore all arguments and r13, except r3 */ - lwz r4, 220(r1) - lwz r5, 56(r1) - lwz r6, 60(r1) - lwz r7, 64(r1) - lwz r8, 68(r1) - lwz r9, 72(r1) - lwz r10, 76(r1) - lwz r13, 80(r1) - - /* Restore all floating point arguments */ - lfd f1, 88(r1) - lfd f2, 96(r1) - lfd f3, 104(r1) - lfd f4, 112(r1) - lfd f5, 120(r1) - lfd f6, 128(r1) - lfd f7, 136(r1) - lfd f8, 144(r1) - lfd f9, 152(r1) - lfd f10, 160(r1) - lfd f11, 168(r1) - lfd f12, 176(r1) - lfd f13, 184(r1) - - addi r1, r1, 192 - lwz r0, 8(r1) - mtlr r0 - - b _objc_msgSend - -0: - lwz r3, 216(r1) - lwz r4, 220(r1) - - addi r1, r1, 192 - lwz r0, 8(r1) - mtlr r0 - - b _of_method_not_found - -_of_forward_stret: - mflr r0 - stw r0, 8(r1) - stwu r1, -184(r1) - - /* - * Save all arguments and r13. - * - * We can dump three parameters in the parameter area as we know that - * space has been reserved for at least three parameters. - */ - stw r3, 208(r1) - stw r4, 212(r1) - stw r5, 216(r1) - stw r6, 56(r1) - stw r7, 60(r1) - stw r8, 64(r1) - stw r9, 68(r1) - stw r10, 72(r1) - stw r13, 76(r1) - - /* Save all floating point arguments */ - stfd f1, 80(r1) - stfd f2, 88(r1) - stfd f3, 96(r1) - stfd f4, 104(r1) - stfd f5, 112(r1) - stfd f6, 120(r1) - stfd f7, 128(r1) - stfd f8, 136(r1) - stfd f9, 144(r1) - stfd f10, 152(r1) - stfd f11, 160(r1) - stfd f12, 168(r1) - stfd f13, 176(r1) - - mr r3, r4 - bl _object_getClass - - bl 0f -0: - mflr r13 - addis r13, r13, ha16(sel_forwardingTargetForSelector_-0b) - lwz r13, lo16(sel_forwardingTargetForSelector_-0b)(r13) - - mr r4, r13 - bl _class_respondsToSelector - - cmpwi r3, 0 - beq- 0f - - lwz r3, 212(r1) - mr r4, r13 - lwz r5, 216(r1) - bl _objc_msgSend - - cmpwi r3, 0 - beq- 0f - lwz r4, 212(r1) - cmpw r3, r4 - beq- 0f - - mr r4, r3 - - /* Restore all arguments and r13, except r4 */ - lwz r3, 208(r1) - lwz r5, 216(r1) - lwz r6, 56(r1) - lwz r7, 60(r1) - lwz r8, 64(r1) - lwz r9, 68(r1) - lwz r10, 72(r1) - lwz r13, 76(r1) - - /* Restore all floating point arguments */ - lfd f1, 80(r1) - lfd f2, 88(r1) - lfd f3, 96(r1) - lfd f4, 104(r1) - lfd f5, 112(r1) - lfd f6, 120(r1) - lfd f7, 128(r1) - lfd f8, 136(r1) - lfd f9, 144(r1) - lfd f10, 152(r1) - lfd f11, 160(r1) - lfd f12, 168(r1) - lfd f13, 176(r1) - - addi r1, r1, 184 - lwz r0, 8(r1) - mtlr r0 - - b _objc_msgSend_stret - -0: - lwz r3, 208(r1) - lwz r4, 212(r1) - lwz r5, 216(r1) - - addi r1, r1, 184 - lwz r0, 8(r1) - mtlr r0 - - b _of_method_not_found_stret ADDED src/forwarding/forwarding-powerpc-elf.S Index: src/forwarding/forwarding-powerpc-elf.S ================================================================== --- src/forwarding/forwarding-powerpc-elf.S +++ src/forwarding/forwarding-powerpc-elf.S @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include "platform.h" + +.globl of_forward +.globl of_forward_stret + +.section .text +of_forward: + stwu %r1, -112(%r1) + mflr %r0 + stw %r0, 116(%r1) + + /* Save all arguments */ + stw %r3, 8(%r1) + stw %r4, 12(%r1) + stw %r5, 16(%r1) + stw %r6, 20(%r1) + stw %r7, 24(%r1) + stw %r8, 28(%r1) + stw %r9, 32(%r1) + stw %r10, 36(%r1) + + /* Save all floating point arguments */ + stfd %f1, 40(%r1) + stfd %f2, 48(%r1) + stfd %f3, 56(%r1) + stfd %f4, 64(%r1) + stfd %f5, 72(%r1) + stfd %f6, 80(%r1) + stfd %f7, 88(%r1) + stfd %f8, 96(%r1) + + bl object_getClass@plt + + lis %r4, sel_forwardingTargetForSelector_@ha + la %r4, sel_forwardingTargetForSelector_@l(%r4) + bl class_respondsToSelector@plt + + cmpwi %r3, 0 + beq- 0f + + lwz %r3, 8(%r1) + lis %r4, sel_forwardingTargetForSelector_@ha + la %r4, sel_forwardingTargetForSelector_@l(%r4) + bl objc_msg_lookup@plt + mtctr %r3 + + lwz %r3, 8(%r1) + lis %r4, sel_forwardingTargetForSelector_@ha + la %r4, sel_forwardingTargetForSelector_@l(%r4) + lwz %r5, 12(%r1) + bctrl + + cmpwi %r3, 0 + beq- 0f + lwz %r4, 8(%r1) + cmpw %r3, %r4 + beq- 0f + + stw %r3, 8(%r1) + + lwz %r4, 12(%r1) + bl objc_msg_lookup@plt + mtctr %r3 + + /* Restore all arguments */ + lwz %r3, 8(%r1) + lwz %r4, 12(%r1) + lwz %r5, 16(%r1) + lwz %r6, 20(%r1) + lwz %r7, 24(%r1) + lwz %r8, 28(%r1) + lwz %r9, 32(%r1) + lwz %r10, 36(%r1) + + /* Restore all floating point arguments */ + lfd %f1, 40(%r1) + lfd %f2, 48(%r1) + lfd %f3, 56(%r1) + lfd %f4, 64(%r1) + lfd %f5, 72(%r1) + lfd %f6, 80(%r1) + lfd %f7, 88(%r1) + lfd %f8, 96(%r1) + + lwz %r0, 116(%r1) + mtlr %r0 + addi %r1, %r1, 112 + bctr + +0: + lwz %r3, 8(%r1) + lwz %r4, 12(%r1) + + lwz %r0, 116(%r1) + mtlr %r0 + addi %r1, %r1, 112 + + b of_method_not_found@plt +.type of_forward, @function +.size of_forward, .-of_forward + +of_forward_stret: + stwu %r1, -112(%r1) + mflr %r0 + stw %r0, 116(%r1) + + /* Save all arguments */ + stw %r3, 8(%r1) + stw %r4, 12(%r1) + stw %r5, 16(%r1) + stw %r6, 20(%r1) + stw %r7, 24(%r1) + stw %r8, 28(%r1) + stw %r9, 32(%r1) + stw %r10, 36(%r1) + + /* Save all floating point arguments */ + stfd %f1, 40(%r1) + stfd %f2, 48(%r1) + stfd %f3, 56(%r1) + stfd %f4, 64(%r1) + stfd %f5, 72(%r1) + stfd %f6, 80(%r1) + stfd %f7, 88(%r1) + stfd %f8, 96(%r1) + + mr %r3, %r4 + bl object_getClass@plt + + lis %r4, sel_forwardingTargetForSelector_@ha + la %r4, sel_forwardingTargetForSelector_@l(%r4) + bl class_respondsToSelector@plt + + cmpwi %r3, 0 + beq- 0f + + lwz %r3, 12(%r1) + lis %r4, sel_forwardingTargetForSelector_@ha + la %r4, sel_forwardingTargetForSelector_@l(%r4) + bl objc_msg_lookup@plt + mtctr %r3 + + lwz %r3, 12(%r1) + lis %r4, sel_forwardingTargetForSelector_@ha + la %r4, sel_forwardingTargetForSelector_@l(%r4) + lwz %r5, 16(%r1) + bctrl + + cmpwi %r3, 0 + beq- 0f + lwz %r4, 12(%r1) + cmpw %r3, %r4 + beq- 0f + + stw %r3, 12(%r1) + + lwz %r4, 16(%r1) + bl objc_msg_lookup_stret@plt + mtctr %r3 + + /* Restore all arguments */ + lwz %r3, 8(%r1) + lwz %r4, 12(%r1) + lwz %r5, 16(%r1) + lwz %r6, 20(%r1) + lwz %r7, 24(%r1) + lwz %r8, 28(%r1) + lwz %r9, 32(%r1) + lwz %r10, 36(%r1) + + /* Restore all floating point arguments */ + lfd %f1, 40(%r1) + lfd %f2, 48(%r1) + lfd %f3, 56(%r1) + lfd %f4, 64(%r1) + lfd %f5, 72(%r1) + lfd %f6, 80(%r1) + lfd %f7, 88(%r1) + lfd %f8, 96(%r1) + + lwz %r0, 116(%r1) + mtlr %r0 + addi %r1, %r1, 112 + bctr + +0: + lwz %r3, 8(%r1) + lwz %r4, 12(%r1) + lwz %r5, 16(%r1) + + lwz %r0, 116(%r1) + mtlr %r0 + addi %r1, %r1, 112 + + b of_method_not_found_stret@plt +.type of_forward_stret, @function +.size of_forward_stret, .-of_forward_stret + +init: + lis %r3, module@ha + la %r3, module@l(%r3) + b __objc_exec_class@plt + +.section .ctors, "aw", @progbits + .long init + +.section .rodata +str_forwardingTargetForSelector_: + .asciz "forwardingTargetForSelector:" + +.section .data +sel_forwardingTargetForSelector_: + .long str_forwardingTargetForSelector_, 0 + .long 0, 0 +symtab: + .long 0, sel_forwardingTargetForSelector_ + .short 0, 0 + .long 0 + .long 0 +module: + .long 8, 16, 0, symtab + +#ifdef OF_LINUX +.section .note.GNU-stack, "", @progbits +#endif DELETED src/forwarding/forwarding-ppc-elf.S Index: src/forwarding/forwarding-ppc-elf.S ================================================================== --- src/forwarding/forwarding-ppc-elf.S +++ src/forwarding/forwarding-ppc-elf.S @@ -1,243 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include "platform.h" - -.globl of_forward -.globl of_forward_stret - -.section .text -of_forward: - stwu %r1, -112(%r1) - mflr %r0 - stw %r0, 116(%r1) - - /* Save all arguments */ - stw %r3, 8(%r1) - stw %r4, 12(%r1) - stw %r5, 16(%r1) - stw %r6, 20(%r1) - stw %r7, 24(%r1) - stw %r8, 28(%r1) - stw %r9, 32(%r1) - stw %r10, 36(%r1) - - /* Save all floating point arguments */ - stfd %f1, 40(%r1) - stfd %f2, 48(%r1) - stfd %f3, 56(%r1) - stfd %f4, 64(%r1) - stfd %f5, 72(%r1) - stfd %f6, 80(%r1) - stfd %f7, 88(%r1) - stfd %f8, 96(%r1) - - bl object_getClass@plt - - lis %r4, sel_forwardingTargetForSelector_@ha - la %r4, sel_forwardingTargetForSelector_@l(%r4) - bl class_respondsToSelector@plt - - cmpwi %r3, 0 - beq- 0f - - lwz %r3, 8(%r1) - lis %r4, sel_forwardingTargetForSelector_@ha - la %r4, sel_forwardingTargetForSelector_@l(%r4) - bl objc_msg_lookup@plt - mtctr %r3 - - lwz %r3, 8(%r1) - lis %r4, sel_forwardingTargetForSelector_@ha - la %r4, sel_forwardingTargetForSelector_@l(%r4) - lwz %r5, 12(%r1) - bctrl - - cmpwi %r3, 0 - beq- 0f - lwz %r4, 8(%r1) - cmpw %r3, %r4 - beq- 0f - - stw %r3, 8(%r1) - - lwz %r4, 12(%r1) - bl objc_msg_lookup@plt - mtctr %r3 - - /* Restore all arguments */ - lwz %r3, 8(%r1) - lwz %r4, 12(%r1) - lwz %r5, 16(%r1) - lwz %r6, 20(%r1) - lwz %r7, 24(%r1) - lwz %r8, 28(%r1) - lwz %r9, 32(%r1) - lwz %r10, 36(%r1) - - /* Restore all floating point arguments */ - lfd %f1, 40(%r1) - lfd %f2, 48(%r1) - lfd %f3, 56(%r1) - lfd %f4, 64(%r1) - lfd %f5, 72(%r1) - lfd %f6, 80(%r1) - lfd %f7, 88(%r1) - lfd %f8, 96(%r1) - - lwz %r0, 116(%r1) - mtlr %r0 - addi %r1, %r1, 112 - bctr - -0: - lwz %r3, 8(%r1) - lwz %r4, 12(%r1) - - lwz %r0, 116(%r1) - mtlr %r0 - addi %r1, %r1, 112 - - b of_method_not_found@plt -.type of_forward, @function -.size of_forward, .-of_forward - -of_forward_stret: - stwu %r1, -112(%r1) - mflr %r0 - stw %r0, 116(%r1) - - /* Save all arguments */ - stw %r3, 8(%r1) - stw %r4, 12(%r1) - stw %r5, 16(%r1) - stw %r6, 20(%r1) - stw %r7, 24(%r1) - stw %r8, 28(%r1) - stw %r9, 32(%r1) - stw %r10, 36(%r1) - - /* Save all floating point arguments */ - stfd %f1, 40(%r1) - stfd %f2, 48(%r1) - stfd %f3, 56(%r1) - stfd %f4, 64(%r1) - stfd %f5, 72(%r1) - stfd %f6, 80(%r1) - stfd %f7, 88(%r1) - stfd %f8, 96(%r1) - - mr %r3, %r4 - bl object_getClass@plt - - lis %r4, sel_forwardingTargetForSelector_@ha - la %r4, sel_forwardingTargetForSelector_@l(%r4) - bl class_respondsToSelector@plt - - cmpwi %r3, 0 - beq- 0f - - lwz %r3, 12(%r1) - lis %r4, sel_forwardingTargetForSelector_@ha - la %r4, sel_forwardingTargetForSelector_@l(%r4) - bl objc_msg_lookup@plt - mtctr %r3 - - lwz %r3, 12(%r1) - lis %r4, sel_forwardingTargetForSelector_@ha - la %r4, sel_forwardingTargetForSelector_@l(%r4) - lwz %r5, 16(%r1) - bctrl - - cmpwi %r3, 0 - beq- 0f - lwz %r4, 12(%r1) - cmpw %r3, %r4 - beq- 0f - - stw %r3, 12(%r1) - - lwz %r4, 16(%r1) - bl objc_msg_lookup_stret@plt - mtctr %r3 - - /* Restore all arguments */ - lwz %r3, 8(%r1) - lwz %r4, 12(%r1) - lwz %r5, 16(%r1) - lwz %r6, 20(%r1) - lwz %r7, 24(%r1) - lwz %r8, 28(%r1) - lwz %r9, 32(%r1) - lwz %r10, 36(%r1) - - /* Restore all floating point arguments */ - lfd %f1, 40(%r1) - lfd %f2, 48(%r1) - lfd %f3, 56(%r1) - lfd %f4, 64(%r1) - lfd %f5, 72(%r1) - lfd %f6, 80(%r1) - lfd %f7, 88(%r1) - lfd %f8, 96(%r1) - - lwz %r0, 116(%r1) - mtlr %r0 - addi %r1, %r1, 112 - bctr - -0: - lwz %r3, 8(%r1) - lwz %r4, 12(%r1) - lwz %r5, 16(%r1) - - lwz %r0, 116(%r1) - mtlr %r0 - addi %r1, %r1, 112 - - b of_method_not_found_stret@plt -.type of_forward_stret, @function -.size of_forward_stret, .-of_forward_stret - -init: - lis %r3, module@ha - la %r3, module@l(%r3) - b __objc_exec_class@plt - -.section .ctors, "aw", @progbits - .long init - -.section .rodata -str_forwardingTargetForSelector_: - .asciz "forwardingTargetForSelector:" - -.section .data -sel_forwardingTargetForSelector_: - .long str_forwardingTargetForSelector_, 0 - .long 0, 0 -symtab: - .long 0, sel_forwardingTargetForSelector_ - .short 0, 0 - .long 0 - .long 0 -module: - .long 8, 16, 0, symtab - -#ifdef OF_LINUX -.section .note.GNU-stack, "", @progbits -#endif Index: src/forwarding/forwarding.S ================================================================== --- src/forwarding/forwarding.S +++ src/forwarding/forwarding.S @@ -26,11 +26,11 @@ # elif defined(OF_ARM64) # include "apple-forwarding-arm64.S" # elif defined(OF_ARM) # include "apple-forwarding-arm.S" # elif defined(OF_POWERPC) -# include "apple-forwarding-ppc.S" +# include "apple-forwarding-powerpc.S" # endif #else # if defined(OF_ELF) # if defined(OF_X86_64) # include "forwarding-x86_64-elf.S" @@ -39,11 +39,11 @@ # elif defined(OF_ARM64) # include "forwarding-arm64-elf.S" # elif defined(OF_ARM) # include "forwarding-arm-elf.S" # elif defined(OF_POWERPC) -# include "forwarding-ppc-elf.S" +# include "forwarding-powerpc-elf.S" # elif defined(OF_MIPS) # include "forwarding-mips-elf.S" # elif defined(OF_SPARC64) # include "forwarding-sparc64-elf.S" # endif DELETED src/runtime/lookup-asm/lookup-asm-mips64-elf.S Index: src/runtime/lookup-asm/lookup-asm-mips64-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-mips64-elf.S +++ src/runtime/lookup-asm/lookup-asm-mips64-elf.S @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include "platform.h" - -.globl objc_msg_lookup -.globl objc_msg_lookup_stret -.globl objc_msg_lookup_super -.globl objc_msg_lookup_super_stret - -.section .text -.macro generate_lookup name not_found -\name: - beqz $a0, 0f - - ld $t0, 0($a0) - ld $t0, 64($t0) - -.Lmain_\name: -#ifdef OF_BIG_ENDIAN -# ifdef OF_SELUID24 - lbu $t1, 5($a1) -# endif - lbu $t2, 6($a1) - lbu $t3, 7($a1) -#else -# ifdef OF_SELUID24 - lbu $t1, 2($a1) -# endif - lbu $t2, 1($a1) - lbu $t3, 0($a1) -#endif - -#ifdef OF_SELUID24 - sll $t1, $t1, 3 -#endif - sll $t2, $t2, 3 - sll $t3, $t3, 3 - -#ifdef OF_SELUID24 - daddu $t0, $t0, $t1 - ld $t0, 0($t0) -#endif - daddu $t0, $t0, $t2 - ld $t0, 0($t0) - daddu $t0, $t0, $t3 - ld $t0, 0($t0) - - beqz $t0, 1f - - move $v0, $t0 - jr $ra - -0: - lui $v0, %hi(%neg(%gp_rel(\name))) - daddu $v0, $v0, $t9 - daddiu $v0, $v0, %lo(%neg(%gp_rel(\name))) - ld $v0, %got_disp(nil_method)($v0) - jr $ra - -1: - lui $t0, %hi(%neg(%gp_rel(\name))) - daddu $t0, $t0, $t9 - daddiu $t0, $t0, %lo(%neg(%gp_rel(\name))) - ld $t9, %got_disp(\not_found)($t0) - jr $t9 -.type \name, %function -.size \name, .-\name -.endm - -.macro generate_lookup_super name lookup -\name: - move $t0, $a0 - ld $a0, 0($a0) - beqz $a0, 0f - - ld $t0, 8($t0) - ld $t0, 64($t0) - - daddiu $t9, $t9, \lookup-\name - b .Lmain_\lookup - -0: - lui $v0, %hi(%neg(%gp_rel(\name))) - daddu $v0, $v0, $t9 - daddiu $v0, $v0, %lo(%neg(%gp_rel(\name))) - ld $v0, %got_disp(nil_method)($v0) - jr $ra -.type \name, %function -.size \name, .-\name -.endm - -generate_lookup objc_msg_lookup objc_method_not_found -generate_lookup objc_msg_lookup_stret objc_method_not_found_stret -generate_lookup_super objc_msg_lookup_super objc_msg_lookup -generate_lookup_super objc_msg_lookup_super_stret objc_msg_lookup_stret - -nil_method: - move $v0, $zero - jr $ra - -#ifdef OF_LINUX -.section .note.GNU-stack, "", %progbits -#endif ADDED src/runtime/lookup-asm/lookup-asm-mips64-n64-elf.S Index: src/runtime/lookup-asm/lookup-asm-mips64-n64-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-mips64-n64-elf.S +++ src/runtime/lookup-asm/lookup-asm-mips64-n64-elf.S @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include "platform.h" + +.globl objc_msg_lookup +.globl objc_msg_lookup_stret +.globl objc_msg_lookup_super +.globl objc_msg_lookup_super_stret + +.section .text +.macro generate_lookup name not_found +\name: + beqz $a0, 0f + + ld $t0, 0($a0) + ld $t0, 64($t0) + +.Lmain_\name: +#ifdef OF_BIG_ENDIAN +# ifdef OF_SELUID24 + lbu $t1, 5($a1) +# endif + lbu $t2, 6($a1) + lbu $t3, 7($a1) +#else +# ifdef OF_SELUID24 + lbu $t1, 2($a1) +# endif + lbu $t2, 1($a1) + lbu $t3, 0($a1) +#endif + +#ifdef OF_SELUID24 + sll $t1, $t1, 3 +#endif + sll $t2, $t2, 3 + sll $t3, $t3, 3 + +#ifdef OF_SELUID24 + daddu $t0, $t0, $t1 + ld $t0, 0($t0) +#endif + daddu $t0, $t0, $t2 + ld $t0, 0($t0) + daddu $t0, $t0, $t3 + ld $t0, 0($t0) + + beqz $t0, 1f + + move $v0, $t0 + jr $ra + +0: + lui $v0, %hi(%neg(%gp_rel(\name))) + daddu $v0, $v0, $t9 + daddiu $v0, $v0, %lo(%neg(%gp_rel(\name))) + ld $v0, %got_disp(nil_method)($v0) + jr $ra + +1: + lui $t0, %hi(%neg(%gp_rel(\name))) + daddu $t0, $t0, $t9 + daddiu $t0, $t0, %lo(%neg(%gp_rel(\name))) + ld $t9, %got_disp(\not_found)($t0) + jr $t9 +.type \name, %function +.size \name, .-\name +.endm + +.macro generate_lookup_super name lookup +\name: + move $t0, $a0 + ld $a0, 0($a0) + beqz $a0, 0f + + ld $t0, 8($t0) + ld $t0, 64($t0) + + daddiu $t9, $t9, \lookup-\name + b .Lmain_\lookup + +0: + lui $v0, %hi(%neg(%gp_rel(\name))) + daddu $v0, $v0, $t9 + daddiu $v0, $v0, %lo(%neg(%gp_rel(\name))) + ld $v0, %got_disp(nil_method)($v0) + jr $ra +.type \name, %function +.size \name, .-\name +.endm + +generate_lookup objc_msg_lookup objc_method_not_found +generate_lookup objc_msg_lookup_stret objc_method_not_found_stret +generate_lookup_super objc_msg_lookup_super objc_msg_lookup +generate_lookup_super objc_msg_lookup_super_stret objc_msg_lookup_stret + +nil_method: + move $v0, $zero + jr $ra + +#ifdef OF_LINUX +.section .note.GNU-stack, "", %progbits +#endif ADDED src/runtime/lookup-asm/lookup-asm-powerpc-elf.S Index: src/runtime/lookup-asm/lookup-asm-powerpc-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-powerpc-elf.S +++ src/runtime/lookup-asm/lookup-asm-powerpc-elf.S @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include "platform.h" + +.globl objc_msg_lookup +.globl objc_msg_lookup_stret +.globl objc_msg_lookup_super +.globl objc_msg_lookup_super_stret + +.section .text +.macro generate_lookup name not_found +\name: + cmpwi %r3, 0 + beq- ret_nil + + lwz %r5, 0(%r3) + lwz %r5, 32(%r5) + +.Lmain_\name: + lwz %r8, 0(%r4) +#ifdef OF_SELUID24 + rlwinm %r6, %r8, 18, 0x3FC +#endif + rlwinm %r7, %r8, 26, 0x3FC + rlwinm %r8, %r8, 2, 0x3FC + +#ifdef OF_SELUID24 + lwzx %r5, %r5, %r6 +#endif + lwzx %r5, %r5, %r7 + lwzx %r5, %r5, %r8 + + cmpwi %r5, 0 + beq- 0f + + mr %r3, %r5 + blr + +0: + b \not_found@plt +.type \name, @function +.size \name, .-\name +.endm + +.macro generate_lookup_super name lookup +\name: + mr %r5, %r3 + lwz %r3, 0(%r3) + cmpwi %r3, 0 + beq- ret_nil + + lwz %r5, 4(%r5) + lwz %r5, 32(%r5) + + b .Lmain_\lookup +.type \name, @function +.size \name, .-\name +.endm + +generate_lookup objc_msg_lookup objc_method_not_found +generate_lookup objc_msg_lookup_stret objc_method_not_found_stret +generate_lookup_super objc_msg_lookup_super objc_msg_lookup +generate_lookup_super objc_msg_lookup_super_stret objc_msg_lookup_stret + +ret_nil: + mflr %r0 + bl get_pc + mtlr %r0 +0: + addi %r3, %r3, nil_method-0b + blr + +nil_method: + li %r3, 0 + blr + +get_pc: + mflr %r3 + blr + +#ifdef OF_LINUX +.section .note.GNU-stack, "", @progbits +#endif ADDED src/runtime/lookup-asm/lookup-asm-powerpc-macho.S Index: src/runtime/lookup-asm/lookup-asm-powerpc-macho.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-powerpc-macho.S +++ src/runtime/lookup-asm/lookup-asm-powerpc-macho.S @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +.globl _objc_msg_lookup +.globl _objc_msg_lookup_stret +.globl _objc_msg_lookup_super +.globl _objc_msg_lookup_super_stret + +.section __TEXT, __text, regular, pure_instructions +.macro generate_lookup +$0: + cmpwi r3, 0 + beq- ret_nil + + lwz r5, 0(r3) + lwz r5, 32(r5) + +Lmain_$0: + lwz r8, 0(r4) +#ifdef OF_SELUID24 + rlwinm r6, r8, 18, 0x3FC +#endif + rlwinm r7, r8, 26, 0x3FC + rlwinm r8, r8, 2, 0x3FC + +#ifdef OF_SELUID24 + lwzx r5, r5, r6 +#endif + lwzx r5, r5, r7 + lwzx r5, r5, r8 + + cmpwi r5, 0 + beq- 0f + + mr r3, r5 + blr + +0: + b $1 +.endmacro + +.macro generate_lookup_super +$0: + mr r5, r3 + lwz r3, 0(r3) + cmpwi r3, 0 + beq- ret_nil + + lwz r5, 4(r5) + lwz r5, 32(r5) + + b Lmain_$1 +.endmacro + +generate_lookup _objc_msg_lookup, _objc_method_not_found +generate_lookup _objc_msg_lookup_stret, _objc_method_not_found_stret +generate_lookup_super _objc_msg_lookup_super, _objc_msg_lookup +generate_lookup_super _objc_msg_lookup_super_stret, _objc_msg_lookup_stret + +ret_nil: + mflr r0 + bl get_pc + mtlr r0 +0: + addi r3, r3, lo16(nil_method-0b) + blr + +nil_method: + li r3, 0 + blr + +get_pc: + mflr r3 + blr DELETED src/runtime/lookup-asm/lookup-asm-ppc-elf.S Index: src/runtime/lookup-asm/lookup-asm-ppc-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-ppc-elf.S +++ src/runtime/lookup-asm/lookup-asm-ppc-elf.S @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include "platform.h" - -.globl objc_msg_lookup -.globl objc_msg_lookup_stret -.globl objc_msg_lookup_super -.globl objc_msg_lookup_super_stret - -.section .text -.macro generate_lookup name not_found -\name: - cmpwi %r3, 0 - beq- ret_nil - - lwz %r5, 0(%r3) - lwz %r5, 32(%r5) - -.Lmain_\name: - lwz %r8, 0(%r4) -#ifdef OF_SELUID24 - rlwinm %r6, %r8, 18, 0x3FC -#endif - rlwinm %r7, %r8, 26, 0x3FC - rlwinm %r8, %r8, 2, 0x3FC - -#ifdef OF_SELUID24 - lwzx %r5, %r5, %r6 -#endif - lwzx %r5, %r5, %r7 - lwzx %r5, %r5, %r8 - - cmpwi %r5, 0 - beq- 0f - - mr %r3, %r5 - blr - -0: - b \not_found@plt -.type \name, @function -.size \name, .-\name -.endm - -.macro generate_lookup_super name lookup -\name: - mr %r5, %r3 - lwz %r3, 0(%r3) - cmpwi %r3, 0 - beq- ret_nil - - lwz %r5, 4(%r5) - lwz %r5, 32(%r5) - - b .Lmain_\lookup -.type \name, @function -.size \name, .-\name -.endm - -generate_lookup objc_msg_lookup objc_method_not_found -generate_lookup objc_msg_lookup_stret objc_method_not_found_stret -generate_lookup_super objc_msg_lookup_super objc_msg_lookup -generate_lookup_super objc_msg_lookup_super_stret objc_msg_lookup_stret - -ret_nil: - mflr %r0 - bl get_pc - mtlr %r0 -0: - addi %r3, %r3, nil_method-0b - blr - -nil_method: - li %r3, 0 - blr - -get_pc: - mflr %r3 - blr - -#ifdef OF_LINUX -.section .note.GNU-stack, "", @progbits -#endif DELETED src/runtime/lookup-asm/lookup-asm-ppc-macho.S Index: src/runtime/lookup-asm/lookup-asm-ppc-macho.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-ppc-macho.S +++ src/runtime/lookup-asm/lookup-asm-ppc-macho.S @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -.globl _objc_msg_lookup -.globl _objc_msg_lookup_stret -.globl _objc_msg_lookup_super -.globl _objc_msg_lookup_super_stret - -.section __TEXT, __text, regular, pure_instructions -.macro generate_lookup -$0: - cmpwi r3, 0 - beq- ret_nil - - lwz r5, 0(r3) - lwz r5, 32(r5) - -Lmain_$0: - lwz r8, 0(r4) -#ifdef OF_SELUID24 - rlwinm r6, r8, 18, 0x3FC -#endif - rlwinm r7, r8, 26, 0x3FC - rlwinm r8, r8, 2, 0x3FC - -#ifdef OF_SELUID24 - lwzx r5, r5, r6 -#endif - lwzx r5, r5, r7 - lwzx r5, r5, r8 - - cmpwi r5, 0 - beq- 0f - - mr r3, r5 - blr - -0: - b $1 -.endmacro - -.macro generate_lookup_super -$0: - mr r5, r3 - lwz r3, 0(r3) - cmpwi r3, 0 - beq- ret_nil - - lwz r5, 4(r5) - lwz r5, 32(r5) - - b Lmain_$1 -.endmacro - -generate_lookup _objc_msg_lookup, _objc_method_not_found -generate_lookup _objc_msg_lookup_stret, _objc_method_not_found_stret -generate_lookup_super _objc_msg_lookup_super, _objc_msg_lookup -generate_lookup_super _objc_msg_lookup_super_stret, _objc_msg_lookup_stret - -ret_nil: - mflr r0 - bl get_pc - mtlr r0 -0: - addi r3, r3, lo16(nil_method-0b) - blr - -nil_method: - li r3, 0 - blr - -get_pc: - mflr r3 - blr Index: src/runtime/lookup-asm/lookup-asm.S ================================================================== --- src/runtime/lookup-asm/lookup-asm.S +++ src/runtime/lookup-asm/lookup-asm.S @@ -26,13 +26,13 @@ # elif defined(OF_ARM64) # include "lookup-asm-arm64-elf.S" # elif defined(OF_ARM) # include "lookup-asm-arm-elf.S" # elif defined(OF_POWERPC) -# include "lookup-asm-ppc-elf.S" +# include "lookup-asm-powerpc-elf.S" # elif defined(OF_MIPS64_N64) -# include "lookup-asm-mips64-elf.S" +# include "lookup-asm-mips64-n64-elf.S" # elif defined(OF_MIPS) # include "lookup-asm-mips-elf.S" # elif defined(OF_SPARC64) # include "lookup-asm-sparc64-elf.S" # elif defined(OF_SPARC) @@ -40,14 +40,14 @@ # endif #elif defined(OF_MACH_O) # if defined(OF_X86_64) # include "lookup-asm-x86_64-macho.S" # elif defined(OF_POWERPC) -# include "lookup-asm-ppc-macho.S" +# include "lookup-asm-powerpc-macho.S" # endif #elif defined(OF_WINDOWS) # if defined(OF_X86_64) # include "lookup-asm-x86_64-win64.S" # elif defined(OF_X86) # include "lookup-asm-x86-win32.S" # endif #endif