Index: PLATFORMS.md ================================================================== --- PLATFORMS.md +++ PLATFORMS.md @@ -77,22 +77,23 @@ Linux ----- - * Architectures: Alpha, ARMv6, ARM64, Itanium, m68k, MIPS (O32), RISC-V 64, - PowerPC, S390x, SH4, x86, x86_64 - * Compilers: Clang 3.0-9.0, GCC 4.6-8.2 + * Architectures: Alpha, ARMv6, ARMv7, ARM64, Itanium, m68k, MIPS (O32), + MIPS64 (N64), RISC-V 64, PowerPC, S390x, SuperH-4, x86, + x86_64 + * Compilers: Clang 3.0-10.0, GCC 4.6-10.0 * Runtimes: ObjFW macOS ----- * OS Versions: 10.5, 10.7-10.14, Darling - * Architectures: PowerPC, PowerPC 64, x86, x86_64 - * Compilers: Clang 3.1-7.0, GCC 4.2.1 + * Architectures: PowerPC, PowerPC64, x86, x86_64 + * Compilers: Clang 3.1-10.0, GCC 4.2.1 * Runtimes: Apple, ObjFW MorphOS ------- @@ -105,13 +106,13 @@ NetBSD ------ - * OS Versions: 5.1-7.99 - * Architectures: ARM, ARM (big endian, BE8 mode), SPARC, SPARC64, x86, x86_64 - * Compilers: Clang 3.0-3.2, GCC 4.1.3 & 4.5.3 + * Architectures: ARM, ARM (big endian, BE8 mode), MIPS (O32), PowerPC, SPARC, + SPARC64, x86, x86_64 + * Compilers: Clang 3.0-3.2, GCC 4.1.3 & 4.5.3 & 7.4.0 * Runtimes: ObjFW Nintendo 3DS ------------ @@ -134,11 +135,11 @@ OpenBSD ------- - * OS Versions: 5.2-6.5 + * OS Versions: 5.2-6.7 * Architectures: MIPS64, PA-RISC, PowerPC, SPARC64, x86_64 * Compilers: GCC 6.3.0, Clang 4.0 * Runtimes: ObjFW @@ -184,12 +185,13 @@ ------- * OS Versions: 98 SE, NT 4.0, XP (x86), 7 (x64), 8 (x64), 8.1 (x64), 10, Wine (x86 & x64) * Architectures: x86, x86_64 - * Compilers: GCC 5.3.0 & 6.2.0 from msys2 (x86 and x64), - Clang 3.9.0 from msys2 (x86) + * Compilers: GCC 5.3.0 & 6.2.0 from msys2 (x86 & x64), + Clang 3.9.0 from msys2 (x86), + Clang 10.0 from msys2 (x86 & x86_64) * Runtimes: ObjFW Others ------ Index: src/forwarding/forwarding-powerpc-elf.S ================================================================== --- src/forwarding/forwarding-powerpc-elf.S +++ src/forwarding/forwarding-powerpc-elf.S @@ -25,10 +25,17 @@ .section .text of_forward: stwu %r1, -112(%r1) mflr %r0 stw %r0, 116(%r1) + stw %r30, 104(%r1) + + bl 0f +0: + mflr %r30 + addis %r30, %r30, .Lbiased_got2-0b@ha + addi %r30, %r30, .Lbiased_got2-0b@l /* Save all arguments */ stw %r3, 8(%r1) stw %r4, 12(%r1) stw %r5, 16(%r1) @@ -46,28 +53,25 @@ stfd %f5, 72(%r1) stfd %f6, 80(%r1) stfd %f7, 88(%r1) stfd %f8, 96(%r1) - bl object_getClass@plt + bl object_getClass+0x8000@plt - lis %r4, sel_forwardingTargetForSelector_@ha - la %r4, sel_forwardingTargetForSelector_@l(%r4) - bl class_respondsToSelector@plt + lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30) + bl class_respondsToSelector+0x8000@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 + lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30) + bl objc_msg_lookup+0x8000@plt mtctr %r3 lwz %r3, 8(%r1) - lis %r4, sel_forwardingTargetForSelector_@ha - la %r4, sel_forwardingTargetForSelector_@l(%r4) + lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30) lwz %r5, 12(%r1) bctrl cmpwi %r3, 0 beq- 0f @@ -76,11 +80,11 @@ beq- 0f stw %r3, 8(%r1) lwz %r4, 12(%r1) - bl objc_msg_lookup@plt + bl objc_msg_lookup+0x8000@plt mtctr %r3 /* Restore all arguments */ lwz %r3, 8(%r1) lwz %r4, 12(%r1) @@ -99,31 +103,42 @@ lfd %f5, 72(%r1) lfd %f6, 80(%r1) lfd %f7, 88(%r1) lfd %f8, 96(%r1) + lwz %r30, 104(%r1) lwz %r0, 116(%r1) mtlr %r0 addi %r1, %r1, 112 bctr 0: lwz %r3, 8(%r1) lwz %r4, 12(%r1) + lwz %r0, .Lgot_of_method_not_found-.Lbiased_got2(%r30) + mtctr %r0 + lwz %r30, 104(%r1) lwz %r0, 116(%r1) mtlr %r0 addi %r1, %r1, 112 - b of_method_not_found@plt + bctr .type of_forward, @function .size of_forward, .-of_forward of_forward_stret: stwu %r1, -112(%r1) mflr %r0 stw %r0, 116(%r1) + stw %r30, 104(%r1) + + bl 0f +0: + mflr %r30 + addis %r30, %r30, .Lbiased_got2-0b@ha + addi %r30, %r30, .Lbiased_got2-0b@l /* Save all arguments */ stw %r3, 8(%r1) stw %r4, 12(%r1) stw %r5, 16(%r1) @@ -142,28 +157,25 @@ stfd %f6, 80(%r1) stfd %f7, 88(%r1) stfd %f8, 96(%r1) mr %r3, %r4 - bl object_getClass@plt + bl object_getClass+0x800@plt - lis %r4, sel_forwardingTargetForSelector_@ha - la %r4, sel_forwardingTargetForSelector_@l(%r4) - bl class_respondsToSelector@plt + lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30) + bl class_respondsToSelector+0x8000@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 + lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30) + bl objc_msg_lookup+0x8000@plt mtctr %r3 lwz %r3, 12(%r1) - lis %r4, sel_forwardingTargetForSelector_@ha - la %r4, sel_forwardingTargetForSelector_@l(%r4) + lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30) lwz %r5, 16(%r1) bctrl cmpwi %r3, 0 beq- 0f @@ -172,11 +184,11 @@ beq- 0f stw %r3, 12(%r1) lwz %r4, 16(%r1) - bl objc_msg_lookup_stret@plt + bl objc_msg_lookup_stret+0x8000@plt mtctr %r3 /* Restore all arguments */ lwz %r3, 8(%r1) lwz %r4, 12(%r1) @@ -204,23 +216,42 @@ 0: lwz %r3, 8(%r1) lwz %r4, 12(%r1) lwz %r5, 16(%r1) + lwz %r0, .Lgot_of_method_not_found_stret-.Lbiased_got2(%r30) + mtctr %r0 + lwz %r30, 104(%r1) lwz %r0, 116(%r1) mtlr %r0 addi %r1, %r1, 112 - b of_method_not_found_stret@plt + bctr .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 + stwu %r1, -16(%r1) + mflr %r0 + stw %r0, 20(%r1) + stw %r30, 8(%r1) + + bl 0f +0: + mflr %r30 + addis %r30, %r30, .Lbiased_got2-0b@ha + addi %r30, %r30, .Lbiased_got2-0b@l + + lwz %r3, .Lgot_module-.Lbiased_got2(%r30) + bl __objc_exec_class+0x8000@plt + + lwz %r30, 8(%r1) + lwz %r0, 20(%r1) + addi %r1, %r1, 16 + mtlr %r0 + blr .section .ctors, "aw", @progbits .long init .section .rodata @@ -237,8 +268,19 @@ .long 0 .long 0 module: .long 8, 16, 0, symtab +.section .got2, "aw" +.Lbiased_got2 = .+0x8000 +.Lgot_module: + .long module +.Lgot_sel_forwardingTargetForSelector_: + .long sel_forwardingTargetForSelector_ +.Lgot_of_method_not_found: + .long of_method_not_found +.Lgot_of_method_not_found_stret: + .long of_method_not_found_stret + #ifdef OF_LINUX .section .note.GNU-stack, "", @progbits #endif