Index: src/runtime/lookup-asm-x86-elf.S ================================================================== --- src/runtime/lookup-asm-x86-elf.S +++ src/runtime/lookup-asm-x86-elf.S @@ -20,20 +20,20 @@ .globl objc_msg_lookup_stret .globl objc_msg_lookup_super .globl objc_msg_lookup_super_stret .section .text -objc_msg_lookup: -objc_msg_lookup: /* FIXME */ +.macro generate_lookup name not_found_handler +\name: movl 4(%esp), %edx testl %edx, %edx jz ret_nil movl (%edx), %edx movl 32(%edx), %edx -lookup: +.main_\name: movl 8(%esp), %eax #ifdef OF_SELUID24 movzbl 2(%eax), %ecx movl (%edx,%ecx,4), %edx @@ -42,46 +42,54 @@ movl (%edx,%ecx,4), %edx movzbl (%eax), %ecx movl (%edx,%ecx,4), %eax testl %eax, %eax - jz forward - - ret - -ret_nil: - call get_eip -.L2: - addl $nil_method-.L2, %eax - ret - -forward: - call get_eip -.L1: - addl $objc_not_found_handler-.L1, %eax - jmp *%eax - -get_eip: - movl (%esp), %eax - ret -.type objc_msg_lookup, %function -.size objc_msg_lookup, .-objc_msg_lookup - -objc_msg_lookup_super: -objc_msg_lookup_super_stret: /* FIXME */ + jz .forward_\name + + ret + +.forward_\name: + call get_eip +.forward_L0_\name: + addl $\not_found_handler-.forward_L0_\name, %eax + jmp *%eax + +.type \name, %function +.size \name, .-\name +.endm + +.macro generate_lookup_super name lookup +\name: movl 4(%esp), %edx cmpl $0, (%edx) je ret_nil movl 4(%edx), %edx movl 32(%edx), %edx - jmp lookup -.type objc_msg_lookup_super, %function -.size objc_msg_lookup_super, .-objc_msg_lookup_super + jmp .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: + call get_eip +.L0: + addl $nil_method-.L0, %eax + ret nil_method: movl 4(%esp), %eax ret + +get_eip: + movl (%esp), %eax + ret #ifdef __linux__ .section .note.GNU-stack, "", %progbits #endif