Index: src/runtime/lookup-asm-ppc-elf.S ================================================================== --- src/runtime/lookup-asm-ppc-elf.S +++ src/runtime/lookup-asm-ppc-elf.S @@ -20,19 +20,19 @@ .globl objc_msg_lookup_stret .globl objc_msg_lookup_super .globl objc_msg_lookup_super_stret .section .text -objc_msg_lookup: -objc_msg_lookup_stret: /* FIXME */ +.macro generate_lookup name not_found_handler +\name: cmpwi %r3, 0 beq- ret_nil lwz %r5, 0(%r3) lwz %r5, 32(%r5) -lookup: +.main_\name: #ifdef OF_SELUID24 lbz %r6, 1(%r4) #endif lbz %r7, 2(%r4) lbz %r8, 3(%r4) @@ -48,47 +48,54 @@ #endif lwzx %r5, %r5, %r7 lwzx %r5, %r5, %r8 cmpwi %r5, 0 - beq- forward + beq- .forward_\name mr %r3, %r5 blr -.type objc_msg_lookup, %function -.size objc_msg_lookup, .-objc_msg_lookup - -forward: - b objc_not_found_handler@plt - -objc_msg_lookup_super: -objc_msg_lookup_super_stret: /* FIXME */ + +.forward_\name: + b \not_found_handler@plt +.type \name, %function +.size \name, .-\name +.endm + +.macro generate_lookup_super name lookup +\name: lwz %r5, 0(%r3) cmpwi %r5, 0 beq- ret_nil lwz %r5, 4(%r3) lwz %r5, 32(%r5) - b lookup + b .main_\lookup +.type \name, %function +.size \name, .-\name +.endm + +generate_lookup objc_msg_lookup objc_not_found_handler +generate_lookup objc_msg_lookup_stret objc_not_found_handler_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 -.L1: - addi %r3, %r3, nil_method-.L1 +.L0: + addi %r3, %r3, nil_method-.L0 + blr + +nil_method: + li %r3, 0 blr get_pc: mflr %r3 blr -.type objc_msg_lookup_super, %function -.size objc_msg_lookup_super, .-objc_msg_lookup_super - -nil_method: - li %r3, 0 - blr #ifdef __linux__ .section .note.GNU-stack, "", %progbits #endif